From bcc262a50c6a30bf0e024d1ad4a50260a84e9093 Mon Sep 17 00:00:00 2001 From: Makito Date: Mon, 20 Oct 2025 16:09:45 +0900 Subject: [PATCH] fix(stage-tamagotchi,stage-shared,stage-ui): unify electron-renderer globals and fix env checks in providers (#668) --- apps/stage-tamagotchi/electron.vite.config.ts | 12 +++---- apps/stage-tamagotchi/package.json | 1 + apps/stage-tamagotchi/src/preload/index.d.ts | 9 ------ apps/stage-tamagotchi/src/preload/index.ts | 3 -- .../src/renderer/electron-renderer.d.ts | 8 ----- apps/stage-tamagotchi/tsconfig.json | 5 +-- apps/stage-tamagotchi/tsconfig.node.json | 5 --- apps/stage-tamagotchi/tsconfig.preload.json | 32 +++++++++++++++++++ apps/stage-tamagotchi/tsconfig.web.json | 2 +- packages/stage-shared/package.json | 6 +++- .../stage-shared/src/electron-renderer.d.ts | 5 +++ packages/stage-shared/src/index.ts | 1 + packages/stage-shared/src/window.ts | 13 ++++++++ packages/stage-shared/tsconfig.json | 3 +- packages/stage-ui/src/stores/providers.ts | 19 +++-------- pnpm-lock.yaml | 16 ++++++++-- 16 files changed, 86 insertions(+), 54 deletions(-) delete mode 100644 apps/stage-tamagotchi/src/preload/index.d.ts delete mode 100644 apps/stage-tamagotchi/src/renderer/electron-renderer.d.ts create mode 100644 apps/stage-tamagotchi/tsconfig.preload.json create mode 100644 packages/stage-shared/src/electron-renderer.d.ts create mode 100644 packages/stage-shared/src/window.ts diff --git a/apps/stage-tamagotchi/electron.vite.config.ts b/apps/stage-tamagotchi/electron.vite.config.ts index 3671e5d94..27616f8db 100644 --- a/apps/stage-tamagotchi/electron.vite.config.ts +++ b/apps/stage-tamagotchi/electron.vite.config.ts @@ -74,13 +74,11 @@ export default defineConfig({ plugins: [ { name: 'proj-airi:define-runtime-environment', - config(ctx) { - if (ctx.mode === 'production') { - return { - define: { - 'import.meta.env.RUNTIME_ENVIRONMENT': '\'electron\'', - }, - } + config() { + return { + define: { + 'import.meta.env.RUNTIME_ENVIRONMENT': '\'electron\'', + }, } }, }, diff --git a/apps/stage-tamagotchi/package.json b/apps/stage-tamagotchi/package.json index ec9208104..198edb434 100644 --- a/apps/stage-tamagotchi/package.json +++ b/apps/stage-tamagotchi/package.json @@ -127,6 +127,7 @@ "@iconify/utils": "^3.0.2", "@intlify/unplugin-vue-i18n": "^11.0.1", "@proj-airi/lobe-icons": "^1.0.13", + "@proj-airi/stage-shared": "workspace:^", "@proj-airi/ui-transitions": "workspace:^", "@proj-airi/unplugin-fetch": "^0.1.7", "@proj-airi/unplugin-live2d-sdk": "^0.1.6", diff --git a/apps/stage-tamagotchi/src/preload/index.d.ts b/apps/stage-tamagotchi/src/preload/index.d.ts deleted file mode 100644 index 51b00596f..000000000 --- a/apps/stage-tamagotchi/src/preload/index.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -import type { ElectronAPI } from '@electron-toolkit/preload' - -declare global { - interface Window { - electron: ElectronAPI - platform: NodeJS.Platform - api: unknown - } -} diff --git a/apps/stage-tamagotchi/src/preload/index.ts b/apps/stage-tamagotchi/src/preload/index.ts index 83dbbd18e..43b009209 100644 --- a/apps/stage-tamagotchi/src/preload/index.ts +++ b/apps/stage-tamagotchi/src/preload/index.ts @@ -20,10 +20,7 @@ if (contextIsolated) { } } else { - // @ts-expect-error (define in dts) window.electron = electronAPI - // @ts-expect-error (define in dts) window.platform = platform - // @ts-expect-error (define in dts) window.api = api } diff --git a/apps/stage-tamagotchi/src/renderer/electron-renderer.d.ts b/apps/stage-tamagotchi/src/renderer/electron-renderer.d.ts deleted file mode 100644 index 1226ecaf8..000000000 --- a/apps/stage-tamagotchi/src/renderer/electron-renderer.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -declare global { - interface Window { - electron: import('@electron-toolkit/preload').ElectronAPI - platform: NodeJS.Platform - } -} - -export {} diff --git a/apps/stage-tamagotchi/tsconfig.json b/apps/stage-tamagotchi/tsconfig.json index f2aa80952..89fbc57a9 100644 --- a/apps/stage-tamagotchi/tsconfig.json +++ b/apps/stage-tamagotchi/tsconfig.json @@ -1,7 +1,8 @@ { "references": [ - { "path": "./tsconfig.web.json" }, - { "path": "./tsconfig.node.json" } + { "path": "./tsconfig.preload.json" }, + { "path": "./tsconfig.node.json" }, + { "path": "./tsconfig.web.json" } ], "files": [] } diff --git a/apps/stage-tamagotchi/tsconfig.node.json b/apps/stage-tamagotchi/tsconfig.node.json index 14a823b81..66be51eff 100644 --- a/apps/stage-tamagotchi/tsconfig.node.json +++ b/apps/stage-tamagotchi/tsconfig.node.json @@ -27,11 +27,6 @@ "src/main/**/*.tsx", "src/main/**/*.vue", - "src/preload/**/*.ts", - "src/preload/**/*.d.ts", - "src/preload/**/*.tsx", - "src/preload/**/*.vue", - "src/shared/**/*.ts", "src/shared/**/*.d.ts", "src/shared/**/*.tsx", diff --git a/apps/stage-tamagotchi/tsconfig.preload.json b/apps/stage-tamagotchi/tsconfig.preload.json new file mode 100644 index 000000000..4c98da6b1 --- /dev/null +++ b/apps/stage-tamagotchi/tsconfig.preload.json @@ -0,0 +1,32 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "composite": true, + "target": "ESNext", + "jsx": "preserve", + "lib": [ + "DOM", + "ESNext" + ], + "useDefineForClassFields": true, + "resolveJsonModule": true, + "types": [ + "vitest", + "vite/client", + "electron-vite/node", + "@proj-airi/stage-shared/electron-renderer" + ], + "allowJs": true, + "strict": true, + "skipLibCheck": true + }, + "include": [ + "vite.config.ts", + "electron.vite.config.ts", + + "src/preload/**/*.ts", + "src/preload/**/*.d.ts", + "src/preload/**/*.tsx", + "src/preload/**/*.vue" + ] +} diff --git a/apps/stage-tamagotchi/tsconfig.web.json b/apps/stage-tamagotchi/tsconfig.web.json index 866dbdbec..f919d91e5 100644 --- a/apps/stage-tamagotchi/tsconfig.web.json +++ b/apps/stage-tamagotchi/tsconfig.web.json @@ -26,7 +26,7 @@ "unplugin-vue-router/client", "@types/audioworklet", "unplugin-info/client", - "./src/renderer/electron-renderer.d.ts" + "@proj-airi/stage-shared/electron-renderer" ], "allowJs": true, "strict": true, diff --git a/packages/stage-shared/package.json b/packages/stage-shared/package.json index 315d49171..440c06183 100644 --- a/packages/stage-shared/package.json +++ b/packages/stage-shared/package.json @@ -15,9 +15,13 @@ "directory": "packages/stage-shared" }, "exports": { - ".": "./src/index.ts" + ".": "./src/index.ts", + "./electron-renderer": "./src/electron-renderer.d.ts" }, "scripts": { "typecheck": "tsc --noEmit" + }, + "devDependencies": { + "@electron-toolkit/preload": "^3.0.2" } } diff --git a/packages/stage-shared/src/electron-renderer.d.ts b/packages/stage-shared/src/electron-renderer.d.ts new file mode 100644 index 000000000..977c8e054 --- /dev/null +++ b/packages/stage-shared/src/electron-renderer.d.ts @@ -0,0 +1,5 @@ +import type { ElectronWindow } from './window' + +declare global { + interface Window extends ElectronWindow {} +} diff --git a/packages/stage-shared/src/index.ts b/packages/stage-shared/src/index.ts index a1c0f5697..a7f7eafbc 100644 --- a/packages/stage-shared/src/index.ts +++ b/packages/stage-shared/src/index.ts @@ -1,2 +1,3 @@ export * from './environment' export * from './url' +export * from './window' diff --git a/packages/stage-shared/src/window.ts b/packages/stage-shared/src/window.ts new file mode 100644 index 000000000..483424cb2 --- /dev/null +++ b/packages/stage-shared/src/window.ts @@ -0,0 +1,13 @@ +import type { ElectronAPI } from '@electron-toolkit/preload' + +import { isStageTamagotchi } from './environment' + +export interface ElectronWindow { + electron: ElectronAPI + platform: NodeJS.Platform + api: unknown +} + +export function isElectronWindow(window: Window): window is (Window & ElectronWindow) { + return isStageTamagotchi() && typeof window === 'object' && window !== null && 'electron' in window +} diff --git a/packages/stage-shared/tsconfig.json b/packages/stage-shared/tsconfig.json index 74e563a92..6fc36a5d8 100644 --- a/packages/stage-shared/tsconfig.json +++ b/packages/stage-shared/tsconfig.json @@ -38,6 +38,7 @@ ], "exclude": [ "dist", - "node_modules" + "node_modules", + "src/electron-renderer.d.ts" ] } diff --git a/packages/stage-ui/src/stores/providers.ts b/packages/stage-ui/src/stores/providers.ts index 190c6b280..8003f078d 100644 --- a/packages/stage-ui/src/stores/providers.ts +++ b/packages/stage-ui/src/stores/providers.ts @@ -17,7 +17,7 @@ import type { VoiceProviderWithExtraOptions, } from 'unspeech' -import { isUrl } from '@proj-airi/stage-shared' +import { isStageTamagotchi, isUrl } from '@proj-airi/stage-shared' import { computedAsync, useLocalStorage } from '@vueuse/core' import { createAzure, @@ -214,19 +214,8 @@ export const useProvidersStore = defineStore('providers', () => { return null }) - async function isTamagotchi() { - if ('window' in globalThis && globalThis.window != null) { - if (('__TAURI_INTERNALS__' in globalThis.window && globalThis.window.__TAURI_INTERNALS__ != null) || location.host === 'tauri.localhost') { - return true - } - } - return false - } - async function isBrowserAndMemoryEnough() { - const isInApp = await isTamagotchi() - - if (isInApp) + if (isStageTamagotchi()) return false const webGPUAvailable = await isWebGPUSupported() @@ -313,7 +302,7 @@ export const useProvidersStore = defineStore('providers', () => { description: 'https://github.com/huggingface/candle', category: 'speech', tasks: ['text-to-speech', 'tts'], - isAvailableBy: isTamagotchi, + isAvailableBy: isStageTamagotchi, creator: createOpenAI, validation: [], validators: { @@ -343,7 +332,7 @@ export const useProvidersStore = defineStore('providers', () => { description: 'https://github.com/huggingface/candle', category: 'transcription', tasks: ['speech-to-text', 'automatic-speech-recognition', 'asr', 'stt'], - isAvailableBy: isTamagotchi, + isAvailableBy: isStageTamagotchi, creator: createOpenAI, validation: [], validators: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 764edf284..7a264c276 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -558,6 +558,9 @@ importers: '@proj-airi/lobe-icons': specifier: ^1.0.13 version: 1.0.13 + '@proj-airi/stage-shared': + specifier: workspace:^ + version: link:../../packages/stage-shared '@proj-airi/ui-transitions': specifier: workspace:^ version: link:../../packages/ui-transitions @@ -1311,7 +1314,11 @@ importers: specifier: ^3.1.1 version: 3.1.1(typescript@5.9.3) - packages/stage-shared: {} + packages/stage-shared: + devDependencies: + '@electron-toolkit/preload': + specifier: ^3.0.2 + version: 3.0.2(electron@38.2.2) packages/stage-ui: dependencies: @@ -8029,6 +8036,9 @@ packages: '@xsai/shared@0.4.0-beta.4': resolution: {integrity: sha512-BqaX0q1j9m+YgcJuqIvNKXI+/dv5RXZUOjHbnVDfOMLUxaT3SIaA3M5I6PKjvMt6ZRzIHLLU/o5q2kQRAAVBrw==} + '@xsai/shared@0.4.0-beta.5': + resolution: {integrity: sha512-6oLyXkN8WoXoufNuIVFMrJyhJEEkWnGEi44v5SBd2fnBU7Wx4nT9ZRJT0A+Yfvx2pYWYqgHUQ9KVnG+DFT3VxQ==} + '@xsai/stream-text@0.3.5': resolution: {integrity: sha512-XUyM3/jo9FulWoqmQU6vvHFOoRZzr3rcsTGm0MY8hUXg9HJl91N0voQGb6R5AMlo5XgoSbO3GMFzJ26AVxmRMg==} @@ -23120,7 +23130,7 @@ snapshots: '@xsai-ext/shared-providers@0.2.2': dependencies: - '@xsai/shared': 0.4.0-beta.4 + '@xsai/shared': 0.4.0-beta.5 '@xsai-ext/shared-providers@0.4.0-beta.4': dependencies: @@ -23212,6 +23222,8 @@ snapshots: '@xsai/shared@0.4.0-beta.4': {} + '@xsai/shared@0.4.0-beta.5': {} + '@xsai/stream-text@0.3.5': dependencies: '@xsai/shared-chat': 0.3.5