@player-tools/devtools-basic-web-plugin 0.5.3--canary.90.2515

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. package/dist/cjs/index.cjs +919 -0
  2. package/dist/cjs/index.cjs.map +1 -0
  3. package/dist/index.legacy-esm.js +884 -0
  4. package/dist/index.mjs +884 -0
  5. package/dist/index.mjs.map +1 -0
  6. package/package.json +41 -0
  7. package/src/WrapperComponent.tsx +169 -0
  8. package/src/constants/index.ts +27 -0
  9. package/src/content/common/Screen.tsx +35 -0
  10. package/src/content/common/index.ts +1 -0
  11. package/src/content/index.ts +18 -0
  12. package/src/content/navigation/index.ts +27 -0
  13. package/src/content/schema/index.ts +39 -0
  14. package/src/content/views/ConfigView.tsx +16 -0
  15. package/src/content/views/ConsoleView.tsx +20 -0
  16. package/src/content/views/FlowView.tsx +23 -0
  17. package/src/content/views/LogsView.tsx +9 -0
  18. package/src/content/views/index.ts +6 -0
  19. package/src/helpers/genDataChangeTransaction.ts +29 -0
  20. package/src/helpers/getEvaluateExpression.ts +50 -0
  21. package/src/helpers/index.ts +2 -0
  22. package/src/index.tsx +96 -0
  23. package/src/types.ts +35 -0
  24. package/types/WrapperComponent.d.ts +4 -0
  25. package/types/constants/index.d.ts +16 -0
  26. package/types/content/common/Screen.d.ts +7 -0
  27. package/types/content/common/index.d.ts +2 -0
  28. package/types/content/index.d.ts +33 -0
  29. package/types/content/navigation/index.d.ts +7 -0
  30. package/types/content/schema/index.d.ts +29 -0
  31. package/types/content/views/ConfigView.d.ts +3 -0
  32. package/types/content/views/ConsoleView.d.ts +3 -0
  33. package/types/content/views/FlowView.d.ts +3 -0
  34. package/types/content/views/LogsView.d.ts +3 -0
  35. package/types/content/views/index.d.ts +3 -0
  36. package/types/helpers/genDataChangeTransaction.d.ts +8 -0
  37. package/types/helpers/getEvaluateExpression.d.ts +4 -0
  38. package/types/helpers/index.d.ts +3 -0
  39. package/types/index.d.ts +18 -0
  40. package/types/types.d.ts +35 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/desktop/basic/src/index.tsx","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/desktop/basic/src/WrapperComponent.tsx","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/desktop/basic/src/constants/index.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/desktop/basic/src/helpers/getEvaluateExpression.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/desktop/basic/src/helpers/genDataChangeTransaction.ts","../../../../../../../../../../../../../execroot/_main/bazel-out/k8-fastbuild/bin/devtools/plugins/desktop/basic/_generated/index.json"],"sourcesContent":["import type {\n DataController,\n ExpressionEvaluator,\n Flow,\n Player,\n ReactPlayer,\n ReactPlayerPlugin,\n ViewInstance,\n} from \"@player-ui/react\";\nimport { dset } from \"dset/merge\";\nimport { produce } from \"immer\";\nimport React from \"react\";\nimport { WrapperComponent } from \"./WrapperComponent\";\n\n/** Basic Web Devtools Plugin */\nexport class BasicWevDevtoolsPlugin implements ReactPlayerPlugin {\n name = \"player_ui_basic_devtools_plugin\";\n\n data: Record<string, unknown> = {};\n\n playerConfig: Record<string, unknown> = {};\n\n logs: {\n severity: string;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n message: any;\n }[] = [];\n\n flow?: Flow;\n\n expressionEvaluator?: WeakRef<ExpressionEvaluator>;\n\n view?: WeakRef<ViewInstance>;\n\n dataController?: WeakRef<DataController>;\n\n apply(player: Player) {\n // Config\n this.playerConfig = {\n version: player.getVersion(),\n plugins: player.getPlugins().map((plugin) => plugin.name),\n };\n\n // Data\n player.hooks.dataController.tap(this.name, (dataController) => {\n dataController.hooks.onUpdate.tap(this.name, (updates) => {\n const newPlayerState = produce(this.data, (draft) => {\n updates.forEach(({ binding, newValue }) => {\n dset(draft, [\"data\", ...binding.asArray()], newValue);\n });\n });\n this.data = newPlayerState;\n });\n });\n\n // Logs\n player.logger.hooks.log.tap(this.name, (severity, message) => {\n this.logs = [...this.logs, { severity, message }];\n });\n\n // Flow\n player.hooks.onStart.tap(this.name, (f) => {\n this.flow = f;\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\n applyReact(reactPlayer: ReactPlayer) {\n // eslint-disable-next-line react/display-name\n reactPlayer.hooks.webComponent.tap(this.name, (Comp) => () => {\n const Component = Comp as React.FC;\n\n return (\n <WrapperComponent\n playerConfig={this.playerConfig}\n data={this.data}\n logs={this.logs}\n flow={this.flow}\n view={this.view}\n expressionEvaluator={this.expressionEvaluator}\n >\n <Component />\n </WrapperComponent>\n );\n });\n }\n}\n","import { usePluginState } from \"@player-tools/devtools-desktop-plugins-common\";\nimport type {\n DevtoolsPluginInteractionEvent,\n PlayerInitEvent,\n PluginData,\n Transaction,\n} from \"@player-tools/devtools-types\";\nimport type { Flow } from \"@player-ui/react\";\nimport { dequal } from \"dequal\";\nimport { dset } from \"dset/merge\";\nimport { produce } from \"immer\";\nimport React, { useCallback, useEffect } from \"react\";\nimport { BASE_PLUGIN_DATA, INTERACTIONS } from \"./constants\";\nimport type { Evaluation, WrapperComponentProps } from \"./types\";\nimport { genDataChangeTransaction, getEvaluateExpression } from \"./helpers\";\nimport flow from \"../_generated/index.json\";\n\nconst pluginData: PluginData = {\n ...BASE_PLUGIN_DATA,\n flow: flow as Flow,\n};\n\n/** Tap into the ReactPlayer hooks and create the content to be rendered into the extension Player UI */\nexport const WrapperComponent = ({\n children,\n data,\n playerConfig,\n logs,\n flow,\n expressionEvaluator,\n}: WrapperComponentProps): JSX.Element => {\n const [state, playerID, dispatch] = usePluginState();\n const lastProcessedInteraction = React.useRef(0);\n const expEvaluator = useCallback(getEvaluateExpression(expressionEvaluator), [\n expressionEvaluator,\n ]);\n\n const id = pluginData.id;\n\n const processInteraction = useCallback(\n (interaction: DevtoolsPluginInteractionEvent) => {\n const {\n payload: { type, payload },\n } = interaction;\n if (\n type === INTERACTIONS.EVALUATE_EXPRESSION &&\n expressionEvaluator &&\n payload\n ) {\n const result = expEvaluator(payload);\n\n const newState = produce(state, (draft) => {\n const current: Array<Evaluation> =\n (state?.plugins?.[id]?.flow?.data?.history as Array<Evaluation>) ||\n [];\n dset(\n draft,\n [\"plugins\", id, \"flow\", \"data\", \"history\"],\n [...current, result]\n );\n });\n\n dispatch({\n id: -1,\n type: \"PLAYER_DEVTOOLS_PLUGIN_DATA_CHANGE\",\n payload: {\n pluginID: id,\n data: newState.plugins[id].flow.data,\n },\n sender: playerID,\n context: \"player\",\n target: \"player\",\n timestamp: Date.now(),\n _messenger_: true,\n });\n\n lastProcessedInteraction.current += 1;\n }\n },\n [dispatch, expressionEvaluator, id, state]\n );\n\n // inject playerConfig into the plugin data\n const pluginDataWithPlayerConfig = produce(pluginData, (draft) => {\n dset(draft, [\"flow\", \"data\", \"playerConfig\"], playerConfig);\n });\n\n // Initial plugin content\n useEffect(() => {\n const transaction: Transaction<PlayerInitEvent> = {\n id: -1,\n type: \"PLAYER_DEVTOOLS_PLAYER_INIT\",\n payload: {\n plugins: {\n [id]: pluginDataWithPlayerConfig,\n },\n },\n sender: playerID,\n context: \"player\",\n target: \"player\",\n timestamp: Date.now(),\n _messenger_: true,\n };\n\n dispatch(transaction);\n }, []);\n\n // Process interactions\n useEffect(() => {\n if (lastProcessedInteraction.current < (state.interactions.length ?? 0)) {\n state.interactions\n .slice(lastProcessedInteraction.current)\n .forEach(processInteraction);\n }\n }, [state.interactions.length]);\n\n // Data changes\n useEffect(() => {\n if (dequal(state.plugins[id]?.flow?.data?.data, data)) return;\n\n const newState = produce(state, (draft) => {\n dset(draft, [\"plugins\", id, \"flow\", \"data\", \"data\"], data);\n });\n\n const transaction = genDataChangeTransaction({\n playerID,\n data: newState.plugins[id].flow.data,\n pluginID: id,\n });\n\n dispatch(transaction);\n }, [data]);\n\n // Logs changes\n useEffect(() => {\n if (dequal(state.plugins[id]?.flow?.data?.logs, logs)) return;\n\n const newState = produce(state, (draft) => {\n dset(draft, [\"plugins\", id, \"flow\", \"data\", \"logs\"], logs);\n });\n\n const transaction = genDataChangeTransaction({\n playerID,\n data: newState.plugins[id].flow.data,\n pluginID: id,\n });\n\n dispatch(transaction);\n }, [logs]);\n\n // Flow changes\n useEffect(() => {\n if (dequal(state.plugins[id]?.flow?.data?.flow, flow)) return;\n\n const newState = produce(state, (draft) => {\n dset(draft, [\"plugins\", id, \"flow\", \"data\", \"flow\"], flow);\n });\n\n const transaction = genDataChangeTransaction({\n playerID,\n data: newState.plugins[id].flow.data,\n pluginID: id,\n });\n\n dispatch(transaction);\n }, [flow]);\n\n return children as JSX.Element;\n};\n","import type { PluginData } from \"@player-tools/devtools-types\";\n\nexport const PLUGIN_ID = \"player-ui-basic-devtools-plugin\";\n\nexport const PLUGIN_NAME = \"Standard Devtools\";\n\nexport const PLUGIN_DESCRIPTION = \"Standard Player UI Devtools\";\n\nexport const PLUGIN_VERSION = \"0.0.1\";\n\nexport const VIEWS_IDS = {\n CONFIG: \"Config\",\n FLOW: \"Flow\",\n LOGS: \"Logs\",\n CONSOLE: \"Console\",\n};\n\nexport const INTERACTIONS = {\n EVALUATE_EXPRESSION: \"evaluate-expression\",\n};\n\nexport const BASE_PLUGIN_DATA: Omit<PluginData, \"flow\"> = {\n id: PLUGIN_ID,\n name: PLUGIN_NAME,\n description: PLUGIN_DESCRIPTION,\n version: PLUGIN_VERSION,\n};\n","import { ExpressionEvaluator } from \"@player-ui/react\";\nimport { v4 as uuid } from \"uuid\";\nimport { Evaluation } from \"../types\";\n\nexport const getEvaluateExpression =\n (expressionEvaluator?: WeakRef<ExpressionEvaluator>) =>\n (expression: string): Evaluation => {\n if (!expressionEvaluator) {\n return {\n id: uuid(),\n severity: \"error\",\n result: \"Expression evaluator not available\",\n expression,\n };\n }\n\n let result: Evaluation = {\n id: uuid(),\n severity: \"error\",\n result: \"Something went wrong\",\n expression,\n };\n\n try {\n expressionEvaluator.deref()?.hooks.onError.intercept({\n call: (error: Error) => {\n throw error;\n },\n });\n\n const evaluatorResult = expressionEvaluator.deref()?.evaluate(expression);\n\n result = {\n id: uuid(),\n result: evaluatorResult,\n expression,\n };\n } catch (error) {\n if (error instanceof Error) {\n result = {\n id: uuid(),\n severity: \"error\",\n result: error.message,\n expression,\n };\n }\n }\n\n return result;\n };\n","import type {\n DevtoolsDataChangeEvent,\n Transaction,\n} from \"@player-tools/devtools-types\";\nimport type { Flow } from \"@player-ui/react\";\n\nexport const genDataChangeTransaction = ({\n playerID,\n data,\n pluginID,\n}: {\n playerID: string;\n data: Flow[\"data\"];\n pluginID: string;\n}): Transaction<DevtoolsDataChangeEvent> => {\n return {\n id: -1,\n type: \"PLAYER_DEVTOOLS_PLUGIN_DATA_CHANGE\",\n payload: {\n pluginID,\n data,\n },\n sender: playerID,\n context: \"player\",\n target: \"player\",\n timestamp: Date.now(),\n _messenger_: true,\n };\n};\n","{\n \"id\": \"player-ui-basic-devtools-plugin\",\n \"views\": [\n {\n \"id\": \"Config\",\n \"type\": \"stacked-view\",\n \"header\": {\n \"asset\": {\n \"id\": \"Config-header\",\n \"type\": \"navigation\",\n \"values\": [\n {\n \"asset\": {\n \"id\": \"Config-header-values-0\",\n \"type\": \"action\",\n \"value\": \"Config\",\n \"label\": {\n \"asset\": {\n \"id\": \"Config-header-values-0-label\",\n \"type\": \"text\",\n \"value\": \"Config\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Config-header-values-1\",\n \"type\": \"action\",\n \"value\": \"Flow\",\n \"label\": {\n \"asset\": {\n \"id\": \"Config-header-values-1-label\",\n \"type\": \"text\",\n \"value\": \"Flow\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Config-header-values-2\",\n \"type\": \"action\",\n \"value\": \"Logs\",\n \"label\": {\n \"asset\": {\n \"id\": \"Config-header-values-2-label\",\n \"type\": \"text\",\n \"value\": \"Logs\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Config-header-values-3\",\n \"type\": \"action\",\n \"value\": \"Console\",\n \"label\": {\n \"asset\": {\n \"id\": \"Config-header-values-3-label\",\n \"type\": \"text\",\n \"value\": \"Console\"\n }\n }\n }\n }\n ]\n }\n },\n \"main\": {\n \"asset\": {\n \"id\": \"Config-main\",\n \"type\": \"object-inspector\",\n \"binding\": \"playerConfig\",\n \"label\": {\n \"asset\": {\n \"id\": \"Config-main-label\",\n \"type\": \"text\",\n \"value\": \"Config\"\n }\n }\n }\n }\n },\n {\n \"id\": \"Flow\",\n \"type\": \"stacked-view\",\n \"header\": {\n \"asset\": {\n \"id\": \"Flow-header\",\n \"type\": \"navigation\",\n \"values\": [\n {\n \"asset\": {\n \"id\": \"Flow-header-values-0\",\n \"type\": \"action\",\n \"value\": \"Config\",\n \"label\": {\n \"asset\": {\n \"id\": \"Flow-header-values-0-label\",\n \"type\": \"text\",\n \"value\": \"Config\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Flow-header-values-1\",\n \"type\": \"action\",\n \"value\": \"Flow\",\n \"label\": {\n \"asset\": {\n \"id\": \"Flow-header-values-1-label\",\n \"type\": \"text\",\n \"value\": \"Flow\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Flow-header-values-2\",\n \"type\": \"action\",\n \"value\": \"Logs\",\n \"label\": {\n \"asset\": {\n \"id\": \"Flow-header-values-2-label\",\n \"type\": \"text\",\n \"value\": \"Logs\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Flow-header-values-3\",\n \"type\": \"action\",\n \"value\": \"Console\",\n \"label\": {\n \"asset\": {\n \"id\": \"Flow-header-values-3-label\",\n \"type\": \"text\",\n \"value\": \"Console\"\n }\n }\n }\n }\n ]\n }\n },\n \"main\": {\n \"asset\": {\n \"id\": \"Flow-main\",\n \"type\": \"object-inspector\",\n \"binding\": \"flow\",\n \"label\": {\n \"asset\": {\n \"id\": \"Flow-main-label\",\n \"type\": \"text\",\n \"value\": \"Flow\"\n }\n }\n }\n },\n \"footer\": {\n \"asset\": {\n \"id\": \"Flow-footer\",\n \"type\": \"copy-to-clipboard\",\n \"binding\": \"flow\",\n \"label\": {\n \"asset\": {\n \"id\": \"Flow-footer-label\",\n \"type\": \"text\",\n \"value\": \"Copy flow to the clipboard\"\n }\n }\n }\n }\n },\n {\n \"id\": \"Logs\",\n \"type\": \"stacked-view\",\n \"header\": {\n \"asset\": {\n \"id\": \"Logs-header\",\n \"type\": \"navigation\",\n \"values\": [\n {\n \"asset\": {\n \"id\": \"Logs-header-values-0\",\n \"type\": \"action\",\n \"value\": \"Config\",\n \"label\": {\n \"asset\": {\n \"id\": \"Logs-header-values-0-label\",\n \"type\": \"text\",\n \"value\": \"Config\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Logs-header-values-1\",\n \"type\": \"action\",\n \"value\": \"Flow\",\n \"label\": {\n \"asset\": {\n \"id\": \"Logs-header-values-1-label\",\n \"type\": \"text\",\n \"value\": \"Flow\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Logs-header-values-2\",\n \"type\": \"action\",\n \"value\": \"Logs\",\n \"label\": {\n \"asset\": {\n \"id\": \"Logs-header-values-2-label\",\n \"type\": \"text\",\n \"value\": \"Logs\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Logs-header-values-3\",\n \"type\": \"action\",\n \"value\": \"Console\",\n \"label\": {\n \"asset\": {\n \"id\": \"Logs-header-values-3-label\",\n \"type\": \"text\",\n \"value\": \"Console\"\n }\n }\n }\n }\n ]\n }\n },\n \"main\": {\n \"asset\": {\n \"id\": \"Logs-main\",\n \"type\": \"table\",\n \"binding\": \"logs\"\n }\n }\n },\n {\n \"id\": \"Console\",\n \"type\": \"stacked-view\",\n \"header\": {\n \"asset\": {\n \"id\": \"Console-header\",\n \"type\": \"navigation\",\n \"values\": [\n {\n \"asset\": {\n \"id\": \"Console-header-values-0\",\n \"type\": \"action\",\n \"value\": \"Config\",\n \"label\": {\n \"asset\": {\n \"id\": \"Console-header-values-0-label\",\n \"type\": \"text\",\n \"value\": \"Config\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Console-header-values-1\",\n \"type\": \"action\",\n \"value\": \"Flow\",\n \"label\": {\n \"asset\": {\n \"id\": \"Console-header-values-1-label\",\n \"type\": \"text\",\n \"value\": \"Flow\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Console-header-values-2\",\n \"type\": \"action\",\n \"value\": \"Logs\",\n \"label\": {\n \"asset\": {\n \"id\": \"Console-header-values-2-label\",\n \"type\": \"text\",\n \"value\": \"Logs\"\n }\n }\n }\n },\n {\n \"asset\": {\n \"id\": \"Console-header-values-3\",\n \"type\": \"action\",\n \"value\": \"Console\",\n \"label\": {\n \"asset\": {\n \"id\": \"Console-header-values-3-label\",\n \"type\": \"text\",\n \"value\": \"Console\"\n }\n }\n }\n }\n ]\n }\n },\n \"main\": {\n \"asset\": {\n \"id\": \"Console-main\",\n \"type\": \"console\",\n \"exp\": \" publish('evaluate-expression', {{expression}}) \",\n \"binding\": \"history\"\n }\n }\n }\n ],\n \"navigation\": {\n \"BEGIN\": \"Plugin\",\n \"Plugin\": {\n \"startState\": \"CONFIG\",\n \"CONFIG\": {\n \"state_type\": \"VIEW\",\n \"ref\": \"Config\",\n \"transitions\": {\n \"Config\": \"CONFIG\",\n \"Flow\": \"FLOW\",\n \"Logs\": \"LOGS\",\n \"Console\": \"CONSOLE\"\n }\n },\n \"FLOW\": {\n \"state_type\": \"VIEW\",\n \"ref\": \"Flow\",\n \"transitions\": {\n \"Config\": \"CONFIG\",\n \"Flow\": \"FLOW\",\n \"Logs\": \"LOGS\",\n \"Console\": \"CONSOLE\"\n }\n },\n \"LOGS\": {\n \"state_type\": \"VIEW\",\n \"ref\": \"Logs\",\n \"transitions\": {\n \"Config\": \"CONFIG\",\n \"Flow\": \"FLOW\",\n \"Logs\": \"LOGS\",\n \"Console\": \"CONSOLE\"\n }\n },\n \"CONSOLE\": {\n \"state_type\": \"VIEW\",\n \"ref\": \"Console\",\n \"transitions\": {\n \"Config\": \"CONFIG\",\n \"Flow\": \"FLOW\",\n \"Logs\": \"LOGS\",\n \"Console\": \"CONSOLE\"\n }\n }\n }\n },\n \"schema\": {\n \"ROOT\": {\n \"playerConfig\": {\n \"type\": \"RecordType\"\n },\n \"flow\": {\n \"type\": \"RecordType\"\n },\n \"expression\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"history\": {\n \"type\": \"historyType\",\n \"isArray\": true\n },\n \"logs\": {\n \"type\": \"logsType\",\n \"isArray\": true\n }\n },\n \"logsType\": {\n \"id\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"time\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"type\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"message\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"severity\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"binding\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"from\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"to\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"state\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"error\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"outcome\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"metricType\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n }\n },\n \"historyType\": {\n \"id\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"expression\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"result\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n },\n \"severity\": {\n \"type\": \"StringType\",\n \"default\": \"\",\n \"validation\": [\n {\n \"type\": \"string\"\n }\n ],\n \"format\": {\n \"type\": \"string\"\n }\n }\n }\n },\n \"data\": {\n \"expression\": \"\",\n \"flow\": {},\n \"history\": [],\n \"logs\": [],\n \"playerConfig\": {}\n }\n}"],"mappings":"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","names":["dset","produce","React","produce","dset","React"]}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@player-tools/devtools-basic-web-plugin",
