@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.
Files changed (105) hide show
  1. package/CHANGELOG.md +103 -0
  2. package/bin/modern.js +3 -1
  3. package/dist/js/modern/cli/build-watch.js +30 -5
  4. package/dist/js/modern/cli/build.js +31 -5
  5. package/dist/js/modern/cli/clear.js +30 -5
  6. package/dist/js/modern/cli/deploy.js +35 -7
  7. package/dist/js/modern/cli/index.js +1 -1
  8. package/dist/js/modern/cli/install.js +30 -5
  9. package/dist/js/modern/cli/new.js +56 -14
  10. package/dist/js/modern/commands/build-watch.js +32 -18
  11. package/dist/js/modern/commands/build.js +49 -23
  12. package/dist/js/modern/commands/clear.js +31 -15
  13. package/dist/js/modern/commands/deploy.js +38 -24
  14. package/dist/js/modern/commands/index.js +1 -1
  15. package/dist/js/modern/commands/install.js +32 -17
  16. package/dist/js/modern/constants.js +13 -9
  17. package/dist/js/modern/dag/create.js +27 -23
  18. package/dist/js/modern/dag/edge-manager.js +5 -4
  19. package/dist/js/modern/dag/index.js +6 -5
  20. package/dist/js/modern/dag/operator.js +174 -156
  21. package/dist/js/modern/dag/task.js +64 -39
  22. package/dist/js/modern/dag/utils.js +32 -38
  23. package/dist/js/modern/features/build/index.js +47 -28
  24. package/dist/js/modern/features/clear/index.js +16 -15
  25. package/dist/js/modern/features/deploy/index.js +107 -82
  26. package/dist/js/modern/features/dev/cmds.js +4 -3
  27. package/dist/js/modern/features/dev/create-task.js +43 -34
  28. package/dist/js/modern/features/dev/index.js +60 -41
  29. package/dist/js/modern/features/dev/watch-projects-state.js +47 -24
  30. package/dist/js/modern/features/install/index.js +43 -22
  31. package/dist/js/modern/hooks/index.js +6 -3
  32. package/dist/js/modern/index.js +18 -16
  33. package/dist/js/modern/locale/en.js +10 -7
  34. package/dist/js/modern/locale/index.js +6 -6
  35. package/dist/js/modern/locale/zh.js +11 -8
  36. package/dist/js/modern/log/error.js +6 -3
  37. package/dist/js/modern/log/multi-tasks-log.js +25 -34
  38. package/dist/js/modern/log/time.js +26 -11
  39. package/dist/js/modern/log/utils.js +9 -5
  40. package/dist/js/modern/package/index.js +5 -6
  41. package/dist/js/modern/parse-config/index.js +49 -22
  42. package/dist/js/modern/parse-config/monorepo.js +41 -26
  43. package/dist/js/modern/projects/check-project-change.js +59 -30
  44. package/dist/js/modern/projects/clear-memory-files.js +17 -7
  45. package/dist/js/modern/projects/get-projects-by-packages-config.js +89 -52
  46. package/dist/js/modern/projects/get-projects-by-workspace-file.js +68 -32
  47. package/dist/js/modern/projects/get-projects.js +96 -53
  48. package/dist/js/modern/type.js +0 -1
  49. package/dist/js/modern/utils/install.js +36 -19
  50. package/dist/js/modern/utils/language.js +6 -3
  51. package/dist/js/node/cli/build-watch.js +51 -10
  52. package/dist/js/node/cli/build.js +52 -10
  53. package/dist/js/node/cli/clear.js +51 -10
  54. package/dist/js/node/cli/deploy.js +56 -12
  55. package/dist/js/node/cli/index.js +22 -71
  56. package/dist/js/node/cli/install.js +51 -10
  57. package/dist/js/node/cli/new.js +75 -19
  58. package/dist/js/node/commands/build-watch.js +59 -29
  59. package/dist/js/node/commands/build.js +74 -32
  60. package/dist/js/node/commands/clear.js +57 -25
  61. package/dist/js/node/commands/deploy.js +65 -35
  62. package/dist/js/node/commands/index.js +21 -60
  63. package/dist/js/node/commands/install.js +59 -28
  64. package/dist/js/node/constants.js +33 -13
  65. package/dist/js/node/dag/create.js +46 -28
  66. package/dist/js/node/dag/edge-manager.js +25 -8
  67. package/dist/js/node/dag/index.js +30 -13
  68. package/dist/js/node/dag/operator.js +211 -174
  69. package/dist/js/node/dag/task.js +92 -46
  70. package/dist/js/node/dag/utils.js +58 -47
  71. package/dist/js/node/features/build/index.js +84 -47
  72. package/dist/js/node/features/clear/index.js +49 -28
  73. package/dist/js/node/features/deploy/index.js +139 -104
  74. package/dist/js/node/features/dev/cmds.js +26 -9
  75. package/dist/js/node/features/dev/create-task.js +80 -51
  76. package/dist/js/node/features/dev/index.js +98 -58
  77. package/dist/js/node/features/dev/watch-projects-state.js +71 -30
  78. package/dist/js/node/features/install/index.js +82 -41
  79. package/dist/js/node/hooks/index.js +27 -8
  80. package/dist/js/node/index.js +53 -32
  81. package/dist/js/node/locale/en.js +30 -11
  82. package/dist/js/node/locale/index.js +31 -14
  83. package/dist/js/node/locale/zh.js +31 -12
  84. package/dist/js/node/log/error.js +26 -7
  85. package/dist/js/node/log/multi-tasks-log.js +48 -41
  86. package/dist/js/node/log/time.js +47 -18
  87. package/dist/js/node/log/utils.js +30 -10
  88. package/dist/js/node/package/index.js +25 -10
  89. package/dist/js/node/parse-config/index.js +76 -31
  90. package/dist/js/node/parse-config/monorepo.js +79 -44
  91. package/dist/js/node/projects/check-project-change.js +104 -56
  92. package/dist/js/node/projects/clear-memory-files.js +42 -15
  93. package/dist/js/node/projects/get-projects-by-packages-config.js +119 -65
  94. package/dist/js/node/projects/get-projects-by-workspace-file.js +108 -55
  95. package/dist/js/node/projects/get-projects.js +112 -61
  96. package/dist/js/node/type.js +15 -5
  97. package/dist/js/node/utils/install.js +68 -31
  98. package/dist/js/node/utils/language.js +28 -8
  99. package/dist/js/node/utils/types.js +15 -0
  100. package/dist/types/dag/operator.d.ts +3 -0
  101. package/dist/types/dag/utils.d.ts +1 -0
  102. package/dist/types/features/dev/index.d.ts +1 -0
  103. package/dist/types/index.d.ts +2 -0
  104. package/dist/types/projects/get-projects.d.ts +1 -0
  105. package/package.json +12 -19
