Exemple #1
0
 ]).pipe(through.obj(function ( file, enc, callback ) {
   var self   = this,
       render = exprs_hbs.create();
   registerThemeHelper('foreach', foreach);
   return render.express3({
     "viewsDir":      path.build(),
     "partialsDir":   path.build('/partials'),
     "layoutDir":     path.build('/layouts'),
     "defaultLayout": path.build('/layouts/default.hbs'),
     "extName":       '.html'
   })(file.path, locals, function ( err, html ) {
     if (!!err) {
       throw new Error(err);
     }
     file.contents = new Buffer(html);
     self.push(file);
     return callback();
   });
 })).pipe(rename(function ( path ) {
Exemple #2
0
    }).then(function () {
        var adminHbs = hbs.create();

        // Initialize Internationalization
        i18n.init();

        // Output necessary notifications on init
        initNotifications();
        // ##Configuration

        // return the correct mime type for woff files
        express['static'].mime.define({'application/font-woff': ['woff']});

        // enabled gzip compression by default
        if (config.server.compress !== false) {
            blogApp.use(compress());
        }

        // ## View engine
        // set the view engine
        blogApp.set('view engine', 'hbs');

        // Create a hbs instance for admin and init view engine
        adminApp.set('view engine', 'hbs');
        adminApp.engine('hbs', adminHbs.express3({}));

        // Load helpers
        helpers.loadCoreHelpers(adminHbs);

        // ## Middleware and Routing
        middleware(blogApp, adminApp);

        // Log all theme errors and warnings
        _.each(config.paths.availableThemes._messages.errors, function (error) {
            errors.logError(error.message, error.context, error.help);
        });

        _.each(config.paths.availableThemes._messages.warns, function (warn) {
            errors.logWarn(warn.message, warn.context, warn.help);
        });

        return new GhostServer(blogApp);
    });
Exemple #3
0
    }).then(function () {
        var adminHbs = hbs.create();

        // ##Configuration

        // return the correct mime type for woff files
        express.static.mime.define({'application/font-woff': ['woff']});

        // enabled gzip compression by default
        if (config.server.compress !== false) {
            blogApp.use(compress());
        }

        // ## View engine
        // set the view engine
        blogApp.set('view engine', 'hbs');

        // Create a hbs instance for admin and init view engine
        adminApp.set('view engine', 'hbs');
        adminApp.engine('hbs', adminHbs.express3({}));

        // Load helpers
        helpers.loadCoreHelpers(adminHbs);

        // ## Middleware and Routing
        middleware(blogApp, adminApp);

        // Log all theme errors and warnings
        validateThemes(config.paths.themePath)
            .catch(function (result) {
                // TODO: change `result` to something better
                result.errors.forEach(function (err) {
                    errors.logError(err.message, err.context, err.help);
                });

                result.warnings.forEach(function (warn) {
                    errors.logWarn(warn.message, warn.context, warn.help);
                });
            });

        return new GhostServer(blogApp);
    });
    beforeEach(function (done) {
        var adminHbs = hbs.create();
        helpers = rewire('../../server/helpers');
        sandbox = sinon.sandbox.create();
        apiStub = sandbox.stub(api.settings, 'read', function (arg) {
            return when({value: 'casper'});
        });

        config = helpers.__get__('config');
        configStub = sandbox.stub().returns({
            'paths': {
                'subdir': '',
                'availableThemes': {
                    'casper': {
                        'assets': null,
                        'default.hbs': '/content/themes/casper/default.hbs',
                        'index.hbs': '/content/themes/casper/index.hbs',
                        'page.hbs': '/content/themes/casper/page.hbs',
                        'page-about.hbs': '/content/themes/casper/page-about.hbs',
                        'post.hbs': '/content/themes/casper/post.hbs'
                    }
                }
            }
        });
        _.extend(configStub, config);
        configStub.theme = sandbox.stub().returns({
            title: 'Ghost',
            description: 'Just a blogging platform.',
            url: 'http://testurl.com'
        });
        helpers.__set__('config', configStub);

        helpers.loadCoreHelpers(adminHbs);
        // Load template helpers in handlebars
        hbs.express3({ partialsDir: [config().paths.helperTemplates] });
        hbs.cachePartials(function () {
            done();
        });
    });
    beforeEach(function (done) {
        var adminHbs = hbs.create();
        sandbox = sinon.sandbox.create();
        apiStub = sandbox.stub(api.settings, 'read', function () {
            return when({value: 'casper'});
        });

        config.theme = sandbox.stub(config, 'theme', function () {
            return {
                title: 'Ghost',
                description: 'Just a blogging platform.',
                url: 'http://testurl.com'
            };
        });

        helpers.loadCoreHelpers(adminHbs);
        // Load template helpers in handlebars
        hbs.express3({ partialsDir: [config.paths().helperTemplates] });
        hbs.cachePartials(function () {
            done();
        });
    });
