@@ -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 = / ^ r e a d m e ( \. m d | \. m a r k d o w n ) ? $ / 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