Skip to content

Commit

Permalink
refactor(plugins): Extract registration of extensions to its own file.
Browse files Browse the repository at this point in the history
- add tests.
- move the IDeckPlugin interface
- remove IPluginManifest interface
  • Loading branch information
christopherthielen authored and mergify[bot] committed Apr 21, 2020
1 parent f227aa8 commit 9c27a93
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 25 deletions.
20 changes: 20 additions & 0 deletions app/scripts/modules/core/src/plugins/deck.plugin.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { registerPluginExtensions } from './deck.plugin';
import { Registry } from '../registry';

describe('deck plugin registerPluginExtensions', () => {
it('should register stages', async () => {
const registerSpy = spyOn(Registry.pipeline, 'registerStage');
const stage = { key: 'test' };
registerPluginExtensions({ stages: [stage] });
expect(registerSpy).toHaveBeenCalledTimes(1);
expect(registerSpy).toHaveBeenCalledWith(stage);
});

it('should register preconfigured job stages', async () => {
const registerSpy = spyOn(Registry.pipeline, 'registerPreconfiguredJobStage');
const stage = { key: 'test' };
registerPluginExtensions({ preconfiguredJobStages: [stage] });
expect(registerSpy).toHaveBeenCalledTimes(1);
expect(registerSpy).toHaveBeenCalledWith(stage);
});
});
22 changes: 22 additions & 0 deletions app/scripts/modules/core/src/plugins/deck.plugin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { IStageTypeConfig } from 'core/domain';
import { Registry } from 'core/registry';
import { SearchResultType } from 'core/search';

export interface IDeckPlugin {
stages?: IStageTypeConfig[];
preconfiguredJobStages?: IStageTypeConfig[];
helpContents?: { [helpKey: string]: string };
searchResultTypes?: SearchResultType[];

initialize?(): void;
}

/** Given a plugin, registers the plugin's extensions */
export function registerPluginExtensions(plugin: IDeckPlugin) {
// Register the plugin's extensions with deck.
plugin.stages?.forEach(stage => Registry.pipeline.registerStage(stage));
plugin.preconfiguredJobStages?.forEach(stage => Registry.pipeline.registerPreconfiguredJobStage(stage));

// Run code that currently does not have an extension point
plugin.initialize?.();
}
1 change: 1 addition & 0 deletions app/scripts/modules/core/src/plugins/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
export * from './deck.plugin';
export * from './plugin.module';
export * from './plugin.registry';
5 changes: 3 additions & 2 deletions app/scripts/modules/core/src/plugins/plugin.registry.spec.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import { IStageTypeConfig } from 'core/domain';
import { IDeckPlugin } from './deck.plugin';
import { API } from '../api';
import { IDeckPlugin, IPluginManifest, IPluginMetaData, PluginRegistry } from './plugin.registry';
import { IPluginMetaData, PluginRegistry } from './plugin.registry';
import { Registry } from 'core/registry';
import { mock } from 'angular';

type TestPluginRegistry = PluginRegistry & {
load(pluginManifestData: IPluginManifest): Promise<any>;
load(pluginMetaData: IPluginMetaData): Promise<any>;
loadModuleFromUrl(url: string): Promise<any>;
};

Expand Down
29 changes: 6 additions & 23 deletions app/scripts/modules/core/src/plugins/plugin.registry.ts
Original file line number Diff line number Diff line change
@@ -1,18 +1,8 @@
import { API } from 'core/api';
import { Registry } from 'core/registry';
import { IStageTypeConfig } from 'core/domain';
import { $http } from 'ngimport';
import { API } from 'core/api';
import { registerPluginExtensions, IDeckPlugin } from './deck.plugin';

export interface IDeckPlugin {
stages?: IStageTypeConfig[];
preconfiguredJobStages?: IStageTypeConfig[];
initialize?(): void;
}

export interface IPluginManifest {
plugins: IPluginMetaData[];
}

/** The shape of plugin metadata objects in plugin-manifest.json */
export interface IPluginMetaData {
id?: string;
/** @deprecated use `id` instead */
Expand Down Expand Up @@ -126,8 +116,8 @@ export class PluginRegistry {
/**
* Loads plugin manifests from Gate and from `/plugin-manifest.json` in the deck resources
*
* plugin-manifest.json should contain an array of IPluginManifest(s) exported as `plugin`, i.e.,
* export const plugins = [{ 'name': 'myPlugin', 'version': '1.2.3', 'devUrl': '/plugins/index.js' }]
* plugin-manifest.json should contain an array of IPluginMetaData objects, i.e.,
* [{ 'name': 'myPlugin', 'version': '1.2.3', 'url': '/plugins/index.js' }]
*/
public async loadPluginManifest(
source: ISource,
Expand Down Expand Up @@ -166,14 +156,7 @@ export class PluginRegistry {
);
}

const plugin: IDeckPlugin = module.plugin;

// Register extensions with deck.
plugin.stages?.forEach(stage => Registry.pipeline.registerStage(stage));
plugin.preconfiguredJobStages?.forEach(stage => Registry.pipeline.registerPreconfiguredJobStage(stage));

// Run code that currently does not have an extension point
plugin.initialize?.();
registerPluginExtensions(module.plugin as IDeckPlugin);

return module;
} catch (error) {
Expand Down

0 comments on commit 9c27a93

Please sign in to comment.