 163217dfcd
			
		
	
	
		163217dfcd
		
			
		
	
	
	
	
		
			
			* `utl-helper.ts` now leverages well-known environment variables. --------- Co-authored-by: Erez Testiler <easyt@github.com>
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import * as assert from 'assert'
 | |
| import {URL} from 'url'
 | |
| import {IGitSourceSettings} from './git-source-settings'
 | |
| 
 | |
| export function getFetchUrl(settings: IGitSourceSettings): string {
 | |
|   assert.ok(
 | |
|     settings.repositoryOwner,
 | |
|     'settings.repositoryOwner must be defined'
 | |
|   )
 | |
|   assert.ok(settings.repositoryName, 'settings.repositoryName must be defined')
 | |
|   const serviceUrl = getServerUrl(settings.githubServerUrl)
 | |
|   const encodedOwner = encodeURIComponent(settings.repositoryOwner)
 | |
|   const encodedName = encodeURIComponent(settings.repositoryName)
 | |
|   if (settings.sshKey) {
 | |
|     const user = settings.sshUser.length > 0 ? settings.sshUser : 'git'
 | |
|     return `${user}@${serviceUrl.hostname}:${encodedOwner}/${encodedName}.git`
 | |
|   }
 | |
| 
 | |
|   // "origin" is SCHEME://HOSTNAME[:PORT]
 | |
|   return `${serviceUrl.origin}/${encodedOwner}/${encodedName}`
 | |
| }
 | |
| 
 | |
| export function getServerUrl(url?: string): URL {
 | |
|   let resolvedUrl = process.env['GITHUB_SERVER_URL'] || 'https://github.com'
 | |
|   if (hasContent(url, WhitespaceMode.Trim)) {
 | |
|     resolvedUrl = url!
 | |
|   }
 | |
| 
 | |
|   return new URL(resolvedUrl)
 | |
| }
 | |
| 
 | |
| export function getServerApiUrl(url?: string): string {
 | |
|   if (hasContent(url, WhitespaceMode.Trim)) {
 | |
|     let serverUrl = getServerUrl(url)
 | |
|     if (isGhes(url)) {
 | |
|       serverUrl.pathname = 'api/v3'
 | |
|     } else {
 | |
|       serverUrl.hostname = 'api.' + serverUrl.hostname
 | |
|     }
 | |
| 
 | |
|     return pruneSuffix(serverUrl.toString(), '/')
 | |
|   }
 | |
| 
 | |
|   return process.env['GITHUB_API_URL'] || 'https://api.github.com'
 | |
| }
 | |
| 
 | |
| export function isGhes(url?: string): boolean {
 | |
|   const ghUrl = new URL(
 | |
|     url || process.env['GITHUB_SERVER_URL'] || 'https://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
 | |
| }
 |