Gottwik/Enduro

View on GitHub
libs/build_tools/pagelist_generator.js

Summary

Maintainability
C
1 day
Test Coverage
// * ———————————————————————————————————————————————————————— * //
// *     pagelist generator
// *    goes through all the pages and generates a json from them
// *
// *    pagelist json is saved and get_cms_list() will quickly retrieve it without
// *    generation it again
// *
// *    pagelist generator will generate two lists - a structured and flat list
// * ———————————————————————————————————————————————————————— * //
const pagelist_generator = function () {}

// * vendor dependencies
const Promise = require('bluebird')
const fs = require('fs-extra')
const glob = require('glob')
const extend = require('extend')
const path = require('path')

// * enduro dependencies
const flat_helpers = require(enduro.enduro_path + '/libs/flat_db/flat_helpers')
const format_service = require(enduro.enduro_path + '/libs/services/format_service')

// * ———————————————————————————————————————————————————————— * //
// *     init
// *
// *     registers generating and saving the pagelist to gulp
// *    additionaly it will expand the global data with the pagelist
// *    @param {object} gulp - gulp to register the task into
// *    @return {} - will call an empty callback
// * ———————————————————————————————————————————————————————— * //
pagelist_generator.prototype.init = function (gulp) {
    const self = this

    const pagelist_generator_task_name = 'pagelist_generator'

    // adds task to gulp
    gulp.task(pagelist_generator_task_name, function (cb) {

        // generates cmslist
        self.generate_cms_list()
            .then((cmslist) => {

                // Extends global data with currently loaded data
                extend(true, enduro.cms_data.global, {cmslist: cmslist})

                return self.save_cms_list(cmslist)
            })
            .then(() => {
                cb()
            })
    })

    // returns name of the task so it can be stored and called comfortably
    return pagelist_generator_task_name
}

// * ———————————————————————————————————————————————————————— * //
// *     generate cms list
// *
// *     generates list of pages with global datasets and generators
// *    @return {promise} - promise with cmslist
// * ———————————————————————————————————————————————————————— * //
pagelist_generator.prototype.generate_cms_list = function () {
    return new Promise(function (resolve, reject) {
        glob(enduro.project_path + '/cms/**/*.js', function (err, files) {
            if (err) { console.log('failed to generate cms list', err) }

            let pagelist = {}
            let flat_pagelist = []

            // helper function to build the pagelist
            function build (pagepath, partial_pages, fullpath) {

                // decides if pagepath is folder or file
                if (pagepath.length == 1) {

                    let page = {}
                    page.page = true
                    page.fullpath = '/' + fullpath.join('/')
                    page.name = format_service.prettify_string(pagepath[0])
                    page.page_slug = pagepath[0].toString()


                    // mark generator template as hidden
                    if (fullpath[0] == 'generators' && fullpath.length >= 2 && fullpath[fullpath.length - 2] == fullpath[fullpath.length - 1]) {
                        page.hidden = true
                    }

                    partial_pages[pagepath[0]] = page
                    flat_pagelist.push(page)
                } else {

                    // remove templates from pagelist
                    if (pagepath[0] == 'templates') {
                        return
                    }

                    let folder = {}
                    folder.folder = true
                    folder.fullpath = '/' + fullpath.join('/')
                    folder.name = format_service.prettify_string(pagepath[0])
                    folder.folder_slug = pagepath[0].toString()

                    if (fullpath[0] == 'generators' && pagepath.length != fullpath.length) {
                        folder.generator = true
                    }

                    // global and generators receive special treatment and the subfolders are not created
                    if (folder.name.toLowerCase() == 'global' || folder.name.toLowerCase() == 'generators') {
                        build(pagepath.slice(1), partial_pages, fullpath)
                    } else {

                        // adds the folder to the tree if it's not there yet
                        if (!(pagepath[0] in partial_pages)) {
                            partial_pages[pagepath[0]] = folder
                        }

                        build(pagepath.slice(1), partial_pages[pagepath[0]], fullpath)
                    }

                }
            }

            // goes throught the glob, crops the filename and builds a pagelist
            files.map((file) => {
                return file.match('/cms/(.*).js')[1].split('/')
            }).forEach((pagepath) => {
                build(pagepath, pagelist, pagepath)
            })

            composed_pagelist = {
                structured: pagelist,
                flat: flat_pagelist
            }

            resolve(composed_pagelist)
        })
    })
}

// * ———————————————————————————————————————————————————————— * //
// *     save cms list
// *
// *     saves the cmslist to predefined path
// *    @return {promise} - promise with cmslist
// * ———————————————————————————————————————————————————————— * //
pagelist_generator.prototype.save_cms_list = function (cmslist) {
    const self = this

    return new Promise(function (resolve, reject) {

        // regenerates pagelist_desination in case cmd_folder has changed
        pagelist_destination = self.get_pregenerated_pagelist_path()

        // Saves the cmslist into a specified file
        flat_helpers.ensure_directory_existence(pagelist_destination)
            .then(() => {
                fs.writeFile(pagelist_destination, JSON.stringify(cmslist), function (err) {
                    if (err) { console.log(err) }
                    resolve(cmslist)
                })
            })
    })
}

// * ———————————————————————————————————————————————————————— * //
// *     get cms list
// *
// *    generates and returns the cms list
// *    @return {promise} - promise with cmslist
// * ———————————————————————————————————————————————————————— * //
pagelist_generator.prototype.get_cms_list = function () {
    const self = this
    return self.generate_cms_list()
}

// * ———————————————————————————————————————————————————————— * //
// *     pregenerated pagelist path
// *
// *     global acccessible pagelist path
// *    @return {promise} - promise with cmslist
// * ———————————————————————————————————————————————————————— * //
pagelist_generator.prototype.get_pregenerated_pagelist_path = function () {
    return path.join(enduro.project_path, enduro.config.build_folder, '_prebuilt', 'cmslist.json')
}

module.exports = new pagelist_generator()