Skip to content

Instantly share code, notes, and snippets.

@darkoverlordofdata
Last active August 29, 2015 14:02
Show Gist options
  • Save darkoverlordofdata/7bbed23c770018ddb4c1 to your computer and use it in GitHub Desktop.
Save darkoverlordofdata/7bbed23c770018ddb4c1 to your computer and use it in GitHub Desktop.
Lightweight CommonJS module manager
#
# Lightweight CommonJS module manager
#
# The page still needs to load the modules explicitly and in the
# correct order. Modular creates only the Define/Require semantics.
#
#
# define 'module_name', (module) ->
# define 'module_name', (exports) ->
# define 'module_name', (require) ->
# define 'module_name', (require, module) ->
# define 'module_name', (require, exports) ->
# define 'module_name', (require, module, exports) ->
# define 'module_name', (require, exports, module) ->
#
do (scope = @) ->
modules = {}
#
# Define Module:
#
# @param name module name
# @param define definition callback
#
scope.define = (name, define) ->
modules[name] = module = {}
exports = {}
args = []
# parse the args
func = define.toString()
start = func.indexOf('(')+1
end = func.indexOf(')')
# dependency injection
for dependency in func.substr(start, end-start).split(/,\s+/)
switch dependency
when 'require' then args.push (name) -> modules[name]
when 'exports' then args.push exports
when 'module' then args.push module
else args.push modules[dependency]
# define the module
result = define.apply(null, args)
# decode the returned module/exports
if module.exports?
modules[name] = module.exports
else if Object.keys(exports).length
module = {}
for key, value of exports
module[key] = value
modules[name] = module
else modules[name] = result
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment