whistle 2.9.2-beta → 2.9.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,6 @@
1
+
2
+ export function getWhistlePath(): string;
3
+
4
+ export function install(cmd: string, argv: string[]): void;
5
+
6
+ export function uninstall(argv: string[]): void;
package/bin/plugin.js CHANGED
@@ -3,9 +3,10 @@ var cp = require('child_process');
3
3
  var fs = require('fs');
4
4
  var path = require('path');
5
5
  var fse = require('fs-extra2');
6
+ var getWhistlePath = require('../lib/util/common').getWhistlePath;
6
7
 
7
8
  var CMD_SUFFIX = process.platform === 'win32' ? '.cmd' : '';
8
- var WHISLTE_PLUGIN_RE = /^(@[\w\-]+\/)?whistle\.[a-z\d_\-]+$/;
9
+ var WHISTLE_PLUGIN_RE = /^((?:@[\w-]+\/)?whistle\.[a-z\d_-]+)(?:\@([\w.^~*-]*))?$/;
9
10
  var PLUGIN_PATH = path.join(getWhistlePath(), 'plugins');
10
11
  var CUSTOM_PLUGIN_PATH = path.join(getWhistlePath(), 'custom_plugins');
11
12
  var PACKAGE_JSON = '{"repository":"https://github.com/avwo/whistle","license":"MIT"}';
@@ -16,19 +17,9 @@ function getInstallPath(name, dir) {
16
17
  return path.join(dir || CUSTOM_PLUGIN_PATH, name);
17
18
  }
18
19
 
19
- function getHomedir() {
20
- //默认设置为`~`,防止Linux在开机启动时Node无法获取homedir
21
- return (typeof os.homedir == 'function' ? os.homedir() :
22
- process.env[process.platform == 'win32' ? 'USERPROFILE' : 'HOME']) || '~';
23
- }
24
-
25
- function getWhistlePath() {
26
- return process.env.WHISTLE_PATH || path.join(getHomedir(), '.WhistleAppData');
27
- }
28
-
29
20
  function getPlugins(argv) {
30
21
  return argv.filter(function(name) {
31
- return WHISLTE_PLUGIN_RE.test(name);
22
+ return WHISTLE_PLUGIN_RE.test(name);
32
23
  });
33
24
  }
34
25
 
@@ -54,6 +45,7 @@ function getTempName(name) {
54
45
  }
55
46
 
