@tui-sandbox/library 10.3.0 → 10.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (98) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/browser/assets/index-CO9qJUD3.js +9 -0
  3. package/dist/browser/index.html +1 -1
  4. package/dist/src/browser/neovim-client.d.ts +2 -2
  5. package/dist/src/browser/neovim-client.js.map +1 -1
  6. package/dist/src/client/neovim-terminal-client.d.ts +1 -1
  7. package/dist/src/client/neovim-terminal-client.js.map +1 -1
  8. package/dist/src/client/terminal-terminal-client.d.ts +1 -1
  9. package/dist/src/client/websocket-client.js +1 -1
  10. package/dist/src/client/websocket-client.js.map +1 -1
  11. package/dist/src/scripts/tui.js +3 -3
  12. package/dist/src/scripts/tui.js.map +1 -1
  13. package/dist/src/server/{neovim → applications/neovim}/NeovimApplication.d.ts +3 -3
  14. package/dist/src/server/{neovim → applications/neovim}/NeovimApplication.js +2 -2
  15. package/dist/src/server/applications/neovim/NeovimApplication.js.map +1 -0
  16. package/dist/src/server/{neovim → applications/neovim}/NeovimJavascriptApiClient.d.ts +1 -1
  17. package/dist/src/server/{neovim → applications/neovim}/NeovimJavascriptApiClient.js +20 -2
  18. package/dist/src/server/applications/neovim/NeovimJavascriptApiClient.js.map +1 -0
  19. package/dist/src/server/{neovim → applications/neovim}/NeovimJavascriptApiClient.test.js +6 -1
  20. package/dist/src/server/applications/neovim/NeovimJavascriptApiClient.test.js.map +1 -0
  21. package/dist/src/server/{neovim/index.d.ts → applications/neovim/api.d.ts} +5 -5
  22. package/dist/src/server/{neovim/index.js → applications/neovim/api.js} +4 -4
  23. package/dist/src/server/applications/neovim/api.js.map +1 -0
  24. package/dist/src/server/{neovim → applications/neovim}/environment/createTempDir.d.ts +2 -2
  25. package/dist/src/server/{neovim → applications/neovim}/environment/createTempDir.js +2 -2
  26. package/dist/src/server/applications/neovim/environment/createTempDir.js.map +1 -0
  27. package/dist/src/server/applications/neovim/environment/createTempDir.test.js.map +1 -0
  28. package/dist/src/server/applications/neovim/neovimRouter.d.ts +134 -0
  29. package/dist/src/server/applications/neovim/neovimRouter.js +68 -0
  30. package/dist/src/server/applications/neovim/neovimRouter.js.map +1 -0
  31. package/dist/src/server/applications/neovim/prepareNewTestDirectory.d.ts +3 -0
  32. package/dist/src/server/applications/neovim/prepareNewTestDirectory.js.map +1 -0
  33. package/dist/src/server/applications/neovim/prepareNewTestDirectory.test.js.map +1 -0
  34. package/dist/src/server/{terminal → applications/terminal}/TerminalTestApplication.d.ts +2 -2
  35. package/dist/src/server/{terminal → applications/terminal}/TerminalTestApplication.js +2 -2
  36. package/dist/src/server/applications/terminal/TerminalTestApplication.js.map +1 -0
  37. package/dist/src/server/{terminal/index.d.ts → applications/terminal/api.d.ts} +4 -4
  38. package/dist/src/server/{terminal/index.js → applications/terminal/api.js} +3 -3
  39. package/dist/src/server/applications/terminal/api.js.map +1 -0
  40. package/dist/src/server/{terminal → applications/terminal}/runBlockingShellCommand.d.ts +2 -2
  41. package/dist/src/server/applications/terminal/runBlockingShellCommand.js.map +1 -0
  42. package/dist/src/server/applications/terminal/runBlockingShellCommand.test.js.map +1 -0
  43. package/dist/src/server/applications/terminal/terminalRouter.d.ts +62 -0
  44. package/dist/src/server/applications/terminal/terminalRouter.js +38 -0
  45. package/dist/src/server/applications/terminal/terminalRouter.js.map +1 -0
  46. package/dist/src/server/connection/trpc.d.ts +6 -28
  47. package/dist/src/server/cypress-support/contents.js +6 -6
  48. package/dist/src/server/server.d.ts +21 -37
  49. package/dist/src/server/server.js +4 -88
  50. package/dist/src/server/server.js.map +1 -1
  51. package/dist/src/server/types.d.ts +1 -1
  52. package/dist/tsconfig.tsbuildinfo +1 -1
  53. package/package.json +10 -9
  54. package/src/browser/neovim-client.ts +6 -2
  55. package/src/client/neovim-terminal-client.ts +6 -1
  56. package/src/client/terminal-terminal-client.ts +1 -1
  57. package/src/client/websocket-client.ts +1 -1
  58. package/src/scripts/tui.ts +4 -4
  59. package/src/server/{neovim → applications/neovim}/NeovimApplication.ts +4 -4
  60. package/src/server/{neovim → applications/neovim}/NeovimJavascriptApiClient.test.ts +6 -1
  61. package/src/server/{neovim → applications/neovim}/NeovimJavascriptApiClient.ts +21 -2
  62. package/src/server/{neovim/index.ts → applications/neovim/api.ts} +9 -9
  63. package/src/server/{neovim → applications/neovim}/environment/createTempDir.ts +4 -4
  64. package/src/server/applications/neovim/neovimRouter.ts +90 -0
  65. package/src/server/{neovim → applications/neovim}/prepareNewTestDirectory.ts +2 -2
  66. package/src/server/{terminal → applications/terminal}/TerminalTestApplication.ts +3 -3
  67. package/src/server/{terminal/index.ts → applications/terminal/api.ts} +6 -6
  68. package/src/server/{terminal → applications/terminal}/runBlockingShellCommand.ts +2 -2
  69. package/src/server/applications/terminal/terminalRouter.ts +50 -0
  70. package/src/server/cypress-support/contents.ts +6 -6
  71. package/src/server/server.ts +4 -119
  72. package/src/server/types.ts +1 -1
  73. package/dist/browser/assets/index-dlAbCuMv.js +0 -37
  74. package/dist/src/server/neovim/NeovimApplication.js.map +0 -1
  75. package/dist/src/server/neovim/NeovimJavascriptApiClient.js.map +0 -1
  76. package/dist/src/server/neovim/NeovimJavascriptApiClient.test.js.map +0 -1
  77. package/dist/src/server/neovim/environment/createTempDir.js.map +0 -1
  78. package/dist/src/server/neovim/environment/createTempDir.test.js.map +0 -1
  79. package/dist/src/server/neovim/index.js.map +0 -1
  80. package/dist/src/server/neovim/prepareNewTestDirectory.d.ts +0 -3
  81. package/dist/src/server/neovim/prepareNewTestDirectory.js.map +0 -1
  82. package/dist/src/server/neovim/prepareNewTestDirectory.test.js.map +0 -1
  83. package/dist/src/server/terminal/TerminalTestApplication.js.map +0 -1
  84. package/dist/src/server/terminal/index.js.map +0 -1
  85. package/dist/src/server/terminal/runBlockingShellCommand.js.map +0 -1
  86. package/dist/src/server/terminal/runBlockingShellCommand.test.js.map +0 -1
  87. /package/dist/src/server/{neovim → applications/neovim}/NeovimJavascriptApiClient.test.d.ts +0 -0
  88. /package/dist/src/server/{neovim → applications/neovim}/environment/createTempDir.test.d.ts +0 -0
  89. /package/dist/src/server/{neovim → applications/neovim}/environment/createTempDir.test.js +0 -0
  90. /package/dist/src/server/{neovim → applications/neovim}/prepareNewTestDirectory.js +0 -0
  91. /package/dist/src/server/{neovim → applications/neovim}/prepareNewTestDirectory.test.d.ts +0 -0
  92. /package/dist/src/server/{neovim → applications/neovim}/prepareNewTestDirectory.test.js +0 -0
  93. /package/dist/src/server/{terminal → applications/terminal}/runBlockingShellCommand.js +0 -0
  94. /package/dist/src/server/{terminal → applications/terminal}/runBlockingShellCommand.test.d.ts +0 -0
  95. /package/dist/src/server/{terminal → applications/terminal}/runBlockingShellCommand.test.js +0 -0
  96. /package/src/server/{neovim → applications/neovim}/environment/createTempDir.test.ts +0 -0
  97. /package/src/server/{neovim → applications/neovim}/prepareNewTestDirectory.test.ts +0 -0
  98. /package/src/server/{terminal → applications/terminal}/runBlockingShellCommand.test.ts +0 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tui-sandbox/library",
