@modern-js/monorepo-tools 2.15.0 → 2.16.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.
Files changed (96) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cjs/cli/build.js +10 -31
  3. package/dist/cjs/cli/buildWatch.js +11 -31
  4. package/dist/cjs/cli/clear.js +11 -31
  5. package/dist/cjs/cli/deploy.js +14 -36
  6. package/dist/cjs/cli/index.js +23 -22
  7. package/dist/cjs/cli/install.js +11 -31
  8. package/dist/cjs/cli/new.js +17 -37
  9. package/dist/cjs/commands/build.js +21 -46
  10. package/dist/cjs/commands/buildWatch.js +19 -36
  11. package/dist/cjs/commands/clear.js +17 -34
  12. package/dist/cjs/commands/deploy.js +25 -41
  13. package/dist/cjs/commands/index.js +22 -21
  14. package/dist/cjs/commands/install.js +19 -36
  15. package/dist/cjs/constants.js +13 -26
  16. package/dist/cjs/dag/create.js +16 -28
  17. package/dist/cjs/dag/edgeManager.js +24 -28
  18. package/dist/cjs/dag/index.js +11 -29
  19. package/dist/cjs/dag/operator.js +106 -123
  20. package/dist/cjs/dag/task.js +52 -63
  21. package/dist/cjs/dag/utils.js +52 -49
  22. package/dist/cjs/features/build/index.js +52 -68
  23. package/dist/cjs/features/clear/index.js +66 -47
  24. package/dist/cjs/features/deploy/index.js +126 -96
  25. package/dist/cjs/features/dev/cmds.js +10 -25
  26. package/dist/cjs/features/dev/createTask.js +93 -56
  27. package/dist/cjs/features/dev/index.js +43 -71
  28. package/dist/cjs/features/dev/watchProjectsState.js +89 -64
  29. package/dist/cjs/features/install/index.js +74 -63
  30. package/dist/cjs/hooks/index.js +9 -27
  31. package/dist/cjs/index.js +36 -53
  32. package/dist/cjs/locale/en.js +7 -25
  33. package/dist/cjs/locale/index.js +18 -28
  34. package/dist/cjs/locale/zh.js +7 -25
  35. package/dist/cjs/log/error.js +7 -25
  36. package/dist/cjs/log/multiTasksLog.js +42 -43
  37. package/dist/cjs/log/time.js +19 -29
  38. package/dist/cjs/log/utils.js +7 -25
  39. package/dist/cjs/package/index.js +28 -30
  40. package/dist/cjs/parse-config/index.js +61 -49
  41. package/dist/cjs/parse-config/monorepo.js +81 -67
  42. package/dist/cjs/projects/checkProjectChange.js +95 -73
  43. package/dist/cjs/projects/clearMemoryFiles.js +52 -44
  44. package/dist/cjs/projects/getProjects.js +38 -65
  45. package/dist/cjs/projects/getProjectsByPackagesConfig.js +93 -71
  46. package/dist/cjs/projects/getProjectsByWorkspaceFile.js +89 -85
  47. package/dist/cjs/type.js +4 -15
  48. package/dist/cjs/utils/install.js +69 -44
  49. package/dist/cjs/utils/types.js +4 -15
  50. package/dist/esm/cli/build.js +2 -8
  51. package/dist/esm/cli/buildWatch.js +4 -9
  52. package/dist/esm/cli/clear.js +4 -9
  53. package/dist/esm/cli/deploy.js +7 -14
  54. package/dist/esm/cli/install.js +4 -9
  55. package/dist/esm/cli/new.js +9 -14
  56. package/dist/esm/commands/build.js +7 -17
  57. package/dist/esm/commands/buildWatch.js +6 -8
  58. package/dist/esm/commands/clear.js +6 -8
  59. package/dist/esm/commands/deploy.js +10 -11
  60. package/dist/esm/commands/install.js +6 -8
  61. package/dist/esm/constants.js +2 -6
  62. package/dist/esm/dag/create.js +10 -7
  63. package/dist/esm/dag/edgeManager.js +17 -6
  64. package/dist/esm/dag/index.js +1 -4
  65. package/dist/esm/dag/operator.js +77 -74
  66. package/dist/esm/dag/task.js +39 -30
  67. package/dist/esm/dag/utils.js +39 -27
  68. package/dist/esm/features/build/index.js +22 -27
  69. package/dist/esm/features/clear/index.js +4 -6
  70. package/dist/esm/features/deploy/index.js +55 -50
  71. package/dist/esm/features/dev/cmds.js +4 -4
  72. package/dist/esm/features/dev/createTask.js +31 -15
  73. package/dist/esm/features/dev/index.js +19 -27
  74. package/dist/esm/features/dev/watchProjectsState.js +41 -31
  75. package/dist/esm/features/install/index.js +11 -15
  76. package/dist/esm/hooks/index.js +1 -4
  77. package/dist/esm/index.js +12 -11
  78. package/dist/esm/locale/en.js +1 -4
  79. package/dist/esm/locale/index.js +5 -5
  80. package/dist/esm/locale/zh.js +1 -4
  81. package/dist/esm/log/error.js +1 -4
  82. package/dist/esm/log/multiTasksLog.js +32 -18
  83. package/dist/esm/log/time.js +7 -8
  84. package/dist/esm/log/utils.js +1 -4
  85. package/dist/esm/package/index.js +21 -8
  86. package/dist/esm/parse-config/index.js +11 -14
  87. package/dist/esm/parse-config/monorepo.js +20 -27
  88. package/dist/esm/projects/checkProjectChange.js +19 -23
  89. package/dist/esm/projects/clearMemoryFiles.js +3 -13
  90. package/dist/esm/projects/getProjects.js +21 -45
  91. package/dist/esm/projects/getProjectsByPackagesConfig.js +29 -33
  92. package/dist/esm/projects/getProjectsByWorkspaceFile.js +21 -41
  93. package/dist/esm/type.js +1 -0
  94. package/dist/esm/utils/install.js +12 -8
  95. package/dist/esm/utils/types.js +1 -0
  96. 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
