Skip to content

Commit abcb7c0

Browse files
authored
bye bye red lines (#13911)
1 parent cbe5c7a commit abcb7c0

File tree

10 files changed

+141
-114
lines changed

10 files changed

+141
-114
lines changed

packages/kit/test/ambient.d.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { AfterNavigate, BeforeNavigate } from '@sveltejs/kit';
2+
13
declare global {
24
interface Window {
35
navigated: Promise<void>;
@@ -14,8 +16,8 @@ declare global {
1416

1517
const invalidate: (url: string) => Promise<void>;
1618
const preloadData: (url: string) => Promise<void>;
17-
const beforeNavigate: (fn: (url: URL) => void | boolean) => void;
18-
const afterNavigate: (fn: () => void) => void;
19+
const beforeNavigate: (fn: (navigation: BeforeNavigate) => void | boolean) => void;
20+
const afterNavigate: (fn: (navigation: AfterNavigate) => void) => void;
1921
const preloadCode: (pathname: string) => Promise<void>;
2022
}
2123

packages/kit/test/apps/basics/test/client.test.js

Lines changed: 61 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -576,11 +576,15 @@ test.describe('Invalidation', () => {
576576
expect(await page.textContent('h1')).toBe('a: 0, b: 1');
577577

578578
await page.click('button.invalidateall');
579-
await page.evaluate(() => window.promise);
579+
await page.evaluate(
580+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
581+
);
580582
expect(await page.textContent('h1')).toBe('a: 2, b: 3');
581583

582584
await page.click('button.invalidateall');
583-
await page.evaluate(() => window.promise);
585+
await page.evaluate(
586+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
587+
);
584588
expect(await page.textContent('h1')).toBe('a: 4, b: 5');
585589
});
586590

@@ -591,7 +595,9 @@ test.describe('Invalidation', () => {
591595
expect(await page.textContent('h1')).toBe('a: 0, b: 1');
592596

593597
await page.click('button.goto');
594-
await page.evaluate(() => window.promise);
598+
await page.evaluate(
599+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
600+
);
595601
expect(await page.textContent('h1')).toBe('a: 2, b: 3');
596602
});
597603

@@ -633,14 +639,18 @@ test.describe('Invalidation', () => {
633639
expect(shared).toBeDefined();
634640

635641
await page.click('button.server');
636-
await page.evaluate(() => window.promise);
642+
await page.evaluate(
643+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
644+
);
637645
const next_server = await page.textContent('p.server');
638646
const next_shared = await page.textContent('p.shared');
639647
expect(server).not.toBe(next_server);
640648
expect(shared).not.toBe(next_shared);
641649

642650
await page.click('button.neither');
643-
await page.evaluate(() => window.promise);
651+
await page.evaluate(
652+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
653+
);
644654
expect(await page.textContent('p.server')).toBe(next_server);
645655
expect(await page.textContent('p.shared')).toBe(next_shared);
646656
});
@@ -665,14 +675,18 @@ test.describe('Invalidation', () => {
665675
expect(shared).toBeDefined();
666676

667677
await page.click('button.shared');
668-
await page.evaluate(() => window.promise);
678+
await page.evaluate(
679+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
680+
);
669681
const next_server = await page.textContent('p.server');
670682
const next_shared = await page.textContent('p.shared');
671683
expect(server).toBe(next_server);
672684
expect(shared).not.toBe(next_shared);
673685

674686
await page.click('button.neither');
675-
await page.evaluate(() => window.promise);
687+
await page.evaluate(
688+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
689+
);
676690
expect(await page.textContent('p.server')).toBe(next_server);
677691
expect(await page.textContent('p.shared')).toBe(next_shared);
678692
});
@@ -689,7 +703,9 @@ test.describe('Invalidation', () => {
689703
expect(shared).toBeDefined();
690704

691705
await page.click('button.server');
692-
await page.evaluate(() => window.promise);
706+
await page.evaluate(
707+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
708+
);
693709
const next_layout = await page.textContent('p.layout');
694710
const next_server = await page.textContent('p.server');
695711
const next_shared = await page.textContent('p.shared');
@@ -698,7 +714,9 @@ test.describe('Invalidation', () => {
698714
expect(shared).not.toBe(next_shared);
699715

700716
await page.click('button.neither');
701-
await page.evaluate(() => window.promise);
717+
await page.evaluate(
718+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
719+
);
702720
expect(await page.textContent('p.layout')).toBe(next_layout);
703721
expect(await page.textContent('p.server')).toBe(next_server);
704722
expect(await page.textContent('p.shared')).toBe(next_shared);
@@ -714,7 +732,9 @@ test.describe('Invalidation', () => {
714732
expect(shared).toBeDefined();
715733

716734
await page.click('button.shared');
717-
await page.evaluate(() => window.promise);
735+
await page.evaluate(
736+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
737+
);
718738
const next_layout = await page.textContent('p.layout');
719739
const next_server = await page.textContent('p.server');
720740
const next_shared = await page.textContent('p.shared');
@@ -723,7 +743,9 @@ test.describe('Invalidation', () => {
723743
expect(shared).not.toBe(next_shared);
724744

725745
await page.click('button.neither');
726-
await page.evaluate(() => window.promise);
746+
await page.evaluate(
747+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
748+
);
727749
expect(await page.textContent('p.layout')).toBe(next_layout);
728750
expect(await page.textContent('p.server')).toBe(next_server);
729751
expect(await page.textContent('p.shared')).toBe(next_shared);
@@ -739,7 +761,9 @@ test.describe('Invalidation', () => {
739761
expect(shared).toBeDefined();
740762

741763
await page.click('button.specified');
742-
await page.evaluate(() => window.promise);
764+
await page.evaluate(
765+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
766+
);
743767
const next_layout = await page.textContent('p.layout');
744768
const next_server = await page.textContent('p.server');
745769
const next_shared = await page.textContent('p.shared');
@@ -748,7 +772,9 @@ test.describe('Invalidation', () => {
748772
expect(shared).not.toBe(next_shared);
749773

750774
await page.click('button.neither');
751-
await page.evaluate(() => window.promise);
775+
await page.evaluate(
776+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
777+
);
752778
expect(await page.textContent('p.layout')).toBe(next_layout);
753779
expect(await page.textContent('p.server')).toBe(next_server);
754780
expect(await page.textContent('p.shared')).toBe(next_shared);
@@ -812,14 +838,18 @@ test.describe('Invalidation', () => {
812838
expect(_page).toBeDefined();
813839

814840
await page.click('button.invalidate');
815-
await page.evaluate(() => window.promise);
841+
await page.evaluate(
842+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
843+
);
816844
const next_layout_1 = await page.textContent('p.layout');
817845
const next_page_1 = await page.textContent('p.page');
818846
expect(next_layout_1).not.toBe(layout);
819847
expect(next_page_1).toBe(_page);
820848

821849
await page.click('button.goto');
822-
await page.evaluate(() => window.promise);
850+
await page.evaluate(
851+
() => /** @type {Window & typeof globalThis & { promise: Promise<void> }} */ (window).promise
852+
);
823853
const next_layout_2 = await page.textContent('p.layout');
824854
const next_page_2 = await page.textContent('p.page');
825855
expect(next_layout_2).toBe(next_layout_1);
@@ -1113,7 +1143,7 @@ test.describe('Content negotiation', () => {
11131143
test('+server.js next to +page.svelte works', async ({ page }) => {
11141144
const response = await page.goto('/routing/content-negotiation');
11151145

1116-
expect(response.headers()['vary']).toBe('Accept');
1146+
expect(response?.headers()['vary']).toBe('Accept');
11171147
expect(await page.textContent('p')).toBe('Hi');
11181148

11191149
const pre = page.locator('pre');
@@ -1143,9 +1173,13 @@ test.describe('env', () => {
11431173

11441174
test('can access public env in hooks.client.js', async ({ page }) => {
11451175
await page.goto('/');
1146-
expect(await page.evaluate(() => window.PUBLIC_DYNAMIC)).toBe(
1147-
'accessible anywhere/evaluated at run time'
1148-
);
1176+
expect(
1177+
await page.evaluate(
1178+
() =>
1179+
/** @type {Window & typeof globalThis & { PUBLIC_DYNAMIC: string }} */ (window)
1180+
.PUBLIC_DYNAMIC
1181+
)
1182+
).toBe('accessible anywhere/evaluated at run time');
11491183
});
11501184

11511185
test('uses correct dynamic env when navigating from prerendered page', async ({
@@ -1210,10 +1244,10 @@ test.describe('Streaming', () => {
12101244
expect(page.locator('p.loadingsuccess')).toBeVisible();
12111245
expect(page.locator('p.loadingfail')).toBeVisible();
12121246

1213-
await expect(page.locator('p.success', { timeout: 15000 })).toHaveText('success');
1214-
await expect(page.locator('p.fail', { timeout: 15000 })).toHaveText(
1215-
'fail (500 Internal Error)'
1216-
);
1247+
await expect(page.locator('p.success')).toHaveText('success', { timeout: 15000 });
1248+
await expect(page.locator('p.fail')).toHaveText('fail (500 Internal Error)', {
1249+
timeout: 15000
1250+
});
12171251
expect(page.locator('p.loadingsuccess')).toBeHidden();
12181252
expect(page.locator('p.loadingfail')).toBeHidden();
12191253
});
@@ -1297,12 +1331,13 @@ test.describe('Assets', () => {
12971331

12981332
expect(
12991333
await page.evaluate(() => {
1334+
/** @type {HTMLLinkElement[]} */
13001335
const links = Array.from(document.head.querySelectorAll('link[rel=stylesheet]'));
13011336

13021337
for (let i = 0; i < links.length; ) {
13031338
const link = links.shift();
1304-
const asset_name = link.href.split('/').at(-1);
1305-
if (links.some((link) => link.href.includes(asset_name))) {
1339+
const asset_name = link?.href.split('/').at(-1);
1340+
if (asset_name && links.some((link) => link.href.includes(asset_name))) {
13061341
return false;
13071342
}
13081343
}
@@ -1388,7 +1423,7 @@ test.describe('Shallow routing', () => {
13881423
await page.goto('/shallow-routing/push-state');
13891424
await expect(page.locator('p')).toHaveText('active: false');
13901425

1391-
const now = await page.locator('span').textContent();
1426+
const now = /** @type {string} */ (await page.locator('span').textContent());
13921427

13931428
await page.locator('[data-id="two"]').click();
13941429
expect(page.url()).toBe(`${baseURL}/shallow-routing/push-state/a`);

packages/kit/test/apps/basics/test/cross-platform/test.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1076,10 +1076,10 @@ test.describe('$app/server', () => {
10761076
const svg = await page.innerHTML('[data-testid="svg"]');
10771077

10781078
// the emoji is there to check that base64 decoding works correctly
1079-
expect(auto.trim()).toBe('Imported without ?url 😎');
1080-
expect(url.trim()).toBe('Imported with ?url 😎');
1081-
expect(local_glob.trim()).toBe('Imported with ?url via glob 😎');
1082-
expect(external_glob.trim()).toBe(
1079+
expect(auto?.trim()).toBe('Imported without ?url 😎');
1080+
expect(url?.trim()).toBe('Imported with ?url 😎');
1081+
expect(local_glob?.trim()).toBe('Imported with ?url via glob 😎');
1082+
expect(external_glob?.trim()).toBe(
10831083
'Imported with url glob from the read-file test in basics. Placed here outside the app folder to force a /@fs prefix 😎'
10841084
);
10851085
expect(svg).toContain('<rect width="24" height="24" rx="2" fill="#ff3e00"></rect>');

packages/kit/test/apps/basics/test/test.js

Lines changed: 19 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ test.describe.configure({ mode: 'parallel' });
1111
test.describe('adapter', () => {
1212
test('populates event.platform for dynamic SSR', async ({ page }) => {
1313
await page.goto('/adapter/dynamic');
14-
const json = JSON.parse(await page.textContent('pre'));
14+
const json = JSON.parse((await page.textContent('pre')) ?? '');
1515

1616
expect(json).toEqual({
1717
config: {
@@ -23,7 +23,7 @@ test.describe('adapter', () => {
2323

2424
test('populates event.platform for prerendered page', async ({ page }) => {
2525
await page.goto('/adapter/prerendered');
26-
const json = JSON.parse(await page.textContent('pre'));
26+
const json = JSON.parse((await page.textContent('pre')) ?? '');
2727

2828
expect(json).toEqual({
2929
config: {
@@ -384,7 +384,7 @@ test.describe('Load', () => {
384384
const requested_urls = [];
385385

386386
const { port } = await start_server(async (req, res) => {
387-
requested_urls.push(req.url);
387+
requested_urls.push(/** @type {string} */ (req.url));
388388

389389
if (req.url === '/server-fetch-request-modified.json') {
390390
res.writeHead(200, {
@@ -683,7 +683,7 @@ test.describe('Page options', () => {
683683
page,
684684
javaScriptEnabled
685685
}) => {
686-
test.skip(process.env.DEV, 'skip when in dev mode');
686+
test.skip(!!process.env.DEV, 'skip when in dev mode');
687687
test.skip(!javaScriptEnabled, 'skip when JavaScript is disabled');
688688
await page.goto('/prerendering/no-ssr');
689689
await expect(page.getByText('Hello world!')).toBeVisible();
@@ -782,16 +782,16 @@ test.describe('$app/stores', () => {
782782
await page.goto('/store/data/www');
783783

784784
await clicknav('a[href="/store/data/foo"]');
785-
expect(JSON.parse(await page.textContent('#store-data'))).toEqual(stuff1);
785+
expect(JSON.parse((await page.textContent('#store-data')) ?? '')).toEqual(stuff1);
786786

787787
await clicknav('#reload-button');
788-
expect(JSON.parse(await page.textContent('#store-data'))).toEqual(
788+
expect(JSON.parse((await page.textContent('#store-data')) ?? '')).toEqual(
789789
javaScriptEnabled ? stuff2 : stuff1
790790
);
791791

792792
await clicknav('a[href="/store/data/zzz"]');
793793
await clicknav('a[href="/store/data/foo"]');
794-
expect(JSON.parse(await page.textContent('#store-data'))).toEqual(stuff3);
794+
expect(JSON.parse((await page.textContent('#store-data')) ?? '')).toEqual(stuff3);
795795
});
796796

797797
test('navigating store contains from, to and type', async ({ app, page, javaScriptEnabled }) => {
@@ -906,16 +906,16 @@ test.describe('$app/state', () => {
906906
await page.goto('/state/data/www');
907907

908908
await clicknav('a[href="/state/data/foo"]');
909-
expect(JSON.parse(await page.textContent('#state-data'))).toEqual(stuff1);
909+
expect(JSON.parse((await page.textContent('#state-data')) ?? '')).toEqual(stuff1);
910910

911911
await clicknav('#reload-button');
912-
expect(JSON.parse(await page.textContent('#state-data'))).toEqual(
912+
expect(JSON.parse((await page.textContent('#state-data')) ?? '')).toEqual(
913913
javaScriptEnabled ? stuff2 : stuff1
914914
);
915915

916916
await clicknav('a[href="/state/data/zzz"]');
917917
await clicknav('a[href="/state/data/foo"]');
918-
expect(JSON.parse(await page.textContent('#state-data'))).toEqual(stuff3);
918+
expect(JSON.parse((await page.textContent('#state-data')) ?? '')).toEqual(stuff3);
919919
});
920920

921921
test('navigating state contains from, to and type', async ({ app, page, javaScriptEnabled }) => {
@@ -1403,9 +1403,8 @@ test.describe('Actions', () => {
14031403
}) => {
14041404
const response = await page.request.fetch(`${baseURL}/actions/form-errors`, {
14051405
method: 'POST',
1406-
body: JSON.stringify({ foo: 'bar' }),
1406+
data: { foo: 'bar' },
14071407
headers: {
1408-
'Content-Type': 'application/json',
14091408
Origin: `${baseURL}`
14101409
}
14111410
});
@@ -1423,7 +1422,7 @@ test.describe('Actions', () => {
14231422
}) => {
14241423
const response = await page.request.fetch(`${baseURL}/actions/enhance?/doesnt-exist`, {
14251424
method: 'POST',
1426-
body: 'irrelevant',
1425+
data: 'irrelevant',
14271426
headers: {
14281427
Origin: `${baseURL}`
14291428
}
@@ -1516,28 +1515,28 @@ test.describe.serial('Cookies API', () => {
15161515
test.describe('Serialization', () => {
15171516
test('A custom data type can be serialized/deserialized', async ({ page, clicknav }) => {
15181517
await page.goto('/serialization-basic');
1519-
expect(await page.textContent('h1')).toBe('It works!');
1518+
await expect(page.locator('h1')).toHaveText('It works!');
15201519

15211520
await clicknav('[href="/serialization-basic/child"]');
1522-
expect(await page.textContent('h1')).toBe('Client-side navigation also works!');
1521+
await expect(page.locator('h1')).toHaveText('Client-side navigation also works!');
15231522
});
15241523

15251524
test('A custom data type can be serialized/deserialized on POST', async ({ page }) => {
1526-
await page.goto('/serialization-form');
1525+
await page.goto('/serialization-form2');
15271526
await page.click('button');
1528-
expect(await page.textContent('h1')).toBe('It works!');
1527+
await expect(page.locator('h1')).toHaveText('It works!');
15291528

15301529
// Test navigating to the basic page works as intended
1531-
await page.locator('a').first();
1532-
expect(await page.textContent('h1')).toBe('It works!');
1530+
await page.locator('a').first().click();
1531+
await expect(page.locator('h1')).toHaveText('It works!');
15331532
});
15341533

15351534
test('A custom data type can be serialized/deserialized on POST with use:enhance', async ({
15361535
page
15371536
}) => {
15381537
await page.goto('/serialization-form2');
15391538
await page.click('button');
1540-
expect(await page.textContent('h1')).toBe('It works!');
1539+
await expect(page.locator('h1')).toHaveText('It works!');
15411540
});
15421541
});
15431542

0 commit comments

Comments
 (0)