diff --git a/cssdb.json b/cssdb.json index 48a60c0..d3357b6 100644 --- a/cssdb.json +++ b/cssdb.json @@ -235,7 +235,7 @@ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/clamp" }, "example": "button {\n font-size: clamp(1rem, 2.5vw, 2rem);\n}", - "interoperable_at": 1586217600, + "interoperable_at": 1595894400, "polyfills": [ { "type": "PostCSS Plugin", @@ -1382,7 +1382,6 @@ "chrome": "118", "edge": "118", "firefox": "63", - "ios_saf": "16", "op_mob": "79", "opera": "104", "safari": "16", @@ -1392,14 +1391,13 @@ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/resize" }, "example": "area {\n resize: inline;\n}", - "interoperable_at": 1697155200, "polyfills": [ { "type": "PostCSS Plugin", "link": "https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-logical-resize" } ], - "vendors_implementations": 3 + "vendors_implementations": 2 }, { "id": "logical-viewport-units", @@ -1652,7 +1650,7 @@ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/opacity" }, "example": "img {\n opacity: 90%;\n}", - "interoperable_at": 1585008000, + "interoperable_at": 1595894400, "polyfills": [ { "type": "PostCSS Plugin", @@ -1750,8 +1748,7 @@ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior" }, "example": ".messages {\n height: 220px;\n overflow: auto;\n overscroll-behavior-y: contain;\n}\n\nbody {\n margin: 0;\n overscroll-behavior: none;\n}", - "interoperable_at": 1662940800, - "vendors_implementations": 3 + "vendors_implementations": 2 }, { "id": "place-properties", @@ -1874,7 +1871,7 @@ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/:read-only" }, "example": "input:read-only {\n background-color: #ccc;\n}", - "interoperable_at": 1593475200, + "interoperable_at": 1595894400, "vendors_implementations": 3, "web-feature": "read-write-pseudos" }, diff --git a/cssdb.mjs b/cssdb.mjs index dfc537b..9a1e0de 100644 --- a/cssdb.mjs +++ b/cssdb.mjs @@ -235,7 +235,7 @@ export default [ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/clamp" }, "example": "button {\n font-size: clamp(1rem, 2.5vw, 2rem);\n}", - "interoperable_at": 1586217600, + "interoperable_at": 1595894400, "polyfills": [ { "type": "PostCSS Plugin", @@ -1382,7 +1382,6 @@ export default [ "chrome": "118", "edge": "118", "firefox": "63", - "ios_saf": "16", "op_mob": "79", "opera": "104", "safari": "16", @@ -1392,14 +1391,13 @@ export default [ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/resize" }, "example": "area {\n resize: inline;\n}", - "interoperable_at": 1697155200, "polyfills": [ { "type": "PostCSS Plugin", "link": "https://github.com/csstools/postcss-plugins/tree/main/plugins/postcss-logical-resize" } ], - "vendors_implementations": 3 + "vendors_implementations": 2 }, { "id": "logical-viewport-units", @@ -1652,7 +1650,7 @@ export default [ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/opacity" }, "example": "img {\n opacity: 90%;\n}", - "interoperable_at": 1585008000, + "interoperable_at": 1595894400, "polyfills": [ { "type": "PostCSS Plugin", @@ -1750,8 +1748,7 @@ export default [ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior" }, "example": ".messages {\n height: 220px;\n overflow: auto;\n overscroll-behavior-y: contain;\n}\n\nbody {\n margin: 0;\n overscroll-behavior: none;\n}", - "interoperable_at": 1662940800, - "vendors_implementations": 3 + "vendors_implementations": 2 }, { "id": "place-properties", @@ -1874,7 +1871,7 @@ export default [ "mdn": "https://developer.mozilla.org/en-US/docs/Web/CSS/:read-only" }, "example": "input:read-only {\n background-color: #ccc;\n}", - "interoperable_at": 1593475200, + "interoperable_at": 1595894400, "vendors_implementations": 3, "web-feature": "read-write-pseudos" }, diff --git a/package-lock.json b/package-lock.json index 095b3a3..48410be 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,17 +19,17 @@ ], "license": "MIT-0", "devDependencies": { - "@mdn/browser-compat-data": "^5.5.39", + "@mdn/browser-compat-data": "^5.5.40", "browserslist": "^4.23.2", "glob": "^11.0.0", "lodash.get": "^4.4.2", "postcss": "^8.4.39", "postcss-cli": "^11.0.0", "postcss-preset-env": "^9.6.0", - "semver": "^7.6.0", + "semver": "^7.6.3", "stylelint": "^16.7.0", "stylelint-config-standard": "^36.0.1", - "web-features": "^0.10.0" + "web-features": "^1.0.0" } }, "node_modules/@babel/code-frame": { @@ -1105,9 +1105,9 @@ } }, "node_modules/@mdn/browser-compat-data": { - "version": "5.5.39", - "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.39.tgz", - "integrity": "sha512-22awGsC5t7sGOT2u5EU1RA64L+F87GWYXHZkh0ofjJsLGObqNDDVSTlumd/+6YK3QwlOIEVWAsqmJymrrSqBlA==", + "version": "5.5.40", + "resolved": "https://registry.npmjs.org/@mdn/browser-compat-data/-/browser-compat-data-5.5.40.tgz", + "integrity": "sha512-5hByR+TGX/iKG7Uv3Zk8f+aUftkBcHqWE3Ym229jxm+cRjeJSBZzUKPm6H+p46vaeooql72kydrqpz0B3UrErw==", "dev": true }, "node_modules/@nodelib/fs.scandir": { @@ -1362,9 +1362,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001642", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001642.tgz", - "integrity": "sha512-3XQ0DoRgLijXJErLSl+bLnJ+Et4KqV1PY6JJBGAFlsNsz31zeAIncyeZfLCabHK/jtSh+671RM9YMldxjUPZtA==", + "version": "1.0.30001643", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz", + "integrity": "sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==", "dev": true, "funding": [ { @@ -1763,9 +1763,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.827", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.827.tgz", - "integrity": "sha512-VY+J0e4SFcNfQy19MEoMdaIcZLmDCprqvBtkii1WTCTQHpRvf5N8+3kTYCgL/PcntvwQvmMJWTuDPsq+IlhWKQ==", + "version": "1.4.832", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.832.tgz", + "integrity": "sha512-cTen3SB0H2SGU7x467NRe1eVcQgcuS6jckKfWJHia2eo0cHIGOqHoAxevIYZD4eRHcWjkvFzo93bi3vJ9W+1lA==", "dev": true }, "node_modules/emoji-regex": { @@ -2452,9 +2452,9 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "node_modules/normalize-path": { @@ -3530,9 +3530,9 @@ } }, "node_modules/semver": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", - "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -4112,9 +4112,9 @@ "dev": true }, "node_modules/web-features": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/web-features/-/web-features-0.10.0.tgz", - "integrity": "sha512-0sfyFskCSzUqXPtq4TZ4DkHl9uWLcGe/aX/8jZZv05frc5UZJkMyHE4HAC+Tu0RcI/a4ePTfiRK84rB7Ot5c2A==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/web-features/-/web-features-1.0.0.tgz", + "integrity": "sha512-U/ppX0h851Fr8LbOVMybiuH3iGWGlPi+DYXoj6VkOvXJc6VgYpSdGDosduYl/4qvW6YNlZ4IaczLgqHqbaU25A==", "dev": true }, "node_modules/which": { diff --git a/package.json b/package.json index f483b7a..219fd89 100644 --- a/package.json +++ b/package.json @@ -61,17 +61,17 @@ "test:doc-links": "node tasks/check-doc-links.mjs" }, "devDependencies": { - "@mdn/browser-compat-data": "^5.5.39", + "@mdn/browser-compat-data": "^5.5.40", "browserslist": "^4.23.2", "glob": "^11.0.0", "lodash.get": "^4.4.2", "postcss": "^8.4.39", "postcss-cli": "^11.0.0", "postcss-preset-env": "^9.6.0", - "semver": "^7.6.0", + "semver": "^7.6.3", "stylelint": "^16.7.0", "stylelint-config-standard": "^36.0.1", - "web-features": "^0.10.0" + "web-features": "^1.0.0" }, "stylelint": { "extends": "stylelint-config-standard", diff --git a/utils/baseline-data.mjs b/utils/baseline-data.mjs index 81ca82a..de6e907 100644 --- a/utils/baseline-data.mjs +++ b/utils/baseline-data.mjs @@ -1,4 +1,6 @@ +import { BrowserslistToMDN } from "./mdn-to-browserslist.mjs"; import { releaseDateForBrowserVersion } from "./release-date-for-browser-version.mjs"; +import { scanForNextBrowserVersionWithReleaseDate } from "./scan-for-next-browser-version.mjs"; const baselineEngines = { blink: [ @@ -40,25 +42,25 @@ export function baselineData(feature) { let latestReleaseDate; for (const engine in baselineEngines) { - let engineIsSupported = false; - for (const browser of engines[engine]) { - const releaseDate = releaseDateForBrowserVersion(browser, feature.browser_support[browser]); + let supportedBrowsers = 0; + const browsersInEngine = engines[engine]; + for (const browser of browsersInEngine) { + const releaseDate = scanForNextBrowserVersionWithReleaseDate(BrowserslistToMDN(browser), feature.browser_support[browser], releaseDateForBrowserVersion); if (!releaseDate) { continue; } - engineIsSupported = true; - break; + supportedBrowsers++; } - if (engineIsSupported) { + if (supportedBrowsers === browsersInEngine.length) { supportedEngines++; } } for (const engine in engines) { for (const browser of engines[engine]) { - const releaseDate = releaseDateForBrowserVersion(browser, feature.browser_support[browser]); + const releaseDate = scanForNextBrowserVersionWithReleaseDate(BrowserslistToMDN(browser), feature.browser_support[browser], releaseDateForBrowserVersion); if (!releaseDate) { continue; } diff --git a/utils/mdn-to-browserslist.mjs b/utils/mdn-to-browserslist.mjs new file mode 100644 index 0000000..9931e1c --- /dev/null +++ b/utils/mdn-to-browserslist.mjs @@ -0,0 +1,25 @@ +export const MDNToBrowserlistMap = { + chrome_android: 'and_chr', + safari_ios: 'ios_saf', + firefox_android: 'and_ff', + opera_android: 'op_mob', + samsunginternet_android: 'samsung', + webview_android: 'android', +}; + +export function MDNToBrowserlist(browser) { + return MDNToBrowserlistMap[browser] || browser; +} + +export const BrowserslistToMDNMap = { + and_chr: 'chrome_android', + ios_saf: 'safari_ios', + and_ff: 'firefox_android', + op_mob: 'opera_android', + samsung: 'samsunginternet_android', + android: 'webview_android', +}; + +export function BrowserslistToMDN(browser) { + return BrowserslistToMDNMap[browser] || browser; +} diff --git a/utils/scan-for-next-browser-version.mjs b/utils/scan-for-next-browser-version.mjs new file mode 100644 index 0000000..ecbfe5e --- /dev/null +++ b/utils/scan-for-next-browser-version.mjs @@ -0,0 +1,34 @@ +import bcd from '@mdn/browser-compat-data' assert { type: 'json' }; +import semver from 'semver'; + +export function scanForNextBrowserVersionWithReleaseDate(browser, version, cb) { + if (!browser || !version) { + return; + } + + { + const result = cb(browser, version); + if (result) { + return result; + } + } + + const versionNames = Object.keys(bcd.browsers?.[browser]?.releases); + const thisVersion = semver.coerce(version); + const thisVersionOrLater = versionNames.find(v => { + return semver.gte(semver.coerce(v), thisVersion); + }); + const thisVersionIndex = versionNames.indexOf(thisVersionOrLater); + if (thisVersionIndex === -1) { + return; + } + + for (let i = 1; i < 10; i++) { + const result = cb(browser, version); + if (result) { + return result; + } + + version = versionNames[thisVersionIndex + i]; + } +} diff --git a/utils/supported-browsers-from-mdn.mjs b/utils/supported-browsers-from-mdn.mjs index 48ff19e..9f75331 100644 --- a/utils/supported-browsers-from-mdn.mjs +++ b/utils/supported-browsers-from-mdn.mjs @@ -1,15 +1,7 @@ import bcd from '@mdn/browser-compat-data' assert { type: 'json' }; import _get from 'lodash.get'; import semver from 'semver'; - -const MDNToBrowserlist = { - chrome_android: 'and_chr', - safari_ios: 'ios_saf', - firefox_android: 'and_ff', - opera_android: 'op_mob', - samsunginternet_android: 'samsung', - webview_android: 'android', -}; +import { MDNToBrowserlist } from './mdn-to-browserslist.mjs'; function getBrowsersFromFeature(mdnConfigPath, feature) { const mdnFeature = _get(bcd, mdnConfigPath); @@ -90,7 +82,7 @@ function getBrowsersFromFeature(mdnConfigPath, feature) { version = version.substring(1); } - const browser = MDNToBrowserlist[browserKey] || browserKey; + const browser = MDNToBrowserlist(browserKey); result[browser] = version; } });