Skip to content

Commit

Permalink
Phase 1 of using OpenShift Dynamic Plugin SDK
Browse files Browse the repository at this point in the history
  • Loading branch information
vojtechszocs committed Oct 12, 2023
1 parent 50cac02 commit 96afc41
Show file tree
Hide file tree
Showing 37 changed files with 794 additions and 690 deletions.
4 changes: 2 additions & 2 deletions dynamic-demo-plugin/package.json
Expand Up @@ -38,8 +38,8 @@
"ts-loader": "9.x",
"ts-node": "5.0.1",
"typescript": "4.x",
"webpack": "^5.73.0",
"webpack-cli": "4.9.x"
"webpack": "5.75.0",
"webpack-cli": "5.0.x"
},
"consolePlugin": {
"name": "console-demo-plugin",
Expand Down
254 changes: 146 additions & 108 deletions dynamic-demo-plugin/yarn.lock

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion frontend/package.json
Expand Up @@ -11,7 +11,7 @@
"integration-tests"
],
"scripts": {
"postinstall": "yarn generate",
"postinstall": "# TODO yarn generate",
"clean": "rm -rf ./public/dist",
"dev": "yarn clean && yarn generate && REACT_REFRESH=true NODE_OPTIONS=--max-old-space-size=4096 yarn ts-node ./node_modules/.bin/webpack serve --mode=development --progress",
"dev-once": "yarn clean && yarn generate && NODE_OPTIONS=--max-old-space-size=4096 yarn ts-node ./node_modules/.bin/webpack --mode=development",
Expand Down
Expand Up @@ -105,7 +105,7 @@ const ConsolePluginsList: React.FC<ConsolePluginsListType> = ({ obj }) => {
return {
name: plugin.metadata.name,
version: plugin.metadata.version,
description: plugin.metadata?.description || placeholder,
description: plugin.metadata?.customProperties?.console?.description || placeholder,
enabled: plugin.enabled,
status: plugin.status,
};
Expand Down Expand Up @@ -148,7 +148,7 @@ const ConsolePluginsList: React.FC<ConsolePluginsListType> = ({ obj }) => {
return {
name: plugin?.metadata?.name,
version: loadedPluginInfo?.metadata?.version,
description: loadedPluginInfo?.metadata?.description,
description: loadedPluginInfo?.metadata?.customProperties?.console?.description,
enabled,
status: loadedPluginInfo?.status,
};
Expand Down
2 changes: 0 additions & 2 deletions frontend/packages/console-dynamic-plugin-sdk/README.md
Expand Up @@ -100,8 +100,6 @@ a [semver pre-release](https://semver.org/#spec-item-9) identifier, adapt your s
to include the relevant pre-release prefix, e.g. use `~4.11.0-0.ci` when targeting pre-release versions
like `4.11.0-0.ci-1234`.

See `ConsolePluginMetadata` type for details on the `consolePlugin` object and its schema.

## `console-extensions.json`

Declares all extensions contributed by the plugin.
Expand Down
3 changes: 2 additions & 1 deletion frontend/packages/console-dynamic-plugin-sdk/package.json
Expand Up @@ -17,12 +17,13 @@
},
"devDependencies": {
"@microsoft/tsdoc": "0.14.2",
"@openshift/dynamic-plugin-sdk-webpack": "file:/home/vszocs/work/openshift/dynamic-plugin-sdk/packages/lib-webpack",
"@types/ejs": "3.x",
"@types/fs-extra": "9.x",
"ejs": "3.x",
"fs-extra": "9.x",
"ts-json-schema-generator": "0.98.0",
"tsutils": "3.21.0",
"webpack": "^5.73.0"
"webpack": "5.75.0"
}
}
Expand Up @@ -17,10 +17,6 @@ type SchemaTypeConfig = {
};

const typeConfigs: SchemaTypeConfig[] = [
{
srcFile: 'src/schema/plugin-package.ts',
typeName: 'ConsolePluginMetadata',
},
{
srcFile: 'src/schema/console-extensions.ts',
typeName: 'ConsoleExtensionsJSON',
Expand All @@ -29,7 +25,6 @@ const typeConfigs: SchemaTypeConfig[] = [
{
srcFile: 'src/schema/plugin-manifest.ts',
typeName: 'ConsolePluginManifestJSON',
handleConsoleExtensions: true,
},
];

Expand Down
Expand Up @@ -149,7 +149,11 @@ export const getWebpackPackage: GetPackageDefinition = (
main: 'lib/lib-webpack.js',
...commonManifestFields,
dependencies: {
...parseDeps(sdkPackage, ['webpack'], missingDepCallback),
...parseDeps(
sdkPackage,
['@openshift/dynamic-plugin-sdk-webpack', 'webpack'],
missingDepCallback,
),
...parseDeps(
rootPackage,
['ajv', 'chalk', 'comment-json', 'find-up', 'read-pkg', 'semver'],
Expand Down
Expand Up @@ -14,18 +14,4 @@ describe('initSharedPluginModules', () => {
new Set(sharedPluginModules),
);
});

it('supports plugins built with an older version of plugin SDK', () => {
const [, entryModule] = getEntryModuleMocks({});
entryModule.override = jest.fn();

initSharedPluginModules(entryModule);

expect(entryModule.override).toHaveBeenCalledTimes(1);
expect(entryModule.init).not.toHaveBeenCalled();

expect(new Set(Object.keys(entryModule.override.mock.calls[0][0]))).toEqual(
new Set(sharedPluginModules),
);
});
});
53 changes: 53 additions & 0 deletions frontend/packages/console-dynamic-plugin-sdk/src/build-types.ts
@@ -0,0 +1,53 @@
import { PluginBuildMetadata, PluginManifest } from '@openshift/dynamic-plugin-sdk-webpack';

/**
* Additional plugin metadata supported by the Console application.
*/
export type ConsoleSupportedCustomProperties = Partial<{
/** User-friendly plugin name. */
displayName: string;

/** User-friendly plugin description. */
description: string;

/** Disable the given static plugins when this plugin gets loaded. */
disableStaticPlugins: string[];
}>;

/**
* Build-time Console dynamic plugin metadata.
*/
export type ConsolePluginBuildMetadata = PluginBuildMetadata & ConsoleSupportedCustomProperties;

/**
* Standard Console dynamic plugin manifest format.
*/
export type StandardConsolePluginManifest = {
customProperties?: {
console?: ConsoleSupportedCustomProperties;
[customNamespace: string]: unknown;
};
} & PluginManifest;

/**
* Legacy Console dynamic plugin manifest format.
*/
export type LegacyConsolePluginManifest = Pick<
PluginManifest,
'name' | 'version' | 'dependencies' | 'extensions'
> &
ConsoleSupportedCustomProperties;

/**
* This type supports both standard and legacy Console dynamic plugin manifest formats.
*
* Console application automatically adapts the manifest to standard format when loading
* the given plugin.
*/
export type AnyConsolePluginManifest = StandardConsolePluginManifest | LegacyConsolePluginManifest;

export const isStandardPluginManifest = (
m: AnyConsolePluginManifest,
): m is StandardConsolePluginManifest =>
// Standard plugin manifests must have a string valued baseURL property
m['baseURL'] && typeof m['baseURL'] === 'string';
@@ -1,7 +1,8 @@
/**
* @file Entrypoint for the `@openshift-console/dynamic-plugin-sdk-webpack` package published to npmjs.
*
* Provides webpack plugin `ConsoleRemotePlugin` used to build all dynamic plugin assets.
* Provides webpack plugin `ConsoleRemotePlugin` used to build all Console dynamic plugin assets.
*/

export { ConsoleRemotePlugin } from './webpack/ConsoleRemotePlugin';
export { ConsoleRemotePlugin, ConsoleRemotePluginOptions } from './webpack/ConsoleRemotePlugin';
export { ConsolePluginBuildMetadata } from './build-types';
@@ -1,7 +1,7 @@
import * as _ from 'lodash';
import * as pluginSubscriptionServiceModule from '@console/plugin-sdk/src/api/pluginSubscriptionService';
import { LoadedDynamicPluginInfo, NotLoadedDynamicPluginInfo } from '@console/plugin-sdk/src/store';
import { ConsolePluginManifestJSON } from '../../schema/plugin-manifest';
import { StandardConsolePluginManifest } from '../../build-types';
import { getPluginManifest } from '../../utils/test-utils';
import {
resolvePluginDependencies,
Expand All @@ -26,23 +26,23 @@ beforeEach(() => {

describe('resolvePluginDependencies', () => {
const getLoadedDynamicPluginInfo = (
manifest: ConsolePluginManifestJSON,
manifest: StandardConsolePluginManifest,
): LoadedDynamicPluginInfo => ({
status: 'Loaded',
pluginID: getPluginID(manifest),
metadata: _.pick(manifest, 'name', 'version', 'dependencies'),
metadata: _.omit(manifest, ['extensions', 'loadScripts', 'registrationMethod']),
enabled: true,
});

const getPendingDynamicPluginInfo = (
manifest: ConsolePluginManifestJSON,
manifest: StandardConsolePluginManifest,
): NotLoadedDynamicPluginInfo => ({
status: 'Pending',
pluginName: manifest.name,
});

const getFailedDynamicPluginInfo = (
manifest: ConsolePluginManifestJSON,
manifest: StandardConsolePluginManifest,
): NotLoadedDynamicPluginInfo => ({
status: 'Failed',
pluginName: manifest.name,
Expand Down

0 comments on commit 96afc41

Please sign in to comment.