Skip to content

Commit 500e0c5

Browse files
committed
chore: try provided readmeFilename before starting the fallback batch
1 parent 55d6c94 commit 500e0c5

File tree

2 files changed

+89
-11
lines changed

2 files changed

+89
-11
lines changed

server/utils/readme-loaders.ts

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,9 @@ export function isStandardReadme(filename: string | undefined): boolean {
2626
}
2727

2828
function buildReadmeFetchCandidates(readmeFilename: string | undefined): string[] {
29-
if (!readmeFilename) {
30-
return standardReadmeFilenames
31-
}
32-
33-
return [readmeFilename, ...standardReadmeFilenames.filter(name => name !== readmeFilename)]
29+
return readmeFilename
30+
? standardReadmeFilenames.filter(name => name !== readmeFilename)
31+
: standardReadmeFilenames
3432
}
3533

3634
/**
@@ -105,13 +103,20 @@ export const resolvePackageReadmeSource = defineCachedFunction(
105103
!isStandardReadme(readmeFilename) ||
106104
readmeContent!.length >= NPM_README_TRUNCATION_THRESHOLD
107105
) {
108-
const readmeCandidates = buildReadmeFetchCandidates(readmeFilename)
109106
const resolvedVersion = version ?? packageData['dist-tags']?.latest
110-
const jsdelivrReadme = await fetchReadmeFromJsdelivr(
111-
packageName,
112-
readmeCandidates,
113-
resolvedVersion,
114-
)
107+
let jsdelivrReadme =
108+
readmeFilename &&
109+
(await fetchReadmeFromJsdelivr(packageName, [readmeFilename], resolvedVersion))
110+
111+
if (!jsdelivrReadme) {
112+
const readmeCandidates = buildReadmeFetchCandidates(readmeFilename)
113+
jsdelivrReadme = await fetchReadmeFromJsdelivr(
114+
packageName,
115+
readmeCandidates,
116+
resolvedVersion,
117+
)
118+
}
119+
115120
if (jsdelivrReadme) {
116121
readmeContent = jsdelivrReadme
117122
}

test/unit/server/utils/readme-loaders.spec.ts

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,79 @@ describe('resolvePackageReadmeSource', () => {
259259
expect(fetchMock).toHaveBeenNthCalledWith(1, 'https://cdn.jsdelivr.net/npm/pkg/DOCS.md')
260260
})
261261

262+
it('tries a provided readmeFilename before starting the fallback batch', async () => {
263+
let resolveDocs!: (value: { ok: false }) => void
264+
let resolveReadmeMd!: (value: { ok: false }) => void
265+
let resolveLowercase!: (value: { ok: false }) => void
266+
let resolveReadmeCase!: (value: { ok: true; text: () => Promise<string> }) => void
267+
268+
fetchNpmPackageMock.mockResolvedValue({
269+
readme: undefined,
270+
readmeFilename: 'DOCS.md',
271+
repository: undefined,
272+
versions: {},
273+
})
274+
parseRepositoryInfoMock.mockReturnValue(undefined)
275+
276+
const fetchMock = vi.fn((url: string) => {
277+
if (url.endsWith('/DOCS.md')) {
278+
return new Promise(resolve => {
279+
resolveDocs = resolve
280+
})
281+
}
282+
283+
if (url.endsWith('/README.md')) {
284+
return new Promise(resolve => {
285+
resolveReadmeMd = resolve
286+
})
287+
}
288+
289+
if (url.endsWith('/readme.md')) {
290+
return new Promise(resolve => {
291+
resolveLowercase = resolve
292+
})
293+
}
294+
295+
if (url.endsWith('/Readme.md')) {
296+
return new Promise(resolve => {
297+
resolveReadmeCase = resolve
298+
})
299+
}
300+
301+
return Promise.resolve({ ok: false })
302+
})
303+
vi.stubGlobal('fetch', fetchMock)
304+
305+
const resultPromise = resolvePackageReadmeSource('pkg')
306+
307+
await new Promise(resolve => setTimeout(resolve, 0))
308+
expect(fetchMock).toHaveBeenCalledTimes(1)
309+
expect(fetchMock).toHaveBeenNthCalledWith(1, 'https://cdn.jsdelivr.net/npm/pkg/DOCS.md')
310+
311+
resolveDocs({ ok: false })
312+
313+
await new Promise(resolve => setTimeout(resolve, 0))
314+
expect(fetchMock).toHaveBeenCalledTimes(4)
315+
expect(fetchMock.mock.calls.slice(1).map(([url]) => url)).toEqual([
316+
'https://cdn.jsdelivr.net/npm/pkg/README.md',
317+
'https://cdn.jsdelivr.net/npm/pkg/readme.md',
318+
'https://cdn.jsdelivr.net/npm/pkg/Readme.md',
319+
])
320+
321+
resolveReadmeMd({ ok: false })
322+
resolveLowercase({ ok: false })
323+
resolveReadmeCase({
324+
ok: true,
325+
text: async () => '# From fallback batch',
326+
})
327+
328+
await expect(resultPromise).resolves.toMatchObject({
329+
packageName: 'pkg',
330+
markdown: '# From fallback batch',
331+
repoInfo: undefined,
332+
})
333+
})
334+
262335
it('returns undefined markdown when no content and jsdelivr fails', async () => {
263336
fetchNpmPackageMock.mockResolvedValue({
264337
readme: undefined,

0 commit comments

Comments
 (0)