11import rawBrowserCompatData from "browser-compat-data" with { type : "json" } ;
2- import type { CompatStatement , SupportStatement } from "./compat.d.ts" ;
2+ import type { CompatStatement , SimpleSupportStatement , SupportStatement } from "./compat.d.ts" ;
33import { BrowserName } from "../mappings.ts" ;
44import { Version } from "./version.ts" ;
55
@@ -71,7 +71,7 @@ function findFeatureData(feature: string): { featureKey: string; compatData: Com
7171 const normalizedFeature = feature . toLowerCase ( ) ;
7272 const featureKey = Object . keys ( data ) . find ( ( key ) => key . toLowerCase ( ) === normalizedFeature ) ;
7373
74- if ( ! data || ! featureKey || ! data [ featureKey ] || ! data [ featureKey ] ) {
74+ if ( ! data || ! featureKey || ! data [ featureKey ] ) {
7575 throw new Error ( `Feature "${ feature } " not found in browser compatibility data.` ) ;
7676 }
7777
@@ -81,51 +81,105 @@ function findFeatureData(feature: string): { featureKey: string; compatData: Com
8181 } ;
8282}
8383
84- function findFeatureSupport (
85- versions : SupportStatement | undefined ,
84+ export function getVersionForSimpleSupportStatement (
85+ version : SimpleSupportStatement ,
86+ ) {
87+ if ( version . version_removed ) {
88+ return Version . parse ( version . version_removed ) ;
89+ }
90+ return Version . parse ( version . version_added ) ;
91+ }
92+
93+ export function findFeatureSupport (
94+ versions : SupportStatement ,
8695) : MinimumBrowserVersion {
8796 const versionsAsArray = Array . isArray ( versions ) ? versions : [ versions ] ;
88- let currentStatus = {
89- browser : "unknown" as BrowserName ,
90- isSupported : false ,
91- } as MinimumBrowserVersion ;
97+ // let currentStatus = {
98+ // browser: "unknown" as BrowserName,
99+ // isSupported: false,
100+ // } as MinimumBrowserVersion;
92101
93- for ( const version of versionsAsArray ) {
94- if ( ! version ) { continue ; }
95-
96- if ( version . version_removed ) {
97- // it is no longer supported
98- // now we check the last version we knew
99- if (
100- currentStatus . isSupported &&
101- currentStatus . minimumVersion . isNewerThan ( Version . parse ( version . version_removed ) )
102- ) {
103- continue ;
102+ // let currentVersion = new Version(0, 0, 0);
103+
104+ if ( versionsAsArray . length === 0 ) {
105+ throw new Error ( "No versions provided for feature support check." ) ;
106+ }
107+
108+ const orderedByVersion = versionsAsArray
109+ . sort ( ( a , b ) => {
110+ if ( ! a ) {
111+ return 1 ;
104112 }
105- currentStatus = {
106- browser : "unknown" as BrowserName ,
107- isSupported : false ,
108- } ;
109- } else if ( version . version_added ) {
110- // it is already supported, we use the oldest version
111- if (
112- currentStatus . isSupported &&
113- Version . parse ( version . version_added ) . isNewerThan ( currentStatus . minimumVersion )
114- ) {
115- continue ;
113+ if ( ! b ) {
114+ return - 1 ;
115+ }
116+
117+ const aVersion = getVersionForSimpleSupportStatement ( a ) ;
118+ const bVersion = getVersionForSimpleSupportStatement ( b ) ;
119+ if ( aVersion . isEqualTo ( bVersion ) ) {
120+ return a . version_removed ? 1 : - 1 ; // Prefer versions that are not removed
116121 }
122+ if ( ! aVersion || ! bVersion ) {
123+ return 0 ;
124+ }
125+
126+ return aVersion . isNewerThan ( bVersion ) ? 1 : - 1 ;
127+ } ) ;
117128
118- currentStatus = {
119- isSupported : true ,
129+ const lastRemoveStatementIndex = orderedByVersion
130+ . findLastIndex ( ( version ) => Boolean ( version . version_removed ) ) ;
131+
132+ if ( lastRemoveStatementIndex === - 1 ) {
133+ const oldestPossibleVersion = orderedByVersion [ 0 ] ;
134+ if ( ! oldestPossibleVersion ) {
135+ throw new Error ( "No valid version found in support statements." ) ;
136+ }
137+
138+ if ( ! oldestPossibleVersion . version_added ) {
139+ return {
140+ isSupported : false ,
120141 browser : "unknown" as BrowserName ,
121- minimumVersion : Version . parse ( version . version_added ) ,
122- partialSupport : ! ! version . partial_implementation ,
123- isBehindFlag : ! ! ( version . flags && version . flags . length > 0 ) ,
124142 } ;
125143 }
144+
145+ return {
146+ isSupported : true ,
147+ browser : "unknown" as BrowserName ,
148+ minimumVersion : Version . parse ( oldestPossibleVersion . version_added ) ,
149+ partialSupport : ! ! oldestPossibleVersion . partial_implementation ,
150+ isBehindFlag : ! ! ( oldestPossibleVersion . flags && oldestPossibleVersion . flags . length > 0 ) ,
151+ } ;
126152 }
127153
128- return currentStatus ;
154+ if ( lastRemoveStatementIndex === orderedByVersion . length - 1 ) {
155+ const lastVersion = orderedByVersion [ lastRemoveStatementIndex ] ;
156+ if ( ! lastVersion ) {
157+ throw new Error ( "No valid version found in support statements." ) ;
158+ }
159+
160+ return {
161+ isSupported : false ,
162+ browser : "unknown" as BrowserName ,
163+ } ;
164+ }
165+
166+ const oldestPossibleVersion = orderedByVersion [ lastRemoveStatementIndex + 1 ] ;
167+ if ( ! oldestPossibleVersion ) {
168+ throw new Error ( "No valid version found in support statements." ) ;
169+ }
170+ if ( ! oldestPossibleVersion . version_added ) {
171+ return {
172+ isSupported : false ,
173+ browser : "unknown" as BrowserName ,
174+ } ;
175+ }
176+ return {
177+ isSupported : true ,
178+ browser : "unknown" as BrowserName ,
179+ minimumVersion : Version . parse ( oldestPossibleVersion . version_added ) ,
180+ partialSupport : ! ! oldestPossibleVersion . partial_implementation ,
181+ isBehindFlag : ! ! ( oldestPossibleVersion . flags && oldestPossibleVersion . flags . length > 0 ) ,
182+ } ;
129183}
130184
131185export function getLowestVersionForFeature (
@@ -135,6 +189,10 @@ export function getLowestVersionForFeature(
135189 const currentStatus : Array < MinimumBrowserVersion > = [ ] ;
136190
137191 for ( const [ browser , versions ] of Object . entries ( compatData . support || { } ) ) {
192+ if ( ! versions ) {
193+ throw new Error ( `No versions found for browser "${ browser } " in feature "${ feature } ".` ) ;
194+ }
195+
138196 const statusForBrowser : MinimumBrowserVersion = {
139197 ...findFeatureSupport ( versions ) ,
140198 browser : browser as BrowserName ,
@@ -145,7 +203,13 @@ export function getLowestVersionForFeature(
145203 return currentStatus ;
146204}
147205
206+ getLowestVersionForFeature ( "api:ambientlightsensor" ) ;
207+
148208function mergeBrowserSupport ( versionInfo : MinimumBrowserVersion [ ] ) : MinimumBrowserVersion {
209+ if ( versionInfo . length === 0 ) {
210+ throw new Error ( "Cannot merge empty browser support array" ) ;
211+ }
212+
149213 let lowestVersion = new Version ( 0 , 0 , 0 ) ;
150214 let isSupported = false ;
151215 let partialSupport = false ;
0 commit comments