Skip to content

Commit

Permalink
fix: added experimental plugin exports
Browse files Browse the repository at this point in the history
  • Loading branch information
chejimmy authored and corteggiano committed Nov 25, 2023
1 parent 9eb7dba commit 4e44dbd
Show file tree
Hide file tree
Showing 7 changed files with 66 additions and 43 deletions.
5 changes: 3 additions & 2 deletions packages/core/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,5 +25,6 @@ export const MINUTE_IN_MS = 60 * SECOND_IN_MS;
export const HOUR_IN_MS = 60 * MINUTE_IN_MS;
export const DAY_IN_MS = 24 * HOUR_IN_MS;

export type { Logger } from './logger/logger.interface';
export type { MetricsRecorder } from './metric-recorder/metricsRecorder.interface';
export type { Log, Logger } from './logger/logger.interface';
export type { Metric, MetricsRecorder } from './metricRecorder/metricsRecorder.interface';
export { registerPlugin, getPlugin } from './plugins/pluginsRegistry';
2 changes: 1 addition & 1 deletion packages/core/src/logger/logger.interface.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/**
* Log represents a single event message to record.
*/
type Log = {
export type Log = {
/**
* Additional contexts to include.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@
* metricValue: 2,
* };
*/
type Metric = {
export type Metric = {
/**
* Additional contexts to separate the metricName.
*/
Expand Down
2 changes: 1 addition & 1 deletion packages/core/src/plugins/loggerSettings.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import type { Logger } from '../logger/logger.interface';

export type LoggerSettings = { provider: () => Logger };
export type LoggerSettings = { provider: () => Logger | undefined };
4 changes: 2 additions & 2 deletions packages/core/src/plugins/metricsRecorderSettings.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
import type { MetricsRecorder } from '../metric-recorder/metricsRecorder.interface';
import type { MetricsRecorder } from '../metricRecorder/metricsRecorder.interface';

export type MetricsRecorderSettings = { provider: () => MetricsRecorder };
export type MetricsRecorderSettings = { provider: () => MetricsRecorder | undefined };
16 changes: 8 additions & 8 deletions packages/core/src/plugins/pluginsRegistry.spec.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { Logger } from '../logger/logger.interface';
import type { MetricsRecorder } from '../metric-recorder/metricsRecorder.interface';
import { getLogger, getMetricsRecorder, registerLogger, registerMetricsRecorder } from './pluginsRegistry';
import type { MetricsRecorder } from '../metricRecorder/metricsRecorder.interface';
import { registerPlugin, getPlugin } from './pluginsRegistry';

describe('Logger registry', () => {
class MockLogClient implements Logger {
Expand All @@ -10,7 +10,7 @@ describe('Logger registry', () => {
}

test('does not provide logger by default', () => {
const logger = getLogger();
const logger = getPlugin('logger');

expect(logger).toBeUndefined();
});
Expand All @@ -19,10 +19,10 @@ describe('Logger registry', () => {
const mockLogClient = new MockLogClient();
const mockProvider = jest.fn().mockReturnValue(mockLogClient);

registerLogger({
registerPlugin('logger', {
provider: mockProvider,
});
const logger = getLogger();
const logger = getPlugin('logger');

expect(logger).toBe(mockLogClient);
expect(mockProvider).toBeCalled();
Expand All @@ -35,7 +35,7 @@ describe('MetricsRecorder registry', () => {
}

test('does not provide MetricsRecorder by default', () => {
const metricsRecorder = getMetricsRecorder();
const metricsRecorder = getPlugin('metricsRecorder');

expect(metricsRecorder).toBeUndefined();
});
Expand All @@ -44,10 +44,10 @@ describe('MetricsRecorder registry', () => {
const mockMetricsRecorder = new MockMetricsRecorder();
const mockProvider = jest.fn().mockReturnValue(mockMetricsRecorder);

registerMetricsRecorder({
registerPlugin('metricsRecorder', {
provider: mockProvider,
});
const metricsRecorder = getMetricsRecorder();
const metricsRecorder = getPlugin('metricsRecorder');

expect(metricsRecorder).toBe(mockMetricsRecorder);
expect(mockProvider).toBeCalled();
Expand Down
78 changes: 50 additions & 28 deletions packages/core/src/plugins/pluginsRegistry.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,66 @@
import type { LoggerSettings } from './loggerSettings';
import type { MetricsRecorderSettings } from './metricsRecorderSettings';

interface PluginsRegistry {
logger: LoggerSettings;
metricsRecorder: MetricsRecorderSettings;
}

/**
* Internal object to hold all of the plugins.
*
* @emarks Not exported to encapsulate the registry
*/
const pluginsRegistry: {
loggerSettings?: LoggerSettings;
metricsRecorderSettings?: MetricsRecorderSettings;
} = {};

/**
* Register a Logger for logging AppKit logs.
* @param param0 settings for Logger
* @alpha
*/
export const registerLogger = (settings: LoggerSettings) => {
pluginsRegistry.loggerSettings = settings;
const pluginsRegistry: PluginsRegistry = {
logger: {
provider: () => undefined,
},
metricsRecorder: {
provider: () => undefined,
},
};

/**
* Return the registered Logger.
* @returns the registered Logger.
* @alpha
* Registers a plugin under a namespace.
* @param namespace the namespace to register the plugin
* @param pluginSetting the setting object of the plugin to register
*
* @example
* // example of a registration and usage of metricsRecorder plugin
* registerPlugin('metricsRecorder', {
* provider: () => ({
* // record and console log all metrics
* record: (metric) => {
* console.log(metric);
* },
* }),
* });
*/
export const getLogger = () => pluginsRegistry.loggerSettings?.provider();
export function registerPlugin<
Namespace extends keyof PluginsRegistry,
PluginSetting extends PluginsRegistry[Namespace]
>(namespace: Namespace, pluginSetting: PluginSetting): void {
pluginsRegistry[namespace] = pluginSetting;
}

/**
* Register a MetricsRecorder for recording AppKit metrics.
* @param param0 settings for MetricsRecorder
* @alpha
* Returns the plugin of the given namespace.
* @param namespace the namespace of the plugin to retrieve
* @returns the plugin matching the given namespace
*
* @example
* // example of getting metricsRecorder plugin
* const metricsRecorder = getPlugin('metricsRecorder');
*
* metricsRecorder?.record({
* metricName: 'test',
* metricValue: 123
* });
*/
export const registerMetricsRecorder = (settings: MetricsRecorderSettings) => {
pluginsRegistry.metricsRecorderSettings = settings;
};
export function getPlugin<Namespace extends keyof PluginsRegistry>(
namespace: Namespace
): ReturnType<PluginsRegistry[Namespace]['provider']> {
const plugin = pluginsRegistry[namespace].provider() as ReturnType<PluginsRegistry[Namespace]['provider']>;

/**
* Return the registered MetricsRecorder.
* @returns the registered MetricsRecorder.
* @alpha
*/
export const getMetricsRecorder = () => pluginsRegistry.metricsRecorderSettings?.provider();
return plugin;
}

0 comments on commit 4e44dbd

Please sign in to comment.