Merge branch 'feature/update-notify' into feature/ui

This commit is contained in:
geekgeekrun
2025-04-26 17:15:11 +08:00
12 changed files with 289 additions and 34 deletions

View File

@@ -152,6 +152,7 @@ jobs:
- name: Create release
uses: ncipollo/release-action@v1
with:
prerelease: true
allowUpdates: true
artifacts: geekgeekrun-ui@${{ github.sha }}/*
tag: ${{ github.ref }}

View File

@@ -40,6 +40,7 @@
"electron-updater": "^6.1.7",
"minimist": "^1.2.8",
"node-machine-id": "^1.1.12",
"pinia": "^3.0.2",
"puppeteer": "20.1.0",
"puppeteer-extra-plugin-stealth": "2.11.2",
"uuid": "^11.1.0"

View File

@@ -0,0 +1,7 @@
export interface NewReleaseInfo {
releaseVersion: string
releasePageUrl: string
assetUrl: string
assetName: string
releaseNote: string
}

View File

@@ -0,0 +1,103 @@
import semver from 'semver'
import packageJson from '../../../package.json'
import os from 'node:os'
import gtag from '../utils/gtag'
import { NewReleaseInfo } from '../../common/types/update'
export const currentOsPlatform = os.platform()
const RELEASE_LIST_URL = `https://api.github.com/repos/geekgeekrun/geekgeekrun/releases`
export interface GitHubReleaseItem {
tag_name: string
prerelease: boolean
draft: boolean
html_url: string
body: string
assets: Array<{
browser_download_url: string
name: string
}>
}
// find by arch, appendix
function findTargetAsset(
assets: GitHubReleaseItem['assets']
): null | GitHubReleaseItem['assets'][number] {
let assetsFilteredByPlatform: GitHubReleaseItem['assets'] = []
switch (os.platform()) {
case 'win32': {
assetsFilteredByPlatform = assets.filter((it) => it.name.endsWith('.exe'))
break
}
case 'darwin': {
assetsFilteredByPlatform = assets.filter((it) => it.name.endsWith('.dmg'))
break
}
case 'linux': {
assetsFilteredByPlatform = assets.filter((it) => it.name.endsWith('.deb'))
break
}
}
if (!assetsFilteredByPlatform?.length) {
return null
}
if (assetsFilteredByPlatform.length === 1) {
return assetsFilteredByPlatform[0]
}
let targetAsset
if (os.platform() === 'darwin') {
targetAsset = assetsFilteredByPlatform.find((it) => it.name.includes(`_${os.arch()}`))
}
return targetAsset
}
export const checkUpdateForUi = async (): Promise<NewReleaseInfo | null> => {
let releaseList: GitHubReleaseItem[] = []
try {
const headers = new Headers()
headers.append('Accept', 'application/vnd.github+json')
headers.append('X-GitHub-Api-Version', '2022-11-28')
await fetch(RELEASE_LIST_URL, {
method: 'GET',
headers: headers,
redirect: 'follow'
})
.then((res) => res.json())
.then((res) => {
if (Array.isArray(res)) {
releaseList = res
} else {
throw res
}
})
} catch (err) {
gtag('check_update_error', { err: JSON.stringify(err) })
console.log(err)
}
console.log(releaseList)
const availableRelease = releaseList.find((it) => !it.draft && !it.prerelease)
if (!availableRelease) {
return null
}
const availableReleaseVersion = availableRelease.tag_name.replace(/^(ui-v)/, '')
if (!semver.gt(availableReleaseVersion, packageJson.version)) {
return null
}
const { assets } = availableRelease
const targetAsset = findTargetAsset(assets ?? [])
if (targetAsset) {
gtag('update_found', {
currentVersion: packageJson.version,
newVersion: availableReleaseVersion
})
console.log(targetAsset)
return {
releaseVersion: availableReleaseVersion,
releasePageUrl: availableRelease.html_url,
assetUrl: targetAsset.browser_download_url,
assetName: targetAsset.name,
releaseNote: availableRelease.body
}
}
return null
}

View File

@@ -50,6 +50,8 @@ import {
readNoReplyReminderLlmMockWindow
} from '../../../window/readNoReplyReminderLlmMockWindow'
import { RequestSceneEnum } from '../../../features/llm-request-log'
import { checkUpdateForUi } from '../../../features/updater'
import gtag from '../../../utils/gtag'
export default function initIpc() {
ipcMain.handle('fetch-config-file-content', async () => {
@@ -576,9 +578,14 @@ export default function initIpc() {
ipcMain.removeHandler('get-llm-config-for-test')
})
})
ipcMain.on('close-read-no-reply-reminder-llm-mock-window', () =>
ipcMain.on('close-read-no-reply-reminder-llm-mock-window', () => {
readNoReplyReminderLlmMockWindow?.close()
)
gtag('mock_chat_window_closed')
})
ipcMain.handle('check-update', async () => {
const newRelease = await checkUpdateForUi()
return newRelease
})
ipcMain.handle('exit-app-immediately', () => {
app.exit(0)

View File

@@ -2,13 +2,15 @@ import { createApp } from 'vue'
import ElementPlus, { ElMessage } from 'element-plus'
import App from './App.vue'
import router from './router'
import { createPinia } from 'pinia'
import 'normalize.css'
import './style/public.scss'
import 'element-plus/dist/index.css'
import 'virtual:uno.css'
import 'animate.css'
createApp(App).use(router).use(ElementPlus).mount('#app')
const pinia = createPinia()
createApp(App).use(pinia).use(router).use(ElementPlus).mount('#app')
electron.ipcRenderer.on('toast-message', (_, payload) => {
ElMessage(payload)
})

View File

@@ -470,6 +470,7 @@ const rechatLlmFallbackOptions = [
]
async function handleTestEffectClicked() {
gtagRenderer('goto_mock_chat_clicked')
if (!(await checkIsCanRun())) {
return
}

View File

@@ -96,13 +96,43 @@
<RouterLink to="./CompanyLibrary">公司库</RouterLink>
</div>
<div class="pt-16px pb-16px flex-0 font-size-12px">
<div>当前版本: {{ buildInfo.version }}({{ buildInfo.buildVersion }})</div>
<div class="feedback-area flex flex-items-center mt-8px">
<el-button type="text" size="small" @click="handleGotoProjectPageClick"
>项目首页</el-button
<div v-if="updateStore.availableNewRelease" mb16px>
<div
:style="{
display: 'flex',
alignItems: 'center'
}"
>
|
<el-button type="text" size="small" @click="handleFeedbackClick">反馈问题</el-button>
最新版本: {{ updateStore.availableNewRelease.releaseVersion }}
<img
h12px
ml10px
:style="{
filter: `saturate(1.5) brightness(1.5)`,
transform: `translateY(-10px)`
}"
src="./resources/new.gif"
/>
</div>
<div class="update-button-area flex flex-items-center mt-8px">
<el-button type="text" size="small" @click="handleDownloadNewReleaseClick"
>从GitHub下载</el-button
>
|
<el-button type="text" size="small" @click="handleViewNewReleaseClick"
>了解更新内容</el-button
>
</div>
</div>
<div>
<div>当前版本: {{ buildInfo.version }}({{ buildInfo.buildVersion }})</div>
<div class="feedback-button-area flex flex-items-center mt-8px">
<el-button type="text" size="small" @click="handleGotoProjectPageClick"
>项目首页</el-button
>
|
<el-button type="text" size="small" @click="handleFeedbackClick">反馈问题</el-button>
</div>
</div>
</div>
</div>
@@ -121,6 +151,8 @@ import { TopRight, QuestionFilled } from '@element-plus/icons-vue'
import useBuildInfo from '@renderer/hooks/useBuildInfo'
import { debounce } from 'lodash-es'
import { gtagRenderer } from '@renderer/utils/gtag'
import { useUpdateStore } from '../../store/index'
const router = useRouter()
const unmountedCbs: Array<InstanceType<typeof Function>> = []
onUnmounted(() => {
@@ -175,6 +207,16 @@ const handleLaunchBossSite = debounce(
1000,
{ leading: true, trailing: false }
)
const updateStore = useUpdateStore()
function handleDownloadNewReleaseClick() {
gtagRenderer('click_download_release_form_nav')
electron.ipcRenderer.send('open-external-link', updateStore.availableNewRelease!.assetUrl)
}
function handleViewNewReleaseClick() {
gtagRenderer('click_view_release_form_nav')
electron.ipcRenderer.send('open-external-link', updateStore.availableNewRelease!.releasePageUrl)
}
</script>
<style lang="scss" scoped>
@@ -204,7 +246,8 @@ const handleLaunchBossSite = debounce(
margin-right: 0;
}
}
.feedback-area {
.feedback-button-area,
.update-button-area {
:deep(.el-button) {
height: fit-content;
padding: 0;

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -143,9 +143,10 @@
</template>
<script lang="ts" setup>
import { computed, ref } from 'vue'
import { computed, ref, watch } from 'vue'
import { sleep } from '@geekgeekrun/utils/sleep.mjs'
import { ElMessage } from 'element-plus'
import { gtagRenderer } from '@renderer/utils/gtag'
type MessageItem = {
text: string
usedLlmConfig: string
@@ -176,10 +177,19 @@ async function getLlmConfigList() {
}
getLlmConfigList().catch(() => {})
const selectedLlmConfig = ref(null)
watch(
() => selectedLlmConfig.value,
() => {
gtagRenderer('change_mock_chat_llm_model', {
model: selectedLlmConfig.value?.model ?? ''
})
}
)
const scrollElRef = ref(null)
const isLoading = ref(false)
async function sendLlmGeneratedContent() {
gtagRenderer('click_mock_chat_send')
isLoading.value = true
try {
const response = await electron.ipcRenderer.invoke('request-llm-for-test', {
@@ -223,6 +233,8 @@ function formatApiSecret(text) {
}
return `***`
}
gtagRenderer('enter_mock_chat_page')
</script>
<style lang="scss" scoped>

View File

@@ -0,0 +1,20 @@
import { defineStore } from 'pinia'
import { NewReleaseInfo } from '../../../common/types/update'
import { ref } from 'vue'
export const useUpdateStore = defineStore('update', () => {
const availableNewRelease = ref<NewReleaseInfo | null>(null)
async function checkUpdate() {
let result: NewReleaseInfo | null = null
try {
result = (await electron.ipcRenderer.invoke('check-update')) as NewReleaseInfo | null
} catch {
//
}
availableNewRelease.value = result
}
checkUpdate()
setInterval(checkUpdate, 30 * 30 * 1000)
return { availableNewRelease }
})

104
pnpm-lock.yaml generated
View File

@@ -135,6 +135,9 @@ importers:
node-machine-id:
specifier: ^1.1.12
version: 1.1.12
pinia:
specifier: ^3.0.2
version: 3.0.2(typescript@5.3.3)(vue@3.4.15)
puppeteer:
specifier: 20.1.0
version: 20.1.0(typescript@5.3.3)
@@ -476,7 +479,6 @@ packages:
/@babel/helper-string-parser@7.23.4:
resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==}
engines: {node: '>=6.9.0'}
dev: true
/@babel/helper-validator-identifier@7.22.20:
resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
@@ -512,7 +514,6 @@ packages:
hasBin: true
dependencies:
'@babel/types': 7.23.9
dev: true
/@babel/plugin-syntax-jsx@7.23.3(@babel/core@7.23.9):
resolution: {integrity: sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==}
@@ -624,7 +625,6 @@ packages:
'@babel/helper-string-parser': 7.23.4
'@babel/helper-validator-identifier': 7.22.20
to-fast-properties: 2.0.0
dev: true
/@cspotcode/source-map-support@0.8.1:
resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==}
@@ -2130,7 +2130,6 @@ packages:
entities: 4.5.0
estree-walker: 2.0.2
source-map-js: 1.0.2
dev: true
/@vue/compiler-core@3.4.18:
resolution: {integrity: sha512-F7YK8lMK0iv6b9/Gdk15A67wM0KKZvxDxed0RR60C1z9tIJTKta+urs4j0RTN5XqHISzI3etN3mX0uHhjmoqjQ==}
@@ -2147,7 +2146,6 @@ packages:
dependencies:
'@vue/compiler-core': 3.4.15
'@vue/shared': 3.4.15
dev: true
/@vue/compiler-dom@3.4.18:
resolution: {integrity: sha512-24Eb8lcMfInefvQ6YlEVS18w5Q66f4+uXWVA+yb7praKbyjHRNuKVWGuinfSSjM0ZIiPi++QWukhkgznBaqpEA==}
@@ -2168,19 +2166,41 @@ packages:
magic-string: 0.30.7
postcss: 8.4.35
source-map-js: 1.0.2
dev: true
/@vue/compiler-ssr@3.4.15:
resolution: {integrity: sha512-1jdeQyiGznr8gjFDadVmOJqZiLNSsMa5ZgqavkPZ8O2wjHv0tVuAEsw5hTdUoUW4232vpBbL/wJhzVW/JwY1Uw==}
dependencies:
'@vue/compiler-dom': 3.4.15
'@vue/shared': 3.4.15
dev: true
/@vue/devtools-api@6.5.1:
resolution: {integrity: sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==}
dev: true
/@vue/devtools-api@7.7.5:
resolution: {integrity: sha512-HYV3tJGARROq5nlVMJh5KKHk7GU8Au3IrrmNNqr978m0edxgpHgYPDoNUGrvEgIbObz09SQezFR3A1EVmB5WZg==}
dependencies:
'@vue/devtools-kit': 7.7.5
dev: false
/@vue/devtools-kit@7.7.5:
resolution: {integrity: sha512-S9VAVJYVAe4RPx2JZb9ZTEi0lqTySz2CBeF0wHT5D3dkTLnT9yMMGegKNl4b2EIELwLSkcI9bl2qp0/jW+upqA==}
dependencies:
'@vue/devtools-shared': 7.7.5
birpc: 2.3.0
hookable: 5.5.3
mitt: 3.0.1
perfect-debounce: 1.0.0
speakingurl: 14.0.1
superjson: 2.2.2
dev: false
/@vue/devtools-shared@7.7.5:
resolution: {integrity: sha512-QBjG72RfpM0DKtpns2RZOxBltO226kOAls9e4Lri6YxS2gWTgL0H+wj1R2K76lxxIeOrqo4+2Ty6RQnzv+WSTQ==}
dependencies:
rfdc: 1.4.1
dev: false
/@vue/eslint-config-prettier@9.0.0(eslint@8.56.0)(prettier@3.2.4):
resolution: {integrity: sha512-z1ZIAAUS9pKzo/ANEfd2sO+v2IUalz7cM/cTLOZ7vRFOPk5/xuRKQteOu1DErFLAh/lYGXMVZ0IfYKlyInuDVg==}
peerDependencies:
@@ -2240,14 +2260,12 @@ packages:
resolution: {integrity: sha512-55yJh2bsff20K5O84MxSvXKPHHt17I2EomHznvFiJCAZpJTNW8IuLj1xZWMLELRhBK3kkFV/1ErZGHJfah7i7w==}
dependencies:
'@vue/shared': 3.4.15
dev: true
/@vue/runtime-core@3.4.15:
resolution: {integrity: sha512-6E3by5m6v1AkW0McCeAyhHTw+3y17YCOKG0U0HDKDscV4Hs0kgNT5G+GCHak16jKgcCDHpI9xe5NKb8sdLCLdw==}
dependencies:
'@vue/reactivity': 3.4.15
'@vue/shared': 3.4.15
dev: true
/@vue/runtime-dom@3.4.15:
resolution: {integrity: sha512-EVW8D6vfFVq3V/yDKNPBFkZKGMFSvZrUQmx196o/v2tHKdwWdiZjYUBS+0Ez3+ohRyF8Njwy/6FH5gYJ75liUw==}
@@ -2255,7 +2273,6 @@ packages:
'@vue/runtime-core': 3.4.15
'@vue/shared': 3.4.15
csstype: 3.1.3
dev: true
/@vue/server-renderer@3.4.15(vue@3.4.15):
resolution: {integrity: sha512-3HYzaidu9cHjrT+qGUuDhFYvF/j643bHC6uUN9BgM11DVy+pM6ATsG6uPBLnkwOgs7BpJABReLmpL3ZPAsUaqw==}
@@ -2265,11 +2282,9 @@ packages:
'@vue/compiler-ssr': 3.4.15
'@vue/shared': 3.4.15
vue: 3.4.15(typescript@5.3.3)
dev: true
/@vue/shared@3.4.15:
resolution: {integrity: sha512-KzfPTxVaWfB+eGcGdbSf4CWdaXcGDqckoeXUh7SB3fZdEtzPCK2Vq9B/lRRL3yutax/LWITz+SwvgyOxz5V75g==}
dev: true
/@vue/shared@3.4.18:
resolution: {integrity: sha512-CxouGFxxaW5r1WbrSmWwck3No58rApXgRSBxrqgnY1K+jk20F6DrXJkHdH9n4HVT+/B6G2CAn213Uq3npWiy8Q==}
@@ -2596,6 +2611,10 @@ packages:
engines: {node: '>=8'}
dev: true
/birpc@2.3.0:
resolution: {integrity: sha512-ijbtkn/F3Pvzb6jHypHRyve2QApOCZDR25D/VnkY2G/lBNcXCTsnsCxgY4k4PkVB7zfwzYbY3O9Lcqe3xufS5g==}
dev: false
/bl@4.1.0:
resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
dependencies:
@@ -2968,6 +2987,13 @@ packages:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
dev: true
/copy-anything@3.0.5:
resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==}
engines: {node: '>=12.13'}
dependencies:
is-what: 4.1.16
dev: false
/core-util-is@1.0.2:
resolution: {integrity: sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==}
requiresBuild: true
@@ -3036,7 +3062,6 @@ packages:
/csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
dev: true
/data-uri-to-buffer@4.0.1:
resolution: {integrity: sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A==}
@@ -3380,7 +3405,6 @@ packages:
/entities@4.5.0:
resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==}
engines: {node: '>=0.12'}
dev: true
/env-paths@2.2.1:
resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
@@ -3614,7 +3638,6 @@ packages:
/estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
dev: true
/estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
@@ -4117,6 +4140,10 @@ packages:
resolution: {integrity: sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==}
dev: false
/hookable@5.5.3:
resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==}
dev: false
/hosted-git-info@4.1.0:
resolution: {integrity: sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==}
engines: {node: '>=10'}
@@ -4353,6 +4380,11 @@ packages:
engines: {node: '>=8'}
dev: true
/is-what@4.1.16:
resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==}
engines: {node: '>=12.13'}
dev: false
/isbinaryfile@4.0.10:
resolution: {integrity: sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw==}
engines: {node: '>= 8.0.0'}
@@ -4594,7 +4626,6 @@ packages:
engines: {node: '>=12'}
dependencies:
'@jridgewell/sourcemap-codec': 1.4.15
dev: true
/make-dir@3.1.0:
resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==}
@@ -4801,6 +4832,10 @@ packages:
resolution: {integrity: sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==}
dev: false
/mitt@3.0.1:
resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==}
dev: false
/mixin-object@2.0.1:
resolution: {integrity: sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==}
engines: {node: '>=0.10.0'}
@@ -4855,7 +4890,6 @@ packages:
resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
dev: true
/natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
@@ -5200,17 +5234,29 @@ packages:
/perfect-debounce@1.0.0:
resolution: {integrity: sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==}
dev: true
/picocolors@1.0.0:
resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==}
dev: true
/picomatch@2.3.1:
resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==}
engines: {node: '>=8.6'}
dev: true
/pinia@3.0.2(typescript@5.3.3)(vue@3.4.15):
resolution: {integrity: sha512-sH2JK3wNY809JOeiiURUR0wehJ9/gd9qFN2Y828jCbxEzKEmEt0pzCXwqiSTfuRsK9vQsOflSdnbdBOGrhtn+g==}
peerDependencies:
typescript: '>=4.4.4'
vue: ^2.7.0 || ^3.5.11
peerDependenciesMeta:
typescript:
optional: true
dependencies:
'@vue/devtools-api': 7.7.5
typescript: 5.3.3
vue: 3.4.15(typescript@5.3.3)
dev: false
/pkg-types@1.0.3:
resolution: {integrity: sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==}
dependencies:
@@ -5243,7 +5289,6 @@ packages:
nanoid: 3.3.7
picocolors: 1.0.0
source-map-js: 1.0.2
dev: true
/prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
@@ -5553,6 +5598,10 @@ packages:
engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
dev: true
/rfdc@1.4.1:
resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==}
dev: false
/rimraf@3.0.2:
resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
hasBin: true
@@ -5767,7 +5816,6 @@ packages:
/source-map-js@1.0.2:
resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==}
engines: {node: '>=0.10.0'}
dev: true
/source-map-support@0.5.21:
resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==}
@@ -5786,6 +5834,11 @@ packages:
resolution: {integrity: sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==}
dev: true
/speakingurl@14.0.1:
resolution: {integrity: sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==}
engines: {node: '>=0.10.0'}
dev: false
/sprintf-js@1.1.3:
resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==}
requiresBuild: true
@@ -5887,6 +5940,13 @@ packages:
transitivePeerDependencies:
- supports-color
/superjson@2.2.2:
resolution: {integrity: sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==}
engines: {node: '>=16'}
dependencies:
copy-anything: 3.0.5
dev: false
/supports-color@5.5.0:
resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
engines: {node: '>=4'}
@@ -6029,7 +6089,6 @@ packages:
/to-fast-properties@2.0.0:
resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
engines: {node: '>=4'}
dev: true
/to-regex-range@5.0.1:
resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
@@ -6557,7 +6616,6 @@ packages:
'@vue/server-renderer': 3.4.15(vue@3.4.15)
'@vue/shared': 3.4.15
typescript: 5.3.3
dev: true
/web-streams-polyfill@3.3.3:
resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==}