@quenty/studio-bridge 0.21.0 → 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 +12 -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/linux/linux-studio-launcher.d.ts.map +1 -1
- package/dist/src/linux/linux-studio-launcher.js +10 -0
- package/dist/src/linux/linux-studio-launcher.js.map +1 -1
- package/dist/src/linux/linux-studio-launcher.test.d.ts +2 -0
- package/dist/src/linux/linux-studio-launcher.test.d.ts.map +1 -0
- package/dist/src/linux/linux-studio-launcher.test.js +68 -0
- package/dist/src/linux/linux-studio-launcher.test.js.map +1 -0
- 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/linux/linux-studio-launcher.test.ts +89 -0
- package/src/linux/linux-studio-launcher.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
|
@@ -5,18 +5,70 @@
|
|
|
5
5
|
import { defineCommand } from '../../framework/define-command.js';
|
|
6
6
|
import { arg } from '../../framework/arg-builder.js';
|
|
7
7
|
import { OutputHelper } from '@quenty/cli-output-helpers';
|
|
8
|
+
const DURATION_UNITS_SEC = {
|
|
9
|
+
s: 1,
|
|
10
|
+
m: 60,
|
|
11
|
+
h: 3600,
|
|
12
|
+
d: 86400,
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The time `--since` names, in epoch seconds: a duration back from `nowMs`
|
|
16
|
+
* (`30s`, `5m`, `2h`, `1d`) or a date (`2026-10-27T18:00:00`).
|
|
17
|
+
*/
|
|
18
|
+
export function parseSince(value, nowMs = Date.now()) {
|
|
19
|
+
const duration = /^(\d+(?:\.\d+)?)([smhd])$/.exec(value.trim());
|
|
20
|
+
if (duration) {
|
|
21
|
+
return nowMs / 1000 - Number(duration[1]) * DURATION_UNITS_SEC[duration[2]];
|
|
22
|
+
}
|
|
23
|
+
const dateMs = Date.parse(value);
|
|
24
|
+
if (Number.isNaN(dateMs)) {
|
|
25
|
+
throw new Error(`Can't read --since '${value}'. Use a duration like 30s, 5m, 2h or 1d, or a date.`);
|
|
26
|
+
}
|
|
27
|
+
return dateMs / 1000;
|
|
28
|
+
}
|
|
29
|
+
const PLAYTEST_START_SCRIPT = 'return DateTime.now().UnixTimestampMillis / 1000 - time()';
|
|
30
|
+
/** The server's DataModel starts running a moment after Edit starts the playtest. */
|
|
31
|
+
const PLAYTEST_START_SLACK_SEC = 2;
|
|
32
|
+
/**
|
|
33
|
+
* The `--since-restart` cutoff for `session`, in epoch seconds: none for a
|
|
34
|
+
* playtest's own session, whose log began with the playtest, and otherwise a
|
|
35
|
+
* little before the running playtest's server started.
|
|
36
|
+
*/
|
|
37
|
+
export async function getSinceRestartCutoffAsync(connection, session) {
|
|
38
|
+
if (session.info.context !== 'edit') {
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
const server = connection
|
|
42
|
+
.listSessions()
|
|
43
|
+
.find((info) => info.instanceId === session.info.instanceId && info.context === 'server');
|
|
44
|
+
const serverSession = server && connection.getSession(server.sessionId);
|
|
45
|
+
if (!serverSession) {
|
|
46
|
+
throw new Error(`--since-restart needs a running playtest, and '${session.info.instanceId}' has none. Use --since to read back to a time instead.`);
|
|
47
|
+
}
|
|
48
|
+
const result = await serverSession.execAsync(PLAYTEST_START_SCRIPT, 10_000);
|
|
49
|
+
const startedAt = result.returnValues?.[0];
|
|
50
|
+
if (!result.success || typeof startedAt !== 'number') {
|
|
51
|
+
throw new Error(`Could not read when the playtest started: ${result.error ?? 'no time returned'}`);
|
|
52
|
+
}
|
|
53
|
+
return startedAt - PLAYTEST_START_SLACK_SEC;
|
|
54
|
+
}
|
|
8
55
|
export async function queryLogsHandlerAsync(session, options = {}) {
|
|
9
56
|
const result = await session.queryLogsAsync({
|
|
10
57
|
count: options.count ?? 50,
|
|
11
58
|
direction: options.direction ?? 'tail',
|
|
12
59
|
levels: options.levels,
|
|
13
60
|
includeInternal: options.includeInternal,
|
|
61
|
+
since: options.since,
|
|
62
|
+
groupRepeats: options.groupRepeats !== false,
|
|
14
63
|
});
|
|
64
|
+
const entries = result.entries ?? [];
|
|
65
|
+
const shown = entries.reduce((sum, e) => sum + (e.repeats ?? 1), 0);
|
|
15
66
|
return {
|
|
16
|
-
entries
|
|
67
|
+
entries,
|
|
17
68
|
total: result.total ?? 0,
|
|
18
69
|
bufferCapacity: result.bufferCapacity ?? 0,
|
|
19
|
-
|
|
70
|
+
since: options.since,
|
|
71
|
+
summary: `${shown} entries (${result.total ?? 0} in buffer)`,
|
|
20
72
|
};
|
|
21
73
|
}
|
|
22
74
|
function colorizeLevel(level) {
|
|
@@ -33,11 +85,13 @@ export function formatLogsText(result) {
|
|
|
33
85
|
if (result.entries.length === 0)
|
|
34
86
|
return result.summary;
|
|
35
87
|
const lines = result.entries.map((e) => {
|
|
36
|
-
const ts = OutputHelper.formatDim(new Date(e.timestamp).toLocaleTimeString());
|
|
88
|
+
const ts = OutputHelper.formatDim(new Date(e.timestamp * 1000).toLocaleTimeString());
|
|
37
89
|
const level = colorizeLevel(e.level);
|
|
38
|
-
|
|
90
|
+
const repeats = e.repeats ? OutputHelper.formatDim(` (x${e.repeats})`) : '';
|
|
91
|
+
return `[${ts}] [${level}] ${e.body}${repeats}`;
|
|
39
92
|
});
|
|
40
|
-
|
|
93
|
+
const shown = result.entries.reduce((sum, e) => sum + (e.repeats ?? 1), 0);
|
|
94
|
+
lines.push(OutputHelper.formatDim(`(${shown} shown, ${result.total} in buffer)`));
|
|
41
95
|
return lines.join('\n');
|
|
42
96
|
}
|
|
43
97
|
export const logsCommand = defineCommand({
|
|
@@ -58,22 +112,43 @@ export const logsCommand = defineCommand({
|
|
|
58
112
|
choices: ['head', 'tail'],
|
|
59
113
|
}),
|
|
60
114
|
levels: arg.option({
|
|
61
|
-
description: 'Filter by output level
|
|
115
|
+
description: 'Filter by output level',
|
|
62
116
|
array: true,
|
|
117
|
+
choices: ['Print', 'Info', 'Warning', 'Error'],
|
|
63
118
|
}),
|
|
64
119
|
includeInternal: arg.flag({
|
|
65
120
|
description: 'Include internal/system log messages',
|
|
66
121
|
}),
|
|
122
|
+
since: arg.option({
|
|
123
|
+
description: 'Only entries logged since a duration ago (30s, 5m, 2h, 1d) or a date',
|
|
124
|
+
}),
|
|
125
|
+
sinceRestart: arg.flag({
|
|
126
|
+
description: 'Only entries logged since the running playtest started',
|
|
127
|
+
}),
|
|
128
|
+
groupRepeats: arg.flag({
|
|
129
|
+
description: 'Collapse identical consecutive entries into one with a repeat count (--no-group-repeats to keep them)',
|
|
130
|
+
default: true,
|
|
131
|
+
}),
|
|
67
132
|
},
|
|
68
133
|
cli: {
|
|
69
134
|
format: formatLogsText,
|
|
70
135
|
},
|
|
71
|
-
handler: async (session, args) => {
|
|
136
|
+
handler: async (session, args, connection) => {
|
|
137
|
+
if (args.since && args.sinceRestart) {
|
|
138
|
+
throw new Error('Use either --since or --since-restart, not both');
|
|
139
|
+
}
|
|
140
|
+
const since = args.sinceRestart
|
|
141
|
+
? await getSinceRestartCutoffAsync(connection, session)
|
|
142
|
+
: args.since
|
|
143
|
+
? parseSince(args.since)
|
|
144
|
+
: undefined;
|
|
72
145
|
return queryLogsHandlerAsync(session, {
|
|
73
146
|
count: args.count,
|
|
74
147
|
direction: args.direction,
|
|
75
148
|
levels: args.levels,
|
|
76
149
|
includeInternal: args.includeInternal,
|
|
150
|
+
since,
|
|
151
|
+
groupRepeats: args.groupRepeats,
|
|
77
152
|
});
|
|
78
153
|
},
|
|
79
154
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../../../src/commands/console/logs/logs.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"logs.js","sourceRoot":"","sources":["../../../../../src/commands/console/logs/logs.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* Unit tests for the logs command handler.
|
|
3
3
|
*/
|
|
4
4
|
import { describe, it, expect, vi } from 'vitest';
|
|
5
|
-
import { queryLogsHandlerAsync } from './logs.js';
|
|
5
|
+
import { formatLogsText, parseSince, queryLogsHandlerAsync } from './logs.js';
|
|
6
6
|
function createMockSession(logsResult) {
|
|
7
7
|
return {
|
|
8
8
|
queryLogsAsync: vi.fn().mockResolvedValue(logsResult),
|
|
@@ -22,7 +22,7 @@ describe('queryLogsHandlerAsync', () => {
|
|
|
22
22
|
expect(result.entries).toHaveLength(2);
|
|
23
23
|
expect(result.total).toBe(42);
|
|
24
24
|
expect(result.bufferCapacity).toBe(1000);
|
|
25
|
-
expect(result.summary).toBe('2 entries (42
|
|
25
|
+
expect(result.summary).toBe('2 entries (42 in buffer)');
|
|
26
26
|
});
|
|
27
27
|
it('passes default options to session', async () => {
|
|
28
28
|
const session = createMockSession({
|
|
@@ -36,6 +36,8 @@ describe('queryLogsHandlerAsync', () => {
|
|
|
36
36
|
direction: 'tail',
|
|
37
37
|
levels: undefined,
|
|
38
38
|
includeInternal: undefined,
|
|
39
|
+
since: undefined,
|
|
40
|
+
groupRepeats: true,
|
|
39
41
|
});
|
|
40
42
|
});
|
|
41
43
|
it('passes custom options to session', async () => {
|
|
@@ -49,12 +51,15 @@ describe('queryLogsHandlerAsync', () => {
|
|
|
49
51
|
direction: 'head',
|
|
50
52
|
levels: ['Error', 'Warning'],
|
|
51
53
|
includeInternal: true,
|
|
54
|
+
since: 1793125630,
|
|
52
55
|
});
|
|
53
56
|
expect(session.queryLogsAsync).toHaveBeenCalledWith({
|
|
54
57
|
count: 100,
|
|
55
58
|
direction: 'head',
|
|
56
59
|
levels: ['Error', 'Warning'],
|
|
57
60
|
includeInternal: true,
|
|
61
|
+
since: 1793125630,
|
|
62
|
+
groupRepeats: true,
|
|
58
63
|
});
|
|
59
64
|
});
|
|
60
65
|
it('handles empty entries', async () => {
|
|
@@ -66,7 +71,7 @@ describe('queryLogsHandlerAsync', () => {
|
|
|
66
71
|
const result = await queryLogsHandlerAsync(session);
|
|
67
72
|
expect(result.entries).toEqual([]);
|
|
68
73
|
expect(result.total).toBe(0);
|
|
69
|
-
expect(result.summary).toBe('0 entries (0
|
|
74
|
+
expect(result.summary).toBe('0 entries (0 in buffer)');
|
|
70
75
|
});
|
|
71
76
|
it('handles entries with all log levels', async () => {
|
|
72
77
|
const entries = [
|
|
@@ -105,7 +110,61 @@ describe('queryLogsHandlerAsync', () => {
|
|
|
105
110
|
expect(result.entries).toEqual([]);
|
|
106
111
|
expect(result.total).toBe(0);
|
|
107
112
|
expect(result.bufferCapacity).toBe(0);
|
|
108
|
-
expect(result.summary).toBe('0 entries (0
|
|
113
|
+
expect(result.summary).toBe('0 entries (0 in buffer)');
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
describe('parseSince', () => {
|
|
117
|
+
const now = Date.parse('2026-10-27T18:00:00Z');
|
|
118
|
+
it('reads a duration back from now', () => {
|
|
119
|
+
expect(parseSince('30s', now)).toBe(now / 1000 - 30);
|
|
120
|
+
expect(parseSince('5m', now)).toBe(now / 1000 - 300);
|
|
121
|
+
expect(parseSince('2h', now)).toBe(now / 1000 - 7200);
|
|
122
|
+
});
|
|
123
|
+
it('reads a date', () => {
|
|
124
|
+
expect(parseSince('2026-10-27T17:00:00Z', now)).toBe(now / 1000 - 3600);
|
|
125
|
+
});
|
|
126
|
+
it('refuses anything else', () => {
|
|
127
|
+
expect(() => parseSince('yesterday', now)).toThrow(/Can't read --since/);
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
describe('repeat grouping', () => {
|
|
131
|
+
it('is asked of the plugin unless turned off', async () => {
|
|
132
|
+
const session = createMockSession({
|
|
133
|
+
entries: [],
|
|
134
|
+
total: 0,
|
|
135
|
+
bufferCapacity: 1000,
|
|
136
|
+
});
|
|
137
|
+
await queryLogsHandlerAsync(session);
|
|
138
|
+
await queryLogsHandlerAsync(session, { groupRepeats: false });
|
|
139
|
+
expect(session.queryLogsAsync.mock.calls[0][0].groupRepeats).toBe(true);
|
|
140
|
+
expect(session.queryLogsAsync.mock.calls[1][0].groupRepeats).toBe(false);
|
|
141
|
+
});
|
|
142
|
+
it('counts each repeat in the summary', async () => {
|
|
143
|
+
const session = createMockSession({
|
|
144
|
+
entries: [
|
|
145
|
+
{ level: 'Print', body: 'tick', timestamp: 1, repeats: 3 },
|
|
146
|
+
{ level: 'Print', body: 'done', timestamp: 4 },
|
|
147
|
+
],
|
|
148
|
+
total: 4,
|
|
149
|
+
bufferCapacity: 1000,
|
|
150
|
+
});
|
|
151
|
+
expect((await queryLogsHandlerAsync(session)).summary).toBe('4 entries (4 in buffer)');
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('formatLogsText', () => {
|
|
155
|
+
it('shows the repeat count and counts every repeat as shown', () => {
|
|
156
|
+
const text = formatLogsText({
|
|
157
|
+
entries: [
|
|
158
|
+
{ level: 'Print', body: 'tick', timestamp: 1793125630, repeats: 3 },
|
|
159
|
+
],
|
|
160
|
+
total: 3,
|
|
161
|
+
bufferCapacity: 1000,
|
|
162
|
+
summary: '3 entries (3 in buffer)',
|
|
163
|
+
});
|
|
164
|
+
expect(text).toContain('tick');
|
|
165
|
+
expect(text).toContain('(x3)');
|
|
166
|
+
expect(text).toContain('(3 shown, 3 in buffer)');
|
|
167
|
+
expect(text).toContain(new Date(1793125630 * 1000).toLocaleTimeString());
|
|
109
168
|
});
|
|
110
169
|
});
|
|
111
170
|
//# sourceMappingURL=logs.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../../../../src/commands/console/logs/logs.test.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"logs.test.js","sourceRoot":"","sources":["../../../../../src/commands/console/logs/logs.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `explorer export` — serialize instances from a connected Studio session
|
|
3
|
+
* into a binary model (.rbxm).
|
|
4
|
+
*/
|
|
5
|
+
import type { BridgeSession } from '../../../bridge/index.js';
|
|
6
|
+
export interface ExportResult {
|
|
7
|
+
/** The binary model (.rbxm), base64-encoded. */
|
|
8
|
+
data: string;
|
|
9
|
+
paths: string[];
|
|
10
|
+
bytes: number;
|
|
11
|
+
summary: string;
|
|
12
|
+
}
|
|
13
|
+
interface ExportArgs {
|
|
14
|
+
paths: string[];
|
|
15
|
+
}
|
|
16
|
+
export declare function exportInstancesHandlerAsync(session: BridgeSession, paths: string[]): Promise<ExportResult>;
|
|
17
|
+
export declare const exportCommand: import("../../framework/define-command.js").CommandDefinition<ExportArgs, ExportResult>;
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=export.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../../../src/commands/explorer/export/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,gDAAgD;IAChD,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,UAAU,UAAU;IAClB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAED,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,aAAa,EACtB,KAAK,EAAE,MAAM,EAAE,GACd,OAAO,CAAC,YAAY,CAAC,CAYvB;AAED,eAAO,MAAM,aAAa,yFAqBxB,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `explorer export` — serialize instances from a connected Studio session
|
|
3
|
+
* into a binary model (.rbxm).
|
|
4
|
+
*/
|
|
5
|
+
import { defineCommand } from '../../framework/define-command.js';
|
|
6
|
+
import { arg } from '../../framework/arg-builder.js';
|
|
7
|
+
export async function exportInstancesHandlerAsync(session, paths) {
|
|
8
|
+
const result = await session.exportInstancesAsync(paths);
|
|
9
|
+
const bytes = Buffer.from(result.data, 'base64').length;
|
|
10
|
+
return {
|
|
11
|
+
data: result.data,
|
|
12
|
+
paths: result.paths,
|
|
13
|
+
bytes,
|
|
14
|
+
summary: `Exported ${result.paths.length} instance(s) (${bytes} bytes): ${result.paths.join(', ')}`,
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
export const exportCommand = defineCommand({
|
|
18
|
+
group: 'explorer',
|
|
19
|
+
name: 'export',
|
|
20
|
+
description: 'Save instances from Studio as a binary model (.rbxm). Use -o to write the file.',
|
|
21
|
+
category: 'execution',
|
|
22
|
+
safety: 'read',
|
|
23
|
+
scope: 'session',
|
|
24
|
+
args: {
|
|
25
|
+
paths: arg.positional({
|
|
26
|
+
description: 'Dot-separated instance paths (e.g. Workspace.Map)',
|
|
27
|
+
required: true,
|
|
28
|
+
array: true,
|
|
29
|
+
}),
|
|
30
|
+
},
|
|
31
|
+
cli: {
|
|
32
|
+
binaryField: 'data',
|
|
33
|
+
format: (result) => result.summary,
|
|
34
|
+
},
|
|
35
|
+
handler: async (session, args) => exportInstancesHandlerAsync(session, args.paths),
|
|
36
|
+
});
|
|
37
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../../../../src/commands/explorer/export/export.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,mCAAmC,CAAC;AAClE,OAAO,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAerD,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,OAAsB,EACtB,KAAe;IAEf,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;IAExD,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,KAAK;QACL,OAAO,EAAE,YACP,MAAM,CAAC,KAAK,CAAC,MACf,iBAAiB,KAAK,YAAY,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;KAC5D,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,aAAa,GAAG,aAAa,CAA2B;IACnE,KAAK,EAAE,UAAU;IACjB,IAAI,EAAE,QAAQ;IACd,WAAW,EACT,iFAAiF;IACnF,QAAQ,EAAE,WAAW;IACrB,MAAM,EAAE,MAAM;IACd,KAAK,EAAE,SAAS;IAChB,IAAI,EAAE;QACJ,KAAK,EAAE,GAAG,CAAC,UAAU,CAAC;YACpB,WAAW,EAAE,mDAAmD;YAChE,QAAQ,EAAE,IAAI;YACd,KAAK,EAAE,IAAI;SACZ,CAAC;KACH;IACD,GAAG,EAAE;QACH,WAAW,EAAE,MAAM;QACnB,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO;KACnC;IACD,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAC/B,2BAA2B,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC;CACnD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.test.d.ts","sourceRoot":"","sources":["../../../../../src/commands/explorer/export/export.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { exportInstancesHandlerAsync } from './export.js';
|
|
3
|
+
describe('exportInstancesHandlerAsync', () => {
|
|
4
|
+
it('returns the model with its size and the exported paths', async () => {
|
|
5
|
+
const data = Buffer.from('<roblox!model').toString('base64');
|
|
6
|
+
const session = {
|
|
7
|
+
exportInstancesAsync: vi
|
|
8
|
+
.fn()
|
|
9
|
+
.mockResolvedValue({ data, paths: ['Workspace.Map'] }),
|
|
10
|
+
};
|
|
11
|
+
const result = await exportInstancesHandlerAsync(session, [
|
|
12
|
+
'Workspace.Map',
|
|
13
|
+
]);
|
|
14
|
+
expect(session.exportInstancesAsync).toHaveBeenCalledWith([
|
|
15
|
+
'Workspace.Map',
|
|
16
|
+
]);
|
|
17
|
+
expect(result).toEqual({
|
|
18
|
+
data,
|
|
19
|
+
paths: ['Workspace.Map'],
|
|
20
|
+
bytes: 13,
|
|
21
|
+
summary: 'Exported 1 instance(s) (13 bytes): Workspace.Map',
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=export.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.test.js","sourceRoot":"","sources":["../../../../../src/commands/explorer/export/export.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AAE1D,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG;YACd,oBAAoB,EAAE,EAAE;iBACrB,EAAE,EAAE;iBACJ,iBAAiB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC;SAClD,CAAC;QAET,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,OAAO,EAAE;YACxD,eAAe;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC;YACxD,eAAe;SAChB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC;YACrB,IAAI;YACJ,KAAK,EAAE,CAAC,eAAe,CAAC;YACxB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE,kDAAkD;SAC5D,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `explorer find` — search the DataModel for instances by name, class and tag.
|
|
3
|
+
*/
|
|
4
|
+
import type { BridgeSession } from '../../../bridge/index.js';
|
|
5
|
+
import type { FoundInstance } from '../../../server/web-socket-protocol.js';
|
|
6
|
+
export interface FindOptions {
|
|
7
|
+
name?: string;
|
|
8
|
+
exact?: boolean;
|
|
9
|
+
className?: string;
|
|
10
|
+
tag?: string;
|
|
11
|
+
root?: string;
|
|
12
|
+
limit?: number;
|
|
13
|
+
}
|
|
14
|
+
export interface FindResult {
|
|
15
|
+
instances: FoundInstance[];
|
|
16
|
+
searched: number;
|
|
17
|
+
/** True when the search stopped at --limit; there may be more. */
|
|
18
|
+
truncated: boolean;
|
|
19
|
+
summary: string;
|
|
20
|
+
}
|
|
21
|
+
export declare function findInstancesHandlerAsync(session: BridgeSession, options: FindOptions): Promise<FindResult>;
|
|
22
|
+
export declare function formatFindText(result: FindResult): string;
|
|
23
|
+
interface FindArgs extends Omit<FindOptions, 'className'> {
|
|
24
|
+
class?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare const findCommand: import("../../framework/define-command.js").CommandDefinition<FindArgs, FindResult>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=find.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.d.ts","sourceRoot":"","sources":["../../../../../src/commands/explorer/find/find.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,wCAAwC,CAAC;AAE5E,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAoBrB;AAWD,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAKzD;AAED,UAAU,QAAS,SAAQ,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC;IACvD,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,eAAO,MAAM,WAAW,qFAoCtB,CAAC"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `explorer find` — search the DataModel for instances by name, class and tag.
|
|
3
|
+
*/
|
|
4
|
+
import { OutputHelper } from '@quenty/cli-output-helpers';
|
|
5
|
+
import { formatTable, } from '@quenty/cli-output-helpers/reporting';
|
|
6
|
+
import { defineCommand } from '../../framework/define-command.js';
|
|
7
|
+
import { arg } from '../../framework/arg-builder.js';
|
|
8
|
+
export async function findInstancesHandlerAsync(session, options) {
|
|
9
|
+
if (!options.name && !options.className && !options.tag) {
|
|
10
|
+
throw new Error('Give a name, --class or --tag to search for');
|
|
11
|
+
}
|
|
12
|
+
const result = await session.findInstancesAsync({
|
|
13
|
+
root: options.root,
|
|
14
|
+
name: options.name,
|
|
15
|
+
exactName: options.exact,
|
|
16
|
+
className: options.className,
|
|
17
|
+
tag: options.tag,
|
|
18
|
+
limit: options.limit,
|
|
19
|
+
});
|
|
20
|
+
return {
|
|
21
|
+
...result,
|
|
22
|
+
summary: result.truncated
|
|
23
|
+
? `First ${result.instances.length} matches; raise --limit to see more`
|
|
24
|
+
: `${result.instances.length} match(es) among ${result.searched} instances`,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
const columns = [
|
|
28
|
+
{
|
|
29
|
+
header: 'Path',
|
|
30
|
+
value: (i) => i.path,
|
|
31
|
+
format: (v) => OutputHelper.formatHint(v),
|
|
32
|
+
},
|
|
33
|
+
{ header: 'Class', value: (i) => i.className },
|
|
34
|
+
];
|
|
35
|
+
export function formatFindText(result) {
|
|
36
|
+
if (result.instances.length === 0)
|
|
37
|
+
return 'No instances match';
|
|
38
|
+
return `${formatTable(result.instances, columns)}\n${OutputHelper.formatDim(result.summary)}`;
|
|
39
|
+
}
|
|
40
|
+
export const findCommand = defineCommand({
|
|
41
|
+
group: 'explorer',
|
|
42
|
+
name: 'find',
|
|
43
|
+
description: 'Find instances by name, class or tag',
|
|
44
|
+
category: 'execution',
|
|
45
|
+
safety: 'read',
|
|
46
|
+
scope: 'session',
|
|
47
|
+
args: {
|
|
48
|
+
name: arg.positional({
|
|
49
|
+
description: 'Text in the instance name (case-insensitive)',
|
|
50
|
+
required: false,
|
|
51
|
+
}),
|
|
52
|
+
exact: arg.flag({
|
|
53
|
+
description: 'Match the whole name instead of part of it',
|
|
54
|
+
}),
|
|
55
|
+
class: arg.option({
|
|
56
|
+
description: 'Only instances of this class or a subclass (IsA)',
|
|
57
|
+
}),
|
|
58
|
+
tag: arg.option({
|
|
59
|
+
description: 'Only instances with this CollectionService tag',
|
|
60
|
+
}),
|
|
61
|
+
root: arg.option({
|
|
62
|
+
description: 'Dot-separated path to search under (default: the whole DataModel)',
|
|
63
|
+
}),
|
|
64
|
+
limit: arg.option({
|
|
65
|
+
description: 'Stop after this many matches (default: 200)',
|
|
66
|
+
type: 'number',
|
|
67
|
+
alias: 'n',
|
|
68
|
+
}),
|
|
69
|
+
},
|
|
70
|
+
cli: {
|
|
71
|
+
format: formatFindText,
|
|
72
|
+
},
|
|
73
|
+
handler: async (session, { class: className, ...args }) => findInstancesHandlerAsync(session, { ...args, className }),
|
|
74
|
+
});
|
|
75
|
+
//# sourceMappingURL=find.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.js","sourceRoot":"","sources":["../../../../../src/commands/explorer/find/find.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.test.d.ts","sourceRoot":"","sources":["../../../../../src/commands/explorer/find/find.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { describe, it, expect, vi } from 'vitest';
|
|
2
|
+
import { findInstancesHandlerAsync, formatFindText } from './find.js';
|
|
3
|
+
function createSession(result) {
|
|
4
|
+
return { findInstancesAsync: vi.fn().mockResolvedValue(result) };
|
|
5
|
+
}
|
|
6
|
+
describe('findInstancesHandlerAsync', () => {
|
|
7
|
+
it('passes the search through and summarizes it', async () => {
|
|
8
|
+
const session = createSession({
|
|
9
|
+
instances: [
|
|
10
|
+
{ path: 'Workspace.RedSpawn', name: 'RedSpawn', className: 'Part' },
|
|
11
|
+
],
|
|
12
|
+
searched: 120,
|
|
13
|
+
truncated: false,
|
|
14
|
+
});
|
|
15
|
+
const result = await findInstancesHandlerAsync(session, {
|
|
16
|
+
name: 'spawn',
|
|
17
|
+
className: 'BasePart',
|
|
18
|
+
exact: true,
|
|
19
|
+
});
|
|
20
|
+
expect(session.findInstancesAsync).toHaveBeenCalledWith({
|
|
21
|
+
name: 'spawn',
|
|
22
|
+
className: 'BasePart',
|
|
23
|
+
exactName: true,
|
|
24
|
+
root: undefined,
|
|
25
|
+
tag: undefined,
|
|
26
|
+
limit: undefined,
|
|
27
|
+
});
|
|
28
|
+
expect(result.summary).toBe('1 match(es) among 120 instances');
|
|
29
|
+
expect(formatFindText(result)).toContain('Workspace.RedSpawn');
|
|
30
|
+
});
|
|
31
|
+
it('says when it stopped at the limit', async () => {
|
|
32
|
+
const session = createSession({
|
|
33
|
+
instances: [{ path: 'Workspace.A', name: 'A', className: 'Part' }],
|
|
34
|
+
searched: 10,
|
|
35
|
+
truncated: true,
|
|
36
|
+
});
|
|
37
|
+
const result = await findInstancesHandlerAsync(session, { tag: 'Spawn' });
|
|
38
|
+
expect(result.summary).toBe('First 1 matches; raise --limit to see more');
|
|
39
|
+
});
|
|
40
|
+
it('needs something to search for', async () => {
|
|
41
|
+
await expect(findInstancesHandlerAsync(createSession({}), {})).rejects.toThrow('Give a name, --class or --tag to search for');
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
//# sourceMappingURL=find.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"find.test.js","sourceRoot":"","sources":["../../../../../src/commands/explorer/find/find.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,EAAE,yBAAyB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAEtE,SAAS,aAAa,CAAC,MAAe;IACpC,OAAO,EAAE,kBAAkB,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,MAAM,CAAC,EAAS,CAAC;AAC1E,CAAC;AAED,QAAQ,CAAC,2BAA2B,EAAE,GAAG,EAAE;IACzC,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,OAAO,GAAG,aAAa,CAAC;YAC5B,SAAS,EAAE;gBACT,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE;aACpE;YACD,QAAQ,EAAE,GAAG;YACb,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,OAAO,EAAE;YACtD,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,UAAU;YACrB,KAAK,EAAE,IAAI;SACZ,CAAC,CAAC;QAEH,MAAM,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,oBAAoB,CAAC;YACtD,IAAI,EAAE,OAAO;YACb,SAAS,EAAE,UAAU;YACrB,SAAS,EAAE,IAAI;YACf,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,SAAS;YACd,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,iCAAiC,CAAC,CAAC;QAC/D,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,oBAAoB,CAAC,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,mCAAmC,EAAE,KAAK,IAAI,EAAE;QACjD,MAAM,OAAO,GAAG,aAAa,CAAC;YAC5B,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC;YAClE,QAAQ,EAAE,EAAE;YACZ,SAAS,EAAE,IAAI;SAChB,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,MAAM,yBAAyB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC,CAAC;QAE1E,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;IAC5E,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;QAC7C,MAAM,MAAM,CACV,yBAAyB,CAAC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACjD,CAAC,OAAO,CAAC,OAAO,CAAC,6CAA6C,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `explorer grep` — search the source of every script in Studio.
|
|
3
|
+
*/
|
|
4
|
+
import type { BridgeSession } from '../../../bridge/index.js';
|
|
5
|
+
import type { GrepMatch } from '../../../server/web-socket-protocol.js';
|
|
6
|
+
export interface GrepOptions {
|
|
7
|
+
pattern: string;
|
|
8
|
+
root?: string;
|
|
9
|
+
luaPattern?: boolean;
|
|
10
|
+
caseSensitive?: boolean;
|
|
11
|
+
limit?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface GrepResult {
|
|
14
|
+
matches: GrepMatch[];
|
|
15
|
+
searched: number;
|
|
16
|
+
/** True when the search stopped at --limit; there may be more. */
|
|
17
|
+
truncated: boolean;
|
|
18
|
+
summary: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function grepScriptsHandlerAsync(session: BridgeSession, options: GrepOptions): Promise<GrepResult>;
|
|
21
|
+
/** `path:line: text`, like grep. */
|
|
22
|
+
export declare function formatGrepText(result: GrepResult): string;
|
|
23
|
+
export declare const grepCommand: import("../../framework/define-command.js").CommandDefinition<GrepOptions, GrepResult>;
|
|
24
|
+
//# sourceMappingURL=grep.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"grep.d.ts","sourceRoot":"","sources":["../../../../../src/commands/explorer/grep/grep.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAC9D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wCAAwC,CAAC;AAExE,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IACjB,kEAAkE;IAClE,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,UAAU,CAAC,CAgBrB;AAED,oCAAoC;AACpC,wBAAgB,cAAc,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAUzD;AAED,eAAO,MAAM,WAAW,wFAgCtB,CAAC"}
|