@modern-js/monorepo-tools 2.0.0-beta.3 → 2.0.0-beta.6

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 (105) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/bin/modern.js +3 -1
  3. package/dist/js/modern/cli/build-watch.js +30 -5
  4. package/dist/js/modern/cli/build.js +31 -5
  5. package/dist/js/modern/cli/clear.js +30 -5
  6. package/dist/js/modern/cli/deploy.js +35 -7
  7. package/dist/js/modern/cli/index.js +1 -1
  8. package/dist/js/modern/cli/install.js +30 -5
  9. package/dist/js/modern/cli/new.js +56 -14
  10. package/dist/js/modern/commands/build-watch.js +32 -18
  11. package/dist/js/modern/commands/build.js +49 -23
  12. package/dist/js/modern/commands/clear.js +31 -15
  13. package/dist/js/modern/commands/deploy.js +38 -24
  14. package/dist/js/modern/commands/index.js +1 -1
  15. package/dist/js/modern/commands/install.js +32 -17
  16. package/dist/js/modern/constants.js +13 -9
  17. package/dist/js/modern/dag/create.js +27 -23
  18. package/dist/js/modern/dag/edge-manager.js +5 -4
  19. package/dist/js/modern/dag/index.js +6 -5
  20. package/dist/js/modern/dag/operator.js +174 -156
  21. package/dist/js/modern/dag/task.js +64 -39
  22. package/dist/js/modern/dag/utils.js +32 -38
  23. package/dist/js/modern/features/build/index.js +47 -28
  24. package/dist/js/modern/features/clear/index.js +16 -15
  25. package/dist/js/modern/features/deploy/index.js +107 -82
  26. package/dist/js/modern/features/dev/cmds.js +4 -3
  27. package/dist/js/modern/features/dev/create-task.js +43 -34
  28. package/dist/js/modern/features/dev/index.js +60 -41
  29. package/dist/js/modern/features/dev/watch-projects-state.js +47 -24
  30. package/dist/js/modern/features/install/index.js +43 -22
  31. package/dist/js/modern/hooks/index.js +6 -3
  32. package/dist/js/modern/index.js +18 -16
  33. package/dist/js/modern/locale/en.js +10 -7
  34. package/dist/js/modern/locale/index.js +6 -6
  35. package/dist/js/modern/locale/zh.js +11 -8
  36. package/dist/js/modern/log/error.js +6 -3
  37. package/dist/js/modern/log/multi-tasks-log.js +25 -34
  38. package/dist/js/modern/log/time.js +26 -11
  39. package/dist/js/modern/log/utils.js +9 -5
  40. package/dist/js/modern/package/index.js +5 -6
  41. package/dist/js/modern/parse-config/index.js +49 -22
  42. package/dist/js/modern/parse-config/monorepo.js +41 -26
  43. package/dist/js/modern/projects/check-project-change.js +59 -30
  44. package/dist/js/modern/projects/clear-memory-files.js +17 -7
  45. package/dist/js/modern/projects/get-projects-by-packages-config.js +89 -52
  46. package/dist/js/modern/projects/get-projects-by-workspace-file.js +68 -32
  47. package/dist/js/modern/projects/get-projects.js +96 -53
  48. package/dist/js/modern/type.js +0 -1
  49. package/dist/js/modern/utils/install.js +36 -19
  50. package/dist/js/modern/utils/language.js +6 -3
  51. package/dist/js/node/cli/build-watch.js +51 -10
  52. package/dist/js/node/cli/build.js +52 -10
  53. package/dist/js/node/cli/clear.js +51 -10
  54. package/dist/js/node/cli/deploy.js +56 -12
  55. package/dist/js/node/cli/index.js +22 -71
  56. package/dist/js/node/cli/install.js +51 -10
  57. package/dist/js/node/cli/new.js +75 -19
  58. package/dist/js/node/commands/build-watch.js +59 -29
  59. package/dist/js/node/commands/build.js +74 -32
  60. package/dist/js/node/commands/clear.js +57 -25
  61. package/dist/js/node/commands/deploy.js +65 -35
  62. package/dist/js/node/commands/index.js +21 -60
  63. package/dist/js/node/commands/install.js +59 -28
  64. package/dist/js/node/constants.js +33 -13
  65. package/dist/js/node/dag/create.js +46 -28
  66. package/dist/js/node/dag/edge-manager.js +25 -8
  67. package/dist/js/node/dag/index.js +30 -13
  68. package/dist/js/node/dag/operator.js +211 -174
  69. package/dist/js/node/dag/task.js +92 -46
  70. package/dist/js/node/dag/utils.js +58 -47
  71. package/dist/js/node/features/build/index.js +84 -47
  72. package/dist/js/node/features/clear/index.js +49 -28
  73. package/dist/js/node/features/deploy/index.js +139 -104
  74. package/dist/js/node/features/dev/cmds.js +26 -9
  75. package/dist/js/node/features/dev/create-task.js +80 -51
  76. package/dist/js/node/features/dev/index.js +98 -58
  77. package/dist/js/node/features/dev/watch-projects-state.js +71 -30
  78. package/dist/js/node/features/install/index.js +82 -41
  79. package/dist/js/node/hooks/index.js +27 -8
  80. package/dist/js/node/index.js +53 -32
  81. package/dist/js/node/locale/en.js +30 -11
  82. package/dist/js/node/locale/index.js +31 -14
  83. package/dist/js/node/locale/zh.js +31 -12
  84. package/dist/js/node/log/error.js +26 -7
  85. package/dist/js/node/log/multi-tasks-log.js +48 -41
  86. package/dist/js/node/log/time.js +47 -18
  87. package/dist/js/node/log/utils.js +30 -10
  88. package/dist/js/node/package/index.js +25 -10
  89. package/dist/js/node/parse-config/index.js +76 -31
  90. package/dist/js/node/parse-config/monorepo.js +79 -44
  91. package/dist/js/node/projects/check-project-change.js +104 -56
  92. package/dist/js/node/projects/clear-memory-files.js +42 -15
  93. package/dist/js/node/projects/get-projects-by-packages-config.js +119 -65
  94. package/dist/js/node/projects/get-projects-by-workspace-file.js +108 -55
  95. package/dist/js/node/projects/get-projects.js +112 -61
  96. package/dist/js/node/type.js +15 -5
  97. package/dist/js/node/utils/install.js +68 -31
  98. package/dist/js/node/utils/language.js +28 -8
  99. package/dist/js/node/utils/types.js +15 -0
  100. package/dist/types/dag/operator.d.ts +3 -0
  101. package/dist/types/dag/utils.d.ts +1 -0
  102. package/dist/types/features/dev/index.d.ts +1 -0
  103. package/dist/types/index.d.ts +2 -0
  104. package/dist/types/projects/get-projects.d.ts +1 -0
  105. package/package.json +12 -19
