diff --git a/api/package.json b/api/package.json index 70891b350..915af30a6 100644 --- a/api/package.json +++ b/api/package.json @@ -16,7 +16,7 @@ "unzip-stream": "0.3.0" }, "devDependencies": { - "@types/node": "13.1.4", + "@types/node": "14.18.33", "@types/node-fetch": "2.5.4", "@vercel/node": "1.9.0", "typescript": "3.9.6" diff --git a/packages/cli/package.json b/packages/cli/package.json index 9714262a0..fed191977 100644 --- a/packages/cli/package.json +++ b/packages/cli/package.json @@ -81,7 +81,7 @@ "@types/minimatch": "3.0.3", "@types/mri": "1.1.0", "@types/ms": "0.7.30", - "@types/node": "11.11.0", + "@types/node": "14.18.33", "@types/node-fetch": "2.5.10", "@types/npm-package-arg": "6.1.0", "@types/pluralize": "0.0.29", diff --git a/packages/cli/src/util/client.ts b/packages/cli/src/util/client.ts index 1ca617776..66715ccbd 100644 --- a/packages/cli/src/util/client.ts +++ b/packages/cli/src/util/client.ts @@ -1,8 +1,7 @@ import { bold } from 'chalk'; import inquirer from 'inquirer'; import { EventEmitter } from 'events'; -import { URLSearchParams } from 'url'; -import { parse as parseUrl } from 'url'; +import { URL } from 'url'; import { VercelConfig } from '@vercel/client'; import retry, { RetryFunction, Options as RetryOptions } from 'async-retry'; import fetch, { BodyInit, Headers, RequestInit, Response } from 'node-fetch'; @@ -87,25 +86,18 @@ export default class Client extends EventEmitter implements Stdio { } private _fetch(_url: string, opts: FetchOptions = {}) { - const parsedUrl = parseUrl(_url, true); - const apiUrl = parsedUrl.host - ? `${parsedUrl.protocol}//${parsedUrl.host}` - : ''; + const url = new URL(_url, this.apiUrl); if (opts.accountId || opts.useCurrentTeam !== false) { - const query = new URLSearchParams(parsedUrl.query); - if (opts.accountId) { if (opts.accountId.startsWith('team_')) { - query.set('teamId', opts.accountId); + url.searchParams.set('teamId', opts.accountId); } else { - query.delete('teamId'); + url.searchParams.delete('teamId'); } } else if (opts.useCurrentTeam !== false && this.config.currentTeam) { - query.set('teamId', this.config.currentTeam); + url.searchParams.set('teamId', this.config.currentTeam); } - - _url = `${apiUrl}${parsedUrl.pathname}?${query}`; } const headers = new Headers(opts.headers); @@ -122,7 +114,6 @@ export default class Client extends EventEmitter implements Stdio { body = opts.body; } - const url = `${apiUrl ? '' : this.apiUrl}${_url}`; const requestId = this.requestIdCounter++; return this.output.time(res => { if (res) { @@ -130,7 +121,7 @@ export default class Client extends EventEmitter implements Stdio { res.statusText }: ${res.headers.get('x-vercel-id')}`; } else { - return `#${requestId} → ${opts.method || 'GET'} ${url}`; + return `#${requestId} → ${opts.method || 'GET'} ${url.href}`; } }, fetch(url, { ...opts, headers, body })); } diff --git a/packages/cli/src/util/dev/builder.ts b/packages/cli/src/util/dev/builder.ts index f573de0d2..006da3364 100644 --- a/packages/cli/src/util/dev/builder.ts +++ b/packages/cli/src/util/dev/builder.ts @@ -87,8 +87,12 @@ async function createBuildProcess( return new Promise((resolve, reject) => { // The first message that the builder process sends is the `ready` event - buildProcess.once('message', ({ type }) => { - if (type !== 'ready') { + buildProcess.once('message', data => { + if ( + data !== null && + typeof data === 'object' && + (data as { type: string }).type !== 'ready' + ) { reject(new Error('Did not get "ready" event from builder')); } else { resolve(buildProcess); diff --git a/packages/cli/src/util/dev/parse-listen.ts b/packages/cli/src/util/dev/parse-listen.ts index 0b3556bc0..0e2c2df98 100644 --- a/packages/cli/src/util/dev/parse-listen.ts +++ b/packages/cli/src/util/dev/parse-listen.ts @@ -31,11 +31,11 @@ export function parseListen(str: string, defaultPort = 3000): ListenSpec { return [url.pathname]; case 'tcp:': url.port = url.port || String(defaultPort); - return [parseInt(url.port, 10), url.hostname]; + return [parseInt(url.port, 10), url.hostname ?? undefined]; default: if (!url.slashes) { if (url.protocol === null) { - return [defaultPort, url.pathname]; + return [defaultPort, url.pathname ?? undefined]; } port = Number(url.hostname); if (url.protocol && !isNaN(port)) { diff --git a/packages/cli/src/util/dev/parse-query-string.ts b/packages/cli/src/util/dev/parse-query-string.ts index 71ae07561..ed82044be 100644 --- a/packages/cli/src/util/dev/parse-query-string.ts +++ b/packages/cli/src/util/dev/parse-query-string.ts @@ -4,7 +4,7 @@ * @param querystring - The querystring to parse, also known as the "search" string. */ export function parseQueryString( - querystring?: string + querystring?: string | null ): Record { const query: Record = Object.create(null); if (!querystring || !querystring.startsWith('?') || querystring === '?') { @@ -38,9 +38,9 @@ export function parseQueryString( */ export function formatQueryString( query: Record | undefined -): string | undefined { +): string | null { if (!query) { - return undefined; + return null; } let s = ''; let prefix = '?'; @@ -55,5 +55,5 @@ export function formatQueryString( prefix = '&'; } } - return s || undefined; + return s || null; } diff --git a/packages/cli/src/util/dev/router.ts b/packages/cli/src/util/dev/router.ts index 8fa818cb1..3e54ad60d 100644 --- a/packages/cli/src/util/dev/router.ts +++ b/packages/cli/src/util/dev/router.ts @@ -57,7 +57,8 @@ export async function devRouter( phase?: HandleValue | null ): Promise { let result: RouteResult | undefined; - let { pathname: reqPathname = '/', search: reqSearch } = url.parse(reqUrl); + let { pathname: reqPathname, search: reqSearch } = url.parse(reqUrl); + reqPathname ??= '/'; const reqQuery = parseQueryString(reqSearch); const combinedHeaders: HttpHeadersConfig = { ...previousHeaders }; let status: number | undefined; @@ -130,7 +131,8 @@ export async function devRouter( phase !== 'hit' && !isDestUrl ) { - const { pathname = '/' } = url.parse(destPath); + let { pathname } = url.parse(destPath); + pathname ??= '/'; const hasDestFile = await devServer.hasFilesystem( pathname, vercelConfig @@ -186,8 +188,9 @@ export async function devRouter( if (!destPath.startsWith('/')) { destPath = `/${destPath}`; } - const { pathname: destPathname = '/', search: destSearch } = + let { pathname: destPathname, search: destSearch } = url.parse(destPath); + destPathname ??= '/'; const destQuery = parseQueryString(destSearch); Object.assign(destQuery, reqQuery); result = { diff --git a/packages/cli/test/unit/util/dev/parse-query-string.test.ts b/packages/cli/test/unit/util/dev/parse-query-string.test.ts index 76a09eb8f..132325946 100644 --- a/packages/cli/test/unit/util/dev/parse-query-string.test.ts +++ b/packages/cli/test/unit/util/dev/parse-query-string.test.ts @@ -23,24 +23,24 @@ describe('parseQueryString', () => { const parsed = parseQueryString(''); expect(parsed).toEqual({}); const format = formatQueryString(parsed); - expect(format).toEqual(undefined); + expect(format).toEqual(null); }); it('should work with question mark', async () => { const parsed = parseQueryString('?'); expect(parsed).toEqual({}); const format = formatQueryString(parsed); - expect(format).toEqual(undefined); + expect(format).toEqual(null); }); it('should work without question mark', async () => { const parsed = parseQueryString('blarg'); expect(parsed).toEqual({}); const format = formatQueryString(parsed); - expect(format).toEqual(undefined); + expect(format).toEqual(null); }); it('should work with undefined', async () => { const parsed = parseQueryString(undefined); expect(parsed).toEqual({}); const format = formatQueryString(parsed); - expect(format).toEqual(undefined); + expect(format).toEqual(null); }); }); diff --git a/packages/client/package.json b/packages/client/package.json index efcac51b8..dda34dcc6 100644 --- a/packages/client/package.json +++ b/packages/client/package.json @@ -28,7 +28,7 @@ "@types/jest": "27.4.1", "@types/minimatch": "3.0.5", "@types/ms": "0.7.30", - "@types/node": "12.0.4", + "@types/node": "14.18.33", "@types/node-fetch": "2.5.4", "@types/recursive-readdir": "2.2.0", "@types/tar-fs": "1.16.1", diff --git a/packages/error-utils/package.json b/packages/error-utils/package.json index ca441ed87..4fb8a224e 100644 --- a/packages/error-utils/package.json +++ b/packages/error-utils/package.json @@ -17,7 +17,7 @@ "license": "MIT", "devDependencies": { "@types/jest": "29.2.1", - "@types/node": "16.11.7", + "@types/node": "14.18.33", "jest": "29.2.2", "ts-jest": "29.0.3", "typescript": "^4.8.4" diff --git a/packages/frameworks/package.json b/packages/frameworks/package.json index 73ba19dc8..af7998146 100644 --- a/packages/frameworks/package.json +++ b/packages/frameworks/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@types/jest": "27.4.1", "@types/js-yaml": "3.12.1", - "@types/node": "12.0.4", + "@types/node": "14.18.33", "@types/node-fetch": "2.5.8", "@vercel/routing-utils": "2.1.1", "ajv": "6.12.2", diff --git a/packages/fs-detectors/package.json b/packages/fs-detectors/package.json index d5a5d3ea8..d0a9bee76 100644 --- a/packages/fs-detectors/package.json +++ b/packages/fs-detectors/package.json @@ -32,7 +32,7 @@ "@types/jest": "27.5.1", "@types/js-yaml": "4.0.5", "@types/minimatch": "3.0.5", - "@types/node": "12.12.20", + "@types/node": "14.18.33", "@types/semver": "7.3.10", "@vercel/build-utils": "4.2.0", "typescript": "4.3.4" diff --git a/packages/hydrogen/package.json b/packages/hydrogen/package.json index 98ad6670a..73ea80a7f 100644 --- a/packages/hydrogen/package.json +++ b/packages/hydrogen/package.json @@ -20,7 +20,7 @@ ], "devDependencies": { "@types/jest": "27.5.1", - "@types/node": "*", + "@types/node": "14.18.33", "@vercel/build-utils": "5.5.7", "@vercel/static-config": "2.0.5", "typescript": "4.6.4" diff --git a/packages/next/package.json b/packages/next/package.json index c7df2d13a..62ba1311b 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -39,7 +39,7 @@ "@types/fs-extra": "8.0.0", "@types/glob": "7.1.3", "@types/next-server": "8.0.0", - "@types/node": "14.17.27", + "@types/node": "14.18.33", "@types/resolve-from": "5.0.1", "@types/semver": "6.0.0", "@types/text-table": "0.2.1", diff --git a/packages/node-bridge/package.json b/packages/node-bridge/package.json index 2ef7f01e2..2d5873aa7 100644 --- a/packages/node-bridge/package.json +++ b/packages/node-bridge/package.json @@ -22,7 +22,7 @@ }, "devDependencies": { "@types/aws-lambda": "8.10.19", - "@types/node": "*", + "@types/node": "14.18.33", "jsonlines": "0.1.1", "test-listen": "1.1.0", "typescript": "4.3.4" diff --git a/packages/node/package.json b/packages/node/package.json index 282d3fbdb..325baf303 100644 --- a/packages/node/package.json +++ b/packages/node/package.json @@ -30,7 +30,7 @@ }, "dependencies": { "@edge-runtime/vm": "2.0.0", - "@types/node": "*", + "@types/node": "14.18.33", "@vercel/build-utils": "5.5.7", "@vercel/node-bridge": "3.1.1", "@vercel/static-config": "2.0.5", diff --git a/packages/redwood/package.json b/packages/redwood/package.json index c82c43582..8abd02f8b 100644 --- a/packages/redwood/package.json +++ b/packages/redwood/package.json @@ -25,7 +25,7 @@ }, "devDependencies": { "@types/aws-lambda": "8.10.19", - "@types/node": "*", + "@types/node": "14.18.33", "@types/semver": "6.0.0", "@vercel/build-utils": "5.5.7" } diff --git a/packages/remix/package.json b/packages/remix/package.json index 9e9d32db6..7240ca137 100644 --- a/packages/remix/package.json +++ b/packages/remix/package.json @@ -24,7 +24,7 @@ }, "devDependencies": { "@types/jest": "27.5.1", - "@types/node": "*", + "@types/node": "14.18.33", "@vercel/build-utils": "5.5.7", "typescript": "4.6.4" } diff --git a/packages/routing-utils/package.json b/packages/routing-utils/package.json index a1748acfa..6fa2c8353 100644 --- a/packages/routing-utils/package.json +++ b/packages/routing-utils/package.json @@ -23,7 +23,7 @@ }, "devDependencies": { "@types/jest": "27.4.1", - "@types/node": "12.12.20", + "@types/node": "14.18.33", "ajv": "^6.0.0", "typescript": "4.3.4" }, diff --git a/packages/routing-utils/src/superstatic.ts b/packages/routing-utils/src/superstatic.ts index c983d1ab2..cbb2c77ac 100644 --- a/packages/routing-utils/src/superstatic.ts +++ b/packages/routing-utils/src/superstatic.ts @@ -297,7 +297,12 @@ function replaceSegments( safelyCompile(unescapeSegments(str), indexes, true) ); } else { - query[key] = safelyCompile(unescapeSegments(strOrArray), indexes, true); + // TODO: handle strOrArray is undefined + query[key] = safelyCompile( + unescapeSegments(strOrArray as string), + indexes, + true + ); } } diff --git a/packages/static-config/package.json b/packages/static-config/package.json index 10d1e1b28..7178e70e9 100644 --- a/packages/static-config/package.json +++ b/packages/static-config/package.json @@ -24,7 +24,7 @@ "devDependencies": { "@swc/core": "1.2.182", "@types/jest": "27.4.1", - "@types/node": "*" + "@types/node": "14.18.33" }, "jest": { "preset": "ts-jest", diff --git a/yarn.lock b/yarn.lock index a930d76d3..8b2de8a5c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3033,30 +3033,10 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-10.12.18.tgz#1d3ca764718915584fcd9f6344621b7672665c67" integrity sha512-fh+pAqt4xRzPfqA6eh3Z2y6fyZavRIumvjhaCL753+TVkGKGhpPeyrJG2JftD0T9q4GF00KjefsQ+PQNDdWQaQ== -"@types/node@11.11.0": - version "11.11.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-11.11.0.tgz#070e9ce7c90e727aca0e0c14e470f9a93ffe9390" - integrity sha512-D5Rt+HXgEywr3RQJcGlZUCTCx1qVbCZpVk3/tOOA6spLNZdGm8BU+zRgdRYDoF1pO3RuXLxADzMrF903JlQXqg== - -"@types/node@12.0.4": - version "12.0.4" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.0.4.tgz#46832183115c904410c275e34cf9403992999c32" - integrity sha512-j8YL2C0fXq7IONwl/Ud5Kt0PeXw22zGERt+HSSnwbKOJVsAGkEz3sFCYwaF9IOuoG1HOtE0vKCj6sXF7Q0+Vaw== - -"@types/node@12.12.20": - version "12.12.20" - resolved "https://registry.yarnpkg.com/@types/node/-/node-12.12.20.tgz#7b693038ce661fe57a7ffa4679440b5e7c5e8b99" - integrity sha512-VAe+DiwpnC/g448uN+/3gRl4th0BTdrR9gSLIOHA+SUQskaYZQDOHG7xmjiE7JUhjbXnbXytf6Ih+/pA6CtMFQ== - -"@types/node@14.17.27": - version "14.17.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.17.27.tgz#5054610d37bb5f6e21342d0e6d24c494231f3b85" - integrity sha512-94+Ahf9IcaDuJTle/2b+wzvjmutxXAEXU6O81JHblYXUg2BDG+dnBy7VxIPHKAyEEDHzCMQydTJuWvrE+Aanzw== - -"@types/node@16.11.7": - version "16.11.7" - resolved "https://registry.yarnpkg.com/@types/node/-/node-16.11.7.tgz#36820945061326978c42a01e56b61cd223dfdc42" - integrity sha512-QB5D2sqfSjCmTuWcBWyJ+/44bcjO7VbjSbOE0ucoVbAsSNQc4Lt6QkgkVXkTDwkL4z/beecZNDvVX15D4P8Jbw== +"@types/node@14.18.33": + version "14.18.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.33.tgz#8c29a0036771569662e4635790ffa9e057db379b" + integrity sha512-qelS/Ra6sacc4loe/3MSjXNL1dNQ/GjxNHVzuChwMfmk7HuycRLVQN2qNY3XahK+fZc5E2szqQSKUyAF0E+2bg== "@types/normalize-package-data@^2.4.0": version "2.4.0"