@modern-js/monorepo-tools 2.0.0-beta.3 → 2.0.0-beta.6
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 +103 -0
- package/bin/modern.js +3 -1
- package/dist/js/modern/cli/build-watch.js +30 -5
- package/dist/js/modern/cli/build.js +31 -5
- package/dist/js/modern/cli/clear.js +30 -5
- package/dist/js/modern/cli/deploy.js +35 -7
- package/dist/js/modern/cli/index.js +1 -1
- package/dist/js/modern/cli/install.js +30 -5
- package/dist/js/modern/cli/new.js +56 -14
- package/dist/js/modern/commands/build-watch.js +32 -18
- package/dist/js/modern/commands/build.js +49 -23
- package/dist/js/modern/commands/clear.js +31 -15
- package/dist/js/modern/commands/deploy.js +38 -24
- package/dist/js/modern/commands/index.js +1 -1
- package/dist/js/modern/commands/install.js +32 -17
- package/dist/js/modern/constants.js +13 -9
- package/dist/js/modern/dag/create.js +27 -23
- package/dist/js/modern/dag/edge-manager.js +5 -4
- package/dist/js/modern/dag/index.js +6 -5
- package/dist/js/modern/dag/operator.js +174 -156
- package/dist/js/modern/dag/task.js +64 -39
- package/dist/js/modern/dag/utils.js +32 -38
- package/dist/js/modern/features/build/index.js +47 -28
- package/dist/js/modern/features/clear/index.js +16 -15
- package/dist/js/modern/features/deploy/index.js +107 -82
- package/dist/js/modern/features/dev/cmds.js +4 -3
- package/dist/js/modern/features/dev/create-task.js +43 -34
- package/dist/js/modern/features/dev/index.js +60 -41
- package/dist/js/modern/features/dev/watch-projects-state.js +47 -24
- package/dist/js/modern/features/install/index.js +43 -22
- package/dist/js/modern/hooks/index.js +6 -3
- package/dist/js/modern/index.js +18 -16
- package/dist/js/modern/locale/en.js +10 -7
- package/dist/js/modern/locale/index.js +6 -6
- package/dist/js/modern/locale/zh.js +11 -8
- package/dist/js/modern/log/error.js +6 -3
- package/dist/js/modern/log/multi-tasks-log.js +25 -34
- package/dist/js/modern/log/time.js +26 -11
- package/dist/js/modern/log/utils.js +9 -5
- package/dist/js/modern/package/index.js +5 -6
- package/dist/js/modern/parse-config/index.js +49 -22
- package/dist/js/modern/parse-config/monorepo.js +41 -26
- package/dist/js/modern/projects/check-project-change.js +59 -30
- package/dist/js/modern/projects/clear-memory-files.js +17 -7
- package/dist/js/modern/projects/get-projects-by-packages-config.js +89 -52
- package/dist/js/modern/projects/get-projects-by-workspace-file.js +68 -32
- package/dist/js/modern/projects/get-projects.js +96 -53
- package/dist/js/modern/type.js +0 -1
- package/dist/js/modern/utils/install.js +36 -19
- package/dist/js/modern/utils/language.js +6 -3
- package/dist/js/node/cli/build-watch.js +51 -10
- package/dist/js/node/cli/build.js +52 -10
- package/dist/js/node/cli/clear.js +51 -10
- package/dist/js/node/cli/deploy.js +56 -12
- package/dist/js/node/cli/index.js +22 -71
- package/dist/js/node/cli/install.js +51 -10
- package/dist/js/node/cli/new.js +75 -19
- package/dist/js/node/commands/build-watch.js +59 -29
- package/dist/js/node/commands/build.js +74 -32
- package/dist/js/node/commands/clear.js +57 -25
- package/dist/js/node/commands/deploy.js +65 -35
- package/dist/js/node/commands/index.js +21 -60
- package/dist/js/node/commands/install.js +59 -28
- package/dist/js/node/constants.js +33 -13
- package/dist/js/node/dag/create.js +46 -28
- package/dist/js/node/dag/edge-manager.js +25 -8
- package/dist/js/node/dag/index.js +30 -13
- package/dist/js/node/dag/operator.js +211 -174
- package/dist/js/node/dag/task.js +92 -46
- package/dist/js/node/dag/utils.js +58 -47
- package/dist/js/node/features/build/index.js +84 -47
- package/dist/js/node/features/clear/index.js +49 -28
- package/dist/js/node/features/deploy/index.js +139 -104
- package/dist/js/node/features/dev/cmds.js +26 -9
- package/dist/js/node/features/dev/create-task.js +80 -51
- package/dist/js/node/features/dev/index.js +98 -58
- package/dist/js/node/features/dev/watch-projects-state.js +71 -30
- package/dist/js/node/features/install/index.js +82 -41
- package/dist/js/node/hooks/index.js +27 -8
- package/dist/js/node/index.js +53 -32
- package/dist/js/node/locale/en.js +30 -11
- package/dist/js/node/locale/index.js +31 -14
- package/dist/js/node/locale/zh.js +31 -12
- package/dist/js/node/log/error.js +26 -7
- package/dist/js/node/log/multi-tasks-log.js +48 -41
- package/dist/js/node/log/time.js +47 -18
- package/dist/js/node/log/utils.js +30 -10
- package/dist/js/node/package/index.js +25 -10
- package/dist/js/node/parse-config/index.js +76 -31
- package/dist/js/node/parse-config/monorepo.js +79 -44
- package/dist/js/node/projects/check-project-change.js +104 -56
- package/dist/js/node/projects/clear-memory-files.js +42 -15
- package/dist/js/node/projects/get-projects-by-packages-config.js +119 -65
- package/dist/js/node/projects/get-projects-by-workspace-file.js +108 -55
- package/dist/js/node/projects/get-projects.js +112 -61
- package/dist/js/node/type.js +15 -5
- package/dist/js/node/utils/install.js +68 -31
- package/dist/js/node/utils/language.js +28 -8
- package/dist/js/node/utils/types.js +15 -0
- package/dist/types/dag/operator.d.ts +3 -0
- package/dist/types/dag/utils.d.ts +1 -0
- package/dist/types/features/dev/index.d.ts +1 -0
- package/dist/types/index.d.ts +2 -0
- package/dist/types/projects/get-projects.d.ts +1 -0
- package/package.json +12 -19
|
@@ -1,35 +1,49 @@
|
|
|
1
|
-
|
|
1
|
+
var __async = (__this, __arguments, generator) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
var fulfilled = (value) => {
|
|
4
|
+
try {
|
|
5
|
+
step(generator.next(value));
|
|
6
|
+
} catch (e) {
|
|
7
|
+
reject(e);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var rejected = (value) => {
|
|
11
|
+
try {
|
|
12
|
+
step(generator.throw(value));
|
|
13
|
+
} catch (e) {
|
|
14
|
+
reject(e);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
21
|
+
import { logger } from "@modern-js/utils";
|
|
2
22
|
import { initDAG } from "../dag";
|
|
3
23
|
import { getMonorepoBaseData } from "../parse-config/monorepo";
|
|
4
24
|
import { getProjects } from "../projects/get-projects";
|
|
5
25
|
import { deploy as runDeployTask } from "../features/deploy";
|
|
6
|
-
|
|
7
|
-
const {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const projects = await getProjects({
|
|
15
|
-
packagesMatchs: {
|
|
16
|
-
enableAutoFinder: true
|
|
26
|
+
const deploy = (_0, _1, _2, ..._3) => __async(void 0, [_0, _1, _2, ..._3], function* (api, deployProjectNames, option, ignoreMatchs = []) {
|
|
27
|
+
const { deployPath = "output" } = option;
|
|
28
|
+
const { appDirectory } = api.useAppContext();
|
|
29
|
+
logger.info(`start deploy ${deployProjectNames.join(",")}`);
|
|
30
|
+
const projects = yield getProjects(
|
|
31
|
+
{
|
|
32
|
+
packagesMatchs: { enableAutoFinder: true },
|
|
33
|
+
packagesIgnoreMatchs: ignoreMatchs
|
|
17
34
|
},
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const {
|
|
21
|
-
rootPath,
|
|
22
|
-
packageManager
|
|
23
|
-
} = getMonorepoBaseData(process.cwd());
|
|
35
|
+
appDirectory
|
|
36
|
+
);
|
|
37
|
+
const { rootPath, packageManager } = getMonorepoBaseData(process.cwd());
|
|
24
38
|
const operator = initDAG(projects);
|
|
25
|
-
|
|
39
|
+
yield runDeployTask(deployProjectNames, operator, {
|
|
26
40
|
rootPath,
|
|
27
41
|
packageManager,
|
|
28
42
|
deployPath
|
|
29
43
|
});
|
|
30
44
|
const runners = api.useHookRunners();
|
|
31
|
-
runners.afterMonorepoDeploy({
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
};
|
|
45
|
+
runners.afterMonorepoDeploy({ operator, deployProjectNames });
|
|
46
|
+
});
|
|
47
|
+
export {
|
|
48
|
+
deploy
|
|
49
|
+
};
|
|
@@ -1,28 +1,43 @@
|
|
|
1
|
+
var __async = (__this, __arguments, generator) => {
|
|
2
|
+
return new Promise((resolve, reject) => {
|
|
3
|
+
var fulfilled = (value) => {
|
|
4
|
+
try {
|
|
5
|
+
step(generator.next(value));
|
|
6
|
+
} catch (e) {
|
|
7
|
+
reject(e);
|
|
8
|
+
}
|
|
9
|
+
};
|
|
10
|
+
var rejected = (value) => {
|
|
11
|
+
try {
|
|
12
|
+
step(generator.throw(value));
|
|
13
|
+
} catch (e) {
|
|
14
|
+
reject(e);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
18
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
19
|
+
});
|
|
20
|
+
};
|
|
1
21
|
import { runInstallTask } from "../features/install";
|
|
2
22
|
import { getMonorepoBaseData } from "../parse-config/monorepo";
|
|
3
23
|
import { getProjects } from "../projects/get-projects";
|
|
4
24
|
import { initDAG } from "../dag";
|
|
5
|
-
|
|
6
|
-
const {
|
|
25
|
+
const install = (..._0) => __async(void 0, [..._0], function* (projectNames = [], option, api) {
|
|
26
|
+
const { appDirectory } = api.useAppContext();
|
|
27
|
+
const { auto } = option;
|
|
28
|
+
const projects = yield getProjects(
|
|
29
|
+
{ packagesMatchs: { enableAutoFinder: true } },
|
|
7
30
|
appDirectory
|
|
8
|
-
|
|
9
|
-
const {
|
|
10
|
-
auto
|
|
11
|
-
} = option;
|
|
12
|
-
const projects = await getProjects({
|
|
13
|
-
packagesMatchs: {
|
|
14
|
-
enableAutoFinder: true
|
|
15
|
-
}
|
|
16
|
-
}, appDirectory);
|
|
31
|
+
);
|
|
17
32
|
const operator = initDAG(projects);
|
|
18
33
|
operator.checkCircle();
|
|
19
|
-
const {
|
|
20
|
-
|
|
21
|
-
packageManager
|
|
22
|
-
} = getMonorepoBaseData(appDirectory);
|
|
23
|
-
await runInstallTask(projectNames, operator, {
|
|
34
|
+
const { rootPath, packageManager } = getMonorepoBaseData(appDirectory);
|
|
35
|
+
yield runInstallTask(projectNames, operator, {
|
|
24
36
|
packageManager,
|
|
25
37
|
rootPath,
|
|
26
38
|
auto
|
|
27
39
|
});
|
|
28
|
-
};
|
|
40
|
+
});
|
|
41
|
+
export {
|
|
42
|
+
install
|
|
43
|
+
};
|
|
@@ -1,10 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
LERNA:
|
|
3
|
-
YARN:
|
|
4
|
-
PNPM:
|
|
1
|
+
const WORKSPACE_FILE = {
|
|
2
|
+
LERNA: "lerna.json",
|
|
3
|
+
YARN: "package.json",
|
|
4
|
+
PNPM: "pnpm-workspace.yaml"
|
|
5
|
+
};
|
|
6
|
+
const LOCK_FILE = {
|
|
7
|
+
YARN: "yarn.lock",
|
|
8
|
+
PNPM: "pnpm-lock.yaml",
|
|
9
|
+
NPM: "package-lock.json"
|
|
10
|
+
};
|
|
11
|
+
export {
|
|
12
|
+
LOCK_FILE,
|
|
13
|
+
WORKSPACE_FILE
|
|
5
14
|
};
|
|
6
|
-
export const LOCK_FILE = {
|
|
7
|
-
YARN: 'yarn.lock',
|
|
8
|
-
PNPM: 'pnpm-lock.yaml',
|
|
9
|
-
NPM: 'package-lock.json'
|
|
10
|
-
};
|
|
@@ -1,35 +1,39 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
3
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
4
|
+
var __propIsEnum = Object.prototype.propertyIsEnumerable;
|
|
5
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
6
|
+
var __spreadValues = (a, b) => {
|
|
7
|
+
for (var prop in b || (b = {}))
|
|
8
|
+
if (__hasOwnProp.call(b, prop))
|
|
9
|
+
__defNormalProp(a, prop, b[prop]);
|
|
10
|
+
if (__getOwnPropSymbols)
|
|
11
|
+
for (var prop of __getOwnPropSymbols(b)) {
|
|
12
|
+
if (__propIsEnum.call(b, prop))
|
|
13
|
+
__defNormalProp(a, prop, b[prop]);
|
|
14
|
+
}
|
|
15
|
+
return a;
|
|
16
|
+
};
|
|
4
17
|
const initProjectDependencyAndDependent = (project, projectsName, projectsMap) => {
|
|
5
|
-
// dependencies、devDependencies、peerDependencies
|
|
6
18
|
const dependencies = project.extra.dependencies || {};
|
|
7
19
|
const devDependencies = project.extra.devDependencies || {};
|
|
8
20
|
const optionalDependencies = project.extra.optionalDependencies || {};
|
|
9
|
-
const DependencyProjectsName = Object.keys(
|
|
10
|
-
|
|
11
|
-
// init dependent key
|
|
21
|
+
const DependencyProjectsName = Object.keys(__spreadValues(__spreadValues(__spreadValues({}, dependencies), devDependencies), optionalDependencies)).filter((depName) => projectsName.includes(depName));
|
|
12
22
|
project.dependent = project.dependent || [];
|
|
13
|
-
|
|
14
|
-
project.dependency = DependencyProjectsName.map(projectName => {
|
|
15
|
-
// 在遍历该项目的 dependency 的时候,顺便更新这些 dependency 的 dependent
|
|
23
|
+
project.dependency = DependencyProjectsName.map((projectName) => {
|
|
16
24
|
const dependencyProject = projectsMap.get(projectName);
|
|
17
|
-
const dependent = (dependencyProject
|
|
18
|
-
if (
|
|
19
|
-
// 消除重复添加的情况
|
|
20
|
-
!dependent.some(p => p.name === project.name)) {
|
|
25
|
+
const dependent = (dependencyProject == null ? void 0 : dependencyProject.dependent) || [];
|
|
26
|
+
if (!dependent.some((p) => p.name === project.name)) {
|
|
21
27
|
dependencyProject.dependent = [...dependent, project];
|
|
22
28
|
dependencyProject.dependentEdge = dependencyProject.dependent.length;
|
|
23
29
|
}
|
|
24
30
|
return dependencyProject;
|
|
25
31
|
});
|
|
26
|
-
// NOTE: 一个节点有多少依赖,就代表有多少的入度或者叫指向该节点的边
|
|
27
|
-
// project.dagNodeEdge = project.dependency.length;
|
|
28
32
|
project.dependencyEdge = project.dependency.length;
|
|
29
33
|
};
|
|
30
|
-
|
|
34
|
+
const create = (projects) => {
|
|
31
35
|
const projectsName = [];
|
|
32
|
-
const projectsMap = new Map();
|
|
36
|
+
const projectsMap = /* @__PURE__ */ new Map();
|
|
33
37
|
for (const project of projects) {
|
|
34
38
|
projectsMap.set(project.name, project);
|
|
35
39
|
projectsName.push(project.name);
|
|
@@ -37,8 +41,8 @@ export const create = projects => {
|
|
|
37
41
|
for (const project of projects) {
|
|
38
42
|
initProjectDependencyAndDependent(project, projectsName, projectsMap);
|
|
39
43
|
}
|
|
40
|
-
return {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
};
|
|
44
|
+
return { projectsMap, projectList: projectsName };
|
|
45
|
+
};
|
|
46
|
+
export {
|
|
47
|
+
create
|
|
48
|
+
};
|
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
export class EdgeManager {
|
|
1
|
+
class EdgeManager {
|
|
3
2
|
constructor() {
|
|
4
|
-
_defineProperty(this, "_dependencyEdgeHash", void 0);
|
|
5
3
|
this._dependencyEdgeHash = {};
|
|
6
4
|
}
|
|
7
5
|
reduceOneEdge(project) {
|
|
@@ -25,4 +23,7 @@ export class EdgeManager {
|
|
|
25
23
|
setEdge(project) {
|
|
26
24
|
this._dependencyEdgeHash[project.name] = project.dependencyEdge;
|
|
27
25
|
}
|
|
28
|
-
}
|
|
26
|
+
}
|
|
27
|
+
export {
|
|
28
|
+
EdgeManager
|
|
29
|
+
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { create } from "./create";
|
|
2
2
|
import { DagOperator } from "./operator";
|
|
3
|
-
|
|
4
|
-
const {
|
|
5
|
-
projectsMap
|
|
6
|
-
} = create(projects);
|
|
3
|
+
const initDAG = (projects) => {
|
|
4
|
+
const { projectsMap } = create(projects);
|
|
7
5
|
const operator = new DagOperator(projects, projectsMap);
|
|
8
6
|
return operator;
|
|
9
|
-
};
|
|
7
|
+
};
|
|
8
|
+
export {
|
|
9
|
+
initDAG
|
|
10
|
+
};
|
|
@@ -1,20 +1,51 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defProps = Object.defineProperties;
|
|
3
|
+
var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
|
|
4
|
+
var __getOwnPropSymbols = Object.getOwnPropertySymbols;
|
|
5
|
+
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
|
+
var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
|
|
20
|
+
var __async = (__this, __arguments, generator) => {
|
|
21
|
+
return new Promise((resolve, reject) => {
|
|
22
|
+
var fulfilled = (value) => {
|
|
23
|
+
try {
|
|
24
|
+
step(generator.next(value));
|
|
25
|
+
} catch (e) {
|
|
26
|
+
reject(e);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
var rejected = (value) => {
|
|
30
|
+
try {
|
|
31
|
+
step(generator.throw(value));
|
|
32
|
+
} catch (e) {
|
|
33
|
+
reject(e);
|
|
34
|
+
}
|
|
35
|
+
};
|
|
36
|
+
var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
|
|
37
|
+
step((generator = generator.apply(__this, __arguments)).next());
|
|
38
|
+
});
|
|
39
|
+
};
|
|
40
|
+
import pMap from "p-map";
|
|
5
41
|
import { errorLog } from "../log/error";
|
|
6
42
|
import { TaskRunner } from "./task";
|
|
7
43
|
import { EdgeManager } from "./edge-manager";
|
|
8
44
|
import { recursiveGetDependency, sortProjects } from "./utils";
|
|
9
|
-
|
|
10
|
-
// 排序好的项目列表
|
|
11
|
-
|
|
45
|
+
class DagOperator {
|
|
12
46
|
constructor(projects, projectsMap) {
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
_defineProperty(this, "_sortedProjects", void 0);
|
|
16
|
-
_defineProperty(this, "_createTask", (project, task) => async (stopTask = () => undefined) => {
|
|
17
|
-
await task(project, project.dependency || [], () => stopTask());
|
|
47
|
+
this._createTask = (project, task) => (stopTask = () => void 0) => __async(this, null, function* () {
|
|
48
|
+
yield task(project, project.dependency || [], () => stopTask());
|
|
18
49
|
return project.name;
|
|
19
50
|
});
|
|
20
51
|
this._projects = projects;
|
|
@@ -24,9 +55,7 @@ export class DagOperator {
|
|
|
24
55
|
checkNodeDataExist(name) {
|
|
25
56
|
return this._projectsMap.has(name);
|
|
26
57
|
}
|
|
27
|
-
getNodeData(name, option = {
|
|
28
|
-
checkExist: false
|
|
29
|
-
}) {
|
|
58
|
+
getNodeData(name, option = { checkExist: false }) {
|
|
30
59
|
if (option.checkExist) {
|
|
31
60
|
if (this._projectsMap.has(name)) {
|
|
32
61
|
return this._projectsMap.get(name);
|
|
@@ -37,19 +66,15 @@ export class DagOperator {
|
|
|
37
66
|
return this._projectsMap.get(name);
|
|
38
67
|
}
|
|
39
68
|
getNodeDependencyData(name) {
|
|
40
|
-
var
|
|
41
|
-
return ((
|
|
69
|
+
var _a;
|
|
70
|
+
return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependency) || [];
|
|
42
71
|
}
|
|
43
72
|
getNodeDependentData(name) {
|
|
44
|
-
var
|
|
45
|
-
return ((
|
|
73
|
+
var _a;
|
|
74
|
+
return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependent) || [];
|
|
46
75
|
}
|
|
47
|
-
getNodeAllDependencyData(name, option = {
|
|
48
|
-
skipCircleCheck
|
|
49
|
-
}) {
|
|
50
|
-
const {
|
|
51
|
-
skipCircleCheck
|
|
52
|
-
} = option;
|
|
76
|
+
getNodeAllDependencyData(name, option = { skipCircleCheck: false }) {
|
|
77
|
+
const { skipCircleCheck } = option;
|
|
53
78
|
if (!skipCircleCheck) {
|
|
54
79
|
this.checkCircle();
|
|
55
80
|
}
|
|
@@ -66,145 +91,137 @@ export class DagOperator {
|
|
|
66
91
|
errorLog(`No '${name}' project exist`);
|
|
67
92
|
}
|
|
68
93
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
await pMap(projects,
|
|
79
|
-
// eslint-disable-next-line @typescript-eslint/no-loop-func
|
|
80
|
-
async project => {
|
|
81
|
-
if (!finishTaskHash[project.name]) {
|
|
82
|
-
finishTaskHash[project.name] = true;
|
|
83
|
-
await task(project, this._getProjectPreviousNode(project.dependent || [], preNodes), () => earlyFinish = true);
|
|
94
|
+
traverseAllNodes(task) {
|
|
95
|
+
return __async(this, null, function* () {
|
|
96
|
+
const sortedNodes = this._sortedProjects.length > 0 ? this._sortedProjects : sortProjects(this._projects);
|
|
97
|
+
const finishTaskHash = {};
|
|
98
|
+
let preNodes = [];
|
|
99
|
+
let earlyFinish = false;
|
|
100
|
+
for (const projects of sortedNodes) {
|
|
101
|
+
if (earlyFinish) {
|
|
102
|
+
break;
|
|
84
103
|
}
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
104
|
+
yield pMap(
|
|
105
|
+
projects,
|
|
106
|
+
(project) => __async(this, null, function* () {
|
|
107
|
+
if (!finishTaskHash[project.name]) {
|
|
108
|
+
finishTaskHash[project.name] = true;
|
|
109
|
+
yield task(
|
|
110
|
+
project,
|
|
111
|
+
this._getProjectPreviousNode(project.dependent || [], preNodes),
|
|
112
|
+
() => earlyFinish = true
|
|
113
|
+
);
|
|
114
|
+
}
|
|
115
|
+
}),
|
|
116
|
+
{ concurrency: projects.length }
|
|
117
|
+
);
|
|
118
|
+
preNodes = [...projects];
|
|
119
|
+
}
|
|
120
|
+
});
|
|
90
121
|
}
|
|
91
122
|
checkCircle() {
|
|
92
|
-
|
|
93
|
-
this._checkForCyclicDependencies(this._projects, [], new Set());
|
|
123
|
+
this._checkForCyclicDependencies(this._projects, [], /* @__PURE__ */ new Set());
|
|
94
124
|
}
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* 1. 把目标节点当做叶子节点集合 A 中的元素
|
|
104
|
-
* 2. 当叶子节点集合中某个 a 元素结束任务的时候进行如下操作:
|
|
105
|
-
* 2.1 剪(去额外的)枝:获取 a 元素的 dependent集合,将该集合中元素的依赖列表进行过滤,过滤条件为:排除 a 以及 a 元素的 dependent集合以外的元素。
|
|
106
|
-
* 2.2 入度减一:对 a 元素的 dependent 集合元素的 dependencyEdge 减一
|
|
107
|
-
* 3. 检查是否存在 dependencyEdge === 0 的节点,加入叶子节点集合 A中。
|
|
108
|
-
* 4. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
|
|
109
|
-
*/
|
|
110
|
-
|
|
111
|
-
async traverseProjectToDependent(name, task, {
|
|
112
|
-
withSelf = false,
|
|
113
|
-
runTaskConcurrency
|
|
114
|
-
} = {}) {
|
|
115
|
-
if (!this._projectsMap.has(name)) {
|
|
116
|
-
errorLog(`No '${name}' project exist`);
|
|
117
|
-
}
|
|
118
|
-
const traverseTargetNode = this._projectsMap.get(name);
|
|
119
|
-
const leafNodeTasks = [withSelf ? this._createTask(traverseTargetNode, task) : async () => Promise.resolve(traverseTargetNode.name)];
|
|
120
|
-
const taskRunner = new TaskRunner(leafNodeTasks, {
|
|
121
|
-
concurrency: runTaskConcurrency
|
|
125
|
+
traverseDependenciesToProjectToDependent(_0, _1) {
|
|
126
|
+
return __async(this, arguments, function* (name, task, config = {}) {
|
|
127
|
+
yield this.traverseDependenciesToProject(name, task, config);
|
|
128
|
+
yield this.traverseProjectToDependent(name, task, __spreadProps(__spreadValues({}, config), {
|
|
129
|
+
withSelf: false
|
|
130
|
+
}));
|
|
122
131
|
});
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
const dependency = dependentProject.dependency || [];
|
|
129
|
-
const removeNodes = dependency.filter(dependencyProject => ![projectName, ...dependent.map(p => p.name)].includes(dependencyProject.name));
|
|
130
|
-
edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
|
|
131
|
-
// 变成叶子节点,就加入执行任务的队列中
|
|
132
|
-
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
133
|
-
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
134
|
-
}
|
|
132
|
+
}
|
|
133
|
+
traverseProjectToDependent(_0, _1) {
|
|
134
|
+
return __async(this, arguments, function* (name, task, { withSelf = false, runTaskConcurrency } = {}) {
|
|
135
|
+
if (!this._projectsMap.has(name)) {
|
|
136
|
+
errorLog(`No '${name}' project exist`);
|
|
135
137
|
}
|
|
138
|
+
const traverseTargetNode = this._projectsMap.get(name);
|
|
139
|
+
const leafNodeTasks = [
|
|
140
|
+
withSelf ? this._createTask(traverseTargetNode, task) : () => __async(this, null, function* () {
|
|
141
|
+
return Promise.resolve(traverseTargetNode.name);
|
|
142
|
+
})
|
|
143
|
+
];
|
|
144
|
+
const taskRunner = new TaskRunner(leafNodeTasks, {
|
|
145
|
+
concurrency: runTaskConcurrency
|
|
146
|
+
});
|
|
147
|
+
const edgeManager = new EdgeManager();
|
|
148
|
+
taskRunner.on(TaskRunner.TASK_FINISH, (projectName) => {
|
|
149
|
+
const projectNode = this.getNodeData(projectName);
|
|
150
|
+
const dependent = projectNode.dependent || [];
|
|
151
|
+
for (const dependentProject of dependent) {
|
|
152
|
+
const dependency = dependentProject.dependency || [];
|
|
153
|
+
const removeNodes = dependency.filter(
|
|
154
|
+
(dependencyProject) => ![projectName, ...dependent.map((p) => p.name)].includes(
|
|
155
|
+
dependencyProject.name
|
|
156
|
+
)
|
|
157
|
+
);
|
|
158
|
+
edgeManager.reduceEdges(dependentProject, removeNodes.length + 1);
|
|
159
|
+
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
160
|
+
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
});
|
|
164
|
+
yield taskRunner.run();
|
|
136
165
|
});
|
|
137
|
-
await taskRunner.run();
|
|
138
166
|
}
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
async traverseDependenciesToProject(name, task, {
|
|
150
|
-
withSelf = false,
|
|
151
|
-
runTaskConcurrency
|
|
152
|
-
} = {}) {
|
|
153
|
-
if (!this._projectsMap.has(name)) {
|
|
154
|
-
errorLog(`No '${name}' project exist`);
|
|
155
|
-
}
|
|
156
|
-
const traverseTargetNode = this._projectsMap.get(name);
|
|
157
|
-
const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
|
|
158
|
-
if ((leafNodes === null || leafNodes === void 0 ? void 0 : leafNodes.length) === 0) {
|
|
159
|
-
await this._createTask(traverseTargetNode, task)();
|
|
160
|
-
return;
|
|
161
|
-
}
|
|
162
|
-
const leafNodeTasks = leafNodes.map(project => this._createTask(project, task));
|
|
163
|
-
const taskRunner = new TaskRunner(leafNodeTasks, {
|
|
164
|
-
concurrency: runTaskConcurrency
|
|
165
|
-
});
|
|
166
|
-
const edgeManager = new EdgeManager();
|
|
167
|
-
taskRunner.on(TaskRunner.TASK_FINISH, projectName => {
|
|
168
|
-
const projectNode = this.getNodeData(projectName);
|
|
169
|
-
const dependent = projectNode.dependent || [];
|
|
170
|
-
for (const dependentProject of dependent) {
|
|
171
|
-
// 只处理在叶子节点/目标项目的所有依赖集合的节点
|
|
172
|
-
if (![traverseTargetNode, ...leafNodes].some(n => n.name === dependentProject.name)) {
|
|
173
|
-
continue;
|
|
174
|
-
}
|
|
175
|
-
edgeManager.reduceOneEdge(dependentProject);
|
|
176
|
-
if (dependentProject.name === traverseTargetNode.name && !withSelf) {
|
|
177
|
-
continue;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
// 变成叶子节点,就加入执行任务的队列中
|
|
181
|
-
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
182
|
-
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
183
|
-
}
|
|
167
|
+
traverseDependenciesToProject(_0, _1) {
|
|
168
|
+
return __async(this, arguments, function* (name, task, { withSelf = false, runTaskConcurrency } = {}) {
|
|
169
|
+
if (!this._projectsMap.has(name)) {
|
|
170
|
+
errorLog(`No '${name}' project exist`);
|
|
171
|
+
}
|
|
172
|
+
const traverseTargetNode = this._projectsMap.get(name);
|
|
173
|
+
const leafNodes = this._getDependencyLeafNodes(traverseTargetNode);
|
|
174
|
+
if ((leafNodes == null ? void 0 : leafNodes.length) === 0) {
|
|
175
|
+
yield this._createTask(traverseTargetNode, task)();
|
|
176
|
+
return;
|
|
184
177
|
}
|
|
178
|
+
const leafNodeTasks = leafNodes.map(
|
|
179
|
+
(project) => this._createTask(project, task)
|
|
180
|
+
);
|
|
181
|
+
const taskRunner = new TaskRunner(leafNodeTasks, {
|
|
182
|
+
concurrency: runTaskConcurrency
|
|
183
|
+
});
|
|
184
|
+
const edgeManager = new EdgeManager();
|
|
185
|
+
taskRunner.on(TaskRunner.TASK_FINISH, (projectName) => {
|
|
186
|
+
const projectNode = this.getNodeData(projectName);
|
|
187
|
+
const dependent = projectNode.dependent || [];
|
|
188
|
+
for (const dependentProject of dependent) {
|
|
189
|
+
if (![traverseTargetNode, ...leafNodes].some(
|
|
190
|
+
(n) => n.name === dependentProject.name
|
|
191
|
+
)) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
edgeManager.reduceOneEdge(dependentProject);
|
|
195
|
+
if (dependentProject.name === traverseTargetNode.name && !withSelf) {
|
|
196
|
+
continue;
|
|
197
|
+
}
|
|
198
|
+
if (edgeManager.getEdge(dependentProject) === 0) {
|
|
199
|
+
taskRunner.addTask(this._createTask(dependentProject, task));
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
yield taskRunner.run();
|
|
185
204
|
});
|
|
186
|
-
await taskRunner.run();
|
|
187
205
|
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
191
|
-
*
|
|
192
|
-
* This source code is licensed under the MIT license found in the
|
|
193
|
-
* LICENSE file at
|
|
194
|
-
* https://github.com/microsoft/rushstack/blob/master/apps/rush-lib/LICENSE
|
|
195
|
-
*
|
|
196
|
-
/**
|
|
197
|
-
* Checks for projects that indirectly depend on themselves.
|
|
198
|
-
*/
|
|
199
206
|
_checkForCyclicDependencies(projects, dependencyChain, alreadyCheckedProjects) {
|
|
200
207
|
for (const project of projects) {
|
|
201
208
|
if (dependencyChain.includes(project.name)) {
|
|
202
|
-
throw new Error(
|
|
209
|
+
throw new Error(
|
|
210
|
+
`${"A cyclic dependency was encountered:\n"} ${[
|
|
211
|
+
...dependencyChain,
|
|
212
|
+
project.name
|
|
213
|
+
].reverse().join("\n -> ")}
|
|
214
|
+
`
|
|
215
|
+
);
|
|
203
216
|
}
|
|
204
217
|
if (!alreadyCheckedProjects.has(project.name)) {
|
|
205
218
|
alreadyCheckedProjects.add(project.name);
|
|
206
219
|
dependencyChain.push(project.name);
|
|
207
|
-
this._checkForCyclicDependencies(
|
|
220
|
+
this._checkForCyclicDependencies(
|
|
221
|
+
project.dependent,
|
|
222
|
+
dependencyChain,
|
|
223
|
+
alreadyCheckedProjects
|
|
224
|
+
);
|
|
208
225
|
dependencyChain.pop();
|
|
209
226
|
}
|
|
210
227
|
}
|
|
@@ -216,18 +233,19 @@ export class DagOperator {
|
|
|
216
233
|
}
|
|
217
234
|
let leafNodes = [...dependency];
|
|
218
235
|
for (const dependencyNode of dependency) {
|
|
219
|
-
leafNodes = [
|
|
236
|
+
leafNodes = [
|
|
237
|
+
...leafNodes,
|
|
238
|
+
...this._getDependencyLeafNodes(dependencyNode)
|
|
239
|
+
];
|
|
220
240
|
}
|
|
221
241
|
return leafNodes;
|
|
222
242
|
}
|
|
223
243
|
_getProjectPreviousNode(searchProjects, preNodes) {
|
|
224
|
-
return searchProjects.filter(
|
|
244
|
+
return searchProjects.filter(
|
|
245
|
+
(p) => preNodes.map((preP) => preP.name).includes(p.name)
|
|
246
|
+
);
|
|
225
247
|
}
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
// calculateCriticalPaths(project);
|
|
231
|
-
// }
|
|
232
|
-
// }
|
|
233
|
-
}
|
|
248
|
+
}
|
|
249
|
+
export {
|
|
250
|
+
DagOperator
|
|
251
|
+
};
|