@@ -1,27 +1,77 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __defProps = Object.defineProperties;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
6
+ var __getOwnPropNames = Object.getOwnPropertyNames;
7
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
8
+ var __getProtoOf = Object.getPrototypeOf;
9
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
10
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
11
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
12
+ var __spreadValues = (a, b) => {
13
+ for (var prop in b || (b = {}))
14
+ if (__hasOwnProp.call(b, prop))
15
+ __defNormalProp(a, prop, b[prop]);
16
+ if (__getOwnPropSymbols)
17
+ for (var prop of __getOwnPropSymbols(b)) {
18
+ if (__propIsEnum.call(b, prop))
19
+ __defNormalProp(a, prop, b[prop]);
20
+ }
21
+ return a;
22
+ };
23
+ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
24
+ var __export = (target, all) => {
25
+ for (var name in all)
26
+ __defProp(target, name, { get: all[name], enumerable: true });
27
+ };
28
+ var __copyProps = (to, from, except, desc) => {
29
+ if (from && typeof from === "object" || typeof from === "function") {
30
+ for (let key of __getOwnPropNames(from))
31
+ if (!__hasOwnProp.call(to, key) && key !== except)
32
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
33
+ }
34
+ return to;
35
+ };
36
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
37
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
38
+ mod
39
+ ));
40
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
41
+ var __async = (__this, __arguments, generator) => {
42
+ return new Promise((resolve, reject) => {
43
+ var fulfilled = (value) => {
44
+ try {
45
+ step(generator.next(value));
46
+ } catch (e) {
47
+ reject(e);
48
+ }
49
+ };
50
+ var rejected = (value) => {
51
+ try {
52
+ step(generator.throw(value));
53
+ } catch (e) {
54
+ reject(e);
55
+ }
56
+ };
57
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
58
+ step((generator = generator.apply(__this, __arguments)).next());
59
+ });
60
+ };
61
+ var operator_exports = {};
62
+ __export(operator_exports, {
63
+ DagOperator: () => DagOperator
5
64
  });
