From 985fe733486c64c829e7d0d0f83cad528df9ca59 Mon Sep 17 00:00:00 2001 From: Eric Eastwood Date: Tue, 31 Jan 2017 12:50:14 -0600 Subject: [PATCH] Update to be more programmitic compatible --- bin/spectacle.js | 26 +++------------- index.js | 79 +++++++++++++++++++++++++++++++++++++----------- package.json | 1 + 3 files changed, 67 insertions(+), 39 deletions(-) diff --git a/bin/spectacle.js b/bin/spectacle.js index 406d989..62ba673 100755 --- a/bin/spectacle.js +++ b/bin/spectacle.js @@ -1,18 +1,10 @@ #!/usr/bin/env node var program = require('commander'), - tmp = require('tmp'), - fs = require('fs'), - os = require('os'), - path = require('path'), package = require('../package'), spectacle = require('../index.js'); -// Ensures temporary files are cleaned up on program close, even if errors are encountered. -tmp.setGracefulCleanup(); -var cwd = process.cwd(), - root = path.resolve(__dirname, '..'); // //= Process CLI input @@ -25,12 +17,12 @@ program.version(package.version) .option('-e, --embeddable', 'omit the HTML and generate the documentation content only (default: false)') .option('-d, --development-mode', 'start HTTP server with the file watcher and live reload (default: false)') .option('-s, --start-server', 'start the HTTP server without any development features') - .option('-p, --port ', 'the port number for the HTTP server to listen on (default: 4400)', Number, 4400) - .option('-t, --target-dir ', 'the target build directory (default: public)', String, path.resolve(cwd, 'public')) - .option('-f, --target-file ', 'the target build HTML file (default: index.html)', String, 'index.html') - .option('-a, --app-dir ', 'the application source directory (default: app)', String, path.resolve(root, 'app')) + .option('-p, --port ', 'the port number for the HTTP server to listen on (default: 4400)', Number) + .option('-t, --target-dir ', 'the target build directory (default: public)', String) + .option('-f, --target-file ', 'the target build HTML file (default: index.html)', String) + .option('-a, --app-dir ', 'the application source directory (default: app)', String) .option('-l, --logo-file ', 'specify a custom logo file (default: null)', String, null) - .option('-c, --config-file ', 'specify a custom configuration file (default: app/lib/config.js)', String, path.resolve(root, 'app/lib/config.js')) + .option('-c, --config-file ', 'specify a custom configuration file (default: app/lib/config.js)') // .option('-f, --spec-file ', 'the input OpenAPI/Swagger spec file (default: test/fixtures/petstore.json)', String, 'test/fixtures/petstore.json') .parse(process.argv); @@ -39,15 +31,7 @@ if (program.args.length < 1) { // && program.rawArgs.length < 1 program.help(); } -// Create a new temporary directory, and set some necessary defaults -program.cacheDir = tmp.dirSync({ unsafeCleanup: true, prefix: 'spectacle-' }).name; program.specFile = program.args[0]; // || path.resolve(root, 'test/fixtures/cheese.json'); -// Replace some absolute paths -if (program.specFile && program.specFile.indexOf('test/fixtures') === 0) - program.specFile = path.resolve(root, program.specFile); -if (program.logoFile && program.logoFile.indexOf('test/fixtures') === 0) - program.logoFile = path.resolve(root, program.logoFile); - // Run the main app with parsed options spectacle(program); diff --git a/index.js b/index.js index 8b5901d..bef16f7 100644 --- a/index.js +++ b/index.js @@ -6,32 +6,65 @@ var fs = require('fs'), path = require('path'), + Promise = require('bluebird'), + tmp = require('tmp'), grunt = require('grunt'), package = require('./package'), _ = require('lodash'); +// Ensures temporary files are cleaned up on program close, even if errors are encountered. +tmp.setGracefulCleanup(); + +var defaults = { + silent: false, + port: 4400, + targetDir: path.resolve(process.cwd(), 'public'), + targetFile: 'index.html', + appDir: path.resolve(__dirname, 'app'), + configFile: path.resolve(__dirname, 'app/lib/config.js'), + cacheDir: tmp.dirSync({ unsafeCleanup: true, prefix: 'spectacle-' }).name +}; +function resolveOptions(options) { + var opts = _.extend({}, defaults, options); + + // Replace some absolute paths + if (opts.specFile && opts.specFile.indexOf('test/fixtures') === 0) + opts.specFile = path.resolve(__dirname, opts.specFile); + if (opts.logoFile && opts.logoFile.indexOf('test/fixtures') === 0) + opts.logoFile = path.resolve(__dirname, opts.logoFile); + + return opts; +} + /** * Run Spectacle and configured tasks **/ module.exports = function (options) { + var opts = resolveOptions(options); // //= Load the specification and init configuration function loadData() { - var specPath = path.resolve(options.specFile); + var specPath = path.resolve(opts.specFile); delete require.cache[specPath]; - return require(path.resolve(options.appDir + '/lib/preprocessor'))( + return require(path.resolve(opts.appDir + '/lib/preprocessor'))( options, require(specPath)); } - var config = require(path.resolve(options.configFile))(grunt, options, loadData()); + var config = require(path.resolve(opts.configFile))(grunt, opts, loadData()); // //= Setup Grunt to do the heavy lifting grunt.initConfig(_.merge({ pkg: package }, config)); + if(opts.silent) { + grunt.log.writeln = function() {} + grunt.log.write = function() {} + grunt.log.header = function() {} + grunt.log.ok = function() {} + } var cwd = process.cwd(); // change CWD for loadNpmTasks global install var exists = grunt.file.exists(path.join(path.resolve('node_modules'), @@ -54,7 +87,7 @@ module.exports = function (options) { process.chdir(cwd); grunt.registerTask('predentation', 'Remove indentation from generated
 tags.', function() {
