@vetta-org/plugin-vite 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dev-server.d.ts.map +1 -1
- package/dist/dev-server.js +5 -0
- package/dist/dev-server.js.map +1 -1
- package/package.json +2 -2
package/dist/dev-server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"AAYA,OAAO,EAGN,KAAK,mBAAmB,EAExB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AA8HD,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAC3C,OAAO,CAAC,oBAAoB,CAAC,CAoG/B","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { dirname, isAbsolute, relative, resolve } from \"node:path\";\nimport {\n\tlistPluginManifestResources,\n\tparsePluginManifest,\n\ttype PluginManifest,\n} from \"@vetta-org/plugin-sdk/manifest\";\nimport { watch } from \"chokidar\";\nimport { createServer, isCSSRequest, type ViteDevServer } from \"vite\";\nimport { VETTA_PLUGIN_DEV_ENTRY_ID } from \"./dev-vite-plugins.js\";\nimport {\n\temitVettaPluginDevEvent,\n\tsetVettaPluginDevEventListener,\n\ttype VettaPluginDevEvent,\n\tVETTA_PLUGIN_DEV_PROTOCOL_VERSION,\n} from \"./dev-events.js\";\nimport { hasOpaqueResourceQuery } from \"./request-query.js\";\n\nexport interface VettaPluginDevServer {\n\tpluginId: string;\n\tentryUrl: string;\n\torigin: string;\n\tclose(): Promise<void>;\n}\n\nfunction debugDevServer(message: string): void {\n\tif (process.env.VETTA_PLUGIN_DEV_DEBUG === \"1\") {\n\t\tprocess.stderr.write(`[vetta-plugin dev] ${message}\\n`);\n\t}\n}\n\nasync function readManifest(rootDir: string): Promise<PluginManifest> {\n\tconst manifestPath = resolve(rootDir, \"plugin.json\");\n\tconst raw: unknown = JSON.parse(await readFile(manifestPath, \"utf8\"));\n\treturn parsePluginManifest(raw);\n}\n\nfunction isInsidePath(candidate: string, root: string): boolean {\n\tconst pathFromRoot = relative(root, candidate);\n\treturn pathFromRoot === \"\" || (!pathFromRoot.startsWith(\"..\") && !isAbsolute(pathFromRoot));\n}\n\nfunction isPluginProjectModule(candidate: string, rootDir: string): boolean {\n\tif (!isInsidePath(candidate, rootDir)) return false;\n\tconst pathFromRoot = relative(rootDir, candidate);\n\treturn pathFromRoot.split(/[\\\\/]/u, 1)[0] !== \"node_modules\";\n}\n\nasync function collectWatchedResourceRoots(rootDir: string, manifest: PluginManifest): Promise<string[]> {\n\tconst resources = listPluginManifestResources(manifest).filter(\n\t\t(resource) => resource.field !== \"entry\" && resource.field !== \"styles\",\n\t);\n\tconst paths = [resolve(rootDir, \"plugin.json\"), resolve(rootDir, \"locales\")];\n\tfor (const resource of resources) {\n\t\tconst resourcePath = resolve(rootDir, resource.path);\n\t\tif (resource.kind === \"file\") {\n\t\t\tpaths.push(resourcePath);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst resourceStat = await stat(resourcePath);\n\t\t\tpaths.push(resourceStat.isDirectory() ? resourcePath : dirname(resourcePath));\n\t\t} catch {\n\t\t\tpaths.push(resourcePath);\n\t\t}\n\t}\n\treturn paths;\n}\n\nasync function findAvailablePort(): Promise<number> {\n\treturn new Promise<number>((resolvePromise, reject) => {\n\t\tconst probe = createNetServer();\n\t\tprobe.once(\"error\", reject);\n\t\tprobe.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = probe.address();\n\t\t\tif (address === null || typeof address === \"string\") {\n\t\t\t\tprobe.close();\n\t\t\t\treject(new Error(\"Could not allocate a plugin dev server port\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tprobe.close((error) => {\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolvePromise(address.port);\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction resolveServerOrigin(server: ViteDevServer): string {\n\tconst localUrl = server.resolvedUrls?.local[0];\n\tif (!localUrl) throw new Error(\"Vite dev server did not expose a local URL\");\n\treturn localUrl.endsWith(\"/\") ? localUrl.slice(0, -1) : localUrl;\n}\n\nfunction resolveViteConfigFile(rootDir: string): string | undefined {\n\tfor (const fileName of [\"vite.config.ts\", \"vite.config.mts\", \"vite.config.js\", \"vite.config.mjs\"]) {\n\t\tconst configPath = resolve(rootDir, fileName);\n\t\tif (existsSync(configPath)) return configPath;\n\t}\n\treturn undefined;\n}\n\nfunction assertDevPluginsConfigured(server: ViteDevServer): void {\n\tif (!server.config.plugins.some((plugin) => plugin.name === \"vetta-plugin-dev-runtime\")) {\n\t\tthrow new Error(\"Vite config must include vettaPluginFederation() to enable the plugin development runtime\");\n\t}\n}\n\nasync function assertDevEntryAvailable(entryUrl: string): Promise<void> {\n\tconst response = await fetch(entryUrl);\n\tif (!response.ok) {\n\t\tthrow new Error(`Plugin dev entry is unavailable: ${entryUrl} returned HTTP ${response.status}`);\n\t}\n\tawait response.body?.cancel();\n}\n\nasync function assertDevModuleGraphAvailable(server: ViteDevServer, rootDir: string): Promise<void> {\n\tconst environment = server.environments.client;\n\tconst pendingUrls = [VETTA_PLUGIN_DEV_ENTRY_ID];\n\tconst transformedUrls = new Set<string>();\n\twhile (pendingUrls.length > 0) {\n\t\tconst moduleUrl = pendingUrls.pop();\n\t\tif (moduleUrl === undefined || transformedUrls.has(moduleUrl)) continue;\n\t\ttransformedUrls.add(moduleUrl);\n\t\tdebugDevServer(`transforming ${moduleUrl}`);\n\t\ttry {\n\t\t\tconst result = await environment.transformRequest(moduleUrl);\n\t\t\tif (result === null) throw new Error(\"Vite returned no transform result\");\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Plugin development module failed to transform (${moduleUrl}): ${message}`);\n\t\t}\n\t\tif (hasOpaqueResourceQuery(moduleUrl)) continue;\n\t\tconst module = await environment.moduleGraph.getModuleByUrl(moduleUrl);\n\t\tif (!module) throw new Error(`Plugin development module is missing from the Vite graph: ${moduleUrl}`);\n\t\t// A CSS transform already resolves its @imports and produces the browser\n\t\t// update module. Plugin processors such as Tailwind may attach scanned\n\t\t// source files to importedModules even though the browser never imports\n\t\t// them, so they must not become independent JavaScript probes.\n\t\tif (isCSSRequest(moduleUrl)) continue;\n\t\tfor (const importedModule of module.importedModules) {\n\t\t\tif (importedModule.file && isPluginProjectModule(importedModule.file, rootDir)) {\n\t\t\t\tpendingUrls.push(importedModule.url);\n\t\t\t}\n\t\t}\n\t}\n\tdebugDevServer(`transformed ${transformedUrls.size} plugin modules`);\n}\n\nexport async function startVettaPluginDevServer(\n\trootDir: string,\n\tonEvent: (event: VettaPluginDevEvent) => void,\n): Promise<VettaPluginDevServer> {\n\tprocess.env.VETTA_PLUGIN_DEV_SERVER = \"1\";\n\tsetVettaPluginDevEventListener(onEvent);\n\n\tlet manifest = await readManifest(rootDir);\n\tlet watchedResourceRoots = await collectWatchedResourceRoots(rootDir, manifest);\n\tconst port = await findAvailablePort();\n\tconst server = await createServer({\n\t\troot: rootDir,\n\t\tconfigFile: resolveViteConfigFile(rootDir),\n\t\tlogLevel: \"silent\",\n\t\tserver: {\n\t\t\thost: \"127.0.0.1\",\n\t\t\tport,\n\t\t\tstrictPort: true,\n\t\t\tcors: true,\n\t\t\thmr: { overlay: false },\n\t\t},\n\t});\n\tdebugDevServer(\"vite server created\");\n\tlet refreshTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst resourceWatcher = watch(watchedResourceRoots, { ignoreInitial: true });\n\tresourceWatcher.on(\"error\", (error) => {\n\t\temitVettaPluginDevEvent({\n\t\t\ttype: \"error\",\n\t\t\tpluginId: manifest.id,\n\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t});\n\t});\n\tresourceWatcher.on(\"all\", (_event, changedPath) => {\n\t\tconst absolutePath = resolve(changedPath);\n\t\tif (!watchedResourceRoots.some((watchedPath) => isInsidePath(absolutePath, watchedPath))) return;\n\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\trefreshTimer = setTimeout(() => {\n\t\t\tvoid (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tif (absolutePath === resolve(rootDir, \"plugin.json\")) {\n\t\t\t\t\t\tmanifest = await readManifest(rootDir);\n\t\t\t\t\t\tconst nextWatchedResourceRoots = await collectWatchedResourceRoots(rootDir, manifest);\n\t\t\t\t\t\tconst removedRoots = watchedResourceRoots.filter((path) => !nextWatchedResourceRoots.includes(path));\n\t\t\t\t\t\tif (removedRoots.length > 0) await resourceWatcher.unwatch(removedRoots);\n\t\t\t\t\t\tresourceWatcher.add(nextWatchedResourceRoots);\n\t\t\t\t\t\twatchedResourceRoots = nextWatchedResourceRoots;\n\t\t\t\t\t}\n\t\t\t\t\temitVettaPluginDevEvent({\n\t\t\t\t\t\ttype: \"update\",\n\t\t\t\t\t\tpluginId: manifest.id,\n\t\t\t\t\t\treason: \"resource\",\n\t\t\t\t\t\tpath: relative(rootDir, absolutePath).replaceAll(\"\\\\\", \"/\"),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\temitVettaPluginDevEvent({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tpluginId: manifest.id,\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})();\n\t\t}, 80);\n\t});\n\n\tlet origin: string;\n\tlet entryUrl: string;\n\ttry {\n\t\tassertDevPluginsConfigured(server);\n\t\tdebugDevServer(\"starting vite listener\");\n\t\tawait server.listen();\n\t\tdebugDevServer(\"vite listener ready\");\n\t\torigin = resolveServerOrigin(server);\n\t\tentryUrl = `${origin}/mf-manifest.json`;\n\t\tdebugDevServer(`probing ${entryUrl}`);\n\t\tawait assertDevEntryAvailable(entryUrl);\n\t\tdebugDevServer(\"probing plugin module graph\");\n\t\tawait assertDevModuleGraphAvailable(server, rootDir);\n\t\tdebugDevServer(\"plugin entry ready\");\n\t} catch (error) {\n\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\tsetVettaPluginDevEventListener(undefined);\n\t\tawait Promise.all([resourceWatcher.close(), server.close()]);\n\t\tthrow error;\n\t}\n\tconst readyEvent: VettaPluginDevEvent = {\n\t\ttype: \"ready\",\n\t\tprotocolVersion: VETTA_PLUGIN_DEV_PROTOCOL_VERSION,\n\t\tpluginId: manifest.id,\n\t\tentryUrl,\n\t\torigin,\n\t};\n\tonEvent(readyEvent);\n\n\treturn {\n\t\tpluginId: manifest.id,\n\t\tentryUrl,\n\t\torigin,\n\t\tasync close() {\n\t\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\t\tsetVettaPluginDevEventListener(undefined);\n\t\t\tawait Promise.all([resourceWatcher.close(), server.close()]);\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dev-server.d.ts","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"AAYA,OAAO,EAGN,KAAK,mBAAmB,EAExB,MAAM,iBAAiB,CAAC;AAGzB,MAAM,WAAW,oBAAoB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACvB;AA8HD,wBAAsB,yBAAyB,CAC9C,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,CAAC,KAAK,EAAE,mBAAmB,KAAK,IAAI,GAC3C,OAAO,CAAC,oBAAoB,CAAC,CAyG/B","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { dirname, isAbsolute, relative, resolve } from \"node:path\";\nimport {\n\tlistPluginManifestResources,\n\tparsePluginManifest,\n\ttype PluginManifest,\n} from \"@vetta-org/plugin-sdk/manifest\";\nimport { watch } from \"chokidar\";\nimport { createServer, isCSSRequest, type ViteDevServer } from \"vite\";\nimport { VETTA_PLUGIN_DEV_ENTRY_ID } from \"./dev-vite-plugins.js\";\nimport {\n\temitVettaPluginDevEvent,\n\tsetVettaPluginDevEventListener,\n\ttype VettaPluginDevEvent,\n\tVETTA_PLUGIN_DEV_PROTOCOL_VERSION,\n} from \"./dev-events.js\";\nimport { hasOpaqueResourceQuery } from \"./request-query.js\";\n\nexport interface VettaPluginDevServer {\n\tpluginId: string;\n\tentryUrl: string;\n\torigin: string;\n\tclose(): Promise<void>;\n}\n\nfunction debugDevServer(message: string): void {\n\tif (process.env.VETTA_PLUGIN_DEV_DEBUG === \"1\") {\n\t\tprocess.stderr.write(`[vetta-plugin dev] ${message}\\n`);\n\t}\n}\n\nasync function readManifest(rootDir: string): Promise<PluginManifest> {\n\tconst manifestPath = resolve(rootDir, \"plugin.json\");\n\tconst raw: unknown = JSON.parse(await readFile(manifestPath, \"utf8\"));\n\treturn parsePluginManifest(raw);\n}\n\nfunction isInsidePath(candidate: string, root: string): boolean {\n\tconst pathFromRoot = relative(root, candidate);\n\treturn pathFromRoot === \"\" || (!pathFromRoot.startsWith(\"..\") && !isAbsolute(pathFromRoot));\n}\n\nfunction isPluginProjectModule(candidate: string, rootDir: string): boolean {\n\tif (!isInsidePath(candidate, rootDir)) return false;\n\tconst pathFromRoot = relative(rootDir, candidate);\n\treturn pathFromRoot.split(/[\\\\/]/u, 1)[0] !== \"node_modules\";\n}\n\nasync function collectWatchedResourceRoots(rootDir: string, manifest: PluginManifest): Promise<string[]> {\n\tconst resources = listPluginManifestResources(manifest).filter(\n\t\t(resource) => resource.field !== \"entry\" && resource.field !== \"styles\",\n\t);\n\tconst paths = [resolve(rootDir, \"plugin.json\"), resolve(rootDir, \"locales\")];\n\tfor (const resource of resources) {\n\t\tconst resourcePath = resolve(rootDir, resource.path);\n\t\tif (resource.kind === \"file\") {\n\t\t\tpaths.push(resourcePath);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst resourceStat = await stat(resourcePath);\n\t\t\tpaths.push(resourceStat.isDirectory() ? resourcePath : dirname(resourcePath));\n\t\t} catch {\n\t\t\tpaths.push(resourcePath);\n\t\t}\n\t}\n\treturn paths;\n}\n\nasync function findAvailablePort(): Promise<number> {\n\treturn new Promise<number>((resolvePromise, reject) => {\n\t\tconst probe = createNetServer();\n\t\tprobe.once(\"error\", reject);\n\t\tprobe.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = probe.address();\n\t\t\tif (address === null || typeof address === \"string\") {\n\t\t\t\tprobe.close();\n\t\t\t\treject(new Error(\"Could not allocate a plugin dev server port\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tprobe.close((error) => {\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolvePromise(address.port);\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction resolveServerOrigin(server: ViteDevServer): string {\n\tconst localUrl = server.resolvedUrls?.local[0];\n\tif (!localUrl) throw new Error(\"Vite dev server did not expose a local URL\");\n\treturn localUrl.endsWith(\"/\") ? localUrl.slice(0, -1) : localUrl;\n}\n\nfunction resolveViteConfigFile(rootDir: string): string | undefined {\n\tfor (const fileName of [\"vite.config.ts\", \"vite.config.mts\", \"vite.config.js\", \"vite.config.mjs\"]) {\n\t\tconst configPath = resolve(rootDir, fileName);\n\t\tif (existsSync(configPath)) return configPath;\n\t}\n\treturn undefined;\n}\n\nfunction assertDevPluginsConfigured(server: ViteDevServer): void {\n\tif (!server.config.plugins.some((plugin) => plugin.name === \"vetta-plugin-dev-runtime\")) {\n\t\tthrow new Error(\"Vite config must include vettaPluginFederation() to enable the plugin development runtime\");\n\t}\n}\n\nasync function assertDevEntryAvailable(entryUrl: string): Promise<void> {\n\tconst response = await fetch(entryUrl);\n\tif (!response.ok) {\n\t\tthrow new Error(`Plugin dev entry is unavailable: ${entryUrl} returned HTTP ${response.status}`);\n\t}\n\tawait response.body?.cancel();\n}\n\nasync function assertDevModuleGraphAvailable(server: ViteDevServer, rootDir: string): Promise<void> {\n\tconst environment = server.environments.client;\n\tconst pendingUrls = [VETTA_PLUGIN_DEV_ENTRY_ID];\n\tconst transformedUrls = new Set<string>();\n\twhile (pendingUrls.length > 0) {\n\t\tconst moduleUrl = pendingUrls.pop();\n\t\tif (moduleUrl === undefined || transformedUrls.has(moduleUrl)) continue;\n\t\ttransformedUrls.add(moduleUrl);\n\t\tdebugDevServer(`transforming ${moduleUrl}`);\n\t\ttry {\n\t\t\tconst result = await environment.transformRequest(moduleUrl);\n\t\t\tif (result === null) throw new Error(\"Vite returned no transform result\");\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Plugin development module failed to transform (${moduleUrl}): ${message}`);\n\t\t}\n\t\tif (hasOpaqueResourceQuery(moduleUrl)) continue;\n\t\tconst module = await environment.moduleGraph.getModuleByUrl(moduleUrl);\n\t\tif (!module) throw new Error(`Plugin development module is missing from the Vite graph: ${moduleUrl}`);\n\t\t// A CSS transform already resolves its @imports and produces the browser\n\t\t// update module. Plugin processors such as Tailwind may attach scanned\n\t\t// source files to importedModules even though the browser never imports\n\t\t// them, so they must not become independent JavaScript probes.\n\t\tif (isCSSRequest(moduleUrl)) continue;\n\t\tfor (const importedModule of module.importedModules) {\n\t\t\tif (importedModule.file && isPluginProjectModule(importedModule.file, rootDir)) {\n\t\t\t\tpendingUrls.push(importedModule.url);\n\t\t\t}\n\t\t}\n\t}\n\tdebugDevServer(`transformed ${transformedUrls.size} plugin modules`);\n}\n\nexport async function startVettaPluginDevServer(\n\trootDir: string,\n\tonEvent: (event: VettaPluginDevEvent) => void,\n): Promise<VettaPluginDevServer> {\n\tprocess.env.VETTA_PLUGIN_DEV_SERVER = \"1\";\n\tsetVettaPluginDevEventListener(onEvent);\n\n\tlet manifest = await readManifest(rootDir);\n\tlet watchedResourceRoots = await collectWatchedResourceRoots(rootDir, manifest);\n\tconst port = await findAvailablePort();\n\tconst server = await createServer({\n\t\troot: rootDir,\n\t\tconfigFile: resolveViteConfigFile(rootDir),\n\t\tlogLevel: \"silent\",\n\t\tserver: {\n\t\t\thost: \"127.0.0.1\",\n\t\t\tport,\n\t\t\tstrictPort: true,\n\t\t\t// Module Federation derives dev share/import URLs from Vite's origin.\n\t\t\t// Pin it to the same loopback endpoint we advertise to the host instead\n\t\t\t// of letting Vite infer a hostname (which can become `localhost` or a\n\t\t\t// LAN address on Windows and make the browser fetch the wrong module).\n\t\t\torigin: `http://127.0.0.1:${port}`,\n\t\t\tcors: true,\n\t\t\thmr: { overlay: false },\n\t\t},\n\t});\n\tdebugDevServer(\"vite server created\");\n\tlet refreshTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst resourceWatcher = watch(watchedResourceRoots, { ignoreInitial: true });\n\tresourceWatcher.on(\"error\", (error) => {\n\t\temitVettaPluginDevEvent({\n\t\t\ttype: \"error\",\n\t\t\tpluginId: manifest.id,\n\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t});\n\t});\n\tresourceWatcher.on(\"all\", (_event, changedPath) => {\n\t\tconst absolutePath = resolve(changedPath);\n\t\tif (!watchedResourceRoots.some((watchedPath) => isInsidePath(absolutePath, watchedPath))) return;\n\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\trefreshTimer = setTimeout(() => {\n\t\t\tvoid (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tif (absolutePath === resolve(rootDir, \"plugin.json\")) {\n\t\t\t\t\t\tmanifest = await readManifest(rootDir);\n\t\t\t\t\t\tconst nextWatchedResourceRoots = await collectWatchedResourceRoots(rootDir, manifest);\n\t\t\t\t\t\tconst removedRoots = watchedResourceRoots.filter((path) => !nextWatchedResourceRoots.includes(path));\n\t\t\t\t\t\tif (removedRoots.length > 0) await resourceWatcher.unwatch(removedRoots);\n\t\t\t\t\t\tresourceWatcher.add(nextWatchedResourceRoots);\n\t\t\t\t\t\twatchedResourceRoots = nextWatchedResourceRoots;\n\t\t\t\t\t}\n\t\t\t\t\temitVettaPluginDevEvent({\n\t\t\t\t\t\ttype: \"update\",\n\t\t\t\t\t\tpluginId: manifest.id,\n\t\t\t\t\t\treason: \"resource\",\n\t\t\t\t\t\tpath: relative(rootDir, absolutePath).replaceAll(\"\\\\\", \"/\"),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\temitVettaPluginDevEvent({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tpluginId: manifest.id,\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})();\n\t\t}, 80);\n\t});\n\n\tlet origin: string;\n\tlet entryUrl: string;\n\ttry {\n\t\tassertDevPluginsConfigured(server);\n\t\tdebugDevServer(\"starting vite listener\");\n\t\tawait server.listen();\n\t\tdebugDevServer(\"vite listener ready\");\n\t\torigin = resolveServerOrigin(server);\n\t\tentryUrl = `${origin}/mf-manifest.json`;\n\t\tdebugDevServer(`probing ${entryUrl}`);\n\t\tawait assertDevEntryAvailable(entryUrl);\n\t\tdebugDevServer(\"probing plugin module graph\");\n\t\tawait assertDevModuleGraphAvailable(server, rootDir);\n\t\tdebugDevServer(\"plugin entry ready\");\n\t} catch (error) {\n\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\tsetVettaPluginDevEventListener(undefined);\n\t\tawait Promise.all([resourceWatcher.close(), server.close()]);\n\t\tthrow error;\n\t}\n\tconst readyEvent: VettaPluginDevEvent = {\n\t\ttype: \"ready\",\n\t\tprotocolVersion: VETTA_PLUGIN_DEV_PROTOCOL_VERSION,\n\t\tpluginId: manifest.id,\n\t\tentryUrl,\n\t\torigin,\n\t};\n\tonEvent(readyEvent);\n\n\treturn {\n\t\tpluginId: manifest.id,\n\t\tentryUrl,\n\t\torigin,\n\t\tasync close() {\n\t\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\t\tsetVettaPluginDevEventListener(undefined);\n\t\t\tawait Promise.all([resourceWatcher.close(), server.close()]);\n\t\t},\n\t};\n}\n"]}
|
package/dist/dev-server.js
CHANGED
|
@@ -145,6 +145,11 @@ export async function startVettaPluginDevServer(rootDir, onEvent) {
|
|
|
145
145
|
host: "127.0.0.1",
|
|
146
146
|
port,
|
|
147
147
|
strictPort: true,
|
|
148
|
+
// Module Federation derives dev share/import URLs from Vite's origin.
|
|
149
|
+
// Pin it to the same loopback endpoint we advertise to the host instead
|
|
150
|
+
// of letting Vite infer a hostname (which can become `localhost` or a
|
|
151
|
+
// LAN address on Windows and make the browser fetch the wrong module).
|
|
152
|
+
origin: `http://127.0.0.1:${port}`,
|
|
148
153
|
cors: true,
|
|
149
154
|
hmr: { overlay: false },
|
|
150
155
|
},
|
package/dist/dev-server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { dirname, isAbsolute, relative, resolve } from \"node:path\";\nimport {\n\tlistPluginManifestResources,\n\tparsePluginManifest,\n\ttype PluginManifest,\n} from \"@vetta-org/plugin-sdk/manifest\";\nimport { watch } from \"chokidar\";\nimport { createServer, isCSSRequest, type ViteDevServer } from \"vite\";\nimport { VETTA_PLUGIN_DEV_ENTRY_ID } from \"./dev-vite-plugins.js\";\nimport {\n\temitVettaPluginDevEvent,\n\tsetVettaPluginDevEventListener,\n\ttype VettaPluginDevEvent,\n\tVETTA_PLUGIN_DEV_PROTOCOL_VERSION,\n} from \"./dev-events.js\";\nimport { hasOpaqueResourceQuery } from \"./request-query.js\";\n\nexport interface VettaPluginDevServer {\n\tpluginId: string;\n\tentryUrl: string;\n\torigin: string;\n\tclose(): Promise<void>;\n}\n\nfunction debugDevServer(message: string): void {\n\tif (process.env.VETTA_PLUGIN_DEV_DEBUG === \"1\") {\n\t\tprocess.stderr.write(`[vetta-plugin dev] ${message}\\n`);\n\t}\n}\n\nasync function readManifest(rootDir: string): Promise<PluginManifest> {\n\tconst manifestPath = resolve(rootDir, \"plugin.json\");\n\tconst raw: unknown = JSON.parse(await readFile(manifestPath, \"utf8\"));\n\treturn parsePluginManifest(raw);\n}\n\nfunction isInsidePath(candidate: string, root: string): boolean {\n\tconst pathFromRoot = relative(root, candidate);\n\treturn pathFromRoot === \"\" || (!pathFromRoot.startsWith(\"..\") && !isAbsolute(pathFromRoot));\n}\n\nfunction isPluginProjectModule(candidate: string, rootDir: string): boolean {\n\tif (!isInsidePath(candidate, rootDir)) return false;\n\tconst pathFromRoot = relative(rootDir, candidate);\n\treturn pathFromRoot.split(/[\\\\/]/u, 1)[0] !== \"node_modules\";\n}\n\nasync function collectWatchedResourceRoots(rootDir: string, manifest: PluginManifest): Promise<string[]> {\n\tconst resources = listPluginManifestResources(manifest).filter(\n\t\t(resource) => resource.field !== \"entry\" && resource.field !== \"styles\",\n\t);\n\tconst paths = [resolve(rootDir, \"plugin.json\"), resolve(rootDir, \"locales\")];\n\tfor (const resource of resources) {\n\t\tconst resourcePath = resolve(rootDir, resource.path);\n\t\tif (resource.kind === \"file\") {\n\t\t\tpaths.push(resourcePath);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst resourceStat = await stat(resourcePath);\n\t\t\tpaths.push(resourceStat.isDirectory() ? resourcePath : dirname(resourcePath));\n\t\t} catch {\n\t\t\tpaths.push(resourcePath);\n\t\t}\n\t}\n\treturn paths;\n}\n\nasync function findAvailablePort(): Promise<number> {\n\treturn new Promise<number>((resolvePromise, reject) => {\n\t\tconst probe = createNetServer();\n\t\tprobe.once(\"error\", reject);\n\t\tprobe.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = probe.address();\n\t\t\tif (address === null || typeof address === \"string\") {\n\t\t\t\tprobe.close();\n\t\t\t\treject(new Error(\"Could not allocate a plugin dev server port\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tprobe.close((error) => {\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolvePromise(address.port);\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction resolveServerOrigin(server: ViteDevServer): string {\n\tconst localUrl = server.resolvedUrls?.local[0];\n\tif (!localUrl) throw new Error(\"Vite dev server did not expose a local URL\");\n\treturn localUrl.endsWith(\"/\") ? localUrl.slice(0, -1) : localUrl;\n}\n\nfunction resolveViteConfigFile(rootDir: string): string | undefined {\n\tfor (const fileName of [\"vite.config.ts\", \"vite.config.mts\", \"vite.config.js\", \"vite.config.mjs\"]) {\n\t\tconst configPath = resolve(rootDir, fileName);\n\t\tif (existsSync(configPath)) return configPath;\n\t}\n\treturn undefined;\n}\n\nfunction assertDevPluginsConfigured(server: ViteDevServer): void {\n\tif (!server.config.plugins.some((plugin) => plugin.name === \"vetta-plugin-dev-runtime\")) {\n\t\tthrow new Error(\"Vite config must include vettaPluginFederation() to enable the plugin development runtime\");\n\t}\n}\n\nasync function assertDevEntryAvailable(entryUrl: string): Promise<void> {\n\tconst response = await fetch(entryUrl);\n\tif (!response.ok) {\n\t\tthrow new Error(`Plugin dev entry is unavailable: ${entryUrl} returned HTTP ${response.status}`);\n\t}\n\tawait response.body?.cancel();\n}\n\nasync function assertDevModuleGraphAvailable(server: ViteDevServer, rootDir: string): Promise<void> {\n\tconst environment = server.environments.client;\n\tconst pendingUrls = [VETTA_PLUGIN_DEV_ENTRY_ID];\n\tconst transformedUrls = new Set<string>();\n\twhile (pendingUrls.length > 0) {\n\t\tconst moduleUrl = pendingUrls.pop();\n\t\tif (moduleUrl === undefined || transformedUrls.has(moduleUrl)) continue;\n\t\ttransformedUrls.add(moduleUrl);\n\t\tdebugDevServer(`transforming ${moduleUrl}`);\n\t\ttry {\n\t\t\tconst result = await environment.transformRequest(moduleUrl);\n\t\t\tif (result === null) throw new Error(\"Vite returned no transform result\");\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Plugin development module failed to transform (${moduleUrl}): ${message}`);\n\t\t}\n\t\tif (hasOpaqueResourceQuery(moduleUrl)) continue;\n\t\tconst module = await environment.moduleGraph.getModuleByUrl(moduleUrl);\n\t\tif (!module) throw new Error(`Plugin development module is missing from the Vite graph: ${moduleUrl}`);\n\t\t// A CSS transform already resolves its @imports and produces the browser\n\t\t// update module. Plugin processors such as Tailwind may attach scanned\n\t\t// source files to importedModules even though the browser never imports\n\t\t// them, so they must not become independent JavaScript probes.\n\t\tif (isCSSRequest(moduleUrl)) continue;\n\t\tfor (const importedModule of module.importedModules) {\n\t\t\tif (importedModule.file && isPluginProjectModule(importedModule.file, rootDir)) {\n\t\t\t\tpendingUrls.push(importedModule.url);\n\t\t\t}\n\t\t}\n\t}\n\tdebugDevServer(`transformed ${transformedUrls.size} plugin modules`);\n}\n\nexport async function startVettaPluginDevServer(\n\trootDir: string,\n\tonEvent: (event: VettaPluginDevEvent) => void,\n): Promise<VettaPluginDevServer> {\n\tprocess.env.VETTA_PLUGIN_DEV_SERVER = \"1\";\n\tsetVettaPluginDevEventListener(onEvent);\n\n\tlet manifest = await readManifest(rootDir);\n\tlet watchedResourceRoots = await collectWatchedResourceRoots(rootDir, manifest);\n\tconst port = await findAvailablePort();\n\tconst server = await createServer({\n\t\troot: rootDir,\n\t\tconfigFile: resolveViteConfigFile(rootDir),\n\t\tlogLevel: \"silent\",\n\t\tserver: {\n\t\t\thost: \"127.0.0.1\",\n\t\t\tport,\n\t\t\tstrictPort: true,\n\t\t\tcors: true,\n\t\t\thmr: { overlay: false },\n\t\t},\n\t});\n\tdebugDevServer(\"vite server created\");\n\tlet refreshTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst resourceWatcher = watch(watchedResourceRoots, { ignoreInitial: true });\n\tresourceWatcher.on(\"error\", (error) => {\n\t\temitVettaPluginDevEvent({\n\t\t\ttype: \"error\",\n\t\t\tpluginId: manifest.id,\n\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t});\n\t});\n\tresourceWatcher.on(\"all\", (_event, changedPath) => {\n\t\tconst absolutePath = resolve(changedPath);\n\t\tif (!watchedResourceRoots.some((watchedPath) => isInsidePath(absolutePath, watchedPath))) return;\n\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\trefreshTimer = setTimeout(() => {\n\t\t\tvoid (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tif (absolutePath === resolve(rootDir, \"plugin.json\")) {\n\t\t\t\t\t\tmanifest = await readManifest(rootDir);\n\t\t\t\t\t\tconst nextWatchedResourceRoots = await collectWatchedResourceRoots(rootDir, manifest);\n\t\t\t\t\t\tconst removedRoots = watchedResourceRoots.filter((path) => !nextWatchedResourceRoots.includes(path));\n\t\t\t\t\t\tif (removedRoots.length > 0) await resourceWatcher.unwatch(removedRoots);\n\t\t\t\t\t\tresourceWatcher.add(nextWatchedResourceRoots);\n\t\t\t\t\t\twatchedResourceRoots = nextWatchedResourceRoots;\n\t\t\t\t\t}\n\t\t\t\t\temitVettaPluginDevEvent({\n\t\t\t\t\t\ttype: \"update\",\n\t\t\t\t\t\tpluginId: manifest.id,\n\t\t\t\t\t\treason: \"resource\",\n\t\t\t\t\t\tpath: relative(rootDir, absolutePath).replaceAll(\"\\\\\", \"/\"),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\temitVettaPluginDevEvent({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tpluginId: manifest.id,\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})();\n\t\t}, 80);\n\t});\n\n\tlet origin: string;\n\tlet entryUrl: string;\n\ttry {\n\t\tassertDevPluginsConfigured(server);\n\t\tdebugDevServer(\"starting vite listener\");\n\t\tawait server.listen();\n\t\tdebugDevServer(\"vite listener ready\");\n\t\torigin = resolveServerOrigin(server);\n\t\tentryUrl = `${origin}/mf-manifest.json`;\n\t\tdebugDevServer(`probing ${entryUrl}`);\n\t\tawait assertDevEntryAvailable(entryUrl);\n\t\tdebugDevServer(\"probing plugin module graph\");\n\t\tawait assertDevModuleGraphAvailable(server, rootDir);\n\t\tdebugDevServer(\"plugin entry ready\");\n\t} catch (error) {\n\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\tsetVettaPluginDevEventListener(undefined);\n\t\tawait Promise.all([resourceWatcher.close(), server.close()]);\n\t\tthrow error;\n\t}\n\tconst readyEvent: VettaPluginDevEvent = {\n\t\ttype: \"ready\",\n\t\tprotocolVersion: VETTA_PLUGIN_DEV_PROTOCOL_VERSION,\n\t\tpluginId: manifest.id,\n\t\tentryUrl,\n\t\torigin,\n\t};\n\tonEvent(readyEvent);\n\n\treturn {\n\t\tpluginId: manifest.id,\n\t\tentryUrl,\n\t\torigin,\n\t\tasync close() {\n\t\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\t\tsetVettaPluginDevEventListener(undefined);\n\t\t\tawait Promise.all([resourceWatcher.close(), server.close()]);\n\t\t},\n\t};\n}\n"]}
|
|
1
|
+
{"version":3,"file":"dev-server.js","sourceRoot":"","sources":["../src/dev-server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,IAAI,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACnE,OAAO,EACN,2BAA2B,EAC3B,mBAAmB,GAEnB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,YAAY,EAAE,YAAY,EAAsB,MAAM,MAAM,CAAC;AACtE,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EACN,uBAAuB,EACvB,8BAA8B,EAE9B,iCAAiC,GACjC,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAS5D,SAAS,cAAc,CAAC,OAAe,EAAQ;IAC9C,IAAI,OAAO,CAAC,GAAG,CAAC,sBAAsB,KAAK,GAAG,EAAE,CAAC;QAChD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;IACzD,CAAC;AAAA,CACD;AAED,KAAK,UAAU,YAAY,CAAC,OAAe,EAA2B;IACrE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;IACrD,MAAM,GAAG,GAAY,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IACtE,OAAO,mBAAmB,CAAC,GAAG,CAAC,CAAC;AAAA,CAChC;AAED,SAAS,YAAY,CAAC,SAAiB,EAAE,IAAY,EAAW;IAC/D,MAAM,YAAY,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IAC/C,OAAO,YAAY,KAAK,EAAE,IAAI,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC;AAAA,CAC5F;AAED,SAAS,qBAAqB,CAAC,SAAiB,EAAE,OAAe,EAAW;IAC3E,IAAI,CAAC,YAAY,CAAC,SAAS,EAAE,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IACpD,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAClD,OAAO,YAAY,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,cAAc,CAAC;AAAA,CAC7D;AAED,KAAK,UAAU,2BAA2B,CAAC,OAAe,EAAE,QAAwB,EAAqB;IACxG,MAAM,SAAS,GAAG,2BAA2B,CAAC,QAAQ,CAAC,CAAC,MAAM,CAC7D,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,KAAK,OAAO,IAAI,QAAQ,CAAC,KAAK,KAAK,QAAQ,CACvE,CAAC;IACF,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;IAC7E,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QAClC,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACrD,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YAC9B,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YACzB,SAAS;QACV,CAAC;QACD,IAAI,CAAC;YACJ,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,CAAC;YAC9C,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACR,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC1B,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AAAA,CACb;AAED,KAAK,UAAU,iBAAiB,GAAoB;IACnD,OAAO,IAAI,OAAO,CAAS,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,eAAe,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,CAAC;YAClC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,EAAE,CAAC;YAChC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACrD,KAAK,CAAC,KAAK,EAAE,CAAC;gBACd,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC,CAAC;gBACjE,OAAO;YACR,CAAC;YACD,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBACtB,IAAI,KAAK;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;;oBACpB,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;YAAA,CAClC,CAAC,CAAC;QAAA,CACH,CAAC,CAAC;IAAA,CACH,CAAC,CAAC;AAAA,CACH;AAED,SAAS,mBAAmB,CAAC,MAAqB,EAAU;IAC3D,MAAM,QAAQ,GAAG,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/C,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;IAC7E,OAAO,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAAA,CACjE;AAED,SAAS,qBAAqB,CAAC,OAAe,EAAsB;IACnE,KAAK,MAAM,QAAQ,IAAI,CAAC,gBAAgB,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,iBAAiB,CAAC,EAAE,CAAC;QACnG,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC9C,IAAI,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;IAC/C,CAAC;IACD,OAAO,SAAS,CAAC;AAAA,CACjB;AAED,SAAS,0BAA0B,CAAC,MAAqB,EAAQ;IAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,0BAA0B,CAAC,EAAE,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;IAC9G,CAAC;AAAA,CACD;AAED,KAAK,UAAU,uBAAuB,CAAC,QAAgB,EAAiB;IACvE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,CAAC,CAAC;IACvC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,oCAAoC,QAAQ,kBAAkB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;IACD,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;AAAA,CAC9B;AAED,KAAK,UAAU,6BAA6B,CAAC,MAAqB,EAAE,OAAe,EAAiB;IACnG,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC;IAC/C,MAAM,WAAW,GAAG,CAAC,yBAAyB,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,IAAI,GAAG,EAAU,CAAC;IAC1C,OAAO,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;QACpC,IAAI,SAAS,KAAK,SAAS,IAAI,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC;YAAE,SAAS;QACxE,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAC/B,cAAc,CAAC,gBAAgB,SAAS,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC;YACJ,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,MAAM,KAAK,IAAI;gBAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;QAC3E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,kDAAkD,SAAS,MAAM,OAAO,EAAE,CAAC,CAAC;QAC7F,CAAC;QACD,IAAI,sBAAsB,CAAC,SAAS,CAAC;YAAE,SAAS;QAChD,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC;QACvE,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,6DAA6D,SAAS,EAAE,CAAC,CAAC;QACvG,yEAAyE;QACzE,uEAAuE;QACvE,wEAAwE;QACxE,+DAA+D;QAC/D,IAAI,YAAY,CAAC,SAAS,CAAC;YAAE,SAAS;QACtC,KAAK,MAAM,cAAc,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;YACrD,IAAI,cAAc,CAAC,IAAI,IAAI,qBAAqB,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,CAAC,EAAE,CAAC;gBAChF,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;YACtC,CAAC;QACF,CAAC;IACF,CAAC;IACD,cAAc,CAAC,eAAe,eAAe,CAAC,IAAI,iBAAiB,CAAC,CAAC;AAAA,CACrE;AAED,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAC9C,OAAe,EACf,OAA6C,EACb;IAChC,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,GAAG,CAAC;IAC1C,8BAA8B,CAAC,OAAO,CAAC,CAAC;IAExC,IAAI,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;IAC3C,IAAI,oBAAoB,GAAG,MAAM,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IAChF,MAAM,IAAI,GAAG,MAAM,iBAAiB,EAAE,CAAC;IACvC,MAAM,MAAM,GAAG,MAAM,YAAY,CAAC;QACjC,IAAI,EAAE,OAAO;QACb,UAAU,EAAE,qBAAqB,CAAC,OAAO,CAAC;QAC1C,QAAQ,EAAE,QAAQ;QAClB,MAAM,EAAE;YACP,IAAI,EAAE,WAAW;YACjB,IAAI;YACJ,UAAU,EAAE,IAAI;YAChB,sEAAsE;YACtE,wEAAwE;YACxE,sEAAsE;YACtE,uEAAuE;YACvE,MAAM,EAAE,oBAAoB,IAAI,EAAE;YAClC,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,EAAE,OAAO,EAAE,KAAK,EAAE;SACvB;KACD,CAAC,CAAC;IACH,cAAc,CAAC,qBAAqB,CAAC,CAAC;IACtC,IAAI,YAAuD,CAAC;IAC5D,MAAM,eAAe,GAAG,KAAK,CAAC,oBAAoB,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7E,eAAe,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC;QACtC,uBAAuB,CAAC;YACvB,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,QAAQ,CAAC,EAAE;YACrB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAC/D,CAAC,CAAC;IAAA,CACH,CAAC,CAAC;IACH,eAAe,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,CAAC;QAClD,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;QAC1C,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YAAE,OAAO;QACjG,IAAI,YAAY;YAAE,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,YAAY,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC;YAC/B,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;gBACjB,IAAI,CAAC;oBACJ,IAAI,YAAY,KAAK,OAAO,CAAC,OAAO,EAAE,aAAa,CAAC,EAAE,CAAC;wBACtD,QAAQ,GAAG,MAAM,YAAY,CAAC,OAAO,CAAC,CAAC;wBACvC,MAAM,wBAAwB,GAAG,MAAM,2BAA2B,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;wBACtF,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,wBAAwB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;wBACrG,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC;4BAAE,MAAM,eAAe,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;wBACzE,eAAe,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;wBAC9C,oBAAoB,GAAG,wBAAwB,CAAC;oBACjD,CAAC;oBACD,uBAAuB,CAAC;wBACvB,IAAI,EAAE,QAAQ;wBACd,QAAQ,EAAE,QAAQ,CAAC,EAAE;wBACrB,MAAM,EAAE,UAAU;wBAClB,IAAI,EAAE,QAAQ,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,CAAC;qBAC3D,CAAC,CAAC;gBACJ,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,uBAAuB,CAAC;wBACvB,IAAI,EAAE,OAAO;wBACb,QAAQ,EAAE,QAAQ,CAAC,EAAE;wBACrB,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;qBAC/D,CAAC,CAAC;gBACJ,CAAC;YAAA,CACD,CAAC,EAAE,CAAC;QAAA,CACL,EAAE,EAAE,CAAC,CAAC;IAAA,CACP,CAAC,CAAC;IAEH,IAAI,MAAc,CAAC;IACnB,IAAI,QAAgB,CAAC;IACrB,IAAI,CAAC;QACJ,0BAA0B,CAAC,MAAM,CAAC,CAAC;QACnC,cAAc,CAAC,wBAAwB,CAAC,CAAC;QACzC,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;QACtB,cAAc,CAAC,qBAAqB,CAAC,CAAC;QACtC,MAAM,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QACrC,QAAQ,GAAG,GAAG,MAAM,mBAAmB,CAAC;QACxC,cAAc,CAAC,WAAW,QAAQ,EAAE,CAAC,CAAC;QACtC,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;QACxC,cAAc,CAAC,6BAA6B,CAAC,CAAC;QAC9C,MAAM,6BAA6B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrD,cAAc,CAAC,oBAAoB,CAAC,CAAC;IACtC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,IAAI,YAAY;YAAE,YAAY,CAAC,YAAY,CAAC,CAAC;QAC7C,8BAA8B,CAAC,SAAS,CAAC,CAAC;QAC1C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAC7D,MAAM,KAAK,CAAC;IACb,CAAC;IACD,MAAM,UAAU,GAAwB;QACvC,IAAI,EAAE,OAAO;QACb,eAAe,EAAE,iCAAiC;QAClD,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,QAAQ;QACR,MAAM;KACN,CAAC;IACF,OAAO,CAAC,UAAU,CAAC,CAAC;IAEpB,OAAO;QACN,QAAQ,EAAE,QAAQ,CAAC,EAAE;QACrB,QAAQ;QACR,MAAM;QACN,KAAK,CAAC,KAAK,GAAG;YACb,IAAI,YAAY;gBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;YAC7C,8BAA8B,CAAC,SAAS,CAAC,CAAC;YAC1C,MAAM,OAAO,CAAC,GAAG,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QAAA,CAC7D;KACD,CAAC;AAAA,CACF","sourcesContent":["import { existsSync } from \"node:fs\";\nimport { readFile, stat } from \"node:fs/promises\";\nimport { createServer as createNetServer } from \"node:net\";\nimport { dirname, isAbsolute, relative, resolve } from \"node:path\";\nimport {\n\tlistPluginManifestResources,\n\tparsePluginManifest,\n\ttype PluginManifest,\n} from \"@vetta-org/plugin-sdk/manifest\";\nimport { watch } from \"chokidar\";\nimport { createServer, isCSSRequest, type ViteDevServer } from \"vite\";\nimport { VETTA_PLUGIN_DEV_ENTRY_ID } from \"./dev-vite-plugins.js\";\nimport {\n\temitVettaPluginDevEvent,\n\tsetVettaPluginDevEventListener,\n\ttype VettaPluginDevEvent,\n\tVETTA_PLUGIN_DEV_PROTOCOL_VERSION,\n} from \"./dev-events.js\";\nimport { hasOpaqueResourceQuery } from \"./request-query.js\";\n\nexport interface VettaPluginDevServer {\n\tpluginId: string;\n\tentryUrl: string;\n\torigin: string;\n\tclose(): Promise<void>;\n}\n\nfunction debugDevServer(message: string): void {\n\tif (process.env.VETTA_PLUGIN_DEV_DEBUG === \"1\") {\n\t\tprocess.stderr.write(`[vetta-plugin dev] ${message}\\n`);\n\t}\n}\n\nasync function readManifest(rootDir: string): Promise<PluginManifest> {\n\tconst manifestPath = resolve(rootDir, \"plugin.json\");\n\tconst raw: unknown = JSON.parse(await readFile(manifestPath, \"utf8\"));\n\treturn parsePluginManifest(raw);\n}\n\nfunction isInsidePath(candidate: string, root: string): boolean {\n\tconst pathFromRoot = relative(root, candidate);\n\treturn pathFromRoot === \"\" || (!pathFromRoot.startsWith(\"..\") && !isAbsolute(pathFromRoot));\n}\n\nfunction isPluginProjectModule(candidate: string, rootDir: string): boolean {\n\tif (!isInsidePath(candidate, rootDir)) return false;\n\tconst pathFromRoot = relative(rootDir, candidate);\n\treturn pathFromRoot.split(/[\\\\/]/u, 1)[0] !== \"node_modules\";\n}\n\nasync function collectWatchedResourceRoots(rootDir: string, manifest: PluginManifest): Promise<string[]> {\n\tconst resources = listPluginManifestResources(manifest).filter(\n\t\t(resource) => resource.field !== \"entry\" && resource.field !== \"styles\",\n\t);\n\tconst paths = [resolve(rootDir, \"plugin.json\"), resolve(rootDir, \"locales\")];\n\tfor (const resource of resources) {\n\t\tconst resourcePath = resolve(rootDir, resource.path);\n\t\tif (resource.kind === \"file\") {\n\t\t\tpaths.push(resourcePath);\n\t\t\tcontinue;\n\t\t}\n\t\ttry {\n\t\t\tconst resourceStat = await stat(resourcePath);\n\t\t\tpaths.push(resourceStat.isDirectory() ? resourcePath : dirname(resourcePath));\n\t\t} catch {\n\t\t\tpaths.push(resourcePath);\n\t\t}\n\t}\n\treturn paths;\n}\n\nasync function findAvailablePort(): Promise<number> {\n\treturn new Promise<number>((resolvePromise, reject) => {\n\t\tconst probe = createNetServer();\n\t\tprobe.once(\"error\", reject);\n\t\tprobe.listen(0, \"127.0.0.1\", () => {\n\t\t\tconst address = probe.address();\n\t\t\tif (address === null || typeof address === \"string\") {\n\t\t\t\tprobe.close();\n\t\t\t\treject(new Error(\"Could not allocate a plugin dev server port\"));\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tprobe.close((error) => {\n\t\t\t\tif (error) reject(error);\n\t\t\t\telse resolvePromise(address.port);\n\t\t\t});\n\t\t});\n\t});\n}\n\nfunction resolveServerOrigin(server: ViteDevServer): string {\n\tconst localUrl = server.resolvedUrls?.local[0];\n\tif (!localUrl) throw new Error(\"Vite dev server did not expose a local URL\");\n\treturn localUrl.endsWith(\"/\") ? localUrl.slice(0, -1) : localUrl;\n}\n\nfunction resolveViteConfigFile(rootDir: string): string | undefined {\n\tfor (const fileName of [\"vite.config.ts\", \"vite.config.mts\", \"vite.config.js\", \"vite.config.mjs\"]) {\n\t\tconst configPath = resolve(rootDir, fileName);\n\t\tif (existsSync(configPath)) return configPath;\n\t}\n\treturn undefined;\n}\n\nfunction assertDevPluginsConfigured(server: ViteDevServer): void {\n\tif (!server.config.plugins.some((plugin) => plugin.name === \"vetta-plugin-dev-runtime\")) {\n\t\tthrow new Error(\"Vite config must include vettaPluginFederation() to enable the plugin development runtime\");\n\t}\n}\n\nasync function assertDevEntryAvailable(entryUrl: string): Promise<void> {\n\tconst response = await fetch(entryUrl);\n\tif (!response.ok) {\n\t\tthrow new Error(`Plugin dev entry is unavailable: ${entryUrl} returned HTTP ${response.status}`);\n\t}\n\tawait response.body?.cancel();\n}\n\nasync function assertDevModuleGraphAvailable(server: ViteDevServer, rootDir: string): Promise<void> {\n\tconst environment = server.environments.client;\n\tconst pendingUrls = [VETTA_PLUGIN_DEV_ENTRY_ID];\n\tconst transformedUrls = new Set<string>();\n\twhile (pendingUrls.length > 0) {\n\t\tconst moduleUrl = pendingUrls.pop();\n\t\tif (moduleUrl === undefined || transformedUrls.has(moduleUrl)) continue;\n\t\ttransformedUrls.add(moduleUrl);\n\t\tdebugDevServer(`transforming ${moduleUrl}`);\n\t\ttry {\n\t\t\tconst result = await environment.transformRequest(moduleUrl);\n\t\t\tif (result === null) throw new Error(\"Vite returned no transform result\");\n\t\t} catch (error) {\n\t\t\tconst message = error instanceof Error ? error.message : String(error);\n\t\t\tthrow new Error(`Plugin development module failed to transform (${moduleUrl}): ${message}`);\n\t\t}\n\t\tif (hasOpaqueResourceQuery(moduleUrl)) continue;\n\t\tconst module = await environment.moduleGraph.getModuleByUrl(moduleUrl);\n\t\tif (!module) throw new Error(`Plugin development module is missing from the Vite graph: ${moduleUrl}`);\n\t\t// A CSS transform already resolves its @imports and produces the browser\n\t\t// update module. Plugin processors such as Tailwind may attach scanned\n\t\t// source files to importedModules even though the browser never imports\n\t\t// them, so they must not become independent JavaScript probes.\n\t\tif (isCSSRequest(moduleUrl)) continue;\n\t\tfor (const importedModule of module.importedModules) {\n\t\t\tif (importedModule.file && isPluginProjectModule(importedModule.file, rootDir)) {\n\t\t\t\tpendingUrls.push(importedModule.url);\n\t\t\t}\n\t\t}\n\t}\n\tdebugDevServer(`transformed ${transformedUrls.size} plugin modules`);\n}\n\nexport async function startVettaPluginDevServer(\n\trootDir: string,\n\tonEvent: (event: VettaPluginDevEvent) => void,\n): Promise<VettaPluginDevServer> {\n\tprocess.env.VETTA_PLUGIN_DEV_SERVER = \"1\";\n\tsetVettaPluginDevEventListener(onEvent);\n\n\tlet manifest = await readManifest(rootDir);\n\tlet watchedResourceRoots = await collectWatchedResourceRoots(rootDir, manifest);\n\tconst port = await findAvailablePort();\n\tconst server = await createServer({\n\t\troot: rootDir,\n\t\tconfigFile: resolveViteConfigFile(rootDir),\n\t\tlogLevel: \"silent\",\n\t\tserver: {\n\t\t\thost: \"127.0.0.1\",\n\t\t\tport,\n\t\t\tstrictPort: true,\n\t\t\t// Module Federation derives dev share/import URLs from Vite's origin.\n\t\t\t// Pin it to the same loopback endpoint we advertise to the host instead\n\t\t\t// of letting Vite infer a hostname (which can become `localhost` or a\n\t\t\t// LAN address on Windows and make the browser fetch the wrong module).\n\t\t\torigin: `http://127.0.0.1:${port}`,\n\t\t\tcors: true,\n\t\t\thmr: { overlay: false },\n\t\t},\n\t});\n\tdebugDevServer(\"vite server created\");\n\tlet refreshTimer: ReturnType<typeof setTimeout> | undefined;\n\tconst resourceWatcher = watch(watchedResourceRoots, { ignoreInitial: true });\n\tresourceWatcher.on(\"error\", (error) => {\n\t\temitVettaPluginDevEvent({\n\t\t\ttype: \"error\",\n\t\t\tpluginId: manifest.id,\n\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t});\n\t});\n\tresourceWatcher.on(\"all\", (_event, changedPath) => {\n\t\tconst absolutePath = resolve(changedPath);\n\t\tif (!watchedResourceRoots.some((watchedPath) => isInsidePath(absolutePath, watchedPath))) return;\n\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\trefreshTimer = setTimeout(() => {\n\t\t\tvoid (async () => {\n\t\t\t\ttry {\n\t\t\t\t\tif (absolutePath === resolve(rootDir, \"plugin.json\")) {\n\t\t\t\t\t\tmanifest = await readManifest(rootDir);\n\t\t\t\t\t\tconst nextWatchedResourceRoots = await collectWatchedResourceRoots(rootDir, manifest);\n\t\t\t\t\t\tconst removedRoots = watchedResourceRoots.filter((path) => !nextWatchedResourceRoots.includes(path));\n\t\t\t\t\t\tif (removedRoots.length > 0) await resourceWatcher.unwatch(removedRoots);\n\t\t\t\t\t\tresourceWatcher.add(nextWatchedResourceRoots);\n\t\t\t\t\t\twatchedResourceRoots = nextWatchedResourceRoots;\n\t\t\t\t\t}\n\t\t\t\t\temitVettaPluginDevEvent({\n\t\t\t\t\t\ttype: \"update\",\n\t\t\t\t\t\tpluginId: manifest.id,\n\t\t\t\t\t\treason: \"resource\",\n\t\t\t\t\t\tpath: relative(rootDir, absolutePath).replaceAll(\"\\\\\", \"/\"),\n\t\t\t\t\t});\n\t\t\t\t} catch (error) {\n\t\t\t\t\temitVettaPluginDevEvent({\n\t\t\t\t\t\ttype: \"error\",\n\t\t\t\t\t\tpluginId: manifest.id,\n\t\t\t\t\t\tmessage: error instanceof Error ? error.message : String(error),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t})();\n\t\t}, 80);\n\t});\n\n\tlet origin: string;\n\tlet entryUrl: string;\n\ttry {\n\t\tassertDevPluginsConfigured(server);\n\t\tdebugDevServer(\"starting vite listener\");\n\t\tawait server.listen();\n\t\tdebugDevServer(\"vite listener ready\");\n\t\torigin = resolveServerOrigin(server);\n\t\tentryUrl = `${origin}/mf-manifest.json`;\n\t\tdebugDevServer(`probing ${entryUrl}`);\n\t\tawait assertDevEntryAvailable(entryUrl);\n\t\tdebugDevServer(\"probing plugin module graph\");\n\t\tawait assertDevModuleGraphAvailable(server, rootDir);\n\t\tdebugDevServer(\"plugin entry ready\");\n\t} catch (error) {\n\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\tsetVettaPluginDevEventListener(undefined);\n\t\tawait Promise.all([resourceWatcher.close(), server.close()]);\n\t\tthrow error;\n\t}\n\tconst readyEvent: VettaPluginDevEvent = {\n\t\ttype: \"ready\",\n\t\tprotocolVersion: VETTA_PLUGIN_DEV_PROTOCOL_VERSION,\n\t\tpluginId: manifest.id,\n\t\tentryUrl,\n\t\torigin,\n\t};\n\tonEvent(readyEvent);\n\n\treturn {\n\t\tpluginId: manifest.id,\n\t\tentryUrl,\n\t\torigin,\n\t\tasync close() {\n\t\t\tif (refreshTimer) clearTimeout(refreshTimer);\n\t\t\tsetVettaPluginDevEventListener(undefined);\n\t\t\tawait Promise.all([resourceWatcher.close(), server.close()]);\n\t\t},\n\t};\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vetta-org/plugin-vite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"types": "./dist/index.d.ts",
|
|
@@ -34,7 +34,7 @@
|
|
|
34
34
|
"postcss-selector-parser": "^7.1.4"
|
|
35
35
|
},
|
|
36
36
|
"peerDependencies": {
|
|
37
|
-
"@vetta-org/plugin-sdk": ">=0.
|
|
37
|
+
"@vetta-org/plugin-sdk": ">=0.3.0 <0.4.0",
|
|
38
38
|
"vite": "^7.0.0"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|