2025-10-15 10:12:44 +03:00

134 lines
3.5 KiB
Go

package build
import "time"
type upToDateStatusType uint16
const (
// Errors:
// config file was not found
upToDateStatusTypeConfigFileNotFound upToDateStatusType = iota
// found errors during build
upToDateStatusTypeBuildErrors
// did not build because upstream project has errors - and we have option to stop build on upstream errors
upToDateStatusTypeUpstreamErrors
// Its all good, no work to do
upToDateStatusTypeUpToDate
// Pseudo-builds - touch timestamps, no actual build:
// The project appears out of date because its upstream inputs are newer than its outputs,
// but all of its outputs are actually newer than the previous identical outputs of its (.d.ts) inputs.
// This means we can Pseudo-build (just touch timestamps), as if we had actually built this project.
upToDateStatusTypeUpToDateWithUpstreamTypes
// The project appears up to date and even though input file changed, its text didnt so just need to update timestamps
upToDateStatusTypeUpToDateWithInputFileText
// Needs build:
// input file is missing
upToDateStatusTypeInputFileMissing
// output file is missing
upToDateStatusTypeOutputMissing
// input file is newer than output file
upToDateStatusTypeInputFileNewer
// build info is out of date as we need to emit some files
upToDateStatusTypeOutOfDateBuildInfoWithPendingEmit
// build info indicates that project has errors and they need to be reported
upToDateStatusTypeOutOfDateBuildInfoWithErrors
// build info options indicate there is work to do based on changes in options
upToDateStatusTypeOutOfDateOptions
// file was root when built but not any more
upToDateStatusTypeOutOfDateRoots
// buildInfo.version mismatch with current ts version
upToDateStatusTypeTsVersionOutputOfDate
// build because --force was specified
upToDateStatusTypeForceBuild
// solution file
upToDateStatusTypeSolution
)
type inputOutputName struct {
input string
output string
}
type fileAndTime struct {
file string
time time.Time
}
type inputOutputFileAndTime struct {
input fileAndTime
output fileAndTime
buildInfo string
}
type upstreamErrors struct {
ref string
refHasUpstreamErrors bool
}
type upToDateStatus struct {
kind upToDateStatusType
data any
}
func (s *upToDateStatus) isError() bool {
switch s.kind {
case upToDateStatusTypeConfigFileNotFound,
upToDateStatusTypeBuildErrors,
upToDateStatusTypeUpstreamErrors:
return true
default:
return false
}
}
func (s *upToDateStatus) isPseudoBuild() bool {
switch s.kind {
case upToDateStatusTypeUpToDateWithUpstreamTypes,
upToDateStatusTypeUpToDateWithInputFileText:
return true
default:
return false
}
}
func (s *upToDateStatus) inputOutputFileAndTime() *inputOutputFileAndTime {
data, ok := s.data.(*inputOutputFileAndTime)
if !ok {
return nil
}
return data
}
func (s *upToDateStatus) inputOutputName() *inputOutputName {
data, ok := s.data.(*inputOutputName)
if !ok {
return nil
}
return data
}
func (s *upToDateStatus) oldestOutputFileName() string {
if !s.isPseudoBuild() && s.kind != upToDateStatusTypeUpToDate {
panic("only valid for up to date status of pseudo-build or up to date")
}
if inputOutputFileAndTime := s.inputOutputFileAndTime(); inputOutputFileAndTime != nil {
return inputOutputFileAndTime.output.file
}
if inputOutputName := s.inputOutputName(); inputOutputName != nil {
return inputOutputName.output
}
return s.data.(string)
}
func (s *upToDateStatus) upstreamErrors() *upstreamErrors {
return s.data.(*upstreamErrors)
}