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 // batteries
// Copyright 2010 - 2011 Sami Samhuri <sami@samhuri.net> // Copyright 2010 - 2011 Sami Samhuri <sami@samhuri.net>
var ArrayExt = require('./array') var batteries = module.exports
, DateExt = require('./date') , exts = []
, FileExt = require('./file')
, MathExt = require('./math')
, ObjectExt = require('./object')
, StringExt = require('./string')
, Range = require('./range')
, repr = require('./repr').repr
; ;
module.exports = ext('array');
{ array: ArrayExt ext('date');
, date: DateExt ext('fs');
, fs: FileExt ext('math');
, math: MathExt ext('object');
, object: ObjectExt ext('range');
, string: StringExt ext('repr');
, Range: Range ext('string');
, repr: repr
, extendNative: function() { function ext(name) {
// Extend native types exts.push(name);
ArrayExt.extendNative(); defineLazyProperty(batteries, name, function() { return require('./' + name); });
DateExt.extendNative(); };
MathExt.extendNative();
// Extend Node function defineLazyProperty(obj, name, getter) {
FileExt.extendNative(require('fs')); Object.defineProperty(obj, name, {
configurable: true
, enumerable: true
global['Range'] = Range; // Call the getter and overwrite this property with one that returns
global['repr'] = repr; // that value directly.
, get: function() {
var val = getter();
Object.defineProperty(batteries, name, { value: val });
return val;
}
return module.exports; });
} }
, requireEverything: function() { // ES5 strict mode compatible
assert = require('assert'); function ensureContext(context) {
buffer = require('buffer'); return context || this || (1, eval)('this');
child_process = require('child_process'); }
crypto = require('crypto');
dgram = require('dgram'); // TODO figure out how to extend native types in the REPL
dns = require('dns'); batteries.extendNative = function(context) {
events = require('events'); context = ensureContext(context)
freelist = require('freelist'); exts.forEach(function(name) {
fs = require('fs'); var ext = batteries[name];
http = require('http'); if (typeof ext.extendNative === 'function') {
https = require('https'); ext.extendNative(context);
net = require('net'); }
os = require('os'); });
path = require('path');
querystring = require('querystring'); return batteries;
readline = require('readline');
repl = require('repl');
string_decoder = require('string_decoder');
util = require('util');
url = require('url');
return module.exports;
}
}; };