data.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.addLinks = exports.mergeTrees = exports.buildTree = void 0;
  4. const types_1 = require("../shared/types");
  5. const addToPath = (moduleId, tree, modulePath, node) => {
  6. if (modulePath.length === 0) {
  7. throw new Error(`Error adding node to path ${moduleId}`);
  8. }
  9. const [head, ...rest] = modulePath;
  10. if (rest.length === 0) {
  11. tree.children.push({ ...node, name: head });
  12. return;
  13. }
  14. else {
  15. let newTree = tree.children.find((folder) => folder.name === head && (0, types_1.isModuleTree)(folder));
  16. if (!newTree) {
  17. newTree = { name: head, children: [] };
  18. tree.children.push(newTree);
  19. }
  20. addToPath(moduleId, newTree, rest, node);
  21. return;
  22. }
  23. };
  24. // TODO try to make it without recursion, but still typesafe
  25. const mergeSingleChildTrees = (tree) => {
  26. if (tree.children.length === 1) {
  27. const child = tree.children[0];
  28. const name = `${tree.name}/${child.name}`;
  29. if ((0, types_1.isModuleTree)(child)) {
  30. tree.name = name;
  31. tree.children = child.children;
  32. return mergeSingleChildTrees(tree);
  33. }
  34. else {
  35. return {
  36. name,
  37. uid: child.uid,
  38. };
  39. }
  40. }
  41. else {
  42. tree.children = tree.children.map((node) => {
  43. if ((0, types_1.isModuleTree)(node)) {
  44. return mergeSingleChildTrees(node);
  45. }
  46. else {
  47. return node;
  48. }
  49. });
  50. return tree;
  51. }
  52. };
  53. const buildTree = (bundleId, modules, mapper) => {
  54. const tree = {
  55. name: bundleId,
  56. children: [],
  57. };
  58. for (const { id, renderedLength, gzipLength, brotliLength } of modules) {
  59. const bundleModuleUid = mapper.setNodePart(bundleId, id, {
  60. renderedLength,
  61. gzipLength,
  62. brotliLength,
  63. });
  64. const trimmedModuleId = mapper.trimProjectRootId(id);
  65. const pathParts = trimmedModuleId.split(/\\|\//).filter((p) => p !== "");
  66. addToPath(trimmedModuleId, tree, pathParts, { uid: bundleModuleUid });
  67. }
  68. tree.children = tree.children.map((node) => {
  69. if ((0, types_1.isModuleTree)(node)) {
  70. return mergeSingleChildTrees(node);
  71. }
  72. else {
  73. return node;
  74. }
  75. });
  76. return tree;
  77. };
  78. exports.buildTree = buildTree;
  79. const mergeTrees = (trees) => {
  80. const newTree = {
  81. name: "root",
  82. children: trees,
  83. isRoot: true,
  84. };
  85. return newTree;
  86. };
  87. exports.mergeTrees = mergeTrees;
  88. const addLinks = (startModuleId, getModuleInfo, mapper) => {
  89. const processedNodes = {};
  90. const moduleIds = [startModuleId];
  91. while (moduleIds.length > 0) {
  92. const moduleId = moduleIds.shift();
  93. if (processedNodes[moduleId]) {
  94. continue;
  95. }
  96. else {
  97. processedNodes[moduleId] = true;
  98. }
  99. const moduleInfo = getModuleInfo(moduleId);
  100. if (!moduleInfo) {
  101. return;
  102. }
  103. if (moduleInfo.isEntry) {
  104. mapper.setNodeMeta(moduleId, { isEntry: true });
  105. }
  106. if (moduleInfo.isExternal) {
  107. mapper.setNodeMeta(moduleId, { isExternal: true });
  108. }
  109. for (const importedId of moduleInfo.importedIds) {
  110. mapper.addImportedByLink(importedId, moduleId);
  111. mapper.addImportedLink(moduleId, importedId);
  112. moduleIds.push(importedId);
  113. }
  114. for (const importedId of moduleInfo.dynamicallyImportedIds || []) {
  115. mapper.addImportedByLink(importedId, moduleId);
  116. mapper.addImportedLink(moduleId, importedId, true);
  117. moduleIds.push(importedId);
  118. }
  119. }
  120. };
  121. exports.addLinks = addLinks;