mirror of
				https://github.com/actions/checkout.git
				synced 2025-10-30 23:10:31 +00:00 
			
		
		
		
	url-helper.ts now leverages well-known environment variables. (#1941)
				
					
				
			* `utl-helper.ts` now leverages well-known environment variables. --------- Co-authored-by: Erez Testiler <easyt@github.com>
This commit is contained in:
		 John Wesley Walker III
					John Wesley Walker III
				
			
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			 GitHub
						GitHub
					
				
			
						parent
						
							eef61447b9
						
					
				
				
					commit
					163217dfcd
				
			
							
								
								
									
										55
									
								
								__test__/url-helper.test.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								__test__/url-helper.test.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | |||||||
|  | import * as urlHelper from '../src/url-helper' | ||||||
|  |  | ||||||
|  | describe('getServerUrl tests', () => { | ||||||
|  |   it('basics', async () => { | ||||||
|  |     // Note that URL::toString will append a trailing / when passed just a domain name ... | ||||||
|  |     expect(urlHelper.getServerUrl().toString()).toBe('https://github.com/') | ||||||
|  |     expect(urlHelper.getServerUrl(' ').toString()).toBe('https://github.com/') | ||||||
|  |     expect(urlHelper.getServerUrl('   ').toString()).toBe('https://github.com/') | ||||||
|  |     expect(urlHelper.getServerUrl('http://contoso.com').toString()).toBe( | ||||||
|  |       'http://contoso.com/' | ||||||
|  |     ) | ||||||
|  |     expect(urlHelper.getServerUrl('https://contoso.com').toString()).toBe( | ||||||
|  |       'https://contoso.com/' | ||||||
|  |     ) | ||||||
|  |     expect(urlHelper.getServerUrl('https://contoso.com/').toString()).toBe( | ||||||
|  |       'https://contoso.com/' | ||||||
|  |     ) | ||||||
|  |  | ||||||
|  |     // ... but can't make that same assumption when passed an URL that includes some deeper path. | ||||||
|  |     expect(urlHelper.getServerUrl('https://contoso.com/a/b').toString()).toBe( | ||||||
|  |       'https://contoso.com/a/b' | ||||||
|  |     ) | ||||||
|  |   }) | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | describe('isGhes tests', () => { | ||||||
|  |   it('basics', async () => { | ||||||
|  |     expect(urlHelper.isGhes()).toBeFalsy() | ||||||
|  |     expect(urlHelper.isGhes('https://github.com')).toBeFalsy() | ||||||
|  |     expect(urlHelper.isGhes('https://contoso.ghe.com')).toBeFalsy() | ||||||
|  |     expect(urlHelper.isGhes('https://test.github.localhost')).toBeFalsy() | ||||||
|  |     expect(urlHelper.isGhes('https://src.onpremise.fabrikam.com')).toBeTruthy() | ||||||
|  |   }) | ||||||
|  | }) | ||||||
|  |  | ||||||
|  | describe('getServerApiUrl tests', () => { | ||||||
|  |   it('basics', async () => { | ||||||
|  |     expect(urlHelper.getServerApiUrl()).toBe('https://api.github.com') | ||||||
|  |     expect(urlHelper.getServerApiUrl('https://github.com')).toBe( | ||||||
|  |       'https://api.github.com' | ||||||
|  |     ) | ||||||
|  |     expect(urlHelper.getServerApiUrl('https://GitHub.com')).toBe( | ||||||
|  |       'https://api.github.com' | ||||||
|  |     ) | ||||||
|  |     expect(urlHelper.getServerApiUrl('https://contoso.ghe.com')).toBe( | ||||||
|  |       'https://api.contoso.ghe.com' | ||||||
|  |     ) | ||||||
|  |     expect(urlHelper.getServerApiUrl('https://fabrikam.GHE.COM')).toBe( | ||||||
|  |       'https://api.fabrikam.ghe.com' | ||||||
|  |     ) | ||||||
|  |     expect( | ||||||
|  |       urlHelper.getServerApiUrl('https://src.onpremise.fabrikam.com') | ||||||
|  |     ).toBe('https://src.onpremise.fabrikam.com/api/v3') | ||||||
|  |   }) | ||||||
|  | }) | ||||||
							
								
								
									
										48
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										48
									
								
								dist/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -2454,22 +2454,50 @@ function getFetchUrl(settings) { | |||||||
|     return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`; |     return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`; | ||||||
| } | } | ||||||
| function getServerUrl(url) { | function getServerUrl(url) { | ||||||
|     let urlValue = url && url.trim().length > 0 |     let resolvedUrl = process.env['GITHUB_SERVER_URL'] || 'https://github.com'; | ||||||
|         ? url |     if (hasContent(url, WhitespaceMode.Trim)) { | ||||||
|         : process.env['GITHUB_SERVER_URL'] || 'https://github.com'; |         resolvedUrl = url; | ||||||
|     return new url_1.URL(urlValue); |     } | ||||||
|  |     return new url_1.URL(resolvedUrl); | ||||||
| } | } | ||||||
| function getServerApiUrl(url) { | function getServerApiUrl(url) { | ||||||
|     let apiUrl = 'https://api.github.com'; |     if (hasContent(url, WhitespaceMode.Trim)) { | ||||||
|  |         let serverUrl = getServerUrl(url); | ||||||
|         if (isGhes(url)) { |         if (isGhes(url)) { | ||||||
|         const serverUrl = getServerUrl(url); |             serverUrl.pathname = 'api/v3'; | ||||||
|         apiUrl = new url_1.URL(`${serverUrl.origin}/api/v3`).toString(); |  | ||||||
|         } |         } | ||||||
|     return apiUrl; |         else { | ||||||
|  |             serverUrl.hostname = 'api.' + serverUrl.hostname; | ||||||
|  |         } | ||||||
|  |         return pruneSuffix(serverUrl.toString(), '/'); | ||||||
|  |     } | ||||||
|  |     return process.env['GITHUB_API_URL'] || 'https://api.github.com'; | ||||||
| } | } | ||||||
| function isGhes(url) { | function isGhes(url) { | ||||||
|     const ghUrl = getServerUrl(url); |     const ghUrl = new url_1.URL(url || process.env['GITHUB_SERVER_URL'] || 'https://github.com'); | ||||||
|     return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM'; |     const hostname = ghUrl.hostname.trimEnd().toUpperCase(); | ||||||
|  |     const isGitHubHost = hostname === 'GITHUB.COM'; | ||||||
|  |     const isGitHubEnterpriseCloudHost = hostname.endsWith('.GHE.COM'); | ||||||
|  |     const isLocalHost = hostname.endsWith('.LOCALHOST'); | ||||||
|  |     return !isGitHubHost && !isGitHubEnterpriseCloudHost && !isLocalHost; | ||||||
|  | } | ||||||
|  | function pruneSuffix(text, suffix) { | ||||||
|  |     if (hasContent(suffix, WhitespaceMode.Preserve) && (text === null || text === void 0 ? void 0 : text.endsWith(suffix))) { | ||||||
|  |         return text.substring(0, text.length - suffix.length); | ||||||
|  |     } | ||||||
|  |     return text; | ||||||
|  | } | ||||||
|  | var WhitespaceMode; | ||||||
|  | (function (WhitespaceMode) { | ||||||
|  |     WhitespaceMode[WhitespaceMode["Trim"] = 0] = "Trim"; | ||||||
|  |     WhitespaceMode[WhitespaceMode["Preserve"] = 1] = "Preserve"; | ||||||
|  | })(WhitespaceMode || (WhitespaceMode = {})); | ||||||
|  | function hasContent(text, whitespaceMode) { | ||||||
|  |     let refinedText = text !== null && text !== void 0 ? text : ''; | ||||||
|  |     if (whitespaceMode == WhitespaceMode.Trim) { | ||||||
|  |         refinedText = refinedText.trim(); | ||||||
|  |     } | ||||||
|  |     return refinedText.length > 0; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   | |||||||
| @@ -21,26 +21,61 @@ export function getFetchUrl(settings: IGitSourceSettings): string { | |||||||
| } | } | ||||||
|  |  | ||||||
| export function getServerUrl(url?: string): URL { | export function getServerUrl(url?: string): URL { | ||||||
|   let urlValue = |   let resolvedUrl = process.env['GITHUB_SERVER_URL'] || 'https://github.com' | ||||||
|     url && url.trim().length > 0 |   if (hasContent(url, WhitespaceMode.Trim)) { | ||||||
|       ? url |     resolvedUrl = url! | ||||||
|       : process.env['GITHUB_SERVER_URL'] || 'https://github.com' |   } | ||||||
|   return new URL(urlValue) |  | ||||||
|  |   return new URL(resolvedUrl) | ||||||
| } | } | ||||||
|  |  | ||||||
| export function getServerApiUrl(url?: string): string { | export function getServerApiUrl(url?: string): string { | ||||||
|   let apiUrl = 'https://api.github.com' |   if (hasContent(url, WhitespaceMode.Trim)) { | ||||||
|  |     let serverUrl = getServerUrl(url) | ||||||
|     if (isGhes(url)) { |     if (isGhes(url)) { | ||||||
|     const serverUrl = getServerUrl(url) |       serverUrl.pathname = 'api/v3' | ||||||
|     apiUrl = new URL(`${serverUrl.origin}/api/v3`).toString() |     } else { | ||||||
|  |       serverUrl.hostname = 'api.' + serverUrl.hostname | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   return apiUrl |     return pruneSuffix(serverUrl.toString(), '/') | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   return process.env['GITHUB_API_URL'] || 'https://api.github.com' | ||||||
| } | } | ||||||
|  |  | ||||||
| export function isGhes(url?: string): boolean { | export function isGhes(url?: string): boolean { | ||||||
|   const ghUrl = getServerUrl(url) |   const ghUrl = new URL( | ||||||
|  |     url || process.env['GITHUB_SERVER_URL'] || 'https://github.com' | ||||||
|  |   ) | ||||||
|  |  | ||||||
|   return ghUrl.hostname.toUpperCase() !== 'GITHUB.COM' |   const hostname = ghUrl.hostname.trimEnd().toUpperCase() | ||||||
|  |   const isGitHubHost = hostname === 'GITHUB.COM' | ||||||
|  |   const isGitHubEnterpriseCloudHost = hostname.endsWith('.GHE.COM') | ||||||
|  |   const isLocalHost = hostname.endsWith('.LOCALHOST') | ||||||
|  |  | ||||||
|  |   return !isGitHubHost && !isGitHubEnterpriseCloudHost && !isLocalHost | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function pruneSuffix(text: string, suffix: string) { | ||||||
|  |   if (hasContent(suffix, WhitespaceMode.Preserve) && text?.endsWith(suffix)) { | ||||||
|  |     return text.substring(0, text.length - suffix.length) | ||||||
|  |   } | ||||||
|  |   return text | ||||||
|  | } | ||||||
|  |  | ||||||
|  | enum WhitespaceMode { | ||||||
|  |   Trim, | ||||||
|  |   Preserve | ||||||
|  | } | ||||||
|  |  | ||||||
|  | function hasContent( | ||||||
|  |   text: string | undefined, | ||||||
|  |   whitespaceMode: WhitespaceMode | ||||||
|  | ): boolean { | ||||||
|  |   let refinedText = text ?? '' | ||||||
|  |   if (whitespaceMode == WhitespaceMode.Trim) { | ||||||
|  |     refinedText = refinedText.trim() | ||||||
|  |   } | ||||||
|  |   return refinedText.length > 0 | ||||||
| } | } | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user