From d699aa553c0572d1c5b6b70d76d8fdbbbce6986b Mon Sep 17 00:00:00 2001 From: Zoltan Kochan Date: Sat, 3 Sep 2022 16:22:04 +0300 Subject: [PATCH] test: npm-resolver --- packages/npm-resolver/src/pickPackage.ts | 22 ++++++++---- .../npm-resolver/test/fixtures/bad-dates.json | 23 ++++++++++++ .../npm-resolver/test/publishedBy.test.ts | 35 +++++++++++++++++++ 3 files changed, 74 insertions(+), 6 deletions(-) create mode 100644 packages/npm-resolver/test/fixtures/bad-dates.json create mode 100644 packages/npm-resolver/test/publishedBy.test.ts diff --git a/packages/npm-resolver/src/pickPackage.ts b/packages/npm-resolver/src/pickPackage.ts index 1f19ae61c4b..bdca41bdcc8 100644 --- a/packages/npm-resolver/src/pickPackage.ts +++ b/packages/npm-resolver/src/pickPackage.ts @@ -55,6 +55,17 @@ export interface PickPackageOptions { dryRun: boolean } +function pickPackageFromMetaUsingTime ( + spec: RegistryPackageSpec, + preferredVersionSelectors: VersionSelectors | undefined, + meta: PackageMeta, + publishedBy?: Date +) { + const pickedPackage = pickPackageFromMeta(pickVersionByVersionRange, spec, preferredVersionSelectors, meta, publishedBy) + if (pickedPackage) return pickedPackage + return pickPackageFromMeta(pickLowestVersionByVersionRange, spec, preferredVersionSelectors, meta, publishedBy) +} + export default async ( ctx: { fetch: (pkgName: string, registry: string, authHeaderValue?: string) => Promise @@ -69,7 +80,10 @@ export default async ( opts: PickPackageOptions ): Promise<{meta: PackageMeta, pickedPackage: PackageInRegistry | null}> => { opts = opts || {} - const _pickPackageFromMeta = pickPackageFromMeta.bind(null, opts.pickLowestVersion ? pickLowestVersionByVersionRange : pickVersionByVersionRange) + const _pickPackageFromMeta = + opts.publishedBy + ? pickPackageFromMetaUsingTime + : (pickPackageFromMeta.bind(null, opts.pickLowestVersion ? pickLowestVersionByVersionRange : pickVersionByVersionRange)) validatePackageName(spec.name) @@ -123,13 +137,9 @@ export default async ( if (opts.publishedBy) { metaCachedInStore = metaCachedInStore ?? await limit(async () => loadMeta(pkgMirror)) if (metaCachedInStore?.cachedAt && new Date(metaCachedInStore.cachedAt) >= opts.publishedBy) { - let pickedPackage = _pickPackageFromMeta(spec, opts.preferredVersionSelectors, metaCachedInStore, opts.publishedBy) - if (!pickedPackage) { - pickedPackage = pickPackageFromMeta(pickLowestVersionByVersionRange, spec, opts.preferredVersionSelectors, metaCachedInStore) - } return { meta: metaCachedInStore, - pickedPackage, + pickedPackage: _pickPackageFromMeta(spec, opts.preferredVersionSelectors, metaCachedInStore, opts.publishedBy), } } } diff --git a/packages/npm-resolver/test/fixtures/bad-dates.json b/packages/npm-resolver/test/fixtures/bad-dates.json new file mode 100644 index 00000000000..996ae30a43b --- /dev/null +++ b/packages/npm-resolver/test/fixtures/bad-dates.json @@ -0,0 +1,23 @@ +{ + "versions": { + "1.0.0": { + "name": "bad-dates", + "version": "1.0.0", + "_hasShrinkwrap": false, + "directories": {}, + "dist": { + "integrity": "sha512-9cI+DmhNhA8ioT/3EJFnt0s1yehnAECyIOXdT+2uQGzcEEBaj8oNmVWj33+ZjPndMIFRQh8JeJlEu1uv5/J7pQ==", + "shasum": "88009856b64a2f1eb7d8bb0179418424ae0452cb", + "tarball": "https://registry.npmjs.org/bad-dates/-/bad-dates-1.0.0.tgz" + } + } + }, + "time": { + "1.0.0": "2017-08-17T19:26:00.508Z" + }, + "name": "bad-dates", + "dist-tags": { + "latest": "1.0.0" + }, + "modified": "2017-08-17T19:26:00.508Z" +} diff --git a/packages/npm-resolver/test/publishedBy.test.ts b/packages/npm-resolver/test/publishedBy.test.ts new file mode 100644 index 00000000000..726b27b7423 --- /dev/null +++ b/packages/npm-resolver/test/publishedBy.test.ts @@ -0,0 +1,35 @@ +import { createFetchFromRegistry } from '@pnpm/fetch' +import _createResolveFromNpm from '@pnpm/npm-resolver' +import fixtures from '@pnpm/test-fixtures' +import loadJsonFile from 'load-json-file' +import nock from 'nock' +import tempy from 'tempy' + +const f = fixtures(__dirname) +const registry = 'https://registry.npmjs.org/' + +/* eslint-disable @typescript-eslint/no-explicit-any */ +const badDatesMeta = loadJsonFile.sync(f.find('bad-dates.json')) +/* eslint-enable @typescript-eslint/no-explicit-any */ + +const fetch = createFetchFromRegistry({}) +const getCredentials = () => ({ authHeaderValue: undefined, alwaysAuth: undefined }) +const createResolveFromNpm = _createResolveFromNpm.bind(null, fetch, getCredentials) + +test('fall back to a newer version if there is no version published by the given date', async () => { + nock(registry) + .get('/bad-dates') + .reply(200, badDatesMeta) + + const cacheDir = tempy.directory() + const resolve = createResolveFromNpm({ + cacheDir, + }) + const resolveResult = await resolve({ alias: 'bad-dates', pref: '^1.0.0' }, { + registry, + publishedBy: new Date('2015-08-17T19:26:00.508Z'), + }) + + expect(resolveResult!.resolvedVia).toBe('npm-registry') + expect(resolveResult!.id).toBe('registry.npmjs.org/bad-dates/1.0.0') +})