Skip to content

Commit

Permalink
feat: pnpm import support yarn2 transform
Browse files Browse the repository at this point in the history
  • Loading branch information
fireairforce committed Nov 16, 2021
1 parent 79110ac commit 7435f91
Show file tree
Hide file tree
Showing 3 changed files with 517 additions and 44 deletions.
1 change: 1 addition & 0 deletions packages/plugin-commands-installation/package.json
Expand Up @@ -99,6 +99,7 @@
"ramda": "^0.27.1",
"read-ini-file": "^3.1.0",
"render-help": "^1.0.1",
"snyk-nodejs-lockfile-parser": "^1.37.1",
"version-selector-type": "^3.0.0"
},
"peerDependencies": {
Expand Down
88 changes: 58 additions & 30 deletions packages/plugin-commands-installation/src/import.ts
Expand Up @@ -20,6 +20,37 @@ import renderHelp from 'render-help'
import { parse as parseYarnLock } from '@yarnpkg/lockfile'
import exists from 'path-exists'
import recursive from './recursive'
import { Yarn2LockParser, Yarn2Lock as Yarn2LockType } from 'snyk-nodejs-lockfile-parser/dist/parsers/yarn2-lock-parser'

interface NpmPackageLock {
dependencies: LockedPackagesMap
}

interface LockedPackage {
version: string
dependencies?: LockedPackagesMap
}

interface LockedPackagesMap {
[name: string]: LockedPackage
}

interface YarnLockPackage {
version: string
resolved: string
integrity: string
dependencies?: {
[name: string]: string
}
}
interface YarnPackgeLock {
[name: string]: YarnLockPackage
}

enum YarnLockType {
yarn = 'yarn',
yarn2 = 'yarn2',
}

export const rcOptionsTypes = cliOptionsTypes

Expand Down Expand Up @@ -114,18 +145,32 @@ export async function handler (
async function readYarnLockFile (dir: string) {
try {
const yarnLockFile = await gfs.readFile(path.join(dir, 'yarn.lock'), 'utf8')
const lockJsonFile = await parseYarnLock(yarnLockFile)
if (lockJsonFile.type === 'success') {
return lockJsonFile.object
} else {
throw new PnpmError('GET_YARN_LOCKFILE_ERR', `Failed With ${lockJsonFile.type}`)
let lockJsonFile
const yarnLockFileType = getYarnLockfileType(yarnLockFile)
if (yarnLockFileType === YarnLockType.yarn) {
lockJsonFile = await parseYarnLock(yarnLockFile)
if (lockJsonFile.type === 'success') {
return lockJsonFile.object
} else {
throw new PnpmError('GET_YARN_LOCKFILE_ERR', `Failed With ${lockJsonFile.type}`)
}
} else if (yarnLockFileType === YarnLockType.yarn2) {
lockJsonFile = parseYarn2Lock(yarnLockFile)
if (lockJsonFile.type === YarnLockType.yarn2) {
return lockJsonFile.object
}
}
} catch (err: any) { // eslint-disable-line
if (err['code'] !== 'ENOENT') throw err // eslint-disable-line @typescript-eslint/dot-notation
}
throw new PnpmError('YARN_LOCKFILE_NOT_FOUND', 'No yarn.lock found')
}

function parseYarn2Lock (lockFileContents: string): Yarn2LockType {
const yarn2LockfileParser = new Yarn2LockParser()
return yarn2LockfileParser.parseLockFile(lockFileContents)
}

async function readNpmLockfile (dir: string) {
try {
return await loadJsonFile<LockedPackage>(path.join(dir, 'package-lock.json'))
Expand Down Expand Up @@ -188,33 +233,16 @@ function getAllVersionsFromYarnLockFile (
}
}

interface NpmPackageLock {
dependencies: LockedPackagesMap
}

interface LockedPackage {
version: string
dependencies?: LockedPackagesMap
}

interface LockedPackagesMap {
[name: string]: LockedPackage
}

interface YarnLockPackage {
version: string
resolved: string
integrity: string
dependencies?: {
[name: string]: string
}
}
interface YarnPackgeLock {
[name: string]: YarnLockPackage
}

function selectProjectByDir (projects: Project[], searchedDir: string) {
const project = projects.find(({ dir }) => path.relative(dir, searchedDir) === '')
if (project == null) return undefined
return { [searchedDir]: { dependencies: [], package: project } }
}

function getYarnLockfileType (
lockFileContents: string
): YarnLockType {
return lockFileContents.includes('__metadata')
? YarnLockType.yarn2
: YarnLockType.yarn
}

0 comments on commit 7435f91

Please sign in to comment.