/** * @locuschain/lib/vite-plugin * * Vite (그리고 wxt) 사용자가 lib 의 wasm 4 개를 자동으로 빌드 그래프에 포함시키도록 돕는 plugin. * * 두 가지 모드: * - `mode: 'assets'` (기본): wasm 을 Vite 의 emitFile 로 자산 그래프에 등록. * Vite 가 `assets/-.wasm` 으로 emit. URL 은 `import.meta.ROLLUP_FILE_URL_` * placeholder 로 치환. 일반 Vite 웹 빌드, wxt 단일 entry 빌드에 적합. * * - `mode: 'public'`: wasm 을 Vite 의 publicDir 안 `wasm/` 폴더로 복사하고, * lib URL 을 `chrome.runtime.getURL('wasm/')` 로 치환. * wxt 처럼 entry 별 별도 빌드를 돌리는 환경에서 모든 entry 가 같은 wasm 사본을 * 공유하도록 한다. chrome extension 한정. * * 왜 두 모드인가: * - 모던 Vite/Webpack 의 자산 그래프는 정적 분석 기반인데, wxt 의 defineImportMeta * plugin 이 `import.meta.url` 을 `self.location.href` 로 매크로 치환해서 그 그래프 * 추적을 깨뜨린다. 이 plugin 은 `enforce: 'pre'` 로 wxt:define 보다 먼저 lib 코드의 * `new URL("../autogen/wasm/", import.meta.url)` 패턴을 직접 잡아 처리한다. * - 'assets' 모드는 entry 별 빌드 격리 환경에서 entry 마다 wasm 사본이 중복 emit 됨. * - 'public' 모드는 publicDir 기반이라 entry 빌드와 무관하게 한 번만 출력 + 공유. * * 사용법: * import { locusWasmPlugin } from '@locuschain/lib/vite-plugin'; * // 단일 entry (일반 web app) * plugins: [locusWasmPlugin()] * // wxt 의 chrome extension (entry 격리 빌드) * plugins: [locusWasmPlugin({ mode: 'public' })] */ import type { Plugin } from 'vite'; export interface LocusWasmPluginOptions { /** * - 'assets' (기본): Vite emitFile + ROLLUP_FILE_URL placeholder. 단일 entry 빌드용. * - 'public' : publicDir/wasm/ 에 wasm 복사 + chrome.runtime.getURL 치환. * wxt 처럼 entry 별 별도 빌드를 돌리는 chrome extension 환경용. */ mode?: 'assets' | 'public'; /** * public 모드에서 wasm 을 두는 서브 디렉토리. publicDir 기준 상대 경로. 기본 'wasm'. * 빌드 결과는 `//.wasm` 로 나온다. */ publicSubdir?: string; } export declare function locusWasmPlugin(opts?: LocusWasmPluginOptions): Plugin; export default locusWasmPlugin;