From 3ec7b39fce11ed802008803f14e7927f13678ecc Mon Sep 17 00:00:00 2001 From: Niall O'Higgins Date: Wed, 1 Aug 2012 11:12:30 -0700 Subject: [PATCH] update comments add annotated source --- index.html | 170 +++++++++++++++++++++++++++++++++++++++++++++++++++++ main.js | 13 +++- 2 files changed, 181 insertions(+), 2 deletions(-) create mode 100644 index.html diff --git a/index.html b/index.html new file mode 100644 index 0000000..d832812 --- /dev/null +++ b/index.html @@ -0,0 +1,170 @@ + + + + + + + main.js + + + + +
+
+
+

main.js

+ +

Loader for Strider extension modules.

+
+ +var fs = require('fs'), + path = require('path'), + Step = require('step'); + +
+
+
+

Locate Strider Extensions

+ +

Under a specified path dir [by default, process.cwd()/node_modules] look
for directories containing file 'strider.json'. These are considered
Strider modules.

+ +

cb is a function of signature cb(err, extensions) where extensions is an
array of filesystems path on success and err is an error on failure.

+
+ +function findExtensions(dir, cb) { + +
+
+
+

XXX May not be sane default when installed globally

+
+ + var dir = dir || path.join(process.cwd(), "node_modules"); + + var filename = "strider.json"; + + var extensions = []; + + Step( + function() { + +
+
+
+

find top-level module dirs

+
+ + fs.readdir(dir, this); + }, + function(err, entries) { + if (err) { + throw err; + } + +
+
+
+

Stat extension files in parallel

+
+ + var group = this.group(); + entries.forEach(function(module) { + var p = path.join(dir, module, filename); + var cb = group(); + fs.stat(p, function(err, stat) { + cb(err, + {stat:stat, path:p}); + }); + }); + }, + function(err, results) { + results.forEach(function(r) { + if (!r.stat) { + return; + } + +
+
+
+

Ensure they are of type file not something else

+
+ + if (r.stat.isFile()) { + extensions.push(r.path); + } + }); + cb(err, extensions); + } + ); +} + +
+
+
+

Load a Strider extension

+ +

filename is a filesystem location to a strider.json file. Extension is
assumed to be contained in same directory as strider.json.

+ +

cb is a function of signature function(err, extension) where extension
is an extension object on success and err is an error on failure.

+ +

Note that this function does not initialize the extension.

+
+ +function loadExtension(filename, cb) { + Step( + function() { + fs.readFile(filename, this); + }, + function(err, data) { + if (err) { + return cb(err, null); + } + +
+
+
+

Parse extension JSON

+
+ + try { + var extensionConfig = JSON.parse(data); + } catch(e) { + return cb(e, null); + } + +
+
+
+

Build require'able path to extension sources

+
+ + var extension = { + webapp: require(filename.replace('strider.json', + extensionConfig.webapp)), + worker: require(filename.replace('strider.json', + extensionConfig.worker)), + }; + + cb(null, extension); + } + ); +} + +
+
+
+

Exported functions

+
+ +module.exports = { + findExtensions: findExtensions, + loadExtension: loadExtension +}; + +
+
+ + + + diff --git a/main.js b/main.js index 58807c1..3df40fa 100644 --- a/main.js +++ b/main.js @@ -19,6 +19,7 @@ var fs = require('fs'), // function findExtensions(dir, cb) { + // XXX May not be sane default when installed globally var dir = dir || path.join(process.cwd(), "node_modules"); var filename = "strider.json"; @@ -27,12 +28,14 @@ function findExtensions(dir, cb) { Step( function() { + // find top-level module dirs fs.readdir(dir, this); }, function(err, entries) { if (err) { throw err; } + // Stat extension files in parallel var group = this.group(); entries.forEach(function(module) { var p = path.join(dir, module, filename); @@ -48,6 +51,7 @@ function findExtensions(dir, cb) { if (!r.stat) { return; } + // Ensure they are of type file not something else if (r.stat.isFile()) { extensions.push(r.path); } @@ -77,14 +81,18 @@ function loadExtension(filename, cb) { if (err) { return cb(err, null); } + // Parse extension JSON try { var extensionConfig = JSON.parse(data); } catch(e) { return cb(e, null); } + // Build require'able path to extension sources var extension = { - webapp: require(filename.replace('strider.json', extensionConfig.webapp)), - worker: require(filename.replace('strider.json', extensionConfig.worker)), + webapp: require(filename.replace('strider.json', + extensionConfig.webapp)), + worker: require(filename.replace('strider.json', + extensionConfig.worker)), }; cb(null, extension); @@ -92,6 +100,7 @@ function loadExtension(filename, cb) { ); } +// Exported functions module.exports = { findExtensions: findExtensions, loadExtension: loadExtension