summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--packages/integrations/node/src/get-network-address.ts44
-rw-r--r--packages/integrations/node/src/preview.ts12
-rw-r--r--packages/integrations/node/src/standalone.ts12
3 files changed, 64 insertions, 4 deletions
diff --git a/packages/integrations/node/src/get-network-address.ts b/packages/integrations/node/src/get-network-address.ts
new file mode 100644
index 000000000..7d9f89a28
--- /dev/null
+++ b/packages/integrations/node/src/get-network-address.ts
@@ -0,0 +1,44 @@
+import os from 'os'
+interface NetworkAddressOpt {
+ local: string[]
+ network: string[]
+}
+
+const wildcardHosts = new Set([
+ '0.0.0.0',
+ '::',
+ '0000:0000:0000:0000:0000:0000:0000:0000',
+])
+type Protocol = 'http' | 'https'
+
+// this code from vite https://github.com/vitejs/vite/blob/d09bbd093a4b893e78f0bbff5b17c7cf7821f403/packages/vite/src/node/utils.ts#L892-L914
+export function getNetworkAddress(protocol: Protocol = 'http', hostname: string | undefined, port: number, base?: string) {
+ const NetworkAddress: NetworkAddressOpt = {
+ local: [],
+ network: []
+ }
+ Object.values(os.networkInterfaces())
+ .flatMap((nInterface) => nInterface ?? [])
+ .filter(
+ (detail) =>
+ detail &&
+ detail.address &&
+ (detail.family === 'IPv4' ||
+ // @ts-expect-error Node 18.0 - 18.3 returns number
+ detail.family === 4),
+ )
+ .forEach((detail) => {
+ let host = detail.address.replace('127.0.0.1', hostname === undefined || wildcardHosts.has(hostname) ? 'localhost' : hostname)
+ // ipv6 host
+ if (host.includes(':')) {
+ host = `[${host}]`
+ }
+ const url = `${protocol}://${host}:${port}${base ? base : ''}`
+ if (detail.address.includes('127.0.0.1')) {
+ NetworkAddress.local.push(url)
+ } else {
+ NetworkAddress.network.push(url)
+ }
+ })
+ return NetworkAddress
+}
diff --git a/packages/integrations/node/src/preview.ts b/packages/integrations/node/src/preview.ts
index 92f9b86ba..fdf2a5cbb 100644
--- a/packages/integrations/node/src/preview.ts
+++ b/packages/integrations/node/src/preview.ts
@@ -2,6 +2,7 @@ import type { CreatePreviewServer } from 'astro';
import type http from 'node:http';
import { fileURLToPath } from 'node:url';
import { createServer } from './http-server.js';
+import { getNetworkAddress } from './get-network-address.js'
import type { createExports } from './server';
const preview: CreatePreviewServer = async function ({
@@ -67,9 +68,16 @@ const preview: CreatePreviewServer = async function ({
},
handler
);
+ const address = getNetworkAddress('http', host, port)
+
+ if (host === undefined) {
+ // eslint-disable-next-line no-console
+ console.log(`Preview server listening on \n local: ${address.local[0]} \t\n network: ${address.network[0]}\n`);
+ } else {
+ // eslint-disable-next-line no-console
+ console.log(`Preview server listening on ${address.local[0]}`);
+ }
- // eslint-disable-next-line no-console
- console.log(`Preview server listening on http://${host}:${port}`);
return server;
};
diff --git a/packages/integrations/node/src/standalone.ts b/packages/integrations/node/src/standalone.ts
index 68b2cebcd..ff1a0f693 100644
--- a/packages/integrations/node/src/standalone.ts
+++ b/packages/integrations/node/src/standalone.ts
@@ -4,6 +4,7 @@ import path from 'node:path';
import { fileURLToPath } from 'node:url';
import { createServer } from './http-server.js';
import middleware from './nodeMiddleware.js';
+import { getNetworkAddress } from './get-network-address.js'
import type { Options } from './types';
function resolvePaths(options: Options) {
@@ -55,9 +56,16 @@ export default function startServer(app: NodeApp, options: Options) {
);
const protocol = server.server instanceof https.Server ? 'https' : 'http';
+ const address = getNetworkAddress(protocol, host, port)
- // eslint-disable-next-line no-console
- console.log(`Server listening on ${protocol}://${host}:${port}`);
+ if (host === undefined) {
+ // eslint-disable-next-line no-console
+ console.log(
+ `Preview server listening on \n local: ${address.local[0]} \t\n network: ${address.network[0]}\n`);
+ } else {
+ // eslint-disable-next-line no-console
+ console.log(`Preview server listening on ${address.local[0]}`);
+ }
return {
server,