react / react-0.13.3 / examples / basic-commonjs / node_modules / reactify / node_modules / react-tools / node_modules / commoner / lib / relative.js
81159 viewsvar assert = require("assert");1var Q = require("q");2var path = require("path");3var util = require("./util");4var recast = require("recast");5var n = recast.types.namedTypes;67function Relativizer(reader) {8assert.ok(this instanceof Relativizer);9assert.ok(reader === null ||10reader instanceof require("./reader").ModuleReader);1112Object.defineProperties(this, {13reader: { value: reader }14});15}1617var Rp = Relativizer.prototype;1819exports.getProcessor = function(reader) {20var relativizer = new Relativizer(reader);21return function(id, input) {22return relativizer.processSourceP(id, input);23};24};2526Rp.processSourceP = function(id, input) {27var relativizer = this;28var output = typeof input === "string" ? {29".js": input30} : input;3132return Q(output[".js"]).then(function(source) {33var promises = [];34var ast = recast.parse(source);3536function fixRequireP(literal) {37promises.push(relativizer.relativizeP(38id, literal.value39).then(function(newValue) {40return literal.value = newValue;41}));42}4344recast.visit(ast, {45visitCallExpression: function(path) {46var args = path.value.arguments;47var callee = path.value.callee;4849if (n.Identifier.check(callee) &&50callee.name === "require" &&51args.length === 1) {52var arg = args[0];53if (n.Literal.check(arg) &&54typeof arg.value === "string") {55fixRequireP(arg);56}57}5859this.traverse(path);60}61});6263return Q.all(promises).then(function() {64output[".js"] = recast.print(ast).code;65return output;66});67});68};6970Rp.absolutizeP = function(moduleId, requiredId) {71requiredId = util.absolutize(moduleId, requiredId);7273if (this.reader)74return this.reader.getCanonicalIdP(requiredId);7576return Q(requiredId);77};7879Rp.relativizeP = function(moduleId, requiredId) {80return this.absolutizeP(81moduleId,82requiredId83).then(function(absoluteId) {84return util.relativize(moduleId, absoluteId);85});86};878889