@@ -1,35 +1,49 @@
1
- import { logger } from '@modern-js/utils';
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
- export const deploy = async (api, deployProjectNames, option, ignoreMatchs = []) => {
7
- const {
8
- deployPath = 'output'
9
- } = option;
10
- const {
11
- appDirectory
12
- } = api.useAppContext();
13
- logger.info(`start deploy ${deployProjectNames.join(',')}`);
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
- packagesIgnoreMatchs: ignoreMatchs
19
- }, appDirectory);
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
- await runDeployTask(deployProjectNames, operator, {
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
- operator,
33
- deployProjectNames
34
- });
35
- };
45
+ runners.afterMonorepoDeploy({ operator, deployProjectNames });
46
+ });
47
+ export {
48
+ deploy
49
+ };
@@ -2,4 +2,4 @@ export * from "./deploy";
2
2
  export * from "./build";
3
3
  export * from "./build-watch";
4
4
  export * from "./clear";
5
- export * from "./install";
5
+ export * from "./install";
@@ -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
- export const install = async (projectNames = [], option, api) => {
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
- } = api.useAppContext();
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
- rootPath,
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
- export const WORKSPACE_FILE = {
2
- LERNA: 'lerna.json',
3
- YARN: 'package.json',
4
- PNPM: 'pnpm-workspace.yaml'
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
- 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
- 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; }
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; }
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(_objectSpread(_objectSpread(_objectSpread({}, dependencies), devDependencies), optionalDependencies)).filter(depName => projectsName.includes(depName));
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
- // get dependency ProjectNode
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 === null || dependencyProject === void 0 ? void 0 : dependencyProject.dependent) || [];
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
- export const create = projects => {
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
- projectsMap,
42
- projectList: projectsName
43
- };
44
- };
44
+ return { projectsMap, projectList: projectsName };
45
+ };
46
+ export {
47
+ create
48
+ };
@@ -1,7 +1,5 @@
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
- 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
- export const initDAG = projects => {
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
- 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
- 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; }
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; }
4
- import pMap from 'p-map';
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
- export class DagOperator {
10
- // 排序好的项目列表
11
-
45
+ class DagOperator {
12
46
  constructor(projects, projectsMap) {
13
- _defineProperty(this, "_projects", void 0);
14
- _defineProperty(this, "_projectsMap", void 0);
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 _this$_projectsMap$ge;
41
- return ((_this$_projectsMap$ge = this._projectsMap.get(name)) === null || _this$_projectsMap$ge === void 0 ? void 0 : _this$_projectsMap$ge.dependency) || [];
69
+ var _a;
70
+ return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependency) || [];
42
71
  }
43
72
  getNodeDependentData(name) {
44
- var _this$_projectsMap$ge2;
45
- return ((_this$_projectsMap$ge2 = this._projectsMap.get(name)) === null || _this$_projectsMap$ge2 === void 0 ? void 0 : _this$_projectsMap$ge2.dependent) || [];
73
+ var _a;
74
+ return ((_a = this._projectsMap.get(name)) == null ? void 0 : _a.dependent) || [];
46
75
  }
47
- getNodeAllDependencyData(name, option = {
48
- skipCircleCheck: false
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
- async traverseAllNodes(task) {
70
- const sortedNodes = this._sortedProjects.length > 0 ? this._sortedProjects : sortProjects(this._projects);
71
- const finishTaskHash = {};
72
- let preNodes = [];
73
- let earlyFinish = false;
74
- for (const projects of sortedNodes) {
75
- if (earlyFinish) {
76
- break;
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
- concurrency: projects.length
87
- });
88
- preNodes = [...projects];
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
- // this._sortedProjects = sortProjects(this._projects);
93
- this._checkForCyclicDependencies(this._projects, [], new Set());
123
+ this._checkForCyclicDependencies(this._projects, [], /* @__PURE__ */ new Set());
94
124
  }
95
- async traverseDependenciesToProjectToDependent(name, task, config = {}) {
96
- await this.traverseDependenciesToProject(name, task, config);
97
- await this.traverseProjectToDependent(name, task, _objectSpread(_objectSpread({}, config), {}, {
98
- withSelf: false
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
- const edgeManager = new EdgeManager();
124
- taskRunner.on(TaskRunner.TASK_FINISH, projectName => {
125
- const projectNode = this.getNodeData(projectName);
126
- const dependent = projectNode.dependent || [];
127
- for (const dependentProject of dependent) {
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
- * 1. 找到叶子节点集合 A
142
- * 2. 找到直接连接叶子节点的节点集合 B
143
- * 3. 当有某个叶子节点结束任务,则对该节点的直接连接的节点(或者理解成dependent)的枝数(或者叫入度)减一。
144
- * 4. 检查 B 集合中是否存在入度为0的节点,则此节点为叶子节点,并加入叶子节点集合 A
145
- * 5. 根据情况(是否存在空闲的进程)选择是否执行新加入的节点对应的任务。
146
- */
147
-
148
- // TODO: 执行顺序还需要再确定一下
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(`${'A cyclic dependency was encountered:\n'} ${[...dependencyChain, project.name].reverse().join('\n -> ')}\n`);
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(project.dependent, dependencyChain, alreadyCheckedProjects);
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 = [...leafNodes, ...this._getDependencyLeafNodes(dependencyNode)];
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(p => preNodes.map(preP => preP.name).includes(p.name));
244
+ return searchProjects.filter(
245
+ (p) => preNodes.map((preP) => preP.name).includes(p.name)
246
+ );
225
247
  }
226
-
227
- // public async getOrderTasks() {
228
- // // Precalculate the number of dependent packages
229
- // for (const project of this._projects) {
230
- // calculateCriticalPaths(project);
231
- // }
232
- // }
233
- }
248
+ }
249
+ export {
250
+ DagOperator
251
+ };