react-cosmos-core 6.0.0-alpha.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.
Files changed (146) hide show
  1. package/LICENSE +21 -0
  2. package/dist/fixture/FixtureContext.d.ts +7 -0
  3. package/dist/fixture/FixtureContext.js +5 -0
  4. package/dist/fixture/Viewport.d.ts +8 -0
  5. package/dist/fixture/Viewport.js +19 -0
  6. package/dist/fixture/types.d.ts +13 -0
  7. package/dist/fixture/types.js +1 -0
  8. package/dist/fixture/useSelect/index.d.ts +2 -0
  9. package/dist/fixture/useSelect/index.js +11 -0
  10. package/dist/fixture/useSelect/shared.d.ts +6 -0
  11. package/dist/fixture/useSelect/shared.js +3 -0
  12. package/dist/fixture/useSelect/useCreateFixtureState.d.ts +2 -0
  13. package/dist/fixture/useSelect/useCreateFixtureState.js +32 -0
  14. package/dist/fixture/useSelect/useCurrentValue.d.ts +2 -0
  15. package/dist/fixture/useSelect/useCurrentValue.js +11 -0
  16. package/dist/fixture/useSelect/useSetValue.d.ts +2 -0
  17. package/dist/fixture/useSelect/useSetValue.js +25 -0
  18. package/dist/fixture/useValue/index.d.ts +7 -0
  19. package/dist/fixture/useValue/index.js +9 -0
  20. package/dist/fixture/useValue/shared.d.ts +3 -0
  21. package/dist/fixture/useValue/shared.js +1 -0
  22. package/dist/fixture/useValue/useCreateFixtureState.d.ts +2 -0
  23. package/dist/fixture/useValue/useCreateFixtureState.js +35 -0
  24. package/dist/fixture/useValue/useCurrentValue.d.ts +2 -0
  25. package/dist/fixture/useValue/useCurrentValue.js +13 -0
  26. package/dist/fixture/useValue/useSetValue.d.ts +3 -0
  27. package/dist/fixture/useValue/useSetValue.js +36 -0
  28. package/dist/fixtureState/classState.d.ts +22 -0
  29. package/dist/fixtureState/classState.js +40 -0
  30. package/dist/fixtureState/controls.d.ts +2 -0
  31. package/dist/fixtureState/controls.js +4 -0
  32. package/dist/fixtureState/createValues.d.ts +3 -0
  33. package/dist/fixtureState/createValues.js +39 -0
  34. package/dist/fixtureState/extendWithValues.d.ts +3 -0
  35. package/dist/fixtureState/extendWithValues.js +22 -0
  36. package/dist/fixtureState/props.d.ts +30 -0
  37. package/dist/fixtureState/props.js +49 -0
  38. package/dist/fixtureState/shared.d.ts +9 -0
  39. package/dist/fixtureState/shared.js +30 -0
  40. package/dist/fixtureState/types.d.ts +59 -0
  41. package/dist/fixtureState/types.js +1 -0
  42. package/dist/fixtureTree/createFixtureTree/collapseFixtureDirs.d.ts +2 -0
  43. package/dist/fixtureTree/createFixtureTree/collapseFixtureDirs.js +33 -0
  44. package/dist/fixtureTree/createFixtureTree/collapseIndexes.d.ts +2 -0
  45. package/dist/fixtureTree/createFixtureTree/collapseIndexes.js +15 -0
  46. package/dist/fixtureTree/createFixtureTree/collapseNamedIndexes.d.ts +2 -0
  47. package/dist/fixtureTree/createFixtureTree/collapseNamedIndexes.js +30 -0
  48. package/dist/fixtureTree/createFixtureTree/collapseOuterDirs.d.ts +2 -0
  49. package/dist/fixtureTree/createFixtureTree/collapseOuterDirs.js +13 -0
  50. package/dist/fixtureTree/createFixtureTree/createRawFixtureTree.d.ts +3 -0
  51. package/dist/fixtureTree/createFixtureTree/createRawFixtureTree.js +66 -0
  52. package/dist/fixtureTree/createFixtureTree/hideFixtureSuffix.d.ts +2 -0
  53. package/dist/fixtureTree/createFixtureTree/hideFixtureSuffix.js +24 -0
  54. package/dist/fixtureTree/createFixtureTree/index.d.ts +7 -0
  55. package/dist/fixtureTree/createFixtureTree/index.js +16 -0
  56. package/dist/fixtureTree/flattenFixtureTree.d.ts +10 -0
  57. package/dist/fixtureTree/flattenFixtureTree.js +28 -0
  58. package/dist/fixtureTree/types.d.ts +11 -0
  59. package/dist/fixtureTree/types.js +1 -0
  60. package/dist/index.d.ts +34 -0
  61. package/dist/index.js +34 -0
  62. package/dist/playground/playgroundUrl.d.ts +13 -0
  63. package/dist/playground/playgroundUrl.js +36 -0
  64. package/dist/renderer/FixtureLoader/FixtureCapture/classState/decorateFixtureRefs/index.d.ts +5 -0
  65. package/dist/renderer/FixtureLoader/FixtureCapture/classState/decorateFixtureRefs/index.js +46 -0
  66. package/dist/renderer/FixtureLoader/FixtureCapture/classState/decorateFixtureRefs/isRefSupported.d.ts +4 -0
  67. package/dist/renderer/FixtureLoader/FixtureCapture/classState/decorateFixtureRefs/isRefSupported.js +19 -0
  68. package/dist/renderer/FixtureLoader/FixtureCapture/classState/index.d.ts +3 -0
  69. package/dist/renderer/FixtureLoader/FixtureCapture/classState/index.js +13 -0
  70. package/dist/renderer/FixtureLoader/FixtureCapture/classState/shared.d.ts +18 -0
  71. package/dist/renderer/FixtureLoader/FixtureCapture/classState/shared.js +14 -0
  72. package/dist/renderer/FixtureLoader/FixtureCapture/classState/useFixtureState.d.ts +4 -0
  73. package/dist/renderer/FixtureLoader/FixtureCapture/classState/useFixtureState.js +156 -0
  74. package/dist/renderer/FixtureLoader/FixtureCapture/classState/useReadClassState.d.ts +4 -0
  75. package/dist/renderer/FixtureLoader/FixtureCapture/classState/useReadClassState.js +60 -0
  76. package/dist/renderer/FixtureLoader/FixtureCapture/index.d.ts +7 -0
  77. package/dist/renderer/FixtureLoader/FixtureCapture/index.js +9 -0
  78. package/dist/renderer/FixtureLoader/FixtureCapture/props/index.d.ts +3 -0
  79. package/dist/renderer/FixtureLoader/FixtureCapture/props/index.js +77 -0
  80. package/dist/renderer/FixtureLoader/FixtureCapture/props/useFixtureProps.d.ts +3 -0
  81. package/dist/renderer/FixtureLoader/FixtureCapture/props/useFixtureProps.js +70 -0
  82. package/dist/renderer/FixtureLoader/FixtureCapture/shared/findRelevantElementPaths.d.ts +2 -0
  83. package/dist/renderer/FixtureLoader/FixtureCapture/shared/findRelevantElementPaths.js +23 -0
  84. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/findElementPaths.d.ts +2 -0
  85. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/findElementPaths.js +22 -0
  86. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/getElementAtPath.d.ts +3 -0
  87. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/getElementAtPath.js +26 -0
  88. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/index.d.ts +11 -0
  89. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/index.js +11 -0
  90. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/setElementAtPath.d.ts +2 -0
  91. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/setElementAtPath.js +35 -0
  92. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/shared.d.ts +2 -0
  93. package/dist/renderer/FixtureLoader/FixtureCapture/shared/nodeTree/shared.js +6 -0
  94. package/dist/renderer/FixtureLoader/FixtureLoader.d.ts +52 -0
  95. package/dist/renderer/FixtureLoader/FixtureLoader.js +226 -0
  96. package/dist/renderer/FixtureLoader/FixtureProvider.d.ts +18 -0
  97. package/dist/renderer/FixtureLoader/FixtureProvider.js +18 -0
  98. package/dist/renderer/FixtureLoader/fixtureHelpers.d.ts +2 -0
  99. package/dist/renderer/FixtureLoader/fixtureHelpers.js +15 -0
  100. package/dist/renderer/FixtureLoader/getDecoratedFixtureElement/FixtureElement.d.ts +9 -0
  101. package/dist/renderer/FixtureLoader/getDecoratedFixtureElement/FixtureElement.js +5 -0
  102. package/dist/renderer/FixtureLoader/getDecoratedFixtureElement/index.d.ts +2 -0
  103. package/dist/renderer/FixtureLoader/getDecoratedFixtureElement/index.js +15 -0
  104. package/dist/renderer/FixtureLoader/postMessage.d.ts +2 -0
  105. package/dist/renderer/FixtureLoader/postMessage.js +22 -0
  106. package/dist/renderer/FixtureLoader/webSockets.d.ts +2 -0
  107. package/dist/renderer/FixtureLoader/webSockets.js +32 -0
  108. package/dist/renderer/getFixtureList.d.ts +8 -0
  109. package/dist/renderer/getFixtureList.js +19 -0
  110. package/dist/renderer/getSortedDecoratorsForFixturePath.d.ts +2 -0
  111. package/dist/renderer/getSortedDecoratorsForFixturePath.js +25 -0
  112. package/dist/renderer/isMultiFixture.d.ts +2 -0
  113. package/dist/renderer/isMultiFixture.js +6 -0
  114. package/dist/renderer/reactTypes.d.ts +28 -0
  115. package/dist/renderer/reactTypes.js +1 -0
  116. package/dist/renderer/registerPlaygroundShortcuts.d.ts +1 -0
  117. package/dist/renderer/registerPlaygroundShortcuts.js +40 -0
  118. package/dist/renderer/rendererConfig.d.ts +3 -0
  119. package/dist/renderer/rendererConfig.js +1 -0
  120. package/dist/renderer/types.d.ts +69 -0
  121. package/dist/renderer/types.js +1 -0
  122. package/dist/server/cosmosPluginConfig.d.ts +16 -0
  123. package/dist/server/cosmosPluginConfig.js +1 -0
  124. package/dist/server/serverMessage.d.ts +10 -0
  125. package/dist/server/serverMessage.js +1 -0
  126. package/dist/server/socketMessage.d.ts +10 -0
  127. package/dist/server/socketMessage.js +6 -0
  128. package/dist/utils/array.d.ts +3 -0
  129. package/dist/utils/array.js +21 -0
  130. package/dist/utils/keys.d.ts +6 -0
  131. package/dist/utils/keys.js +6 -0
  132. package/dist/utils/react/areNodesEqual.d.ts +2 -0
  133. package/dist/utils/react/areNodesEqual.js +38 -0
  134. package/dist/utils/react/getComponentName.d.ts +2 -0
  135. package/dist/utils/react/getComponentName.js +11 -0
  136. package/dist/utils/react/isReactElement.d.ts +2 -0
  137. package/dist/utils/react/isReactElement.js +4 -0
  138. package/dist/utils/string.d.ts +5 -0
  139. package/dist/utils/string.js +9 -0
  140. package/dist/utils/tree.d.ts +6 -0
  141. package/dist/utils/tree.js +21 -0
  142. package/dist/utils/types.d.ts +1 -0
  143. package/dist/utils/types.js +1 -0
  144. package/dist/utils/uuid.d.ts +1 -0
  145. package/dist/utils/uuid.js +6 -0
  146. package/package.json +15 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2015-present Ovidiu Cherecheș
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,7 @@
1
+ /// <reference types="react" />
2
+ import { FixtureState, SetFixtureState } from '../fixtureState/types.js';
3
+ export type FixtureContextValue = {
4
+ fixtureState: FixtureState;
5
+ setFixtureState: SetFixtureState;
6
+ };
7
+ export declare const FixtureContext: import("react").Context<FixtureContextValue>;
@@ -0,0 +1,5 @@
1
+ import { createContext } from 'react';
2
+ export const FixtureContext = createContext({
3
+ fixtureState: {},
4
+ setFixtureState: () => { },
5
+ });
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ children: React.ReactNode;
4
+ width: number;
5
+ height: number;
6
+ };
7
+ export declare const Viewport: React.FC<Props>;
8
+ export {};
@@ -0,0 +1,19 @@
1
+ import React from 'react';
2
+ import { FixtureContext } from './FixtureContext.js';
3
+ // This awkward declaration is required because of the cosmosCapture static
4
+ // property, which makes TS generate a declaration for Viewport that doesn't
5
+ // conform to React's component interface. Without this explicit type TS would
6
+ // allow clients to pass any props to Viewport.
7
+ export const Viewport = function Viewport({ children, width, height, }) {
8
+ const { setFixtureState } = React.useContext(FixtureContext);
9
+ React.useEffect(() => {
10
+ setFixtureState(fixtureState => ({
11
+ ...fixtureState,
12
+ viewport: { width, height },
13
+ }));
14
+ }, [setFixtureState, width, height]);
15
+ // https://github.com/DefinitelyTyped/DefinitelyTyped/issues/18051
16
+ return React.createElement(React.Fragment, null, children);
17
+ };
18
+ // @ts-ignore
19
+ Viewport.cosmosCapture = false;
@@ -0,0 +1,13 @@
1
+ export type FixtureId = {
2
+ path: string;
3
+ name?: string;
4
+ };
5
+ export type FixtureListItem = {
6
+ type: 'single';
7
+ } | {
8
+ type: 'multi';
9
+ fixtureNames: string[];
10
+ };
11
+ export type FixtureList = {
12
+ [fixturePath: string]: FixtureListItem;
13
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import { SetSelectValue, UseSelectArgs } from './shared.js';
2
+ export declare function useSelect<Option extends string>(selectName: string, args: UseSelectArgs<Option>): [Option, SetSelectValue<Option>];
@@ -0,0 +1,11 @@
1
+ import { useCreateFixtureState } from './useCreateFixtureState.js';
2
+ import { useCurrentValue } from './useCurrentValue.js';
3
+ import { useSetValue } from './useSetValue.js';
4
+ export function useSelect(selectName, args) {
5
+ if (!args || !args.options || !args.options.length)
6
+ throw new Error('No options provided to useSelect');
7
+ useCreateFixtureState(selectName, args);
8
+ const currentValue = useCurrentValue(selectName, args);
9
+ const setValue = useSetValue(selectName);
10
+ return [currentValue, setValue];
11
+ }
@@ -0,0 +1,6 @@
1
+ export type UseSelectArgs<Option extends string> = {
2
+ options: Option[];
3
+ defaultValue?: Option;
4
+ };
5
+ export type SetSelectValue<Option extends string> = (value: Option) => void;
6
+ export declare function getDefaultSelectValue<Option extends string>({ options, defaultValue, }: UseSelectArgs<Option>): Option;
@@ -0,0 +1,3 @@
1
+ export function getDefaultSelectValue({ options, defaultValue, }) {
2
+ return typeof defaultValue === 'string' ? defaultValue : options[0];
3
+ }
@@ -0,0 +1,2 @@
1
+ import { UseSelectArgs } from './shared.js';
2
+ export declare function useCreateFixtureState<Option extends string>(selectName: string, args: UseSelectArgs<Option>): void;
@@ -0,0 +1,32 @@
1
+ import React, { useEffect } from 'react';
2
+ import { findFixtureStateControl } from '../../fixtureState/controls.js';
3
+ import { FixtureContext } from '../FixtureContext.js';
4
+ import { getDefaultSelectValue } from './shared.js';
5
+ export function useCreateFixtureState(selectName, args) {
6
+ const { setFixtureState } = React.useContext(FixtureContext);
7
+ const defaultValue = getDefaultSelectValue(args);
8
+ useEffect(() => {
9
+ // The fixture state for this select is (re)created in two situations:
10
+ // 1. Initially: No corresponding fixture state select is found
11
+ // 2: Default value change: Current value is reset to new default value
12
+ setFixtureState(prevFs => {
13
+ const fsControl = findFixtureStateControl(prevFs, selectName);
14
+ if (fsControl &&
15
+ fsControl.type === 'select' &&
16
+ fsControl.defaultValue === defaultValue)
17
+ return prevFs;
18
+ return {
19
+ ...prevFs,
20
+ controls: {
21
+ ...prevFs.controls,
22
+ [selectName]: {
23
+ type: 'select',
24
+ options: args.options,
25
+ defaultValue,
26
+ currentValue: defaultValue,
27
+ },
28
+ },
29
+ };
30
+ });
31
+ }, [args.options, defaultValue, selectName, setFixtureState]);
32
+ }
@@ -0,0 +1,2 @@
1
+ import { UseSelectArgs } from './shared.js';
2
+ export declare function useCurrentValue<Option extends string>(selectName: string, args: UseSelectArgs<Option>): Option;
@@ -0,0 +1,11 @@
1
+ import { useContext } from 'react';
2
+ import { findFixtureStateControl } from '../../fixtureState/controls.js';
3
+ import { FixtureContext } from '../FixtureContext.js';
4
+ import { getDefaultSelectValue } from './shared.js';
5
+ export function useCurrentValue(selectName, args) {
6
+ const { fixtureState } = useContext(FixtureContext);
7
+ const fsControl = findFixtureStateControl(fixtureState, selectName);
8
+ return fsControl && fsControl.type === 'select'
9
+ ? fsControl.currentValue
10
+ : getDefaultSelectValue(args);
11
+ }
@@ -0,0 +1,2 @@
1
+ import { SetSelectValue } from './shared.js';
2
+ export declare function useSetValue<Option extends string>(selectName: string): SetSelectValue<Option>;
@@ -0,0 +1,25 @@
1
+ import { useCallback, useContext } from 'react';
2
+ import { findFixtureStateControl } from '../../fixtureState/controls.js';
3
+ import { FixtureContext } from '../FixtureContext.js';
4
+ export function useSetValue(selectName) {
5
+ const { setFixtureState } = useContext(FixtureContext);
6
+ return useCallback(value => {
7
+ setFixtureState(prevFs => {
8
+ const fsControl = findFixtureStateControl(prevFs, selectName);
9
+ if (!fsControl || fsControl.type !== 'select') {
10
+ console.warn(`Invalid fixture state for select: ${selectName}`);
11
+ return prevFs;
12
+ }
13
+ return {
14
+ ...prevFs,
15
+ controls: {
16
+ ...prevFs.controls,
17
+ [selectName]: {
18
+ ...fsControl,
19
+ currentValue: value,
20
+ },
21
+ },
22
+ };
23
+ });
24
+ }, [selectName, setFixtureState]);
25
+ }
@@ -0,0 +1,7 @@
1
+ import { FixtureStateData } from '../../fixtureState/types.js';
2
+ import { SetValue } from './shared.js';
3
+ type Opts<T extends FixtureStateData> = {
4
+ defaultValue: T;
5
+ };
6
+ export declare function useValue<T extends FixtureStateData>(inputName: string, { defaultValue }: Opts<T>): [T, SetValue<T>];
7
+ export {};
@@ -0,0 +1,9 @@
1
+ import { useCreateFixtureState } from './useCreateFixtureState.js';
2
+ import { useCurrentValue } from './useCurrentValue.js';
3
+ import { useSetValue } from './useSetValue.js';
4
+ export function useValue(inputName, { defaultValue }) {
5
+ useCreateFixtureState(inputName, defaultValue);
6
+ const currentValue = useCurrentValue(inputName, defaultValue);
7
+ const setValue = useSetValue(inputName, defaultValue);
8
+ return [currentValue, setValue];
9
+ }
@@ -0,0 +1,3 @@
1
+ import React from 'react';
2
+ import { FixtureStateData } from '../../fixtureState/types.js';
3
+ export type SetValue<T extends FixtureStateData> = React.Dispatch<React.SetStateAction<T>>;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import { FixtureStateData } from '../../fixtureState/types.js';
2
+ export declare function useCreateFixtureState(inputName: string, defaultValue: FixtureStateData): void;
@@ -0,0 +1,35 @@
1
+ import { isEqual } from 'lodash-es';
2
+ import React from 'react';
3
+ import { findFixtureStateControl } from '../../fixtureState/controls.js';
4
+ import { createValue } from '../../fixtureState/createValues.js';
5
+ import { extendWithValue } from '../../fixtureState/extendWithValues.js';
6
+ import { FixtureContext } from '../FixtureContext.js';
7
+ export function useCreateFixtureState(inputName, defaultValue) {
8
+ const { setFixtureState } = React.useContext(FixtureContext);
9
+ React.useEffect(() => {
10
+ // The fixture state for this value is (re)created in two situations:
11
+ // 1. Initially: No corresponding fixture state value is found
12
+ // 2: Default value change: Current value is reset to new default value
13
+ setFixtureState(prevFs => {
14
+ const fsControl = findFixtureStateControl(prevFs, inputName);
15
+ if (fsControl &&
16
+ fsControl.type === 'standard' &&
17
+ fsValueExtendsBaseValue(fsControl.defaultValue, defaultValue))
18
+ return prevFs;
19
+ return {
20
+ ...prevFs,
21
+ controls: {
22
+ ...prevFs.controls,
23
+ [inputName]: {
24
+ type: 'standard',
25
+ defaultValue: createValue(defaultValue),
26
+ currentValue: createValue(defaultValue),
27
+ },
28
+ },
29
+ };
30
+ });
31
+ }, [setFixtureState, inputName, defaultValue]);
32
+ }
33
+ function fsValueExtendsBaseValue(fsValue, baseValue) {
34
+ return isEqual(baseValue, extendWithValue(baseValue, fsValue));
35
+ }
@@ -0,0 +1,2 @@
1
+ import { FixtureStateData } from '../../fixtureState/types.js';
2
+ export declare function useCurrentValue<T extends FixtureStateData>(inputName: string, defaultValue: T): T;
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ import { findFixtureStateControl } from '../../fixtureState/controls.js';
3
+ import { extendWithValue } from '../../fixtureState/extendWithValues.js';
4
+ import { FixtureContext } from '../FixtureContext.js';
5
+ export function useCurrentValue(inputName, defaultValue) {
6
+ const { fixtureState } = React.useContext(FixtureContext);
7
+ const fsControl = findFixtureStateControl(fixtureState, inputName);
8
+ return fsControl && fsControl.type === 'standard'
9
+ ? // Types of fixture state values cannot be guaranteed at read time, which
10
+ // means that tampering with the fixture state can cause runtime errors
11
+ extendWithValue(defaultValue, fsControl.currentValue)
12
+ : defaultValue;
13
+ }
@@ -0,0 +1,3 @@
1
+ import { FixtureStateData } from '../../fixtureState/types.js';
2
+ import { SetValue } from './shared.js';
3
+ export declare function useSetValue<T extends FixtureStateData>(inputName: string, defaultValue: T): SetValue<T>;
@@ -0,0 +1,36 @@
1
+ import React from 'react';
2
+ import { findFixtureStateControl } from '../../fixtureState/controls.js';
3
+ import { createValue } from '../../fixtureState/createValues.js';
4
+ import { extendWithValue } from '../../fixtureState/extendWithValues.js';
5
+ import { FixtureContext } from '../FixtureContext.js';
6
+ export function useSetValue(inputName, defaultValue) {
7
+ const { setFixtureState } = React.useContext(FixtureContext);
8
+ return React.useCallback(stateChange => {
9
+ setFixtureState(prevFs => {
10
+ const currentValue = typeof stateChange === 'function'
11
+ ? stateChange(
12
+ // Types of fixture state values cannot be guaranteed at read
13
+ // time, which means that tampering with the fixture state can
14
+ // cause runtime errors
15
+ getCurrentValueFromFixtureState(prevFs, inputName, defaultValue))
16
+ : stateChange;
17
+ return {
18
+ ...prevFs,
19
+ controls: {
20
+ ...prevFs.controls,
21
+ [inputName]: {
22
+ type: 'standard',
23
+ defaultValue: createValue(defaultValue),
24
+ currentValue: createValue(currentValue),
25
+ },
26
+ },
27
+ };
28
+ });
29
+ }, [setFixtureState, defaultValue, inputName]);
30
+ }
31
+ function getCurrentValueFromFixtureState(fixtureState, inputName, defaultValue) {
32
+ const fsControl = findFixtureStateControl(fixtureState, inputName);
33
+ return fsControl && fsControl.type === 'standard'
34
+ ? extendWithValue(defaultValue, fsControl.currentValue)
35
+ : defaultValue;
36
+ }
@@ -0,0 +1,22 @@
1
+ import { FixtureDecoratorId, FixtureElementId, FixtureState, FixtureStateClassState, FixtureStateValues } from './types.js';
2
+ export declare function getFixtureStateClassState(fixtureState: FixtureState, decoratorId: FixtureDecoratorId): FixtureStateClassState[];
3
+ export declare function findFixtureStateClassState(fixtureState: FixtureState, elementId: FixtureElementId): void | FixtureStateClassState;
4
+ type CreateFixtureStateClassStateArgs = {
5
+ fixtureState: FixtureState;
6
+ elementId: FixtureElementId;
7
+ values: FixtureStateValues;
8
+ componentName: string;
9
+ };
10
+ export declare function createFixtureStateClassState({ fixtureState, elementId, values, componentName, }: CreateFixtureStateClassStateArgs): {
11
+ elementId: FixtureElementId;
12
+ values: FixtureStateValues;
13
+ componentName: string;
14
+ }[];
15
+ type UpdateFixtureStateClassStateArgs = {
16
+ fixtureState: FixtureState;
17
+ elementId: FixtureElementId;
18
+ values: FixtureStateValues;
19
+ };
20
+ export declare function updateFixtureStateClassState({ fixtureState, elementId, values, }: UpdateFixtureStateClassStateArgs): FixtureStateClassState[];
21
+ export declare function removeFixtureStateClassState(fixtureState: FixtureState, elementId: FixtureElementId): FixtureStateClassState[];
22
+ export {};
@@ -0,0 +1,40 @@
1
+ import { find, isEqual } from 'lodash-es';
2
+ import { removeItemMatch, replaceOrAddItem, updateItem, } from '../utils/array.js';
3
+ export function getFixtureStateClassState(fixtureState, decoratorId) {
4
+ const { classState } = fixtureState;
5
+ return classState
6
+ ? classState.filter(s => s.elementId.decoratorId === decoratorId)
7
+ : [];
8
+ }
9
+ export function findFixtureStateClassState(fixtureState, elementId) {
10
+ const { classState } = fixtureState;
11
+ return classState && find(classState, s => isEqual(s.elementId, elementId));
12
+ }
13
+ export function createFixtureStateClassState({ fixtureState, elementId, values, componentName, }) {
14
+ const { classState = [] } = fixtureState;
15
+ return replaceOrAddItem(classState, createClassStateMatcher(elementId), {
16
+ elementId,
17
+ values,
18
+ componentName,
19
+ });
20
+ }
21
+ export function updateFixtureStateClassState({ fixtureState, elementId, values, }) {
22
+ const classStateItem = expectFixtureStateClassState(fixtureState, elementId);
23
+ return updateItem(fixtureState.classState, classStateItem, {
24
+ values,
25
+ });
26
+ }
27
+ export function removeFixtureStateClassState(fixtureState, elementId) {
28
+ return removeItemMatch(fixtureState.classState || [], createClassStateMatcher(elementId));
29
+ }
30
+ function createClassStateMatcher(elementId) {
31
+ return (p) => isEqual(p.elementId, elementId);
32
+ }
33
+ function expectFixtureStateClassState(fixtureState, elementId) {
34
+ const classStateItem = findFixtureStateClassState(fixtureState, elementId);
35
+ if (!classStateItem) {
36
+ const elId = JSON.stringify(elementId);
37
+ throw new Error(`Fixture state class state missing for element "${elId}"`);
38
+ }
39
+ return classStateItem;
40
+ }
@@ -0,0 +1,2 @@
1
+ import { FixtureState, FixtureStateControl } from './types.js';
2
+ export declare function findFixtureStateControl(fixtureState: FixtureState, inputName: string): void | FixtureStateControl;
@@ -0,0 +1,4 @@
1
+ export function findFixtureStateControl(fixtureState, inputName) {
2
+ const { controls } = fixtureState;
3
+ return controls && controls[inputName];
4
+ }
@@ -0,0 +1,3 @@
1
+ import { FixtureStateValue, FixtureStateValues, ObjectData } from './types.js';
2
+ export declare function createValues(obj: ObjectData): FixtureStateValues;
3
+ export declare function createValue(data: unknown): FixtureStateValue;
@@ -0,0 +1,39 @@
1
+ import { isElement } from 'react-is';
2
+ import { isArray, isObject, isPrimitiveData } from './shared.js';
3
+ export function createValues(obj) {
4
+ const values = {};
5
+ Object.keys(obj).forEach(key => {
6
+ values[key] = createValue(obj[key]);
7
+ });
8
+ return values;
9
+ }
10
+ export function createValue(data) {
11
+ if (isPrimitiveData(data))
12
+ return { type: 'primitive', data };
13
+ if (isArray(data))
14
+ return {
15
+ type: 'array',
16
+ values: data.map(i => createValue(i)),
17
+ };
18
+ if (isObject(data))
19
+ return {
20
+ type: 'object',
21
+ values: createValues(data),
22
+ };
23
+ // Why store unserializable values in fixture state?
24
+ // - Because they still provides value in the Cosmos UI. They let the user know
25
+ // that, eg. a prop, is present and see the read-only stringified value.
26
+ // - More importantly, because the fixture state controls which props to render.
27
+ // This way, if a prop is read-only and cannot be edited in the UI, it can
28
+ // still be removed.
29
+ return {
30
+ type: 'unserializable',
31
+ stringifiedData: stringifyUnserializableData(data),
32
+ };
33
+ }
34
+ function stringifyUnserializableData(data) {
35
+ // NOTE: We used to use the react-element-to-jsx-string package but it added
36
+ // bloat and complicated ESM support. We might go back to something similar
37
+ // in the future. Or expose a plugin API for custom stringifiers.
38
+ return isElement(data) ? '<React.Element />' : String(data);
39
+ }
@@ -0,0 +1,3 @@
1
+ import { FixtureStateValue, FixtureStateValues, ObjectData } from './types.js';
2
+ export declare function extendWithValues(obj: ObjectData, values: FixtureStateValues): ObjectData;
3
+ export declare function extendWithValue(data: unknown, value: FixtureStateValue): unknown;
@@ -0,0 +1,22 @@
1
+ import { isArray, isObject } from './shared.js';
2
+ // Use fixture state for serializable values and fall back to base values
3
+ export function extendWithValues(obj, values) {
4
+ const extendedObj = {};
5
+ Object.keys(values).forEach(key => {
6
+ extendedObj[key] = extendWithValue(obj[key], values[key]);
7
+ });
8
+ return extendedObj;
9
+ }
10
+ export function extendWithValue(data, value) {
11
+ if (value.type === 'unserializable')
12
+ return data;
13
+ if (value.type === 'object') {
14
+ const obj = isObject(data) ? data : {};
15
+ return extendWithValues(obj, value.values);
16
+ }
17
+ if (value.type === 'array') {
18
+ const array = isArray(data) ? data : [];
19
+ return value.values.map((v, idx) => extendWithValue(array[idx], v));
20
+ }
21
+ return value.data;
22
+ }
@@ -0,0 +1,30 @@
1
+ import { FixtureDecoratorId, FixtureElementId, FixtureRenderKey, FixtureState, FixtureStateProps, FixtureStateValues } from './types.js';
2
+ export declare const DEFAULT_RENDER_KEY: FixtureRenderKey;
3
+ export declare function getFixtureStateProps(fixtureState: FixtureState, decoratorId: FixtureDecoratorId): FixtureStateProps[];
4
+ export declare function findFixtureStateProps(fixtureState: FixtureState, elementId: FixtureElementId): void | FixtureStateProps;
5
+ type CreateFixtureStatePropsArgs = {
6
+ fixtureState: FixtureState;
7
+ elementId: FixtureElementId;
8
+ values: FixtureStateValues;
9
+ componentName: string;
10
+ };
11
+ export declare function createFixtureStateProps({ fixtureState, elementId, values, componentName, }: CreateFixtureStatePropsArgs): {
12
+ elementId: FixtureElementId;
13
+ values: FixtureStateValues;
14
+ renderKey: number;
15
+ componentName: string;
16
+ }[];
17
+ type ResetFixtureStatePropsArgs = {
18
+ fixtureState: FixtureState;
19
+ elementId: FixtureElementId;
20
+ values: FixtureStateValues;
21
+ };
22
+ export declare function resetFixtureStateProps({ fixtureState, elementId, values, }: ResetFixtureStatePropsArgs): FixtureStateProps[];
23
+ type UpdateFixtureStatePropsArgs = {
24
+ fixtureState: FixtureState;
25
+ elementId: FixtureElementId;
26
+ values: FixtureStateValues;
27
+ };
28
+ export declare function updateFixtureStateProps({ fixtureState, elementId, values, }: UpdateFixtureStatePropsArgs): FixtureStateProps[];
29
+ export declare function removeFixtureStateProps(fixtureState: FixtureState, elementId: FixtureElementId): FixtureStateProps[];
30
+ export {};
@@ -0,0 +1,49 @@
1
+ import { find, isEqual } from 'lodash-es';
2
+ import { removeItemMatch, replaceOrAddItem, updateItem, } from '../utils/array.js';
3
+ export const DEFAULT_RENDER_KEY = 0;
4
+ export function getFixtureStateProps(fixtureState, decoratorId) {
5
+ const { props } = fixtureState;
6
+ return props
7
+ ? props.filter(p => p.elementId.decoratorId === decoratorId)
8
+ : [];
9
+ }
10
+ export function findFixtureStateProps(fixtureState, elementId) {
11
+ const { props } = fixtureState;
12
+ return props && find(props, p => isEqual(p.elementId, elementId));
13
+ }
14
+ export function createFixtureStateProps({ fixtureState, elementId, values, componentName, }) {
15
+ const { props = [] } = fixtureState;
16
+ return replaceOrAddItem(props, createPropsMatcher(elementId), {
17
+ elementId,
18
+ values,
19
+ renderKey: DEFAULT_RENDER_KEY,
20
+ componentName,
21
+ });
22
+ }
23
+ export function resetFixtureStateProps({ fixtureState, elementId, values, }) {
24
+ const propsItem = expectFixtureStateProps(fixtureState, elementId);
25
+ return updateItem(fixtureState.props, propsItem, {
26
+ values,
27
+ renderKey: propsItem.renderKey + 1,
28
+ });
29
+ }
30
+ export function updateFixtureStateProps({ fixtureState, elementId, values, }) {
31
+ const propsItem = expectFixtureStateProps(fixtureState, elementId);
32
+ return updateItem(fixtureState.props, propsItem, {
33
+ values,
34
+ });
35
+ }
36
+ export function removeFixtureStateProps(fixtureState, elementId) {
37
+ return removeItemMatch(fixtureState.props || [], createPropsMatcher(elementId));
38
+ }
39
+ function createPropsMatcher(elementId) {
40
+ return (p) => isEqual(p.elementId, elementId);
41
+ }
42
+ function expectFixtureStateProps(fixtureState, elementId) {
43
+ const propsItem = findFixtureStateProps(fixtureState, elementId);
44
+ if (!propsItem) {
45
+ const elId = JSON.stringify(elementId);
46
+ throw new Error(`Fixture state props missing for element "${elId}"`);
47
+ }
48
+ return propsItem;
49
+ }
@@ -0,0 +1,9 @@
1
+ import { ArrayData, ObjectData, PrimitiveData } from './types.js';
2
+ export declare function isString(value: unknown): value is string;
3
+ export declare function isNumber(value: unknown): value is number;
4
+ export declare function isBoolean(value: unknown): value is boolean;
5
+ export declare function isNull(value: unknown): value is null;
6
+ export declare function isUndefined(value: unknown): value is undefined;
7
+ export declare function isPrimitiveData(data: unknown): data is PrimitiveData;
8
+ export declare function isObject(data: unknown): data is ObjectData;
9
+ export declare function isArray(data: unknown): data is ArrayData;
@@ -0,0 +1,30 @@
1
+ import { isPlainObject } from 'lodash-es';
2
+ import { isElement } from 'react-is';
3
+ export function isString(value) {
4
+ return typeof value === 'string';
5
+ }
6
+ export function isNumber(value) {
7
+ return typeof value === 'number';
8
+ }
9
+ export function isBoolean(value) {
10
+ return typeof value === 'boolean';
11
+ }
12
+ export function isNull(value) {
13
+ return value === null;
14
+ }
15
+ export function isUndefined(value) {
16
+ return value === undefined;
17
+ }
18
+ export function isPrimitiveData(data) {
19
+ return (isString(data) ||
20
+ isNumber(data) ||
21
+ isBoolean(data) ||
22
+ isNull(data) ||
23
+ isUndefined(data));
24
+ }
25
+ export function isObject(data) {
26
+ return isPlainObject(data) && !isElement(data);
27
+ }
28
+ export function isArray(data) {
29
+ return Array.isArray(data);
30
+ }