[dev] consolidate dev server address parsing (#8538)

Consolidates parsing and access to `this.address` so that we don't have to `new URL(this.address)` all over the place.

---

Follow-up from: https://github.com/vercel/vercel/pull/8457#issuecomment-1238653904
This commit is contained in:
Sean Massa
2022-09-09 17:07:58 -05:00
committed by GitHub
parent 4dc0bef62b
commit 3dc1ad6437

View File

@@ -135,9 +135,18 @@ export default class DevServer {
public proxy: httpProxy;
public envConfigs: EnvConfigs;
public files: BuilderInputs;
public address: string;
public devCacheDir: string;
private _address: URL | undefined;
public get address(): URL {
if (!this._address) {
throw new Error(
'Invalid access to `address` because `start` has not yet populated `this.address`.'
);
}
return this._address;
}
public devCacheDir: string;
private currentDevCommand?: string;
private caseSensitive: boolean;
private apiDir: string | null;
@@ -175,7 +184,6 @@ export default class DevServer {
this.systemEnvValues = options.systemEnvValues || [];
this.projectEnvs = options.projectEnvs || [];
this.files = {};
this.address = '';
this.originalProjectSettings = options.projectSettings;
this.projectSettings = options.projectSettings;
this.caseSensitive = false;
@@ -714,7 +722,7 @@ export default class DevServer {
this.projectEnvs || [],
this.systemEnvValues || [],
this.projectSettings?.autoExposeSystemEnvs,
new URL(this.address).host
this.address.host
);
allEnv = { ...cloudEnv };
@@ -849,7 +857,7 @@ export default class DevServer {
injectSystemValuesInDotenv(env: Env): Env {
for (const name of Object.keys(env)) {
if (name === 'VERCEL_URL') {
env['VERCEL_URL'] = new URL(this.address).host;
env['VERCEL_URL'] = this.address.host;
} else if (name === 'VERCEL_REGION') {
env['VERCEL_REGION'] = 'dev1';
}
@@ -922,9 +930,9 @@ export default class DevServer {
}
}
this.address = address
.replace('[::]', 'localhost')
.replace('127.0.0.1', 'localhost');
this._address = new URL(
address.replace('[::]', 'localhost').replace('127.0.0.1', 'localhost')
);
const vercelConfig = await this.getVercelConfig();
const devCommandPromise = this.runDevCommand();
@@ -1028,7 +1036,12 @@ export default class DevServer {
await devCommandPromise;
this.output.ready(`Available at ${link(this.address)}`);
let addressFormatted = this.address.toString();
if (this.address.pathname === '/' && this.address.protocol === 'http:') {
// log address without trailing slash to maintain backwards compatibility
addressFormatted = addressFormatted.replace(/\/$/, '');
}
this.output.ready(`Available at ${link(addressFormatted)}`);
}
/**
@@ -1576,8 +1589,7 @@ export default class DevServer {
const rewriteUrlParsed = new URL(rewritePath);
// `this.address` already has localhost normalized from ip4 and ip6 values
const devServerParsed = new URL(this.address);
if (devServerParsed.origin === rewriteUrlParsed.origin) {
if (this.address.origin === rewriteUrlParsed.origin) {
// remove origin, leaving the path
req.url =
rewritePath.slice(rewriteUrlParsed.origin.length) || '/';
@@ -2325,7 +2337,6 @@ export default class DevServer {
this.output.debug(`Spawning dev command: ${command}`);
const devPort = new URL(this.address).port;
const proxyPort = new RegExp(port.toString(), 'g');
const p = spawnCommand(command, {
stdio: ['inherit', 'pipe', 'pipe'],
@@ -2342,7 +2353,7 @@ export default class DevServer {
p.stdout.setEncoding('utf8');
p.stdout.on('data', (data: string) => {
process.stdout.write(data.replace(proxyPort, devPort));
process.stdout.write(data.replace(proxyPort, this.address.port));
});
p.on('exit', (code, signal) => {