fix: compare ZIM catalog versions numerically

This commit is contained in:
NgoQuocViet2001 2026-07-21 09:13:18 +07:00
parent 30008c068a
commit c69f4c0ff9
2 changed files with 38 additions and 1 deletions

View File

@ -7,13 +7,31 @@ export type ResolvedZimDownload = {
sizeBytes: number | undefined
}
function compareZimVersions(left: string, right: string): number {
const parse = (value: string): [number, number] | null => {
const match = /^(\d{4})-(\d{1,2})$/.exec(value)
if (!match) return null
const month = Number.parseInt(match[2], 10)
if (month < 1 || month > 12) return null
return [Number.parseInt(match[1], 10), month]
}
const leftParts = parse(left)
const rightParts = parse(right)
if (!leftParts || !rightParts) return left.localeCompare(right)
return leftParts[0] - rightParts[0] || leftParts[1] - rightParts[1]
}
export function resolveZimDownload(
resource: SpecResource,
latest: CatalogResult | null
): ResolvedZimDownload {
const manifestSizeBytes = resource.size_mb > 0 ? resource.size_mb * 1024 * 1024 : undefined
if (!latest || latest.version < resource.version) {
if (!latest || compareZimVersions(latest.version, resource.version) < 0) {
return {
url: resource.url,
version: resource.version,

View File

@ -54,3 +54,22 @@ test('older catalog result does not replace newer manifest metadata', () => {
assert.equal(resolved.url, manifestResource.url)
assert.equal(resolved.version, manifestResource.version)
})
test('non-padded catalog months are compared numerically', () => {
const resource = {
...manifestResource,
version: '2026-2',
url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-2.zim',
}
const resolved = resolveZimDownload(resource, {
version: '2026-10',
download_url: 'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-10.zim',
size_bytes: 13_000,
})
assert.equal(
resolved.url,
'https://download.kiwix.org/zim/wikipedia/wikipedia_en_all_mini_2026-10.zim'
)
assert.equal(resolved.version, '2026-10')
})