Skip to content

Commit e7521a1

Browse files
geof90Facebook Github Bot 9
authored and
Facebook Github Bot 9
committed
Add pre/postunlink
Summary: An attempt to address #9156. cc grabbou Kureev **Test plan (required)** 1. Added the following to the `package.json` of a `react-native-plugin` ``` "rnpm": { "commands": { "preunlink": "node node_modules/react-native-plugin/scripts/preunlink" "postunlink": "node node_modules/react-native-plugin/scripts/postunlink" } } ``` 2. Added files, `scripts/preunlink.js` and `scripts/postunlink.js` to the plugin. Each of them simply logs a string to the console. 3. Ran `react-native unlink react-native-plugin` to verify that those logs get printed. Closes #9157 Differential Revision: D3749434 fbshipit-source-id: 40b94c9026db4f11e8f5be4a417a0670e8069be6
1 parent d943e28 commit e7521a1

File tree

4 files changed

+50
-32
lines changed

4 files changed

+50
-32
lines changed

local-cli/link/commandStub.js

+1
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = (cb) => cb();

local-cli/link/link.js

+2-4
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,13 @@ const copyAssetsIOS = require('./ios/copyAssets');
1414
const getProjectDependencies = require('./getProjectDependencies');
1515
const getDependencyConfig = require('./getDependencyConfig');
1616
const pollParams = require('./pollParams');
17+
const commandStub = require('./commandStub');
18+
const promisify = require('./promisify');
1719

1820
log.heading = 'rnpm-link';
1921

20-
const commandStub = (cb) => cb();
2122
const dedupeAssets = (assets) => uniq(assets, asset => path.basename(asset));
2223

23-
const promisify = (func) => new Promise((resolve, reject) =>
24-
func((err, res) => err ? reject(err) : resolve(res))
25-
);
2624

2725
const linkDependencyAndroid = (androidProject, dependency) => {
2826
if (!androidProject || !dependency.config.android) {

local-cli/link/promisify.js

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module.exports = (func) => new Promise((resolve, reject) =>
2+
func((err, res) => err ? reject(err) : resolve(res))
3+
);

local-cli/link/unlink.js

+44-28
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,12 @@ const getDependencyConfig = require('./getDependencyConfig');
1111
const compact = require('lodash').compact;
1212
const difference = require('lodash').difference;
1313
const filter = require('lodash').filter;
14-
const isEmpty = require('lodash').isEmpty;
14+
const find = require('lodash').find;
1515
const flatten = require('lodash').flatten;
16+
const isEmpty = require('lodash').isEmpty;
17+
const promiseWaterfall = require('./promiseWaterfall');
18+
const commandStub = require('./commandStub');
19+
const promisify = require('./promisify');
1620

1721
log.heading = 'rnpm-link';
1822

@@ -88,35 +92,47 @@ function unlink(args, config) {
8892

8993
const allDependencies = getDependencyConfig(config, getProjectDependencies());
9094
const otherDependencies = filter(allDependencies, d => d.name !== packageName);
95+
const thisDependency = find(allDependencies, d => d.name === packageName);
9196
const iOSDependencies = compact(otherDependencies.map(d => d.config.ios));
9297

93-
unlinkDependencyAndroid(project.android, dependency, packageName);
94-
unlinkDependencyIOS(project.ios, dependency, packageName, iOSDependencies);
95-
96-
const assets = difference(
97-
dependency.assets,
98-
flatten(allDependencies, d => d.assets)
99-
);
100-
101-
if (isEmpty(assets)) {
102-
return Promise.resolve();
103-
}
104-
105-
if (project.ios) {
106-
log.info('Unlinking assets from ios project');
107-
unlinkAssetsIOS(assets, project.ios);
108-
}
109-
110-
if (project.android) {
111-
log.info('Unlinking assets from android project');
112-
unlinkAssetsAndroid(assets, project.android.assetsPath);
113-
}
114-
115-
log.info(
116-
`${packageName} assets has been successfully unlinked from your project`
117-
);
118-
119-
return Promise.resolve();
98+
const tasks = [
99+
() => promisify(thisDependency.config.commands.preunlink || commandStub),
100+
() => unlinkDependencyAndroid(project.android, dependency, packageName),
101+
() => unlinkDependencyIOS(project.ios, dependency, packageName, iOSDependencies),
102+
() => promisify(thisDependency.config.commands.postunlink || commandStub)
103+
];
104+
105+
return promiseWaterfall(tasks)
106+
.then(() => {
107+
const assets = difference(
108+
dependency.assets,
109+
flatten(allDependencies, d => d.assets)
110+
);
111+
112+
if (isEmpty(assets)) {
113+
return Promise.resolve();
114+
}
115+
116+
if (project.ios) {
117+
log.info('Unlinking assets from ios project');
118+
unlinkAssetsIOS(assets, project.ios);
119+
}
120+
121+
if (project.android) {
122+
log.info('Unlinking assets from android project');
123+
unlinkAssetsAndroid(assets, project.android.assetsPath);
124+
}
125+
126+
log.info(
127+
`${packageName} assets has been successfully unlinked from your project`
128+
);
129+
})
130+
.catch(err => {
131+
log.error(
132+
`It seems something went wrong while unlinking. Error: ${err.message}`
133+
);
134+
throw err;
135+
});
120136
};
121137

122138
module.exports = {

0 commit comments

Comments
 (0)