DependencyUtil.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. export function getMetaList(meta, type, name, list_name) {
  2. if (meta.os === 'linux') {
  3. return meta[type][name][list_name + '-linux'] ?? meta[type][name][list_name + '-unix'] ?? meta[type][name][list_name] ?? [];
  4. }
  5. if (meta.os === 'macos') {
  6. return meta[type][name][list_name + '-macos'] ?? meta[type][name][list_name + '-unix'] ?? meta[type][name][list_name] ?? [];
  7. }
  8. if (meta.os === 'windows') {
  9. return meta[type][name][list_name + '-windows'] ?? meta[type][name][list_name] ?? [];
  10. }
  11. return [];
  12. }
  13. export function getExtDepends(meta, ext_name) {
  14. return getMetaList(meta, 'ext', ext_name, 'ext-depends');
  15. }
  16. export function getExtSuggests(meta, ext_name) {
  17. return getMetaList(meta, 'ext', ext_name, 'ext-suggests');
  18. }
  19. export function getExtLibDepends(meta, ext_name) {
  20. const ls = getMetaList(meta, 'ext', ext_name, 'lib-depends');
  21. return ls;
  22. }
  23. export function getExtLibSuggests(meta, ext_name) {
  24. return getMetaList(meta, 'ext', ext_name, 'lib-suggests');
  25. }
  26. export function getLibDepends(meta, lib_name) {
  27. return getMetaList(meta, 'lib', lib_name, 'lib-depends');
  28. }
  29. export function getLibSuggests(meta, lib_name) {
  30. return getMetaList(meta, 'lib', lib_name, 'lib-suggests');
  31. }
  32. /**
  33. * Obtain the dependent lib list according to the required ext list, and sort according to the dependency
  34. * @param meta
  35. * @param exts
  36. */
  37. export function getExtLibsByDeps(meta, exts) {
  38. const sorted = [];
  39. const visited = new Set();
  40. const notIncludedExts = [];
  41. exts.forEach((ext) => {
  42. if (!visited.has(ext)) {
  43. visitExtDeps(meta, ext, visited, sorted);
  44. }
  45. });
  46. const sortedSuggests = [];
  47. const visitedSuggests = new Set();
  48. const final = [];
  49. exts.forEach((ext) => {
  50. if (!visited.has(ext)) {
  51. visitExtAllDeps(meta, ext, visitedSuggests, sortedSuggests);
  52. }
  53. });
  54. sortedSuggests.forEach((suggest) => {
  55. if (sorted.indexOf(suggest) !== -1) {
  56. final.push(suggest);
  57. }
  58. });
  59. const libs = [];
  60. final.forEach((ext) => {
  61. if (exts.indexOf(ext) === -1) {
  62. notIncludedExts.push(ext);
  63. }
  64. getExtLibDepends(meta, ext).forEach((lib) => {
  65. if (libs.indexOf(lib) === -1) {
  66. libs.push(lib);
  67. }
  68. });
  69. });
  70. return { exts: final, libs: getLibsByDeps(meta, libs), notIncludedExts: notIncludedExts };
  71. }
  72. export function getAllExtLibsByDeps(meta, exts) {
  73. const sorted = [];
  74. const visited = new Set();
  75. const notIncludedExts = [];
  76. exts.forEach((ext) => {
  77. if (!visited.has(ext)) {
  78. visitExtAllDeps(meta, ext, visited, sorted);
  79. }
  80. });
  81. const libs = [];
  82. sorted.forEach((ext) => {
  83. if (exts.indexOf(ext) === -1) {
  84. notIncludedExts.push(ext);
  85. }
  86. const allLibs = [...getExtLibDepends(meta, ext), ...getExtLibSuggests(meta, ext)];
  87. allLibs.forEach((dep) => {
  88. if (libs.indexOf(dep) === -1) {
  89. libs.push(dep);
  90. }
  91. });
  92. });
  93. return { exts: sorted, libs: getAllLibsByDeps(meta, libs), notIncludedExts: notIncludedExts };
  94. }
  95. export function getAllLibsByDeps(meta, libs) {
  96. const sorted = [];
  97. const visited = new Set();
  98. libs.forEach((lib) => {
  99. if (!visited.has(lib)) {
  100. console.log('before visited');
  101. console.log(visited);
  102. visitLibAllDeps(meta, lib, visited, sorted);
  103. console.log('after visited');
  104. console.log(visited);
  105. }
  106. });
  107. return sorted;
  108. }
  109. export function getLibsByDeps(meta, libs) {
  110. const sorted = [];
  111. const visited = new Set();
  112. libs.forEach((lib) => {
  113. if (!visited.has(lib)) {
  114. visitLibDeps(meta, lib, visited, sorted);
  115. }
  116. });
  117. const sortedSuggests = [];
  118. const visitedSuggests = new Set();
  119. const final = [];
  120. libs.forEach((lib) => {
  121. if (!visitedSuggests.has(lib)) {
  122. visitLibAllDeps(meta, lib, visitedSuggests, sortedSuggests);
  123. }
  124. });
  125. sortedSuggests.forEach((suggest) => {
  126. if (sorted.indexOf(suggest) !== -1) {
  127. final.push(suggest);
  128. }
  129. });
  130. return final;
  131. }
  132. export function visitLibAllDeps(meta, lib_name, visited, sorted) {
  133. if (visited.has(lib_name)) {
  134. return;
  135. }
  136. visited.add(lib_name);
  137. const allLibs = [...getLibDepends(meta, lib_name), ...getLibSuggests(meta, lib_name)];
  138. allLibs.forEach((dep) => {
  139. visitLibDeps(meta, dep, visited, sorted);
  140. });
  141. sorted.push(lib_name);
  142. }
  143. export function visitLibDeps(meta, lib_name, visited, sorted) {
  144. if (visited.has(lib_name)) {
  145. return;
  146. }
  147. visited.add(lib_name);
  148. getLibDepends(meta, lib_name).forEach((dep) => {
  149. visitLibDeps(meta, dep, visited, sorted);
  150. });
  151. sorted.push(lib_name);
  152. }
  153. export function visitExtDeps(meta, ext_name, visited, sorted) {
  154. if (visited.has(visited)) {
  155. return;
  156. }
  157. visited.add(ext_name);
  158. getExtDepends(meta, ext_name).forEach((dep) => {
  159. visitExtDeps(meta, dep, visited, sorted);
  160. });
  161. sorted.push(ext_name);
  162. }
  163. export function visitExtAllDeps(meta, ext_name, visited, sorted) {
  164. if (visited.has(ext_name)) {
  165. return;
  166. }
  167. visited.add(ext_name);
  168. const allExts = [...getExtDepends(meta, ext_name), ...getExtSuggests(meta, ext_name)];
  169. allExts.forEach((dep) => {
  170. visitExtDeps(meta, dep, visited, sorted);
  171. });
  172. sorted.push(ext_name);
  173. }