- { packagesMatchs: { enableAutoFinder: true } },
10
- appDirectory
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
- };
@@ -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
- };
@@ -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 == null ? void 0 : dependencyProject.dependent) || [];
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 = [...dependent, project];
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 { projectsMap, projectList: projectsName };
36
- };
37
- export {
38
- create
38
+ return {
39
+ projectsMap,
40
+ projectList: projectsName
41
+ };
39
42
  };
@@ -1,7 +1,17 @@
1
- class EdgeManager {
2
- constructor() {
3
- this._dependencyEdgeHash = {};
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
- };
@@ -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
- };
@@ -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 = { checkExist: false }) {
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 _a;
31
- return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependency) || [];
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 _a;
35
- return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependent) || [];
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 = { skipCircleCheck: false }) {
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
- { concurrency: projects.length }
81
+ {
82
+ concurrency: projects.length
83
+ }
78
84
  );
79
- preNodes = [...projects];
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
- * 1. 把目标节点当做叶子节点集合 A 中的元素
94
- * 2. 当叶子节点集合中某个 a 元素结束任务的时候进行如下操作:
95
- * 2.1 剪(去额外的)枝:获取 a 元素的 dependent集合,将该集合中元素的依赖列表进行过滤,过滤条件为:排除 a 以及 a 元素的 dependent集合以外的元素。
96
- * 2.2 入度减一:对 a 元素的 dependent 集合元素的 dependencyEdge 减一
97
- * 3. 检查是否存在 dependencyEdge === 0 的节点,加入叶子节点集合 A中。
98
- * 4. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
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
- (dependencyProject) => ![projectName, ...dependent.map((p) => p.name)].includes(
119
- dependencyProject.name
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
- * 1. 找到叶子节点集合 A
132
- * 2. 找到直接连接叶子节点的节点集合 B
133
- * 3. 当有某个叶子节点结束任务,则对该节点的直接连接的节点(或者理解成dependent)的枝数(或者叫入度)减一。
134
- * 4. 检查 B 集合中是否存在入度为0的节点,则此节点为叶子节点,并加入叶子节点集合 A
135
- * 5. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
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 == null ? void 0 : leafNodes.length) === 0) {
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 (![traverseTargetNode, ...leafNodes].some(
160
- (n) => n.name === dependentProject.name
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
- `${"A cyclic dependency was encountered:\n"} ${[
190
- ...dependencyChain,
191
- project.name
192
- ].reverse().join("\n -> ")}
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 = [...dependency];
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
- (p) => preNodes.map((preP) => preP.name).includes(p.name)
225
- );
226
- }
227
- // public async getOrderTasks() {
228
- // // Precalculate the number of dependent packages
229
- // for (const project of this._projects) {
230
- // calculateCriticalPaths(project);
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
- };
@@ -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
- const _TaskRunner = class extends EventEmitter {
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
- tasks,
16
- async (task) => {
17
- await this._runTask(task);
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(_TaskRunner.TASK_FINISH, emitValue);
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
- nextTasks,
38
- async (_task) => {
39
- await this._runTask(_task);
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
- let TaskRunner = _TaskRunner;
51
- TaskRunner.DefaultConcurrency = 10;
52
- TaskRunner.TASK_FINISH = "task-finish";
53
- export {
54
- TaskRunner
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");
@@ -1,46 +1,55 @@
1
1
  import { errorLog } from "../log/error";
2
2
  import { EdgeManager } from "./edgeManager";
3
- const calculateCriticalPaths = (project) => {
4
- var _a, _b;
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 (((_a = project.dependent) == null ? void 0 : _a.length) === 0) {
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
- (_b = project.dependent) == null ? void 0 : _b.forEach(
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([node.name]);
23
- let queue = [node];
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
- (dep) => !foundDepsNameSet.has(dep.name)
30
- );
31
- allDeps = [...allDeps, ...willIntoQueue];
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 = [...queue, ...willIntoQueue];
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 = [...dependency];
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([...queue]);
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 = [...readyIntoSortedQueue];
76
- sortedQueue.push([...readyIntoSortedQueue]);
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 [...circleNodes, project];
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, [taskCmd], {
31
+ const childProcess = execa(packageManager, [
32
+ taskCmd
33
+ ], {
40
34
  cwd: project.extra.path,
41
- stdio: ["pipe", "pipe", "pipe"]
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: { label: "BUILD: " }
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 = ["build"];
61
- const runBuildTask = async (projectName, operator, config, taskCmds = defaultBuildCmds) => {
62
- const {
63
- withSelf = true,
64
- onlySelf = false,
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, { checkExist: true }));
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
- };