@modern-js/monorepo-tools 2.0.0-beta.0 → 2.0.0-beta.1

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 (78) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/dist/js/modern/cli/new.js +0 -3
  3. package/dist/js/modern/commands/build.js +4 -9
  4. package/dist/js/modern/dag/create.js +8 -15
  5. package/dist/js/modern/dag/edge-manager.js +0 -10
  6. package/dist/js/modern/dag/operator.js +14 -57
  7. package/dist/js/modern/dag/task.js +0 -18
  8. package/dist/js/modern/dag/utils.js +13 -31
  9. package/dist/js/modern/features/build/index.js +8 -19
  10. package/dist/js/modern/features/clear/index.js +0 -1
  11. package/dist/js/modern/features/deploy/index.js +7 -35
  12. package/dist/js/modern/features/dev/cmds.js +1 -0
  13. package/dist/js/modern/features/dev/create-task.js +2 -13
  14. package/dist/js/modern/features/dev/index.js +4 -11
  15. package/dist/js/modern/features/dev/watch-projects-state.js +0 -19
  16. package/dist/js/modern/features/install/index.js +0 -12
  17. package/dist/js/modern/index.js +1 -2
  18. package/dist/js/modern/log/multi-tasks-log.js +8 -31
  19. package/dist/js/modern/log/time.js +0 -3
  20. package/dist/js/modern/log/utils.js +0 -2
  21. package/dist/js/modern/package/index.js +0 -8
  22. package/dist/js/modern/parse-config/index.js +3 -6
  23. package/dist/js/modern/parse-config/monorepo.js +0 -23
  24. package/dist/js/modern/projects/check-project-change.js +4 -16
  25. package/dist/js/modern/projects/get-projects-by-packages-config.js +12 -29
  26. package/dist/js/modern/projects/get-projects-by-workspace-file.js +0 -16
  27. package/dist/js/modern/projects/get-projects.js +4 -29
  28. package/dist/js/modern/utils/install.js +0 -2
  29. package/dist/js/node/cli/build-watch.js +0 -3
  30. package/dist/js/node/cli/build.js +0 -3
  31. package/dist/js/node/cli/clear.js +0 -3
  32. package/dist/js/node/cli/deploy.js +0 -3
  33. package/dist/js/node/cli/index.js +0 -12
  34. package/dist/js/node/cli/install.js +0 -3
  35. package/dist/js/node/cli/new.js +0 -7
  36. package/dist/js/node/commands/build-watch.js +0 -6
  37. package/dist/js/node/commands/build.js +2 -14
  38. package/dist/js/node/commands/clear.js +0 -5
  39. package/dist/js/node/commands/deploy.js +0 -9
  40. package/dist/js/node/commands/index.js +0 -10
  41. package/dist/js/node/commands/install.js +0 -6
  42. package/dist/js/node/dag/create.js +8 -17
  43. package/dist/js/node/dag/edge-manager.js +0 -12
  44. package/dist/js/node/dag/index.js +0 -4
  45. package/dist/js/node/dag/operator.js +14 -65
  46. package/dist/js/node/dag/task.js +0 -23
  47. package/dist/js/node/dag/utils.js +12 -39
  48. package/dist/js/node/features/build/index.js +8 -29
  49. package/dist/js/node/features/clear/index.js +0 -15
  50. package/dist/js/node/features/deploy/index.js +7 -53
  51. package/dist/js/node/features/dev/cmds.js +1 -0
  52. package/dist/js/node/features/dev/create-task.js +2 -22
  53. package/dist/js/node/features/dev/index.js +4 -19
  54. package/dist/js/node/features/dev/watch-projects-state.js +0 -25
  55. package/dist/js/node/features/install/index.js +0 -25
  56. package/dist/js/node/hooks/index.js +0 -2
  57. package/dist/js/node/index.js +2 -16
  58. package/dist/js/node/locale/index.js +0 -4
  59. package/dist/js/node/log/error.js +0 -2
  60. package/dist/js/node/log/multi-tasks-log.js +8 -34
  61. package/dist/js/node/log/time.js +0 -10
  62. package/dist/js/node/log/utils.js +0 -4
  63. package/dist/js/node/package/index.js +0 -10
  64. package/dist/js/node/parse-config/index.js +3 -14
  65. package/dist/js/node/parse-config/monorepo.js +0 -34
  66. package/dist/js/node/projects/check-project-change.js +4 -33
  67. package/dist/js/node/projects/clear-memory-files.js +0 -8
  68. package/dist/js/node/projects/get-projects-by-packages-config.js +12 -41
  69. package/dist/js/node/projects/get-projects-by-workspace-file.js +0 -36
  70. package/dist/js/node/projects/get-projects.js +4 -37
  71. package/dist/js/node/utils/install.js +0 -11
  72. package/dist/js/node/utils/language.js +0 -2
  73. package/dist/types/dag/operator.d.ts +0 -3
  74. package/dist/types/dag/utils.d.ts +0 -1
  75. package/dist/types/features/dev/index.d.ts +0 -1
  76. package/dist/types/index.d.ts +0 -2
  77. package/dist/types/projects/get-projects.d.ts +0 -1
  78. package/package.json +13 -13
