react-cosmos-core 6.0.0-alpha.9 → 6.0.0-beta.10
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/fixtureState/classState.d.ts +11 -10
- package/dist/fixtureState/classState.js +16 -25
- package/dist/fixtureState/classStateTypes.d.ts +7 -0
- package/dist/fixtureState/controlsTypes.d.ts +14 -0
- package/dist/fixtureState/fixtureState.d.ts +6 -0
- package/dist/fixtureState/fixtureState.js +21 -0
- package/dist/fixtureState/props.d.ts +15 -14
- package/dist/fixtureState/props.js +20 -25
- package/dist/fixtureState/propsTypes.d.ts +9 -0
- package/dist/fixtureState/types.d.ts +2 -31
- package/dist/fixtureState/viewport.d.ts +5 -0
- package/dist/fixtureTree/createFixtureTree/collapseNamedIndexes.js +6 -2
- package/dist/fixtureTree/createFixtureTree/createRawFixtureTree.d.ts +1 -1
- package/dist/fixtureTree/createFixtureTree/createRawFixtureTree.js +4 -9
- package/dist/fixtureTree/createFixtureTree/index.d.ts +1 -1
- package/dist/fixtureTree/flattenFixtureTree.d.ts +1 -1
- package/dist/fixtureTree/flattenFixtureTree.js +3 -3
- package/dist/fixtureTree/types.d.ts +3 -3
- package/dist/index.d.ts +28 -19
- package/dist/index.js +28 -19
- package/dist/playground/playgroundParams.d.ts +4 -0
- package/dist/playground/playgroundQueryString.d.ts +3 -0
- package/dist/playground/playgroundQueryString.js +21 -0
- package/dist/{server → plugin}/cosmosPluginConfig.d.ts +2 -4
- package/dist/renderer/rendererConfig.d.ts +1 -0
- package/dist/renderer/{types.d.ts → rendererConnect.d.ts} +10 -5
- package/dist/renderer/rendererConnect.js +1 -0
- package/dist/renderer/rendererQueryString.d.ts +12 -0
- package/dist/renderer/rendererQueryString.js +27 -0
- package/dist/renderer/rendererUrl.d.ts +9 -0
- package/dist/renderer/rendererUrl.js +42 -0
- package/dist/server/serverTypes.d.ts +1 -0
- package/dist/server/serverTypes.js +1 -0
- package/dist/userModules/fixtureTypes.js +1 -0
- package/dist/userModules/getFixtureFromExport.d.ts +2 -0
- package/dist/{renderer/FixtureLoader/fixtureHelpers.js → userModules/getFixtureFromExport.js} +4 -3
- package/dist/userModules/getFixtureList.d.ts +7 -0
- package/dist/userModules/getFixtureList.js +24 -0
- package/dist/userModules/getSortedDecoratorsForFixturePath.d.ts +2 -0
- package/dist/{renderer → userModules}/isMultiFixture.d.ts +1 -1
- package/dist/userModules/stringifyFixtureId.d.ts +2 -0
- package/dist/userModules/stringifyFixtureId.js +4 -0
- package/dist/userModules/userModuleTypes.d.ts +44 -0
- package/dist/userModules/userModuleTypes.js +1 -0
- package/dist/utils/queryString.d.ts +2 -0
- package/dist/utils/queryString.js +7 -0
- package/dist/utils/react/ClassStateMock.d.ts +13 -0
- package/dist/utils/react/ClassStateMock.js +72 -0
- package/dist/utils/react/DelayRender.d.ts +7 -0
- package/dist/utils/react/DelayRender.js +10 -0
- package/dist/utils/state.js +1 -0
- package/dist/utils/string.d.ts +0 -2
- package/dist/utils/string.js +0 -6
- package/dist/utils/window.d.ts +1 -0
- package/dist/utils/window.js +8 -0
- package/package.json +6 -5
- package/dist/fixture/FixtureContext.d.ts +0 -7
- package/dist/fixture/FixtureContext.js +0 -5
- package/dist/fixture/Viewport.d.ts +0 -8
- package/dist/fixture/Viewport.js +0 -19
- package/dist/fixture/useSelect/index.d.ts +0 -2
- package/dist/fixture/useSelect/index.js +0 -11
- package/dist/fixture/useSelect/shared.d.ts +0 -6
- package/dist/fixture/useSelect/shared.js +0 -3
- package/dist/fixture/useSelect/useCreateFixtureState.d.ts +0 -2
- package/dist/fixture/useSelect/useCreateFixtureState.js +0 -32
- package/dist/fixture/useSelect/useCurrentValue.d.ts +0 -2
- package/dist/fixture/useSelect/useCurrentValue.js +0 -11
- package/dist/fixture/useSelect/useSetValue.d.ts +0 -2
- package/dist/fixture/useSelect/useSetValue.js +0 -25
- package/dist/fixture/useValue/index.d.ts +0 -7
- package/dist/fixture/useValue/index.js +0 -9
- package/dist/fixture/useValue/shared.d.ts +0 -3
- package/dist/fixture/useValue/useCreateFixtureState.d.ts +0 -2
- package/dist/fixture/useValue/useCreateFixtureState.js +0 -35
- package/dist/fixture/useValue/useCurrentValue.d.ts +0 -2
- package/dist/fixture/useValue/useCurrentValue.js +0 -13
- package/dist/fixture/useValue/useSetValue.d.ts +0 -3
- package/dist/fixture/useValue/useSetValue.js +0 -36
- package/dist/fixtureState/controls.d.ts +0 -2
- package/dist/fixtureState/controls.js +0 -4
- package/dist/playground/playgroundUrl.d.ts +0 -13
- package/dist/playground/playgroundUrl.js +0 -36
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/decorateFixtureRefs/index.d.ts +0 -5
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/decorateFixtureRefs/index.js +0 -46
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/decorateFixtureRefs/isRefSupported.d.ts +0 -4
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/decorateFixtureRefs/isRefSupported.js +0 -19
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/index.d.ts +0 -3
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/index.js +0 -13
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/shared.d.ts +0 -18
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/shared.js +0 -14
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/useFixtureState.d.ts +0 -4
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/useFixtureState.js +0 -156
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/useReadClassState.d.ts +0 -4
- package/dist/renderer/FixtureLoader/FixtureCapture/classState/useReadClassState.js +0 -60
- package/dist/renderer/FixtureLoader/FixtureCapture/index.d.ts +0 -7
- package/dist/renderer/FixtureLoader/FixtureCapture/index.js +0 -9
- package/dist/renderer/FixtureLoader/FixtureCapture/props/index.d.ts +0 -3
- package/dist/renderer/FixtureLoader/FixtureCapture/props/index.js +0 -77
- package/dist/renderer/FixtureLoader/FixtureCapture/props/useFixtureProps.d.ts +0 -3
- package/dist/renderer/FixtureLoader/FixtureCapture/props/useFixtureProps.js +0 -70
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/findRelevantElementPaths.d.ts +0 -2
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/findRelevantElementPaths.js +0 -23
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/findElementPaths.d.ts +0 -2
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/findElementPaths.js +0 -22
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/getElementAtPath.d.ts +0 -3
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/getElementAtPath.js +0 -26
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/index.d.ts +0 -11
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/index.js +0 -11
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/setElementAtPath.d.ts +0 -2
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/setElementAtPath.js +0 -35
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/shared.d.ts +0 -2
- package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/shared.js +0 -6
- 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/FixtureLoader/fixtureHelpers.d.ts +0 -2
- package/dist/renderer/FixtureLoader/getDecoratedFixtureElement/FixtureElement.d.ts +0 -9
- package/dist/renderer/FixtureLoader/getDecoratedFixtureElement/FixtureElement.js +0 -5
- package/dist/renderer/FixtureLoader/getDecoratedFixtureElement/index.d.ts +0 -2
- package/dist/renderer/FixtureLoader/getDecoratedFixtureElement/index.js +0 -15
- package/dist/renderer/FixtureLoader/postMessage.d.ts +0 -2
- package/dist/renderer/FixtureLoader/postMessage.js +0 -22
- package/dist/renderer/FixtureLoader/webSockets.d.ts +0 -2
- package/dist/renderer/FixtureLoader/webSockets.js +0 -32
- package/dist/renderer/getFixtureList.d.ts +0 -8
- package/dist/renderer/getFixtureList.js +0 -19
- package/dist/renderer/getSortedDecoratorsForFixturePath.d.ts +0 -2
- package/dist/renderer/reactTypes.d.ts +0 -28
- /package/dist/{fixture/types.js → fixtureState/classStateTypes.js} +0 -0
- /package/dist/{fixture/useValue/shared.js → fixtureState/controlsTypes.js} +0 -0
- /package/dist/{renderer/reactTypes.js → fixtureState/propsTypes.js} +0 -0
- /package/dist/{renderer/types.js → fixtureState/viewport.js} +0 -0
- /package/dist/{server → message}/serverMessage.d.ts +0 -0
- /package/dist/{server → message}/serverMessage.js +0 -0
- /package/dist/{server → message}/socketMessage.d.ts +0 -0
- /package/dist/{server → message}/socketMessage.js +0 -0
- /package/dist/{server/cosmosPluginConfig.js → playground/playgroundParams.js} +0 -0
- /package/dist/{renderer → playground}/registerPlaygroundShortcuts.d.ts +0 -0
- /package/dist/{renderer → playground}/registerPlaygroundShortcuts.js +0 -0
- /package/dist/{utils/types.js → plugin/cosmosPluginConfig.js} +0 -0
- /package/dist/{fixture/types.d.ts → userModules/fixtureTypes.d.ts} +0 -0
- /package/dist/{renderer → userModules}/getSortedDecoratorsForFixturePath.js +0 -0
- /package/dist/{renderer → userModules}/isMultiFixture.js +0 -0
- /package/dist/utils/{types.d.ts → state.d.ts} +0 -0
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
import { isEqual, mapValues } from 'lodash-es';
|
|
2
|
-
import React from 'react';
|
|
3
|
-
import { extendWithValues } from '../../../../fixtureState/extendWithValues.js';
|
|
4
|
-
import { DEFAULT_RENDER_KEY, findFixtureStateProps, } from '../../../../fixtureState/props.js';
|
|
5
|
-
import { getComponentName } from '../../../../utils/react/getComponentName.js';
|
|
6
|
-
import { findRelevantElementPaths } from '../shared/findRelevantElementPaths.js';
|
|
7
|
-
import { getChildrenPath, setElementAtPath } from '../shared/nodeTree/index.js';
|
|
8
|
-
export function useFixtureProps(fixture, fixtureState, decoratorId) {
|
|
9
|
-
const propCache = React.useMemo(() => ({}),
|
|
10
|
-
// React.useMemo is used as a cache invalidated by decoratorId
|
|
11
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
12
|
-
[decoratorId]);
|
|
13
|
-
const elPaths = findRelevantElementPaths(fixture);
|
|
14
|
-
return elPaths.reduce((extendedFixture, elPath) => {
|
|
15
|
-
const elementId = { decoratorId, elPath };
|
|
16
|
-
const fsProps = findFixtureStateProps(fixtureState, elementId);
|
|
17
|
-
return setElementAtPath(extendedFixture, elPath, element => {
|
|
18
|
-
if (!fsProps || componentTypeChanged(fsProps.componentName)) {
|
|
19
|
-
return {
|
|
20
|
-
...element,
|
|
21
|
-
key: getElRenderKey(elPath, DEFAULT_RENDER_KEY),
|
|
22
|
-
};
|
|
23
|
-
}
|
|
24
|
-
// Prevent overriding child elements with outdated "children" prop values
|
|
25
|
-
// stored in fixture state
|
|
26
|
-
// See https://github.com/react-cosmos/react-cosmos/pull/920 for context
|
|
27
|
-
const originalProps = element.props;
|
|
28
|
-
const extendedProps = extendWithValues(originalProps, fsProps.values);
|
|
29
|
-
// Preserve identity between renders for indentical non-primitive props
|
|
30
|
-
const cachedProps = mapValues(extendedProps, (value, propName) => {
|
|
31
|
-
const key = getPropCacheKey(elPath, propName);
|
|
32
|
-
if (!propCache.hasOwnProperty(key))
|
|
33
|
-
propCache[key] = originalProps[propName];
|
|
34
|
-
if (isEqual(propCache[key], value))
|
|
35
|
-
return propCache[key];
|
|
36
|
-
propCache[key] = value;
|
|
37
|
-
return value;
|
|
38
|
-
});
|
|
39
|
-
// HACK alert: Editing React Element by hand
|
|
40
|
-
// This is blasphemy, but there are two reasons why React.cloneElement
|
|
41
|
-
// isn't ideal:
|
|
42
|
-
// 1. Props need to overridden (not merged)
|
|
43
|
-
// 2. element.key has to be set to control whether the prev instance
|
|
44
|
-
// should be reused or not
|
|
45
|
-
// To be revised in case this approach causes trouble in the future.
|
|
46
|
-
// Useful links:
|
|
47
|
-
// - https://reactjs.org/docs/react-api.html#cloneelement
|
|
48
|
-
// - https://github.com/facebook/react/blob/15a8f031838a553e41c0b66eb1bcf1da8448104d/packages/react/src/ReactElement.js#L293-L362
|
|
49
|
-
return {
|
|
50
|
-
...element,
|
|
51
|
-
props: hasChildElPaths(elPaths, elPath)
|
|
52
|
-
? { ...cachedProps, children: originalProps.children }
|
|
53
|
-
: cachedProps,
|
|
54
|
-
key: getElRenderKey(elPath, fsProps.renderKey),
|
|
55
|
-
};
|
|
56
|
-
function componentTypeChanged(componentName) {
|
|
57
|
-
return componentName !== getComponentName(element.type);
|
|
58
|
-
}
|
|
59
|
-
});
|
|
60
|
-
}, fixture);
|
|
61
|
-
}
|
|
62
|
-
function getPropCacheKey(elPath, propName) {
|
|
63
|
-
return elPath ? `${elPath}-${propName}` : propName;
|
|
64
|
-
}
|
|
65
|
-
function getElRenderKey(elPath, renderKey) {
|
|
66
|
-
return `${elPath}-${renderKey}`;
|
|
67
|
-
}
|
|
68
|
-
function hasChildElPaths(elPaths, elPath) {
|
|
69
|
-
return elPaths.some(p => p.indexOf(getChildrenPath(elPath)) === 0);
|
|
70
|
-
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
import { findElementPaths, getExpectedElementAtPath, } from './nodeTree/index.js';
|
|
2
|
-
export function findRelevantElementPaths(node) {
|
|
3
|
-
const elPaths = findElementPaths(node);
|
|
4
|
-
return elPaths.filter(elPath => {
|
|
5
|
-
const { type } = getExpectedElementAtPath(node, elPath);
|
|
6
|
-
// Ignore symbol types, like StrictMode
|
|
7
|
-
// https://github.com/react-cosmos/react-cosmos/issues/1249
|
|
8
|
-
if (typeof type === 'symbol')
|
|
9
|
-
return false;
|
|
10
|
-
if (typeof type === 'string')
|
|
11
|
-
return isInterestingTag(type);
|
|
12
|
-
const classType = type;
|
|
13
|
-
return classType.cosmosCapture !== false && isInterestingClass(classType);
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
function isInterestingTag(tagName) {
|
|
17
|
-
// TODO: Make this customizable
|
|
18
|
-
return tagName !== 'div' && tagName !== 'span';
|
|
19
|
-
}
|
|
20
|
-
function isInterestingClass(type) {
|
|
21
|
-
// TODO: Make this customizable
|
|
22
|
-
return type.name !== 'StyledComponent';
|
|
23
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { flatten } from 'lodash-es';
|
|
2
|
-
import { Fragment } from 'react';
|
|
3
|
-
import { isReactElement } from '../../../../../utils/react/isReactElement.js';
|
|
4
|
-
import { getChildrenPath } from './shared.js';
|
|
5
|
-
export function findElementPaths(node, curPath = '') {
|
|
6
|
-
if (Array.isArray(node)) {
|
|
7
|
-
return flatten(node.map((child, idx) => findElementPaths(child, `${curPath}[${idx}]`)));
|
|
8
|
-
}
|
|
9
|
-
if (!isReactElement(node)) {
|
|
10
|
-
// At this point the node can be null, boolean, string, number, Portal, etc.
|
|
11
|
-
// https://github.com/facebook/flow/blob/172d28f542f49bbc1e765131c9dfb9e31780f3a2/lib/react.js#L13-L20
|
|
12
|
-
return [];
|
|
13
|
-
}
|
|
14
|
-
const { children } = node.props;
|
|
15
|
-
const childElPaths =
|
|
16
|
-
// Props of elements returned by render functions can't be read here
|
|
17
|
-
typeof children !== 'function'
|
|
18
|
-
? findElementPaths(children, getChildrenPath(curPath))
|
|
19
|
-
: [];
|
|
20
|
-
// Ignore Fragment elements, but include their children
|
|
21
|
-
return node.type === Fragment ? childElPaths : [curPath, ...childElPaths];
|
|
22
|
-
}
|
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
import { get } from 'lodash-es';
|
|
2
|
-
import { isReactElement } from '../../../../../utils/react/isReactElement.js';
|
|
3
|
-
import { isRootPath } from './shared.js';
|
|
4
|
-
// Why be silent about trying to fetch a node that isn't an element?
|
|
5
|
-
// Because users of this utility only care about elements. Whether the child
|
|
6
|
-
// node was removed or replaced by a different type of node (eg. string,
|
|
7
|
-
// array of elements, etc.) is irrelevant.
|
|
8
|
-
// NICETOHAVE: Assert child path validity
|
|
9
|
-
export function getElementAtPath(node, elPath) {
|
|
10
|
-
if (!isReactElement(node) && !Array.isArray(node)) {
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
const rootNode = node;
|
|
14
|
-
const childNode = isRootPath(elPath) ? rootNode : get(rootNode, elPath);
|
|
15
|
-
if (!isReactElement(childNode)) {
|
|
16
|
-
return null;
|
|
17
|
-
}
|
|
18
|
-
return childNode;
|
|
19
|
-
}
|
|
20
|
-
export function getExpectedElementAtPath(node, elPath) {
|
|
21
|
-
const el = getElementAtPath(node, elPath);
|
|
22
|
-
if (!el) {
|
|
23
|
-
throw new Error(`Element not found at path: ${elPath}`);
|
|
24
|
-
}
|
|
25
|
-
return el;
|
|
26
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility for extending React Elements from a tree of React Nodes.
|
|
3
|
-
*
|
|
4
|
-
* The root Node is the `children` prop of a parent Element. Besides the Node
|
|
5
|
-
* type, children can also be a function.
|
|
6
|
-
* https://reactjs.org/docs/jsx-in-depth.html#functions-as-children
|
|
7
|
-
*/
|
|
8
|
-
export { findElementPaths } from './findElementPaths.js';
|
|
9
|
-
export { getElementAtPath, getExpectedElementAtPath, } from './getElementAtPath.js';
|
|
10
|
-
export { setElementAtPath } from './setElementAtPath.js';
|
|
11
|
-
export { getChildrenPath } from './shared.js';
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Utility for extending React Elements from a tree of React Nodes.
|
|
3
|
-
*
|
|
4
|
-
* The root Node is the `children` prop of a parent Element. Besides the Node
|
|
5
|
-
* type, children can also be a function.
|
|
6
|
-
* https://reactjs.org/docs/jsx-in-depth.html#functions-as-children
|
|
7
|
-
*/
|
|
8
|
-
export { findElementPaths } from './findElementPaths.js';
|
|
9
|
-
export { getElementAtPath, getExpectedElementAtPath, } from './getElementAtPath.js';
|
|
10
|
-
export { setElementAtPath } from './setElementAtPath.js';
|
|
11
|
-
export { getChildrenPath } from './shared.js';
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { set } from 'lodash-es';
|
|
2
|
-
import { isReactElement } from '../../../../../utils/react/isReactElement.js';
|
|
3
|
-
import { getExpectedElementAtPath } from './getElementAtPath.js';
|
|
4
|
-
import { isRootPath } from './shared.js';
|
|
5
|
-
export function setElementAtPath(node, elPath, updater) {
|
|
6
|
-
const childEl = getExpectedElementAtPath(node, elPath);
|
|
7
|
-
const newEl = updater(childEl);
|
|
8
|
-
if (isRootPath(elPath)) {
|
|
9
|
-
return newEl;
|
|
10
|
-
}
|
|
11
|
-
// If the root is a non-Array non-Element Node we should be at the root path
|
|
12
|
-
// and returned already
|
|
13
|
-
const clonedRoot = cloneNode(node);
|
|
14
|
-
// _.set also accepts arrays
|
|
15
|
-
// https://github.com/lodash/lodash/blob/6018350ac10d5ce6a5b7db625140b82aeab804df/isObject.js#L15-L16
|
|
16
|
-
return set(clonedRoot, elPath, newEl);
|
|
17
|
-
}
|
|
18
|
-
function cloneNode(value) {
|
|
19
|
-
return Array.isArray(value)
|
|
20
|
-
? value.map(n => cloneNodeItem(n))
|
|
21
|
-
: cloneNodeItem(value);
|
|
22
|
-
}
|
|
23
|
-
function cloneNodeItem(value) {
|
|
24
|
-
return isReactElement(value) ? cloneReactElement(value) : value;
|
|
25
|
-
}
|
|
26
|
-
function cloneReactElement(value) {
|
|
27
|
-
const { children, ...otherProps } = value.props;
|
|
28
|
-
return {
|
|
29
|
-
...value,
|
|
30
|
-
props: {
|
|
31
|
-
...otherProps,
|
|
32
|
-
children: cloneNode(children),
|
|
33
|
-
},
|
|
34
|
-
};
|
|
35
|
-
}
|
|
@@ -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,15 +0,0 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { FixtureCapture } from '../FixtureCapture/index.js';
|
|
3
|
-
import { FixtureElement } from './FixtureElement.js';
|
|
4
|
-
export function getDecoratedFixtureElement(fixture, decorators, decoratorProps) {
|
|
5
|
-
const fixtureElement = (React.createElement(FixtureCapture, { decoratorId: "root" }, getFixtureElement(fixture)));
|
|
6
|
-
return [...decorators]
|
|
7
|
-
.reverse()
|
|
8
|
-
.reduce((prevElement, Decorator) => (React.createElement(Decorator, { ...decoratorProps }, prevElement)), fixtureElement);
|
|
9
|
-
}
|
|
10
|
-
function getFixtureElement(fixture) {
|
|
11
|
-
return isFunctionFixture(fixture) ? (React.createElement(FixtureElement, { Component: fixture })) : (fixture);
|
|
12
|
-
}
|
|
13
|
-
function isFunctionFixture(fixture) {
|
|
14
|
-
return typeof fixture === 'function';
|
|
15
|
-
}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { registerPlaygroundShortcuts } from '../registerPlaygroundShortcuts.js';
|
|
2
|
-
export function createPostMessageConnect() {
|
|
3
|
-
function postMessage(msg) {
|
|
4
|
-
parent.postMessage(msg, '*');
|
|
5
|
-
}
|
|
6
|
-
return {
|
|
7
|
-
postMessage,
|
|
8
|
-
onMessage(onMessage) {
|
|
9
|
-
function handleMessage(msg) {
|
|
10
|
-
onMessage(msg.data);
|
|
11
|
-
}
|
|
12
|
-
window.addEventListener('message', handleMessage, false);
|
|
13
|
-
const removeShortcuts = registerPlaygroundShortcuts(command => {
|
|
14
|
-
postMessage({ type: 'playgroundCommand', payload: { command } });
|
|
15
|
-
});
|
|
16
|
-
return () => {
|
|
17
|
-
window.removeEventListener('message', handleMessage);
|
|
18
|
-
removeShortcuts();
|
|
19
|
-
};
|
|
20
|
-
},
|
|
21
|
-
};
|
|
22
|
-
}
|