-        var html = fs.readFileSync(options.cacheDir + '/' + options.targetFile, 'utf8');
+        var html = fs.readFileSync(opts.cacheDir + '/' + opts.targetFile, 'utf8');
         html = html.replace(/([\s\S]*?)<\/code><\/pre>/gmi, function(x, y) {
             var lines = x.split('\n'), level = null;
             if (lines) {
@@ -74,7 +107,7 @@ module.exports = function (options) {
             }
             return lines.join('\n');
         });
-        fs.writeFileSync(options.cacheDir + '/' + options.targetFile, html);
+        fs.writeFileSync(opts.cacheDir + '/' + opts.targetFile, html);
     });
 
     grunt.registerTask('stylesheets', ['sass:scss', 'concat:css', 'cssmin']);
@@ -92,38 +125,48 @@ module.exports = function (options) {
     });
 
     // Report, etc when all tasks have completed.
-    grunt.task.options({
-        error: function(e) {
-            console.warn('Task error:', e);
-            // TODO: fail here or push on?
-        },
-        done: function() {
-            console.log('All tasks complete');
-        }
+    var donePromise = new Promise(function(resolve, reject) {
+      grunt.task.options({
+          error: function(e) {
+              if(!opts.silent) {
+                  console.warn('Task error:', e);
+              }
+              // TODO: fail here or push on?
+              reject(e);
+          },
+          done: function() {
+              if(!opts.silent) {
+                  console.log('All tasks complete');
+              }
+              resolve();
+          }
+      });
     });
 
 
     //
     //= Run the shiz
 
-    if (options.startServer) {
+    if (opts.startServer) {
         grunt.task.run('server');
     }
     else {
-        if (!options.disableCss) {
+        if (!opts.disableCss) {
             grunt.task.run(['foundation', 'stylesheets']);
         }
-        if (!options.disableJs) {
+        if (!opts.disableJs) {
             grunt.task.run('javascripts');
         }
-        if (options.logoFile) {
+        if (opts.logoFile) {
             grunt.task.run('copy:logo');
         }
         grunt.task.run('templates');
-        if (options.developmentMode) {
+        if (opts.developmentMode) {
             grunt.task.run('develop');
         }
     }
 
     grunt.task.start();
+
+    return donePromise;
 };
diff --git a/package.json b/package.json
index a91f7ee..c157313 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
   },
   "homepage": "https://sourcey.com/spectacle",
   "dependencies": {
+    "bluebird": "^3.4.7",
     "cheerio": "^0.19.0",
     "clarify": "^1.0.5",
     "commander": "*",