package/CHANGELOG.md CHANGED
@@ -1,5 +1,43 @@
1
1
  # @modern-js/monorepo-tools
2
2
 
3
+ ## 2.0.0-beta.1
4
+
5
+ ### Major Changes
6
+
7
+ - dda38c9: chore: v2
8
+
9
+ ### Patch Changes
10
+
11
+ - d4a4566: chore: rename plugin-jarvis to plugin-lint
12
+
13
+ chore: 重命名 plugin-jarvis 为 plugin-lint
14
+
15
+ - Updated dependencies [c9e800d39a]
16
+ - Updated dependencies [85edee888c]
17
+ - Updated dependencies [92f0ead]
18
+ - Updated dependencies [edd1cfb1af]
19
+ - Updated dependencies [cc971eabfc]
20
+ - Updated dependencies [5b9049f]
21
+ - Updated dependencies [d4a4566]
22
+ - Updated dependencies [92004d1]
23
+ - Updated dependencies [b8bbe036c7]
24
+ - Updated dependencies [d5a31df781]
25
+ - Updated dependencies [dda38c9]
26
+ - Updated dependencies [8b8e1bb571]
27
+ - Updated dependencies [3bbea92b2a]
28
+ - Updated dependencies [f179749]
29
+ - Updated dependencies [abf3421]
30
+ - Updated dependencies [543be9558e]
31
+ - Updated dependencies [14b712d]
32
+ - @modern-js/core@2.0.0-beta.1
33
+ - @modern-js/utils@2.0.0-beta.1
34
+ - @modern-js/plugin-lint@2.0.0-beta.1
35
+ - @modern-js/plugin@2.0.0-beta.1
36
+ - @modern-js/plugin-changeset@2.0.0-beta.1
37
+ - @modern-js/plugin-i18n@2.0.0-beta.1
38
+ - @modern-js/new-action@2.0.0-beta.1
39
+ - @modern-js/upgrade@2.0.0-beta.1
40
+
3
41
  ## 2.0.0-beta.0
4
42
 
5
43
  ### Major Changes
@@ -1,9 +1,6 @@
1
1
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
-
3
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import { MonorepoNewAction } from '@modern-js/new-action';
8
5
  import { i18n, localeKeys } from "../locale";
