From b7cc7d539557fd2e61578608432f336f3c8cfc74 Mon Sep 17 00:00:00 2001 From: Simon Vocella Date: Sun, 12 Feb 2017 11:16:24 +0100 Subject: [PATCH] install package with file: protocol as default if it exists in the filesystem --- __tests__/commands/install/integration.js | 9 ++++++ .../install-file-as-default/bar/index.js | 1 + .../install-file-as-default/bar/package.json | 5 ++++ .../install-file-as-default/package.json | 5 ++++ .../install/install-file-as-default/yarn.lock | 4 +++ src/package-request.js | 30 +++++++++++++++++-- src/util/fs.js | 2 +- 7 files changed, 53 insertions(+), 3 deletions(-) create mode 100644 __tests__/fixtures/install/install-file-as-default/bar/index.js create mode 100644 __tests__/fixtures/install/install-file-as-default/bar/package.json create mode 100644 __tests__/fixtures/install/install-file-as-default/package.json create mode 100644 __tests__/fixtures/install/install-file-as-default/yarn.lock diff --git a/__tests__/commands/install/integration.js b/__tests__/commands/install/integration.js index a3731e923b..a0a1ac9bdb 100644 --- a/__tests__/commands/install/integration.js +++ b/__tests__/commands/install/integration.js @@ -272,6 +272,15 @@ test.concurrent('install file: protocol', (): Promise => { }); }); +test.concurrent('install with file: protocol as default', (): Promise => { + return runInstall({noLockfile: true}, 'install-file-as-default', async (config) => { + assert.equal( + await fs.readFile(path.join(config.cwd, 'node_modules', 'foo', 'index.js')), + 'foobar\n', + ); + }); +}); + test.concurrent('install everything when flat is enabled', (): Promise => { return runInstall({noLockfile: true, flat: true}, 'install-file', async (config) => { assert.equal( diff --git a/__tests__/fixtures/install/install-file-as-default/bar/index.js b/__tests__/fixtures/install/install-file-as-default/bar/index.js new file mode 100644 index 0000000000..323fae03f4 --- /dev/null +++ b/__tests__/fixtures/install/install-file-as-default/bar/index.js @@ -0,0 +1 @@ +foobar diff --git a/__tests__/fixtures/install/install-file-as-default/bar/package.json b/__tests__/fixtures/install/install-file-as-default/bar/package.json new file mode 100644 index 0000000000..f92edb96b8 --- /dev/null +++ b/__tests__/fixtures/install/install-file-as-default/bar/package.json @@ -0,0 +1,5 @@ +{ + "name": "bar", + "version": "0.0.0", + "main": "index.js" +} diff --git a/__tests__/fixtures/install/install-file-as-default/package.json b/__tests__/fixtures/install/install-file-as-default/package.json new file mode 100644 index 0000000000..448cf0c1b3 --- /dev/null +++ b/__tests__/fixtures/install/install-file-as-default/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "foo": "bar" + } +} diff --git a/__tests__/fixtures/install/install-file-as-default/yarn.lock b/__tests__/fixtures/install/install-file-as-default/yarn.lock new file mode 100644 index 0000000000..83dbd093dd --- /dev/null +++ b/__tests__/fixtures/install/install-file-as-default/yarn.lock @@ -0,0 +1,4 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 +"foo@file:bar": + version "0.0.0" diff --git a/src/package-request.js b/src/package-request.js index 5dc17592e2..0a39385b3e 100644 --- a/src/package-request.js +++ b/src/package-request.js @@ -14,7 +14,9 @@ import {entries} from './util/misc.js'; import * as constants from './constants.js'; import * as versionUtil from './util/version.js'; import * as resolvers from './resolvers/index.js'; +import * as fs from './util/fs.js'; +const path = require('path'); const invariant = require('invariant'); const semver = require('semver'); @@ -98,7 +100,7 @@ export default class PackageRequest { */ async findVersionOnRegistry(pattern: string): Promise { - const {range, name} = PackageRequest.normalizePattern(pattern); + const {range, name} = await this.normalize(pattern); const exoticResolver = PackageRequest.getExoticResolver(range); if (exoticResolver) { @@ -135,6 +137,30 @@ export default class PackageRequest { } } + /** + * If pattern: + * - contains : it will return because is something like ': { + if (pattern.includes(':')) { + return Promise.resolve(pattern); + } + + if (await fs.exists(path.join(this.config.cwd, pattern))) { + return Promise.resolve(`file:${pattern}`); + } + + return Promise.resolve(pattern); + } + + async normalize(pattern: string): any { + const {name, range, hasVersion} = PackageRequest.normalizePattern(pattern); + const new_range = await this.normalizeRange(range); + return {name, range: new_range, hasVersion}; + } + /** * Explode and normalize a pattern into it's name and range. */ @@ -219,7 +245,7 @@ export default class PackageRequest { // check if while we were resolving this dep we've already resolved one that satisfies // the same range - const {range, name} = PackageRequest.normalizePattern(this.pattern); + const {range, name} = await this.normalize(this.pattern); const resolved: ?Manifest = this.resolver.getHighestRangeVersionMatch(name, range); if (resolved) { this.reportResolvedRangeMatch(info, resolved); diff --git a/src/util/fs.js b/src/util/fs.js index f6d2dbcf37..15af11d0ba 100644 --- a/src/util/fs.js +++ b/src/util/fs.js @@ -22,7 +22,7 @@ export const access: (path: string, mode?: number) => Promise = promisify( export const stat: (path: string) => Promise = promisify(fs.stat); export const unlink: (path: string) => Promise = promisify(require('rimraf')); export const mkdirp: (path: string) => Promise = promisify(require('mkdirp')); -export const exists: (path: string) => Promise = promisify(fs.exists, true); +export const exists: (path: string) => Promise = promisify(fs.exists, true); export const lstat: (path: string) => Promise = promisify(fs.lstat); export const chmod: (path: string, mode: number | string) => Promise = promisify(fs.chmod); export const link: (path: string) => Promise = promisify(fs.link);