diff --git a/lib/dependency-manager-adapters/workspace.js b/lib/dependency-manager-adapters/workspace.js index d251b949..88d299c3 100644 --- a/lib/dependency-manager-adapters/workspace.js +++ b/lib/dependency-manager-adapters/workspace.js @@ -18,15 +18,6 @@ module.exports = CoreObject.extend({ if (!this.useYarnCommand) { throw new Error('workspaces are currently only supported by Yarn, you must set `useYarn` to true'); } - }, - - packageJSON: 'package.json', - - setup(options) { - if (!options) { - options = {}; - } - let packageJSON = JSON.parse(fs.readFileSync(this.packageJSON)); let workspaceGlobs; @@ -59,6 +50,15 @@ module.exports = CoreObject.extend({ }); }); + }, + + packageJSON: 'package.json', + + setup(options) { + if (!options) { + options = {}; + } + return RSVP.all(this._packageAdapters.map(adapter => adapter.setup(options))); }, diff --git a/test/dependency-manager-adapters/workspace-adapter-test.js b/test/dependency-manager-adapters/workspace-adapter-test.js index 5422b63f..2c794f5f 100644 --- a/test/dependency-manager-adapters/workspace-adapter-test.js +++ b/test/dependency-manager-adapters/workspace-adapter-test.js @@ -195,6 +195,29 @@ describe('workspaceAdapter', () => { }); describe('#cleanup', () => { + it('works without having called #setup first', () => { + fs.ensureDirSync('packages/test/node_modules'); + + writeJSONFile('packages/test/package.json', { originalPackageJSON: false }); + writeJSONFile('packages/test/node_modules/prove-it.json', { originalNodeModules: false }); + + let workspaceAdapter = new WorkspaceAdapter({ + cwd: tmpdir, + useYarnCommand: true, + run: () => Promise.resolve(), + }); + + fs.ensureDirSync('packages/test/.node_modules.ember-try'); + + writeJSONFile('packages/test/package.json.ember-try', { originalPackageJSON: true }); + writeJSONFile('packages/test/.node_modules.ember-try/prove-it.json', { originalNodeModules: true }); + + return workspaceAdapter.cleanup().then(() => { + assertFileContainsJSON(path.join(tmpdir, 'packages/test/package.json'), { originalPackageJSON: true }); + assertFileContainsJSON(path.join(tmpdir, 'packages/test/node_modules/prove-it.json'), { originalNodeModules: true }); + }); + }); + it('replaces the package.json with the backed up version', () => { fs.ensureDirSync('packages/test/node_modules'); diff --git a/test/utils/dependency-manager-adapter-factory-test.js b/test/utils/dependency-manager-adapter-factory-test.js index 851e1b37..90383fe6 100644 --- a/test/utils/dependency-manager-adapter-factory-test.js +++ b/test/utils/dependency-manager-adapter-factory-test.js @@ -1,10 +1,30 @@ 'use strict'; +const path = require('path'); +const fs = require('fs-extra'); +const tmp = require('tmp-sync'); const expect = require('chai').expect; const DependencyManagerAdapterFactory = require('../../lib/utils/dependency-manager-adapter-factory'); const WorkspaceAdapter = require('../../lib/dependency-manager-adapters/workspace'); +let writeJSONFile = require('../helpers/write-json-file'); + +const ROOT = process.cwd(); +let tmproot = path.join(ROOT, 'tmp'); describe('DependencyManagerAdapterFactory', () => { + let tmpdir; + + beforeEach(() => { + tmpdir = tmp.in(tmproot); + process.chdir(tmpdir); + }); + + afterEach(() => { + process.chdir(ROOT); + + return fs.remove(tmproot); + }); + describe('generateFromConfig', () => { it('creates both adapters, in order, when there is only an npm key', () => { let adapters = DependencyManagerAdapterFactory.generateFromConfig({ scenarios: [{ npm: {} }] }, 'here'); @@ -42,11 +62,19 @@ describe('DependencyManagerAdapterFactory', () => { }); it('creates only a workspace adapter when useWorkspaces is set to true', () => { - let adapters = DependencyManagerAdapterFactory.generateFromConfig({ - useYarn: true, - useWorkspaces: true, - scenarios: [{ npm: {} }] - }); + writeJSONFile('package.json', { workspaces: ['packages/test'] }); + + fs.ensureDirSync('packages/test'); + writeJSONFile('packages/test/package.json', {}); + + let adapters = DependencyManagerAdapterFactory.generateFromConfig( + { + useYarn: true, + useWorkspaces: true, + scenarios: [{ npm: {} }] + }, + tmpdir + ); expect(adapters[0]).to.be.instanceOf(WorkspaceAdapter); expect(adapters.length).to.equal(1); });