Skip to content

Commit 5e3562c

Browse files
committed
refactor: extract experimental settings entry wrapper
1 parent 0606240 commit 5e3562c

3 files changed

Lines changed: 159 additions & 1 deletion

File tree

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
import type { PluginConfig } from "../types.js";
2+
3+
export async function promptExperimentalSettingsEntry(params: {
4+
initialConfig: PluginConfig;
5+
promptExperimentalSettingsMenu: (args: {
6+
initialConfig: PluginConfig;
7+
isInteractive: () => boolean;
8+
ui: ReturnType<typeof import("../ui/runtime.js").getUiRuntimeOptions>;
9+
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
10+
select: <T>(
11+
items: Array<Record<string, unknown>>,
12+
options: Record<string, unknown>,
13+
) => Promise<T | null>;
14+
getExperimentalSelectOptions: (
15+
ui: ReturnType<typeof import("../ui/runtime.js").getUiRuntimeOptions>,
16+
help: string,
17+
hotkeyMapper: (raw: string) => unknown,
18+
) => Record<string, unknown>;
19+
mapExperimentalMenuHotkey: (raw: string) => unknown;
20+
mapExperimentalStatusHotkey: (raw: string) => unknown;
21+
formatDashboardSettingState: (enabled: boolean) => string;
22+
copy: Record<string, string>;
23+
input: NodeJS.ReadStream;
24+
output: NodeJS.WriteStream;
25+
runNamedBackupExport: (args: {
26+
name: string;
27+
}) => Promise<{ kind: string; path?: string; error?: unknown }>;
28+
loadAccounts: () => Promise<unknown>;
29+
loadExperimentalSyncTarget: () => Promise<unknown>;
30+
planOcChatgptSync: (args: Record<string, unknown>) => Promise<unknown>;
31+
applyOcChatgptSync: (args: Record<string, unknown>) => Promise<unknown>;
32+
getTargetKind: (targetState: unknown) => string;
33+
getTargetDestination: (targetState: unknown) => unknown;
34+
getTargetDetection: (targetState: unknown) => unknown;
35+
getTargetErrorMessage: (targetState: unknown) => string | null;
36+
getPlanKind: (plan: unknown) => string;
37+
getPlanBlockedReason: (plan: unknown) => string;
38+
getPlanPreview: (plan: unknown) => {
39+
toAdd: unknown[];
40+
toUpdate: unknown[];
41+
toSkip: unknown[];
42+
unchangedDestinationOnly: unknown[];
43+
activeSelectionBehavior: string;
44+
};
45+
getAppliedLabel: (applied: unknown) => { label: string; color: string };
46+
}) => Promise<PluginConfig | null>;
47+
isInteractive: () => boolean;
48+
ui: ReturnType<typeof import("../ui/runtime.js").getUiRuntimeOptions>;
49+
cloneBackendPluginConfig: (config: PluginConfig) => PluginConfig;
50+
select: <T>(
51+
items: Array<Record<string, unknown>>,
52+
options: Record<string, unknown>,
53+
) => Promise<T | null>;
54+
getExperimentalSelectOptions: (
55+
ui: ReturnType<typeof import("../ui/runtime.js").getUiRuntimeOptions>,
56+
help: string,
57+
hotkeyMapper: (raw: string) => unknown,
58+
) => Record<string, unknown>;
59+
mapExperimentalMenuHotkey: (raw: string) => unknown;
60+
mapExperimentalStatusHotkey: (raw: string) => unknown;
61+
formatDashboardSettingState: (enabled: boolean) => string;
62+
copy: Record<string, string>;
63+
input: NodeJS.ReadStream;
64+
output: NodeJS.WriteStream;
65+
runNamedBackupExport: (args: {
66+
name: string;
67+
}) => Promise<{ kind: string; path?: string; error?: unknown }>;
68+
loadAccounts: () => Promise<unknown>;
69+
loadExperimentalSyncTarget: () => Promise<unknown>;
70+
planOcChatgptSync: (args: Record<string, unknown>) => Promise<unknown>;
71+
applyOcChatgptSync: (args: Record<string, unknown>) => Promise<unknown>;
72+
getTargetKind: (targetState: unknown) => string;
73+
getTargetDestination: (targetState: unknown) => unknown;
74+
getTargetDetection: (targetState: unknown) => unknown;
75+
getTargetErrorMessage: (targetState: unknown) => string | null;
76+
getPlanKind: (plan: unknown) => string;
77+
getPlanBlockedReason: (plan: unknown) => string;
78+
getPlanPreview: (plan: unknown) => {
79+
toAdd: unknown[];
80+
toUpdate: unknown[];
81+
toSkip: unknown[];
82+
unchangedDestinationOnly: unknown[];
83+
activeSelectionBehavior: string;
84+
};
85+
getAppliedLabel: (applied: unknown) => { label: string; color: string };
86+
}): Promise<PluginConfig | null> {
87+
return params.promptExperimentalSettingsMenu({
88+
initialConfig: params.initialConfig,
89+
isInteractive: params.isInteractive,
90+
ui: params.ui,
91+
cloneBackendPluginConfig: params.cloneBackendPluginConfig,
92+
select: params.select,
93+
getExperimentalSelectOptions: params.getExperimentalSelectOptions,
94+
mapExperimentalMenuHotkey: params.mapExperimentalMenuHotkey,
95+
mapExperimentalStatusHotkey: params.mapExperimentalStatusHotkey,
96+
formatDashboardSettingState: params.formatDashboardSettingState,
97+
copy: params.copy,
98+
input: params.input,
99+
output: params.output,
100+
runNamedBackupExport: params.runNamedBackupExport,
101+
loadAccounts: params.loadAccounts,
102+
loadExperimentalSyncTarget: params.loadExperimentalSyncTarget,
103+
planOcChatgptSync: params.planOcChatgptSync,
104+
applyOcChatgptSync: params.applyOcChatgptSync,
105+
getTargetKind: params.getTargetKind,
106+
getTargetDestination: params.getTargetDestination,
107+
getTargetDetection: params.getTargetDetection,
108+
getTargetErrorMessage: params.getTargetErrorMessage,
109+
getPlanKind: params.getPlanKind,
110+
getPlanBlockedReason: params.getPlanBlockedReason,
111+
getPlanPreview: params.getPlanPreview,
112+
getAppliedLabel: params.getAppliedLabel,
113+
});
114+
}

