Skip to content

Commit 8908bca

Browse files
committed
refactor: separate clab-ui host contract from product runtimes
1 parent a11a6d7 commit 8908bca

37 files changed

+757
-964
lines changed

apps/standalone/src/clabUiHost.ts

Lines changed: 508 additions & 0 deletions
Large diffs are not rendered by default.

apps/standalone/src/main.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import "@webview/styles/global.css";
1212
import EditorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
1313
import JsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
1414

15-
import { createApiClabUiHost, setClabUiHost } from "@webview/host";
15+
import { setClabUiHost } from "@webview/host";
1616
import {
1717
setHostContext
1818
} from "@webview/services/topologyHostClient";
@@ -50,6 +50,7 @@ import { useEventStream } from "./hooks/useEventStream";
5050
import { LoginPage } from "./components/LoginPage";
5151
import { SettingsOverlay } from "./components/SettingsOverlay";
5252
import { getRuntimeContainersForLab, runtimeContainersEqual } from "./runtimeData";
53+
import { createApiClabUiHost } from "./clabUiHost";
5354

5455
// Monaco workers setup
5556
const monacoGlobal = self as typeof self & {

dev/main.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import "@webview/styles/global.css";
99
import EditorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker";
1010
import JsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker";
1111

12-
import { createApiClabUiHost, setClabUiHost } from "@webview/host";
12+
import { setClabUiHost } from "@webview/host";
1313
import { setHostContext } from "@webview/services/topologyHostClient";
1414
import { refreshTopologySnapshot } from "@webview/services/topologyHostCommands";
1515
import { useGraphStore, useTopoViewerStore } from "@webview/stores";
@@ -39,6 +39,7 @@ import type {
3939
} from "@srl-labs/clab-ui/explorer/snapshot";
4040
import { installInMemoryApi } from "./mock/inMemoryApi";
4141
import { loadDevSession, saveDevSession } from "./mock/devSession";
42+
import { createApiClabUiHost } from "../apps/standalone/src/clabUiHost";
4243

4344
const monacoGlobal = self as typeof self & {
4445
MonacoEnvironment?: {

dev/tsconfig.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
"include": [
99
"./**/*.ts",
1010
"./**/*.tsx",
11+
"../apps/standalone/src/**/*.ts",
12+
"../apps/standalone/src/**/*.tsx",
1113
"../src/reactTopoViewer/**/*.ts",
1214
"../src/reactTopoViewer/**/*.tsx",
1315
"../packages/**/*.ts",

esbuild.config.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -136,19 +136,19 @@ async function build() {
136136
outfile: "dist/containerlabExplorerView.js"
137137
},
138138
{
139-
entryPoints: ["packages/ui/src/webviews/welcome/welcomePage.webview.tsx"],
139+
entryPoints: ["packages/ui/src/welcome/entry.tsx"],
140140
outfile: "dist/welcomePageWebview.js"
141141
},
142142
{
143143
entryPoints: ["packages/ui/src/inspect/entry.tsx"],
144144
outfile: "dist/inspectWebview.js"
145145
},
146146
{
147-
entryPoints: ["packages/ui/src/webviews/nodeImpairments/nodeImpairments.webview.tsx"],
147+
entryPoints: ["packages/ui/src/node-impairments/entry.tsx"],
148148
outfile: "dist/nodeImpairmentsWebview.js"
149149
},
150150
{
151-
entryPoints: ["packages/ui/src/webviews/wiresharkVnc/wiresharkVnc.webview.tsx"],
151+
entryPoints: ["packages/ui/src/wireshark-vnc/entry.tsx"],
152152
outfile: "dist/wiresharkVncWebview.js"
153153
}
154154
].map((build) =>

package-lock.json

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/ui/package.json

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@srl-labs/clab-ui",
3-
"version": "0.0.12",
3+
"version": "0.0.13",
44
"private": false,
55
"type": "module",
66
"main": "src/index.ts",
@@ -9,24 +9,33 @@
99
".": "./src/index.ts",
1010
"./host": "./src/host/index.ts",
1111
"./core": "./src/core/index.ts",
12+
"./core/host/TopologyHostCore": "./src/core/host/TopologyHostCore.ts",
13+
"./core/messages/extension": "./src/core/messages/extension.ts",
14+
"./core/messages/webview": "./src/core/messages/webview.ts",
1215
"./theme": "./src/theme/index.ts",
1316
"./explorer": "./src/explorer/index.ts",
1417
"./explorer/snapshot": "./src/explorer/snapshot.ts",
1518
"./topology/runtime": "./src/topology/runtime.ts",
1619
"./topology/host-protocol": "./src/topology/hostProtocol.ts",
1720
"./inspect": "./src/inspect/index.ts",
18-
"./welcome/entry.tsx": "./src/welcome/entry.tsx",
19-
"./node-impairments/entry.tsx": "./src/node-impairments/entry.tsx",
21+
"./inspect/types": "./src/inspect/types.ts",
22+
"./welcome": "./src/welcome/index.ts",
23+
"./node-impairments": "./src/node-impairments/index.ts",
2024
"./node-impairments/types": "./src/node-impairments/types.ts",
21-
"./wireshark-vnc/entry.tsx": "./src/wireshark-vnc/entry.tsx",
25+
"./wireshark-vnc": "./src/wireshark-vnc/index.ts",
2226
"./wireshark-vnc/types": "./src/wireshark-vnc/types.ts",
2327
"./core/parsing": "./src/core/parsing/index.ts",
2428
"./core/schema": "./src/core/schema/index.ts",
2529
"./core/types": "./src/core/types/index.ts",
30+
"./core/types/messages": "./src/core/types/messages.ts",
2631
"./core/utilities": "./src/core/utilities/index.ts",
2732
"./core/*": "./src/core/*.ts",
33+
"./messaging/webviewMessageBus": "./src/messaging/webviewMessageBus.ts",
34+
"./styles/global.css": "./src/styles/global.css",
35+
"./utils/logger": "./src/utils/logger.ts",
36+
"./assets/images/wireshark_bold.svg": "./src/assets/images/wireshark_bold.svg",
2837
"./components/context-menu/ContextMenu": "./src/components/context-menu/ContextMenu.tsx",
29-
"./*": "./src/*"
38+
"./services": "./src/services/index.ts"
3039
},
3140
"peerDependencies": {
3241
"react": "^19.2.4",

packages/ui/src/AppContent.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ import {
7878
getCustomIconMap,
7979
saveViewerSettings
8080
} from "./services";
81+
import { getConfiguredClabUiHost } from "./host";
8182
import {
8283
PENDING_NETEM_KEY,
8384
areNetemEquivalent,
@@ -283,7 +284,7 @@ function getInteractionLockState(isLocked: boolean, isProcessing: boolean): bool
283284
}
284285

285286
function isDevMockWebview(): boolean {
286-
return window.vscode?.__isDevMock__ === true;
287+
return getConfiguredClabUiHost()?.meta?.isDevMock === true;
287288
}
288289

289290
function isDevExplorerDisabledByUrl(): boolean {
@@ -309,8 +310,7 @@ function shouldCollectDevMockTrafficStats(
309310
if (!isDevMock || interactionMode !== "view") {
310311
return false;
311312
}
312-
const vscodeApi = window.vscode as unknown;
313-
if (isRecord(vscodeApi) && Reflect.get(vscodeApi, "__disableDevMockTraffic__") === true) {
313+
if (getConfiguredClabUiHost()?.meta?.disableDevMockTraffic === true) {
314314
return false;
315315
}
316316
return true;

packages/ui/src/components/monaco/MonacoCodeEditor.tsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import React, { useEffect, useRef, useCallback } from "react";
22
import * as monaco from "monaco-editor";
3-
import {
4-
conf as yamlConf,
5-
language as yamlLanguage
6-
} from "monaco-editor/esm/vs/basic-languages/yaml/yaml.js";
3+
// @ts-ignore Monaco's bundled YAML grammar module is untyped.
4+
import * as yamlMonaco from "monaco-editor/esm/vs/basic-languages/yaml/yaml.js";
75
import * as YAML from "yaml";
86
import Ajv from "ajv";
97

8+
import { getConfiguredClabUiHost } from "../../host";
109
import { parseLuminance } from "../../utils/color";
1110

1211
declare global {
@@ -25,7 +24,7 @@ function getCssVar(name: string, fallback: string): string {
2524
}
2625

2726
function detectColorMode(): "light" | "dark" {
28-
const isDevMock = Boolean(window.vscode && window.vscode.__isDevMock__);
27+
const isDevMock = getConfiguredClabUiHost()?.meta?.isDevMock === true;
2928
if (isDevMock) {
3029
return document.documentElement.classList.contains("light") ? "light" : "dark";
3130
}
@@ -62,8 +61,14 @@ function ensureMonacoConfiguredOnce(): void {
6261
if (!yamlRegistered) {
6362
if (!monaco.languages.getLanguages().some((l) => l.id === "yaml")) {
6463
monaco.languages.register({ id: "yaml" });
65-
monaco.languages.setMonarchTokensProvider("yaml", yamlLanguage);
66-
monaco.languages.setLanguageConfiguration("yaml", yamlConf);
64+
monaco.languages.setMonarchTokensProvider(
65+
"yaml",
66+
yamlMonaco.language as monaco.languages.IMonarchLanguage
67+
);
68+
monaco.languages.setLanguageConfiguration(
69+
"yaml",
70+
yamlMonaco.conf as monaco.languages.LanguageConfiguration
71+
);
6772
}
6873
yamlRegistered = true;
6974
}

packages/ui/src/components/ui/form/FilterableDropdown.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ export const FilterableDropdown: React.FC<FilterableDropdownProps> = ({
8383
}
8484
renderInput={(params) => (
8585
<TextField
86-
{...params}
86+
{...(params as unknown as React.ComponentProps<typeof TextField>)}
8787
label={label}
8888
placeholder={placeholder}
8989
helperText={helperText}

0 commit comments

Comments
 (0)