Skip to content

Commit 31e5fed

Browse files
committed
fix: correctly detect type info in badge
1 parent 9ae5629 commit 31e5fed

File tree

1 file changed

+66
-5
lines changed

1 file changed

+66
-5
lines changed

server/api/registry/badge/[type]/[...pkg].get.ts

Lines changed: 66 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -373,11 +373,72 @@ const badgeStrategies = {
373373
},
374374

375375
'types': async (pkgData: globalThis.Packument) => {
376-
const latest = getLatestVersion(pkgData)
377-
const versionData = latest ? pkgData.versions?.[latest] : undefined
378-
const hasTypes = !!(versionData?.types || versionData?.typings)
379-
const value = hasTypes ? 'included' : 'missing'
380-
const color = hasTypes ? COLORS.blue : COLORS.slate
376+
const versionData = pkgData.versions?.latest
377+
378+
if (!versionData) {
379+
return { label: 'types', value: 'unknown', color: COLORS.slate }
380+
}
381+
382+
const pkgJson: ExtendedPackageJson = {
383+
name: pkgData.name,
384+
version: 'latest',
385+
types: versionData.types,
386+
typings: versionData.typings,
387+
exports: versionData.exports,
388+
main: versionData.main,
389+
module: versionData.module,
390+
type: versionData.type,
391+
}
392+
393+
let typesStatus: TypesStatus = { kind: 'none' }
394+
let detailColor = COLORS.blue
395+
396+
if (hasBuiltInTypes(pkgJson)) {
397+
typesStatus = { kind: 'included' }
398+
} else {
399+
try {
400+
const [fileTreeResult, typesMetaResult] = await Promise.allSettled([
401+
getPackageFileTree(pkgData.name, latest),
402+
getLatestVersion(getTypesPackageName(pkgData.name), { metadata: true, throw: false }),
403+
])
404+
405+
let files: Set<string> | undefined
406+
if (fileTreeResult.status === 'fulfilled') {
407+
files = flattenFileTree(fileTreeResult.value.tree)
408+
}
409+
410+
let typesPkg: TypesPackageInfo | undefined
411+
if (typesMetaResult.status === 'fulfilled' && !('error' in typesMetaResult.value)) {
412+
typesPkg = {
413+
packageName: getTypesPackageName(pkgData.name),
414+
deprecated: typesMetaResult.value.deprecated,
415+
}
416+
}
417+
418+
typesStatus = detectTypesStatus(pkgJson, typesPkg, files)
419+
} catch {}
420+
}
421+
422+
let value: 'included' | '@types' | 'missing'
423+
let color: string
424+
425+
switch (typesStatus.kind) {
426+
case 'included': {
427+
value = 'included'
428+
color = COLORS.blue
429+
break
430+
}
431+
case '@types': {
432+
value = '@types'
433+
color = COLORS.blue
434+
break
435+
}
436+
default: {
437+
value = 'missing'
438+
color = COLORS.slate
439+
break
440+
}
441+
}
381442
return { label: 'types', value, color }
382443
},
383444

0 commit comments

Comments
 (0)