Skip to content

Commit 56a880c

Browse files
committed
fold konan logic into module_deps.js for now, can now handle
`export ... from 'AAA'`. As noted by Antonió, `export default from 'AAA'` probably doesn't work.
1 parent 6130143 commit 56a880c

File tree

1 file changed

+108
-64
lines changed

1 file changed

+108
-64
lines changed

src/main/cljs/cljs/module_deps.js

+108-64
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,60 @@
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(require|import)\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

4488
function 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

58102
md.on('package', function(pkg) {
59103
// we don't want to include the package.json for users' projects
60104
if (/node_modules/.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-
!/node_modules[/\\](@[^/\\]+?[/\\])?[^/\\]+?[/\\]package\.json$/.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(/\.js(on)?$/, '')
113-
);
114-
115-
var indexReplaced = providedModule.replace(/\/index\.js(on)?$/, '');
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-
/\/index\.js(on)?$/.test(providedModule) &&
119-
dep.provides.indexOf(indexReplaced) === -1
143+
!/node_modules[/\\](@[^/\\]+?[/\\])?[^/\\]+?[/\\]package\.json$/.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(/\.js(on)?$/, '')
157+
);
158+
159+
let indexReplaced = providedModule.replace(/\/index\.js(on)?$/, '');
160+
161+
if (
162+
/\/index\.js(on)?$/.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

132176
md.end({
133-
file: filename,
177+
file: filename
134178
});
135179

136180
md.resume();

0 commit comments

Comments
 (0)