Skip to content

Commit

Permalink
feat(debug): metadataRegistryEvents emitter
Browse files Browse the repository at this point in the history
  • Loading branch information
noomorph committed Mar 15, 2024
1 parent 54c251d commit 0f3552f
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 7 deletions.
8 changes: 4 additions & 4 deletions e2e/reporters/recorder.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class E2eRecorderReporter extends JestMetadataReporter {
_events = {};
_single = false;
_bail = false;
_countOfMetadataObjects = 0;

constructor(globalConfig) {
super(globalConfig);
Expand Down Expand Up @@ -44,6 +45,7 @@ class E2eRecorderReporter extends JestMetadataReporter {
};

#subscribeToMetadataEvents = () => {
debugUtils.metadataRegistryEvents.on('register_metadata', () => this._countOfMetadataObjects++);
if (PRESET.includes('no-env')) return;
debugUtils.events.on('*', this.#pushEvent);
};
Expand Down Expand Up @@ -83,11 +85,9 @@ class E2eRecorderReporter extends JestMetadataReporter {
fs.mkdirSync(path.dirname(fixturePath), { recursive: true });
fs.writeFileSync(fixturePath, contents + '\n');
}
}
}

function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
console.log('Total metadata objects:', this._countOfMetadataObjects);
}
}

module.exports = E2eRecorderReporter;
3 changes: 2 additions & 1 deletion package-e2e/test.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@ assert(typeof $Assign === 'function', 'jest-metadata should export $Assign funct
assert(typeof $Defaults === 'function', 'jest-metadata should export $Defaults function as a named export');
assert(typeof $Unshift === 'function', 'jest-metadata should export $Unshift function as a named export');

const { events } = require('jest-metadata/debug');
const { events, metadataRegistryEvents } = require('jest-metadata/debug');
assert(typeof events === 'object', 'jest-metadata/debug should export `events` object');
assert(typeof metadataRegistryEvents === 'object', 'jest-metadata/debug should export `metadataRegistryEvents` object');

const environmentListener = require('jest-metadata/environment-listener');
assert(typeof environmentListener === 'function', 'jest-metadata/environment-listener should export a class as its default export');
Expand Down
3 changes: 2 additions & 1 deletion package-e2e/test.mjs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from 'assert';
import { $Set, $Push, $Merge, $Assign, $Defaults, $Unshift, state, metadata } from 'jest-metadata';
import { events } from 'jest-metadata/debug';
import { events, metadataRegistryEvents } from 'jest-metadata/debug';
import JsdomTestEnvironment from 'jest-metadata/environment-jsdom';
import NodeTestEnvironment from 'jest-metadata/environment-node';
import environmentListener from 'jest-metadata/environment-listener';
Expand All @@ -16,6 +16,7 @@ assert(typeof $Defaults === 'function', 'jest-metadata should export `$Defaults`
assert(typeof $Unshift === 'function', 'jest-metadata should export `$Unshift` function as a named export');

assert(typeof events === 'object', 'jest-metadata/debug should export `events` object');
assert(typeof metadataRegistryEvents === 'object', 'jest-metadata/debug should export `metadataRegistryEvents` object');

assert(typeof environmentListener === 'function', 'jest-metadata/environment-listener should export a function as its default export');

Expand Down
7 changes: 6 additions & 1 deletion package-e2e/test.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { $Set, $Push, $Merge, $Assign, $Defaults, $Unshift, state, metadata } from 'jest-metadata';
import { events } from 'jest-metadata/debug';
import { events, metadataRegistryEvents } from 'jest-metadata/debug';
import type { GlobalMetadata, Metadata } from 'jest-metadata';
import JestMetadataReporter, { query, JestMetadataReporter as JestMetadataReporterNamed } from 'jest-metadata/reporter';
import JsdomTestEnvironment from 'jest-metadata/environment-jsdom';
Expand Down Expand Up @@ -56,6 +56,11 @@ events.on('test_start', (e) => assertType<string>(e.type));
events.on('test_started', (e) => assertType<string>(e.type));
events.on('test_todo', (e) => assertType<string>(e.type));

metadataRegistryEvents.on('register_metadata', (e) => {
assertType<'register_metadata'>(e.type);
assertType<unknown>(e.metadata.get());
});

assertType<Function>(JestMetadataReporter, JestMetadataReporterNamed);
assertType<object>(JestMetadataReporter.query, query);
assertType<Function>(query.globalMetadata);
Expand Down
2 changes: 2 additions & 0 deletions src/debug.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,5 @@ export function isFallback() {
}

export const events = realm.events;

export const metadataRegistryEvents = realm.metadataRegistry.events;
14 changes: 14 additions & 0 deletions src/metadata/registry/GlobalMetadataRegistry.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,25 @@
import type { ReadonlyEmitter } from '../../types';
import { SerialEmitter } from '../../utils';
import type { AggregatedIdentifier } from '../ids';
import type { Metadata } from '../types';

import type { FileMetadataRegistry } from './FileMetadataRegistry';
import { ScopedMetadataRegistry } from './ScopedMetadataRegistry';

export type MetadataRegisterEvent = {
type: 'register_metadata';
metadata: Metadata;
};

export class GlobalMetadataRegistry implements FileMetadataRegistry<AggregatedIdentifier> {
private readonly emitter = new SerialEmitter<MetadataRegisterEvent>('globalMetadataRegistry');
private readonly scopes: Record<string, ScopedMetadataRegistry> = {};
private readonly root = new ScopedMetadataRegistry('globalMetadata');

public get events(): ReadonlyEmitter<MetadataRegisterEvent> {
return this.emitter;
}

public get(scopedId: AggregatedIdentifier): Metadata {
const { testFilePath, identifier } = scopedId;
const registry = testFilePath ? this.scopes[testFilePath] : this.root;
Expand All @@ -20,6 +32,8 @@ export class GlobalMetadataRegistry implements FileMetadataRegistry<AggregatedId
}

public register(scopedId: AggregatedIdentifier, metadata: Metadata): void {
this.emitter.emit({ type: 'register_metadata', metadata });

const { testFilePath, identifier } = scopedId;
if (!testFilePath) {
return this.root.register(identifier, metadata);
Expand Down

0 comments on commit 0f3552f

Please sign in to comment.