test(client): mount TypeRT remote assembly in fixtures
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
// Shared scaffolding for the assembled-jsdom snapshots: the real built
|
// Shared scaffolding for the assembled-jsdom snapshots: the real built
|
||||||
// `packages/client/*/lib/client.js` artifacts booted through AppWebEntry's
|
// workspace `lib/client.js` artifacts booted through AppWebEntry's
|
||||||
// ModuleLoader path (loadBundle) against the keyless FixtureApiClient
|
// ModuleLoader path (loadBundle) against the keyless FixtureApiClient
|
||||||
// transport. Every file that mounts this graph needs the same boot entry list,
|
// transport. Every file that mounts this graph needs the same boot entry list,
|
||||||
// the same bundle map, the same jsdom globals, and the same mount call, and
|
// the same bundle map, the same jsdom globals, and the same mount call, and
|
||||||
@@ -14,18 +14,21 @@ import { afterEach, beforeEach, vi } from 'vitest'
|
|||||||
import type { WebBootEntry } from '@deepseek-ai/dsh-client-modules/client'
|
import type { WebBootEntry } from '@deepseek-ai/dsh-client-modules/client'
|
||||||
import { AppWebEntry } from '@deepseek-ai/dsh-client-web'
|
import { AppWebEntry } from '@deepseek-ai/dsh-client-web'
|
||||||
|
|
||||||
/** Boot entries for the minimal assembled graph, each carrying the workspace directory its bundle is read from. */
|
/** Boot entries for the minimal assembled graph, each carrying the workspace bundle it loads. */
|
||||||
const PLUGINS: readonly (WebBootEntry & { dir: string })[] = [
|
const PLUGINS: readonly (WebBootEntry & { bundlePath: string })[] = [
|
||||||
{ id: '@deepseek-ai/dsh-client-connection', dir: 'connection', url: '/plugins/connection.js', rev: 'fx', inject: [], immediately: true },
|
{ id: '@deepseek-ai/dsh-typert-registry', bundlePath: 'packages/typert/registry/lib/client.js', url: '/plugins/typert-registry.js', rev: 'fx', inject: [], immediately: true },
|
||||||
{ id: '@deepseek-ai/dsh-client-runtime', dir: 'runtime', url: '/plugins/runtime.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-connection'], immediately: true },
|
{ id: '@deepseek-ai/dsh-client-connection', bundlePath: 'packages/client/connection/lib/client.js', url: '/plugins/connection.js', rev: 'fx', inject: [], immediately: true },
|
||||||
{ id: '@deepseek-ai/dsh-client-ui-theme', dir: 'ui-theme', url: '/plugins/ui-theme.js', rev: 'fx', inject: [], immediately: true },
|
{ id: '@deepseek-ai/dsh-host-api-gateway', bundlePath: 'packages/host/api-gateway/lib/client.js', url: '/plugins/api-gateway.js', rev: 'fx', inject: ['@deepseek-ai/dsh-typert-registry', '@deepseek-ai/dsh-client-connection'], immediately: true },
|
||||||
{ id: '@deepseek-ai/dsh-client-locale', dir: 'locale', url: '/plugins/locale.js', rev: 'fx', inject: [], immediately: true },
|
{ id: '@deepseek-ai/dsh-client-remotes', bundlePath: 'packages/client/remotes/lib/client.js', url: '/plugins/client-remotes.js', rev: 'fx', inject: ['@deepseek-ai/dsh-host-api-gateway'], immediately: true },
|
||||||
{ id: '@deepseek-ai/dsh-client-ui-layout', dir: 'ui-layout', url: '/plugins/ui-layout.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-runtime'] },
|
{ id: '@deepseek-ai/dsh-client-runtime', bundlePath: 'packages/client/runtime/lib/client.js', url: '/plugins/runtime.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-connection', '@deepseek-ai/dsh-client-remotes', '@deepseek-ai/dsh-typert-registry'], immediately: true },
|
||||||
{ id: '@deepseek-ai/dsh-client-ui-sidebar', dir: 'ui-sidebar', url: '/plugins/ui-sidebar.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-layout'] },
|
{ id: '@deepseek-ai/dsh-client-ui-theme', bundlePath: 'packages/client/ui-theme/lib/client.js', url: '/plugins/ui-theme.js', rev: 'fx', inject: [], immediately: true },
|
||||||
{ id: '@deepseek-ai/dsh-client-ui-conversation', dir: 'ui-conversation', url: '/plugins/ui-conversation.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-layout'] },
|
{ id: '@deepseek-ai/dsh-client-locale', bundlePath: 'packages/client/locale/lib/client.js', url: '/plugins/locale.js', rev: 'fx', inject: [], immediately: true },
|
||||||
|
{ id: '@deepseek-ai/dsh-client-ui-layout', bundlePath: 'packages/client/ui-layout/lib/client.js', url: '/plugins/ui-layout.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-runtime'] },
|
||||||
|
{ id: '@deepseek-ai/dsh-client-ui-sidebar', bundlePath: 'packages/client/ui-sidebar/lib/client.js', url: '/plugins/ui-sidebar.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-layout'] },
|
||||||
|
{ id: '@deepseek-ai/dsh-client-ui-conversation', bundlePath: 'packages/client/ui-conversation/lib/client.js', url: '/plugins/ui-conversation.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-layout'] },
|
||||||
{
|
{
|
||||||
id: '@deepseek-ai/dsh-client-ui-workspace',
|
id: '@deepseek-ai/dsh-client-ui-workspace',
|
||||||
dir: 'ui-workspace',
|
bundlePath: 'packages/client/ui-workspace/lib/client.js',
|
||||||
url: '/plugins/ui-workspace.js',
|
url: '/plugins/ui-workspace.js',
|
||||||
rev: 'fx',
|
rev: 'fx',
|
||||||
inject: [
|
inject: [
|
||||||
@@ -34,12 +37,12 @@ const PLUGINS: readonly (WebBootEntry & { dir: string })[] = [
|
|||||||
'@deepseek-ai/dsh-client-ui-sidebar',
|
'@deepseek-ai/dsh-client-ui-sidebar',
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{ id: '@deepseek-ai/dsh-client-ui-trajectory', dir: 'ui-trajectory', url: '/plugins/ui-trajectory.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-conversation'] },
|
{ id: '@deepseek-ai/dsh-client-ui-trajectory', bundlePath: 'packages/client/ui-trajectory/lib/client.js', url: '/plugins/ui-trajectory.js', rev: 'fx', inject: ['@deepseek-ai/dsh-client-ui-conversation'] },
|
||||||
]
|
]
|
||||||
|
|
||||||
const bundles = new Map(PLUGINS.map(plugin => [
|
const bundles = new Map(PLUGINS.map(plugin => [
|
||||||
plugin.url,
|
plugin.url,
|
||||||
readFileSync(join(process.cwd(), 'packages/client', plugin.dir, 'lib/client.js'), 'utf8'),
|
readFileSync(join(process.cwd(), plugin.bundlePath), 'utf8'),
|
||||||
]))
|
]))
|
||||||
|
|
||||||
interface FixtureWindow extends Window {
|
interface FixtureWindow extends Window {
|
||||||
@@ -97,7 +100,7 @@ export function mountAssembledApp(): void {
|
|||||||
const root = document.createElement('div')
|
const root = document.createElement('div')
|
||||||
root.id = 'root'
|
root.id = 'root'
|
||||||
document.body.appendChild(root)
|
document.body.appendChild(root)
|
||||||
win.__DSH_BOOT__ = { rev: 'fx', entries: PLUGINS.map(({ dir: _dir, ...plugin }) => plugin) }
|
win.__DSH_BOOT__ = { rev: 'fx', entries: PLUGINS.map(({ bundlePath: _bundlePath, ...plugin }) => plugin) }
|
||||||
act(() => {
|
act(() => {
|
||||||
const entry = new AppWebEntry(root, {
|
const entry = new AppWebEntry(root, {
|
||||||
loadBundle: async (url) => {
|
loadBundle: async (url) => {
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
// @vitest-environment jsdom
|
// @vitest-environment jsdom
|
||||||
// Assembled search-card snapshot: boots the real built `packages/client/*/lib/
|
// Assembled search-card snapshot: boots the real built workspace client bundles
|
||||||
// client.js` bundles through AppWebEntry's ModuleLoader path against the keyless
|
// through AppWebEntry's ModuleLoader path against the keyless
|
||||||
// FixtureApiClient transport (no API key, no model round), opens the fixture
|
// FixtureApiClient transport (no API key, no model round), opens the fixture
|
||||||
// session, and pins the search card the `grep` turn (fixture turn 66) renders in
|
// session, and pins the search card the `grep` turn (fixture turn 66) renders in
|
||||||
// the assembled application. The built-boot smoke proves the graph boots but
|
// the assembled application. The built-boot smoke proves the graph boots but
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
import { Context } from 'cordis'
|
import { Context } from 'cordis'
|
||||||
import { describe, expect, it } from 'vitest'
|
import { describe, expect, it } from 'vitest'
|
||||||
import type { ConnectionHandle, ConnectionSinks } from '@deepseek-ai/dsh-client-connection/client'
|
import type { ConnectionHandle, ConnectionSinks } from '@deepseek-ai/dsh-client-connection/client'
|
||||||
|
import TypertRegistry from '@deepseek-ai/dsh-typert-registry'
|
||||||
import * as RuntimeClient from '../src/client/index.ts'
|
import * as RuntimeClient from '../src/client/index.ts'
|
||||||
import { FakeApiClient } from './fake-api.ts'
|
import { FakeApiClient } from './fake-api.ts'
|
||||||
|
|
||||||
@@ -16,6 +17,7 @@ interface Bench {
|
|||||||
|
|
||||||
async function mount(): Promise<Bench> {
|
async function mount(): Promise<Bench> {
|
||||||
const ctx = new Context()
|
const ctx = new Context()
|
||||||
|
await ctx.plugin(TypertRegistry)
|
||||||
const api = new FakeApiClient()
|
const api = new FakeApiClient()
|
||||||
const bench: Bench = { ctx, sinks: undefined }
|
const bench: Bench = { ctx, sinks: undefined }
|
||||||
const handle: ConnectionHandle = {
|
const handle: ConnectionHandle = {
|
||||||
@@ -30,6 +32,7 @@ async function mount(): Promise<Bench> {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
ctx.reflect.provide('connection', handle)
|
ctx.reflect.provide('connection', handle)
|
||||||
|
ctx.reflect.provide('api', {})
|
||||||
await ctx.plugin(RuntimeClient).await()
|
await ctx.plugin(RuntimeClient).await()
|
||||||
return bench
|
return bench
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user