Files
bDS/src/main/config/macroConfig.ts
Georg Bauer 1b4ab08c37 Cleanup/code cleanup 2026 03 (#45)
* chore: cleanup of unused exports and stuff

* fix: media and languages was broken for english media

* fix: embedding model load was broken on standalone

---------

Co-authored-by: hugo <hugoms@me.com>
2026-03-10 19:54:38 +01:00

108 lines
3.1 KiB
TypeScript

/**
* Shared Macro Configuration
*
* This file defines the macro validation rules that can be used by both
* renderer and main process (e.g., for import analysis validation).
*
* The full macro implementations (with render functions) live in:
* src/renderer/macros/definitions/
*/
export interface MacroConfig {
/** The macro name (lowercase) */
name: string;
/** Human-readable description */
description: string;
/** Required parameters that must be present */
requiredParams?: string[];
/** Optional parameter validation function */
validate?: (params: Record<string, string>) => string | undefined;
}
/**
* Registry of known macro configurations.
* Add new macros here to enable validation during import analysis.
*/
const macroConfigs: MacroConfig[] = [
{
name: 'youtube',
description: 'Embeds a YouTube video player',
requiredParams: ['id'],
validate: (params) => {
if (!params.id) {
return 'YouTube macro requires an "id" parameter (the video ID)';
}
// Basic validation of YouTube ID format (11 characters)
if (!/^[\w-]{11}$/.test(params.id)) {
return 'Invalid YouTube video ID format';
}
return undefined;
},
},
{
name: 'vimeo',
description: 'Embeds a Vimeo video player',
requiredParams: ['id'],
validate: (params) => {
if (!params.id) {
return 'Vimeo macro requires an "id" parameter (the video ID)';
}
// Vimeo IDs are numeric
if (!/^\d+$/.test(params.id)) {
return 'Invalid Vimeo video ID format (should be numeric)';
}
return undefined;
},
},
{
name: 'gallery',
description: 'Renders an image gallery from linked media files',
validate: (params) => {
if (params.columns) {
const cols = parseInt(params.columns, 10);
if (isNaN(cols) || cols < 1 || cols > 6) {
return 'Gallery columns must be a number between 1 and 6';
}
}
// 'link' parameter is accepted for backwards compatibility but ignored
return undefined;
},
},
{
name: 'photo_archive',
description: 'Creates a photo archive gallery organized by year and month, or shows recent months',
validate: (params) => {
// Year is optional - if not provided, shows recent 10 months
if (params.year) {
const year = parseInt(params.year, 10);
if (isNaN(year) || year < 1000 || year > 9999) {
return 'Year must be a valid 4-digit year (e.g., 2024)';
}
}
// Month requires year
if (params.month) {
if (!params.year) {
return 'Month parameter requires a year parameter';
}
const month = parseInt(params.month, 10);
if (isNaN(month) || month < 1 || month > 12) {
return 'Month must be a number between 1 and 12';
}
}
return undefined;
},
},
];
/**
* Get a map of macro configs by name for quick lookup.
*/
export function getMacroConfigMap(): Map<string, MacroConfig> {
const map = new Map<string, MacroConfig>();
for (const config of macroConfigs) {
map.set(config.name.toLowerCase(), config);
}
return map;
}