Skip to content

Commit

Permalink
Modules can be defined at runtime, and multiple bundles may live in t…
Browse files Browse the repository at this point in the history
…he same package
  • Loading branch information
sstephenson committed Feb 20, 2011
1 parent 7e24a97 commit 3c4f3e9
Show file tree
Hide file tree
Showing 5 changed files with 85 additions and 32 deletions.
9 changes: 5 additions & 4 deletions lib/stitch.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

44 changes: 25 additions & 19 deletions src/stitch.coffee
Expand Up @@ -19,11 +19,11 @@ catch err


exports.Package = class Package exports.Package = class Package
constructor: (config) -> constructor: (config) ->
@identifier = config.identifier or 'require' @identifier = config.identifier ? 'require'
@paths = config.paths or ['lib'] @paths = config.paths ? ['lib']
@compilers = _.extend {}, defaultCompilers, config.compilers @compilers = _.extend {}, defaultCompilers, config.compilers


@cache = config.cache or true @cache = config.cache ? true
@mtimeCache = {} @mtimeCache = {}
@compileCache = {} @compileCache = {}


Expand All @@ -32,23 +32,29 @@ exports.Package = class Package
return callback err if err return callback err if err


result = """ result = """
var #{@identifier} = (function(modules) { (function(/*! Stitch !*/) {
var exportCache = {}; if (!this.#{@identifier}) {
return function require(name) { var modules = {}, cache = {}, require;
var module = exportCache[name]; this.#{@identifier} = require = function(name) {
var fn; var module = cache[name], fn;
if (module) { if (module) {
return module; return module;
} else if (fn = modules[name] || fn = modules[name +"/index"]) { } else if ((fn = modules[name]) || (fn = modules[name + '/index'])) {
module = { id: name, exports: {} }; module = {id: name, exports: {}};
fn(module.exports, require, module); fn(module.exports, require, module);
exportCache[name] = module.exports; cache[name] = module.exports;
return module.exports; return module.exports;
} else { } else {
throw 'module \\'' + name + '\\' not found'; throw 'module \\'' + name + '\\' not found';
} }
};
require.define = function(bundle) {
for (var key in bundle)
modules[key] = bundle[key];
};
} }
})({ return this.#{@identifier}.define;
}).call(this)({
""" """


index = 0 index = 0
Expand Down
1 change: 1 addition & 0 deletions test/fixtures/additional/foo/bar.js
@@ -0,0 +1 @@
exports.filename = "additional/foo/bar.js";
1 change: 1 addition & 0 deletions test/fixtures/additional/hello.js
@@ -0,0 +1 @@
exports.hello = "hello";
62 changes: 53 additions & 9 deletions test/test_stitch.coffee
Expand Up @@ -5,6 +5,7 @@ stitch = require "stitch"
fixtureRoot = __dirname + "/fixtures" fixtureRoot = __dirname + "/fixtures"
fixtures = fixtureRoot + "/default" fixtures = fixtureRoot + "/default"
altFixtures = fixtureRoot + "/alternate" altFixtures = fixtureRoot + "/alternate"
addlFixtures = fixtureRoot + "/additional"
fixtureCount = 8 fixtureCount = 8


defaultOptions = defaultOptions =
Expand All @@ -13,8 +14,14 @@ defaultOptions =


defaultPackage = stitch.createPackage defaultOptions defaultPackage = stitch.createPackage defaultOptions


additionalOptions =
identifier: "testRequire"
paths: [addlFixtures]

additionalPackage = stitch.createPackage additionalOptions

alternateOptions = alternateOptions =
paths: [altFixtures] paths: [altFixtures]


alternatePackage = stitch.createPackage alternateOptions alternatePackage = stitch.createPackage alternateOptions


Expand Down Expand Up @@ -111,7 +118,7 @@ module.exports =
defaultPackage.compile (err, sources) -> defaultPackage.compile (err, sources) ->
test.ok !err test.ok !err
eval sources eval sources
test.ok typeof testRequire is "function" test.ok typeof @testRequire is "function"
test.done() test.done()


"compile module with custom exports": (test) -> "compile module with custom exports": (test) ->
Expand All @@ -120,7 +127,7 @@ module.exports =
defaultPackage.compile (err, sources) -> defaultPackage.compile (err, sources) ->
test.ok !err test.ok !err
eval sources eval sources
result = testRequire("custom_exports") result = @testRequire("custom_exports")
test.ok typeof result is "function" test.ok typeof result is "function"
test.same "foo", result() test.same "foo", result()
test.done() test.done()
Expand All @@ -131,7 +138,7 @@ module.exports =
defaultPackage.compile (err, sources) -> defaultPackage.compile (err, sources) ->
test.ok !err test.ok !err
eval sources eval sources
test.same "bar", testRequire("exported_property").foo test.same "bar", @testRequire("exported_property").foo
test.done() test.done()


"compile module with requires": (test) -> "compile module with requires": (test) ->
Expand All @@ -140,7 +147,7 @@ module.exports =
defaultPackage.compile (err, sources) -> defaultPackage.compile (err, sources) ->
test.ok !err test.ok !err
eval sources eval sources
module = testRequire("module") module = @testRequire("module")
test.same "bar", module.foo test.same "bar", module.foo
test.same "foo", module.bar() test.same "foo", module.bar()
test.same "biz", module.baz test.same "biz", module.baz
Expand All @@ -152,10 +159,10 @@ module.exports =
defaultPackage.compile (err, sources) -> defaultPackage.compile (err, sources) ->
test.ok !err test.ok !err
eval sources eval sources
module = testRequire("module") module = @testRequire("module")
test.ok !module.x test.ok !module.x
module.x = "foo" module.x = "foo"
test.same "foo", testRequire("module").x test.same "foo", @testRequire("module").x
test.done() test.done()


"look for module index if necessary": (test) -> "look for module index if necessary": (test) ->
Expand All @@ -164,6 +171,43 @@ module.exports =
defaultPackage.compile (err, sources) -> defaultPackage.compile (err, sources) ->
test.ok !err test.ok !err
eval sources eval sources
buz= testRequire("foo/buz").buz buz = @testRequire("foo/buz").buz
test.same buz, "BUZ" test.same buz, "BUZ"
test.done() test.done()

"modules can be defined at runtime": (test) ->
test.expect 3

defaultPackage.compile (err, sources) ->
test.ok !err
eval sources

raised = false
try
@testRequire("frob")
catch e
raised = true
test.ok raised

@testRequire.define
"frob": (exports, require, module) ->
exports.frob = require("foo/buz").buz

test.same "BUZ", @testRequire("frob").frob
test.done()

"multiple packages may share the same require namespace": (test) ->
test.expect 5

defaultPackage.compile (err, sources) ->
test.ok !err
eval sources

additionalPackage.compile (err, sources) =>
test.ok !err
eval sources

test.same "hello", @testRequire("hello").hello
test.same "additional/foo/bar.js", @testRequire("foo/bar").filename
test.same "biz", @testRequire("foo/bar/baz").baz;
test.done()

0 comments on commit 3c4f3e9

Please sign in to comment.