diff --git a/local-cli/link/commandStub.js b/local-cli/link/commandStub.js new file mode 100644 index 00000000000000..2914946a99ff29 --- /dev/null +++ b/local-cli/link/commandStub.js @@ -0,0 +1 @@ +module.exports = (cb) => cb(); \ No newline at end of file diff --git a/local-cli/link/link.js b/local-cli/link/link.js index 9361a40a02f3b9..33fc5871cf5bd9 100644 --- a/local-cli/link/link.js +++ b/local-cli/link/link.js @@ -14,15 +14,13 @@ const copyAssetsIOS = require('./ios/copyAssets'); const getProjectDependencies = require('./getProjectDependencies'); const getDependencyConfig = require('./getDependencyConfig'); const pollParams = require('./pollParams'); +const commandStub = require('./commandStub'); +const promisify = require('./promisify'); log.heading = 'rnpm-link'; -const commandStub = (cb) => cb(); const dedupeAssets = (assets) => uniq(assets, asset => path.basename(asset)); -const promisify = (func) => new Promise((resolve, reject) => - func((err, res) => err ? reject(err) : resolve(res)) -); const linkDependencyAndroid = (androidProject, dependency) => { if (!androidProject || !dependency.config.android) { diff --git a/local-cli/link/promisify.js b/local-cli/link/promisify.js new file mode 100644 index 00000000000000..94f912f1f23bde --- /dev/null +++ b/local-cli/link/promisify.js @@ -0,0 +1,3 @@ +module.exports = (func) => new Promise((resolve, reject) => + func((err, res) => err ? reject(err) : resolve(res)) +); \ No newline at end of file diff --git a/local-cli/link/unlink.js b/local-cli/link/unlink.js index 3e027b82e20463..8910bf63a0c5a6 100644 --- a/local-cli/link/unlink.js +++ b/local-cli/link/unlink.js @@ -11,8 +11,12 @@ const getDependencyConfig = require('./getDependencyConfig'); const compact = require('lodash').compact; const difference = require('lodash').difference; const filter = require('lodash').filter; -const isEmpty = require('lodash').isEmpty; +const find = require('lodash').find; const flatten = require('lodash').flatten; +const isEmpty = require('lodash').isEmpty; +const promiseWaterfall = require('./promiseWaterfall'); +const commandStub = require('./commandStub'); +const promisify = require('./promisify'); log.heading = 'rnpm-link'; @@ -88,35 +92,47 @@ function unlink(args, config) { const allDependencies = getDependencyConfig(config, getProjectDependencies()); const otherDependencies = filter(allDependencies, d => d.name !== packageName); + const thisDependency = find(allDependencies, d => d.name === packageName); const iOSDependencies = compact(otherDependencies.map(d => d.config.ios)); - unlinkDependencyAndroid(project.android, dependency, packageName); - unlinkDependencyIOS(project.ios, dependency, packageName, iOSDependencies); - - const assets = difference( - dependency.assets, - flatten(allDependencies, d => d.assets) - ); - - if (isEmpty(assets)) { - return Promise.resolve(); - } - - if (project.ios) { - log.info('Unlinking assets from ios project'); - unlinkAssetsIOS(assets, project.ios); - } - - if (project.android) { - log.info('Unlinking assets from android project'); - unlinkAssetsAndroid(assets, project.android.assetsPath); - } - - log.info( - `${packageName} assets has been successfully unlinked from your project` - ); - - return Promise.resolve(); + const tasks = [ + () => promisify(thisDependency.config.commands.preunlink || commandStub), + () => unlinkDependencyAndroid(project.android, dependency, packageName), + () => unlinkDependencyIOS(project.ios, dependency, packageName, iOSDependencies), + () => promisify(thisDependency.config.commands.postunlink || commandStub) + ]; + + return promiseWaterfall(tasks) + .then(() => { + const assets = difference( + dependency.assets, + flatten(allDependencies, d => d.assets) + ); + + if (isEmpty(assets)) { + return Promise.resolve(); + } + + if (project.ios) { + log.info('Unlinking assets from ios project'); + unlinkAssetsIOS(assets, project.ios); + } + + if (project.android) { + log.info('Unlinking assets from android project'); + unlinkAssetsAndroid(assets, project.android.assetsPath); + } + + log.info( + `${packageName} assets has been successfully unlinked from your project` + ); + }) + .catch(err => { + log.error( + `It seems something went wrong while unlinking. Error: ${err.message}` + ); + throw err; + }); }; module.exports = {