This app provides monitoring and information features for the common freifunk user and the technical stuff of a freifunk community.
Code base is taken from a TUM Practical Course project and added here to see if Freifunk Altdorf can use it.
https://www.freifunk-altdorf.de
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
138 lines
3.9 KiB
138 lines
3.9 KiB
/** |
|
* Copyright (c) 2015-present, Facebook, Inc. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file in the root directory of this source tree. |
|
*/ |
|
|
|
const log = require('npmlog'); |
|
|
|
const getProjectDependencies = require('./getProjectDependencies'); |
|
const getDependencyConfig = require('./getDependencyConfig'); |
|
const difference = require('lodash').difference; |
|
const filter = require('lodash').filter; |
|
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'; |
|
|
|
const unlinkDependency = (platforms, project, dependency, packageName, otherDependencies) => { |
|
|
|
Object.keys(platforms || {}) |
|
.forEach(platform => { |
|
if (!project[platform] || !dependency[platform]) { |
|
return; |
|
} |
|
|
|
const linkConfig = platforms[platform] && platforms[platform].linkConfig && platforms[platform].linkConfig(); |
|
if (!linkConfig || !linkConfig.isInstalled || !linkConfig.unregister) { |
|
return; |
|
} |
|
|
|
const isInstalled = linkConfig.isInstalled(project[platform], packageName, dependency[platform]); |
|
|
|
if (!isInstalled) { |
|
log.info(`Platform '${platform}' module ${packageName} is not installed`); |
|
return; |
|
} |
|
|
|
log.info(`Unlinking ${packageName} ${platform} dependency`); |
|
|
|
linkConfig.unregister( |
|
packageName, |
|
dependency[platform], |
|
project[platform], |
|
otherDependencies |
|
); |
|
|
|
log.info(`Platform '${platform}' module ${dependency.name} has been successfully unlinked`); |
|
}); |
|
}; |
|
|
|
/** |
|
* Updates project and unlink specific dependency |
|
* |
|
* If optional argument [packageName] is provided, it's the only one |
|
* that's checked |
|
*/ |
|
function unlink(args, config) { |
|
const packageName = args[0]; |
|
|
|
let platforms; |
|
let project; |
|
let dependency; |
|
|
|
try { |
|
platforms = config.getPlatformConfig(); |
|
project = config.getProjectConfig(); |
|
} catch (err) { |
|
log.error( |
|
'ERRPACKAGEJSON', |
|
'No package found. Are you sure it\'s a React Native project?' |
|
); |
|
return Promise.reject(err); |
|
} |
|
|
|
try { |
|
dependency = config.getDependencyConfig(packageName); |
|
} catch (err) { |
|
log.warn( |
|
'ERRINVALIDPROJ', |
|
`Project ${packageName} is not a react-native library` |
|
); |
|
return Promise.reject(err); |
|
} |
|
|
|
const allDependencies = getDependencyConfig(config, getProjectDependencies()); |
|
const otherDependencies = filter(allDependencies, d => d.name !== packageName); |
|
|
|
const tasks = [ |
|
() => promisify(dependency.commands.preunlink || commandStub), |
|
() => unlinkDependency(platforms, project, dependency, packageName, otherDependencies), |
|
() => promisify(dependency.commands.postunlink || commandStub) |
|
]; |
|
|
|
return promiseWaterfall(tasks) |
|
.then(() => { |
|
// @todo move all these to `tasks` array, just like in |
|
// link |
|
const assets = difference( |
|
dependency.assets, |
|
flatten(allDependencies, d => d.assets) |
|
); |
|
|
|
if (isEmpty(assets)) { |
|
return Promise.resolve(); |
|
} |
|
|
|
Object.keys(platforms || {}) |
|
.forEach(platform => { |
|
const linkConfig = platforms[platform] && platforms[platform].linkConfig && platforms[platform].linkConfig(); |
|
if (!linkConfig || !linkConfig.unlinkAssets) { |
|
return; |
|
} |
|
|
|
log.info(`Unlinking assets from ${platform} project`); |
|
linkConfig.unlinkAssets(assets, project[platform]); |
|
}); |
|
|
|
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 = { |
|
func: unlink, |
|
description: 'unlink native dependency', |
|
name: 'unlink <packageName>', |
|
};
|
|
|