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
@@ -0,0 +1,226 @@
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() { }
@@ -0,0 +1,18 @@
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 {};
@@ -0,0 +1,18 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ import { ReactFixture, ReactFixtureExport } from '../reactTypes.js';
2
+ export declare function getFixture(fixtureExport: ReactFixtureExport, fixtureName?: string): void | ReactFixture;
@@ -0,0 +1,15 @@
1
+ import { isMultiFixture } from '../isMultiFixture.js';
2
+ export function getFixture(fixtureExport, fixtureName) {
3
+ if (fixtureName === undefined) {
4
+ if (isMultiFixture(fixtureExport)) {
5
+ // Fixture name missing in multi fixture
6
+ return;
7
+ }
8
+ return fixtureExport;
9
+ }
10
+ if (!isMultiFixture(fixtureExport)) {
11
+ // Fixture name not found in single fixture
12
+ return;
13
+ }
14
+ return fixtureExport[fixtureName];
15
+ }
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ type Props = {
3
+ Component: React.FunctionComponent;
4
+ };
5
+ export declare function FixtureElement({ Component }: Props): JSX.Element;
6
+ export declare namespace FixtureElement {
7
+ var cosmosCapture: boolean;
8
+ }
9
+ export {};
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export function FixtureElement({ Component }) {
3
+ return React.createElement(Component, null);
4
+ }
5
+ FixtureElement.cosmosCapture = false;
@@ -0,0 +1,2 @@
1
+ import { ReactDecorator, ReactDecoratorProps, ReactFixture } from '../../reactTypes.js';
2
+ export declare function getDecoratedFixtureElement(fixture: ReactFixture, decorators: ReactDecorator[], decoratorProps: Omit<ReactDecoratorProps, 'children'>): JSX.Element;
@@ -0,0 +1,15 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ import { RendererConnect } from '../types.js';
2
+ export declare function createPostMessageConnect(): RendererConnect;
@@ -0,0 +1,22 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ import { RendererConnect } from '../types.js';
2
+ export declare function createWebSocketsConnect(url: string): RendererConnect;
@@ -0,0 +1,32 @@
1
+ import { rendererSocketMessage, } from '../../server/socketMessage.js';
2
+ export function createWebSocketsConnect(url) {
3
+ let pendingMessages = [];
4
+ const socket = new WebSocket(url);
5
+ socket.addEventListener('open', () => {
6
+ if (pendingMessages.length > 0) {
7
+ pendingMessages.forEach(msg => socket.send(JSON.stringify(msg)));
8
+ pendingMessages = [];
9
+ }
10
+ });
11
+ return {
12
+ postMessage(rendererResponse) {
13
+ const socketMessage = rendererSocketMessage(rendererResponse);
14
+ if (socket && socket.readyState === WebSocket.OPEN) {
15
+ socket.send(JSON.stringify(socketMessage));
16
+ }
17
+ else {
18
+ pendingMessages.push(socketMessage);
19
+ }
20
+ },
21
+ onMessage(onMessage) {
22
+ function handleMessage(msg) {
23
+ const socketMessage = JSON.parse(msg.data);
24
+ if (socketMessage.channel === 'renderer') {
25
+ onMessage(socketMessage.message);
26
+ }
27
+ }
28
+ socket.addEventListener('message', handleMessage);
29
+ return () => socket.removeEventListener('message', handleMessage);
30
+ },
31
+ };
32
+ }
@@ -0,0 +1,8 @@
1
+ import { FixtureListItem } from '../fixture/types.js';
2
+ import { ReactFixtureExports, ReactFixtureWrappers } from './reactTypes.js';
3
+ export declare function getFixtureListFromWrappers(wrappers: ReactFixtureWrappers): {
4
+ [x: string]: FixtureListItem;
5
+ };
6
+ export declare function getFixtureListFromExports(exports: ReactFixtureExports): {
7
+ [x: string]: FixtureListItem;
8
+ };
@@ -0,0 +1,19 @@
1
+ import { isMultiFixture } from './isMultiFixture.js';
2
+ export function getFixtureListFromWrappers(wrappers) {
3
+ return Object.keys(wrappers).reduce((acc, fixturePath) => {
4
+ return { ...acc, [fixturePath]: getItemFromWrapper(wrappers[fixturePath]) };
5
+ }, {});
6
+ }
7
+ export function getFixtureListFromExports(exports) {
8
+ return Object.keys(exports).reduce((acc, fixturePath) => {
9
+ return { ...acc, [fixturePath]: getItemFromExport(exports[fixturePath]) };
10
+ }, {});
11
+ }
12
+ function getItemFromWrapper(wrapper) {
13
+ return getItemFromExport(wrapper.module.default);
14
+ }
15
+ function getItemFromExport(fixtureExport) {
16
+ return isMultiFixture(fixtureExport)
17
+ ? { type: 'multi', fixtureNames: Object.keys(fixtureExport) }
18
+ : { type: 'single' };
19
+ }
@@ -0,0 +1,2 @@
1
+ import { ReactDecorator, ReactDecorators } from './reactTypes.js';
2
+ export declare function getSortedDecoratorsForFixturePath(fixturePath: string, decoratorsByPath: ReactDecorators): ReactDecorator[];
@@ -0,0 +1,25 @@
1
+ export function getSortedDecoratorsForFixturePath(fixturePath, decoratorsByPath) {
2
+ return getSortedDecorators(getDecoratorsForFixturePath(decoratorsByPath, fixturePath));
3
+ }
4
+ function getDecoratorsForFixturePath(decoratorsByPath, fixturePath) {
5
+ return Object.keys(decoratorsByPath)
6
+ .filter(dPath => isParentDir(getParentPath(dPath), fixturePath))
7
+ .reduce((acc, dPath) => ({ ...acc, [dPath]: decoratorsByPath[dPath] }), {});
8
+ }
9
+ function isParentDir(parentPath, filePath) {
10
+ return parentPath === '' || filePath.indexOf(`${parentPath}/`) === 0;
11
+ }
12
+ function getParentPath(nestedPath) {
13
+ // Remove everything right of the right-most forward slash, or return an
14
+ // empty string if path has no forward slash
15
+ return nestedPath.replace(/^((.+)\/)?.+$/, '$2');
16
+ }
17
+ function getSortedDecorators(decoratorsByPath) {
18
+ return sortPathsByDepthAsc(Object.keys(decoratorsByPath)).map(decoratorPath => decoratorsByPath[decoratorPath]);
19
+ }
20
+ function sortPathsByDepthAsc(paths) {
21
+ return [...paths].sort((a, b) => getPathNestingLevel(a) - getPathNestingLevel(b) || a.localeCompare(b));
22
+ }
23
+ function getPathNestingLevel(path) {
24
+ return path.split('/').length;
25
+ }
@@ -0,0 +1,2 @@
1
+ import { ReactFixtureExport, ReactFixtureMap } from './reactTypes.js';
2
+ export declare function isMultiFixture(fixtureExport: ReactFixtureExport): fixtureExport is ReactFixtureMap;
@@ -0,0 +1,6 @@
1
+ import { isElement } from 'react-is';
2
+ export function isMultiFixture(fixtureExport) {
3
+ return (fixtureExport !== null &&
4
+ typeof fixtureExport === 'object' &&
5
+ !isElement(fixtureExport));
6
+ }
@@ -0,0 +1,28 @@
1
+ import { ComponentType, FunctionComponent, ReactNode } from 'react';
2
+ import { FixtureState, SetFixtureState } from '../fixtureState/types.js';
3
+ type FixtureMap<FixtureType> = {
4
+ [fixtureName: string]: FixtureType;
5
+ };
6
+ type FixtureExport<FixtureType> = FixtureType | FixtureMap<FixtureType>;
7
+ type FixtureModule<FixtureType> = {
8
+ default: FixtureExport<FixtureType>;
9
+ };
10
+ type FixtureWrapper<FixtureType> = {
11
+ module: FixtureModule<FixtureType>;
12
+ };
13
+ export type ReactFixture = ReactNode | FunctionComponent;
14
+ export type ReactFixtureMap = FixtureMap<ReactFixture>;
15
+ export type ReactFixtureExport = FixtureExport<ReactFixture>;
16
+ export type ReactFixtureModule = FixtureModule<ReactFixture>;
17
+ export type ReactFixtureWrapper = FixtureWrapper<ReactFixture>;
18
+ export type ReactDecoratorProps = {
19
+ children: ReactNode;
20
+ fixtureState: FixtureState;
21
+ setFixtureState: SetFixtureState;
22
+ onErrorReset: () => unknown;
23
+ };
24
+ export type ReactDecorator = ComponentType<ReactDecoratorProps>;
25
+ export type ReactFixtureExports = Record<string, ReactFixtureExport>;
26
+ export type ReactFixtureWrappers = Record<string, ReactFixtureWrapper>;
27
+ export type ReactDecorators = Record<string, ReactDecorator>;
28
+ export {};
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare function registerPlaygroundShortcuts(runCommand: (command: string) => unknown): () => void;
@@ -0,0 +1,40 @@
1
+ export function registerPlaygroundShortcuts(runCommand) {
2
+ window.addEventListener('keydown', handleWindowKeyDown);
3
+ function run(e, command) {
4
+ e.preventDefault();
5
+ runCommand(command);
6
+ }
7
+ function handleWindowKeyDown(e) {
8
+ if (isEditing()) {
9
+ return;
10
+ }
11
+ const keyChar = String.fromCharCode(e.keyCode);
12
+ const metaKey = e.metaKey || e.ctrlKey;
13
+ if (keyChar === 'P' && metaKey) {
14
+ run(e, 'searchFixtures');
15
+ }
16
+ else if (keyChar === 'L' && metaKey && e.shiftKey) {
17
+ run(e, 'toggleFixtureList');
18
+ }
19
+ else if (keyChar === 'K' && metaKey && e.shiftKey) {
20
+ run(e, 'toggleControlPanel');
21
+ }
22
+ else if (keyChar === 'F' && metaKey && e.shiftKey) {
23
+ run(e, 'goFullScreen');
24
+ }
25
+ else if (keyChar === 'E' && metaKey && e.shiftKey) {
26
+ run(e, 'editFixture');
27
+ }
28
+ }
29
+ return () => {
30
+ window.removeEventListener('keydown', handleWindowKeyDown);
31
+ };
32
+ }
33
+ function isEditing() {
34
+ const activeElement = document.activeElement;
35
+ return activeElement && isInputTag(activeElement.tagName);
36
+ }
37
+ function isInputTag(tagName) {
38
+ const inputTags = ['input', 'textarea', 'select'];
39
+ return inputTags.includes(tagName.toLowerCase());
40
+ }
@@ -0,0 +1,3 @@
1
+ export type RendererConfig = {
2
+ playgroundUrl: string;
3
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,69 @@
1
+ import { FixtureState } from '../fixtureState/types.js';
2
+ import { FixtureId, FixtureList } from '../fixture/types.js';
3
+ export type RendererId = string;
4
+ export type PingRenderersRequest = {
5
+ type: 'pingRenderers';
6
+ };
7
+ export type SelectFixtureRequest = {
8
+ type: 'selectFixture';
9
+ payload: {
10
+ rendererId: RendererId;
11
+ fixtureId: FixtureId;
12
+ fixtureState: FixtureState;
13
+ };
14
+ };
15
+ export type UnselectFixtureRequest = {
16
+ type: 'unselectFixture';
17
+ payload: {
18
+ rendererId: RendererId;
19
+ };
20
+ };
21
+ export type SetFixtureStateRequest = {
22
+ type: 'setFixtureState';
23
+ payload: {
24
+ rendererId: RendererId;
25
+ fixtureId: FixtureId;
26
+ fixtureState: FixtureState;
27
+ };
28
+ };
29
+ export type RendererRequest = PingRenderersRequest | SelectFixtureRequest | UnselectFixtureRequest | SetFixtureStateRequest;
30
+ export type RendererReadyResponse = {
31
+ type: 'rendererReady';
32
+ payload: {
33
+ rendererId: RendererId;
34
+ fixtures: FixtureList;
35
+ initialFixtureId?: FixtureId;
36
+ };
37
+ };
38
+ export type RendererErrorResponse = {
39
+ type: 'rendererError';
40
+ payload: {
41
+ rendererId: RendererId;
42
+ };
43
+ };
44
+ export type FixtureListUpdateResponse = {
45
+ type: 'fixtureListUpdate';
46
+ payload: {
47
+ rendererId: RendererId;
48
+ fixtures: FixtureList;
49
+ };
50
+ };
51
+ export type FixtureStateChangeResponse = {
52
+ type: 'fixtureStateChange';
53
+ payload: {
54
+ rendererId: RendererId;
55
+ fixtureId: FixtureId;
56
+ fixtureState: FixtureState;
57
+ };
58
+ };
59
+ export type PlaygroundCommandResponse = {
60
+ type: 'playgroundCommand';
61
+ payload: {
62
+ command: string;
63
+ };
64
+ };
65
+ export type RendererResponse = RendererReadyResponse | RendererErrorResponse | FixtureListUpdateResponse | FixtureStateChangeResponse | PlaygroundCommandResponse;
66
+ export type RendererConnect<Request = RendererRequest, Response = RendererResponse> = {
67
+ postMessage: (msg: Response) => unknown;
68
+ onMessage(handler: (msg: Request) => unknown): () => unknown;
69
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,16 @@
1
+ export type RawCosmosPluginConfig = {
2
+ name: string;
3
+ ui?: string;
4
+ devServer?: string;
5
+ export?: string;
6
+ };
7
+ export type CosmosPluginConfig = {
8
+ name: string;
9
+ rootDir: string;
10
+ ui?: string;
11
+ devServer?: string;
12
+ export?: string;
13
+ };
14
+ export type UiCosmosPluginConfig = CosmosPluginConfig & {
15
+ ui: string;
16
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,10 @@
1
+ export type BuildStartMessage = {
2
+ type: 'buildStart';
3
+ };
4
+ export type BuildErrorMessage = {
5
+ type: 'buildError';
6
+ };
7
+ export type BuildDoneMessage = {
8
+ type: 'buildDone';
9
+ };
10
+ export type ServerMessage = BuildStartMessage | BuildErrorMessage | BuildDoneMessage;
@@ -0,0 +1 @@
1
+ export {};