3
+ "version": "0.5.3--canary.90.2515",
4
+ "main": "dist/cjs/index.cjs",
5
+ "dependencies": {
6
+ "@player-tools/devtools-types": "0.5.3--canary.90.2515",
7
+ "@player-tools/devtools-desktop-plugins-common": "0.5.3--canary.90.2515",
8
+ "@player-tools/dsl": "0.5.3--canary.90.2515",
9
+ "@player-tools/cli": "0.5.3--canary.90.2515",
10
+ "@player-ui/common-types-plugin": "0.7.2-next.4",
11
+ "@player-ui/react": "0.7.2-next.4",
12
+ "@devtools-ui/plugin": "0.0.2--canary.15.697",
13
+ "@player-ui/types": "0.7.2-next.4",
14
+ "@types/react": "^18.2.51",
15
+ "react": "^18.2.0",
16
+ "immer": "^10.0.3",
17
+ "uuid": "^8.3.2",
18
+ "@types/uuid": "^8.3.4",
19
+ "dset": "^3.1.3",
20
+ "dequal": "^2.0.2",
21
+ "tslib": "^2.6.2"
22
+ },
23
+ "module": "dist/index.legacy-esm.js",
24
+ "types": "types/index.d.ts",
25
+ "sideEffects": false,
26
+ "exports": {
27
+ "./package.json": "./package.json",
28
+ "./dist/index.css": "./dist/index.css",
29
+ ".": {
30
+ "types": "./types/index.d.ts",
31
+ "import": "./dist/index.mjs",
32
+ "default": "./dist/cjs/index.cjs"
33
+ }
34
+ },
35
+ "files": [
36
+ "dist",
37
+ "src",
38
+ "types"
39
+ ],
40
+ "peerDependencies": {}
41
+ }
@@ -0,0 +1,169 @@
1
+ import { usePluginState } from "@player-tools/devtools-desktop-plugins-common";
2
+ import type {
3
+ DevtoolsPluginInteractionEvent,
4
+ PlayerInitEvent,
5
+ PluginData,
6
+ Transaction,
7
+ } from "@player-tools/devtools-types";
8
+ import type { Flow } from "@player-ui/react";
9
+ import { dequal } from "dequal";
10
+ import { dset } from "dset/merge";
11
+ import { produce } from "immer";
12
+ import React, { useCallback, useEffect } from "react";
13
+ import { BASE_PLUGIN_DATA, INTERACTIONS } from "./constants";
14
+ import type { Evaluation, WrapperComponentProps } from "./types";
15
+ import { genDataChangeTransaction, getEvaluateExpression } from "./helpers";
16
+ import flow from "../_generated/index.json";
17
+
18
+ const pluginData: PluginData = {
19
+ ...BASE_PLUGIN_DATA,
20
+ flow: flow as Flow,
21
+ };
22
+
23
+ /** Tap into the ReactPlayer hooks and create the content to be rendered into the extension Player UI */
24
+ export const WrapperComponent = ({
25
+ children,
26
+ data,
27
+ playerConfig,
28
+ logs,
29
+ flow,
30
+ expressionEvaluator,
31
+ }: WrapperComponentProps): JSX.Element => {
32
+ const [state, playerID, dispatch] = usePluginState();
33
+ const lastProcessedInteraction = React.useRef(0);
34
+ const expEvaluator = useCallback(getEvaluateExpression(expressionEvaluator), [
35
+ expressionEvaluator,
36
+ ]);
37
+
38
+ const id = pluginData.id;
39
+
40
+ const processInteraction = useCallback(
41
+ (interaction: DevtoolsPluginInteractionEvent) => {
42
+ const {
43
+ payload: { type, payload },
44
+ } = interaction;
45
+ if (
46
+ type === INTERACTIONS.EVALUATE_EXPRESSION &&
47
+ expressionEvaluator &&
48
+ payload
49
+ ) {
50
+ const result = expEvaluator(payload);
51
+
52
+ const newState = produce(state, (draft) => {
53
+ const current: Array<Evaluation> =
54
+ (state?.plugins?.[id]?.flow?.data?.history as Array<Evaluation>) ||
55
+ [];
56
+ dset(
57
+ draft,
58
+ ["plugins", id, "flow", "data", "history"],
59
+ [...current, result]
60
+ );
61
+ });
62
+
63
+ dispatch({
64
+ id: -1,
65
+ type: "PLAYER_DEVTOOLS_PLUGIN_DATA_CHANGE",
66
+ payload: {
67
+ pluginID: id,
68
+ data: newState.plugins[id].flow.data,
69
+ },
70
+ sender: playerID,
71
+ context: "player",
72
+ target: "player",
73
+ timestamp: Date.now(),
74
+ _messenger_: true,
75
+ });
76
+
77
+ lastProcessedInteraction.current += 1;
78
+ }
79
+ },
80
+ [dispatch, expressionEvaluator, id, state]
81
+ );
82
+
83
+ // inject playerConfig into the plugin data
84
+ const pluginDataWithPlayerConfig = produce(pluginData, (draft) => {
85
+ dset(draft, ["flow", "data", "playerConfig"], playerConfig);
86
+ });
87
+
88
+ // Initial plugin content
89
+ useEffect(() => {
90
+ const transaction: Transaction<PlayerInitEvent> = {
91
+ id: -1,
92
+ type: "PLAYER_DEVTOOLS_PLAYER_INIT",
93
+ payload: {
94
+ plugins: {
95
+ [id]: pluginDataWithPlayerConfig,
96
+ },
97
+ },
98
+ sender: playerID,
99
+ context: "player",
100
+ target: "player",
101
+ timestamp: Date.now(),
102
+ _messenger_: true,
103
+ };
104
+
105
+ dispatch(transaction);
106
+ }, []);
107
+
108
+ // Process interactions
109
+ useEffect(() => {
110
+ if (lastProcessedInteraction.current < (state.interactions.length ?? 0)) {
111
+ state.interactions
112
+ .slice(lastProcessedInteraction.current)
113
+ .forEach(processInteraction);
114
+ }
115
+ }, [state.interactions.length]);
116
+
117
+ // Data changes
118
+ useEffect(() => {
119
+ if (dequal(state.plugins[id]?.flow?.data?.data, data)) return;
120
+
121
+ const newState = produce(state, (draft) => {
122
+ dset(draft, ["plugins", id, "flow", "data", "data"], data);
123
+ });
124
+
125
+ const transaction = genDataChangeTransaction({
126
+ playerID,
127
+ data: newState.plugins[id].flow.data,
128
+ pluginID: id,
129
+ });
130
+
131
+ dispatch(transaction);
132
+ }, [data]);
133
+
134
+ // Logs changes
135
+ useEffect(() => {
136
+ if (dequal(state.plugins[id]?.flow?.data?.logs, logs)) return;
137
+
138
+ const newState = produce(state, (draft) => {
139
+ dset(draft, ["plugins", id, "flow", "data", "logs"], logs);
140
+ });
141
+
142
+ const transaction = genDataChangeTransaction({
143
+ playerID,
144
+ data: newState.plugins[id].flow.data,
145
+ pluginID: id,
146
+ });
147
+
148
+ dispatch(transaction);
149
+ }, [logs]);
150
+
151
+ // Flow changes
152
+ useEffect(() => {
153
+ if (dequal(state.plugins[id]?.flow?.data?.flow, flow)) return;
154
+
155
+ const newState = produce(state, (draft) => {
156
+ dset(draft, ["plugins", id, "flow", "data", "flow"], flow);
157
+ });
158
+
159
+ const transaction = genDataChangeTransaction({
160
+ playerID,
161
+ data: newState.plugins[id].flow.data,
162
+ pluginID: id,
163
+ });
164
+
165
+ dispatch(transaction);
166
+ }, [flow]);
167
+
168
+ return children as JSX.Element;
169
+ };
@@ -0,0 +1,27 @@
1
+ import type { PluginData } from "@player-tools/devtools-types";
2
+
3
+ export const PLUGIN_ID = "player-ui-basic-devtools-plugin";
4
+
5
+ export const PLUGIN_NAME = "Standard Devtools";
6
+
7
+ export const PLUGIN_DESCRIPTION = "Standard Player UI Devtools";
8
+
9
+ export const PLUGIN_VERSION = "0.0.1";
10
+
11
+ export const VIEWS_IDS = {
12
+ CONFIG: "Config",
13
+ FLOW: "Flow",
14
+ LOGS: "Logs",
15
+ CONSOLE: "Console",
16
+ };
17
+
18
+ export const INTERACTIONS = {
19
+ EVALUATE_EXPRESSION: "evaluate-expression",
20
+ };
21
+
22
+ export const BASE_PLUGIN_DATA: Omit<PluginData, "flow"> = {
23
+ id: PLUGIN_ID,
24
+ name: PLUGIN_NAME,
25
+ description: PLUGIN_DESCRIPTION,
26
+ version: PLUGIN_VERSION,
27
+ };
@@ -0,0 +1,35 @@
1
+ import React from "react";
2
+ import { Navigation, Action, Text, StackedView } from "@devtools-ui/plugin";
3
+ import { VIEWS_IDS } from "../../constants";
4
+
5
+ const Nav = () => (
6
+ <Navigation>
7
+ <Navigation.Values>
8
+ {Object.values(VIEWS_IDS).map((viewId) => (
9
+ <Action key={viewId} value={viewId}>
10
+ <Action.Label>
11
+ <Text>{viewId}</Text>
12
+ </Action.Label>
13
+ </Action>
14
+ ))}
15
+ </Navigation.Values>
16
+ </Navigation>
17
+ );
18
+
19
+ export const Screen = ({
20
+ main,
21
+ footer,
22
+ id,
23
+ }: {
24
+ id: string;
25
+ main: React.ReactNode;
26
+ footer?: React.ReactNode;
27
+ }) => (
28
+ <StackedView id={id}>
29
+ <StackedView.Header>
30
+ <Nav />
31
+ </StackedView.Header>
32
+ <StackedView.Main>{main}</StackedView.Main>
33
+ {footer && <StackedView.Footer>{footer}</StackedView.Footer>}
34
+ </StackedView>
35
+ );
@@ -0,0 +1 @@
1
+ export * from "./Screen";
@@ -0,0 +1,18 @@
1
+ import { PLUGIN_ID } from "../constants";
2
+ import { navigation } from "./navigation";
3
+ import { schema } from "./schema";
4
+ import { views } from "./views";
5
+
6
+ export default {
7
+ id: PLUGIN_ID,
8
+ views,
9
+ navigation,
10
+ schema,
11
+ data: {
12
+ expression: "",
13
+ flow: {},
14
+ history: [],
15
+ logs: [],
16
+ playerConfig: {},
17
+ },
18
+ };
@@ -0,0 +1,27 @@
1
+ import { VIEWS_IDS } from "../../constants";
2
+
3
+ const transitions = Object.entries(VIEWS_IDS).reduce(
4
+ (acc, [key, value]) => ({
5
+ ...acc,
6
+ [value]: key,
7
+ }),
8
+ {} as Record<string, string>
9
+ );
10
+
11
+ export const navigation = {
12
+ BEGIN: "Plugin",
13
+ Plugin: {
14
+ startState: Object.keys(VIEWS_IDS)[0],
15
+ ...Object.entries(VIEWS_IDS).reduce(
16
+ (acc, [key, value]) => ({
17
+ ...acc,
18
+ [key]: {
19
+ state_type: "VIEW",
20
+ ref: value,
21
+ transitions,
22
+ },
23
+ }),
24
+ {} as Record<string, unknown>
25
+ ),
26
+ },
27
+ };
@@ -0,0 +1,39 @@
1
+ import { dataTypes } from "@player-ui/common-types-plugin";
2
+ import type { Schema } from "@player-ui/types";
3
+ import { DSLSchema, makeBindingsForObject } from "@player-tools/dsl";
4
+
5
+ const RecordType: Schema.DataType<Record<string, unknown>> = {
6
+ type: "RecordType",
7
+ };
8
+
9
+ export const schema = {
10
+ playerConfig: RecordType,
11
+ flow: RecordType,
12
+ expression: dataTypes.StringType,
13
+ history: [
14
+ {
15
+ id: dataTypes.StringType,
16
+ expression: dataTypes.StringType,
17
+ result: dataTypes.StringType,
18
+ severity: dataTypes.StringType,
19
+ },
20
+ ] as [DSLSchema],
21
+ logs: [
22
+ {
23
+ id: dataTypes.StringType,
24
+ time: dataTypes.StringType,
25
+ type: dataTypes.StringType,
26
+ message: dataTypes.StringType,
27
+ severity: dataTypes.StringType,
28
+ binding: dataTypes.StringType,
29
+ from: dataTypes.StringType,
30
+ to: dataTypes.StringType,
31
+ state: dataTypes.StringType,
32
+ error: dataTypes.StringType,
33
+ outcome: dataTypes.StringType,
34
+ metricType: dataTypes.StringType,
35
+ },
36
+ ] as [DSLSchema],
37
+ };
38
+
39
+ export const bindings = makeBindingsForObject(schema);
@@ -0,0 +1,16 @@
1
+ import React from "react";
2
+ import { ObjectInspector } from "@devtools-ui/plugin";
3
+ import { VIEWS_IDS } from "../../constants";
4
+ import { bindings } from "../schema";
5
+ import { Screen } from "../common";
6
+
7
+ export const ConfigView = (
8
+ <Screen
9
+ id={VIEWS_IDS.CONFIG}
10
+ main={
11
+ <ObjectInspector binding={bindings.playerConfig as any}>
12
+ <ObjectInspector.Label>Config</ObjectInspector.Label>
13
+ </ObjectInspector>
14
+ }
15
+ />
16
+ );
@@ -0,0 +1,20 @@
1
+ import { expression as e } from "@player-tools/dsl";
2
+ import { Console } from "@devtools-ui/plugin";
3
+ import React from "react";
4
+ import { VIEWS_IDS, INTERACTIONS } from "../../constants";
5
+ import { Screen } from "../common";
6
+ import { bindings } from "../schema";
7
+
8
+ const evaluateExpression = e` publish('${INTERACTIONS.EVALUATE_EXPRESSION}', ${bindings.expression}) `;
9
+
10
+ export const ConsoleView = (
11
+ <Screen
12
+ id={VIEWS_IDS.CONSOLE}
13
+ main={
14
+ <Console
15
+ exp={evaluateExpression as any}
16
+ binding={bindings.history as any}
17
+ />
18
+ }
19
+ />
20
+ );
@@ -0,0 +1,23 @@
1
+ import React from "react";
2
+ import { ObjectInspector, CopyToClipboard } from "@devtools-ui/plugin";
3
+ import { VIEWS_IDS } from "../../constants";
4
+ import { Screen } from "../common";
5
+ import { bindings } from "../schema";
6
+
7
+ export const FlowView = (
8
+ <Screen
9
+ id={VIEWS_IDS.FLOW}
10
+ main={
11
+ <ObjectInspector binding={bindings.flow as any}>
12
+ <ObjectInspector.Label>Flow</ObjectInspector.Label>
13
+ </ObjectInspector>
14
+ }
15
+ footer={
16
+ <CopyToClipboard binding={bindings.flow as any}>
17
+ <CopyToClipboard.Label>
18
+ Copy flow to the clipboard
19
+ </CopyToClipboard.Label>
20
+ </CopyToClipboard>
21
+ }
22
+ />
23
+ );
@@ -0,0 +1,9 @@
1
+ import React from "react";
2
+ import { Table } from "@devtools-ui/plugin";
3
+ import { VIEWS_IDS } from "../../constants";
4
+ import { Screen } from "../common";
5
+ import { bindings } from "../schema";
6
+
7
+ export const LogsView = (
8
+ <Screen id={VIEWS_IDS.LOGS} main={<Table binding={bindings.logs as any} />} />
9
+ );
@@ -0,0 +1,6 @@
1
+ import { ConfigView } from "./ConfigView";
2
+ import { ConsoleView } from "./ConsoleView";
3
+ import { FlowView } from "./FlowView";
4
+ import { LogsView } from "./LogsView";
5
+
6
+ export const views = [ConfigView, FlowView, LogsView, ConsoleView];
@@ -0,0 +1,29 @@
1
+ import type {
2
+ DevtoolsDataChangeEvent,
3
+ Transaction,
4
+ } from "@player-tools/devtools-types";
5
+ import type { Flow } from "@player-ui/react";
6
+
7
+ export const genDataChangeTransaction = ({
8
+ playerID,
9
+ data,
10
+ pluginID,
11
+ }: {
12
+ playerID: string;
13
+ data: Flow["data"];
14
+ pluginID: string;
15
+ }): Transaction<DevtoolsDataChangeEvent> => {
16
+ return {
17
+ id: -1,
18
+ type: "PLAYER_DEVTOOLS_PLUGIN_DATA_CHANGE",
19
+ payload: {
20
+ pluginID,
21
+ data,
22
+ },
23
+ sender: playerID,
24
+ context: "player",
25
+ target: "player",
26
+ timestamp: Date.now(),
27
+ _messenger_: true,
28
+ };
29
+ };
@@ -0,0 +1,50 @@
1
+ import { ExpressionEvaluator } from "@player-ui/react";
2
+ import { v4 as uuid } from "uuid";
3
+ import { Evaluation } from "../types";
4
+
5
+ export const getEvaluateExpression =
6
+ (expressionEvaluator?: WeakRef<ExpressionEvaluator>) =>
7
+ (expression: string): Evaluation => {
8
+ if (!expressionEvaluator) {
9
+ return {
10
+ id: uuid(),
11
+ severity: "error",
12
+ result: "Expression evaluator not available",
13
+ expression,
14
+ };
15
+ }
16
+
17
+ let result: Evaluation = {
18
+ id: uuid(),
19
+ severity: "error",
20
+ result: "Something went wrong",
21
+ expression,
22
+ };
23
+
24
+ try {
25
+ expressionEvaluator.deref()?.hooks.onError.intercept({
26
+ call: (error: Error) => {
27
+ throw error;
28
+ },
29
+ });
30
+
31
+ const evaluatorResult = expressionEvaluator.deref()?.evaluate(expression);
32
+
33
+ result = {
34
+ id: uuid(),
35
+ result: evaluatorResult,
36
+ expression,
37
+ };
38
+ } catch (error) {
39
+ if (error instanceof Error) {
40
+ result = {
41
+ id: uuid(),
42
+ severity: "error",
43
+ result: error.message,
44
+ expression,
45
+ };
46
+ }
47
+ }
48
+
49
+ return result;
50
+ };
@@ -0,0 +1,2 @@
1
+ export { getEvaluateExpression } from "./getEvaluateExpression";
2
+ export { genDataChangeTransaction } from "./genDataChangeTransaction";