From 93552ff4d8423e48bb6be366873e61897b40fd45 Mon Sep 17 00:00:00 2001 From: devjiwonchoi Date: Sun, 30 Jun 2024 05:17:33 +0900 Subject: [PATCH 1/6] wip --- .../next/src/lib/helpers/get-pkg-manager.ts | 23 +++++++++++++++++++ .../src/server/dev/hot-reloader-turbopack.ts | 9 ++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/packages/next/src/lib/helpers/get-pkg-manager.ts b/packages/next/src/lib/helpers/get-pkg-manager.ts index 7d05594b7e636..1df475c60d643 100644 --- a/packages/next/src/lib/helpers/get-pkg-manager.ts +++ b/packages/next/src/lib/helpers/get-pkg-manager.ts @@ -34,3 +34,26 @@ export function getPkgManager(baseDir: string): PackageManager { return 'npm' } } + +// validate if the project is using yarn +export function isPkgManagerYarn(baseDir: string = process.cwd()): boolean { + try { + const userAgent = process.env.npm_config_user_agent + if (userAgent) { + return userAgent.startsWith('yarn') + } + + if (fs.existsSync(path.join(baseDir, 'yarn.lock'))) { + return true + } + + try { + execSync('yarn --version', { stdio: 'ignore' }) + return true + } catch { + return false + } + } catch { + return false + } +} diff --git a/packages/next/src/server/dev/hot-reloader-turbopack.ts b/packages/next/src/server/dev/hot-reloader-turbopack.ts index cf35475f862cf..f0639b8d928ad 100644 --- a/packages/next/src/server/dev/hot-reloader-turbopack.ts +++ b/packages/next/src/server/dev/hot-reloader-turbopack.ts @@ -504,9 +504,6 @@ export async function createHotReloaderTurbopack( ) ) const overlayMiddleware = getOverlayMiddleware(project) - const versionInfo: VersionInfo = await getVersionInfo( - isTestMode || opts.telemetry.isEnabled - ) const hotReloader: NextJsHotReloaderInterface = { turbopackProject: project, @@ -544,7 +541,7 @@ export async function createHotReloaderTurbopack( // TODO: Figure out if socket type can match the NextJsHotReloaderInterface onHMR(req, socket: Socket, head) { - wsServer.handleUpgrade(req, socket, head, (client) => { + wsServer.handleUpgrade(req, socket, head, async (client) => { const clientIssues: EntryIssuesMap = new Map() const subscriptions: Map> = new Map() @@ -666,6 +663,10 @@ export async function createHotReloaderTurbopack( } } + const versionInfo: VersionInfo = await getVersionInfo( + isTestMode || opts.telemetry.isEnabled + ) + const sync: SyncAction = { action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC, errors, From 6a4ec31833901ea02aedfce6dc9c96a9f4e3d1e1 Mon Sep 17 00:00:00 2001 From: devjiwonchoi Date: Sun, 30 Jun 2024 05:35:27 +0900 Subject: [PATCH 2/6] refactor: skip check registry --- .../next/src/lib/helpers/get-pkg-manager.ts | 23 ------------------- .../src/server/dev/hot-reloader-webpack.ts | 5 ++-- 2 files changed, 2 insertions(+), 26 deletions(-) diff --git a/packages/next/src/lib/helpers/get-pkg-manager.ts b/packages/next/src/lib/helpers/get-pkg-manager.ts index 1df475c60d643..7d05594b7e636 100644 --- a/packages/next/src/lib/helpers/get-pkg-manager.ts +++ b/packages/next/src/lib/helpers/get-pkg-manager.ts @@ -34,26 +34,3 @@ export function getPkgManager(baseDir: string): PackageManager { return 'npm' } } - -// validate if the project is using yarn -export function isPkgManagerYarn(baseDir: string = process.cwd()): boolean { - try { - const userAgent = process.env.npm_config_user_agent - if (userAgent) { - return userAgent.startsWith('yarn') - } - - if (fs.existsSync(path.join(baseDir, 'yarn.lock'))) { - return true - } - - try { - execSync('yarn --version', { stdio: 'ignore' }) - return true - } catch { - return false - } - } catch { - return false - } -} diff --git a/packages/next/src/server/dev/hot-reloader-webpack.ts b/packages/next/src/server/dev/hot-reloader-webpack.ts index d6e5130c7948f..aea1a0fbe1274 100644 --- a/packages/next/src/server/dev/hot-reloader-webpack.ts +++ b/packages/next/src/server/dev/hot-reloader-webpack.ts @@ -62,7 +62,6 @@ import { getProperError } from '../../lib/is-error' import ws from 'next/dist/compiled/ws' import { existsSync, promises as fs } from 'fs' import type { UnwrapPromise } from '../../lib/coalesced-function' -import { getRegistry } from '../../lib/helpers/get-registry' import { parseVersionInfo } from './parse-version-info' import type { VersionInfo } from './parse-version-info' import { isAPIRoute } from '../../lib/is-api-route' @@ -202,11 +201,11 @@ export async function getVersionInfo(enabled: boolean): Promise { try { installed = require('next/package.json').version - const registry = getRegistry() let res try { - res = await fetch(`${registry}-/package/next/dist-tags`) + // use NPM registry regardless user using Yarn + res = await fetch('https://registry.npmjs.org/-/package/next/dist-tags') } catch { // ignore fetch errors } From bd4ae10eac6d134d4b94bb4babf9f5991c542e78 Mon Sep 17 00:00:00 2001 From: devjiwonchoi Date: Sun, 30 Jun 2024 12:40:12 +0900 Subject: [PATCH 3/6] refactor: ws async callback to iife --- .../src/server/dev/hot-reloader-turbopack.ts | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/packages/next/src/server/dev/hot-reloader-turbopack.ts b/packages/next/src/server/dev/hot-reloader-turbopack.ts index f0639b8d928ad..f650bf120d433 100644 --- a/packages/next/src/server/dev/hot-reloader-turbopack.ts +++ b/packages/next/src/server/dev/hot-reloader-turbopack.ts @@ -41,7 +41,6 @@ import { } from '../lib/render-server' import { denormalizePagePath } from '../../shared/lib/page-path/denormalize-page-path' import { trace } from '../../trace' -import type { VersionInfo } from './parse-version-info' import { AssetMapper, type ChangeSubscriptions, @@ -541,7 +540,7 @@ export async function createHotReloaderTurbopack( // TODO: Figure out if socket type can match the NextJsHotReloaderInterface onHMR(req, socket: Socket, head) { - wsServer.handleUpgrade(req, socket, head, async (client) => { + wsServer.handleUpgrade(req, socket, head, (client) => { const clientIssues: EntryIssuesMap = new Map() const subscriptions: Map> = new Map() @@ -663,19 +662,21 @@ export async function createHotReloaderTurbopack( } } - const versionInfo: VersionInfo = await getVersionInfo( - isTestMode || opts.telemetry.isEnabled - ) + ;(async function () { + const versionInfo = await getVersionInfo( + isTestMode || opts.telemetry.isEnabled + ) - const sync: SyncAction = { - action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC, - errors, - warnings: [], - hash: '', - versionInfo, - } + const sync: SyncAction = { + action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC, + errors, + warnings: [], + hash: '', + versionInfo, + } - sendToClient(client, sync) + sendToClient(client, sync) + })() }) }, From 66bc776214af72f6a49f8f7cb7293618839472ff Mon Sep 17 00:00:00 2001 From: devjiwonchoi Date: Mon, 1 Jul 2024 19:43:41 +0900 Subject: [PATCH 4/6] refactor: don't always call version info inside handleUpgrade Co-authored-by: Jiachi Liu --- .../src/server/dev/hot-reloader-turbopack.ts | 33 +++++++++++-------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/packages/next/src/server/dev/hot-reloader-turbopack.ts b/packages/next/src/server/dev/hot-reloader-turbopack.ts index f650bf120d433..c35bb5a81cbd8 100644 --- a/packages/next/src/server/dev/hot-reloader-turbopack.ts +++ b/packages/next/src/server/dev/hot-reloader-turbopack.ts @@ -80,6 +80,7 @@ import { } from './turbopack/entry-key' import { FAST_REFRESH_RUNTIME_RELOAD } from './messages' import { generateEncryptionKeyBase64 } from '../app-render/encryption-utils' +import type { VersionInfo } from './parse-version-info' const wsServer = new ws.Server({ noServer: true }) const isTestMode = !!( @@ -503,6 +504,10 @@ export async function createHotReloaderTurbopack( ) ) const overlayMiddleware = getOverlayMiddleware(project) + const versionInfoPromise = getVersionInfo( + isTestMode || opts.telemetry.isEnabled + ) + let versionInfo: VersionInfo | undefined const hotReloader: NextJsHotReloaderInterface = { turbopackProject: project, @@ -662,21 +667,23 @@ export async function createHotReloaderTurbopack( } } - ;(async function () { - const versionInfo = await getVersionInfo( - isTestMode || opts.telemetry.isEnabled - ) + if (!versionInfo) { + ;(async function () { + versionInfo = await versionInfoPromise + })() + } - const sync: SyncAction = { - action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC, - errors, - warnings: [], - hash: '', - versionInfo, - } + versionInfo ??= { installed: '0.0.0', staleness: 'unknown' } + + const sync: SyncAction = { + action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC, + errors, + warnings: [], + hash: '', + versionInfo, + } - sendToClient(client, sync) - })() + sendToClient(client, sync) }) }, From 44b35cf50931a30538831a2fd6e02e434e4fa647 Mon Sep 17 00:00:00 2001 From: devjiwonchoi Date: Mon, 1 Jul 2024 20:42:28 +0900 Subject: [PATCH 5/6] fix: should run sendToClient inside IIFE --- .../src/server/dev/hot-reloader-turbopack.ts | 26 +++++++++---------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/packages/next/src/server/dev/hot-reloader-turbopack.ts b/packages/next/src/server/dev/hot-reloader-turbopack.ts index c35bb5a81cbd8..7b91d1eb3bdab 100644 --- a/packages/next/src/server/dev/hot-reloader-turbopack.ts +++ b/packages/next/src/server/dev/hot-reloader-turbopack.ts @@ -667,23 +667,21 @@ export async function createHotReloaderTurbopack( } } - if (!versionInfo) { - ;(async function () { + ;(async function () { + if (!versionInfo) { versionInfo = await versionInfoPromise - })() - } - - versionInfo ??= { installed: '0.0.0', staleness: 'unknown' } + } - const sync: SyncAction = { - action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC, - errors, - warnings: [], - hash: '', - versionInfo, - } + const sync: SyncAction = { + action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC, + errors, + warnings: [], + hash: '', + versionInfo, + } - sendToClient(client, sync) + sendToClient(client, sync) + })() }) }, From 41c74d628458578cba1513ccc1dd4518bc281945 Mon Sep 17 00:00:00 2001 From: devjiwonchoi Date: Tue, 2 Jul 2024 00:35:50 +0900 Subject: [PATCH 6/6] refactor: don't store promise value Co-authored-by: Tobias Koppers --- packages/next/src/server/dev/hot-reloader-turbopack.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/packages/next/src/server/dev/hot-reloader-turbopack.ts b/packages/next/src/server/dev/hot-reloader-turbopack.ts index 7b91d1eb3bdab..49761d3999f41 100644 --- a/packages/next/src/server/dev/hot-reloader-turbopack.ts +++ b/packages/next/src/server/dev/hot-reloader-turbopack.ts @@ -80,7 +80,6 @@ import { } from './turbopack/entry-key' import { FAST_REFRESH_RUNTIME_RELOAD } from './messages' import { generateEncryptionKeyBase64 } from '../app-render/encryption-utils' -import type { VersionInfo } from './parse-version-info' const wsServer = new ws.Server({ noServer: true }) const isTestMode = !!( @@ -507,7 +506,6 @@ export async function createHotReloaderTurbopack( const versionInfoPromise = getVersionInfo( isTestMode || opts.telemetry.isEnabled ) - let versionInfo: VersionInfo | undefined const hotReloader: NextJsHotReloaderInterface = { turbopackProject: project, @@ -668,9 +666,7 @@ export async function createHotReloaderTurbopack( } ;(async function () { - if (!versionInfo) { - versionInfo = await versionInfoPromise - } + const versionInfo = await versionInfoPromise const sync: SyncAction = { action: HMR_ACTIONS_SENT_TO_BROWSER.SYNC,