lib/codex-manager/settings-hub.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ import {
6464
dashboardSettingsDataEqual,
6565
} from "./dashboard-settings-data.js";
6666
import { configureDashboardSettingsEntry } from "./dashboard-settings-entry.js";
67+
import { promptExperimentalSettingsEntry } from "./experimental-settings-entry.js";
6768
import { promptExperimentalSettingsMenu } from "./experimental-settings-prompt.js";
6869
import {
6970
getExperimentalSelectOptions,
@@ -663,8 +664,9 @@ async function loadExperimentalSyncTarget(): Promise<
663664
async function promptExperimentalSettings(
664665
initialConfig: PluginConfig,
665666
): Promise<PluginConfig | null> {
666-
return promptExperimentalSettingsMenu({
667+
return promptExperimentalSettingsEntry({
667668
initialConfig,
669+
promptExperimentalSettingsMenu: promptExperimentalSettingsMenu as never,
668670
isInteractive: () => input.isTTY && output.isTTY,
669671
ui: getUiRuntimeOptions(),
670672
cloneBackendPluginConfig,
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import { describe, expect, it, vi } from "vitest";
2+
import { promptExperimentalSettingsEntry } from "../lib/codex-manager/experimental-settings-entry.js";
3+
4+
describe("experimental settings entry", () => {
5+
it("passes all dependencies through to the experimental settings prompt helper", async () => {
6+
const promptExperimentalSettingsMenu = vi.fn(async () => ({
7+
fetchTimeoutMs: 1000,
8+
}));
9+
10+
const result = await promptExperimentalSettingsEntry({
11+
initialConfig: { fetchTimeoutMs: 2000 },
12+
promptExperimentalSettingsMenu,
13+
isInteractive: () => true,
14+
ui: { theme: {} } as never,
15+
cloneBackendPluginConfig: vi.fn((config) => config),
16+
select: vi.fn(),
17+
getExperimentalSelectOptions: vi.fn(() => ({})),
18+
mapExperimentalMenuHotkey: vi.fn(),
19+
mapExperimentalStatusHotkey: vi.fn(),
20+
formatDashboardSettingState: vi.fn((enabled) => (enabled ? "on" : "off")),
21+
copy: {},
22+
input: process.stdin,
23+
output: process.stdout,
24+
runNamedBackupExport: vi.fn(),
25+
loadAccounts: vi.fn(),
26+
loadExperimentalSyncTarget: vi.fn(),
27+
planOcChatgptSync: vi.fn(),
28+
applyOcChatgptSync: vi.fn(),
29+
getTargetKind: vi.fn(),
30+
getTargetDestination: vi.fn(),
31+
getTargetDetection: vi.fn(),
32+
getTargetErrorMessage: vi.fn(),
33+
getPlanKind: vi.fn(),
34+
getPlanBlockedReason: vi.fn(),
35+
getPlanPreview: vi.fn(),
36+
getAppliedLabel: vi.fn(),
37+
});
38+
39+
expect(promptExperimentalSettingsMenu).toHaveBeenCalled();
40+
expect(result).toEqual({ fetchTimeoutMs: 1000 });
41+
});
42+
});

0 commit comments

Comments
 (0)