1 parent
afc18dc299
commit
d36103b5ee
18 files changed
+156
-132
No files matched your search
@@ -152,7 +152,7 @@ function getSubgraphToBuild (
|
||||
}
|
||||
|
||||
export interface DependenciesGraphNode {
|
||||
fetchingRawManifest?: Promise<PackageManifest>,
|
||||
fetchingRawManifest?: () => Promise<PackageManifest>,
|
||||
hasBundledDependencies: boolean,
|
||||
peripheralLocation: string,
|
||||
children: {[alias: string]: string},
|
||||
@@ -205,7 +205,7 @@ export async function linkBinsOfDependencies (
|
||||
const dep = depGraph[childrenToLink[alias]]
|
||||
return {
|
||||
location: dep.peripheralLocation,
|
||||
manifest: dep.fetchingRawManifest && (await dep.fetchingRawManifest) || (await readPackageFromDir(dep.peripheralLocation) as DependencyManifest),
|
||||
manifest: dep.fetchingRawManifest && (await dep.fetchingRawManifest()) || (await readPackageFromDir(dep.peripheralLocation) as DependencyManifest),
|
||||
}
|
||||
}),
|
||||
)
|
||||
|
||||
@@ -523,7 +523,7 @@ async function lockfileToDepGraph (
|
||||
resolution,
|
||||
})
|
||||
if (fetchResponse instanceof Promise) fetchResponse = await fetchResponse
|
||||
fetchResponse.fetchingFiles // tslint:disable-line
|
||||
fetchResponse.fetchingFiles() // tslint:disable-line
|
||||
.then((fetchResult) => {
|
||||
progressLogger.debug({
|
||||
packageId,
|
||||
@@ -532,6 +532,9 @@ async function lockfileToDepGraph (
|
||||
? 'found_in_store' : 'fetched',
|
||||
})
|
||||
})
|
||||
.catch(() => {
|
||||
// ignore
|
||||
})
|
||||
graph[peripheralLocation] = {
|
||||
centralLocation: pkgLocation.directory,
|
||||
children: {},
|
||||
@@ -645,8 +648,8 @@ export interface DependenciesGraphNode {
|
||||
centralLocation: string,
|
||||
modules: string,
|
||||
name: string,
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
finishing: () => Promise<void>,
|
||||
peripheralLocation: string,
|
||||
children: {[alias: string]: string},
|
||||
// an independent package is a package that
|
||||
@@ -677,7 +680,7 @@ async function linkAllPkgs (
|
||||
) {
|
||||
return Promise.all(
|
||||
depNodes.map(async (depNode) => {
|
||||
const filesResponse = await depNode.fetchingFiles
|
||||
const filesResponse = await depNode.fetchingFiles()
|
||||
|
||||
if (depNode.independent) return
|
||||
return storeController.importPackage(depNode.centralLocation, depNode.peripheralLocation, {
|
||||
|
||||
@@ -48,6 +48,7 @@
|
||||
"p-limit": "2.2.1",
|
||||
"p-queue": "6.1.1",
|
||||
"path-exists": "4.0.0",
|
||||
"promise-share": "1.0.0",
|
||||
"rename-overwrite": "2.0.2",
|
||||
"ssri": "6.0.1",
|
||||
"symlink-dir": "3.1.1",
|
||||
|
||||
@@ -10,7 +10,6 @@ import pkgIdToFilename from '@pnpm/pkgid-to-filename'
|
||||
import { fromDir as readPkgFromDir } from '@pnpm/read-package-json'
|
||||
import {
|
||||
DirectoryResolution,
|
||||
LocalPackages,
|
||||
Resolution,
|
||||
ResolveFunction,
|
||||
ResolveResult,
|
||||
@@ -35,6 +34,7 @@ import * as fs from 'mz/fs'
|
||||
import PQueue from 'p-queue'
|
||||
import path = require('path')
|
||||
import exists = require('path-exists')
|
||||
import pShare = require('promise-share')
|
||||
import renameOverwrite = require('rename-overwrite')
|
||||
import ssri = require('ssri')
|
||||
import symlinkDir = require('symlink-dir')
|
||||
@@ -242,9 +242,9 @@ function fetchToStore (
|
||||
resolution: Resolution,
|
||||
},
|
||||
): {
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: Promise<PackageJson>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: () => Promise<PackageJson>,
|
||||
finishing: () => Promise<void>,
|
||||
inStoreLocation: string,
|
||||
} {
|
||||
const targetRelative = pkgIdToFilename(opts.pkgId, opts.prefix)
|
||||
@@ -323,7 +323,12 @@ function fetchToStore (
|
||||
)
|
||||
}
|
||||
|
||||
return result
|
||||
return {
|
||||
fetchingFiles: pShare(result.fetchingFiles),
|
||||
fetchingRawManifest: result.fetchingRawManifest ? pShare(result.fetchingRawManifest) : undefined,
|
||||
finishing: pShare(result.finishing),
|
||||
inStoreLocation: result.inStoreLocation,
|
||||
}
|
||||
|
||||
function removeKeyOnFail<T> (p: Promise<T>): Promise<T> {
|
||||
return p.catch((err) => {
|
||||
|
||||
@@ -56,8 +56,8 @@ test('request package', async t => {
|
||||
registry,
|
||||
}) as PackageResponse & {
|
||||
body: {inStoreLocation: string, latest: string, manifest: {name: string}},
|
||||
fetchingFiles: Promise<{filenames: string[], fromStore: boolean}>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<{filenames: string[], fromStore: boolean}>,
|
||||
finishing: () => Promise<void>,
|
||||
}
|
||||
|
||||
t.ok(pkgResponse, 'response received')
|
||||
@@ -76,13 +76,13 @@ test('request package', async t => {
|
||||
tarball: 'https://registry.npmjs.org/is-positive/-/is-positive-1.0.0.tgz',
|
||||
}, 'resolution returned')
|
||||
|
||||
const files = await pkgResponse.fetchingFiles
|
||||
const files = await pkgResponse.fetchingFiles()
|
||||
t.deepEqual(files, {
|
||||
filenames: [ 'package.json', 'index.js', 'license', 'readme.md' ],
|
||||
fromStore: false,
|
||||
}, 'returned info about files after fetch completed')
|
||||
|
||||
t.ok(pkgResponse.finishing)
|
||||
t.ok(pkgResponse.finishing())
|
||||
|
||||
t.deepEqual(storeIndex, { 'registry.npmjs.org/is-positive/1.0.0': [] })
|
||||
|
||||
@@ -108,8 +108,8 @@ test('request package but skip fetching', async t => {
|
||||
skipFetch: true,
|
||||
}) as PackageResponse & {
|
||||
body: {inStoreLocation: string, latest: string, manifest: {name: string}},
|
||||
fetchingFiles: Promise<object>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<object>,
|
||||
finishing: () => Promise<void>,
|
||||
}
|
||||
|
||||
t.ok(pkgResponse, 'response received')
|
||||
@@ -163,8 +163,8 @@ test('request package but skip fetching, when resolution is already available',
|
||||
latest: string,
|
||||
manifest: {name: string},
|
||||
},
|
||||
fetchingFiles: Promise<object>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<object>,
|
||||
finishing: () => Promise<void>,
|
||||
}
|
||||
|
||||
t.ok(pkgResponse, 'response received')
|
||||
@@ -223,15 +223,15 @@ test('refetch local tarball if its integrity has changed', async t => {
|
||||
tarball,
|
||||
},
|
||||
}) as PackageResponse & {
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
finishing: () => Promise<void>,
|
||||
}
|
||||
await response.fetchingFiles
|
||||
await response.finishing
|
||||
await response.fetchingFiles()
|
||||
await response.finishing()
|
||||
|
||||
t.ok(response.body.updated === false, 'resolution not updated')
|
||||
t.notOk((await response.fetchingFiles).fromStore, 'unpack tarball if it is not in store yet')
|
||||
t.equal((await response['fetchingRawManifest']).version, '0.8.1')
|
||||
t.notOk((await response.fetchingFiles()).fromStore, 'unpack tarball if it is not in store yet')
|
||||
t.equal((await response['fetchingRawManifest']()).version, '0.8.1')
|
||||
}
|
||||
|
||||
await ncp(path.join(__dirname, 'pnpm-package-requester-4.1.2.tgz'), tarballPath)
|
||||
@@ -251,15 +251,15 @@ test('refetch local tarball if its integrity has changed', async t => {
|
||||
tarball,
|
||||
},
|
||||
}) as PackageResponse & {
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
finishing: () => Promise<void>,
|
||||
}
|
||||
await response.fetchingFiles
|
||||
await response.finishing
|
||||
await response.fetchingFiles()
|
||||
await response.finishing()
|
||||
|
||||
t.ok(response.body.updated === true, 'resolution updated')
|
||||
t.notOk((await response.fetchingFiles).fromStore, 'reunpack tarball if its integrity is not up-to-date')
|
||||
t.equal((await response['fetchingRawManifest']).version, '4.1.2')
|
||||
t.notOk((await response.fetchingFiles()).fromStore, 'reunpack tarball if its integrity is not up-to-date')
|
||||
t.equal((await response['fetchingRawManifest']()).version, '4.1.2')
|
||||
}
|
||||
|
||||
{
|
||||
@@ -276,15 +276,15 @@ test('refetch local tarball if its integrity has changed', async t => {
|
||||
tarball,
|
||||
},
|
||||
}) as PackageResponse & {
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
finishing: () => Promise<void>,
|
||||
}
|
||||
await response.fetchingFiles
|
||||
await response.finishing
|
||||
await response.fetchingFiles()
|
||||
await response.finishing()
|
||||
|
||||
t.ok(response.body.updated === false, 'resolution not updated')
|
||||
t.ok((await response.fetchingFiles).fromStore, 'do not reunpack tarball if its integrity is up-to-date')
|
||||
t.equal((await response['fetchingRawManifest']).version, '4.1.2')
|
||||
t.ok((await response.fetchingFiles()).fromStore, 'do not reunpack tarball if its integrity is up-to-date')
|
||||
t.equal((await response['fetchingRawManifest']()).version, '4.1.2')
|
||||
}
|
||||
|
||||
t.end()
|
||||
@@ -315,15 +315,15 @@ test('refetch local tarball if its integrity has changed. The requester does not
|
||||
})
|
||||
|
||||
const response = await requestPackage(wantedPackage, requestPackageOpts) as PackageResponse & {
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
finishing: () => Promise<void>,
|
||||
}
|
||||
await response.fetchingFiles
|
||||
await response.finishing
|
||||
await response.fetchingFiles()
|
||||
await response.finishing()
|
||||
|
||||
t.ok(response.body.updated === true, 'resolution updated')
|
||||
t.notOk((await response.fetchingFiles).fromStore, 'unpack tarball if it is not in store yet')
|
||||
t.equal((await response['fetchingRawManifest']).version, '0.8.1')
|
||||
t.notOk((await response.fetchingFiles()).fromStore, 'unpack tarball if it is not in store yet')
|
||||
t.equal((await response['fetchingRawManifest']()).version, '0.8.1')
|
||||
}
|
||||
|
||||
await ncp(path.join(__dirname, 'pnpm-package-requester-4.1.2.tgz'), tarballPath)
|
||||
@@ -337,15 +337,15 @@ test('refetch local tarball if its integrity has changed. The requester does not
|
||||
})
|
||||
|
||||
const response = await requestPackage(wantedPackage, requestPackageOpts) as PackageResponse & {
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
finishing: () => Promise<void>,
|
||||
}
|
||||
await response.fetchingFiles
|
||||
await response.finishing
|
||||
await response.fetchingFiles()
|
||||
await response.finishing()
|
||||
|
||||
t.ok(response.body.updated === true, 'resolution updated')
|
||||
t.notOk((await response.fetchingFiles).fromStore, 'reunpack tarball if its integrity is not up-to-date')
|
||||
t.equal((await response['fetchingRawManifest']).version, '4.1.2')
|
||||
t.notOk((await response.fetchingFiles()).fromStore, 'reunpack tarball if its integrity is not up-to-date')
|
||||
t.equal((await response['fetchingRawManifest']()).version, '4.1.2')
|
||||
}
|
||||
|
||||
{
|
||||
@@ -356,14 +356,14 @@ test('refetch local tarball if its integrity has changed. The requester does not
|
||||
})
|
||||
|
||||
const response = await requestPackage(wantedPackage, requestPackageOpts) as PackageResponse & {
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
finishing: () => Promise<void>,
|
||||
}
|
||||
await response.fetchingFiles
|
||||
await response.finishing
|
||||
|
||||
t.ok((await response.fetchingFiles).fromStore, 'do not reunpack tarball if its integrity is up-to-date')
|
||||
t.equal((await response['fetchingRawManifest']).version, '4.1.2')
|
||||
t.ok((await response.fetchingFiles()).fromStore, 'do not reunpack tarball if its integrity is up-to-date')
|
||||
t.equal((await response['fetchingRawManifest']()).version, '4.1.2')
|
||||
}
|
||||
|
||||
t.end()
|
||||
@@ -391,13 +391,13 @@ test('fetchPackageToStore()', async (t) => {
|
||||
|
||||
t.notOk(fetchResult.fetchingRawManifest, 'full manifest not returned')
|
||||
|
||||
const files = await fetchResult.fetchingFiles
|
||||
const files = await fetchResult.fetchingFiles()
|
||||
t.deepEqual(files, {
|
||||
filenames: [ 'package.json', 'index.js', 'license', 'readme.md' ],
|
||||
fromStore: false,
|
||||
}, 'returned info about files after fetch completed')
|
||||
|
||||
t.ok(fetchResult.finishing)
|
||||
t.ok(fetchResult.finishing())
|
||||
|
||||
const fetchResult2 = await packageRequester.fetchPackageToStore({
|
||||
fetchRawManifest: true,
|
||||
@@ -413,7 +413,7 @@ test('fetchPackageToStore()', async (t) => {
|
||||
|
||||
// This verifies that when a package has been cached with no full manifest
|
||||
// the full manifest is requested and added to the cache
|
||||
t.ok((await fetchResult2.fetchingRawManifest)!.name, 'full manifest returned')
|
||||
t.ok((await fetchResult2.fetchingRawManifest!()).name, 'full manifest returned')
|
||||
|
||||
t.end()
|
||||
})
|
||||
@@ -457,7 +457,7 @@ test('fetchPackageToStore() concurrency check', async (t) => {
|
||||
|
||||
{
|
||||
const fetchResult = await fetchResults[0]
|
||||
const files = await fetchResult.fetchingFiles
|
||||
const files = await fetchResult.fetchingFiles()
|
||||
|
||||
ino1 = fs.statSync(path.join(fetchResult.inStoreLocation, 'package', 'package.json')).ino
|
||||
|
||||
@@ -471,7 +471,7 @@ test('fetchPackageToStore() concurrency check', async (t) => {
|
||||
|
||||
{
|
||||
const fetchResult = await fetchResults[1]
|
||||
const files = await fetchResult.fetchingFiles
|
||||
const files = await fetchResult.fetchingFiles()
|
||||
|
||||
ino2 = fs.statSync(path.join(fetchResult.inStoreLocation, 'package', 'package.json')).ino
|
||||
|
||||
@@ -480,7 +480,7 @@ test('fetchPackageToStore() concurrency check', async (t) => {
|
||||
fromStore: false,
|
||||
}, 'returned info about files after fetch completed')
|
||||
|
||||
t.ok(fetchResult.finishing)
|
||||
t.ok(fetchResult.finishing())
|
||||
}
|
||||
|
||||
t.equal(ino1, ino2, 'package fetched only once to the store')
|
||||
@@ -525,7 +525,7 @@ test('fetchPackageToStore() does not cache errors', async (t) => {
|
||||
tarball: 'https://registry.npmjs.org/is-positive/-/is-positive-1.0.0.tgz',
|
||||
},
|
||||
})
|
||||
await badRequest.fetchingFiles
|
||||
await badRequest.fetchingFiles()
|
||||
t.fail('first fetch should have failed')
|
||||
} catch (err) {
|
||||
t.pass('first fetch failed')
|
||||
@@ -541,13 +541,13 @@ test('fetchPackageToStore() does not cache errors', async (t) => {
|
||||
tarball: 'https://registry.npmjs.org/is-positive/-/is-positive-1.0.0.tgz',
|
||||
},
|
||||
})
|
||||
const files = await fetchResult.fetchingFiles
|
||||
const files = await fetchResult.fetchingFiles()
|
||||
t.deepEqual(files, {
|
||||
filenames: [ 'package.json', 'index.js', 'license', 'readme.md' ],
|
||||
fromStore: false,
|
||||
}, 'returned info about files after fetch completed')
|
||||
|
||||
t.ok(fetchResult.finishing)
|
||||
t.ok(fetchResult.finishing())
|
||||
t.ok(nock.isDone())
|
||||
|
||||
t.end()
|
||||
@@ -590,10 +590,10 @@ test('always return a package manifest in the response', async t => {
|
||||
preferredVersions: {},
|
||||
prefix,
|
||||
registry,
|
||||
}) as PackageResponse & {fetchingRawManifest: Promise<PackageJson>}
|
||||
}) as PackageResponse & {fetchingRawManifest: () => Promise<PackageJson>}
|
||||
|
||||
t.ok(pkgResponse.body, 'response has body')
|
||||
t.ok((await pkgResponse.fetchingRawManifest).name, 'response has manifest')
|
||||
t.ok((await pkgResponse.fetchingRawManifest()).name, 'response has manifest')
|
||||
}
|
||||
|
||||
t.end()
|
||||
@@ -634,7 +634,7 @@ test('fetchPackageToStore() fetch raw manifest of cached package', async (t) =>
|
||||
})
|
||||
])
|
||||
|
||||
t.ok(await fetchResults[1].fetchingRawManifest)
|
||||
t.ok(await fetchResults[1].fetchingRawManifest!())
|
||||
t.end()
|
||||
})
|
||||
|
||||
@@ -666,7 +666,7 @@ test('refetch package to store if it has been modified', async (t) => {
|
||||
resolution,
|
||||
})
|
||||
|
||||
await fetchResult.fetchingFiles
|
||||
await fetchResult.fetchingFiles()
|
||||
}
|
||||
|
||||
const distPathInStore = await path.join(storePath, pkgId, 'node_modules', 'magic-hook', 'dist')
|
||||
@@ -696,7 +696,7 @@ test('refetch package to store if it has been modified', async (t) => {
|
||||
resolution,
|
||||
})
|
||||
|
||||
await fetchResult.fetchingFiles
|
||||
await fetchResult.fetchingFiles()
|
||||
}
|
||||
|
||||
streamParser.removeListener('data', reporter)
|
||||
@@ -740,7 +740,7 @@ test('refetch package to store if it has no integrity checksums and verification
|
||||
resolution,
|
||||
})
|
||||
|
||||
await fetchResult.fetchingFiles
|
||||
await fetchResult.fetchingFiles()
|
||||
|
||||
const integrityJson = await loadJsonFile<object>(path.join(storePath, pkgId, 'integrity.json'))
|
||||
t.notOk(integrityJson['package.json'].integrity, 'no integrity hash generated')
|
||||
@@ -765,7 +765,7 @@ test('refetch package to store if it has no integrity checksums and verification
|
||||
resolution,
|
||||
})
|
||||
|
||||
await fetchResult.fetchingFiles
|
||||
await fetchResult.fetchingFiles()
|
||||
|
||||
const integrityJson = await loadJsonFile<object>(path.join(storePath, pkgId, 'integrity.json'))
|
||||
t.ok(integrityJson['package.json'].integrity, 'integrity hash generated')
|
||||
|
||||
@@ -43,7 +43,7 @@ test('store.importPackage()', async (t) => {
|
||||
const importTo = tempy.directory()
|
||||
const importFrom = path.join(fetchResult.inStoreLocation, 'node_modules', 'is-positive')
|
||||
await storeController.importPackage(importFrom, importTo, {
|
||||
filesResponse: await fetchResult.fetchingFiles,
|
||||
filesResponse: await fetchResult.fetchingFiles(),
|
||||
force: false,
|
||||
})
|
||||
t.equal(typeof require(importTo), 'function', `sucessfully imported to ${importTo}`)
|
||||
@@ -82,7 +82,7 @@ test('store.importPackage() by copying', async (t) => {
|
||||
const importTo = tempy.directory()
|
||||
const importFrom = path.join(fetchResult.inStoreLocation, 'node_modules', 'is-positive')
|
||||
await storeController.importPackage(importFrom, importTo, {
|
||||
filesResponse: await fetchResult.fetchingFiles,
|
||||
filesResponse: await fetchResult.fetchingFiles(),
|
||||
force: false,
|
||||
})
|
||||
t.equal(typeof require(importTo), 'function', `sucessfully imported to ${importTo}`)
|
||||
|
||||
@@ -67,6 +67,7 @@ function createEnv (opts?: {storeDir?: string}) {
|
||||
const _ = {
|
||||
...process.env,
|
||||
npm_config_fetch_retries: 4,
|
||||
npm_config_hoist: true,
|
||||
npm_config_independent_leaves: false,
|
||||
npm_config_registry: 'http://localhost:4873/',
|
||||
npm_config_silent: 'true',
|
||||
|
||||
@@ -167,9 +167,9 @@ export interface ResolvedPackage {
|
||||
prod: boolean,
|
||||
dev: boolean,
|
||||
optional: boolean,
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: Promise<PackageManifest>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: () => Promise<PackageManifest>,
|
||||
finishing: () => Promise<void>,
|
||||
path: string,
|
||||
name: string,
|
||||
version: string,
|
||||
@@ -582,7 +582,7 @@ async function resolveDependency (
|
||||
}
|
||||
|
||||
if (pkgResponse.body.isLocal) {
|
||||
const manifest = pkgResponse.body.manifest || await pkgResponse['fetchingRawManifest'] // tslint:disable-line:no-string-literal
|
||||
const manifest = pkgResponse.body.manifest || await pkgResponse['fetchingRawManifest']() // tslint:disable-line:no-string-literal
|
||||
if (options.currentDepth > 0) {
|
||||
logger.warn({
|
||||
message: `Ignoring file dependency because it is not a root dependency ${wantedDependency}`,
|
||||
@@ -631,31 +631,22 @@ async function resolveDependency (
|
||||
)
|
||||
} else {
|
||||
// tslint:disable:no-string-literal
|
||||
try {
|
||||
pkg = ctx.readPackageHook
|
||||
? ctx.readPackageHook(pkgResponse.body['manifest'] || await pkgResponse['fetchingRawManifest'])
|
||||
: pkgResponse.body['manifest'] || await pkgResponse['fetchingRawManifest']
|
||||
pkg = ctx.readPackageHook
|
||||
? ctx.readPackageHook(pkgResponse.body['manifest'] || await pkgResponse['fetchingRawManifest']())
|
||||
: pkgResponse.body['manifest'] || await pkgResponse['fetchingRawManifest']()
|
||||
|
||||
prepare = Boolean(
|
||||
pkgResponse.body['resolvedVia'] === 'git-repository' &&
|
||||
pkg['scripts'] && typeof pkg['scripts']['prepare'] === 'string',
|
||||
)
|
||||
prepare = Boolean(
|
||||
pkgResponse.body['resolvedVia'] === 'git-repository' &&
|
||||
pkg['scripts'] && typeof pkg['scripts']['prepare'] === 'string',
|
||||
)
|
||||
|
||||
if (
|
||||
options.dependencyLockfile && options.dependencyLockfile.deprecated &&
|
||||
!pkgResponse.body.updated && !pkg.deprecated
|
||||
) {
|
||||
pkg.deprecated = options.dependencyLockfile.deprecated
|
||||
}
|
||||
hasBin = Boolean(pkg.bin && !R.isEmpty(pkg.bin) || pkg.directories && pkg.directories.bin)
|
||||
} catch (err) {
|
||||
// tslint:disable:no-empty
|
||||
// avoiding unhandled promise rejections
|
||||
if (pkgResponse['finishing']) pkgResponse['finishing'].catch(() => {})
|
||||
if (pkgResponse['fetchingFiles']) pkgResponse['fetchingFiles'].catch(() => {})
|
||||
// tslint:enable:no-empty
|
||||
throw err
|
||||
if (
|
||||
options.dependencyLockfile && options.dependencyLockfile.deprecated &&
|
||||
!pkgResponse.body.updated && !pkg.deprecated
|
||||
) {
|
||||
pkg.deprecated = options.dependencyLockfile.deprecated
|
||||
}
|
||||
hasBin = Boolean(pkg.bin && !R.isEmpty(pkg.bin) || pkg.directories && pkg.directories.bin)
|
||||
// tslint:enable:no-string-literal
|
||||
}
|
||||
if (!pkg.name) { // TODO: don't fail on optional dependencies
|
||||
@@ -702,7 +693,7 @@ async function resolveDependency (
|
||||
})
|
||||
// tslint:disable:no-string-literal
|
||||
if (pkgResponse['fetchingFiles']) {
|
||||
pkgResponse['fetchingFiles']
|
||||
pkgResponse['fetchingFiles']()
|
||||
.then((fetchResult: PackageFilesResponse) => {
|
||||
progressLogger.debug({
|
||||
packageId: pkgResponse.body.id,
|
||||
@@ -711,6 +702,9 @@ async function resolveDependency (
|
||||
? 'found_in_store' : 'fetched',
|
||||
})
|
||||
})
|
||||
.catch(() => {
|
||||
// Ignore
|
||||
})
|
||||
}
|
||||
// tslint:enable:no-string-literal
|
||||
|
||||
|
||||
@@ -52,6 +52,7 @@
|
||||
"@pnpm/store-controller-types": "workspace:3.0.3",
|
||||
"@pnpm/types": "workspace:3.2.0",
|
||||
"p-limit": "2.2.1",
|
||||
"promise-share": "1.0.0",
|
||||
"uuid": "3.3.3"
|
||||
}
|
||||
}
|
||||
@@ -11,6 +11,7 @@ import {
|
||||
import { PackageJson } from '@pnpm/types'
|
||||
|
||||
import pLimit from 'p-limit'
|
||||
import pShare = require('promise-share')
|
||||
import uuid = require('uuid')
|
||||
|
||||
export type StoreServerController = StoreController & {
|
||||
@@ -131,7 +132,7 @@ function requestPackage (
|
||||
if (options.skipFetch) {
|
||||
return {
|
||||
body: packageResponseBody,
|
||||
fetchingRawManifest,
|
||||
fetchingRawManifest: fetchingRawManifest && pShare(fetchingRawManifest),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -140,9 +141,9 @@ function requestPackage (
|
||||
})
|
||||
return {
|
||||
body: packageResponseBody,
|
||||
fetchingFiles,
|
||||
fetchingRawManifest,
|
||||
finishing: Promise.all([fetchingRawManifest, fetchingFiles]).then(() => undefined),
|
||||
fetchingFiles: pShare(fetchingFiles),
|
||||
fetchingRawManifest: fetchingRawManifest && pShare(fetchingRawManifest),
|
||||
finishing: pShare(Promise.all([fetchingRawManifest, fetchingFiles]).then(() => undefined)),
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -152,9 +153,9 @@ function fetchPackage (
|
||||
limitedFetch: (url: string, body: object) => any, // tslint:disable-line
|
||||
options: FetchPackageToStoreOptions,
|
||||
): {
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: Promise<PackageJson>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: () => Promise<PackageJson>,
|
||||
finishing: () => Promise<void>,
|
||||
inStoreLocation: string,
|
||||
} {
|
||||
const msgId = uuid.v4()
|
||||
@@ -172,9 +173,9 @@ function fetchPackage (
|
||||
msgId,
|
||||
})
|
||||
return {
|
||||
fetchingFiles,
|
||||
fetchingRawManifest,
|
||||
finishing: Promise.all([fetchingRawManifest, fetchingFiles]).then(() => undefined),
|
||||
fetchingFiles: pShare(fetchingFiles),
|
||||
fetchingRawManifest: fetchingRawManifest && pShare(fetchingRawManifest),
|
||||
finishing: pShare(Promise.all([fetchingRawManifest, fetchingFiles]).then(() => undefined)),
|
||||
inStoreLocation: fetchResponseBody.inStoreLocation,
|
||||
}
|
||||
})
|
||||
|
||||
@@ -116,13 +116,13 @@ export default function (
|
||||
}
|
||||
case '/packageFilesResponse':
|
||||
body = await bodyPromise
|
||||
const filesResponse = await filesPromises[body.msgId]
|
||||
const filesResponse = await filesPromises[body.msgId]()
|
||||
delete filesPromises[body.msgId]
|
||||
res.end(JSON.stringify(filesResponse))
|
||||
break
|
||||
case '/rawManifestResponse':
|
||||
body = await bodyPromise
|
||||
const manifestResponse = await rawManifestPromises[body.msgId]
|
||||
const manifestResponse = await rawManifestPromises[body.msgId]()
|
||||
delete rawManifestPromises[body.msgId]
|
||||
res.end(JSON.stringify(manifestResponse))
|
||||
break
|
||||
|
||||
@@ -60,18 +60,18 @@ test('server', async t => {
|
||||
}
|
||||
)
|
||||
|
||||
t.equal((await response['fetchingRawManifest']).name, 'is-positive', 'responded with fetchingRawManifest')
|
||||
t.equal((await response['fetchingRawManifest']()).name, 'is-positive', 'responded with fetchingRawManifest')
|
||||
t.equal(response.body.id, 'registry.npmjs.org/is-positive/1.0.0', 'responded with correct ID')
|
||||
|
||||
t.equal(response.body['manifest'].name, 'is-positive', 'responded with correct name in manifest')
|
||||
t.equal(response.body['manifest'].version, '1.0.0', 'responded with correct version in manifest')
|
||||
|
||||
const files = await response['fetchingFiles'] as PackageFilesResponse
|
||||
const files = await response['fetchingFiles']() as PackageFilesResponse
|
||||
t.notOk(files.fromStore)
|
||||
t.ok(files.filenames.includes('package.json'))
|
||||
t.ok(response['finishing'])
|
||||
|
||||
await response['finishing']
|
||||
await response['finishing']()
|
||||
|
||||
await server.close()
|
||||
await storeCtrl.close()
|
||||
@@ -103,14 +103,14 @@ test('fetchPackage', async t => {
|
||||
|
||||
t.equal(typeof response.inStoreLocation, 'string', 'location in store returned')
|
||||
|
||||
t.ok(await response.fetchingRawManifest)
|
||||
t.ok(await response.fetchingRawManifest!())
|
||||
|
||||
const files = await response['fetchingFiles'] as PackageFilesResponse
|
||||
const files = await response['fetchingFiles']() as PackageFilesResponse
|
||||
t.notOk(files.fromStore)
|
||||
t.ok(files.filenames.includes('package.json'))
|
||||
t.ok(response['finishing'])
|
||||
|
||||
await response['finishing']
|
||||
await response['finishing']()
|
||||
|
||||
t.comment('getPackageLocation()')
|
||||
|
||||
@@ -322,8 +322,8 @@ test('find package usages', async t => {
|
||||
sideEffectsCache: false,
|
||||
}
|
||||
)
|
||||
await requestResponse['fetchingRawManifest']
|
||||
await requestResponse['finishing']
|
||||
await requestResponse['fetchingRawManifest']()
|
||||
await requestResponse['finishing']()
|
||||
|
||||
// For debugging purposes
|
||||
await storeCtrl.saveState()
|
||||
|
||||
@@ -43,9 +43,9 @@ export type PackageUsages = {
|
||||
export type FetchPackageToStoreFunction = (
|
||||
opts: FetchPackageToStoreOptions,
|
||||
) => {
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: Promise<PackageJson>,
|
||||
finishing: Promise<void>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: () => Promise<PackageJson>,
|
||||
finishing: () => Promise<void>,
|
||||
inStoreLocation: string,
|
||||
}
|
||||
|
||||
@@ -109,8 +109,8 @@ export type PackageResponse = {
|
||||
},
|
||||
} | (
|
||||
{
|
||||
fetchingFiles?: Promise<PackageFilesResponse>,
|
||||
finishing?: Promise<void>, // a package request is finished once its integrity is generated and saved
|
||||
fetchingFiles?: () => Promise<PackageFilesResponse>,
|
||||
finishing?: () => Promise<void>, // a package request is finished once its integrity is generated and saved
|
||||
body: {
|
||||
isLocal: false,
|
||||
inStoreLocation: string,
|
||||
@@ -127,7 +127,7 @@ export type PackageResponse = {
|
||||
},
|
||||
} & (
|
||||
{
|
||||
fetchingRawManifest: Promise<PackageJson>,
|
||||
fetchingRawManifest: () => Promise<PackageJson>,
|
||||
} | {
|
||||
body: {
|
||||
manifest: PackageManifest,
|
||||
|
||||
@@ -854,11 +854,11 @@ async function installInContext (
|
||||
// skipped packages might have not been reanalized on a repeat install
|
||||
// so lets just ignore those by excluding nulls
|
||||
.filter(Boolean)
|
||||
.map(({ fetchingFiles }) => fetchingFiles),
|
||||
.map(({ fetchingFiles }) => fetchingFiles()),
|
||||
)
|
||||
|
||||
// waiting till package requests are finished
|
||||
await Promise.all(R.values(resolvedPackagesByPackageId).map(({ finishing }) => finishing))
|
||||
await Promise.all(R.values(resolvedPackagesByPackageId).map(({ finishing }) => finishing()))
|
||||
|
||||
const lockfileOpts = { forceSharedFormat: opts.forceSharedLockfile }
|
||||
if (opts.lockfileOnly) {
|
||||
|
||||
@@ -247,9 +247,9 @@ export default async function linkPackages (
|
||||
// This should never ever happen
|
||||
throw new Error(`Cannot create ${WANTED_LOCKFILE} because raw manifest (aka package.json) wasn't fetched for "${absoluteDepPath}"`)
|
||||
}
|
||||
const filesResponse = await depNode.fetchingFiles
|
||||
const filesResponse = await depNode.fetchingFiles()
|
||||
// The npm team suggests to always read the package.json for deciding whether the package has lifecycle scripts
|
||||
const pkgJson = await depNode.fetchingRawManifest
|
||||
const pkgJson = await depNode.fetchingRawManifest()
|
||||
depNode.requiresBuild = Boolean(
|
||||
pkgJson.scripts && (pkgJson.scripts.preinstall || pkgJson.scripts.install || pkgJson.scripts.postinstall) ||
|
||||
filesResponse.filenames.includes('binding.gyp') ||
|
||||
@@ -480,7 +480,7 @@ async function linkAllPkgs (
|
||||
) {
|
||||
return Promise.all(
|
||||
depNodes.map(async ({ centralLocation, fetchingFiles, independent, peripheralLocation }) => {
|
||||
const filesResponse = await fetchingFiles
|
||||
const filesResponse = await fetchingFiles()
|
||||
|
||||
if (independent) return
|
||||
return storeController.importPackage(centralLocation, peripheralLocation, {
|
||||
|
||||
@@ -27,8 +27,8 @@ export interface DependenciesGraphNode {
|
||||
hasBundledDependencies: boolean,
|
||||
centralLocation: string,
|
||||
modules: string,
|
||||
fetchingFiles: Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: Promise<PackageManifest>,
|
||||
fetchingFiles: () => Promise<PackageFilesResponse>,
|
||||
fetchingRawManifest?: () => Promise<PackageManifest>,
|
||||
resolution: Resolution,
|
||||
peripheralLocation: string,
|
||||
children: {[alias: string]: string},
|
||||
|
||||
@@ -48,7 +48,7 @@ export default async function (
|
||||
prefix,
|
||||
registry: dep.alias && pickRegistryForPackage(registries, dep.alias) || registries.default,
|
||||
})
|
||||
await pkgResponse['fetchingFiles'] // tslint:disable-line:no-string-literal
|
||||
await pkgResponse['fetchingFiles']() // tslint:disable-line:no-string-literal
|
||||
storeLogger.info(`+ ${pkgResponse.body.id}`)
|
||||
} catch (e) {
|
||||
hasFailures = true
|
||||
|
||||
Generated
+18
@@ -905,6 +905,7 @@ importers:
|
||||
p-limit: 2.2.1
|
||||
p-queue: 6.1.1
|
||||
path-exists: 4.0.0
|
||||
promise-share: 1.0.0
|
||||
rename-overwrite: 2.0.2
|
||||
ssri: 6.0.1
|
||||
symlink-dir: 3.1.1
|
||||
@@ -958,6 +959,7 @@ importers:
|
||||
p-limit: 2.2.1
|
||||
p-queue: 6.1.1
|
||||
path-exists: 4.0.0
|
||||
promise-share: 1.0.0
|
||||
rename-overwrite: 2.0.2
|
||||
rimraf: 3.0.0
|
||||
sinon: 7.4.2
|
||||
@@ -1428,6 +1430,7 @@ importers:
|
||||
'@pnpm/store-controller-types': 'link:../store-controller-types'
|
||||
'@pnpm/types': 'link:../types'
|
||||
p-limit: 2.2.1
|
||||
promise-share: 1.0.0
|
||||
uuid: 3.3.3
|
||||
devDependencies:
|
||||
'@pnpm/logger': 2.1.1
|
||||
@@ -1463,6 +1466,7 @@ importers:
|
||||
mz: 2.7.0
|
||||
node-fetch: 2.6.0
|
||||
p-limit: 2.2.1
|
||||
promise-share: 1.0.0
|
||||
rimraf: 3.0.0
|
||||
tape: 4.11.0
|
||||
uuid: 3.3.3
|
||||
@@ -6405,6 +6409,12 @@ packages:
|
||||
node: '>=8'
|
||||
resolution:
|
||||
integrity: sha512-R9gq36Th88xZ+rWAptN5IXLwqkwA1gagCQhT6ZXQ6RxEfmjb9ZW+UBzRVqv9sm5TQmbbI/TsKgGLbOaA61xR5w==
|
||||
/p-reflect/2.1.0:
|
||||
dev: false
|
||||
engines:
|
||||
node: '>=8'
|
||||
resolution:
|
||||
integrity: sha512-paHV8NUz8zDHu5lhr/ngGWQiW067DK/+IbJ+RfZ4k+s8y4EKyYCz8pGYWjxCg35eHztpJAt+NUgvN4L+GCbPlg==
|
||||
/p-some/4.1.0:
|
||||
dependencies:
|
||||
aggregate-error: 3.0.0
|
||||
@@ -6696,6 +6706,14 @@ packages:
|
||||
/process-nextick-args/2.0.1:
|
||||
resolution:
|
||||
integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
|
||||
/promise-share/1.0.0:
|
||||
dependencies:
|
||||
p-reflect: 2.1.0
|
||||
dev: false
|
||||
engines:
|
||||
node: '>=8'
|
||||
resolution:
|
||||
integrity: sha512-lpABypysb42MdCZjMJAdapxt+uTU9F0BZW0YeYVlPD/Gv390c43CdFwBSC9YM3siAgyAjLV94WDuDnwHIJjxiw==
|
||||
/propagate/2.0.1:
|
||||
dev: true
|
||||
engines:
|
||||
|
||||
Reference in new issue
Block a user