From 79590b6a24618ae9f4b4254f7a7457035f351884 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sat, 10 Jan 2026 01:49:49 +0100 Subject: [PATCH 1/3] feat: add performance type extensions --- packages/utils/src/perf_hooks.d.ts | 60 +++++++++++++++++++++ packages/utils/src/perf_hooks.type.ts | 76 +++++++++++++++++++++++++++ packages/utils/tsconfig.lib.json | 2 +- packages/utils/tsconfig.test.json | 3 +- 4 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 packages/utils/src/perf_hooks.d.ts create mode 100644 packages/utils/src/perf_hooks.type.ts diff --git a/packages/utils/src/perf_hooks.d.ts b/packages/utils/src/perf_hooks.d.ts new file mode 100644 index 000000000..abc873751 --- /dev/null +++ b/packages/utils/src/perf_hooks.d.ts @@ -0,0 +1,60 @@ +// perf_hooks.d.ts - Custom type definitions for performance.mark() and performance.measure() +import type { + MarkOptions, + MeasureOptions, + Performance, + PerformanceMark, + PerformanceMarkOptions, + PerformanceMeasure, + PerformanceMeasureOptions, +} from 'node:perf_hooks'; +import type { + MarkOptionsWithDevtools, + MarkerPayload, + MeasureOptionsWithDevtools, + TrackEntryPayload, + WithDevToolsPayload, +} from './lib/user-timing-extensibility-api.type'; + +export {}; + +type DetailPayloadWithDevtools = WithDevToolsPayload< + TrackEntryPayload | MarkerPayload +>; + +declare module 'node:perf_hooks' { + export interface PerformanceMarkOptions { + detail?: DetailPayloadWithDevtools; + startTime?: DOMHighResTimeStamp; + } + + export interface PerformanceMeasureOptions { + detail?: DetailPayloadWithDevtools; + start?: string | number; + end?: string | number; + duration?: number; + } + + const performance: { + mark( + name: string, + options?: { + detail?: DetailPayloadWithDevtools; + }, + ): PerformanceMark; + + measure( + name: string, + startOrOptions?: + | string + | number + | { + detail?: DetailPayloadWithDevtools; + start?: string | number; + end?: string | number; + duration?: number; + }, + end?: string | number, + ): PerformanceMeasure; + }; +} diff --git a/packages/utils/src/perf_hooks.type.ts b/packages/utils/src/perf_hooks.type.ts new file mode 100644 index 000000000..fb50c1fdd --- /dev/null +++ b/packages/utils/src/perf_hooks.type.ts @@ -0,0 +1,76 @@ +import { type PerformanceMarkOptions, performance } from 'node:perf_hooks'; +import { describe, expectTypeOf, it } from 'vitest'; + +describe('perf_hooks.type', () => { + it('PerformanceMarkOptions should be type safe', () => { + expectTypeOf<{ + startTime: number; + detail: { + devtools: { + dataType: 'marker'; + color: 'error'; + }; + }; + }>().toMatchTypeOf(); + + expectTypeOf<{ + startTime: number; + detail: { + devtools: { + dataType: 'markerr'; + }; + }; + }>().not.toMatchTypeOf(); + }); + + it('perf_hooks.mark should be type safe', () => { + performance.mark('name', { + detail: { + devtools: { + dataType: 'marker', + color: 'error', + }, + }, + }); + + performance.mark('name', { + detail: { + devtools: { + /* @ts-expect-error - dataType should be marker | track */ + dataType: 'markerrr', + color: 'error', + }, + }, + }); + }); + + it('PerformanceMeasureOptions should be type safe', () => { + expectTypeOf<{ + start: string; + end: string; + detail: { + devtools: { + dataType: 'track-entry'; + track: 'test-track'; + color: 'primary'; + }; + }; + }>().toMatchTypeOf(); + }); + + it('perf_hooks.measure should be type safe', () => { + performance.measure('measure-name', 'start-mark', 'end-mark'); + + performance.measure('measure-name', { + start: 'start-mark', + end: 'end-mark', + detail: { + /* @ts-expect-error - track is required */ + devtools: { + dataType: 'track-entry', + color: 'primary', + }, + }, + }); + }); +}); diff --git a/packages/utils/tsconfig.lib.json b/packages/utils/tsconfig.lib.json index 17dadcedf..973149960 100644 --- a/packages/utils/tsconfig.lib.json +++ b/packages/utils/tsconfig.lib.json @@ -5,7 +5,7 @@ "declaration": true, "types": ["node"] }, - "include": ["src/**/*.ts"], + "include": ["src/**/*.{ts,d.ts}"], "exclude": [ "vitest.unit.config.ts", "vitest.int.config.ts", diff --git a/packages/utils/tsconfig.test.json b/packages/utils/tsconfig.test.json index 54cacd82f..65a45077f 100644 --- a/packages/utils/tsconfig.test.json +++ b/packages/utils/tsconfig.test.json @@ -13,6 +13,7 @@ "src/**/*.test.js", "src/**/*.test.jsx", "src/**/*.d.ts", - "../../testing/test-setup/src/vitest.d.ts" + "../../testing/test-setup/src/vitest.d.ts", + "src/perf_hooks.type.ts" ] } From 70ad6cdd453d771039f2716ed958aae54916bd9f Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 12 Jan 2026 02:59:49 +0100 Subject: [PATCH 2/3] fix: wip --- packages/utils/src/perf_hooks.d.ts | 12 ------------ .../{perf_hooks.type.ts => perf_hooks.type.test.ts} | 0 2 files changed, 12 deletions(-) rename packages/utils/src/{perf_hooks.type.ts => perf_hooks.type.test.ts} (100%) diff --git a/packages/utils/src/perf_hooks.d.ts b/packages/utils/src/perf_hooks.d.ts index abc873751..e3bf6fb1a 100644 --- a/packages/utils/src/perf_hooks.d.ts +++ b/packages/utils/src/perf_hooks.d.ts @@ -1,17 +1,5 @@ -// perf_hooks.d.ts - Custom type definitions for performance.mark() and performance.measure() import type { - MarkOptions, - MeasureOptions, - Performance, - PerformanceMark, - PerformanceMarkOptions, - PerformanceMeasure, - PerformanceMeasureOptions, -} from 'node:perf_hooks'; -import type { - MarkOptionsWithDevtools, MarkerPayload, - MeasureOptionsWithDevtools, TrackEntryPayload, WithDevToolsPayload, } from './lib/user-timing-extensibility-api.type'; diff --git a/packages/utils/src/perf_hooks.type.ts b/packages/utils/src/perf_hooks.type.test.ts similarity index 100% rename from packages/utils/src/perf_hooks.type.ts rename to packages/utils/src/perf_hooks.type.test.ts From 5f1c67a8a12693741876e7debd39c6efba989991 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 12 Jan 2026 16:03:45 +0100 Subject: [PATCH 3/3] fix: wip --- packages/utils/tsconfig.test.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/utils/tsconfig.test.json b/packages/utils/tsconfig.test.json index 65a45077f..54cacd82f 100644 --- a/packages/utils/tsconfig.test.json +++ b/packages/utils/tsconfig.test.json @@ -13,7 +13,6 @@ "src/**/*.test.js", "src/**/*.test.jsx", "src/**/*.d.ts", - "../../testing/test-setup/src/vitest.d.ts", - "src/perf_hooks.type.ts" + "../../testing/test-setup/src/vitest.d.ts" ] }