@modern-js/monorepo-tools 2.0.0-beta.0 → 2.0.0-beta.1

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.
Files changed (78) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/js/modern/cli/new.js +0 -3
  3. package/dist/js/modern/commands/build.js +4 -9
  4. package/dist/js/modern/dag/create.js +8 -15
  5. package/dist/js/modern/dag/edge-manager.js +0 -10
  6. package/dist/js/modern/dag/operator.js +14 -57
  7. package/dist/js/modern/dag/task.js +0 -18
  8. package/dist/js/modern/dag/utils.js +13 -31
  9. package/dist/js/modern/features/build/index.js +8 -19
  10. package/dist/js/modern/features/clear/index.js +0 -1
  11. package/dist/js/modern/features/deploy/index.js +7 -35
  12. package/dist/js/modern/features/dev/cmds.js +1 -0
  13. package/dist/js/modern/features/dev/create-task.js +2 -13
  14. package/dist/js/modern/features/dev/index.js +4 -11
  15. package/dist/js/modern/features/dev/watch-projects-state.js +0 -19
  16. package/dist/js/modern/features/install/index.js +0 -12
  17. package/dist/js/modern/index.js +1 -2
  18. package/dist/js/modern/log/multi-tasks-log.js +8 -31
  19. package/dist/js/modern/log/time.js +0 -3
  20. package/dist/js/modern/log/utils.js +0 -2
  21. package/dist/js/modern/package/index.js +0 -8
  22. package/dist/js/modern/parse-config/index.js +3 -6
  23. package/dist/js/modern/parse-config/monorepo.js +0 -23
  24. package/dist/js/modern/projects/check-project-change.js +4 -16
  25. package/dist/js/modern/projects/get-projects-by-packages-config.js +12 -29
  26. package/dist/js/modern/projects/get-projects-by-workspace-file.js +0 -16
  27. package/dist/js/modern/projects/get-projects.js +4 -29
  28. package/dist/js/modern/utils/install.js +0 -2
  29. package/dist/js/node/cli/build-watch.js +0 -3
  30. package/dist/js/node/cli/build.js +0 -3
  31. package/dist/js/node/cli/clear.js +0 -3
  32. package/dist/js/node/cli/deploy.js +0 -3
  33. package/dist/js/node/cli/index.js +0 -12
  34. package/dist/js/node/cli/install.js +0 -3
  35. package/dist/js/node/cli/new.js +0 -7
  36. package/dist/js/node/commands/build-watch.js +0 -6
  37. package/dist/js/node/commands/build.js +2 -14
  38. package/dist/js/node/commands/clear.js +0 -5
  39. package/dist/js/node/commands/deploy.js +0 -9
  40. package/dist/js/node/commands/index.js +0 -10
  41. package/dist/js/node/commands/install.js +0 -6
  42. package/dist/js/node/dag/create.js +8 -17
  43. package/dist/js/node/dag/edge-manager.js +0 -12
  44. package/dist/js/node/dag/index.js +0 -4
  45. package/dist/js/node/dag/operator.js +14 -65
  46. package/dist/js/node/dag/task.js +0 -23
  47. package/dist/js/node/dag/utils.js +12 -39
  48. package/dist/js/node/features/build/index.js +8 -29
  49. package/dist/js/node/features/clear/index.js +0 -15
  50. package/dist/js/node/features/deploy/index.js +7 -53
  51. package/dist/js/node/features/dev/cmds.js +1 -0
  52. package/dist/js/node/features/dev/create-task.js +2 -22
  53. package/dist/js/node/features/dev/index.js +4 -19
  54. package/dist/js/node/features/dev/watch-projects-state.js +0 -25
  55. package/dist/js/node/features/install/index.js +0 -25
  56. package/dist/js/node/hooks/index.js +0 -2
  57. package/dist/js/node/index.js +2 -16
  58. package/dist/js/node/locale/index.js +0 -4
  59. package/dist/js/node/log/error.js +0 -2
  60. package/dist/js/node/log/multi-tasks-log.js +8 -34
  61. package/dist/js/node/log/time.js +0 -10
  62. package/dist/js/node/log/utils.js +0 -4
  63. package/dist/js/node/package/index.js +0 -10
  64. package/dist/js/node/parse-config/index.js +3 -14
  65. package/dist/js/node/parse-config/monorepo.js +0 -34
  66. package/dist/js/node/projects/check-project-change.js +4 -33
  67. package/dist/js/node/projects/clear-memory-files.js +0 -8
  68. package/dist/js/node/projects/get-projects-by-packages-config.js +12 -41
  69. package/dist/js/node/projects/get-projects-by-workspace-file.js +0 -36
  70. package/dist/js/node/projects/get-projects.js +4 -37
  71. package/dist/js/node/utils/install.js +0 -11
  72. package/dist/js/node/utils/language.js +0 -2
  73. package/dist/types/dag/operator.d.ts +0 -3
  74. package/dist/types/dag/utils.d.ts +0 -1
  75. package/dist/types/features/dev/index.d.ts +0 -1
  76. package/dist/types/index.d.ts +0 -2
  77. package/dist/types/projects/get-projects.d.ts +0 -1
  78. package/package.json +13 -13
