Skip to content

Commit

Permalink
Call cyclical module entry points and fix cyclical module.parent
Browse files Browse the repository at this point in the history
  • Loading branch information
goto-bus-stop committed Feb 6, 2018
1 parent aeacbdd commit d483818
Show file tree
Hide file tree
Showing 7 changed files with 75 additions and 18 deletions.
10 changes: 9 additions & 1 deletion index.js
Original file line number Diff line number Diff line change
Expand Up @@ -206,7 +206,7 @@ function rewriteModule (row, i, rows) {
if (req.external) {
node.edit.update('require(' + JSON.stringify(req.id) + ')')
} else if (other && other[kIsCyclical]) {
node.edit.update(other[kExportsName] + '()')
node.edit.update(other[kExportsName] + '({})') // `module.parent` value = {}
} else if (other && other[kExportsName]) {
renameImport(row, node, other[kExportsName])
} else {
Expand Down Expand Up @@ -249,6 +249,14 @@ function flatten (rows, opts, stream) {
rows.forEach(rewriteModule)
moveCircularDependenciesToStart(rows)

// Initialize entry modules that are part of a dependency cycle.
for (var i = 0; i < rows.length; i++) {
if (rows[i].entry && rows[i][kIsCyclical]) {
outro += '\n' + rows[i][kExportsName] + '();'
}
}

// Expose modules on the global `require` function, or standalone as UMD
var exposesModules = false
for (var i = 0; i < rows.length; i++) {
if (rows[i].expose && !opts.standalone) {
Expand Down
4 changes: 2 additions & 2 deletions lib/createModuleFactory.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
*/
module.exports = function createModuleFactory (factory) {
var module
return function () {
return function (parent) {
if (!module) {
module = { exports: {} }
module = { exports: {}, parent: parent }
factory(module, module.exports)
}
return module.exports
Expand Down
10 changes: 5 additions & 5 deletions test/eager-cycles/expected.js
Original file line number Diff line number Diff line change
@@ -1,21 +1,21 @@
(function(){
var createModuleFactory = function createModuleFactory(factory) {
var module
return function () {
return function (parent) {
if (!module) {
module = { exports: {} }
module = { exports: {}, parent: parent }
factory(module, module.exports)
}
return module.exports
}
};
var _$a_1 = createModuleFactory(function (module, exports) {
exports.b = _$b_3
exports.c = _$c_4()
exports.c = _$c_4({})

});
var _$c_4 = createModuleFactory(function (module, exports) {
module.exports = 10 + _$a_1().b
module.exports = 10 + _$a_1({}).b

});
var _$b_3 = 10
Expand All @@ -27,7 +27,7 @@ var _$e_6 = 'world'
var _$app_2 = {};
console.log({
d: _$d_5,
a: _$a_1(),
a: _$a_1({}),
e: _$e_6
})

Expand Down
10 changes: 5 additions & 5 deletions test/lazy-cycles/expected.js
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
(function(){
var createModuleFactory = function createModuleFactory(factory) {
var module
return function () {
return function (parent) {
if (!module) {
module = { exports: {} }
module = { exports: {}, parent: parent }
factory(module, module.exports)
}
return module.exports
}
};
var _$a_1 = createModuleFactory(function (module, exports) {
var b = _$b_3()
var b = _$b_3({})
module.exports = function () {
return b()
}

});
var _$b_3 = createModuleFactory(function (module, exports) {
module.exports = function () {
return _$a_1().toString()
return _$a_1({}).toString()
}

});
var _$app_2 = {};
console.log(
_$a_1()()
_$a_1({})()
)

}());
8 changes: 8 additions & 0 deletions test/parent-cycle/app.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
exports.a = 1
exports.b = 2

require('./router')

if (!module.parent) {
console.log(exports.a + exports.b)
}
3 changes: 3 additions & 0 deletions test/parent-cycle/router.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
if (module.parent) {
require('./app').a = 3
}
48 changes: 43 additions & 5 deletions test/test.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,32 @@
var test = require('tape')
var assert = require('assert')
var vm = require('vm')
var fs = require('fs')
var path = require('path')
var browserify = require('browserify')
var concat = require('concat-stream')
var pack = require('../plugin')

var tests = fs.readdirSync(__dirname).filter(function (name) {
return fs.statSync(path.join(__dirname, name)).isDirectory() &&
fs.existsSync(path.join(__dirname, name, 'app.js'))
})
var tests = [
'bare-module',
'colliding-unused',
'comment',
'dedupe',
'destructure',
'dynamic-require',
'eager-cycles',
'exports-name',
'globals',
'input-source-map',
'lazy-cycles',
'module-parent',
'remove-decl',
'set-exports',
'shorthand',
'simplify',
'source-map',
'standalone',
'variable'
]

tests.forEach(function (name) {
test(name, function (t) {
Expand Down Expand Up @@ -44,3 +61,24 @@ function runTest (t, name) {
t.end()
}))
}

test('parent-cycle', function (t) {
t.plan(2)

var basedir = path.join(__dirname, 'parent-cycle')
var entry = path.join(basedir, 'app.js')
var actual = path.join(basedir, 'actual.js')

browserify(entry)
.plugin(pack)
.bundle(function (err, result) {
t.ifError(err)
fs.writeFileSync(actual, result)
vm.runInNewContext(result + '', {
console: { log: log }
})
function log (value) {
t.equal(value, 5)
}
})
})

0 comments on commit d483818

Please sign in to comment.