mirror of
https://github.com/pnpm/pnpm.git
synced 2026-03-31 05:22:00 -04:00
refactor: update package-requester to version 0.3.0
This commit is contained in:
@@ -21,7 +21,7 @@
|
||||
"dependencies": {
|
||||
"@pnpm/default-fetcher": "^0.3.0",
|
||||
"@pnpm/default-resolver": "^0.1.0",
|
||||
"@pnpm/package-requester": "^0.2.0",
|
||||
"@pnpm/package-requester": "^0.3.0",
|
||||
"@pnpm/types": "^1.2.1",
|
||||
"@types/byline": "^4.2.31",
|
||||
"@types/common-tags": "^1.2.5",
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
dependencies:
|
||||
'@pnpm/default-fetcher': 0.3.0
|
||||
'@pnpm/default-resolver': 0.1.0
|
||||
'@pnpm/package-requester': 0.2.0
|
||||
'@pnpm/package-requester': 0.3.0
|
||||
'@pnpm/types': 1.2.1
|
||||
'@types/byline': 4.2.31
|
||||
'@types/common-tags': 1.4.0
|
||||
@@ -282,7 +282,7 @@ packages:
|
||||
'@pnpm/logger': ^1.0.0
|
||||
resolution:
|
||||
integrity: sha512-9Ln3phdOdq0is/iVsqPQdB/JV9qtEi4Dq9kTMzHA1R898bSEsk8G3aSqbNFz6skTVYAuLMyiAdrVtJJ8FqJsgQ==
|
||||
/@pnpm/package-requester/0.2.0:
|
||||
/@pnpm/package-requester/0.3.0:
|
||||
dependencies:
|
||||
'@pnpm/types': 1.2.1
|
||||
'@types/load-json-file': 2.0.7
|
||||
@@ -309,7 +309,7 @@ packages:
|
||||
peerDependencies:
|
||||
'@pnpm/logger': ^1.0.0
|
||||
resolution:
|
||||
integrity: sha512-boW7hvZzg/Od8+1OAP23Tsqk8bWvt8C28am5XcSIiEnfUZk20wk4fsfa9HePA7RopX17dy7Hs7bs5lfAUnhBLg==
|
||||
integrity: sha512-/yhqgFogVoYOln8vDqRXURCMXj2AeuBFKr2fH6I1+swOgfwuGk+SF28VTzcf8YU5cjvczzfvcKYQS5/t6dw4ig==
|
||||
/@pnpm/tarball-fetcher/0.3.1:
|
||||
dependencies:
|
||||
'@types/mem': 1.1.2
|
||||
@@ -4853,7 +4853,7 @@ specifiers:
|
||||
'@pnpm/default-fetcher': ^0.3.0
|
||||
'@pnpm/default-resolver': ^0.1.0
|
||||
'@pnpm/logger': ^1.0.0
|
||||
'@pnpm/package-requester': ^0.2.0
|
||||
'@pnpm/package-requester': ^0.3.0
|
||||
'@pnpm/types': ^1.2.1
|
||||
'@types/byline': ^4.2.31
|
||||
'@types/common-tags': ^1.2.5
|
||||
|
||||
@@ -56,9 +56,10 @@ import parseWantedDependencies from '../parseWantedDependencies'
|
||||
import createFetcher from '@pnpm/default-fetcher'
|
||||
import createResolver from '@pnpm/default-resolver'
|
||||
import createPackageRequester, {
|
||||
PackageContentInfo,
|
||||
PackageFilesResponse,
|
||||
DirectoryResolution,
|
||||
Resolution,
|
||||
RequestPackageFunction,
|
||||
} from '@pnpm/package-requester'
|
||||
|
||||
export type InstalledPackages = {
|
||||
@@ -100,23 +101,13 @@ export type InstallContext = {
|
||||
}[],
|
||||
wantedShrinkwrap: Shrinkwrap,
|
||||
currentShrinkwrap: Shrinkwrap,
|
||||
requestPackage: Function, //tslint:disable-line
|
||||
fetchingLocker: {
|
||||
[pkgId: string]: {
|
||||
fetchingFiles: Promise<PackageContentInfo>,
|
||||
fetchingPkg: Promise<PackageJson>,
|
||||
calculatingIntegrity: Promise<void>,
|
||||
},
|
||||
},
|
||||
requestPackage: RequestPackageFunction,
|
||||
// the IDs of packages that are not installable
|
||||
skipped: Set<string>,
|
||||
tree: {[nodeId: string]: TreeNode},
|
||||
storeIndex: Store,
|
||||
force: boolean,
|
||||
prefix: string,
|
||||
storePath: string,
|
||||
registry: string,
|
||||
metaCache: Map<string, object>,
|
||||
depth: number,
|
||||
engineStrict: boolean,
|
||||
nodeVersion: string,
|
||||
@@ -329,11 +320,8 @@ async function installInContext (
|
||||
nodesToBuild: [],
|
||||
wantedShrinkwrap: ctx.wantedShrinkwrap,
|
||||
currentShrinkwrap: ctx.currentShrinkwrap,
|
||||
fetchingLocker: {},
|
||||
skipped: ctx.skipped,
|
||||
tree: {},
|
||||
storeIndex: ctx.storeIndex,
|
||||
storePath: ctx.storePath,
|
||||
registry: ctx.wantedShrinkwrap.registry,
|
||||
force: opts.force,
|
||||
depth: (function () {
|
||||
@@ -355,7 +343,6 @@ async function installInContext (
|
||||
offline: opts.offline,
|
||||
rawNpmConfig: opts.rawNpmConfig,
|
||||
nodeModules: nodeModulesPath,
|
||||
metaCache: opts.metaCache,
|
||||
verifyStoreInegrity: opts.verifyStoreIntegrity,
|
||||
engineStrict: opts.engineStrict,
|
||||
nodeVersion: opts.nodeVersion,
|
||||
@@ -365,6 +352,8 @@ async function installInContext (
|
||||
createFetcher(opts) as {}, // TODO: remove `as {}`
|
||||
{
|
||||
networkConcurrency: opts.networkConcurrency,
|
||||
storeIndex: ctx.storeIndex,
|
||||
storePath: ctx.storePath,
|
||||
},
|
||||
),
|
||||
}
|
||||
@@ -381,7 +370,6 @@ async function installInContext (
|
||||
currentDepth: 0,
|
||||
readPackageHook: opts.hooks.readPackage,
|
||||
hasManifestInShrinkwrap,
|
||||
ignoreFile: opts.ignoreFile,
|
||||
}
|
||||
const nonLinkedPkgs = await pFilter(packagesToInstall,
|
||||
async (wantedDependency: WantedDependency) => {
|
||||
@@ -609,7 +597,7 @@ async function installInContext (
|
||||
)
|
||||
|
||||
// waiting till integrities are saved
|
||||
await Promise.all(R.values(installCtx.installs).map(installed => installed.calculatingIntegrity))
|
||||
await Promise.all(R.values(installCtx.installs).map(installed => installed.generatingIntegrity))
|
||||
|
||||
summaryLogger.info(undefined)
|
||||
}
|
||||
|
||||
@@ -4,12 +4,10 @@ import logger from '@pnpm/logger'
|
||||
import {PackageManifest} from '@pnpm/types'
|
||||
import {installCheckLogger} from '../loggers'
|
||||
import {InstalledPackages} from '../api/install'
|
||||
import {FetchedPackage} from '@pnpm/package-requester'
|
||||
|
||||
export default async function getIsInstallable (
|
||||
pkgId: string,
|
||||
pkg: PackageManifest,
|
||||
fetchedPkg: FetchedPackage,
|
||||
options: {
|
||||
nodeId: string,
|
||||
installs: InstalledPackages,
|
||||
|
||||
@@ -6,8 +6,7 @@ import getNpmTarballUrl from 'get-npm-tarball-url'
|
||||
import exists = require('path-exists')
|
||||
import url = require('url')
|
||||
import {
|
||||
FetchedPackage,
|
||||
PackageContentInfo,
|
||||
PackageFilesResponse,
|
||||
Resolution,
|
||||
} from '@pnpm/package-requester'
|
||||
import {InstallContext, InstalledPackages} from '../api/install'
|
||||
@@ -47,8 +46,8 @@ export type InstalledPackage = {
|
||||
prod: boolean,
|
||||
dev: boolean,
|
||||
optional: boolean,
|
||||
fetchingFiles: Promise<PackageContentInfo>,
|
||||
calculatingIntegrity: Promise<void>,
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
generatingIntegrity: Promise<void>,
|
||||
path: string,
|
||||
specRaw: string,
|
||||
name: string,
|
||||
@@ -233,7 +232,6 @@ async function install (
|
||||
proceed: boolean,
|
||||
readPackageHook?: ReadPackageHook,
|
||||
hasManifestInShrinkwrap: boolean,
|
||||
ignoreFile?: (filename: string) => boolean,
|
||||
}
|
||||
): Promise<PkgAddress | null> {
|
||||
const keypath = options.keypath || []
|
||||
@@ -265,45 +263,40 @@ async function install (
|
||||
pkg: loggedPkg,
|
||||
})
|
||||
|
||||
const fetchedPkg = await ctx.requestPackage(wantedDependency, {
|
||||
const pkgResponse = await ctx.requestPackage(wantedDependency, {
|
||||
loggedPkg,
|
||||
update: options.update,
|
||||
fetchingLocker: ctx.fetchingLocker,
|
||||
registry,
|
||||
prefix: ctx.prefix,
|
||||
storePath: ctx.storePath,
|
||||
metaCache: ctx.metaCache,
|
||||
shrinkwrapResolution: options.shrinkwrapResolution,
|
||||
pkgId: options.pkgId,
|
||||
currentPkgId: options.pkgId,
|
||||
offline: ctx.offline,
|
||||
storeIndex: ctx.storeIndex,
|
||||
verifyStoreIntegrity: ctx.verifyStoreInegrity,
|
||||
downloadPriority: -options.currentDepth,
|
||||
ignore: options.ignoreFile,
|
||||
})
|
||||
|
||||
if (fetchedPkg.isLocal) {
|
||||
const pkg = fetchedPkg.pkg
|
||||
if (pkgResponse.isLocal) {
|
||||
const pkg = await pkgResponse.fetchingManifest
|
||||
if (options.currentDepth > 0) {
|
||||
logger.warn(`Ignoring file dependency because it is not a root dependency ${wantedDependency}`)
|
||||
} else {
|
||||
ctx.localPackages.push({
|
||||
alias: wantedDependency.alias || pkg.name,
|
||||
id: fetchedPkg.id,
|
||||
id: pkgResponse.id,
|
||||
specRaw: wantedDependency.raw,
|
||||
name: pkg.name,
|
||||
version: pkg.version,
|
||||
dev: wantedDependency.dev,
|
||||
optional: wantedDependency.optional,
|
||||
resolution: fetchedPkg.resolution,
|
||||
normalizedPref: fetchedPkg.normalizedPref,
|
||||
resolution: pkgResponse.resolution,
|
||||
normalizedPref: pkgResponse.normalizedPref,
|
||||
})
|
||||
}
|
||||
logStatus({status: 'downloaded_manifest', pkgId: fetchedPkg.id, pkgVersion: pkg.version})
|
||||
logStatus({status: 'downloaded_manifest', pkgId: pkgResponse.id, pkgVersion: pkg.version})
|
||||
return null
|
||||
}
|
||||
|
||||
if (options.parentNodeId.indexOf(`:${dependentId}:${fetchedPkg.id}:`) !== -1) {
|
||||
if (options.parentNodeId.indexOf(`:${dependentId}:${pkgResponse.id}:`) !== -1) {
|
||||
return null
|
||||
}
|
||||
|
||||
@@ -327,36 +320,36 @@ async function install (
|
||||
} else {
|
||||
try {
|
||||
pkg = options.readPackageHook
|
||||
? options.readPackageHook(await fetchedPkg.fetchingPkg)
|
||||
: await fetchedPkg.fetchingPkg
|
||||
? options.readPackageHook(await pkgResponse.fetchingManifest)
|
||||
: await pkgResponse.fetchingManifest
|
||||
} catch (err) {
|
||||
// avoiding unhandled promise rejections
|
||||
fetchedPkg.calculatingIntegrity.catch((err: Error) => {})
|
||||
fetchedPkg.fetchingFiles.catch((err: Error) => {})
|
||||
pkgResponse.generatingIntegrity.catch((err: Error) => {})
|
||||
pkgResponse.fetchingFiles.catch((err: Error) => {})
|
||||
throw err
|
||||
}
|
||||
}
|
||||
if (options.currentDepth === 0 && fetchedPkg.latest && fetchedPkg.latest !== pkg.version) {
|
||||
ctx.outdatedPkgs[fetchedPkg.id] = fetchedPkg.latest
|
||||
if (options.currentDepth === 0 && pkgResponse.latest && pkgResponse.latest !== pkg.version) {
|
||||
ctx.outdatedPkgs[pkgResponse.id] = pkgResponse.latest
|
||||
}
|
||||
if (pkg.deprecated) {
|
||||
deprecationLogger.warn({
|
||||
pkgName: pkg.name,
|
||||
pkgVersion: pkg.version,
|
||||
pkgId: fetchedPkg.id,
|
||||
pkgId: pkgResponse.id,
|
||||
deprecated: pkg.deprecated,
|
||||
depth: options.currentDepth,
|
||||
})
|
||||
}
|
||||
|
||||
logStatus({status: 'downloaded_manifest', pkgId: fetchedPkg.id, pkgVersion: pkg.version})
|
||||
logStatus({status: 'downloaded_manifest', pkgId: pkgResponse.id, pkgVersion: pkg.version})
|
||||
|
||||
// using colon as it will never be used inside a package ID
|
||||
const nodeId = `${options.parentNodeId}${fetchedPkg.id}:`
|
||||
const nodeId = `${options.parentNodeId}${pkgResponse.id}:`
|
||||
|
||||
const currentIsInstallable = (
|
||||
ctx.force ||
|
||||
await getIsInstallable(fetchedPkg.id, pkg, fetchedPkg, {
|
||||
await getIsInstallable(pkgResponse.id, pkg, {
|
||||
nodeId,
|
||||
installs: ctx.installs,
|
||||
optional: wantedDependency.optional,
|
||||
@@ -368,28 +361,28 @@ async function install (
|
||||
const installable = parentIsInstallable && currentIsInstallable
|
||||
|
||||
if (installable) {
|
||||
ctx.skipped.delete(fetchedPkg.id)
|
||||
ctx.skipped.delete(pkgResponse.id)
|
||||
}
|
||||
if (!ctx.installs[fetchedPkg.id]) {
|
||||
if (!ctx.installs[pkgResponse.id]) {
|
||||
if (!installable) {
|
||||
// optional dependencies are resolved for consistent shrinkwrap.yaml files
|
||||
// but installed only on machines that are supported by the package
|
||||
ctx.skipped.add(fetchedPkg.id)
|
||||
ctx.skipped.add(pkgResponse.id)
|
||||
}
|
||||
|
||||
const peerDependencies = peerDependenciesWithoutOwn(pkg)
|
||||
|
||||
ctx.installs[fetchedPkg.id] = {
|
||||
id: fetchedPkg.id,
|
||||
resolution: fetchedPkg.resolution,
|
||||
ctx.installs[pkgResponse.id] = {
|
||||
id: pkgResponse.id,
|
||||
resolution: pkgResponse.resolution,
|
||||
optional: wantedDependency.optional,
|
||||
name: pkg.name,
|
||||
version: pkg.version,
|
||||
prod: !wantedDependency.dev && !wantedDependency.optional,
|
||||
dev: wantedDependency.dev,
|
||||
fetchingFiles: fetchedPkg.fetchingFiles,
|
||||
calculatingIntegrity: fetchedPkg.calculatingIntegrity,
|
||||
path: fetchedPkg.path,
|
||||
fetchingFiles: pkgResponse.fetchingFiles,
|
||||
generatingIntegrity: pkgResponse.generatingIntegrity,
|
||||
path: pkgResponse.inStoreLocation,
|
||||
specRaw: wantedDependency.raw,
|
||||
peerDependencies: peerDependencies || {},
|
||||
optionalDependencies: new Set(R.keys(pkg.optionalDependencies)),
|
||||
@@ -411,11 +404,11 @@ async function install (
|
||||
parentIsInstallable: installable,
|
||||
currentDepth: options.currentDepth + 1,
|
||||
parentNodeId: nodeId,
|
||||
keypath: options.keypath.concat([ fetchedPkg.id ]),
|
||||
resolvedDependencies: fetchedPkg.id !== options.pkgId
|
||||
keypath: options.keypath.concat([ pkgResponse.id ]),
|
||||
resolvedDependencies: pkgResponse.id !== options.pkgId
|
||||
? undefined
|
||||
: options.resolvedDependencies,
|
||||
preferedDependencies: fetchedPkg.id !== options.pkgId
|
||||
preferedDependencies: pkgResponse.id !== options.pkgId
|
||||
? options.resolvedDependencies
|
||||
: undefined,
|
||||
optionalDependencyNames: options.optionalDependencyNames,
|
||||
@@ -423,15 +416,14 @@ async function install (
|
||||
readPackageHook: options.readPackageHook,
|
||||
hasManifestInShrinkwrap: options.hasManifestInShrinkwrap,
|
||||
useManifestInfoFromShrinkwrap,
|
||||
ignoreFile: options.ignoreFile,
|
||||
}
|
||||
)
|
||||
ctx.childrenByParentId[fetchedPkg.id] = children.map(child => ({
|
||||
ctx.childrenByParentId[pkgResponse.id] = children.map(child => ({
|
||||
alias: child.alias,
|
||||
pkgId: child.pkgId,
|
||||
}))
|
||||
ctx.tree[nodeId] = {
|
||||
pkg: ctx.installs[fetchedPkg.id],
|
||||
pkg: ctx.installs[pkgResponse.id],
|
||||
children: children.reduce((children, child) => {
|
||||
children[child.alias] = child.nodeId
|
||||
return children
|
||||
@@ -440,30 +432,30 @@ async function install (
|
||||
installable,
|
||||
}
|
||||
} else {
|
||||
ctx.installs[fetchedPkg.id].prod = ctx.installs[fetchedPkg.id].prod || !wantedDependency.dev && !wantedDependency.optional
|
||||
ctx.installs[fetchedPkg.id].dev = ctx.installs[fetchedPkg.id].dev || wantedDependency.dev
|
||||
ctx.installs[fetchedPkg.id].optional = ctx.installs[fetchedPkg.id].optional && wantedDependency.optional
|
||||
ctx.installs[pkgResponse.id].prod = ctx.installs[pkgResponse.id].prod || !wantedDependency.dev && !wantedDependency.optional
|
||||
ctx.installs[pkgResponse.id].dev = ctx.installs[pkgResponse.id].dev || wantedDependency.dev
|
||||
ctx.installs[pkgResponse.id].optional = ctx.installs[pkgResponse.id].optional && wantedDependency.optional
|
||||
|
||||
ctx.nodesToBuild.push({
|
||||
alias: wantedDependency.alias || pkg.name,
|
||||
nodeId,
|
||||
pkg: ctx.installs[fetchedPkg.id],
|
||||
pkg: ctx.installs[pkgResponse.id],
|
||||
depth: options.currentDepth,
|
||||
installable,
|
||||
})
|
||||
}
|
||||
// we need this for saving to package.json
|
||||
if (options.currentDepth === 0) {
|
||||
ctx.installs[fetchedPkg.id].specRaw = wantedDependency.raw
|
||||
ctx.installs[pkgResponse.id].specRaw = wantedDependency.raw
|
||||
}
|
||||
|
||||
logStatus({status: 'dependencies_installed', pkgId: fetchedPkg.id})
|
||||
logStatus({status: 'dependencies_installed', pkgId: pkgResponse.id})
|
||||
|
||||
return {
|
||||
alias: wantedDependency.alias || pkg.name,
|
||||
nodeId,
|
||||
pkgId: fetchedPkg.id,
|
||||
normalizedPref: options.currentDepth === 0 ? fetchedPkg.normalizedPref : undefined,
|
||||
pkgId: pkgResponse.id,
|
||||
normalizedPref: options.currentDepth === 0 ? pkgResponse.normalizedPref : undefined,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -10,7 +10,7 @@ import {InstalledPackages, TreeNode} from '../api/install'
|
||||
import linkBins, {linkPkgBins} from './linkBins'
|
||||
import {PackageJson, Dependencies} from '@pnpm/types'
|
||||
import {Store} from 'package-store'
|
||||
import {Resolution, PackageContentInfo} from '@pnpm/package-requester'
|
||||
import {Resolution, PackageFilesResponse} from '@pnpm/package-requester'
|
||||
import resolvePeers, {DependencyTreeNode, DependencyTreeNodeMap} from './resolvePeers'
|
||||
import logStatus from '../logging/logInstallStatus'
|
||||
import updateShrinkwrap from './updateShrinkwrap'
|
||||
@@ -263,7 +263,7 @@ async function linkNewPackages (
|
||||
const limitLinking = pLimit(16)
|
||||
|
||||
async function linkAllPkgs (
|
||||
linkPkg: (fetchResult: PackageContentInfo, dependency: DependencyTreeNode, opts: {
|
||||
linkPkg: (fetchResult: PackageFilesResponse, dependency: DependencyTreeNode, opts: {
|
||||
force: boolean,
|
||||
baseNodeModules: string,
|
||||
}) => Promise<void>,
|
||||
@@ -359,7 +359,7 @@ async function linkAllModules (
|
||||
}
|
||||
|
||||
async function linkPkg (
|
||||
fetchResult: PackageContentInfo,
|
||||
filesResponse: PackageFilesResponse,
|
||||
dependency: DependencyTreeNode,
|
||||
opts: {
|
||||
force: boolean,
|
||||
@@ -368,13 +368,13 @@ async function linkPkg (
|
||||
) {
|
||||
const pkgJsonPath = path.join(dependency.hardlinkedLocation, 'package.json')
|
||||
|
||||
if (fetchResult.isNew || opts.force || !await exists(pkgJsonPath) || !await pkgLinkedToStore(pkgJsonPath, dependency)) {
|
||||
await linkIndexedDir(dependency.path, dependency.hardlinkedLocation, fetchResult.index)
|
||||
if (!filesResponse.fromStore || opts.force || !await exists(pkgJsonPath) || !await pkgLinkedToStore(pkgJsonPath, dependency)) {
|
||||
await linkIndexedDir(dependency.path, dependency.hardlinkedLocation, filesResponse.index)
|
||||
}
|
||||
}
|
||||
|
||||
async function copyPkg (
|
||||
fetchResult: PackageContentInfo,
|
||||
filesResponse: PackageFilesResponse,
|
||||
dependency: DependencyTreeNode,
|
||||
opts: {
|
||||
force: boolean,
|
||||
|
||||
@@ -3,7 +3,7 @@ import {
|
||||
} from 'package-store'
|
||||
import {
|
||||
Resolution,
|
||||
PackageContentInfo,
|
||||
PackageFilesResponse,
|
||||
} from '@pnpm/package-requester'
|
||||
import {Dependencies} from '@pnpm/types'
|
||||
import R = require('ramda')
|
||||
@@ -22,7 +22,7 @@ export type DependencyTreeNode = {
|
||||
hasBundledDependencies: boolean,
|
||||
path: string,
|
||||
modules: string,
|
||||
fetchingFiles: Promise<PackageContentInfo>,
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
resolution: Resolution,
|
||||
hardlinkedLocation: string,
|
||||
children: {[alias: string]: string},
|
||||
|
||||
Reference in New Issue
Block a user