Exemple #6
0
var hbs = require('express-hbs'),
    config = require('../config'),
    instance = hbs.create();

// @TODO think about a config option for this e.g. theme.devmode?
if (config.get('env') !== 'production') {
    instance.handlebars.logger.level = 0;
}

instance.escapeExpression = instance.handlebars.Utils.escapeExpression;

instance.configure = function configure(partialsPath) {
    var hbsOptions = {
        partialsDir: [config.get('paths').helperTemplates],
        onCompile: function onCompile(exhbs, source) {
            return exhbs.handlebars.compile(source, {preventIndent: true});
        }
    };

    if (partialsPath) {
        hbsOptions.partialsDir.push(partialsPath);
    }

    return instance.express4(hbsOptions);
};

module.exports = instance;
Exemple #7
0
    }).then(function () {
        var adminHbs = hbs.create(),
            deferred = when.defer();

        // Output necessary notifications on init
        initNotifications();
        // ##Configuration

        // return the correct mime type for woff filess
        express['static'].mime.define({'application/font-woff': ['woff']});

        // enabled gzip compression by default
        if (config().server.compress !== false) {
            server.use(compress());
        }

        // add Ghost x-powered-by header
        server.use(function (req, res, next) {
            res.header('X-Powered-By', 'Ghost');
            next();
        });

        // ## View engine
        // set the view engine
        server.set('view engine', 'hbs');

        // Create a hbs instance for admin and init view engine
        server.set('admin view engine', adminHbs.express3({partialsDir: config().paths.adminViews + 'partials'}));

        // Load helpers
        helpers.loadCoreHelpers(adminHbs, assetHash);

        // ## Middleware and Routing
        middleware(server, dbHash);

        // Log all theme errors and warnings
        _.each(config().paths.availableThemes._messages.errors, function (error) {
            errors.logError(error.message, error.context, error.help);
        });

        _.each(config().paths.availableThemes._messages.warns, function (warn) {
            errors.logWarn(warn.message, warn.context, warn.help);
        });

        // ## Start Ghost App
        if (config.getSocket()) {
            // Make sure the socket is gone before trying to create another
            try {
                fs.unlinkSync(config.getSocket());
            } catch (e) {
                // We can ignore this.
            }

            httpServer = server.listen(
                config.getSocket()
            );
            fs.chmod(config.getSocket(), '0660');

        } else {
            httpServer = server.listen(
                config().server.port,
                config().server.host
            );
        }

        httpServer.on('listening', function () {
            ghostStartMessages();
            deferred.resolve(httpServer);
        });


        return deferred.promise;
    });
Exemple #8
0
const express = require('express');
const debug = require('ghost-ignition').debug('app');
const hbs = require('express-hbs');
const multer = require('multer');
const server = require('ghost-ignition').server;
const errors = require('ghost-ignition').errors;
const gscan = require('../lib');
const fs = require('fs-extra');
const logRequest = require('./middlewares/log-request');
const uploadValidation = require('./middlewares/upload-validation');
const ghostVer = require('./ghost-version');
const pkgJson = require('../package.json');
const ghostVersions = require('../lib/utils').versions;
const upload = multer({dest: __dirname + '/uploads/'});
const app = express();
const scanHbs = hbs.create();

// Configure express
app.set('x-powered-by', false);
app.set('query parser', false);

app.engine('hbs', scanHbs.express4({
    partialsDir: __dirname + '/tpl/partials',
    layoutsDir: __dirname + '/tpl/layouts',
    defaultLayout: __dirname + '/tpl/layouts/default',
    templateOptions: {data: {version: pkgJson.version}}
}));

