Skip to content

Commit 0909eb1

Browse files
committed
refactor: use regexp, hoist filenames, and fall back to npm readme if jsdelivr 404s
1 parent 40eed21 commit 0909eb1

1 file changed

Lines changed: 36 additions & 28 deletions

File tree

server/api/registry/readme/[...pkg].get.ts

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,20 @@ import {
66
ERROR_NPM_FETCH_FAILED,
77
} from '#shared/utils/constants'
88

9+
/** Standard README filenames to try when fetching from jsdelivr (case-sensitive CDN) */
10+
const standardReadmeFilenames = [
11+
'README.md',
12+
'readme.md',
13+
'Readme.md',
14+
'README',
15+
'readme',
16+
'README.markdown',
17+
'readme.markdown',
18+
]
19+
20+
/** Matches standard README filenames (case-insensitive, for checking registry metadata) */
21+
const standardReadmePattern = /^readme(\.md|\.markdown)?$/i
22+
923
/**
1024
* Fetch README from jsdelivr CDN for a specific package version.
1125
* Falls back through common README filenames.
@@ -59,40 +73,40 @@ export default defineCachedEventHandler(
5973
const packageData = await fetchNpmPackage(packageName)
6074

6175
let readmeContent: string | undefined
76+
let readmeFilename: string | undefined
6277

6378
// If a specific version is requested, get README from that version
6479
if (version) {
6580
const versionData = packageData.versions[version]
6681
if (versionData) {
6782
readmeContent = versionData.readme
83+
readmeFilename = versionData.readmeFilename
6884
}
6985
} else {
7086
// Use the packument-level readme (from latest version)
7187
readmeContent = packageData.readme
88+
readmeFilename = packageData.readmeFilename
7289
}
7390

74-
const standardReadmeFilenames = [
75-
'README.md',
76-
'readme.md',
77-
'Readme.md',
78-
'README',
79-
'readme',
80-
'README.markdown',
81-
'readme.markdown',
82-
]
83-
84-
// If no README in packument or if README is not in the standard filenames, try fetching from jsdelivr (package tarball)
85-
if (
86-
!readmeContent ||
87-
readmeContent === NPM_MISSING_README_SENTINEL ||
88-
!isStandardReadme(packageData.readmeFilename, standardReadmeFilenames)
89-
) {
90-
readmeContent =
91-
(await fetchReadmeFromJsdelivr(packageName, standardReadmeFilenames, version)) ??
92-
undefined
91+
const hasValidNpmReadme = readmeContent && readmeContent !== NPM_MISSING_README_SENTINEL
92+
93+
// If no README in packument, or if readmeFilename is non-standard (e.g., README.zh-TW.md),
94+
// try fetching a standard README from jsdelivr (package tarball).
95+
// Note: When readmeFilename is missing, we defensively fetch from jsdelivr to ensure
96+
// we get a standard English README if one exists.
97+
if (!hasValidNpmReadme || !isStandardReadme(readmeFilename)) {
98+
const jsdelivrReadme = await fetchReadmeFromJsdelivr(
99+
packageName,
100+
standardReadmeFilenames,
101+
version,
102+
)
103+
// Only replace npm content if jsdelivr returned something
104+
if (jsdelivrReadme) {
105+
readmeContent = jsdelivrReadme
106+
}
93107
}
94108

95-
if (!readmeContent) {
109+
if (!readmeContent || readmeContent === NPM_MISSING_README_SENTINEL) {
96110
return { html: '', playgroundLinks: [] }
97111
}
98112

@@ -117,12 +131,6 @@ export default defineCachedEventHandler(
117131
},
118132
)
119133

120-
function isStandardReadme(
121-
filename: string | undefined,
122-
standardReadmeFilenames: string[],
123-
): boolean {
124-
if (!filename) {
125-
return false
126-
}
127-
return standardReadmeFilenames.includes(filename)
134+
function isStandardReadme(filename: string | undefined): boolean {
135+
return !!filename && standardReadmePattern.test(filename)
128136
}

0 commit comments

Comments
 (0)