@modern-js/monorepo-tools 2.15.0 → 2.17.0
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 +38 -0
- package/dist/cjs/cli/build.js +10 -31
- package/dist/cjs/cli/buildWatch.js +11 -31
- package/dist/cjs/cli/clear.js +11 -31
- package/dist/cjs/cli/deploy.js +14 -36
- package/dist/cjs/cli/index.js +23 -22
- package/dist/cjs/cli/install.js +11 -31
- package/dist/cjs/cli/new.js +17 -37
- package/dist/cjs/commands/build.js +21 -46
- package/dist/cjs/commands/buildWatch.js +19 -36
- package/dist/cjs/commands/clear.js +17 -34
- package/dist/cjs/commands/deploy.js +25 -41
- package/dist/cjs/commands/index.js +22 -21
- package/dist/cjs/commands/install.js +19 -36
- package/dist/cjs/constants.js +13 -26
- package/dist/cjs/dag/create.js +16 -28
- package/dist/cjs/dag/edgeManager.js +24 -28
- package/dist/cjs/dag/index.js +11 -29
- package/dist/cjs/dag/operator.js +106 -123
- package/dist/cjs/dag/task.js +52 -63
- package/dist/cjs/dag/utils.js +52 -49
- package/dist/cjs/features/build/index.js +52 -68
- package/dist/cjs/features/clear/index.js +66 -47
- package/dist/cjs/features/deploy/index.js +126 -96
- package/dist/cjs/features/dev/cmds.js +10 -25
- package/dist/cjs/features/dev/createTask.js +93 -56
- package/dist/cjs/features/dev/index.js +43 -71
- package/dist/cjs/features/dev/watchProjectsState.js +89 -64
- package/dist/cjs/features/install/index.js +74 -63
- package/dist/cjs/hooks/index.js +9 -27
- package/dist/cjs/index.js +36 -53
- package/dist/cjs/locale/en.js +7 -25
- package/dist/cjs/locale/index.js +18 -28
- package/dist/cjs/locale/zh.js +7 -25
- package/dist/cjs/log/error.js +7 -25
- package/dist/cjs/log/multiTasksLog.js +42 -43
- package/dist/cjs/log/time.js +19 -29
- package/dist/cjs/log/utils.js +7 -25
- package/dist/cjs/package/index.js +28 -30
- package/dist/cjs/parse-config/index.js +61 -49
- package/dist/cjs/parse-config/monorepo.js +81 -67
- package/dist/cjs/projects/checkProjectChange.js +95 -73
- package/dist/cjs/projects/clearMemoryFiles.js +52 -44
- package/dist/cjs/projects/getProjects.js +38 -65
- package/dist/cjs/projects/getProjectsByPackagesConfig.js +93 -71
- package/dist/cjs/projects/getProjectsByWorkspaceFile.js +89 -85
- package/dist/cjs/type.js +4 -15
- package/dist/cjs/utils/install.js +69 -44
- package/dist/cjs/utils/types.js +4 -15
- package/dist/esm/cli/build.js +2 -8
- package/dist/esm/cli/buildWatch.js +4 -9
- package/dist/esm/cli/clear.js +4 -9
- package/dist/esm/cli/deploy.js +7 -14
- package/dist/esm/cli/install.js +4 -9
- package/dist/esm/cli/new.js +9 -14
- package/dist/esm/commands/build.js +7 -17
- package/dist/esm/commands/buildWatch.js +6 -8
- package/dist/esm/commands/clear.js +6 -8
- package/dist/esm/commands/deploy.js +10 -11
- package/dist/esm/commands/install.js +6 -8
- package/dist/esm/constants.js +2 -6
- package/dist/esm/dag/create.js +10 -7
- package/dist/esm/dag/edgeManager.js +17 -6
- package/dist/esm/dag/index.js +1 -4
- package/dist/esm/dag/operator.js +77 -74
- package/dist/esm/dag/task.js +39 -30
- package/dist/esm/dag/utils.js +39 -27
- package/dist/esm/features/build/index.js +22 -27
- package/dist/esm/features/clear/index.js +4 -6
- package/dist/esm/features/deploy/index.js +55 -50
- package/dist/esm/features/dev/cmds.js +4 -4
- package/dist/esm/features/dev/createTask.js +31 -15
- package/dist/esm/features/dev/index.js +19 -27
- package/dist/esm/features/dev/watchProjectsState.js +41 -31
- package/dist/esm/features/install/index.js +11 -15
- package/dist/esm/hooks/index.js +1 -4
- package/dist/esm/index.js +12 -11
- package/dist/esm/locale/en.js +1 -4
- package/dist/esm/locale/index.js +5 -5
- package/dist/esm/locale/zh.js +1 -4
- package/dist/esm/log/error.js +1 -4
- package/dist/esm/log/multiTasksLog.js +32 -18
- package/dist/esm/log/time.js +7 -8
- package/dist/esm/log/utils.js +1 -4
- package/dist/esm/package/index.js +21 -8
- package/dist/esm/parse-config/index.js +11 -14
- package/dist/esm/parse-config/monorepo.js +20 -27
- package/dist/esm/projects/checkProjectChange.js +19 -23
- package/dist/esm/projects/clearMemoryFiles.js +3 -13
- package/dist/esm/projects/getProjects.js +21 -45
- package/dist/esm/projects/getProjectsByPackagesConfig.js +29 -33
- package/dist/esm/projects/getProjectsByWorkspaceFile.js +21 -41
- package/dist/esm/type.js +1 -0
- package/dist/esm/utils/install.js +12 -8
- package/dist/esm/utils/types.js +1 -0
- package/package.json +16 -12
|
@@ -2,13 +2,14 @@ import { runInstallTask } from "../features/install";
|
|
|
2
2
|
import { getMonorepoBaseData } from "../parse-config/monorepo";
|
|
3
3
|
import { getProjects } from "../projects/getProjects";
|
|
4
4
|
import { initDAG } from "../dag";
|
|
5
|
-
const install = async (projectNames = [], option, api) => {
|
|
5
|
+
export const install = async (projectNames = [], option, api) => {
|
|
6
6
|
const { appDirectory } = api.useAppContext();
|
|
7
7
|
const { auto } = option;
|
|
8
|
-
const projects = await getProjects(
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
8
|
+
const projects = await getProjects({
|
|
9
|
+
packagesMatchs: {
|
|
10
|
+
enableAutoFinder: true
|
|
11
|
+
}
|
|
12
|
+
}, appDirectory);
|
|
12
13
|
const operator = initDAG(projects);
|
|
13
14
|
operator.checkCircle();
|
|
14
15
|
const { rootPath, packageManager } = getMonorepoBaseData(appDirectory);
|
|
@@ -18,6 +19,3 @@ const install = async (projectNames = [], option, api) => {
|
|
|
18
19
|
auto
|
|
19
20
|
});
|
|
20
21
|
};
|
|
21
|
-
export {
|
|
22
|
-
install
|
|
23
|
-
};
|
package/dist/esm/constants.js
CHANGED
|
@@ -1,14 +1,10 @@
|
|
|
1
|
-
const WORKSPACE_FILE = {
|
|
1
|
+
export const WORKSPACE_FILE = {
|
|
2
2
|
LERNA: "lerna.json",
|
|
3
3
|
YARN: "package.json",
|
|
4
4
|
PNPM: "pnpm-workspace.yaml"
|
|
5
5
|
};
|
|
6
|
-
const LOCK_FILE = {
|
|
6
|
+
export const LOCK_FILE = {
|
|
7
7
|
YARN: "yarn.lock",
|
|
8
8
|
PNPM: "pnpm-lock.yaml",
|
|
9
9
|
NPM: "package-lock.json"
|
|
10
10
|
};
|
|
11
|
-
export {
|
|
12
|
-
LOCK_FILE,
|
|
13
|
-
WORKSPACE_FILE
|
|
14
|
-
};
|
package/dist/esm/dag/create.js
CHANGED
|
@@ -10,19 +10,22 @@ const initProjectDependencyAndDependent = (project, projectsName, projectsMap) =
|
|
|
10
10
|
project.dependent = project.dependent || [];
|
|
11
11
|
project.dependency = DependencyProjectsName.map((projectName) => {
|
|
12
12
|
const dependencyProject = projectsMap.get(projectName);
|
|
13
|
-
const dependent = (dependencyProject
|
|
13
|
+
const dependent = (dependencyProject === null || dependencyProject === void 0 ? void 0 : dependencyProject.dependent) || [];
|
|
14
14
|
if (
|
|
15
15
|
// 消除重复添加的情况
|
|
16
16
|
!dependent.some((p) => p.name === project.name)
|
|
17
17
|
) {
|
|
18
|
-
dependencyProject.dependent = [
|
|
18
|
+
dependencyProject.dependent = [
|
|
19
|
+
...dependent,
|
|
20
|
+
project
|
|
21
|
+
];
|
|
19
22
|
dependencyProject.dependentEdge = dependencyProject.dependent.length;
|
|
20
23
|
}
|
|
21
24
|
return dependencyProject;
|
|
22
25
|
});
|
|
23
26
|
project.dependencyEdge = project.dependency.length;
|
|
24
27
|
};
|
|
25
|
-
const create = (projects) => {
|
|
28
|
+
export const create = (projects) => {
|
|
26
29
|
const projectsName = [];
|
|
27
30
|
const projectsMap = /* @__PURE__ */ new Map();
|
|
28
31
|
for (const project of projects) {
|
|
@@ -32,8 +35,8 @@ const create = (projects) => {
|
|
|
32
35
|
for (const project of projects) {
|
|
33
36
|
initProjectDependencyAndDependent(project, projectsName, projectsMap);
|
|
34
37
|
}
|
|
35
|
-
return {
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
38
|
+
return {
|
|
39
|
+
projectsMap,
|
|
40
|
+
projectList: projectsName
|
|
41
|
+
};
|
|
39
42
|
};
|
|
@@ -1,7 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
4
11
|
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
14
|
+
export class EdgeManager {
|
|
5
15
|
reduceOneEdge(project) {
|
|
6
16
|
if (!(project.name in this._dependencyEdgeHash)) {
|
|
7
17
|
this._dependencyEdgeHash[project.name] = project.dependencyEdge;
|
|
@@ -23,7 +33,8 @@ class EdgeManager {
|
|
|
23
33
|
setEdge(project) {
|
|
24
34
|
this._dependencyEdgeHash[project.name] = project.dependencyEdge;
|
|
25
35
|
}
|
|
36
|
+
constructor() {
|
|
37
|
+
_define_property(this, "_dependencyEdgeHash", void 0);
|
|
38
|
+
this._dependencyEdgeHash = {};
|
|
39
|
+
}
|
|
26
40
|
}
|
|
27
|
-
export {
|
|
28
|
-
EdgeManager
|
|
29
|
-
};
|
package/dist/esm/dag/index.js
CHANGED
|
@@ -1,10 +1,7 @@
|
|
|
1
1
|
import { create } from "./create";
|
|
2
2
|
import { DagOperator } from "./operator";
|
|
3
|
-
const initDAG = (projects) => {
|
|
3
|
+
export const initDAG = (projects) => {
|
|
4
4
|
const { projectsMap } = create(projects);
|
|
5
5
|
const operator = new DagOperator(projects, projectsMap);
|
|
6
6
|
return operator;
|
|
7
7
|
};
|
|
8
|
-
export {
|
|
9
|
-
initDAG
|
|
10
|
-
};
|
package/dist/esm/dag/operator.js
CHANGED
|
@@ -1,22 +1,28 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
1
14
|
import pMap from "p-map";
|
|
2
15
|
import { errorLog } from "../log/error";
|
|
3
16
|
import { TaskRunner } from "./task";
|
|
4
17
|
import { EdgeManager } from "./edgeManager";
|
|
5
18
|
import { recursiveGetDependency, sortProjects } from "./utils";
|
|
6
|
-
class DagOperator {
|
|
7
|
-
constructor(projects, projectsMap) {
|
|
8
|
-
this._createTask = (project, task) => async (stopTask = () => void 0) => {
|
|
9
|
-
await task(project, project.dependency || [], () => stopTask());
|
|
10
|
-
return project.name;
|
|
11
|
-
};
|
|
12
|
-
this._projects = projects;
|
|
13
|
-
this._projectsMap = projectsMap;
|
|
14
|
-
this._sortedProjects = [];
|
|
15
|
-
}
|
|
19
|
+
export class DagOperator {
|
|
16
20
|
checkNodeDataExist(name) {
|
|
17
21
|
return this._projectsMap.has(name);
|
|
18
22
|
}
|
|
19
|
-
getNodeData(name, option = {
|
|
23
|
+
getNodeData(name, option = {
|
|
24
|
+
checkExist: false
|
|
25
|
+
}) {
|
|
20
26
|
if (option.checkExist) {
|
|
21
27
|
if (this._projectsMap.has(name)) {
|
|
22
28
|
return this._projectsMap.get(name);
|
|
@@ -27,14 +33,16 @@ class DagOperator {
|
|
|
27
33
|
return this._projectsMap.get(name);
|
|
28
34
|
}
|
|
29
35
|
getNodeDependencyData(name) {
|
|
30
|
-
var
|
|
31
|
-
return ((
|
|
36
|
+
var _this__projectsMap_get;
|
|
37
|
+
return ((_this__projectsMap_get = this._projectsMap.get(name)) === null || _this__projectsMap_get === void 0 ? void 0 : _this__projectsMap_get.dependency) || [];
|
|
32
38
|
}
|
|
33
39
|
getNodeDependentData(name) {
|
|
34
|
-
var
|
|
35
|
-
return ((
|
|
40
|
+
var _this__projectsMap_get;
|
|
41
|
+
return ((_this__projectsMap_get = this._projectsMap.get(name)) === null || _this__projectsMap_get === void 0 ? void 0 : _this__projectsMap_get.dependent) || [];
|
|
36
42
|
}
|
|
37
|
-
getNodeAllDependencyData(name, option = {
|
|
43
|
+
getNodeAllDependencyData(name, option = {
|
|
44
|
+
skipCircleCheck: false
|
|
45
|
+
}) {
|
|
38
46
|
const { skipCircleCheck } = option;
|
|
39
47
|
if (!skipCircleCheck) {
|
|
40
48
|
this.checkCircle();
|
|
@@ -67,16 +75,16 @@ class DagOperator {
|
|
|
67
75
|
async (project) => {
|
|
68
76
|
if (!finishTaskHash[project.name]) {
|
|
69
77
|
finishTaskHash[project.name] = true;
|
|
70
|
-
await task(
|
|
71
|
-
project,
|
|
72
|
-
this._getProjectPreviousNode(project.dependent || [], preNodes),
|
|
73
|
-
() => earlyFinish = true
|
|
74
|
-
);
|
|
78
|
+
await task(project, this._getProjectPreviousNode(project.dependent || [], preNodes), () => earlyFinish = true);
|
|
75
79
|
}
|
|
76
80
|
},
|
|
77
|
-
{
|
|
81
|
+
{
|
|
82
|
+
concurrency: projects.length
|
|
83
|
+
}
|
|
78
84
|
);
|
|
79
|
-
preNodes = [
|
|
85
|
+
preNodes = [
|
|
86
|
+
...projects
|
|
87
|
+
];
|
|
80
88
|
}
|
|
81
89
|
}
|
|
82
90
|
checkCircle() {
|
|
@@ -90,13 +98,13 @@ class DagOperator {
|
|
|
90
98
|
});
|
|
91
99
|
}
|
|
92
100
|
/**
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
101
|
+
* 1. 把目标节点当做叶子节点集合 A 中的元素
|
|
102
|
+
* 2. 当叶子节点集合中某个 a 元素结束任务的时候进行如下操作:
|
|
103
|
+
* 2.1 剪(去额外的)枝:获取 a 元素的 dependent集合,将该集合中元素的依赖列表进行过滤,过滤条件为:排除 a 以及 a 元素的 dependent集合以外的元素。
|
|
104
|
+
* 2.2 入度减一:对 a 元素的 dependent 集合元素的 dependencyEdge 减一
|
|
105
|
+
* 3. 检查是否存在 dependencyEdge === 0 的节点,加入叶子节点集合 A中。
|
|
106
|
+
* 4. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
|
|
107
|
+
*/
|
|
100
108
|
async traverseProjectToDependent(name, task, { withSelf = false, runTaskConcurrency } = {}) {
|
|
101
109
|
if (!this._projectsMap.has(name)) {
|
|
102
110
|
errorLog(`No '${name}' project exist`);
|
|
@@ -114,11 +122,10 @@ class DagOperator {
|
|
|
114
122
|
const dependent = projectNode.dependent || [];
|
|
115
123
|
for (const dependentProject of dependent) {
|
|
116
124
|
const dependency = dependentProject.dependency || [];
|
|
117
|
-
const removeNodes = dependency.filter(
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
);
|
|
125
|
+
const removeNodes = dependency.filter((dependencyProject) => ![
|
|
126
|
+
projectName,
|
|
127
|
+
...dependent.map((p) => p.name)
|
|
128
|
+
].includes(dependencyProject.name));
|
|
122
129
|
edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
|
|
123
130
|
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
124
131
|
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
@@ -128,12 +135,12 @@ class DagOperator {
|
|
|
128
135
|
await taskRunner.run();
|
|
129
136
|
}
|
|
130
137
|
/**
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
138
|
+
* 1. 找到叶子节点集合 A
|
|
139
|
+
* 2. 找到直接连接叶子节点的节点集合 B
|
|
140
|
+
* 3. 当有某个叶子节点结束任务,则对该节点的直接连接的节点(或者理解成dependent)的枝数(或者叫入度)减一。
|
|
141
|
+
* 4. 检查 B 集合中是否存在入度为0的节点,则此节点为叶子节点,并加入叶子节点集合 A
|
|
142
|
+
* 5. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
|
|
143
|
+
*/
|
|
137
144
|
// TODO: 执行顺序还需要再确定一下
|
|
138
145
|
async traverseDependenciesToProject(name, task, { withSelf = false, runTaskConcurrency } = {}) {
|
|
139
146
|
if (!this._projectsMap.has(name)) {
|
|
@@ -141,13 +148,11 @@ class DagOperator {
|
|
|
141
148
|
}
|
|
142
149
|
const traverseTargetNode = this._projectsMap.get(name);
|
|
143
150
|
const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
|
|
144
|
-
if ((leafNodes
|
|
151
|
+
if ((leafNodes === null || leafNodes === void 0 ? void 0 : leafNodes.length) === 0) {
|
|
145
152
|
await this._createTask(traverseTargetNode, task)();
|
|
146
153
|
return;
|
|
147
154
|
}
|
|
148
|
-
const leafNodeTasks = leafNodes.map(
|
|
149
|
-
(project) => this._createTask(project, task)
|
|
150
|
-
);
|
|
155
|
+
const leafNodeTasks = leafNodes.map((project) => this._createTask(project, task));
|
|
151
156
|
const taskRunner = new TaskRunner(leafNodeTasks, {
|
|
152
157
|
concurrency: runTaskConcurrency
|
|
153
158
|
});
|
|
@@ -156,9 +161,10 @@ class DagOperator {
|
|
|
156
161
|
const projectNode = this.getNodeData(projectName);
|
|
157
162
|
const dependent = projectNode.dependent || [];
|
|
158
163
|
for (const dependentProject of dependent) {
|
|
159
|
-
if (![
|
|
160
|
-
|
|
161
|
-
|
|
164
|
+
if (![
|
|
165
|
+
traverseTargetNode,
|
|
166
|
+
...leafNodes
|
|
167
|
+
].some((n) => n.name === dependentProject.name)) {
|
|
162
168
|
continue;
|
|
163
169
|
}
|
|
164
170
|
edgeManager.reduceOneEdge(dependentProject);
|
|
@@ -185,22 +191,16 @@ class DagOperator {
|
|
|
185
191
|
_checkForCyclicDependencies(projects, dependencyChain, alreadyCheckedProjects) {
|
|
186
192
|
for (const project of projects) {
|
|
187
193
|
if (dependencyChain.includes(project.name)) {
|
|
188
|
-
throw new Error(
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
`
|
|
194
|
-
);
|
|
194
|
+
throw new Error(`${"A cyclic dependency was encountered:\n"} ${[
|
|
195
|
+
...dependencyChain,
|
|
196
|
+
project.name
|
|
197
|
+
].reverse().join("\n -> ")}
|
|
198
|
+
`);
|
|
195
199
|
}
|
|
196
200
|
if (!alreadyCheckedProjects.has(project.name)) {
|
|
197
201
|
alreadyCheckedProjects.add(project.name);
|
|
198
202
|
dependencyChain.push(project.name);
|
|
199
|
-
this._checkForCyclicDependencies(
|
|
200
|
-
project.dependent,
|
|
201
|
-
dependencyChain,
|
|
202
|
-
alreadyCheckedProjects
|
|
203
|
-
);
|
|
203
|
+
this._checkForCyclicDependencies(project.dependent, dependencyChain, alreadyCheckedProjects);
|
|
204
204
|
dependencyChain.pop();
|
|
205
205
|
}
|
|
206
206
|
}
|
|
@@ -210,7 +210,9 @@ class DagOperator {
|
|
|
210
210
|
if (dependency.length === 0) {
|
|
211
211
|
return [];
|
|
212
212
|
}
|
|
213
|
-
let leafNodes = [
|
|
213
|
+
let leafNodes = [
|
|
214
|
+
...dependency
|
|
215
|
+
];
|
|
214
216
|
for (const dependencyNode of dependency) {
|
|
215
217
|
leafNodes = [
|
|
216
218
|
...leafNodes,
|
|
@@ -220,17 +222,18 @@ class DagOperator {
|
|
|
220
222
|
return leafNodes;
|
|
221
223
|
}
|
|
222
224
|
_getProjectPreviousNode(searchProjects, preNodes) {
|
|
223
|
-
return searchProjects.filter(
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
225
|
+
return searchProjects.filter((p) => preNodes.map((preP) => preP.name).includes(p.name));
|
|
226
|
+
}
|
|
227
|
+
constructor(projects, projectsMap) {
|
|
228
|
+
_define_property(this, "_projects", void 0);
|
|
229
|
+
_define_property(this, "_projectsMap", void 0);
|
|
230
|
+
_define_property(this, "_sortedProjects", void 0);
|
|
231
|
+
_define_property(this, "_createTask", (project, task) => async (stopTask = () => void 0) => {
|
|
232
|
+
await task(project, project.dependency || [], () => stopTask());
|
|
233
|
+
return project.name;
|
|
234
|
+
});
|
|
235
|
+
this._projects = projects;
|
|
236
|
+
this._projectsMap = projectsMap;
|
|
237
|
+
this._sortedProjects = [];
|
|
238
|
+
}
|
|
233
239
|
}
|
|
234
|
-
export {
|
|
235
|
-
DagOperator
|
|
236
|
-
};
|
package/dist/esm/dag/task.js
CHANGED
|
@@ -1,23 +1,27 @@
|
|
|
1
|
+
function _define_property(obj, key, value) {
|
|
2
|
+
if (key in obj) {
|
|
3
|
+
Object.defineProperty(obj, key, {
|
|
4
|
+
value,
|
|
5
|
+
enumerable: true,
|
|
6
|
+
configurable: true,
|
|
7
|
+
writable: true
|
|
8
|
+
});
|
|
9
|
+
} else {
|
|
10
|
+
obj[key] = value;
|
|
11
|
+
}
|
|
12
|
+
return obj;
|
|
13
|
+
}
|
|
1
14
|
import { EventEmitter } from "events";
|
|
2
15
|
import pMap from "p-map";
|
|
3
|
-
|
|
4
|
-
constructor(tasks, { concurrency }) {
|
|
5
|
-
super();
|
|
6
|
-
this._tasks = tasks;
|
|
7
|
-
this._concurrency = concurrency || _TaskRunner.DefaultConcurrency;
|
|
8
|
-
this._usableConcurrency = this._concurrency;
|
|
9
|
-
this._stopFlag = false;
|
|
10
|
-
}
|
|
16
|
+
export class TaskRunner extends EventEmitter {
|
|
11
17
|
async run() {
|
|
12
18
|
const tasks = this._tasks.splice(0, this._concurrency);
|
|
13
19
|
this._usableConcurrency = this._concurrency - tasks.length;
|
|
14
|
-
await pMap(
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
{ concurrency: tasks.length }
|
|
20
|
-
);
|
|
20
|
+
await pMap(tasks, async (task) => {
|
|
21
|
+
await this._runTask(task);
|
|
22
|
+
}, {
|
|
23
|
+
concurrency: tasks.length
|
|
24
|
+
});
|
|
21
25
|
}
|
|
22
26
|
addTask(task) {
|
|
23
27
|
this._tasks.push(task);
|
|
@@ -28,28 +32,33 @@ const _TaskRunner = class extends EventEmitter {
|
|
|
28
32
|
}
|
|
29
33
|
const emitValue = await task(this._stopTask.bind(this));
|
|
30
34
|
this._usableConcurrency--;
|
|
31
|
-
this.emit(
|
|
35
|
+
this.emit(TaskRunner.TASK_FINISH, emitValue);
|
|
32
36
|
if (this._tasks.length > 0) {
|
|
33
37
|
const nextTasks = this._tasks.splice(0, this._usableConcurrency);
|
|
34
38
|
this._usableConcurrency -= nextTasks.length;
|
|
35
39
|
if (nextTasks.length > 0) {
|
|
36
|
-
await pMap(
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
{ concurrency: nextTasks.length }
|
|
42
|
-
);
|
|
40
|
+
await pMap(nextTasks, async (_task) => {
|
|
41
|
+
await this._runTask(_task);
|
|
42
|
+
}, {
|
|
43
|
+
concurrency: nextTasks.length
|
|
44
|
+
});
|
|
43
45
|
}
|
|
44
46
|
}
|
|
45
47
|
}
|
|
46
48
|
_stopTask() {
|
|
47
49
|
this._stopFlag = true;
|
|
48
50
|
}
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
51
|
+
constructor(tasks, { concurrency }) {
|
|
52
|
+
super();
|
|
53
|
+
_define_property(this, "_tasks", void 0);
|
|
54
|
+
_define_property(this, "_concurrency", void 0);
|
|
55
|
+
_define_property(this, "_usableConcurrency", void 0);
|
|
56
|
+
_define_property(this, "_stopFlag", void 0);
|
|
57
|
+
this._tasks = tasks;
|
|
58
|
+
this._concurrency = concurrency || TaskRunner.DefaultConcurrency;
|
|
59
|
+
this._usableConcurrency = this._concurrency;
|
|
60
|
+
this._stopFlag = false;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
_define_property(TaskRunner, "DefaultConcurrency", 10);
|
|
64
|
+
_define_property(TaskRunner, "TASK_FINISH", "task-finish");
|
package/dist/esm/dag/utils.js
CHANGED
|
@@ -1,46 +1,55 @@
|
|
|
1
1
|
import { errorLog } from "../log/error";
|
|
2
2
|
import { EdgeManager } from "./edgeManager";
|
|
3
|
-
const calculateCriticalPaths = (project) => {
|
|
4
|
-
var
|
|
3
|
+
export const calculateCriticalPaths = (project) => {
|
|
4
|
+
var _project_dependent;
|
|
5
5
|
if (project.criticalPathLength !== void 0) {
|
|
6
6
|
return project.criticalPathLength;
|
|
7
7
|
}
|
|
8
|
-
if (((
|
|
8
|
+
if (((_project_dependent = project.dependent) === null || _project_dependent === void 0 ? void 0 : _project_dependent.length) === 0) {
|
|
9
9
|
project.criticalPathLength = 0;
|
|
10
10
|
return project.criticalPathLength;
|
|
11
11
|
} else {
|
|
12
|
+
var _project_dependent1;
|
|
12
13
|
const depsLengths = [];
|
|
13
|
-
(
|
|
14
|
-
(dependentProject) => depsLengths.push(calculateCriticalPaths(dependentProject))
|
|
15
|
-
);
|
|
14
|
+
(_project_dependent1 = project.dependent) === null || _project_dependent1 === void 0 ? void 0 : _project_dependent1.forEach((dependentProject) => depsLengths.push(calculateCriticalPaths(dependentProject)));
|
|
16
15
|
project.criticalPathLength = Math.max(...depsLengths) + 1;
|
|
17
16
|
return project.criticalPathLength;
|
|
18
17
|
}
|
|
19
18
|
};
|
|
20
19
|
const _recursiveGetDependencySkipCircleDeps = (node) => {
|
|
21
20
|
let allDeps = [];
|
|
22
|
-
const foundDepsNameSet = /* @__PURE__ */ new Set([
|
|
23
|
-
|
|
21
|
+
const foundDepsNameSet = /* @__PURE__ */ new Set([
|
|
22
|
+
node.name
|
|
23
|
+
]);
|
|
24
|
+
let queue = [
|
|
25
|
+
node
|
|
26
|
+
];
|
|
24
27
|
while (queue.length > 0) {
|
|
25
28
|
const checkNode = queue.pop();
|
|
26
29
|
const checkNodeDeps = checkNode.dependency || [];
|
|
27
30
|
if (checkNodeDeps.length > 0) {
|
|
28
|
-
const willIntoQueue = checkNodeDeps.filter(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
31
|
+
const willIntoQueue = checkNodeDeps.filter((dep) => !foundDepsNameSet.has(dep.name));
|
|
32
|
+
allDeps = [
|
|
33
|
+
...allDeps,
|
|
34
|
+
...willIntoQueue
|
|
35
|
+
];
|
|
32
36
|
willIntoQueue.forEach((dep) => foundDepsNameSet.add(dep.name));
|
|
33
|
-
queue = [
|
|
37
|
+
queue = [
|
|
38
|
+
...queue,
|
|
39
|
+
...willIntoQueue
|
|
40
|
+
];
|
|
34
41
|
}
|
|
35
42
|
}
|
|
36
43
|
return allDeps;
|
|
37
44
|
};
|
|
38
|
-
const recursiveGetDependency = (project, skipCircleProjects = false) => {
|
|
45
|
+
export const recursiveGetDependency = (project, skipCircleProjects = false) => {
|
|
39
46
|
if (skipCircleProjects) {
|
|
40
47
|
return _recursiveGetDependencySkipCircleDeps(project);
|
|
41
48
|
}
|
|
42
49
|
const dependency = project.dependency || [];
|
|
43
|
-
let allDependency = [
|
|
50
|
+
let allDependency = [
|
|
51
|
+
...dependency
|
|
52
|
+
];
|
|
44
53
|
for (const dependencyProject of dependency) {
|
|
45
54
|
allDependency = [
|
|
46
55
|
...allDependency,
|
|
@@ -49,7 +58,7 @@ const recursiveGetDependency = (project, skipCircleProjects = false) => {
|
|
|
49
58
|
}
|
|
50
59
|
return allDependency;
|
|
51
60
|
};
|
|
52
|
-
const sortProjects = (projects) => {
|
|
61
|
+
export const sortProjects = (projects) => {
|
|
53
62
|
const sortedQueue = [];
|
|
54
63
|
let readyIntoSortedQueue = [];
|
|
55
64
|
let queue = [];
|
|
@@ -60,7 +69,9 @@ const sortProjects = (projects) => {
|
|
|
60
69
|
queue.push(project);
|
|
61
70
|
}
|
|
62
71
|
}
|
|
63
|
-
sortedQueue.push([
|
|
72
|
+
sortedQueue.push([
|
|
73
|
+
...queue
|
|
74
|
+
]);
|
|
64
75
|
let shiftNodesCount = 0;
|
|
65
76
|
while (queue.length > 0) {
|
|
66
77
|
const checkNode = queue.shift();
|
|
@@ -72,8 +83,12 @@ const sortProjects = (projects) => {
|
|
|
72
83
|
}
|
|
73
84
|
}
|
|
74
85
|
if (queue.length === 0 && readyIntoSortedQueue.length > 0) {
|
|
75
|
-
queue = [
|
|
76
|
-
|
|
86
|
+
queue = [
|
|
87
|
+
...readyIntoSortedQueue
|
|
88
|
+
];
|
|
89
|
+
sortedQueue.push([
|
|
90
|
+
...readyIntoSortedQueue
|
|
91
|
+
]);
|
|
77
92
|
readyIntoSortedQueue = [];
|
|
78
93
|
}
|
|
79
94
|
}
|
|
@@ -83,10 +98,13 @@ const sortProjects = (projects) => {
|
|
|
83
98
|
}
|
|
84
99
|
return sortedQueue;
|
|
85
100
|
};
|
|
86
|
-
const findCircle = (projects) => {
|
|
101
|
+
export const findCircle = (projects) => {
|
|
87
102
|
let result = projects.reduce((circleNodes, project) => {
|
|
88
103
|
if (project.dependencyEdge > 0) {
|
|
89
|
-
return [
|
|
104
|
+
return [
|
|
105
|
+
...circleNodes,
|
|
106
|
+
project
|
|
107
|
+
];
|
|
90
108
|
}
|
|
91
109
|
return circleNodes;
|
|
92
110
|
}, []);
|
|
@@ -96,9 +114,3 @@ const findCircle = (projects) => {
|
|
|
96
114
|
checkNode.dependencyEdge--;
|
|
97
115
|
}
|
|
98
116
|
};
|
|
99
|
-
export {
|
|
100
|
-
calculateCriticalPaths,
|
|
101
|
-
findCircle,
|
|
102
|
-
recursiveGetDependency,
|
|
103
|
-
sortProjects
|
|
104
|
-
};
|
|
@@ -1,18 +1,10 @@
|
|
|
1
1
|
import os from "os";
|
|
2
2
|
import { execa, signale } from "@modern-js/utils";
|
|
3
|
-
import {
|
|
4
|
-
checkProjectChangeByGit,
|
|
5
|
-
checkProjectChangeByContent
|
|
6
|
-
} from "../../projects/checkProjectChange";
|
|
3
|
+
import { checkProjectChangeByGit, checkProjectChangeByContent } from "../../projects/checkProjectChange";
|
|
7
4
|
import { errorLog } from "../../log/error";
|
|
8
5
|
import { MultitasksLogger } from "../../log/multiTasksLog";
|
|
9
6
|
const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
10
|
-
const {
|
|
11
|
-
rootPath,
|
|
12
|
-
packageManager,
|
|
13
|
-
disableContentHash = false,
|
|
14
|
-
enableGitHash = false
|
|
15
|
-
} = config;
|
|
7
|
+
const { rootPath, packageManager, disableContentHash = false, enableGitHash = false } = config;
|
|
16
8
|
const task = async (project) => {
|
|
17
9
|
console.info("run ", project.name);
|
|
18
10
|
if (!disableContentHash) {
|
|
@@ -36,14 +28,22 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
|
36
28
|
const prefix = `run ${project.name} ${taskCmd} script`;
|
|
37
29
|
signale.time(prefix);
|
|
38
30
|
try {
|
|
39
|
-
const childProcess = execa(packageManager, [
|
|
31
|
+
const childProcess = execa(packageManager, [
|
|
32
|
+
taskCmd
|
|
33
|
+
], {
|
|
40
34
|
cwd: project.extra.path,
|
|
41
|
-
stdio: [
|
|
35
|
+
stdio: [
|
|
36
|
+
"pipe",
|
|
37
|
+
"pipe",
|
|
38
|
+
"pipe"
|
|
39
|
+
]
|
|
42
40
|
});
|
|
43
41
|
taskLogger.addLogProvider(project.name, {
|
|
44
42
|
stdout: childProcess.stdout,
|
|
45
43
|
stderr: childProcess.stderr,
|
|
46
|
-
logConfig: {
|
|
44
|
+
logConfig: {
|
|
45
|
+
label: "BUILD: "
|
|
46
|
+
}
|
|
47
47
|
});
|
|
48
48
|
await childProcess;
|
|
49
49
|
signale.timeEnd(prefix);
|
|
@@ -57,18 +57,17 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
|
57
57
|
};
|
|
58
58
|
return task;
|
|
59
59
|
};
|
|
60
|
-
const defaultBuildCmds = [
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
disableWithDeps = false,
|
|
66
|
-
withDept = false
|
|
67
|
-
} = config;
|
|
60
|
+
const defaultBuildCmds = [
|
|
61
|
+
"build"
|
|
62
|
+
];
|
|
63
|
+
export const runBuildTask = async (projectName, operator, config, taskCmds = defaultBuildCmds) => {
|
|
64
|
+
const { withSelf = true, onlySelf = false, disableWithDeps = false, withDept = false } = config;
|
|
68
65
|
const taskLogger = new MultitasksLogger();
|
|
69
66
|
const task = createTask(config, taskCmds, taskLogger);
|
|
70
67
|
if (onlySelf) {
|
|
71
|
-
await task(operator.getNodeData(projectName, {
|
|
68
|
+
await task(operator.getNodeData(projectName, {
|
|
69
|
+
checkExist: true
|
|
70
|
+
}));
|
|
72
71
|
} else if (!disableWithDeps && withDept) {
|
|
73
72
|
await operator.traverseDependenciesToProjectToDependent(projectName, task, {
|
|
74
73
|
withSelf,
|
|
@@ -86,12 +85,8 @@ const runBuildTask = async (projectName, operator, config, taskCmds = defaultBui
|
|
|
86
85
|
});
|
|
87
86
|
}
|
|
88
87
|
};
|
|
89
|
-
const runAllBuildTask = async (operator, config, taskCmds = defaultBuildCmds) => {
|
|
88
|
+
export const runAllBuildTask = async (operator, config, taskCmds = defaultBuildCmds) => {
|
|
90
89
|
const taskLogger = new MultitasksLogger();
|
|
91
90
|
const task = createTask(config, taskCmds, taskLogger);
|
|
92
91
|
await operator.traverseAllNodes(task);
|
|
93
92
|
};
|
|
94
|
-
export {
|
|
95
|
-
runAllBuildTask,
|
|
96
|
-
runBuildTask
|
|
97
|
-
};
|