@pokujs/dom 1.0.1 → 1.1.1

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.
@@ -0,0 +1,114 @@
1
+ import { getQueriesForElement } from '@testing-library/dom';
2
+ export const getNow = typeof performance !== 'undefined' && typeof performance.now === 'function'
3
+ ? performance.now.bind(performance)
4
+ : Date.now.bind(Date);
5
+ const getMetricsRuntimeState = (stateKey) => {
6
+ const stateGlobal = globalThis;
7
+ if (!stateGlobal[stateKey]) {
8
+ stateGlobal[stateKey] = {
9
+ metricBuffer: [],
10
+ metricFlushTimer: undefined,
11
+ metricsChannelClosed: false,
12
+ listenersRegistered: false,
13
+ };
14
+ }
15
+ return stateGlobal[stateKey];
16
+ };
17
+ export const createRenderMetricsEmitter = (options) => {
18
+ const { runtimeOptions, metricsStateKey, metricsBatchMessageType } = options;
19
+ const metricsState = getMetricsRuntimeState(metricsStateKey);
20
+ const clearMetricFlushTimer = () => {
21
+ if (!metricsState.metricFlushTimer)
22
+ return;
23
+ clearTimeout(metricsState.metricFlushTimer);
24
+ metricsState.metricFlushTimer = undefined;
25
+ };
26
+ const flushMetricBuffer = () => {
27
+ if (!runtimeOptions.metricsEnabled || typeof process.send !== 'function') {
28
+ return;
29
+ }
30
+ if (process.connected === false) {
31
+ metricsState.metricBuffer.length = 0;
32
+ metricsState.metricsChannelClosed = true;
33
+ return;
34
+ }
35
+ if (metricsState.metricsChannelClosed ||
36
+ metricsState.metricBuffer.length === 0) {
37
+ return;
38
+ }
39
+ const payload = metricsState.metricBuffer.splice(0, metricsState.metricBuffer.length);
40
+ try {
41
+ process.send({
42
+ type: metricsBatchMessageType,
43
+ metrics: payload,
44
+ });
45
+ }
46
+ catch {
47
+ metricsState.metricsChannelClosed = true;
48
+ metricsState.metricBuffer.length = 0;
49
+ }
50
+ };
51
+ const scheduleMetricFlush = () => {
52
+ if (metricsState.metricFlushTimer)
53
+ return;
54
+ metricsState.metricFlushTimer = setTimeout(() => {
55
+ metricsState.metricFlushTimer = undefined;
56
+ flushMetricBuffer();
57
+ }, runtimeOptions.metricFlushMs);
58
+ metricsState.metricFlushTimer.unref?.();
59
+ };
60
+ if (runtimeOptions.metricsEnabled && !metricsState.listenersRegistered) {
61
+ metricsState.listenersRegistered = true;
62
+ process.on('beforeExit', () => {
63
+ clearMetricFlushTimer();
64
+ flushMetricBuffer();
65
+ });
66
+ process.on('disconnect', () => {
67
+ clearMetricFlushTimer();
68
+ metricsState.metricBuffer.length = 0;
69
+ metricsState.metricsChannelClosed = true;
70
+ });
71
+ }
72
+ const emitRenderMetric = (componentName, durationMs) => {
73
+ if (!runtimeOptions.metricsEnabled ||
74
+ typeof process.send !== 'function') {
75
+ return;
76
+ }
77
+ if (process.connected === false || metricsState.metricsChannelClosed) {
78
+ metricsState.metricBuffer.length = 0;
79
+ metricsState.metricsChannelClosed = true;
80
+ clearMetricFlushTimer();
81
+ return;
82
+ }
83
+ const safeDuration = Number.isFinite(durationMs) && durationMs >= 0 ? durationMs : 0;
84
+ if (safeDuration < runtimeOptions.minMetricMs)
85
+ return;
86
+ metricsState.metricBuffer.push({
87
+ componentName,
88
+ durationMs: safeDuration,
89
+ });
90
+ if (metricsState.metricBuffer.length >= runtimeOptions.metricBatchSize) {
91
+ clearMetricFlushTimer();
92
+ flushMetricBuffer();
93
+ return;
94
+ }
95
+ scheduleMetricFlush();
96
+ };
97
+ return {
98
+ emitRenderMetric,
99
+ flushMetricBuffer,
100
+ clearMetricFlushTimer,
101
+ };
102
+ };
103
+ export const createScreen = () => {
104
+ return new Proxy({}, {
105
+ get(_target, prop) {
106
+ const baseScreenQueries = getQueriesForElement(document.body);
107
+ const value = Reflect.get(baseScreenQueries, prop, baseScreenQueries);
108
+ return typeof value === 'function'
109
+ ? value.bind(baseScreenQueries)
110
+ : value;
111
+ },
112
+ });
113
+ };
114
+ //# sourceMappingURL=testing-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"testing-core.js","sourceRoot":"","sources":["../src/testing-core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,62 @@
1
+ export type DomAdapter = 'happy-dom' | 'jsdom' | {
2
+ setupModule: string;
3
+ };
4
+ export type RenderMetric = {
5
+ file: string;
6
+ componentName: string;
7
+ durationMs: number;
8
+ };
9
+ export type MetricsSummary = {
10
+ totalCaptured: number;
11
+ totalReported: number;
12
+ topSlowest: RenderMetric[];
13
+ };
14
+ export type MetricsOptions = {
15
+ enabled?: boolean;
16
+ topN?: number;
17
+ minDurationMs?: number;
18
+ reporter?: (summary: MetricsSummary) => void;
19
+ };
20
+ export type TestingPluginOptions = {
21
+ dom?: DomAdapter;
22
+ domUrl?: string;
23
+ metrics?: boolean | MetricsOptions;
24
+ };
25
+ export type NormalizedMetricsOptions = {
26
+ enabled: boolean;
27
+ topN: number;
28
+ minDurationMs: number;
29
+ reporter?: (summary: MetricsSummary) => void;
30
+ };
31
+ export type RuntimeOptionArgPrefixes = {
32
+ metrics: string;
33
+ minMetricMs: string;
34
+ domUrl: string;
35
+ metricBatchSize: string;
36
+ metricFlushMs: string;
37
+ };
38
+ export type RuntimeOptions = {
39
+ domUrl: string;
40
+ metricsEnabled: boolean;
41
+ minMetricMs: number;
42
+ metricBatchSize: number;
43
+ metricFlushMs: number;
44
+ };
45
+ export type FrameworkDescriptor = {
46
+ pluginName: string;
47
+ packageTag: string;
48
+ runtimeArgBase: string;
49
+ metricMessageType: string;
50
+ metricBatchMessageType: string;
51
+ testFileExtensions?: string[];
52
+ commandBuilder?: (input: {
53
+ runtime: string;
54
+ command: string[];
55
+ file: string;
56
+ domSetupPath: string;
57
+ runtimeOptionArgs: string[];
58
+ }) => {
59
+ shouldHandle: boolean;
60
+ command: string[];
61
+ };
62
+ };
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pokujs/dom",
3
- "version": "1.0.1",
3
+ "version": "1.1.1",
4
4
  "private": false,
