(a: NpmSearchResult, b: NpmSearchResult, option: SortOption)
| 312 | |
| 313 | // Sort comparators |
| 314 | function comparePackages(a: NpmSearchResult, b: NpmSearchResult, option: SortOption): number { |
| 315 | const { key, direction } = parseSortOption(option) |
| 316 | const multiplier = direction === 'asc' ? 1 : -1 |
| 317 | |
| 318 | let diff: number |
| 319 | switch (key) { |
| 320 | case 'downloads-week': |
| 321 | diff = (a.downloads?.weekly ?? 0) - (b.downloads?.weekly ?? 0) |
| 322 | break |
| 323 | case 'downloads-day': |
| 324 | case 'downloads-month': |
| 325 | case 'downloads-year': |
| 326 | // Not yet implemented - fall back to weekly |
| 327 | diff = (a.downloads?.weekly ?? 0) - (b.downloads?.weekly ?? 0) |
| 328 | break |
| 329 | case 'updated': |
| 330 | diff = Date.parse(a.package.date) - Date.parse(b.package.date) |
| 331 | break |
| 332 | case 'name': |
| 333 | diff = a.package.name.localeCompare(b.package.name) |
| 334 | break |
| 335 | case 'relevance': |
| 336 | // Relevance preserves server order (already sorted by search relevance) |
| 337 | diff = 0 |
| 338 | break |
| 339 | default: |
| 340 | diff = 0 |
| 341 | } |
| 342 | |
| 343 | return diff * multiplier |
| 344 | } |
| 345 | |
| 346 | // Apply sorting to filtered results |
| 347 | const sortedPackages = computed(() => { |
no test coverage detected