3
- "version": "10.3.0",
3
+ "version": "10.4.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/mikavilpas/tui-sandbox"
@@ -12,31 +12,32 @@
12
12
  },
13
13
  "dependencies": {
14
14
  "@catppuccin/palette": "1.7.1",
15
- "@trpc/client": "11.1.2",
16
- "@trpc/server": "11.1.2",
15
+ "@trpc/client": "11.4.1",
16
+ "@trpc/server": "11.4.1",
17
17
  "@xterm/addon-attach": "0.11.0",
18
18
  "@xterm/addon-fit": "0.10.0",
19
19
  "@xterm/xterm": "5.5.0",
20
20
  "command-exists": "1.2.9",
21
- "core-js": "3.42.0",
21
+ "core-js": "3.43.0",
22
22
  "cors": "2.8.5",
23
23
  "dree": "5.1.5",
24
24
  "express": "5.1.0",
25
25
  "neovim": "5.3.0",
26
26
  "node-pty": "1.0.0",
27
27
  "prettier": "3.5.3",
28
- "tsx": "4.19.4",
28
+ "tsx": "4.20.3",
29
29
  "type-fest": "4.41.0",
30
30
  "winston": "3.17.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/command-exists": "1.2.3",
34
- "@types/cors": "2.8.18",
35
- "@types/express": "5.0.1",
36
- "@types/node": "22.15.18",
34
+ "@types/cors": "2.8.19",
35
+ "@types/express": "5.0.3",
36
+ "@types/node": "24.0.1",
37
37
  "nodemon": "3.1.10",
38
38
  "vite": "6.3.5",
39
- "vitest": "3.1.3"
39
+ "vitest": "3.2.3",
40
+ "zod": "4.0.0-beta.20250505T195954"
40
41
  },
