From 4215e22696dfec4e030749a1ad001777bf4dc2bb Mon Sep 17 00:00:00 2001 From: patak Date: Sun, 26 Mar 2023 15:18:21 +0200 Subject: [PATCH] refactor: simplify lookupFile (#12585) --- packages/vite/src/node/config.ts | 3 ++- packages/vite/src/node/env.ts | 13 ++++++------ packages/vite/src/node/optimizer/index.ts | 7 ++---- packages/vite/src/node/ssr/ssrExternal.ts | 6 +++++- packages/vite/src/node/utils.ts | 26 ++++++++--------------- 5 files changed, 24 insertions(+), 31 deletions(-) diff --git a/packages/vite/src/node/config.ts b/packages/vite/src/node/config.ts index e63877c1698f17..d42af1a6a74a3b 100644 --- a/packages/vite/src/node/config.ts +++ b/packages/vite/src/node/config.ts @@ -928,7 +928,8 @@ export async function loadConfigFromFile( // check package.json for type: "module" and set `isESM` to true try { const pkg = lookupFile(configRoot, ['package.json']) - isESM = !!pkg && JSON.parse(pkg).type === 'module' + isESM = + !!pkg && JSON.parse(fs.readFileSync(pkg, 'utf-8')).type === 'module' } catch (e) {} } diff --git a/packages/vite/src/node/env.ts b/packages/vite/src/node/env.ts index 338de6784497d8..374e1f049c0618 100644 --- a/packages/vite/src/node/env.ts +++ b/packages/vite/src/node/env.ts @@ -1,7 +1,8 @@ import fs from 'node:fs' +import path from 'node:path' import { parse } from 'dotenv' import { expand } from 'dotenv-expand' -import { arraify, lookupFile } from './utils' +import { arraify, tryStatSync } from './utils' import type { UserConfig } from './config' export function loadEnv( @@ -26,12 +27,10 @@ export function loadEnv( const parsed = Object.fromEntries( envFiles.flatMap((file) => { - const path = lookupFile(envDir, [file], { - pathOnly: true, - rootDir: envDir, - }) - if (!path) return [] - return Object.entries(parse(fs.readFileSync(path))) + const filePath = path.join(envDir, file) + if (!tryStatSync(filePath)?.isFile()) return [] + + return Object.entries(parse(fs.readFileSync(filePath))) }), ) diff --git a/packages/vite/src/node/optimizer/index.ts b/packages/vite/src/node/optimizer/index.ts index 0c0e90821bde56..e55651537623c2 100644 --- a/packages/vite/src/node/optimizer/index.ts +++ b/packages/vite/src/node/optimizer/index.ts @@ -1186,13 +1186,10 @@ const lockfileFormats = [ { name: 'pnpm-lock.yaml', checkPatches: false }, // Included in lockfile { name: 'bun.lockb', checkPatches: true }, ] +const lockfileNames = lockfileFormats.map((l) => l.name) export function getDepHash(config: ResolvedConfig, ssr: boolean): string { - const lockfilePath = lookupFile( - config.root, - lockfileFormats.map((l) => l.name), - { pathOnly: true }, - ) + const lockfilePath = lookupFile(config.root, lockfileNames) let content = lockfilePath ? fs.readFileSync(lockfilePath, 'utf-8') : '' if (lockfilePath) { const lockfileName = path.basename(lockfilePath) diff --git a/packages/vite/src/node/ssr/ssrExternal.ts b/packages/vite/src/node/ssr/ssrExternal.ts index 1b3869b3208a27..af3349235f9d4d 100644 --- a/packages/vite/src/node/ssr/ssrExternal.ts +++ b/packages/vite/src/node/ssr/ssrExternal.ts @@ -217,7 +217,11 @@ function cjsSsrCollectExternals( seen: Set, logger: Logger, ) { - const rootPkgContent = lookupFile(root, ['package.json']) + const rootPkgPath = lookupFile(root, ['package.json']) + if (!rootPkgPath) { + return + } + const rootPkgContent = fs.readFileSync(rootPkgPath, 'utf-8') if (!rootPkgContent) { return } diff --git a/packages/vite/src/node/utils.ts b/packages/vite/src/node/utils.ts index bb5d6850e23e18..a266c8cd661d29 100644 --- a/packages/vite/src/node/utils.ts +++ b/packages/vite/src/node/utils.ts @@ -390,28 +390,20 @@ export function tryStatSync(file: string): fs.Stats | undefined { // Ignore errors } } -interface LookupFileOptions { - pathOnly?: boolean - rootDir?: string -} export function lookupFile( dir: string, - formats: string[], - options?: LookupFileOptions, + fileNames: string[], ): string | undefined { - for (const format of formats) { - const fullPath = path.join(dir, format) - if (tryStatSync(fullPath)?.isFile()) { - return options?.pathOnly ? fullPath : fs.readFileSync(fullPath, 'utf-8') + while (dir) { + for (const fileName of fileNames) { + const fullPath = path.join(dir, fileName) + if (tryStatSync(fullPath)?.isFile()) return fullPath } - } - const parentDir = path.dirname(dir) - if ( - parentDir !== dir && - (!options?.rootDir || parentDir.startsWith(options?.rootDir)) - ) { - return lookupFile(parentDir, formats, options) + const parentDir = path.dirname(dir) + if (parentDir === dir) return + + dir = parentDir } }