diff --git a/src/client/chunk-loader.ts b/src/client/chunk-loader.ts index 0a9e87a..d89fdbf 100644 --- a/src/client/chunk-loader.ts +++ b/src/client/chunk-loader.ts @@ -23,8 +23,9 @@ * arbitrary file names, so the plugin's own host route serves the chunks), * 2. read the factory from the global registry, * 3. call it with a require that resolves the platform externals through - * `__DSH_MODULES__.import(spec)` — the seed-word branch, the one part of - * the module system that is stable across versions. + * the injected module system's `import(spec)` (the `ctx.modules` service) + * — the seed-word branch, the one part of the module system that is + * stable across versions. * * Caching contract (three layers, each with a failure path): * - In-memory: one in-flight promise per chunk, memoized until @@ -90,8 +91,7 @@ const CHUNK_REVALIDATE_TIMEOUT_MS = 5_000 * The client module system surface this loader needs to resolve externals. * DSH 0.1.0-rc.8 provides it as the `ctx.modules` service (no page global * anymore); the plugin injects it at activation via - * {@link setChunkModuleSystem}. The rc.7-era `window.__DSH_MODULES__` global - * remains as a fallback so older hosts and the test harness keep working. + * {@link setChunkModuleSystem}. */ export interface ChunkModuleSystem { import(specifier: string): Promise @@ -123,12 +123,11 @@ export function setChunkModuleSystem(system: ChunkModuleSystem | undefined): voi } /** Resolve the shell-installed module system (injected, then the plugin - * global shared with chunk-bundle copies, then the rc.7 page global). */ + * global shared with chunk-bundle copies). */ function moduleSystem(): ChunkModuleSystem | undefined { const g = globalThis as Record return injectedModuleSystem ?? g[MODULE_SYSTEM_GLOBAL] as ChunkModuleSystem | undefined - ?? (g as { __DSH_MODULES__?: ChunkModuleSystem }).__DSH_MODULES__ } /** The plugin-owned chunk factory registry the chunk scripts populate. */ diff --git a/src/client/index.tsx b/src/client/index.tsx index 3fdb559..aed2ee8 100644 --- a/src/client/index.tsx +++ b/src/client/index.tsx @@ -188,10 +188,9 @@ export function apply(ctx: Context): void { } } try { - // rc.8+ exposes the client module system as the `ctx.modules` service - // (no window.__DSH_MODULES__ page global anymore); the chunk loader needs - // it to resolve its externals, so inject it before anything can load a - // lazy chunk. The loader falls back to the rc.7 global when absent. + // rc.8+ exposes the client module system as the `ctx.modules` service; + // the chunk loader needs it to resolve its externals, so inject it + // before anything can load a lazy chunk. setChunkModuleSystem(ctx.modules) // Fresh chunk state for this activation: drop per-test fixtures and // revalidate loaded chunk scripts against the bundle route's ETags — diff --git a/tests/add-plugin-modal.spec.tsx b/tests/add-plugin-modal.spec.tsx index c787950..06bdefd 100644 --- a/tests/add-plugin-modal.spec.tsx +++ b/tests/add-plugin-modal.spec.tsx @@ -19,6 +19,7 @@ import { createRoot } from 'react-dom/client' import { act } from 'react-dom/test-utils' import * as primitives from '@deepseek-ai/dsh-client-ui-primitives' import { type PluginEntry } from '../src/client/plugins-shared.ts' +import { builtinTabPlugins } from '../src/client/plugins-tabs.ts' import { builtinViewerPlugins } from '../src/client/plugins-viewers.ts' import { AddPluginModal, PluginListBody } from '../src/client/add-plugin-modal.tsx' import { createBetterSidebarService } from '../src/client/service.ts' diff --git a/tests/chunk-loader.spec.ts b/tests/chunk-loader.spec.ts index b94327b..86eb83d 100644 --- a/tests/chunk-loader.spec.ts +++ b/tests/chunk-loader.spec.ts @@ -8,9 +8,10 @@ * - externals resolve through the module system's seed branch (the stable, * version-independent part), once per page, * - resetChunks drops the cache and the externals memo (HMR). - * The production path runs against a fake `window.__DSH_MODULES__` and a - * stub script loader that simulates the executed chunk script by assigning - * the plugin-owned global factory registry. + * The production path runs against a fake module system injected via + * {@link setChunkModuleSystem} (mirroring the client half's `ctx.modules` + * injection) and a stub script loader that simulates the executed chunk + * script by assigning the plugin-owned global factory registry. */ import { beforeEach, describe, expect, it, vi } from 'vitest' import './browser-globals.ts' @@ -33,14 +34,10 @@ function installModuleSystem(): FakeModuleSystem { const fake: FakeModuleSystem = { import: vi.fn(async (specifier: string) => ({ seed: specifier })), } - ;(globalThis as Record).__DSH_MODULES__ = fake + setChunkModuleSystem(fake) return fake } -function removeModuleSystem(): void { - delete (globalThis as Record).__DSH_MODULES__ -} - /** Simulate a chunk script executing: it assigns its factory to the registry. */ function simulateScript(name: string, factory: (require: (spec: string) => unknown) => ChunkExports): void { const g = globalThis as { __dshChunks__?: Record } @@ -49,7 +46,6 @@ function simulateScript(name: string, factory: (require: (spec: string) => unkno } beforeEach(() => { - removeModuleSystem() setChunkModuleSystem(undefined) delete (globalThis as Record).__dshChunks__ resetChunks() @@ -89,9 +85,6 @@ describe('test-registry path (vitest / jsdom-less environments)', () => { describe('production path (script injection + global registry + externals require)', () => { it('resolves externals through an injected ctx.modules system (rc.8 — no page global)', async () => { const modules = installModuleSystem() - // rc.8 drops window.__DSH_MODULES__; the client half injects ctx.modules. - removeModuleSystem() - setChunkModuleSystem(modules) const loaded: string[] = [] setChunkScriptLoaderForTests(async (src) => { loaded.push(src)