diff --git a/scripts/caniuse.ts b/scripts/caniuse.ts index 2cb51f72fe0..2651b9c169b 100644 --- a/scripts/caniuse.ts +++ b/scripts/caniuse.ts @@ -20,6 +20,21 @@ const mapping = new Map( Object.keys(lite.features).sort().map(id => [id, null]) ); +// Fix missing key-value in @types/caniuse-lite +// TODO: remove this declaration when https://github.com/DefinitelyTyped/DefinitelyTyped/pull/67330 lands +declare module 'caniuse-lite' { + interface Feature { + shown: boolean; + } + } + +const hiddenCaniuseItems = new Set(); +for (const [id, data] of Object.entries(lite.features)) { + if (!lite.feature(data).shown) { + hiddenCaniuseItems.add(id); + } +} + for (const [id, data] of Object.entries(features)) { if (!('caniuse' in data)) { continue; @@ -28,22 +43,34 @@ for (const [id, data] of Object.entries(features)) { if (!mapping.has(caniuseId)) { throw new Error(`Invalid caniuse ID used for ${id}: ${caniuseId}`); } + if (hiddenCaniuseItems.has(caniuseId)) { + throw new Error(`The caniuse ID used for "${id}" ("${caniuseId}") is hidden on caniuse.com`); + } + mapping.set(caniuseId, id); } let matched = 0; for (const [caniuseId, id] of mapping.entries()) { - let checkbox = '[ ]'; - let details = ''; - if (id) { - checkbox = '[x]'; - if (id !== caniuseId) { - details = ` (as ${id})`; - } + const isHidden = hiddenCaniuseItems.has(caniuseId); + const isComplete = id || isHidden; + + if (isComplete) { matched++; } - logger.verbose(`- ${checkbox} ${caniuseId}${details}`); + + const checkbox = isComplete ? "[x]" : "[ ]"; + let details = ''; + if (id && id !== caniuseId) { + details = ` (as ${id})`; + } + if (isHidden) { + details = " (hidden on caniuse.com 🤫)"; + } + + const strike = isHidden ? "~~" : ""; + logger.verbose(`- ${checkbox} ${strike}${caniuseId}${strike}${details}`); } logger.verbose("");