56
47
  function getInstallDir(argv) {
48
+ argv = argv.slice();
57
49
  var result = { argv: argv };
58
50
  for (var i = 0, len = argv.length; i < len; i++) {
59
51
  var option = argv[i];
@@ -67,23 +59,29 @@ function getInstallDir(argv) {
67
59
  return result;
68
60
  }
69
61
 
70
- function install(cmd, name, argv) {
62
+ function install(cmd, name, argv, ver, pluginsCache, callback) {
71
63
  argv = argv.slice();
72
64
  var result = getInstallDir(argv);
73
65
  argv = result.argv;
74
66
  var installPath = getInstallPath(getTempName(name), result.dir);
75
67
  fse.ensureDirSync(installPath);
76
68
  fse.emptyDirSync(installPath);
77
- fs.writeFileSync(path.join(installPath, 'package.json'), PACKAGE_JSON);
69
+ var pkgJson = PACKAGE_JSON;
70
+ if (ver) {
71
+ pkgJson = pkgJson.replace(',', ',"dependencies":{"' + name + '":"' + ver + '"},');
72
+ }
73
+ fs.writeFileSync(path.join(installPath, 'package.json'), pkgJson);
78
74
  fs.writeFileSync(path.join(installPath, 'LICENSE'), LICENSE);
79
75
  fs.writeFileSync(path.join(installPath, 'README.md'), RESP_URL);
80
76
  argv.unshift('install', name);
77
+ pluginsCache[name] = 1;
81
78
  cp.spawn(cmd, argv, {
82
79
  stdio: 'inherit',
83
80
  cwd: installPath
84
- }).on('exit', function(code) {
81
+ }).once('exit', function(code) {
85
82
  if (code) {
86
83
  removeDir(installPath);
84
+ callback();
87
85
  } else {
88
86
  var realPath = getInstallPath(name, result.dir);
89
87
  removeDir(realPath);
@@ -95,17 +93,67 @@ function install(cmd, name, argv) {
95
93
  removeDir(installPath);
96
94
  } catch (e) {}
97
95
  }
96
+ var pkgPath = path.join(realPath, 'node_modules', name, 'package.json');
98
97
  try {
99
- var pkgPath = path.join(realPath, 'node_modules', name, 'package.json');
100
98
  if (fs.statSync(pkgPath).mtime.getFullYear() < 2010) {
101
99
  var now = new Date();
102
100
  fs.utimesSync(pkgPath, now, now);
103
101
  }
104
102
  } catch (e) {}
103
+ callback(pkgPath);
104
+ }
105
+ });
106
+ }
107
+
108
+ function readJson(pkgPath) {
109
+ try {
110
+ return fse.readJsonSync(pkgPath);
111
+ } catch (e) {
112
+ try {
113
+ return fse.readJsonSync(pkgPath);
114
+ } catch (e) {}
115
+ }
116
+ }
117
+
118
+ function installPlugins(cmd, plugins, argv, pluginsCache, deep) {
119
+ deep = deep || 0;
120
+ var count = 0;
121
+ var peerPlugins = [];
122
+ var callback = function(pkgPath) {
123
+ if (pkgPath) {
124
+ var pkg = readJson(pkgPath) || {};
125
+ var list = pkg.whistleConfig && (pkg.whistleConfig.peerPluginList || pkg.whistleConfig.peerPlugins);
126
+ if (Array.isArray(list) && list.length < 16) {
127
+ list.forEach(function(name) {
128
+ if (typeof name === 'string' && WHISTLE_PLUGIN_RE.test(name.trim())) {
129
+ name = RegExp.$1;
130
+ if (peerPlugins.indexOf(name) === -1) {
131
+ peerPlugins.push(name);
132
+ }
133
+ }
134
+ });
135
+ }
136
+ }
137
+ if (--count <= 0 && deep < 16) {
138
+ peerPlugins = peerPlugins.filter(function(name) {
139
+ return !pluginsCache[name];
140
+ });
141
+ peerPlugins.length && installPlugins(cmd, peerPlugins, argv, pluginsCache, ++deep);
142
+ }
143
+ };
144
+ plugins.forEach(function(name) {
145
+ if (WHISTLE_PLUGIN_RE.test(name)) {
146
+ ++count;
147
+ name = RegExp.$1;
148
+ var ver = RegExp.$2;
149
+ removeOldPlugin(name);
150
+ install(cmd, name, argv, ver, pluginsCache, callback);
105
151
  }
106
152
  });
107
153
  }
108
154
 
155
+ exports.getWhistlePath = getWhistlePath;
156
+
109
157
  exports.install = function(cmd, argv) {
110
158
  var plugins = getPlugins(argv);
111
159
  if (!plugins.length) {
@@ -117,18 +165,18 @@ exports.install = function(cmd, argv) {
117
165
 
118
166
  cmd += CMD_SUFFIX;
119
167
  argv.push('--no-package-lock');
120
- plugins.forEach(function(name) {
121
- removeOldPlugin(name);
122
- install(cmd, name, argv);
123
- });
168
+ installPlugins(cmd, plugins, argv, {});
124
169
  };
125
170
 
126
171
  exports.uninstall = function(plugins) {
127
172
  var result = getInstallDir(plugins);
128
173
  plugins = result.argv;
129
174
  getPlugins(plugins).forEach(function(name) {
130
- !result.dir && removeOldPlugin(name);
131
- removeDir(getInstallPath(name, result.dir));
175
+ if (WHISTLE_PLUGIN_RE.test(name)) {
176
+ name = RegExp.$1;
177
+ !result.dir && removeOldPlugin(name);
178
+ removeDir(getInstallPath(name, result.dir));
179
+ }
132
180
  });
133
181
  };
134
182
 
@@ -8,6 +8,6 @@
8
8
  </head>
9
9
  <body style="overscroll-behavior-x: none;">
10
10
  <div id="container" class="main"></div>
11
- <script src="js/index.js?v=2.9.2"></script>
11
+ <script src="js/index.js?v=2.9.4"></script>
12
12
  </body>
13
13
  </html>