diff --git a/CHANGELOG.md b/CHANGELOG.md index 84291c9e32b..27d5e10d859 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,3 +5,5 @@ - Always setup Data Connect SDK when FDC_CONNECTOR env var is set. - `firebase init` now uses FIREBASE_PROJECT env var as the default project name. - Add emulator support to firestore MCP tools. (#8700) +- Increased npm timeout for web frameworks to 60s. (#8702) +- Fallback to reading web framework dependencies version directly from node_modules package.json when the npm timeout is reached. (#8702) diff --git a/src/frameworks/constants.ts b/src/frameworks/constants.ts index b3d6e754082..b98584e0f2e 100644 --- a/src/frameworks/constants.ts +++ b/src/frameworks/constants.ts @@ -2,7 +2,7 @@ import { SupportLevel } from "./interfaces"; import * as clc from "colorette"; import * as experiments from "../experiments"; -export const NPM_COMMAND_TIMEOUT_MILLIES = 10_000; +export const NPM_COMMAND_TIMEOUT_MILLIES = 60_000; export const SupportLevelWarnings = { [SupportLevel.Experimental]: (framework: string) => `Thank you for trying our ${clc.italic( diff --git a/src/frameworks/utils.ts b/src/frameworks/utils.ts index 19e3414cbb9..2ee5339099c 100644 --- a/src/frameworks/utils.ts +++ b/src/frameworks/utils.ts @@ -1,4 +1,4 @@ -import { readJSON as originalReadJSON } from "fs-extra"; +import { readJSON as originalReadJSON, readJsonSync } from "fs-extra"; import type { ReadOptions } from "fs-extra"; import { dirname, extname, join, relative } from "path"; import { readFile } from "fs/promises"; @@ -290,8 +290,14 @@ export function findDependency(name: string, options: Partial = { cwd, env, timeout: NPM_COMMAND_TIMEOUT_MILLIES }, ); if (!result.stdout) return; - const json = JSON.parse(result.stdout.toString()); - return scanDependencyTree(name, json.dependencies); + try { + const json = JSON.parse(result.stdout.toString()); + return scanDependencyTree(name, json.dependencies); + } catch (e) { + // fallback to reading the version directly from package.json if npm list times out + const packageJson = readJsonSync(join(cwd, name, "package.json"), { throws: false }); + return packageJson?.version ? { version: packageJson.version } : undefined; + } } export function relativeRequire(