Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: support
pnpm env list
to list global or remote Node.js versio…
- Loading branch information
Showing
11 changed files
with
235 additions
and
24 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
--- | ||
"pnpm": minor | ||
"@pnpm/plugin-commands-env": minor | ||
--- | ||
|
||
Support `pnpm env list` to list global or remote Node.js versions [#5546](https://github.com/pnpm/pnpm/issues/5546). |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
--- | ||
"@pnpm/node.resolver": minor | ||
--- | ||
|
||
Export a new function: resolveNodeVersions. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
import { createFetchFromRegistry } from '@pnpm/fetch' | ||
import { resolveNodeVersions } from '@pnpm/node.resolver' | ||
|
||
const fetch = createFetchFromRegistry({}) | ||
|
||
test('resolve specified version list', async () => { | ||
const versions = await resolveNodeVersions(fetch, '16') | ||
expect(versions.length).toBeGreaterThan(1) | ||
expect(versions.every(version => version.match(/^16.+/))).toBeTruthy() | ||
}) | ||
|
||
test('resolve latest version', async () => { | ||
const versions = await resolveNodeVersions(fetch, 'latest') | ||
expect(versions.length).toEqual(1) | ||
}) | ||
|
||
test('resolve all versions', async () => { | ||
const versions = await resolveNodeVersions(fetch) | ||
expect(versions.length).toBeGreaterThan(1) | ||
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
import { promises as fs, existsSync } from 'fs' | ||
import path from 'path' | ||
import { createFetchFromRegistry } from '@pnpm/fetch' | ||
import { resolveNodeVersions } from '@pnpm/node.resolver' | ||
import { PnpmError } from '@pnpm/error' | ||
import semver from 'semver' | ||
import { getNodeMirror } from './getNodeMirror' | ||
import { getNodeVersionsBaseDir, NvmNodeCommandOptions } from './node' | ||
import { parseNodeEditionSpecifier } from './parseNodeEditionSpecifier' | ||
import { getNodeExecPathAndTargetDir, getNodeExecPathInNodeDir } from './utils' | ||
|
||
export async function listLocalVersions (opts: NvmNodeCommandOptions) { | ||
const nodeBaseDir = getNodeVersionsBaseDir(opts.pnpmHomeDir) | ||
if (!existsSync(nodeBaseDir)) { | ||
throw new PnpmError('ENV_NO_NODE_DIRECTORY', `Couldn't find Node.js directory in ${nodeBaseDir}`) | ||
} | ||
const { nodeLink } = await getNodeExecPathAndTargetDir(opts.pnpmHomeDir) | ||
const nodeVersionDirs = await fs.readdir(nodeBaseDir) | ||
return nodeVersionDirs.reduce(({ currentVersion, versions }, nodeVersion) => { | ||
const nodeVersionDir = path.join(nodeBaseDir, nodeVersion) | ||
const nodeExec = getNodeExecPathInNodeDir(nodeVersionDir) | ||
if (nodeLink?.startsWith(nodeVersionDir)) { | ||
currentVersion = nodeVersion | ||
} | ||
if (semver.valid(nodeVersion) && existsSync(nodeExec)) { | ||
versions.push(nodeVersion) | ||
} | ||
return { currentVersion, versions } | ||
}, { currentVersion: undefined as string | undefined, versions: [] as string[] }) | ||
} | ||
|
||
export async function listRemoteVersions (opts: NvmNodeCommandOptions, versionSpec?: string) { | ||
const fetch = createFetchFromRegistry(opts) | ||
const { releaseChannel, versionSpecifier } = parseNodeEditionSpecifier(versionSpec ?? '') | ||
const nodeMirrorBaseUrl = getNodeMirror(opts.rawConfig, releaseChannel) | ||
const nodeVersionList = await resolveNodeVersions(fetch, versionSpecifier, nodeMirrorBaseUrl) | ||
return nodeVersionList | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
import { promises as fs } from 'fs' | ||
import path from 'path' | ||
|
||
export async function getNodeExecPathAndTargetDir (pnpmHomeDir: string) { | ||
const nodePath = getNodeExecPathInBinDir(pnpmHomeDir) | ||
let nodeLink: string | undefined | ||
try { | ||
nodeLink = await fs.readlink(nodePath) | ||
} catch (err) { | ||
nodeLink = undefined | ||
} | ||
return { nodePath, nodeLink } | ||
} | ||
|
||
export function getNodeExecPathInBinDir (pnpmHomeDir: string) { | ||
return path.resolve(pnpmHomeDir, process.platform === 'win32' ? 'node.exe' : 'node') | ||
} | ||
|
||
export function getNodeExecPathInNodeDir (nodeDir: string) { | ||
return path.join(nodeDir, process.platform === 'win32' ? 'node.exe' : 'bin/node') | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.