@reckona/mreact-devtools 0.0.159 → 0.0.161

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/index.d.ts CHANGED
@@ -1,29 +1,39 @@
1
+ /** Describes one event emitted to the shared mreact devtools bus. */
1
2
  export interface DevtoolsEvent {
2
3
  package: string;
3
4
  timestamp?: number;
4
5
  type: string;
5
6
  [key: string]: unknown;
6
7
  }
8
+ /** Receives devtools events when subscribed to a devtools instance. */
7
9
  export type DevtoolsListener = (event: DevtoolsEvent) => void;
10
+ /** Sets the default number of events retained by a devtools instance. */
8
11
  export declare const defaultDevtoolsMaxEvents = 1000;
12
+ /** Configures event retention for `createDevtools()`. */
9
13
  export interface CreateDevtoolsOptions {
10
14
  maxEvents?: number | undefined;
11
15
  }
16
+ /** Provides event emission, subscription, history reads, and disposal for mreact devtools. */
12
17
  export interface Devtools {
13
18
  dispose(): void;
14
19
  emit(event: DevtoolsEvent): void;
15
20
  events(): DevtoolsEvent[];
16
21
  subscribe(listener: DevtoolsListener): () => void;
17
22
  }
23
+ /** Configures installation of a devtools instance on `globalThis`. */
18
24
  export interface InstallDevtoolsOptions {
19
25
  force?: boolean | undefined;
20
26
  }
21
27
  declare global {
22
28
  var __mreactDevtools: Devtools | undefined;
23
29
  }
30
+ /** Creates an in-memory devtools event bus. */
24
31
  export declare function createDevtools(options?: CreateDevtoolsOptions): Devtools;
32
+ /** Installs a devtools instance on `globalThis` unless production mode blocks installation. */
25
33
  export declare function installDevtools(devtools?: Devtools, options?: InstallDevtoolsOptions): Devtools;
34
+ /** Returns the devtools instance installed on `globalThis`, if one exists. */
26
35
  export declare function getInstalledDevtools(): Devtools | undefined;
36
+ /** Emits a package-scoped devtools event to the installed global devtools instance. */
27
37
  export declare function emitMreactDevtoolsEvent(packageName: string, event: {
28
38
  type: string;
29
39
  } & Record<string, unknown>): void;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAE9D,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,IAAI,CAAC;IAChB,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,MAAM,IAAI,aAAa,EAAE,CAAC;IAC1B,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAAC;CACnD;AAED,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,gBAAgB,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC5C;AAED,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,QAAQ,CAoC5E;AAUD,wBAAgB,eAAe,CAC7B,QAAQ,GAAE,QAA2B,EACrC,OAAO,GAAE,sBAA2B,GACnC,QAAQ,CAQV;AAQD,wBAAgB,oBAAoB,IAAI,QAAQ,GAAG,SAAS,CAE3D;AAED,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChD,IAAI,CAMN"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,uEAAuE;AACvE,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,aAAa,KAAK,IAAI,CAAC;AAE9D,yEAAyE;AACzE,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAE9C,yDAAyD;AACzD,MAAM,WAAW,qBAAqB;IACpC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,8FAA8F;AAC9F,MAAM,WAAW,QAAQ;IACvB,OAAO,IAAI,IAAI,CAAC;IAChB,IAAI,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,CAAC;IACjC,MAAM,IAAI,aAAa,EAAE,CAAC;IAC1B,SAAS,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,IAAI,CAAC;CACnD;AAED,sEAAsE;AACtE,MAAM,WAAW,sBAAsB;IACrC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B;AAED,OAAO,CAAC,MAAM,CAAC;IAEb,IAAI,gBAAgB,EAAE,QAAQ,GAAG,SAAS,CAAC;CAC5C;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B,GAAG,QAAQ,CAoC5E;AAUD,+FAA+F;AAC/F,wBAAgB,eAAe,CAC7B,QAAQ,GAAE,QAA2B,EACrC,OAAO,GAAE,sBAA2B,GACnC,QAAQ,CAQV;AAQD,8EAA8E;AAC9E,wBAAgB,oBAAoB,IAAI,QAAQ,GAAG,SAAS,CAE3D;AAED,uFAAuF;AACvF,wBAAgB,uBAAuB,CACrC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChD,IAAI,CAMN"}
package/dist/index.js CHANGED
@@ -1,4 +1,6 @@
1
+ /** Sets the default number of events retained by a devtools instance. */
1
2
  export const defaultDevtoolsMaxEvents = 1_000;
3
+ /** Creates an in-memory devtools event bus. */
2
4
  export function createDevtools(options = {}) {
3
5
  const maxEvents = normalizeMaxEvents(options.maxEvents);
4
6
  const recorded = [];
@@ -39,6 +41,7 @@ function normalizeMaxEvents(maxEvents) {
39
41
  }
40
42
  return Math.max(0, Math.floor(maxEvents));
41
43
  }
