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 |
-| ----------------------------------------------------------------------------- | -------------------------------------------------------- |
-|  Chrome /  Edge | 87 |
-|  Firefox | 83 |
-|  Safari | 14 |
-|  Opera | 73 |
-|  Opera (Android) | 62 |
-|  Samsung Internet | 14.0 |
-|  Android WebView | 87 |
-|  Internet Explorer | not supported |
+| Browser | Minimum version |
+| - | - |
+|  Chrome /  Edge | 87 |
+|  Firefox | 83 |
+|  Safari | 14 |
+|  Opera | 73 |
+|  Opera (Android) | 62 |
+|  Samsung Internet | 14.0 |
+|  Android WebView | 87 |
+|  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: ' 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.');