tui-runtime.ts 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import { spyOn } from "bun:test"
  2. import path from "path"
  3. import { resolve, type Info, type Resolved } from "@kirincode-ai/tui/config"
  4. import { TuiConfig } from "../../src/config/tui"
  5. import { TuiKeybind } from "@kirincode-ai/tui/config/keybind"
  6. type PluginSpec = string | [string, Record<string, unknown>]
  7. type PluginOrigin = {
  8. spec: PluginSpec
  9. scope: "global" | "local"
  10. source: string
  11. }
  12. type HostResolved = Resolved & { plugin_origins?: PluginOrigin[] }
  13. type ResolvedInput = Omit<Info, "attention" | "keybinds" | "leader_timeout"> & {
  14. attention?: Partial<Resolved["attention"]>
  15. keybinds?: Partial<TuiKeybind.Keybinds>
  16. leader_timeout?: number
  17. plugin_origins?: PluginOrigin[]
  18. }
  19. export function createTuiResolvedKeybinds(input: Partial<TuiKeybind.Keybinds> = {}): Resolved["keybinds"] {
  20. return resolve({ keybinds: input }, { terminalSuspend: process.platform !== "win32" }).keybinds
  21. }
  22. export function createTuiResolvedConfig(input: ResolvedInput = {}): HostResolved {
  23. return {
  24. ...resolve(input, { terminalSuspend: process.platform !== "win32" }),
  25. plugin_origins: input.plugin_origins,
  26. }
  27. }
  28. export function mockTuiRuntime(dir: string, plugin: PluginSpec[], opts?: { plugin_enabled?: Record<string, boolean> }) {
  29. process.env.KIRINCODE_PLUGIN_META_FILE = path.join(dir, "plugin-meta.json")
  30. const plugin_origins = plugin.map((spec) => ({
  31. spec,
  32. scope: "local" as const,
  33. source: path.join(dir, "tui.json"),
  34. }))
  35. const wait = spyOn(TuiConfig, "waitForDependencies").mockResolvedValue()
  36. const cwd = spyOn(process, "cwd").mockImplementation(() => dir)
  37. const config = createTuiResolvedConfig({
  38. plugin,
  39. plugin_origins,
  40. ...(opts?.plugin_enabled && { plugin_enabled: opts.plugin_enabled }),
  41. })
  42. return {
  43. config,
  44. restore: () => {
  45. cwd.mockRestore()
  46. wait.mockRestore()
  47. delete process.env.KIRINCODE_PLUGIN_META_FILE
  48. },
  49. }
  50. }