@player-devtools/client 0.14.0-next.0 → 0.14.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/cjs/index.cjs +7 -214
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/index.legacy-esm.js +6 -217
- package/dist/index.mjs +6 -217
- package/dist/index.mjs.map +1 -1
- package/package.json +4 -16
- package/src/constants/index.ts +0 -23
- package/src/index.ts +0 -1
- package/src/state/__tests__/reducer.test.ts +25 -1
- package/types/constants/index.d.ts +0 -2
- package/types/index.d.ts +0 -1
- package/src/helpers/__tests__/flowDiff.test.ts +0 -72
- package/src/helpers/flowDiff.ts +0 -44
- package/src/panel/index.tsx +0 -234
- package/src/plugins/index.ts +0 -34
- package/src/state/index.ts +0 -33
- package/types/helpers/flowDiff.d.ts +0 -21
- package/types/panel/index.d.ts +0 -32
- package/types/plugins/index.d.ts +0 -5
- package/types/state/index.d.ts +0 -21
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __create = Object.create;
|
|
3
2
|
var __defProp = Object.defineProperty;
|
|
4
3
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
4
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
5
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
6
|
var __export = (target, all) => {
|
|
9
7
|
for (var name in all)
|
|
@@ -17,54 +15,20 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
15
|
}
|
|
18
16
|
return to;
|
|
19
17
|
};
|
|
20
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
-
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
-
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
-
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
-
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
-
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
-
mod
|
|
27
|
-
));
|
|
28
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
19
|
|
|
30
|
-
//
|
|
20
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/index.ts
|
|
31
21
|
var src_exports = {};
|
|
32
22
|
__export(src_exports, {
|
|
33
|
-
Panel: () => Panel,
|
|
34
23
|
createExtensionClient: () => createExtensionClient
|
|
35
24
|
});
|
|
36
25
|
module.exports = __toCommonJS(src_exports);
|
|
37
26
|
|
|
38
|
-
//
|
|
39
|
-
var
|
|
40
|
-
var
|
|
41
|
-
var import_react5 = require("react");
|
|
42
|
-
var import_react_error_boundary = require("react-error-boundary");
|
|
43
|
-
var import_react6 = require("@chakra-ui/react");
|
|
44
|
-
var import_themes = require("@devtools-ds/themes");
|
|
27
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/state/client.ts
|
|
28
|
+
var import_messenger = require("@player-devtools/messenger");
|
|
29
|
+
var import_utils2 = require("@player-devtools/utils");
|
|
45
30
|
|
|
46
|
-
//
|
|
47
|
-
var INITIAL_FLOW = {
|
|
48
|
-
id: "initial-flow",
|
|
49
|
-
views: [
|
|
50
|
-
{
|
|
51
|
-
id: "view-1",
|
|
52
|
-
type: "text",
|
|
53
|
-
value: "connecting..."
|
|
54
|
-
}
|
|
55
|
-
],
|
|
56
|
-
navigation: {
|
|
57
|
-
BEGIN: "FLOW_1",
|
|
58
|
-
FLOW_1: {
|
|
59
|
-
startState: "VIEW_1",
|
|
60
|
-
VIEW_1: {
|
|
61
|
-
state_type: "VIEW",
|
|
62
|
-
ref: "view-1",
|
|
63
|
-
transitions: {}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
};
|
|
31
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/constants/index.ts
|
|
68
32
|
var INITIAL_EXTENSION_STATE = {
|
|
69
33
|
current: {
|
|
70
34
|
player: null,
|
|
@@ -73,42 +37,7 @@ var INITIAL_EXTENSION_STATE = {
|
|
|
73
37
|
players: {}
|
|
74
38
|
};
|
|
75
39
|
|
|
76
|
-
//
|
|
77
|
-
var import_plugin = __toESM(require("@devtools-ui/plugin"));
|
|
78
|
-
var import_pubsub_plugin = require("@player-ui/pubsub-plugin");
|
|
79
|
-
var import_common_expressions_plugin = require("@player-ui/common-expressions-plugin");
|
|
80
|
-
var import_common_types_plugin = require("@player-ui/common-types-plugin");
|
|
81
|
-
var import_data_change_listener_plugin = require("@player-ui/data-change-listener-plugin");
|
|
82
|
-
var import_react = require("@player-ui/react");
|
|
83
|
-
var LogForwarder = class {
|
|
84
|
-
constructor() {
|
|
85
|
-
this.name = "Log";
|
|
86
|
-
}
|
|
87
|
-
apply(player) {
|
|
88
|
-
player.logger.addHandler(new import_react.ConsoleLogger("trace", console));
|
|
89
|
-
}
|
|
90
|
-
applyReact(reactPlayer) {
|
|
91
|
-
this.apply(reactPlayer.player);
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
var PUBSUB_PLUGIN = new import_pubsub_plugin.PubSubPlugin();
|
|
95
|
-
var PLAYER_PLUGINS = [
|
|
96
|
-
new import_common_types_plugin.CommonTypesPlugin(),
|
|
97
|
-
new import_common_expressions_plugin.CommonExpressionsPlugin(),
|
|
98
|
-
new import_data_change_listener_plugin.DataChangeListenerPlugin(),
|
|
99
|
-
new import_plugin.default(),
|
|
100
|
-
new LogForwarder(),
|
|
101
|
-
PUBSUB_PLUGIN
|
|
102
|
-
];
|
|
103
|
-
|
|
104
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/index.ts
|
|
105
|
-
var import_react2 = require("react");
|
|
106
|
-
|
|
107
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/client.ts
|
|
108
|
-
var import_messenger = require("@player-devtools/messenger");
|
|
109
|
-
var import_utils2 = require("@player-devtools/utils");
|
|
110
|
-
|
|
111
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/reducer.ts
|
|
40
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/state/reducer.ts
|
|
112
41
|
var import_utils = require("@player-devtools/utils");
|
|
113
42
|
var import_immer = require("immer");
|
|
114
43
|
var reducer = (state, transaction) => {
|
|
@@ -172,7 +101,7 @@ var reducer = (state, transaction) => {
|
|
|
172
101
|
}
|
|
173
102
|
};
|
|
174
103
|
|
|
175
|
-
//
|
|
104
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/state/client.ts
|
|
176
105
|
var NOOP_ID = -1;
|
|
177
106
|
var createExtensionClient = (communicationLayer) => {
|
|
178
107
|
const store = (0, import_utils2.useStateReducer)(reducer, INITIAL_EXTENSION_STATE);
|
|
@@ -232,144 +161,8 @@ var createExtensionClient = (communicationLayer) => {
|
|
|
232
161
|
destroy: () => messenger.destroy()
|
|
233
162
|
};
|
|
234
163
|
};
|
|
235
|
-
|
|
236
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/index.ts
|
|
237
|
-
var useExtensionState = ({
|
|
238
|
-
communicationLayer
|
|
239
|
-
}) => {
|
|
240
|
-
const client = (0, import_react2.useMemo)(
|
|
241
|
-
() => createExtensionClient(communicationLayer),
|
|
242
|
-
[communicationLayer]
|
|
243
|
-
);
|
|
244
|
-
(0, import_react2.useEffect)(() => () => client.destroy(), [client]);
|
|
245
|
-
const state = (0, import_react2.useSyncExternalStore)(client.subscribe, client.getState);
|
|
246
|
-
return {
|
|
247
|
-
state,
|
|
248
|
-
selectPlayer: client.selectPlayer,
|
|
249
|
-
selectPlugin: client.selectPlugin,
|
|
250
|
-
handleInteraction: client.handleInteraction
|
|
251
|
-
};
|
|
252
|
-
};
|
|
253
|
-
|
|
254
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/helpers/flowDiff.ts
|
|
255
|
-
var import_dequal = require("dequal");
|
|
256
|
-
var flowDiff = ({
|
|
257
|
-
curr,
|
|
258
|
-
next
|
|
259
|
-
}) => {
|
|
260
|
-
const currCopy = { ...curr, data: null };
|
|
261
|
-
const nextCopy = { ...next, data: null };
|
|
262
|
-
const baseFlowIsEqual = (0, import_dequal.dequal)(currCopy, nextCopy);
|
|
263
|
-
if (!baseFlowIsEqual) {
|
|
264
|
-
return { change: "flow", value: next };
|
|
265
|
-
}
|
|
266
|
-
const currData = curr.data;
|
|
267
|
-
const nextData = next.data;
|
|
268
|
-
const dataIsEqual = (0, import_dequal.dequal)(currData, nextData);
|
|
269
|
-
if (!dataIsEqual) {
|
|
270
|
-
return { change: "data", value: nextData };
|
|
271
|
-
}
|
|
272
|
-
return null;
|
|
273
|
-
};
|
|
274
|
-
|
|
275
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/panel/index.tsx
|
|
276
|
-
var fallbackRender = ({
|
|
277
|
-
error
|
|
278
|
-
}) => {
|
|
279
|
-
return /* @__PURE__ */ import_react3.default.createElement(import_react6.Container, { centerContent: true }, /* @__PURE__ */ import_react3.default.createElement(import_react6.Card, null, /* @__PURE__ */ import_react3.default.createElement(import_react6.CardHeader, null, /* @__PURE__ */ import_react3.default.createElement(import_react6.Heading, null, "Ops, something went wrong.")), /* @__PURE__ */ import_react3.default.createElement(import_react6.CardBody, null, /* @__PURE__ */ import_react3.default.createElement(import_react6.Text, { as: "pre" }, error.message))));
|
|
280
|
-
};
|
|
281
|
-
var Panel = ({ communicationLayer, baseTheme }) => {
|
|
282
|
-
const { state, selectPlayer, selectPlugin, handleInteraction } = useExtensionState({
|
|
283
|
-
communicationLayer
|
|
284
|
-
});
|
|
285
|
-
const { reactPlayer, playerState } = (0, import_react4.useReactPlayer)({
|
|
286
|
-
plugins: PLAYER_PLUGINS
|
|
287
|
-
});
|
|
288
|
-
const dataController = (0, import_react3.useRef)(null);
|
|
289
|
-
const currentFlow = (0, import_react3.useRef)(null);
|
|
290
|
-
(0, import_react5.useEffect)(() => {
|
|
291
|
-
reactPlayer.player.hooks.dataController.tap("devtools-panel", (d) => {
|
|
292
|
-
dataController.current = new WeakRef(d);
|
|
293
|
-
});
|
|
294
|
-
}, [reactPlayer]);
|
|
295
|
-
(0, import_react5.useEffect)(() => {
|
|
296
|
-
PUBSUB_PLUGIN.subscribe("*", (type, payload) => {
|
|
297
|
-
handleInteraction({
|
|
298
|
-
type,
|
|
299
|
-
payload
|
|
300
|
-
});
|
|
301
|
-
});
|
|
302
|
-
}, []);
|
|
303
|
-
(0, import_react5.useEffect)(() => {
|
|
304
|
-
const { player, plugin } = state.current;
|
|
305
|
-
const flow = player && plugin ? state.players[player]?.plugins?.[plugin]?.flow || INITIAL_FLOW : INITIAL_FLOW;
|
|
306
|
-
if (!currentFlow.current) {
|
|
307
|
-
currentFlow.current = flow;
|
|
308
|
-
reactPlayer.start(flow);
|
|
309
|
-
return;
|
|
310
|
-
}
|
|
311
|
-
const diff = flowDiff({
|
|
312
|
-
curr: currentFlow.current,
|
|
313
|
-
next: flow
|
|
314
|
-
});
|
|
315
|
-
if (diff) {
|
|
316
|
-
const { change, value } = diff;
|
|
317
|
-
if (change === "flow") {
|
|
318
|
-
currentFlow.current = value;
|
|
319
|
-
reactPlayer.start(value);
|
|
320
|
-
} else if (change === "data") {
|
|
321
|
-
if (dataController.current) {
|
|
322
|
-
dataController.current.deref()?.set(value);
|
|
323
|
-
} else {
|
|
324
|
-
reactPlayer.start(flow);
|
|
325
|
-
}
|
|
326
|
-
}
|
|
327
|
-
}
|
|
328
|
-
}, [reactPlayer, state]);
|
|
329
|
-
const isDarkMode = (0, import_themes.useDarkMode)();
|
|
330
|
-
const colorMode = isDarkMode ? "dark" : "light";
|
|
331
|
-
const config = {
|
|
332
|
-
initialColorMode: colorMode,
|
|
333
|
-
useSystemColorMode: true
|
|
334
|
-
};
|
|
335
|
-
const theme = (0, import_react6.extendTheme)({ config, ...baseTheme });
|
|
336
|
-
const Component = reactPlayer.Component;
|
|
337
|
-
return /* @__PURE__ */ import_react3.default.createElement(import_react6.ChakraProvider, { resetCSS: false, theme }, /* @__PURE__ */ import_react3.default.createElement(import_themes.ThemeProvider, { theme: "chrome", colorScheme: colorMode }, /* @__PURE__ */ import_react3.default.createElement(import_react_error_boundary.ErrorBoundary, { fallbackRender }, /* @__PURE__ */ import_react3.default.createElement(
|
|
338
|
-
import_react6.Flex,
|
|
339
|
-
{
|
|
340
|
-
direction: "column",
|
|
341
|
-
h: "100vh",
|
|
342
|
-
alignItems: "normal",
|
|
343
|
-
overflow: "scroll"
|
|
344
|
-
},
|
|
345
|
-
state.current.player ? /* @__PURE__ */ import_react3.default.createElement(import_react6.Flex, { direction: "column", gap: "20px" }, /* @__PURE__ */ import_react3.default.createElement(import_react6.Flex, { gap: "16px" }, /* @__PURE__ */ import_react3.default.createElement(import_react6.FormControl, null, /* @__PURE__ */ import_react3.default.createElement(import_react6.FormLabel, null, "Player"), /* @__PURE__ */ import_react3.default.createElement(
|
|
346
|
-
import_react6.Select,
|
|
347
|
-
{
|
|
348
|
-
id: "player",
|
|
349
|
-
value: state.current.player || "",
|
|
350
|
-
onChange: (event) => selectPlayer(event.target.value)
|
|
351
|
-
},
|
|
352
|
-
Object.keys(state.players).map((playerID) => /* @__PURE__ */ import_react3.default.createElement("option", { key: playerID, value: playerID }, playerID))
|
|
353
|
-
)), /* @__PURE__ */ import_react3.default.createElement(import_react6.FormControl, null, /* @__PURE__ */ import_react3.default.createElement(import_react6.FormLabel, null, "Plugin"), /* @__PURE__ */ import_react3.default.createElement(
|
|
354
|
-
import_react6.Select,
|
|
355
|
-
{
|
|
356
|
-
id: "plugin",
|
|
357
|
-
value: state.current.plugin || "",
|
|
358
|
-
onChange: (event) => selectPlugin(event.target.value)
|
|
359
|
-
},
|
|
360
|
-
Object.keys(
|
|
361
|
-
state.players[state.current.player]?.plugins ?? []
|
|
362
|
-
).map((pluginID) => /* @__PURE__ */ import_react3.default.createElement("option", { key: pluginID, value: pluginID }, pluginID))
|
|
363
|
-
))), /* @__PURE__ */ import_react3.default.createElement(import_react6.Flex, { width: "100%" }, playerState.status === "error" ? fallbackRender({
|
|
364
|
-
error: playerState.error,
|
|
365
|
-
resetErrorBoundary: () => {
|
|
366
|
-
}
|
|
367
|
-
}) : /* @__PURE__ */ import_react3.default.createElement(Component, null)), /* @__PURE__ */ import_react3.default.createElement("details", null, /* @__PURE__ */ import_react3.default.createElement("summary", null, "Debug"), /* @__PURE__ */ import_react3.default.createElement("pre", { style: { maxHeight: "30vh", overflow: "scroll" } }, JSON.stringify(state, null, 2)))) : /* @__PURE__ */ import_react3.default.createElement(import_react6.Flex, { justifyContent: "center", padding: "6" }, /* @__PURE__ */ import_react3.default.createElement(import_react6.Text, null, "No Player-UI instance or devtools plugin detected. Visit", " ", /* @__PURE__ */ import_react3.default.createElement("a", { href: "https://player-ui.github.io/" }, "https://player-ui.github.io/"), " ", "for more info."))
|
|
368
|
-
))));
|
|
369
|
-
};
|
|
370
164
|
// Annotate the CommonJS export names for ESM import in node:
|
|
371
165
|
0 && (module.exports = {
|
|
372
|
-
Panel,
|
|
373
166
|
createExtensionClient
|
|
374
167
|
});
|
|
375
168
|
//# sourceMappingURL=index.cjs.map
|
package/dist/cjs/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/index.ts","../../../../../../../../../../../../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/client.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"],"sourcesContent":["export { Panel } from \"./panel\";\nexport { createExtensionClient, type ExtensionClient } from \"./state/client\";\n","import React, { useRef } from \"react\";\nimport type {\n MessengerOptions,\n ExtensionSupportedEvents,\n} from \"@player-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 extendTheme,\n Flex,\n FormControl,\n FormLabel,\n Heading,\n Select,\n Text,\n type ThemeConfig,\n} from \"@chakra-ui/react\";\n\nimport { ThemeProvider, useDarkMode } 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\";\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 <CardBody>\n <Text as=\"pre\">{error.message}</Text>\n </CardBody>\n </Card>\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: React.FC<{\n /** the communication layer to use for the extension */\n readonly communicationLayer: Pick<\n MessengerOptions<ExtensionSupportedEvents>,\n \"sendMessage\" | \"addListener\" | \"removeListener\"\n >;\n baseTheme?: Record<string, unknown>;\n}> = ({ communicationLayer, baseTheme }) => {\n const { state, selectPlayer, selectPlugin, handleInteraction } =\n useExtensionState({\n communicationLayer,\n });\n\n const { reactPlayer, playerState } = 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 if (dataController.current) {\n dataController.current.deref()?.set(value as Record<string, unknown>);\n } else {\n reactPlayer.start(flow);\n }\n }\n }\n }, [reactPlayer, state]);\n\n const isDarkMode = useDarkMode();\n const colorMode = isDarkMode ? \"dark\" : \"light\";\n\n const config: ThemeConfig = {\n initialColorMode: colorMode,\n useSystemColorMode: true,\n };\n const theme = extendTheme({ config, ...baseTheme });\n\n const Component = reactPlayer.Component as React.FC;\n\n return (\n <ChakraProvider resetCSS={false} theme={theme}>\n <ThemeProvider theme=\"chrome\" colorScheme={colorMode}>\n <ErrorBoundary fallbackRender={fallbackRender}>\n <Flex\n direction=\"column\"\n h=\"100vh\"\n alignItems={\"normal\"}\n overflow=\"scroll\"\n >\n {state.current.player ? (\n <Flex direction=\"column\" gap=\"20px\">\n <Flex gap=\"16px\">\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 </Flex>\n <Flex width=\"100%\">\n {playerState.status === \"error\" ? (\n fallbackRender({\n error: playerState.error,\n resetErrorBoundary: () => {},\n })\n ) : (\n <Component />\n )}\n </Flex>\n <details>\n <summary>Debug</summary>\n <pre style={{ maxHeight: \"30vh\", overflow: \"scroll\" }}>\n {JSON.stringify(state, null, 2)}\n </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 </Flex>\n </ErrorBoundary>\n </ThemeProvider>\n </ChakraProvider>\n );\n};\n","import type { ExtensionState } from \"@player-devtools/types\";\nimport type { Flow } from \"@player-ui/player\";\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 { CommonExpressionsPlugin } from \"@player-ui/common-expressions-plugin\";\nimport { CommonTypesPlugin } from \"@player-ui/common-types-plugin\";\nimport { DataChangeListenerPlugin } from \"@player-ui/data-change-listener-plugin\";\nimport {\n ConsoleLogger,\n Player,\n PlayerPlugin,\n ReactPlayer,\n type ReactPlayerPlugin,\n} from \"@player-ui/react\";\n\nclass LogForwarder implements PlayerPlugin, ReactPlayerPlugin {\n name = \"Log\";\n apply(player: Player) {\n player.logger.addHandler(new ConsoleLogger(\"trace\", console));\n }\n\n applyReact(reactPlayer: ReactPlayer) {\n this.apply(reactPlayer.player);\n }\n}\n\nexport const PUBSUB_PLUGIN = new PubSubPlugin();\n\nexport const PLAYER_PLUGINS: ReactPlayerPlugin[] = [\n new CommonTypesPlugin(),\n new CommonExpressionsPlugin(),\n new DataChangeListenerPlugin(),\n new DevtoolsUIAssetsPlugin(),\n new LogForwarder(),\n PUBSUB_PLUGIN,\n];\n","import type { CommunicationLayerMethods } from \"@player-devtools/types\";\nimport { useEffect, useMemo, useSyncExternalStore } from \"react\";\n\nimport { createExtensionClient } from \"./client\";\n\n/**\n * Thin React adapter over `createExtensionClient`.\n *\n * Creates the client once per `communicationLayer` identity, subscribes to\n * state via `useSyncExternalStore`, and tears down the Messenger on unmount.\n */\nexport const useExtensionState = ({\n communicationLayer,\n}: {\n /** the communication layer to use for the extension */\n communicationLayer: CommunicationLayerMethods;\n}) => {\n const client = useMemo(\n () => createExtensionClient(communicationLayer),\n [communicationLayer],\n );\n\n useEffect(() => () => client.destroy(), [client]);\n\n const state = useSyncExternalStore(client.subscribe, client.getState);\n\n return {\n state,\n selectPlayer: client.selectPlayer,\n selectPlugin: client.selectPlugin,\n handleInteraction: client.handleInteraction,\n };\n};\n","import { Messenger } from \"@player-devtools/messenger\";\nimport type {\n CommunicationLayerMethods,\n ExtensionState,\n ExtensionSupportedEvents,\n} from \"@player-devtools/types\";\nimport { useStateReducer } from \"@player-devtools/utils\";\n\nimport { INITIAL_EXTENSION_STATE } from \"../constants\";\nimport { reducer } from \"./reducer\";\n\nconst NOOP_ID = -1;\n\nexport type ExtensionClient = {\n getState: () => ExtensionState;\n subscribe: (fn: (state: ExtensionState) => void) => () => void;\n selectPlayer: (playerID: string) => void;\n selectPlugin: (pluginID: string) => void;\n handleInteraction: (interaction: {\n type: string;\n payload?: string;\n target?: string;\n }) => void;\n destroy: () => void;\n};\n\nexport const createExtensionClient = (\n communicationLayer: CommunicationLayerMethods,\n): ExtensionClient => {\n const store = useStateReducer(reducer, INITIAL_EXTENSION_STATE);\n\n const messenger = new Messenger<ExtensionSupportedEvents>({\n context: \"devtools\",\n messageCallback: (message) => store.dispatch(message),\n ...communicationLayer,\n logger: console,\n });\n\n const selectPlayer = (playerID: string): void => {\n store.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: { playerID },\n });\n\n messenger.sendMessage({\n type: \"PLAYER_DEVTOOLS_PLUGIN_INTERACTION\",\n payload: {\n type: \"player-selected\",\n payload: playerID,\n },\n });\n };\n\n const selectPlugin = (pluginID: string): void => {\n store.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: { pluginID },\n });\n };\n\n const handleInteraction = ({\n type,\n payload,\n target,\n }: {\n type: string;\n payload?: string;\n /** Player to address; defaults to the currently selected player. */\n target?: string;\n }): void => {\n const resolvedTarget = target ?? store.getState().current.player;\n messenger.sendMessage({\n type: \"PLAYER_DEVTOOLS_PLUGIN_INTERACTION\",\n payload: { type, payload },\n ...(resolvedTarget ? { target: resolvedTarget } : {}),\n });\n };\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n selectPlayer,\n selectPlugin,\n handleInteraction,\n destroy: () => messenger.destroy(),\n };\n};\n","import type {\n ExtensionState,\n ExtensionSupportedEvents,\n Transaction,\n} from \"@player-devtools/types\";\nimport { dsetAssign } from \"@player-devtools/utils\";\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\n const [plugin] = Object.values(plugins);\n if (!plugin) return;\n\n draft.current.player = sender;\n draft.current.plugin = draft.current.plugin || plugin.id;\n\n // TODO: Verify this works with multiple plugins\n dsetAssign(draft, [\"players\", sender, \"plugins\"], plugins, true);\n dsetAssign(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 dsetAssign(\n draft,\n [\"players\", sender, \"plugins\", pluginID, \"flow\"],\n flow,\n );\n });\n case \"PLAYER_DEVTOOLS_PLUGIN_DATA_CHANGE\":\n return produce(state, (draft) => {\n const {\n sender,\n payload: { data, pluginID },\n } = transaction;\n dsetAssign(\n draft,\n [\"players\", sender, \"plugins\", pluginID, \"flow\", \"data\"],\n data,\n );\n });\n case \"MESSENGER_EVENT_BATCH\":\n return transaction.payload.events.reduce(reducer, state);\n case \"PLAYER_DEVTOOLS_PLAYER_STOPPED\":\n return produce(state, (draft) => {\n const { sender } = transaction;\n dsetAssign(draft, [\"players\", sender, \"active\"], false);\n });\n case \"PLAYER_DEVTOOLS_PLAYER_SELECTED\":\n return produce(state, (draft) => {\n const { playerID } = transaction.payload;\n draft.current.player = playerID;\n });\n case \"PLAYER_DEVTOOLS_PLUGIN_SELECTED\":\n return produce(state, (draft) => {\n const { pluginID } = transaction.payload;\n 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"],"mappings":"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","names":["import_react","DevtoolsUIAssetsPlugin","import_react","import_utils","React"]}
|
|
1
|
+
{"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/state/client.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/constants/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/state/reducer.ts"],"sourcesContent":["export { createExtensionClient, type ExtensionClient } from \"./state/client\";\n","import { Messenger } from \"@player-devtools/messenger\";\nimport type {\n CommunicationLayerMethods,\n ExtensionState,\n ExtensionSupportedEvents,\n} from \"@player-devtools/types\";\nimport { useStateReducer } from \"@player-devtools/utils\";\n\nimport { INITIAL_EXTENSION_STATE } from \"../constants\";\nimport { reducer } from \"./reducer\";\n\nconst NOOP_ID = -1;\n\nexport type ExtensionClient = {\n getState: () => ExtensionState;\n subscribe: (fn: (state: ExtensionState) => void) => () => void;\n selectPlayer: (playerID: string) => void;\n selectPlugin: (pluginID: string) => void;\n handleInteraction: (interaction: {\n type: string;\n payload?: string;\n target?: string;\n }) => void;\n destroy: () => void;\n};\n\nexport const createExtensionClient = (\n communicationLayer: CommunicationLayerMethods,\n): ExtensionClient => {\n const store = useStateReducer(reducer, INITIAL_EXTENSION_STATE);\n\n const messenger = new Messenger<ExtensionSupportedEvents>({\n context: \"devtools\",\n messageCallback: (message) => store.dispatch(message),\n ...communicationLayer,\n logger: console,\n });\n\n const selectPlayer = (playerID: string): void => {\n store.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: { playerID },\n });\n\n messenger.sendMessage({\n type: \"PLAYER_DEVTOOLS_PLUGIN_INTERACTION\",\n payload: {\n type: \"player-selected\",\n payload: playerID,\n },\n });\n };\n\n const selectPlugin = (pluginID: string): void => {\n store.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: { pluginID },\n });\n };\n\n const handleInteraction = ({\n type,\n payload,\n target,\n }: {\n type: string;\n payload?: string;\n /** Player to address; defaults to the currently selected player. */\n target?: string;\n }): void => {\n const resolvedTarget = target ?? store.getState().current.player;\n messenger.sendMessage({\n type: \"PLAYER_DEVTOOLS_PLUGIN_INTERACTION\",\n payload: { type, payload },\n ...(resolvedTarget ? { target: resolvedTarget } : {}),\n });\n };\n\n return {\n getState: store.getState,\n subscribe: store.subscribe,\n selectPlayer,\n selectPlugin,\n handleInteraction,\n destroy: () => messenger.destroy(),\n };\n};\n","import type { ExtensionState } from \"@player-devtools/types\";\n\nexport const INITIAL_EXTENSION_STATE: ExtensionState = {\n current: {\n player: null,\n plugin: null,\n },\n players: {},\n};\n","import type {\n ExtensionState,\n ExtensionSupportedEvents,\n Transaction,\n} from \"@player-devtools/types\";\nimport { dsetAssign } from \"@player-devtools/utils\";\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\n const [plugin] = Object.values(plugins);\n if (!plugin) return;\n\n draft.current.player = sender;\n draft.current.plugin = draft.current.plugin || plugin.id;\n\n // TODO: Verify this works with multiple plugins\n dsetAssign(draft, [\"players\", sender, \"plugins\"], plugins, true);\n dsetAssign(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 dsetAssign(\n draft,\n [\"players\", sender, \"plugins\", pluginID, \"flow\"],\n flow,\n );\n });\n case \"PLAYER_DEVTOOLS_PLUGIN_DATA_CHANGE\":\n return produce(state, (draft) => {\n const {\n sender,\n payload: { data, pluginID },\n } = transaction;\n dsetAssign(\n draft,\n [\"players\", sender, \"plugins\", pluginID, \"flow\", \"data\"],\n data,\n );\n });\n case \"MESSENGER_EVENT_BATCH\":\n return transaction.payload.events.reduce(reducer, state);\n case \"PLAYER_DEVTOOLS_PLAYER_STOPPED\":\n return produce(state, (draft) => {\n const { sender } = transaction;\n dsetAssign(draft, [\"players\", sender, \"active\"], false);\n });\n case \"PLAYER_DEVTOOLS_PLAYER_SELECTED\":\n return produce(state, (draft) => {\n const { playerID } = transaction.payload;\n draft.current.player = playerID;\n });\n case \"PLAYER_DEVTOOLS_PLUGIN_SELECTED\":\n return produce(state, (draft) => {\n const { pluginID } = transaction.payload;\n draft.current.plugin = pluginID;\n });\n default:\n return state;\n }\n};\n"],"mappings":"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","names":["import_utils"]}
|
package/dist/index.legacy-esm.js
CHANGED
|
@@ -1,46 +1,8 @@
|
|
|
1
|
-
//
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import { useEffect as useEffect2 } from "react";
|
|
5
|
-
import { ErrorBoundary } from "react-error-boundary";
|
|
6
|
-
import {
|
|
7
|
-
Card,
|
|
8
|
-
CardBody,
|
|
9
|
-
CardHeader,
|
|
10
|
-
ChakraProvider,
|
|
11
|
-
Container,
|
|
12
|
-
extendTheme,
|
|
13
|
-
Flex,
|
|
14
|
-
FormControl,
|
|
15
|
-
FormLabel,
|
|
16
|
-
Heading,
|
|
17
|
-
Select,
|
|
18
|
-
Text
|
|
19
|
-
} from "@chakra-ui/react";
|
|
20
|
-
import { ThemeProvider, useDarkMode } from "@devtools-ds/themes";
|
|
1
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/state/client.ts
|
|
2
|
+
import { Messenger } from "@player-devtools/messenger";
|
|
3
|
+
import { useStateReducer } from "@player-devtools/utils";
|
|
21
4
|
|
|
22
|
-
//
|
|
23
|
-
var INITIAL_FLOW = {
|
|
24
|
-
id: "initial-flow",
|
|
25
|
-
views: [
|
|
26
|
-
{
|
|
27
|
-
id: "view-1",
|
|
28
|
-
type: "text",
|
|
29
|
-
value: "connecting..."
|
|
30
|
-
}
|
|
31
|
-
],
|
|
32
|
-
navigation: {
|
|
33
|
-
BEGIN: "FLOW_1",
|
|
34
|
-
FLOW_1: {
|
|
35
|
-
startState: "VIEW_1",
|
|
36
|
-
VIEW_1: {
|
|
37
|
-
state_type: "VIEW",
|
|
38
|
-
ref: "view-1",
|
|
39
|
-
transitions: {}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
};
|
|
5
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/constants/index.ts
|
|
44
6
|
var INITIAL_EXTENSION_STATE = {
|
|
45
7
|
current: {
|
|
46
8
|
player: null,
|
|
@@ -49,44 +11,7 @@ var INITIAL_EXTENSION_STATE = {
|
|
|
49
11
|
players: {}
|
|
50
12
|
};
|
|
51
13
|
|
|
52
|
-
//
|
|
53
|
-
import DevtoolsUIAssetsPlugin from "@devtools-ui/plugin";
|
|
54
|
-
import { PubSubPlugin } from "@player-ui/pubsub-plugin";
|
|
55
|
-
import { CommonExpressionsPlugin } from "@player-ui/common-expressions-plugin";
|
|
56
|
-
import { CommonTypesPlugin } from "@player-ui/common-types-plugin";
|
|
57
|
-
import { DataChangeListenerPlugin } from "@player-ui/data-change-listener-plugin";
|
|
58
|
-
import {
|
|
59
|
-
ConsoleLogger
|
|
60
|
-
} from "@player-ui/react";
|
|
61
|
-
var LogForwarder = class {
|
|
62
|
-
constructor() {
|
|
63
|
-
this.name = "Log";
|
|
64
|
-
}
|
|
65
|
-
apply(player) {
|
|
66
|
-
player.logger.addHandler(new ConsoleLogger("trace", console));
|
|
67
|
-
}
|
|
68
|
-
applyReact(reactPlayer) {
|
|
69
|
-
this.apply(reactPlayer.player);
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
var PUBSUB_PLUGIN = new PubSubPlugin();
|
|
73
|
-
var PLAYER_PLUGINS = [
|
|
74
|
-
new CommonTypesPlugin(),
|
|
75
|
-
new CommonExpressionsPlugin(),
|
|
76
|
-
new DataChangeListenerPlugin(),
|
|
77
|
-
new DevtoolsUIAssetsPlugin(),
|
|
78
|
-
new LogForwarder(),
|
|
79
|
-
PUBSUB_PLUGIN
|
|
80
|
-
];
|
|
81
|
-
|
|
82
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/index.ts
|
|
83
|
-
import { useEffect, useMemo, useSyncExternalStore } from "react";
|
|
84
|
-
|
|
85
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/client.ts
|
|
86
|
-
import { Messenger } from "@player-devtools/messenger";
|
|
87
|
-
import { useStateReducer } from "@player-devtools/utils";
|
|
88
|
-
|
|
89
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/reducer.ts
|
|
14
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/state/reducer.ts
|
|
90
15
|
import { dsetAssign } from "@player-devtools/utils";
|
|
91
16
|
import { produce } from "immer";
|
|
92
17
|
var reducer = (state, transaction) => {
|
|
@@ -150,7 +75,7 @@ var reducer = (state, transaction) => {
|
|
|
150
75
|
}
|
|
151
76
|
};
|
|
152
77
|
|
|
153
|
-
//
|
|
78
|
+
// ../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/core/src/state/client.ts
|
|
154
79
|
var NOOP_ID = -1;
|
|
155
80
|
var createExtensionClient = (communicationLayer) => {
|
|
156
81
|
const store = useStateReducer(reducer, INITIAL_EXTENSION_STATE);
|
|
@@ -210,143 +135,7 @@ var createExtensionClient = (communicationLayer) => {
|
|
|
210
135
|
destroy: () => messenger.destroy()
|
|
211
136
|
};
|
|
212
137
|
};
|
|
213
|
-
|
|
214
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/state/index.ts
|
|
215
|
-
var useExtensionState = ({
|
|
216
|
-
communicationLayer
|
|
217
|
-
}) => {
|
|
218
|
-
const client = useMemo(
|
|
219
|
-
() => createExtensionClient(communicationLayer),
|
|
220
|
-
[communicationLayer]
|
|
221
|
-
);
|
|
222
|
-
useEffect(() => () => client.destroy(), [client]);
|
|
223
|
-
const state = useSyncExternalStore(client.subscribe, client.getState);
|
|
224
|
-
return {
|
|
225
|
-
state,
|
|
226
|
-
selectPlayer: client.selectPlayer,
|
|
227
|
-
selectPlugin: client.selectPlugin,
|
|
228
|
-
handleInteraction: client.handleInteraction
|
|
229
|
-
};
|
|
230
|
-
};
|
|
231
|
-
|
|
232
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/helpers/flowDiff.ts
|
|
233
|
-
import { dequal } from "dequal";
|
|
234
|
-
var flowDiff = ({
|
|
235
|
-
curr,
|
|
236
|
-
next
|
|
237
|
-
}) => {
|
|
238
|
-
const currCopy = { ...curr, data: null };
|
|
239
|
-
const nextCopy = { ...next, data: null };
|
|
240
|
-
const baseFlowIsEqual = dequal(currCopy, nextCopy);
|
|
241
|
-
if (!baseFlowIsEqual) {
|
|
242
|
-
return { change: "flow", value: next };
|
|
243
|
-
}
|
|
244
|
-
const currData = curr.data;
|
|
245
|
-
const nextData = next.data;
|
|
246
|
-
const dataIsEqual = dequal(currData, nextData);
|
|
247
|
-
if (!dataIsEqual) {
|
|
248
|
-
return { change: "data", value: nextData };
|
|
249
|
-
}
|
|
250
|
-
return null;
|
|
251
|
-
};
|
|
252
|
-
|
|
253
|
-
// ../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/client/src/panel/index.tsx
|
|
254
|
-
var fallbackRender = ({
|
|
255
|
-
error
|
|
256
|
-
}) => {
|
|
257
|
-
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))));
|
|
258
|
-
};
|
|
259
|
-
var Panel = ({ communicationLayer, baseTheme }) => {
|
|
260
|
-
const { state, selectPlayer, selectPlugin, handleInteraction } = useExtensionState({
|
|
261
|
-
communicationLayer
|
|
262
|
-
});
|
|
263
|
-
const { reactPlayer, playerState } = useReactPlayer({
|
|
264
|
-
plugins: PLAYER_PLUGINS
|
|
265
|
-
});
|
|
266
|
-
const dataController = useRef(null);
|
|
267
|
-
const currentFlow = useRef(null);
|
|
268
|
-
useEffect2(() => {
|
|
269
|
-
reactPlayer.player.hooks.dataController.tap("devtools-panel", (d) => {
|
|
270
|
-
dataController.current = new WeakRef(d);
|
|
271
|
-
});
|
|
272
|
-
}, [reactPlayer]);
|
|
273
|
-
useEffect2(() => {
|
|
274
|
-
PUBSUB_PLUGIN.subscribe("*", (type, payload) => {
|
|
275
|
-
handleInteraction({
|
|
276
|
-
type,
|
|
277
|
-
payload
|
|
278
|
-
});
|
|
279
|
-
});
|
|
280
|
-
}, []);
|
|
281
|
-
useEffect2(() => {
|
|
282
|
-
const { player, plugin } = state.current;
|
|
283
|
-
const flow = player && plugin ? state.players[player]?.plugins?.[plugin]?.flow || INITIAL_FLOW : INITIAL_FLOW;
|
|
284
|
-
if (!currentFlow.current) {
|
|
285
|
-
currentFlow.current = flow;
|
|
286
|
-
reactPlayer.start(flow);
|
|
287
|
-
return;
|
|
288
|
-
}
|
|
289
|
-
const diff = flowDiff({
|
|
290
|
-
curr: currentFlow.current,
|
|
291
|
-
next: flow
|
|
292
|
-
});
|
|
293
|
-
if (diff) {
|
|
294
|
-
const { change, value } = diff;
|
|
295
|
-
if (change === "flow") {
|
|
296
|
-
currentFlow.current = value;
|
|
297
|
-
reactPlayer.start(value);
|
|
298
|
-
} else if (change === "data") {
|
|
299
|
-
if (dataController.current) {
|
|
300
|
-
dataController.current.deref()?.set(value);
|
|
301
|
-
} else {
|
|
302
|
-
reactPlayer.start(flow);
|
|
303
|
-
}
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}, [reactPlayer, state]);
|
|
307
|
-
const isDarkMode = useDarkMode();
|
|
308
|
-
const colorMode = isDarkMode ? "dark" : "light";
|
|
309
|
-
const config = {
|
|
310
|
-
initialColorMode: colorMode,
|
|
311
|
-
useSystemColorMode: true
|
|
312
|
-
};
|
|
313
|
-
const theme = extendTheme({ config, ...baseTheme });
|
|
314
|
-
const Component = reactPlayer.Component;
|
|
315
|
-
return /* @__PURE__ */ React.createElement(ChakraProvider, { resetCSS: false, theme }, /* @__PURE__ */ React.createElement(ThemeProvider, { theme: "chrome", colorScheme: colorMode }, /* @__PURE__ */ React.createElement(ErrorBoundary, { fallbackRender }, /* @__PURE__ */ React.createElement(
|
|
316
|
-
Flex,
|
|
317
|
-
{
|
|
318
|
-
direction: "column",
|
|
319
|
-
h: "100vh",
|
|
320
|
-
alignItems: "normal",
|
|
321
|
-
overflow: "scroll"
|
|
322
|
-
},
|
|
323
|
-
state.current.player ? /* @__PURE__ */ React.createElement(Flex, { direction: "column", gap: "20px" }, /* @__PURE__ */ React.createElement(Flex, { gap: "16px" }, /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(FormLabel, null, "Player"), /* @__PURE__ */ React.createElement(
|
|
324
|
-
Select,
|
|
325
|
-
{
|
|
326
|
-
id: "player",
|
|
327
|
-
value: state.current.player || "",
|
|
328
|
-
onChange: (event) => selectPlayer(event.target.value)
|
|
329
|
-
},
|
|
330
|
-
Object.keys(state.players).map((playerID) => /* @__PURE__ */ React.createElement("option", { key: playerID, value: playerID }, playerID))
|
|
331
|
-
)), /* @__PURE__ */ React.createElement(FormControl, null, /* @__PURE__ */ React.createElement(FormLabel, null, "Plugin"), /* @__PURE__ */ React.createElement(
|
|
332
|
-
Select,
|
|
333
|
-
{
|
|
334
|
-
id: "plugin",
|
|
335
|
-
value: state.current.plugin || "",
|
|
336
|
-
onChange: (event) => selectPlugin(event.target.value)
|
|
337
|
-
},
|
|
338
|
-
Object.keys(
|
|
339
|
-
state.players[state.current.player]?.plugins ?? []
|
|
340
|
-
).map((pluginID) => /* @__PURE__ */ React.createElement("option", { key: pluginID, value: pluginID }, pluginID))
|
|
341
|
-
))), /* @__PURE__ */ React.createElement(Flex, { width: "100%" }, playerState.status === "error" ? fallbackRender({
|
|
342
|
-
error: playerState.error,
|
|
343
|
-
resetErrorBoundary: () => {
|
|
344
|
-
}
|
|
345
|
-
}) : /* @__PURE__ */ React.createElement(Component, null)), /* @__PURE__ */ React.createElement("details", null, /* @__PURE__ */ React.createElement("summary", null, "Debug"), /* @__PURE__ */ React.createElement("pre", { style: { maxHeight: "30vh", overflow: "scroll" } }, 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."))
|
|
346
|
-
))));
|
|
347
|
-
};
|
|
348
138
|
export {
|
|
349
|
-
Panel,
|
|
350
139
|
createExtensionClient
|
|
351
140
|
};
|
|
352
141
|
//# sourceMappingURL=index.mjs.map
|