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 }