react-cosmos-core 6.0.0-alpha.9 → 6.0.0-canary.03b80da.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/fixtureTree/createFixtureTree/createRawFixtureTree.js +3 -8
- package/dist/fixtureTree/flattenFixtureTree.js +3 -3
- package/dist/fixtureTree/types.d.ts +3 -3
- package/dist/index.d.ts +6 -6
- package/dist/index.js +6 -6
- package/dist/renderer/DecoratedFixture.d.ts +13 -0
- package/dist/renderer/DecoratedFixture.js +33 -0
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/index.d.ts +1 -1
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/useFixtureState.d.ts +1 -1
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/useFixtureState.js +5 -5
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/useReadClassState.d.ts +1 -1
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/useReadClassState.js +4 -4
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/index.d.ts +1 -1
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/props/index.d.ts +1 -1
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/props/index.js +5 -5
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/props/useFixtureProps.d.ts +1 -1
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/props/useFixtureProps.js +3 -3
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/findElementPaths.js +1 -1
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/getElementAtPath.js +1 -1
- package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/setElementAtPath.js +1 -1
- package/dist/renderer/FixtureConnect.d.ts +16 -0
- package/dist/renderer/FixtureConnect.js +25 -0
- package/dist/renderer/FixtureLoader.d.ts +17 -0
- package/dist/renderer/FixtureLoader.js +16 -0
- package/dist/renderer/FixtureStateChangeResponse.d.ts +11 -0
- package/dist/renderer/FixtureStateChangeResponse.js +34 -0
- package/dist/renderer/LazyFixtureListItemUpdate.d.ts +10 -0
- package/dist/renderer/LazyFixtureListItemUpdate.js +15 -0
- package/dist/renderer/LazyFixtureLoader.d.ts +20 -0
- package/dist/renderer/LazyFixtureLoader.js +22 -0
- package/dist/renderer/{FixtureLoader/postMessage.d.ts → createPostMessageConnect.d.ts} +1 -1
- package/dist/renderer/{FixtureLoader/postMessage.js → createPostMessageConnect.js} +1 -1
- package/dist/renderer/{FixtureLoader/webSockets.d.ts → createWebSocketsConnect.d.ts} +1 -1
- package/dist/renderer/{FixtureLoader/webSockets.js → createWebSocketsConnect.js} +1 -1
- package/dist/renderer/{FixtureLoader/getDecoratedFixtureElement → getDecoratedFixtureElement}/index.d.ts +1 -1
- package/dist/renderer/{FixtureLoader/fixtureHelpers.d.ts → getFixture.d.ts} +1 -1
- package/dist/renderer/{FixtureLoader/fixtureHelpers.js → getFixture.js} +3 -2
- package/dist/renderer/getFixtureList.d.ts +5 -6
- package/dist/renderer/getFixtureList.js +12 -7
- package/dist/renderer/getSortedDecoratorsForFixturePath.d.ts +2 -2
- package/dist/renderer/isMultiFixture.d.ts +1 -1
- package/dist/renderer/{types.d.ts → rendererConnectTypes.d.ts} +10 -2
- package/dist/renderer/useFixtureModules.d.ts +2 -0
- package/dist/renderer/useFixtureModules.js +10 -0
- package/dist/renderer/useLazyFixtureModules.d.ts +2 -0
- package/dist/renderer/useLazyFixtureModules.js +24 -0
- package/dist/renderer/useRendererRequest.d.ts +5 -0
- package/dist/renderer/useRendererRequest.js +81 -0
- package/dist/renderer/useRendererResponse.d.ts +4 -0
- package/dist/renderer/useRendererResponse.js +23 -0
- package/dist/renderer/useSelectedFixture.d.ts +14 -0
- package/dist/renderer/useSelectedFixture.js +31 -0
- package/dist/renderer/userModuleTypes.d.ts +49 -0
- package/dist/server/cosmosPluginConfig.d.ts +2 -4
- package/package.json +2 -2
- package/dist/renderer/FixtureLoader/FixtureLoader.d.ts +0 -52
- package/dist/renderer/FixtureLoader/FixtureLoader.js +0 -226
- package/dist/renderer/FixtureLoader/FixtureProvider.d.ts +0 -18
- package/dist/renderer/FixtureLoader/FixtureProvider.js +0 -18
- package/dist/renderer/reactTypes.d.ts +0 -28
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/decorateFixtureRefs/index.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/decorateFixtureRefs/index.js +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/decorateFixtureRefs/isRefSupported.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/decorateFixtureRefs/isRefSupported.js +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/index.js +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/shared.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/classState/shared.js +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/index.js +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/findRelevantElementPaths.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/findRelevantElementPaths.js +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/findElementPaths.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/getElementAtPath.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/index.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/index.js +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/setElementAtPath.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/shared.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/FixtureCapture → FixtureCapture}/shared/nodeTree/shared.js +0 -0
- /package/dist/renderer/{FixtureLoader/getDecoratedFixtureElement → getDecoratedFixtureElement}/FixtureElement.d.ts +0 -0
- /package/dist/renderer/{FixtureLoader/getDecoratedFixtureElement → getDecoratedFixtureElement}/FixtureElement.js +0 -0
- /package/dist/renderer/{FixtureLoader/getDecoratedFixtureElement → getDecoratedFixtureElement}/index.js +0 -0
- /package/dist/renderer/{reactTypes.js → rendererConnectTypes.js} +0 -0
- /package/dist/renderer/{types.js → userModuleTypes.js} +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { FixtureId, FixtureList, FixtureListItem } from '../fixture/types.js';
|
|
1
2
|
import { FixtureState } from '../fixtureState/types.js';
|
|
2
|
-
import { FixtureId, FixtureList } from '../fixture/types.js';
|
|
3
3
|
export type RendererId = string;
|
|
4
4
|
export type PingRenderersRequest = {
|
|
5
5
|
type: 'pingRenderers';
|
|
@@ -48,6 +48,14 @@ export type FixtureListUpdateResponse = {
|
|
|
48
48
|
fixtures: FixtureList;
|
|
49
49
|
};
|
|
50
50
|
};
|
|
51
|
+
export type FixtureListItemUpdateResponse = {
|
|
52
|
+
type: 'fixtureListItemUpdate';
|
|
53
|
+
payload: {
|
|
54
|
+
rendererId: RendererId;
|
|
55
|
+
fixturePath: string;
|
|
56
|
+
fixtureItem: FixtureListItem;
|
|
57
|
+
};
|
|
58
|
+
};
|
|
51
59
|
export type FixtureStateChangeResponse = {
|
|
52
60
|
type: 'fixtureStateChange';
|
|
53
61
|
payload: {
|
|
@@ -62,7 +70,7 @@ export type PlaygroundCommandResponse = {
|
|
|
62
70
|
command: string;
|
|
63
71
|
};
|
|
64
72
|
};
|
|
65
|
-
export type RendererResponse = RendererReadyResponse | RendererErrorResponse | FixtureListUpdateResponse | FixtureStateChangeResponse | PlaygroundCommandResponse;
|
|
73
|
+
export type RendererResponse = RendererReadyResponse | RendererErrorResponse | FixtureListUpdateResponse | FixtureListItemUpdateResponse | FixtureStateChangeResponse | PlaygroundCommandResponse;
|
|
66
74
|
export type RendererConnect<Request = RendererRequest, Response = RendererResponse> = {
|
|
67
75
|
postMessage: (msg: Response) => unknown;
|
|
68
76
|
onMessage(handler: (msg: Request) => unknown): () => unknown;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { useMemo } from 'react';
|
|
2
|
+
export function useFixtureModules(fixturePath, fixtureWrapper, decoratorWrappers) {
|
|
3
|
+
return useMemo(() => {
|
|
4
|
+
return {
|
|
5
|
+
fixturePath,
|
|
6
|
+
fixtureModule: fixtureWrapper.module,
|
|
7
|
+
decoratorModules: decoratorWrappers.map(d => d.module),
|
|
8
|
+
};
|
|
9
|
+
}, [decoratorWrappers, fixturePath, fixtureWrapper]);
|
|
10
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import { FixtureModules, LazyReactDecoratorWrapper, LazyReactFixtureWrapper } from './userModuleTypes.js';
|
|
2
|
+
export declare function useLazyFixtureModules(fixturePath: string, fixtureWrapper: LazyReactFixtureWrapper, decoratorWrappers: LazyReactDecoratorWrapper[]): FixtureModules | null;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { useEffect, useState } from 'react';
|
|
2
|
+
export function useLazyFixtureModules(fixturePath, fixtureWrapper, decoratorWrappers) {
|
|
3
|
+
const [modules, setModules] = useState(null);
|
|
4
|
+
useEffect(() => {
|
|
5
|
+
let canceled = false;
|
|
6
|
+
(async () => {
|
|
7
|
+
const fixtureModule = await fixtureWrapper.getModule();
|
|
8
|
+
const decoratorModules = await Promise.all(decoratorWrappers.map(d => d.getModule()));
|
|
9
|
+
if (!canceled) {
|
|
10
|
+
setModules({
|
|
11
|
+
fixturePath,
|
|
12
|
+
fixtureModule,
|
|
13
|
+
decoratorModules,
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
})();
|
|
17
|
+
return () => {
|
|
18
|
+
canceled = true;
|
|
19
|
+
};
|
|
20
|
+
}, [decoratorWrappers, fixturePath, fixtureWrapper]);
|
|
21
|
+
// Stop returning modules once fixturePath changed to prevent rendering
|
|
22
|
+
// the previous fixture until the new fixture modules are loaded
|
|
23
|
+
return modules && modules.fixturePath === fixturePath ? modules : null;
|
|
24
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { Dispatch, SetStateAction } from 'react';
|
|
2
|
+
import { RendererConnect } from './rendererConnectTypes.js';
|
|
3
|
+
import { UserModuleWrappers } from './userModuleTypes.js';
|
|
4
|
+
import { SelectedFixture } from './useSelectedFixture.js';
|
|
5
|
+
export declare function useRendererRequest(rendererId: string, rendererConnect: RendererConnect, moduleWrappers: UserModuleWrappers, setSelectedFixture: Dispatch<SetStateAction<SelectedFixture | null>>, onErrorReset?: () => unknown): void;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { isEqual } from 'lodash-es';
|
|
2
|
+
import { useEffect } from 'react';
|
|
3
|
+
import { getFixtureListFromWrappers } from './getFixtureList.js';
|
|
4
|
+
export function useRendererRequest(rendererId, rendererConnect, moduleWrappers, setSelectedFixture, onErrorReset) {
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
function postReadyState() {
|
|
7
|
+
const fixtures = getFixtureListFromWrappers(moduleWrappers);
|
|
8
|
+
rendererConnect.postMessage({
|
|
9
|
+
type: 'rendererReady',
|
|
10
|
+
payload: { rendererId, fixtures },
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
function fireChangeCallback() {
|
|
14
|
+
if (typeof onErrorReset === 'function') {
|
|
15
|
+
onErrorReset();
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function handleSelectFixtureRequest({ payload }) {
|
|
19
|
+
const { fixtureId, fixtureState } = payload;
|
|
20
|
+
setSelectedFixture(prev => {
|
|
21
|
+
return {
|
|
22
|
+
fixtureId,
|
|
23
|
+
fixtureState,
|
|
24
|
+
syncedFixtureState: fixtureState,
|
|
25
|
+
renderKey: prev ? prev.renderKey + 1 : 0,
|
|
26
|
+
};
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
function handleUnselectFixtureRequest() {
|
|
30
|
+
setSelectedFixture(null);
|
|
31
|
+
}
|
|
32
|
+
function handleSetFixtureStateRequest({ payload }) {
|
|
33
|
+
const { fixtureId, fixtureState } = payload;
|
|
34
|
+
setSelectedFixture(prev => {
|
|
35
|
+
// Ensure fixture state applies to currently selected fixture
|
|
36
|
+
if (prev && isEqual(prev.fixtureId, fixtureId)) {
|
|
37
|
+
return {
|
|
38
|
+
...prev,
|
|
39
|
+
fixtureState,
|
|
40
|
+
syncedFixtureState: fixtureState,
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
return prev;
|
|
45
|
+
}
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
const unsubscribe = rendererConnect.onMessage((msg) => {
|
|
49
|
+
if (msg.type === 'pingRenderers') {
|
|
50
|
+
return postReadyState();
|
|
51
|
+
}
|
|
52
|
+
if (!msg.payload || msg.payload.rendererId !== rendererId) {
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const doesRequestChangeFixture = msg.type === 'selectFixture' || msg.type === 'unselectFixture';
|
|
56
|
+
if (doesRequestChangeFixture) {
|
|
57
|
+
fireChangeCallback();
|
|
58
|
+
}
|
|
59
|
+
switch (msg.type) {
|
|
60
|
+
case 'selectFixture':
|
|
61
|
+
return handleSelectFixtureRequest(msg);
|
|
62
|
+
case 'unselectFixture':
|
|
63
|
+
return handleUnselectFixtureRequest();
|
|
64
|
+
case 'setFixtureState':
|
|
65
|
+
return handleSetFixtureStateRequest(msg);
|
|
66
|
+
default:
|
|
67
|
+
// Ignore all other messages, which could be unrelated browser
|
|
68
|
+
// devtools communications.
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return () => {
|
|
72
|
+
unsubscribe();
|
|
73
|
+
};
|
|
74
|
+
}, [
|
|
75
|
+
moduleWrappers,
|
|
76
|
+
onErrorReset,
|
|
77
|
+
rendererConnect,
|
|
78
|
+
rendererId,
|
|
79
|
+
setSelectedFixture,
|
|
80
|
+
]);
|
|
81
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { FixtureId } from '../fixture/types.js';
|
|
2
|
+
import { RendererConnect } from './rendererConnectTypes.js';
|
|
3
|
+
import { UserModuleWrappers } from './userModuleTypes.js';
|
|
4
|
+
export declare function useRendererResponse(rendererId: string, rendererConnect: RendererConnect, moduleWrappers: UserModuleWrappers, initialFixtureId?: FixtureId): void;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { useEffect, useRef } from 'react';
|
|
2
|
+
import { getFixtureListFromWrappers } from './getFixtureList.js';
|
|
3
|
+
export function useRendererResponse(rendererId, rendererConnect, moduleWrappers, initialFixtureId) {
|
|
4
|
+
const readyRef = useRef(false);
|
|
5
|
+
useEffect(() => {
|
|
6
|
+
const fixtures = getFixtureListFromWrappers(moduleWrappers);
|
|
7
|
+
if (readyRef.current) {
|
|
8
|
+
rendererConnect.postMessage({
|
|
9
|
+
type: 'fixtureListUpdate',
|
|
10
|
+
payload: { rendererId, fixtures },
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
rendererConnect.postMessage({
|
|
15
|
+
type: 'rendererReady',
|
|
16
|
+
payload: initialFixtureId
|
|
17
|
+
? { rendererId, fixtures, initialFixtureId }
|
|
18
|
+
: { rendererId, fixtures },
|
|
19
|
+
});
|
|
20
|
+
readyRef.current = true;
|
|
21
|
+
}
|
|
22
|
+
}, [initialFixtureId, moduleWrappers, rendererConnect, rendererId]);
|
|
23
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { FixtureId } from '../fixture/types.js';
|
|
3
|
+
import { FixtureState, SetFixtureState } from '../fixtureState/types.js';
|
|
4
|
+
export type SelectedFixture = {
|
|
5
|
+
fixtureId: FixtureId;
|
|
6
|
+
fixtureState: FixtureState;
|
|
7
|
+
syncedFixtureState: FixtureState;
|
|
8
|
+
renderKey: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function useSelectedFixture(initialFixtureId?: FixtureId, selectedFixtureId?: null | FixtureId): {
|
|
11
|
+
selectedFixture: SelectedFixture | null;
|
|
12
|
+
setSelectedFixture: import("react").Dispatch<import("react").SetStateAction<SelectedFixture | null>>;
|
|
13
|
+
setFixtureState: SetFixtureState;
|
|
14
|
+
};
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { useCallback, useState } from 'react';
|
|
2
|
+
export function useSelectedFixture(initialFixtureId, selectedFixtureId) {
|
|
3
|
+
const [selectedFixture, setSelectedFixture] = useState(() => {
|
|
4
|
+
const fixtureId = selectedFixtureId ?? initialFixtureId;
|
|
5
|
+
if (!fixtureId)
|
|
6
|
+
return null;
|
|
7
|
+
return {
|
|
8
|
+
fixtureId,
|
|
9
|
+
fixtureState: {},
|
|
10
|
+
syncedFixtureState: {},
|
|
11
|
+
renderKey: 0,
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
const setFixtureState = useCallback(stateUpdate => {
|
|
15
|
+
setSelectedFixture(prevState => {
|
|
16
|
+
if (!prevState) {
|
|
17
|
+
console.warn('Trying to set fixture state with no fixture selected');
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
20
|
+
return {
|
|
21
|
+
...prevState,
|
|
22
|
+
fixtureState: stateUpdate(prevState.fixtureState),
|
|
23
|
+
};
|
|
24
|
+
});
|
|
25
|
+
}, [setSelectedFixture]);
|
|
26
|
+
return {
|
|
27
|
+
selectedFixture,
|
|
28
|
+
setSelectedFixture,
|
|
29
|
+
setFixtureState,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { ComponentType, FunctionComponent, ReactNode } from 'react';
|
|
2
|
+
import { FixtureState, SetFixtureState } from '../fixtureState/types.js';
|
|
3
|
+
type FixtureMap<FixtureType> = {
|
|
4
|
+
[fixtureName: string]: FixtureType;
|
|
5
|
+
};
|
|
6
|
+
type FixtureExport<FixtureType> = FixtureType | FixtureMap<FixtureType>;
|
|
7
|
+
type FixtureModule<FixtureType> = {
|
|
8
|
+
default: FixtureExport<FixtureType>;
|
|
9
|
+
};
|
|
10
|
+
type ModuleWrapper<ModuleType> = {
|
|
11
|
+
module: ModuleType;
|
|
12
|
+
};
|
|
13
|
+
type LazyModuleWrapper<ModuleType> = {
|
|
14
|
+
getModule: () => Promise<ModuleType>;
|
|
15
|
+
};
|
|
16
|
+
export type ReactFixture = ReactNode | FunctionComponent;
|
|
17
|
+
export type ReactFixtureMap = FixtureMap<ReactFixture>;
|
|
18
|
+
export type ReactFixtureExport = FixtureExport<ReactFixture>;
|
|
19
|
+
export type ReactFixtureModule = FixtureModule<ReactFixture>;
|
|
20
|
+
export type ReactFixtureWrapper = ModuleWrapper<ReactFixtureModule>;
|
|
21
|
+
export type LazyReactFixtureWrapper = LazyModuleWrapper<ReactFixtureModule>;
|
|
22
|
+
export type ReactDecoratorProps = {
|
|
23
|
+
children: ReactNode;
|
|
24
|
+
fixtureState: FixtureState;
|
|
25
|
+
setFixtureState: SetFixtureState;
|
|
26
|
+
onErrorReset: () => unknown;
|
|
27
|
+
};
|
|
28
|
+
export type ReactDecorator = ComponentType<ReactDecoratorProps>;
|
|
29
|
+
export type ReactDecoratorModule = {
|
|
30
|
+
default: ReactDecorator;
|
|
31
|
+
};
|
|
32
|
+
export type ReactDecoratorWrapper = ModuleWrapper<ReactDecoratorModule>;
|
|
33
|
+
export type LazyReactDecoratorWrapper = LazyModuleWrapper<ReactDecoratorModule>;
|
|
34
|
+
export type ByPath<T> = Record<string, T>;
|
|
35
|
+
export type UserModuleWrappers = {
|
|
36
|
+
lazy: true;
|
|
37
|
+
fixtures: ByPath<LazyReactFixtureWrapper>;
|
|
38
|
+
decorators: ByPath<LazyReactDecoratorWrapper>;
|
|
39
|
+
} | {
|
|
40
|
+
lazy: false;
|
|
41
|
+
fixtures: ByPath<ReactFixtureWrapper>;
|
|
42
|
+
decorators: ByPath<ReactDecoratorWrapper>;
|
|
43
|
+
};
|
|
44
|
+
export type FixtureModules = {
|
|
45
|
+
fixturePath: string;
|
|
46
|
+
fixtureModule: ReactFixtureModule;
|
|
47
|
+
decoratorModules: ReactDecoratorModule[];
|
|
48
|
+
};
|
|
49
|
+
export {};
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
export type RawCosmosPluginConfig = {
|
|
2
2
|
name: string;
|
|
3
3
|
ui?: string;
|
|
4
|
-
|
|
5
|
-
export?: string;
|
|
4
|
+
server?: string;
|
|
6
5
|
};
|
|
7
6
|
export type CosmosPluginConfig = {
|
|
8
7
|
name: string;
|
|
9
8
|
rootDir: string;
|
|
10
9
|
ui?: string;
|
|
11
|
-
|
|
12
|
-
export?: string;
|
|
10
|
+
server?: string;
|
|
13
11
|
};
|
|
14
12
|
export type UiCosmosPluginConfig = CosmosPluginConfig & {
|
|
15
13
|
ui: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "react-cosmos-core",
|
|
3
|
-
"version": "6.0.0-
|
|
3
|
+
"version": "6.0.0-canary.03b80da.0+03b80da",
|
|
4
4
|
"description": "React Cosmos Core",
|
|
5
5
|
"repository": "https://github.com/react-cosmos/react-cosmos/tree/main/packages/react-cosmos-core",
|
|
6
6
|
"license": "MIT",
|
|
@@ -11,5 +11,5 @@
|
|
|
11
11
|
"lodash-es": "^4.17.21",
|
|
12
12
|
"react-is": "^18.2.0"
|
|
13
13
|
},
|
|
14
|
-
"gitHead": "
|
|
14
|
+
"gitHead": "03b80da1b8741a929868d74771832dde14fcba2b"
|
|
15
15
|
}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
import React, { Component, ReactNode } from 'react';
|
|
2
|
-
import { FixtureId } from '../../fixture/types.js';
|
|
3
|
-
import { FixtureState, SetFixtureState } from '../../fixtureState/types.js';
|
|
4
|
-
import { ReactDecorator, ReactDecorators, ReactFixtureWrappers } from '../reactTypes.js';
|
|
5
|
-
import { RendererConnect, RendererRequest, RendererResponse, SelectFixtureRequest, SetFixtureStateRequest } from '../types.js';
|
|
6
|
-
export type Props = {
|
|
7
|
-
rendererId: string;
|
|
8
|
-
rendererConnect: RendererConnect;
|
|
9
|
-
fixtures: ReactFixtureWrappers;
|
|
10
|
-
initialFixtureId?: FixtureId;
|
|
11
|
-
selectedFixtureId?: null | FixtureId;
|
|
12
|
-
systemDecorators: ReactDecorator[];
|
|
13
|
-
userDecorators: ReactDecorators;
|
|
14
|
-
renderMessage?: (args: {
|
|
15
|
-
msg: string;
|
|
16
|
-
}) => ReactNode;
|
|
17
|
-
onErrorReset?: () => unknown;
|
|
18
|
-
};
|
|
19
|
-
type SelectedFixture = {
|
|
20
|
-
fixtureId: FixtureId;
|
|
21
|
-
fixtureState: FixtureState;
|
|
22
|
-
syncedFixtureState: FixtureState;
|
|
23
|
-
};
|
|
24
|
-
type State = {
|
|
25
|
-
selectedFixture: null | SelectedFixture;
|
|
26
|
-
renderKey: number;
|
|
27
|
-
};
|
|
28
|
-
export declare class FixtureLoader extends Component<Props, State> {
|
|
29
|
-
state: State;
|
|
30
|
-
unsubscribe: null | (() => unknown);
|
|
31
|
-
componentDidMount(): void;
|
|
32
|
-
componentWillUnmount(): void;
|
|
33
|
-
componentDidUpdate(prevProps: Props): void;
|
|
34
|
-
shouldComponentUpdate(prevProps: Props, prevState: State): boolean;
|
|
35
|
-
render(): string | number | boolean | React.ReactFragment | JSX.Element | null | undefined;
|
|
36
|
-
handleRequest: (msg: RendererRequest) => void;
|
|
37
|
-
handleSelectFixtureRequest({ payload }: SelectFixtureRequest): void;
|
|
38
|
-
handleUnselectFixtureRequest(): void;
|
|
39
|
-
handleSetFixtureStateRequest({ payload }: SetFixtureStateRequest): void;
|
|
40
|
-
postReadyState(): void;
|
|
41
|
-
postFixtureListUpdate(): void;
|
|
42
|
-
postFixtureStateChange: (fixtureId: FixtureId, fixtureState: FixtureState) => void;
|
|
43
|
-
setFixtureState: SetFixtureState;
|
|
44
|
-
getFixtureList(): {
|
|
45
|
-
[x: string]: import("../../fixture/types.js").FixtureListItem;
|
|
46
|
-
};
|
|
47
|
-
fireChangeCallback(): void;
|
|
48
|
-
updateSyncedFixtureState(syncedFixtureState: FixtureState): void;
|
|
49
|
-
postMessage(msg: RendererResponse): void;
|
|
50
|
-
renderMessage(msg: string): React.ReactNode;
|
|
51
|
-
}
|
|
52
|
-
export {};
|
|
@@ -1,226 +0,0 @@
|
|
|
1
|
-
import { isEqual } from 'lodash-es';
|
|
2
|
-
import React, { Component } from 'react';
|
|
3
|
-
import { getFixtureListFromWrappers } from '../getFixtureList.js';
|
|
4
|
-
import { getFixture } from './fixtureHelpers.js';
|
|
5
|
-
import { FixtureProvider } from './FixtureProvider.js';
|
|
6
|
-
function getSelectedFixtureState(fixtureId) {
|
|
7
|
-
if (!fixtureId)
|
|
8
|
-
return null;
|
|
9
|
-
return {
|
|
10
|
-
fixtureId: fixtureId,
|
|
11
|
-
fixtureState: {},
|
|
12
|
-
syncedFixtureState: {},
|
|
13
|
-
};
|
|
14
|
-
}
|
|
15
|
-
export class FixtureLoader extends Component {
|
|
16
|
-
state = {
|
|
17
|
-
selectedFixture: getSelectedFixtureState(this.props.selectedFixtureId || this.props.initialFixtureId),
|
|
18
|
-
renderKey: 0,
|
|
19
|
-
};
|
|
20
|
-
unsubscribe = null;
|
|
21
|
-
componentDidMount() {
|
|
22
|
-
if (!this.props.selectedFixtureId) {
|
|
23
|
-
const { rendererConnect } = this.props;
|
|
24
|
-
this.unsubscribe = rendererConnect.onMessage(this.handleRequest);
|
|
25
|
-
this.postReadyState();
|
|
26
|
-
}
|
|
27
|
-
}
|
|
28
|
-
componentWillUnmount() {
|
|
29
|
-
if (this.unsubscribe)
|
|
30
|
-
this.unsubscribe();
|
|
31
|
-
}
|
|
32
|
-
componentDidUpdate(prevProps) {
|
|
33
|
-
const { fixtures } = this.props;
|
|
34
|
-
if (!isEqual(fixtures, prevProps.fixtures)) {
|
|
35
|
-
this.postFixtureListUpdate();
|
|
36
|
-
}
|
|
37
|
-
const { selectedFixture } = this.state;
|
|
38
|
-
if (selectedFixture) {
|
|
39
|
-
const { fixtureId, fixtureState, syncedFixtureState } = selectedFixture;
|
|
40
|
-
if (fixtureId && !isEqual(fixtureState, syncedFixtureState)) {
|
|
41
|
-
this.postFixtureStateChange(fixtureId, fixtureState);
|
|
42
|
-
this.updateSyncedFixtureState(fixtureState);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
shouldComponentUpdate(prevProps, prevState) {
|
|
47
|
-
// This check exists mainly to prevent updating the fixture tree when
|
|
48
|
-
// fixture state setters resulted in no fixture state change
|
|
49
|
-
return !isEqual(this.props, prevProps) || !isEqual(this.state, prevState);
|
|
50
|
-
}
|
|
51
|
-
render() {
|
|
52
|
-
const { selectedFixture } = this.state;
|
|
53
|
-
if (!selectedFixture) {
|
|
54
|
-
return this.renderMessage('No fixture selected.');
|
|
55
|
-
}
|
|
56
|
-
const { fixtures } = this.props;
|
|
57
|
-
const { fixtureId, fixtureState } = selectedFixture;
|
|
58
|
-
// Falsy check doesn't do because fixtures can be any Node, including
|
|
59
|
-
// null or undefined.
|
|
60
|
-
if (!fixtures.hasOwnProperty(fixtureId.path)) {
|
|
61
|
-
return this.renderMessage(`Fixture path not found: ${fixtureId.path}`);
|
|
62
|
-
}
|
|
63
|
-
const fixtureExport = fixtures[fixtureId.path].module.default;
|
|
64
|
-
const fixture = getFixture(fixtureExport, fixtureId.name);
|
|
65
|
-
if (typeof fixture === 'undefined') {
|
|
66
|
-
return this.renderMessage(`Invalid fixture ID: ${JSON.stringify(fixtureId)}`);
|
|
67
|
-
}
|
|
68
|
-
const { systemDecorators, userDecorators, onErrorReset } = this.props;
|
|
69
|
-
const { renderKey } = this.state;
|
|
70
|
-
return (React.createElement(FixtureProvider
|
|
71
|
-
// renderKey controls whether to reuse previous instances (and
|
|
72
|
-
// transition props) or rebuild render tree from scratch
|
|
73
|
-
, {
|
|
74
|
-
// renderKey controls whether to reuse previous instances (and
|
|
75
|
-
// transition props) or rebuild render tree from scratch
|
|
76
|
-
key: renderKey, fixtureId: fixtureId, fixture: fixture, systemDecorators: systemDecorators, userDecorators: userDecorators, fixtureState: fixtureState, setFixtureState: this.setFixtureState, onErrorReset: onErrorReset || noop }));
|
|
77
|
-
}
|
|
78
|
-
handleRequest = (msg) => {
|
|
79
|
-
if (msg.type === 'pingRenderers') {
|
|
80
|
-
return this.postReadyState();
|
|
81
|
-
}
|
|
82
|
-
if (!msg.payload || msg.payload.rendererId !== this.props.rendererId) {
|
|
83
|
-
return;
|
|
84
|
-
}
|
|
85
|
-
if (doesRequestChangeFixture(msg)) {
|
|
86
|
-
this.fireChangeCallback();
|
|
87
|
-
}
|
|
88
|
-
switch (msg.type) {
|
|
89
|
-
case 'selectFixture':
|
|
90
|
-
return this.handleSelectFixtureRequest(msg);
|
|
91
|
-
case 'unselectFixture':
|
|
92
|
-
return this.handleUnselectFixtureRequest();
|
|
93
|
-
case 'setFixtureState':
|
|
94
|
-
return this.handleSetFixtureStateRequest(msg);
|
|
95
|
-
default:
|
|
96
|
-
// This Is Fine™
|
|
97
|
-
// Actually, we can't be angry about getting unrelated messages here
|
|
98
|
-
// because we don't do any preliminary message filtering to ignore stuff
|
|
99
|
-
// like browser devtools communication, nor do we have any message
|
|
100
|
-
// metadata conventions in place to perform such filtering at the moment
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
handleSelectFixtureRequest({ payload }) {
|
|
104
|
-
const { fixtureId, fixtureState } = payload;
|
|
105
|
-
this.setState({
|
|
106
|
-
selectedFixture: {
|
|
107
|
-
fixtureId,
|
|
108
|
-
fixtureState,
|
|
109
|
-
syncedFixtureState: fixtureState,
|
|
110
|
-
},
|
|
111
|
-
renderKey: this.state.renderKey + 1,
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
handleUnselectFixtureRequest() {
|
|
115
|
-
this.setState({
|
|
116
|
-
selectedFixture: null,
|
|
117
|
-
renderKey: 0,
|
|
118
|
-
});
|
|
119
|
-
}
|
|
120
|
-
handleSetFixtureStateRequest({ payload }) {
|
|
121
|
-
const { fixtureId, fixtureState } = payload;
|
|
122
|
-
const { selectedFixture } = this.state;
|
|
123
|
-
// Ensure fixture state applies to currently selected fixture
|
|
124
|
-
if (selectedFixture && isEqual(fixtureId, selectedFixture.fixtureId)) {
|
|
125
|
-
this.setState({
|
|
126
|
-
selectedFixture: {
|
|
127
|
-
fixtureId,
|
|
128
|
-
fixtureState,
|
|
129
|
-
syncedFixtureState: fixtureState,
|
|
130
|
-
},
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
postReadyState() {
|
|
135
|
-
const { rendererId, initialFixtureId } = this.props;
|
|
136
|
-
const fixtures = this.getFixtureList();
|
|
137
|
-
this.postMessage({
|
|
138
|
-
type: 'rendererReady',
|
|
139
|
-
payload: initialFixtureId
|
|
140
|
-
? { rendererId, fixtures, initialFixtureId }
|
|
141
|
-
: { rendererId, fixtures },
|
|
142
|
-
});
|
|
143
|
-
}
|
|
144
|
-
postFixtureListUpdate() {
|
|
145
|
-
const { rendererId } = this.props;
|
|
146
|
-
this.postMessage({
|
|
147
|
-
type: 'fixtureListUpdate',
|
|
148
|
-
payload: {
|
|
149
|
-
rendererId,
|
|
150
|
-
fixtures: this.getFixtureList(),
|
|
151
|
-
},
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
postFixtureStateChange = (fixtureId, fixtureState) => {
|
|
155
|
-
const { rendererId } = this.props;
|
|
156
|
-
this.postMessage({
|
|
157
|
-
type: 'fixtureStateChange',
|
|
158
|
-
payload: {
|
|
159
|
-
rendererId,
|
|
160
|
-
fixtureId,
|
|
161
|
-
fixtureState,
|
|
162
|
-
},
|
|
163
|
-
});
|
|
164
|
-
};
|
|
165
|
-
setFixtureState = stateUpdate => {
|
|
166
|
-
if (!this.state.selectedFixture) {
|
|
167
|
-
console.warn('[FixtureLoader] Trying to set fixture state with no fixture selected');
|
|
168
|
-
return;
|
|
169
|
-
}
|
|
170
|
-
// Multiple state changes can be dispatched by fixture plugins at almost
|
|
171
|
-
// the same time. Since state changes are batched in React, current state
|
|
172
|
-
// (this.state.fixtureState) can be stale at dispatch time, and extending
|
|
173
|
-
// it can result in cancelling previous state changes that are queued.
|
|
174
|
-
// Using an updater function like ({ prevState }) => nextState ensures
|
|
175
|
-
// every state change is honored, regardless of timing.
|
|
176
|
-
this.setState(({ selectedFixture }) => {
|
|
177
|
-
if (!selectedFixture) {
|
|
178
|
-
return null;
|
|
179
|
-
}
|
|
180
|
-
return {
|
|
181
|
-
selectedFixture: {
|
|
182
|
-
...selectedFixture,
|
|
183
|
-
fixtureState: stateUpdate(selectedFixture.fixtureState),
|
|
184
|
-
},
|
|
185
|
-
};
|
|
186
|
-
});
|
|
187
|
-
};
|
|
188
|
-
getFixtureList() {
|
|
189
|
-
return getFixtureListFromWrappers(this.props.fixtures);
|
|
190
|
-
}
|
|
191
|
-
fireChangeCallback() {
|
|
192
|
-
const { onErrorReset } = this.props;
|
|
193
|
-
if (typeof onErrorReset === 'function') {
|
|
194
|
-
onErrorReset();
|
|
195
|
-
}
|
|
196
|
-
}
|
|
197
|
-
updateSyncedFixtureState(syncedFixtureState) {
|
|
198
|
-
this.setState(({ selectedFixture }) => {
|
|
199
|
-
if (!selectedFixture) {
|
|
200
|
-
return null;
|
|
201
|
-
}
|
|
202
|
-
// Other updates that alter state.selectedFixture can be pending when this
|
|
203
|
-
// update is submitted. Those updates will be applied first. With this in
|
|
204
|
-
// mind, we use a state setter callback to only override syncedFixtureState
|
|
205
|
-
// and keep the latest values of other state parts.
|
|
206
|
-
return {
|
|
207
|
-
selectedFixture: {
|
|
208
|
-
...selectedFixture,
|
|
209
|
-
syncedFixtureState,
|
|
210
|
-
},
|
|
211
|
-
};
|
|
212
|
-
});
|
|
213
|
-
}
|
|
214
|
-
postMessage(msg) {
|
|
215
|
-
this.props.rendererConnect.postMessage(msg);
|
|
216
|
-
}
|
|
217
|
-
renderMessage(msg) {
|
|
218
|
-
return typeof this.props.renderMessage !== 'undefined'
|
|
219
|
-
? this.props.renderMessage({ msg })
|
|
220
|
-
: msg;
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
function doesRequestChangeFixture(r) {
|
|
224
|
-
return r.type === 'selectFixture' || r.type === 'unselectFixture';
|
|
225
|
-
}
|
|
226
|
-
function noop() { }
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import { ReactNode } from 'react';
|
|
2
|
-
import { FixtureId } from '../../fixture/types.js';
|
|
3
|
-
import { FixtureState, SetFixtureState } from '../../fixtureState/types.js';
|
|
4
|
-
import { ReactDecorator, ReactDecorators, ReactFixture } from '../reactTypes.js';
|
|
5
|
-
type Props = {
|
|
6
|
-
fixtureId: FixtureId;
|
|
7
|
-
fixture: ReactFixture;
|
|
8
|
-
systemDecorators: ReactDecorator[];
|
|
9
|
-
userDecorators: ReactDecorators;
|
|
10
|
-
fixtureState: FixtureState;
|
|
11
|
-
setFixtureState: SetFixtureState;
|
|
12
|
-
renderMessage?: (args: {
|
|
13
|
-
msg: string;
|
|
14
|
-
}) => ReactNode;
|
|
15
|
-
onErrorReset: () => unknown;
|
|
16
|
-
};
|
|
17
|
-
export declare function FixtureProvider({ fixtureId, fixture, systemDecorators, userDecorators, fixtureState, setFixtureState, onErrorReset, }: Props): JSX.Element;
|
|
18
|
-
export {};
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
2
|
-
import { FixtureContext } from '../../fixture/FixtureContext.js';
|
|
3
|
-
import { getSortedDecoratorsForFixturePath } from '../getSortedDecoratorsForFixturePath.js';
|
|
4
|
-
import { getDecoratedFixtureElement } from './getDecoratedFixtureElement/index.js';
|
|
5
|
-
export function FixtureProvider({ fixtureId, fixture, systemDecorators, userDecorators, fixtureState, setFixtureState, onErrorReset, }) {
|
|
6
|
-
// Prevent unintentional renders https://reactjs.org/docs/context.html#caveats
|
|
7
|
-
const contextValue = useMemo(() => ({ fixtureState, setFixtureState }), [fixtureState, setFixtureState]);
|
|
8
|
-
const decoratorProps = useMemo(() => ({ fixtureState, setFixtureState, onErrorReset }), [fixtureState, onErrorReset, setFixtureState]);
|
|
9
|
-
const decorators = useMemo(() => mergeDecorators(fixtureId, systemDecorators, userDecorators), [fixtureId, systemDecorators, userDecorators]);
|
|
10
|
-
const decoratedFixture = useMemo(() => getDecoratedFixtureElement(fixture, decorators, decoratorProps), [decoratorProps, decorators, fixture]);
|
|
11
|
-
return (React.createElement(FixtureContext.Provider, { value: contextValue }, decoratedFixture));
|
|
12
|
-
}
|
|
13
|
-
function mergeDecorators(fixtureId, systemDecorators, userDecorators) {
|
|
14
|
-
return [
|
|
15
|
-
...systemDecorators,
|
|
16
|
-
...getSortedDecoratorsForFixturePath(fixtureId.path, userDecorators),
|
|
17
|
-
];
|
|
18
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import { ComponentType, FunctionComponent, ReactNode } from 'react';
|
|
2
|
-
import { FixtureState, SetFixtureState } from '../fixtureState/types.js';
|
|
3
|
-
type FixtureMap<FixtureType> = {
|
|
4
|
-
[fixtureName: string]: FixtureType;
|
|
5
|
-
};
|
|
6
|
-
type FixtureExport<FixtureType> = FixtureType | FixtureMap<FixtureType>;
|
|
7
|
-
type FixtureModule<FixtureType> = {
|
|
8
|
-
default: FixtureExport<FixtureType>;
|
|
9
|
-
};
|
|
10
|
-
type FixtureWrapper<FixtureType> = {
|
|
11
|
-
module: FixtureModule<FixtureType>;
|
|
12
|
-
};
|
|
13
|
-
export type ReactFixture = ReactNode | FunctionComponent;
|
|
14
|
-
export type ReactFixtureMap = FixtureMap<ReactFixture>;
|
|
15
|
-
export type ReactFixtureExport = FixtureExport<ReactFixture>;
|
|
16
|
-
export type ReactFixtureModule = FixtureModule<ReactFixture>;
|
|
17
|
-
export type ReactFixtureWrapper = FixtureWrapper<ReactFixture>;
|
|
18
|
-
export type ReactDecoratorProps = {
|
|
19
|
-
children: ReactNode;
|
|
20
|
-
fixtureState: FixtureState;
|
|
21
|
-
setFixtureState: SetFixtureState;
|
|
22
|
-
onErrorReset: () => unknown;
|
|
23
|
-
};
|
|
24
|
-
export type ReactDecorator = ComponentType<ReactDecoratorProps>;
|
|
25
|
-
export type ReactFixtureExports = Record<string, ReactFixtureExport>;
|
|
26
|
-
export type ReactFixtureWrappers = Record<string, ReactFixtureWrapper>;
|
|
27
|
-
export type ReactDecorators = Record<string, ReactDecorator>;
|
|
28
|
-
export {};
|