@quenty/studio-bridge 0.21.1 → 0.22.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/CHANGELOG.md +6 -0
- package/README.md +109 -17
- package/build-scripts/transform-add-session-attribute.lua +1 -0
- package/deploy.nevermore.json +10 -0
- package/dist/src/bridge/bridge-connection.d.ts +26 -2
- package/dist/src/bridge/bridge-connection.d.ts.map +1 -1
- package/dist/src/bridge/bridge-connection.js +159 -14
- package/dist/src/bridge/bridge-connection.js.map +1 -1
- package/dist/src/bridge/bridge-connection.test.js +81 -0
- package/dist/src/bridge/bridge-connection.test.js.map +1 -1
- package/dist/src/bridge/bridge-session.d.ts +35 -2
- package/dist/src/bridge/bridge-session.d.ts.map +1 -1
- package/dist/src/bridge/bridge-session.js +185 -28
- package/dist/src/bridge/bridge-session.js.map +1 -1
- package/dist/src/bridge/bridge-session.test.js +6 -4
- package/dist/src/bridge/bridge-session.test.js.map +1 -1
- package/dist/src/bridge/index.d.ts +1 -1
- package/dist/src/bridge/index.d.ts.map +1 -1
- package/dist/src/bridge/index.js.map +1 -1
- package/dist/src/bridge/internal/bridge-client.d.ts +4 -0
- package/dist/src/bridge/internal/bridge-client.d.ts.map +1 -1
- package/dist/src/bridge/internal/bridge-client.js +20 -7
- package/dist/src/bridge/internal/bridge-client.js.map +1 -1
- package/dist/src/bridge/internal/bridge-client.test.js +18 -0
- package/dist/src/bridge/internal/bridge-client.test.js.map +1 -1
- package/dist/src/bridge/internal/bridge-host.d.ts +13 -1
- package/dist/src/bridge/internal/bridge-host.d.ts.map +1 -1
- package/dist/src/bridge/internal/bridge-host.js +35 -0
- package/dist/src/bridge/internal/bridge-host.js.map +1 -1
- package/dist/src/bridge/internal/bridge-host.test.js +31 -0
- package/dist/src/bridge/internal/bridge-host.test.js.map +1 -1
- package/dist/src/bridge/internal/hand-off.d.ts.map +1 -1
- package/dist/src/bridge/internal/hand-off.js +4 -1
- package/dist/src/bridge/internal/hand-off.js.map +1 -1
- package/dist/src/bridge/internal/host-protocol.d.ts +8 -0
- package/dist/src/bridge/internal/host-protocol.d.ts.map +1 -1
- package/dist/src/bridge/internal/host-protocol.js +120 -13
- package/dist/src/bridge/internal/host-protocol.js.map +1 -1
- package/dist/src/bridge/internal/host-protocol.test.js +13 -0
- package/dist/src/bridge/internal/host-protocol.test.js.map +1 -1
- package/dist/src/bridge/internal/instance-state.d.ts +9 -0
- package/dist/src/bridge/internal/instance-state.d.ts.map +1 -0
- package/dist/src/bridge/internal/instance-state.js +28 -0
- package/dist/src/bridge/internal/instance-state.js.map +1 -0
- package/dist/src/bridge/internal/transport-client.d.ts.map +1 -1
- package/dist/src/bridge/internal/transport-client.js +2 -1
- package/dist/src/bridge/internal/transport-client.js.map +1 -1
- package/dist/src/bridge/internal/transport-server.d.ts.map +1 -1
- package/dist/src/bridge/internal/transport-server.js +5 -1
- package/dist/src/bridge/internal/transport-server.js.map +1 -1
- package/dist/src/bridge/types.d.ts +43 -4
- package/dist/src/bridge/types.d.ts.map +1 -1
- package/dist/src/bridge/types.js.map +1 -1
- package/dist/src/cli/adapters/cli-command-adapter-handler.test.js +24 -0
- package/dist/src/cli/adapters/cli-command-adapter-handler.test.js.map +1 -1
- package/dist/src/cli/adapters/cli-command-adapter.d.ts +6 -0
- package/dist/src/cli/adapters/cli-command-adapter.d.ts.map +1 -1
- package/dist/src/cli/adapters/cli-command-adapter.js +107 -11
- package/dist/src/cli/adapters/cli-command-adapter.js.map +1 -1
- package/dist/src/cli/adapters/group-builder.d.ts +3 -0
- package/dist/src/cli/adapters/group-builder.d.ts.map +1 -1
- package/dist/src/cli/adapters/group-builder.js +34 -15
- package/dist/src/cli/adapters/group-builder.js.map +1 -1
- package/dist/src/cli/adapters/group-builder.test.js +26 -2
- package/dist/src/cli/adapters/group-builder.test.js.map +1 -1
- package/dist/src/cli/adapters/help-formatter.d.ts.map +1 -1
- package/dist/src/cli/adapters/help-formatter.js +4 -3
- package/dist/src/cli/adapters/help-formatter.js.map +1 -1
- package/dist/src/cli/adapters/help-formatter.test.js +1 -1
- package/dist/src/cli/adapters/help-formatter.test.js.map +1 -1
- package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts +2 -0
- package/dist/src/cli/adapters/playtest-edit-guard.test.d.ts.map +1 -0
- package/dist/src/cli/adapters/playtest-edit-guard.test.js +28 -0
- package/dist/src/cli/adapters/playtest-edit-guard.test.js.map +1 -0
- package/dist/src/cli/args/global-args.d.ts +1 -1
- package/dist/src/cli/args/global-args.d.ts.map +1 -1
- package/dist/src/cli/cli-output-context.d.ts +14 -0
- package/dist/src/cli/cli-output-context.d.ts.map +1 -0
- package/dist/src/cli/cli-output-context.js +39 -0
- package/dist/src/cli/cli-output-context.js.map +1 -0
- package/dist/src/cli/cli-output-context.test.d.ts +2 -0
- package/dist/src/cli/cli-output-context.test.d.ts.map +1 -0
- package/dist/src/cli/cli-output-context.test.js +38 -0
- package/dist/src/cli/cli-output-context.test.js.map +1 -0
- package/dist/src/cli/cli.js +40 -17
- package/dist/src/cli/cli.js.map +1 -1
- package/dist/src/cli/managed-studio-run.d.ts +21 -0
- package/dist/src/cli/managed-studio-run.d.ts.map +1 -0
- package/dist/src/cli/managed-studio-run.js +75 -0
- package/dist/src/cli/managed-studio-run.js.map +1 -0
- package/dist/src/cli/managed-studio-run.test.d.ts +2 -0
- package/dist/src/cli/managed-studio-run.test.d.ts.map +1 -0
- package/dist/src/cli/managed-studio-run.test.js +52 -0
- package/dist/src/cli/managed-studio-run.test.js.map +1 -0
- package/dist/src/cli/resolve-session.js +1 -1
- package/dist/src/cli/resolve-session.js.map +1 -1
- package/dist/src/cli/resolve-session.test.js +1 -1
- package/dist/src/cli/resolve-session.test.js.map +1 -1
- package/dist/src/cli/script-executor.d.ts +13 -1
- package/dist/src/cli/script-executor.d.ts.map +1 -1
- package/dist/src/cli/script-executor.js +77 -47
- package/dist/src/cli/script-executor.js.map +1 -1
- package/dist/src/commands/console/exec/exec.d.ts +17 -0
- package/dist/src/commands/console/exec/exec.d.ts.map +1 -1
- package/dist/src/commands/console/exec/exec.js +39 -7
- package/dist/src/commands/console/exec/exec.js.map +1 -1
- package/dist/src/commands/console/exec/exec.test.js +62 -3
- package/dist/src/commands/console/exec/exec.test.js.map +1 -1
- package/dist/src/commands/console/logs/logs.d.ts +30 -2
- package/dist/src/commands/console/logs/logs.d.ts.map +1 -1
- package/dist/src/commands/console/logs/logs.js +82 -7
- package/dist/src/commands/console/logs/logs.js.map +1 -1
- package/dist/src/commands/console/logs/logs.test.js +63 -4
- package/dist/src/commands/console/logs/logs.test.js.map +1 -1
- package/dist/src/commands/explorer/export/export.d.ts +19 -0
- package/dist/src/commands/explorer/export/export.d.ts.map +1 -0
- package/dist/src/commands/explorer/export/export.js +37 -0
- package/dist/src/commands/explorer/export/export.js.map +1 -0
- package/dist/src/commands/explorer/export/export.test.d.ts +2 -0
- package/dist/src/commands/explorer/export/export.test.d.ts.map +1 -0
- package/dist/src/commands/explorer/export/export.test.js +25 -0
- package/dist/src/commands/explorer/export/export.test.js.map +1 -0
- package/dist/src/commands/explorer/find/find.d.ts +28 -0
- package/dist/src/commands/explorer/find/find.d.ts.map +1 -0
- package/dist/src/commands/explorer/find/find.js +75 -0
- package/dist/src/commands/explorer/find/find.js.map +1 -0
- package/dist/src/commands/explorer/find/find.test.d.ts +2 -0
- package/dist/src/commands/explorer/find/find.test.d.ts.map +1 -0
- package/dist/src/commands/explorer/find/find.test.js +44 -0
- package/dist/src/commands/explorer/find/find.test.js.map +1 -0
- package/dist/src/commands/explorer/grep/grep.d.ts +24 -0
- package/dist/src/commands/explorer/grep/grep.d.ts.map +1 -0
- package/dist/src/commands/explorer/grep/grep.js +63 -0
- package/dist/src/commands/explorer/grep/grep.js.map +1 -0
- package/dist/src/commands/explorer/grep/grep.test.d.ts +2 -0
- package/dist/src/commands/explorer/grep/grep.test.d.ts.map +1 -0
- package/dist/src/commands/explorer/grep/grep.test.js +42 -0
- package/dist/src/commands/explorer/grep/grep.test.js.map +1 -0
- package/dist/src/commands/explorer/import/import.d.ts +21 -0
- package/dist/src/commands/explorer/import/import.d.ts.map +1 -0
- package/dist/src/commands/explorer/import/import.js +37 -0
- package/dist/src/commands/explorer/import/import.js.map +1 -0
- package/dist/src/commands/explorer/import/import.test.d.ts +2 -0
- package/dist/src/commands/explorer/import/import.test.d.ts.map +1 -0
- package/dist/src/commands/explorer/import/import.test.js +45 -0
- package/dist/src/commands/explorer/import/import.test.js.map +1 -0
- package/dist/src/commands/formatters.test.js +7 -1
- package/dist/src/commands/formatters.test.js.map +1 -1
- package/dist/src/commands/framework/action-loader.d.ts +5 -1
- package/dist/src/commands/framework/action-loader.d.ts.map +1 -1
- package/dist/src/commands/framework/action-loader.js +9 -2
- package/dist/src/commands/framework/action-loader.js.map +1 -1
- package/dist/src/commands/framework/action-loader.test.js +23 -0
- package/dist/src/commands/framework/action-loader.test.js.map +1 -1
- package/dist/src/commands/framework/arg-builder.d.ts +15 -2
- package/dist/src/commands/framework/arg-builder.d.ts.map +1 -1
- package/dist/src/commands/framework/arg-builder.js +22 -2
- package/dist/src/commands/framework/arg-builder.js.map +1 -1
- package/dist/src/commands/framework/define-command.d.ts +19 -3
- package/dist/src/commands/framework/define-command.d.ts.map +1 -1
- package/dist/src/commands/framework/define-command.js.map +1 -1
- package/dist/src/commands/framework/index.d.ts +1 -1
- package/dist/src/commands/framework/index.d.ts.map +1 -1
- package/dist/src/commands/framework/index.js.map +1 -1
- package/dist/src/commands/index.d.ts +11 -0
- package/dist/src/commands/index.d.ts.map +1 -1
- package/dist/src/commands/index.js +11 -0
- package/dist/src/commands/index.js.map +1 -1
- package/dist/src/commands/linux/inject-credentials/inject-credentials.d.ts.map +1 -1
- package/dist/src/commands/linux/inject-credentials/inject-credentials.js +1 -3
- package/dist/src/commands/linux/inject-credentials/inject-credentials.js.map +1 -1
- package/dist/src/commands/linux/setup/setup.d.ts.map +1 -1
- package/dist/src/commands/linux/setup/setup.js +1 -3
- package/dist/src/commands/linux/setup/setup.js.map +1 -1
- package/dist/src/commands/linux/status/status.d.ts +9 -1
- package/dist/src/commands/linux/status/status.d.ts.map +1 -1
- package/dist/src/commands/linux/status/status.js +66 -86
- package/dist/src/commands/linux/status/status.js.map +1 -1
- package/dist/src/commands/playtest/player/add/add.d.ts +17 -0
- package/dist/src/commands/playtest/player/add/add.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/add/add.js +45 -0
- package/dist/src/commands/playtest/player/add/add.js.map +1 -0
- package/dist/src/commands/playtest/player/list/list.d.ts +13 -0
- package/dist/src/commands/playtest/player/list/list.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/list/list.js +33 -0
- package/dist/src/commands/playtest/player/list/list.js.map +1 -0
- package/dist/src/commands/playtest/player/playtest-players.d.ts +36 -0
- package/dist/src/commands/playtest/player/playtest-players.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/playtest-players.js +187 -0
- package/dist/src/commands/playtest/player/playtest-players.js.map +1 -0
- package/dist/src/commands/playtest/player/playtest-players.test.d.ts +2 -0
- package/dist/src/commands/playtest/player/playtest-players.test.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/playtest-players.test.js +89 -0
- package/dist/src/commands/playtest/player/playtest-players.test.js.map +1 -0
- package/dist/src/commands/playtest/player/remove/remove.d.ts +17 -0
- package/dist/src/commands/playtest/player/remove/remove.d.ts.map +1 -0
- package/dist/src/commands/playtest/player/remove/remove.js +42 -0
- package/dist/src/commands/playtest/player/remove/remove.js.map +1 -0
- package/dist/src/commands/playtest/playtest-sessions.d.ts +49 -0
- package/dist/src/commands/playtest/playtest-sessions.d.ts.map +1 -0
- package/dist/src/commands/playtest/playtest-sessions.js +283 -0
- package/dist/src/commands/playtest/playtest-sessions.js.map +1 -0
- package/dist/src/commands/playtest/playtest-sessions.test.d.ts +2 -0
- package/dist/src/commands/playtest/playtest-sessions.test.d.ts.map +1 -0
- package/dist/src/commands/playtest/playtest-sessions.test.js +87 -0
- package/dist/src/commands/playtest/playtest-sessions.test.js.map +1 -0
- package/dist/src/commands/playtest/restart/restart.d.ts +23 -0
- package/dist/src/commands/playtest/restart/restart.d.ts.map +1 -0
- package/dist/src/commands/playtest/restart/restart.js +105 -0
- package/dist/src/commands/playtest/restart/restart.js.map +1 -0
- package/dist/src/commands/playtest/run/run.d.ts +47 -0
- package/dist/src/commands/playtest/run/run.d.ts.map +1 -0
- package/dist/src/commands/playtest/run/run.js +137 -0
- package/dist/src/commands/playtest/run/run.js.map +1 -0
- package/dist/src/commands/playtest/start/start.d.ts +42 -0
- package/dist/src/commands/playtest/start/start.d.ts.map +1 -0
- package/dist/src/commands/playtest/start/start.js +70 -0
- package/dist/src/commands/playtest/start/start.js.map +1 -0
- package/dist/src/commands/playtest/stop/stop.d.ts +15 -0
- package/dist/src/commands/playtest/stop/stop.d.ts.map +1 -0
- package/dist/src/commands/playtest/stop/stop.js +24 -0
- package/dist/src/commands/playtest/stop/stop.js.map +1 -0
- package/dist/src/commands/process/close/close.d.ts +19 -10
- package/dist/src/commands/process/close/close.d.ts.map +1 -1
- package/dist/src/commands/process/close/close.js +118 -15
- package/dist/src/commands/process/close/close.js.map +1 -1
- package/dist/src/commands/process/close/close.test.d.ts +2 -0
- package/dist/src/commands/process/close/close.test.d.ts.map +1 -0
- package/dist/src/commands/process/close/close.test.js +190 -0
- package/dist/src/commands/process/close/close.test.js.map +1 -0
- package/dist/src/commands/process/info/info.d.ts +45 -5
- package/dist/src/commands/process/info/info.d.ts.map +1 -1
- package/dist/src/commands/process/info/info.js +117 -13
- package/dist/src/commands/process/info/info.js.map +1 -1
- package/dist/src/commands/process/info/info.test.js +140 -38
- package/dist/src/commands/process/info/info.test.js.map +1 -1
- package/dist/src/commands/process/launch/launch.d.ts +11 -1
- package/dist/src/commands/process/launch/launch.d.ts.map +1 -1
- package/dist/src/commands/process/launch/launch.js +37 -7
- package/dist/src/commands/process/launch/launch.js.map +1 -1
- package/dist/src/commands/process/launch/launch.test.js +99 -20
- package/dist/src/commands/process/launch/launch.test.js.map +1 -1
- package/dist/src/commands/process/list/list.d.ts +2 -1
- package/dist/src/commands/process/list/list.d.ts.map +1 -1
- package/dist/src/commands/process/list/list.js +9 -6
- package/dist/src/commands/process/list/list.js.map +1 -1
- package/dist/src/commands/process/list/list.test.js +1 -0
- package/dist/src/commands/process/list/list.test.js.map +1 -1
- package/dist/src/commands/process/run/run.d.ts +9 -0
- package/dist/src/commands/process/run/run.d.ts.map +1 -1
- package/dist/src/commands/process/run/run.js +15 -5
- package/dist/src/commands/process/run/run.js.map +1 -1
- package/dist/src/commands/serve/serve.d.ts +2 -0
- package/dist/src/commands/serve/serve.d.ts.map +1 -1
- package/dist/src/commands/serve/serve.js +17 -4
- package/dist/src/commands/serve/serve.js.map +1 -1
- package/dist/src/commands/serve/serve.test.js +9 -2
- package/dist/src/commands/serve/serve.test.js.map +1 -1
- package/dist/src/commands/viewport/screenshot/screenshot.d.ts.map +1 -1
- package/dist/src/commands/viewport/screenshot/screenshot.js +4 -1
- package/dist/src/commands/viewport/screenshot/screenshot.js.map +1 -1
- package/dist/src/commands/viewport/screenshot/screenshot.test.js +5 -9
- package/dist/src/commands/viewport/screenshot/screenshot.test.js.map +1 -1
- package/dist/src/deploy/deploy-places.d.ts +39 -0
- package/dist/src/deploy/deploy-places.d.ts.map +1 -0
- package/dist/src/deploy/deploy-places.js +162 -0
- package/dist/src/deploy/deploy-places.js.map +1 -0
- package/dist/src/deploy/deploy-places.test.d.ts +2 -0
- package/dist/src/deploy/deploy-places.test.d.ts.map +1 -0
- package/dist/src/deploy/deploy-places.test.js +96 -0
- package/dist/src/deploy/deploy-places.test.js.map +1 -0
- package/dist/src/index.d.ts +2 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +1 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/plugin/persistent-plugin-installer.d.ts.map +1 -1
- package/dist/src/plugin/persistent-plugin-installer.js +2 -1
- package/dist/src/plugin/persistent-plugin-installer.js.map +1 -1
- package/dist/src/plugin/persistent-plugin-installer.test.js +3 -0
- package/dist/src/plugin/persistent-plugin-installer.test.js.map +1 -1
- package/dist/src/plugin/plugin-build-version.d.ts +7 -0
- package/dist/src/plugin/plugin-build-version.d.ts.map +1 -0
- package/dist/src/plugin/plugin-build-version.js +42 -0
- package/dist/src/plugin/plugin-build-version.js.map +1 -0
- package/dist/src/plugin/plugin-build-version.test.d.ts +2 -0
- package/dist/src/plugin/plugin-build-version.test.d.ts.map +1 -0
- package/dist/src/plugin/plugin-build-version.test.js +41 -0
- package/dist/src/plugin/plugin-build-version.test.js.map +1 -0
- package/dist/src/plugin/plugin-injector.d.ts.map +1 -1
- package/dist/src/plugin/plugin-injector.js +7 -1
- package/dist/src/plugin/plugin-injector.js.map +1 -1
- package/dist/src/process/studio-process-closer.d.ts +35 -0
- package/dist/src/process/studio-process-closer.d.ts.map +1 -0
- package/dist/src/process/studio-process-closer.js +129 -0
- package/dist/src/process/studio-process-closer.js.map +1 -0
- package/dist/src/process/studio-process-closer.test.d.ts +2 -0
- package/dist/src/process/studio-process-closer.test.d.ts.map +1 -0
- package/dist/src/process/studio-process-closer.test.js +80 -0
- package/dist/src/process/studio-process-closer.test.js.map +1 -0
- package/dist/src/process/studio-settings.d.ts +14 -0
- package/dist/src/process/studio-settings.d.ts.map +1 -0
- package/dist/src/process/studio-settings.js +50 -0
- package/dist/src/process/studio-settings.js.map +1 -0
- package/dist/src/process/studio-settings.test.d.ts +2 -0
- package/dist/src/process/studio-settings.test.d.ts.map +1 -0
- package/dist/src/process/studio-settings.test.js +16 -0
- package/dist/src/process/studio-settings.test.js.map +1 -0
- package/dist/src/process/studio-window-state.d.ts +13 -0
- package/dist/src/process/studio-window-state.d.ts.map +1 -0
- package/dist/src/process/studio-window-state.js +48 -0
- package/dist/src/process/studio-window-state.js.map +1 -0
- package/dist/src/server/studio-bridge-server.d.ts +3 -1
- package/dist/src/server/studio-bridge-server.d.ts.map +1 -1
- package/dist/src/server/studio-bridge-server.js +12 -4
- package/dist/src/server/studio-bridge-server.js.map +1 -1
- package/dist/src/server/web-socket-protocol.d.ts +173 -6
- package/dist/src/server/web-socket-protocol.d.ts.map +1 -1
- package/dist/src/server/web-socket-protocol.js +244 -1
- package/dist/src/server/web-socket-protocol.js.map +1 -1
- package/dist/src/server/web-socket-protocol.test.js +48 -0
- package/dist/src/server/web-socket-protocol.test.js.map +1 -1
- package/dist/src/test/e2e/persistent-session.test.js +121 -0
- package/dist/src/test/e2e/persistent-session.test.js.map +1 -1
- package/dist/src/test/e2e/split-server.test.d.ts +3 -5
- package/dist/src/test/e2e/split-server.test.d.ts.map +1 -1
- package/dist/src/test/e2e/split-server.test.js +3 -5
- package/dist/src/test/e2e/split-server.test.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/docker/Dockerfile +3 -0
- package/package.json +8 -6
- package/src/bridge/bridge-connection.test.ts +126 -0
- package/src/bridge/bridge-connection.ts +217 -22
- package/src/bridge/bridge-session.test.ts +6 -4
- package/src/bridge/bridge-session.ts +273 -28
- package/src/bridge/index.ts +3 -0
- package/src/bridge/internal/bridge-client.test.ts +23 -0
- package/src/bridge/internal/bridge-client.ts +25 -7
- package/src/bridge/internal/bridge-host.test.ts +38 -0
- package/src/bridge/internal/bridge-host.ts +47 -0
- package/src/bridge/internal/hand-off.ts +4 -1
- package/src/bridge/internal/host-protocol.test.ts +15 -0
- package/src/bridge/internal/host-protocol.ts +148 -37
- package/src/bridge/internal/instance-state.ts +34 -0
- package/src/bridge/internal/transport-client.ts +2 -1
- package/src/bridge/internal/transport-server.ts +5 -1
- package/src/bridge/types.ts +47 -2
- package/src/cli/adapters/cli-command-adapter-handler.test.ts +28 -0
- package/src/cli/adapters/cli-command-adapter.ts +150 -18
- package/src/cli/adapters/group-builder.test.ts +34 -2
- package/src/cli/adapters/group-builder.ts +52 -20
- package/src/cli/adapters/help-formatter.test.ts +1 -1
- package/src/cli/adapters/help-formatter.ts +4 -3
- package/src/cli/adapters/playtest-edit-guard.test.ts +54 -0
- package/src/cli/args/global-args.ts +1 -1
- package/src/cli/cli-output-context.test.ts +55 -0
- package/src/cli/cli-output-context.ts +50 -0
- package/src/cli/cli.ts +49 -17
- package/src/cli/managed-studio-run.test.ts +71 -0
- package/src/cli/managed-studio-run.ts +135 -0
- package/src/cli/resolve-session.test.ts +1 -1
- package/src/cli/resolve-session.ts +1 -1
- package/src/cli/script-executor.ts +99 -51
- package/src/commands/console/exec/exec.test.ts +96 -3
- package/src/commands/console/exec/exec.ts +59 -6
- package/src/commands/console/exec/execute.lua +356 -240
- package/src/commands/console/exec/execute.spec.lua +286 -0
- package/src/commands/console/logs/logs.test.ts +76 -4
- package/src/commands/console/logs/logs.ts +132 -17
- package/src/commands/console/logs/query-logs.lua +85 -52
- package/src/commands/console/logs/query-logs.spec.lua +132 -0
- package/src/commands/explorer/export/export-instances.lua +108 -0
- package/src/commands/explorer/export/export-instances.spec.lua +87 -0
- package/src/commands/explorer/export/export.test.ts +27 -0
- package/src/commands/explorer/export/export.ts +60 -0
- package/src/commands/explorer/find/find-instances.lua +174 -0
- package/src/commands/explorer/find/find-instances.spec.lua +122 -0
- package/src/commands/explorer/find/find.test.ts +53 -0
- package/src/commands/explorer/find/find.ts +113 -0
- package/src/commands/explorer/grep/grep-scripts.lua +214 -0
- package/src/commands/explorer/grep/grep-scripts.spec.lua +130 -0
- package/src/commands/explorer/grep/grep.test.ts +45 -0
- package/src/commands/explorer/grep/grep.ts +93 -0
- package/src/commands/explorer/import/import-instances.lua +106 -0
- package/src/commands/explorer/import/import-instances.spec.lua +84 -0
- package/src/commands/explorer/import/import.test.ts +60 -0
- package/src/commands/explorer/import/import.ts +66 -0
- package/src/commands/explorer/query/query-data-model.lua +124 -152
- package/src/commands/explorer/query/query-data-model.spec.lua +150 -0
- package/src/commands/formatters.test.ts +7 -1
- package/src/commands/framework/action-loader.test.ts +28 -0
- package/src/commands/framework/action-loader.ts +10 -2
- package/src/commands/framework/arg-builder.ts +26 -3
- package/src/commands/framework/define-command.ts +32 -3
- package/src/commands/framework/index.ts +1 -0
- package/src/commands/index.ts +50 -0
- package/src/commands/linux/inject-credentials/inject-credentials.ts +1 -3
- package/src/commands/linux/setup/setup.ts +1 -3
- package/src/commands/linux/status/status.ts +105 -98
- package/src/commands/playtest/player/add/add.ts +85 -0
- package/src/commands/playtest/player/list/list.ts +57 -0
- package/src/commands/playtest/player/playtest-players.test.ts +146 -0
- package/src/commands/playtest/player/playtest-players.ts +270 -0
- package/src/commands/playtest/player/remove/remove.ts +78 -0
- package/src/commands/playtest/playtest-sessions.test.ts +143 -0
- package/src/commands/playtest/playtest-sessions.ts +417 -0
- package/src/commands/playtest/restart/restart.ts +199 -0
- package/src/commands/playtest/run/playtest-runner.luau +264 -0
- package/src/commands/playtest/run/playtest-runner.spec.lua +71 -0
- package/src/commands/playtest/run/run-playtest-script.lua +139 -0
- package/src/commands/playtest/run/run-playtest-script.spec.lua +43 -0
- package/src/commands/playtest/run/run.ts +239 -0
- package/src/commands/playtest/start/start-playtest.lua +108 -0
- package/src/commands/playtest/start/start.ts +138 -0
- package/src/commands/playtest/stop/end-playtest.lua +47 -0
- package/src/commands/playtest/stop/stop.ts +51 -0
- package/src/commands/process/close/close.test.ts +250 -0
- package/src/commands/process/close/close.ts +183 -17
- package/src/commands/process/info/info.test.ts +198 -44
- package/src/commands/process/info/info.ts +204 -15
- package/src/commands/process/info/query-state.lua +42 -29
- package/src/commands/process/info/query-state.spec.lua +39 -0
- package/src/commands/process/launch/launch.test.ts +138 -21
- package/src/commands/process/launch/launch.ts +69 -9
- package/src/commands/process/list/list.test.ts +1 -0
- package/src/commands/process/list/list.ts +14 -6
- package/src/commands/process/run/run.ts +26 -5
- package/src/commands/serve/serve.test.ts +17 -2
- package/src/commands/serve/serve.ts +25 -6
- package/src/commands/viewport/screenshot/capture-screenshot.lua +175 -182
- package/src/commands/viewport/screenshot/capture-screenshot.spec.lua +129 -0
- package/src/commands/viewport/screenshot/screenshot.test.ts +7 -10
- package/src/commands/viewport/screenshot/screenshot.ts +6 -1
- package/src/deploy/deploy-places.test.ts +127 -0
- package/src/deploy/deploy-places.ts +229 -0
- package/src/index.ts +11 -0
- package/src/plugin/persistent-plugin-installer.test.ts +4 -0
- package/src/plugin/persistent-plugin-installer.ts +2 -1
- package/src/plugin/plugin-build-version.test.ts +55 -0
- package/src/plugin/plugin-build-version.ts +53 -0
- package/src/plugin/plugin-injector.ts +7 -1
- package/src/process/studio-process-closer.test.ts +107 -0
- package/src/process/studio-process-closer.ts +187 -0
- package/src/process/studio-settings.test.ts +18 -0
- package/src/process/studio-settings.ts +61 -0
- package/src/process/studio-window-state.ts +65 -0
- package/src/server/studio-bridge-server.ts +15 -4
- package/src/server/web-socket-protocol.test.ts +55 -0
- package/src/server/web-socket-protocol.ts +468 -8
- package/src/test/e2e/persistent-session.test.ts +137 -0
- package/src/test/e2e/split-server.test.ts +3 -5
- package/templates/studio-bridge-plugin/default.project.json +3 -0
- package/templates/studio-bridge-plugin/src/Shared/ActionRouter.lua +208 -159
- package/templates/studio-bridge-plugin/src/Shared/ActionRouter.spec.lua +418 -0
- package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.lua +94 -0
- package/templates/studio-bridge-plugin/src/Shared/BuiltInActions.spec.lua +166 -0
- package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.lua +118 -137
- package/templates/studio-bridge-plugin/src/Shared/DiscoveryStateMachine.spec.lua +228 -0
- package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.lua +80 -109
- package/templates/studio-bridge-plugin/src/Shared/MessageBuffer.spec.lua +116 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.lua +233 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeConnection.spec.lua +239 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.lua +53 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeLogUtils.spec.lua +27 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.lua +164 -0
- package/templates/studio-bridge-plugin/src/Shared/StudioBridgeSessionUtils.spec.lua +159 -0
- package/templates/studio-bridge-plugin/src/StudioBridgePlugin.server.lua +266 -368
- package/templates/studio-bridge-plugin/src/Vendor/png.lua +8 -2
- package/test/default.project.json +41 -0
- package/test/jest.config.lua +3 -0
- package/test/scripts/Server/ServerMain.server.lua +10 -0
- package/tsconfig.json +1 -0
- package/templates/studio-bridge-plugin/src/Shared/Protocol.lua +0 -132
- package/templates/studio-bridge-plugin-test/test/actions.test.lua +0 -580
- package/templates/studio-bridge-plugin-test/test/discovery.test.lua +0 -622
- package/templates/studio-bridge-plugin-test/test/execute-handler.test.lua +0 -517
- package/templates/studio-bridge-plugin-test/test/hash-lifecycle.test.lua +0 -814
- package/templates/studio-bridge-plugin-test/test/integration.test.lua +0 -1020
- package/templates/studio-bridge-plugin-test/test/new-actions.test.lua +0 -339
- package/templates/studio-bridge-plugin-test/test/plugin-entry.test.lua +0 -493
- package/templates/studio-bridge-plugin-test/test/protocol.test.lua +0 -506
- package/templates/studio-bridge-plugin-test/test/roblox-mocks.lua +0 -108
- package/templates/studio-bridge-plugin-test/test/test-runner.lua +0 -112
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistent-plugin-installer.test.js","sourceRoot":"","sources":["../../../src/plugin/persistent-plugin-installer.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"persistent-plugin-installer.test.js","sourceRoot":"","sources":["../../../src/plugin/persistent-plugin-installer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The plugin reports a hash of the template it was built from as its
|
|
3
|
+
* `pluginVersion`, so the CLI can tell when the installed plugin is stale.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getPluginBuildVersionAsync(): Promise<string>;
|
|
6
|
+
export declare function hashTemplateDirAsync(dir: string): Promise<string>;
|
|
7
|
+
//# sourceMappingURL=plugin-build-version.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-build-version.d.ts","sourceRoot":"","sources":["../../../src/plugin/plugin-build-version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAcH,wBAAgB,0BAA0B,IAAI,OAAO,CAAC,MAAM,CAAC,CAG5D;AAED,wBAAsB,oBAAoB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAavE"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The plugin reports a hash of the template it was built from as its
|
|
3
|
+
* `pluginVersion`, so the CLI can tell when the installed plugin is stale.
|
|
4
|
+
*/
|
|
5
|
+
import { createHash } from 'crypto';
|
|
6
|
+
import * as fs from 'fs/promises';
|
|
7
|
+
import * as path from 'path';
|
|
8
|
+
import { resolveTemplatePath } from '@quenty/nevermore-template-helpers';
|
|
9
|
+
const templateDir = resolveTemplatePath(import.meta.url, 'studio-bridge-plugin');
|
|
10
|
+
let cachedVersion;
|
|
11
|
+
export function getPluginBuildVersionAsync() {
|
|
12
|
+
cachedVersion ??= hashTemplateDirAsync(templateDir);
|
|
13
|
+
return cachedVersion;
|
|
14
|
+
}
|
|
15
|
+
export async function hashTemplateDirAsync(dir) {
|
|
16
|
+
const files = await listTemplateFilesAsync(dir, dir);
|
|
17
|
+
files.sort();
|
|
18
|
+
const hash = createHash('sha256');
|
|
19
|
+
for (const relativePath of files) {
|
|
20
|
+
const contents = await fs.readFile(path.join(dir, relativePath), 'utf-8');
|
|
21
|
+
hash.update(relativePath.replace(/\\/g, '/'));
|
|
22
|
+
hash.update('\0');
|
|
23
|
+
hash.update(contents.replace(/\r\n/g, '\n'));
|
|
24
|
+
hash.update('\0');
|
|
25
|
+
}
|
|
26
|
+
return hash.digest('hex').slice(0, 12);
|
|
27
|
+
}
|
|
28
|
+
async function listTemplateFilesAsync(baseDir, currentDir) {
|
|
29
|
+
const entries = await fs.readdir(currentDir, { withFileTypes: true });
|
|
30
|
+
const files = [];
|
|
31
|
+
for (const entry of entries) {
|
|
32
|
+
const fullPath = path.join(currentDir, entry.name);
|
|
33
|
+
if (entry.isDirectory()) {
|
|
34
|
+
files.push(...(await listTemplateFilesAsync(baseDir, fullPath)));
|
|
35
|
+
}
|
|
36
|
+
else if (!entry.name.endsWith('.spec.lua')) {
|
|
37
|
+
files.push(path.relative(baseDir, fullPath));
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return files;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=plugin-build-version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-build-version.js","sourceRoot":"","sources":["../../../src/plugin/plugin-build-version.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,oCAAoC,CAAC;AAEzE,MAAM,WAAW,GAAG,mBAAmB,CACrC,MAAM,CAAC,IAAI,CAAC,GAAG,EACf,sBAAsB,CACvB,CAAC;AAEF,IAAI,aAA0C,CAAC;AAE/C,MAAM,UAAU,0BAA0B;IACxC,aAAa,KAAK,oBAAoB,CAAC,WAAW,CAAC,CAAC;IACpD,OAAO,aAAa,CAAC;AACvB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAW;IACpD,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACrD,KAAK,CAAC,IAAI,EAAE,CAAC;IAEb,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClC,KAAK,MAAM,YAAY,IAAI,KAAK,EAAE,CAAC;QACjC,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAClB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACzC,CAAC;AAED,KAAK,UAAU,sBAAsB,CACnC,OAAe,EACf,UAAkB;IAElB,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACxB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,sBAAsB,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YAC7C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-build-version.test.d.ts","sourceRoot":"","sources":["../../../src/plugin/plugin-build-version.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, it, expect, afterEach } from 'vitest';
|
|
2
|
+
import * as fs from 'fs/promises';
|
|
3
|
+
import * as os from 'os';
|
|
4
|
+
import * as path from 'path';
|
|
5
|
+
import { hashTemplateDirAsync } from './plugin-build-version.js';
|
|
6
|
+
describe('hashTemplateDirAsync', () => {
|
|
7
|
+
const dirs = [];
|
|
8
|
+
afterEach(async () => {
|
|
9
|
+
for (const dir of dirs) {
|
|
10
|
+
await fs.rm(dir, { recursive: true, force: true });
|
|
11
|
+
}
|
|
12
|
+
dirs.length = 0;
|
|
13
|
+
});
|
|
14
|
+
async function makeTemplateAsync(files) {
|
|
15
|
+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), 'sb-template-'));
|
|
16
|
+
dirs.push(dir);
|
|
17
|
+
for (const [name, contents] of Object.entries(files)) {
|
|
18
|
+
await fs.mkdir(path.dirname(path.join(dir, name)), { recursive: true });
|
|
19
|
+
await fs.writeFile(path.join(dir, name), contents);
|
|
20
|
+
}
|
|
21
|
+
return dir;
|
|
22
|
+
}
|
|
23
|
+
it('changes when plugin source changes', async () => {
|
|
24
|
+
const before = await makeTemplateAsync({ 'src/Plugin.lua': 'print(1)' });
|
|
25
|
+
const after = await makeTemplateAsync({ 'src/Plugin.lua': 'print(2)' });
|
|
26
|
+
expect(await hashTemplateDirAsync(before)).not.toBe(await hashTemplateDirAsync(after));
|
|
27
|
+
});
|
|
28
|
+
it('ignores specs and line endings', async () => {
|
|
29
|
+
const plain = await makeTemplateAsync({ 'src/Plugin.lua': 'a\nb\n' });
|
|
30
|
+
const withSpec = await makeTemplateAsync({
|
|
31
|
+
'src/Plugin.lua': 'a\r\nb\r\n',
|
|
32
|
+
'src/Plugin.spec.lua': 'test',
|
|
33
|
+
});
|
|
34
|
+
expect(await hashTemplateDirAsync(plain)).toBe(await hashTemplateDirAsync(withSpec));
|
|
35
|
+
});
|
|
36
|
+
it('is a short hex string', async () => {
|
|
37
|
+
const dir = await makeTemplateAsync({ 'src/Plugin.lua': 'print(1)' });
|
|
38
|
+
expect(await hashTemplateDirAsync(dir)).toMatch(/^[0-9a-f]{12}$/);
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
//# sourceMappingURL=plugin-build-version.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-build-version.test.js","sourceRoot":"","sources":["../../../src/plugin/plugin-build-version.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEjE,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,SAAS,CAAC,KAAK,IAAI,EAAE;QACnB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,KAAK,UAAU,iBAAiB,CAC9B,KAA6B;QAE7B,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,cAAc,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACf,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACrD,MAAM,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACxE,MAAM,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAC;QACzE,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAC;QAExE,MAAM,CAAC,MAAM,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CACjD,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAClC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,gCAAgC,EAAE,KAAK,IAAI,EAAE;QAC9C,MAAM,KAAK,GAAG,MAAM,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,QAAQ,EAAE,CAAC,CAAC;QACtE,MAAM,QAAQ,GAAG,MAAM,iBAAiB,CAAC;YACvC,gBAAgB,EAAE,YAAY;YAC9B,qBAAqB,EAAE,MAAM;SAC9B,CAAC,CAAC;QAEH,MAAM,CAAC,MAAM,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAC5C,MAAM,oBAAoB,CAAC,QAAQ,CAAC,CACrC,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uBAAuB,EAAE,KAAK,IAAI,EAAE;QACrC,MAAM,GAAG,GAAG,MAAM,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,UAAU,EAAE,CAAC,CAAC;QAEtE,MAAM,CAAC,MAAM,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-injector.d.ts","sourceRoot":"","sources":["../../../src/plugin/plugin-injector.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"plugin-injector.d.ts","sourceRoot":"","sources":["../../../src/plugin/plugin-injector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAeH,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,8CAA8C;IAC9C,UAAU,EAAE,MAAM,CAAC;IACnB,0CAA0C;IAC1C,YAAY,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACnC;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,cAAc,CAAC,CAmCzB"}
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { BuildContext, TemplateHelper, resolveTemplatePath, } from '@quenty/nevermore-template-helpers';
|
|
6
6
|
import { findPluginsFolder } from '../process/studio-process-manager.js';
|
|
7
|
+
import { getPluginBuildVersionAsync } from './plugin-build-version.js';
|
|
7
8
|
const templateDir = resolveTemplatePath(import.meta.url, 'studio-bridge-plugin');
|
|
8
9
|
/**
|
|
9
10
|
* Build and install the plugin .rbxm into Studio's plugins folder using rojo.
|
|
@@ -14,7 +15,12 @@ export async function injectPluginAsync(options) {
|
|
|
14
15
|
prefix: 'studio-bridge-plugin-',
|
|
15
16
|
});
|
|
16
17
|
try {
|
|
17
|
-
await TemplateHelper.createDirectoryContentsAsync(templateDir, buildContext.buildDir, {
|
|
18
|
+
await TemplateHelper.createDirectoryContentsAsync(templateDir, buildContext.buildDir, {
|
|
19
|
+
PORT: String(port),
|
|
20
|
+
SESSION_ID: sessionId,
|
|
21
|
+
EPHEMERAL: 'true',
|
|
22
|
+
PLUGIN_VERSION: await getPluginBuildVersionAsync(),
|
|
23
|
+
}, false);
|
|
18
24
|
const pluginFileName = `studio-bridge-${sessionId}.rbxm`;
|
|
19
25
|
const pluginPath = await buildContext.rojoBuildAsync({
|
|
20
26
|
projectPath: buildContext.resolvePath('default.project.json'),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-injector.js","sourceRoot":"","sources":["../../../src/plugin/plugin-injector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,YAAY,EACZ,cAAc,EACd,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-injector.js","sourceRoot":"","sources":["../../../src/plugin/plugin-injector.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,YAAY,EACZ,cAAc,EACd,mBAAmB,GACpB,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AACzE,OAAO,EAAE,0BAA0B,EAAE,MAAM,2BAA2B,CAAC;AAEvE,MAAM,WAAW,GAAG,mBAAmB,CACrC,MAAM,CAAC,IAAI,CAAC,GAAG,EACf,sBAAsB,CACvB,CAAC;AAcF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAA4B;IAE5B,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAEpC,MAAM,YAAY,GAAG,MAAM,YAAY,CAAC,WAAW,CAAC;QAClD,MAAM,EAAE,uBAAuB;KAChC,CAAC,CAAC;IAEH,IAAI,CAAC;QACH,MAAM,cAAc,CAAC,4BAA4B,CAC/C,WAAW,EACX,YAAY,CAAC,QAAQ,EACrB;YACE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC;YAClB,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,MAAM;YACjB,cAAc,EAAE,MAAM,0BAA0B,EAAE;SACnD,EACD,KAAK,CACN,CAAC;QAEF,MAAM,cAAc,GAAG,iBAAiB,SAAS,OAAO,CAAC;QACzD,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,cAAc,CAAC;YACnD,WAAW,EAAE,YAAY,CAAC,WAAW,CAAC,sBAAsB,CAAC;YAC7D,MAAM,EAAE,cAAc;YACtB,aAAa,EAAE,iBAAiB,EAAE;SACnC,CAAC,CAAC;QAEH,OAAO;YACL,UAAU,EAAE,UAAW;YACvB,YAAY,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE;SAChD,CAAC;IACJ,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,YAAY,CAAC,YAAY,EAAE,CAAC;QAClC,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finds running Roblox Studio processes and closes them. The plugin API has
|
|
3
|
+
* no process id, so a bridge session is matched to its process by the place
|
|
4
|
+
* name Studio shows in the window title, or by the place id a cloud place was
|
|
5
|
+
* launched with.
|
|
6
|
+
*/
|
|
7
|
+
export interface RunningStudioProcess {
|
|
8
|
+
pid: number;
|
|
9
|
+
windowTitle: string;
|
|
10
|
+
commandLine?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface CloseStudioOptions {
|
|
13
|
+
force?: boolean;
|
|
14
|
+
exitTimeoutMs?: number;
|
|
15
|
+
}
|
|
16
|
+
export declare function listStudioProcessesAsync(): Promise<RunningStudioProcess[]>;
|
|
17
|
+
export declare function parseWindowsProcessList(stdout: string): RunningStudioProcess[];
|
|
18
|
+
export declare function parseMacProcessList(stdout: string): RunningStudioProcess[];
|
|
19
|
+
/**
|
|
20
|
+
* Processes whose window shows the given place. Studio titles a local file
|
|
21
|
+
* by its full path and a cloud place by its name on the website, which the
|
|
22
|
+
* plugin can't see, so with no title match a cloud place is found by the
|
|
23
|
+
* `placeId` Studio was launched with.
|
|
24
|
+
*/
|
|
25
|
+
export declare function matchStudioProcesses(processes: RunningStudioProcess[], placeName: string, placeId?: number): RunningStudioProcess[];
|
|
26
|
+
/** Processes Studio launched with `placeId`, as `process launch` and the website's "Edit in Studio" do. */
|
|
27
|
+
export declare function matchStudioProcessesByPlaceId(processes: RunningStudioProcess[], placeId: number): RunningStudioProcess[];
|
|
28
|
+
/**
|
|
29
|
+
* Close a Studio process. Without `force` Studio is asked to close its
|
|
30
|
+
* window, which it can refuse by prompting to save. Resolves whether the
|
|
31
|
+
* process exited within the timeout.
|
|
32
|
+
*/
|
|
33
|
+
export declare function closeStudioProcessAsync(pid: number, options?: CloseStudioOptions): Promise<boolean>;
|
|
34
|
+
export declare function isProcessRunning(pid: number): boolean;
|
|
35
|
+
//# sourceMappingURL=studio-process-closer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-process-closer.d.ts","sourceRoot":"","sources":["../../../src/process/studio-process-closer.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAOH,MAAM,WAAW,oBAAoB;IACnC,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,wBAAsB,wBAAwB,IAAI,OAAO,CACvD,oBAAoB,EAAE,CACvB,CAuBA;AAED,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,MAAM,GACb,oBAAoB,EAAE,CAiBxB;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,EAAE,CAgB1E;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAClC,SAAS,EAAE,oBAAoB,EAAE,EACjC,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,GACf,oBAAoB,EAAE,CAgBxB;AAED,2GAA2G;AAC3G,wBAAgB,6BAA6B,CAC3C,SAAS,EAAE,oBAAoB,EAAE,EACjC,OAAO,EAAE,MAAM,GACd,oBAAoB,EAAE,CAKxB;AAED;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,MAAM,EACX,OAAO,GAAE,kBAAuB,GAC/B,OAAO,CAAC,OAAO,CAAC,CA6BlB;AAED,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAOrD"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Finds running Roblox Studio processes and closes them. The plugin API has
|
|
3
|
+
* no process id, so a bridge session is matched to its process by the place
|
|
4
|
+
* name Studio shows in the window title, or by the place id a cloud place was
|
|
5
|
+
* launched with.
|
|
6
|
+
*/
|
|
7
|
+
import { execa } from 'execa';
|
|
8
|
+
const WINDOW_TITLE_SUFFIX = ' - Roblox Studio';
|
|
9
|
+
const EXIT_POLL_INTERVAL_MS = 250;
|
|
10
|
+
export async function listStudioProcessesAsync() {
|
|
11
|
+
if (process.platform === 'win32') {
|
|
12
|
+
const { stdout } = await execa('powershell.exe', [
|
|
13
|
+
'-NoProfile',
|
|
14
|
+
'-NonInteractive',
|
|
15
|
+
'-Command',
|
|
16
|
+
'@(Get-CimInstance Win32_Process -Filter "Name=\'RobloxStudioBeta.exe\'" | ForEach-Object { [pscustomobject]@{ Id = $_.ProcessId; MainWindowTitle = (Get-Process -Id $_.ProcessId -ErrorAction SilentlyContinue).MainWindowTitle; CommandLine = $_.CommandLine } }) | ConvertTo-Json -Compress',
|
|
17
|
+
], { reject: false });
|
|
18
|
+
return parseWindowsProcessList(stdout);
|
|
19
|
+
}
|
|
20
|
+
if (process.platform === 'darwin') {
|
|
21
|
+
const { stdout } = await execa('ps', ['-axo', 'pid=,command='], {
|
|
22
|
+
reject: false,
|
|
23
|
+
});
|
|
24
|
+
return parseMacProcessList(stdout);
|
|
25
|
+
}
|
|
26
|
+
throw new Error(`Closing Studio is not supported on ${process.platform}`);
|
|
27
|
+
}
|
|
28
|
+
export function parseWindowsProcessList(stdout) {
|
|
29
|
+
const trimmed = stdout.trim();
|
|
30
|
+
if (!trimmed)
|
|
31
|
+
return [];
|
|
32
|
+
const parsed = JSON.parse(trimmed);
|
|
33
|
+
const entries = Array.isArray(parsed) ? parsed : [parsed];
|
|
34
|
+
return entries.map((entry) => ({
|
|
35
|
+
pid: entry.Id,
|
|
36
|
+
windowTitle: entry.MainWindowTitle ?? '',
|
|
37
|
+
commandLine: entry.CommandLine ?? undefined,
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
export function parseMacProcessList(stdout) {
|
|
41
|
+
const processes = [];
|
|
42
|
+
for (const line of stdout.split('\n')) {
|
|
43
|
+
const match = /^\s*(\d+)\s+(.*RobloxStudio\.app\/Contents\/MacOS\/RobloxStudio.*)$/.exec(line);
|
|
44
|
+
if (match) {
|
|
45
|
+
processes.push({
|
|
46
|
+
pid: Number(match[1]),
|
|
47
|
+
windowTitle: match[2],
|
|
48
|
+
commandLine: match[2],
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return processes;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Processes whose window shows the given place. Studio titles a local file
|
|
56
|
+
* by its full path and a cloud place by its name on the website, which the
|
|
57
|
+
* plugin can't see, so with no title match a cloud place is found by the
|
|
58
|
+
* `placeId` Studio was launched with.
|
|
59
|
+
*/
|
|
60
|
+
export function matchStudioProcesses(processes, placeName, placeId) {
|
|
61
|
+
const byTitle = processes.filter((proc) => {
|
|
62
|
+
const title = proc.windowTitle.endsWith(WINDOW_TITLE_SUFFIX)
|
|
63
|
+
? proc.windowTitle.slice(0, -WINDOW_TITLE_SUFFIX.length)
|
|
64
|
+
: proc.windowTitle;
|
|
65
|
+
return (title === placeName ||
|
|
66
|
+
title.endsWith(`\\${placeName}`) ||
|
|
67
|
+
title.endsWith(`/${placeName}`));
|
|
68
|
+
});
|
|
69
|
+
if (byTitle.length > 0 || !placeId) {
|
|
70
|
+
return byTitle;
|
|
71
|
+
}
|
|
72
|
+
return matchStudioProcessesByPlaceId(processes, placeId);
|
|
73
|
+
}
|
|
74
|
+
/** Processes Studio launched with `placeId`, as `process launch` and the website's "Edit in Studio" do. */
|
|
75
|
+
export function matchStudioProcessesByPlaceId(processes, placeId) {
|
|
76
|
+
const launchedPlaceId = new RegExp(`placeId:${placeId}(\\D|$)`);
|
|
77
|
+
return processes.filter((proc) => proc.commandLine && launchedPlaceId.test(proc.commandLine));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Close a Studio process. Without `force` Studio is asked to close its
|
|
81
|
+
* window, which it can refuse by prompting to save. Resolves whether the
|
|
82
|
+
* process exited within the timeout.
|
|
83
|
+
*/
|
|
84
|
+
export async function closeStudioProcessAsync(pid, options = {}) {
|
|
85
|
+
const { force = false, exitTimeoutMs = 10_000 } = options;
|
|
86
|
+
if (process.platform === 'win32') {
|
|
87
|
+
if (force) {
|
|
88
|
+
await execa('taskkill', ['/F', '/T', '/PID', String(pid)], {
|
|
89
|
+
reject: false,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
await execa('powershell.exe', [
|
|
94
|
+
'-NoProfile',
|
|
95
|
+
'-NonInteractive',
|
|
96
|
+
'-Command',
|
|
97
|
+
`(Get-Process -Id ${pid} -ErrorAction SilentlyContinue).CloseMainWindow() | Out-Null`,
|
|
98
|
+
], { reject: false });
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
else {
|
|
102
|
+
try {
|
|
103
|
+
process.kill(pid, force ? 'SIGKILL' : 'SIGTERM');
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
return !isProcessRunning(pid);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return waitForExitAsync(pid, exitTimeoutMs);
|
|
110
|
+
}
|
|
111
|
+
export function isProcessRunning(pid) {
|
|
112
|
+
try {
|
|
113
|
+
process.kill(pid, 0);
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
return err.code === 'EPERM';
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async function waitForExitAsync(pid, timeoutMs) {
|
|
121
|
+
const deadline = Date.now() + timeoutMs;
|
|
122
|
+
while (Date.now() < deadline) {
|
|
123
|
+
if (!isProcessRunning(pid))
|
|
124
|
+
return true;
|
|
125
|
+
await new Promise((resolve) => setTimeout(resolve, EXIT_POLL_INTERVAL_MS));
|
|
126
|
+
}
|
|
127
|
+
return !isProcessRunning(pid);
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=studio-process-closer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-process-closer.js","sourceRoot":"","sources":["../../../src/process/studio-process-closer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-process-closer.test.d.ts","sourceRoot":"","sources":["../../../src/process/studio-process-closer.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { matchStudioProcesses, parseMacProcessList, parseWindowsProcessList, } from './studio-process-closer.js';
|
|
3
|
+
describe('parseWindowsProcessList', () => {
|
|
4
|
+
it('parses a single process object', () => {
|
|
5
|
+
expect(parseWindowsProcessList('{"Id":9792,"MainWindowTitle":"C:\\\\places\\\\test-place.rbxl - Roblox Studio"}')).toEqual([
|
|
6
|
+
{ pid: 9792, windowTitle: 'C:\\places\\test-place.rbxl - Roblox Studio' },
|
|
7
|
+
]);
|
|
8
|
+
});
|
|
9
|
+
it('parses an array and treats a null title as empty', () => {
|
|
10
|
+
expect(parseWindowsProcessList('[{"Id":1,"MainWindowTitle":"Map - Roblox Studio"},{"Id":2,"MainWindowTitle":null}]')).toEqual([
|
|
11
|
+
{ pid: 1, windowTitle: 'Map - Roblox Studio' },
|
|
12
|
+
{ pid: 2, windowTitle: '' },
|
|
13
|
+
]);
|
|
14
|
+
});
|
|
15
|
+
it('returns nothing when no Studio is running', () => {
|
|
16
|
+
expect(parseWindowsProcessList('')).toEqual([]);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
describe('parseMacProcessList', () => {
|
|
20
|
+
it('keeps only Studio processes', () => {
|
|
21
|
+
const stdout = [
|
|
22
|
+
' 101 /Applications/RobloxStudio.app/Contents/MacOS/RobloxStudio /Users/me/test-place.rbxl',
|
|
23
|
+
' 102 /usr/bin/zsh',
|
|
24
|
+
].join('\n');
|
|
25
|
+
expect(parseMacProcessList(stdout)).toEqual([
|
|
26
|
+
{
|
|
27
|
+
pid: 101,
|
|
28
|
+
windowTitle: '/Applications/RobloxStudio.app/Contents/MacOS/RobloxStudio /Users/me/test-place.rbxl',
|
|
29
|
+
commandLine: '/Applications/RobloxStudio.app/Contents/MacOS/RobloxStudio /Users/me/test-place.rbxl',
|
|
30
|
+
},
|
|
31
|
+
]);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
34
|
+
describe('matchStudioProcesses', () => {
|
|
35
|
+
const processes = [
|
|
36
|
+
{ pid: 1, windowTitle: 'C:\\places\\test-place.rbxl - Roblox Studio' },
|
|
37
|
+
{ pid: 2, windowTitle: 'Map - Roblox Studio' },
|
|
38
|
+
{ pid: 3, windowTitle: 'Other Map - Roblox Studio' },
|
|
39
|
+
{ pid: 4, windowTitle: '' },
|
|
40
|
+
];
|
|
41
|
+
it('matches a local file by its path', () => {
|
|
42
|
+
expect(matchStudioProcesses(processes, 'test-place.rbxl')).toEqual([
|
|
43
|
+
processes[0],
|
|
44
|
+
]);
|
|
45
|
+
});
|
|
46
|
+
it('matches a cloud place by the place id it was launched with', () => {
|
|
47
|
+
const cloud = [
|
|
48
|
+
{
|
|
49
|
+
pid: 5,
|
|
50
|
+
windowTitle: 'My Game (abc123) - Roblox Studio',
|
|
51
|
+
commandLine: 'RobloxStudioBeta.exe roblox-studio:1+launchmode:edit+task:EditPlace+placeId:123+universeId:9',
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
pid: 6,
|
|
55
|
+
windowTitle: 'Other - Roblox Studio',
|
|
56
|
+
commandLine: 'RobloxStudioBeta.exe roblox-studio:1+placeId:1234',
|
|
57
|
+
},
|
|
58
|
+
];
|
|
59
|
+
expect(matchStudioProcesses(cloud, 'Place1', 123)).toEqual([cloud[0]]);
|
|
60
|
+
expect(matchStudioProcesses(cloud, 'Place1')).toEqual([]);
|
|
61
|
+
});
|
|
62
|
+
it('prefers a title match over a launch place id', () => {
|
|
63
|
+
const cloud = [
|
|
64
|
+
{
|
|
65
|
+
pid: 5,
|
|
66
|
+
windowTitle: 'Other - Roblox Studio',
|
|
67
|
+
commandLine: 'RobloxStudioBeta.exe roblox-studio:1+placeId:123',
|
|
68
|
+
},
|
|
69
|
+
{ pid: 6, windowTitle: 'Map - Roblox Studio' },
|
|
70
|
+
];
|
|
71
|
+
expect(matchStudioProcesses(cloud, 'Map', 123)).toEqual([cloud[1]]);
|
|
72
|
+
});
|
|
73
|
+
it('matches a cloud place by its exact name', () => {
|
|
74
|
+
expect(matchStudioProcesses(processes, 'Map')).toEqual([processes[1]]);
|
|
75
|
+
});
|
|
76
|
+
it('matches nothing for an unknown place', () => {
|
|
77
|
+
expect(matchStudioProcesses(processes, 'Missing')).toEqual([]);
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
//# sourceMappingURL=studio-process-closer.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-process-closer.test.js","sourceRoot":"","sources":["../../../src/process/studio-process-closer.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads Studio's own settings from the file it saves them to, for settings a
|
|
3
|
+
* plugin can't read.
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Whether Studio's "Load user plugins on playtest" setting is on. Without it,
|
|
7
|
+
* the plugin doesn't load into a playtest's DataModels, so they never connect
|
|
8
|
+
* to the bridge. Undefined when the setting can't be read, e.g. on macOS,
|
|
9
|
+
* whose settings file isn't located here.
|
|
10
|
+
*/
|
|
11
|
+
export declare function tryReadLoadUserPluginsOnPlaytestAsync(): Promise<boolean | undefined>;
|
|
12
|
+
/** Reads `<bool name="...">true|false</bool>` from a Studio settings file. */
|
|
13
|
+
export declare function parseBoolSetting(xml: string, name: string): boolean | undefined;
|
|
14
|
+
//# sourceMappingURL=studio-settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-settings.d.ts","sourceRoot":"","sources":["../../../src/process/studio-settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AASH;;;;;GAKG;AACH,wBAAsB,qCAAqC,IAAI,OAAO,CACpE,OAAO,GAAG,SAAS,CACpB,CAaA;AAED,8EAA8E;AAC9E,wBAAgB,gBAAgB,CAC9B,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,GACX,OAAO,GAAG,SAAS,CAKrB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads Studio's own settings from the file it saves them to, for settings a
|
|
3
|
+
* plugin can't read.
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs/promises';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import { findPluginsFolder } from './studio-process-manager.js';
|
|
8
|
+
/** The XML name of Studio's "Load user plugins on playtest" setting. */
|
|
9
|
+
const LOAD_USER_PLUGINS_ON_PLAYTEST = 'LoadUserPluginsInRunModes';
|
|
10
|
+
/**
|
|
11
|
+
* Whether Studio's "Load user plugins on playtest" setting is on. Without it,
|
|
12
|
+
* the plugin doesn't load into a playtest's DataModels, so they never connect
|
|
13
|
+
* to the bridge. Undefined when the setting can't be read, e.g. on macOS,
|
|
14
|
+
* whose settings file isn't located here.
|
|
15
|
+
*/
|
|
16
|
+
export async function tryReadLoadUserPluginsOnPlaytestAsync() {
|
|
17
|
+
const settingsPath = findGlobalSettingsPath();
|
|
18
|
+
if (!settingsPath) {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
let xml;
|
|
22
|
+
try {
|
|
23
|
+
xml = await fs.readFile(settingsPath, 'utf8');
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
28
|
+
return parseBoolSetting(xml, LOAD_USER_PLUGINS_ON_PLAYTEST);
|
|
29
|
+
}
|
|
30
|
+
/** Reads `<bool name="...">true|false</bool>` from a Studio settings file. */
|
|
31
|
+
export function parseBoolSetting(xml, name) {
|
|
32
|
+
const match = new RegExp(`<bool name="${name}">\\s*(true|false)\\s*</bool>`).exec(xml);
|
|
33
|
+
return match ? match[1] === 'true' : undefined;
|
|
34
|
+
}
|
|
35
|
+
/** Studio keeps its settings beside the plugins folder on Windows and under Wine. */
|
|
36
|
+
function findGlobalSettingsPath() {
|
|
37
|
+
if (process.platform !== 'win32' && process.platform !== 'linux') {
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
try {
|
|
41
|
+
const robloxDir = process.platform === 'linux'
|
|
42
|
+
? path.posix.dirname(findPluginsFolder())
|
|
43
|
+
: path.dirname(findPluginsFolder());
|
|
44
|
+
return path.join(robloxDir, 'GlobalSettings_13.xml');
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=studio-settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-settings.js","sourceRoot":"","sources":["../../../src/process/studio-settings.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,wEAAwE;AACxE,MAAM,6BAA6B,GAAG,2BAA2B,CAAC;AAElE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,qCAAqC;IAGzD,MAAM,YAAY,GAAG,sBAAsB,EAAE,CAAC;IAC9C,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,gBAAgB,CAAC,GAAG,EAAE,6BAA6B,CAAC,CAAC;AAC9D,CAAC;AAED,8EAA8E;AAC9E,MAAM,UAAU,gBAAgB,CAC9B,GAAW,EACX,IAAY;IAEZ,MAAM,KAAK,GAAG,IAAI,MAAM,CACtB,eAAe,IAAI,+BAA+B,CACnD,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACZ,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;AACjD,CAAC;AAED,qFAAqF;AACrF,SAAS,sBAAsB;IAC7B,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjE,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,IAAI,CAAC;QACH,MAAM,SAAS,GACb,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC1B,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACzC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,CAAC,CAAC;IACvD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-settings.test.d.ts","sourceRoot":"","sources":["../../../src/process/studio-settings.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { parseBoolSetting } from './studio-settings.js';
|
|
3
|
+
describe('parseBoolSetting', () => {
|
|
4
|
+
const xml = `<Item class="UserSettings"><Properties>
|
|
5
|
+
<bool name="LoadAllBuiltinPluginsInRunModes">true</bool>
|
|
6
|
+
<bool name="LoadUserPluginsInRunModes">false</bool>
|
|
7
|
+
</Properties></Item>`;
|
|
8
|
+
it('reads the named setting, not one whose name contains it', () => {
|
|
9
|
+
expect(parseBoolSetting(xml, 'LoadUserPluginsInRunModes')).toBe(false);
|
|
10
|
+
expect(parseBoolSetting(xml, 'LoadAllBuiltinPluginsInRunModes')).toBe(true);
|
|
11
|
+
});
|
|
12
|
+
it('is undefined for a setting the file does not have', () => {
|
|
13
|
+
expect(parseBoolSetting(xml, 'Missing')).toBeUndefined();
|
|
14
|
+
});
|
|
15
|
+
});
|
|
16
|
+
//# sourceMappingURL=studio-settings.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-settings.test.js","sourceRoot":"","sources":["../../../src/process/studio-settings.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD,QAAQ,CAAC,kBAAkB,EAAE,GAAG,EAAE;IAChC,MAAM,GAAG,GAAG;;;uBAGS,CAAC;IAEtB,EAAE,CAAC,yDAAyD,EAAE,GAAG,EAAE;QACjE,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads whether a Studio window is focused or minimized. The plugin API
|
|
3
|
+
* cannot see either, so this asks the OS about the process the session's
|
|
4
|
+
* place is showing in.
|
|
5
|
+
*/
|
|
6
|
+
export interface StudioWindowState {
|
|
7
|
+
focused: boolean;
|
|
8
|
+
minimized: boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Undefined where the OS gives no answer, including outside Windows. */
|
|
11
|
+
export declare function tryGetStudioWindowStateAsync(pid: number): Promise<StudioWindowState | undefined>;
|
|
12
|
+
export declare function parseWindowState(stdout: string): StudioWindowState | undefined;
|
|
13
|
+
//# sourceMappingURL=studio-window-state.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"studio-window-state.d.ts","sourceRoot":"","sources":["../../../src/process/studio-window-state.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,OAAO,CAAC;CACpB;AAiBD,yEAAyE;AACzE,wBAAsB,4BAA4B,CAChD,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAgBxC;AAED,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,MAAM,GACb,iBAAiB,GAAG,SAAS,CAa/B"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Reads whether a Studio window is focused or minimized. The plugin API
|
|
3
|
+
* cannot see either, so this asks the OS about the process the session's
|
|
4
|
+
* place is showing in.
|
|
5
|
+
*/
|
|
6
|
+
import { execa } from 'execa';
|
|
7
|
+
const WINDOW_STATE_SCRIPT = `
|
|
8
|
+
Add-Type -Namespace StudioBridge -Name User32 -MemberDefinition @'
|
|
9
|
+
[DllImport("user32.dll")] public static extern bool IsIconic(IntPtr hWnd);
|
|
10
|
+
[DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow();
|
|
11
|
+
[DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint processId);
|
|
12
|
+
'@
|
|
13
|
+
$process = Get-Process -Id $args[0] -ErrorAction Stop
|
|
14
|
+
$foregroundPid = [uint32]0
|
|
15
|
+
[void][StudioBridge.User32]::GetWindowThreadProcessId([StudioBridge.User32]::GetForegroundWindow(), [ref]$foregroundPid)
|
|
16
|
+
@{
|
|
17
|
+
minimized = [StudioBridge.User32]::IsIconic($process.MainWindowHandle)
|
|
18
|
+
focused = ($foregroundPid -eq $process.Id)
|
|
19
|
+
} | ConvertTo-Json -Compress
|
|
20
|
+
`;
|
|
21
|
+
/** Undefined where the OS gives no answer, including outside Windows. */
|
|
22
|
+
export async function tryGetStudioWindowStateAsync(pid) {
|
|
23
|
+
if (process.platform !== 'win32')
|
|
24
|
+
return undefined;
|
|
25
|
+
const { stdout, failed } = await execa('powershell.exe', [
|
|
26
|
+
'-NoProfile',
|
|
27
|
+
'-NonInteractive',
|
|
28
|
+
'-Command',
|
|
29
|
+
`& { ${WINDOW_STATE_SCRIPT} } ${pid}`,
|
|
30
|
+
], { reject: false });
|
|
31
|
+
if (failed)
|
|
32
|
+
return undefined;
|
|
33
|
+
return parseWindowState(stdout);
|
|
34
|
+
}
|
|
35
|
+
export function parseWindowState(stdout) {
|
|
36
|
+
try {
|
|
37
|
+
const parsed = JSON.parse(stdout.trim());
|
|
38
|
+
if (typeof parsed.focused !== 'boolean' ||
|
|
39
|
+
typeof parsed.minimized !== 'boolean') {
|
|
40
|
+
return undefined;
|
|
41
|
+
}
|
|
42
|
+
return { focused: parsed.focused, minimized: parsed.minimized };
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
return undefined;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=studio-window-state.js.map
|