{
  "version": 3,
  "sources": ["../../../../src/packages/plugin-commands-env/node.ts"],
  "sourcesContent": ["import fs from 'node:fs';\nimport path from 'node:path';\nimport util from 'node:util';\nimport type { Config } from '../config/index.ts';\nimport { getSystemNodeVersion } from '../env.system-node-version/index.ts';\nimport {\n  createFetchFromRegistry,\n  type FetchFromRegistry,\n} from '../fetch/index.ts';\nimport { globalInfo } from '../logger/index.ts';\nimport { fetchNode } from '../node.fetcher/index.ts';\nimport { getStorePath } from '../store-path/index.ts';\nimport type {\n  PrepareExecutionEnvOptions,\n  PrepareExecutionEnvResult,\n} from '../types/index.ts';\nimport { loadJsonFile } from 'load-json-file';\nimport { writeJsonFile } from 'write-json-file';\nimport { getNodeMirror } from './getNodeMirror.ts';\nimport { parseNodeSpecifier } from './parseNodeSpecifier.ts';\n\nexport type NvmNodeCommandOptions = Pick<\n  Config,\n  | 'bin'\n  | 'global'\n  | 'fetchRetries'\n  | 'fetchRetryFactor'\n  | 'fetchRetryMaxtimeout'\n  | 'fetchRetryMintimeout'\n  | 'fetchTimeout'\n  | 'userAgent'\n  | 'ca'\n  | 'cert'\n  | 'httpProxy'\n  | 'httpsProxy'\n  | 'key'\n  | 'localAddress'\n  | 'noProxy'\n  | 'rawConfig'\n  | 'strictSsl'\n  | 'storeDir'\n  | 'useNodeVersion'\n  | 'pnpmHomeDir'\n> &\n  Partial<Pick<Config, 'configDir' | 'cliOptions' | 'sslConfigs'>> & {\n    remote?: boolean | undefined;\n  };\n\nconst nodeFetchPromises: Record<string, Promise<string>> = {};\n\nexport async function prepareExecutionEnv(\n  config: NvmNodeCommandOptions,\n  { extraBinPaths, executionEnv }: PrepareExecutionEnvOptions\n): Promise<PrepareExecutionEnvResult> {\n  if (\n    typeof executionEnv?.nodeVersion === 'undefined' ||\n    `v${executionEnv.nodeVersion}` === (await getSystemNodeVersion())\n  ) {\n    return { extraBinPaths: extraBinPaths ?? [] };\n  }\n\n  let nodePathPromise = nodeFetchPromises[executionEnv.nodeVersion];\n\n  if (!nodePathPromise) {\n    nodePathPromise = getNodeBinDir({\n      ...config,\n      useNodeVersion: executionEnv.nodeVersion,\n    });\n\n    nodeFetchPromises[executionEnv.nodeVersion] = nodePathPromise;\n  }\n\n  return {\n    extraBinPaths: [await nodePathPromise, ...(extraBinPaths ?? [])],\n  };\n}\n\nexport async function getNodeBinDir(\n  opts: NvmNodeCommandOptions\n): Promise<string> {\n  const fetch = createFetchFromRegistry(opts);\n\n  const nodesDir = getNodeVersionsBaseDir(opts.pnpmHomeDir);\n\n  let wantedNodeVersion =\n    opts.useNodeVersion ?? (await readNodeVersionsManifest(nodesDir)).default;\n\n  if (wantedNodeVersion == null) {\n    const response = await fetch('https://registry.npmjs.org/node');\n\n    wantedNodeVersion = ((await response.json()) as any)['dist-tags'].lts; // eslint-disable-line\n\n    if (wantedNodeVersion == null) {\n      throw new Error('Could not resolve LTS version of Node.js');\n    }\n\n    await writeJsonFile(path.join(nodesDir, 'versions.json'), {\n      default: wantedNodeVersion,\n    });\n  }\n\n  const { useNodeVersion, releaseChannel } =\n    parseNodeSpecifier(wantedNodeVersion);\n\n  const nodeMirrorBaseUrl = getNodeMirror(opts.rawConfig, releaseChannel);\n\n  const nodeDir = await getNodeDir(fetch, {\n    ...opts,\n    useNodeVersion,\n    nodeMirrorBaseUrl,\n  });\n\n  return process.platform === 'win32' ? nodeDir : path.join(nodeDir, 'bin');\n}\n\nexport function getNodeVersionsBaseDir(pnpmHomeDir: string): string {\n  return path.join(pnpmHomeDir, 'nodejs');\n}\n\nexport async function getNodeDir(\n  fetch: FetchFromRegistry,\n  opts: NvmNodeCommandOptions & {\n    useNodeVersion: string;\n    nodeMirrorBaseUrl: string;\n  }\n): Promise<string> {\n  const nodesDir = getNodeVersionsBaseDir(opts.pnpmHomeDir);\n\n  await fs.promises.mkdir(nodesDir, { recursive: true });\n\n  const versionDir = path.join(nodesDir, opts.useNodeVersion);\n\n  if (!fs.existsSync(versionDir)) {\n    const storeDir = await getStorePath({\n      pkgRoot: process.cwd(),\n      storePath: opts.storeDir,\n      pnpmHomeDir: opts.pnpmHomeDir,\n    });\n\n    globalInfo(`Fetching Node.js ${opts.useNodeVersion} ...`);\n\n    await fetchNode(fetch, opts.useNodeVersion, versionDir, {\n      ...opts,\n      storeDir,\n      retry: {\n        maxTimeout: opts.fetchRetryMaxtimeout ?? 60_000,\n        minTimeout: opts.fetchRetryMintimeout ?? 10_000,\n        retries: opts.fetchRetries ?? 2,\n        factor: opts.fetchRetryFactor ?? 10,\n      },\n    });\n  }\n\n  return versionDir;\n}\n\nasync function readNodeVersionsManifest(\n  nodesDir: string\n): Promise<{ default?: string }> {\n  try {\n    return await loadJsonFile<{ default?: string }>(\n      path.join(nodesDir, 'versions.json')\n    );\n  } catch (err: unknown) {\n    if (\n      util.types.isNativeError(err) &&\n      'code' in err &&\n      err.code === 'ENOENT'\n    ) {\n      return {};\n    }\n\n    throw err;\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