@@ -4,48 +4,33 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.DagOperator = void 0;
7
-
8
7
  var _pMap = _interopRequireDefault(require("p-map"));
9
-
10
8
  var _error = require("../log/error");
11
-
12
9
  var _task = require("./task");
13
-
14
10
  var _edgeManager = require("./edge-manager");
15
-
16
11
  var _utils = require("./utils");
17
-
18
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
13
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
21
-
22
14
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
23
-
24
15
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
25
-
26
16
  class DagOperator {
27
17
  // 排序好的项目列表
18
+
28
19
  constructor(projects, projectsMap) {
29
20
  _defineProperty(this, "_projects", void 0);
30
-
31
21
  _defineProperty(this, "_projectsMap", void 0);
32
-
33
22
  _defineProperty(this, "_sortedProjects", void 0);
34
-
35
23
  _defineProperty(this, "_createTask", (project, task) => async (stopTask = () => undefined) => {
36
24
  await task(project, project.dependency || [], () => stopTask());
37
25
  return project.name;
38
26
  });
39
-
40
27
  this._projects = projects;
41
28
  this._projectsMap = projectsMap;
42
29
  this._sortedProjects = [];
43
30
  }
44
-
45
31
  checkNodeDataExist(name) {
46
32
  return this._projectsMap.has(name);
47
33
  }
48
-
49
34
  getNodeData(name, option = {
50
35
  checkExist: false
51
36
  }) {
@@ -56,42 +41,31 @@ class DagOperator {
56
41
  (0, _error.errorLog)(`No '${name}' project exist`);
57
42
  }
58
43
  }
59
-
60
44
  return this._projectsMap.get(name);
61
45
  }
62
-
63
46
  getNodeDependencyData(name) {
64
47
  var _this$_projectsMap$ge;
65
-
66
48
  return ((_this$_projectsMap$ge = this._projectsMap.get(name)) === null || _this$_projectsMap$ge === void 0 ? void 0 : _this$_projectsMap$ge.dependency) || [];
67
49
  }
68
-
69
50
  getNodeDependentData(name) {
70
51
  var _this$_projectsMap$ge2;
71
-
72
52
  return ((_this$_projectsMap$ge2 = this._projectsMap.get(name)) === null || _this$_projectsMap$ge2 === void 0 ? void 0 : _this$_projectsMap$ge2.dependent) || [];
73
53
  }
74
-
75
54
  getNodeAllDependencyData(name, option = {
76
55
  skipCircleCheck: false
77
56
  }) {
78
57
  const {
79
58
  skipCircleCheck
80
59
  } = option;
81
-
82
60
  if (!skipCircleCheck) {
83
61
  this.checkCircle();
84
62
  }
85
-
86
63
  if (!this._projectsMap.has(name)) {
87
64
  (0, _error.errorLog)(`No '${name}' project exist`);
88
65
  }
89
-
90
66
  const currentNode = this._projectsMap.get(name);
91
-
92
67
  return (0, _utils.recursiveGetDependency)(currentNode, skipCircleCheck);
93
68
  }
