Fix child-process arg warning

This commit is contained in:
2026-02-16 23:33:03 -08:00
parent 1cd1cdb11d
commit 4d28efabd0
24 changed files with 1951 additions and 33 deletions

View File

@@ -18,6 +18,8 @@ test("loads defaults when config is missing", () => {
assert.equal(config.websocket.port, DEFAULT_CONFIG.websocket.port);
assert.equal(config.ankiConnect.behavior.autoUpdateNewCards, true);
assert.equal(config.anilist.enabled, false);
assert.equal(config.immersionTracking.enabled, true);
assert.equal(config.immersionTracking.dbPath, undefined);
});
test("parses anilist.enabled and warns for invalid value", () => {
@@ -43,6 +45,26 @@ test("parses anilist.enabled and warns for invalid value", () => {
assert.equal(service.getConfig().anilist.enabled, true);
});
test("accepts immersion tracking config values", () => {
const dir = makeTempDir();
fs.writeFileSync(
path.join(dir, "config.jsonc"),
`{
"immersionTracking": {
"enabled": false,
"dbPath": "/tmp/immersions/custom.sqlite"
}
}`,
"utf-8",
);
const service = new ConfigService(dir);
const config = service.getConfig();
assert.equal(config.immersionTracking.enabled, false);
assert.equal(config.immersionTracking.dbPath, "/tmp/immersions/custom.sqlite");
});
test("parses jsonc and warns/falls back on invalid value", () => {
const dir = makeTempDir();
fs.writeFileSync(

View File

@@ -239,6 +239,9 @@ export const DEFAULT_CONFIG: ResolvedConfig = {
invisibleOverlay: {
startupVisibility: "platform-default",
},
immersionTracking: {
enabled: true,
},
};
export const DEFAULT_ANKI_CONNECT_CONFIG = DEFAULT_CONFIG.ankiConnect;
@@ -509,6 +512,19 @@ export const CONFIG_OPTION_REGISTRY: ConfigOptionRegistryEntry[] = [
description:
"Comma-separated primary subtitle language priority used by the launcher.",
},
{
path: "immersionTracking.enabled",
kind: "boolean",
defaultValue: DEFAULT_CONFIG.immersionTracking.enabled,
description: "Enable immersion tracking for mined subtitle metadata.",
},
{
path: "immersionTracking.dbPath",
kind: "string",
defaultValue: DEFAULT_CONFIG.immersionTracking.dbPath,
description:
"Optional SQLite database path for immersion tracking. Empty value uses the default app data path.",
},
];
export const CONFIG_TEMPLATE_SECTIONS: ConfigTemplateSection[] = [
@@ -621,6 +637,14 @@ export const CONFIG_TEMPLATE_SECTIONS: ConfigTemplateSection[] = [
description: ["Anilist API credentials and update behavior."],
key: "anilist",
},
{
title: "Immersion Tracking",
description: [
"Enable/disable immersion tracking.",
"Set dbPath to override the default sqlite database location.",
],
key: "immersionTracking",
},
];
export function deepCloneConfig(config: ResolvedConfig): ResolvedConfig {

View File

@@ -485,6 +485,32 @@ export class ConfigService {
);
}
if (isObject(src.immersionTracking)) {
const enabled = asBoolean(src.immersionTracking.enabled);
if (enabled !== undefined) {
resolved.immersionTracking.enabled = enabled;
} else if (src.immersionTracking.enabled !== undefined) {
warn(
"immersionTracking.enabled",
src.immersionTracking.enabled,
resolved.immersionTracking.enabled,
"Expected boolean.",
);
}
const dbPath = asString(src.immersionTracking.dbPath);
if (dbPath !== undefined) {
resolved.immersionTracking.dbPath = dbPath;
} else if (src.immersionTracking.dbPath !== undefined) {
warn(
"immersionTracking.dbPath",
src.immersionTracking.dbPath,
resolved.immersionTracking.dbPath,
"Expected string.",
);
}
}
if (isObject(src.subtitleStyle)) {
resolved.subtitleStyle = {
...resolved.subtitleStyle,