{"record":{"id":"3ffceb29a5b7ee55","repo":"denoland/deno","slug":"expected-fn-field-in-the-first-argument-to-be-a","errorCode":null,"errorMessage":"Expected 'fn' field in the first argument to be a bench function","messagePattern":"Expected 'fn' field in the first argument to be a bench function","errorType":"exception","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"cli/js/40_bench.js","lineNumber":171,"sourceCode":"      fn: nameOrFnOrOptions,\n      name: nameOrFnOrOptions.name,\n    };\n  } else {\n    let fn;\n    let name;\n    if (typeof optionsOrFn === \"function\") {\n      fn = optionsOrFn;\n      if (nameOrFnOrOptions.fn != undefined) {\n        throw new TypeError(\n          \"Unexpected 'fn' field in options, bench function is already provided as the second argument\",\n        );\n      }\n      name = nameOrFnOrOptions.name ?? fn.name;\n    } else {\n      if (\n        !nameOrFnOrOptions.fn || typeof nameOrFnOrOptions.fn !== \"function\"\n      ) {\n        throw new TypeError(\n          \"Expected 'fn' field in the first argument to be a bench function\",\n        );\n      }\n      fn = nameOrFnOrOptions.fn;\n      name = nameOrFnOrOptions.name ?? fn.name;\n    }\n    if (!name) {\n      throw new TypeError(\"The bench name can't be empty\");\n    }\n    benchDesc = { ...defaults, ...nameOrFnOrOptions, fn, name };\n  }\n\n  const AsyncFunction = (async () => {}).constructor;\n  benchDesc.async = AsyncFunction === benchDesc.fn.constructor;\n  benchDesc.fn = wrapBenchmark(benchDesc);\n  benchDesc.warmup = false;\n  benchDesc.name = escapeName(benchDesc.name);\n  if (cachedOrigin == undefined) {","sourceCodeStart":153,"sourceCodeEnd":189,"githubUrl":"https://github.com/denoland/deno/blob/89f33cbef296a2b287f323d42de54c871fa69c77/cli/js/40_bench.js#L153-L189","documentation":"`deno desktop --hmr` spawns the project's dev server (e.g. Vite) and scans its stdout for a `Local: http://…` line. This error means the server process exited before printing any such line, so no URL was ever obtained. The server's own crash output is echoed above via log::info.","triggerScenarios":"The dev server dies at startup: missing node_modules, port already in use, syntax/config error in vite.config.ts, or an unsupported Node version — and exits during the URL scan loop.","commonSituations":"First run without installing dependencies; another process holding the dev port; a broken vite/webpack config; CI environments where the dev server needs setup the script did not do.","solutions":["Run the dev server command manually (e.g. `npm run dev`) and fix its startup error — the crash reason is the server's own output","Install dependencies first (`npm install` or `deno install`) before `deno desktop --hmr`","Free the occupied port or configure the server to use another one","Check the toolchain version (Node/npm) matches the project's requirements"],"exampleFix":"# before\ndeno desktop --hmr   # dev server exits silently\n\n# after\nnpm run dev            # reproduce and fix the server's error (install deps, free port)\ndeno desktop --hmr","handlingStrategy":"validation","validationCode":"const portFree = await probeTcp('127.0.0.1', 5173) === 'closed';\nif (!portFree) throw new Error('dev port busy — stop the other server first');\nawait run('npm', ['install']); // deps present so the server reaches its Local: line","typeGuard":null,"tryCatchPattern":"try {\n  await denoDesktopHmr();\n} catch (e) {\n  if (/exited without printing a URL/.test(String(e))) {\n    const log = await runRaw('npm', ['run', 'dev']); // server's own crash output names the cause\n    throw new Error(`dev server crashed: ${log}`);\n  }\n  throw e;\n}","preventionTips":["Install project dependencies before starting HMR mode","Free the dev-server port before launching","Verify `npm run dev` (or equivalent) starts cleanly on its own first"],"tags":["desktop","hmr","dev-server","vite","startup","process"],"backgroundTag":null,"analyzedSha":"89f33cbef296a2b287f323d42de54c871fa69c77","analyzedAt":"2026-08-16T07:54:21.310Z","schemaVersion":2},"datasetVersion":"2026-08-16T08:17:34.114Z"}