41
42
  "peerDependencies": {
42
43
  "cypress": "^13 || ^14",
@@ -1,8 +1,12 @@
1
1
  import { TerminalClient as NeovimTerminalClient } from "../client/index.js"
2
2
  import { TerminalTerminalClient } from "../client/terminal-terminal-client.js"
3
+ import type {
4
+ ExCommandClientInput,
5
+ LuaCodeClientInput,
6
+ PollLuaCodeClientInput,
7
+ } from "../server/applications/neovim/neovimRouter.js"
8
+ import type { StartTerminalGenericArguments } from "../server/applications/terminal/TerminalTestApplication.js"
3
9
  import type { BlockingCommandClientInput } from "../server/blockingCommandInputSchema.js"
4
- import type { ExCommandClientInput, LuaCodeClientInput, PollLuaCodeClientInput } from "../server/server.js"
5
- import type { StartTerminalGenericArguments } from "../server/terminal/TerminalTestApplication.js"
6
10
  import type {
7
11
  BlockingShellCommandOutput,
8
12
  RunExCommandOutput,
@@ -1,8 +1,13 @@
1
1
  import { createTRPCClient, httpBatchLink, httpSubscriptionLink, splitLink } from "@trpc/client"
2
2
  import type { Terminal } from "@xterm/xterm"
3
3
  import "@xterm/xterm/css/xterm.css"
4
+ import type {
5
+ ExCommandClientInput,
6
+ LuaCodeClientInput,
7
+ PollLuaCodeClientInput,
8
+ } from "../server/applications/neovim/neovimRouter.js"
4
9
  import type { BlockingCommandClientInput } from "../server/blockingCommandInputSchema.js"
5
- import type { AppRouter, ExCommandClientInput, LuaCodeClientInput, PollLuaCodeClientInput } from "../server/server.js"
10
+ import type { AppRouter } from "../server/server.js"
6
11
  import type {
7
12
  BlockingShellCommandOutput,
8
13
  RunExCommandOutput,
@@ -1,9 +1,9 @@
1
1
  import { createTRPCClient, httpBatchLink, httpSubscriptionLink, splitLink } from "@trpc/client"
2
2
  import type { Terminal } from "@xterm/xterm"
3
3
  import "@xterm/xterm/css/xterm.css"
4
+ import type { StartTerminalGenericArguments } from "../server/applications/terminal/TerminalTestApplication.js"
4
5
  import type { BlockingCommandClientInput } from "../server/blockingCommandInputSchema.js"
5
6
  import type { AppRouter } from "../server/server.js"
6
- import type { StartTerminalGenericArguments } from "../server/terminal/TerminalTestApplication.js"
7
7
  import type { BlockingShellCommandOutput, TestDirectory } from "../server/types.js"
8
8
  import "./style.css"
9
9
  import { getTabId, startTerminal } from "./websocket-client.js"
@@ -2,7 +2,7 @@ import { flavors } from "@catppuccin/palette"
2
2
  import { FitAddon } from "@xterm/addon-fit"
3
3
  import { Terminal } from "@xterm/xterm"
4
4
  import "@xterm/xterm/css/xterm.css"
5
- import z from "zod"
5
+ import { z } from "zod"
6
6
  import type { TabId } from "../server/utilities/tabId.ts"
7
7
  import "./style.css"
8
8
  import { validateMouseEvent } from "./validateMouseEvent.js"
@@ -1,12 +1,12 @@
1
1
  import assert from "node:assert"
2
2
  import path from "node:path"
3
+ import { installDependencies } from "../server/applications/neovim/api.js"
4
+ import type { StdoutOrStderrMessage } from "../server/applications/neovim/NeovimApplication.js"
5
+ import { NeovimApplication } from "../server/applications/neovim/NeovimApplication.js"
6
+ import { prepareNewTestDirectory } from "../server/applications/neovim/prepareNewTestDirectory.js"
3
7
  import { createCypressSupportFile } from "../server/cypress-support/createCypressSupportFile.js"
4
8
  import type { TestServerConfig } from "../server/index.js"
5
9
  import { startTestServer, updateTestdirectorySchemaFile } from "../server/index.js"
6
- import { installDependencies } from "../server/neovim/index.js"
7
- import type { StdoutOrStderrMessage } from "../server/neovim/NeovimApplication.js"
8
- import { NeovimApplication } from "../server/neovim/NeovimApplication.js"
9
- import { prepareNewTestDirectory } from "../server/neovim/prepareNewTestDirectory.js"
10
10
 
11
11
  //
12
12
  // This is the main entrypoint to tui-sandbox
@@ -5,10 +5,10 @@ import { access } from "fs/promises"
5
5
  import type { NeovimClient as NeovimApiClient } from "neovim"
6
6
  import { tmpdir } from "os"
7
7
  import path, { join } from "path"
8
- import type { TestDirectory, TestEnvironmentCommonEnvironmentVariables } from "../types.js"
9
- import { DisposableSingleApplication } from "../utilities/DisposableSingleApplication.js"
10
- import type { Lazy } from "../utilities/Lazy.js"
11
- import { TerminalApplication } from "../utilities/TerminalApplication.js"
8
+ import type { TestDirectory, TestEnvironmentCommonEnvironmentVariables } from "../../types.js"
9
+ import { DisposableSingleApplication } from "../../utilities/DisposableSingleApplication.js"
10
+ import type { Lazy } from "../../utilities/Lazy.js"
11
+ import { TerminalApplication } from "../../utilities/TerminalApplication.js"
12
12
  import { connectNeovimApi } from "./NeovimJavascriptApiClient.js"
13
13
 
14
14
  /*
@@ -37,6 +37,11 @@ it("connects right away if the socket file is already there", async () => {
37
37
  await lazyClient.get()
38
38
 
39
39
  vi.advanceTimersByTime(pollingInterval)
40
- expect(mocked.attach).toHaveBeenCalledWith({ socket: "foosocket" })
40
+ expect(mocked.attach).toHaveBeenCalledWith({
41
+ socket: "foosocket",
42
+ options: {
43
+ logger: expect.any(Object) as never,
44
+ },
45
+ } satisfies Partial<Parameters<typeof attach>[0]>)
41
46
  expect(mocked.attach).toHaveBeenCalledTimes(1)
42
47
  })
@@ -1,13 +1,27 @@
1
1
  import { access } from "fs/promises"
2
2
  import type { NeovimClient as NeovimApiClient } from "neovim"
3
3
  import { attach } from "neovim"
4
- import { Lazy } from "../utilities/Lazy.js"
4
+ import { createLogger, format, transports } from "winston"
5
+ import { Lazy } from "../../utilities/Lazy.js"
5
6
 
6
7
  export type NeovimJavascriptApiClient = NeovimApiClient
7
8
 
8
9
  export type PollingInterval = 100
9
10
 
10
11
  export function connectNeovimApi(socketPath: string): Lazy<Promise<NeovimJavascriptApiClient>> {
12
+ // When a custom logger is provided to attach(), we can hide debug level log
13
+ // messages
14
+ //
15
+ // https://github.com/neovim/node-client/blob/e0568e32e0fc8837ad900146bfd5ca27b9416235/README.md#logging
16
+ const logger = createLogger({
17
+ level: "warn",
18
+ transports: [
19
+ new transports.Console({
20
+ format: format.combine(format.colorize(), format.simple()),
21
+ }),
22
+ ],
23
+ })
24
+
11
25
  // it takes about 100ms for the socket file to be created - best make this
12
26
  // Lazy so that we don't wait for it unnecessarily.
13
27
  return new Lazy(async () => {
@@ -27,6 +41,11 @@ export function connectNeovimApi(socketPath: string): Lazy<Promise<NeovimJavascr
27
41
  // this.
28
42
  process.env["ALLOW_CONSOLE"] = "1"
29
43
 
30
- return attach({ socket: socketPath })
44
+ return attach({
45
+ socket: socketPath,
46
+ options: {
47
+ logger,
48
+ },
49
+ })
31
50
  })
32
51
  }
@@ -2,23 +2,23 @@ import assert from "assert"
2
2
  import "core-js/proposals/async-explicit-resource-management.js"
3
3
  import { access } from "fs/promises"
4
4
  import path from "path"
5
- import type { BlockingCommandInput } from "../blockingCommandInputSchema.js"
6
- import type { ExCommandInput, LuaCodeInput } from "../server.js"
7
- import { executeBlockingShellCommand } from "../terminal/runBlockingShellCommand.js"
5
+ import type { BlockingCommandInput } from "../../blockingCommandInputSchema.js"
8
6
  import type {
9
7
  BlockingShellCommandOutput,
10
8
  RunExCommandOutput,
11
9
  RunLuaCodeOutput,
12
10
  StartNeovimGenericArguments,
13
11
  TestDirectory,
14
- } from "../types.js"
15
- import type { DirectoriesConfig } from "../updateTestdirectorySchemaFile.js"
16
- import { convertEventEmitterToAsyncGenerator } from "../utilities/generator.js"
17
- import { Lazy } from "../utilities/Lazy.js"
18
- import type { TabId } from "../utilities/tabId.js"
19
- import { timeout } from "../utilities/timeout.js"
12
+ } from "../../types.js"
13
+ import type { DirectoriesConfig } from "../../updateTestdirectorySchemaFile.js"
14
+ import { convertEventEmitterToAsyncGenerator } from "../../utilities/generator.js"
15
+ import { Lazy } from "../../utilities/Lazy.js"
16
+ import type { TabId } from "../../utilities/tabId.js"
17
+ import { timeout } from "../../utilities/timeout.js"
18
+ import { executeBlockingShellCommand } from "../terminal/runBlockingShellCommand.js"
20
19
  import type { StdoutOrStderrMessage, TerminalDimensions } from "./NeovimApplication.js"
21
20
  import { NeovimApplication } from "./NeovimApplication.js"
21
+ import type { ExCommandInput, LuaCodeInput } from "./neovimRouter.js"
22
22
  import { prepareNewTestDirectory } from "./prepareNewTestDirectory.js"
23
23
 
24
24
  const neovims = new Map<TabId["tabId"], NeovimApplication>()
@@ -4,10 +4,10 @@ import { Type } from "dree"
4
4
  import { constants, readdirSync, statSync } from "fs"
5
5
  import { access, mkdir, mkdtemp } from "fs/promises"
6
6
  import path from "path"
7
- import { convertDree, getDirectoryTree } from "../../dirtree/index.js"
8
- import type { TestDirectory } from "../../types.js"
9
- import type { DirectoriesConfig } from "../../updateTestdirectorySchemaFile.js"
10
- import { updateTestdirectorySchemaFile } from "../../updateTestdirectorySchemaFile.js"
7
+ import { convertDree, getDirectoryTree } from "../../../dirtree/index.js"
8
+ import type { TestDirectory } from "../../../types.js"
9
+ import type { DirectoriesConfig } from "../../../updateTestdirectorySchemaFile.js"
10
+ import { updateTestdirectorySchemaFile } from "../../../updateTestdirectorySchemaFile.js"
11
11
 
12
12
  export async function createTempDir(config: DirectoriesConfig): Promise<TestDirectory> {
13
13
  try {
@@ -0,0 +1,90 @@
1
+ import "core-js/proposals/async-explicit-resource-management.js"
2
+ import type { Except } from "type-fest"
3
+ import { z } from "zod"
4
+ import { blockingCommandInputSchema } from "../../blockingCommandInputSchema.js"
5
+ import { trpc } from "../../connection/trpc.js"
6
+ import type { DirectoriesConfig } from "../../updateTestdirectorySchemaFile.js"
7
+ import { tabIdSchema } from "../../utilities/tabId.js"
8
+ import { timeoutable } from "../../utilities/timeoutable.js"
9
+ import * as neovim from "./api.js"
10
+
11
+ const luaCodeInputSchema = z.object({ tabId: tabIdSchema, luaCode: z.string() })
12
+ export type LuaCodeClientInput = Except<LuaCodeInput, "tabId">
13
+ export type LuaCodeInput = z.infer<typeof luaCodeInputSchema>
14
+
15
+ const pollLuaCodeInputSchema = z.object({
16
+ tabId: tabIdSchema,
17
+ luaAssertion: z.string(),
18
+ timeoutMs: z.number().optional().default(10_000),
19
+ })
20
+ export type PollLuaCodeClientInput = Except<z.input<typeof pollLuaCodeInputSchema>, "tabId">
21
+
22
+ const exCommandInputSchema = z.object({
23
+ tabId: tabIdSchema,
24
+ command: z.string(),
25
+ log: z.boolean().optional(),
26
+ })
27
+ export type ExCommandClientInput = Except<ExCommandInput, "tabId">
28
+ export type ExCommandInput = z.infer<typeof exCommandInputSchema>
29
+
30
+ // let trpc infer the type as that is what it is designed to do
31
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
32
+ export function createNeovimRouter(config: DirectoriesConfig) {
33
+ return trpc.router({
34
+ start: trpc.procedure
35
+ .input(
36
+ z.object({
37
+ tabId: tabIdSchema,
38
+ startNeovimArguments: z.object({
39
+ filename: z.union([
40
+ z.string(),
41
+ z.object({
42
+ openInVerticalSplits: z.array(z.string()),
43
+ }),
44
+ ]),
45
+ startupScriptModifications: z.array(z.string()).optional(),
46
+ terminalDimensions: z.object({
47
+ cols: z.number(),
48
+ rows: z.number(),
49
+ }),
50
+ additionalEnvironmentVariables: z.record(z.string(), z.string()).optional(),
51
+ }),
52
+ })
53
+ )
54
+ .mutation(options => {
55
+ return neovim.start(
56
+ options.input.startNeovimArguments,
57
+ options.input.startNeovimArguments.terminalDimensions,
58
+ options.input.tabId,
59
+ config
60
+ )
61
+ }),
62
+ onStdout: trpc.procedure.input(z.object({ client: tabIdSchema })).subscription(options => {
63
+ return neovim.initializeStdout(options.input, options.signal, config.testEnvironmentPath)
64
+ }),
65
+
66
+ initializeStdout: trpc.procedure.input(z.object({ client: tabIdSchema })).subscription(options => {
67
+ return neovim.initializeStdout(options.input, options.signal, config.testEnvironmentPath)
68
+ }),
69
+ sendStdin: trpc.procedure.input(z.object({ tabId: tabIdSchema, data: z.string() })).mutation(options => {
70
+ return neovim.sendStdin(options.input)
71
+ }),
72
+
73
+ runBlockingShellCommand: trpc.procedure.input(blockingCommandInputSchema).mutation(async options => {
74
+ return neovim.runBlockingShellCommand(options.signal, options.input, options.input.allowFailure ?? false)
75
+ }),
76
+
77
+ runLuaCode: trpc.procedure.input(luaCodeInputSchema).mutation(options => {
78
+ return timeoutable(10_000, neovim.runLuaCode(options.input))
79
+ }),
80
+
81
+ waitForLuaCode: trpc.procedure.input(pollLuaCodeInputSchema).mutation(async options => {
82
+ const result = await timeoutable(options.input.timeoutMs, neovim.waitForLuaCode(options.input, options.signal))
83
+ return result
84
+ }),
85
+
86
+ runExCommand: trpc.procedure.input(exCommandInputSchema).mutation(options => {
87
+ return timeoutable(10_000, neovim.runExCommand(options.input))
88
+ }),
89
+ })
90
+ }
@@ -1,6 +1,6 @@
1
1
  import { access, mkdir } from "fs/promises"
2
- import type { TestDirectory } from "../types.js"
3
- import type { DirectoriesConfig } from "../updateTestdirectorySchemaFile.js"
2
+ import type { TestDirectory } from "../../types.js"
3
+ import type { DirectoriesConfig } from "../../updateTestdirectorySchemaFile.js"
4
4
  import { createTempDir, removeTestDirectories } from "./environment/createTempDir.js"
5
5
 
6
6
  export async function prepareNewTestDirectory(config: DirectoriesConfig): Promise<TestDirectory> {
@@ -2,10 +2,10 @@ import assert from "assert"
2
2
  import { exec } from "child_process"
3
3
  import EventEmitter from "events"
4
4
  import { join } from "path"
5
+ import type { TestDirectory, TestEnvironmentCommonEnvironmentVariables } from "../../types.js"
6
+ import { DisposableSingleApplication } from "../../utilities/DisposableSingleApplication.js"
7
+ import { TerminalApplication } from "../../utilities/TerminalApplication.js"
5
8
  import type { StdoutOrStderrMessage, TerminalDimensions } from "../neovim/NeovimApplication.js"
6
- import type { TestDirectory, TestEnvironmentCommonEnvironmentVariables } from "../types.js"
7
- import { DisposableSingleApplication } from "../utilities/DisposableSingleApplication.js"
8
- import { TerminalApplication } from "../utilities/TerminalApplication.js"
9
9
 
10
10
  type ResettableState = {
11
11
  testDirectory: TestDirectory
@@ -1,13 +1,13 @@
1
1
  import assert from "assert"
2
2
  import "core-js/proposals/async-explicit-resource-management.js"
3
- import type { BlockingCommandInput } from "../blockingCommandInputSchema.js"
3
+ import type { BlockingCommandInput } from "../../blockingCommandInputSchema.js"
4
+ import type { BlockingShellCommandOutput } from "../../types.js"
5
+ import type { DirectoriesConfig } from "../../updateTestdirectorySchemaFile.js"
6
+ import { convertEventEmitterToAsyncGenerator } from "../../utilities/generator.js"
7
+ import { Lazy } from "../../utilities/Lazy.js"
8
+ import type { TabId } from "../../utilities/tabId.js"
4
9
  import type { TerminalDimensions } from "../neovim/NeovimApplication.js"
5
10
  import { prepareNewTestDirectory } from "../neovim/prepareNewTestDirectory.js"
6
- import type { BlockingShellCommandOutput } from "../types.js"
7
- import type { DirectoriesConfig } from "../updateTestdirectorySchemaFile.js"
8
- import { convertEventEmitterToAsyncGenerator } from "../utilities/generator.js"
9
- import { Lazy } from "../utilities/Lazy.js"
10
- import type { TabId } from "../utilities/tabId.js"
11
11
  import { executeBlockingShellCommand } from "./runBlockingShellCommand.js"
12
12
  import TerminalTestApplication from "./TerminalTestApplication.js"
13
13
 
@@ -2,8 +2,8 @@ import { exec } from "child_process"
2
2
  import "core-js/proposals/async-explicit-resource-management.js"
3
3
  import { join } from "path"
4
4
  import util from "util"
5
- import type { BlockingCommandInput } from "../blockingCommandInputSchema.js"
6
- import type { BlockingShellCommandOutput, TestDirectory } from "../types.js"
5
+ import type { BlockingCommandInput } from "../../blockingCommandInputSchema.js"
6
+ import type { BlockingShellCommandOutput, TestDirectory } from "../../types.js"
7
7
 
8
8
  export async function executeBlockingShellCommand(
9
9
  testDirectory: TestDirectory,
@@ -0,0 +1,50 @@
1
+ import "core-js/proposals/async-explicit-resource-management.js"
2
+ import { z } from "zod"
3
+ import { blockingCommandInputSchema } from "../../blockingCommandInputSchema.js"
4
+ import { trpc } from "../../connection/trpc.js"
5
+ import type { DirectoriesConfig } from "../../updateTestdirectorySchemaFile.js"
6
+ import { tabIdSchema } from "../../utilities/tabId.js"
7
+ import * as terminal from "./api.js"
8
+
9
+ // let trpc infer the type as that is what it is designed to do
10
+ // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
11
+ export function createTerminalRouter(config: DirectoriesConfig) {
12
+ const terminalRouter = trpc.router({
13
+ onStdout: trpc.procedure.input(z.object({ client: tabIdSchema })).subscription(options => {
14
+ return terminal.initializeStdout(options.input, options.signal, config.testEnvironmentPath)
15
+ }),
16
+
17
+ start: trpc.procedure
18
+ .input(
19
+ z.object({
20
+ tabId: tabIdSchema,
21
+ startTerminalArguments: z.object({
22
+ commandToRun: z.array(z.string()),
23
+ additionalEnvironmentVariables: z.record(z.string(), z.string()).optional(),
24
+ terminalDimensions: z.object({
25
+ cols: z.number(),
26
+ rows: z.number(),
27
+ }),
28
+ }),
29
+ })
30
+ )
31
+ .mutation(options => {
32
+ return terminal.start(
33
+ options.input.startTerminalArguments.terminalDimensions,
34
+ options.input.startTerminalArguments.commandToRun,
35
+ options.input.tabId,
36
+ config
37
+ )
38
+ }),
39
+
40
+ sendStdin: trpc.procedure.input(z.object({ tabId: tabIdSchema, data: z.string() })).mutation(options => {
41
+ return terminal.sendStdin(options.input)
42
+ }),
43
+
44
+ runBlockingShellCommand: trpc.procedure.input(blockingCommandInputSchema).mutation(async options => {
45
+ return terminal.runBlockingShellCommand(options.signal, options.input, options.input.allowFailure ?? false)
46
+ }),
47
+ })
48
+
49
+ return terminalRouter
50
+ }
@@ -14,11 +14,6 @@ import type {
14
14
  GenericNeovimBrowserApi,
15
15
  GenericTerminalBrowserApi,
16
16
  } from "@tui-sandbox/library/dist/src/browser/neovim-client"
17
- import type {
18
- ExCommandClientInput,
19
- LuaCodeClientInput,
20
- PollLuaCodeClientInput,
21
- } from "@tui-sandbox/library/dist/src/server/server"
22
17
  import type {
23
18
  BlockingShellCommandOutput,
24
19
  RunExCommandOutput,
@@ -26,8 +21,13 @@ import type {
26
21
  StartNeovimGenericArguments,
27
22
  TestDirectory,
28
23
  } from "@tui-sandbox/library/dist/src/server/types"
24
+ import type {
25
+ ExCommandClientInput,
26
+ LuaCodeClientInput,
27
+ PollLuaCodeClientInput,
28
+ } from "@tui-sandbox/library/src/server/applications/neovim/neovimRouter"
29
+ import type { StartTerminalGenericArguments } from "@tui-sandbox/library/src/server/applications/terminal/TerminalTestApplication"
29
30
  import type { BlockingCommandClientInput } from "@tui-sandbox/library/src/server/blockingCommandInputSchema"
30
- import type { StartTerminalGenericArguments } from "@tui-sandbox/library/src/server/terminal/TerminalTestApplication"
31
31
  import type { OverrideProperties } from "type-fest"
32
32
  import type { MyTestDirectory, MyTestDirectoryFile } from "../../MyTestDirectory"
33
33
 
@@ -1,133 +1,18 @@
1
1
  import type { inferRouterInputs } from "@trpc/server"
2
2
  import "core-js/proposals/async-explicit-resource-management.js"
3
- import type { Except } from "type-fest"
4
- import { z } from "zod"
5
- import { blockingCommandInputSchema } from "./blockingCommandInputSchema.js"
3
+ import { createNeovimRouter } from "./applications/neovim/neovimRouter.js"
4
+ import { createTerminalRouter } from "./applications/terminal/terminalRouter.js"
6
5
  import { trpc } from "./connection/trpc.js"
7
- import * as neovim from "./neovim/index.js"
8
- import * as terminal from "./terminal/index.js"
9
6
  import { TestServer } from "./TestServer.js"
10
7
  import type { DirectoriesConfig, TestServerConfig } from "./updateTestdirectorySchemaFile.js"
11
- import { tabIdSchema } from "./utilities/tabId.js"
12
- import { timeoutable } from "./utilities/timeoutable.js"
13
-
14
- const luaCodeInputSchema = z.object({ tabId: tabIdSchema, luaCode: z.string() })
15
- export type LuaCodeClientInput = Except<LuaCodeInput, "tabId">
16
- export type LuaCodeInput = z.infer<typeof luaCodeInputSchema>
17
-
18
- const pollLuaCodeInputSchema = z.object({
19
- tabId: tabIdSchema,
20
- luaAssertion: z.string(),
21
- timeoutMs: z.number().optional().default(10_000),
22
- })
23
- export type PollLuaCodeClientInput = Except<z.input<typeof pollLuaCodeInputSchema>, "tabId">
24
-
25
- const exCommandInputSchema = z.object({
26
- tabId: tabIdSchema,
27
- command: z.string(),
28
- log: z.boolean().optional(),
29
- })
30
- export type ExCommandClientInput = Except<ExCommandInput, "tabId">
31
- export type ExCommandInput = z.infer<typeof exCommandInputSchema>
32
8
 
33
9
  /** @private */
34
10
  // eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types
35
11
  export async function createAppRouter(config: DirectoriesConfig) {
36
12
  const appRouter = trpc.router({
37
- terminal: trpc.router({
38
- onStdout: trpc.procedure.input(z.object({ client: tabIdSchema })).subscription(options => {
39
- return terminal.initializeStdout(options.input, options.signal, config.testEnvironmentPath)
40
- }),
41
-
42
- start: trpc.procedure
43
- .input(
44
- z.object({
45
- tabId: tabIdSchema,
46
- startTerminalArguments: z.object({
47
- commandToRun: z.array(z.string()),
48
- additionalEnvironmentVariables: z.record(z.string(), z.string()).optional(),
49
- terminalDimensions: z.object({
50
- cols: z.number(),
51
- rows: z.number(),
52
- }),
53
- }),
54
- })
55
- )
56
- .mutation(options => {
57
- return terminal.start(
58
- options.input.startTerminalArguments.terminalDimensions,
59
- options.input.startTerminalArguments.commandToRun,
60
- options.input.tabId,
61
- config
62
- )
63
- }),
64
-
65
- sendStdin: trpc.procedure.input(z.object({ tabId: tabIdSchema, data: z.string() })).mutation(options => {
66
- return terminal.sendStdin(options.input)
67
- }),
68
-
69
- runBlockingShellCommand: trpc.procedure.input(blockingCommandInputSchema).mutation(async options => {
70
- return terminal.runBlockingShellCommand(options.signal, options.input, options.input.allowFailure ?? false)
71
- }),
72
- }),
73
-
74
- neovim: trpc.router({
75
- start: trpc.procedure
76
- .input(
77
- z.object({
78
- tabId: tabIdSchema,
79
- startNeovimArguments: z.object({
80
- filename: z.union([
81
- z.string(),
82
- z.object({
83
- openInVerticalSplits: z.array(z.string()),
84
- }),
85
- ]),
86
- startupScriptModifications: z.array(z.string()).optional(),
87
- terminalDimensions: z.object({
88
- cols: z.number(),
89
- rows: z.number(),
90
- }),
91
- additionalEnvironmentVariables: z.record(z.string(), z.string()).optional(),
92
- }),
93
- })
94
- )
95
- .mutation(options => {
96
- return neovim.start(
97
- options.input.startNeovimArguments,
98
- options.input.startNeovimArguments.terminalDimensions,
99
- options.input.tabId,
100
- config
101
- )
102
- }),
103
- onStdout: trpc.procedure.input(z.object({ client: tabIdSchema })).subscription(options => {
104
- return neovim.initializeStdout(options.input, options.signal, config.testEnvironmentPath)
105
- }),
106
-
107
- initializeStdout: trpc.procedure.input(z.object({ client: tabIdSchema })).subscription(options => {
108
- return neovim.initializeStdout(options.input, options.signal, config.testEnvironmentPath)
109
- }),
110
- sendStdin: trpc.procedure.input(z.object({ tabId: tabIdSchema, data: z.string() })).mutation(options => {
111
- return neovim.sendStdin(options.input)
112
- }),
113
-
114
- runBlockingShellCommand: trpc.procedure.input(blockingCommandInputSchema).mutation(async options => {
115
- return neovim.runBlockingShellCommand(options.signal, options.input, options.input.allowFailure ?? false)
116
- }),
117
-
118
- runLuaCode: trpc.procedure.input(luaCodeInputSchema).mutation(options => {
119
- return timeoutable(10_000, neovim.runLuaCode(options.input))
120
- }),
121
-
122
- waitForLuaCode: trpc.procedure.input(pollLuaCodeInputSchema).mutation(async options => {
123
- const result = await timeoutable(options.input.timeoutMs, neovim.waitForLuaCode(options.input, options.signal))
124
- return result
125
- }),
13
+ terminal: createTerminalRouter(config),
126
14
 
127
- runExCommand: trpc.procedure.input(exCommandInputSchema).mutation(options => {
128
- return timeoutable(10_000, neovim.runExCommand(options.input))
129
- }),
130
- }),
15
+ neovim: createNeovimRouter(config),
131
16
  })
132
17
 
133
18
  return appRouter
@@ -44,7 +44,7 @@ export type TestEnvironmentCommonEnvironmentVariables = {
44
44
  XDG_DATA_HOME: string
45
45
  }
46
46
 
47
- export type { StartNeovimGenericArguments } from "../server/neovim/NeovimApplication.js"
47
+ export type { StartNeovimGenericArguments } from "./applications/neovim/NeovimApplication.js"
48
48
 
49
49
  export type BlockingShellCommandOutput =
50
50
  | {