94
-
95
69
  setNodeData(name, task) {
96
70
  if (this._projectsMap.has(name)) {
97
71
  task(this._projectsMap.get(name));
@@ -99,19 +73,17 @@ class DagOperator {
99
73
  (0, _error.errorLog)(`No '${name}' project exist`);
100
74
  }
101
75
  }
102
-
103
76
  async traverseAllNodes(task) {
104
77
  const sortedNodes = this._sortedProjects.length > 0 ? this._sortedProjects : (0, _utils.sortProjects)(this._projects);
105
78
  const finishTaskHash = {};
106
79
  let preNodes = [];
107
80
  let earlyFinish = false;
108
-
109
81
  for (const projects of sortedNodes) {
110
82
  if (earlyFinish) {
111
83
  break;
112
84
  }
113
-
114
- await (0, _pMap.default)(projects, // eslint-disable-next-line @typescript-eslint/no-loop-func
85
+ await (0, _pMap.default)(projects,
86
+ // eslint-disable-next-line @typescript-eslint/no-loop-func
115
87
  async project => {
116
88
  if (!finishTaskHash[project.name]) {
117
89
  finishTaskHash[project.name] = true;
@@ -123,18 +95,17 @@ class DagOperator {
123
95
  preNodes = [...projects];
124
96
  }
125
97
  }
126
-
127
98
  checkCircle() {
128
99
  // this._sortedProjects = sortProjects(this._projects);
129
100
  this._checkForCyclicDependencies(this._projects, [], new Set());
130
101
  }
131
-
132
102
  async traverseDependenciesToProjectToDependent(name, task, config = {}) {
133
103
  await this.traverseDependenciesToProject(name, task, config);
134
104
  await this.traverseProjectToDependent(name, task, _objectSpread(_objectSpread({}, config), {}, {
135
105
  withSelf: false
136
106
  }));
137
107
  }
108
+
138
109
  /**
139
110
  * 1. 把目标节点当做叶子节点集合 A 中的元素
140
111
  * 2. 当叶子节点集合中某个 a 元素结束任务的时候进行如下操作:
@@ -144,7 +115,6 @@ class DagOperator {
144
115
  * 4. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
145
116
  */
146
117
 
147
-
148
118
  async traverseProjectToDependent(name, task, {
149
119
  withSelf = false,
150
120
  runTaskConcurrency
@@ -152,9 +122,7 @@ class DagOperator {
152
122
  if (!this._projectsMap.has(name)) {
153
123
  (0, _error.errorLog)(`No '${name}' project exist`);
154
124
  }
155
-
156
125
  const traverseTargetNode = this._projectsMap.get(name);
157
-
158
126
  const leafNodeTasks = [withSelf ? this._createTask(traverseTargetNode, task) : async () => Promise.resolve(traverseTargetNode.name)];
159
127
  const taskRunner = new _task.TaskRunner(leafNodeTasks, {
160
128
  concurrency: runTaskConcurrency
@@ -163,12 +131,11 @@ class DagOperator {
163
131
  taskRunner.on(_task.TaskRunner.TASK_FINISH, projectName => {
164
132
  const projectNode = this.getNodeData(projectName);
165
133
  const dependent = projectNode.dependent || [];
166
-
167
134
  for (const dependentProject of dependent) {
168
135
  const dependency = dependentProject.dependency || [];
169
136
  const removeNodes = dependency.filter(dependencyProject => ![projectName, ...dependent.map(p => p.name)].includes(dependencyProject.name));
170
- edgeManager.reduceEdges(dependentProject, removeNodes.length + 1); // 变成叶子节点,就加入执行任务的队列中
171
-
137
+ edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
138
+ // 变成叶子节点,就加入执行任务的队列中
172
139
  if (edgeManager.getEdge(dependentProject) === 0) {
173
140
  taskRunner.addTask(this._createTask(dependentProject, task));
174
141
  }
@@ -176,6 +143,7 @@ class DagOperator {
176
143
  });
177
144
  await taskRunner.run();
178
145
  }
146
+
179
147
  /**
180
148
  * 1. 找到叶子节点集合 A
181
149
  * 2. 找到直接连接叶子节点的节点集合 B
@@ -183,9 +151,8 @@ class DagOperator {
183
151
  * 4. 检查 B 集合中是否存在入度为0的节点,则此节点为叶子节点,并加入叶子节点集合 A
184
152
  * 5. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
185
153
  */
186
- // TODO: 执行顺序还需要再确定一下
187
-
188
154
 
155
+ // TODO: 执行顺序还需要再确定一下
189
156
  async traverseDependenciesToProject(name, task, {
190
157
  withSelf = false,
191
158
  runTaskConcurrency
@@ -193,16 +160,12 @@ class DagOperator {
193
160
  if (!this._projectsMap.has(name)) {
194
161
  (0, _error.errorLog)(`No '${name}' project exist`);
195
162
  }
196
-
197
163
  const traverseTargetNode = this._projectsMap.get(name);
198
-
199
164
  const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
200
-
201
165
  if ((leafNodes === null || leafNodes === void 0 ? void 0 : leafNodes.length) === 0) {
202
166
  await this._createTask(traverseTargetNode, task)();
203
167
  return;
204
168
  }
205
-
206
169
  const leafNodeTasks = leafNodes.map(project => this._createTask(project, task));
207
170
  const taskRunner = new _task.TaskRunner(leafNodeTasks, {
208
171
  concurrency: runTaskConcurrency
@@ -211,20 +174,17 @@ class DagOperator {
211
174
  taskRunner.on(_task.TaskRunner.TASK_FINISH, projectName => {
212
175
  const projectNode = this.getNodeData(projectName);
213
176
  const dependent = projectNode.dependent || [];
214
-
215
177
  for (const dependentProject of dependent) {
216
178
  // 只处理在叶子节点/目标项目的所有依赖集合的节点
217
179
  if (![traverseTargetNode, ...leafNodes].some(n => n.name === dependentProject.name)) {
218
180
  continue;
219
181
  }
220
-
221
182
  edgeManager.reduceOneEdge(dependentProject);
222
-
223
183
  if (dependentProject.name === traverseTargetNode.name && !withSelf) {
224
184
  continue;
225
- } // 变成叶子节点,就加入执行任务的队列中
226
-
185
+ }
227
186
 
187
+ // 变成叶子节点,就加入执行任务的队列中
228
188
  if (edgeManager.getEdge(dependentProject) === 0) {
229
189
  taskRunner.addTask(this._createTask(dependentProject, task));
230
190
  }
@@ -232,6 +192,7 @@ class DagOperator {
232
192
  });
233
193
  await taskRunner.run();
234
194
  }
195
+
235
196
  /**
236
197
  * Copyright (c) Microsoft Corporation. All rights reserved.
237
198
  *
@@ -242,51 +203,39 @@ class DagOperator {
242
203
  /**
243
204
  * Checks for projects that indirectly depend on themselves.
244
205
  */
245
-
246
-
247
206
  _checkForCyclicDependencies(projects, dependencyChain, alreadyCheckedProjects) {
248
207
  for (const project of projects) {
249
208
  if (dependencyChain.includes(project.name)) {
250
209
  throw new Error(`${'A cyclic dependency was encountered:\n'} ${[...dependencyChain, project.name].reverse().join('\n -> ')}\n`);
251
210
  }
252
-
253
211
  if (!alreadyCheckedProjects.has(project.name)) {
254
212
  alreadyCheckedProjects.add(project.name);
255
213
  dependencyChain.push(project.name);
256
-
257
214
  this._checkForCyclicDependencies(project.dependent, dependencyChain, alreadyCheckedProjects);
258
-
259
215
  dependencyChain.pop();
260
216
  }
261
217
  }
262
218
  }
263
-
264
219
  _getDependencyLeafNodes(node) {
265
220
  const dependency = node.dependency;
266
-
267
221
  if (dependency.length === 0) {
268
222
  return [];
269
223
  }
270
-
271
224
  let leafNodes = [...dependency];
272
-
273
225
  for (const dependencyNode of dependency) {
274
226
  leafNodes = [...leafNodes, ...this._getDependencyLeafNodes(dependencyNode)];
275
227
  }
276
-
277
228
  return leafNodes;
278
229
  }
279
-
280
230
  _getProjectPreviousNode(searchProjects, preNodes) {
281
231
  return searchProjects.filter(p => preNodes.map(preP => preP.name).includes(p.name));
282
- } // public async getOrderTasks() {
232
+ }
233
+
234
+ // public async getOrderTasks() {
283
235
  // // Precalculate the number of dependent packages
284
236
  // for (const project of this._projects) {
285
237
  // calculateCriticalPaths(project);
286
238
  // }
287
239
  // }
288
-
289
-
290
240
  }
291
-
292
241
  exports.DagOperator = DagOperator;
@@ -4,38 +4,26 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.TaskRunner = void 0;
7
-
8
7
  var _events = require("events");
9
-
10
8
  var _pMap = _interopRequireDefault(require("p-map"));
11
-
12
9
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13
-
14
10
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
15
-
16
11
  class TaskRunner extends _events.EventEmitter {
17
12
  constructor(tasks, {
18
13
  concurrency
19
14
  }) {
20
15
  super();
21
-
22
16
  _defineProperty(this, "_tasks", void 0);
23
-
24
17
  _defineProperty(this, "_concurrency", void 0);
25
-
26
18
  _defineProperty(this, "_usableConcurrency", void 0);
27
-
28
19
  _defineProperty(this, "_stopFlag", void 0);
29
-
30
20
  this._tasks = tasks;
31
21
  this._concurrency = concurrency || TaskRunner.DefaultConcurrency;
32
22
  this._usableConcurrency = this._concurrency;
33
23
  this._stopFlag = false;
34
24
  }
35
-
36
25
  async run() {
37
26
  const tasks = this._tasks.splice(0, this._concurrency);
38
-
39
27
  this._usableConcurrency = this._concurrency - tasks.length;
40
28
  await (0, _pMap.default)(tasks, async task => {
41
29
  await this._runTask(task);
@@ -43,25 +31,19 @@ class TaskRunner extends _events.EventEmitter {
43
31
  concurrency: tasks.length
44
32
  });
45
33
  }
46
-
47
34
  addTask(task) {
48
35
  this._tasks.push(task);
49
36
  }
50
-
51
37
  async _runTask(task) {
52
38
  if (this._stopFlag) {
53
39
  return;
54
40
  }
55
-
56
41
  const emitValue = await task(this._stopTask.bind(this));
57
42
  this._usableConcurrency--;
58
43
  this.emit(TaskRunner.TASK_FINISH, emitValue);
59
-
60
44
  if (this._tasks.length > 0) {
61
45
  const nextTasks = this._tasks.splice(0, this._usableConcurrency);
62
-
63
46
  this._usableConcurrency -= nextTasks.length;
64
-
65
47
  if (nextTasks.length > 0) {
66
48
  await (0, _pMap.default)(nextTasks, async _task => {
67
49
  await this._runTask(_task);
@@ -71,15 +53,10 @@ class TaskRunner extends _events.EventEmitter {
71
53
  }
72
54
  }
73
55
  }
74
-
75
56
  _stopTask() {
76
57
  this._stopFlag = true;
77
58
  }
78
-
79
59
  }
80
-
81
60
  exports.TaskRunner = TaskRunner;
82
-
83
61
  _defineProperty(TaskRunner, "DefaultConcurrency", 10);
84
-
85
62
  _defineProperty(TaskRunner, "TASK_FINISH", 'task-finish');
@@ -4,30 +4,25 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.sortProjects = exports.recursiveGetDependency = exports.findCircle = exports.calculateCriticalPaths = void 0;
7
-
8
7
  var _error = require("../log/error");
9
-
10
8
  var _edgeManager = require("./edge-manager");
11
-
12
9
  /**
13
10
  * Calculate the number of packages which must be built before we reach
14
11
  * the furthest away "root" node
15
12
  */
16
13
  const calculateCriticalPaths = project => {
17
14
  var _project$dependent;
18
-
19
15
  // Return the memoized value
20
16
  if (project.criticalPathLength !== undefined) {
21
17
  return project.criticalPathLength;
22
- } // If no dependents, we are in a "root"
23
-
18
+ }
24
19
 
20
+ // If no dependents, we are in a "root"
25
21
  if (((_project$dependent = project.dependent) === null || _project$dependent === void 0 ? void 0 : _project$dependent.length) === 0) {
26
22
  project.criticalPathLength = 0;
27
23
  return project.criticalPathLength;
28
24
  } else {
29
25
  var _project$dependent2;
30
-
31
26
  // Otherwise we are as long as the longest package + 1
32
27
  const depsLengths = [];
33
28
  (_project$dependent2 = project.dependent) === null || _project$dependent2 === void 0 ? void 0 : _project$dependent2.forEach(dependentProject => depsLengths.push(calculateCriticalPaths(dependentProject)));
@@ -35,18 +30,14 @@ const calculateCriticalPaths = project => {
35
30
  return project.criticalPathLength;
36
31
  }
37
32
  };
38
-
39
33
  exports.calculateCriticalPaths = calculateCriticalPaths;
40
-
41
34
  const _recursiveGetDependencySkipCircleDeps = node => {
42
35
  let allDeps = [];
43
36
  const foundDepsNameSet = new Set([node.name]);
44
37
  let queue = [node];
45
-
46
38
  while (queue.length > 0) {
47
39
  const checkNode = queue.pop();
48
40
  const checkNodeDeps = checkNode.dependency || [];
49
-
50
41
  if (checkNodeDeps.length > 0) {
51
42
  const willIntoQueue = checkNodeDeps.filter(dep => !foundDepsNameSet.has(dep.name));
52
43
  allDeps = [...allDeps, ...willIntoQueue];
@@ -54,93 +45,75 @@ const _recursiveGetDependencySkipCircleDeps = node => {
54
45
  queue = [...queue, ...willIntoQueue];
55
46
  }
56
47
  }
57
-
58
48
  return allDeps;
59
49
  };
60
-
61
50
  const recursiveGetDependency = (project, skipCircleProjects = false) => {
62
51
  if (skipCircleProjects) {
63
52
  return _recursiveGetDependencySkipCircleDeps(project);
64
53
  }
65
-
66
54
  const dependency = project.dependency || [];
67
55
  let allDependency = [...dependency];
68
-
69
56
  for (const dependencyProject of dependency) {
70
57
  allDependency = [...allDependency, ...recursiveGetDependency(dependencyProject)];
71
58
  }
72
-
73
59
  return allDependency;
74
- }; // 拓扑排序
75
-
60
+ };
76
61
 
62
+ // 拓扑排序
77
63
  exports.recursiveGetDependency = recursiveGetDependency;
78
-
79
64
  const sortProjects = projects => {
80
65
  const sortedQueue = []; // 排好序的队列
81
-
82
66
  let readyIntoSortedQueue = []; // 用来准备放入 sortedQueue的数组
83
-
84
67
  let queue = []; // 用来存放入度为0的节点
85
-
86
- const edgeManager = new _edgeManager.EdgeManager(); // 初始化队列queue
87
-
68
+ const edgeManager = new _edgeManager.EdgeManager();
69
+ // 初始化队列queue
88
70
  for (const project of projects) {
89
- edgeManager.setEdge(project); // 入度为0进队列
71
+ edgeManager.setEdge(project);
72
+ // 入度为0进队列
90
73
  // TODO 可能存在多个 dagNodeFrom === 0 的节点
91
-
92
74
  if (edgeManager.getEdge(project) === 0) {
93
75
  queue.push(project);
94
76
  }
95
- } // 加入最初入度为0的节点
96
-
77
+ }
97
78
 
79
+ // 加入最初入度为0的节点
98
80
  sortedQueue.push([...queue]);
99
81
  let shiftNodesCount = 0; // 计算出队列的节点数量,用于在最后判断是否存在环/依赖循环
100
82
 
101
83
  while (queue.length > 0) {
102
84
  const checkNode = queue.shift();
103
85
  shiftNodesCount++;
104
-
105
86
  for (const toNode of checkNode.dependent) {
106
87
  edgeManager.reduceOneEdge(toNode);
107
-
108
88
  if (edgeManager.getEdge(toNode) === 0) {
109
89
  readyIntoSortedQueue.push(toNode);
110
90
  }
111
91
  }
112
-
113
92
  if (queue.length === 0 && readyIntoSortedQueue.length > 0) {
114
93
  queue = [...readyIntoSortedQueue];
115
94
  sortedQueue.push([...readyIntoSortedQueue]);
116
95
  readyIntoSortedQueue = [];
117
96
  }
118
97
  }
119
-
120
98
  if (shiftNodesCount < projects.length) {
121
99
  (0, _error.errorLog)('Items with a dependency loop');
122
- } else {// console.info('No dependency loop');
100
+ } else {
101
+ // console.info('No dependency loop');
123
102
  }
124
-
125
103
  return sortedQueue;
126
104
  };
127
-
128
105
  exports.sortProjects = sortProjects;
129
-
130
106
  const findCircle = projects => {
131
107
  let result = projects.reduce((circleNodes, project) => {
132
108
  if (project.dependencyEdge > 0) {
133
109
  return [...circleNodes, project];
134
110
  }
135
-
136
111
  return circleNodes;
137
112
  }, []);
138
113
  result = result.sort((a, b) => a.dependencyEdge - b.dependencyEdge);
139
-
140
114
  while (result.length > 0) {
141
115
  const checkNode = result.shift();
142
116
  checkNode.dependencyEdge--;
143
117
  }
144
118
  };
145
-
146
119
  exports.findCircle = findCircle;
@@ -4,19 +4,12 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.runBuildTask = exports.runAllBuildTask = void 0;
7
-
8
7
  var _os = _interopRequireDefault(require("os"));
9
-
10
8
  var _utils = require("@modern-js/utils");
11
-
12
9
  var _checkProjectChange = require("../../projects/check-project-change");
13
-
14
10
  var _error = require("../../log/error");
15
-
16
11
  var _multiTasksLog = require("../../log/multi-tasks-log");
17
-
18
12
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
19
-
20
13
  const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
21
14
  const {
22
15
  rootPath,
@@ -24,38 +17,30 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
24
17
  disableContentHash = false,
25
18
  enableGitHash = false
26
19
  } = config;
27
-
28
20
  const task = async project => {
29
- console.info('run ', project.name); // const taskTimeLog = timeLog.initTimeLog({ scope: '' });
30
-
21
+ console.info('run ', project.name);
22
+ // const taskTimeLog = timeLog.initTimeLog({ scope: '' });
31
23
  if (!disableContentHash) {
32
24
  const changed = await (0, _checkProjectChange.checkProjectChangeByContent)(project);
33
-
34
25
  if (!changed) {
35
26
  console.info(`${project.name} content not change, skip`);
36
27
  return;
37
28
  }
38
29
  }
39
-
40
30
  if (enableGitHash) {
41
31
  const changed = await (0, _checkProjectChange.checkProjectChangeByGit)(project, rootPath);
42
-
43
32
  if (!changed) {
44
33
  console.info(`${project.name} not change, skip`);
45
34
  return;
46
35
  }
47
-
48
36
  console.info(`${project.name} have changed in git history`);
49
37
  }
50
-
51
38
  const cmd = project.extra.scripts || {};
52
-
53
39
  for (const taskCmd of taskCmds) {
54
40
  if (cmd[taskCmd]) {
55
- const prefix = `run ${project.name} ${taskCmd} script`; // timeLog.startTime(taskTimeLog, prefix);
56
-
41
+ const prefix = `run ${project.name} ${taskCmd} script`;
42
+ // timeLog.startTime(taskTimeLog, prefix);
57
43
  _utils.signale.time(prefix);
58
-
59
44
  try {
60
45
  const childProcess = (0, _utils.execa)(packageManager, [taskCmd], {
61
46
  cwd: project.extra.path,
@@ -68,8 +53,8 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
68
53
  label: 'BUILD: '
69
54
  }
70
55
  });
71
- await childProcess; // timeLog.endTime(taskTimeLog, prefix);
72
-
56
+ await childProcess;
57
+ // timeLog.endTime(taskTimeLog, prefix);
73
58
  _utils.signale.timeEnd(prefix);
74
59
  } catch (e) {
75
60
  (0, _error.errorLog)(project.name, e.message);
@@ -79,12 +64,9 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
79
64
  }
80
65
  }
81
66
  };
82
-
83
67
  return task;
84
68
  };
85
-
86
69
  const defaultBuildCmds = ['build'];
87
-
88
70
  const runBuildTask = async (projectName, operator, config, taskCmds = defaultBuildCmds) => {
89
71
  const {
90
72
  withSelf = true,
@@ -93,8 +75,8 @@ const runBuildTask = async (projectName, operator, config, taskCmds = defaultBui
93
75
  withDept = false
94
76
  } = config;
95
77
  const taskLogger = new _multiTasksLog.MultitasksLogger();
96
- const task = createTask(config, taskCmds, taskLogger); // 优先级 onlySelf > withDept、disableWithDeps
97
-
78
+ const task = createTask(config, taskCmds, taskLogger);
79
+ // 优先级 onlySelf > withDept、disableWithDeps
98
80
  if (onlySelf) {
99
81
  await task(operator.getNodeData(projectName, {
100
82
  checkExist: true
@@ -116,13 +98,10 @@ const runBuildTask = async (projectName, operator, config, taskCmds = defaultBui
116
98
  });
117
99
  }
118
100
  };
119
-
120
101
  exports.runBuildTask = runBuildTask;
121
-
122
102
  const runAllBuildTask = async (operator, config, taskCmds = defaultBuildCmds) => {
123
103
  const taskLogger = new _multiTasksLog.MultitasksLogger();
124
104
  const task = createTask(config, taskCmds, taskLogger);
125
105
  await operator.traverseAllNodes(task);
126
106
  };
127
-
128
107
  exports.runAllBuildTask = runAllBuildTask;
@@ -4,34 +4,24 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.runClearTask = exports.defaultRemoveDirs = void 0;
7
-
8
7
  var path = _interopRequireWildcard(require("path"));
9
-
10
8
  var _utils = require("@modern-js/utils");
11
-
12
9
  var _nodeCoreLibrary = require("@rushstack/node-core-library");
13
-
14
10
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
-
16
11
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
-
18
12
  const defaultRemoveDirs = ['node_modules'];
19
13
  exports.defaultRemoveDirs = defaultRemoveDirs;
20
-
21
14
  const runClearTask = (projectNames, projects, config) => {
22
15
  const {
23
16
  removeDirs = defaultRemoveDirs,
24
17
  rootPath
25
18
  } = config;
26
-
27
19
  if (projectNames.length > 0) {
28
20
  projects.forEach(project => {
29
21
  if (projectNames.includes(project.name)) {
30
22
  removeDirs.forEach(dir => {
31
23
  const removePath = path.join(`${project.extra.path}`, dir);
32
-
33
24
  _utils.logger.info(`remove ${removePath}`);
34
-
35
25
  _nodeCoreLibrary.FileSystem.deleteFolder(removePath);
36
26
  });
37
27
  }
@@ -39,21 +29,16 @@ const runClearTask = (projectNames, projects, config) => {
39
29
  } else {
40
30
  removeDirs.forEach(dir => {
41
31
  const removePath = path.join(`${rootPath}`, dir);
42
-
43
32
  _utils.logger.info(`remove ${removePath}`);
44
-
45
33
  _nodeCoreLibrary.FileSystem.deleteFolder(removePath);
46
34
  });
47
35
  projects.forEach(project => {
48
36
  removeDirs.forEach(dir => {
49
37
  const removePath = path.join(`${project.extra.path}`, dir);
50
-
51
38
  _utils.logger.info(`remove ${removePath}`);
52
-
53
39
  _nodeCoreLibrary.FileSystem.deleteFolder(removePath);
54
40
  });
55
41
  });
56
42
  }
57
43
  };
58
-
59
44
  exports.runClearTask = runClearTask;