@player-tools/devtools-client 0.5.3-next.0 → 0.6.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,218 +1,315 @@
1
- // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/redux/index.ts
1
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/panel/index.tsx
2
+ import React, { useRef } from "react";
3
+ import { useReactPlayer } from "@player-ui/react";
4
+ import { useEffect as useEffect2 } from "react";
5
+ import { ErrorBoundary } from "react-error-boundary";
2
6
  import {
3
- clearStore,
4
- playerFlowStartAction,
5
- playerInitAction,
6
- playerRemoveAction,
7
- playerTimelineAction,
8
- playerViewUpdateAction,
9
- selectedPlayerAction
10
- } from "@player-tools/devtools-common";
7
+ Card,
8
+ CardBody,
9
+ CardHeader,
10
+ ChakraProvider,
11
+ Container,
12
+ Flex,
13
+ FormControl,
14
+ FormLabel,
15
+ Heading,
16
+ HStack,
17
+ Select,
18
+ Text,
19
+ VStack
20
+ } from "@chakra-ui/react";
21
+ import { ThemeProvider } from "@devtools-ds/themes";
11
22
 
12
- // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/redux/aliases.ts
13
- var GET_INFO_DETAILS = "GET_INFO_DETAILS";
14
- var GET_CONFIG_DETAILS = "GET_CONFIG_DETAILS";
15
- var GET_VIEW_DETAILS = "GET_VIEW_DETAILS";
16
- var GET_DATA_BINDING_DETAILS = "GET_DATA_BINDING_DETAILS";
17
- var GET_CONSOLE_EVAL = "GET_CONSOLE_EVAL";
18
- var START_PROFILER = "START_PROFILER";
19
- var STOP_PROFILER = "STOP_PROFILER";
20
- var _alias = (aliases) => () => (next) => (action) => {
21
- const alias = aliases[action.type];
22
- if (alias) {
23
- return next(alias(action));
23
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/constants/index.ts
24
+ var INITIAL_FLOW = {
25
+ id: "initial-flow",
26
+ views: [
27
+ {
28
+ id: "view-1",
29
+ type: "text",
30
+ value: "connecting..."
31
+ }
32
+ ],
33
+ navigation: {
34
+ BEGIN: "FLOW_1",
35
+ FLOW_1: {
36
+ startState: "VIEW_1",
37
+ VIEW_1: {
38
+ state_type: "VIEW",
39
+ ref: "view-1",
40
+ transitions: {}
41
+ }
42
+ }
24
43
  }
25
- return next(action);
26
44
  };
27
- var buildAliases = (actions) => _alias({
28
- GET_INFO_DETAILS: (action) => actions["player-runtime-info-request"](action.payload),
29
- GET_CONFIG_DETAILS: (action) => actions["player-config-request"](action.payload),
30
- GET_VIEW_DETAILS: (action) => actions["player-view-details-request"](action.payload),
31
- GET_DATA_BINDING_DETAILS: (action) => actions["player-data-binding-details"](action.payload),
32
- GET_CONSOLE_EVAL: (action) => actions["player-execute-expression"](action.payload),
33
- START_PROFILER: (action) => actions["player-start-profiler-request"](action.payload),
34
- STOP_PROFILER: (action) => actions["player-stop-profiler-request"](action.payload)
35
- });
45
+ var INITIAL_EXTENSION_STATE = {
46
+ current: {
47
+ player: null,
48
+ plugin: null
49
+ },
50
+ players: {}
51
+ };
36
52
 
37
- // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/redux/actions.ts
38
- import { createAsyncThunk } from "@reduxjs/toolkit";
39
- import {
40
- Runtime,
41
- createLogger,
42
- BACKGROUND_SOURCE
43
- } from "@player-tools/devtools-common";
44
- var logger = createLogger(BACKGROUND_SOURCE);
45
- var buildRPCActions = (handlers) => Runtime.RuntimeRPCTypes.reduce((acc, rpcType) => {
46
- acc[rpcType] = createAsyncThunk(rpcType, async (params) => {
47
- logger.log(`Requesting ${rpcType}`, params);
48
- const data = await handlers[rpcType].call(params);
49
- logger.log(`Response from ${rpcType}`, data);
50
- return data;
51
- });
52
- return acc;
53
- }, {});
53
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/plugins/index.ts
54
+ import DevtoolsUIAssetsPlugin from "@devtools-ui/plugin";
55
+ import { PubSubPlugin } from "@player-ui/pubsub-plugin";
56
+ var PUBSUB_PLUGIN = new PubSubPlugin();
57
+ var PLAYER_PLUGINS = [
58
+ new DevtoolsUIAssetsPlugin(),
59
+ PUBSUB_PLUGIN
60
+ ];
54
61
 
55
- // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/redux/reducers.ts
56
- var buildPlayerReducerCallback = (actions) => (builder) => {
57
- builder.addCase(
58
- actions["player-runtime-info-request"].fulfilled,
59
- (state, action) => {
60
- const { activePlayers, selectedPlayerId } = state;
61
- if (!selectedPlayerId) {
62
- return;
63
- }
64
- const data = action.payload && Object.keys(action.payload).length > 0 ? action.payload : null;
65
- activePlayers[selectedPlayerId].flowInfo = data;
66
- }
67
- );
68
- builder.addCase(
69
- actions["player-config-request"].fulfilled,
70
- (state, action) => {
71
- const { activePlayers, selectedPlayerId } = state;
72
- if (!selectedPlayerId) {
73
- return;
74
- }
75
- activePlayers[selectedPlayerId].configState = action.payload;
76
- }
77
- );
78
- builder.addCase(
79
- actions["player-view-details-request"].fulfilled,
80
- (state, action) => {
81
- const { activePlayers, selectedPlayerId } = state;
82
- if (!selectedPlayerId) {
83
- return;
84
- }
85
- activePlayers[selectedPlayerId].view = action.payload?.lastViewUpdate;
86
- }
62
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/index.ts
63
+ import { Messenger } from "@player-tools/devtools-messenger";
64
+ import { useCallback, useEffect, useMemo, useReducer } from "react";
65
+
66
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/reducer.ts
67
+ import { dset } from "dset/merge";
68
+ import { produce } from "immer";
69
+ var reducer = (state, transaction) => {
70
+ switch (transaction.type) {
71
+ case "PLAYER_DEVTOOLS_PLAYER_INIT":
72
+ return produce(state, (draft) => {
73
+ const {
74
+ sender,
75
+ payload: { plugins }
76
+ } = transaction;
77
+ const { player, plugin } = draft.current;
78
+ if (!player && !plugin) {
79
+ dset(draft, ["current", "player"], sender);
80
+ dset(
81
+ draft,
82
+ ["current", "plugin"],
83
+ plugins[Object.keys(plugins)[0]].id
84
+ );
85
+ }
86
+ dset(draft, ["players", sender, "plugins"], plugins);
87
+ dset(draft, ["players", sender, "active"], true);
88
+ });
89
+ case "PLAYER_DEVTOOLS_PLUGIN_FLOW_CHANGE":
90
+ return produce(state, (draft) => {
91
+ const {
92
+ sender,
93
+ payload: { flow, pluginID }
94
+ } = transaction;
95
+ dset(draft, ["players", sender, "plugins", pluginID, "flow"], flow);
96
+ });
97
+ case "PLAYER_DEVTOOLS_PLUGIN_DATA_CHANGE":
98
+ return produce(state, (draft) => {
99
+ const {
100
+ sender,
101
+ payload: { data, pluginID }
102
+ } = transaction;
103
+ dset(
104
+ draft,
105
+ ["players", sender, "plugins", pluginID, "flow", "data"],
106
+ data
107
+ );
108
+ });
109
+ case "MESSENGER_EVENT_BATCH":
110
+ return produce(state, (draft) => {
111
+ return transaction.payload.events.reduce(reducer, draft);
112
+ });
113
+ case "PLAYER_DEVTOOLS_PLAYER_STOPPED":
114
+ return produce(state, (draft) => {
115
+ const { sender } = transaction;
116
+ dset(draft, ["players", sender, "active"], false);
117
+ });
118
+ case "PLAYER_DEVTOOLS_PLAYER_SELECTED":
119
+ return produce(state, (draft) => {
120
+ const { playerID } = transaction.payload;
121
+ dset(draft, ["current", "player"], playerID);
122
+ });
123
+ case "PLAYER_DEVTOOLS_PLUGIN_SELECTED":
124
+ return produce(state, (draft) => {
125
+ const { pluginID } = transaction.payload;
126
+ dset(draft, ["current", "plugin"], pluginID);
127
+ });
128
+ default:
129
+ return state;
130
+ }
131
+ };
132
+
133
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/index.ts
134
+ var NOOP_ID = -1;
135
+ var useExtensionState = ({
136
+ communicationLayer
137
+ }) => {
138
+ const [state, dispatch] = useReducer(reducer, INITIAL_EXTENSION_STATE);
139
+ const messengerOptions = useMemo(
140
+ () => ({
141
+ context: "devtools",
142
+ target: "player",
143
+ messageCallback: (message) => {
144
+ dispatch(message);
145
+ },
146
+ ...communicationLayer,
147
+ logger: console
148
+ }),
149
+ [dispatch, communicationLayer]
87
150
  );
88
- builder.addCase(
89
- actions["player-data-binding-details"].fulfilled,
90
- (state, action) => {
91
- const {
92
- meta: {
93
- arg: { binding, playerID }
94
- },
95
- payload
96
- } = action;
97
- const { activePlayers } = state;
98
- if (!playerID || !activePlayers[playerID]) {
99
- return;
100
- }
101
- if (binding === "") {
102
- activePlayers[playerID].dataState.allBindings = payload;
103
- return;
104
- }
105
- activePlayers[playerID].dataState.selectedBinding = payload;
106
- }
151
+ const messenger = useMemo(
152
+ () => new Messenger(messengerOptions),
153
+ [messengerOptions]
107
154
  );
108
- builder.addCase(
109
- actions["player-execute-expression"].fulfilled,
110
- (state, action) => {
111
- const { activePlayers, selectedPlayerId } = state;
112
- if (!selectedPlayerId) {
113
- return;
114
- }
115
- activePlayers[selectedPlayerId].consoleState?.history?.push({
116
- id: action.meta.requestId,
117
- result: action.payload,
118
- expression: action.payload?.exp ?? ""
155
+ useEffect(() => {
156
+ return () => {
157
+ messenger.destroy();
158
+ };
159
+ }, []);
160
+ const selectPlayer = useCallback(
161
+ (playerID) => {
162
+ dispatch({
163
+ id: NOOP_ID,
164
+ sender: "internal",
165
+ context: "devtools",
166
+ _messenger_: false,
167
+ timestamp: Date.now(),
168
+ type: "PLAYER_DEVTOOLS_PLAYER_SELECTED",
169
+ payload: {
170
+ playerID
171
+ }
119
172
  });
120
- }
173
+ },
174
+ [dispatch]
121
175
  );
122
- builder.addCase(
123
- actions["player-start-profiler-request"].fulfilled,
124
- (state, action) => {
125
- const { activePlayers, selectedPlayerId } = state;
126
- if (!selectedPlayerId)
127
- return;
128
- activePlayers[selectedPlayerId].profilerInfo = action.payload?.data;
129
- }
176
+ const selectPlugin = useCallback(
177
+ (pluginID) => {
178
+ dispatch({
179
+ id: NOOP_ID,
180
+ sender: "internal",
181
+ context: "devtools",
182
+ _messenger_: false,
183
+ timestamp: Date.now(),
184
+ type: "PLAYER_DEVTOOLS_PLUGIN_SELECTED",
185
+ payload: {
186
+ pluginID
187
+ }
188
+ });
189
+ },
190
+ [dispatch]
130
191
  );
131
- builder.addCase(
132
- actions["player-stop-profiler-request"].fulfilled,
133
- (state, action) => {
134
- const { activePlayers, selectedPlayerId } = state;
135
- if (!selectedPlayerId)
136
- return;
137
- activePlayers[selectedPlayerId].profilerInfo = action.payload?.data;
138
- }
192
+ const handleInteraction = useCallback(
193
+ ({
194
+ type,
195
+ payload
196
+ }) => {
197
+ messenger.sendMessage({
198
+ type: "PLAYER_DEVTOOLS_PLUGIN_INTERACTION",
199
+ payload: {
200
+ type,
201
+ payload
202
+ }
203
+ });
204
+ },
205
+ [messenger]
139
206
  );
207
+ return { state, selectPlayer, selectPlugin, handleInteraction };
140
208
  };
141
209
 
142
- // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/redux/index.ts
143
- function handleMessage(store, message) {
144
- switch (message.type) {
145
- case "runtime-init":
146
- store.dispatch(clearStore());
147
- break;
148
- case "player-init":
149
- store.dispatch(playerInitAction(message));
150
- store.dispatch(selectedPlayerAction());
151
- break;
152
- case "player-removed":
153
- store.dispatch(playerRemoveAction(message.playerID));
154
- store.dispatch(selectedPlayerAction());
155
- break;
156
- case "player-flow-start":
157
- store.dispatch(playerFlowStartAction(message));
158
- store.dispatch(playerTimelineAction(message));
159
- store.dispatch({
160
- type: GET_DATA_BINDING_DETAILS,
161
- payload: { playerID: message.playerID, binding: "" }
162
- });
163
- break;
164
- case "player-log-event":
165
- store.dispatch(playerTimelineAction(message));
166
- break;
167
- case "player-view-update-event":
168
- store.dispatch(playerViewUpdateAction(message));
169
- break;
170
- case "player-data-change-event": {
171
- const { players } = store.getState();
172
- if (players.activePlayers[message.playerID] && players.activePlayers[message.playerID].dataState.selectedBinding) {
173
- store.dispatch({
174
- type: GET_DATA_BINDING_DETAILS,
175
- payload: message
176
- });
177
- }
178
- store.dispatch({
179
- type: GET_DATA_BINDING_DETAILS,
180
- payload: { playerID: message.playerID, binding: "" }
181
- });
182
- store.dispatch(playerTimelineAction(message));
183
- break;
184
- }
185
- default:
186
- console.warn(`Unhandled event: ${JSON.stringify(message)}`);
187
- break;
210
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/helpers/flowDiff.ts
211
+ import { dequal } from "dequal";
212
+ var flowDiff = ({
213
+ curr,
214
+ next
215
+ }) => {
216
+ const currCopy = { ...curr, data: null };
217
+ const nextCopy = { ...next, data: null };
218
+ const baseFlowIsEqual = dequal(currCopy, nextCopy);
219
+ if (!baseFlowIsEqual) {
220
+ return { change: "flow", value: next };
188
221
  }
189
- }
222
+ const currData = curr.data;
223
+ const nextData = next.data;
224
+ const dataIsEqual = dequal(currData, nextData);
225
+ if (!dataIsEqual) {
226
+ return { change: "data", value: nextData };
227
+ }
228
+ return null;
229
+ };
190
230
 
191
- // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/rpc/index.ts
192
- import {
193
- createRPCRequest,
194
- Runtime as Runtime2,
195
- PANEL_SOURCE
196
- } from "@player-tools/devtools-common";
197
- var buildRPCRequests = (onRequestMessage) => Runtime2.RuntimeRPCTypes.reduce((acc, rpcType) => {
198
- acc[rpcType] = createRPCRequest(rpcType, PANEL_SOURCE, onRequestMessage);
199
- return acc;
200
- }, {});
231
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/panel/theme.ts
232
+ import { extendTheme } from "@chakra-ui/react";
233
+ var config = {
234
+ initialColorMode: "dark",
235
+ useSystemColorMode: false
236
+ };
237
+ var theme = extendTheme({ config });
201
238
 
202
- // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/index.ts
203
- export * from "@player-tools/devtools-common";
239
+ // ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/panel/index.tsx
240
+ var fallbackRender = ({
241
+ error
242
+ }) => {
243
+ return /* @__PURE__ */ React.createElement(Container, { centerContent: true }, /* @__PURE__ */ React.createElement(Card, null, /* @__PURE__ */ React.createElement(CardHeader, null, /* @__PURE__ */ React.createElement(Heading, null, "Ops, something went wrong."))), /* @__PURE__ */ React.createElement(CardBody, null, /* @__PURE__ */ React.createElement(Text, { as: "pre" }, error.message)));
244
+ };
245
+ var Panel = ({
246
+ communicationLayer
247
+ }) => {
248
+ const { state, selectPlayer, selectPlugin, handleInteraction } = useExtensionState({
249
+ communicationLayer
250
+ });
251
+ const { reactPlayer } = useReactPlayer({
252
+ plugins: PLAYER_PLUGINS
253
+ });
254
+ const dataController = useRef(null);
255
+ const currentFlow = useRef(null);
256
+ useEffect2(() => {
257
+ reactPlayer.player.hooks.dataController.tap("devtools-panel", (d) => {
258
+ dataController.current = new WeakRef(d);
259
+ });
260
+ }, [reactPlayer]);
261
+ useEffect2(() => {
262
+ PUBSUB_PLUGIN.subscribe("*", (type, payload) => {
263
+ handleInteraction({
264
+ type,
265
+ payload
266
+ });
267
+ });
268
+ }, []);
269
+ useEffect2(() => {
270
+ const { player, plugin } = state.current;
271
+ const flow = player && plugin ? state.players[player]?.plugins?.[plugin]?.flow || INITIAL_FLOW : INITIAL_FLOW;
272
+ if (!currentFlow.current) {
273
+ currentFlow.current = flow;
274
+ reactPlayer.start(flow);
275
+ return;
276
+ }
277
+ const diff = flowDiff({
278
+ curr: currentFlow.current,
279
+ next: flow
280
+ });
281
+ if (diff) {
282
+ const { change, value } = diff;
283
+ if (change === "flow") {
284
+ currentFlow.current = value;
285
+ reactPlayer.start(value);
286
+ } else if (change === "data") {
287
+ dataController.current ? dataController.current.deref()?.set(value) : reactPlayer.start(flow);
288
+ }
289
+ }
290
+ }, [reactPlayer, state]);
291
+ const Component = reactPlayer.Component;
292
+ return /* @__PURE__ */ React.createElement(ChakraProvider, { theme }, /* @__PURE__ */ React.createElement(ThemeProvider, { colorScheme: "dark" }, /* @__PURE__ */ React.createElement(ErrorBoundary, { fallbackRender }, /* @__PURE__ */ React.createElement(VStack, { w: "100vw", h: "100vh" }, state.current.player ? /* @__PURE__ */ React.createElement(Flex, { direction: "column", marginTop: "4" }, /* @__PURE__ */ React.createElement(HStack, { spacing: "4" }, /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(FormLabel, null, "Player"), /* @__PURE__ */ React.createElement(
293
+ Select,
294
+ {
295
+ id: "player",
296
+ value: state.current.player || "",
297
+ onChange: (event) => selectPlayer(event.target.value)
298
+ },
299
+ Object.keys(state.players).map((playerID) => /* @__PURE__ */ React.createElement("option", { key: playerID, value: playerID }, playerID))
300
+ )), /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(FormLabel, null, "Plugin"), /* @__PURE__ */ React.createElement(
301
+ Select,
302
+ {
303
+ id: "plugin",
304
+ value: state.current.plugin || "",
305
+ onChange: (event) => selectPlugin(event.target.value)
306
+ },
307
+ Object.keys(
308
+ state.players[state.current.player].plugins
309
+ ).map((pluginID) => /* @__PURE__ */ React.createElement("option", { key: pluginID, value: pluginID }, pluginID))
310
+ ))), /* @__PURE__ */ React.createElement(Container, { marginY: "6" }, /* @__PURE__ */ React.createElement(Component, null)), /* @__PURE__ */ React.createElement("details", null, /* @__PURE__ */ React.createElement("summary", null, "Debug"), /* @__PURE__ */ React.createElement("pre", null, JSON.stringify(state, null, 2)))) : /* @__PURE__ */ React.createElement(Flex, { justifyContent: "center", padding: "6" }, /* @__PURE__ */ React.createElement(Text, null, "No Player-UI instance or devtools plugin detected. Visit", " ", /* @__PURE__ */ React.createElement("a", { href: "https://player-ui.github.io/" }, "https://player-ui.github.io/"), " ", "for more info."))))));
311
+ };
204
312
  export {
205
- GET_CONFIG_DETAILS,
206
- GET_CONSOLE_EVAL,
207
- GET_DATA_BINDING_DETAILS,
208
- GET_INFO_DETAILS,
209
- GET_VIEW_DETAILS,
210
- START_PROFILER,
211
- STOP_PROFILER,
212
- buildAliases,
213
- buildPlayerReducerCallback,
214
- buildRPCActions,
215
- buildRPCRequests,
216
- handleMessage
313
+ Panel
217
314
  };
218
315
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/redux/index.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/redux/aliases.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/redux/actions.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/redux/reducers.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/rpc/index.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/index.ts"],"sourcesContent":["import {\n type Message,\n clearStore,\n playerFlowStartAction,\n playerInitAction,\n playerRemoveAction,\n playerTimelineAction,\n playerViewUpdateAction,\n selectedPlayerAction,\n} from \"@player-tools/devtools-common\";\nimport type { Store } from \"redux\";\nimport { GET_DATA_BINDING_DETAILS } from \"./aliases\";\n\nexport * from \"./actions\";\nexport * from \"./aliases\";\nexport * from \"./reducers\";\n\nexport function handleMessage(store: Store, message: Message) {\n switch (message.type) {\n case \"runtime-init\":\n store.dispatch(clearStore());\n break;\n case \"player-init\":\n store.dispatch(playerInitAction(message));\n store.dispatch(selectedPlayerAction());\n break;\n case \"player-removed\":\n store.dispatch(playerRemoveAction(message.playerID));\n store.dispatch(selectedPlayerAction());\n break;\n case \"player-flow-start\":\n store.dispatch(playerFlowStartAction(message));\n store.dispatch(playerTimelineAction(message));\n store.dispatch({\n type: GET_DATA_BINDING_DETAILS,\n payload: { playerID: message.playerID, binding: \"\" },\n });\n break;\n case \"player-log-event\":\n store.dispatch(playerTimelineAction(message));\n break;\n case \"player-view-update-event\":\n store.dispatch(playerViewUpdateAction(message));\n break;\n case \"player-data-change-event\": {\n const { players } = store.getState();\n\n if (\n players.activePlayers[message.playerID] &&\n players.activePlayers[message.playerID].dataState.selectedBinding\n ) {\n store.dispatch({\n type: GET_DATA_BINDING_DETAILS,\n payload: message,\n });\n }\n\n store.dispatch({\n type: GET_DATA_BINDING_DETAILS,\n payload: { playerID: message.playerID, binding: \"\" },\n });\n store.dispatch(playerTimelineAction(message));\n break;\n }\n\n default:\n console.warn(`Unhandled event: ${JSON.stringify(message)}`);\n break;\n }\n}\n","import type {\n AliasAction,\n ConfigAction,\n DataBindingAction,\n ExpressionAction,\n StartProfilerAction,\n StopProfilerAction,\n} from \"@player-tools/devtools-common\";\nimport type { AsyncRPCActions } from \"./actions\";\n\nexport const GET_INFO_DETAILS = \"GET_INFO_DETAILS\";\nexport const GET_CONFIG_DETAILS = \"GET_CONFIG_DETAILS\";\nexport const GET_VIEW_DETAILS = \"GET_VIEW_DETAILS\";\nexport const GET_DATA_BINDING_DETAILS = \"GET_DATA_BINDING_DETAILS\";\nexport const GET_CONSOLE_EVAL = \"GET_CONSOLE_EVAL\";\nexport const START_PROFILER = \"START_PROFILER\";\nexport const STOP_PROFILER = \"STOP_PROFILER\";\n\nconst _alias = (aliases: any) => () => (next: any) => (action: any) => {\n const alias = aliases[action.type];\n\n if (alias) {\n return next(alias(action));\n }\n\n return next(action);\n};\n\nexport const buildAliases = (actions: AsyncRPCActions) =>\n _alias({\n GET_INFO_DETAILS: (action: AliasAction) =>\n actions[\"player-runtime-info-request\"](action.payload),\n GET_CONFIG_DETAILS: (action: ConfigAction) =>\n actions[\"player-config-request\"](action.payload),\n GET_VIEW_DETAILS: (action: AliasAction) =>\n actions[\"player-view-details-request\"](action.payload),\n GET_DATA_BINDING_DETAILS: (action: DataBindingAction) =>\n actions[\"player-data-binding-details\"](action.payload),\n GET_CONSOLE_EVAL: (action: ExpressionAction) =>\n actions[\"player-execute-expression\"](action.payload),\n START_PROFILER: (action: StartProfilerAction) =>\n actions[\"player-start-profiler-request\"](action.payload),\n STOP_PROFILER: (action: StopProfilerAction) =>\n actions[\"player-stop-profiler-request\"](action.payload),\n });\n","import { type AsyncThunk, createAsyncThunk } from \"@reduxjs/toolkit\";\nimport {\n Runtime,\n createLogger,\n BACKGROUND_SOURCE,\n} from \"@player-tools/devtools-common\";\nimport type { RuntimeRPCRequestHandlers } from \"../rpc\";\n\nconst logger = createLogger(BACKGROUND_SOURCE);\n\nexport type AsyncRPCActions = {\n [key in Runtime.RuntimeRPCTypes]: AsyncThunk<\n Extract<Runtime.RuntimeRPC, { type: key }>[\"result\"],\n Extract<Runtime.RuntimeRPC, { type: key }>[\"params\"],\n any\n >;\n};\n\nexport const buildRPCActions = (\n handlers: RuntimeRPCRequestHandlers\n): AsyncRPCActions =>\n Runtime.RuntimeRPCTypes.reduce((acc, rpcType) => {\n acc[rpcType] = createAsyncThunk<\n Extract<Runtime.RuntimeRPC, { type: typeof rpcType }>[\"result\"],\n Extract<Runtime.RuntimeRPC, { type: typeof rpcType }>[\"params\"]\n >(rpcType, async (params) => {\n logger.log(`Requesting ${rpcType}`, params);\n const data = (await handlers[rpcType].call(params)) as Extract<\n Runtime.RuntimeRPC,\n { type: typeof rpcType }\n >[\"result\"];\n logger.log(`Response from ${rpcType}`, data);\n return data;\n }) as any;\n return acc;\n }, {} as AsyncRPCActions);\n","import type { ActionReducerMapBuilder } from \"@reduxjs/toolkit\";\nimport type { PlayersState } from \"@player-tools/devtools-common\";\nimport type { AsyncRPCActions } from \"./actions\";\n\n/**\n * Callback function that adds cases for async actions for the player.\n * @param playerReducerCallback\n * @returns\n */\nexport const buildPlayerReducerCallback =\n (actions: AsyncRPCActions) =>\n (builder: ActionReducerMapBuilder<PlayersState>) => {\n builder.addCase(\n actions[\"player-runtime-info-request\"].fulfilled,\n (state, action) => {\n const { activePlayers, selectedPlayerId } = state;\n\n if (!selectedPlayerId) {\n return;\n }\n\n const data =\n action.payload && Object.keys(action.payload).length > 0\n ? action.payload\n : null;\n activePlayers[selectedPlayerId].flowInfo = data;\n }\n );\n\n builder.addCase(\n actions[\"player-config-request\"].fulfilled,\n (state, action) => {\n const { activePlayers, selectedPlayerId } = state;\n\n if (!selectedPlayerId) {\n return;\n }\n\n activePlayers[selectedPlayerId].configState = action.payload;\n }\n );\n\n builder.addCase(\n actions[\"player-view-details-request\"].fulfilled,\n (state, action) => {\n const { activePlayers, selectedPlayerId } = state;\n\n if (!selectedPlayerId) {\n return;\n }\n\n activePlayers[selectedPlayerId].view = action.payload?.lastViewUpdate;\n }\n );\n\n builder.addCase(\n actions[\"player-data-binding-details\"].fulfilled,\n (state, action) => {\n const {\n meta: {\n arg: { binding, playerID },\n },\n payload,\n } = action;\n const { activePlayers } = state;\n\n if (!playerID || !activePlayers[playerID]) {\n return;\n }\n\n if (binding === \"\") {\n activePlayers[playerID].dataState.allBindings = payload;\n return;\n }\n\n activePlayers[playerID].dataState.selectedBinding = payload;\n }\n );\n\n builder.addCase(\n actions[\"player-execute-expression\"].fulfilled,\n (state, action) => {\n const { activePlayers, selectedPlayerId } = state;\n\n if (!selectedPlayerId) {\n return;\n }\n\n activePlayers[selectedPlayerId].consoleState?.history?.push({\n id: action.meta.requestId,\n result: action.payload,\n expression: action.payload?.exp ?? \"\",\n });\n }\n );\n\n builder.addCase(\n actions[\"player-start-profiler-request\"].fulfilled,\n (state, action) => {\n const { activePlayers, selectedPlayerId } = state;\n\n if (!selectedPlayerId) return;\n\n activePlayers[selectedPlayerId].profilerInfo = action.payload?.data;\n }\n );\n\n builder.addCase(\n actions[\"player-stop-profiler-request\"].fulfilled,\n (state, action) => {\n const { activePlayers, selectedPlayerId } = state;\n\n if (!selectedPlayerId) return;\n\n activePlayers[selectedPlayerId].profilerInfo = action.payload?.data;\n }\n );\n };\n","import {\n type RPCRequestMessageEvent,\n type RPCRequestHandler,\n createRPCRequest,\n Runtime,\n PANEL_SOURCE,\n} from \"@player-tools/devtools-common\";\n\nexport type RuntimeRPCRequestHandlers = {\n [key in Runtime.RuntimeRPCTypes]: RPCRequestHandler<any>;\n};\n\nexport const buildRPCRequests = (\n onRequestMessage: (\n message: RPCRequestMessageEvent<Runtime.RuntimeRPC>\n ) => void\n): RuntimeRPCRequestHandlers =>\n Runtime.RuntimeRPCTypes.reduce((acc, rpcType) => {\n acc[rpcType] = createRPCRequest(rpcType, PANEL_SOURCE, onRequestMessage);\n return acc;\n }, {} as RuntimeRPCRequestHandlers);\n","export * from \"./redux\";\nexport * from \"./rpc\";\nexport * from \"@player-tools/devtools-common\";\n"],"mappings":"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","names":["Runtime"]}
1
+ {"version":3,"sources":["../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/panel/index.tsx","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/constants/index.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/plugins/index.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/index.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/reducer.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/helpers/flowDiff.ts","../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/panel/theme.ts"],"sourcesContent":["import React, { useRef } from \"react\";\nimport type {\n MessengerOptions,\n ExtensionSupportedEvents,\n} from \"@player-tools/devtools-types\";\nimport { DataController, Flow, useReactPlayer } from \"@player-ui/react\";\nimport { useEffect } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport {\n Card,\n CardBody,\n CardHeader,\n ChakraProvider,\n Container,\n Flex,\n FormControl,\n FormLabel,\n Heading,\n HStack,\n Select,\n Text,\n VStack,\n} from \"@chakra-ui/react\";\nimport { ThemeProvider } from \"@devtools-ds/themes\";\n\nimport { INITIAL_FLOW } from \"../constants\";\nimport { PLAYER_PLUGINS, PUBSUB_PLUGIN } from \"../plugins\";\nimport { useExtensionState } from \"../state\";\nimport { flowDiff } from \"../helpers/flowDiff\";\nimport { theme } from \"./theme\";\n\nconst fallbackRender: ErrorBoundary[\"props\"][\"fallbackRender\"] = ({\n error,\n}) => {\n return (\n <Container centerContent>\n <Card>\n <CardHeader>\n <Heading>Ops, something went wrong.</Heading>\n </CardHeader>\n </Card>\n <CardBody>\n <Text as=\"pre\">{error.message}</Text>\n </CardBody>\n </Container>\n );\n};\n\n/**\n * Panel Component\n *\n * This component serves as the main container for the devtools plugin content defined by plugin authors using Player-UI DSL.\n *\n * Props:\n * - `communicationLayer`: An object that allows communication between the devtools and the Player-UI plugins,\n * enabling the exchange of data and events.\n *\n * Features:\n * - Error Handling: Utilizes the `ErrorBoundary` component from `react-error-boundary` to gracefully handle and display errors\n * that may occur during the rendering of the plugin's content.\n * - State Management: Integrates with custom hooks such as `useExtensionState` to manage the state of the plugin and its components.\n * - Player Integration: Uses the `useReactPlayer` hook from `player-ui/react` to render interactive player components based on the\n * DSL defined by the plugin authors.\n *\n * Example Usage:\n * ```tsx\n * <Panel communicationLayer={myCommunicationLayer} />\n * ```\n *\n * Note: The `communicationLayer` prop is essential for the proper functioning of the `Panel` component, as it enables the necessary\n * communication and data exchange with the player-ui/react library.\n */\nexport const Panel = ({\n communicationLayer,\n}: {\n /** the communication layer to use for the extension */\n readonly communicationLayer: Pick<\n MessengerOptions<ExtensionSupportedEvents>,\n \"sendMessage\" | \"addListener\" | \"removeListener\"\n >;\n}) => {\n const { state, selectPlayer, selectPlugin, handleInteraction } =\n useExtensionState({\n communicationLayer,\n });\n\n const { reactPlayer } = useReactPlayer({\n plugins: PLAYER_PLUGINS,\n });\n\n const dataController = useRef<WeakRef<DataController> | null>(null);\n\n const currentFlow = useRef<Flow | null>(null);\n\n useEffect(() => {\n reactPlayer.player.hooks.dataController.tap(\"devtools-panel\", (d) => {\n dataController.current = new WeakRef(d);\n });\n }, [reactPlayer]);\n\n useEffect(() => {\n // we subscribe to all messages from the devtools plugin\n // so the plugin author can define their own events\n PUBSUB_PLUGIN.subscribe(\"*\", (type: string, payload: string) => {\n handleInteraction({\n type,\n payload,\n });\n });\n }, []);\n\n useEffect(() => {\n const { player, plugin } = state.current;\n\n const flow =\n player && plugin\n ? state.players[player]?.plugins?.[plugin]?.flow || INITIAL_FLOW\n : INITIAL_FLOW;\n\n if (!currentFlow.current) {\n currentFlow.current = flow;\n reactPlayer.start(flow);\n return;\n }\n\n const diff = flowDiff({\n curr: currentFlow.current as Flow,\n next: flow,\n });\n\n if (diff) {\n const { change, value } = diff;\n\n if (change === \"flow\") {\n currentFlow.current = value;\n reactPlayer.start(value);\n } else if (change === \"data\") {\n dataController.current\n ? dataController.current\n .deref()\n ?.set(value as Record<string, unknown>)\n : reactPlayer.start(flow);\n }\n }\n }, [reactPlayer, state]);\n\n const Component = reactPlayer.Component as React.FC;\n\n return (\n <ChakraProvider theme={theme}>\n <ThemeProvider colorScheme=\"dark\">\n <ErrorBoundary fallbackRender={fallbackRender}>\n <VStack w=\"100vw\" h=\"100vh\">\n {state.current.player ? (\n <Flex direction=\"column\" marginTop=\"4\">\n <HStack spacing=\"4\">\n <FormControl>\n <FormLabel>Player</FormLabel>\n <Select\n id=\"player\"\n value={state.current.player || \"\"}\n onChange={(event) => selectPlayer(event.target.value)}\n >\n {Object.keys(state.players).map((playerID) => (\n <option key={playerID} value={playerID}>\n {playerID}\n </option>\n ))}\n </Select>\n </FormControl>\n <FormControl>\n <FormLabel>Plugin</FormLabel>\n <Select\n id=\"plugin\"\n value={state.current.plugin || \"\"}\n onChange={(event) => selectPlugin(event.target.value)}\n >\n {Object.keys(\n state.players[state.current.player].plugins\n ).map((pluginID) => (\n <option key={pluginID} value={pluginID}>\n {pluginID}\n </option>\n ))}\n </Select>\n </FormControl>\n </HStack>\n <Container marginY=\"6\">\n <Component />\n </Container>\n <details>\n <summary>Debug</summary>\n <pre>{JSON.stringify(state, null, 2)}</pre>\n </details>\n </Flex>\n ) : (\n <Flex justifyContent=\"center\" padding=\"6\">\n <Text>\n No Player-UI instance or devtools plugin detected. Visit{\" \"}\n <a href=\"https://player-ui.github.io/\">\n https://player-ui.github.io/\n </a>{\" \"}\n for more info.\n </Text>\n </Flex>\n )}\n </VStack>\n </ErrorBoundary>\n </ThemeProvider>\n </ChakraProvider>\n );\n};\n","import type { ExtensionState } from \"@player-tools/devtools-types\";\nimport type { Flow } from \"@player-ui/react\";\n\nexport const INITIAL_FLOW: Flow = {\n id: \"initial-flow\",\n views: [\n {\n id: \"view-1\",\n type: \"text\",\n value: \"connecting...\",\n },\n ],\n navigation: {\n BEGIN: \"FLOW_1\",\n FLOW_1: {\n startState: \"VIEW_1\",\n VIEW_1: {\n state_type: \"VIEW\",\n ref: \"view-1\",\n transitions: {},\n },\n },\n },\n};\n\nexport const INITIAL_EXTENSION_STATE: ExtensionState = {\n current: {\n player: null,\n plugin: null,\n },\n players: {},\n};\n","import DevtoolsUIAssetsPlugin from \"@devtools-ui/plugin\";\nimport { PubSubPlugin } from \"@player-ui/pubsub-plugin\";\nimport type { ReactPlayerPlugin } from \"@player-ui/react\";\n\nexport const PUBSUB_PLUGIN = new PubSubPlugin();\n\nexport const PLAYER_PLUGINS: ReactPlayerPlugin[] = [\n new DevtoolsUIAssetsPlugin(),\n PUBSUB_PLUGIN,\n];\n","import { Messenger } from \"@player-tools/devtools-messenger\";\nimport type {\n ExtensionSupportedEvents,\n MessengerOptions,\n} from \"@player-tools/devtools-types\";\nimport { useCallback, useEffect, useMemo, useReducer } from \"react\";\n\nimport { INITIAL_EXTENSION_STATE } from \"../constants\";\nimport { reducer } from \"./reducer\";\n\nconst NOOP_ID = -1;\n\n/**\n * Custom React hook for managing the state of the devtools extension.\n *\n * This hook initializes the extension's state and sets up a communication layer\n * using the `Messenger` class. It provides methods to select a player or plugin,\n * and handle interactions, which dispatch actions to update the state accordingly.\n *\n */\nexport const useExtensionState = ({\n communicationLayer,\n}: {\n /** the communication layer to use for the extension */\n communicationLayer: Pick<\n MessengerOptions<ExtensionSupportedEvents>,\n \"sendMessage\" | \"addListener\" | \"removeListener\"\n >;\n}) => {\n const [state, dispatch] = useReducer(reducer, INITIAL_EXTENSION_STATE);\n\n const messengerOptions = useMemo<MessengerOptions<ExtensionSupportedEvents>>(\n () => ({\n context: \"devtools\",\n target: \"player\",\n messageCallback: (message) => {\n dispatch(message);\n },\n ...communicationLayer,\n logger: console,\n }),\n [dispatch, communicationLayer]\n );\n\n const messenger = useMemo(\n () => new Messenger(messengerOptions),\n [messengerOptions]\n );\n\n useEffect(() => {\n return () => {\n messenger.destroy();\n };\n }, []);\n\n const selectPlayer = useCallback(\n (playerID: string) => {\n dispatch({\n id: NOOP_ID,\n sender: \"internal\",\n context: \"devtools\",\n _messenger_: false,\n timestamp: Date.now(),\n type: \"PLAYER_DEVTOOLS_PLAYER_SELECTED\",\n payload: {\n playerID,\n },\n });\n },\n [dispatch]\n );\n\n const selectPlugin = useCallback(\n (pluginID: string) => {\n dispatch({\n id: NOOP_ID,\n sender: \"internal\",\n context: \"devtools\",\n _messenger_: false,\n timestamp: Date.now(),\n type: \"PLAYER_DEVTOOLS_PLUGIN_SELECTED\",\n payload: {\n pluginID,\n },\n });\n },\n [dispatch]\n );\n\n /**\n * Plugin authors can add interactive elements to the Player-UI content by leveraging\n * the pub-sub plugin and having the handle interaction proxy the message to the inspected\n * Player-UI instance.\n */\n const handleInteraction = useCallback(\n ({\n type,\n payload,\n }: {\n /** interaction type */\n type: string;\n /** interaction payload */\n payload?: string;\n }) => {\n messenger.sendMessage({\n type: \"PLAYER_DEVTOOLS_PLUGIN_INTERACTION\",\n payload: {\n type,\n payload,\n },\n });\n },\n [messenger]\n );\n\n return { state, selectPlayer, selectPlugin, handleInteraction };\n};\n","import type {\n ExtensionState,\n ExtensionSupportedEvents,\n Transaction,\n} from \"@player-tools/devtools-types\";\nimport { dset } from \"dset/merge\";\nimport { produce } from \"immer\";\n\n/** Extension state reducer */\nexport const reducer = (\n state: ExtensionState,\n transaction: Transaction<ExtensionSupportedEvents>\n): ExtensionState => {\n switch (transaction.type) {\n case \"PLAYER_DEVTOOLS_PLAYER_INIT\":\n return produce(state, (draft) => {\n const {\n sender,\n payload: { plugins },\n } = transaction;\n const { player, plugin } = draft.current;\n\n if (!player && !plugin) {\n // if there is no player and plugin selected, select the first one:\n dset(draft, [\"current\", \"player\"], sender);\n dset(\n draft,\n [\"current\", \"plugin\"],\n plugins[Object.keys(plugins)[0]].id\n );\n }\n\n dset(draft, [\"players\", sender, \"plugins\"], plugins);\n dset(draft, [\"players\", sender, \"active\"], true);\n });\n case \"PLAYER_DEVTOOLS_PLUGIN_FLOW_CHANGE\":\n return produce(state, (draft) => {\n const {\n sender,\n payload: { flow, pluginID },\n } = transaction;\n\n dset(draft, [\"players\", sender, \"plugins\", pluginID, \"flow\"], flow);\n });\n case \"PLAYER_DEVTOOLS_PLUGIN_DATA_CHANGE\":\n return produce(state, (draft) => {\n const {\n sender,\n payload: { data, pluginID },\n } = transaction;\n dset(\n draft,\n [\"players\", sender, \"plugins\", pluginID, \"flow\", \"data\"],\n data\n );\n });\n case \"MESSENGER_EVENT_BATCH\":\n return produce(state, (draft) => {\n return transaction.payload.events.reduce(reducer, draft);\n });\n case \"PLAYER_DEVTOOLS_PLAYER_STOPPED\":\n return produce(state, (draft) => {\n const { sender } = transaction;\n\n dset(draft, [\"players\", sender, \"active\"], false);\n });\n case \"PLAYER_DEVTOOLS_PLAYER_SELECTED\":\n return produce(state, (draft) => {\n const { playerID } = transaction.payload;\n dset(draft, [\"current\", \"player\"], playerID);\n });\n case \"PLAYER_DEVTOOLS_PLUGIN_SELECTED\":\n return produce(state, (draft) => {\n const { pluginID } = transaction.payload;\n dset(draft, [\"current\", \"plugin\"], pluginID);\n });\n default:\n return state;\n }\n};\n","import type { Flow } from \"@player-ui/react\";\nimport { dequal } from \"dequal\";\n\n/**\n * Compares two Flow objects and identifies if there's a change in their structure or data.\n *\n * This function takes two Flow objects as input, `curr` (current) and `next` (next), and compares them\n * to determine if there's a change in the flow's structure or its data. If there's a change in the flow's\n * structure (excluding the `data` property), it returns an object indicating a \"flow\" change along with the\n * new flow. If there's a change in the `data` property, it returns an object indicating a \"data\" change along\n * with the new data. If there are no changes, it returns null.\n */\nexport const flowDiff = ({\n curr,\n next,\n}: {\n curr: Flow;\n next: Flow;\n}):\n | { change: \"data\"; value: Flow[\"data\"] }\n | { change: \"flow\"; value: Flow }\n | null => {\n // compare flows except for the `data` property\n const currCopy = { ...curr, data: null };\n const nextCopy = { ...next, data: null };\n\n const baseFlowIsEqual = dequal(currCopy, nextCopy);\n\n if (!baseFlowIsEqual) {\n return { change: \"flow\", value: next };\n }\n\n // compare data\n const currData = curr.data;\n const nextData = next.data;\n\n const dataIsEqual = dequal(currData, nextData);\n\n if (!dataIsEqual) {\n return { change: \"data\", value: nextData };\n }\n\n return null;\n};\n","import { extendTheme, type ThemeConfig } from \"@chakra-ui/react\";\n\nconst config: ThemeConfig = {\n initialColorMode: \"dark\",\n useSystemColorMode: false,\n};\n\nexport const theme = extendTheme({ config });\n"],"mappings":";AAAA,OAAO,SAAS,cAAc;AAK9B,SAA+B,sBAAsB;AACrD,SAAS,aAAAA,kBAAiB;AAC1B,SAAS,qBAAqB;AAC9B;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,qBAAqB;;;ACpBvB,IAAM,eAAqB;AAAA,EAChC,IAAI;AAAA,EACJ,OAAO;AAAA,IACL;AAAA,MACE,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,OAAO;AAAA,IACT;AAAA,EACF;AAAA,EACA,YAAY;AAAA,IACV,OAAO;AAAA,IACP,QAAQ;AAAA,MACN,YAAY;AAAA,MACZ,QAAQ;AAAA,QACN,YAAY;AAAA,QACZ,KAAK;AAAA,QACL,aAAa,CAAC;AAAA,MAChB;AAAA,IACF;AAAA,EACF;AACF;AAEO,IAAM,0BAA0C;AAAA,EACrD,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,QAAQ;AAAA,EACV;AAAA,EACA,SAAS,CAAC;AACZ;;;AC/BA,OAAO,4BAA4B;AACnC,SAAS,oBAAoB;AAGtB,IAAM,gBAAgB,IAAI,aAAa;AAEvC,IAAM,iBAAsC;AAAA,EACjD,IAAI,uBAAuB;AAAA,EAC3B;AACF;;;ACTA,SAAS,iBAAiB;AAK1B,SAAS,aAAa,WAAW,SAAS,kBAAkB;;;ACA5D,SAAS,YAAY;AACrB,SAAS,eAAe;AAGjB,IAAM,UAAU,CACrB,OACA,gBACmB;AACnB,UAAQ,YAAY,MAAM;AAAA,IACxB,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,UAAU;AAC/B,cAAM;AAAA,UACJ;AAAA,UACA,SAAS,EAAE,QAAQ;AAAA,QACrB,IAAI;AACJ,cAAM,EAAE,QAAQ,OAAO,IAAI,MAAM;AAEjC,YAAI,CAAC,UAAU,CAAC,QAAQ;AAEtB,eAAK,OAAO,CAAC,WAAW,QAAQ,GAAG,MAAM;AACzC;AAAA,YACE;AAAA,YACA,CAAC,WAAW,QAAQ;AAAA,YACpB,QAAQ,OAAO,KAAK,OAAO,EAAE,CAAC,CAAC,EAAE;AAAA,UACnC;AAAA,QACF;AAEA,aAAK,OAAO,CAAC,WAAW,QAAQ,SAAS,GAAG,OAAO;AACnD,aAAK,OAAO,CAAC,WAAW,QAAQ,QAAQ,GAAG,IAAI;AAAA,MACjD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,UAAU;AAC/B,cAAM;AAAA,UACJ;AAAA,UACA,SAAS,EAAE,MAAM,SAAS;AAAA,QAC5B,IAAI;AAEJ,aAAK,OAAO,CAAC,WAAW,QAAQ,WAAW,UAAU,MAAM,GAAG,IAAI;AAAA,MACpE,CAAC;AAAA,IACH,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,UAAU;AAC/B,cAAM;AAAA,UACJ;AAAA,UACA,SAAS,EAAE,MAAM,SAAS;AAAA,QAC5B,IAAI;AACJ;AAAA,UACE;AAAA,UACA,CAAC,WAAW,QAAQ,WAAW,UAAU,QAAQ,MAAM;AAAA,UACvD;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,UAAU;AAC/B,eAAO,YAAY,QAAQ,OAAO,OAAO,SAAS,KAAK;AAAA,MACzD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,UAAU;AAC/B,cAAM,EAAE,OAAO,IAAI;AAEnB,aAAK,OAAO,CAAC,WAAW,QAAQ,QAAQ,GAAG,KAAK;AAAA,MAClD,CAAC;AAAA,IACH,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,UAAU;AAC/B,cAAM,EAAE,SAAS,IAAI,YAAY;AACjC,aAAK,OAAO,CAAC,WAAW,QAAQ,GAAG,QAAQ;AAAA,MAC7C,CAAC;AAAA,IACH,KAAK;AACH,aAAO,QAAQ,OAAO,CAAC,UAAU;AAC/B,cAAM,EAAE,SAAS,IAAI,YAAY;AACjC,aAAK,OAAO,CAAC,WAAW,QAAQ,GAAG,QAAQ;AAAA,MAC7C,CAAC;AAAA,IACH;AACE,aAAO;AAAA,EACX;AACF;;;ADrEA,IAAM,UAAU;AAUT,IAAM,oBAAoB,CAAC;AAAA,EAChC;AACF,MAMM;AACJ,QAAM,CAAC,OAAO,QAAQ,IAAI,WAAW,SAAS,uBAAuB;AAErE,QAAM,mBAAmB;AAAA,IACvB,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,iBAAiB,CAAC,YAAY;AAC5B,iBAAS,OAAO;AAAA,MAClB;AAAA,MACA,GAAG;AAAA,MACH,QAAQ;AAAA,IACV;AAAA,IACA,CAAC,UAAU,kBAAkB;AAAA,EAC/B;AAEA,QAAM,YAAY;AAAA,IAChB,MAAM,IAAI,UAAU,gBAAgB;AAAA,IACpC,CAAC,gBAAgB;AAAA,EACnB;AAEA,YAAU,MAAM;AACd,WAAO,MAAM;AACX,gBAAU,QAAQ;AAAA,IACpB;AAAA,EACF,GAAG,CAAC,CAAC;AAEL,QAAM,eAAe;AAAA,IACnB,CAAC,aAAqB;AACpB,eAAS;AAAA,QACP,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,aAAa;AAAA,QACb,WAAW,KAAK,IAAI;AAAA,QACpB,MAAM;AAAA,QACN,SAAS;AAAA,UACP;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAEA,QAAM,eAAe;AAAA,IACnB,CAAC,aAAqB;AACpB,eAAS;AAAA,QACP,IAAI;AAAA,QACJ,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,aAAa;AAAA,QACb,WAAW,KAAK,IAAI;AAAA,QACpB,MAAM;AAAA,QACN,SAAS;AAAA,UACP;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,QAAQ;AAAA,EACX;AAOA,QAAM,oBAAoB;AAAA,IACxB,CAAC;AAAA,MACC;AAAA,MACA;AAAA,IACF,MAKM;AACJ,gBAAU,YAAY;AAAA,QACpB,MAAM;AAAA,QACN,SAAS;AAAA,UACP;AAAA,UACA;AAAA,QACF;AAAA,MACF,CAAC;AAAA,IACH;AAAA,IACA,CAAC,SAAS;AAAA,EACZ;AAEA,SAAO,EAAE,OAAO,cAAc,cAAc,kBAAkB;AAChE;;;AEnHA,SAAS,cAAc;AAWhB,IAAM,WAAW,CAAC;AAAA,EACvB;AAAA,EACA;AACF,MAMY;AAEV,QAAM,WAAW,EAAE,GAAG,MAAM,MAAM,KAAK;AACvC,QAAM,WAAW,EAAE,GAAG,MAAM,MAAM,KAAK;AAEvC,QAAM,kBAAkB,OAAO,UAAU,QAAQ;AAEjD,MAAI,CAAC,iBAAiB;AACpB,WAAO,EAAE,QAAQ,QAAQ,OAAO,KAAK;AAAA,EACvC;AAGA,QAAM,WAAW,KAAK;AACtB,QAAM,WAAW,KAAK;AAEtB,QAAM,cAAc,OAAO,UAAU,QAAQ;AAE7C,MAAI,CAAC,aAAa;AAChB,WAAO,EAAE,QAAQ,QAAQ,OAAO,SAAS;AAAA,EAC3C;AAEA,SAAO;AACT;;;AC3CA,SAAS,mBAAqC;AAE9C,IAAM,SAAsB;AAAA,EAC1B,kBAAkB;AAAA,EAClB,oBAAoB;AACtB;AAEO,IAAM,QAAQ,YAAY,EAAE,OAAO,CAAC;;;ANwB3C,IAAM,iBAA2D,CAAC;AAAA,EAChE;AACF,MAAM;AACJ,SACE,oCAAC,aAAU,eAAa,QACtB,oCAAC,YACC,oCAAC,kBACC,oCAAC,eAAQ,4BAA0B,CACrC,CACF,GACA,oCAAC,gBACC,oCAAC,QAAK,IAAG,SAAO,MAAM,OAAQ,CAChC,CACF;AAEJ;AA0BO,IAAM,QAAQ,CAAC;AAAA,EACpB;AACF,MAMM;AACJ,QAAM,EAAE,OAAO,cAAc,cAAc,kBAAkB,IAC3D,kBAAkB;AAAA,IAChB;AAAA,EACF,CAAC;AAEH,QAAM,EAAE,YAAY,IAAI,eAAe;AAAA,IACrC,SAAS;AAAA,EACX,CAAC;AAED,QAAM,iBAAiB,OAAuC,IAAI;AAElE,QAAM,cAAc,OAAoB,IAAI;AAE5C,EAAAC,WAAU,MAAM;AACd,gBAAY,OAAO,MAAM,eAAe,IAAI,kBAAkB,CAAC,MAAM;AACnE,qBAAe,UAAU,IAAI,QAAQ,CAAC;AAAA,IACxC,CAAC;AAAA,EACH,GAAG,CAAC,WAAW,CAAC;AAEhB,EAAAA,WAAU,MAAM;AAGd,kBAAc,UAAU,KAAK,CAAC,MAAc,YAAoB;AAC9D,wBAAkB;AAAA,QAChB;AAAA,QACA;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAAA,EACH,GAAG,CAAC,CAAC;AAEL,EAAAA,WAAU,MAAM;AACd,UAAM,EAAE,QAAQ,OAAO,IAAI,MAAM;AAEjC,UAAM,OACJ,UAAU,SACN,MAAM,QAAQ,MAAM,GAAG,UAAU,MAAM,GAAG,QAAQ,eAClD;AAEN,QAAI,CAAC,YAAY,SAAS;AACxB,kBAAY,UAAU;AACtB,kBAAY,MAAM,IAAI;AACtB;AAAA,IACF;AAEA,UAAM,OAAO,SAAS;AAAA,MACpB,MAAM,YAAY;AAAA,MAClB,MAAM;AAAA,IACR,CAAC;AAED,QAAI,MAAM;AACR,YAAM,EAAE,QAAQ,MAAM,IAAI;AAE1B,UAAI,WAAW,QAAQ;AACrB,oBAAY,UAAU;AACtB,oBAAY,MAAM,KAAK;AAAA,MACzB,WAAW,WAAW,QAAQ;AAC5B,uBAAe,UACX,eAAe,QACZ,MAAM,GACL,IAAI,KAAgC,IACxC,YAAY,MAAM,IAAI;AAAA,MAC5B;AAAA,IACF;AAAA,EACF,GAAG,CAAC,aAAa,KAAK,CAAC;AAEvB,QAAM,YAAY,YAAY;AAE9B,SACE,oCAAC,kBAAe,SACd,oCAAC,iBAAc,aAAY,UACzB,oCAAC,iBAAc,kBACb,oCAAC,UAAO,GAAE,SAAQ,GAAE,WACjB,MAAM,QAAQ,SACb,oCAAC,QAAK,WAAU,UAAS,WAAU,OACjC,oCAAC,UAAO,SAAQ,OACd,oCAAC,mBACC,oCAAC,iBAAU,QAAM,GACjB;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,OAAO,MAAM,QAAQ,UAAU;AAAA,MAC/B,UAAU,CAAC,UAAU,aAAa,MAAM,OAAO,KAAK;AAAA;AAAA,IAEnD,OAAO,KAAK,MAAM,OAAO,EAAE,IAAI,CAAC,aAC/B,oCAAC,YAAO,KAAK,UAAU,OAAO,YAC3B,QACH,CACD;AAAA,EACH,CACF,GACA,oCAAC,mBACC,oCAAC,iBAAU,QAAM,GACjB;AAAA,IAAC;AAAA;AAAA,MACC,IAAG;AAAA,MACH,OAAO,MAAM,QAAQ,UAAU;AAAA,MAC/B,UAAU,CAAC,UAAU,aAAa,MAAM,OAAO,KAAK;AAAA;AAAA,IAEnD,OAAO;AAAA,MACN,MAAM,QAAQ,MAAM,QAAQ,MAAM,EAAE;AAAA,IACtC,EAAE,IAAI,CAAC,aACL,oCAAC,YAAO,KAAK,UAAU,OAAO,YAC3B,QACH,CACD;AAAA,EACH,CACF,CACF,GACA,oCAAC,aAAU,SAAQ,OACjB,oCAAC,eAAU,CACb,GACA,oCAAC,iBACC,oCAAC,iBAAQ,OAAK,GACd,oCAAC,aAAK,KAAK,UAAU,OAAO,MAAM,CAAC,CAAE,CACvC,CACF,IAEA,oCAAC,QAAK,gBAAe,UAAS,SAAQ,OACpC,oCAAC,YAAK,4DACqD,KACzD,oCAAC,OAAE,MAAK,kCAA+B,8BAEvC,GAAK,KAAI,gBAEX,CACF,CAEJ,CACF,CACF,CACF;AAEJ;","names":["useEffect","useEffect"]}
package/package.json CHANGED
@@ -1,11 +1,21 @@
1
1
  {
2
2
  "name": "@player-tools/devtools-client",
3
- "version": "0.5.3-next.0",
3
+ "version": "0.6.0-next.0",
4
4
  "main": "dist/cjs/index.cjs",
5
5
  "dependencies": {
6
- "@player-tools/devtools-common": "0.5.3-next.0",
7
- "@reduxjs/toolkit": "^1.6.1",
8
- "redux": "^4.1.2",
6
+ "@player-tools/devtools-messenger": "0.6.0-next.0",
7
+ "@player-tools/devtools-types": "0.6.0-next.0",
8
+ "@chakra-ui/react": "2.8.2",
9
+ "@player-ui/pubsub-plugin": "0.7.2-next.4",
10
+ "@player-ui/react": "0.7.2-next.4",
11
+ "@devtools-ui/plugin": "0.0.2--canary.15.697",
12
+ "@types/react": "^18.2.51",
13
+ "dset": "^3.1.3",
14
+ "immer": "^10.0.3",
15
+ "react": "^18.2.0",
16
+ "react-error-boundary": "^4.0.12",
17
+ "dequal": "^2.0.2",
18
+ "@devtools-ds/themes": "^1.2.1",
9
19
  "tslib": "^2.6.2"
10
20
  },
11
21
  "module": "dist/index.legacy-esm.js",