@modern-js/monorepo-tools 1.21.5 → 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.
- package/CHANGELOG.md +67 -38
- package/dist/js/modern/cli/new.js +0 -3
- package/dist/js/modern/commands/build.js +4 -9
- package/dist/js/modern/dag/create.js +8 -15
- package/dist/js/modern/dag/edge-manager.js +0 -10
- package/dist/js/modern/dag/operator.js +14 -57
- package/dist/js/modern/dag/task.js +0 -18
- package/dist/js/modern/dag/utils.js +13 -31
- package/dist/js/modern/features/build/index.js +8 -19
- package/dist/js/modern/features/clear/index.js +0 -1
- package/dist/js/modern/features/deploy/index.js +7 -35
- package/dist/js/modern/features/dev/cmds.js +1 -0
- package/dist/js/modern/features/dev/create-task.js +2 -13
- package/dist/js/modern/features/dev/index.js +4 -11
- package/dist/js/modern/features/dev/watch-projects-state.js +0 -19
- package/dist/js/modern/features/install/index.js +0 -12
- package/dist/js/modern/index.js +1 -2
- package/dist/js/modern/log/multi-tasks-log.js +8 -31
- package/dist/js/modern/log/time.js +0 -3
- package/dist/js/modern/log/utils.js +0 -2
- package/dist/js/modern/package/index.js +0 -8
- package/dist/js/modern/parse-config/index.js +3 -6
- package/dist/js/modern/parse-config/monorepo.js +0 -23
- package/dist/js/modern/projects/check-project-change.js +4 -16
- package/dist/js/modern/projects/get-projects-by-packages-config.js +12 -29
- package/dist/js/modern/projects/get-projects-by-workspace-file.js +0 -16
- package/dist/js/modern/projects/get-projects.js +4 -29
- package/dist/js/modern/utils/install.js +0 -2
- package/dist/js/node/cli/build-watch.js +0 -3
- package/dist/js/node/cli/build.js +0 -3
- package/dist/js/node/cli/clear.js +0 -3
- package/dist/js/node/cli/deploy.js +0 -3
- package/dist/js/node/cli/index.js +0 -12
- package/dist/js/node/cli/install.js +0 -3
- package/dist/js/node/cli/new.js +0 -7
- package/dist/js/node/commands/build-watch.js +0 -6
- package/dist/js/node/commands/build.js +2 -14
- package/dist/js/node/commands/clear.js +0 -5
- package/dist/js/node/commands/deploy.js +0 -9
- package/dist/js/node/commands/index.js +0 -10
- package/dist/js/node/commands/install.js +0 -6
- package/dist/js/node/dag/create.js +8 -17
- package/dist/js/node/dag/edge-manager.js +0 -12
- package/dist/js/node/dag/index.js +0 -4
- package/dist/js/node/dag/operator.js +14 -65
- package/dist/js/node/dag/task.js +0 -23
- package/dist/js/node/dag/utils.js +12 -39
- package/dist/js/node/features/build/index.js +8 -29
- package/dist/js/node/features/clear/index.js +0 -15
- package/dist/js/node/features/deploy/index.js +7 -53
- package/dist/js/node/features/dev/cmds.js +1 -0
- package/dist/js/node/features/dev/create-task.js +2 -22
- package/dist/js/node/features/dev/index.js +4 -19
- package/dist/js/node/features/dev/watch-projects-state.js +0 -25
- package/dist/js/node/features/install/index.js +0 -25
- package/dist/js/node/hooks/index.js +0 -2
- package/dist/js/node/index.js +2 -16
- package/dist/js/node/locale/index.js +0 -4
- package/dist/js/node/log/error.js +0 -2
- package/dist/js/node/log/multi-tasks-log.js +8 -34
- package/dist/js/node/log/time.js +0 -10
- package/dist/js/node/log/utils.js +0 -4
- package/dist/js/node/package/index.js +0 -10
- package/dist/js/node/parse-config/index.js +3 -14
- package/dist/js/node/parse-config/monorepo.js +0 -34
- package/dist/js/node/projects/check-project-change.js +4 -33
- package/dist/js/node/projects/clear-memory-files.js +0 -8
- package/dist/js/node/projects/get-projects-by-packages-config.js +12 -41
- package/dist/js/node/projects/get-projects-by-workspace-file.js +0 -36
- package/dist/js/node/projects/get-projects.js +4 -37
- package/dist/js/node/utils/install.js +0 -11
- package/dist/js/node/utils/language.js +0 -2
- package/dist/types/dag/operator.d.ts +0 -3
- package/dist/types/dag/utils.d.ts +0 -1
- package/dist/types/features/dev/index.d.ts +0 -1
- package/dist/types/index.d.ts +0 -2
- package/dist/types/projects/get-projects.d.ts +0 -1
- package/package.json +13 -36
package/CHANGELOG.md
CHANGED
|
@@ -1,43 +1,72 @@
|
|
|
1
1
|
# @modern-js/monorepo-tools
|
|
2
2
|
|
|
3
|
-
##
|
|
4
|
-
|
|
5
|
-
###
|
|
6
|
-
|
|
7
|
-
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
-
|
|
12
|
-
|
|
13
|
-
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
-
|
|
21
|
-
-
|
|
22
|
-
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
-
|
|
26
|
-
-
|
|
27
|
-
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
- @modern-js/
|
|
34
|
-
- @modern-js/
|
|
35
|
-
- @modern-js/
|
|
36
|
-
- @modern-js/plugin-changeset@
|
|
37
|
-
- @modern-js/plugin-i18n@
|
|
38
|
-
- @modern-js/
|
|
39
|
-
- @modern-js/
|
|
40
|
-
|
|
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
|
+
|
|
41
|
+
## 2.0.0-beta.0
|
|
42
|
+
|
|
43
|
+
### Major Changes
|
|
44
|
+
|
|
45
|
+
- dda38c9: chore: v2
|
|
46
|
+
|
|
47
|
+
### Patch Changes
|
|
48
|
+
|
|
49
|
+
- Updated dependencies [c9e800d39]
|
|
50
|
+
- Updated dependencies [85edee8]
|
|
51
|
+
- Updated dependencies [edd1cfb1a]
|
|
52
|
+
- Updated dependencies [cc971eabf]
|
|
53
|
+
- Updated dependencies [5b9049f]
|
|
54
|
+
- Updated dependencies [b8bbe036c]
|
|
55
|
+
- Updated dependencies [d5a31df78]
|
|
56
|
+
- Updated dependencies [dda38c9]
|
|
57
|
+
- Updated dependencies [8b8e1bb57]
|
|
58
|
+
- Updated dependencies [3bbea92b2]
|
|
59
|
+
- Updated dependencies [abf3421]
|
|
60
|
+
- Updated dependencies [543be95]
|
|
61
|
+
- Updated dependencies [14b712d]
|
|
62
|
+
- @modern-js/core@2.0.0-beta.0
|
|
63
|
+
- @modern-js/utils@2.0.0-beta.0
|
|
64
|
+
- @modern-js/plugin@2.0.0-beta.0
|
|
65
|
+
- @modern-js/plugin-changeset@2.0.0-beta.0
|
|
66
|
+
- @modern-js/plugin-i18n@2.0.0-beta.0
|
|
67
|
+
- @modern-js/plugin-jarvis@2.0.0-beta.0
|
|
68
|
+
- @modern-js/new-action@2.0.0-beta.0
|
|
69
|
+
- @modern-js/upgrade@2.0.0-beta.0
|
|
41
70
|
|
|
42
71
|
## 1.21.2
|
|
43
72
|
|
|
@@ -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";
|
|
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
|
-
}
|
|
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));
|
|
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
|
-
|
|
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
|
-
});
|
|
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
|
-
|
|
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
|
-
}
|
|
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');
|