@openshift-console/dynamic-plugin-sdk
Advanced tools
Comparing version 1.1.0 to 1.2.0
@@ -1206,2 +1206,3 @@ # OpenShift Console API | ||
| `timeout` | The timeout in milliseconds | | ||
| `isEntireResponse` | The flag to control whether to return the entire content of the response or response body. The default is the response body. | | ||
@@ -1212,3 +1213,3 @@ | ||
A promise that resolves to the response as JSON object. | ||
A promise that resolves to the response as text, response JSON object or entire content of the HTTP response. | ||
@@ -1234,2 +1235,3 @@ | ||
| `timeout` | The timeout in milliseconds | | ||
| `isEntireResponse` | The flag to control whether to return the entire content of the response or response body. The default is the response body. | | ||
@@ -1240,3 +1242,3 @@ | ||
A promise that resolves to the response as text. | ||
A promise that resolves to the response as text, response JSON object or entire content of the HTTP response. | ||
@@ -1957,2 +1959,3 @@ | ||
| `onSave` | Callback for the Save button. Passing it will override the default update performed on the resource by the editor. | | ||
| `readOnly` | Sets the YAML editor to read-only mode. | | ||
@@ -2264,3 +2267,3 @@ | ||
const { t } = useTranslation(); | ||
const launchAnnotationsModal = useAnnotationsModal<PodKind>(pod); | ||
const launchAnnotationsModal = useAnnotationsModal(pod); | ||
return <button onClick={launchAnnotationsModal}>{t('Edit Pod Annotations')}</button> | ||
@@ -2303,3 +2306,3 @@ } | ||
const { t } = useTranslation(); | ||
const launchDeleteModal = useDeleteModal<PodKind>(pod); | ||
const launchDeleteModal = useDeleteModal(pod); | ||
return <button onClick={launchDeleteModal}>{t('Delete Pod')}</button> | ||
@@ -2346,3 +2349,3 @@ } | ||
const { t } = useTranslation(); | ||
const launchLabelsModal = useLabelsModal<PodKind>(pod); | ||
const launchLabelsModal = useLabelsModal(pod); | ||
return <button onClick={launchLabelsModal}>{t('Edit Pod Labels')}</button> | ||
@@ -2349,0 +2352,0 @@ } |
@@ -533,2 +533,3 @@ import * as React from 'react'; | ||
* @param {ResourceYAMLEditorProps['onSave']} onSave - Callback for the Save button. Passing it will override the default update performed on the resource by the editor. | ||
* @param {ResourceYAMLEditorProps['readOnly']} readOnly - Sets the YAML editor to read-only mode. | ||
*/ | ||
@@ -679,3 +680,3 @@ export declare const ResourceYAMLEditor: React.FC<ResourceYAMLEditorProps>; | ||
* const { t } = useTranslation(); | ||
* const launchAnnotationsModal = useAnnotationsModal<PodKind>(pod); | ||
* const launchAnnotationsModal = useAnnotationsModal(pod); | ||
* return <button onClick={launchAnnotationsModal}>{t('Edit Pod Annotations')}</button> | ||
@@ -699,3 +700,3 @@ * } | ||
* const { t } = useTranslation(); | ||
* const launchDeleteModal = useDeleteModal<PodKind>(pod); | ||
* const launchDeleteModal = useDeleteModal(pod); | ||
* return <button onClick={launchDeleteModal}>{t('Delete Pod')}</button> | ||
@@ -715,3 +716,3 @@ * } | ||
* const { t } = useTranslation(); | ||
* const launchLabelsModal = useLabelsModal<PodKind>(pod); | ||
* const launchLabelsModal = useLabelsModal(pod); | ||
* return <button onClick={launchLabelsModal}>{t('Edit Pod Labels')}</button> | ||
@@ -718,0 +719,0 @@ * } |
@@ -553,2 +553,3 @@ export * from '../app/components'; | ||
* @param {ResourceYAMLEditorProps['onSave']} onSave - Callback for the Save button. Passing it will override the default update performed on the resource by the editor. | ||
* @param {ResourceYAMLEditorProps['readOnly']} readOnly - Sets the YAML editor to read-only mode. | ||
*/ | ||
@@ -710,3 +711,3 @@ export const ResourceYAMLEditor = require('@console/internal/components/AsyncResourceYAMLEditor') | ||
* const { t } = useTranslation(); | ||
* const launchAnnotationsModal = useAnnotationsModal<PodKind>(pod); | ||
* const launchAnnotationsModal = useAnnotationsModal(pod); | ||
* return <button onClick={launchAnnotationsModal}>{t('Edit Pod Annotations')}</button> | ||
@@ -731,3 +732,3 @@ * } | ||
* const { t } = useTranslation(); | ||
* const launchDeleteModal = useDeleteModal<PodKind>(pod); | ||
* const launchDeleteModal = useDeleteModal(pod); | ||
* return <button onClick={launchDeleteModal}>{t('Delete Pod')}</button> | ||
@@ -748,3 +749,3 @@ * } | ||
* const { t } = useTranslation(); | ||
* const launchLabelsModal = useLabelsModal<PodKind>(pod); | ||
* const launchLabelsModal = useLabelsModal(pod); | ||
* return <button onClick={launchLabelsModal}>{t('Edit Pod Labels')}</button> | ||
@@ -751,0 +752,0 @@ * } |
@@ -217,11 +217,11 @@ import * as React from 'react'; | ||
export declare type UseResolvedExtensions = <E extends Extension>(...typeGuards: ExtensionTypeGuard<E>[]) => [ResolvedExtension<E>[], boolean, any[]]; | ||
export declare type ConsoleFetch = (url: string, options?: RequestInit, timeout?: number) => Promise<Response>; | ||
export declare type ConsoleFetch = (url: string, options?: RequestInit, timeout?: number, isEntireResponse?: boolean) => Promise<Response>; | ||
export declare type ConsoleFetchJSON<T = any> = { | ||
(url: string, method?: string, options?: RequestInit, timeout?: number): Promise<T>; | ||
(url: string, method?: string, options?: RequestInit, timeout?: number, isEntireResponse?: boolean): Promise<T>; | ||
delete(url: string, json?: any, options?: RequestInit, timeout?: number): Promise<T>; | ||
post(url: string, json: any, options?: RequestInit, timeout?: number): Promise<T>; | ||
put(url: string, json: any, options?: RequestInit, timeout?: number): Promise<T>; | ||
patch(url: string, json: any, options?: RequestInit, timeout?: number): Promise<T>; | ||
post(url: string, json: any, options?: RequestInit, timeout?: number, isEntireResponse?: boolean): Promise<T>; | ||
put(url: string, json: any, options?: RequestInit, timeout?: number, isEntireResponse?: boolean): Promise<T>; | ||
patch(url: string, json: any, options?: RequestInit, timeout?: number, isEntireResponse?: boolean): Promise<T>; | ||
}; | ||
export declare type ConsoleFetchText = (...args: Parameters<ConsoleFetch>) => Promise<string>; | ||
export declare type ConsoleFetchText<T = any> = (...args: Parameters<ConsoleFetch>) => Promise<T>; | ||
export declare type NavPage = { | ||
@@ -532,2 +532,3 @@ href?: string; | ||
onSave?: (content: string) => void; | ||
readOnly?: boolean; | ||
}; | ||
@@ -534,0 +535,0 @@ export declare type ResourceEventStreamProps = { |
@@ -21,3 +21,4 @@ import 'whatwg-fetch'; | ||
* @param timeout The timeout in milliseconds | ||
* @returns A promise that resolves to the response as JSON object. | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response as text, response JSON object or entire content of the HTTP response. | ||
*/ | ||
@@ -33,4 +34,5 @@ export declare const consoleFetchJSON: ConsoleFetchJSON; | ||
* @param timeout The timeout in milliseconds | ||
* @returns A promise that resolves to the response as text. | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response as text, response JSON object or entire content of the HTTP response. | ||
*/ | ||
export declare const consoleFetchText: ConsoleFetchText; |
@@ -33,7 +33,3 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
}); | ||
const consoleFetchCommon = (url, method = 'GET', options = {}, timeout) => __awaiter(void 0, void 0, void 0, function* () { | ||
const headers = getConsoleRequestHeaders(); | ||
// Pass headers last to let callers to override Accept. | ||
const allOptions = _.defaultsDeep({ method }, options, { headers }); | ||
const response = yield consoleFetch(url, allOptions, timeout); | ||
const parseData = (response) => __awaiter(void 0, void 0, void 0, function* () { | ||
const text = yield response.text(); | ||
@@ -46,2 +42,9 @@ const isPlainText = response.headers.get('Content-Type') === 'text/plain'; | ||
}); | ||
const consoleFetchCommon = (url, method = 'GET', options = {}, timeout, isEntireResponse) => __awaiter(void 0, void 0, void 0, function* () { | ||
const headers = getConsoleRequestHeaders(); | ||
// Pass headers last to let callers to override Accept. | ||
const allOptions = _.defaultsDeep({ method }, options, { headers }); | ||
const response = yield consoleFetch(url, allOptions, timeout); | ||
return isEntireResponse ? response : parseData(response); | ||
}); | ||
/** | ||
@@ -56,9 +59,10 @@ * A custom wrapper around `fetch` that adds console-specific headers and allows for retries and timeouts. | ||
* @param timeout The timeout in milliseconds | ||
* @returns A promise that resolves to the response as JSON object. | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response as text, response JSON object or entire content of the HTTP response. | ||
*/ | ||
export const consoleFetchJSON = (url, method = 'GET', options = {}, timeout) => { | ||
export const consoleFetchJSON = (url, method = 'GET', options = {}, timeout, isEntireResponse) => { | ||
const allOptions = _.defaultsDeep({}, options, { | ||
headers: { Accept: 'application/json' }, | ||
}); | ||
return consoleFetchCommon(url, method, allOptions, timeout); | ||
return consoleFetchCommon(url, method, allOptions, timeout, isEntireResponse); | ||
}; | ||
@@ -73,8 +77,9 @@ /** | ||
* @param timeout The timeout in milliseconds | ||
* @returns A promise that resolves to the response as text. | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response as text, response JSON object or entire content of the HTTP response. | ||
*/ | ||
export const consoleFetchText = (url, options = {}, timeout) => { | ||
return consoleFetchCommon(url, 'GET', options, timeout); | ||
export const consoleFetchText = (url, options = {}, timeout, isEntireResponse) => { | ||
return consoleFetchCommon(url, 'GET', options, timeout, isEntireResponse); | ||
}; | ||
const consoleFetchSendJSON = (url, method, json = null, options = {}, timeout) => { | ||
const consoleFetchSendJSON = (url, method, json = null, options = {}, timeout, isEntireResponse) => { | ||
const allOptions = { | ||
@@ -89,3 +94,3 @@ headers: { | ||
} | ||
return consoleFetchJSON(url, method, _.defaultsDeep(allOptions, options), timeout); | ||
return consoleFetchJSON(url, method, _.defaultsDeep(allOptions, options), timeout, isEntireResponse); | ||
}; | ||
@@ -112,4 +117,5 @@ /** | ||
* @param timeout The timeout in milliseconds | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
*/ | ||
consoleFetchJSON.post = (url, json, options = {}, timeout) => consoleFetchSendJSON(url, 'POST', json, options, timeout); | ||
consoleFetchJSON.post = (url, json, options = {}, timeout, isEntireResponse) => consoleFetchSendJSON(url, 'POST', json, options, timeout, isEntireResponse); | ||
/** | ||
@@ -122,4 +128,5 @@ * A custom PUT method of consoleFetchJSON. | ||
* @param timeout The timeout in milliseconds | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
*/ | ||
consoleFetchJSON.put = (url, json, options = {}, timeout) => consoleFetchSendJSON(url, 'PUT', json, options, timeout); | ||
consoleFetchJSON.put = (url, json, options = {}, timeout, isEntireResponse) => consoleFetchSendJSON(url, 'PUT', json, options, timeout, isEntireResponse); | ||
/** | ||
@@ -132,4 +139,5 @@ * A custom PATCH method of consoleFetchJSON. | ||
* @param timeout The timeout in milliseconds | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
*/ | ||
consoleFetchJSON.patch = (url, json, options = {}, timeout) => consoleFetchSendJSON(url, 'PATCH', json, options, timeout); | ||
consoleFetchJSON.patch = (url, json, options = {}, timeout, isEntireResponse) => consoleFetchSendJSON(url, 'PATCH', json, options, timeout, isEntireResponse); | ||
//# sourceMappingURL=console-fetch.js.map |
@@ -0,1 +1,7 @@ | ||
/** | ||
* Wait until internal models (CRDs) are loaded. | ||
* | ||
* Note: When loading is 'in flight' (in progress) when the component | ||
* that uses this hook is mounted, this hook waits until this is resolved, too. | ||
*/ | ||
export declare const useModelsLoaded: () => boolean; |
@@ -5,7 +5,13 @@ import * as React from 'react'; | ||
import { useSelector } from 'react-redux'; | ||
/** | ||
* Wait until internal models (CRDs) are loaded. | ||
* | ||
* Note: When loading is 'in flight' (in progress) when the component | ||
* that uses this hook is mounted, this hook waits until this is resolved, too. | ||
*/ | ||
export const useModelsLoaded = () => { | ||
const ref = React.useRef(false); | ||
const k8sModels = useSelector(({ k8s }) => k8s.getIn(['RESOURCES', 'models'])); | ||
const loaded = useSelector(({ k8s }) => k8s.getIn(['RESOURCES', 'loaded'])); | ||
const inFlight = useSelector(({ k8s }) => k8s.getIn(['RESOURCES', 'inFlight'])); | ||
if (!ref.current && k8sModels.size && !inFlight) { | ||
if (!ref.current && loaded && !inFlight) { | ||
ref.current = true; | ||
@@ -12,0 +18,0 @@ } |
@@ -19,2 +19,3 @@ import { K8sModel } from '../../api/common-types'; | ||
* @param requestInit The fetch init object to use. This can have request headers, method, redirect, etc. | ||
* @param isEntireResponse The flag to cotrol whether to return full or partial response. The default is partial. | ||
* See more at https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html | ||
@@ -49,6 +50,7 @@ * @returns A promise that resolves to the response as JSON object with a resource if the name is provided | ||
* @param opts The options to pass. | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response of the resource created. | ||
* In case of failure promise gets rejected with HTTP error response. | ||
*/ | ||
export declare const k8sCreate: <R extends K8sResourceCommon>(model: K8sModel, data: R, opts?: Options) => Promise<any>; | ||
export declare const k8sCreate: <R extends K8sResourceCommon>(model: K8sModel, data: R, opts?: Options, isEntireResponse?: boolean) => Promise<any>; | ||
declare type OptionsCreate<R> = BaseOptions & { | ||
@@ -80,6 +82,7 @@ model: K8sModel; | ||
* @param opts The options to pass | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response of the resource updated. | ||
* In case of failure promise gets rejected with HTTP error response. | ||
*/ | ||
export declare const k8sUpdate: <R extends K8sResourceCommon>(model: K8sModel, data: R, ns?: string, name?: string, opts?: Options) => Promise<R>; | ||
export declare const k8sUpdate: <R extends K8sResourceCommon>(model: K8sModel, data: R, ns?: string, name?: string, opts?: Options, isEntireResponse?: boolean) => Promise<R>; | ||
declare type OptionsUpdate<R> = BaseOptions & { | ||
@@ -115,6 +118,7 @@ model: K8sModel; | ||
* @param opts The options to pass | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response of the resource patched. | ||
* In case of failure promise gets rejected with HTTP error response. | ||
*/ | ||
export declare const k8sPatch: <R extends K8sResourceCommon>(model: K8sModel, resource: R, data: Patch[], opts?: Options) => Promise<any>; | ||
export declare const k8sPatch: <R extends K8sResourceCommon>(model: K8sModel, resource: R, data: Patch[], opts?: Options, isEntireResponse?: boolean) => Promise<any>; | ||
declare type OptionsPatch<R> = BaseOptions & { | ||
@@ -121,0 +125,0 @@ model: K8sModel; |
@@ -32,2 +32,3 @@ import * as _ from 'lodash'; | ||
* @param requestInit The fetch init object to use. This can have request headers, method, redirect, etc. | ||
* @param isEntireResponse The flag to cotrol whether to return full or partial response. The default is partial. | ||
* See more at https://microsoft.github.io/PowerBI-JavaScript/interfaces/_node_modules_typedoc_node_modules_typescript_lib_lib_dom_d_.requestinit.html | ||
@@ -63,8 +64,9 @@ * @returns A promise that resolves to the response as JSON object with a resource if the name is provided | ||
* @param opts The options to pass. | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response of the resource created. | ||
* In case of failure promise gets rejected with HTTP error response. | ||
*/ | ||
export const k8sCreate = (model, data, opts = {}) => { | ||
export const k8sCreate = (model, data, opts = {}, isEntireResponse) => { | ||
var _a; | ||
return coFetchJSON.post(resourceURL(model, Object.assign({ ns: (_a = data === null || data === void 0 ? void 0 : data.metadata) === null || _a === void 0 ? void 0 : _a.namespace }, opts)), data, null, null); | ||
return coFetchJSON.post(resourceURL(model, Object.assign({ ns: (_a = data === null || data === void 0 ? void 0 : data.metadata) === null || _a === void 0 ? void 0 : _a.namespace }, opts)), data, null, null, isEntireResponse); | ||
}; | ||
@@ -96,8 +98,9 @@ /** | ||
* @param opts The options to pass | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response of the resource updated. | ||
* In case of failure promise gets rejected with HTTP error response. | ||
*/ | ||
export const k8sUpdate = (model, data, ns, name, opts) => { | ||
export const k8sUpdate = (model, data, ns, name, opts, isEntireResponse) => { | ||
var _a, _b; | ||
return coFetchJSON.put(resourceURL(model, Object.assign({ ns: ns || ((_a = data.metadata) === null || _a === void 0 ? void 0 : _a.namespace), name: name || ((_b = data.metadata) === null || _b === void 0 ? void 0 : _b.name) }, opts)), data, null, null); | ||
return coFetchJSON.put(resourceURL(model, Object.assign({ ns: ns || ((_a = data.metadata) === null || _a === void 0 ? void 0 : _a.namespace), name: name || ((_b = data.metadata) === null || _b === void 0 ? void 0 : _b.name) }, opts)), data, null, null, isEntireResponse); | ||
}; | ||
@@ -135,6 +138,7 @@ /** | ||
* @param opts The options to pass | ||
* @param isEntireResponse The flag to control whether to return the entire content of the response or response body. The default is the response body. | ||
* @returns A promise that resolves to the response of the resource patched. | ||
* In case of failure promise gets rejected with HTTP error response. | ||
*/ | ||
export const k8sPatch = (model, resource, data, opts = {}) => { | ||
export const k8sPatch = (model, resource, data, opts = {}, isEntireResponse) => { | ||
const patches = _.compact(data); | ||
@@ -147,3 +151,3 @@ if (_.isEmpty(patches)) { | ||
name: resource.metadata.name, | ||
}, opts)), patches, null, null); | ||
}, opts)), patches, null, null, isEntireResponse); | ||
}; | ||
@@ -150,0 +154,0 @@ /** |
{ | ||
"name": "@openshift-console/dynamic-plugin-sdk", | ||
"version": "1.1.0", | ||
"version": "1.2.0", | ||
"main": "lib/lib-core.js", | ||
@@ -5,0 +5,0 @@ "license": "Apache-2.0", |
@@ -106,2 +106,17 @@ # OpenShift Console Dynamic Plugins | ||
### Changes in shared modules | ||
This section documents notable changes in the Console provided shared modules across Console versions. | ||
#### Console 4.14.x | ||
- Added `react-router-dom-v5-compat` to allow plugins to migrate to React Router v6. Check the | ||
[Official v5 to v6 Migration Guide](https://github.com/remix-run/react-router/discussions/8753) | ||
(section "Migration Strategy" and beyond) for details. | ||
#### Console 4.15.x | ||
- The Console application now uses React Router v6 code internally. Plugins that only target OpenShift | ||
Console 4.15 or later should fully upgrade to React Router v6 via `react-router-dom-v5-compat`. | ||
### PatternFly dynamic modules | ||
@@ -287,15 +302,54 @@ | ||
## Plugin development | ||
## Local plugin development | ||
Run Bridge locally and instruct it to proxy e.g. `/api/plugins/console-demo-plugin` requests directly | ||
to your local plugin asset server (web server hosting the plugin's generated assets): | ||
Clone Console repo and build the Bridge server by running `build-backend.sh` script. | ||
Run the following commands to log in as `kubeadmin` user and start a local Bridge server instance. | ||
The `-plugins` argument tells Bridge to force load your plugin upon Console application startup. | ||
The `-i18n-namespaces` argument registers the corresponding i18n namespace for your plugin in Console. | ||
```sh | ||
# Note that the plugin's base URL should have a trailing slash | ||
./bin/bridge -plugins console-demo-plugin=http://localhost:9001/ | ||
oc login https://example.openshift.com:6443 -u kubeadmin -p example-password | ||
source ./contrib/oc-environment.sh | ||
# Note: the plugin web server URL should include a trailing slash | ||
./bin/bridge -plugins foo-plugin=http://localhost:9001/ -i18n-namespaces=plugin__foo-plugin | ||
``` | ||
Your plugin should start loading automatically upon Console application startup. Inspect the value of | ||
`window.SERVER_FLAGS.consolePlugins` to see the list of plugins which Console loads upon its startup. | ||
To work with multiple plugins, provide multiple arguments to Bridge server: | ||
```sh | ||
./bin/bridge \ | ||
-plugins foo-plugin=http://localhost:9001/ -i18n-namespaces=plugin__foo-plugin \ | ||
-plugins bar-plugin=http://localhost:9002/ -i18n-namespaces=plugin__bar-plugin | ||
``` | ||
Once the Bridge server is running, start your plugin web server(s), and ensure that plugin assets can | ||
be fetched via `/api/plugins/<plugin-name>` Bridge endpoint. For example, the following URLs should | ||
provide the same content: | ||
- http://localhost:9000/api/plugins/foo-plugin/plugin-manifest.json | ||
- http://localhost:9001/plugin-manifest.json | ||
Open the Console in your web browser and inspect the value of `window.SERVER_FLAGS.consolePlugins` to see the | ||
list of dynamic plugins the Console loads at runtime. For local development, this should only | ||
include plugin(s) listed via `-plugins` Bridge argument. | ||
### Using local Console plugin SDK code | ||
If you need to make modifications to Console dynamic plugin SDK code and reflect them in your | ||
plugin builds, follow these steps: | ||
1. Make changes in Console repo. Run `yarn build` in `frontend/packages/console-dynamic-plugin-sdk` | ||
directory to rebuild plugin SDK files at `frontend/packages/console-dynamic-plugin-sdk/dist`. | ||
2. Make sure your plugin's `package.json` dependencies refer to local plugin SDK files, for example: | ||
```json | ||
"@openshift-console/dynamic-plugin-sdk": "file:../openshift/console/frontend/packages/console-dynamic-plugin-sdk/dist/core", | ||
"@openshift-console/dynamic-plugin-sdk-webpack": "file:../openshift/console/frontend/packages/console-dynamic-plugin-sdk/dist/webpack", | ||
``` | ||
3. Refresh your plugin's `node_modules` whenever you change local plugin SDK files: | ||
```sh | ||
rm -rf node_modules/@openshift-console && yarn --check-files | ||
``` | ||
4. Build your plugin as usual. The build should now use the current local plugin SDK files. | ||
## Plugin detection and management | ||
@@ -302,0 +356,0 @@ |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
627801
8546
420