Skip to content

Instantly share code, notes, and snippets.

@thejh
Created April 6, 2011 13:27
Show Gist options
  • Save thejh/905634 to your computer and use it in GitHub Desktop.
Save thejh/905634 to your computer and use it in GitHub Desktop.
files = fs.readdirSync 'lib'
files = ({filename} for filename in files when filename.match(/\.js$/))
resultstring = """
var modules = {};
function require(name) {
return modules[name];
}
"""
wrap = (filename, code) ->
"""
(function () {
var module = { exports: {} };
var exports = module.exports;
(function(module, exports) {
#{code}
})(module, exports);
modules['#{filename}'] = module.exports;
})();
"""
allDependencies = {}
written = {}
writtenCount = 0
for file in files
{filename} = file
jscode = fs.readFileSync 'lib/'+filename, 'utf-8'
file.code = jscode
dependencies = []
jscode.replace /require\('\.\/([^']*)'\)/g, (fullmatch, required) ->
dependencies.push required = required + '.js'
console.log "#{filename} -> #{required}"
allDependencies[filename] = dependencies
allDependencies[filename].code = jscode
didntDoAnything = false
while writtenCount < files.length and not didntDoAnything
didntDoAnything = true
for filename, dependencies of allDependencies when not written[filename]?
canBeIncluded = do ->
for requiredFilename in dependencies when not written[requiredFilename]?
return false
true
if canBeIncluded
console.log "appending \"#{filename}\"..."
resultstring += '\n' + wrap filename, dependencies.code
written[filename] = true
writtenCount++
didntDoAnything = false
if didntDoAnything
console.log "error: can't browserify cyclic dependencies"
else
fs.writeFileSync 'browserified.js', resultstring
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment