20
20
21
21
// MODULES //
22
22
23
- var resolve = require ( 'path' ) . resolve ;
24
23
var logger = require ( 'debug' ) ;
25
24
var CompactAdjacencyMatrix = require ( '@stdlib/utils/compact-adjacency-matrix' ) ;
26
- var rootDir = require ( '@stdlib/_tools/utils/root-dir' ) ;
27
- var getDeps = require ( '@stdlib/_tools/pkgs/deps' ) . sync ;
25
+ var depList = require ( '@stdlib/_tools/pkgs/dep-list' ) ;
28
26
var indexOf = require ( '@stdlib/utils/index-of' ) ;
29
27
var contains = require ( '@stdlib/assert/contains' ) ;
28
+ var startsWith = require ( '@stdlib/string/starts-with' ) ;
30
29
var format = require ( '@stdlib/string/format' ) ;
31
30
32
31
33
32
// VARIABLES //
34
33
35
34
var debug = logger ( 'pkgs:toposort:sort' ) ;
36
35
var OPTS = {
37
- 'dev' : false ,
38
- 'dir' : resolve ( rootDir ( ) , 'lib' , 'node_modules' )
36
+ 'dev' : false
39
37
} ;
40
38
41
39
40
+ // FUNCTIONS //
41
+
42
+ /**
43
+ * Checks whether a package is an ancestor of another package.
44
+ *
45
+ * @private
46
+ * @param {string } candidate - potential ancestor package (e.g., `@stdlib/string/tools`)
47
+ * @param {string } descendant - descendant package (e.g., `@stdlib/string/tools/grapheme-cluster-break`)
48
+ * @returns {boolean } boolean indicating whether a package is an ancestor of another package
49
+ */
50
+ function isAncestorPackage ( candidate , descendant ) {
51
+ return startsWith ( descendant , candidate + '/' ) ;
52
+ }
53
+
54
+
42
55
// MAIN //
43
56
44
57
/**
@@ -49,7 +62,6 @@ var OPTS = {
49
62
* @returns {(StringArray|EmptyArray|Error) } sorted package names
50
63
*/
51
64
function sort ( pkgs ) {
52
- var pkgsDeps ;
53
65
var deps ;
54
66
var idx ;
55
67
var out ;
@@ -63,17 +75,19 @@ function sort( pkgs ) {
63
75
return pkgs ;
64
76
}
65
77
M = new CompactAdjacencyMatrix ( N ) ;
66
- pkgsDeps = getDeps ( pkgs , OPTS ) ;
67
78
for ( i = 0 ; i < N ; i ++ ) {
68
79
debug ( 'Resolving dependencies for package: %s (%d of %d)' , pkgs [ i ] , i + 1 , N ) ;
69
- deps = pkgsDeps [ i ] . deps ;
80
+ deps = depList ( pkgs [ i ] , OPTS ) ;
70
81
71
82
debug ( 'Processing %d dependencies...' , deps . length ) ;
72
83
for ( j = 0 ; j < deps . length ; j ++ ) {
73
84
idx = indexOf ( pkgs , deps [ j ] ) ;
74
85
75
- // Ignore external dependencies and internal tools packages...
76
- if ( idx >= 0 && ! contains ( deps [ j ] , '_tools' ) ) {
86
+ if (
87
+ idx >= 0 && // ignore external dependencies
88
+ ! contains ( deps [ j ] , '_tools' ) && // ignore internal tools packages
89
+ ! isAncestorPackage ( deps [ j ] , pkgs [ i ] ) // ignore dependencies which are parent packages
90
+ ) {
77
91
M . addEdge ( idx , i ) ;
78
92
}
79
93
}
0 commit comments