From 6a12ca076ae0e9744c74647f2d18e9cc1da8d942 Mon Sep 17 00:00:00 2001 From: Sami Samhuri Date: Sun, 5 Jun 2011 18:12:27 -0700 Subject: [PATCH] load extensions lazily thanks to @indexzero, closes #2 --- lib/index.js | 94 ++++++++++++++++++++++++---------------------------- 1 file changed, 43 insertions(+), 51 deletions(-) diff --git a/lib/index.js b/lib/index.js index 5d1ebcd..dacbb52 100644 --- a/lib/index.js +++ b/lib/index.js @@ -1,64 +1,56 @@ // batteries // Copyright 2010 - 2011 Sami Samhuri -var ArrayExt = require('./array') - , DateExt = require('./date') - , FileExt = require('./file') - , MathExt = require('./math') - , ObjectExt = require('./object') - , StringExt = require('./string') - , Range = require('./range') - , repr = require('./repr').repr +var batteries = module.exports + , exts = [] ; -module.exports = -{ array: ArrayExt -, date: DateExt -, fs: FileExt -, math: MathExt -, object: ObjectExt -, string: StringExt -, Range: Range -, repr: repr +ext('array'); +ext('date'); +ext('fs'); +ext('math'); +ext('object'); +ext('range'); +ext('repr'); +ext('string'); -, extendNative: function() { - // Extend native types - ArrayExt.extendNative(); - DateExt.extendNative(); - MathExt.extendNative(); +function ext(name) { + exts.push(name); + defineLazyProperty(batteries, name, function() { return require('./' + name); }); +}; - // Extend Node - FileExt.extendNative(require('fs')); +function defineLazyProperty(obj, name, getter) { + Object.defineProperty(obj, name, { + configurable: true + , enumerable: true - global['Range'] = Range; - global['repr'] = repr; + // Call the getter and overwrite this property with one that returns + // that value directly. + , get: function() { + var val = getter(); + Object.defineProperty(batteries, name, { value: val }); + return val; + } - return module.exports; - } + }); +} -, requireEverything: function() { - assert = require('assert'); - buffer = require('buffer'); - child_process = require('child_process'); - crypto = require('crypto'); - dgram = require('dgram'); - dns = require('dns'); - events = require('events'); - freelist = require('freelist'); - fs = require('fs'); - http = require('http'); - https = require('https'); - net = require('net'); - os = require('os'); - path = require('path'); - querystring = require('querystring'); - readline = require('readline'); - repl = require('repl'); - string_decoder = require('string_decoder'); - util = require('util'); - url = require('url'); +// ES5 strict mode compatible +function ensureContext(context) { + return context || this || (1, eval)('this'); +} + +// TODO figure out how to extend native types in the REPL +batteries.extendNative = function(context) { + context = ensureContext(context) + exts.forEach(function(name) { + var ext = batteries[name]; + if (typeof ext.extendNative === 'function') { + ext.extendNative(context); + } + }); + + return batteries; - return module.exports; - } };