From 2e1460036c5349951da86c582006c7787c56c543 Mon Sep 17 00:00:00 2001 From: Tobias Koppers Date: Sat, 10 Mar 2012 13:11:23 +0100 Subject: [PATCH] Initial commit --- .gitignore | 4 + README.md | 217 ++++++++++++++++ bin/webpack.js | 93 +++++++ example/README.md | 126 +++++++++ example/build.js | 14 + example/example.js | 6 + example/node_modules/a.js | 1 + example/node_modules/b.js | 1 + example/node_modules/c.js | 1 + example/node_modules/d.js | 1 + lib/buildDeps.js | 201 +++++++++++++++ lib/parse.js | 242 ++++++++++++++++++ lib/resolve.js | 136 ++++++++++ lib/templateAsync.js | 36 +++ lib/templateSingle.js | 18 ++ lib/webpack.js | 168 ++++++++++++ lib/writeChunk.js | 28 ++ lib/writeSource.js | 46 ++++ package.json | 20 ++ require-polyfill.js | 10 + require-polyfill.web.js | 2 + test/browsertest/build.js | 28 ++ test/browsertest/lib/a.js | 1 + test/browsertest/lib/acircular.js | 4 + test/browsertest/lib/acircular2.js | 4 + test/browsertest/lib/b.js | 1 + test/browsertest/lib/circular.js | 2 + test/browsertest/lib/circular2.js | 2 + test/browsertest/lib/duplicate.js | 3 + test/browsertest/lib/duplicate2.js | 3 + test/browsertest/lib/index.js | 1 + test/browsertest/lib/index.web.js | 43 ++++ test/browsertest/lib/singluar.js | 1 + .../browsertest/node_modules/libary1/index.js | 13 + .../node_modules/libary1/lib/comp.js | 1 + .../node_modules/libary1/lib/component.js | 1 + .../libary1/node_modules/submodule1/index.js | 1 + .../libary1/node_modules/submodule2/index.js | 3 + .../node_modules/libary2/lib/extra.js | 1 + .../node_modules/libary2/lib/main.js | 21 ++ .../libary2/node_modules/submodule1/index.js | 1 + .../libary2/node_modules/submodule2/index.js | 3 + .../libary2/node_modules/submodule3/index.js | 3 + .../node_modules/libary2/package.json | 3 + .../node_modules/subcontent/index.js | 2 + .../node_modules/subcontent2/file.js | 1 + .../browsertest/node_modules/subfilemodule.js | 1 + .../node_modules/submodule3/index.js | 3 + test/browsertest/test.html | 29 +++ .../web_modules/subcontent/index.js | 2 + test/buildDeps_test.js | 79 ++++++ test/fixtures/a.js | 3 + test/fixtures/b.js | 3 + test/fixtures/c.js | 4 + test/fixtures/complex.js | 13 + test/fixtures/lib/complex1.js | 1 + test/fixtures/main1.js | 10 + test/fixtures/main2.js | 12 + test/fixtures/main3.js | 4 + test/fixtures/node_modules/complexm/step1.js | 1 + test/fixtures/node_modules/complexm/step2.js | 1 + .../node_modules/complexm/web_modules/m1/a.js | 1 + .../complexm/web_modules/m1/index.js | 1 + test/fixtures/node_modules/m1/a.js | 3 + test/fixtures/node_modules/m1/b.js | 3 + test/fixtures/node_modules/m2/b.js | 1 + test/resolve_test.js | 31 +++ 67 files changed, 1724 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 bin/webpack.js create mode 100644 example/README.md create mode 100644 example/build.js create mode 100644 example/example.js create mode 100644 example/node_modules/a.js create mode 100644 example/node_modules/b.js create mode 100644 example/node_modules/c.js create mode 100644 example/node_modules/d.js create mode 100644 lib/buildDeps.js create mode 100644 lib/parse.js create mode 100644 lib/resolve.js create mode 100644 lib/templateAsync.js create mode 100644 lib/templateSingle.js create mode 100644 lib/webpack.js create mode 100644 lib/writeChunk.js create mode 100644 lib/writeSource.js create mode 100644 package.json create mode 100644 require-polyfill.js create mode 100644 require-polyfill.web.js create mode 100644 test/browsertest/build.js create mode 100644 test/browsertest/lib/a.js create mode 100644 test/browsertest/lib/acircular.js create mode 100644 test/browsertest/lib/acircular2.js create mode 100644 test/browsertest/lib/b.js create mode 100644 test/browsertest/lib/circular.js create mode 100644 test/browsertest/lib/circular2.js create mode 100644 test/browsertest/lib/duplicate.js create mode 100644 test/browsertest/lib/duplicate2.js create mode 100644 test/browsertest/lib/index.js create mode 100644 test/browsertest/lib/index.web.js create mode 100644 test/browsertest/lib/singluar.js create mode 100644 test/browsertest/node_modules/libary1/index.js create mode 100644 test/browsertest/node_modules/libary1/lib/comp.js create mode 100644 test/browsertest/node_modules/libary1/lib/component.js create mode 100644 test/browsertest/node_modules/libary1/node_modules/submodule1/index.js create mode 100644 test/browsertest/node_modules/libary1/node_modules/submodule2/index.js create mode 100644 test/browsertest/node_modules/libary2/lib/extra.js create mode 100644 test/browsertest/node_modules/libary2/lib/main.js create mode 100644 test/browsertest/node_modules/libary2/node_modules/submodule1/index.js create mode 100644 test/browsertest/node_modules/libary2/node_modules/submodule2/index.js create mode 100644 test/browsertest/node_modules/libary2/node_modules/submodule3/index.js create mode 100644 test/browsertest/node_modules/libary2/package.json create mode 100644 test/browsertest/node_modules/subcontent/index.js create mode 100644 test/browsertest/node_modules/subcontent2/file.js create mode 100644 test/browsertest/node_modules/subfilemodule.js create mode 100644 test/browsertest/node_modules/submodule3/index.js create mode 100644 test/browsertest/test.html create mode 100644 test/browsertest/web_modules/subcontent/index.js create mode 100644 test/buildDeps_test.js create mode 100644 test/fixtures/a.js create mode 100644 test/fixtures/b.js create mode 100644 test/fixtures/c.js create mode 100644 test/fixtures/complex.js create mode 100644 test/fixtures/lib/complex1.js create mode 100644 test/fixtures/main1.js create mode 100644 test/fixtures/main2.js create mode 100644 test/fixtures/main3.js create mode 100644 test/fixtures/node_modules/complexm/step1.js create mode 100644 test/fixtures/node_modules/complexm/step2.js create mode 100644 test/fixtures/node_modules/complexm/web_modules/m1/a.js create mode 100644 test/fixtures/node_modules/complexm/web_modules/m1/index.js create mode 100644 test/fixtures/node_modules/m1/a.js create mode 100644 test/fixtures/node_modules/m1/b.js create mode 100644 test/fixtures/node_modules/m2/b.js create mode 100644 test/resolve_test.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..ac248cbee --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/node_modules +/test/js +/test/browsertest/js +/example/js \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 000000000..56d8a360c --- /dev/null +++ b/README.md @@ -0,0 +1,217 @@ +# modules-webpack + +## Goal + +As developer you want to reuse existing code. +As with node.js and web all file are already in the same language, but it is extra work to use your code with the node.js module system and the browser. +The goal of `webpack` is to bundle CommonJs modules into javascript files which can be loaded by ` + + + + + + + + + + \ No newline at end of file diff --git a/test/browsertest/web_modules/subcontent/index.js b/test/browsertest/web_modules/subcontent/index.js new file mode 100644 index 000000000..66cf6b586 --- /dev/null +++ b/test/browsertest/web_modules/subcontent/index.js @@ -0,0 +1,2 @@ +window.test(true, "This file should be loaded, because it is the replacement"); +module.exports = "replaced"; \ No newline at end of file diff --git a/test/buildDeps_test.js b/test/buildDeps_test.js new file mode 100644 index 000000000..502f43b94 --- /dev/null +++ b/test/buildDeps_test.js @@ -0,0 +1,79 @@ +var vows = require("vows"); +var assert = require("assert"); +var path = require("path"); +var buildDeps = require("../lib/buildDeps"); + +vows.describe("buildDeps").addBatch({ + "main1": { + topic: function() { + buildDeps(path.join(__dirname, "fixtures"), "./main1.js", this.callback); + }, + + "all modules loaded": function(depTree) { + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "main1.js")], null); + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")], null); + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "b.js")], null); + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "a.js")], null); + }, + + "one chunk": function(depTree) { + assert.deepEqual(Object.keys(depTree.chunks), ["0"]); + for(var i in depTree.modulesById) { + assert.deepEqual(depTree.modulesById[i].chunks, [0]); + } + } + }, + + "main2": { + topic: function() { + buildDeps(path.join(__dirname, "fixtures"), "./main2.js", {}, this.callback); + }, + + "all modules loaded": function(depTree) { + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "main2.js")], null); + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")], null); + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "b.js")], null); + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "a.js")], null); + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "b.js")], null); + }, + + "two chunks": function(depTree) { + assert.deepEqual(Object.keys(depTree.chunks), ["0", "1"]); + assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "main2.js")].chunks, [0]); + assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")].chunks, [0]); + assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "b.js")].chunks, [0]); + assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "a.js")].chunks, [1]); + assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "node_modules", "m1", "b.js")].chunks, [1]); + } + }, + + "main3": { + topic: function() { + buildDeps(path.join(__dirname, "fixtures"), "./main3.js", {}, this.callback); + }, + + "all modules loaded": function(depTree) { + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "main3.js")], null); + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")], null); + assert.notEqual(depTree.modules[path.join(__dirname, "fixtures", "c.js")], null); + }, + + "two chunks": function(depTree) { + assert.deepEqual(Object.keys(depTree.chunks), ["0", "1"]); + assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "main3.js")].chunks, [0]); + assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "a.js")].chunks, [0, 1]); + assert.deepEqual(depTree.modules[path.join(__dirname, "fixtures", "c.js")].chunks, [1]); + var main3id = ""+depTree.modules[path.join(__dirname, "fixtures", "main3.js")].id; + var aid = ""+depTree.modules[path.join(__dirname, "fixtures", "a.js")].id; + var cid = ""+depTree.modules[path.join(__dirname, "fixtures", "c.js")].id; + assert.deepEqual(Object.keys(depTree.chunks[0].modules), [main3id, aid]); + assert.deepEqual(Object.keys(depTree.chunks[1].modules), [cid, aid]); + assert.deepEqual(depTree.chunks[0].modules[main3id], "include"); + assert.deepEqual(depTree.chunks[0].modules[aid], "include"); + assert.deepEqual(depTree.chunks[1].modules[aid], "in-parent"); + assert.deepEqual(depTree.chunks[1].modules[cid], "include"); + } + + } + +}).export(module); \ No newline at end of file diff --git a/test/fixtures/a.js b/test/fixtures/a.js new file mode 100644 index 000000000..9e3aafb74 --- /dev/null +++ b/test/fixtures/a.js @@ -0,0 +1,3 @@ +module.exports = function a() { + return "This is a"; +}; \ No newline at end of file diff --git a/test/fixtures/b.js b/test/fixtures/b.js new file mode 100644 index 000000000..0900b0b45 --- /dev/null +++ b/test/fixtures/b.js @@ -0,0 +1,3 @@ +module.exports = function b() { + return "This is b"; +}; \ No newline at end of file diff --git a/test/fixtures/c.js b/test/fixtures/c.js new file mode 100644 index 000000000..e87b0d47d --- /dev/null +++ b/test/fixtures/c.js @@ -0,0 +1,4 @@ +module.exports = function b() { + require("./a"); + return "This is c"; +}; \ No newline at end of file diff --git a/test/fixtures/complex.js b/test/fixtures/complex.js new file mode 100644 index 000000000..c2017f719 --- /dev/null +++ b/test/fixtures/complex.js @@ -0,0 +1,13 @@ +var complex1 = require("./lib/complex1"); +require.ensure(["./lib/complex1", "complexm/step2"], function(require) { + require("./lib/complex1"); + var a = function() {} + require.ensure(["complexm/step1"], function(require) { + require("./lib/complex1"); + var s1 = require("complexm/step1"); + var s2 = require("complexm/step2"); + console.log(s1); + console.log(s2); + }); +}); +console.log(complex1); diff --git a/test/fixtures/lib/complex1.js b/test/fixtures/lib/complex1.js new file mode 100644 index 000000000..1f128fa2f --- /dev/null +++ b/test/fixtures/lib/complex1.js @@ -0,0 +1 @@ +module.exports = "lib complex1"; \ No newline at end of file diff --git a/test/fixtures/main1.js b/test/fixtures/main1.js new file mode 100644 index 000000000..0f88fa963 --- /dev/null +++ b/test/fixtures/main1.js @@ -0,0 +1,10 @@ +var a = require("./a"); +if(x) { + for(var i = 0; i < 100; i++) { + while(true) + require("./b"); + do { + i++; + } while(require("m1/a")()); + } +} \ No newline at end of file diff --git a/test/fixtures/main2.js b/test/fixtures/main2.js new file mode 100644 index 000000000..dbcaf9b4d --- /dev/null +++ b/test/fixtures/main2.js @@ -0,0 +1,12 @@ +var a = require("./a"); +with(x) { + switch(a) { + case 1: + require("./b"); + default: + require.ensure(["m1/a"], function() { + var a = require("m1/a"), + b = require("m1/b"); + }); + } +} \ No newline at end of file diff --git a/test/fixtures/main3.js b/test/fixtures/main3.js new file mode 100644 index 000000000..c2a398af0 --- /dev/null +++ b/test/fixtures/main3.js @@ -0,0 +1,4 @@ +var a = require("./a"); +require.ensure([], function(require) { + require("./c.js"); +}); \ No newline at end of file diff --git a/test/fixtures/node_modules/complexm/step1.js b/test/fixtures/node_modules/complexm/step1.js new file mode 100644 index 000000000..30dfd778c --- /dev/null +++ b/test/fixtures/node_modules/complexm/step1.js @@ -0,0 +1 @@ +module.exports = require("m1/a") + require("m1"); \ No newline at end of file diff --git a/test/fixtures/node_modules/complexm/step2.js b/test/fixtures/node_modules/complexm/step2.js new file mode 100644 index 000000000..10bad86c9 --- /dev/null +++ b/test/fixtures/node_modules/complexm/step2.js @@ -0,0 +1 @@ +module.exports = "Step2"; \ No newline at end of file diff --git a/test/fixtures/node_modules/complexm/web_modules/m1/a.js b/test/fixtures/node_modules/complexm/web_modules/m1/a.js new file mode 100644 index 000000000..16fd73e6b --- /dev/null +++ b/test/fixtures/node_modules/complexm/web_modules/m1/a.js @@ -0,0 +1 @@ +module.exports = "the correct a.js"; \ No newline at end of file diff --git a/test/fixtures/node_modules/complexm/web_modules/m1/index.js b/test/fixtures/node_modules/complexm/web_modules/m1/index.js new file mode 100644 index 000000000..ef32ecd0f --- /dev/null +++ b/test/fixtures/node_modules/complexm/web_modules/m1/index.js @@ -0,0 +1 @@ +module.exports = " :) " + require("m2/b.js"); \ No newline at end of file diff --git a/test/fixtures/node_modules/m1/a.js b/test/fixtures/node_modules/m1/a.js new file mode 100644 index 000000000..271f8a7ad --- /dev/null +++ b/test/fixtures/node_modules/m1/a.js @@ -0,0 +1,3 @@ +module.exports = function a() { + return "This is m1/a"; +}; \ No newline at end of file diff --git a/test/fixtures/node_modules/m1/b.js b/test/fixtures/node_modules/m1/b.js new file mode 100644 index 000000000..b603c4355 --- /dev/null +++ b/test/fixtures/node_modules/m1/b.js @@ -0,0 +1,3 @@ +module.exports = function a() { + return "This is m1/b"; +}; \ No newline at end of file diff --git a/test/fixtures/node_modules/m2/b.js b/test/fixtures/node_modules/m2/b.js new file mode 100644 index 000000000..34faaaf51 --- /dev/null +++ b/test/fixtures/node_modules/m2/b.js @@ -0,0 +1 @@ +module.exports = "This is m2/b"; diff --git a/test/resolve_test.js b/test/resolve_test.js new file mode 100644 index 000000000..49e887926 --- /dev/null +++ b/test/resolve_test.js @@ -0,0 +1,31 @@ +var vows = require("vows"); +var assert = require("assert"); +var path = require("path"); +var resolve = require("../lib/resolve"); + +var fixtures = path.join(__dirname, "fixtures"); +function testResolve(context, moduleName, result) { + return { + topic: function() { + resolve(context, moduleName, {}, this.callback); + }, + + "correct filename": function(filename) { + assert.equal(filename, result); + } + } +} +vows.describe("resolve").addBatch({ + + "resolve simple 1": testResolve(fixtures, "./main1.js", path.join(fixtures, "main1.js")), + "resolve simple 2": testResolve(fixtures, "./main1", path.join(fixtures, "main1.js")), + "resolve simple 3": testResolve(fixtures, "./a.js", path.join(fixtures, "a.js")), + "resolve simple 4": testResolve(fixtures, "./a", path.join(fixtures, "a.js")), + "resolve module 1": testResolve(fixtures, "m1/a.js", path.join(fixtures, "node_modules", "m1", "a.js")), + "resolve module 2": testResolve(fixtures, "m1/a", path.join(fixtures, "node_modules", "m1", "a.js")), + "resolve complex 1": testResolve(fixtures, "complexm/step1", path.join(fixtures, "node_modules", "complexm", "step1.js")), + "resolve complex 2": testResolve(path.join(fixtures, "node_modules", "complexm", "web_modules", "m1"), + "m2/b.js", path.join(fixtures, "node_modules", "m2", "b.js")), + + +}).export(module); \ No newline at end of file