@player-devtools/basic-plugin 0.0.2-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.
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // ../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/basic/core/src/index.ts
21
+ var src_exports = {};
22
+ __export(src_exports, {
23
+ BasicDevtoolsPlugin: () => BasicDevtoolsPlugin
24
+ });
25
+ module.exports = __toCommonJS(src_exports);
26
+
27
+ // ../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/basic/core/src/plugin.ts
28
+ var import_basic_plugin_content = require("@player-devtools/basic-plugin-content");
29
+ var import_plugin = require("@player-devtools/plugin");
30
+ var import_utils = require("@player-devtools/utils");
31
+ var import_immer = require("immer");
32
+ var BasicDevtoolsPlugin = class extends import_plugin.DevtoolsPlugin {
33
+ constructor(options) {
34
+ super({
35
+ ...options,
36
+ pluginData: import_basic_plugin_content.BasicPluginData
37
+ });
38
+ this.name = "BasicDevtoolsPlugin";
39
+ this.data = {};
40
+ this.playerConfig = {};
41
+ this.logs = [];
42
+ }
43
+ apply(player) {
44
+ this.logger = new WeakRef(player.logger);
45
+ if (!this.checkIfDevtoolsIsActive()) return;
46
+ this.options.pluginData.flow.data.playerConfig = {
47
+ version: player.getVersion(),
48
+ plugins: player.getPlugins().map((plugin) => plugin.name)
49
+ };
50
+ super.apply(player);
51
+ this.playerConfig = {
52
+ version: player.getVersion(),
53
+ plugins: player.getPlugins().map((plugin) => plugin.name)
54
+ };
55
+ this.dispatchDataUpdate({ playerConfig: this.playerConfig });
56
+ player.hooks.dataController.tap(this.name, (dataController) => {
57
+ dataController.hooks.onUpdate.tap(this.name, (updates) => {
58
+ this.data = (0, import_immer.produce)(this.data, (draft) => {
59
+ updates.forEach(({ binding, newValue }) => {
60
+ (0, import_utils.dsetAssign)(draft, ["data", ...binding.asArray()], newValue);
61
+ });
62
+ });
63
+ this.dispatchDataUpdate({ data: this.data });
64
+ });
65
+ });
66
+ player.logger.hooks.log.tap(this.name, (severity, message) => {
67
+ this.logs = [...this.logs, { severity, message }];
68
+ this.dispatchDataUpdate({ logs: this.logs });
69
+ });
70
+ player.hooks.onStart.tap(this.name, (f) => {
71
+ this.flow = JSON.parse(JSON.stringify(f));
72
+ this.dispatchDataUpdate({ flow: this.flow });
73
+ });
74
+ player.hooks.view.tap(this.name, (view) => {
75
+ this.view = new WeakRef(view);
76
+ });
77
+ player.hooks.expressionEvaluator.tap(this.name, (evaluator) => {
78
+ this.expressionEvaluator = new WeakRef(evaluator);
79
+ });
80
+ this.overrideFlow = player.start.bind(player);
81
+ }
82
+ evaluateExpression(expression) {
83
+ const evaluator = this.expressionEvaluator?.deref();
84
+ if (!evaluator) {
85
+ return {
86
+ id: (0, import_plugin.generateUUID)(),
87
+ severity: "error",
88
+ result: "Expression evaluator not available",
89
+ expression
90
+ };
91
+ }
92
+ try {
93
+ evaluator.hooks.onError.intercept({
94
+ call: (error) => {
95
+ throw error;
96
+ }
97
+ });
98
+ const evaluatorResult = evaluator.evaluate(expression);
99
+ return {
100
+ id: (0, import_plugin.generateUUID)(),
101
+ result: evaluatorResult,
102
+ expression
103
+ };
104
+ } catch (error) {
105
+ const message = error instanceof Error ? error.message : String(error ?? "Something went wrong");
106
+ return {
107
+ id: (0, import_plugin.generateUUID)(),
108
+ severity: "error",
109
+ result: message,
110
+ expression
111
+ };
112
+ }
113
+ }
114
+ processInteraction(interaction) {
115
+ super.processInteraction(interaction);
116
+ const {
117
+ payload: { type, payload }
118
+ } = interaction;
119
+ if (type === import_basic_plugin_content.INTERACTIONS.EVALUATE_EXPRESSION && this.expressionEvaluator && payload) {
120
+ const result = this.evaluateExpression(payload);
121
+ const current = this.store.getState()?.plugins?.[this.pluginID]?.flow?.data?.history || [];
122
+ this.dispatchDataUpdate({ history: [...current, result] });
123
+ return;
124
+ }
125
+ if (type === import_basic_plugin_content.INTERACTIONS.OVERRIDE_FLOW && payload && this.overrideFlow) {
126
+ let newFlow;
127
+ try {
128
+ newFlow = JSON.parse(payload);
129
+ } catch (e) {
130
+ this.logger?.deref()?.error(this.name, "Error parsing new flow", e);
131
+ }
132
+ if (newFlow) {
133
+ this.overrideFlow(newFlow);
134
+ }
135
+ return;
136
+ }
137
+ }
138
+ };
139
+ // Annotate the CommonJS export names for ESM import in node:
140
+ 0 && (module.exports = {
141
+ BasicDevtoolsPlugin
142
+ });
143
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/basic/core/src/index.ts","../../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/basic/core/src/plugin.ts"],"sourcesContent":["export { BasicDevtoolsPlugin } from \"./plugin\";\n","import {\n INTERACTIONS,\n BasicPluginData,\n} from \"@player-devtools/basic-plugin-content\";\nimport {\n DevtoolsPlugin,\n DevtoolsPluginOptions,\n generateUUID,\n} from \"@player-devtools/plugin\";\nimport type { DevtoolsPluginInteractionEvent } from \"@player-devtools/types\";\nimport { dsetAssign } from \"@player-devtools/utils\";\nimport type {\n DataController,\n ExpressionEvaluator,\n Flow,\n Player,\n ViewInstance,\n Logger,\n} from \"@player-ui/player\";\nimport { produce } from \"immer\";\n\nimport { Evaluation } from \"./types\";\n\n/** Taps into the Player and ReactPlayer hooks and leverage the WrapperComponent to define and process the content. */\nexport class BasicDevtoolsPlugin extends DevtoolsPlugin {\n constructor(options: Omit<DevtoolsPluginOptions, \"pluginData\">) {\n super({\n ...options,\n pluginData: BasicPluginData,\n });\n }\n\n name = \"BasicDevtoolsPlugin\";\n\n data: Record<string, unknown> = {};\n\n playerConfig: Record<string, unknown> = {};\n\n logs: {\n severity: string;\n message: unknown;\n }[] = [];\n\n flow?: Flow;\n\n logger?: WeakRef<Logger>;\n\n expressionEvaluator?: WeakRef<ExpressionEvaluator>;\n\n view?: WeakRef<ViewInstance>;\n\n dataController?: WeakRef<DataController>;\n\n overrideFlow?: Player[\"start\"];\n\n apply(player: Player): void {\n this.logger = new WeakRef(player.logger);\n\n if (!this.checkIfDevtoolsIsActive()) return;\n\n this.options.pluginData.flow.data!.playerConfig = {\n version: player.getVersion(),\n plugins: player.getPlugins().map((plugin) => plugin.name),\n };\n\n super.apply(player);\n\n // Config\n this.playerConfig = {\n version: player.getVersion(),\n plugins: player.getPlugins().map((plugin) => plugin.name),\n };\n\n this.dispatchDataUpdate({ playerConfig: this.playerConfig });\n\n // Data\n player.hooks.dataController.tap(this.name, (dataController) => {\n dataController.hooks.onUpdate.tap(this.name, (updates) => {\n this.data = produce(this.data, (draft) => {\n updates.forEach(({ binding, newValue }) => {\n dsetAssign(draft, [\"data\", ...binding.asArray()], newValue);\n });\n });\n\n this.dispatchDataUpdate({ data: this.data });\n });\n });\n\n player.logger.hooks.log.tap(this.name, (severity, message) => {\n this.logs = [...this.logs, { severity, message }];\n\n this.dispatchDataUpdate({ logs: this.logs });\n });\n\n // Flow\n player.hooks.onStart.tap(this.name, (f) => {\n this.flow = JSON.parse(JSON.stringify(f));\n\n this.dispatchDataUpdate({ flow: this.flow });\n });\n\n // View\n player.hooks.view.tap(this.name, (view) => {\n this.view = new WeakRef(view);\n });\n\n // Expression evaluator\n player.hooks.expressionEvaluator.tap(this.name, (evaluator) => {\n this.expressionEvaluator = new WeakRef(evaluator);\n });\n\n // Override flow\n this.overrideFlow = player.start.bind(player);\n }\n\n private evaluateExpression(expression: string): Evaluation {\n const evaluator = this.expressionEvaluator?.deref();\n\n if (!evaluator) {\n return {\n id: generateUUID(),\n severity: \"error\",\n result: \"Expression evaluator not available\",\n expression,\n };\n }\n\n try {\n evaluator.hooks.onError.intercept({\n call: (error: Error) => {\n throw error;\n },\n });\n\n const evaluatorResult = evaluator.evaluate(expression);\n\n return {\n id: generateUUID(),\n result: evaluatorResult,\n expression,\n };\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : String(error ?? \"Something went wrong\");\n return {\n id: generateUUID(),\n severity: \"error\",\n result: message,\n expression,\n };\n }\n }\n\n processInteraction(interaction: DevtoolsPluginInteractionEvent): void {\n // invokes mobile specific handlers\n super.processInteraction(interaction);\n\n const {\n payload: { type, payload },\n } = interaction;\n if (\n type === INTERACTIONS.EVALUATE_EXPRESSION &&\n this.expressionEvaluator &&\n payload\n ) {\n const result = this.evaluateExpression(payload);\n const current: Array<Evaluation> =\n (this.store.getState()?.plugins?.[this.pluginID]?.flow?.data\n ?.history as Array<Evaluation>) || [];\n\n this.dispatchDataUpdate({ history: [...current, result] });\n\n return;\n }\n\n if (type === INTERACTIONS.OVERRIDE_FLOW && payload && this.overrideFlow) {\n let newFlow: Flow | undefined;\n\n try {\n newFlow = JSON.parse(payload);\n } catch (e) {\n this.logger?.deref()?.error(this.name, \"Error parsing new flow\", e);\n }\n\n if (newFlow) {\n this.overrideFlow(newFlow);\n }\n\n return;\n }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,122 @@
1
+ // ../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/basic/core/src/plugin.ts
2
+ import {
3
+ INTERACTIONS,
4
+ BasicPluginData
5
+ } from "@player-devtools/basic-plugin-content";
6
+ import {
7
+ DevtoolsPlugin,
8
+ generateUUID
9
+ } from "@player-devtools/plugin";
10
+ import { dsetAssign } from "@player-devtools/utils";
11
+ import { produce } from "immer";
12
+ var BasicDevtoolsPlugin = class extends DevtoolsPlugin {
13
+ constructor(options) {
14
+ super({
15
+ ...options,
16
+ pluginData: BasicPluginData
17
+ });
18
+ this.name = "BasicDevtoolsPlugin";
19
+ this.data = {};
20
+ this.playerConfig = {};
21
+ this.logs = [];
22
+ }
23
+ apply(player) {
24
+ this.logger = new WeakRef(player.logger);
25
+ if (!this.checkIfDevtoolsIsActive()) return;
26
+ this.options.pluginData.flow.data.playerConfig = {
27
+ version: player.getVersion(),
28
+ plugins: player.getPlugins().map((plugin) => plugin.name)
29
+ };
30
+ super.apply(player);
31
+ this.playerConfig = {
32
+ version: player.getVersion(),
33
+ plugins: player.getPlugins().map((plugin) => plugin.name)
34
+ };
35
+ this.dispatchDataUpdate({ playerConfig: this.playerConfig });
36
+ player.hooks.dataController.tap(this.name, (dataController) => {
37
+ dataController.hooks.onUpdate.tap(this.name, (updates) => {
38
+ this.data = produce(this.data, (draft) => {
39
+ updates.forEach(({ binding, newValue }) => {
40
+ dsetAssign(draft, ["data", ...binding.asArray()], newValue);
41
+ });
42
+ });
43
+ this.dispatchDataUpdate({ data: this.data });
44
+ });
45
+ });
46
+ player.logger.hooks.log.tap(this.name, (severity, message) => {
47
+ this.logs = [...this.logs, { severity, message }];
48
+ this.dispatchDataUpdate({ logs: this.logs });
49
+ });
50
+ player.hooks.onStart.tap(this.name, (f) => {
51
+ this.flow = JSON.parse(JSON.stringify(f));
52
+ this.dispatchDataUpdate({ flow: this.flow });
53
+ });
54
+ player.hooks.view.tap(this.name, (view) => {
55
+ this.view = new WeakRef(view);
56
+ });
57
+ player.hooks.expressionEvaluator.tap(this.name, (evaluator) => {
58
+ this.expressionEvaluator = new WeakRef(evaluator);
59
+ });
60
+ this.overrideFlow = player.start.bind(player);
61
+ }
62
+ evaluateExpression(expression) {
63
+ const evaluator = this.expressionEvaluator?.deref();
64
+ if (!evaluator) {
65
+ return {
66
+ id: generateUUID(),
67
+ severity: "error",
68
+ result: "Expression evaluator not available",
69
+ expression
70
+ };
71
+ }
72
+ try {
73
+ evaluator.hooks.onError.intercept({
74
+ call: (error) => {
75
+ throw error;
76
+ }
77
+ });
78
+ const evaluatorResult = evaluator.evaluate(expression);
79
+ return {
80
+ id: generateUUID(),
81
+ result: evaluatorResult,
82
+ expression
83
+ };
84
+ } catch (error) {
85
+ const message = error instanceof Error ? error.message : String(error ?? "Something went wrong");
86
+ return {
87
+ id: generateUUID(),
88
+ severity: "error",
89
+ result: message,
90
+ expression
91
+ };
92
+ }
93
+ }
94
+ processInteraction(interaction) {
95
+ super.processInteraction(interaction);
96
+ const {
97
+ payload: { type, payload }
98
+ } = interaction;
99
+ if (type === INTERACTIONS.EVALUATE_EXPRESSION && this.expressionEvaluator && payload) {
100
+ const result = this.evaluateExpression(payload);
101
+ const current = this.store.getState()?.plugins?.[this.pluginID]?.flow?.data?.history || [];
102
+ this.dispatchDataUpdate({ history: [...current, result] });
103
+ return;
104
+ }
105
+ if (type === INTERACTIONS.OVERRIDE_FLOW && payload && this.overrideFlow) {
106
+ let newFlow;
107
+ try {
108
+ newFlow = JSON.parse(payload);
109
+ } catch (e) {
110
+ this.logger?.deref()?.error(this.name, "Error parsing new flow", e);
111
+ }
112
+ if (newFlow) {
113
+ this.overrideFlow(newFlow);
114
+ }
115
+ return;
116
+ }
117
+ }
118
+ };
119
+ export {
120
+ BasicDevtoolsPlugin
121
+ };
122
+ //# sourceMappingURL=index.mjs.map
package/dist/index.mjs ADDED
@@ -0,0 +1,122 @@
1
+ // ../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/basic/core/src/plugin.ts
2
+ import {
3
+ INTERACTIONS,
4
+ BasicPluginData
5
+ } from "@player-devtools/basic-plugin-content";
6
+ import {
7
+ DevtoolsPlugin,
8
+ generateUUID
9
+ } from "@player-devtools/plugin";
10
+ import { dsetAssign } from "@player-devtools/utils";
11
+ import { produce } from "immer";
12
+ var BasicDevtoolsPlugin = class extends DevtoolsPlugin {
13
+ constructor(options) {
14
+ super({
15
+ ...options,
16
+ pluginData: BasicPluginData
17
+ });
18
+ this.name = "BasicDevtoolsPlugin";
19
+ this.data = {};
20
+ this.playerConfig = {};
21
+ this.logs = [];
22
+ }
23
+ apply(player) {
24
+ this.logger = new WeakRef(player.logger);
25
+ if (!this.checkIfDevtoolsIsActive()) return;
26
+ this.options.pluginData.flow.data.playerConfig = {
27
+ version: player.getVersion(),
28
+ plugins: player.getPlugins().map((plugin) => plugin.name)
29
+ };
30
+ super.apply(player);
31
+ this.playerConfig = {
32
+ version: player.getVersion(),
33
+ plugins: player.getPlugins().map((plugin) => plugin.name)
34
+ };
35
+ this.dispatchDataUpdate({ playerConfig: this.playerConfig });
36
+ player.hooks.dataController.tap(this.name, (dataController) => {
37
+ dataController.hooks.onUpdate.tap(this.name, (updates) => {
38
+ this.data = produce(this.data, (draft) => {
39
+ updates.forEach(({ binding, newValue }) => {
40
+ dsetAssign(draft, ["data", ...binding.asArray()], newValue);
41
+ });
42
+ });
43
+ this.dispatchDataUpdate({ data: this.data });
44
+ });
45
+ });
46
+ player.logger.hooks.log.tap(this.name, (severity, message) => {
47
+ this.logs = [...this.logs, { severity, message }];
48
+ this.dispatchDataUpdate({ logs: this.logs });
49
+ });
50
+ player.hooks.onStart.tap(this.name, (f) => {
51
+ this.flow = JSON.parse(JSON.stringify(f));
52
+ this.dispatchDataUpdate({ flow: this.flow });
53
+ });
54
+ player.hooks.view.tap(this.name, (view) => {
55
+ this.view = new WeakRef(view);
56
+ });
57
+ player.hooks.expressionEvaluator.tap(this.name, (evaluator) => {
58
+ this.expressionEvaluator = new WeakRef(evaluator);
59
+ });
60
+ this.overrideFlow = player.start.bind(player);
61
+ }
62
+ evaluateExpression(expression) {
63
+ const evaluator = this.expressionEvaluator?.deref();
64
+ if (!evaluator) {
65
+ return {
66
+ id: generateUUID(),
67
+ severity: "error",
68
+ result: "Expression evaluator not available",
69
+ expression
70
+ };
71
+ }
72
+ try {
73
+ evaluator.hooks.onError.intercept({
74
+ call: (error) => {
75
+ throw error;
76
+ }
77
+ });
78
+ const evaluatorResult = evaluator.evaluate(expression);
79
+ return {
80
+ id: generateUUID(),
81
+ result: evaluatorResult,
82
+ expression
83
+ };
84
+ } catch (error) {
85
+ const message = error instanceof Error ? error.message : String(error ?? "Something went wrong");
86
+ return {
87
+ id: generateUUID(),
88
+ severity: "error",
89
+ result: message,
90
+ expression
91
+ };
92
+ }
93
+ }
94
+ processInteraction(interaction) {
95
+ super.processInteraction(interaction);
96
+ const {
97
+ payload: { type, payload }
98
+ } = interaction;
99
+ if (type === INTERACTIONS.EVALUATE_EXPRESSION && this.expressionEvaluator && payload) {
100
+ const result = this.evaluateExpression(payload);
101
+ const current = this.store.getState()?.plugins?.[this.pluginID]?.flow?.data?.history || [];
102
+ this.dispatchDataUpdate({ history: [...current, result] });
103
+ return;
104
+ }
105
+ if (type === INTERACTIONS.OVERRIDE_FLOW && payload && this.overrideFlow) {
106
+ let newFlow;
107
+ try {
108
+ newFlow = JSON.parse(payload);
109
+ } catch (e) {
110
+ this.logger?.deref()?.error(this.name, "Error parsing new flow", e);
111
+ }
112
+ if (newFlow) {
113
+ this.overrideFlow(newFlow);
114
+ }
115
+ return;
116
+ }
117
+ }
118
+ };
119
+ export {
120
+ BasicDevtoolsPlugin
121
+ };
122
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/basic/core/src/plugin.ts"],"sourcesContent":["import {\n INTERACTIONS,\n BasicPluginData,\n} from \"@player-devtools/basic-plugin-content\";\nimport {\n DevtoolsPlugin,\n DevtoolsPluginOptions,\n generateUUID,\n} from \"@player-devtools/plugin\";\nimport type { DevtoolsPluginInteractionEvent } from \"@player-devtools/types\";\nimport { dsetAssign } from \"@player-devtools/utils\";\nimport type {\n DataController,\n ExpressionEvaluator,\n Flow,\n Player,\n ViewInstance,\n Logger,\n} from \"@player-ui/player\";\nimport { produce } from \"immer\";\n\nimport { Evaluation } from \"./types\";\n\n/** Taps into the Player and ReactPlayer hooks and leverage the WrapperComponent to define and process the content. */\nexport class BasicDevtoolsPlugin extends DevtoolsPlugin {\n constructor(options: Omit<DevtoolsPluginOptions, \"pluginData\">) {\n super({\n ...options,\n pluginData: BasicPluginData,\n });\n }\n\n name = \"BasicDevtoolsPlugin\";\n\n data: Record<string, unknown> = {};\n\n playerConfig: Record<string, unknown> = {};\n\n logs: {\n severity: string;\n message: unknown;\n }[] = [];\n\n flow?: Flow;\n\n logger?: WeakRef<Logger>;\n\n expressionEvaluator?: WeakRef<ExpressionEvaluator>;\n\n view?: WeakRef<ViewInstance>;\n\n dataController?: WeakRef<DataController>;\n\n overrideFlow?: Player[\"start\"];\n\n apply(player: Player): void {\n this.logger = new WeakRef(player.logger);\n\n if (!this.checkIfDevtoolsIsActive()) return;\n\n this.options.pluginData.flow.data!.playerConfig = {\n version: player.getVersion(),\n plugins: player.getPlugins().map((plugin) => plugin.name),\n };\n\n super.apply(player);\n\n // Config\n this.playerConfig = {\n version: player.getVersion(),\n plugins: player.getPlugins().map((plugin) => plugin.name),\n };\n\n this.dispatchDataUpdate({ playerConfig: this.playerConfig });\n\n // Data\n player.hooks.dataController.tap(this.name, (dataController) => {\n dataController.hooks.onUpdate.tap(this.name, (updates) => {\n this.data = produce(this.data, (draft) => {\n updates.forEach(({ binding, newValue }) => {\n dsetAssign(draft, [\"data\", ...binding.asArray()], newValue);\n });\n });\n\n this.dispatchDataUpdate({ data: this.data });\n });\n });\n\n player.logger.hooks.log.tap(this.name, (severity, message) => {\n this.logs = [...this.logs, { severity, message }];\n\n this.dispatchDataUpdate({ logs: this.logs });\n });\n\n // Flow\n player.hooks.onStart.tap(this.name, (f) => {\n this.flow = JSON.parse(JSON.stringify(f));\n\n this.dispatchDataUpdate({ flow: this.flow });\n });\n\n // View\n player.hooks.view.tap(this.name, (view) => {\n this.view = new WeakRef(view);\n });\n\n // Expression evaluator\n player.hooks.expressionEvaluator.tap(this.name, (evaluator) => {\n this.expressionEvaluator = new WeakRef(evaluator);\n });\n\n // Override flow\n this.overrideFlow = player.start.bind(player);\n }\n\n private evaluateExpression(expression: string): Evaluation {\n const evaluator = this.expressionEvaluator?.deref();\n\n if (!evaluator) {\n return {\n id: generateUUID(),\n severity: \"error\",\n result: \"Expression evaluator not available\",\n expression,\n };\n }\n\n try {\n evaluator.hooks.onError.intercept({\n call: (error: Error) => {\n throw error;\n },\n });\n\n const evaluatorResult = evaluator.evaluate(expression);\n\n return {\n id: generateUUID(),\n result: evaluatorResult,\n expression,\n };\n } catch (error) {\n const message =\n error instanceof Error\n ? error.message\n : String(error ?? \"Something went wrong\");\n return {\n id: generateUUID(),\n severity: \"error\",\n result: message,\n expression,\n };\n }\n }\n\n processInteraction(interaction: DevtoolsPluginInteractionEvent): void {\n // invokes mobile specific handlers\n super.processInteraction(interaction);\n\n const {\n payload: { type, payload },\n } = interaction;\n if (\n type === INTERACTIONS.EVALUATE_EXPRESSION &&\n this.expressionEvaluator &&\n payload\n ) {\n const result = this.evaluateExpression(payload);\n const current: Array<Evaluation> =\n (this.store.getState()?.plugins?.[this.pluginID]?.flow?.data\n ?.history as Array<Evaluation>) || [];\n\n this.dispatchDataUpdate({ history: [...current, result] });\n\n return;\n }\n\n if (type === INTERACTIONS.OVERRIDE_FLOW && payload && this.overrideFlow) {\n let newFlow: Flow | undefined;\n\n try {\n newFlow = JSON.parse(payload);\n } catch (e) {\n this.logger?.deref()?.error(this.name, \"Error parsing new flow\", e);\n }\n\n if (newFlow) {\n this.overrideFlow(newFlow);\n }\n\n return;\n }\n }\n}\n"],"mappings":"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","names":[]}
package/package.json ADDED
@@ -0,0 +1,39 @@
1
+ {
2
+ "sideEffects": false,
3
+ "files": [
4
+ "dist",
5
+ "src",
6
+ "types"
7
+ ],
8
+ "name": "@player-devtools/basic-plugin",
9
+ "version": "0.0.2-next.0",
10
+ "main": "dist/cjs/index.cjs",
11
+ "dependencies": {
12
+ "@player-devtools/basic-plugin-content": "0.0.2-next.0",
13
+ "@player-devtools/messenger": "0.0.2-next.0",
14
+ "@player-devtools/plugin": "0.0.2-next.0",
15
+ "@player-devtools/types": "0.0.2-next.0",
16
+ "@player-devtools/utils": "0.0.2-next.0",
17
+ "@devtools-ui/plugin": "0.4.0",
18
+ "@player-ui/player": "0.12.0-next.1",
19
+ "@types/react": "^18.2.51",
20
+ "@swc/core": "1.3.74",
21
+ "dequal": "^2.0.2",
22
+ "dset": "^3.1.3",
23
+ "immer": "^10.0.3",
24
+ "tslib": "^2.6.2"
25
+ },
26
+ "module": "dist/index.legacy-esm.js",
27
+ "types": "types/index.d.ts",
28
+ "bundle": "dist/BasicDevtoolsPlugin.native.js",
29
+ "exports": {
30
+ "./package.json": "./package.json",
31
+ "./dist/index.css": "./dist/index.css",
32
+ ".": {
33
+ "types": "./types/index.d.ts",
34
+ "import": "./dist/index.mjs",
35
+ "default": "./dist/cjs/index.cjs"
36
+ }
37
+ },
38
+ "peerDependencies": {}
39
+ }
@@ -0,0 +1,59 @@
1
+ import { describe } from "vitest";
2
+
3
+ describe("BasicDevtoolsPlugin", () => {
4
+ // TODO: Add tests for BasicDevtoolsPlugin
5
+ });
6
+
7
+ // describe("BasicWevDevtoolPlugins", () => {
8
+ // let plugin: BasicWebDevtoolsPlugin;
9
+ // let mockPlayer: Player;
10
+ //
11
+ // beforeEach(() => {
12
+ // plugin = new BasicWebDevtoolsPlugin("test-id");
13
+ // mockPlayer = {
14
+ // hooks: {
15
+ // dataController: {
16
+ // tap: vi.fn(),
17
+ // } as any,
18
+ // onStart: {
19
+ // tap: vi.fn(),
20
+ // } as any,
21
+ // view: {
22
+ // tap: vi.fn(),
23
+ // } as any,
24
+ // expressionEvaluator: {
25
+ // tap: vi.fn(),
26
+ // } as any,
27
+ // },
28
+ // logger: {
29
+ // hooks: {
30
+ // log: vi.fn(),
31
+ // },
32
+ // },
33
+ // } as unknown as Player;
34
+ // });
35
+ //
36
+ // it("should not apply if devtools are inactive", () => {
37
+ // Object.defineProperty(window, "localStorage", {
38
+ // value: {
39
+ // getItem: vi.fn(() => "false"),
40
+ // },
41
+ // writable: true,
42
+ // });
43
+ //
44
+ // const consoleSpy = vi.spyOn(console, "log");
45
+ // plugin.apply(mockPlayer);
46
+ // expect(consoleSpy).toHaveBeenCalledWith(PLUGIN_INACTIVE_WARNING);
47
+ // expect(plugin.playerConfig).toEqual({});
48
+ // });
49
+ //
50
+ // it("should initialize with default Values", () => {
51
+ // expect(plugin.name).toBe(PLUGIN_ID);
52
+ // expect(plugin.logs).toEqual([]);
53
+ // expect(plugin.data).toEqual({});
54
+ // expect(plugin.flow).toBeUndefined();
55
+ // expect(plugin.expressionEvaluator).toBeUndefined();
56
+ // expect(plugin.view).toBeUndefined();
57
+ // expect(plugin.dataController).toBeUndefined();
58
+ // });
59
+ // });
@@ -0,0 +1,114 @@
1
+ import { describe, it, expect, vi } from "vitest";
2
+ import { getEvaluateExpression } from "../getEvaluateExpression";
3
+ import type { Evaluation } from "../../types";
4
+
5
+ vi.mock("@player-devtools/plugin", () => ({
6
+ generateUUID: () => "test-uuid",
7
+ }));
8
+
9
+ const getMockExpressionEvaluator = (
10
+ evaluate: ReturnType<typeof vi.fn>,
11
+ throwError = false,
12
+ ): {
13
+ interceptor: Record<string, unknown>;
14
+ evaluate: (...args: unknown[]) => unknown;
15
+ hooks: {
16
+ onError: {
17
+ intercept: (args: Record<string, unknown>) => void;
18
+ };
19
+ };
20
+ } => {
21
+ class MockExpressionEvaluator {
22
+ interceptor: Record<string, unknown> = {};
23
+ evaluate(...args: unknown[]) {
24
+ if (throwError) {
25
+ throw new Error("Evaluation error");
26
+ }
27
+ return evaluate(...args);
28
+ }
29
+ hooks = {
30
+ onError: {
31
+ intercept: (args: Record<string, unknown>) => {
32
+ this.interceptor = args;
33
+ },
34
+ },
35
+ };
36
+ }
37
+ return new MockExpressionEvaluator();
38
+ };
39
+
40
+ describe("getEvaluateExpression", () => {
41
+ it("returns an error Evaluation if expressionEvaluator is not available", () => {
42
+ const evaluateExpression = getEvaluateExpression();
43
+ const expression = "1 + 1";
44
+ const expected: Evaluation = {
45
+ id: "test-uuid",
46
+ severity: "error",
47
+ result: "Expression evaluator not available",
48
+ expression,
49
+ };
50
+
51
+ const result = evaluateExpression(expression);
52
+
53
+ expect(result).toEqual(expected);
54
+ });
55
+
56
+ it("evaluates expressions correctly when evaluator is available", () => {
57
+ const mockEvaluate = vi.fn().mockReturnValue(2);
58
+ const mockExpressionEvaluator = getMockExpressionEvaluator(mockEvaluate);
59
+ const evaluateExpression = getEvaluateExpression(
60
+ new WeakRef(mockExpressionEvaluator),
61
+ );
62
+ const expression = "1 + 1";
63
+ const expected: Evaluation = {
64
+ id: "test-uuid",
65
+ result: 2,
66
+ expression,
67
+ };
68
+
69
+ const result = evaluateExpression(expression);
70
+
71
+ expect(result).toEqual(expected);
72
+ });
73
+
74
+ it("captures and returns an error if evaluation throws an error", () => {
75
+ const mockEvaluate = vi.fn();
76
+ const mockExpressionEvaluator = getMockExpressionEvaluator(
77
+ mockEvaluate,
78
+ true,
79
+ );
80
+ const evaluateExpression = getEvaluateExpression(
81
+ new WeakRef(mockExpressionEvaluator),
82
+ );
83
+ const expression = "invalid expression";
84
+ const expected: Evaluation = {
85
+ id: "test-uuid",
86
+ severity: "error",
87
+ result: "Evaluation error",
88
+ expression,
89
+ };
90
+
91
+ const result = evaluateExpression(expression);
92
+
93
+ expect(result).toEqual(expected);
94
+ });
95
+
96
+ it("handles errors triggered by onError hook", () => {
97
+ const mockEvaluate = vi.fn();
98
+ const mockExpressionEvaluator = getMockExpressionEvaluator(
99
+ mockEvaluate,
100
+ false,
101
+ );
102
+ const evaluateExpression = getEvaluateExpression(
103
+ new WeakRef(mockExpressionEvaluator),
104
+ );
105
+ const expression = "trigger hook error";
106
+
107
+ evaluateExpression(expression);
108
+
109
+ expect(() => {
110
+ mockExpressionEvaluator.interceptor.call(new Error("Hook error"));
111
+ evaluateExpression(expression);
112
+ }).toThrow("Hook error");
113
+ });
114
+ });