UNPKG

webvr-dom

Version:

A shim to support DOM rendering for VR devices

184 lines (147 loc) 4.25 kB
// # Build script using Node.js // // Single script build,used as a lightweight alternative // when a build platform (grunt/gulp wtc.) feels like overkill // // - Dependencies: NPM/Node.js // - Conventions: // * code is in a lib/ folder with a main.js as the main context (closure) // * a package.json on the root contains all the info about the lib: name, description, author, license // * compiled files are saved in a build folder // settings var FILE_ENCODING = 'utf-8', EOL = '\n'; // Dependencies var cli = require('commander'), uglify = require("uglify-js"), jshint = require('jshint'), handlebars = require('hbs'), fs = require('fs'), zlib = require('zlib'); // will generate a CSV if package info contains multiple licenses handlebars.registerHelper('license', function(items){ items = items.map(function(val){ return val.type; }); return items.join(', '); }); // Logic // - read module name from package file var package = JSON.parse( fs.readFileSync('package.json', FILE_ENCODING) ); // condition the existance of package.json or component.json... var name = package.name; // - list files in the lib folder //var src = libFiles(); // - concatinate all files var src = [ // main lib 'lib/options.js', 'lib/rasterize.js', 'lib/shaders.js', 'lib/utils.js', 'lib/vrdom.js' ]; // - get shaders var shaders = shaderFiles(); // - concatinate all files concat({ src: src, dest: 'build/'+ name +'.js' }); // - Validate js lint('build/'+ name +'.js', function(){ // - Create / save minified file minify('build/'+ name +'.js', 'build/'+ name +'-min.js'); }); // // Methods function concat(opts) { var fileList = opts.src; var distPath = opts.dest; var lib = fileList.map(function(filePath){ return fs.readFileSync(filePath, FILE_ENCODING); }); var wrapper = fs.readFileSync('lib/main.js', FILE_ENCODING); var template = handlebars.compile( wrapper ); //reuse package.json data and add build date var data = package; data.lib = lib.join(EOL); data.shaders = JSON.stringify( shaders ); data.build_date = (new Date()).toUTCString(); // Save uncompressed file fs.writeFileSync(distPath, template(data), FILE_ENCODING); console.log(' '+ distPath +' built.'); } function minify(srcPath, distPath) { /* var jsp = uglyfyJS.parser, pro = uglyfyJS.uglify, ast = jsp.parse( fs.readFileSync(srcPath, FILE_ENCODING) ); ast = pro.ast_mangle(ast); ast = pro.ast_squeeze(ast); */ var min = uglify.minify(srcPath, { compressor: { comments : /@name|@author|@cc_on|@url|@license/ } }); // disable gzip return fs.writeFileSync(distPath, min.code, FILE_ENCODING); // gzip zlib.gzip(min.code, function (error, result) { if (error) throw error; fs.writeFileSync(distPath, result, FILE_ENCODING); console.log(' '+ distPath +' built.'); }); } function lint(path, callback) { var buf = fs.readFileSync(path, 'utf-8'); // remove Byte Order Mark buf = buf.replace(/^\uFEFF/, ''); jshint.JSHINT(buf); var nErrors = jshint.JSHINT.errors.length; if (nErrors) { // ruff output of errors (for now) console.log(jshint.JSHINT.errors); console.log(' Found %j lint errors on %s, do you want to continue?', nErrors, path); cli.choose(['no', 'yes'], function(i){ if (i) { process.stdin.destroy(); if(callback) callback(); } else { process.exit(0); } }); } else if (callback) { callback(); } } function libFiles(){ var src = []; var files = fs.readdirSync( "lib/" ); // folter only javascript files for( var i in files ){ var file = files[i]; // exclude certain files and main.js if( file.substr(0, 1) == "." || file.substr(-3) !== ".js" || file == "main.js" ) continue; src.push( "lib/"+ file ); } return src; } function shaderFiles(){ var shaders = {}; var files = fs.readdirSync( "shaders/" ); // folter only javascript files for( var i in files ){ var file = files[i]; // exclude certain files and main.js if( file.substr(0, 1) == "." ) continue; shaders[file] = getShader( "shaders/"+ file ); } return shaders; } function getShader( file ){ // synchronous fetch var shader = fs.readFileSync(file, FILE_ENCODING); // remove carriage returns shader = shader.replace(/\n|\t|\r\n/g, " "); return shader; }