@modern-js/monorepo-tools 2.4.1-beta.0 → 2.6.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 +35 -8
- package/cli.js +1 -1
- package/dist/{js/node → cjs}/cli/build-watch.js +3 -23
- package/dist/{js/node → cjs}/cli/build.js +3 -23
- package/dist/{js/node → cjs}/cli/clear.js +3 -23
- package/dist/{js/node → cjs}/cli/deploy.js +3 -23
- package/dist/cjs/cli/install.js +34 -0
- package/dist/{js/node → cjs}/cli/new.js +3 -40
- package/dist/{js/node → cjs}/commands/build-watch.js +4 -24
- package/dist/{js/node → cjs}/commands/build.js +9 -41
- package/dist/{js/node → cjs}/commands/clear.js +3 -23
- package/dist/{js/node → cjs}/commands/deploy.js +4 -24
- package/dist/{js/node → cjs}/commands/install.js +4 -24
- package/dist/{js/node → cjs}/dag/create.js +9 -16
- package/dist/cjs/dag/operator.js +269 -0
- package/dist/{js/node → cjs}/dag/task.js +33 -53
- package/dist/{js/node → cjs}/features/build/index.js +17 -33
- package/dist/{js/node → cjs}/features/clear/index.js +4 -0
- package/dist/{js/node → cjs}/features/deploy/index.js +15 -30
- package/dist/{js/node → cjs}/features/dev/create-task.js +10 -26
- package/dist/{js/node → cjs}/features/dev/index.js +18 -34
- package/dist/{js/node → cjs}/features/dev/watch-projects-state.js +7 -19
- package/dist/{js/node → cjs}/features/install/index.js +7 -23
- package/dist/{js/node → cjs}/index.js +4 -0
- package/dist/{js/node → cjs}/log/time.js +1 -15
- package/dist/{js/node → cjs}/parse-config/index.js +13 -39
- package/dist/{js/node → cjs}/parse-config/monorepo.js +4 -0
- package/dist/{js/node → cjs}/projects/check-project-change.js +16 -32
- package/dist/{js/node → cjs}/projects/clear-memory-files.js +4 -0
- package/dist/{js/node → cjs}/projects/get-projects-by-packages-config.js +17 -45
- package/dist/{js/node → cjs}/projects/get-projects-by-workspace-file.js +8 -24
- package/dist/{js/node → cjs}/projects/get-projects.js +18 -47
- package/dist/{js/node → cjs}/utils/install.js +8 -24
- package/dist/esm/cli/build-watch.js +11 -0
- package/dist/esm/cli/build.js +12 -0
- package/dist/esm/cli/clear.js +11 -0
- package/dist/esm/cli/deploy.js +16 -0
- package/dist/esm/cli/install.js +11 -0
- package/dist/esm/cli/new.js +18 -0
- package/dist/esm/commands/build-watch.js +24 -0
- package/dist/esm/commands/build.js +56 -0
- package/dist/esm/commands/clear.js +19 -0
- package/dist/{js/modern → esm}/commands/deploy.js +4 -24
- package/dist/esm/commands/install.js +23 -0
- package/dist/{js/modern → esm}/dag/create.js +9 -18
- package/dist/esm/dag/operator.js +236 -0
- package/dist/esm/dag/task.js +55 -0
- package/dist/{js/modern → esm}/features/build/index.js +13 -33
- package/dist/{js/modern → esm}/features/deploy/index.js +11 -30
- package/dist/{js/modern → esm}/features/dev/create-task.js +6 -26
- package/dist/{js/modern → esm}/features/dev/index.js +14 -34
- package/dist/{js/modern → esm}/features/dev/watch-projects-state.js +3 -21
- package/dist/{js/modern → esm}/features/install/index.js +3 -23
- package/dist/esm/log/time.js +13 -0
- package/dist/esm/parse-config/index.js +19 -0
- package/dist/{js/modern → esm}/projects/check-project-change.js +12 -32
- package/dist/{js/modern → esm}/projects/get-projects-by-packages-config.js +13 -47
- package/dist/{js/modern → esm}/projects/get-projects-by-workspace-file.js +4 -24
- package/dist/{js/modern → esm}/projects/get-projects.js +18 -49
- package/dist/esm/utils/install.js +27 -0
- package/dist/types/package/index.d.ts +1 -1
- package/package.json +16 -16
- package/dist/js/modern/cli/build-watch.js +0 -31
- package/dist/js/modern/cli/build.js +0 -32
- package/dist/js/modern/cli/clear.js +0 -31
- package/dist/js/modern/cli/deploy.js +0 -36
- package/dist/js/modern/cli/install.js +0 -31
- package/dist/js/modern/cli/new.js +0 -57
- package/dist/js/modern/commands/build-watch.js +0 -44
- package/dist/js/modern/commands/build.js +0 -90
- package/dist/js/modern/commands/clear.js +0 -39
- package/dist/js/modern/commands/install.js +0 -43
- package/dist/js/modern/dag/operator.js +0 -251
- package/dist/js/modern/dag/task.js +0 -79
- package/dist/js/modern/log/time.js +0 -29
- package/dist/js/modern/parse-config/index.js +0 -51
- package/dist/js/modern/utils/install.js +0 -47
- package/dist/js/node/cli/install.js +0 -54
- package/dist/js/node/dag/operator.js +0 -278
- /package/dist/{js/node → cjs}/cli/index.js +0 -0
- /package/dist/{js/node → cjs}/commands/index.js +0 -0
- /package/dist/{js/node → cjs}/constants.js +0 -0
- /package/dist/{js/node → cjs}/dag/edge-manager.js +0 -0
- /package/dist/{js/node → cjs}/dag/index.js +0 -0
- /package/dist/{js/node → cjs}/dag/utils.js +0 -0
- /package/dist/{js/node → cjs}/features/dev/cmds.js +0 -0
- /package/dist/{js/node → cjs}/hooks/index.js +0 -0
- /package/dist/{js/node → cjs}/locale/en.js +0 -0
- /package/dist/{js/node → cjs}/locale/index.js +0 -0
- /package/dist/{js/node → cjs}/locale/zh.js +0 -0
- /package/dist/{js/node → cjs}/log/error.js +0 -0
- /package/dist/{js/node → cjs}/log/multi-tasks-log.js +0 -0
- /package/dist/{js/node → cjs}/log/utils.js +0 -0
- /package/dist/{js/node → cjs}/package/index.js +0 -0
- /package/dist/{js/node → cjs}/type.js +0 -0
- /package/dist/{js/node → cjs}/utils/language.js +0 -0
- /package/dist/{js/node → cjs}/utils/types.js +0 -0
- /package/dist/{js/modern → esm}/cli/index.js +0 -0
- /package/dist/{js/modern → esm}/commands/index.js +0 -0
- /package/dist/{js/modern → esm}/constants.js +0 -0
- /package/dist/{js/modern → esm}/dag/edge-manager.js +0 -0
- /package/dist/{js/modern → esm}/dag/index.js +0 -0
- /package/dist/{js/modern → esm}/dag/utils.js +0 -0
- /package/dist/{js/modern → esm}/features/clear/index.js +0 -0
- /package/dist/{js/modern → esm}/features/dev/cmds.js +0 -0
- /package/dist/{js/modern → esm}/hooks/index.js +0 -0
- /package/dist/{js/modern → esm}/index.js +0 -0
- /package/dist/{js/modern → esm}/locale/en.js +0 -0
- /package/dist/{js/modern → esm}/locale/index.js +0 -0
- /package/dist/{js/modern → esm}/locale/zh.js +0 -0
- /package/dist/{js/modern → esm}/log/error.js +0 -0
- /package/dist/{js/modern → esm}/log/multi-tasks-log.js +0 -0
- /package/dist/{js/modern → esm}/log/utils.js +0 -0
- /package/dist/{js/modern → esm}/package/index.js +0 -0
- /package/dist/{js/modern → esm}/parse-config/monorepo.js +0 -0
- /package/dist/{js/modern → esm}/projects/clear-memory-files.js +0 -0
- /package/dist/{js/modern → esm}/type.js +0 -0
- /package/dist/{js/modern → esm}/utils/language.js +0 -0
- /package/dist/{js/modern → esm}/utils/types.js +0 -0
|
@@ -1,21 +1,7 @@
|
|
|
1
1
|
var __defProp = Object.defineProperty;
|
|
2
2
|
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
3
3
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
4
|
-
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
4
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
-
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
7
|
-
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
8
|
-
var __spreadValues = (a, b) => {
|
|
9
|
-
for (var prop in b || (b = {}))
|
|
10
|
-
if (__hasOwnProp.call(b, prop))
|
|
11
|
-
__defNormalProp(a, prop, b[prop]);
|
|
12
|
-
if (__getOwnPropSymbols)
|
|
13
|
-
for (var prop of __getOwnPropSymbols(b)) {
|
|
14
|
-
if (__propIsEnum.call(b, prop))
|
|
15
|
-
__defNormalProp(a, prop, b[prop]);
|
|
16
|
-
}
|
|
17
|
-
return a;
|
|
18
|
-
};
|
|
19
5
|
var __export = (target, all) => {
|
|
20
6
|
for (var name in all)
|
|
21
7
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -38,12 +24,19 @@ const initProjectDependencyAndDependent = (project, projectsName, projectsMap) =
|
|
|
38
24
|
const dependencies = project.extra.dependencies || {};
|
|
39
25
|
const devDependencies = project.extra.devDependencies || {};
|
|
40
26
|
const optionalDependencies = project.extra.optionalDependencies || {};
|
|
41
|
-
const DependencyProjectsName = Object.keys(
|
|
27
|
+
const DependencyProjectsName = Object.keys({
|
|
28
|
+
...dependencies,
|
|
29
|
+
...devDependencies,
|
|
30
|
+
...optionalDependencies
|
|
31
|
+
}).filter((depName) => projectsName.includes(depName));
|
|
42
32
|
project.dependent = project.dependent || [];
|
|
43
33
|
project.dependency = DependencyProjectsName.map((projectName) => {
|
|
44
34
|
const dependencyProject = projectsMap.get(projectName);
|
|
45
35
|
const dependent = (dependencyProject == null ? void 0 : dependencyProject.dependent) || [];
|
|
46
|
-
if (
|
|
36
|
+
if (
|
|
37
|
+
// 消除重复添加的情况
|
|
38
|
+
!dependent.some((p) => p.name === project.name)
|
|
39
|
+
) {
|
|
47
40
|
dependencyProject.dependent = [...dependent, project];
|
|
48
41
|
dependencyProject.dependentEdge = dependencyProject.dependent.length;
|
|
49
42
|
}
|
|
@@ -0,0 +1,269 @@
|
|
|
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
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
24
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
25
|
+
mod
|
|
26
|
+
));
|
|
27
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
28
|
+
var operator_exports = {};
|
|
29
|
+
__export(operator_exports, {
|
|
30
|
+
DagOperator: () => DagOperator
|
|
31
|
+
});
|
|
32
|
+
module.exports = __toCommonJS(operator_exports);
|
|
33
|
+
var import_p_map = __toESM(require("p-map"));
|
|
34
|
+
var import_error = require("../log/error");
|
|
35
|
+
var import_task = require("./task");
|
|
36
|
+
var import_edge_manager = require("./edge-manager");
|
|
37
|
+
var import_utils = require("./utils");
|
|
38
|
+
class DagOperator {
|
|
39
|
+
constructor(projects, projectsMap) {
|
|
40
|
+
this._createTask = (project, task) => async (stopTask = () => void 0) => {
|
|
41
|
+
await task(project, project.dependency || [], () => stopTask());
|
|
42
|
+
return project.name;
|
|
43
|
+
};
|
|
44
|
+
this._projects = projects;
|
|
45
|
+
this._projectsMap = projectsMap;
|
|
46
|
+
this._sortedProjects = [];
|
|
47
|
+
}
|
|
48
|
+
checkNodeDataExist(name) {
|
|
49
|
+
return this._projectsMap.has(name);
|
|
50
|
+
}
|
|
51
|
+
getNodeData(name, option = { checkExist: false }) {
|
|
52
|
+
if (option.checkExist) {
|
|
53
|
+
if (this._projectsMap.has(name)) {
|
|
54
|
+
return this._projectsMap.get(name);
|
|
55
|
+
} else {
|
|
56
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return this._projectsMap.get(name);
|
|
60
|
+
}
|
|
61
|
+
getNodeDependencyData(name) {
|
|
62
|
+
var _a;
|
|
63
|
+
return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependency) || [];
|
|
64
|
+
}
|
|
65
|
+
getNodeDependentData(name) {
|
|
66
|
+
var _a;
|
|
67
|
+
return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependent) || [];
|
|
68
|
+
}
|
|
69
|
+
getNodeAllDependencyData(name, option = { skipCircleCheck: false }) {
|
|
70
|
+
const { skipCircleCheck } = option;
|
|
71
|
+
if (!skipCircleCheck) {
|
|
72
|
+
this.checkCircle();
|
|
73
|
+
}
|
|
74
|
+
if (!this._projectsMap.has(name)) {
|
|
75
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
76
|
+
}
|
|
77
|
+
const currentNode = this._projectsMap.get(name);
|
|
78
|
+
return (0, import_utils.recursiveGetDependency)(currentNode, skipCircleCheck);
|
|
79
|
+
}
|
|
80
|
+
setNodeData(name, task) {
|
|
81
|
+
if (this._projectsMap.has(name)) {
|
|
82
|
+
task(this._projectsMap.get(name));
|
|
83
|
+
} else {
|
|
84
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
async traverseAllNodes(task) {
|
|
88
|
+
const sortedNodes = this._sortedProjects.length > 0 ? this._sortedProjects : (0, import_utils.sortProjects)(this._projects);
|
|
89
|
+
const finishTaskHash = {};
|
|
90
|
+
let preNodes = [];
|
|
91
|
+
let earlyFinish = false;
|
|
92
|
+
for (const projects of sortedNodes) {
|
|
93
|
+
if (earlyFinish) {
|
|
94
|
+
break;
|
|
95
|
+
}
|
|
96
|
+
await (0, import_p_map.default)(
|
|
97
|
+
projects,
|
|
98
|
+
// eslint-disable-next-line @typescript-eslint/no-loop-func
|
|
99
|
+
async (project) => {
|
|
100
|
+
if (!finishTaskHash[project.name]) {
|
|
101
|
+
finishTaskHash[project.name] = true;
|
|
102
|
+
await task(
|
|
103
|
+
project,
|
|
104
|
+
this._getProjectPreviousNode(project.dependent || [], preNodes),
|
|
105
|
+
() => earlyFinish = true
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
},
|
|
109
|
+
{ concurrency: projects.length }
|
|
110
|
+
);
|
|
111
|
+
preNodes = [...projects];
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
checkCircle() {
|
|
115
|
+
this._checkForCyclicDependencies(this._projects, [], /* @__PURE__ */ new Set());
|
|
116
|
+
}
|
|
117
|
+
async traverseDependenciesToProjectToDependent(name, task, config = {}) {
|
|
118
|
+
await this.traverseDependenciesToProject(name, task, config);
|
|
119
|
+
await this.traverseProjectToDependent(name, task, {
|
|
120
|
+
...config,
|
|
121
|
+
withSelf: false
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* 1. 把目标节点当做叶子节点集合 A 中的元素
|
|
126
|
+
* 2. 当叶子节点集合中某个 a 元素结束任务的时候进行如下操作:
|
|
127
|
+
* 2.1 剪(去额外的)枝:获取 a 元素的 dependent集合,将该集合中元素的依赖列表进行过滤,过滤条件为:排除 a 以及 a 元素的 dependent集合以外的元素。
|
|
128
|
+
* 2.2 入度减一:对 a 元素的 dependent 集合元素的 dependencyEdge 减一
|
|
129
|
+
* 3. 检查是否存在 dependencyEdge === 0 的节点,加入叶子节点集合 A中。
|
|
130
|
+
* 4. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
|
|
131
|
+
*/
|
|
132
|
+
async traverseProjectToDependent(name, task, { withSelf = false, runTaskConcurrency } = {}) {
|
|
133
|
+
if (!this._projectsMap.has(name)) {
|
|
134
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
135
|
+
}
|
|
136
|
+
const traverseTargetNode = this._projectsMap.get(name);
|
|
137
|
+
const leafNodeTasks = [
|
|
138
|
+
withSelf ? this._createTask(traverseTargetNode, task) : async () => Promise.resolve(traverseTargetNode.name)
|
|
139
|
+
];
|
|
140
|
+
const taskRunner = new import_task.TaskRunner(leafNodeTasks, {
|
|
141
|
+
concurrency: runTaskConcurrency
|
|
142
|
+
});
|
|
143
|
+
const edgeManager = new import_edge_manager.EdgeManager();
|
|
144
|
+
taskRunner.on(import_task.TaskRunner.TASK_FINISH, (projectName) => {
|
|
145
|
+
const projectNode = this.getNodeData(projectName);
|
|
146
|
+
const dependent = projectNode.dependent || [];
|
|
147
|
+
for (const dependentProject of dependent) {
|
|
148
|
+
const dependency = dependentProject.dependency || [];
|
|
149
|
+
const removeNodes = dependency.filter(
|
|
150
|
+
(dependencyProject) => ![projectName, ...dependent.map((p) => p.name)].includes(
|
|
151
|
+
dependencyProject.name
|
|
152
|
+
)
|
|
153
|
+
);
|
|
154
|
+
edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
|
|
155
|
+
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
156
|
+
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
await taskRunner.run();
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* 1. 找到叶子节点集合 A
|
|
164
|
+
* 2. 找到直接连接叶子节点的节点集合 B
|
|
165
|
+
* 3. 当有某个叶子节点结束任务,则对该节点的直接连接的节点(或者理解成dependent)的枝数(或者叫入度)减一。
|
|
166
|
+
* 4. 检查 B 集合中是否存在入度为0的节点,则此节点为叶子节点,并加入叶子节点集合 A
|
|
167
|
+
* 5. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
|
|
168
|
+
*/
|
|
169
|
+
// TODO: 执行顺序还需要再确定一下
|
|
170
|
+
async traverseDependenciesToProject(name, task, { withSelf = false, runTaskConcurrency } = {}) {
|
|
171
|
+
if (!this._projectsMap.has(name)) {
|
|
172
|
+
(0, import_error.errorLog)(`No '${name}' project exist`);
|
|
173
|
+
}
|
|
174
|
+
const traverseTargetNode = this._projectsMap.get(name);
|
|
175
|
+
const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
|
|
176
|
+
if ((leafNodes == null ? void 0 : leafNodes.length) === 0) {
|
|
177
|
+
await this._createTask(traverseTargetNode, task)();
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const leafNodeTasks = leafNodes.map(
|
|
181
|
+
(project) => this._createTask(project, task)
|
|
182
|
+
);
|
|
183
|
+
const taskRunner = new import_task.TaskRunner(leafNodeTasks, {
|
|
184
|
+
concurrency: runTaskConcurrency
|
|
185
|
+
});
|
|
186
|
+
const edgeManager = new import_edge_manager.EdgeManager();
|
|
187
|
+
taskRunner.on(import_task.TaskRunner.TASK_FINISH, (projectName) => {
|
|
188
|
+
const projectNode = this.getNodeData(projectName);
|
|
189
|
+
const dependent = projectNode.dependent || [];
|
|
190
|
+
for (const dependentProject of dependent) {
|
|
191
|
+
if (![traverseTargetNode, ...leafNodes].some(
|
|
192
|
+
(n) => n.name === dependentProject.name
|
|
193
|
+
)) {
|
|
194
|
+
continue;
|
|
195
|
+
}
|
|
196
|
+
edgeManager.reduceOneEdge(dependentProject);
|
|
197
|
+
if (dependentProject.name === traverseTargetNode.name && !withSelf) {
|
|
198
|
+
continue;
|
|
199
|
+
}
|
|
200
|
+
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
201
|
+
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
});
|
|
205
|
+
await taskRunner.run();
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
209
|
+
*
|
|
210
|
+
* This source code is licensed under the MIT license found in the
|
|
211
|
+
* LICENSE file at
|
|
212
|
+
* https://github.com/microsoft/rushstack/blob/master/apps/rush-lib/LICENSE
|
|
213
|
+
*
|
|
214
|
+
/**
|
|
215
|
+
* Checks for projects that indirectly depend on themselves.
|
|
216
|
+
*/
|
|
217
|
+
_checkForCyclicDependencies(projects, dependencyChain, alreadyCheckedProjects) {
|
|
218
|
+
for (const project of projects) {
|
|
219
|
+
if (dependencyChain.includes(project.name)) {
|
|
220
|
+
throw new Error(
|
|
221
|
+
`${"A cyclic dependency was encountered:\n"} ${[
|
|
222
|
+
...dependencyChain,
|
|
223
|
+
project.name
|
|
224
|
+
].reverse().join("\n -> ")}
|
|
225
|
+
`
|
|
226
|
+
);
|
|
227
|
+
}
|
|
228
|
+
if (!alreadyCheckedProjects.has(project.name)) {
|
|
229
|
+
alreadyCheckedProjects.add(project.name);
|
|
230
|
+
dependencyChain.push(project.name);
|
|
231
|
+
this._checkForCyclicDependencies(
|
|
232
|
+
project.dependent,
|
|
233
|
+
dependencyChain,
|
|
234
|
+
alreadyCheckedProjects
|
|
235
|
+
);
|
|
236
|
+
dependencyChain.pop();
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
_getDependencyLeafNodes(node) {
|
|
241
|
+
const dependency = node.dependency;
|
|
242
|
+
if (dependency.length === 0) {
|
|
243
|
+
return [];
|
|
244
|
+
}
|
|
245
|
+
let leafNodes = [...dependency];
|
|
246
|
+
for (const dependencyNode of dependency) {
|
|
247
|
+
leafNodes = [
|
|
248
|
+
...leafNodes,
|
|
249
|
+
...this._getDependencyLeafNodes(dependencyNode)
|
|
250
|
+
];
|
|
251
|
+
}
|
|
252
|
+
return leafNodes;
|
|
253
|
+
}
|
|
254
|
+
_getProjectPreviousNode(searchProjects, preNodes) {
|
|
255
|
+
return searchProjects.filter(
|
|
256
|
+
(p) => preNodes.map((preP) => preP.name).includes(p.name)
|
|
257
|
+
);
|
|
258
|
+
}
|
|
259
|
+
// public async getOrderTasks() {
|
|
260
|
+
// // Precalculate the number of dependent packages
|
|
261
|
+
// for (const project of this._projects) {
|
|
262
|
+
// calculateCriticalPaths(project);
|
|
263
|
+
// }
|
|
264
|
+
// }
|
|
265
|
+
}
|
|
266
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
267
|
+
0 && (module.exports = {
|
|
268
|
+
DagOperator
|
|
269
|
+
});
|
|
@@ -17,30 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
19
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
24
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
25
|
mod
|
|
22
26
|
));
|
|
23
27
|
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
28
|
var task_exports = {};
|
|
45
29
|
__export(task_exports, {
|
|
46
30
|
TaskRunner: () => TaskRunner
|
|
@@ -56,44 +40,40 @@ const _TaskRunner = class extends import_events.EventEmitter {
|
|
|
56
40
|
this._usableConcurrency = this._concurrency;
|
|
57
41
|
this._stopFlag = false;
|
|
58
42
|
}
|
|
59
|
-
run() {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
);
|
|
70
|
-
});
|
|
43
|
+
async run() {
|
|
44
|
+
const tasks = this._tasks.splice(0, this._concurrency);
|
|
45
|
+
this._usableConcurrency = this._concurrency - tasks.length;
|
|
46
|
+
await (0, import_p_map.default)(
|
|
47
|
+
tasks,
|
|
48
|
+
async (task) => {
|
|
49
|
+
await this._runTask(task);
|
|
50
|
+
},
|
|
51
|
+
{ concurrency: tasks.length }
|
|
52
|
+
);
|
|
71
53
|
}
|
|
72
54
|
addTask(task) {
|
|
73
55
|
this._tasks.push(task);
|
|
74
56
|
}
|
|
75
|
-
_runTask(task) {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
);
|
|
94
|
-
}
|
|
57
|
+
async _runTask(task) {
|
|
58
|
+
if (this._stopFlag) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const emitValue = await task(this._stopTask.bind(this));
|
|
62
|
+
this._usableConcurrency--;
|
|
63
|
+
this.emit(_TaskRunner.TASK_FINISH, emitValue);
|
|
64
|
+
if (this._tasks.length > 0) {
|
|
65
|
+
const nextTasks = this._tasks.splice(0, this._usableConcurrency);
|
|
66
|
+
this._usableConcurrency -= nextTasks.length;
|
|
67
|
+
if (nextTasks.length > 0) {
|
|
68
|
+
await (0, import_p_map.default)(
|
|
69
|
+
nextTasks,
|
|
70
|
+
async (_task) => {
|
|
71
|
+
await this._runTask(_task);
|
|
72
|
+
},
|
|
73
|
+
{ concurrency: nextTasks.length }
|
|
74
|
+
);
|
|
95
75
|
}
|
|
96
|
-
}
|
|
76
|
+
}
|
|
97
77
|
}
|
|
98
78
|
_stopTask() {
|
|
99
79
|
this._stopFlag = true;
|
|
@@ -17,30 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
19
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
24
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
25
|
mod
|
|
22
26
|
));
|
|
23
27
|
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
28
|
var build_exports = {};
|
|
45
29
|
__export(build_exports, {
|
|
46
30
|
runAllBuildTask: () => runAllBuildTask,
|
|
@@ -59,17 +43,17 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
|
59
43
|
disableContentHash = false,
|
|
60
44
|
enableGitHash = false
|
|
61
45
|
} = config;
|
|
62
|
-
const task = (project) =>
|
|
46
|
+
const task = async (project) => {
|
|
63
47
|
console.info("run ", project.name);
|
|
64
48
|
if (!disableContentHash) {
|
|
65
|
-
const changed =
|
|
49
|
+
const changed = await (0, import_check_project_change.checkProjectChangeByContent)(project);
|
|
66
50
|
if (!changed) {
|
|
67
51
|
console.info(`${project.name} content not change, skip`);
|
|
68
52
|
return;
|
|
69
53
|
}
|
|
70
54
|
}
|
|
71
55
|
if (enableGitHash) {
|
|
72
|
-
const changed =
|
|
56
|
+
const changed = await (0, import_check_project_change.checkProjectChangeByGit)(project, rootPath);
|
|
73
57
|
if (!changed) {
|
|
74
58
|
console.info(`${project.name} not change, skip`);
|
|
75
59
|
return;
|
|
@@ -91,7 +75,7 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
|
91
75
|
stderr: childProcess.stderr,
|
|
92
76
|
logConfig: { label: "BUILD: " }
|
|
93
77
|
});
|
|
94
|
-
|
|
78
|
+
await childProcess;
|
|
95
79
|
import_utils.signale.timeEnd(prefix);
|
|
96
80
|
} catch (e) {
|
|
97
81
|
(0, import_error.errorLog)(project.name, e.message);
|
|
@@ -100,11 +84,11 @@ const createTask = (config, taskCmds = defaultBuildCmds, taskLogger) => {
|
|
|
100
84
|
console.info(`${project.name} not have ${taskCmd}, skip it.`);
|
|
101
85
|
}
|
|
102
86
|
}
|
|
103
|
-
}
|
|
87
|
+
};
|
|
104
88
|
return task;
|
|
105
89
|
};
|
|
106
90
|
const defaultBuildCmds = ["build"];
|
|
107
|
-
const runBuildTask =
|
|
91
|
+
const runBuildTask = async (projectName, operator, config, taskCmds = defaultBuildCmds) => {
|
|
108
92
|
const {
|
|
109
93
|
withSelf = true,
|
|
110
94
|
onlySelf = false,
|
|
@@ -114,14 +98,14 @@ const runBuildTask = (_0, _1, _2, ..._3) => __async(void 0, [_0, _1, _2, ..._3],
|
|
|
114
98
|
const taskLogger = new import_multi_tasks_log.MultitasksLogger();
|
|
115
99
|
const task = createTask(config, taskCmds, taskLogger);
|
|
116
100
|
if (onlySelf) {
|
|
117
|
-
|
|
101
|
+
await task(operator.getNodeData(projectName, { checkExist: true }));
|
|
118
102
|
} else if (!disableWithDeps && withDept) {
|
|
119
|
-
|
|
103
|
+
await operator.traverseDependenciesToProjectToDependent(projectName, task, {
|
|
120
104
|
withSelf,
|
|
121
105
|
runTaskConcurrency: import_os.default.cpus().length
|
|
122
106
|
});
|
|
123
107
|
} else if (disableWithDeps && withDept) {
|
|
124
|
-
|
|
108
|
+
await operator.traverseProjectToDependent(projectName, task, {
|
|
125
109
|
withSelf,
|
|
126
110
|
runTaskConcurrency: import_os.default.cpus().length
|
|
127
111
|
});
|
|
@@ -131,12 +115,12 @@ const runBuildTask = (_0, _1, _2, ..._3) => __async(void 0, [_0, _1, _2, ..._3],
|
|
|
131
115
|
runTaskConcurrency: import_os.default.cpus().length
|
|
132
116
|
});
|
|
133
117
|
}
|
|
134
|
-
}
|
|
135
|
-
const runAllBuildTask =
|
|
118
|
+
};
|
|
119
|
+
const runAllBuildTask = async (operator, config, taskCmds = defaultBuildCmds) => {
|
|
136
120
|
const taskLogger = new import_multi_tasks_log.MultitasksLogger();
|
|
137
121
|
const task = createTask(config, taskCmds, taskLogger);
|
|
138
|
-
|
|
139
|
-
}
|
|
122
|
+
await operator.traverseAllNodes(task);
|
|
123
|
+
};
|
|
140
124
|
// Annotate the CommonJS export names for ESM import in node:
|
|
141
125
|
0 && (module.exports = {
|
|
142
126
|
runAllBuildTask,
|
|
@@ -17,6 +17,10 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
19
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
24
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
25
|
mod
|
|
22
26
|
));
|
|
@@ -17,30 +17,14 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
17
17
|
return to;
|
|
18
18
|
};
|
|
19
19
|
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
20
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
21
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
22
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
23
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
20
24
|
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
21
25
|
mod
|
|
22
26
|
));
|
|
23
27
|
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
28
|
var deploy_exports = {};
|
|
45
29
|
__export(deploy_exports, {
|
|
46
30
|
deploy: () => deploy
|
|
@@ -103,7 +87,7 @@ const generatorAndCopyRequiredFiles = (rootPath, deployDir) => {
|
|
|
103
87
|
copy("package-lock.json");
|
|
104
88
|
checkAndUpdatePMWorkspaces(deployDir);
|
|
105
89
|
};
|
|
106
|
-
const checkAndRunDeployCommand = (monorepoPath, targetProject, packageManager) =>
|
|
90
|
+
const checkAndRunDeployCommand = async (monorepoPath, targetProject, packageManager) => {
|
|
107
91
|
var _a, _b, _c;
|
|
108
92
|
const scripts = ((_a = targetProject.extra) == null ? void 0 : _a.scripts) || {};
|
|
109
93
|
if (scripts.deploy) {
|
|
@@ -112,7 +96,7 @@ const checkAndRunDeployCommand = (monorepoPath, targetProject, packageManager) =
|
|
|
112
96
|
);
|
|
113
97
|
let runDeployCommands = ["run", "deploy"];
|
|
114
98
|
if (packageManager === "pnpm") {
|
|
115
|
-
const pnpmVersion =
|
|
99
|
+
const pnpmVersion = await (0, import_utils.getPnpmVersion)();
|
|
116
100
|
if (pnpmVersion.startsWith("6")) {
|
|
117
101
|
runDeployCommands = ["run", "deploy", "--filter", targetProject.name];
|
|
118
102
|
} else {
|
|
@@ -128,10 +112,10 @@ const checkAndRunDeployCommand = (monorepoPath, targetProject, packageManager) =
|
|
|
128
112
|
});
|
|
129
113
|
(_b = childProcess.stdout) == null ? void 0 : _b.pipe(process.stdout);
|
|
130
114
|
(_c = childProcess.stderr) == null ? void 0 : _c.pipe(process.stderr);
|
|
131
|
-
|
|
115
|
+
await childProcess;
|
|
132
116
|
}
|
|
133
|
-
}
|
|
134
|
-
const installDependency = (deployDir, packageManager) =>
|
|
117
|
+
};
|
|
118
|
+
const installDependency = async (deployDir, packageManager) => {
|
|
135
119
|
const packageJsonPath = path.join(deployDir, "package.json");
|
|
136
120
|
const packageJson = import_node_core_library.JsonFile.load(packageJsonPath);
|
|
137
121
|
const scripts = (packageJson == null ? void 0 : packageJson.scripts) || {};
|
|
@@ -153,11 +137,11 @@ const installDependency = (deployDir, packageManager) => __async(void 0, null, f
|
|
|
153
137
|
cwd: deployDir,
|
|
154
138
|
env: { NODE_ENV: void 0 }
|
|
155
139
|
});
|
|
156
|
-
|
|
157
|
-
}
|
|
140
|
+
await childProcess;
|
|
141
|
+
};
|
|
158
142
|
const excludeDirs = (filePath, dirs) => dirs.some((dir) => filePath.includes(dir));
|
|
159
143
|
const defaultDeployPath = "output";
|
|
160
|
-
const deploy = (deployProjectNames, operator, config) =>
|
|
144
|
+
const deploy = async (deployProjectNames, operator, config) => {
|
|
161
145
|
const { rootPath, packageManager, deployPath = defaultDeployPath } = config;
|
|
162
146
|
const realDeployPath = path.isAbsolute(deployPath) ? deployPath : path.join(rootPath, deployPath);
|
|
163
147
|
import_node_core_library.FileSystem.deleteFolder(realDeployPath);
|
|
@@ -172,12 +156,13 @@ const deploy = (deployProjectNames, operator, config) => __async(void 0, null, f
|
|
|
172
156
|
alldeps,
|
|
173
157
|
realDeployPath
|
|
174
158
|
);
|
|
175
|
-
|
|
159
|
+
await checkAndRunDeployCommand(rootPath, currentProject, packageManager);
|
|
176
160
|
import_node_core_library.FileSystem.ensureFolder(realDeployPath);
|
|
177
161
|
for (const [from, to] of copyMap) {
|
|
178
162
|
import_node_core_library.FileSystem.copyFiles({
|
|
179
163
|
sourcePath: from,
|
|
180
164
|
destinationPath: to,
|
|
165
|
+
// If true, then when copying symlinks, copy the target object instead of copying the link.
|
|
181
166
|
dereferenceSymlinks: false,
|
|
182
167
|
filter(filePath) {
|
|
183
168
|
if (excludeDirs(filePath, ["node_modules", "dist"])) {
|
|
@@ -190,7 +175,7 @@ const deploy = (deployProjectNames, operator, config) => __async(void 0, null, f
|
|
|
190
175
|
}
|
|
191
176
|
generatorAndCopyRequiredFiles(rootPath, realDeployPath);
|
|
192
177
|
import_utils.logger.success(`Deploy success. The deploy dir is in '${rootPath}/output'`);
|
|
193
|
-
}
|
|
178
|
+
};
|
|
194
179
|
// Annotate the CommonJS export names for ESM import in node:
|
|
195
180
|
0 && (module.exports = {
|
|
196
181
|
deploy
|