UNPKG

dreemgl

Version:

DreemGL is an open-source multi-screen prototyping framework for mediated environments, with a visual editor and shader styling for webGL and DALi runtimes written in JavaScript. As a toolkit for gpu-accelerated multiscreen development, DreemGL includes

159 lines (141 loc) 4.91 kB
/** * This compiles a client-side Flickr library * based on the flickr method information. * * run with `node compile` */ (function() { "use strict"; process.CLIENT_COMPILE = true; var habitat = require("habitat"), env = habitat.load(), flickrOptions = env.get("FLICKR"), APIBuilder = require("./src/flickr-api-object.js"), Utils = require("./src/utils.js"), filename = "flickrapi"; if(process.argv.indexOf("dev") > -1) { filename = "flickrapi.dev"; } var buffer = (function() { var data = ""; return { write: function(s) { data += s + "\n"; }, getData: function() { return data; } }; }()); var methods = {}; var setupMethods = function(node, name) { name = name || "flickr"; if(typeof node === "function" && node.data) { Object.keys(node.data).forEach(function(key){ if(!node.data[key] || node.data[key].length === 0) { delete node.data[key]; } }); methods[name] = node.data; } else { Object.keys(node).forEach(function(key) { setupMethods(node[key], name + "." + key); }); } }; var stripDev = function(methods) { Object.keys(methods).forEach(function(methodName) { var data = methods[methodName]; delete data.required; delete data.optional; delete data.errors; delete data.url; }); }; /** * Write out a (nested) object */ var writeTree = function(node, name, write, wrapped) { if(typeof node === "function") { if (wrapped) { write("Flickr.prototype"+name + " = (function(Utils) {"); write(" var method_name = \"flickr"+name+"\";"); write(" var security = " + JSON.stringify(node.security,null,2) + ";"); if(process.argv.indexOf("dev") > -1) { write(" var required = " + JSON.stringify(node.data.required,null,2) + ";"); write(" var optional = " + JSON.stringify(node.data.optional,null,2) + ";"); write(" var errors = " + JSON.stringify(node.data.errors,null,2) + ";"); write(" var fn = " + node.toString()); write(" fn.data = { required: required, optional: optional, errors: errors, name: method_name };"); write(" return fn;"); } else { write(" return " + node.toString()); } write("}(Utils));\n"); methods.push("flickr"+name); } else { write(name + " = " + node.toString() + ";"); } } else { Object.keys(node).forEach(function(key) { writeTree(node[key], name + "." + key, write, wrapped); }); } }; /** * Compile a client-side library based on the flickr-api-object code. */ new APIBuilder(flickrOptions, Utils, function(err, flickr) { if(err) { console.error(err); process.exit(1); } delete flickr.options; buffer.write("(function() {"); // library-specific Utils buffer.write(" var Utils = {};"); writeTree(require("./browser/Utils.js"), "Utils", buffer.write); buffer.write(" Utils.errors = " + JSON.stringify(Utils.getCallErrors(),false, 4) + ";"); // Flickr object definition buffer.write(" var Flickr = " + (function(flickrOptions) { this.bindOptions(flickrOptions); }).toString() + ";"); buffer.write(" Flickr.prototype = {};"); // Prototype from methods setupMethods(flickr); if (process.argv.indexOf("dev") === -1) { stripDev(methods); } buffer.write(" Flickr.methods = " + JSON.stringify(methods,false,1) + ";"); var fn = (function() { Object.keys(Flickr.methods).forEach(function(method) { var level = method.split(".").slice(1); var e = Flickr.prototype, key; while(level.length > 1) { key = level.splice(0,1)[0]; if(!e[key]) { e[key] = {}; } e = e[key]; } e[level] = Utils.generateAPIFunction(Flickr.methods[method]); }); }).toString(); if (process.argv.indexOf("dev") > -1) { fn = fn.replace("generateAPIFunction","generateAPIDevFunction"); } buffer.write("\n(" + fn + "());\n"); // option binding for individual instances buffer.write(" Flickr.prototype.bindOptions = " + (function(flickrOptions) { this.flickrOptions = flickrOptions; (function bindOptions(obj, props) { Object.keys(props).forEach(function(key) { if (key === "flickrOptions") return; if (typeof obj[key] === "object") { bindOptions(obj[key], props[key]); obj[key].flickrOptions = flickrOptions; } }); }(this, Flickr.prototype)); }).toString() + ";"); // end of library buffer.write("\n window.Flickr = Flickr;"); buffer.write("}());"); // write out the library to file var fs = require("fs"); filename = "./browser/"+filename+".js"; fs.writeFile(filename, buffer.getData(), function() { console.log("written "+filename); process.exit(0); }); }); }());