UNPKG

@openshift-console/dynamic-plugin-sdk

Version:

Based on the concept of [webpack module federation](https://webpack.js.org/concepts/module-federation/), dynamic plugins are loaded and interpreted from remote sources at runtime. The standard way to deliver and expose dynamic plugins to Console is throug

108 lines (107 loc) 3.75 kB
/** * Console feature flags used to gate extension instances. */ export declare type ExtensionFlags = Partial<{ required: string[]; disallowed: string[]; }>; /** * TS type guard to narrow type of the given extension to `E`. */ export declare type ExtensionTypeGuard<E extends Extension> = (e: E) => e is E; /** * Runtime extension interface, exposing additional metadata. */ export declare type LoadedExtension<E extends Extension = Extension> = E & { pluginID: string; pluginName: string; uid: string; }; /** * An extension of the Console application. * * Each extension instance has a `type` and the corresponding parameters * represented by the `properties` object. * * Each extension may specify `flags` referencing Console feature flags which * are required and/or disallowed in order to put this extension into effect. */ export declare type Extension<P extends {} = any> = { type: string; properties: P; flags?: ExtensionFlags; }; /** * Declaration of Console extension type. */ export declare type ExtensionDeclaration<T extends string, P extends {}> = Extension<P> & { type: T; }; /** * Remote (i.e. webpack container) entry module interface. */ export declare type RemoteEntryModule = { /** * Get a module exposed through the container. * * Fails if the requested module doesn't exist in container. */ get: <T extends {}>(moduleName: string) => Promise<() => T>; init: (modules: any) => void; /** * For webpack 5.0.0-beta.16 * Override module(s) that were flagged by the container as "overridable". * * All modules exposed through the container will use the given replacement modules * instead of the container-local modules. If an override doesn't exist, all modules * of the container will use the container-local module implementation. */ override?: (modules: { [moduleName: string]: () => Promise<() => any>; }) => void; }; /** * Code reference, encoded as an object literal. * * The value of the `$codeRef` property should be formatted as `moduleName.exportName` * (referring to a named export) or `moduleName` (referring to the `default` export). */ export declare type EncodedCodeRef = { $codeRef: string; }; /** * Code reference, represented by a function that returns a promise for the object `T`. */ export declare type CodeRef<T = any> = () => Promise<T>; /** * Extract type `T` from `CodeRef<T>`. */ export declare type ExtractCodeRefType<R> = R extends CodeRef<infer T> ? T : never; /** * Infer resolved `CodeRef` properties from object `O` recursively. */ export declare type ResolvedCodeRefProperties<O extends {}> = { [K in keyof O]: O[K] extends CodeRef ? ExtractCodeRefType<O[K]> : ResolvedCodeRefProperties<O[K]>; }; /** * Update existing properties of object `O` with ones declared in object `U`. */ export declare type Update<O extends {}, U extends {}> = { [K in keyof O]: K extends keyof U ? U[K] : O[K]; } & {}; /** * Infer the properties of extension `E`. */ export declare type ExtensionProperties<E> = E extends Extension<infer P> ? P : never; /** * Update existing properties of extension `E` with ones declared in object `U`. */ export declare type UpdateExtensionProperties<E extends Extension<P>, U extends {}, P = ExtensionProperties<E>> = Update<E, { properties: Update<P, U>; }>; /** * Update `CodeRef` properties of extension `E` to the referenced object types. * * This also coerces `E` type to `LoadedExtension` interface for runtime consumption. */ export declare type ResolvedExtension<E extends Extension<P>, P = ExtensionProperties<E>> = LoadedExtension<UpdateExtensionProperties<E, ResolvedCodeRefProperties<P>, P>>;