5
5
  "description": "Shared DOM testing core for Poku framework adapters.",
6
6
  "type": "module",
@@ -25,10 +25,16 @@
25
25
  "scripts": {
26
26
  "test": "npm run test:node",
27
27
  "test:node": "node --import=tsx ./node_modules/poku/lib/bin/index.js tests --showLogs",
28
+ "test:node:none": "node --import=tsx ./node_modules/poku/lib/bin/index.js tests --showLogs --isolation=none",
29
+ "test:node:process": "node --import=tsx ./node_modules/poku/lib/bin/index.js tests --showLogs --isolation=process",
28
30
  "test:bun": "bun ./node_modules/poku/lib/bin/index.js tests --showLogs",
31
+ "test:bun:none": "bun ./node_modules/poku/lib/bin/index.js tests --showLogs --isolation=none",
32
+ "test:bun:process": "bun ./node_modules/poku/lib/bin/index.js tests --showLogs --isolation=process",
29
33
  "test:deno": "deno run -A npm:poku tests --showLogs",
34
+ "test:deno:none": "deno run -A npm:poku tests --showLogs --isolation=none",
35
+ "test:deno:process": "deno run -A npm:poku tests --showLogs --isolation=process",
30
36
  "clean": "rimraf dist",
31
- "build": "tsup src/index.ts --format esm --dts --target node20 --sourcemap --clean --tsconfig tsconfig.tsup.json",
37
+ "build": "npm run clean && tsc -p tsconfig.dist.json",
32
38
  "typecheck": "tsc -p tsconfig.build.json --noEmit",
33
39
  "lint": "npm run typecheck",
34
40
  "check": "npm run typecheck && npm test",
@@ -56,15 +62,11 @@
56
62
  "provenance": true
57
63
  },
58
64
  "peerDependencies": {
59
- "@happy-dom/global-registrator": ">=20",
60
65
  "happy-dom": ">=20",
61
66
  "jsdom": ">=22",
62
67
  "poku": ">=4.1.0"
63
68
  },
64
69
  "peerDependenciesMeta": {
65
- "@happy-dom/global-registrator": {
66
- "optional": true
67
- },
68
70
  "happy-dom": {
69
71
  "optional": true
70
72
  },
@@ -84,7 +86,6 @@
84
86
  "jsdom": "^26.1.0",
85
87
  "poku": "4.2.0",
86
88
  "rimraf": "^6.0.1",
87
- "tsup": "^8.5.0",
88
89
  "tsx": "^4.21.0",
89
90
  "typescript": "^6.0.2"
90
91
  }