github.com/tilt-dev/tilt@v0.33.15-0.20240515162809-0a22ed45d8a0/pkg/tiltextension/name.go (about)

     1  package tiltextension
     2  
     3  // Most of the code in this file is adopted from NPM's module name rules
     4  // https://github.com/npm/validate-npm-package-name/blob/master/index.js
     5  
     6  import (
     7  	"fmt"
     8  	"net/url"
     9  	"strings"
    10  )
    11  
    12  const maxModuleNameLength = 214
    13  
    14  var banList = []string{
    15  	"tilt_modules",
    16  	"Tiltfile",
    17  }
    18  
    19  func ValidateName(name string) error {
    20  	if len(name) == 0 {
    21  		return fmt.Errorf("name length must be greater than zero")
    22  	}
    23  
    24  	if strings.HasPrefix(name, ".") {
    25  		return fmt.Errorf("name cannot start with a period")
    26  	}
    27  
    28  	if strings.HasPrefix(name, "_") {
    29  		return fmt.Errorf("name cannot start with an underscore")
    30  	}
    31  
    32  	if strings.TrimSpace(name) != name {
    33  		return fmt.Errorf("name cannot contain leading or trailing spaces")
    34  	}
    35  
    36  	for _, b := range banList {
    37  		if strings.EqualFold(name, b) {
    38  			return fmt.Errorf("%s is a banned name", b)
    39  		}
    40  	}
    41  
    42  	if len(name) > maxModuleNameLength {
    43  		return fmt.Errorf("name cannot contain more than 214 characters")
    44  	}
    45  
    46  	if url.PathEscape(name) != name {
    47  		return fmt.Errorf("name can only contain URL-friendly characters")
    48  	}
    49  
    50  	if strings.Contains(name, ":") {
    51  		return fmt.Errorf("name cannot contain `:`")
    52  	}
    53  
    54  	return nil
    55  }