app.set('view engine', 'hbs');
app.set('views', __dirname + '/tpl');
Exemple #9
0
    }).then(function () {
        var adminHbs = hbs.create();

        // ##Configuration
        server.set('version hash', assetHash);

        // return the correct mime type for woff filess
        express['static'].mime.define({'application/font-woff': ['woff']});

        // ## View engine
        // set the view engine
        server.set('view engine', 'hbs');

        // Create a hbs instance for admin and init view engine
        server.set('admin view engine', adminHbs.express3({partialsDir: config.paths().adminViews + 'partials'}));

        // Load helpers
        helpers.loadCoreHelpers(adminHbs, assetHash);

        // ## Middleware
        middleware(server, dbHash);

        // ## Routing

        // Set up API routes
        routes.api(server);

        // Set up Admin routes
        routes.admin(server);

        // Set up Frontend routes
        routes.frontend(server);

        // Are we using sockets? Custom socket or the default?
        function getSocket() {
            if (config().server.hasOwnProperty('socket')) {
                return _.isString(config().server.socket) ? config().server.socket : path.join(config.path().contentPath, process.env.NODE_ENV + '.socket');
            }
            return false;
        }

        function startGhost() {
            // Tell users if their node version is not supported, and exit
            if (!semver.satisfies(process.versions.node, packageInfo.engines.node)) {
                console.log(
                    "\nERROR: Unsupported version of Node".red,
                    "\nGhost needs Node version".red,
                    packageInfo.engines.node.yellow,
                    "you are using version".red,
                    process.versions.node.yellow,
                    "\nPlease go to http://nodejs.org to get a supported version".green
                );

                process.exit(0);
            }

            // Startup & Shutdown messages
            if (process.env.NODE_ENV === 'production') {
                console.log(
                    "Ghost is running...".green,
                    "\nYour blog is now available on",
                    config().url,
                    "\nCtrl+C to shut down".grey
                );

                // ensure that Ghost exits correctly on Ctrl+C
                process.on('SIGINT', function () {
                    console.log(
                        "\nGhost has shut down".red,
                        "\nYour blog is now offline"
                    );
                    process.exit(0);
                });
            } else {
                console.log(
                    ("Ghost is running in " + process.env.NODE_ENV + "...").green,
                    "\nListening on",
                    getSocket() || config().server.host + ':' + config().server.port,
                    "\nUrl configured as:",
                    config().url,
                    "\nCtrl+C to shut down".grey
                );
                // ensure that Ghost exits correctly on Ctrl+C
                process.on('SIGINT', function () {
                    console.log(
                        "\nGhost has shutdown".red,
                        "\nGhost was running for",
                        Math.round(process.uptime()),
                        "seconds"
                    );
                    process.exit(0);
                });
            }

        }

        // Initialize apps then start the server
        apps.init().then(function () {

            // ## Start Ghost App
            if (getSocket()) {
                // Make sure the socket is gone before trying to create another
                fs.unlink(getSocket(), function (err) {
                    /*jslint unparam:true*/
                    server.listen(
                        getSocket(),
                        startGhost
                    );
                    fs.chmod(getSocket(), '0660');
                });

            } else {
                server.listen(
                    config().server.port,
                    config().server.host,
                    startGhost
                );
            }

        });
    }, function (err) {
_private.createHbsEngine = function createHbsEngine() {
    var engine = hbs.create();
    engine.registerHelper('asset', require('../../helpers/asset'));

    return engine.express4();
};
checkTemplatesCompile = function checkTemplatesCompile(theme, options) {
    const localHbs = hbs.create();
    const failures = [];
    const checkVersion = _.get(options, 'checkVersion', 'latest');
    const ruleSet = spec.get([checkVersion]);
    
    let missingHelper;

    // CASE: 001-deprecations checks only needs `rules` that start with `GS001-DEPR-` 
    const ruleRegex = /GS005-.*/g;

    const rulesToCheck = _.pickBy(ruleSet.rules, function (rule, ruleCode) {
        if (ruleCode.match(ruleRegex)) {
            return rule;
        }
    });

    _.each(theme.partials, function (partial) {
        // ensures partials work when running gscan on windows
        let partialName = partial.split('\\').join('/');
        let partialContent = _.find(theme.files, {file: 'partials/' + partial + '.hbs'});
        let partialContentWindows = _.find(theme.files, {file: 'partials\\' + partial + '.hbs'});
        partialContent = partialContent ? partialContent.content : partialContentWindows.content;

        localHbs.registerPartial(partialName, partialContent);
    });

    _.each(rulesToCheck, function (check, ruleCode) {
        _.each(ruleSet.knownHelpers, function (helper) {
            // Use standard handlebars {{each}} method for simplicity
            if (helper === 'foreach') {
                localHbs.handlebars.registerHelper('foreach', hbs.handlebars.helpers.each);
            } else {
                localHbs.handlebars.registerHelper(helper, _.noop);
            }
        });
    
        _.each(theme.files, function (themeFile) {
            let templateTest = themeFile.file.match(/^[^/]+.hbs$/);
            let compiled;
    
            // If this is a main template, test compiling it properly
            if (templateTest) {
                try {
                    // When we read the theme, we precompile, here we compile with registered partials and helpers
                    // Which will let us detect any missing partials, helpers or parse errors
                    compiled = localHbs.handlebars.compile(themeFile.content, {
                        knownHelpers: _.zipObject(ruleSet.knownHelpers, _.map(ruleSet.knownHelpers, function () {
                            return true;
                        })),
                        knownHelpersOnly: true
                    });
    
                    // NOTE: fakeData does not resolve finding unknown helpers in context objects!
                    compiled(fakeData(themeFile));
                } catch (error) {
                    // CASE: transform ugly error message from hbs to the known error message: Missing helper: "X"
                    if (error.message.match(/you specified knownhelpersOnly/gi)) {
                        try {
                            missingHelper = error.message.match(/but\sused\sthe\sunknown\shelper\s(.*)\s-/)[1];
                        } catch (err) {
                            missingHelper = 'unknown helper name';
                        }
    
                        error.message = 'Missing helper: "' + missingHelper + '"';
                    }
    
                    failures.push({
                        ref: themeFile.file,
                        message: error.message
                    });
                }
            }
        });
    
        if (failures.length > 0) {
            theme.results.fail[ruleCode] = {failures: failures};
        } else {
            theme.results.pass.push(ruleCode);
        }
    });

    return theme;
};
Exemple #12
0
    }).then(function () {
        var adminHbs = hbs.create(),
            deferred = when.defer();

        // ##Configuration

        // return the correct mime type for woff filess
        express['static'].mime.define({'application/font-woff': ['woff']});

        // ## View engine
        // set the view engine
        server.set('view engine', 'hbs');

        // Create a hbs instance for admin and init view engine
        server.set('admin view engine', adminHbs.express3({partialsDir: config().paths.adminViews + 'partials'}));

        // Load helpers
        helpers.loadCoreHelpers(adminHbs, assetHash);

        // ## Middleware
        middleware(server, dbHash);

        // ## Routing

        // Set up API routes
        routes.api(server);

        // Set up Admin routes
        routes.admin(server);

        // Set up Frontend routes
        routes.frontend(server);

        // Log all theme errors and warnings
        _.each(config().paths.availableThemes._messages.errors, function (error) {
            errors.logError(error.message, error.context);
        });

        _.each(config().paths.availableThemes._messages.warns, function (warn) {
            errors.logWarn(warn.message, warn.context);
        });

        // ## Start Ghost App
        if (config.getSocket()) {
            // Make sure the socket is gone before trying to create another
            fs.unlink(config.getSocket(), function (err) {
                /*jshint unused:false*/
                server.listen(
                    config.getSocket(),
                    startGhost(deferred)
                );
                fs.chmod(config.getSocket(), '0660');
            });

        } else {
            server.listen(
                config().server.port,
                config().server.host,
                startGhost(deferred)
            );
        }

        return deferred.promise;
    });
Exemple #13
0
var express = require('express');

var routes = require('./routes');
var user = require('./routes/user');
var http = require('http');
var path = require('path');
var stylus = require('stylus');
var hbs = require('express-hbs');
var helpers = require('./helpers');

//var routes = require('./routes');
//var user = require('./routes/user');


var app = express();
var curhbs = hbs.create();
// all environments
var por = process.env.PORT;
app.set('port', 1600);
app.engine('hbs', curhbs.express3({
    partialsDir: __dirname + '/views/partials'
}));
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');

//Register helpers
helpers(curhbs);

// Middlewares
app.use(express.favicon());
app.use(express.logger('dev'));