9
6
  export const newCli = (program, locale) => {
@@ -1,13 +1,11 @@
1
1
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
-
3
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import { getMonorepoBaseData } from "../parse-config/monorepo";
8
5
  import { runBuildTask, runAllBuildTask } from "../features/build";
9
6
  import { getProjects } from "../projects/get-projects";
10
- import { initDAG } from "../dag"; // import { clearProjectsMemoryFile } from './projects/clear-memory-files';
7
+ import { initDAG } from "../dag";
8
+ // import { clearProjectsMemoryFile } from './projects/clear-memory-files';
11
9
 
12
10
  export const build = async (targetProjectName, option, api) => {
13
11
  const {
@@ -34,13 +32,11 @@ export const build = async (targetProjectName, option, api) => {
34
32
  packageManager
35
33
  } = getMonorepoBaseData(appDirectory);
36
34
  const overrideConfig = {};
37
-
38
35
  if (all) {
39
36
  overrideConfig.disableWithDeps = false;
40
37
  overrideConfig.withSelf = true;
41
38
  overrideConfig.withDept = true;
42
39
  }
43
-
44
40
  if (targetProjectName) {
45
41
  runBuildTask(targetProjectName, operator, _objectSpread({
46
42
  rootPath,
@@ -55,7 +51,6 @@ export const build = async (targetProjectName, option, api) => {
55
51
  }, overrideConfig));
56
52
  } else {
57
53
  const currentDir = process.cwd();
58
-
59
54
  if (currentDir === appDirectory) {
60
55
  await runAllBuildTask(operator, {
61
56
  rootPath: currentDir,
@@ -63,7 +58,7 @@ export const build = async (targetProjectName, option, api) => {
63
58
  disableContentHash: !contentHash,
64
59
  enableGitHash: gitHash
65
60
  });
66
- } // TODO: 没有指定项目名称的构建任务如何处理
67
-
61
+ }
62
+ // TODO: 没有指定项目名称的构建任务如何处理
68
63
  }
69
64
  };
@@ -1,49 +1,42 @@
1
1
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
-
3
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  const initProjectDependencyAndDependent = (project, projectsName, projectsMap) => {
8
5
  // dependencies、devDependencies、peerDependencies
9
6
  const dependencies = project.extra.dependencies || {};
10
7
  const devDependencies = project.extra.devDependencies || {};
11
8
  const optionalDependencies = project.extra.optionalDependencies || {};
12
- const DependencyProjectsName = Object.keys(_objectSpread(_objectSpread(_objectSpread({}, dependencies), devDependencies), optionalDependencies)).filter(depName => projectsName.includes(depName)); // init dependent key
13
-
14
- project.dependent = project.dependent || []; // get dependency ProjectNode
9
+ const DependencyProjectsName = Object.keys(_objectSpread(_objectSpread(_objectSpread({}, dependencies), devDependencies), optionalDependencies)).filter(depName => projectsName.includes(depName));
15
10
 
11
+ // init dependent key
12
+ project.dependent = project.dependent || [];
13
+ // get dependency ProjectNode
16
14
  project.dependency = DependencyProjectsName.map(projectName => {
17
15
  // 在遍历该项目的 dependency 的时候,顺便更新这些 dependency 的 dependent
18
16
  const dependencyProject = projectsMap.get(projectName);
19
17
  const dependent = (dependencyProject === null || dependencyProject === void 0 ? void 0 : dependencyProject.dependent) || [];
20
-
21
- if ( // 消除重复添加的情况
18
+ if (
19
+ // 消除重复添加的情况
22
20
  !dependent.some(p => p.name === project.name)) {
23
21
  dependencyProject.dependent = [...dependent, project];
24
22
  dependencyProject.dependentEdge = dependencyProject.dependent.length;
25
23
  }
26
-
27
24
  return dependencyProject;
28
- }); // NOTE: 一个节点有多少依赖,就代表有多少的入度或者叫指向该节点的边
25
+ });
26
+ // NOTE: 一个节点有多少依赖,就代表有多少的入度或者叫指向该节点的边
29
27
  // project.dagNodeEdge = project.dependency.length;
30
-
31
28
  project.dependencyEdge = project.dependency.length;
32
29
  };
33
-
34
30
  export const create = projects => {
35
31
  const projectsName = [];
36
32
  const projectsMap = new Map();
37
-
38
33
  for (const project of projects) {
39
34
  projectsMap.set(project.name, project);
40
35
  projectsName.push(project.name);
41
36
  }
42
-
43
37
  for (const project of projects) {
44
38
  initProjectDependencyAndDependent(project, projectsName, projectsMap);
45
39
  }
46
-
47
40
  return {
48
41
  projectsMap,
49
42
  projectList: projectsName
@@ -1,38 +1,28 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
3
2
  export class EdgeManager {
4
3
  constructor() {
5
4
  _defineProperty(this, "_dependencyEdgeHash", void 0);
6
-
7
5
  this._dependencyEdgeHash = {};
8
6
  }
9
-
10
7
  reduceOneEdge(project) {
11
8
  if (!(project.name in this._dependencyEdgeHash)) {
12
9
  this._dependencyEdgeHash[project.name] = project.dependencyEdge;
13
10
  }
14
-
15
11
  this._dependencyEdgeHash[project.name]--;
16
12
  }
17
-
18
13
  reduceEdges(project, edges) {
19
14
  if (!(project.name in this._dependencyEdgeHash)) {
20
15
  this._dependencyEdgeHash[project.name] = project.dependencyEdge;
21
16
  }
22
-
23
17
  this._dependencyEdgeHash[project.name] -= edges;
24
18
  }
25
-
26
19
  getEdge(project) {
27
20
  if (project.name in this._dependencyEdgeHash) {
28
21
  return this._dependencyEdgeHash[project.name];
29
22
  }
30
-
31
23
  return NaN;
32
24
  }
33
-
34
25
  setEdge(project) {
35
26
  this._dependencyEdgeHash[project.name] = project.dependencyEdge;
36
27
  }
37
-
38
28
  }
@@ -1,9 +1,6 @@
1
1
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
2
-
3
2
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
4
-
5
3
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
-
7
4
  import pMap from 'p-map';
8
5
  import { errorLog } from "../log/error";
9
6
  import { TaskRunner } from "./task";
@@ -11,27 +8,22 @@ import { EdgeManager } from "./edge-manager";
11
8
  import { recursiveGetDependency, sortProjects } from "./utils";
12
9
  export class DagOperator {
13
10
  // 排序好的项目列表
11
+
14
12
  constructor(projects, projectsMap) {
15
13
  _defineProperty(this, "_projects", void 0);
16
-
17
14
  _defineProperty(this, "_projectsMap", void 0);
18
-
19
15
  _defineProperty(this, "_sortedProjects", void 0);
20
-
21
16
  _defineProperty(this, "_createTask", (project, task) => async (stopTask = () => undefined) => {
22
17
  await task(project, project.dependency || [], () => stopTask());
23
18
  return project.name;
24
19
  });
25
-
26
20
  this._projects = projects;
27
21
  this._projectsMap = projectsMap;
28
22
  this._sortedProjects = [];
29
23
  }
30
-
31
24
  checkNodeDataExist(name) {
32
25
  return this._projectsMap.has(name);
33
26
  }
34
-
35
27
  getNodeData(name, option = {
36
28
  checkExist: false
37
29
  }) {
@@ -42,42 +34,31 @@ export class DagOperator {
42
34
  errorLog(`No '${name}' project exist`);
43
35
  }
44
36
  }
45
-
46
37
  return this._projectsMap.get(name);
47
38
  }
48
-
49
39
  getNodeDependencyData(name) {
50
40
  var _this$_projectsMap$ge;
51
-
52
41
  return ((_this$_projectsMap$ge = this._projectsMap.get(name)) === null || _this$_projectsMap$ge === void 0 ? void 0 : _this$_projectsMap$ge.dependency) || [];
53
42
  }
54
-
55
43
  getNodeDependentData(name) {
56
44
  var _this$_projectsMap$ge2;
57
-
58
45
  return ((_this$_projectsMap$ge2 = this._projectsMap.get(name)) === null || _this$_projectsMap$ge2 === void 0 ? void 0 : _this$_projectsMap$ge2.dependent) || [];
59
46
  }
60
-
61
47
  getNodeAllDependencyData(name, option = {
62
48
  skipCircleCheck: false
63
49
  }) {
64
50
  const {
65
51
  skipCircleCheck
66
52
  } = option;
67
-
68
53
  if (!skipCircleCheck) {
69
54
  this.checkCircle();
70
55
  }
71
-
72
56
  if (!this._projectsMap.has(name)) {
73
57
  errorLog(`No '${name}' project exist`);
74
58
  }
75
-
76
59
  const currentNode = this._projectsMap.get(name);
77
-
78
60
  return recursiveGetDependency(currentNode, skipCircleCheck);
79
61
  }
80
-
81
62
  setNodeData(name, task) {
82
63
  if (this._projectsMap.has(name)) {
83
64
  task(this._projectsMap.get(name));
@@ -85,19 +66,17 @@ export class DagOperator {
85
66
  errorLog(`No '${name}' project exist`);
86
67
  }
87
68
  }
88
-
89
69
  async traverseAllNodes(task) {
90
70
  const sortedNodes = this._sortedProjects.length > 0 ? this._sortedProjects : sortProjects(this._projects);
91
71
  const finishTaskHash = {};
92
72
  let preNodes = [];
93
73
  let earlyFinish = false;
94
-
95
74
  for (const projects of sortedNodes) {
96
75
  if (earlyFinish) {
97
76
  break;
98
77
  }
99
-
100
- await pMap(projects, // eslint-disable-next-line @typescript-eslint/no-loop-func
78
+ await pMap(projects,
79
+ // eslint-disable-next-line @typescript-eslint/no-loop-func
101
80
  async project => {
102
81
  if (!finishTaskHash[project.name]) {
103
82
  finishTaskHash[project.name] = true;
@@ -109,18 +88,17 @@ export class DagOperator {
109
88
  preNodes = [...projects];
110
89
  }
111
90
  }
112
-
113
91
  checkCircle() {
114
92
  // this._sortedProjects = sortProjects(this._projects);
115
93
  this._checkForCyclicDependencies(this._projects, [], new Set());
116
94
  }
117
-
118
95
  async traverseDependenciesToProjectToDependent(name, task, config = {}) {
119
96
  await this.traverseDependenciesToProject(name, task, config);
120
97
  await this.traverseProjectToDependent(name, task, _objectSpread(_objectSpread({}, config), {}, {
121
98
  withSelf: false
122
99
  }));
123
100
  }
101
+
124
102
  /**
125
103
  * 1. 把目标节点当做叶子节点集合 A 中的元素
126
104
  * 2. 当叶子节点集合中某个 a 元素结束任务的时候进行如下操作:
@@ -130,7 +108,6 @@ export class DagOperator {
130
108
  * 4. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
131
109
  */
132
110
 
133
-
134
111
  async traverseProjectToDependent(name, task, {
135
112
  withSelf = false,
136
113
  runTaskConcurrency
@@ -138,9 +115,7 @@ export class DagOperator {
138
115
  if (!this._projectsMap.has(name)) {
139
116
  errorLog(`No '${name}' project exist`);
140
117
  }
141
-
142
118
  const traverseTargetNode = this._projectsMap.get(name);
143
-
144
119
  const leafNodeTasks = [withSelf ? this._createTask(traverseTargetNode, task) : async () => Promise.resolve(traverseTargetNode.name)];
145
120
  const taskRunner = new TaskRunner(leafNodeTasks, {
146
121
  concurrency: runTaskConcurrency
@@ -149,12 +124,11 @@ export class DagOperator {
149
124
  taskRunner.on(TaskRunner.TASK_FINISH, projectName => {
150
125
  const projectNode = this.getNodeData(projectName);
151
126
  const dependent = projectNode.dependent || [];
152
-
153
127
  for (const dependentProject of dependent) {
154
128
  const dependency = dependentProject.dependency || [];
155
129
  const removeNodes = dependency.filter(dependencyProject => ![projectName, ...dependent.map(p => p.name)].includes(dependencyProject.name));
156
- edgeManager.reduceEdges(dependentProject, removeNodes.length + 1); // 变成叶子节点,就加入执行任务的队列中
157
-
130
+ edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
131
+ // 变成叶子节点,就加入执行任务的队列中
158
132
  if (edgeManager.getEdge(dependentProject) === 0) {
159
133
  taskRunner.addTask(this._createTask(dependentProject, task));
160
134
  }
@@ -162,6 +136,7 @@ export class DagOperator {
162
136
  });
163
137
  await taskRunner.run();
164
138
  }
139
+
165
140
  /**
166
141
  * 1. 找到叶子节点集合 A
167
142
  * 2. 找到直接连接叶子节点的节点集合 B
@@ -169,9 +144,8 @@ export class DagOperator {
169
144
  * 4. 检查 B 集合中是否存在入度为0的节点,则此节点为叶子节点,并加入叶子节点集合 A
170
145
  * 5. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
171
146
  */
172
- // TODO: 执行顺序还需要再确定一下
173
-
174
147
 
148
+ // TODO: 执行顺序还需要再确定一下
175
149
  async traverseDependenciesToProject(name, task, {
176
150
  withSelf = false,
177
151
  runTaskConcurrency
@@ -179,16 +153,12 @@ export class DagOperator {
179
153
  if (!this._projectsMap.has(name)) {
180
154
  errorLog(`No '${name}' project exist`);
181
155
  }
182
-
183
156
  const traverseTargetNode = this._projectsMap.get(name);
184
-
185
157
  const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
186
-
187
158
  if ((leafNodes === null || leafNodes === void 0 ? void 0 : leafNodes.length) === 0) {
188
159
  await this._createTask(traverseTargetNode, task)();
189
160
  return;
190
161
  }
191
-
192
162
  const leafNodeTasks = leafNodes.map(project => this._createTask(project, task));
193
163
  const taskRunner = new TaskRunner(leafNodeTasks, {
194
164
  concurrency: runTaskConcurrency
@@ -197,20 +167,17 @@ export class DagOperator {
197
167
  taskRunner.on(TaskRunner.TASK_FINISH, projectName => {
198
168
  const projectNode = this.getNodeData(projectName);
199
169
  const dependent = projectNode.dependent || [];
200
-
201
170
  for (const dependentProject of dependent) {
202
171
  // 只处理在叶子节点/目标项目的所有依赖集合的节点
203
172
  if (![traverseTargetNode, ...leafNodes].some(n => n.name === dependentProject.name)) {
204
173
  continue;
205
174
  }
206
-
207
175
  edgeManager.reduceOneEdge(dependentProject);
208
-
209
176
  if (dependentProject.name === traverseTargetNode.name && !withSelf) {
210
177
  continue;
211
- } // 变成叶子节点,就加入执行任务的队列中
212
-
178
+ }
213
179
 
180
+ // 变成叶子节点,就加入执行任务的队列中
214
181
  if (edgeManager.getEdge(dependentProject) === 0) {
215
182
  taskRunner.addTask(this._createTask(dependentProject, task));
216
183
  }
@@ -218,6 +185,7 @@ export class DagOperator {
218
185
  });
219
186
  await taskRunner.run();
220
187
  }
188
+
221
189
  /**
222
190
  * Copyright (c) Microsoft Corporation. All rights reserved.
223
191
  *
@@ -228,49 +196,38 @@ export class DagOperator {
228
196
  /**
229
197
  * Checks for projects that indirectly depend on themselves.
230
198
  */
231
-
232
-
233
199
  _checkForCyclicDependencies(projects, dependencyChain, alreadyCheckedProjects) {
234
200
  for (const project of projects) {
235
201
  if (dependencyChain.includes(project.name)) {
236
202
  throw new Error(`${'A cyclic dependency was encountered:\n'} ${[...dependencyChain, project.name].reverse().join('\n -> ')}\n`);
237
203
  }
238
-
239
204
  if (!alreadyCheckedProjects.has(project.name)) {
240
205
  alreadyCheckedProjects.add(project.name);
241
206
  dependencyChain.push(project.name);
242
-
243
207
  this._checkForCyclicDependencies(project.dependent, dependencyChain, alreadyCheckedProjects);
244
-
245
208
  dependencyChain.pop();
246
209
  }
247
210
  }
248
211
  }
249
-
250
212
  _getDependencyLeafNodes(node) {
251
213
  const dependency = node.dependency;
252
-
253
214
  if (dependency.length === 0) {
254
215
  return [];
255
216
  }
256
-
257
217
  let leafNodes = [...dependency];
258
-
259
218
  for (const dependencyNode of dependency) {
260
219
  leafNodes = [...leafNodes, ...this._getDependencyLeafNodes(dependencyNode)];
261
220
  }
262
-
263
221
  return leafNodes;
264
222
  }
265
-
266
223
  _getProjectPreviousNode(searchProjects, preNodes) {
267
224
  return searchProjects.filter(p => preNodes.map(preP => preP.name).includes(p.name));
268
- } // public async getOrderTasks() {
225
+ }
226
+
227
+ // public async getOrderTasks() {
269
228
  // // Precalculate the number of dependent packages
270
229
  // for (const project of this._projects) {
271
230
  // calculateCriticalPaths(project);
272
231
  // }
273
232
  // }
274
-
275
-
276
233
  }
@@ -1,5 +1,4 @@
1
1
  function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
2
-
3
2
  import { EventEmitter } from 'events';
4
3
  import pMap from 'p-map';
5
4
  export class TaskRunner extends EventEmitter {
@@ -7,24 +6,17 @@ export class TaskRunner extends EventEmitter {
7
6
  concurrency
8
7
  }) {
9
8
  super();
10
-
11
9
  _defineProperty(this, "_tasks", void 0);
12
-
13
10
  _defineProperty(this, "_concurrency", void 0);
14
-
15
11
  _defineProperty(this, "_usableConcurrency", void 0);
16
-
17
12
  _defineProperty(this, "_stopFlag", void 0);
18
-
19
13
  this._tasks = tasks;
20
14
  this._concurrency = concurrency || TaskRunner.DefaultConcurrency;
21
15
  this._usableConcurrency = this._concurrency;
22
16
  this._stopFlag = false;
23
17
  }
24
-
25
18
  async run() {
26
19
  const tasks = this._tasks.splice(0, this._concurrency);
27
-
28
20
  this._usableConcurrency = this._concurrency - tasks.length;
29
21
  await pMap(tasks, async task => {
30
22
  await this._runTask(task);
@@ -32,25 +24,19 @@ export class TaskRunner extends EventEmitter {
32
24
  concurrency: tasks.length
33
25
  });
34
26
  }
35
-
36
27
  addTask(task) {
37
28
  this._tasks.push(task);
38
29
  }
39
-
40
30
  async _runTask(task) {
41
31
  if (this._stopFlag) {
42
32
  return;
43
33
  }
44
-
45
34
  const emitValue = await task(this._stopTask.bind(this));
46
35
  this._usableConcurrency--;
47
36
  this.emit(TaskRunner.TASK_FINISH, emitValue);
48
-
49
37
  if (this._tasks.length > 0) {
50
38
  const nextTasks = this._tasks.splice(0, this._usableConcurrency);
51
-
52
39
  this._usableConcurrency -= nextTasks.length;
53
-
54
40
  if (nextTasks.length > 0) {
55
41
  await pMap(nextTasks, async _task => {
56
42
  await this._runTask(_task);
@@ -60,13 +46,9 @@ export class TaskRunner extends EventEmitter {
60
46
  }
61
47
  }
62
48
  }
63
-
64
49
  _stopTask() {
65
50
  this._stopFlag = true;
66
51
  }
67
-
68
52
  }
69
-
70
53
  _defineProperty(TaskRunner, "DefaultConcurrency", 10);
71
-
72
54
  _defineProperty(TaskRunner, "TASK_FINISH", 'task-finish');
@@ -1,25 +1,23 @@
1
1
  import { errorLog } from "../log/error";
2
2
  import { EdgeManager } from "./edge-manager";
3
+
3
4
  /**
4
5
  * Calculate the number of packages which must be built before we reach
5
6
  * the furthest away "root" node
6
7
  */
7
-
8
8
  export const calculateCriticalPaths = project => {
9
9
  var _project$dependent;
10
-
11
10
  // Return the memoized value
12
11
  if (project.criticalPathLength !== undefined) {
13
12
  return project.criticalPathLength;
14
- } // If no dependents, we are in a "root"
15
-
13
+ }
16
14
 
15
+ // If no dependents, we are in a "root"
17
16
  if (((_project$dependent = project.dependent) === null || _project$dependent === void 0 ? void 0 : _project$dependent.length) === 0) {
18
17
  project.criticalPathLength = 0;
19
18
  return project.criticalPathLength;
20
19
  } else {
21
20
  var _project$dependent2;
22
-
23
21
  // Otherwise we are as long as the longest package + 1
24
22
  const depsLengths = [];
25
23
  (_project$dependent2 = project.dependent) === null || _project$dependent2 === void 0 ? void 0 : _project$dependent2.forEach(dependentProject => depsLengths.push(calculateCriticalPaths(dependentProject)));
@@ -27,16 +25,13 @@ export const calculateCriticalPaths = project => {
27
25
  return project.criticalPathLength;
28
26
  }
29
27
  };
30
-
31
28
  const _recursiveGetDependencySkipCircleDeps = node => {
32
29
  let allDeps = [];
33
30
  const foundDepsNameSet = new Set([node.name]);
34
31
  let queue = [node];
35
-
36
32
  while (queue.length > 0) {
37
33
  const checkNode = queue.pop();
38
34
  const checkNodeDeps = checkNode.dependency || [];
39
-
40
35
  if (checkNodeDeps.length > 0) {
41
36
  const willIntoQueue = checkNodeDeps.filter(dep => !foundDepsNameSet.has(dep.name));
42
37
  allDeps = [...allDeps, ...willIntoQueue];
@@ -44,71 +39,60 @@ const _recursiveGetDependencySkipCircleDeps = node => {
44
39
  queue = [...queue, ...willIntoQueue];
45
40
  }
46
41
  }
47
-
48
42
  return allDeps;
49
43
  };
50
-
51
44
  export const recursiveGetDependency = (project, skipCircleProjects = false) => {
52
45
  if (skipCircleProjects) {
53
46
  return _recursiveGetDependencySkipCircleDeps(project);
54
47
  }
55
-
56
48
  const dependency = project.dependency || [];
57
49
  let allDependency = [...dependency];
58
-
59
50
  for (const dependencyProject of dependency) {
60
51
  allDependency = [...allDependency, ...recursiveGetDependency(dependencyProject)];
61
52
  }
62
-
63
53
  return allDependency;
64
- }; // 拓扑排序
54
+ };
65
55
 
56
+ // 拓扑排序
66
57
  export const sortProjects = projects => {
67
58
  const sortedQueue = []; // 排好序的队列
68
-
69
59
  let readyIntoSortedQueue = []; // 用来准备放入 sortedQueue的数组
70
-
71
60
  let queue = []; // 用来存放入度为0的节点
72
-
73
- const edgeManager = new EdgeManager(); // 初始化队列queue
74
-
61
+ const edgeManager = new EdgeManager();
62
+ // 初始化队列queue
75
63
  for (const project of projects) {
76
- edgeManager.setEdge(project); // 入度为0进队列
64
+ edgeManager.setEdge(project);
65
+ // 入度为0进队列
77
66
  // TODO 可能存在多个 dagNodeFrom === 0 的节点
78
-
79
67
  if (edgeManager.getEdge(project) === 0) {
80
68
  queue.push(project);
81
69
  }
82
- } // 加入最初入度为0的节点
83
-
70
+ }
84
71
 
72
+ // 加入最初入度为0的节点
85
73
  sortedQueue.push([...queue]);
86
74
  let shiftNodesCount = 0; // 计算出队列的节点数量,用于在最后判断是否存在环/依赖循环
87
75
 
88
76
  while (queue.length > 0) {
89
77
  const checkNode = queue.shift();
90
78
  shiftNodesCount++;
91
-
92
79
  for (const toNode of checkNode.dependent) {
93
80
  edgeManager.reduceOneEdge(toNode);
94
-
95
81
  if (edgeManager.getEdge(toNode) === 0) {
96
82
  readyIntoSortedQueue.push(toNode);
97
83
  }
98
84
  }
99
-
100
85
  if (queue.length === 0 && readyIntoSortedQueue.length > 0) {
101
86
  queue = [...readyIntoSortedQueue];
102
87
  sortedQueue.push([...readyIntoSortedQueue]);
103
88
  readyIntoSortedQueue = [];
104
89
  }
105
90
  }
106
-
107
91
  if (shiftNodesCount < projects.length) {
108
92
  errorLog('Items with a dependency loop');
109
- } else {// console.info('No dependency loop');
93
+ } else {
94
+ // console.info('No dependency loop');
110
95
  }
111
-
112
96
  return sortedQueue;
113
97
  };
114
98
  export const findCircle = projects => {
@@ -116,11 +100,9 @@ export const findCircle = projects => {
116
100
  if (project.dependencyEdge > 0) {
117
101
  return [...circleNodes, project];
118
102
  }
119
-
120
103
  return circleNodes;
121
104
  }, []);
122
105
  result = result.sort((a, b) => a.dependencyEdge - b.dependencyEdge);
123
-
124
106
  while (result.length > 0) {
125
107
  const checkNode = result.shift();
126
108
  checkNode.dependencyEdge--;