From 79590b6a24618ae9f4b4254f7a7457035f351884 Mon Sep 17 00:00:00 2001 From: John Doe Date: Sat, 10 Jan 2026 01:49:49 +0100 Subject: [PATCH 1/5] 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/5] 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/5] 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" ] } From c95589d4049e284ac61f88a99d7b13b29f1c90f7 Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 12 Jan 2026 19:16:54 +0100 Subject: [PATCH 4/5] refactor: fix lint --- .../src/{perf_hooks.d.ts => perf-hooks.d.ts} | 17 ++--------------- ...oks.type.test.ts => perf-hooks.unit.test.ts} | 3 +-- 2 files changed, 3 insertions(+), 17 deletions(-) rename packages/utils/src/{perf_hooks.d.ts => perf-hooks.d.ts} (65%) rename packages/utils/src/{perf_hooks.type.test.ts => perf-hooks.unit.test.ts} (97%) diff --git a/packages/utils/src/perf_hooks.d.ts b/packages/utils/src/perf-hooks.d.ts similarity index 65% rename from packages/utils/src/perf_hooks.d.ts rename to packages/utils/src/perf-hooks.d.ts index e3bf6fb1a..cf32771fb 100644 --- a/packages/utils/src/perf_hooks.d.ts +++ b/packages/utils/src/perf-hooks.d.ts @@ -24,24 +24,11 @@ declare module 'node:perf_hooks' { } const performance: { - mark( - name: string, - options?: { - detail?: DetailPayloadWithDevtools; - }, - ): PerformanceMark; + mark(name: string, options?: PerformanceMarkOptions): PerformanceMark; measure( name: string, - startOrOptions?: - | string - | number - | { - detail?: DetailPayloadWithDevtools; - start?: string | number; - end?: string | number; - duration?: number; - }, + startOrOptions?: string | number | PerformanceMeasureOptions, end?: string | number, ): PerformanceMeasure; }; diff --git a/packages/utils/src/perf_hooks.type.test.ts b/packages/utils/src/perf-hooks.unit.test.ts similarity index 97% rename from packages/utils/src/perf_hooks.type.test.ts rename to packages/utils/src/perf-hooks.unit.test.ts index fb50c1fdd..b8245d0b4 100644 --- a/packages/utils/src/perf_hooks.type.test.ts +++ b/packages/utils/src/perf-hooks.unit.test.ts @@ -1,7 +1,7 @@ import { type PerformanceMarkOptions, performance } from 'node:perf_hooks'; import { describe, expectTypeOf, it } from 'vitest'; -describe('perf_hooks.type', () => { +describe('perf-hooks definitions', () => { it('PerformanceMarkOptions should be type safe', () => { expectTypeOf<{ startTime: number; @@ -12,7 +12,6 @@ describe('perf_hooks.type', () => { }; }; }>().toMatchTypeOf(); - expectTypeOf<{ startTime: number; detail: { From 5d779e8ed8b417a276fc1d70bfd83a36775105dc Mon Sep 17 00:00:00 2001 From: John Doe Date: Mon, 12 Jan 2026 19:22:20 +0100 Subject: [PATCH 5/5] refactor: revert ts cfg --- packages/utils/tsconfig.lib.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/utils/tsconfig.lib.json b/packages/utils/tsconfig.lib.json index 973149960..17dadcedf 100644 --- a/packages/utils/tsconfig.lib.json +++ b/packages/utils/tsconfig.lib.json @@ -5,7 +5,7 @@ "declaration": true, "types": ["node"] }, - "include": ["src/**/*.{ts,d.ts}"], + "include": ["src/**/*.ts"], "exclude": [ "vitest.unit.config.ts", "vitest.int.config.ts",