@gluonjs/devtools


@gluonjs/devtools / packages/devtools/src / GluonDevtoolsBridge

Class: GluonDevtoolsBridge

Constructors

Constructor

new GluonDevtoolsBridge(options?): GluonDevtoolsBridge

Parameters

options?

DevtoolsBridgeOptions = {}

Returns

GluonDevtoolsBridge

Properties

enabled

readonly enabled: boolean


protocol

readonly protocol: DevtoolsProtocol

Methods

dispose()

dispose(): void

Returns

void


handshake()

handshake(): DevtoolsHandshake

Returns

DevtoolsHandshake


recordError()

recordError(applicationId, payload): DevtoolsEvent | undefined

Parameters

applicationId

string

payload

unknown

Returns

DevtoolsEvent | undefined


recordEvent()

recordEvent(applicationId, payload): DevtoolsEvent | undefined

Parameters

applicationId

string

payload

unknown

Returns

DevtoolsEvent | undefined


recordScheduler()

recordScheduler(applicationId, payload): DevtoolsEvent | undefined

Parameters

applicationId

string

payload

unknown

Returns

DevtoolsEvent | undefined


registerApplication()

registerApplication(options): () => void

Parameters

options

RegisterApplicationOptions

Returns

() => void


selectApplication()

selectApplication(id): void

Parameters

id

string

Returns

void


snapshot()

snapshot(): DevtoolsSnapshot

Returns

DevtoolsSnapshot

Example

Connect application, Router, Store, render, scheduler, event, and error evidence to one Devtools protocol owner and deterministic cleanup cycle:

ts
import { createApp, html } from '@gluonjs/core';
import {
  GLUON_DEVTOOLS_GLOBAL,
  GluonDevtoolsBridge,
  createDevtoolsArtifactContract,
  createDevtoolsBridge,
  gluonDevtoolsPlugin,
  mountGluonDevtools,
  type DevtoolsBridgeOptions,
  type DevtoolsArtifactContract,
  type DevtoolsInspectorOptions,
  type GluonDevtoolsPluginOptions,
  type InspectableRouter,
  type InspectableStore,
  type MountedDevtools,
} from '@gluonjs/devtools';

const root = document.querySelector<HTMLElement>('#app')!;
const app = createApp(() => html`<main>Shop</main>`);
app.mount(root);
const router: InspectableRouter = {
  currentRoute: { value: { fullPath: '/shop' } },
  afterEach: (_hook) => () => undefined,
};
const store: InspectableStore = {
  subscribe: (_callback) => () => undefined,
  dehydrate: () => ({ version: 1, stores: {} }),
};
const globalObject: Record<string, unknown> = {};
const bridgeOptions = { enabled: true, exposeGlobal: true, globalObject } satisfies DevtoolsBridgeOptions;
const bridge: GluonDevtoolsBridge = createDevtoolsBridge(bridgeOptions);
const unregister = bridge.registerApplication({ id: 'shop', app, root, router, store });
const inspectorOptions = { navigateToSource: (location) => console.log(location) } satisfies DevtoolsInspectorOptions;
const mounted: MountedDevtools = mountGluonDevtools(bridge, document.body, inspectorOptions);
const artifact: DevtoolsArtifactContract = createDevtoolsArtifactContract();
const pluginOptions = { virtualId: 'virtual:shop-devtools' } satisfies GluonDevtoolsPluginOptions;
const vitePlugin = gluonDevtoolsPlugin(pluginOptions);
console.log(globalObject[GLUON_DEVTOOLS_GLOBAL] === bridge, vitePlugin.name, mounted.element, artifact.manifest);
mounted.unmount();
unregister();
bridge.dispose();
app.unmount();