Skip to content

Commit

Permalink
migrating reducer extension to new dynamic sdk
Browse files Browse the repository at this point in the history
  • Loading branch information
glekner committed Jan 20, 2021
1 parent bd1811e commit c501016
Show file tree
Hide file tree
Showing 18 changed files with 151 additions and 100 deletions.
7 changes: 7 additions & 0 deletions frontend/packages/console-app/console-extensions.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@
"kind": "DevWorkspace"
}
}
},
{
"type": "console.redux-reducer",
"properties": {
"scope": "console",
"reducer": { "$codeRef": "reducer" }
}
}
]
}
8 changes: 7 additions & 1 deletion frontend/packages/console-app/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,12 @@
"@console/topology": "0.0.0-fixed"
},
"consolePlugin": {
"entry": "src/plugin.tsx"
"entry": "src/plugin.tsx",
"exposedModules": {
"reducer": "src/redux/reducer.ts"
},
"dependencies": {
"@console/pluginAPI": "~0.0.1"
}
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
import * as _ from 'lodash';
import { testedExtensions } from '../plugin-test-utils';
import { isReduxReducer } from '@console/plugin-sdk';
import { isReduxReducer } from '@console/dynamic-plugin-sdk/src/extensions/redux';

describe('ReduxReducer', () => {
it('duplicate namespaces are not allowed', () => {
const reducers = testedExtensions.toArray().filter(isReduxReducer);
const dedupedReducers = _.uniqWith(
reducers,
(a, b) => a.properties.namespace === b.properties.namespace,
(a, b) => a.properties.scope === b.properties.scope,
);
const duplicateReducers = _.difference(reducers, dedupedReducers);

Expand Down
10 changes: 0 additions & 10 deletions frontend/packages/console-app/src/plugin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ import {
DashboardsOverviewHealthPrometheusSubsystem,
DashboardsOverviewInventoryItem,
DashboardsOverviewHealthOperator,
ReduxReducer,
ResourceDetailsPage,
ResourceListPage,
ResourceClusterNavItem,
Expand Down Expand Up @@ -45,7 +44,6 @@ import {
getClusterUpdateTimestamp,
isClusterUpdateActivity,
} from './components/dashboards-page/activity';
import reducer from './redux/reducer';
import * as models from './models';
import { TourContext, useTourValuesForContext } from './components/tour/tour-context';
import {
Expand All @@ -63,7 +61,6 @@ type ConsumedExtensions =
| DashboardsOverviewHealthPrometheusSubsystem
| DashboardsOverviewInventoryItem
| DashboardsOverviewHealthOperator<ClusterOperator>
| ReduxReducer
| ResourceListPage
| ResourceDetailsPage
| ResourceClusterNavItem
Expand Down Expand Up @@ -215,13 +212,6 @@ const plugin: Plugin<ConsumedExtensions> = [
).default,
},
},
{
type: 'ReduxReducer',
properties: {
namespace: 'console',
reducer,
},
},
{
type: 'NavItem/ResourceCluster',
properties: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,3 +122,33 @@ export const resolveCodeRefProperties = async <E extends Extension<P>, P = Exten

return resolvedValues;
};

/**
* Returns an extension with its resolved `CodeRef` properties.
*/
export const resolveExtensionWithCodeRefs = <E extends Extension<P>, P = ExtensionProperties<E>>(
ext: E,
): Promise<Extension<ResolvedCodeRefProperties<P>>> => {
const refProperties = filterExecutableCodeRefProperties(ext.properties);
const refPromises = Object.values(refProperties).map((ref) => ref());

return Promise.all(refPromises).then((properties) => {
const resolvedRefs: ResolvedCodeRefProperties<P> = Object.assign(
{},
...Object.keys(refProperties).map((key, i) => ({
[key]: properties[i],
})),
);

return Object.freeze(_.merge({}, ext, { properties: { ...resolvedRefs } }));
});
};

/**
* Returns an array extensions with their resolved `CodeRef` properties.
*/
export const resolveExtensionsArray = <E extends Extension<P>, P = ExtensionProperties<E>>(
extensions: E[],
): Promise<Extension<ResolvedCodeRefProperties<P>>[]> => {
return Promise.all(extensions.map((e) => resolveExtensionWithCodeRefs<E, P>(e)));
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Reducer } from 'redux';
import { Extension } from '@console/plugin-sdk/src/typings/base';
import { CodeRef, EncodedCodeRef, UpdateExtensionProperties } from '../types';

export namespace ExtensionProperties {
export type ReduxReducer = {
/** The key to represent the reducer-managed substate within the Redux state object. */
scope: string;
/** The reducer function, operating on the reducer-managed substate. */
reducer: EncodedCodeRef;
};
export type ReduxReducerCodeRefs = {
reducer: CodeRef<Reducer>;
};
}

// Extension types

export type ReduxReducer = Extension<ExtensionProperties.ReduxReducer> & {
type: 'console.redux-reducer';
};

export type ResolvedReduxReducer = UpdateExtensionProperties<
ReduxReducer,
ExtensionProperties.ReduxReducerCodeRefs
>;

// Type guards

export const isReduxReducer = (e: Extension): e is ResolvedReduxReducer =>
e.type === 'console.redux-reducer';
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { FeatureFlag, ModelFeatureFlag } from '../extensions/feature-flags';
import { ReduxReducer } from '../extensions/redux';

export type SupportedExtension = FeatureFlag | ModelFeatureFlag;
export type SupportedExtension = FeatureFlag | ModelFeatureFlag | ReduxReducer;

/**
* Schema of Console plugin's `console-extensions.json` file.
Expand Down
2 changes: 1 addition & 1 deletion frontend/packages/console-dynamic-plugin-sdk/src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export type CodeRef<T = any> = () => Promise<T>;
* Infer resolved `CodeRef` properties from object `O`.
*/
export type ResolvedCodeRefProperties<O extends {}> = {
[K in keyof O]: O[K] extends CodeRef<infer T> ? T : never;
[K in keyof O]: O[K] extends CodeRef<infer T> ? T : O[K];
};

/**
Expand Down
1 change: 0 additions & 1 deletion frontend/packages/console-plugin-sdk/src/typings/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ export * from './yaml-templates';
export * from './global-configs';
export * from './clusterserviceversions';
export * from './dev-catalog';
export * from './reducers';
export * from './horizontal-nav';
export * from './providers';
export * from './pvc';
Expand Down
19 changes: 0 additions & 19 deletions frontend/packages/console-plugin-sdk/src/typings/reducers.ts

This file was deleted.

13 changes: 12 additions & 1 deletion frontend/packages/kubevirt-plugin/console-extensions.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,15 @@
{
"$schema": "../console-dynamic-plugin-sdk/dist/schema/console-extensions.json",
"data": []
"data": [
{
"type": "console.redux-reducer",
"properties": {
"scope": "kubevirt",
"reducer": { "$codeRef": "redux" }
},
"flags": {
"required": ["KUBEVIRT"]
}
}
]
}
6 changes: 6 additions & 0 deletions frontend/packages/kubevirt-plugin/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,12 @@
"integration-tests/tests/vm.tab.snapshots.scenario.ts",
"integration-tests/tests/vmi.actions.scenario.ts"
]
},
"exposedModules": {
"redux": "src/redux/index.ts"
},
"dependencies": {
"@console/pluginAPI": "~0.0.1"
}
}
}
13 changes: 0 additions & 13 deletions frontend/packages/kubevirt-plugin/src/plugin.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import {
DashboardsOverviewHealthURLSubsystem,
DashboardsOverviewInventoryItem,
DashboardsInventoryItemGroup,
ReduxReducer,
ProjectDashboardInventoryItem,
DashboardsOverviewResourceActivity,
ContextProvider,
Expand All @@ -37,7 +36,6 @@ import {
getVMStatusGroups,
VMOffGroupIcon,
} from './components/dashboards-page/overview-dashboard/inventory';
import kubevirtReducer from './redux';
import { diskImportKindMapping } from './components/dashboards-page/overview-dashboard/utils';
import { TopologyConsumedExtensions, getTopologyPlugin } from './topology/topology-plugin';
import {
Expand All @@ -62,7 +60,6 @@ type ConsumedExtensions =
| DashboardsOverviewInventoryItem
| DashboardsInventoryItemGroup
| DashboardsStorageCapacityDropdownItem
| ReduxReducer
| ProjectDashboardInventoryItem
| DashboardsOverviewResourceActivity
| TopologyConsumedExtensions
Expand Down Expand Up @@ -374,16 +371,6 @@ const plugin: Plugin<ConsumedExtensions> = [
required: FLAG_KUBEVIRT,
},
},
{
type: 'ReduxReducer',
properties: {
namespace: 'kubevirt',
reducer: kubevirtReducer,
},
flags: {
required: [FLAG_KUBEVIRT],
},
},
{
type: 'Project/Dashboard/Inventory/Item',
properties: {
Expand Down
10 changes: 9 additions & 1 deletion frontend/packages/topology/console-extensions.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,12 @@
{
"$schema": "../console-dynamic-plugin-sdk/dist/schema/console-extensions.json",
"data": []
"data": [
{
"type": "console.redux-reducer",
"properties": {
"scope": "devconsole",
"reducer": { "$codeRef": "reducer.default" }
}
}
]
}
6 changes: 6 additions & 0 deletions frontend/packages/topology/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@
"topology": [
"integration-tests/**/*.scenario.ts"
]
},
"exposedModules": {
"reducer": "src/utils/reducer.ts"
},
"dependencies": {
"@console/pluginAPI": "~0.0.1"
}
}
}
11 changes: 1 addition & 10 deletions frontend/packages/topology/src/plugin.tsx
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
import * as _ from 'lodash';
import { Plugin, ReduxReducer, ModelDefinition, ModelFeatureFlag } from '@console/plugin-sdk';
import { Plugin, ModelDefinition, ModelFeatureFlag } from '@console/plugin-sdk';
import {
OperatorsTopologyConsumedExtensions,
operatorsTopologyPlugin,
} from './operators/operatorsTopologyPlugin';
import reducer from './utils/reducer';
import * as models from './models';
import { ServiceBindingModel } from './models/service-binding';
import { ALLOW_SERVICE_BINDING_FLAG } from './const';
Expand All @@ -14,7 +13,6 @@ import { TopologyDecoratorProvider } from './extensions';
type ConsumedExtensions =
| ModelDefinition
| ModelFeatureFlag
| ReduxReducer
| TopologyDecoratorProvider
| OperatorsTopologyConsumedExtensions;

Expand All @@ -32,13 +30,6 @@ const plugin: Plugin<ConsumedExtensions> = [
flag: ALLOW_SERVICE_BINDING_FLAG,
},
},
{
type: 'ReduxReducer',
properties: {
namespace: 'devconsole',
reducer,
},
},
...operatorsTopologyPlugin,
...defaultDecoratorsPlugin,
];
Expand Down
2 changes: 1 addition & 1 deletion frontend/packages/topology/src/redux/reducer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { Map } from 'immutable';
import { TopologyAction, Actions } from './action';
import { DEFAULT_TOPOLOGY_FILTERS } from '../filters/const';

export type State = Map<string, any>;
type State = Map<string, any>;

export default (state: State, action: TopologyAction) => {
if (!state) {
Expand Down

0 comments on commit c501016

Please sign in to comment.