( context: FilenameContext, settings: TaskFilenameSettings )
| 130 | * Generates a filename based on the configured format and context |
| 131 | */ |
| 132 | export function generateTaskFilename( |
| 133 | context: FilenameContext, |
| 134 | settings: TaskFilenameSettings |
| 135 | ): string { |
| 136 | // Validate inputs |
| 137 | if (!context || !settings) { |
| 138 | throw new Error("Invalid context or settings provided"); |
| 139 | } |
| 140 | |
| 141 | if (!context.title || typeof context.title !== "string") { |
| 142 | throw new Error("Context must have a valid title"); |
| 143 | } |
| 144 | |
| 145 | // Validate title content |
| 146 | if (context.title.trim().length === 0) { |
| 147 | throw new Error("Title cannot be empty"); |
| 148 | } |
| 149 | |
| 150 | const now = context.date || new Date(); |
| 151 | |
| 152 | // Validate date |
| 153 | if (!(now instanceof Date) || isNaN(now.getTime())) { |
| 154 | throw new Error("Invalid date provided in context"); |
| 155 | } |
| 156 | |
| 157 | if (settings.storeTitleInFilename) { |
| 158 | return sanitizeForFilename(context.title); |
| 159 | } |
| 160 | |
| 161 | try { |
| 162 | switch (settings.taskFilenameFormat) { |
| 163 | case "title": |
| 164 | return sanitizeForFilename(context.title); |
| 165 | |
| 166 | case "zettel": |
| 167 | return generateZettelId(now); |
| 168 | |
| 169 | case "timestamp": |
| 170 | return generateTimestampFilename(now); |
| 171 | |
| 172 | case "uuid": |
| 173 | return generateUUIDFilename(); |
| 174 | |
| 175 | case "custom": |
| 176 | return generateCustomFilename(context, settings.customFilenameTemplate, now); |
| 177 | |
| 178 | default: |
| 179 | // Fallback to zettel format |
| 180 | return generateZettelId(now); |
| 181 | } |
| 182 | } catch (error) { |
| 183 | tasknotesLogger.error("Error generating filename:", { |
| 184 | category: "persistence", |
| 185 | operation: "generating-filename", |
| 186 | error: error, |
| 187 | }); |
| 188 | // Fallback to safe zettel format |
| 189 | return generateZettelId(now); |
no test coverage detected