|
@@ -2,16 +2,21 @@
|
|
|
// SPDX-License-Identifier: Apache-2.0
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
|
-import { spawnSync } from '../../helpers/spawn'
|
|
|
import { sync as crossSpawnSync } from 'cross-spawn'
|
|
|
-import { appDir, resolve as appResolve } from '../../helpers/app-paths'
|
|
|
+import { resolve as appResolve } from '../../helpers/app-paths'
|
|
|
import { existsSync } from 'fs'
|
|
|
import semver from 'semver'
|
|
|
+import { IManager, NpmManager, YarnManager, PnpmManager } from './managers'
|
|
|
|
|
|
-const useYarn = (): boolean =>
|
|
|
- process.env.npm_execpath
|
|
|
- ? process.env.npm_execpath.includes('yarn')
|
|
|
- : existsSync(appResolve.app('yarn.lock'))
|
|
|
+const getManager = (): IManager => {
|
|
|
+ if (existsSync(appResolve.app('yarn.lock'))) {
|
|
|
+ return new YarnManager()
|
|
|
+ } else if (existsSync(appResolve.app('pnpm-lock.yaml'))) {
|
|
|
+ return new PnpmManager()
|
|
|
+ } else {
|
|
|
+ return new NpmManager()
|
|
|
+ }
|
|
|
+}
|
|
|
|
|
|
function getCrateLatestVersion(crateName: string): string | null {
|
|
|
const child = crossSpawnSync('cargo', ['search', crateName, '--limit', '1'])
|
|
@@ -26,69 +31,23 @@ function getCrateLatestVersion(crateName: string): string | null {
|
|
|
}
|
|
|
|
|
|
function getNpmLatestVersion(packageName: string): string {
|
|
|
- if (useYarn()) {
|
|
|
- const child = crossSpawnSync(
|
|
|
- 'yarn',
|
|
|
- ['info', packageName, 'versions', '--json'],
|
|
|
- {
|
|
|
- cwd: appDir
|
|
|
- }
|
|
|
- )
|
|
|
- const output = String(child.output[1])
|
|
|
- const packageJson = JSON.parse(output) as { data: string[] }
|
|
|
- return packageJson.data[packageJson.data.length - 1]
|
|
|
- } else {
|
|
|
- const child = crossSpawnSync('npm', ['show', packageName, 'version'], {
|
|
|
- cwd: appDir
|
|
|
- })
|
|
|
- return String(child.output[1]).replace('\n', '')
|
|
|
- }
|
|
|
+ return getManager().getLatestVersion(packageName)
|
|
|
}
|
|
|
|
|
|
function getNpmPackageVersion(packageName: string): string | null {
|
|
|
- const child = useYarn()
|
|
|
- ? crossSpawnSync(
|
|
|
- 'yarn',
|
|
|
- ['list', '--pattern', packageName, '--depth', '0'],
|
|
|
- {
|
|
|
- cwd: appDir
|
|
|
- }
|
|
|
- )
|
|
|
- : crossSpawnSync('npm', ['list', packageName, 'version', '--depth', '0'], {
|
|
|
- cwd: appDir
|
|
|
- })
|
|
|
- const output = String(child.output[1])
|
|
|
- // eslint-disable-next-line security/detect-non-literal-regexp
|
|
|
- const matches = new RegExp(packageName + '@(\\S+)', 'g').exec(output)
|
|
|
- if (matches?.[1]) {
|
|
|
- return matches[1]
|
|
|
- } else {
|
|
|
- return null
|
|
|
- }
|
|
|
+ return getManager().getPackageVersion(packageName)
|
|
|
}
|
|
|
|
|
|
function installNpmPackage(packageName: string): void {
|
|
|
- if (useYarn()) {
|
|
|
- spawnSync('yarn', ['add', packageName], appDir)
|
|
|
- } else {
|
|
|
- spawnSync('npm', ['install', packageName], appDir)
|
|
|
- }
|
|
|
+ return getManager().installPackage(packageName)
|
|
|
}
|
|
|
|
|
|
function installNpmDevPackage(packageName: string): void {
|
|
|
- if (useYarn()) {
|
|
|
- spawnSync('yarn', ['add', packageName, '--dev'], appDir)
|
|
|
- } else {
|
|
|
- spawnSync('npm', ['install', packageName, '--save-dev'], appDir)
|
|
|
- }
|
|
|
+ return getManager().installDevPackage(packageName)
|
|
|
}
|
|
|
|
|
|
function updateNpmPackage(packageName: string): void {
|
|
|
- if (useYarn()) {
|
|
|
- spawnSync('yarn', ['upgrade', packageName, '--latest'], appDir)
|
|
|
- } else {
|
|
|
- spawnSync('npm', ['install', `${packageName}@latest`], appDir)
|
|
|
- }
|
|
|
+ return getManager().updatePackage(packageName)
|
|
|
}
|
|
|
|
|
|
function padVersion(version: string): string {
|
|
@@ -105,7 +64,7 @@ function semverLt(first: string, second: string): boolean {
|
|
|
}
|
|
|
|
|
|
export {
|
|
|
- useYarn,
|
|
|
+ getManager,
|
|
|
getCrateLatestVersion,
|
|
|
getNpmLatestVersion,
|
|
|
getNpmPackageVersion,
|