load extensions lazily thanks to @indexzero, closes #2

This commit is contained in:
Sami Samhuri 2011-06-05 18:12:27 -07:00
parent b7ba7b5dc0
commit 6a12ca076a

View file

@ -1,64 +1,56 @@
// batteries
// Copyright 2010 - 2011 Sami Samhuri <sami@samhuri.net>
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;
}
};