{"record":{"id":"2efa172da854e099","repo":"linshenkx/prompt-optimizer","slug":"favorite-functionmode-mode-must-specify-optimiz","errorCode":null,"errorMessage":"${favorite.functionMode} mode must specify optimizationMode","messagePattern":"(.+?) mode must specify optimizationMode","errorType":"validation","errorClass":"FavoriteValidationError","httpStatus":null,"severity":"warning","filePath":"packages/core/src/services/favorite/manager.ts","lineNumber":277,"sourceCode":"  }\n\n  async addFavorite(favorite: Omit<FavoritePrompt, 'id' | 'createdAt' | 'updatedAt' | 'useCount'>): Promise<string> {\n    await this.ensureInitialized();\n\n    // 验证输入\n    if (!favorite.content?.trim()) {\n      throw new FavoriteValidationError('Prompt content cannot be empty');\n    }\n\n    // 验证 functionMode 必填\n    if (!favorite.functionMode) {\n      throw new FavoriteValidationError('Function mode (functionMode) cannot be empty');\n    }\n\n    // 验证功能模式分类的完整性\n    if (favorite.functionMode === 'basic' || favorite.functionMode === 'context') {\n      if (!favorite.optimizationMode) {\n        throw new FavoriteValidationError(`${favorite.functionMode} mode must specify optimizationMode`);\n      }\n    }\n\n    if (favorite.functionMode === 'image') {\n      if (!favorite.imageSubMode) {\n        throw new FavoriteValidationError('Image mode must specify imageSubMode');\n      }\n    }\n\n    assertFavoriteMetadataHasNoInlineImages(favorite.metadata);\n\n    const favoriteData = {\n      title: favorite.title?.trim() || favorite.content.slice(0, 50) + (favorite.content.length > 50 ? '...' : ''),\n      content: favorite.content,\n      description: favorite.description,\n      category: favorite.category,\n      tags: favorite.tags || [],\n      functionMode: favorite.functionMode,","sourceCodeStart":259,"sourceCodeEnd":295,"githubUrl":"https://github.com/linshenkx/prompt-optimizer/blob/3e677b1d9f7e0493c142c175560531e7ae786dce/packages/core/src/services/favorite/manager.ts#L259-L295","documentation":"addFavorite requires that favorites with functionMode 'basic' or 'context' also specify optimizationMode; otherwise it throws FavoriteValidationError with the mode interpolated into the message.","triggerScenarios":"addFavorite({ functionMode: 'basic' }) (or 'context') without optimizationMode.","commonSituations":"New call sites copying partial favorite objects; upgrade to a version that enforces mode completeness; form allows picking functionMode without optimizationMode.","solutions":["Always pair basic/context modes with an optimizationMode value","Validate the mode/optimizationMode combination in the form before submit","Add a builder helper that enforces required fields per functionMode"],"exampleFix":"// before\nawait manager.addFavorite({ content, functionMode: 'basic' });\n// after\nawait manager.addFavorite({ content, functionMode: 'basic', optimizationMode: 'standard' });","handlingStrategy":"validation","validationCode":"function assertModeComplete(f: Partial<FavoritePrompt>) {\n  if ((f.functionMode === 'basic' || f.functionMode === 'context') && !f.optimizationMode)\n    throw new Error(`${f.functionMode} needs optimizationMode`);\n}","typeGuard":"const isModeComplete = (f: Partial<FavoritePrompt>): f is FavoritePrompt =>\n  f.functionMode !== 'basic' && f.functionMode !== 'context' ? true : !!f.optimizationMode;","tryCatchPattern":"try { await manager.addFavorite(fav); } catch (e) { if (e instanceof FavoriteValidationError && /optimizationMode/.test(e.message)) { openModeDialog(); return; } throw e; }","preventionTips":["Enforce mode/optimizationMode pairs in the form model","Centralize favorite construction in one builder function","Cover each functionMode in tests"],"tags":["favorite","validation","mode-config"],"backgroundTag":"required-field-missing","analyzedSha":"3e677b1d9f7e0493c142c175560531e7ae786dce","analyzedAt":"2026-08-27T21:29:16.709Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}