react-cosmos-renderer
Advanced tools
Comparing version 6.0.0-canary.b87d3fe.0 to 6.0.0-canary.c00ca07.0
export * from './fixture/FixtureCapture/FixtureCapture.js'; | ||
export * from './fixture/FixtureContext.js'; | ||
export * from './fixture/Viewport.js'; | ||
export * from './fixture/useFixtureState.js'; | ||
export * from './fixture/useSelect/index.js'; | ||
@@ -9,1 +10,2 @@ export * from './fixture/useValue/index.js'; | ||
export * from './rendererConnect/RendererProvider.js'; | ||
export * from './rendererConnect/StatefulRendererProvider.js'; |
export * from './fixture/FixtureCapture/FixtureCapture.js'; | ||
export * from './fixture/FixtureContext.js'; | ||
export * from './fixture/Viewport.js'; | ||
export * from './fixture/useFixtureState.js'; | ||
export * from './fixture/useSelect/index.js'; | ||
@@ -9,1 +10,2 @@ export * from './fixture/useValue/index.js'; | ||
export * from './rendererConnect/RendererProvider.js'; | ||
export * from './rendererConnect/StatefulRendererProvider.js'; |
import React from 'react'; | ||
import { useFixtureState } from './useFixtureState.js'; | ||
import { useFixtureClassState } from './useFixtureClassState.js'; | ||
import { useReadClassState } from './useReadClassState.js'; | ||
@@ -12,3 +12,3 @@ export function useClassStateCapture(fixture, decoratorId) { | ||
useReadClassState(fixture, decoratorId, elRefs); | ||
return useFixtureState(fixture, decoratorId, elRefs); | ||
return useFixtureClassState(fixture, decoratorId, elRefs); | ||
} |
import { isEqual } from 'lodash-es'; | ||
import { useContext, useEffect, useRef, } from 'react'; | ||
import { createValues, extendWithValues, findFixtureStateClassState, updateFixtureStateClassState, } from 'react-cosmos-core'; | ||
import { FixtureContext } from '../../FixtureContext.js'; | ||
import { useEffect, useRef } from 'react'; | ||
import { createValues, extendWithValues, findClassStateFixtureStateItem, updateClassStateFixtureStateItem, } from 'react-cosmos-core'; | ||
import { useFixtureState } from '../../useFixtureState.js'; | ||
import { findRelevantElementPaths } from '../shared/findRelevantElementPaths.js'; | ||
@@ -11,3 +11,3 @@ // How often to check the state of the loaded component and update the fixture | ||
const elPaths = findRelevantElementPaths(fixture); | ||
const { fixtureState, setFixtureState } = useContext(FixtureContext); | ||
const [classStateFs, setClassStateFs] = useFixtureState('classState'); | ||
const timeoutId = useRef(null); | ||
@@ -37,14 +37,9 @@ useEffect(() => { | ||
const elementId = { decoratorId, elPath }; | ||
const fsClassState = findFixtureStateClassState(fixtureState, elementId); | ||
if (fsClassState && | ||
state && | ||
!doesFixtureStateMatchClassState(fsClassState, state)) { | ||
const fsItem = findClassStateFixtureStateItem(classStateFs, elementId); | ||
if (fsItem && state && !doesFixtureStateMatchClassState(fsItem, state)) { | ||
fixtureStateChangeScheduled = true; | ||
setFixtureState(prevFs => ({ | ||
...prevFs, | ||
classState: updateFixtureStateClassState({ | ||
fixtureState: prevFs, | ||
elementId, | ||
values: createValues(state), | ||
}), | ||
setClassStateFs(prevFs => updateClassStateFixtureStateItem({ | ||
classStateFs: prevFs, | ||
elementId, | ||
values: createValues(state), | ||
})); | ||
@@ -51,0 +46,0 @@ } |
@@ -7,3 +7,3 @@ import React from 'react'; | ||
}; | ||
export declare function FixtureCapture({ children, decoratorId }: Props): JSX.Element; | ||
export declare function FixtureCapture({ children, decoratorId }: Props): React.ReactNode; | ||
export {}; |
@@ -9,3 +9,2 @@ // In a React Server Components setup this is a Client entry point for fixtures. | ||
'use client'; | ||
import React from 'react'; | ||
import { useClassStateCapture } from './classState/index.js'; | ||
@@ -16,4 +15,3 @@ import { usePropsCapture } from './props/index.js'; | ||
fixture = useClassStateCapture(fixture, decoratorId); | ||
// https://github.com/DefinitelyTyped/DefinitelyTyped/issues/18051 | ||
return React.createElement(React.Fragment, null, fixture); | ||
return fixture; | ||
} |
@@ -1,4 +0,4 @@ | ||
import { useContext, useEffect, useRef } from 'react'; | ||
import { areNodesEqual, createFixtureStateProps, createValues, findFixtureStateProps, getComponentName, getFixtureStateProps, removeFixtureStateProps, updateFixtureStateProps, } from 'react-cosmos-core'; | ||
import { FixtureContext } from '../../FixtureContext.js'; | ||
import { useEffect, useRef } from 'react'; | ||
import { areNodesEqual, createPropsFixtureStateItem, createValues, filterPropsFixtureState, findPropsFixtureStateItem, getComponentName, removePropsFixtureStateItem, updatePropsFixtureStateItem, } from 'react-cosmos-core'; | ||
import { useFixtureState } from '../../useFixtureState.js'; | ||
import { findRelevantElementPaths } from '../shared/findRelevantElementPaths.js'; | ||
@@ -8,3 +8,3 @@ import { getElementAtPath, getExpectedElementAtPath, } from '../shared/nodeTree/index.js'; | ||
export function usePropsCapture(fixture, decoratorId) { | ||
const { fixtureState, setFixtureState } = useContext(FixtureContext); | ||
const [propsFs, setPropsFs] = useFixtureState('props'); | ||
const prevFixtureRef = useRef(fixture); | ||
@@ -14,5 +14,5 @@ const elPaths = findRelevantElementPaths(fixture); | ||
// Create empty fixture state | ||
if (!fixtureState.props && elPaths.length === 0) { | ||
if (!propsFs && elPaths.length === 0) { | ||
// Make sure not to override any (currently pending) fixture state props | ||
setFixtureState(prevFs => ({ ...prevFs, props: prevFs.props || [] })); | ||
setPropsFs(prevFs => prevFs ?? []); | ||
return; | ||
@@ -23,9 +23,6 @@ } | ||
// component type of the corresponding element changed | ||
const fsProps = getFixtureStateProps(fixtureState, decoratorId); | ||
fsProps.forEach(({ elementId }) => { | ||
const decoratorFs = filterPropsFixtureState(propsFs, decoratorId); | ||
decoratorFs.forEach(({ elementId }) => { | ||
if (elPaths.indexOf(elementId.elPath) === -1) { | ||
setFixtureState(prevFs => ({ | ||
...prevFs, | ||
props: removeFixtureStateProps(fixtureState, elementId), | ||
})); | ||
setPropsFs(prevFs => removePropsFixtureStateItem(prevFs, elementId)); | ||
} | ||
@@ -39,12 +36,9 @@ }); | ||
// from another renderer) | ||
if (!findFixtureStateProps(fixtureState, elementId)) { | ||
if (!findPropsFixtureStateItem(propsFs, elementId)) { | ||
const componentName = getComponentName(childEl.type); | ||
setFixtureState(prevFs => ({ | ||
...prevFs, | ||
props: createFixtureStateProps({ | ||
fixtureState: prevFs, | ||
elementId, | ||
values: createValues(childEl.props), | ||
componentName, | ||
}), | ||
setPropsFs(prevFs => createPropsFixtureStateItem({ | ||
propsFs: prevFs, | ||
elementId, | ||
values: createValues(childEl.props), | ||
componentName, | ||
})); | ||
@@ -55,9 +49,6 @@ } | ||
if (!areNodesEqual(prevChildEl, childEl, false)) { | ||
setFixtureState(prevFs => ({ | ||
...prevFs, | ||
props: updateFixtureStateProps({ | ||
fixtureState, | ||
elementId, | ||
values: createValues(childEl.props), | ||
}), | ||
setPropsFs(prevFs => updatePropsFixtureStateItem({ | ||
propsFs: prevFs, | ||
elementId, | ||
values: createValues(childEl.props), | ||
})); | ||
@@ -67,14 +58,7 @@ } | ||
}); | ||
}, [ | ||
fixture, | ||
decoratorId, | ||
elPaths, | ||
fixtureState, | ||
fixtureState.props, | ||
setFixtureState, | ||
]); | ||
}, [decoratorId, elPaths, fixture, propsFs, setPropsFs]); | ||
useEffect(() => { | ||
prevFixtureRef.current = fixture; | ||
}); | ||
return useFixtureProps(fixture, fixtureState, decoratorId); | ||
return useFixtureProps(fixture, propsFs, decoratorId); | ||
} |
import React from 'react'; | ||
import { FixtureDecoratorId, FixtureState } from 'react-cosmos-core'; | ||
export declare function useFixtureProps(fixture: React.ReactNode, fixtureState: FixtureState, decoratorId: FixtureDecoratorId): React.ReactNode; | ||
import { FixtureDecoratorId, PropsFixtureState } from 'react-cosmos-core'; | ||
export declare function useFixtureProps(fixture: React.ReactNode, propsFs: PropsFixtureState | undefined, decoratorId: FixtureDecoratorId): React.ReactNode; |
import { isEqual, mapValues } from 'lodash-es'; | ||
import React from 'react'; | ||
import { DEFAULT_RENDER_KEY, extendWithValues, findFixtureStateProps, getComponentName, } from 'react-cosmos-core'; | ||
import { DEFAULT_RENDER_KEY, extendWithValues, findPropsFixtureStateItem, getComponentName, } from 'react-cosmos-core'; | ||
import { findRelevantElementPaths } from '../shared/findRelevantElementPaths.js'; | ||
import { getChildrenPath, setElementAtPath } from '../shared/nodeTree/index.js'; | ||
export function useFixtureProps(fixture, fixtureState, decoratorId) { | ||
export function useFixtureProps(fixture, propsFs, decoratorId) { | ||
const propCache = React.useMemo(() => ({}), | ||
@@ -14,5 +14,5 @@ // React.useMemo is used as a cache invalidated by decoratorId | ||
const elementId = { decoratorId, elPath }; | ||
const fsProps = findFixtureStateProps(fixtureState, elementId); | ||
const fsItem = findPropsFixtureStateItem(propsFs, elementId); | ||
return setElementAtPath(extendedFixture, elPath, element => { | ||
if (!fsProps || componentTypeChanged(fsProps.componentName)) { | ||
if (!fsItem || componentTypeChanged(fsItem.componentName)) { | ||
return { | ||
@@ -27,3 +27,3 @@ ...element, | ||
const originalProps = element.props; | ||
const extendedProps = extendWithValues(originalProps, fsProps.values); | ||
const extendedProps = extendWithValues(originalProps, fsItem.values); | ||
// Preserve identity between renders for indentical non-primitive props | ||
@@ -54,3 +54,3 @@ const cachedProps = mapValues(extendedProps, (value, propName) => { | ||
: cachedProps, | ||
key: getElRenderKey(elPath, fsProps.renderKey), | ||
key: getElRenderKey(elPath, fsItem.renderKey), | ||
}; | ||
@@ -57,0 +57,0 @@ function componentTypeChanged(componentName) { |
@@ -1,7 +0,6 @@ | ||
import React, { useEffect } from 'react'; | ||
import { findFixtureStateControl } from 'react-cosmos-core'; | ||
import { FixtureContext } from '../FixtureContext.js'; | ||
import { useEffect } from 'react'; | ||
import { useFixtureState } from '../useFixtureState.js'; | ||
import { getDefaultSelectValue } from './shared.js'; | ||
export function useCreateFixtureState(selectName, args) { | ||
const { setFixtureState } = React.useContext(FixtureContext); | ||
const [, setFixtureState] = useFixtureState('controls'); | ||
const defaultValue = getDefaultSelectValue(args); | ||
@@ -13,17 +12,14 @@ useEffect(() => { | ||
setFixtureState(prevFs => { | ||
const fsControl = findFixtureStateControl(prevFs, selectName); | ||
if (fsControl && | ||
fsControl.type === 'select' && | ||
fsControl.defaultValue === defaultValue) | ||
const controlFs = prevFs && prevFs[selectName]; | ||
if (controlFs && | ||
controlFs.type === 'select' && | ||
controlFs.defaultValue === defaultValue) | ||
return prevFs; | ||
return { | ||
...prevFs, | ||
controls: { | ||
...prevFs.controls, | ||
[selectName]: { | ||
type: 'select', | ||
options: args.options, | ||
defaultValue, | ||
currentValue: defaultValue, | ||
}, | ||
[selectName]: { | ||
type: 'select', | ||
options: args.options, | ||
defaultValue, | ||
currentValue: defaultValue, | ||
}, | ||
@@ -30,0 +26,0 @@ }; |
@@ -1,11 +0,9 @@ | ||
import { useContext } from 'react'; | ||
import { findFixtureStateControl } from 'react-cosmos-core'; | ||
import { FixtureContext } from '../FixtureContext.js'; | ||
import { useFixtureState } from '../useFixtureState.js'; | ||
import { getDefaultSelectValue } from './shared.js'; | ||
export function useCurrentValue(selectName, args) { | ||
const { fixtureState } = useContext(FixtureContext); | ||
const fsControl = findFixtureStateControl(fixtureState, selectName); | ||
return fsControl && fsControl.type === 'select' | ||
? fsControl.currentValue | ||
const [fixtureState] = useFixtureState('controls'); | ||
const controlFs = fixtureState && fixtureState[selectName]; | ||
return controlFs && controlFs.type === 'select' | ||
? controlFs.currentValue | ||
: getDefaultSelectValue(args); | ||
} |
@@ -1,21 +0,17 @@ | ||
import { useCallback, useContext } from 'react'; | ||
import { findFixtureStateControl } from 'react-cosmos-core'; | ||
import { FixtureContext } from '../FixtureContext.js'; | ||
import { useCallback } from 'react'; | ||
import { useFixtureState } from '../useFixtureState.js'; | ||
export function useSetValue(selectName) { | ||
const { setFixtureState } = useContext(FixtureContext); | ||
const [, setFixtureState] = useFixtureState('controls'); | ||
return useCallback(value => { | ||
setFixtureState(prevFs => { | ||
const fsControl = findFixtureStateControl(prevFs, selectName); | ||
if (!fsControl || fsControl.type !== 'select') { | ||
const controlFs = prevFs && prevFs[selectName]; | ||
if (!controlFs || controlFs.type !== 'select') { | ||
console.warn(`Invalid fixture state for select: ${selectName}`); | ||
return prevFs; | ||
return prevFs ?? {}; | ||
} | ||
return { | ||
...prevFs, | ||
controls: { | ||
...prevFs.controls, | ||
[selectName]: { | ||
...fsControl, | ||
currentValue: value, | ||
}, | ||
[selectName]: { | ||
...controlFs, | ||
currentValue: value, | ||
}, | ||
@@ -22,0 +18,0 @@ }; |
import { isEqual } from 'lodash-es'; | ||
import React from 'react'; | ||
import { createValue, extendWithValue, findFixtureStateControl, } from 'react-cosmos-core'; | ||
import { FixtureContext } from '../FixtureContext.js'; | ||
import { createValue, extendWithValue, } from 'react-cosmos-core'; | ||
import { useFixtureState } from '../useFixtureState.js'; | ||
export function useCreateFixtureState(inputName, defaultValue) { | ||
const { setFixtureState } = React.useContext(FixtureContext); | ||
const [, setFixtureState] = useFixtureState('controls'); | ||
React.useEffect(() => { | ||
@@ -12,16 +12,13 @@ // The fixture state for this value is (re)created in two situations: | ||
setFixtureState(prevFs => { | ||
const fsControl = findFixtureStateControl(prevFs, inputName); | ||
if (fsControl && | ||
fsControl.type === 'standard' && | ||
fsValueExtendsBaseValue(fsControl.defaultValue, defaultValue)) | ||
const controlFs = prevFs && prevFs[inputName]; | ||
if (controlFs && | ||
controlFs.type === 'standard' && | ||
fsValueExtendsBaseValue(controlFs.defaultValue, defaultValue)) | ||
return prevFs; | ||
return { | ||
...prevFs, | ||
controls: { | ||
...prevFs.controls, | ||
[inputName]: { | ||
type: 'standard', | ||
defaultValue: createValue(defaultValue), | ||
currentValue: createValue(defaultValue), | ||
}, | ||
[inputName]: { | ||
type: 'standard', | ||
defaultValue: createValue(defaultValue), | ||
currentValue: createValue(defaultValue), | ||
}, | ||
@@ -28,0 +25,0 @@ }; |
@@ -1,12 +0,11 @@ | ||
import React from 'react'; | ||
import { extendWithValue, findFixtureStateControl, } from 'react-cosmos-core'; | ||
import { FixtureContext } from '../FixtureContext.js'; | ||
import { extendWithValue, } from 'react-cosmos-core'; | ||
import { useFixtureState } from '../useFixtureState.js'; | ||
export function useCurrentValue(inputName, defaultValue) { | ||
const { fixtureState } = React.useContext(FixtureContext); | ||
const fsControl = findFixtureStateControl(fixtureState, inputName); | ||
return fsControl && fsControl.type === 'standard' | ||
const [fixtureState] = useFixtureState('controls'); | ||
const controlFs = fixtureState && fixtureState[inputName]; | ||
return controlFs && controlFs.type === 'standard' | ||
? // Types of fixture state values cannot be guaranteed at read time, which | ||
// means that tampering with the fixture state can cause runtime errors | ||
extendWithValue(defaultValue, fsControl.currentValue) | ||
extendWithValue(defaultValue, controlFs.currentValue) | ||
: defaultValue; | ||
} |
import React from 'react'; | ||
import { createValue, extendWithValue, findFixtureStateControl, } from 'react-cosmos-core'; | ||
import { FixtureContext } from '../FixtureContext.js'; | ||
import { createValue, extendWithValue, } from 'react-cosmos-core'; | ||
import { useFixtureState } from '../useFixtureState.js'; | ||
export function useSetValue(inputName, defaultValue) { | ||
const { setFixtureState } = React.useContext(FixtureContext); | ||
const [, setFixtureState] = useFixtureState('controls'); | ||
return React.useCallback(stateChange => { | ||
@@ -17,9 +17,6 @@ setFixtureState(prevFs => { | ||
...prevFs, | ||
controls: { | ||
...prevFs.controls, | ||
[inputName]: { | ||
type: 'standard', | ||
defaultValue: createValue(defaultValue), | ||
currentValue: createValue(currentValue), | ||
}, | ||
[inputName]: { | ||
type: 'standard', | ||
defaultValue: createValue(defaultValue), | ||
currentValue: createValue(currentValue), | ||
}, | ||
@@ -31,6 +28,6 @@ }; | ||
function getCurrentValueFromFixtureState(fixtureState, inputName, defaultValue) { | ||
const fsControl = findFixtureStateControl(fixtureState, inputName); | ||
return fsControl && fsControl.type === 'standard' | ||
? extendWithValue(defaultValue, fsControl.currentValue) | ||
const controlFs = fixtureState && fixtureState[inputName]; | ||
return controlFs && controlFs.type === 'standard' | ||
? extendWithValue(defaultValue, controlFs.currentValue) | ||
: defaultValue; | ||
} |
@@ -7,3 +7,3 @@ import React from 'react'; | ||
}; | ||
export declare function Viewport({ children, width, height }: Props): JSX.Element; | ||
export declare function Viewport({ children, width, height }: Props): React.ReactNode; | ||
export declare namespace Viewport { | ||
@@ -10,0 +10,0 @@ var cosmosCapture: boolean; |
'use client'; | ||
import React from 'react'; | ||
import { FixtureContext } from './FixtureContext.js'; | ||
import { useFixtureState } from './useFixtureState.js'; | ||
export function Viewport({ children, width, height }) { | ||
const { setFixtureState } = React.useContext(FixtureContext); | ||
const [, setViewport] = useFixtureState('viewport'); | ||
React.useEffect(() => { | ||
setFixtureState(fixtureState => ({ | ||
...fixtureState, | ||
viewport: { width, height }, | ||
})); | ||
}, [setFixtureState, width, height]); | ||
// https://github.com/DefinitelyTyped/DefinitelyTyped/issues/18051 | ||
return React.createElement(React.Fragment, null, children); | ||
setViewport({ width, height }); | ||
}, [setViewport, width, height]); | ||
return children; | ||
} | ||
Viewport.cosmosCapture = false; |
@@ -1,2 +0,2 @@ | ||
import { ReactElement } from 'react'; | ||
import React from 'react'; | ||
import { ReactDecorator, UserModuleWrappers } from 'react-cosmos-core'; | ||
@@ -6,5 +6,5 @@ type Props = { | ||
globalDecorators?: ReactDecorator[]; | ||
renderMessage?: (msg: string) => ReactElement; | ||
renderMessage?: (msg: string) => React.ReactNode; | ||
}; | ||
export declare function ClientFixtureLoader({ moduleWrappers, globalDecorators, renderMessage, }: Props): JSX.Element; | ||
export declare function ClientFixtureLoader({ moduleWrappers, globalDecorators, renderMessage, }: Props): React.JSX.Element; | ||
export {}; |
@@ -6,14 +6,14 @@ 'use client'; | ||
import { StaticModuleLoader } from '../moduleLoaders/StaticModuleLoader.js'; | ||
import { RendererContext } from '../rendererConnect/RendererContext.js'; | ||
import { FixtureLoaderConnect } from './FixtureLoaderConnect.js'; | ||
import { defaultRenderMessage } from './defaultRenderMessage.js'; | ||
import { useFixtureSelection } from './useFixtureSelection.js'; | ||
export function ClientFixtureLoader({ moduleWrappers, globalDecorators, renderMessage = defaultRenderMessage, }) { | ||
const fixtureSelection = useFixtureSelection(); | ||
return (React.createElement(FixtureLoaderConnect, { moduleWrappers: moduleWrappers, fixtureSelection: fixtureSelection, renderMessage: renderMessage, renderFixture: selection => { | ||
const { selectedFixture } = React.useContext(RendererContext); | ||
return (React.createElement(FixtureLoaderConnect, { moduleWrappers: moduleWrappers, selectedFixture: selectedFixture, renderMessage: renderMessage, renderFixture: selected => { | ||
function renderModules(modules) { | ||
return (React.createElement(FixtureModule, { ...modules, ...selection, globalDecorators: globalDecorators, lazy: moduleWrappers.lazy, renderMessage: renderMessage })); | ||
return (React.createElement(FixtureModule, { ...modules, ...selected, globalDecorators: globalDecorators, lazy: moduleWrappers.lazy, renderMessage: renderMessage })); | ||
} | ||
const { fixtureId } = selection; | ||
const { fixtureId } = selected; | ||
return moduleWrappers.lazy ? (React.createElement(LazyModuleLoader, { fixtureWrapper: moduleWrappers.fixtures[fixtureId.path], decorators: moduleWrappers.decorators, fixturePath: fixtureId.path, renderModules: renderModules })) : (React.createElement(StaticModuleLoader, { fixtureWrapper: moduleWrappers.fixtures[fixtureId.path], decorators: moduleWrappers.decorators, fixturePath: fixtureId.path, renderModules: renderModules })); | ||
} })); | ||
} |
@@ -1,2 +0,1 @@ | ||
/// <reference types="react" /> | ||
export declare function defaultRenderMessage(msg: string): JSX.Element; | ||
export declare function defaultRenderMessage(msg: string): string; |
@@ -1,4 +0,3 @@ | ||
import React from 'react'; | ||
export function defaultRenderMessage(msg) { | ||
return React.createElement(React.Fragment, null, msg); | ||
return msg; | ||
} |
import React from 'react'; | ||
import { UserModuleWrappers } from 'react-cosmos-core'; | ||
import { FixtureSelection } from './useFixtureSelection.js'; | ||
import { SelectedFixture } from './SelectedFixture.js'; | ||
type Props = { | ||
moduleWrappers: UserModuleWrappers; | ||
fixtureSelection: FixtureSelection | null; | ||
renderMessage: (msg: string) => React.ReactElement; | ||
renderFixture: (selection: FixtureSelection) => React.ReactElement; | ||
selectedFixture: SelectedFixture | null; | ||
renderMessage: (msg: string) => React.ReactNode; | ||
renderFixture: (selected: SelectedFixture) => React.ReactNode; | ||
}; | ||
export declare function FixtureLoaderConnect({ moduleWrappers, fixtureSelection, renderMessage, renderFixture, }: Props): JSX.Element; | ||
export declare function FixtureLoaderConnect({ moduleWrappers, selectedFixture, renderMessage, renderFixture, }: Props): React.JSX.Element; | ||
export {}; |
import React from 'react'; | ||
import { DelayRender, getFixtureListFromWrappers, } from 'react-cosmos-core'; | ||
import { RendererSync } from './RendererSync.js'; | ||
export function FixtureLoaderConnect({ moduleWrappers, fixtureSelection, renderMessage, renderFixture, }) { | ||
export function FixtureLoaderConnect({ moduleWrappers, selectedFixture, renderMessage, renderFixture, }) { | ||
const fixtures = React.useMemo(() => getFixtureListFromWrappers(moduleWrappers), [moduleWrappers]); | ||
function renderInner() { | ||
if (!fixtureSelection) { | ||
if (!selectedFixture) { | ||
return (React.createElement(DelayRender, { delay: 500 }, renderMessage('No fixture selected.'))); | ||
} | ||
const { fixtureId } = fixtureSelection; | ||
const { fixtureId } = selectedFixture; | ||
if (!fixtures[fixtureId.path]) { | ||
return renderMessage(`Fixture path not found: ${fixtureId.path}`); | ||
} | ||
return renderFixture(fixtureSelection); | ||
return renderFixture(selectedFixture); | ||
} | ||
return React.createElement(RendererSync, { fixtures: fixtures }, renderInner()); | ||
} |
@@ -7,3 +7,3 @@ import React from 'react'; | ||
}; | ||
export declare function RendererSync({ children, fixtures }: Props): JSX.Element; | ||
export declare function RendererSync({ children, fixtures }: Props): React.ReactNode; | ||
export {}; |
@@ -5,3 +5,4 @@ 'use client'; | ||
export function RendererSync({ children, fixtures }) { | ||
const { params: { fixtureId: selectedFixtureId }, rendererId, rendererConnect, reloadRenderer, lazyItems, } = React.useContext(RendererContext); | ||
const { rendererId, rendererConnect, locked, selectedFixture, selectFixture, unselectFixture, reloadRenderer, lazyItems, } = React.useContext(RendererContext); | ||
const selectedFixtureId = selectedFixture?.fixtureId; | ||
const readyRef = React.useRef(false); | ||
@@ -51,3 +52,16 @@ React.useEffect(() => { | ||
}), [fixtures, reloadRenderer, rendererConnect, rendererId, selectedFixtureId]); | ||
return React.createElement(React.Fragment, null, children); | ||
React.useEffect(() => rendererConnect.onMessage(msg => { | ||
if (!locked && | ||
msg.type === 'selectFixture' && | ||
msg.payload.rendererId === rendererId) { | ||
const { fixtureId, fixtureState } = msg.payload; | ||
selectFixture(fixtureId, fixtureState); | ||
} | ||
else if (!locked && | ||
msg.type === 'unselectFixture' && | ||
msg.payload.rendererId === rendererId) { | ||
unselectFixture(); | ||
} | ||
}), [locked, rendererConnect, rendererId, selectFixture, unselectFixture]); | ||
return children; | ||
} |
import React from 'react'; | ||
import { ReactDecorator, RendererParams, UserModuleWrappers } from 'react-cosmos-core'; | ||
import { ReactDecorator, UserModuleWrappers } from 'react-cosmos-core'; | ||
import { SelectedFixture } from './SelectedFixture.js'; | ||
type Props = { | ||
params: RendererParams; | ||
moduleWrappers: UserModuleWrappers; | ||
globalDecorators?: ReactDecorator[]; | ||
renderMessage?: (msg: string) => React.ReactElement; | ||
renderMessage?: (msg: string) => React.ReactNode; | ||
selectedFixture: SelectedFixture | null; | ||
}; | ||
export declare function ServerFixtureLoader({ params, moduleWrappers, globalDecorators, renderMessage, }: Props): JSX.Element; | ||
export declare function ServerFixtureLoader({ moduleWrappers, globalDecorators, renderMessage, selectedFixture, }: Props): React.JSX.Element; | ||
export {}; |
@@ -0,1 +1,3 @@ | ||
// https://github.com/DefinitelyTyped/DefinitelyTyped/pull/65220 | ||
/// <reference types="react/experimental" /> | ||
import React, { Suspense } from 'react'; | ||
@@ -5,17 +7,9 @@ import { FixtureModule } from '../fixtureModule/FixtureModule.js'; | ||
import { FixtureLoaderConnect } from './FixtureLoaderConnect.js'; | ||
import { ServerFixtureChangeListener } from './ServerFixtureChangeListener.js'; | ||
import { defaultRenderMessage } from './defaultRenderMessage.js'; | ||
export function ServerFixtureLoader({ params, moduleWrappers, globalDecorators, renderMessage = defaultRenderMessage, }) { | ||
const { fixtureId = null, key = 0 } = params; | ||
const fixtureSelection = fixtureId && { | ||
fixtureId, | ||
initialFixtureState: {}, | ||
renderKey: key, | ||
}; | ||
return (React.createElement(ServerFixtureChangeListener, null, | ||
React.createElement(FixtureLoaderConnect, { moduleWrappers: moduleWrappers, fixtureSelection: fixtureSelection, renderMessage: renderMessage, renderFixture: selection => ( | ||
// The suspense boundary allows the rendererReady response to be sent | ||
// before loading the fixture modules. | ||
React.createElement(Suspense, null, | ||
React.createElement(AsyncModuleLoader, { moduleWrappers: moduleWrappers, fixturePath: selection.fixtureId.path, renderModules: modules => (React.createElement(FixtureModule, { ...modules, ...selection, globalDecorators: globalDecorators, lazy: moduleWrappers.lazy, renderMessage: renderMessage })) }))) }))); | ||
export function ServerFixtureLoader({ moduleWrappers, globalDecorators, renderMessage = defaultRenderMessage, selectedFixture, }) { | ||
return (React.createElement(FixtureLoaderConnect, { moduleWrappers: moduleWrappers, selectedFixture: selectedFixture, renderMessage: renderMessage, renderFixture: selected => ( | ||
// The suspense boundary allows the rendererReady response to be sent | ||
// before loading the fixture modules. | ||
React.createElement(Suspense, null, | ||
React.createElement(AsyncModuleLoader, { moduleWrappers: moduleWrappers, fixturePath: selected.fixtureId.path, renderModules: modules => (React.createElement(FixtureModule, { ...modules, ...selected, globalDecorators: globalDecorators, lazy: moduleWrappers.lazy, renderMessage: renderMessage })) }))) })); | ||
} |
@@ -0,1 +1,2 @@ | ||
/// <reference types="react/experimental" /> | ||
import React from 'react'; | ||
@@ -11,5 +12,5 @@ import { FixtureId, FixtureState, ReactDecorator, ReactDecoratorModule, ReactFixtureModule } from 'react-cosmos-core'; | ||
lazy: boolean; | ||
renderMessage: (msg: string) => React.ReactElement; | ||
renderMessage: (msg: string) => React.ReactNode; | ||
}; | ||
export declare function FixtureModule({ fixtureModule, decoratorModules, globalDecorators, fixtureId, initialFixtureState, renderKey, lazy, renderMessage, }: Props): JSX.Element; | ||
export declare function FixtureModule({ fixtureModule, decoratorModules, globalDecorators, fixtureId, initialFixtureState, renderKey, lazy, renderMessage, }: Props): string | number | boolean | Iterable<React.ReactNode> | React.PromiseLikeOfReactNode | React.JSX.Element | null | undefined; | ||
export {}; |
import React from 'react'; | ||
import { getFixtureFromExport, getFixtureItemFromExport, } from 'react-cosmos-core'; | ||
import { getFixtureFromExport, getFixtureItemFromExport, stringifyFixtureId, } from 'react-cosmos-core'; | ||
import { DecoratedFixture } from './DecoratedFixture.js'; | ||
@@ -7,2 +7,3 @@ import { FixtureProvider } from './FixtureProvider.js'; | ||
const fixtureItem = React.useMemo(() => getFixtureItemFromExport(fixtureModule.default), [fixtureModule.default]); | ||
const fixtureKey = React.useMemo(() => `${stringifyFixtureId(fixtureId)}-${renderKey}`, [fixtureId, renderKey]); | ||
const fixture = getFixtureFromExport(fixtureModule.default, fixtureId.name); | ||
@@ -12,4 +13,4 @@ if (typeof fixture === 'undefined') { | ||
} | ||
return (React.createElement(FixtureProvider, { key: renderKey, fixtureId: fixtureId, initialFixtureState: initialFixtureState, fixtureItem: fixtureItem, lazy: lazy }, | ||
return (React.createElement(FixtureProvider, { key: fixtureKey, fixtureId: fixtureId, initialFixtureState: initialFixtureState, fixtureItem: fixtureItem, lazy: lazy }, | ||
React.createElement(DecoratedFixture, { fixture: fixture, userDecoratorModules: decoratorModules, globalDecorators: globalDecorators }))); | ||
} |
@@ -10,3 +10,3 @@ import React from 'react'; | ||
}; | ||
export declare function FixtureProvider(props: Props): JSX.Element; | ||
export declare function FixtureProvider(props: Props): React.JSX.Element; | ||
export {}; |
@@ -0,1 +1,2 @@ | ||
export * from './fixtureLoaders/SelectedFixture.js'; | ||
export * from './fixtureLoaders/ServerFixtureLoader.js'; | ||
@@ -2,0 +3,0 @@ export * from './fixtureModule/createFixtureNode.js'; |
@@ -0,1 +1,2 @@ | ||
export * from './fixtureLoaders/SelectedFixture.js'; | ||
export * from './fixtureLoaders/ServerFixtureLoader.js'; | ||
@@ -2,0 +3,0 @@ export * from './fixtureModule/createFixtureNode.js'; |
import React from 'react'; | ||
import { FixtureList, RendererConnect, RendererParams } from 'react-cosmos-core'; | ||
import { FixtureId, FixtureList, FixtureState, RendererConnect } from 'react-cosmos-core'; | ||
import { SelectedFixture } from '../fixtureLoaders/SelectedFixture.js'; | ||
export type RendererContextValue = { | ||
rendererId: string; | ||
rendererConnect: RendererConnect; | ||
params: RendererParams; | ||
setParams(nextParams: RendererParams): void; | ||
locked: boolean; | ||
selectedFixture: SelectedFixture | null; | ||
selectFixture(fixtureId: FixtureId, initialFixtureState: FixtureState): void; | ||
unselectFixture(): void; | ||
reloadRenderer(): void; | ||
lazyItems: FixtureList; | ||
setLazyItems: React.Dispatch<React.SetStateAction<FixtureList>>; | ||
setLazyItems(nextItems: FixtureList): void; | ||
}; | ||
export declare const RendererContext: React.Context<RendererContextValue>; |
@@ -8,4 +8,6 @@ import React from 'react'; | ||
}, | ||
params: {}, | ||
setParams: () => { }, | ||
locked: false, | ||
selectedFixture: null, | ||
selectFixture: () => { }, | ||
unselectFixture: () => { }, | ||
reloadRenderer: () => { }, | ||
@@ -12,0 +14,0 @@ lazyItems: {}, |
import React from 'react'; | ||
import { RendererConnect, RendererParams } from 'react-cosmos-core'; | ||
export type Props = { | ||
import { FixtureId, FixtureState, RendererConnect } from 'react-cosmos-core'; | ||
import { SelectedFixture } from '../fixtureLoaders/SelectedFixture.js'; | ||
type Props = { | ||
children: React.ReactNode; | ||
rendererId: string; | ||
rendererConnect: RendererConnect; | ||
params: RendererParams; | ||
setParams(nextParams: RendererParams): void; | ||
locked: boolean; | ||
selectedFixture: SelectedFixture | null; | ||
selectFixture(fixtureId: FixtureId, initialFixtureState: FixtureState): void; | ||
unselectFixture(): void; | ||
reloadRenderer(): void; | ||
}; | ||
export declare function RendererProvider(props: Props): JSX.Element; | ||
export declare function RendererProvider(props: Props): React.JSX.Element; | ||
export {}; |
@@ -10,4 +10,6 @@ 'use client'; | ||
rendererConnect: props.rendererConnect, | ||
params: props.params, | ||
setParams: props.setParams, | ||
locked: props.locked, | ||
selectedFixture: props.selectedFixture, | ||
selectFixture: props.selectFixture, | ||
unselectFixture: props.unselectFixture, | ||
reloadRenderer: props.reloadRenderer, | ||
@@ -19,9 +21,11 @@ lazyItems, | ||
lazyItems, | ||
props.params, | ||
props.locked, | ||
props.reloadRenderer, | ||
props.rendererConnect, | ||
props.rendererId, | ||
props.setParams, | ||
props.selectFixture, | ||
props.selectedFixture, | ||
props.unselectFixture, | ||
]); | ||
return (React.createElement(RendererContext.Provider, { value: value }, props.children)); | ||
} |
{ | ||
"name": "react-cosmos-renderer", | ||
"version": "6.0.0-canary.b87d3fe.0+b87d3fe", | ||
"version": "6.0.0-canary.c00ca07.0+c00ca07", | ||
"description": "React Cosmos Renderer", | ||
@@ -14,7 +14,7 @@ "repository": "https://github.com/react-cosmos/react-cosmos/tree/main/packages/react-cosmos-renderer", | ||
"dependencies": { | ||
"lodash-es": "^4.17.21", | ||
"react-cosmos-core": "6.0.0-canary.b87d3fe.0+b87d3fe", | ||
"react-is": "^18.2.0" | ||
"lodash-es": "4.17.21", | ||
"react-cosmos-core": "6.0.0-canary.c00ca07.0+c00ca07", | ||
"react-is": "18.2.0" | ||
}, | ||
"gitHead": "b87d3fe06a56c8e3c4c87e731e31092df67d52c0" | ||
"gitHead": "c00ca07a5b6a2cad4a218d8aae72fa4c2310cc1e" | ||
} |
Manifest confusion
Supply chain riskThis package has inconsistent metadata. This could be malicious or caused by an error when publishing the package.
Found 1 instance in 1 package
Manifest confusion
Supply chain riskThis package has inconsistent metadata. This could be malicious or caused by an error when publishing the package.
Found 1 instance in 1 package
108
69633
1476
+ Addedreact-is@18.2.0(transitive)
- Removedreact-is@18.3.1(transitive)
Updatedlodash-es@4.17.21
Updatedreact-is@18.2.0