From 6d7322e27abb880204d81af1228ddedf1ed78ec6 Mon Sep 17 00:00:00 2001 From: Ottomated Date: Sat, 30 May 2026 19:45:29 -0700 Subject: [PATCH] further reduce duplication --- .prettierignore | 1 + .../.generated/browser-support-features.md | 4 +- .../07-misc/.generated/browser-support.md | 21 ++-- .../scripts/generate-browser-support.ts | 104 ++++++++---------- 4 files changed, 57 insertions(+), 73 deletions(-) diff --git a/.prettierignore b/.prettierignore index 92d9bc797b..28f447f359 100644 --- a/.prettierignore +++ b/.prettierignore @@ -8,6 +8,7 @@ packages/**/config/*.js # packages/svelte packages/svelte/messages/**/*.md packages/svelte/scripts/_bundle.js +packages/svelte/scripts/_baseline/*.ts packages/svelte/src/compiler/errors.js packages/svelte/src/compiler/warnings.js packages/svelte/src/internal/client/errors.js diff --git a/documentation/docs/07-misc/.generated/browser-support-features.md b/documentation/docs/07-misc/.generated/browser-support-features.md index 51f9f730ce..d67f18b282 100644 --- a/documentation/docs/07-misc/.generated/browser-support-features.md +++ b/documentation/docs/07-misc/.generated/browser-support-features.md @@ -1,7 +1,7 @@ | Feature | Chrome / Edge | Firefox | Safari | -| --- | ---: | ---: | ---: | +| - | - | - | - | | [`$state.snapshot`](/docs/svelte/$state#$state.snapshot) | 98 | 94 | 15.4 | | [`bind:devicePixelContentBoxSize`](/docs/svelte/bind#Dimensions) | | 93 | not supported | -| [`flip` from `svelte/animate`](/docs/svelte/svelte-animate#flip) | | 126 | | \ No newline at end of file +| [`flip` from `svelte/animate`](/docs/svelte/svelte-animate#flip) | | 126 | | diff --git a/documentation/docs/07-misc/.generated/browser-support.md b/documentation/docs/07-misc/.generated/browser-support.md index 8b0a4c72a0..da27aaea3d 100644 --- a/documentation/docs/07-misc/.generated/browser-support.md +++ b/documentation/docs/07-misc/.generated/browser-support.md @@ -1,14 +1,15 @@ -| Browser | Minimum version | -| ----------------------------------------------------------------------------- | -------------------------------------------------------- | -| ![](/images/browsers/chrome.svg) Chrome / ![](/images/browsers/edge.svg) Edge | 87 | -| ![](/images/browsers/firefox.svg) Firefox | 83 | -| ![](/images/browsers/safari.svg) Safari | 14 | -| ![](/images/browsers/opera.svg) Opera | 73 | -| ![](/images/browsers/opera.svg) Opera (Android) | 62 | -| ![](/images/browsers/samsung-internet.svg) Samsung Internet | 14.0 | -| ![](/images/browsers/android-webview.svg) Android WebView | 87 | -| ![](/images/browsers/internet-explorer.svg) Internet Explorer | not supported | +| Browser | Minimum version | +| - | - | +| ![](/images/browsers/chrome.svg) Chrome / ![](/images/browsers/edge.svg) Edge | 87 | +| ![](/images/browsers/firefox.svg) Firefox | 83 | +| ![](/images/browsers/safari.svg) Safari | 14 | +| ![](/images/browsers/opera.svg) Opera | 73 | +| ![](/images/browsers/opera.svg) Opera (Android) | 62 | +| ![](/images/browsers/samsung-internet.svg) Samsung Internet | 14.0 | +| ![](/images/browsers/android-webview.svg) Android WebView | 87 | +| ![](/images/browsers/internet-explorer.svg) Internet Explorer | not supported | + > [!NOTE] This equates to a Baseline target of 2020. \ No newline at end of file diff --git a/packages/svelte/scripts/generate-browser-support.ts b/packages/svelte/scripts/generate-browser-support.ts index 535a6ffb4e..61074c902f 100644 --- a/packages/svelte/scripts/generate-browser-support.ts +++ b/packages/svelte/scripts/generate-browser-support.ts @@ -666,14 +666,11 @@ ${missing_doc_links.map((name) => ` - "${name}"`).join('\n')}`); return rows; } -/** - * Render the per-feature browser-requirements table from the auto-detected - * rows. Sorted by Safari floor descending, then alphabetically. - */ function render_conditional_table(rows: ConditionalRow[], runtime_floor: RuntimeFloor): string { if (rows.length === 0) { return '_No features currently require browser versions newer than the runtime floor._'; } + rows.sort((a, b) => a.name.localeCompare(b.name)); const browsers = [ ['chrome', 'Chrome / Edge'], @@ -681,33 +678,25 @@ function render_conditional_table(rows: ConditionalRow[], runtime_floor: Runtime ['safari', 'Safari'] ] as const; - const runtime_versions = browser_versions_for(runtime_floor); - - const sorted = [...rows].sort((a, b) => { - const sa = Number(a.versions.safari ?? '0'); - const sb = Number(b.versions.safari ?? '0'); - if (sb !== sa) return sb - sa; - return a.name.localeCompare(b.name); - }); - - const header = '| Feature | ' + browsers.map(([, label]) => `${label}`).join(' | ') + ' |'; - const sep = '| --- |' + browsers.map(() => ' ---: |').join(''); + const floor_versions = browser_versions_for(runtime_floor); - const body = sorted.map((entry) => { - const cells = browsers.map(([key]) => { - const v = entry.versions[key]; + const r2: Array = []; + for (const row of rows) { + const name_cell = row.doc_link ? `[${row.name}](${row.doc_link})` : row.name; + const versions = browsers.map(([key]) => { + const v = row.versions[key]; if (v === null) return 'not supported'; if (v === undefined) return ''; - const floor_v = runtime_versions[key]; - return floor_v && Number(v) <= Number(floor_v) - ? '' - : v; + const floor_v = floor_versions[key]; + if (floor_v && Number(v) <= Number(floor_v)) + return ''; + + return v; }); - const name_cell = entry.doc_link ? `[${entry.name}](${entry.doc_link})` : entry.name; - return `| ${name_cell} | ${cells.join(' | ')} |`; - }); + r2.push([name_cell, ...versions]); + } - return [header, sep, ...body].join('\n'); + return render_markdown_table(['Feature', ...browsers.map(([, label]) => `${label}`)], r2); } function browser_versions_for(target: RuntimeFloor): Record { @@ -772,25 +761,19 @@ const BROWSER = { internet_explorer: '![](/images/browsers/internet-explorer.svg) Internet Explorer' }; -function render_table(versions: Record, target: RuntimeFloor): string { - // Chrome and Edge ship from the same engine and historically resolve to the - // same Baseline version. Collapse them into one row when they match, but - // fall back to listing them separately if they ever drift. - const chrome_edge: [string, string] | null = - versions.chrome && versions.chrome === versions.edge - ? [`${BROWSER.chrome} / ${BROWSER.edge}`, versions.chrome] - : null; - - const base_rows: Array<[string, string]> = chrome_edge - ? [chrome_edge, [`${BROWSER.chrome} (Android)`, versions.chrome_android]] - : [ - [BROWSER.chrome, versions.chrome], - [`${BROWSER.chrome} (Android)`, versions.chrome_android], - [BROWSER.edge, versions.edge] - ]; - - const rows = [ - ...base_rows, +function render_browser_table(versions: Record, target: RuntimeFloor): string { + const rows: Array<[string, string]> = [ + [BROWSER.chrome, versions.chrome], + [`${BROWSER.chrome} (Android)`, versions.chrome_android] + ]; + + if (versions.chrome === versions.edge) { + rows[0][0] += ` / ${BROWSER.edge}`; + } else { + rows.push([BROWSER.edge, versions.edge]); + } + + rows.push( [BROWSER.firefox, versions.firefox], [`${BROWSER.firefox} (Android)`, versions.firefox_android], [BROWSER.safari, versions.safari], @@ -800,25 +783,24 @@ function render_table(versions: Record, target: RuntimeFloor): s [BROWSER.samsung_internet, versions.samsunginternet_android], [BROWSER.webview_android, versions.webview_android], [BROWSER.internet_explorer, 'not supported'] - ].filter(([label, version]) => version !== undefined) as Array<[string, string]>; - - const headings = ['Browser', 'Minimum version']; - - const widths = headings.map((heading, i) => - Math.max(heading.length, ...rows.map((r) => String(r[i]).length)) ); - const pad = (s: string, n: number) => s + ' '.repeat(Math.max(0, n - s.length)); - - const header = `| ${headings.map((heading, i) => pad(heading, widths[i])).join(' | ')} |`; - const sep = `| ${widths.map((width) => '-'.repeat(width)).join(' | ')} |`; - const body = rows - .map(([a, b]) => `| ${pad(a, widths[0])} | ${pad(String(b), widths[1])} |`) - .join('\n'); - const target_label = target === 'newly' ? '"newly available"' : target; - return `${header}\n${sep}\n${body}\n\n> [!NOTE] This equates to a Baseline target of ${target_label}.`; + return ( + render_markdown_table( + ['Browser', 'Minimum version'], + rows.filter(([, version]) => version !== undefined) + ) + + `\n\n> [!NOTE] This equates to a Baseline target of ${target_label}.` + ); +} + +function render_markdown_table(headers: string[], rows: Array): string { + return `| ${headers.join(' | ')} | +| ${headers.map(() => '-').join(' | ')} | +${rows.map((row) => `| ${row.join(' | ')} |`).join('\n')} +`; } async function main() { @@ -868,7 +850,7 @@ async function main() { const versions = browser_versions_for(target); console.log('Rewriting docs page…'); - generate('browser-support.md', render_table(versions, target)); + generate('browser-support.md', render_browser_table(versions, target)); generate('browser-support-features.md', render_conditional_table(conditional_rows, target)); console.log('Done.');