Files
readest/apps/readest-app/src/utils/serializer.ts
T
2026-05-17 18:23:46 +02:00

68 lines
2.3 KiB
TypeScript

import {
BOOK_CONFIG_SCHEMA_VERSION,
BookConfig,
BookSearchConfig,
ViewSettings,
} from '@/types/book';
export const stampBookConfigSchema = <T extends Partial<BookConfig>>(config: T): T => {
return { ...config, schemaVersion: BOOK_CONFIG_SCHEMA_VERSION };
};
export const serializeRawConfig = (config: Partial<BookConfig>): string => {
return JSON.stringify(stampBookConfigSchema(config));
};
export const serializeConfig = (
config: BookConfig,
globalViewSettings: ViewSettings,
defaultSearchConfig: BookSearchConfig,
): string => {
config = JSON.parse(JSON.stringify(config));
const viewSettings = config.viewSettings as Partial<ViewSettings>;
const searchConfig = config.searchConfig as Partial<BookSearchConfig>;
config.viewSettings = Object.entries(viewSettings).reduce(
(acc: Partial<Record<keyof ViewSettings, unknown>>, [key, value]) => {
if (globalViewSettings[key as keyof ViewSettings] !== value) {
acc[key as keyof ViewSettings] = value;
}
return acc;
},
{} as Partial<Record<keyof ViewSettings, unknown>>,
) as Partial<ViewSettings>;
config.searchConfig = Object.entries(searchConfig).reduce(
(acc: Partial<Record<keyof BookSearchConfig, unknown>>, [key, value]) => {
if (defaultSearchConfig[key as keyof BookSearchConfig] !== value) {
acc[key as keyof BookSearchConfig] = value;
}
return acc;
},
{} as Partial<BookSearchConfig>,
) as Partial<BookSearchConfig>;
config.schemaVersion = BOOK_CONFIG_SCHEMA_VERSION;
return JSON.stringify(config);
};
export const deserializeConfig = (
str: string,
globalViewSettings: ViewSettings,
defaultSearchConfig: BookSearchConfig,
): BookConfig => {
const config = JSON.parse(str) as BookConfig;
const { viewSettings, searchConfig } = config;
config.viewSettings = { ...globalViewSettings, ...viewSettings };
config.searchConfig = { ...defaultSearchConfig, ...searchConfig };
config.schemaVersion ??= BOOK_CONFIG_SCHEMA_VERSION;
config.updatedAt ??= Date.now();
return config;
};
export const compressConfig = (
config: BookConfig,
globalViewSettings: ViewSettings,
defaultSearchConfig: BookSearchConfig,
): string => {
return JSON.parse(serializeConfig(config, globalViewSettings, defaultSearchConfig));
};