44
+ /** Installs a devtools instance on `globalThis` unless production mode blocks installation. */
42
45
  export function installDevtools(devtools = createDevtools(), options = {}) {
43
46
  if (options.force !== true && currentNodeEnv() === "production") {
44
47
  return devtools;
@@ -49,9 +52,11 @@ export function installDevtools(devtools = createDevtools(), options = {}) {
49
52
  function currentNodeEnv() {
50
53
  return globalThis.process?.env?.NODE_ENV;
51
54
  }
55
+ /** Returns the devtools instance installed on `globalThis`, if one exists. */
52
56
  export function getInstalledDevtools() {
53
57
  return globalThis.__mreactDevtools;
54
58
  }
59
+ /** Emits a package-scoped devtools event to the installed global devtools instance. */
55
60
  export function emitMreactDevtoolsEvent(packageName, event) {
56
61
  globalThis.__mreactDevtools?.emit?.({
57
62
  package: packageName,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAsB9C,MAAM,UAAU,cAAc,CAAC,UAAiC,EAAE;IAChE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE9C,OAAO;QACL,OAAO;YACL,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACpB,IAAI,UAAU,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBACzC,UAAU,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK;YACR,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;oBAChC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,MAAM;YACJ,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;QACvB,CAAC;QACD,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAExB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,SAA6B;IACvD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,WAAqB,cAAc,EAAE,EACrC,UAAkC,EAAE;IAEpC,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,cAAc,EAAE,KAAK,YAAY,EAAE,CAAC;QAChE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,UAAU,CAAC,gBAAgB,GAAG,QAAQ,CAAC;IAEvC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc;IACrB,OAAQ,UAEN,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC;AAC5B,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,UAAU,CAAC,gBAAgB,CAAC;AACrC,CAAC;AAED,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,KAAiD;IAEjD,UAAU,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAClC,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,GAAG,KAAK;KACT,CAAC,CAAC;AACL,CAAC","sourcesContent":["export interface DevtoolsEvent {\n package: string;\n timestamp?: number;\n type: string;\n [key: string]: unknown;\n}\n\nexport type DevtoolsListener = (event: DevtoolsEvent) => void;\n\nexport const defaultDevtoolsMaxEvents = 1_000;\n\nexport interface CreateDevtoolsOptions {\n maxEvents?: number | undefined;\n}\n\nexport interface Devtools {\n dispose(): void;\n emit(event: DevtoolsEvent): void;\n events(): DevtoolsEvent[];\n subscribe(listener: DevtoolsListener): () => void;\n}\n\nexport interface InstallDevtoolsOptions {\n force?: boolean | undefined;\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __mreactDevtools: Devtools | undefined;\n}\n\nexport function createDevtools(options: CreateDevtoolsOptions = {}): Devtools {\n const maxEvents = normalizeMaxEvents(options.maxEvents);\n const recorded: DevtoolsEvent[] = [];\n const listeners = new Set<DevtoolsListener>();\n\n return {\n dispose() {\n listeners.clear();\n recorded.length = 0;\n if (globalThis.__mreactDevtools === this) {\n globalThis.__mreactDevtools = undefined;\n }\n },\n emit(event) {\n if (maxEvents > 0) {\n recorded.push(event);\n if (recorded.length > maxEvents) {\n recorded.splice(0, recorded.length - maxEvents);\n }\n }\n\n for (const listener of Array.from(listeners)) {\n listener(event);\n }\n },\n events() {\n return [...recorded];\n },\n subscribe(listener) {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\nfunction normalizeMaxEvents(maxEvents: number | undefined): number {\n if (maxEvents === undefined) {\n return defaultDevtoolsMaxEvents;\n }\n\n return Math.max(0, Math.floor(maxEvents));\n}\n\nexport function installDevtools(\n devtools: Devtools = createDevtools(),\n options: InstallDevtoolsOptions = {},\n): Devtools {\n if (options.force !== true && currentNodeEnv() === \"production\") {\n return devtools;\n }\n\n globalThis.__mreactDevtools = devtools;\n\n return devtools;\n}\n\nfunction currentNodeEnv(): string | undefined {\n return (globalThis as {\n process?: { env?: { NODE_ENV?: string | undefined } | undefined } | undefined;\n }).process?.env?.NODE_ENV;\n}\n\nexport function getInstalledDevtools(): Devtools | undefined {\n return globalThis.__mreactDevtools;\n}\n\nexport function emitMreactDevtoolsEvent(\n packageName: string,\n event: { type: string } & Record<string, unknown>,\n): void {\n globalThis.__mreactDevtools?.emit?.({\n package: packageName,\n timestamp: Date.now(),\n ...event,\n });\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAWA,yEAAyE;AACzE,MAAM,CAAC,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAyB9C,+CAA+C;AAC/C,MAAM,UAAU,cAAc,CAAC,UAAiC,EAAE;IAChE,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,MAAM,SAAS,GAAG,IAAI,GAAG,EAAoB,CAAC;IAE9C,OAAO;QACL,OAAO;YACL,SAAS,CAAC,KAAK,EAAE,CAAC;YAClB,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;YACpB,IAAI,UAAU,CAAC,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBACzC,UAAU,CAAC,gBAAgB,GAAG,SAAS,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK;YACR,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;gBAClB,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACrB,IAAI,QAAQ,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;oBAChC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;YAED,KAAK,MAAM,QAAQ,IAAI,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7C,QAAQ,CAAC,KAAK,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,MAAM;YACJ,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC;QACvB,CAAC;QACD,SAAS,CAAC,QAAQ;YAChB,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAExB,OAAO,GAAG,EAAE;gBACV,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YAC7B,CAAC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,kBAAkB,CAAC,SAA6B;IACvD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,OAAO,wBAAwB,CAAC;IAClC,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,+FAA+F;AAC/F,MAAM,UAAU,eAAe,CAC7B,WAAqB,cAAc,EAAE,EACrC,UAAkC,EAAE;IAEpC,IAAI,OAAO,CAAC,KAAK,KAAK,IAAI,IAAI,cAAc,EAAE,KAAK,YAAY,EAAE,CAAC;QAChE,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,UAAU,CAAC,gBAAgB,GAAG,QAAQ,CAAC;IAEvC,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,cAAc;IACrB,OAAQ,UAEN,CAAC,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC;AAC5B,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,oBAAoB;IAClC,OAAO,UAAU,CAAC,gBAAgB,CAAC;AACrC,CAAC;AAED,uFAAuF;AACvF,MAAM,UAAU,uBAAuB,CACrC,WAAmB,EACnB,KAAiD;IAEjD,UAAU,CAAC,gBAAgB,EAAE,IAAI,EAAE,CAAC;QAClC,OAAO,EAAE,WAAW;QACpB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,GAAG,KAAK;KACT,CAAC,CAAC;AACL,CAAC","sourcesContent":["/** Describes one event emitted to the shared mreact devtools bus. */\nexport interface DevtoolsEvent {\n package: string;\n timestamp?: number;\n type: string;\n [key: string]: unknown;\n}\n\n/** Receives devtools events when subscribed to a devtools instance. */\nexport type DevtoolsListener = (event: DevtoolsEvent) => void;\n\n/** Sets the default number of events retained by a devtools instance. */\nexport const defaultDevtoolsMaxEvents = 1_000;\n\n/** Configures event retention for `createDevtools()`. */\nexport interface CreateDevtoolsOptions {\n maxEvents?: number | undefined;\n}\n\n/** Provides event emission, subscription, history reads, and disposal for mreact devtools. */\nexport interface Devtools {\n dispose(): void;\n emit(event: DevtoolsEvent): void;\n events(): DevtoolsEvent[];\n subscribe(listener: DevtoolsListener): () => void;\n}\n\n/** Configures installation of a devtools instance on `globalThis`. */\nexport interface InstallDevtoolsOptions {\n force?: boolean | undefined;\n}\n\ndeclare global {\n // eslint-disable-next-line no-var\n var __mreactDevtools: Devtools | undefined;\n}\n\n/** Creates an in-memory devtools event bus. */\nexport function createDevtools(options: CreateDevtoolsOptions = {}): Devtools {\n const maxEvents = normalizeMaxEvents(options.maxEvents);\n const recorded: DevtoolsEvent[] = [];\n const listeners = new Set<DevtoolsListener>();\n\n return {\n dispose() {\n listeners.clear();\n recorded.length = 0;\n if (globalThis.__mreactDevtools === this) {\n globalThis.__mreactDevtools = undefined;\n }\n },\n emit(event) {\n if (maxEvents > 0) {\n recorded.push(event);\n if (recorded.length > maxEvents) {\n recorded.splice(0, recorded.length - maxEvents);\n }\n }\n\n for (const listener of Array.from(listeners)) {\n listener(event);\n }\n },\n events() {\n return [...recorded];\n },\n subscribe(listener) {\n listeners.add(listener);\n\n return () => {\n listeners.delete(listener);\n };\n },\n };\n}\n\nfunction normalizeMaxEvents(maxEvents: number | undefined): number {\n if (maxEvents === undefined) {\n return defaultDevtoolsMaxEvents;\n }\n\n return Math.max(0, Math.floor(maxEvents));\n}\n\n/** Installs a devtools instance on `globalThis` unless production mode blocks installation. */\nexport function installDevtools(\n devtools: Devtools = createDevtools(),\n options: InstallDevtoolsOptions = {},\n): Devtools {\n if (options.force !== true && currentNodeEnv() === \"production\") {\n return devtools;\n }\n\n globalThis.__mreactDevtools = devtools;\n\n return devtools;\n}\n\nfunction currentNodeEnv(): string | undefined {\n return (globalThis as {\n process?: { env?: { NODE_ENV?: string | undefined } | undefined } | undefined;\n }).process?.env?.NODE_ENV;\n}\n\n/** Returns the devtools instance installed on `globalThis`, if one exists. */\nexport function getInstalledDevtools(): Devtools | undefined {\n return globalThis.__mreactDevtools;\n}\n\n/** Emits a package-scoped devtools event to the installed global devtools instance. */\nexport function emitMreactDevtoolsEvent(\n packageName: string,\n event: { type: string } & Record<string, unknown>,\n): void {\n globalThis.__mreactDevtools?.emit?.({\n package: packageName,\n timestamp: Date.now(),\n ...event,\n });\n}\n"]}
package/dist/overlay.d.ts CHANGED
@@ -1,15 +1,20 @@
1
1
  import { type Devtools } from "./index.js";
2
+ /** Re-exports devtools types used by the overlay. */
2
3
  export type { Devtools, DevtoolsEvent, DevtoolsListener } from "./index.js";
4
+ /** Names the event category tabs displayed by the devtools overlay. */
3
5
  export type DevtoolsOverlayTab = "query" | "reactive" | "router";
6
+ /** Configures document ownership, event source, and event retention for the devtools overlay. */
4
7
  export interface DevtoolsOverlayOptions {
5
8
  devtools?: Devtools | undefined;
6
9
  document?: Document | undefined;
7
10
  maxEvents?: number | undefined;
8
11
  }
12
+ /** Represents a mounted devtools overlay and its disposal handle. */
9
13
  export interface MountedDevtoolsOverlay {
10
14
  devtools: Devtools;
11
15
  dispose(): void;
12
16
  element: HTMLElement;
13
17
  }
18
+ /** Mounts a browser devtools overlay that groups recent mreact events by category. */
14
19
  export declare function mountDevtoolsOverlay(options?: DevtoolsOverlayOptions): MountedDevtoolsOverlay;
15
20
  //# sourceMappingURL=overlay.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EAEd,MAAM,YAAY,CAAC;AAEpB,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5E,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEjE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,IAAI,IAAI,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;CACtB;AAgBD,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,sBAA2B,GACnC,sBAAsB,CAiIxB"}
1
+ {"version":3,"file":"overlay.d.ts","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EAEd,MAAM,YAAY,CAAC;AAEpB,qDAAqD;AACrD,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE5E,uEAAuE;AACvE,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,UAAU,GAAG,QAAQ,CAAC;AAEjE,iGAAiG;AACjG,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAChC;AAED,qEAAqE;AACrE,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,IAAI,IAAI,CAAC;IAChB,OAAO,EAAE,WAAW,CAAC;CACtB;AAgBD,sFAAsF;AACtF,wBAAgB,oBAAoB,CAClC,OAAO,GAAE,sBAA2B,GACnC,sBAAsB,CAiIxB"}
package/dist/overlay.js CHANGED
@@ -6,6 +6,7 @@ const tabs = [
6
6
  ];
7
7
  const defaultMaxEvents = 200;
8
8
  const maxEventDetailsLength = 4_000;
9
+ /** Mounts a browser devtools overlay that groups recent mreact events by category. */
9
10
  export function mountDevtoolsOverlay(options = {}) {
10
11
  const ownerDocument = options.document ?? documentFromGlobal();
11
12
  const maxEvents = normalizeMaxEvents(options.maxEvents);
@@ -1 +1 @@
1
- {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,oBAAoB,EACpB,eAAe,GAGhB,MAAM,YAAY,CAAC;AAuBpB,MAAM,IAAI,GAA6B;IACrC,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,EAAE,UAAU,EAAE;IACtC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE;IAChC,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,QAAQ,EAAE;CACnC,CAAC;AAEF,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAC7B,MAAM,qBAAqB,GAAG,KAAK,CAAC;AAEpC,MAAM,UAAU,oBAAoB,CAClC,UAAkC,EAAE;IAEpC,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,IAAI,kBAAkB,EAAE,CAAC;IAC/D,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACxD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,oBAAoB,EAAE,IAAI,eAAe,CAAC,cAAc,EAAE,CAAC,CAAC;IACjG,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IACvD,MAAM,OAAO,GAAG,aAAa,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,SAAS,GAAuB,UAAU,CAAC;IAC/C,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,OAAO,CAAC,OAAO,CAAC,qBAAqB,GAAG,EAAE,CAAC;IAC3C,OAAO,CAAC,YAAY,CAAC,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACtD,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;QAC3B,UAAU,EAAE,SAAS;QACrB,MAAM,EAAE,mBAAmB;QAC3B,YAAY,EAAE,KAAK;QACnB,MAAM,EAAE,MAAM;QACd,SAAS,EAAE,+BAA+B;QAC1C,KAAK,EAAE,SAAS;QAChB,OAAO,EAAE,MAAM;QACf,IAAI,EAAE,oEAAoE;QAC1E,GAAG,EAAE,KAAK;QACV,SAAS,EAAE,gCAAgC;QAC3C,QAAQ,EAAE,QAAQ;QAClB,OAAO,EAAE,MAAM;QACf,QAAQ,EAAE,OAAO;QACjB,KAAK,EAAE,MAAM;QACb,KAAK,EAAE,gCAAgC;QACvC,MAAM,EAAE,YAAY;KACrB,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;QAC3B,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,KAAK;QACV,mBAAmB,EAAE,2BAA2B;KACjD,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE;QAC7B,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,KAAK;QACV,SAAS,EAAE,MAAM;QACjB,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE,MAAM;QAChB,OAAO,EAAE,GAAG;KACb,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IACnC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnC,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/C,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACnB,IAAI,MAAM,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC;YAC9B,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;QAC9C,CAAC;QACD,cAAc,EAAE,CAAC;IACnB,CAAC,CAAC,CAAC;IAEH,MAAM,EAAE,CAAC;IAET,OAAO;QACL,QAAQ;QACR,OAAO;YACL,QAAQ,GAAG,IAAI,CAAC;YAChB,WAAW,EAAE,CAAC;YACd,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,CAAC;QACD,OAAO;KACR,CAAC;IAEF,SAAS,MAAM;QACb,IAAI,QAAQ,EAAE,CAAC;YACb,OAAO;QACT,CAAC;QAED,OAAO,CAAC,eAAe,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7E,MAAM,aAAa,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,SAAS,CAAC,CAAC,OAAO,EAAE,CAAC;QAE7F,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAChD,KAAK,CAAC,WAAW,GAAG,WAAW,CAAC;YAChC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;gBACzB,KAAK,EAAE,SAAS;gBAChB,OAAO,EAAE,UAAU;aACpB,CAAC,CAAC;YACH,SAAS,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QAED,SAAS,CAAC,eAAe,CAAC,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IAChG,CAAC;IAED,SAAS,cAAc;QACrB,IAAI,eAAe,IAAI,QAAQ,EAAE,CAAC;YAChC,OAAO;QACT,CAAC;QAED,eAAe,GAAG,IAAI,CAAC;QACvB,cAAc,CAAC,GAAG,EAAE;YAClB,eAAe,GAAG,KAAK,CAAC;YACxB,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED,SAAS,SAAS,CAAC,GAAa,EAAE,UAAyB;QACzD,MAAM,MAAM,GAAG,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC;QAClF,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;QACvB,MAAM,CAAC,WAAW,GAAG,GAAG,UAAU,CAAC,KAAK,IAAI,KAAK,EAAE,CAAC;QACpD,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,MAAM,CAAC,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC;QAC1E,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE;YAC1B,UAAU,EAAE,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAChE,MAAM,EAAE,mBAAmB;YAC3B,YAAY,EAAE,KAAK;YACnB,KAAK,EAAE,UAAU,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC3D,MAAM,EAAE,SAAS;YACjB,IAAI,EAAE,SAAS;YACf,SAAS,EAAE,MAAM;YACjB,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,SAAS;YAClB,YAAY,EAAE,UAAU;YACxB,UAAU,EAAE,QAAQ;SACrB,CAAC,CAAC;QACH,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE;YACpC,SAAS,GAAG,UAAU,CAAC,GAAG,CAAC;YAC3B,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,GAAa,EAAE,KAAoB;IACtD,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACvC,MAAM,IAAI,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,OAAO,GAAG,GAAG,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAEzC,KAAK,CAAC,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC;IAC/B,IAAI,CAAC,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,eAAe,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACjG,OAAO,CAAC,WAAW,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;IAE1C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE;QACxB,UAAU,EAAE,SAAS;QACrB,MAAM,EAAE,mBAAmB;QAC3B,YAAY,EAAE,KAAK;QACnB,OAAO,EAAE,MAAM;QACf,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,KAAK;KACf,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE;QACzB,KAAK,EAAE,SAAS;QAChB,UAAU,EAAE,KAAK;QACjB,YAAY,EAAE,UAAU;KACzB,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE;QACxB,KAAK,EAAE,SAAS;QAChB,YAAY,EAAE,UAAU;KACzB,CAAC,CAAC;IACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE;QAC3B,KAAK,EAAE,SAAS;QAChB,MAAM,EAAE,GAAG;QACX,QAAQ,EAAE,MAAM;QAChB,UAAU,EAAE,UAAU;KACvB,CAAC,CAAC;IAEH,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IAElC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,YAAY,CAAC,KAAoB;IACxC,MAAM,EAAE,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,OAAO,EAAE,GAAG,KAAK,CAAC;IAExF,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,UAAkB,CAAC;IACvB,IAAI,CAAC;QACH,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,UAAU,GAAG,kBAAkB,CAAC;IAClC,CAAC;IAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,UAAU,CAAC,MAAM,GAAG,qBAAqB;QAC9C,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,qBAAqB,CAAC,KAAK;QACpD,CAAC,CAAC,UAAU,CAAC;AACjB,CAAC;AAED,SAAS,QAAQ,CAAC,KAAoB;IACpC,MAAM,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAE9D,IAAI,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC3F,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,SAAS,eAAe,CAAC,SAA6B;IACpD,OAAO,OAAO,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAyB;IACnD,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,GAAG,CAAC;QAC/D,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;QACnB,CAAC,CAAC,gBAAgB,CAAC;AACvB,CAAC;AAED,SAAS,kBAAkB;IACzB,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC;IACvE,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC","sourcesContent":["import {\n createDevtools,\n getInstalledDevtools,\n installDevtools,\n type Devtools,\n type DevtoolsEvent,\n} from \"./index.js\";\n\nexport type { Devtools, DevtoolsEvent, DevtoolsListener } from \"./index.js\";\n\nexport type DevtoolsOverlayTab = \"query\" | \"reactive\" | \"router\";\n\nexport interface DevtoolsOverlayOptions {\n devtools?: Devtools | undefined;\n document?: Document | undefined;\n maxEvents?: number | undefined;\n}\n\nexport interface MountedDevtoolsOverlay {\n devtools: Devtools;\n dispose(): void;\n element: HTMLElement;\n}\n\ninterface TabDefinition {\n label: string;\n tab: DevtoolsOverlayTab;\n}\n\nconst tabs: readonly TabDefinition[] = [\n { label: \"Reactive\", tab: \"reactive\" },\n { label: \"Query\", tab: \"query\" },\n { label: \"Router\", tab: \"router\" },\n];\n\nconst defaultMaxEvents = 200;\nconst maxEventDetailsLength = 4_000;\n\nexport function mountDevtoolsOverlay(\n options: DevtoolsOverlayOptions = {},\n): MountedDevtoolsOverlay {\n const ownerDocument = options.document ?? documentFromGlobal();\n const maxEvents = normalizeMaxEvents(options.maxEvents);\n const devtools = options.devtools ?? getInstalledDevtools() ?? installDevtools(createDevtools());\n const events = devtools.events().slice(-maxEvents);\n const element = ownerDocument.createElement(\"section\");\n const tabList = ownerDocument.createElement(\"nav\");\n const eventList = ownerDocument.createElement(\"ol\");\n let activeTab: DevtoolsOverlayTab = \"reactive\";\n let disposed = false;\n let renderScheduled = false;\n\n element.dataset.mreactDevtoolsOverlay = \"\";\n element.setAttribute(\"aria-label\", \"mreact devtools\");\n Object.assign(element.style, {\n background: \"#10151f\",\n border: \"1px solid #3b4350\",\n borderRadius: \"8px\",\n bottom: \"16px\",\n boxShadow: \"0 18px 50px rgb(0 0 0 / 0.35)\",\n color: \"#eef2f8\",\n display: \"grid\",\n font: \"12px/1.45 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n gap: \"8px\",\n maxHeight: \"min(420px, calc(100vh - 32px))\",\n overflow: \"hidden\",\n padding: \"10px\",\n position: \"fixed\",\n right: \"16px\",\n width: \"min(520px, calc(100vw - 32px))\",\n zIndex: \"2147483647\",\n });\n Object.assign(tabList.style, {\n display: \"grid\",\n gap: \"6px\",\n gridTemplateColumns: \"repeat(3, minmax(0, 1fr))\",\n });\n Object.assign(eventList.style, {\n display: \"grid\",\n gap: \"6px\",\n listStyle: \"none\",\n margin: \"0\",\n overflow: \"auto\",\n padding: \"0\",\n });\n\n element.append(tabList, eventList);\n ownerDocument.body.append(element);\n\n const unsubscribe = devtools.subscribe((event) => {\n events.push(event);\n if (events.length > maxEvents) {\n events.splice(0, events.length - maxEvents);\n }\n scheduleRender();\n });\n\n render();\n\n return {\n devtools,\n dispose() {\n disposed = true;\n unsubscribe();\n element.remove();\n },\n element,\n };\n\n function render(): void {\n if (disposed) {\n return;\n }\n\n tabList.replaceChildren(...tabs.map((tab) => renderTab(ownerDocument, tab)));\n const visibleEvents = [...events].filter((event) => eventTab(event) === activeTab).reverse();\n\n if (visibleEvents.length === 0) {\n const empty = ownerDocument.createElement(\"li\");\n empty.textContent = \"No events\";\n Object.assign(empty.style, {\n color: \"#9aa8bc\",\n padding: \"12px 4px\",\n });\n eventList.replaceChildren(empty);\n return;\n }\n\n eventList.replaceChildren(...visibleEvents.map((event) => renderEvent(ownerDocument, event)));\n }\n\n function scheduleRender(): void {\n if (renderScheduled || disposed) {\n return;\n }\n\n renderScheduled = true;\n queueMicrotask(() => {\n renderScheduled = false;\n render();\n });\n }\n\n function renderTab(doc: Document, definition: TabDefinition): HTMLButtonElement {\n const button = doc.createElement(\"button\");\n const count = events.filter((event) => eventTab(event) === definition.tab).length;\n button.type = \"button\";\n button.textContent = `${definition.label} ${count}`;\n button.setAttribute(\"aria-pressed\", String(definition.tab === activeTab));\n Object.assign(button.style, {\n background: definition.tab === activeTab ? \"#d8e7ff\" : \"#1b2330\",\n border: \"1px solid #3b4350\",\n borderRadius: \"6px\",\n color: definition.tab === activeTab ? \"#111827\" : \"#d8e7ff\",\n cursor: \"pointer\",\n font: \"inherit\",\n minHeight: \"32px\",\n overflow: \"hidden\",\n padding: \"6px 8px\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n });\n button.addEventListener(\"click\", () => {\n activeTab = definition.tab;\n render();\n });\n\n return button;\n }\n}\n\nfunction renderEvent(doc: Document, event: DevtoolsEvent): HTMLLIElement {\n const item = doc.createElement(\"li\");\n const title = doc.createElement(\"div\");\n const meta = doc.createElement(\"div\");\n const details = doc.createElement(\"pre\");\n\n title.textContent = event.type;\n meta.textContent = [event.package, formatTimestamp(event.timestamp)].filter(Boolean).join(\" | \");\n details.textContent = eventDetails(event);\n\n Object.assign(item.style, {\n background: \"#161d28\",\n border: \"1px solid #303846\",\n borderRadius: \"6px\",\n display: \"grid\",\n gap: \"3px\",\n padding: \"8px\",\n });\n Object.assign(title.style, {\n color: \"#ffffff\",\n fontWeight: \"700\",\n overflowWrap: \"anywhere\",\n });\n Object.assign(meta.style, {\n color: \"#9aa8bc\",\n overflowWrap: \"anywhere\",\n });\n Object.assign(details.style, {\n color: \"#c8d7ec\",\n margin: \"0\",\n overflow: \"auto\",\n whiteSpace: \"pre-wrap\",\n });\n\n item.append(title, meta, details);\n\n return item;\n}\n\nfunction eventDetails(event: DevtoolsEvent): string {\n const { package: _packageName, timestamp: _timestamp, type: _type, ...details } = event;\n\n if (Object.keys(details).length === 0) {\n return \"{}\";\n }\n\n let serialized: string;\n try {\n serialized = JSON.stringify(details);\n } catch {\n serialized = \"[unserializable]\";\n }\n\n if (serialized === undefined) {\n return \"{}\";\n }\n\n return serialized.length > maxEventDetailsLength\n ? `${serialized.slice(0, maxEventDetailsLength)}...`\n : serialized;\n}\n\nfunction eventTab(event: DevtoolsEvent): DevtoolsOverlayTab {\n const search = `${event.package} ${event.type}`.toLowerCase();\n\n if (search.includes(\"router\") || search.includes(\"route\") || search.includes(\"navigation\")) {\n return \"router\";\n }\n\n if (search.includes(\"query\") || search.includes(\"mutation\")) {\n return \"query\";\n }\n\n return \"reactive\";\n}\n\nfunction formatTimestamp(timestamp: number | undefined): string {\n return typeof timestamp === \"number\" ? new Date(timestamp).toISOString() : \"\";\n}\n\nfunction normalizeMaxEvents(value: number | undefined): number {\n return Number.isFinite(value) && value !== undefined && value > 0\n ? Math.floor(value)\n : defaultMaxEvents;\n}\n\nfunction documentFromGlobal(): Document {\n if (typeof document === \"undefined\") {\n throw new Error(\"mountDevtoolsOverlay requires a browser document.\");\n }\n\n return document;\n}\n"]}
1
+ {"version":3,"file":"overlay.js","sourceRoot":"","sources":["../src/overlay.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n createDevtools,\n getInstalledDevtools,\n installDevtools,\n type Devtools,\n type DevtoolsEvent,\n} from \"./index.js\";\n\n/** Re-exports devtools types used by the overlay. */\nexport type { Devtools, DevtoolsEvent, DevtoolsListener } from \"./index.js\";\n\n/** Names the event category tabs displayed by the devtools overlay. */\nexport type DevtoolsOverlayTab = \"query\" | \"reactive\" | \"router\";\n\n/** Configures document ownership, event source, and event retention for the devtools overlay. */\nexport interface DevtoolsOverlayOptions {\n devtools?: Devtools | undefined;\n document?: Document | undefined;\n maxEvents?: number | undefined;\n}\n\n/** Represents a mounted devtools overlay and its disposal handle. */\nexport interface MountedDevtoolsOverlay {\n devtools: Devtools;\n dispose(): void;\n element: HTMLElement;\n}\n\ninterface TabDefinition {\n label: string;\n tab: DevtoolsOverlayTab;\n}\n\nconst tabs: readonly TabDefinition[] = [\n { label: \"Reactive\", tab: \"reactive\" },\n { label: \"Query\", tab: \"query\" },\n { label: \"Router\", tab: \"router\" },\n];\n\nconst defaultMaxEvents = 200;\nconst maxEventDetailsLength = 4_000;\n\n/** Mounts a browser devtools overlay that groups recent mreact events by category. */\nexport function mountDevtoolsOverlay(\n options: DevtoolsOverlayOptions = {},\n): MountedDevtoolsOverlay {\n const ownerDocument = options.document ?? documentFromGlobal();\n const maxEvents = normalizeMaxEvents(options.maxEvents);\n const devtools = options.devtools ?? getInstalledDevtools() ?? installDevtools(createDevtools());\n const events = devtools.events().slice(-maxEvents);\n const element = ownerDocument.createElement(\"section\");\n const tabList = ownerDocument.createElement(\"nav\");\n const eventList = ownerDocument.createElement(\"ol\");\n let activeTab: DevtoolsOverlayTab = \"reactive\";\n let disposed = false;\n let renderScheduled = false;\n\n element.dataset.mreactDevtoolsOverlay = \"\";\n element.setAttribute(\"aria-label\", \"mreact devtools\");\n Object.assign(element.style, {\n background: \"#10151f\",\n border: \"1px solid #3b4350\",\n borderRadius: \"8px\",\n bottom: \"16px\",\n boxShadow: \"0 18px 50px rgb(0 0 0 / 0.35)\",\n color: \"#eef2f8\",\n display: \"grid\",\n font: \"12px/1.45 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace\",\n gap: \"8px\",\n maxHeight: \"min(420px, calc(100vh - 32px))\",\n overflow: \"hidden\",\n padding: \"10px\",\n position: \"fixed\",\n right: \"16px\",\n width: \"min(520px, calc(100vw - 32px))\",\n zIndex: \"2147483647\",\n });\n Object.assign(tabList.style, {\n display: \"grid\",\n gap: \"6px\",\n gridTemplateColumns: \"repeat(3, minmax(0, 1fr))\",\n });\n Object.assign(eventList.style, {\n display: \"grid\",\n gap: \"6px\",\n listStyle: \"none\",\n margin: \"0\",\n overflow: \"auto\",\n padding: \"0\",\n });\n\n element.append(tabList, eventList);\n ownerDocument.body.append(element);\n\n const unsubscribe = devtools.subscribe((event) => {\n events.push(event);\n if (events.length > maxEvents) {\n events.splice(0, events.length - maxEvents);\n }\n scheduleRender();\n });\n\n render();\n\n return {\n devtools,\n dispose() {\n disposed = true;\n unsubscribe();\n element.remove();\n },\n element,\n };\n\n function render(): void {\n if (disposed) {\n return;\n }\n\n tabList.replaceChildren(...tabs.map((tab) => renderTab(ownerDocument, tab)));\n const visibleEvents = [...events].filter((event) => eventTab(event) === activeTab).reverse();\n\n if (visibleEvents.length === 0) {\n const empty = ownerDocument.createElement(\"li\");\n empty.textContent = \"No events\";\n Object.assign(empty.style, {\n color: \"#9aa8bc\",\n padding: \"12px 4px\",\n });\n eventList.replaceChildren(empty);\n return;\n }\n\n eventList.replaceChildren(...visibleEvents.map((event) => renderEvent(ownerDocument, event)));\n }\n\n function scheduleRender(): void {\n if (renderScheduled || disposed) {\n return;\n }\n\n renderScheduled = true;\n queueMicrotask(() => {\n renderScheduled = false;\n render();\n });\n }\n\n function renderTab(doc: Document, definition: TabDefinition): HTMLButtonElement {\n const button = doc.createElement(\"button\");\n const count = events.filter((event) => eventTab(event) === definition.tab).length;\n button.type = \"button\";\n button.textContent = `${definition.label} ${count}`;\n button.setAttribute(\"aria-pressed\", String(definition.tab === activeTab));\n Object.assign(button.style, {\n background: definition.tab === activeTab ? \"#d8e7ff\" : \"#1b2330\",\n border: \"1px solid #3b4350\",\n borderRadius: \"6px\",\n color: definition.tab === activeTab ? \"#111827\" : \"#d8e7ff\",\n cursor: \"pointer\",\n font: \"inherit\",\n minHeight: \"32px\",\n overflow: \"hidden\",\n padding: \"6px 8px\",\n textOverflow: \"ellipsis\",\n whiteSpace: \"nowrap\",\n });\n button.addEventListener(\"click\", () => {\n activeTab = definition.tab;\n render();\n });\n\n return button;\n }\n}\n\nfunction renderEvent(doc: Document, event: DevtoolsEvent): HTMLLIElement {\n const item = doc.createElement(\"li\");\n const title = doc.createElement(\"div\");\n const meta = doc.createElement(\"div\");\n const details = doc.createElement(\"pre\");\n\n title.textContent = event.type;\n meta.textContent = [event.package, formatTimestamp(event.timestamp)].filter(Boolean).join(\" | \");\n details.textContent = eventDetails(event);\n\n Object.assign(item.style, {\n background: \"#161d28\",\n border: \"1px solid #303846\",\n borderRadius: \"6px\",\n display: \"grid\",\n gap: \"3px\",\n padding: \"8px\",\n });\n Object.assign(title.style, {\n color: \"#ffffff\",\n fontWeight: \"700\",\n overflowWrap: \"anywhere\",\n });\n Object.assign(meta.style, {\n color: \"#9aa8bc\",\n overflowWrap: \"anywhere\",\n });\n Object.assign(details.style, {\n color: \"#c8d7ec\",\n margin: \"0\",\n overflow: \"auto\",\n whiteSpace: \"pre-wrap\",\n });\n\n item.append(title, meta, details);\n\n return item;\n}\n\nfunction eventDetails(event: DevtoolsEvent): string {\n const { package: _packageName, timestamp: _timestamp, type: _type, ...details } = event;\n\n if (Object.keys(details).length === 0) {\n return \"{}\";\n }\n\n let serialized: string;\n try {\n serialized = JSON.stringify(details);\n } catch {\n serialized = \"[unserializable]\";\n }\n\n if (serialized === undefined) {\n return \"{}\";\n }\n\n return serialized.length > maxEventDetailsLength\n ? `${serialized.slice(0, maxEventDetailsLength)}...`\n : serialized;\n}\n\nfunction eventTab(event: DevtoolsEvent): DevtoolsOverlayTab {\n const search = `${event.package} ${event.type}`.toLowerCase();\n\n if (search.includes(\"router\") || search.includes(\"route\") || search.includes(\"navigation\")) {\n return \"router\";\n }\n\n if (search.includes(\"query\") || search.includes(\"mutation\")) {\n return \"query\";\n }\n\n return \"reactive\";\n}\n\nfunction formatTimestamp(timestamp: number | undefined): string {\n return typeof timestamp === \"number\" ? new Date(timestamp).toISOString() : \"\";\n}\n\nfunction normalizeMaxEvents(value: number | undefined): number {\n return Number.isFinite(value) && value !== undefined && value > 0\n ? Math.floor(value)\n : defaultMaxEvents;\n}\n\nfunction documentFromGlobal(): Document {\n if (typeof document === \"undefined\") {\n throw new Error(\"mountDevtoolsOverlay requires a browser document.\");\n }\n\n return document;\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reckona/mreact-devtools",
3
- "version": "0.0.159",
3
+ "version": "0.0.161",
4
4
  "description": "Runtime event bridge for mreact developer tooling.",
5
5
  "keywords": [
6
6
  "debugging",
package/src/index.ts CHANGED
@@ -1,3 +1,4 @@
1
+ /** Describes one event emitted to the shared mreact devtools bus. */
1
2
  export interface DevtoolsEvent {
2
3
  package: string;
3
4
  timestamp?: number;
@@ -5,14 +6,18 @@ export interface DevtoolsEvent {
5
6
  [key: string]: unknown;
6
7
  }
7
8
 
9
+ /** Receives devtools events when subscribed to a devtools instance. */
8
10
  export type DevtoolsListener = (event: DevtoolsEvent) => void;
9
11
 
12
+ /** Sets the default number of events retained by a devtools instance. */
10
13
  export const defaultDevtoolsMaxEvents = 1_000;
11
14
 
15
+ /** Configures event retention for `createDevtools()`. */
12
16
  export interface CreateDevtoolsOptions {
13
17
  maxEvents?: number | undefined;
14
18
  }
15
19
 
20
+ /** Provides event emission, subscription, history reads, and disposal for mreact devtools. */
16
21
  export interface Devtools {
17
22
  dispose(): void;
18
23
  emit(event: DevtoolsEvent): void;
@@ -20,6 +25,7 @@ export interface Devtools {
20
25
  subscribe(listener: DevtoolsListener): () => void;
21
26
  }
22
27
 
28
+ /** Configures installation of a devtools instance on `globalThis`. */
23
29
  export interface InstallDevtoolsOptions {
24
30
  force?: boolean | undefined;
25
31
  }
@@ -29,6 +35,7 @@ declare global {
29
35
  var __mreactDevtools: Devtools | undefined;
30
36
  }
31
37
 
38
+ /** Creates an in-memory devtools event bus. */
32
39
  export function createDevtools(options: CreateDevtoolsOptions = {}): Devtools {
33
40
  const maxEvents = normalizeMaxEvents(options.maxEvents);
34
41
  const recorded: DevtoolsEvent[] = [];
@@ -75,6 +82,7 @@ function normalizeMaxEvents(maxEvents: number | undefined): number {
75
82
  return Math.max(0, Math.floor(maxEvents));
76
83
  }
77
84
 
85
+ /** Installs a devtools instance on `globalThis` unless production mode blocks installation. */
78
86
  export function installDevtools(
79
87
  devtools: Devtools = createDevtools(),
80
88
  options: InstallDevtoolsOptions = {},
@@ -94,10 +102,12 @@ function currentNodeEnv(): string | undefined {
94
102
  }).process?.env?.NODE_ENV;
95
103
  }
96
104
 
105
+ /** Returns the devtools instance installed on `globalThis`, if one exists. */
97
106
  export function getInstalledDevtools(): Devtools | undefined {
98
107
  return globalThis.__mreactDevtools;
99
108
  }
100
109
 
110
+ /** Emits a package-scoped devtools event to the installed global devtools instance. */
101
111
  export function emitMreactDevtoolsEvent(
102
112
  packageName: string,
103
113
  event: { type: string } & Record<string, unknown>,
package/src/overlay.ts CHANGED
@@ -6,16 +6,20 @@ import {
6
6
  type DevtoolsEvent,
7
7
  } from "./index.js";
8
8
 
9
+ /** Re-exports devtools types used by the overlay. */
9
10
  export type { Devtools, DevtoolsEvent, DevtoolsListener } from "./index.js";
10
11
 
12
+ /** Names the event category tabs displayed by the devtools overlay. */
11
13
  export type DevtoolsOverlayTab = "query" | "reactive" | "router";
12
14
 
15
+ /** Configures document ownership, event source, and event retention for the devtools overlay. */
13
16
  export interface DevtoolsOverlayOptions {
14
17
  devtools?: Devtools | undefined;
15
18
  document?: Document | undefined;
16
19
  maxEvents?: number | undefined;
17
20
  }
18
21
 
22
+ /** Represents a mounted devtools overlay and its disposal handle. */
19
23
  export interface MountedDevtoolsOverlay {
20
24
  devtools: Devtools;
21
25
  dispose(): void;
@@ -36,6 +40,7 @@ const tabs: readonly TabDefinition[] = [
36
40
  const defaultMaxEvents = 200;
37
41
  const maxEventDetailsLength = 4_000;
38
42
 
43
+ /** Mounts a browser devtools overlay that groups recent mreact events by category. */
39
44
  export function mountDevtoolsOverlay(
40
45
  options: DevtoolsOverlayOptions = {},
41
46
  ): MountedDevtoolsOverlay {