From f628414982026f0d98c292f564fba57e9899e754 Mon Sep 17 00:00:00 2001 From: Luke Oliff Date: Fri, 13 Feb 2026 08:17:31 +0000 Subject: [PATCH 1/3] fix(readme): fetch README from jsDelivr to avoid npm registry truncation The npm registry truncates the packument readme field at exactly 65,536 characters, causing large READMEs to render incomplete. Fetch the actual README file from jsDelivr CDN (npm tarball) as the primary source, falling back to the packument field when jsDelivr doesn't have it. Closes #1458 --- server/utils/readme-loaders.ts | 45 +++--- test/unit/server/utils/readme-loaders.spec.ts | 151 +++++++++++------- 2 files changed, 118 insertions(+), 78 deletions(-) diff --git a/server/utils/readme-loaders.ts b/server/utils/readme-loaders.ts index 8af25d7a9..10b31f060 100644 --- a/server/utils/readme-loaders.ts +++ b/server/utils/readme-loaders.ts @@ -58,35 +58,34 @@ export const resolvePackageReadmeSource = defineCachedFunction( }) const packageData = await fetchNpmPackage(packageName) + const resolvedVersion = version ?? packageData['dist-tags']?.latest - let readmeContent: string | undefined - let readmeFilename: string | undefined - - if (version) { - const versionData = packageData.versions[version] - if (versionData) { - readmeContent = versionData.readme - readmeFilename = versionData.readmeFilename + // Prefer jsDelivr (actual file from npm tarball) because the npm registry + // truncates the packument readme field at 65,536 characters. + let readmeContent = await fetchReadmeFromJsdelivr( + packageName, + standardReadmeFilenames, + resolvedVersion, + ) + + // Fall back to packument readme if jsDelivr didn't have a standard README. + // This covers packages with non-standard readme filenames (e.g. README.zh-TW.md) + // or packages that don't include a README in the tarball. + if (!readmeContent) { + let packumentReadme: string | undefined + + if (version) { + packumentReadme = packageData.versions?.[version]?.readme + } else { + packumentReadme = packageData.readme } - } else { - readmeContent = packageData.readme - readmeFilename = packageData.readmeFilename - } - const hasValidNpmReadme = readmeContent && readmeContent !== NPM_MISSING_README_SENTINEL - - if (!hasValidNpmReadme || !isStandardReadme(readmeFilename)) { - const jsdelivrReadme = await fetchReadmeFromJsdelivr( - packageName, - standardReadmeFilenames, - version, - ) - if (jsdelivrReadme) { - readmeContent = jsdelivrReadme + if (packumentReadme && packumentReadme !== NPM_MISSING_README_SENTINEL) { + readmeContent = packumentReadme } } - if (!readmeContent || readmeContent === NPM_MISSING_README_SENTINEL) { + if (!readmeContent) { return { packageName, version, diff --git a/test/unit/server/utils/readme-loaders.spec.ts b/test/unit/server/utils/readme-loaders.spec.ts index 8fb2ce818..e080d230a 100644 --- a/test/unit/server/utils/readme-loaders.spec.ts +++ b/test/unit/server/utils/readme-loaders.spec.ts @@ -81,13 +81,14 @@ describe('resolvePackageReadmeSource', () => { parseRepositoryInfoMock.mockReset() }) - it('returns markdown and repoInfo when package has valid npm readme (latest)', async () => { - const markdown = '# Hello' + it('prefers jsDelivr readme over packument readme (latest)', async () => { + const jsdelivrContent = '# Full README from CDN' fetchNpmPackageMock.mockResolvedValue({ - readme: markdown, - readmeFilename: 'README.md', - repository: { url: 'https://github.com/u/r' }, - versions: {}, + 'readme': '# Truncated', + 'readmeFilename': 'README.md', + 'repository': { url: 'https://github.com/u/r' }, + 'versions': {}, + 'dist-tags': { latest: '2.0.0' }, }) parseRepositoryInfoMock.mockReturnValue({ provider: 'github', @@ -96,90 +97,122 @@ describe('resolvePackageReadmeSource', () => { rawBaseUrl: 'https://raw.githubusercontent.com/u/r/HEAD', blobBaseUrl: 'https://github.com/u/r/blob/HEAD', }) + const fetchMock = vi.fn().mockResolvedValue({ + ok: true, + text: async () => jsdelivrContent, + }) + vi.stubGlobal('fetch', fetchMock) const result = await resolvePackageReadmeSource('some-pkg') expect(result).toMatchObject({ packageName: 'some-pkg', version: undefined, - markdown, + markdown: jsdelivrContent, repoInfo: { provider: 'github', owner: 'u', repo: 'r' }, }) expect(fetchNpmPackageMock).toHaveBeenCalledWith('some-pkg') }) - it('returns markdown from version when packagePath includes version', async () => { - const markdown = '# Version readme' + it('uses resolved latest version for jsDelivr when no version specified', async () => { + fetchNpmPackageMock.mockResolvedValue({ + 'readme': '# Packument', + 'readmeFilename': 'README.md', + 'repository': undefined, + 'versions': {}, + 'dist-tags': { latest: '3.1.0' }, + }) + parseRepositoryInfoMock.mockReturnValue(undefined) + const fetchMock = vi.fn().mockResolvedValue({ + ok: true, + text: async () => '# CDN', + }) + vi.stubGlobal('fetch', fetchMock) + + await resolvePackageReadmeSource('pkg') + + expect(fetchMock).toHaveBeenCalledWith(expect.stringContaining('pkg@3.1.0')) + }) + + it('returns markdown from specific version jsDelivr when packagePath includes version', async () => { + const jsdelivrContent = '# Version readme from CDN' fetchNpmPackageMock.mockResolvedValue({ - readme: 'latest readme', - readmeFilename: 'README.md', - repository: undefined, - versions: { - '1.0.0': { readme: markdown, readmeFilename: 'README.md' }, + 'readme': 'latest readme', + 'readmeFilename': 'README.md', + 'repository': undefined, + 'versions': { + '1.0.0': { readme: 'version readme from packument', readmeFilename: 'README.md' }, }, + 'dist-tags': { latest: '2.0.0' }, }) parseRepositoryInfoMock.mockReturnValue(undefined) + const fetchMock = vi.fn().mockResolvedValue({ + ok: true, + text: async () => jsdelivrContent, + }) + vi.stubGlobal('fetch', fetchMock) const result = await resolvePackageReadmeSource('some-pkg/v/1.0.0') expect(result).toMatchObject({ packageName: 'some-pkg', version: '1.0.0', - markdown, + markdown: jsdelivrContent, }) + expect(fetchMock).toHaveBeenCalledWith(expect.stringContaining('some-pkg@1.0.0')) }) - it('falls back to jsdelivr when npm readme is missing sentinel', async () => { - const jsdelivrContent = '# From CDN' + it('falls back to packument readme when jsDelivr fails', async () => { + const packumentReadme = '# From packument' fetchNpmPackageMock.mockResolvedValue({ - readme: NPM_MISSING_README_SENTINEL, - readmeFilename: 'README.md', - repository: undefined, - versions: {}, + 'readme': packumentReadme, + 'readmeFilename': 'README.md', + 'repository': undefined, + 'versions': {}, + 'dist-tags': { latest: '1.0.0' }, }) parseRepositoryInfoMock.mockReturnValue(undefined) - const fetchMock = vi.fn().mockResolvedValue({ - ok: true, - text: async () => jsdelivrContent, - }) + const fetchMock = vi.fn().mockResolvedValue({ ok: false }) vi.stubGlobal('fetch', fetchMock) const result = await resolvePackageReadmeSource('pkg') expect(result).toMatchObject({ packageName: 'pkg', - markdown: jsdelivrContent, - repoInfo: undefined, + markdown: packumentReadme, }) - expect(fetchMock).toHaveBeenCalled() }) - it('falls back to jsdelivr when readmeFilename is not standard', async () => { - const jsdelivrContent = '# From CDN' + it('falls back to version packument readme when jsDelivr fails', async () => { + const versionReadme = '# Version readme' fetchNpmPackageMock.mockResolvedValue({ - readme: 'content', - readmeFilename: 'DOCS.md', - repository: undefined, - versions: {}, + 'readme': 'latest readme', + 'repository': undefined, + 'versions': { + '1.0.0': { readme: versionReadme }, + }, + 'dist-tags': { latest: '1.0.0' }, }) parseRepositoryInfoMock.mockReturnValue(undefined) - const fetchMock = vi.fn().mockResolvedValue({ - ok: true, - text: async () => jsdelivrContent, - }) + const fetchMock = vi.fn().mockResolvedValue({ ok: false }) vi.stubGlobal('fetch', fetchMock) - const result = await resolvePackageReadmeSource('pkg') + const result = await resolvePackageReadmeSource('pkg/v/1.0.0') - expect(result).toMatchObject({ markdown: jsdelivrContent }) + expect(result).toMatchObject({ + packageName: 'pkg', + version: '1.0.0', + markdown: versionReadme, + }) }) - it('returns undefined markdown when no content and jsdelivr fails', async () => { + it('skips packument readme with missing sentinel in fallback', async () => { fetchNpmPackageMock.mockResolvedValue({ - readme: undefined, - readmeFilename: undefined, - repository: undefined, - versions: {}, + 'readme': NPM_MISSING_README_SENTINEL, + 'readmeFilename': 'README.md', + 'repository': undefined, + 'versions': {}, + 'dist-tags': { latest: '1.0.0' }, }) parseRepositoryInfoMock.mockReturnValue(undefined) const fetchMock = vi.fn().mockResolvedValue({ ok: false }) @@ -189,19 +222,20 @@ describe('resolvePackageReadmeSource', () => { expect(result).toMatchObject({ packageName: 'pkg', - version: undefined, markdown: undefined, repoInfo: undefined, }) }) - it('returns undefined markdown when content is NPM_MISSING_README_SENTINEL and jsdelivr fails', async () => { + it('returns undefined markdown when no content anywhere', async () => { fetchNpmPackageMock.mockResolvedValue({ - readme: NPM_MISSING_README_SENTINEL, - readmeFilename: 'README.md', - repository: undefined, - versions: {}, + 'readme': undefined, + 'readmeFilename': undefined, + 'repository': undefined, + 'versions': {}, + 'dist-tags': { latest: '1.0.0' }, }) + parseRepositoryInfoMock.mockReturnValue(undefined) const fetchMock = vi.fn().mockResolvedValue({ ok: false }) vi.stubGlobal('fetch', fetchMock) @@ -209,6 +243,7 @@ describe('resolvePackageReadmeSource', () => { expect(result).toMatchObject({ packageName: 'pkg', + version: undefined, markdown: undefined, repoInfo: undefined, }) @@ -216,10 +251,11 @@ describe('resolvePackageReadmeSource', () => { it('uses package repository for repoInfo when markdown is present', async () => { fetchNpmPackageMock.mockResolvedValue({ - readme: '# Hi', - readmeFilename: 'README.md', - repository: { url: 'https://github.com/a/b' }, - versions: {}, + 'readme': '# Hi', + 'readmeFilename': 'README.md', + 'repository': { url: 'https://github.com/a/b' }, + 'versions': {}, + 'dist-tags': { latest: '1.0.0' }, }) const repoInfo = { provider: 'github' as const, @@ -229,6 +265,11 @@ describe('resolvePackageReadmeSource', () => { blobBaseUrl: 'https://github.com/a/b/blob/HEAD', } parseRepositoryInfoMock.mockReturnValue(repoInfo) + const fetchMock = vi.fn().mockResolvedValue({ + ok: true, + text: async () => '# CDN', + }) + vi.stubGlobal('fetch', fetchMock) const result = await resolvePackageReadmeSource('pkg') From cbba5285030674b8a8e96bd6d8ef96758bc0fed8 Mon Sep 17 00:00:00 2001 From: Luke Oliff Date: Fri, 13 Feb 2026 09:24:18 +0000 Subject: [PATCH 2/3] fix(readme): fetch from jsDelivr when packument readme is likely truncated The npm registry truncates the packument readme field at 65,536 characters. When the readme length exceeds 64,000 characters, fetch the full file from jsDelivr CDN instead. Closes #1458 --- server/utils/readme-loaders.ts | 55 +++--- shared/utils/constants.ts | 2 + test/unit/server/utils/readme-loaders.spec.ts | 160 ++++++++---------- 3 files changed, 105 insertions(+), 112 deletions(-) diff --git a/server/utils/readme-loaders.ts b/server/utils/readme-loaders.ts index 10b31f060..5e08e5c56 100644 --- a/server/utils/readme-loaders.ts +++ b/server/utils/readme-loaders.ts @@ -1,6 +1,10 @@ import * as v from 'valibot' import { PackageRouteParamsSchema } from '#shared/schemas/package' -import { CACHE_MAX_AGE_ONE_HOUR, NPM_MISSING_README_SENTINEL } from '#shared/utils/constants' +import { + CACHE_MAX_AGE_ONE_HOUR, + NPM_MISSING_README_SENTINEL, + NPM_README_TRUNCATION_THRESHOLD, +} from '#shared/utils/constants' /** Standard README filenames to try when fetching from jsdelivr (case-sensitive CDN) */ const standardReadmeFilenames = [ @@ -58,34 +62,39 @@ export const resolvePackageReadmeSource = defineCachedFunction( }) const packageData = await fetchNpmPackage(packageName) - const resolvedVersion = version ?? packageData['dist-tags']?.latest - // Prefer jsDelivr (actual file from npm tarball) because the npm registry - // truncates the packument readme field at 65,536 characters. - let readmeContent = await fetchReadmeFromJsdelivr( - packageName, - standardReadmeFilenames, - resolvedVersion, - ) - - // Fall back to packument readme if jsDelivr didn't have a standard README. - // This covers packages with non-standard readme filenames (e.g. README.zh-TW.md) - // or packages that don't include a README in the tarball. - if (!readmeContent) { - let packumentReadme: string | undefined - - if (version) { - packumentReadme = packageData.versions?.[version]?.readme - } else { - packumentReadme = packageData.readme + let readmeContent: string | undefined + let readmeFilename: string | undefined + + if (version) { + const versionData = packageData.versions[version] + if (versionData) { + readmeContent = versionData.readme + readmeFilename = versionData.readmeFilename } + } else { + readmeContent = packageData.readme + readmeFilename = packageData.readmeFilename + } - if (packumentReadme && packumentReadme !== NPM_MISSING_README_SENTINEL) { - readmeContent = packumentReadme + const hasValidNpmReadme = readmeContent && readmeContent !== NPM_MISSING_README_SENTINEL + + const isLikelyTruncated = + hasValidNpmReadme && readmeContent!.length >= NPM_README_TRUNCATION_THRESHOLD + + if (!hasValidNpmReadme || !isStandardReadme(readmeFilename) || isLikelyTruncated) { + const resolvedVersion = version ?? packageData['dist-tags']?.latest + const jsdelivrReadme = await fetchReadmeFromJsdelivr( + packageName, + standardReadmeFilenames, + resolvedVersion, + ) + if (jsdelivrReadme) { + readmeContent = jsdelivrReadme } } - if (!readmeContent) { + if (!readmeContent || readmeContent === NPM_MISSING_README_SENTINEL) { return { packageName, version, diff --git a/shared/utils/constants.ts b/shared/utils/constants.ts index 7ef81ff83..1d3575673 100644 --- a/shared/utils/constants.ts +++ b/shared/utils/constants.ts @@ -21,6 +21,8 @@ export const ERROR_PACKAGE_REQUIREMENTS_FAILED = export const ERROR_FILE_LIST_FETCH_FAILED = 'Failed to fetch file list.' export const ERROR_CALC_INSTALL_SIZE_FAILED = 'Failed to calculate install size.' export const NPM_MISSING_README_SENTINEL = 'ERROR: No README data found!' +/** The npm registry truncates the packument readme field at 65,536 characters (2^16) */ +export const NPM_README_TRUNCATION_THRESHOLD = 64_000 export const ERROR_JSR_FETCH_FAILED = 'Failed to fetch package from JSR registry.' export const ERROR_NPM_FETCH_FAILED = 'Failed to fetch package from npm registry.' export const ERROR_PROVENANCE_FETCH_FAILED = 'Failed to fetch provenance.' diff --git a/test/unit/server/utils/readme-loaders.spec.ts b/test/unit/server/utils/readme-loaders.spec.ts index e080d230a..1cc237e2b 100644 --- a/test/unit/server/utils/readme-loaders.spec.ts +++ b/test/unit/server/utils/readme-loaders.spec.ts @@ -81,14 +81,13 @@ describe('resolvePackageReadmeSource', () => { parseRepositoryInfoMock.mockReset() }) - it('prefers jsDelivr readme over packument readme (latest)', async () => { - const jsdelivrContent = '# Full README from CDN' + it('returns markdown and repoInfo when package has valid npm readme (latest)', async () => { + const markdown = '# Hello' fetchNpmPackageMock.mockResolvedValue({ - 'readme': '# Truncated', - 'readmeFilename': 'README.md', - 'repository': { url: 'https://github.com/u/r' }, - 'versions': {}, - 'dist-tags': { latest: '2.0.0' }, + readme: markdown, + readmeFilename: 'README.md', + repository: { url: 'https://github.com/u/r' }, + versions: {}, }) parseRepositoryInfoMock.mockReturnValue({ provider: 'github', @@ -97,53 +96,46 @@ describe('resolvePackageReadmeSource', () => { rawBaseUrl: 'https://raw.githubusercontent.com/u/r/HEAD', blobBaseUrl: 'https://github.com/u/r/blob/HEAD', }) - const fetchMock = vi.fn().mockResolvedValue({ - ok: true, - text: async () => jsdelivrContent, - }) - vi.stubGlobal('fetch', fetchMock) const result = await resolvePackageReadmeSource('some-pkg') expect(result).toMatchObject({ packageName: 'some-pkg', version: undefined, - markdown: jsdelivrContent, + markdown, repoInfo: { provider: 'github', owner: 'u', repo: 'r' }, }) expect(fetchNpmPackageMock).toHaveBeenCalledWith('some-pkg') }) - it('uses resolved latest version for jsDelivr when no version specified', async () => { + it('returns markdown from version when packagePath includes version', async () => { + const markdown = '# Version readme' fetchNpmPackageMock.mockResolvedValue({ - 'readme': '# Packument', - 'readmeFilename': 'README.md', - 'repository': undefined, - 'versions': {}, - 'dist-tags': { latest: '3.1.0' }, + readme: 'latest readme', + readmeFilename: 'README.md', + repository: undefined, + versions: { + '1.0.0': { readme: markdown, readmeFilename: 'README.md' }, + }, }) parseRepositoryInfoMock.mockReturnValue(undefined) - const fetchMock = vi.fn().mockResolvedValue({ - ok: true, - text: async () => '# CDN', - }) - vi.stubGlobal('fetch', fetchMock) - await resolvePackageReadmeSource('pkg') + const result = await resolvePackageReadmeSource('some-pkg/v/1.0.0') - expect(fetchMock).toHaveBeenCalledWith(expect.stringContaining('pkg@3.1.0')) + expect(result).toMatchObject({ + packageName: 'some-pkg', + version: '1.0.0', + markdown, + }) }) - it('returns markdown from specific version jsDelivr when packagePath includes version', async () => { - const jsdelivrContent = '# Version readme from CDN' + it('falls back to jsdelivr when npm readme is missing sentinel', async () => { + const jsdelivrContent = '# From CDN' fetchNpmPackageMock.mockResolvedValue({ - 'readme': 'latest readme', - 'readmeFilename': 'README.md', - 'repository': undefined, - 'versions': { - '1.0.0': { readme: 'version readme from packument', readmeFilename: 'README.md' }, - }, - 'dist-tags': { latest: '2.0.0' }, + readme: NPM_MISSING_README_SENTINEL, + readmeFilename: 'README.md', + repository: undefined, + versions: {}, }) parseRepositoryInfoMock.mockReturnValue(undefined) const fetchMock = vi.fn().mockResolvedValue({ @@ -152,69 +144,64 @@ describe('resolvePackageReadmeSource', () => { }) vi.stubGlobal('fetch', fetchMock) - const result = await resolvePackageReadmeSource('some-pkg/v/1.0.0') + const result = await resolvePackageReadmeSource('pkg') expect(result).toMatchObject({ - packageName: 'some-pkg', - version: '1.0.0', + packageName: 'pkg', markdown: jsdelivrContent, + repoInfo: undefined, }) - expect(fetchMock).toHaveBeenCalledWith(expect.stringContaining('some-pkg@1.0.0')) + expect(fetchMock).toHaveBeenCalled() }) - it('falls back to packument readme when jsDelivr fails', async () => { - const packumentReadme = '# From packument' + it('falls back to jsdelivr when readmeFilename is not standard', async () => { + const jsdelivrContent = '# From CDN' fetchNpmPackageMock.mockResolvedValue({ - 'readme': packumentReadme, - 'readmeFilename': 'README.md', - 'repository': undefined, - 'versions': {}, - 'dist-tags': { latest: '1.0.0' }, + readme: 'content', + readmeFilename: 'DOCS.md', + repository: undefined, + versions: {}, }) parseRepositoryInfoMock.mockReturnValue(undefined) - const fetchMock = vi.fn().mockResolvedValue({ ok: false }) + const fetchMock = vi.fn().mockResolvedValue({ + ok: true, + text: async () => jsdelivrContent, + }) vi.stubGlobal('fetch', fetchMock) const result = await resolvePackageReadmeSource('pkg') - expect(result).toMatchObject({ - packageName: 'pkg', - markdown: packumentReadme, - }) + expect(result).toMatchObject({ markdown: jsdelivrContent }) }) - it('falls back to version packument readme when jsDelivr fails', async () => { - const versionReadme = '# Version readme' + it('returns undefined markdown when no content and jsdelivr fails', async () => { fetchNpmPackageMock.mockResolvedValue({ - 'readme': 'latest readme', - 'repository': undefined, - 'versions': { - '1.0.0': { readme: versionReadme }, - }, - 'dist-tags': { latest: '1.0.0' }, + readme: undefined, + readmeFilename: undefined, + repository: undefined, + versions: {}, }) parseRepositoryInfoMock.mockReturnValue(undefined) const fetchMock = vi.fn().mockResolvedValue({ ok: false }) vi.stubGlobal('fetch', fetchMock) - const result = await resolvePackageReadmeSource('pkg/v/1.0.0') + const result = await resolvePackageReadmeSource('pkg') expect(result).toMatchObject({ packageName: 'pkg', - version: '1.0.0', - markdown: versionReadme, + version: undefined, + markdown: undefined, + repoInfo: undefined, }) }) - it('skips packument readme with missing sentinel in fallback', async () => { + it('returns undefined markdown when content is NPM_MISSING_README_SENTINEL and jsdelivr fails', async () => { fetchNpmPackageMock.mockResolvedValue({ - 'readme': NPM_MISSING_README_SENTINEL, - 'readmeFilename': 'README.md', - 'repository': undefined, - 'versions': {}, - 'dist-tags': { latest: '1.0.0' }, + readme: NPM_MISSING_README_SENTINEL, + readmeFilename: 'README.md', + repository: undefined, + versions: {}, }) - parseRepositoryInfoMock.mockReturnValue(undefined) const fetchMock = vi.fn().mockResolvedValue({ ok: false }) vi.stubGlobal('fetch', fetchMock) @@ -227,35 +214,35 @@ describe('resolvePackageReadmeSource', () => { }) }) - it('returns undefined markdown when no content anywhere', async () => { + it('fetches from jsdelivr when packument readme exceeds truncation threshold', async () => { + const truncatedReadme = 'x'.repeat(64_000) + const fullReadme = 'x'.repeat(80_000) fetchNpmPackageMock.mockResolvedValue({ - 'readme': undefined, - 'readmeFilename': undefined, + 'readme': truncatedReadme, + 'readmeFilename': 'README.md', 'repository': undefined, 'versions': {}, 'dist-tags': { latest: '1.0.0' }, }) parseRepositoryInfoMock.mockReturnValue(undefined) - const fetchMock = vi.fn().mockResolvedValue({ ok: false }) + const fetchMock = vi.fn().mockResolvedValue({ + ok: true, + text: async () => fullReadme, + }) vi.stubGlobal('fetch', fetchMock) const result = await resolvePackageReadmeSource('pkg') - expect(result).toMatchObject({ - packageName: 'pkg', - version: undefined, - markdown: undefined, - repoInfo: undefined, - }) + expect(result).toMatchObject({ markdown: fullReadme }) + expect(fetchMock).toHaveBeenCalled() }) it('uses package repository for repoInfo when markdown is present', async () => { fetchNpmPackageMock.mockResolvedValue({ - 'readme': '# Hi', - 'readmeFilename': 'README.md', - 'repository': { url: 'https://github.com/a/b' }, - 'versions': {}, - 'dist-tags': { latest: '1.0.0' }, + readme: '# Hi', + readmeFilename: 'README.md', + repository: { url: 'https://github.com/a/b' }, + versions: {}, }) const repoInfo = { provider: 'github' as const, @@ -265,11 +252,6 @@ describe('resolvePackageReadmeSource', () => { blobBaseUrl: 'https://github.com/a/b/blob/HEAD', } parseRepositoryInfoMock.mockReturnValue(repoInfo) - const fetchMock = vi.fn().mockResolvedValue({ - ok: true, - text: async () => '# CDN', - }) - vi.stubGlobal('fetch', fetchMock) const result = await resolvePackageReadmeSource('pkg') From 0c2ac8a8538c83b7ec4dadc22f3270b0d77a429b Mon Sep 17 00:00:00 2001 From: Luke Oliff Date: Fri, 13 Feb 2026 09:39:00 +0000 Subject: [PATCH 3/3] refactor(readme): avoid computing truncation check unnecessarily Move the length comparison into the if condition so JS short-circuits past it when the earlier checks already trigger the jsDelivr fetch. --- server/utils/readme-loaders.ts | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/server/utils/readme-loaders.ts b/server/utils/readme-loaders.ts index 5e08e5c56..116e4a1a1 100644 --- a/server/utils/readme-loaders.ts +++ b/server/utils/readme-loaders.ts @@ -79,10 +79,11 @@ export const resolvePackageReadmeSource = defineCachedFunction( const hasValidNpmReadme = readmeContent && readmeContent !== NPM_MISSING_README_SENTINEL - const isLikelyTruncated = - hasValidNpmReadme && readmeContent!.length >= NPM_README_TRUNCATION_THRESHOLD - - if (!hasValidNpmReadme || !isStandardReadme(readmeFilename) || isLikelyTruncated) { + if ( + !hasValidNpmReadme || + !isStandardReadme(readmeFilename) || + readmeContent!.length >= NPM_README_TRUNCATION_THRESHOLD + ) { const resolvedVersion = version ?? packageData['dist-tags']?.latest const jsdelivrReadme = await fetchReadmeFromJsdelivr( packageName,