Skip to content

Commit 302e0ef

Browse files
bluwymatthewp
andauthored
Default preview host to localhost (#5753)
* Initial refactor * Extract as vite plugin * Cleanup vite plugin * Reduce option passing * Use localhost as preview default host * Simplify base handling * Fix host handling * Add changeset * Remove unused imports * Remove unused sirv dep * Try pin playwright to 1.28.1 * Update playwright * Try this * Speed up CI * Try fix page off * Refactor networkidle * Ensure open connections are destroyed when the preview server is closed * Revert debug code Co-authored-by: Matthew Phillips <matthew@matthewphillips.info>
1 parent f354114 commit 302e0ef

File tree

15 files changed

+183
-270
lines changed

15 files changed

+183
-270
lines changed

.changeset/lemon-bobcats-kick.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'astro': major
3+
---
4+
5+
Default preview host to `localhost` instead of `127.0.0.1`. This allows the static server and integration preview servers to serve under ipv6.

packages/astro/package.json

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -155,8 +155,8 @@
155155
"rehype": "^12.0.1",
156156
"resolve": "^1.22.0",
157157
"semver": "^7.3.7",
158+
"server-destroy": "^1.0.1",
158159
"shiki": "^0.11.1",
159-
"sirv": "^2.0.2",
160160
"slash": "^4.0.0",
161161
"string-width": "^5.1.2",
162162
"strip-ansi": "^7.0.1",
@@ -171,7 +171,7 @@
171171
"zod": "^3.17.3"
172172
},
173173
"devDependencies": {
174-
"@playwright/test": "^1.22.2",
174+
"@playwright/test": "^1.29.2",
175175
"@types/babel__generator": "^7.6.4",
176176
"@types/babel__traverse": "^7.17.1",
177177
"@types/chai": "^4.3.1",
@@ -191,6 +191,7 @@
191191
"@types/resolve": "^1.20.2",
192192
"@types/rimraf": "^3.0.2",
193193
"@types/send": "^0.17.1",
194+
"@types/server-destroy": "^1.0.1",
194195
"@types/unist": "^2.0.6",
195196
"astro-scripts": "workspace:*",
196197
"chai": "^4.3.6",

packages/astro/src/core/dev/dev.ts

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -49,17 +49,14 @@ export default async function dev(
4949
// Start listening to the port
5050
const devServerAddressInfo = await startContainer(restart.container);
5151

52-
const site = settings.config.site
53-
? new URL(settings.config.base, settings.config.site)
54-
: undefined;
5552
info(
5653
options.logging,
5754
null,
5855
msg.serverStart({
5956
startupTime: performance.now() - devStart,
6057
resolvedUrls: restart.container.viteServer.resolvedUrls || { local: [], network: [] },
6158
host: settings.config.server.host,
62-
site,
59+
base: settings.config.base,
6360
isRestart: options.isRestart,
6461
})
6562
);

packages/astro/src/core/messages.ts

Lines changed: 5 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,11 @@ import {
1414
underline,
1515
yellow,
1616
} from 'kleur/colors';
17-
import type { AddressInfo } from 'net';
18-
import os from 'os';
1917
import { ResolvedServerUrls } from 'vite';
2018
import { ZodError } from 'zod';
2119
import { renderErrorMarkdown } from './errors/dev/utils.js';
2220
import { AstroError, CompilerError, ErrorWithMetadata } from './errors/index.js';
23-
import { removeTrailingForwardSlash } from './path.js';
24-
import { emoji, getLocalAddress, padMultilineString } from './util.js';
21+
import { emoji, padMultilineString } from './util.js';
2522

2623
const PREFIX_PADDING = 6;
2724

@@ -58,31 +55,26 @@ export function serverStart({
5855
startupTime,
5956
resolvedUrls,
6057
host,
61-
site,
58+
base,
6259
isRestart = false,
6360
}: {
6461
startupTime: number;
6562
resolvedUrls: ResolvedServerUrls;
6663
host: string | boolean;
67-
site: URL | undefined;
64+
base: string;
6865
isRestart?: boolean;
6966
}): string {
7067
// PACKAGE_VERSION is injected at build-time
7168
const version = process.env.PACKAGE_VERSION ?? '0.0.0';
72-
const rootPath = site ? site.pathname : '/';
7369
const localPrefix = `${dim('┃')} Local `;
7470
const networkPrefix = `${dim('┃')} Network `;
7571
const emptyPrefix = ' '.repeat(11);
7672

7773
const localUrlMessages = resolvedUrls.local.map((url, i) => {
78-
return `${i === 0 ? localPrefix : emptyPrefix}${bold(
79-
cyan(removeTrailingForwardSlash(url) + rootPath)
80-
)}`;
74+
return `${i === 0 ? localPrefix : emptyPrefix}${bold(cyan(new URL(url).origin + base))}`;
8175
});
8276
const networkUrlMessages = resolvedUrls.network.map((url, i) => {
83-
return `${i === 0 ? networkPrefix : emptyPrefix}${bold(
84-
cyan(removeTrailingForwardSlash(url) + rootPath)
85-
)}`;
77+
return `${i === 0 ? networkPrefix : emptyPrefix}${bold(cyan(new URL(url).origin + base))}`;
8678
});
8779

8880
if (networkUrlMessages.length === 0) {
@@ -109,50 +101,6 @@ export function serverStart({
109101
.join('\n');
110102
}
111103

112-
export function resolveServerUrls({
113-
address,
114-
host,
115-
https,
116-
}: {
117-
address: AddressInfo;
118-
host: string | boolean;
119-
https: boolean;
120-
}): ResolvedServerUrls {
121-
const { address: networkAddress, port } = address;
122-
const localAddress = getLocalAddress(networkAddress, host);
123-
const networkLogging = getNetworkLogging(host);
124-
const toDisplayUrl = (hostname: string) => `${https ? 'https' : 'http'}://${hostname}:${port}`;
125-
126-
let local = toDisplayUrl(localAddress);
127-
let network: string | null = null;
128-
129-
if (networkLogging === 'visible') {
130-
const ipv4Networks = Object.values(os.networkInterfaces())
131-
.flatMap((networkInterface) => networkInterface ?? [])
132-
.filter(
133-
(networkInterface) =>
134-
networkInterface?.address &&
135-
// Node < v18
136-
((typeof networkInterface.family === 'string' && networkInterface.family === 'IPv4') ||
137-
// Node >= v18
138-
(typeof networkInterface.family === 'number' && (networkInterface as any).family === 4))
139-
);
140-
for (let { address: ipv4Address } of ipv4Networks) {
141-
if (ipv4Address.includes('127.0.0.1')) {
142-
const displayAddress = ipv4Address.replace('127.0.0.1', localAddress);
143-
local = toDisplayUrl(displayAddress);
144-
} else {
145-
network = toDisplayUrl(ipv4Address);
146-
}
147-
}
148-
}
149-
150-
return {
151-
local: [local],
152-
network: network ? [network] : [],
153-
};
154-
}
155-
156104
export function telemetryNotice() {
157105
const headline = yellow(`Astro now collects ${bold('anonymous')} usage data.`);
158106
const why = `This ${bold('optional program')} will help shape our roadmap.`;
@@ -228,11 +176,6 @@ export function cancelled(message: string, tip?: string) {
228176
.join('\n');
229177
}
230178

231-
/** Display port in use */
232-
export function portInUse({ port }: { port: number }): string {
233-
return `Port ${port} in use. Trying a new one…`;
234-
}
235-
236179
const LOCAL_IP_HOSTS = new Set(['localhost', '127.0.0.1']);
237180

238181
export function getNetworkLogging(host: string | boolean): 'none' | 'host-to-expose' | 'visible' {

packages/astro/src/core/preview/index.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,9 @@ export default async function preview(
2323
logging: logging,
2424
});
2525
await runHookConfigDone({ settings: settings, logging: logging });
26-
const host = getResolvedHostForHttpServer(settings.config.server.host);
27-
const { port, headers } = settings.config.server;
2826

2927
if (settings.config.output === 'static') {
30-
const server = await createStaticPreviewServer(settings, { logging, host, port, headers });
28+
const server = await createStaticPreviewServer(settings, logging);
3129
return server;
3230
}
3331
if (!settings.adapter) {
@@ -55,8 +53,8 @@ export default async function preview(
5553
outDir: settings.config.outDir,
5654
client: settings.config.build.client,
5755
serverEntrypoint: new URL(settings.config.build.serverEntry, settings.config.build.server),
58-
host,
59-
port,
56+
host: getResolvedHostForHttpServer(settings.config.server.host),
57+
port: settings.config.server.port,
6058
base: settings.config.base,
6159
});
6260

0 commit comments

Comments
 (0)