feat(macos): configuration window + curl-backed macOS updater (#71)

This commit is contained in:
2026-05-17 02:23:44 -07:00
committed by GitHub
parent 6ca5cede3e
commit e84674e3b5
100 changed files with 13890 additions and 235 deletions
+62
View File
@@ -0,0 +1,62 @@
import test from 'node:test';
import assert from 'node:assert/strict';
import {
createSettingsDraft,
filterSettingsFields,
setDraftValue,
getDirtyOperations,
} from './settings-model';
import type { ConfigSettingsField } from '../types/settings';
const fields: ConfigSettingsField[] = [
{
id: 'subtitleStyle.autoPauseVideoOnHover',
label: 'Pause on subtitle hover',
description: 'Pause while hovering subtitles.',
configPath: 'subtitleStyle.autoPauseVideoOnHover',
category: 'viewing',
section: 'Playback pause behavior',
control: 'boolean',
defaultValue: true,
restartBehavior: 'hot-reload',
},
{
id: 'ankiConnect.enabled',
label: 'Enable AnkiConnect',
description: 'Enable Anki integration.',
configPath: 'ankiConnect.enabled',
category: 'mining-anki',
section: 'Connection',
control: 'boolean',
defaultValue: true,
restartBehavior: 'restart',
},
];
test('filterSettingsFields searches label, section, and config path', () => {
assert.deepEqual(
filterSettingsFields(fields, { category: 'viewing', query: 'hover' }).map(
(field) => field.configPath,
),
['subtitleStyle.autoPauseVideoOnHover'],
);
assert.deepEqual(filterSettingsFields(fields, { category: 'viewing', query: 'anki' }), []);
});
test('settings draft tracks dirty set and emits save operations', () => {
const draft = createSettingsDraft({
'subtitleStyle.autoPauseVideoOnHover': true,
});
setDraftValue(draft, 'subtitleStyle.autoPauseVideoOnHover', false);
assert.deepEqual(getDirtyOperations(draft), [
{
op: 'set',
path: 'subtitleStyle.autoPauseVideoOnHover',
value: false,
},
]);
setDraftValue(draft, 'subtitleStyle.autoPauseVideoOnHover', true);
assert.deepEqual(getDirtyOperations(draft), []);
});