@modern-js/monorepo-tools 2.0.0-beta.2 → 2.0.0-beta.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.
- package/CHANGELOG.md +99 -0
- package/bin/modern.js +3 -1
- package/dist/js/modern/cli/build-watch.js +30 -5
- package/dist/js/modern/cli/build.js +31 -5
- package/dist/js/modern/cli/clear.js +30 -5
- package/dist/js/modern/cli/deploy.js +35 -7
- package/dist/js/modern/cli/index.js +1 -1
- package/dist/js/modern/cli/install.js +30 -5
- package/dist/js/modern/cli/new.js +56 -14
- package/dist/js/modern/commands/build-watch.js +32 -18
- package/dist/js/modern/commands/build.js +49 -23
- package/dist/js/modern/commands/clear.js +31 -15
- package/dist/js/modern/commands/deploy.js +38 -24
- package/dist/js/modern/commands/index.js +1 -1
- package/dist/js/modern/commands/install.js +32 -17
- package/dist/js/modern/constants.js +13 -9
- package/dist/js/modern/dag/create.js +27 -23
- package/dist/js/modern/dag/edge-manager.js +5 -4
- package/dist/js/modern/dag/index.js +6 -5
- package/dist/js/modern/dag/operator.js +174 -156
- package/dist/js/modern/dag/task.js +64 -39
- package/dist/js/modern/dag/utils.js +32 -38
- package/dist/js/modern/features/build/index.js +47 -28
- package/dist/js/modern/features/clear/index.js +16 -15
- package/dist/js/modern/features/deploy/index.js +107 -82
- package/dist/js/modern/features/dev/cmds.js +4 -3
- package/dist/js/modern/features/dev/create-task.js +43 -34
- package/dist/js/modern/features/dev/index.js +60 -41
- package/dist/js/modern/features/dev/watch-projects-state.js +47 -24
- package/dist/js/modern/features/install/index.js +43 -22
- package/dist/js/modern/hooks/index.js +6 -3
- package/dist/js/modern/index.js +18 -16
- package/dist/js/modern/locale/en.js +10 -7
- package/dist/js/modern/locale/index.js +6 -6
- package/dist/js/modern/locale/zh.js +11 -8
- package/dist/js/modern/log/error.js +6 -3
- package/dist/js/modern/log/multi-tasks-log.js +25 -34
- package/dist/js/modern/log/time.js +26 -11
- package/dist/js/modern/log/utils.js +9 -5
- package/dist/js/modern/package/index.js +5 -6
- package/dist/js/modern/parse-config/index.js +49 -22
- package/dist/js/modern/parse-config/monorepo.js +41 -26
- package/dist/js/modern/projects/check-project-change.js +59 -30
- package/dist/js/modern/projects/clear-memory-files.js +17 -7
- package/dist/js/modern/projects/get-projects-by-packages-config.js +89 -52
- package/dist/js/modern/projects/get-projects-by-workspace-file.js +68 -32
- package/dist/js/modern/projects/get-projects.js +96 -53
- package/dist/js/modern/type.js +0 -1
- package/dist/js/modern/utils/install.js +36 -19
- package/dist/js/modern/utils/language.js +6 -3
- package/dist/js/node/cli/build-watch.js +47 -10
- package/dist/js/node/cli/build.js +48 -10
- package/dist/js/node/cli/clear.js +47 -10
- package/dist/js/node/cli/deploy.js +52 -12
- package/dist/js/node/cli/index.js +22 -71
- package/dist/js/node/cli/install.js +47 -10
- package/dist/js/node/cli/new.js +73 -19
- package/dist/js/node/commands/build-watch.js +55 -29
- package/dist/js/node/commands/build.js +72 -32
- package/dist/js/node/commands/clear.js +53 -25
- package/dist/js/node/commands/deploy.js +61 -35
- package/dist/js/node/commands/index.js +21 -60
- package/dist/js/node/commands/install.js +55 -28
- package/dist/js/node/constants.js +28 -13
- package/dist/js/node/dag/create.js +44 -28
- package/dist/js/node/dag/edge-manager.js +21 -8
- package/dist/js/node/dag/index.js +26 -13
- package/dist/js/node/dag/operator.js +209 -174
- package/dist/js/node/dag/task.js +88 -46
- package/dist/js/node/dag/utils.js +51 -47
- package/dist/js/node/features/build/index.js +79 -47
- package/dist/js/node/features/clear/index.js +44 -28
- package/dist/js/node/features/deploy/index.js +135 -104
- package/dist/js/node/features/dev/cmds.js +22 -9
- package/dist/js/node/features/dev/create-task.js +75 -51
- package/dist/js/node/features/dev/index.js +94 -58
- package/dist/js/node/features/dev/watch-projects-state.js +69 -30
- package/dist/js/node/features/install/index.js +78 -41
- package/dist/js/node/hooks/index.js +23 -8
- package/dist/js/node/index.js +51 -32
- package/dist/js/node/locale/en.js +26 -11
- package/dist/js/node/locale/index.js +27 -15
- package/dist/js/node/locale/zh.js +27 -12
- package/dist/js/node/log/error.js +22 -7
- package/dist/js/node/log/multi-tasks-log.js +44 -41
- package/dist/js/node/log/time.js +43 -18
- package/dist/js/node/log/utils.js +26 -10
- package/dist/js/node/package/index.js +21 -10
- package/dist/js/node/parse-config/index.js +73 -30
- package/dist/js/node/parse-config/monorepo.js +71 -44
- package/dist/js/node/projects/check-project-change.js +96 -56
- package/dist/js/node/projects/clear-memory-files.js +38 -15
- package/dist/js/node/projects/get-projects-by-packages-config.js +116 -65
- package/dist/js/node/projects/get-projects-by-workspace-file.js +103 -55
- package/dist/js/node/projects/get-projects.js +109 -61
- package/dist/js/node/type.js +0 -5
- package/dist/js/node/utils/install.js +63 -31
- package/dist/js/node/utils/language.js +24 -8
- package/dist/types/dag/operator.d.ts +3 -0
- package/dist/types/dag/utils.d.ts +1 -0
- package/dist/types/features/dev/index.d.ts +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/projects/get-projects.d.ts +1 -0
- package/package.json +12 -19
|
@@ -1,27 +1,79 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.
|
|
4
|
-
|
|
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 stdin_exports = {};
|
|
25
|
+
__export(stdin_exports, {
|
|
26
|
+
DagOperator: () => DagOperator
|
|
5
27
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
28
|
+
module.exports = __toCommonJS(stdin_exports);
|
|
29
|
+
var import_p_map = __toESM(require("p-map"));
|
|
30
|
+
var import_error = require("../log/error");
|
|
31
|
+
var import_task = require("./task");
|
|
32
|
+
var import_edge_manager = require("./edge-manager");
|
|
33
|
+
var import_utils = require("./utils");
|
|
34
|
+
var __defProp2 = Object.defineProperty;
|
|
35
|
+
var __defProps = Object.defineProperties;
|
|
36
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
37
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
38
|
+
var __hasOwnProp2 = Object.prototype.hasOwnProperty;
|
|
39
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
40
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp2(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
41
|
+
var __spreadValues = (a, b) => {
|
|
42
|
+
for (var prop in b || (b = {}))
|
|
43
|
+
if (__hasOwnProp2.call(b, prop))
|
|
44
|
+
__defNormalProp(a, prop, b[prop]);
|
|
45
|
+
if (__getOwnPropSymbols)
|
|
46
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
47
|
+
if (__propIsEnum.call(b, prop))
|
|
48
|
+
__defNormalProp(a, prop, b[prop]);
|
|
49
|
+
}
|
|
50
|
+
return a;
|
|
51
|
+
};
|
|
52
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
53
|
+
var __async = (__this, __arguments, generator) => {
|
|
54
|
+
return new Promise((resolve, reject) => {
|
|
55
|
+
var fulfilled = (value) => {
|
|
56
|
+
try {
|
|
57
|
+
step(generator.next(value));
|
|
58
|
+
} catch (e) {
|
|
59
|
+
reject(e);
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
var rejected = (value) => {
|
|
63
|
+
try {
|
|
64
|
+
step(generator.throw(value));
|
|
65
|
+
} catch (e) {
|
|
66
|
+
reject(e);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
70
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
71
|
+
});
|
|
72
|
+
};
|
|
16
73
|
class DagOperator {
|
|
17
|
-
// 排序好的项目列表
|
|
18
|
-
|
|
19
74
|
constructor(projects, projectsMap) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
_defineProperty(this, "_sortedProjects", void 0);
|
|
23
|
-
_defineProperty(this, "_createTask", (project, task) => async (stopTask = () => undefined) => {
|
|
24
|
-
await task(project, project.dependency || [], () => stopTask());
|
|
75
|
+
this._createTask = (project, task) => (stopTask = () => void 0) => __async(this, null, function* () {
|
|
76
|
+
yield task(project, project.dependency || [], () => stopTask());
|
|
25
77
|
return project.name;
|
|
26
78
|
});
|
|
27
79
|
this._projects = projects;
|
|
@@ -31,187 +83,173 @@ class DagOperator {
|
|
|
31
83
|
checkNodeDataExist(name) {
|
|
32
84
|
return this._projectsMap.has(name);
|
|
33
85
|
}
|
|
34
|
-
getNodeData(name, option = {
|
|
35
|
-
checkExist: false
|
|
36
|
-
}) {
|
|
86
|
+
getNodeData(name, option = { checkExist: false }) {
|
|
37
87
|
if (option.checkExist) {
|
|
38
88
|
if (this._projectsMap.has(name)) {
|
|
39
89
|
return this._projectsMap.get(name);
|
|
40
90
|
} else {
|
|
41
|
-
(0,
|
|
91
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
42
92
|
}
|
|
43
93
|
}
|
|
44
94
|
return this._projectsMap.get(name);
|
|
45
95
|
}
|
|
46
96
|
getNodeDependencyData(name) {
|
|
47
|
-
var
|
|
48
|
-
return ((
|
|
97
|
+
var _a;
|
|
98
|
+
return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependency) || [];
|
|
49
99
|
}
|
|
50
100
|
getNodeDependentData(name) {
|
|
51
|
-
var
|
|
52
|
-
return ((
|
|
53
|
-
}
|
|
54
|
-
getNodeAllDependencyData(name, option = {
|
|
55
|
-
skipCircleCheck
|
|
56
|
-
}) {
|
|
57
|
-
const {
|
|
58
|
-
skipCircleCheck
|
|
59
|
-
} = option;
|
|
101
|
+
var _a;
|
|
102
|
+
return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependent) || [];
|
|
103
|
+
}
|
|
104
|
+
getNodeAllDependencyData(name, option = { skipCircleCheck: false }) {
|
|
105
|
+
const { skipCircleCheck } = option;
|
|
60
106
|
if (!skipCircleCheck) {
|
|
61
107
|
this.checkCircle();
|
|
62
108
|
}
|
|
63
109
|
if (!this._projectsMap.has(name)) {
|
|
64
|
-
(0,
|
|
110
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
65
111
|
}
|
|
66
112
|
const currentNode = this._projectsMap.get(name);
|
|
67
|
-
return (0,
|
|
113
|
+
return (0, import_utils.recursiveGetDependency)(currentNode, skipCircleCheck);
|
|
68
114
|
}
|
|
69
115
|
setNodeData(name, task) {
|
|
70
116
|
if (this._projectsMap.has(name)) {
|
|
71
117
|
task(this._projectsMap.get(name));
|
|
72
118
|
} else {
|
|
73
|
-
(0,
|
|
119
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
74
120
|
}
|
|
75
121
|
}
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
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);
|
|
122
|
+
traverseAllNodes(task) {
|
|
123
|
+
return __async(this, null, function* () {
|
|
124
|
+
const sortedNodes = this._sortedProjects.length > 0 ? this._sortedProjects : (0, import_utils.sortProjects)(this._projects);
|
|
125
|
+
const finishTaskHash = {};
|
|
126
|
+
let preNodes = [];
|
|
127
|
+
let earlyFinish = false;
|
|
128
|
+
for (const projects of sortedNodes) {
|
|
129
|
+
if (earlyFinish) {
|
|
130
|
+
break;
|
|
91
131
|
}
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
132
|
+
yield (0, import_p_map.default)(
|
|
133
|
+
projects,
|
|
134
|
+
(project) => __async(this, null, function* () {
|
|
135
|
+
if (!finishTaskHash[project.name]) {
|
|
136
|
+
finishTaskHash[project.name] = true;
|
|
137
|
+
yield task(
|
|
138
|
+
project,
|
|
139
|
+
this._getProjectPreviousNode(project.dependent || [], preNodes),
|
|
140
|
+
() => earlyFinish = true
|
|
141
|
+
);
|
|
142
|
+
}
|
|
143
|
+
}),
|
|
144
|
+
{ concurrency: projects.length }
|
|
145
|
+
);
|
|
146
|
+
preNodes = [...projects];
|
|
147
|
+
}
|
|
148
|
+
});
|
|
97
149
|
}
|
|
98
150
|
checkCircle() {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
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
|
|
151
|
+
this._checkForCyclicDependencies(this._projects, [], /* @__PURE__ */ new Set());
|
|
152
|
+
}
|
|
153
|
+
traverseDependenciesToProjectToDependent(_0, _1) {
|
|
154
|
+
return __async(this, arguments, function* (name, task, config = {}) {
|
|
155
|
+
yield this.traverseDependenciesToProject(name, task, config);
|
|
156
|
+
yield this.traverseProjectToDependent(name, task, __spreadProps(__spreadValues({}, config), {
|
|
157
|
+
withSelf: false
|
|
158
|
+
}));
|
|
129
159
|
});
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
-
}
|
|
160
|
+
}
|
|
161
|
+
traverseProjectToDependent(_0, _1) {
|
|
162
|
+
return __async(this, arguments, function* (name, task, { withSelf = false, runTaskConcurrency } = {}) {
|
|
163
|
+
if (!this._projectsMap.has(name)) {
|
|
164
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
142
165
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
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));
|
|
166
|
+
const traverseTargetNode = this._projectsMap.get(name);
|
|
167
|
+
const leafNodeTasks = [
|
|
168
|
+
withSelf ? this._createTask(traverseTargetNode, task) : () => __async(this, null, function* () {
|
|
169
|
+
return Promise.resolve(traverseTargetNode.name);
|
|
170
|
+
})
|
|
171
|
+
];
|
|
172
|
+
const taskRunner = new import_task.TaskRunner(leafNodeTasks, {
|
|
173
|
+
concurrency: runTaskConcurrency
|
|
174
|
+
});
|
|
175
|
+
const edgeManager = new import_edge_manager.EdgeManager();
|
|
176
|
+
taskRunner.on(import_task.TaskRunner.TASK_FINISH, (projectName) => {
|
|
177
|
+
const projectNode = this.getNodeData(projectName);
|
|
178
|
+
const dependent = projectNode.dependent || [];
|
|
179
|
+
for (const dependentProject of dependent) {
|
|
180
|
+
const dependency = dependentProject.dependency || [];
|
|
181
|
+
const removeNodes = dependency.filter(
|
|
182
|
+
(dependencyProject) => ![projectName, ...dependent.map((p) => p.name)].includes(
|
|
183
|
+
dependencyProject.name
|
|
184
|
+
)
|
|
185
|
+
);
|
|
186
|
+
edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
|
|
187
|
+
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
188
|
+
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
189
|
+
}
|
|
190
190
|
}
|
|
191
|
+
});
|
|
192
|
+
yield taskRunner.run();
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
traverseDependenciesToProject(_0, _1) {
|
|
196
|
+
return __async(this, arguments, function* (name, task, { withSelf = false, runTaskConcurrency } = {}) {
|
|
197
|
+
if (!this._projectsMap.has(name)) {
|
|
198
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
191
199
|
}
|
|
200
|
+
const traverseTargetNode = this._projectsMap.get(name);
|
|
201
|
+
const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
|
|
202
|
+
if ((leafNodes == null ? void 0 : leafNodes.length) === 0) {
|
|
203
|
+
yield this._createTask(traverseTargetNode, task)();
|
|
204
|
+
return;
|
|
205
|
+
}
|
|
206
|
+
const leafNodeTasks = leafNodes.map(
|
|
207
|
+
(project) => this._createTask(project, task)
|
|
208
|
+
);
|
|
209
|
+
const taskRunner = new import_task.TaskRunner(leafNodeTasks, {
|
|
210
|
+
concurrency: runTaskConcurrency
|
|
211
|
+
});
|
|
212
|
+
const edgeManager = new import_edge_manager.EdgeManager();
|
|
213
|
+
taskRunner.on(import_task.TaskRunner.TASK_FINISH, (projectName) => {
|
|
214
|
+
const projectNode = this.getNodeData(projectName);
|
|
215
|
+
const dependent = projectNode.dependent || [];
|
|
216
|
+
for (const dependentProject of dependent) {
|
|
217
|
+
if (![traverseTargetNode, ...leafNodes].some(
|
|
218
|
+
(n) => n.name === dependentProject.name
|
|
219
|
+
)) {
|
|
220
|
+
continue;
|
|
221
|
+
}
|
|
222
|
+
edgeManager.reduceOneEdge(dependentProject);
|
|
223
|
+
if (dependentProject.name === traverseTargetNode.name && !withSelf) {
|
|
224
|
+
continue;
|
|
225
|
+
}
|
|
226
|
+
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
227
|
+
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
yield taskRunner.run();
|
|
192
232
|
});
|
|
193
|
-
|
|
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
|
-
*/
|
|
233
|
+
}
|
|
206
234
|
_checkForCyclicDependencies(projects, dependencyChain, alreadyCheckedProjects) {
|
|
207
235
|
for (const project of projects) {
|
|
208
236
|
if (dependencyChain.includes(project.name)) {
|
|
209
|
-
throw new Error(
|
|
237
|
+
throw new Error(
|
|
238
|
+
`${"A cyclic dependency was encountered:\n"} ${[
|
|
239
|
+
...dependencyChain,
|
|
240
|
+
project.name
|
|
241
|
+
].reverse().join("\n -> ")}
|
|
242
|
+
`
|
|
243
|
+
);
|
|
210
244
|
}
|
|
211
245
|
if (!alreadyCheckedProjects.has(project.name)) {
|
|
212
246
|
alreadyCheckedProjects.add(project.name);
|
|
213
247
|
dependencyChain.push(project.name);
|
|
214
|
-
this._checkForCyclicDependencies(
|
|
248
|
+
this._checkForCyclicDependencies(
|
|
249
|
+
project.dependent,
|
|
250
|
+
dependencyChain,
|
|
251
|
+
alreadyCheckedProjects
|
|
252
|
+
);
|
|
215
253
|
dependencyChain.pop();
|
|
216
254
|
}
|
|
217
255
|
}
|
|
@@ -223,19 +261,16 @@ class DagOperator {
|
|
|
223
261
|
}
|
|
224
262
|
let leafNodes = [...dependency];
|
|
225
263
|
for (const dependencyNode of dependency) {
|
|
226
|
-
leafNodes = [
|
|
264
|
+
leafNodes = [
|
|
265
|
+
...leafNodes,
|
|
266
|
+
...this._getDependencyLeafNodes(dependencyNode)
|
|
267
|
+
];
|
|
227
268
|
}
|
|
228
269
|
return leafNodes;
|
|
229
270
|
}
|
|
230
271
|
_getProjectPreviousNode(searchProjects, preNodes) {
|
|
231
|
-
return searchProjects.filter(
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
// // Precalculate the number of dependent packages
|
|
236
|
-
// for (const project of this._projects) {
|
|
237
|
-
// calculateCriticalPaths(project);
|
|
238
|
-
// }
|
|
239
|
-
// }
|
|
272
|
+
return searchProjects.filter(
|
|
273
|
+
(p) => preNodes.map((preP) => preP.name).includes(p.name)
|
|
274
|
+
);
|
|
275
|
+
}
|
|
240
276
|
}
|
|
241
|
-
exports.DagOperator = DagOperator;
|
package/dist/js/node/dag/task.js
CHANGED
|
@@ -1,62 +1,104 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
Object.
|
|
4
|
-
|
|
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 stdin_exports = {};
|
|
25
|
+
__export(stdin_exports, {
|
|
26
|
+
TaskRunner: () => TaskRunner
|
|
5
27
|
});
|
|
6
|
-
exports
|
|
7
|
-
var
|
|
8
|
-
var
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
28
|
+
module.exports = __toCommonJS(stdin_exports);
|
|
29
|
+
var import_events = require("events");
|
|
30
|
+
var import_p_map = __toESM(require("p-map"));
|
|
31
|
+
var __async = (__this, __arguments, generator) => {
|
|
32
|
+
return new Promise((resolve, reject) => {
|
|
33
|
+
var fulfilled = (value) => {
|
|
34
|
+
try {
|
|
35
|
+
step(generator.next(value));
|
|
36
|
+
} catch (e) {
|
|
37
|
+
reject(e);
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
var rejected = (value) => {
|
|
41
|
+
try {
|
|
42
|
+
step(generator.throw(value));
|
|
43
|
+
} catch (e) {
|
|
44
|
+
reject(e);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
48
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
49
|
+
});
|
|
50
|
+
};
|
|
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 ||
|
|
55
|
+
this._concurrency = concurrency || _TaskRunner.DefaultConcurrency;
|
|
22
56
|
this._usableConcurrency = this._concurrency;
|
|
23
57
|
this._stopFlag = false;
|
|
24
58
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
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
|
-
|
|
61
|
-
|
|
62
|
-
|
|
101
|
+
};
|
|
102
|
+
let TaskRunner = _TaskRunner;
|
|
103
|
+
TaskRunner.DefaultConcurrency = 10;
|
|
104
|
+
TaskRunner.TASK_FINISH = "task-finish";
|