linshenkx/prompt-optimizer · warning · FavoriteValidationError
Function mode (functionMode) cannot be empty
Error message
Function mode (functionMode) cannot be empty
What it means
addFavorite rejects with FavoriteValidationError when favorite.functionMode is falsy. Every favorite must declare its function mode (e.g. basic/context/image) so downstream behavior is deterministic.
Source
Thrown at packages/core/src/services/favorite/manager.ts:271
// ✅ 标记已初始化
await this.storageProvider.setItem('favorite_categories_initialized', 'true');
}
} catch (error) {
console.warn('[FavoriteManager] Failed to ensure default categories:', error);
}
}
async addFavorite(favorite: Omit<FavoritePrompt, 'id' | 'createdAt' | 'updatedAt' | 'useCount'>): Promise<string> {
await this.ensureInitialized();
// 验证输入
if (!favorite.content?.trim()) {
throw new FavoriteValidationError('Prompt content cannot be empty');
}
// 验证 functionMode 必填
if (!favorite.functionMode) {
throw new FavoriteValidationError('Function mode (functionMode) cannot be empty');
}
// 验证功能模式分类的完整性
if (favorite.functionMode === 'basic' || favorite.functionMode === 'context') {
if (!favorite.optimizationMode) {
throw new FavoriteValidationError(`${favorite.functionMode} mode must specify optimizationMode`);
}
}
if (favorite.functionMode === 'image') {
if (!favorite.imageSubMode) {
throw new FavoriteValidationError('Image mode must specify imageSubMode');
}
}
assertFavoriteMetadataHasNoInlineImages(favorite.metadata);
const favoriteData = {View on GitHub (pinned to 3e677b1d9f)
Solutions
- Set functionMode explicitly on every favorite you create
- Default it in a mapping layer when upgrading old call sites
- Catch FavoriteValidationError to find remaining call sites during migration
Example fix
// before
await manager.addFavorite({ content, title });
// after
await manager.addFavorite({ content, title, functionMode: 'basic', optimizationMode: 'standard' }); Defensive patterns
Strategy: validation
Validate before calling
if (!fav.functionMode) fav = { ...fav, functionMode: 'basic', optimizationMode: 'standard' }; Type guard
const hasFunctionMode = (f: Partial<FavoritePrompt>): f is FavoritePrompt & { functionMode: string } => !!f.functionMode; Try / catch
try { await manager.addFavorite(fav); } catch (e) { if (e instanceof FavoriteValidationError && /functionMode/.test(e.message)) { fav.functionMode = 'basic'; return manager.addFavorite(fav as any); } throw e; } Prevention
- Always construct favorites via a typed builder
- Add a compile-time Required check on functionMode at call sites
- Grep old call sites when upgrading the library
When it happens
Trigger: await manager.addFavorite({ content: 'x' }) with no functionMode — introduced when the functionMode field became mandatory.
Common situations: Code written against an older API where functionMode was optional; deserialized records missing the field; form not updated after upgrading the library.
Related errors
- ${label} testCaseId must not be empty.
- VALIDATION_ERROR
- Prompt content cannot be empty
- ${favorite.functionMode} mode must specify optimizationMode
- Image mode must specify imageSubMode
AI-assisted analysis of linshenkx/prompt-optimizer@3e677b1d9f (2026-08-27).
Data as JSON: /api/errors/d53c305a116edad2.
Report an issue: GitHub.