From eabc7846f2d153ef7ee96feead25fa94a642e94f Mon Sep 17 00:00:00 2001 From: Dan Harper Date: Mon, 27 Mar 2017 15:48:37 -0700 Subject: [PATCH] Ability to opt-out of offline mirror Configs are merged with configs in parent directories, so currently if a .yarnrc in a parent directory enables the offline mirror, all projects in child directories would also use the offline mirror. This commit allows a child directory to opt-out of the offline mirror in their own .yarnrc with `yarn-offline-mirror false`. Previously if you specified `false` you'd get an exception as false is parsed as boolean but it expects a string. Also included tests verifying the existing .yarnrc merging behaviour (previously wasn't covered). t14078443 --- __tests__/commands/_helpers.js | 14 +++++++- __tests__/commands/install/integration.js | 31 ++++++++++++++++++ .../offline-mirror-configuration/.yarnrc | 1 + .../disabled-locally/.yarnrc | 1 + .../disabled-locally/package.json | 5 +++ .../enabled-from-parent-merge/.yarnrc | 1 + .../enabled-from-parent-merge/package.json | 5 +++ .../enabled-from-parent/package.json | 5 +++ .../offline-mirror/mime-db-1.27.0.tgz | Bin 0 -> 24091 bytes .../offline-mirror/mime-types-2.1.15.tgz | Bin 0 -> 4512 bytes src/config.js | 4 +++ 11 files changed, 66 insertions(+), 1 deletion(-) create mode 100644 __tests__/fixtures/install/offline-mirror-configuration/.yarnrc create mode 100644 __tests__/fixtures/install/offline-mirror-configuration/disabled-locally/.yarnrc create mode 100644 __tests__/fixtures/install/offline-mirror-configuration/disabled-locally/package.json create mode 100644 __tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent-merge/.yarnrc create mode 100644 __tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent-merge/package.json create mode 100644 __tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent/package.json create mode 100644 __tests__/fixtures/install/offline-mirror-configuration/offline-mirror/mime-db-1.27.0.tgz create mode 100644 __tests__/fixtures/install/offline-mirror-configuration/offline-mirror/mime-types-2.1.15.tgz diff --git a/__tests__/commands/_helpers.js b/__tests__/commands/_helpers.js index a5c42f9fe9..01fa884cf1 100644 --- a/__tests__/commands/_helpers.js +++ b/__tests__/commands/_helpers.js @@ -81,9 +81,21 @@ export async function run( let cwd; if (fixturesLoc) { - const dir = path.join(fixturesLoc, name); + let parentDir = name; + let childDir = ''; + + // if the name is a path, copy the parent dir, then use the child dir as the cwd + // there's some existing tests which reference fixtures in a parent dir (../), so excluding those + const nameSepIndex = name.indexOf('/'); + if (nameSepIndex !== -1 && name.indexOf('../') === -1) { + parentDir = name.slice(0, nameSepIndex); + childDir = name.slice(nameSepIndex); + } + + const dir = path.join(fixturesLoc, parentDir); cwd = await fs.makeTempDir(path.basename(dir)); await fs.copy(dir, cwd, reporter); + cwd += childDir; } else { // if fixture loc is not set then CWD is some empty temp dir cwd = await fs.makeTempDir(); diff --git a/__tests__/commands/install/integration.js b/__tests__/commands/install/integration.js index 48e5054561..f6a6d2e23d 100644 --- a/__tests__/commands/install/integration.js +++ b/__tests__/commands/install/integration.js @@ -6,6 +6,7 @@ import {run as cache} from '../../../src/cli/commands/cache.js'; import {run as check} from '../../../src/cli/commands/check.js'; import * as constants from '../../../src/constants.js'; import * as reporters from '../../../src/reporters/index.js'; +import {parse} from '../../../src/lockfile/wrapper.js'; import {Install} from '../../../src/cli/commands/install.js'; import Lockfile from '../../../src/lockfile/wrapper.js'; import * as fs from '../../../src/util/fs.js'; @@ -809,6 +810,36 @@ test.concurrent('lockfile should be created when missing even if integrity match }); }); +test.concurrent('offline mirror can be enabled from parent dir', (): Promise => { + return runInstall({}, 'offline-mirror-configuration/enabled-from-parent', async (config, reporter) => { + const rawLockfile = await fs.readFile(path.join(config.cwd, 'yarn.lock')); + const lockfile = parse(rawLockfile); + expect(lockfile['mime-types@2.1.14'].resolved).toEqual( + 'mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee', + ); + }); +}); + +test.concurrent('offline mirror can be enabled from parent dir, with merging of own .yarnrc', (): Promise => { + return runInstall({}, 'offline-mirror-configuration/enabled-from-parent-merge', async (config, reporter) => { + const rawLockfile = await fs.readFile(path.join(config.cwd, 'yarn.lock')); + const lockfile = parse(rawLockfile); + expect(lockfile['mime-types@2.1.14'].resolved).toEqual( + 'mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee', + ); + }); +}); + +test.concurrent('offline mirror can be disabled locally', (): Promise => { + return runInstall({}, 'offline-mirror-configuration/disabled-locally', async (config, reporter) => { + const rawLockfile = await fs.readFile(path.join(config.cwd, 'yarn.lock')); + const lockfile = parse(rawLockfile); + expect(lockfile['mime-types@2.1.14'].resolved).toEqual( + 'https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.14.tgz#f7ef7d97583fcaf3b7d282b6f8b5679dab1e94ee', + ); + }); +}); + test.concurrent('install infers line endings from existing win32 lockfile', async (): Promise => { await runInstall({}, 'install-infers-line-endings-from-existing-lockfile', async (config): Promise => { diff --git a/__tests__/fixtures/install/offline-mirror-configuration/.yarnrc b/__tests__/fixtures/install/offline-mirror-configuration/.yarnrc new file mode 100644 index 0000000000..7f343e6fe2 --- /dev/null +++ b/__tests__/fixtures/install/offline-mirror-configuration/.yarnrc @@ -0,0 +1 @@ +yarn-offline-mirror "./offline-mirror" diff --git a/__tests__/fixtures/install/offline-mirror-configuration/disabled-locally/.yarnrc b/__tests__/fixtures/install/offline-mirror-configuration/disabled-locally/.yarnrc new file mode 100644 index 0000000000..e248a62bfb --- /dev/null +++ b/__tests__/fixtures/install/offline-mirror-configuration/disabled-locally/.yarnrc @@ -0,0 +1 @@ +yarn-offline-mirror false diff --git a/__tests__/fixtures/install/offline-mirror-configuration/disabled-locally/package.json b/__tests__/fixtures/install/offline-mirror-configuration/disabled-locally/package.json new file mode 100644 index 0000000000..735da3884a --- /dev/null +++ b/__tests__/fixtures/install/offline-mirror-configuration/disabled-locally/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "mime-types": "2.1.14" + } +} diff --git a/__tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent-merge/.yarnrc b/__tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent-merge/.yarnrc new file mode 100644 index 0000000000..3dfdc59b46 --- /dev/null +++ b/__tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent-merge/.yarnrc @@ -0,0 +1 @@ +something else diff --git a/__tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent-merge/package.json b/__tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent-merge/package.json new file mode 100644 index 0000000000..735da3884a --- /dev/null +++ b/__tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent-merge/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "mime-types": "2.1.14" + } +} diff --git a/__tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent/package.json b/__tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent/package.json new file mode 100644 index 0000000000..735da3884a --- /dev/null +++ b/__tests__/fixtures/install/offline-mirror-configuration/enabled-from-parent/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "mime-types": "2.1.14" + } +} diff --git a/__tests__/fixtures/install/offline-mirror-configuration/offline-mirror/mime-db-1.27.0.tgz b/__tests__/fixtures/install/offline-mirror-configuration/offline-mirror/mime-db-1.27.0.tgz new file mode 100644 index 0000000000000000000000000000000000000000..9855d15c4f655537c35a7df21ca95e6175711779 GIT binary patch literal 24091 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 literal 0 HcmV?d00001 diff --git a/__tests__/fixtures/install/offline-mirror-configuration/offline-mirror/mime-types-2.1.15.tgz b/__tests__/fixtures/install/offline-mirror-configuration/offline-mirror/mime-types-2.1.15.tgz new file mode 100644 index 0000000000000000000000000000000000000000..66f2f4180411c2ac683442bbbbb7a5514243dfb2 GIT binary patch literal 4512 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 literal 0 HcmV?d00001 diff --git a/src/config.js b/src/config.js index 8a636d057e..e94c812976 100644 --- a/src/config.js +++ b/src/config.js @@ -368,6 +368,10 @@ export default class Config { const registryMirrorPath = registry.config['yarn-offline-mirror']; + if (registryMirrorPath === false) { + return null; + } + if (registryMirrorPath == null) { continue; }