{"record":{"id":"ef21e49fb3e3779b","repo":"linshenkx/prompt-optimizer","slug":"import-data-contains-favorite-with-empty-content","errorCode":null,"errorMessage":"Import data contains favorite with empty content","messagePattern":"Import data contains favorite with empty content","errorType":"validation","errorClass":"FavoriteValidationError","httpStatus":null,"severity":"error","filePath":"packages/core/src/services/favorite/manager.ts","lineNumber":1342,"sourceCode":"          }\n          const trimmed = content.trim();\n          return trimmed.length > 50 ? `${trimmed.slice(0, 50)}...` : trimmed;\n        };\n\n        const normalizeMetadata = (metadata: unknown) => {\n          if (metadata && typeof metadata === 'object') {\n            assertFavoriteMetadataHasNoInlineImages(metadata);\n            return metadata as Record<string, unknown>;\n          }\n          return undefined;\n        };\n\n        const favoritesToImport = Array.isArray(importData.favorites) ? importData.favorites : [];\n\n        favoritesToImport.forEach((favorite: any) => {\n          try {\n            if (!favorite || typeof favorite.content !== 'string' || !favorite.content.trim()) {\n              throw new FavoriteValidationError('Import data contains favorite with empty content');\n            }\n\n            const functionMode = favorite.functionMode || 'basic';\n            const optimizationMode =\n              favorite.optimizationMode ||\n              (functionMode !== 'image' ? 'system' : undefined);\n            const imageSubMode =\n              favorite.imageSubMode ||\n              (functionMode === 'image' ? 'text2image' : undefined);\n\n            const mapping = { functionMode, optimizationMode, imageSubMode };\n            if (!TypeMapper.validateMapping(mapping)) {\n              throw new FavoriteValidationError(\n                `Invalid function mode in import data: functionMode=${functionMode}, optimizationMode=${optimizationMode}, imageSubMode=${imageSubMode}`\n              );\n            }\n\n            const category = categoryMapping[favorite.category] || favorite.category;","sourceCodeStart":1324,"sourceCodeEnd":1360,"githubUrl":"https://github.com/linshenkx/prompt-optimizer/blob/3e677b1d9f7e0493c142c175560531e7ae786dce/packages/core/src/services/favorite/manager.ts#L1324-L1360","documentation":"During importFavorites, every entry in importData.favorites must be a truthy object whose content is a non-empty trimmed string. The check runs inside a per-favorite forEach try block; entries failing it throw FavoriteValidationError.","triggerScenarios":"Importing a favorites array containing null entries, entries without a content field, non-string content (e.g. number), or whitespace-only content.","commonSituations":"Hand-edited or truncated exports, data from third-party tools using different field names (text/prompt instead of content), or partially corrupted export files.","solutions":["Filter the favorites array before import, keeping only entries with non-empty string content","Map your source field (text/prompt/value) to content when converting foreign data","Regenerate the export from a known-good source if the file is corrupted"],"exampleFix":"// before\nconst data = JSON.stringify({ favorites: [{ content: '   ' }, null] });\nawait manager.importFavorites(data);\n\n// after\nconst parsed = JSON.parse(data);\nparsed.favorites = parsed.favorites.filter(f => f && typeof f.content === 'string' && f.content.trim());\nawait manager.importFavorites(JSON.stringify(parsed));","handlingStrategy":"validation","validationCode":"const parsed = JSON.parse(data);\nparsed.favorites = (parsed.favorites || []).filter(\n  (f: any) => f && typeof f?.content === 'string' && f.content.trim().length > 0\n);","typeGuard":"const hasValidContent = (f: unknown): f is { content: string } =>\n  typeof f === 'object' && f !== null &&\n  typeof (f as any).content === 'string' && (f as any).content.trim().length > 0;","tryCatchPattern":"try {\n  await manager.importFavorites(data);\n} catch (e) {\n  if (e instanceof FavoriteValidationError && /empty content/.test(e.message)) {\n    // filter out empty-content entries and retry the import\n  }\n}","preventionTips":["Filter empty-content entries from the import array up front","Map foreign field names (text/prompt) to content when converting","Never hand-craft import arrays without validating content"],"tags":["import","favorites","validation","content"],"backgroundTag":"payload-schema-validation-failed","analyzedSha":"3e677b1d9f7e0493c142c175560531e7ae786dce","analyzedAt":"2026-08-27T21:29:16.709Z","schemaVersion":2},"datasetVersion":"2026-08-28T00:17:15.603Z"}