1- import type { ChangelogReleaseInfo } from '~~/shared/types/changelog'
1+ import type { ChangelogReleaseInfo , ChangelogMarkdownInfo } from '~~/shared/types/changelog'
2+ import { ERROR_CHANGELOG_NOT_FOUND } from '~~/shared/utils/constants'
23import { type RepoRef , parseRepoUrl } from '~~/shared/utils/git-providers'
34import type { ExtendedPackageJson } from '~~/shared/utils/package-analysis'
45// ChangelogInfo
@@ -22,9 +23,16 @@ export async function detectChangelog(
2223 return false
2324 }
2425
25- const releaseInfo = await checkReleases ( repoRef )
26+ const changelog = ( await checkReleases ( repoRef ) ) || ( await checkChangelogFile ( repoRef ) )
2627
27- return releaseInfo || checkChangelogFile ( repoRef )
28+ if ( changelog ) {
29+ return changelog
30+ }
31+
32+ throw createError ( {
33+ statusCode : 404 ,
34+ statusMessage : ERROR_CHANGELOG_NOT_FOUND ,
35+ } )
2836}
2937
3038/**
@@ -69,13 +77,23 @@ function getLatestReleaseUrl(ref: RepoRef): null | string[] {
6977 return null
7078}
7179
72- const CHANGELOG_FILENAMES = [ 'changelog ' , 'history' , 'changes' , 'news' , 'releases '] as const
80+ const EXTENSIONS = [ '.md ' , '' ] as const
7381
74- async function checkChangelogFile ( ref : RepoRef ) {
75- const checkUrls = getChangelogUrls ( ref )
82+ const CHANGELOG_FILENAMES = [ 'changelog' , 'releases' , 'changes' , 'history' , 'news' ]
83+ . map ( fileName => {
84+ const fileNameUpperCase = fileName . toUpperCase ( )
85+ return EXTENSIONS . map ( ext => [ `${ fileNameUpperCase } ${ ext } ` , `${ fileName } ${ ext } ` ] )
86+ } )
87+ . flat ( 3 )
7688
77- for ( const checkUrl of checkUrls ?? [ ] ) {
78- const exists = await fetch ( checkUrl , {
89+ async function checkChangelogFile ( ref : RepoRef ) : Promise < ChangelogMarkdownInfo | false > {
90+ const baseUrl = getBaseFileUrl ( ref )
91+ if ( ! baseUrl ) {
92+ return false
93+ }
94+
95+ for ( const fileName of CHANGELOG_FILENAMES ) {
96+ const exists = await fetch ( `${ baseUrl } /${ fileName } ` , {
7997 headers : {
8098 // GitHub API requires User-Agent
8199 'User-Agent' : 'npmx.dev' ,
@@ -85,32 +103,16 @@ async function checkChangelogFile(ref: RepoRef) {
85103 . then ( r => r . ok )
86104 . catch ( ( ) => false )
87105 if ( exists ) {
88- console . log ( 'exists' , checkUrl )
89- return true
106+ return {
107+ type : 'md' ,
108+ provider : ref . provider ,
109+ path : fileName ,
110+ } satisfies ChangelogMarkdownInfo
90111 }
91112 }
92113 return false
93114}
94115
95- function getChangelogUrls ( ref : RepoRef ) {
96- const baseUrl = getBaseFileUrl ( ref )
97- if ( ! baseUrl ) {
98- return
99- }
100-
101- return CHANGELOG_FILENAMES . flatMap ( fileName => {
102- const fileNameUpCase = fileName . toUpperCase ( )
103- return [
104- `${ baseUrl } /${ fileNameUpCase } .md` ,
105- `${ baseUrl } /${ fileName } .md` ,
106- `${ baseUrl } /${ fileNameUpCase } ` ,
107- `${ baseUrl } /${ fileName } ` ,
108- `${ baseUrl } /${ fileNameUpCase } .txt` ,
109- `${ baseUrl } /${ fileName } .txt` ,
110- ]
111- } )
112- }
113-
114116function getBaseFileUrl ( ref : RepoRef ) {
115117 switch ( ref . provider ) {
116118 case 'github' :
0 commit comments