1- var fs = require ( 'fs' ) ;
2- var path = require ( 'path' ) ;
3- var mdeps = require ( '@cljs-oss/module-deps' ) ;
4- var nodeResolve = require ( 'resolve' ) ;
5- var konan = require ( 'konan' ) ;
6- var enhancedResolve = require ( 'enhanced-resolve' ) ;
7-
8- var target = 'CLJS_TARGET' ;
9- var filename = fs . realpathSync ( path . resolve ( __dirname , 'JS_FILE' ) ) ;
10- var mainFields =
11- target === 'nodejs' ? [ 'module' , 'main' ] : [ 'module' , 'browser' , 'main' ] ;
12-
13- var resolver = enhancedResolve . create ( {
1+ let fs = require ( 'fs' ) ;
2+ let path = require ( 'path' ) ;
3+ let mdeps = require ( '@cljs-oss/module-deps' ) ;
4+ let nodeResolve = require ( 'resolve' ) ;
5+ let babylon = require ( 'babylon' ) ;
6+ let traverse = require ( 'babel-traverse' ) . default ;
7+ let enhancedResolve = require ( 'enhanced-resolve' ) ;
8+
9+ let target = 'CLJS_TARGET' ;
10+ let filename = fs . realpathSync ( path . resolve ( __dirname , 'JS_FILE' ) ) ;
11+ let mainFields =
12+ target === 'nodejs' ? [ 'module' , 'main' ] : [ 'module' , 'browser' , 'main' ] ;
13+
14+ // https://github.com/egoist/konan
15+ let getDeps = function ( src , { dynamicImport = true , parse = { sourceType : 'module' , plugins : '*' } } = { } ) {
16+ const modules = { strings : [ ] , expressions : [ ] } ;
17+
18+ let ast ;
19+
20+ if ( typeof src === 'string' ) {
21+ const moduleRe = / \b ( r e q u i r e | i m p o r t ) \b / ;
22+
23+ if ( ! moduleRe . test ( src ) ) {
24+ return modules ;
25+ }
26+
27+ ast = babylon . parse ( src , parse ) ;
28+ } else {
29+ ast = src ;
30+ }
31+
32+ traverse ( ast , {
33+ enter ( path ) {
34+ if ( path . node . type === 'CallExpression' ) {
35+ const callee = path . get ( 'callee' ) ;
36+ const isDynamicImport = dynamicImport && callee . isImport ( ) ;
37+ if ( callee . isIdentifier ( { name : 'require' } ) || isDynamicImport ) {
38+ const arg = path . node . arguments [ 0 ] ;
39+ if ( arg . type === 'StringLiteral' ) {
40+ modules . strings . push ( arg . value ) ;
41+ } else {
42+ modules . expressions . push ( src . slice ( arg . start , arg . end ) ) ;
43+ }
44+ }
45+ } else if ( path . node . type === 'ImportDeclaration' ) {
46+ modules . strings . push ( path . node . source . value ) ;
47+ } else if ( path . node . type === 'ExportNamedDeclaration' && path . node . source ) {
48+ // this branch handles `export ... from` - David
49+ modules . strings . push ( path . node . source . value ) ;
50+ }
51+ }
52+ } ) ;
53+
54+ return modules ;
55+ } ;
56+
57+ let resolver = enhancedResolve . create ( {
1458 fileSystem : new enhancedResolve . CachedInputFileSystem (
1559 new enhancedResolve . NodeJsInputFileSystem ( ) ,
1660 4000
@@ -20,7 +64,7 @@ var resolver = enhancedResolve.create({
2064 moduleExtensions : [ '.js' , '.json' ] ,
2165} ) ;
2266
23- var md = mdeps ( {
67+ let md = mdeps ( {
2468 resolve : function ( id , parentOpts , cb ) {
2569 // set the basedir properly so we don't try to resolve requires in the Closure
2670 // Compiler processed `node_modules` folder.
@@ -35,15 +79,15 @@ var md = mdeps({
3579 return ! ( target === 'nodejs' && nodeResolve . isCore ( id ) ) ;
3680 } ,
3781 detect : function ( src ) {
38- var deps = konan ( src ) ;
82+ let deps = getDeps ( src ) ;
3983
4084 return deps . strings ;
41- } ,
85+ }
4286} ) ;
4387
4488function getPackageJsonMainEntry ( pkgJson ) {
45- for ( var i = 0 ; i < mainFields . length ; i ++ ) {
46- var entry = mainFields [ i ] ;
89+ for ( let i = 0 ; i < mainFields . length ; i ++ ) {
90+ let entry = mainFields [ i ] ;
4791
4892 if ( pkgJson [ entry ] != null ) {
4993 return pkgJson [ entry ] ;
@@ -52,21 +96,21 @@ function getPackageJsonMainEntry(pkgJson) {
5296 return null ;
5397}
5498
55- var pkgJsons = [ ] ;
56- var deps_files = { } ;
99+ let pkgJsons = [ ] ;
100+ let deps_files = { } ;
57101
58102md . on ( 'package' , function ( pkg ) {
59103 // we don't want to include the package.json for users' projects
60104 if ( / n o d e _ m o d u l e s / . test ( pkg . __dirname ) ) {
61- var pkgJson = {
105+ let pkgJson = {
62106 file : path . join ( pkg . __dirname , 'package.json' ) ,
63107 } ;
64108
65109 if ( pkg . name != null ) {
66110 pkgJson . provides = [ pkg . name ] ;
67111 }
68112
69- var pkgJsonMainEntry = getPackageJsonMainEntry ( pkg ) ;
113+ let pkgJsonMainEntry = getPackageJsonMainEntry ( pkg ) ;
70114 if ( pkgJsonMainEntry != null ) {
71115 pkgJson . mainEntry = path . join ( pkg . __dirname , pkgJsonMainEntry ) ;
72116 }
@@ -75,62 +119,62 @@ md.on('package', function(pkg) {
75119 }
76120} ) ;
77121
78- md . on ( 'file' , function ( file ) {
79- deps_files [ file ] = { file : file } ;
122+ md . on ( 'file' , function ( file ) {
123+ deps_files [ file ] = { file : file } ;
80124} ) ;
81125
82- md . on ( 'end' , function ( ) {
83- for ( var i = 0 ; i < pkgJsons . length ; i ++ ) {
84- var pkgJson = pkgJsons [ i ] ;
126+ md . on ( 'end' , function ( ) {
127+ for ( let i = 0 ; i < pkgJsons . length ; i ++ ) {
128+ let pkgJson = pkgJsons [ i ] ;
85129
86- if ( deps_files [ pkgJson . mainEntry ] != null && pkgJson . provides != null ) {
87- deps_files [ pkgJson . mainEntry ] . provides = pkgJson . provides ;
88- }
130+ if ( deps_files [ pkgJson . mainEntry ] != null && pkgJson . provides != null ) {
131+ deps_files [ pkgJson . mainEntry ] . provides = pkgJson . provides ;
132+ }
89133
90- deps_files [ pkgJson . file ] = { file : pkgJson . file } ;
91- }
134+ deps_files [ pkgJson . file ] = { file : pkgJson . file } ;
135+ }
92136
93- var values = [ ] ;
94- for ( var key in deps_files ) {
95- var dep = deps_files [ key ] ;
96-
97- // add provides to files that are not `package.json`s
98- if (
99- ! / n o d e _ m o d u l e s [ / \\ ] ( @ [ ^ / \\ ] + ?[ / \\ ] ) ? [ ^ / \\ ] + ?[ / \\ ] p a c k a g e \. j s o n $ / . test (
100- dep . file
101- )
102- ) {
103- if ( dep . file . indexOf ( 'node_modules' ) !== - 1 ) {
104- var providedModule = dep . file
105- . substring ( dep . file . lastIndexOf ( 'node_modules' ) )
106- . replace ( / \\ / g, '/' )
107- . replace ( 'node_modules/' , '' ) ;
108-
109- dep . provides = dep . provides || [ ] ;
110- dep . provides . push (
111- providedModule ,
112- providedModule . replace ( / \. j s ( o n ) ? $ / , '' )
113- ) ;
114-
115- var indexReplaced = providedModule . replace ( / \/ i n d e x \. j s ( o n ) ? $ / , '' ) ;
137+ let values = [ ] ;
138+ for ( let key in deps_files ) {
139+ let dep = deps_files [ key ] ;
116140
141+ // add provides to files that are not `package.json`s
117142 if (
118- / \/ i n d e x \. j s ( o n ) ? $ / . test ( providedModule ) &&
119- dep . provides . indexOf ( indexReplaced ) === - 1
143+ ! / n o d e _ m o d u l e s [ / \\ ] ( @ [ ^ / \\ ] + ?[ / \\ ] ) ? [ ^ / \\ ] + ?[ / \\ ] p a c k a g e \. j s o n $ / . test (
144+ dep . file
145+ )
120146 ) {
121- dep . provides . push ( indexReplaced ) ;
147+ if ( dep . file . indexOf ( 'node_modules' ) !== - 1 ) {
148+ let providedModule = dep . file
149+ . substring ( dep . file . lastIndexOf ( 'node_modules' ) )
150+ . replace ( / \\ / g, '/' )
151+ . replace ( 'node_modules/' , '' ) ;
152+
153+ dep . provides = dep . provides || [ ] ;
154+ dep . provides . push (
155+ providedModule ,
156+ providedModule . replace ( / \. j s ( o n ) ? $ / , '' )
157+ ) ;
158+
159+ let indexReplaced = providedModule . replace ( / \/ i n d e x \. j s ( o n ) ? $ / , '' ) ;
160+
161+ if (
162+ / \/ i n d e x \. j s ( o n ) ? $ / . test ( providedModule ) &&
163+ dep . provides . indexOf ( indexReplaced ) === - 1
164+ ) {
165+ dep . provides . push ( indexReplaced ) ;
166+ }
167+ }
122168 }
123- }
124- }
125169
126- values . push ( dep ) ;
127- }
170+ values . push ( dep ) ;
171+ }
128172
129- process . stdout . write ( JSON . stringify ( values ) ) ;
173+ process . stdout . write ( JSON . stringify ( values ) ) ;
130174} ) ;
131175
132176md . end ( {
133- file : filename ,
177+ file : filename
134178} ) ;
135179
136180md . resume ( ) ;
0 commit comments