forked from facebook/react-native
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfindPlugins.js
133 lines (114 loc) · 3.48 KB
/
findPlugins.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
'use strict';
const path = require('path');
const union = require('lodash').union;
const uniq = require('lodash').uniq;
const flatten = require('lodash').flatten;
const RNPM_PLUGIN_PATTERNS = [/^rnpm-plugin-/, /^@(.*)\/rnpm-plugin-/];
const REACT_NATIVE_PLUGIN_PATTERNS = [
/^react-native-/,
/^@(.*)\/react-native-/,
/^@react-native(.*)\/(?!rnpm-plugin-)/,
];
/**
* Filter dependencies by name pattern
* @param {String} dependency Name of the dependency
* @return {Boolean} If dependency is a rnpm plugin
*/
const isRNPMPlugin = dependency =>
RNPM_PLUGIN_PATTERNS.some(pattern => pattern.test(dependency));
const isReactNativePlugin = dependency =>
REACT_NATIVE_PLUGIN_PATTERNS.some(pattern => pattern.test(dependency));
const readPackage = folder => {
try {
return require(path.join(folder, 'package.json'));
} catch (e) {
return null;
}
};
const findPluginsInReactNativePackage = pjson => {
if (!pjson.rnpm || !pjson.rnpm.plugin) {
return [];
}
return path.join(pjson.name, pjson.rnpm.plugin);
};
const findPlatformsInPackage = pjson => {
if (!pjson.rnpm || !pjson.rnpm.platform) {
return [];
}
return path.join(pjson.name, pjson.rnpm.platform);
};
const getEmptyPluginConfig = () => ({
commands: [],
platforms: [],
haste: {
platforms: [],
providesModuleNodeModules: [],
},
});
const findHasteConfigInPackageAndConcat = (pjson, haste) => {
if (!pjson.rnpm || !pjson.rnpm.haste) {
return;
}
let pkgHaste = pjson.rnpm.haste;
if (pkgHaste.platforms) {
haste.platforms = haste.platforms.concat(pkgHaste.platforms);
}
if (pkgHaste.providesModuleNodeModules) {
haste.providesModuleNodeModules = haste.providesModuleNodeModules.concat(
pkgHaste.providesModuleNodeModules,
);
}
};
const findPluginInFolder = folder => {
const pjson = readPackage(folder);
if (!pjson) {
return getEmptyPluginConfig();
}
const deps = union(
Object.keys(pjson.dependencies || {}),
Object.keys(pjson.devDependencies || {}),
);
return deps.reduce((acc, pkg) => {
let commands = acc.commands;
let platforms = acc.platforms;
let haste = acc.haste;
if (isRNPMPlugin(pkg)) {
commands = commands.concat(pkg);
}
if (isReactNativePlugin(pkg)) {
const pkgJson = readPackage(path.join(folder, 'node_modules', pkg));
if (pkgJson) {
commands = commands.concat(findPluginsInReactNativePackage(pkgJson));
platforms = platforms.concat(findPlatformsInPackage(pkgJson));
findHasteConfigInPackageAndConcat(pkgJson, haste);
}
}
return {commands: commands, platforms: platforms, haste: haste};
}, getEmptyPluginConfig());
};
/**
* Find plugins in package.json of the given folder
* @param {String} folder Path to the folder to get the package.json from
* @type {Object} Object of commands and platform plugins
*/
module.exports = function findPlugins(folders) {
const plugins = folders.map(findPluginInFolder);
return {
commands: uniq(flatten(plugins.map(p => p.commands))),
platforms: uniq(flatten(plugins.map(p => p.platforms))),
haste: {
platforms: uniq(flatten(plugins.map(p => p.haste.platforms))),
providesModuleNodeModules: uniq(
flatten(plugins.map(p => p.haste.providesModuleNodeModules)),
),
},
};
};