github.com/evanw/esbuild@v0.21.4/internal/compat/css_table.go (about)

     1  // This file was automatically generated by "css_table.ts"
     2  
     3  package compat
     4  
     5  import (
     6  	"github.com/evanw/esbuild/internal/css_ast"
     7  )
     8  
     9  type CSSFeature uint16
    10  
    11  const (
    12  	ColorFunctions CSSFeature = 1 << iota
    13  	GradientDoublePosition
    14  	GradientInterpolation
    15  	GradientMidpoints
    16  	HWB
    17  	HexRGBA
    18  	InlineStyle
    19  	InsetProperty
    20  	IsPseudoClass
    21  	Modern_RGB_HSL
    22  	Nesting
    23  	RebeccaPurple
    24  )
    25  
    26  var StringToCSSFeature = map[string]CSSFeature{
    27  	"color-functions":          ColorFunctions,
    28  	"gradient-double-position": GradientDoublePosition,
    29  	"gradient-interpolation":   GradientInterpolation,
    30  	"gradient-midpoints":       GradientMidpoints,
    31  	"hwb":                      HWB,
    32  	"hex-rgba":                 HexRGBA,
    33  	"inline-style":             InlineStyle,
    34  	"inset-property":           InsetProperty,
    35  	"is-pseudo-class":          IsPseudoClass,
    36  	"modern-rgb-hsl":           Modern_RGB_HSL,
    37  	"nesting":                  Nesting,
    38  	"rebecca-purple":           RebeccaPurple,
    39  }
    40  
    41  func (features CSSFeature) Has(feature CSSFeature) bool {
    42  	return (features & feature) != 0
    43  }
    44  
    45  func (features CSSFeature) ApplyOverrides(overrides CSSFeature, mask CSSFeature) CSSFeature {
    46  	return (features & ^mask) | (overrides & mask)
    47  }
    48  
    49  var cssTable = map[CSSFeature]map[Engine][]versionRange{
    50  	ColorFunctions: {
    51  		Chrome:  {{start: v{111, 0, 0}}},
    52  		Edge:    {{start: v{111, 0, 0}}},
    53  		Firefox: {{start: v{113, 0, 0}}},
    54  		IOS:     {{start: v{15, 4, 0}}},
    55  		Opera:   {{start: v{97, 0, 0}}},
    56  		Safari:  {{start: v{15, 4, 0}}},
    57  	},
    58  	GradientDoublePosition: {
    59  		Chrome:  {{start: v{72, 0, 0}}},
    60  		Edge:    {{start: v{79, 0, 0}}},
    61  		Firefox: {{start: v{83, 0, 0}}},
    62  		IOS:     {{start: v{12, 2, 0}}},
    63  		Opera:   {{start: v{60, 0, 0}}},
    64  		Safari:  {{start: v{12, 1, 0}}},
    65  	},
    66  	GradientInterpolation: {
    67  		Chrome: {{start: v{111, 0, 0}}},
    68  		Edge:   {{start: v{111, 0, 0}}},
    69  		IOS:    {{start: v{16, 2, 0}}},
    70  		Opera:  {{start: v{97, 0, 0}}},
    71  		Safari: {{start: v{16, 2, 0}}},
    72  	},
    73  	GradientMidpoints: {
    74  		Chrome:  {{start: v{40, 0, 0}}},
    75  		Edge:    {{start: v{79, 0, 0}}},
    76  		Firefox: {{start: v{36, 0, 0}}},
    77  		IOS:     {{start: v{7, 0, 0}}},
    78  		Opera:   {{start: v{27, 0, 0}}},
    79  		Safari:  {{start: v{7, 0, 0}}},
    80  	},
    81  	HWB: {
    82  		Chrome:  {{start: v{101, 0, 0}}},
    83  		Edge:    {{start: v{101, 0, 0}}},
    84  		Firefox: {{start: v{96, 0, 0}}},
    85  		IOS:     {{start: v{15, 0, 0}}},
    86  		Opera:   {{start: v{87, 0, 0}}},
    87  		Safari:  {{start: v{15, 0, 0}}},
    88  	},
    89  	HexRGBA: {
    90  		Chrome:  {{start: v{62, 0, 0}}},
    91  		Edge:    {{start: v{79, 0, 0}}},
    92  		Firefox: {{start: v{49, 0, 0}}},
    93  		IOS:     {{start: v{9, 3, 0}}},
    94  		Opera:   {{start: v{49, 0, 0}}},
    95  		Safari:  {{start: v{10, 0, 0}}},
    96  	},
    97  	InlineStyle: {},
    98  	InsetProperty: {
    99  		Chrome:  {{start: v{87, 0, 0}}},
   100  		Edge:    {{start: v{87, 0, 0}}},
   101  		Firefox: {{start: v{66, 0, 0}}},
   102  		IOS:     {{start: v{14, 5, 0}}},
   103  		Opera:   {{start: v{73, 0, 0}}},
   104  		Safari:  {{start: v{14, 1, 0}}},
   105  	},
   106  	IsPseudoClass: {
   107  		Chrome:  {{start: v{88, 0, 0}}},
   108  		Edge:    {{start: v{88, 0, 0}}},
   109  		Firefox: {{start: v{78, 0, 0}}},
   110  		IOS:     {{start: v{14, 0, 0}}},
   111  		Opera:   {{start: v{75, 0, 0}}},
   112  		Safari:  {{start: v{14, 0, 0}}},
   113  	},
   114  	Modern_RGB_HSL: {
   115  		Chrome:  {{start: v{66, 0, 0}}},
   116  		Edge:    {{start: v{79, 0, 0}}},
   117  		Firefox: {{start: v{52, 0, 0}}},
   118  		IOS:     {{start: v{12, 2, 0}}},
   119  		Opera:   {{start: v{53, 0, 0}}},
   120  		Safari:  {{start: v{12, 1, 0}}},
   121  	},
   122  	Nesting: {
   123  		Chrome:  {{start: v{120, 0, 0}}},
   124  		Edge:    {{start: v{120, 0, 0}}},
   125  		Firefox: {{start: v{117, 0, 0}}},
   126  		IOS:     {{start: v{17, 2, 0}}},
   127  		Opera:   {{start: v{106, 0, 0}}},
   128  		Safari:  {{start: v{17, 2, 0}}},
   129  	},
   130  	RebeccaPurple: {
   131  		Chrome:  {{start: v{38, 0, 0}}},
   132  		Edge:    {{start: v{12, 0, 0}}},
   133  		Firefox: {{start: v{33, 0, 0}}},
   134  		IE:      {{start: v{11, 0, 0}}},
   135  		IOS:     {{start: v{8, 0, 0}}},
   136  		Opera:   {{start: v{25, 0, 0}}},
   137  		Safari:  {{start: v{9, 0, 0}}},
   138  	},
   139  }
   140  
   141  // Return all features that are not available in at least one environment
   142  func UnsupportedCSSFeatures(constraints map[Engine]Semver) (unsupported CSSFeature) {
   143  	for feature, engines := range cssTable {
   144  		if feature == InlineStyle {
   145  			continue // This is purely user-specified
   146  		}
   147  		for engine, version := range constraints {
   148  			if !engine.IsBrowser() {
   149  				// Specifying "--target=es2020" shouldn't affect CSS
   150  				continue
   151  			}
   152  			if versionRanges, ok := engines[engine]; !ok || !isVersionSupported(versionRanges, version) {
   153  				unsupported |= feature
   154  			}
   155  		}
   156  	}
   157  	return
   158  }
   159  
   160  type CSSPrefix uint8
   161  
   162  const (
   163  	KhtmlPrefix CSSPrefix = 1 << iota
   164  	MozPrefix
   165  	MsPrefix
   166  	OPrefix
   167  	WebkitPrefix
   168  
   169  	NoPrefix CSSPrefix = 0
   170  )
   171  
   172  type prefixData struct {
   173  	// Note: In some cases, earlier versions did not require a prefix but later
   174  	// ones do. This is the case for Microsoft Edge for example, which switched
   175  	// the underlying browser engine from a custom one to the one from Chrome.
   176  	// However, we assume that users specifying a browser version for CSS mean
   177  	// "works in this version or newer", so we still add a prefix when a target
   178  	// is an old Edge version.
   179  	engine        Engine
   180  	withoutPrefix v
   181  	prefix        CSSPrefix
   182  }
   183  
   184  var cssPrefixTable = map[css_ast.D][]prefixData{
   185  	css_ast.DAppearance: {
   186  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{84, 0, 0}},
   187  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{84, 0, 0}},
   188  		{engine: Firefox, prefix: MozPrefix, withoutPrefix: v{80, 0, 0}},
   189  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   190  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{73, 0, 0}},
   191  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   192  	},
   193  	css_ast.DBackdropFilter: {
   194  		{engine: IOS, prefix: WebkitPrefix},
   195  		{engine: Safari, prefix: WebkitPrefix},
   196  	},
   197  	css_ast.DBackgroundClip: {
   198  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   199  		{engine: Edge, prefix: MsPrefix, withoutPrefix: v{15, 0, 0}},
   200  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   201  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{14, 0, 0}},
   202  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{106, 0, 0}},
   203  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{14, 0, 0}},
   204  	},
   205  	css_ast.DBoxDecorationBreak: {
   206  		{engine: Chrome, prefix: WebkitPrefix},
   207  		{engine: Edge, prefix: WebkitPrefix},
   208  		{engine: IOS, prefix: WebkitPrefix},
   209  		{engine: Opera, prefix: WebkitPrefix},
   210  		{engine: Safari, prefix: WebkitPrefix},
   211  	},
   212  	css_ast.DClipPath: {
   213  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{55, 0, 0}},
   214  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{13, 0, 0}},
   215  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{42, 0, 0}},
   216  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{13, 1, 0}},
   217  	},
   218  	css_ast.DFontKerning: {
   219  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{33, 0, 0}},
   220  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{12, 0, 0}},
   221  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{20, 0, 0}},
   222  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{9, 1, 0}},
   223  	},
   224  	css_ast.DHyphens: {
   225  		{engine: Edge, prefix: MsPrefix, withoutPrefix: v{79, 0, 0}},
   226  		{engine: Firefox, prefix: MozPrefix, withoutPrefix: v{43, 0, 0}},
   227  		{engine: IE, prefix: MsPrefix},
   228  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{17, 0, 0}},
   229  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{17, 0, 0}},
   230  	},
   231  	css_ast.DInitialLetter: {
   232  		{engine: IOS, prefix: WebkitPrefix},
   233  		{engine: Safari, prefix: WebkitPrefix},
   234  	},
   235  	css_ast.DMaskComposite: {
   236  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   237  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   238  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   239  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{106, 0, 0}},
   240  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   241  	},
   242  	css_ast.DMaskImage: {
   243  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   244  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   245  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   246  		{engine: Opera, prefix: WebkitPrefix},
   247  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   248  	},
   249  	css_ast.DMaskOrigin: {
   250  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   251  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   252  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   253  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{106, 0, 0}},
   254  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   255  	},
   256  	css_ast.DMaskPosition: {
   257  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   258  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   259  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   260  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{106, 0, 0}},
   261  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   262  	},
   263  	css_ast.DMaskRepeat: {
   264  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   265  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   266  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   267  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{106, 0, 0}},
   268  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   269  	},
   270  	css_ast.DMaskSize: {
   271  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   272  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{120, 0, 0}},
   273  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   274  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{106, 0, 0}},
   275  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   276  	},
   277  	css_ast.DPosition: {
   278  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{13, 0, 0}},
   279  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{13, 0, 0}},
   280  	},
   281  	css_ast.DPrintColorAdjust: {
   282  		{engine: Chrome, prefix: WebkitPrefix},
   283  		{engine: Edge, prefix: WebkitPrefix},
   284  		{engine: Opera, prefix: WebkitPrefix},
   285  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{15, 4, 0}},
   286  	},
   287  	css_ast.DTabSize: {
   288  		{engine: Firefox, prefix: MozPrefix, withoutPrefix: v{91, 0, 0}},
   289  		{engine: Opera, prefix: OPrefix, withoutPrefix: v{15, 0, 0}},
   290  	},
   291  	css_ast.DTextDecorationColor: {
   292  		{engine: Firefox, prefix: MozPrefix, withoutPrefix: v{36, 0, 0}},
   293  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{12, 2, 0}},
   294  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{12, 1, 0}},
   295  	},
   296  	css_ast.DTextDecorationLine: {
   297  		{engine: Firefox, prefix: MozPrefix, withoutPrefix: v{36, 0, 0}},
   298  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{12, 2, 0}},
   299  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{12, 1, 0}},
   300  	},
   301  	css_ast.DTextDecorationSkip: {
   302  		{engine: IOS, prefix: WebkitPrefix, withoutPrefix: v{12, 2, 0}},
   303  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{12, 1, 0}},
   304  	},
   305  	css_ast.DTextEmphasisColor: {
   306  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{99, 0, 0}},
   307  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{99, 0, 0}},
   308  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{85, 0, 0}},
   309  	},
   310  	css_ast.DTextEmphasisPosition: {
   311  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{99, 0, 0}},
   312  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{99, 0, 0}},
   313  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{85, 0, 0}},
   314  	},
   315  	css_ast.DTextEmphasisStyle: {
   316  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{99, 0, 0}},
   317  		{engine: Edge, prefix: WebkitPrefix, withoutPrefix: v{99, 0, 0}},
   318  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{85, 0, 0}},
   319  	},
   320  	css_ast.DTextOrientation: {
   321  		{engine: Safari, prefix: WebkitPrefix, withoutPrefix: v{14, 0, 0}},
   322  	},
   323  	css_ast.DTextSizeAdjust: {
   324  		{engine: Edge, prefix: MsPrefix, withoutPrefix: v{79, 0, 0}},
   325  		{engine: IOS, prefix: WebkitPrefix},
   326  	},
   327  	css_ast.DUserSelect: {
   328  		{engine: Chrome, prefix: WebkitPrefix, withoutPrefix: v{54, 0, 0}},
   329  		{engine: Edge, prefix: MsPrefix, withoutPrefix: v{79, 0, 0}},
   330  		{engine: Firefox, prefix: MozPrefix, withoutPrefix: v{69, 0, 0}},
   331  		{engine: IE, prefix: MsPrefix},
   332  		{engine: IOS, prefix: WebkitPrefix},
   333  		{engine: Opera, prefix: WebkitPrefix, withoutPrefix: v{41, 0, 0}},
   334  		{engine: Safari, prefix: KhtmlPrefix, withoutPrefix: v{3, 0, 0}},
   335  		{engine: Safari, prefix: WebkitPrefix},
   336  	},
   337  }
   338  
   339  func CSSPrefixData(constraints map[Engine]Semver) (entries map[css_ast.D]CSSPrefix) {
   340  	for property, items := range cssPrefixTable {
   341  		prefixes := NoPrefix
   342  		for engine, version := range constraints {
   343  			if !engine.IsBrowser() {
   344  				// Specifying "--target=es2020" shouldn't affect CSS
   345  				continue
   346  			}
   347  			for _, item := range items {
   348  				if item.engine == engine && (item.withoutPrefix == v{} || compareVersions(item.withoutPrefix, version) > 0) {
   349  					prefixes |= item.prefix
   350  				}
   351  			}
   352  		}
   353  		if prefixes != NoPrefix {
   354  			if entries == nil {
   355  				entries = make(map[css_ast.D]CSSPrefix)
   356  			}
   357  			entries[property] = prefixes
   358  		}
   359  	}
   360  	return
   361  }