6
- exports.DagOperator = void 0;
7
- var _pMap = _interopRequireDefault(require("p-map"));
8
- var _error = require("../log/error");
9
- var _task = require("./task");
10
- var _edgeManager = require("./edge-manager");
11
- var _utils = require("./utils");
12
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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; }
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; }
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; }
65
+ module.exports = __toCommonJS(operator_exports);
66
+ var import_p_map = __toESM(require("p-map"));
67
+ var import_error = require("../log/error");
68
+ var import_task = require("./task");
69
+ var import_edge_manager = require("./edge-manager");
70
+ var import_utils = require("./utils");
16
71
  class DagOperator {
17
- // 排序好的项目列表
18
-
19
72
  constructor(projects, projectsMap) {
20
- _defineProperty(this, "_projects", void 0);
21
- _defineProperty(this, "_projectsMap", void 0);
22
- _defineProperty(this, "_sortedProjects", void 0);
23
- _defineProperty(this, "_createTask", (project, task) => async (stopTask = () => undefined) => {
24
- await task(project, project.dependency || [], () => stopTask());
73
+ this._createTask = (project, task) => (stopTask = () => void 0) => __async(this, null, function* () {
74
+ yield task(project, project.dependency || [], () => stopTask());
25
75
  return project.name;
26
76
  });
27
77
  this._projects = projects;
@@ -31,187 +81,173 @@ class DagOperator {
31
81
  checkNodeDataExist(name) {
32
82
  return this._projectsMap.has(name);
33
83
  }
34
- getNodeData(name, option = {
35
- checkExist: false
36
- }) {
84
+ getNodeData(name, option = { checkExist: false }) {
37
85
  if (option.checkExist) {
38
86
  if (this._projectsMap.has(name)) {
39
87
  return this._projectsMap.get(name);
40
88
  } else {
41
- (0, _error.errorLog)(`No '${name}' project exist`);
89
+ (0, import_error.errorLog)(`No '${name}' project exist`);
42
90
  }
43
91
  }
44
92
  return this._projectsMap.get(name);
45
93
  }
46
94
  getNodeDependencyData(name) {
47
- var _this$_projectsMap$ge;
48
- return ((_this$_projectsMap$ge = this._projectsMap.get(name)) === null || _this$_projectsMap$ge === void 0 ? void 0 : _this$_projectsMap$ge.dependency) || [];
95
+ var _a;
96
+ return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependency) || [];
49
97
  }
50
98
  getNodeDependentData(name) {
51
- var _this$_projectsMap$ge2;
52
- return ((_this$_projectsMap$ge2 = this._projectsMap.get(name)) === null || _this$_projectsMap$ge2 === void 0 ? void 0 : _this$_projectsMap$ge2.dependent) || [];
53
- }
54
- getNodeAllDependencyData(name, option = {
55
- skipCircleCheck: false
56
- }) {
57
- const {
58
- skipCircleCheck
59
- } = option;
99
+ var _a;
100
+ return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependent) || [];
101
+ }
102
+ getNodeAllDependencyData(name, option = { skipCircleCheck: false }) {
103
+ const { skipCircleCheck } = option;
60
104
  if (!skipCircleCheck) {
61
105
  this.checkCircle();
62
106
  }
63
107
  if (!this._projectsMap.has(name)) {
64
- (0, _error.errorLog)(`No '${name}' project exist`);
108
+ (0, import_error.errorLog)(`No '${name}' project exist`);
65
109
  }
66
110
  const currentNode = this._projectsMap.get(name);
67
- return (0, _utils.recursiveGetDependency)(currentNode, skipCircleCheck);
111
+ return (0, import_utils.recursiveGetDependency)(currentNode, skipCircleCheck);
68
112
  }
69
113
  setNodeData(name, task) {
70
114
  if (this._projectsMap.has(name)) {
71
115
  task(this._projectsMap.get(name));
72
116
  } else {
73
- (0, _error.errorLog)(`No '${name}' project exist`);
117
+ (0, import_error.errorLog)(`No '${name}' project exist`);
74
118
  }
75
119
  }
76
- async traverseAllNodes(task) {
77
- const sortedNodes = this._sortedProjects.length > 0 ? this._sortedProjects : (0, _utils.sortProjects)(this._projects);
78
- const finishTaskHash = {};
79
- let preNodes = [];
80
- let earlyFinish = false;
81
- for (const projects of sortedNodes) {
82
- if (earlyFinish) {
83
- break;
84
- }
85
- await (0, _pMap.default)(projects,
86
- // eslint-disable-next-line @typescript-eslint/no-loop-func
87
- async project => {
88
- if (!finishTaskHash[project.name]) {
89
- finishTaskHash[project.name] = true;
90
- await task(project, this._getProjectPreviousNode(project.dependent || [], preNodes), () => earlyFinish = true);
120
+ traverseAllNodes(task) {
121
+ return __async(this, null, function* () {
122
+ const sortedNodes = this._sortedProjects.length > 0 ? this._sortedProjects : (0, import_utils.sortProjects)(this._projects);
123
+ const finishTaskHash = {};
124
+ let preNodes = [];
125
+ let earlyFinish = false;
126
+ for (const projects of sortedNodes) {
127
+ if (earlyFinish) {
128
+ break;
91
129
  }
92
- }, {
93
- concurrency: projects.length
94
- });
95
- preNodes = [...projects];
96
- }
130
+ yield (0, import_p_map.default)(
131
+ projects,
132
+ (project) => __async(this, null, function* () {
133
+ if (!finishTaskHash[project.name]) {
134
+ finishTaskHash[project.name] = true;
135
+ yield task(
136
+ project,
137
+ this._getProjectPreviousNode(project.dependent || [], preNodes),
138
+ () => earlyFinish = true
139
+ );
140
+ }
141
+ }),
142
+ { concurrency: projects.length }
143
+ );
144
+ preNodes = [...projects];
145
+ }
146
+ });
97
147
  }
98
148
  checkCircle() {
99
- // this._sortedProjects = sortProjects(this._projects);
100
- this._checkForCyclicDependencies(this._projects, [], new Set());
101
- }
102
- async traverseDependenciesToProjectToDependent(name, task, config = {}) {
103
- await this.traverseDependenciesToProject(name, task, config);
104
- await this.traverseProjectToDependent(name, task, _objectSpread(_objectSpread({}, config), {}, {
105
- withSelf: false
106
- }));
107
- }
108
-
109
- /**
110
- * 1. 把目标节点当做叶子节点集合 A 中的元素
111
- * 2. 当叶子节点集合中某个 a 元素结束任务的时候进行如下操作:
112
- * 2.1 剪(去额外的)枝:获取 a 元素的 dependent集合,将该集合中元素的依赖列表进行过滤,过滤条件为:排除 a 以及 a 元素的 dependent集合以外的元素。
113
- * 2.2 入度减一:对 a 元素的 dependent 集合元素的 dependencyEdge 减一
114
- * 3. 检查是否存在 dependencyEdge === 0 的节点,加入叶子节点集合 A中。
115
- * 4. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
116
- */
117
-
118
- async traverseProjectToDependent(name, task, {
119
- withSelf = false,
120
- runTaskConcurrency
121
- } = {}) {
122
- if (!this._projectsMap.has(name)) {
123
- (0, _error.errorLog)(`No '${name}' project exist`);
124
- }
125
- const traverseTargetNode = this._projectsMap.get(name);
126
- const leafNodeTasks = [withSelf ? this._createTask(traverseTargetNode, task) : async () => Promise.resolve(traverseTargetNode.name)];
127
- const taskRunner = new _task.TaskRunner(leafNodeTasks, {
128
- concurrency: runTaskConcurrency
149
+ this._checkForCyclicDependencies(this._projects, [], /* @__PURE__ */ new Set());
150
+ }
151
+ traverseDependenciesToProjectToDependent(_0, _1) {
152
+ return __async(this, arguments, function* (name, task, config = {}) {
153
+ yield this.traverseDependenciesToProject(name, task, config);
154
+ yield this.traverseProjectToDependent(name, task, __spreadProps(__spreadValues({}, config), {
155
+ withSelf: false
156
+ }));
129
157
  });
130
- const edgeManager = new _edgeManager.EdgeManager();
131
- taskRunner.on(_task.TaskRunner.TASK_FINISH, projectName => {
132
- const projectNode = this.getNodeData(projectName);
133
- const dependent = projectNode.dependent || [];
134
- for (const dependentProject of dependent) {
135
- const dependency = dependentProject.dependency || [];
136
- const removeNodes = dependency.filter(dependencyProject => ![projectName, ...dependent.map(p => p.name)].includes(dependencyProject.name));
137
- edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
138
- // 变成叶子节点,就加入执行任务的队列中
139
- if (edgeManager.getEdge(dependentProject) === 0) {
140
- taskRunner.addTask(this._createTask(dependentProject, task));
141
- }
158
+ }
159
+ traverseProjectToDependent(_0, _1) {
160
+ return __async(this, arguments, function* (name, task, { withSelf = false, runTaskConcurrency } = {}) {
161
+ if (!this._projectsMap.has(name)) {
162
+ (0, import_error.errorLog)(`No '${name}' project exist`);
142
163
  }
143
- });
144
- await taskRunner.run();
145
- }
146
-
147
- /**
148
- * 1. 找到叶子节点集合 A
149
- * 2. 找到直接连接叶子节点的节点集合 B
150
- * 3. 当有某个叶子节点结束任务,则对该节点的直接连接的节点(或者理解成dependent)的枝数(或者叫入度)减一。
151
- * 4. 检查 B 集合中是否存在入度为0的节点,则此节点为叶子节点,并加入叶子节点集合 A
152
- * 5. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
153
- */
154
-
155
- // TODO: 执行顺序还需要再确定一下
156
- async traverseDependenciesToProject(name, task, {
157
- withSelf = false,
158
- runTaskConcurrency
159
- } = {}) {
160
- if (!this._projectsMap.has(name)) {
161
- (0, _error.errorLog)(`No '${name}' project exist`);
162
- }
163
- const traverseTargetNode = this._projectsMap.get(name);
164
- const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
165
- if ((leafNodes === null || leafNodes === void 0 ? void 0 : leafNodes.length) === 0) {
166
- await this._createTask(traverseTargetNode, task)();
167
- return;
168
- }
169
- const leafNodeTasks = leafNodes.map(project => this._createTask(project, task));
170
- const taskRunner = new _task.TaskRunner(leafNodeTasks, {
171
- concurrency: runTaskConcurrency
172
- });
173
- const edgeManager = new _edgeManager.EdgeManager();
174
- taskRunner.on(_task.TaskRunner.TASK_FINISH, projectName => {
175
- const projectNode = this.getNodeData(projectName);
176
- const dependent = projectNode.dependent || [];
177
- for (const dependentProject of dependent) {
178
- // 只处理在叶子节点/目标项目的所有依赖集合的节点
179
- if (![traverseTargetNode, ...leafNodes].some(n => n.name === dependentProject.name)) {
180
- continue;
181
- }
182
- edgeManager.reduceOneEdge(dependentProject);
183
- if (dependentProject.name === traverseTargetNode.name && !withSelf) {
184
- continue;
185
- }
186
-
187
- // 变成叶子节点,就加入执行任务的队列中
188
- if (edgeManager.getEdge(dependentProject) === 0) {
189
- taskRunner.addTask(this._createTask(dependentProject, task));
164
+ const traverseTargetNode = this._projectsMap.get(name);
165
+ const leafNodeTasks = [
166
+ withSelf ? this._createTask(traverseTargetNode, task) : () => __async(this, null, function* () {
167
+ return Promise.resolve(traverseTargetNode.name);
168
+ })
169
+ ];
170
+ const taskRunner = new import_task.TaskRunner(leafNodeTasks, {
171
+ concurrency: runTaskConcurrency
172
+ });
173
+ const edgeManager = new import_edge_manager.EdgeManager();
174
+ taskRunner.on(import_task.TaskRunner.TASK_FINISH, (projectName) => {
175
+ const projectNode = this.getNodeData(projectName);
176
+ const dependent = projectNode.dependent || [];
177
+ for (const dependentProject of dependent) {
178
+ const dependency = dependentProject.dependency || [];
179
+ const removeNodes = dependency.filter(
180
+ (dependencyProject) => ![projectName, ...dependent.map((p) => p.name)].includes(
181
+ dependencyProject.name
182
+ )
183
+ );
184
+ edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
185
+ if (edgeManager.getEdge(dependentProject) === 0) {
186
+ taskRunner.addTask(this._createTask(dependentProject, task));
187
+ }
190
188
  }
189
+ });
190
+ yield taskRunner.run();
191
+ });
192
+ }
193
+ traverseDependenciesToProject(_0, _1) {
194
+ return __async(this, arguments, function* (name, task, { withSelf = false, runTaskConcurrency } = {}) {
195
+ if (!this._projectsMap.has(name)) {
196
+ (0, import_error.errorLog)(`No '${name}' project exist`);
197
+ }
198
+ const traverseTargetNode = this._projectsMap.get(name);
199
+ const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
200
+ if ((leafNodes == null ? void 0 : leafNodes.length) === 0) {
201
+ yield this._createTask(traverseTargetNode, task)();
202
+ return;
191
203
  }
204
+ const leafNodeTasks = leafNodes.map(
205
+ (project) => this._createTask(project, task)
206
+ );
207
+ const taskRunner = new import_task.TaskRunner(leafNodeTasks, {
208
+ concurrency: runTaskConcurrency
209
+ });
210
+ const edgeManager = new import_edge_manager.EdgeManager();
211
+ taskRunner.on(import_task.TaskRunner.TASK_FINISH, (projectName) => {
212
+ const projectNode = this.getNodeData(projectName);
213
+ const dependent = projectNode.dependent || [];
214
+ for (const dependentProject of dependent) {
215
+ if (![traverseTargetNode, ...leafNodes].some(
216
+ (n) => n.name === dependentProject.name
217
+ )) {
218
+ continue;
219
+ }
220
+ edgeManager.reduceOneEdge(dependentProject);
221
+ if (dependentProject.name === traverseTargetNode.name && !withSelf) {
222
+ continue;
223
+ }
224
+ if (edgeManager.getEdge(dependentProject) === 0) {
225
+ taskRunner.addTask(this._createTask(dependentProject, task));
226
+ }
227
+ }
228
+ });
229
+ yield taskRunner.run();
192
230
  });
193
- await taskRunner.run();
194
- }
195
-
196
- /**
197
- * Copyright (c) Microsoft Corporation. All rights reserved.
198
- *
199
- * This source code is licensed under the MIT license found in the
200
- * LICENSE file at
201
- * https://github.com/microsoft/rushstack/blob/master/apps/rush-lib/LICENSE
202
- *
203
- /**
204
- * Checks for projects that indirectly depend on themselves.
205
- */
231
+ }
206
232
  _checkForCyclicDependencies(projects, dependencyChain, alreadyCheckedProjects) {
207
233
  for (const project of projects) {
208
234
  if (dependencyChain.includes(project.name)) {
209
- throw new Error(`${'A cyclic dependency was encountered:\n'} ${[...dependencyChain, project.name].reverse().join('\n -> ')}\n`);
235
+ throw new Error(
236
+ `${"A cyclic dependency was encountered:\n"} ${[
237
+ ...dependencyChain,
238
+ project.name
239
+ ].reverse().join("\n -> ")}
240
+ `
241
+ );
210
242
  }
211
243
  if (!alreadyCheckedProjects.has(project.name)) {
212
244
  alreadyCheckedProjects.add(project.name);
213
245
  dependencyChain.push(project.name);
214
- this._checkForCyclicDependencies(project.dependent, dependencyChain, alreadyCheckedProjects);
246
+ this._checkForCyclicDependencies(
247
+ project.dependent,
248
+ dependencyChain,
249
+ alreadyCheckedProjects
250
+ );
215
251
  dependencyChain.pop();
216
252
  }
217
253
  }
@@ -223,19 +259,20 @@ class DagOperator {
223
259
  }
224
260
  let leafNodes = [...dependency];
225
261
  for (const dependencyNode of dependency) {
226
- leafNodes = [...leafNodes, ...this._getDependencyLeafNodes(dependencyNode)];
262
+ leafNodes = [
263
+ ...leafNodes,
264
+ ...this._getDependencyLeafNodes(dependencyNode)
265
+ ];
227
266
  }
228
267
  return leafNodes;
229
268
  }
230
269
  _getProjectPreviousNode(searchProjects, preNodes) {
231
- return searchProjects.filter(p => preNodes.map(preP => preP.name).includes(p.name));
232
- }
233
-
234
- // public async getOrderTasks() {
235
- // // Precalculate the number of dependent packages
236
- // for (const project of this._projects) {
237
- // calculateCriticalPaths(project);
238
- // }
239
- // }
270
+ return searchProjects.filter(
271
+ (p) => preNodes.map((preP) => preP.name).includes(p.name)
272
+ );
273
+ }
240
274
  }
241
- exports.DagOperator = DagOperator;
275
+ // Annotate the CommonJS export names for ESM import in node:
276
+ 0 && (module.exports = {
277
+ DagOperator
278
+ });
@@ -1,62 +1,108 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
1
+ var __create = Object.create;
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __getProtoOf = Object.getPrototypeOf;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
20
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
21
+ mod
22
+ ));
23
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
24
+ var __async = (__this, __arguments, generator) => {
25
+ return new Promise((resolve, reject) => {
26
+ var fulfilled = (value) => {
27
+ try {
28
+ step(generator.next(value));
29
+ } catch (e) {
30
+ reject(e);
31
+ }
32
+ };
33
+ var rejected = (value) => {
34
+ try {
35
+ step(generator.throw(value));
36
+ } catch (e) {
37
+ reject(e);
38
+ }
39
+ };
40
+ var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
41
+ step((generator = generator.apply(__this, __arguments)).next());
42
+ });
43
+ };
44
+ var task_exports = {};
45
+ __export(task_exports, {
46
+ TaskRunner: () => TaskRunner
5
47
  });
6
- exports.TaskRunner = void 0;
7
- var _events = require("events");
8
- var _pMap = _interopRequireDefault(require("p-map"));
9
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
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; }
11
- class TaskRunner extends _events.EventEmitter {
12
- constructor(tasks, {
13
- concurrency
14
- }) {
48
+ module.exports = __toCommonJS(task_exports);
49
+ var import_events = require("events");
50
+ var import_p_map = __toESM(require("p-map"));
51
+ const _TaskRunner = class extends import_events.EventEmitter {
52
+ constructor(tasks, { concurrency }) {
15
53
  super();
16
- _defineProperty(this, "_tasks", void 0);
17
- _defineProperty(this, "_concurrency", void 0);
18
- _defineProperty(this, "_usableConcurrency", void 0);
19
- _defineProperty(this, "_stopFlag", void 0);
20
54
  this._tasks = tasks;
21
- this._concurrency = concurrency || TaskRunner.DefaultConcurrency;
55
+ this._concurrency = concurrency || _TaskRunner.DefaultConcurrency;
22
56
  this._usableConcurrency = this._concurrency;
23
57
  this._stopFlag = false;
24
58
  }
25
- async run() {
26
- const tasks = this._tasks.splice(0, this._concurrency);
27
- this._usableConcurrency = this._concurrency - tasks.length;
28
- await (0, _pMap.default)(tasks, async task => {
29
- await this._runTask(task);
30
- }, {
31
- concurrency: tasks.length
59
+ run() {
60
+ return __async(this, null, function* () {
61
+ const tasks = this._tasks.splice(0, this._concurrency);
62
+ this._usableConcurrency = this._concurrency - tasks.length;
63
+ yield (0, import_p_map.default)(
64
+ tasks,
65
+ (task) => __async(this, null, function* () {
66
+ yield this._runTask(task);
67
+ }),
68
+ { concurrency: tasks.length }
69
+ );
32
70
  });
33
71
  }
34
72
  addTask(task) {
35
73
  this._tasks.push(task);
36
74
  }
37
- async _runTask(task) {
38
- if (this._stopFlag) {
39
- return;
40
- }
41
- const emitValue = await task(this._stopTask.bind(this));
42
- this._usableConcurrency--;
43
- this.emit(TaskRunner.TASK_FINISH, emitValue);
44
- if (this._tasks.length > 0) {
45
- const nextTasks = this._tasks.splice(0, this._usableConcurrency);
46
- this._usableConcurrency -= nextTasks.length;
47
- if (nextTasks.length > 0) {
48
- await (0, _pMap.default)(nextTasks, async _task => {
49
- await this._runTask(_task);
50
- }, {
51
- concurrency: nextTasks.length
52
- });
75
+ _runTask(task) {
76
+ return __async(this, null, function* () {
77
+ if (this._stopFlag) {
78
+ return;
53
79
  }
54
- }
80
+ const emitValue = yield task(this._stopTask.bind(this));
81
+ this._usableConcurrency--;
82
+ this.emit(_TaskRunner.TASK_FINISH, emitValue);
83
+ if (this._tasks.length > 0) {
84
+ const nextTasks = this._tasks.splice(0, this._usableConcurrency);
85
+ this._usableConcurrency -= nextTasks.length;
86
+ if (nextTasks.length > 0) {
87
+ yield (0, import_p_map.default)(
88
+ nextTasks,
89
+ (_task) => __async(this, null, function* () {
90
+ yield this._runTask(_task);
91
+ }),
92
+ { concurrency: nextTasks.length }
93
+ );
94
+ }
95
+ }
96
+ });
55
97
  }
56
98
  _stopTask() {
57
99
  this._stopFlag = true;
58
100
  }
59
- }
60
- exports.TaskRunner = TaskRunner;
61
- _defineProperty(TaskRunner, "DefaultConcurrency", 10);
62
- _defineProperty(TaskRunner, "TASK_FINISH", 'task-finish');
101
+ };
102
+ let TaskRunner = _TaskRunner;
103
+ TaskRunner.DefaultConcurrency = 10;
104
+ TaskRunner.TASK_FINISH = "task-finish";
105
+ // Annotate the CommonJS export names for ESM import in node:
106
+ 0 && (module.exports = {
107
+ TaskRunner
108
+ });