Skip to content

Commit 749817a

Browse files
committed
Add new resolution
1 parent cbf262c commit 749817a

File tree

1 file changed

+100
-36
lines changed

1 file changed

+100
-36
lines changed

caniuse/browsercompat.ts

Lines changed: 100 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import 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";
33
import { BrowserName } from "../mappings.ts";
44
import { 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

131185
export 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+
148208
function 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

Comments
 (0)