From c6cc21409b9f8e09458d86c2375807a1d9aa44b5 Mon Sep 17 00:00:00 2001 From: Codex Microtask Operator Date: Fri, 12 Jun 2026 18:20:37 +0200 Subject: [PATCH] Reject empty config path segments --- packages/cli/src/config.test.ts | 9 +++++++++ packages/cli/src/config.ts | 16 +++++++++++----- 2 files changed, 20 insertions(+), 5 deletions(-) create mode 100644 packages/cli/src/config.test.ts diff --git a/packages/cli/src/config.test.ts b/packages/cli/src/config.test.ts new file mode 100644 index 0000000..2af4941 --- /dev/null +++ b/packages/cli/src/config.test.ts @@ -0,0 +1,9 @@ +import { describe, expect, it } from "vitest"; +import { getConfigValue, setConfigValue } from "./config.js"; + +describe("CLI config", () => { + it("rejects empty config path segments", () => { + expect(() => getConfigValue("waiting..arcade", {})).toThrow(/empty segments/); + expect(() => setConfigValue("waiting..arcade", "true", {})).toThrow(/empty segments/); + }); +}); diff --git a/packages/cli/src/config.ts b/packages/cli/src/config.ts index 2b023cb..0559154 100644 --- a/packages/cli/src/config.ts +++ b/packages/cli/src/config.ts @@ -40,14 +40,12 @@ export function writeConfig(config: JsonObject) { } export function getConfigValue(path: string, config = readConfig()) { - return path.split(".").reduce((current, key) => (isObject(current) ? current[key] : undefined), config); + const parts = splitConfigPath(path); + return parts.reduce((current, key) => (isObject(current) ? current[key] : undefined), config); } export function setConfigValue(path: string, rawValue: string, config = readConfig()) { - const parts = path.split(".").filter(Boolean); - if (parts.length === 0) { - throw new Error("Config path cannot be empty."); - } + const parts = splitConfigPath(path); let current: JsonObject = config; for (const part of parts.slice(0, -1)) { if (!isObject(current[part])) { @@ -59,6 +57,14 @@ export function setConfigValue(path: string, rawValue: string, config = readConf return config; } +function splitConfigPath(path: string) { + const parts = path.split("."); + if (parts.length === 0 || parts.some((part) => part.length === 0)) { + throw new Error("Config path cannot contain empty segments."); + } + return parts; +} + export function parseConfigValue(value: string): unknown { if (value === "true") return true; if (value === "false") return false;