From 61fd820200670ecb3252707fa942f99aca92bc1c Mon Sep 17 00:00:00 2001 From: "Daniel D. Beck" Date: Mon, 6 Nov 2023 14:18:27 +0100 Subject: [PATCH 1/4] Reject hidden caniuse features --- scripts/caniuse.ts | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/scripts/caniuse.ts b/scripts/caniuse.ts index 2cb51f72fe0..b81ca7e88c0 100644 --- a/scripts/caniuse.ts +++ b/scripts/caniuse.ts @@ -20,6 +20,8 @@ const mapping = new Map( Object.keys(lite.features).sort().map(id => [id, null]) ); +const hiddenCaniuseItems = Object.entries(lite.features).flatMap(([id, data]) => !lite.feature(data).shown ? [id] : []); + for (const [id, data] of Object.entries(features)) { if (!('caniuse' in data)) { continue; @@ -28,22 +30,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.includes(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.includes(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(""); From f673704a5e758809edf469cbd866cc99e0569c7d Mon Sep 17 00:00:00 2001 From: "Daniel D. Beck" Date: Tue, 14 Nov 2023 12:39:17 +0000 Subject: [PATCH 2/4] Apply suggestions from code review MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Philip Jägenstedt --- scripts/caniuse.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/scripts/caniuse.ts b/scripts/caniuse.ts index b81ca7e88c0..b2a776b1701 100644 --- a/scripts/caniuse.ts +++ b/scripts/caniuse.ts @@ -20,7 +20,7 @@ const mapping = new Map( Object.keys(lite.features).sort().map(id => [id, null]) ); -const hiddenCaniuseItems = Object.entries(lite.features).flatMap(([id, data]) => !lite.feature(data).shown ? [id] : []); +const hiddenCaniuseItems = new Set(Object.entries(lite.features).flatMap(([id, data]) => !lite.feature(data).shown ? [id] : [])); for (const [id, data] of Object.entries(features)) { if (!('caniuse' in data)) { @@ -30,7 +30,7 @@ for (const [id, data] of Object.entries(features)) { if (!mapping.has(caniuseId)) { throw new Error(`Invalid caniuse ID used for ${id}: ${caniuseId}`); } - if (hiddenCaniuseItems.includes(caniuseId)) { + if (hiddenCaniuseItems.has(caniuseId)) { throw new Error(`The caniuse ID used for "${id}" ("${caniuseId}") is hidden on caniuse.com`); } @@ -40,7 +40,7 @@ for (const [id, data] of Object.entries(features)) { let matched = 0; for (const [caniuseId, id] of mapping.entries()) { - const isHidden = hiddenCaniuseItems.includes(caniuseId); + const isHidden = hiddenCaniuseItems.has(caniuseId); const isComplete = id || isHidden; if (isComplete) { From 0824662ff1b4ac19d779fcf83c50cba58cbe7e0a Mon Sep 17 00:00:00 2001 From: "Daniel D. Beck" Date: Tue, 14 Nov 2023 13:43:17 +0100 Subject: [PATCH 3/4] Unroll overly complicated `flatMap` --- scripts/caniuse.ts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/caniuse.ts b/scripts/caniuse.ts index b2a776b1701..ff88970a061 100644 --- a/scripts/caniuse.ts +++ b/scripts/caniuse.ts @@ -20,7 +20,12 @@ const mapping = new Map( Object.keys(lite.features).sort().map(id => [id, null]) ); -const hiddenCaniuseItems = new Set(Object.entries(lite.features).flatMap(([id, data]) => !lite.feature(data).shown ? [id] : [])); +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)) { From 2c033c0abbd0e031d967e84e115427c4957ef392 Mon Sep 17 00:00:00 2001 From: "Daniel D. Beck" Date: Tue, 14 Nov 2023 14:00:42 +0100 Subject: [PATCH 4/4] Override caniuse-lite types to access `shown` This is a temporary fix until `@types/caniuse-lite` is fixed. See also: https://github.com/DefinitelyTyped/DefinitelyTyped/pull/67330 --- scripts/caniuse.ts | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/scripts/caniuse.ts b/scripts/caniuse.ts index ff88970a061..2651b9c169b 100644 --- a/scripts/caniuse.ts +++ b/scripts/caniuse.ts @@ -20,6 +20,14 @@ 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) {