mirror of
https://github.com/moeru-ai/airi.git
synced 2026-10-30 03:04:45 +08:00
fix(stage-tamagotchi): sync pairing settings and QR state (#2318)
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import { isStageTamagotchi } from '@proj-airi/stage-shared'
|
||||
import { ConnectionSettings } from '@proj-airi/stage-ui/components'
|
||||
import { Callout, FieldCheckbox, FieldInput, IconButton, Input, SelectTab } from '@proj-airi/ui'
|
||||
import { Callout, FieldCheckbox, IconButton, Input } from '@proj-airi/ui'
|
||||
import { refDebounced, useClipboard } from '@vueuse/core'
|
||||
import { storeToRefs } from 'pinia'
|
||||
import { computed, shallowRef, watch } from 'vue'
|
||||
@@ -10,10 +10,6 @@ import { useI18n } from 'vue-i18n'
|
||||
import ServerChannelQrCard from './server-channel-qr-card.vue'
|
||||
|
||||
import { useServerChannelSettingsStore } from '../../../stores/settings/server-channel'
|
||||
import {
|
||||
hostnameFromExposureMode,
|
||||
serverChannelExposureModeFromHostname,
|
||||
} from '../../../stores/settings/server-channel-options'
|
||||
|
||||
const serverChannelSettingsStore = useServerChannelSettingsStore()
|
||||
const { authToken, hostname, lastApplyError, tlsConfig } = storeToRefs(serverChannelSettingsStore)
|
||||
@@ -26,14 +22,13 @@ const websocketTlsEnabled = computed({
|
||||
},
|
||||
})
|
||||
|
||||
const exposureMode = computed({
|
||||
get: () => serverChannelExposureModeFromHostname(hostname.value),
|
||||
set: (mode) => {
|
||||
hostname.value = hostnameFromExposureMode(mode, hostname.value)
|
||||
const exposeToAll = computed({
|
||||
get: () => hostname.value === '0.0.0.0',
|
||||
set: (value: boolean) => {
|
||||
hostname.value = value ? '0.0.0.0' : '127.0.0.1'
|
||||
},
|
||||
})
|
||||
|
||||
const showAdvancedHostname = computed(() => exposureMode.value === 'advanced')
|
||||
const showDesktopServerControls = computed(() => isStageTamagotchi())
|
||||
const authTokenInput = shallowRef(authToken.value)
|
||||
const authTokenInputDebounced = refDebounced(authTokenInput, 500)
|
||||
@@ -42,21 +37,6 @@ const { copied: authTokenCopied, copy: copyAuthToken, isSupported: isClipboardSu
|
||||
const authTokenInputType = computed(() => authTokenVisible.value ? 'text' : 'password')
|
||||
const canCopyAuthToken = computed(() => isClipboardSupported.value && authTokenInput.value.length > 0)
|
||||
|
||||
const exposureModeOptions = computed(() => [
|
||||
{
|
||||
label: t('settings.pages.connection.server-hostname.options.this-device'),
|
||||
value: 'this-device',
|
||||
},
|
||||
{
|
||||
label: t('settings.pages.connection.server-hostname.options.all'),
|
||||
value: 'all',
|
||||
},
|
||||
{
|
||||
label: t('settings.pages.connection.server-hostname.options.advanced'),
|
||||
value: 'advanced',
|
||||
},
|
||||
])
|
||||
|
||||
watch(authToken, (value) => {
|
||||
if (value !== authTokenInput.value)
|
||||
authTokenInput.value = value
|
||||
@@ -77,40 +57,17 @@ watch(authTokenInputDebounced, (value) => {
|
||||
>
|
||||
{{ lastApplyError }}
|
||||
</Callout>
|
||||
<ConnectionSettings>
|
||||
<template #platform-specific>
|
||||
<!-- TODO: show connected remote -->
|
||||
<ConnectionSettings server-address-disabled>
|
||||
<template #before-server-address>
|
||||
<FieldCheckbox
|
||||
v-model="websocketTlsEnabled"
|
||||
:label="t('settings.websocket-secure-enabled.title')"
|
||||
:description="t('settings.websocket-secure-enabled.description')"
|
||||
/>
|
||||
|
||||
<div
|
||||
v-if="showDesktopServerControls"
|
||||
:class="['flex', 'flex-col', 'gap-2']"
|
||||
>
|
||||
<div :class="['text-sm', 'font-medium', 'text-neutral-900', 'dark:text-neutral-100']">
|
||||
{{ t('settings.pages.connection.server-hostname.label') }}
|
||||
</div>
|
||||
<div :class="['text-xs', 'text-neutral-500', 'dark:text-neutral-400']">
|
||||
{{ t('settings.pages.connection.server-hostname.description') }}
|
||||
</div>
|
||||
<SelectTab
|
||||
v-model="exposureMode"
|
||||
size="sm"
|
||||
:options="exposureModeOptions"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<FieldInput
|
||||
v-if="showDesktopServerControls && showAdvancedHostname"
|
||||
v-model="hostname"
|
||||
:label="t('settings.pages.connection.server-hostname.advanced-label')"
|
||||
:description="t('settings.pages.connection.server-hostname.advanced-description')"
|
||||
placeholder="192.168.1.25"
|
||||
v-model="exposeToAll"
|
||||
:label="t('settings.pages.connection.server-hostname.label')"
|
||||
:description="t('settings.pages.connection.server-hostname.description')"
|
||||
/>
|
||||
</template>
|
||||
|
||||
<template #platform-specific>
|
||||
<div
|
||||
v-if="showDesktopServerControls"
|
||||
:class="['max-w-full']"
|
||||
@@ -151,6 +108,12 @@ watch(authTokenInputDebounced, (value) => {
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<FieldCheckbox
|
||||
v-model="websocketTlsEnabled"
|
||||
:label="t('settings.websocket-secure-enabled.title')"
|
||||
:description="t('settings.websocket-secure-enabled.description')"
|
||||
/>
|
||||
|
||||
<ServerChannelQrCard />
|
||||
</template>
|
||||
</ConnectionSettings>
|
||||
|
||||
+15
-4
@@ -22,11 +22,13 @@ function handleToggleExpanded(visible: boolean, setVisible: (value: boolean) =>
|
||||
if (visible)
|
||||
trackDevicePairingQrShown()
|
||||
}
|
||||
const { authToken, hostname, tlsConfig } = storeToRefs(useServerChannelSettingsStore())
|
||||
const { appliedConfig } = storeToRefs(useServerChannelSettingsStore())
|
||||
|
||||
const loading = shallowRef(false)
|
||||
const payload = shallowRef<ServerChannelQrPayload>()
|
||||
const errorMessage = shallowRef('')
|
||||
// Only the latest applied-config snapshot can update the rendered QR state.
|
||||
let refreshRequestId = 0
|
||||
|
||||
const payloadText = computed(() => {
|
||||
if (!payload.value) {
|
||||
@@ -63,22 +65,31 @@ const qrCodeSource = computed(() => {
|
||||
})
|
||||
|
||||
async function refreshPayload() {
|
||||
const requestId = ++refreshRequestId
|
||||
loading.value = true
|
||||
errorMessage.value = ''
|
||||
|
||||
try {
|
||||
payload.value = await getServerChannelQrPayload()
|
||||
const nextPayload = await getServerChannelQrPayload()
|
||||
if (requestId !== refreshRequestId)
|
||||
return
|
||||
|
||||
payload.value = nextPayload
|
||||
}
|
||||
catch (error) {
|
||||
if (requestId !== refreshRequestId)
|
||||
return
|
||||
|
||||
payload.value = undefined
|
||||
errorMessage.value = errorMessageFrom(error) ?? t('settings.pages.connection.qr.errors.unavailable')
|
||||
}
|
||||
finally {
|
||||
loading.value = false
|
||||
if (requestId === refreshRequestId)
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
watch([hostname, tlsConfig, authToken], () => {
|
||||
watch(appliedConfig, () => {
|
||||
void refreshPayload()
|
||||
}, { immediate: true })
|
||||
</script>
|
||||
|
||||
@@ -1,40 +0,0 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
|
||||
import { hostnameFromExposureMode, serverChannelExposureModeFromHostname } from './server-channel-options'
|
||||
|
||||
describe('serverChannelExposureModeFromHostname', () => {
|
||||
it('maps loopback hostnames to this-device mode', () => {
|
||||
expect(serverChannelExposureModeFromHostname('127.0.0.1')).toBe('this-device')
|
||||
expect(serverChannelExposureModeFromHostname('localhost')).toBe('this-device')
|
||||
expect(serverChannelExposureModeFromHostname('::1')).toBe('this-device')
|
||||
expect(serverChannelExposureModeFromHostname('')).toBe('this-device')
|
||||
})
|
||||
|
||||
it('maps wildcard bind hostnames to all mode', () => {
|
||||
expect(serverChannelExposureModeFromHostname('0.0.0.0')).toBe('all')
|
||||
expect(serverChannelExposureModeFromHostname('::')).toBe('all')
|
||||
})
|
||||
|
||||
it('maps custom hostnames to advanced mode', () => {
|
||||
expect(serverChannelExposureModeFromHostname('192.168.1.25')).toBe('advanced')
|
||||
expect(serverChannelExposureModeFromHostname('airi.local')).toBe('advanced')
|
||||
})
|
||||
})
|
||||
|
||||
describe('hostnameFromExposureMode', () => {
|
||||
it('returns a secure loopback hostname for this-device mode', () => {
|
||||
expect(hostnameFromExposureMode('this-device', '192.168.1.25')).toBe('127.0.0.1')
|
||||
})
|
||||
|
||||
it('returns an all-interfaces hostname for all mode', () => {
|
||||
expect(hostnameFromExposureMode('all', '127.0.0.1')).toBe('0.0.0.0')
|
||||
})
|
||||
|
||||
it('uses the manual hostname for advanced mode and trims whitespace', () => {
|
||||
expect(hostnameFromExposureMode('advanced', ' 192.168.1.25 ')).toBe('192.168.1.25')
|
||||
})
|
||||
|
||||
it('falls back to loopback when advanced mode is empty', () => {
|
||||
expect(hostnameFromExposureMode('advanced', ' ')).toBe('127.0.0.1')
|
||||
})
|
||||
})
|
||||
@@ -1,28 +0,0 @@
|
||||
export type ServerChannelExposureMode = 'this-device' | 'all' | 'advanced'
|
||||
|
||||
const LOOPBACK_HOSTNAMES = new Set(['', '127.0.0.1', 'localhost', '::1'])
|
||||
const ALL_INTERFACE_HOSTNAMES = new Set(['0.0.0.0', '::'])
|
||||
|
||||
export function serverChannelExposureModeFromHostname(hostname?: string): ServerChannelExposureMode {
|
||||
const normalizedHostname = hostname?.trim() ?? ''
|
||||
|
||||
if (LOOPBACK_HOSTNAMES.has(normalizedHostname))
|
||||
return 'this-device'
|
||||
|
||||
if (ALL_INTERFACE_HOSTNAMES.has(normalizedHostname))
|
||||
return 'all'
|
||||
|
||||
return 'advanced'
|
||||
}
|
||||
|
||||
export function hostnameFromExposureMode(mode: ServerChannelExposureMode, manualHostname?: string) {
|
||||
if (mode === 'all')
|
||||
return '0.0.0.0'
|
||||
|
||||
if (mode === 'advanced') {
|
||||
const normalizedHostname = manualHostname?.trim() ?? ''
|
||||
return normalizedHostname || '127.0.0.1'
|
||||
}
|
||||
|
||||
return '127.0.0.1'
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import { createPinia, setActivePinia } from 'pinia'
|
||||
import { createPinia, disposePinia, setActivePinia } from 'pinia'
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { nextTick, ref } from 'vue'
|
||||
|
||||
@@ -50,15 +50,18 @@ vi.mock('vue-sonner', () => ({
|
||||
|
||||
describe('useServerChannelSettingsStore', async () => {
|
||||
const { useServerChannelSettingsStore } = await import('./server-channel')
|
||||
let pinia: ReturnType<typeof createPinia>
|
||||
|
||||
beforeEach(() => {
|
||||
setActivePinia(createPinia())
|
||||
pinia = createPinia()
|
||||
setActivePinia(pinia)
|
||||
invokeMocks.getConfig.mockClear()
|
||||
invokeMocks.applyConfig.mockClear()
|
||||
toastError.mockClear()
|
||||
})
|
||||
|
||||
afterEach(() => {
|
||||
disposePinia(pinia)
|
||||
vi.restoreAllMocks()
|
||||
})
|
||||
|
||||
@@ -81,4 +84,56 @@ describe('useServerChannelSettingsStore', async () => {
|
||||
expect(toastError).toHaveBeenCalledWith('apply failed')
|
||||
})
|
||||
})
|
||||
|
||||
it('publishes the applied config only after the main process accepts the change', async () => {
|
||||
let resolveApply: ((config: {
|
||||
authToken: string
|
||||
hostname: string
|
||||
tlsConfig: Record<string, never> | null
|
||||
}) => void) | undefined
|
||||
invokeMocks.applyConfig.mockImplementationOnce(async () => await new Promise((resolve) => {
|
||||
resolveApply = resolve
|
||||
}))
|
||||
|
||||
const store = useServerChannelSettingsStore()
|
||||
|
||||
await vi.waitFor(() => {
|
||||
expect(store.appliedConfig).toEqual({
|
||||
authToken: 'existing-token',
|
||||
hostname: '127.0.0.1',
|
||||
tlsConfig: null,
|
||||
})
|
||||
})
|
||||
|
||||
store.hostname = '0.0.0.0'
|
||||
await nextTick()
|
||||
|
||||
// ROOT CAUSE:
|
||||
//
|
||||
// The QR card watched the optimistic hostname and requested its payload
|
||||
// while the main process still restarted the server with the new config.
|
||||
// The request read the old loopback config and failed. The accepted config
|
||||
// did not change the hostname again, so the QR card never retried.
|
||||
// We fixed this by publishing the accepted config after the IPC request
|
||||
// completes. The QR card watches that accepted snapshot.
|
||||
expect(store.appliedConfig).toEqual({
|
||||
authToken: 'existing-token',
|
||||
hostname: '127.0.0.1',
|
||||
tlsConfig: null,
|
||||
})
|
||||
|
||||
resolveApply?.({
|
||||
authToken: 'existing-token',
|
||||
hostname: '0.0.0.0',
|
||||
tlsConfig: null,
|
||||
})
|
||||
|
||||
await vi.waitFor(() => {
|
||||
expect(store.appliedConfig).toEqual({
|
||||
authToken: 'existing-token',
|
||||
hostname: '0.0.0.0',
|
||||
tlsConfig: null,
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
@@ -4,7 +4,7 @@ import { errorMessageFrom } from '@moeru/std'
|
||||
import { useElectronEventaInvoke } from '@proj-airi/electron-vueuse'
|
||||
import { useLocalStorage } from '@vueuse/core'
|
||||
import { defineStore } from 'pinia'
|
||||
import { ref, watch } from 'vue'
|
||||
import { shallowRef, watch } from 'vue'
|
||||
import { toast } from 'vue-sonner'
|
||||
|
||||
import {
|
||||
@@ -17,8 +17,9 @@ export const useServerChannelSettingsStore = defineStore('tamagotchi-server-chan
|
||||
const tlsConfig = useLocalStorage<{ cert?: string, key?: string, passphrase?: string } | null | undefined>('settings/server-channel/websocket-tls-config', null)
|
||||
const hostname = useLocalStorage<string>('settings/server-channel/hostname', '127.0.0.1')
|
||||
const authToken = useLocalStorage<string>('settings/server-channel/auth-token', '')
|
||||
const lastApplyError = ref<string | null>(null)
|
||||
const syncingWithServer = ref(false)
|
||||
const lastApplyError = shallowRef<string | null>(null)
|
||||
const syncingWithServer = shallowRef(false)
|
||||
const appliedConfig = shallowRef<ElectronServerChannelConfig>()
|
||||
|
||||
const getServerChannelConfig = useElectronEventaInvoke(electronGetServerChannelConfig)
|
||||
const applyServerChannelConfig = useElectronEventaInvoke(electronApplyServerChannelConfig)
|
||||
@@ -32,6 +33,9 @@ export const useServerChannelSettingsStore = defineStore('tamagotchi-server-chan
|
||||
if (config.authToken !== undefined) {
|
||||
authToken.value = config.authToken
|
||||
}
|
||||
// This snapshot changes only after the main process accepts the config.
|
||||
// Consumers that read runtime state must not react to the optimistic fields above.
|
||||
appliedConfig.value = config
|
||||
syncingWithServer.value = false
|
||||
}
|
||||
|
||||
@@ -74,6 +78,7 @@ export const useServerChannelSettingsStore = defineStore('tamagotchi-server-chan
|
||||
|
||||
return {
|
||||
lastApplyError,
|
||||
appliedConfig,
|
||||
refreshServerChannelConfig,
|
||||
tlsConfig,
|
||||
hostname,
|
||||
|
||||
@@ -258,6 +258,7 @@ Basic text/number input.
|
||||
| `type` | `InputType?` | — | HTML input type |
|
||||
| `variant` | `'primary' \| 'secondary' \| 'primary-dimmed'` | `'primary'` | Visual variant |
|
||||
| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | Size |
|
||||
| `disabled` | `boolean?` | — | Disable editing and focus |
|
||||
|
||||
**v-model**: `modelValue: string | number`
|
||||
|
||||
@@ -517,6 +518,7 @@ All Field components wrap a base input with `label`, `description`, and consiste
|
||||
| `description` | `string?` | — | Helper text |
|
||||
| `placeholder` | `string?` | — | Placeholder |
|
||||
| `required` | `boolean?` | — | Required indicator |
|
||||
| `disabled` | `boolean?` | — | Disable editing and focus |
|
||||
| `type` | `InputType?` | — | Input type |
|
||||
| `autocomplete` | `string?` | — | Native autocomplete hint |
|
||||
| `inputClass` | `string?` | — | Custom input class |
|
||||
|
||||
@@ -1470,39 +1470,29 @@ pages:
|
||||
description: Configure WebSocket server connection
|
||||
title: Connection
|
||||
websocket-url:
|
||||
description: Full address of the WebSocket server (e.g., ws://localhost:6121/ws)
|
||||
label: WebSocket Server Address
|
||||
description: The address that this app uses to connect to the local server.
|
||||
label: Server Address
|
||||
placeholder: ws://localhost:6121/ws
|
||||
server-hostname:
|
||||
label: Expose On Network
|
||||
description: >-
|
||||
Choose whether the AIRI gateway only listens on this device or can be
|
||||
reached from your local network.
|
||||
advanced-label: Bind Hostname
|
||||
advanced-description: >-
|
||||
Use a specific hostname or IP address when you need manual network
|
||||
binding.
|
||||
options:
|
||||
this-device: This device
|
||||
all: All
|
||||
advanced: Advanced
|
||||
label: Expose To All
|
||||
description: Allow other devices on the local network to connect to this server.
|
||||
server-auth-token:
|
||||
label: Auth Token
|
||||
label: Pairing Token
|
||||
description: >-
|
||||
Security token required by remote clients that connect to this gateway.
|
||||
When left empty, AIRI generates a new token automatically.
|
||||
Other devices use this token to pair with this server. AIRI generates a
|
||||
token when this field is empty.
|
||||
placeholder: Auto-generate
|
||||
qr:
|
||||
title: Connect from Stage Pocket
|
||||
title: Pairing
|
||||
description: >-
|
||||
Scan this QR code from Stage Pocket to try all reachable local network
|
||||
addresses and save the first working one.
|
||||
Scan this QR code with the mobile app. The app tries each local address
|
||||
and saves the first working address.
|
||||
refresh: Refresh
|
||||
image-alt: AIRI server channel connection QR code
|
||||
image-alt: AIRI pairing QR code
|
||||
candidates: Candidate addresses
|
||||
token-hint: >-
|
||||
The QR code includes the auth token so Stage Pocket can authenticate
|
||||
after connecting. Do not share it publicly.
|
||||
The QR code includes the pairing token. Do not share the QR code
|
||||
publicly.
|
||||
errors:
|
||||
title: QR code unavailable
|
||||
unavailable: Failed to prepare the connection QR code.
|
||||
@@ -1844,10 +1834,9 @@ tachie:
|
||||
render-scale: Render Scale
|
||||
shadow: Theme-colored drop shadow
|
||||
websocket-secure-enabled:
|
||||
title: Enable Secure WebSocket (WSS)
|
||||
title: Serve as Secure WebSocket (WSS)
|
||||
description: >-
|
||||
Enable WSS (WebSocket Secure) to allow HTTPS connections for mobile (pocket)
|
||||
in development mode. This will automatically generate a self-signed
|
||||
Use WSS for secure mobile connections. AIRI creates a self-signed
|
||||
certificate.
|
||||
wip:
|
||||
title: Work in Progress
|
||||
|
||||
@@ -1415,34 +1415,23 @@ pages:
|
||||
description: 配置 WebSocket 服务器连接
|
||||
title: 连接
|
||||
websocket-url:
|
||||
description: WebSocket 服务器的完整地址(例如,ws://localhost:6121/ws)
|
||||
label: WebSocket 服务器地址
|
||||
description: 此应用连接本地服务器时使用的地址。
|
||||
label: 服务器地址
|
||||
placeholder: ws://localhost:6121/ws
|
||||
server-hostname:
|
||||
label: 是否暴露在连接的网络下(WiFi,有线)
|
||||
description: >-
|
||||
选择是否只允许此设备与 AIRI 进行配对,或是也允许来自其他本地网络的设备进行配对
|
||||
advanced-label: 会监听的 hostname
|
||||
advanced-description: >-
|
||||
当您需要手动绑定时,使用指定的主机名或 IP 地址。
|
||||
options:
|
||||
this-device: 仅此设备
|
||||
all: 本地网络所有人
|
||||
advanced: 高级配置
|
||||
label: 向所有设备开放
|
||||
description: 允许本地网络中的其他设备连接此服务器。
|
||||
server-auth-token:
|
||||
label: 认证凭据
|
||||
description: >-
|
||||
连接和配对需要安全令牌。如果留空,AIRI 自动生成一个新的令牌。
|
||||
label: 配对令牌
|
||||
description: 其他设备使用此令牌与服务器配对。如果此字段为空,AIRI 会生成一个令牌。
|
||||
placeholder: 自动生成
|
||||
qr:
|
||||
title: 从 Pocket(口袋)版配对
|
||||
description: >-
|
||||
从 Pocket(口袋)版扫描此二维码以进行配对
|
||||
title: 配对
|
||||
description: 使用移动应用扫描此二维码。应用会尝试每个本地地址,并保存第一个可用地址。
|
||||
refresh: 刷新
|
||||
image-alt: AIRI 配对码
|
||||
image-alt: AIRI 配对二维码
|
||||
candidates: 备选连接地址
|
||||
token-hint: >-
|
||||
二维码包含了认证凭据,所以 Pocket(口袋)版可以自动配对,请不要公开分享此二维码。
|
||||
token-hint: 二维码包含配对令牌。请勿公开分享此二维码。
|
||||
errors:
|
||||
title: 二维码暂不可用
|
||||
unavailable: 无法生成配对二维码
|
||||
@@ -1773,9 +1762,8 @@ tachie:
|
||||
render-scale: 渲染缩放
|
||||
shadow: 主题色动态阴影
|
||||
websocket-secure-enabled:
|
||||
title: 启用安全WebSocket (WSS)
|
||||
description: >-
|
||||
启用 WSS (WebSocket Secure) 以便在开发模式下允许移动设备(Pocket) 连接HTTPS 。这将自动生成一个自签名证书。
|
||||
title: 作为安全 WebSocket (WSS) 提供服务
|
||||
description: 使用 WSS 建立安全的移动端连接。AIRI 会创建一个自签名证书。
|
||||
wip:
|
||||
title: 正在开发中
|
||||
description: >-
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { defineStageTamagotchiScenario } from '../context'
|
||||
|
||||
const websocketServerAddressPattern = /WebSocket Server Address|WebSocket 服务器地址/i
|
||||
const websocketServerAddressPattern = /(?:WebSocket )?Server Address|(?:WebSocket )?服务器地址/i
|
||||
|
||||
export default defineStageTamagotchiScenario({
|
||||
id: 'settings-connection',
|
||||
|
||||
@@ -6,6 +6,13 @@ import { useI18n } from 'vue-i18n'
|
||||
|
||||
import { useModsServerChannelStore } from '../../../../stores/mods/api/channel-server'
|
||||
|
||||
const props = withDefaults(defineProps<{
|
||||
/** Disables the server address field when the runtime owns its value. */
|
||||
serverAddressDisabled?: boolean
|
||||
}>(), {
|
||||
serverAddressDisabled: false,
|
||||
})
|
||||
|
||||
const { t } = useI18n()
|
||||
const { websocketUrl } = storeToRefs(useModsServerChannelStore())
|
||||
|
||||
@@ -28,11 +35,13 @@ const websocketUrlModel = computed({
|
||||
<!-- // TODO: Investigate iOS-only field desync on page entry. The persisted websocketUrl stays correct,
|
||||
but the input can render as if it fell back to the default value when this page mounts. Keep this local
|
||||
until the FieldInput/Input mount-time model sync is fully understood. -->
|
||||
<slot name="before-server-address" />
|
||||
<FieldInput
|
||||
v-model="websocketUrlModel"
|
||||
:label="t('settings.pages.connection.websocket-url.label')"
|
||||
:description="t('settings.pages.connection.websocket-url.description')"
|
||||
:placeholder="t('settings.pages.connection.websocket-url.placeholder')"
|
||||
:disabled="props.serverAddressDisabled"
|
||||
/>
|
||||
<slot name="platform-specific" />
|
||||
</div>
|
||||
|
||||
@@ -18,6 +18,8 @@ const props = withDefaults(defineProps<{
|
||||
* through other means (e.g. all fields are required).
|
||||
*/
|
||||
required?: boolean
|
||||
/** Disables editing and focus on the input. */
|
||||
disabled?: boolean
|
||||
/**
|
||||
* Suppress the `*` indicator next to the label without disabling the
|
||||
* underlying HTML5 `required` validation. Useful for forms where every
|
||||
@@ -60,6 +62,7 @@ const modelValue = defineModel<T>({ required: false })
|
||||
:placeholder="props.placeholder"
|
||||
:autocomplete="props.autocomplete"
|
||||
:required="props.required"
|
||||
:disabled="props.disabled"
|
||||
:class="props.inputClass"
|
||||
/>
|
||||
<Input
|
||||
@@ -69,6 +72,7 @@ const modelValue = defineModel<T>({ required: false })
|
||||
:placeholder="props.placeholder"
|
||||
:autocomplete="props.autocomplete"
|
||||
:required="props.required"
|
||||
:disabled="props.disabled"
|
||||
:class="props.inputClass"
|
||||
/>
|
||||
<textarea
|
||||
@@ -78,6 +82,7 @@ const modelValue = defineModel<T>({ required: false })
|
||||
:placeholder="props.placeholder"
|
||||
:autocomplete="props.autocomplete"
|
||||
:required="props.required"
|
||||
:disabled="props.disabled"
|
||||
:class="[
|
||||
props.inputClass,
|
||||
'focus:primary-300 dark:focus:primary-400/50 border-2 border-solid border-neutral-100 dark:border-neutral-900',
|
||||
|
||||
@@ -24,6 +24,8 @@ const props = withDefaults(defineProps<{
|
||||
* the consumer having to drop down to raw HTML.
|
||||
*/
|
||||
required?: boolean
|
||||
/** Disables editing and focus on the native input. */
|
||||
disabled?: boolean
|
||||
}>(), {
|
||||
variant: 'primary',
|
||||
size: 'md',
|
||||
@@ -79,6 +81,7 @@ const variantClasses: Record<InputVariant, Record<InputTheme, {
|
||||
v-model.number="modelValue"
|
||||
:type="props.type || 'text'"
|
||||
:required="props.required"
|
||||
:disabled="props.disabled"
|
||||
:class="[
|
||||
'transition-all duration-200 ease-in-out',
|
||||
'cursor-disabled:not-allowed',
|
||||
@@ -91,6 +94,7 @@ const variantClasses: Record<InputVariant, Record<InputTheme, {
|
||||
v-model="modelValue"
|
||||
:type="props.type || 'text'"
|
||||
:required="props.required"
|
||||
:disabled="props.disabled"
|
||||
:class="[
|
||||
'transition-all duration-200 ease-in-out',
|
||||
'cursor-disabled:not-allowed',
|
||||
|
||||
Generated
+233
-23
@@ -2127,7 +2127,7 @@ importers:
|
||||
version: 3.0.2(electron@41.2.1)
|
||||
'@electron-toolkit/tsconfig':
|
||||
specifier: 'catalog:'
|
||||
version: 2.0.0(@types/node@25.6.0)
|
||||
version: 2.0.0(@types/node@24.12.2)
|
||||
'@electron-toolkit/utils':
|
||||
specifier: 'catalog:'
|
||||
version: 4.0.0(electron@41.2.1)
|
||||
@@ -2166,7 +2166,7 @@ importers:
|
||||
version: 3.1.0
|
||||
'@intlify/unplugin-vue-i18n':
|
||||
specifier: 'catalog:'
|
||||
version: 11.0.7(@vue/compiler-dom@3.5.32)(eslint@10.2.1(jiti@2.7.0))(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
|
||||
version: 11.0.7(@vue/compiler-dom@3.5.32)(eslint@10.2.1(jiti@2.7.0))(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
|
||||
'@modelcontextprotocol/sdk':
|
||||
specifier: 'catalog:'
|
||||
version: 1.30.0(@cfworker/json-schema@4.1.1)(zod@4.4.3)
|
||||
@@ -2202,10 +2202,10 @@ importers:
|
||||
version: link:../../packages/ui-transitions
|
||||
'@proj-airi/unplugin-fetch':
|
||||
specifier: 'catalog:'
|
||||
version: 0.2.3(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
version: 0.2.3(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
'@proj-airi/unplugin-live2d-sdk':
|
||||
specifier: 'catalog:'
|
||||
version: 0.1.7(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
version: 0.1.7(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
'@types/audioworklet':
|
||||
specifier: 'catalog:'
|
||||
version: 0.0.97
|
||||
@@ -2232,7 +2232,7 @@ importers:
|
||||
version: 2.10.3
|
||||
'@vitejs/plugin-vue':
|
||||
specifier: 'catalog:'
|
||||
version: 6.0.6(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
|
||||
version: 6.0.6(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/volar':
|
||||
specifier: 'catalog:'
|
||||
version: 3.1.2(typescript@5.9.3)(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3))
|
||||
@@ -2265,7 +2265,7 @@ importers:
|
||||
version: 6.8.3
|
||||
electron-vite:
|
||||
specifier: 'catalog:'
|
||||
version: 5.0.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
version: 5.0.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
get-port-please:
|
||||
specifier: 'catalog:'
|
||||
version: 3.2.0
|
||||
@@ -2286,31 +2286,31 @@ importers:
|
||||
version: 2.2.6
|
||||
unocss-preset-scrollbar:
|
||||
specifier: 'catalog:'
|
||||
version: 4.0.0(unocss@66.6.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))
|
||||
version: 4.0.0(unocss@66.6.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)))
|
||||
unplugin-info:
|
||||
specifier: 'catalog:'
|
||||
version: 1.3.2(esbuild@0.27.2)(rollup@4.60.1)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
version: 1.3.2(esbuild@0.27.2)(rollup@4.60.1)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
unplugin-yaml:
|
||||
specifier: 'catalog:'
|
||||
version: 4.1.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
version: 4.1.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
vite:
|
||||
specifier: 'catalog:'
|
||||
version: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
version: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
vite-bundle-visualizer:
|
||||
specifier: 'catalog:'
|
||||
version: 1.2.1(rolldown@1.0.0-rc.16)(rollup@4.60.1)
|
||||
vite-plugin-mkcert:
|
||||
specifier: 'catalog:'
|
||||
version: 2.0.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
version: 2.0.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
vite-plugin-vue-devtools:
|
||||
specifier: 'catalog:'
|
||||
version: 8.1.1(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
|
||||
version: 8.1.1(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))
|
||||
vite-plugin-vue-layouts:
|
||||
specifier: 'catalog:'
|
||||
version: 0.11.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-router@5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
|
||||
version: 0.11.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-router@5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
|
||||
vue-macros:
|
||||
specifier: 'catalog:'
|
||||
version: 3.1.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3))
|
||||
version: 3.1.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3))
|
||||
vue-tsc:
|
||||
specifier: 'catalog:'
|
||||
version: 3.2.6(typescript@5.9.3)
|
||||
@@ -21699,9 +21699,9 @@ snapshots:
|
||||
dependencies:
|
||||
electron: 41.2.1
|
||||
|
||||
'@electron-toolkit/tsconfig@2.0.0(@types/node@25.6.0)':
|
||||
'@electron-toolkit/tsconfig@2.0.0(@types/node@24.12.2)':
|
||||
dependencies:
|
||||
'@types/node': 25.6.0
|
||||
'@types/node': 24.12.2
|
||||
|
||||
'@electron-toolkit/utils@4.0.0(electron@41.2.1)':
|
||||
dependencies:
|
||||
@@ -22638,6 +22638,31 @@ snapshots:
|
||||
- supports-color
|
||||
- typescript
|
||||
|
||||
'@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.32)(eslint@10.2.1(jiti@2.7.0))(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))':
|
||||
dependencies:
|
||||
'@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.7.0))
|
||||
'@intlify/bundle-utils': 11.0.7(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))
|
||||
'@intlify/shared': 11.3.2
|
||||
'@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.3.2)(@vue/compiler-dom@3.5.32)(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
|
||||
'@rollup/pluginutils': 5.3.0(rollup@4.60.1)
|
||||
'@typescript-eslint/scope-manager': 8.63.0
|
||||
'@typescript-eslint/typescript-estree': 8.63.0(typescript@5.9.3)
|
||||
debug: 4.4.3(supports-color@10.2.2)
|
||||
fast-glob: 3.3.3
|
||||
pathe: 2.0.3
|
||||
picocolors: 1.1.1
|
||||
unplugin: 2.3.11
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
vue: 3.5.32(typescript@5.9.3)
|
||||
optionalDependencies:
|
||||
vue-i18n: 11.3.2(vue@3.5.32(typescript@5.9.3))
|
||||
transitivePeerDependencies:
|
||||
- '@vue/compiler-dom'
|
||||
- eslint
|
||||
- rollup
|
||||
- supports-color
|
||||
- typescript
|
||||
|
||||
'@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.32)(eslint@10.2.1(jiti@2.7.0))(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-i18n@11.3.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))':
|
||||
dependencies:
|
||||
'@eslint-community/eslint-utils': 4.9.1(eslint@10.2.1(jiti@2.7.0))
|
||||
@@ -24768,11 +24793,35 @@ snapshots:
|
||||
|
||||
'@proj-airi/unocss-preset-chromatic@1.1.1': {}
|
||||
|
||||
'@proj-airi/unplugin-fetch@0.2.3(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
|
||||
dependencies:
|
||||
ofetch: 1.5.1
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
|
||||
'@proj-airi/unplugin-fetch@0.2.3(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
|
||||
dependencies:
|
||||
ofetch: 1.5.1
|
||||
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
|
||||
'@proj-airi/unplugin-live2d-sdk@0.1.7(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)':
|
||||
dependencies:
|
||||
ofetch: 1.5.1
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
yauzl: 3.3.0
|
||||
transitivePeerDependencies:
|
||||
- '@types/node'
|
||||
- '@vitejs/devtools'
|
||||
- esbuild
|
||||
- jiti
|
||||
- less
|
||||
- sass
|
||||
- sass-embedded
|
||||
- stylus
|
||||
- sugarss
|
||||
- terser
|
||||
- tsx
|
||||
- yaml
|
||||
|
||||
'@proj-airi/unplugin-live2d-sdk@0.1.7(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)':
|
||||
dependencies:
|
||||
ofetch: 1.5.1
|
||||
@@ -26507,6 +26556,12 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- typescript
|
||||
|
||||
'@vitejs/plugin-vue@6.0.6(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))':
|
||||
dependencies:
|
||||
'@rolldown/pluginutils': 1.0.0-rc.13
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
vue: 3.5.32(typescript@5.9.3)
|
||||
|
||||
'@vitejs/plugin-vue@6.0.6(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3))':
|
||||
dependencies:
|
||||
'@rolldown/pluginutils': 1.0.0-rc.13
|
||||
@@ -26782,6 +26837,15 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- vue
|
||||
|
||||
'@vue-macros/devtools@3.1.2(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
|
||||
dependencies:
|
||||
sirv: 3.0.2
|
||||
vue: 3.5.32(typescript@5.9.3)
|
||||
optionalDependencies:
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
transitivePeerDependencies:
|
||||
- typescript
|
||||
|
||||
'@vue-macros/devtools@3.1.2(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))':
|
||||
dependencies:
|
||||
sirv: 3.0.2
|
||||
@@ -28936,7 +29000,7 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
electron-vite@5.0.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
electron-vite@5.0.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
'@babel/core': 7.29.0
|
||||
'@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.29.0)
|
||||
@@ -28944,7 +29008,7 @@ snapshots:
|
||||
esbuild: 0.25.12
|
||||
magic-string: 0.30.21
|
||||
picocolors: 1.1.1
|
||||
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
@@ -35104,11 +35168,6 @@ snapshots:
|
||||
'@unocss/preset-mini': 66.6.8
|
||||
unocss: 66.6.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
|
||||
unocss-preset-scrollbar@4.0.0(unocss@66.6.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))):
|
||||
dependencies:
|
||||
'@unocss/preset-mini': 66.6.8
|
||||
unocss: 66.6.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
|
||||
unocss@66.6.8(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
'@unocss/cli': 66.6.8
|
||||
@@ -35175,6 +35234,14 @@ snapshots:
|
||||
unplugin: 2.3.11
|
||||
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
|
||||
unplugin-combine@2.3.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(unplugin@2.3.11)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
optionalDependencies:
|
||||
esbuild: 0.27.2
|
||||
rolldown: 1.0.0-rc.16
|
||||
rollup: 4.60.1
|
||||
unplugin: 2.3.11
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
|
||||
unplugin-combine@2.3.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(unplugin@2.3.11)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
optionalDependencies:
|
||||
esbuild: 0.27.2
|
||||
@@ -35196,6 +35263,19 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
unplugin-info@1.3.2(esbuild@0.27.2)(rollup@4.60.1)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
ci-info: 4.4.0
|
||||
git-url-parse: 16.1.0
|
||||
simple-git: 3.36.0
|
||||
unplugin: 2.3.11
|
||||
optionalDependencies:
|
||||
esbuild: 0.27.2
|
||||
rollup: 4.60.1
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
unplugin-info@1.3.2(esbuild@0.27.2)(rollup@4.60.1)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
ci-info: 4.4.0
|
||||
@@ -35289,6 +35369,17 @@ snapshots:
|
||||
rollup: 2.80.0
|
||||
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
|
||||
unplugin-yaml@4.1.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 5.3.0(rollup@4.60.1)
|
||||
unplugin: 3.0.0
|
||||
yaml: 2.8.3
|
||||
optionalDependencies:
|
||||
esbuild: 0.27.2
|
||||
rolldown: 1.0.0-rc.16
|
||||
rollup: 4.60.1
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
|
||||
unplugin-yaml@4.1.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
'@rollup/pluginutils': 5.3.0(rollup@4.60.1)
|
||||
@@ -35527,12 +35618,22 @@ snapshots:
|
||||
- rollup
|
||||
- supports-color
|
||||
|
||||
vite-dev-rpc@1.1.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
birpc: 2.9.0
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
vite-hot-client: 2.1.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
|
||||
vite-dev-rpc@1.1.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
birpc: 2.9.0
|
||||
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
vite-hot-client: 2.1.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
|
||||
vite-hot-client@2.1.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
|
||||
vite-hot-client@2.1.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
vite: 8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
@@ -35578,6 +35679,21 @@ snapshots:
|
||||
- tsx
|
||||
- yaml
|
||||
|
||||
vite-plugin-inspect@11.3.3(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
ansis: 4.2.0
|
||||
debug: 4.4.3(supports-color@10.2.2)
|
||||
error-stack-parser-es: 1.0.5
|
||||
ohash: 2.0.11
|
||||
open: 10.2.0
|
||||
perfect-debounce: 2.1.0
|
||||
sirv: 3.0.2
|
||||
unplugin-utils: 0.3.1
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
vite-dev-rpc: 1.1.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
vite-plugin-inspect@11.3.3(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
ansis: 4.2.0
|
||||
@@ -35609,6 +35725,13 @@ snapshots:
|
||||
- typescript
|
||||
- ws
|
||||
|
||||
vite-plugin-mkcert@2.0.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
debug: 4.4.3(supports-color@10.2.2)
|
||||
supports-color: 10.2.2
|
||||
undici: 8.1.0
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
|
||||
vite-plugin-mkcert@2.0.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
debug: 4.4.3(supports-color@10.2.2)
|
||||
@@ -35627,6 +35750,20 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
vite-plugin-vue-devtools@8.1.1(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3)):
|
||||
dependencies:
|
||||
'@vue/devtools-core': 8.1.1(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue/devtools-kit': 8.1.1
|
||||
'@vue/devtools-shared': 8.1.1
|
||||
sirv: 3.0.2
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
vite-plugin-inspect: 11.3.3(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
vite-plugin-vue-inspector: 5.3.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
transitivePeerDependencies:
|
||||
- '@nuxt/kit'
|
||||
- supports-color
|
||||
- vue
|
||||
|
||||
vite-plugin-vue-devtools@8.1.1(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue@3.5.32(typescript@5.9.3)):
|
||||
dependencies:
|
||||
'@vue/devtools-core': 8.1.1(vue@3.5.32(typescript@5.9.3))
|
||||
@@ -35641,6 +35778,21 @@ snapshots:
|
||||
- supports-color
|
||||
- vue
|
||||
|
||||
vite-plugin-vue-inspector@5.3.2(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
'@babel/core': 7.29.0
|
||||
'@babel/plugin-proposal-decorators': 7.28.0(@babel/core@7.29.0)
|
||||
'@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.29.0)
|
||||
'@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.29.0)
|
||||
'@babel/plugin-transform-typescript': 7.28.5(@babel/core@7.29.0)
|
||||
'@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.29.0)
|
||||
'@vue/compiler-dom': 3.5.32
|
||||
kolorist: 1.8.0
|
||||
magic-string: 0.30.21
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
vite-plugin-vue-inspector@5.3.2(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)):
|
||||
dependencies:
|
||||
'@babel/core': 7.29.0
|
||||
@@ -35656,6 +35808,16 @@ snapshots:
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
vite-plugin-vue-layouts@0.11.0(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-router@5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)):
|
||||
dependencies:
|
||||
debug: 4.4.3(supports-color@10.2.2)
|
||||
fast-glob: 3.3.3
|
||||
vite: 8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3)
|
||||
vue: 3.5.32(typescript@5.9.3)
|
||||
vue-router: 5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
|
||||
transitivePeerDependencies:
|
||||
- supports-color
|
||||
|
||||
vite-plugin-vue-layouts@0.11.0(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-router@5.0.4(@pinia/colada@1.2.1(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(@vue/compiler-sfc@3.5.32)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3)):
|
||||
dependencies:
|
||||
debug: 4.4.3(supports-color@10.2.2)
|
||||
@@ -35921,6 +36083,54 @@ snapshots:
|
||||
- vue-tsc
|
||||
- webpack
|
||||
|
||||
vue-macros@3.1.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3)):
|
||||
dependencies:
|
||||
'@vue-macros/better-define': 3.1.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/boolean-prop': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/chain-call': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/common': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/config': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/define-emit': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/define-models': 3.1.2(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/define-prop': 3.1.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/define-props': 3.1.2(@vue-macros/reactivity-transform@3.1.2(vue@3.5.32(typescript@5.9.3)))(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/define-props-refs': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/define-render': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/define-slots': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/define-stylex': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/devtools': 3.1.2(typescript@5.9.3)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
'@vue-macros/export-expose': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/export-props': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/export-render': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/hoist-static': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/jsx-directive': 3.1.2(typescript@5.9.3)
|
||||
'@vue-macros/named-template': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/reactivity-transform': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/script-lang': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/setup-block': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/setup-component': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/setup-sfc': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/short-bind': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/short-emits': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/short-vmodel': 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
'@vue-macros/volar': 3.1.2(typescript@5.9.3)(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3))
|
||||
unplugin: 2.3.11
|
||||
unplugin-combine: 2.3.0(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(unplugin@2.3.11)(vite@8.0.8(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))
|
||||
unplugin-vue-define-options: 3.1.2(vue@3.5.32(typescript@5.9.3))
|
||||
vue: 3.5.32(typescript@5.9.3)
|
||||
transitivePeerDependencies:
|
||||
- '@emnapi/core'
|
||||
- '@emnapi/runtime'
|
||||
- '@rspack/core'
|
||||
- '@vueuse/core'
|
||||
- esbuild
|
||||
- rolldown
|
||||
- rollup
|
||||
- typescript
|
||||
- vite
|
||||
- vue-tsc
|
||||
- webpack
|
||||
|
||||
vue-macros@3.1.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(@vueuse/core@14.2.1(vue@3.5.32(typescript@5.9.3)))(esbuild@0.27.2)(rolldown@1.0.0-rc.16)(rollup@4.60.1)(typescript@5.9.3)(vite@8.0.8(@types/node@25.6.0)(esbuild@0.27.2)(jiti@2.7.0)(less@4.6.4)(terser@5.46.1)(tsx@4.21.0)(yaml@2.8.3))(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.32(typescript@5.9.3)):
|
||||
dependencies:
|
||||
'@vue-macros/better-define': 3.1.2(@emnapi/core@1.11.2)(@emnapi/runtime@1.11.2)(vue@3.5.32(typescript@5.9.3))
|
||||
|
||||
Reference in New Issue
Block a user