Home Reference Source Test

source/command.js

import { join, basename } from 'path';

import {outputFile, existsSync, statSync, readdir} from 'fs-extra';

import Component from './Component';

import { index_html, index_js, router_js } from './template';

import { addComponent } from './utility';


/**
 * @param {String}   name      - Tag name
 * @param {String}   path      - Root of Source codes
 * @param {String[]} [keys=[]] - Defined HTML attributes
 * @param {?Boolean} preload   - Insert Component tag to Entry HTML
 */
export  async function createCell(name, path, keys, preload) {

    await outputFile(join(path, name, 'index.html'),  index_html());

    console.info(`√ Generated ${name}/index.html`);

    await outputFile(join(path, name, 'index.js'),  index_js(name, keys));

    console.info(`√ Generated ${name}/index.js`);

    if ( preload )  await addComponent(join(path, '../index.html'),  name);
}


/**
 * @param {String}   name      - Prefix of Tag name
 * @param {String}   path      - Root of Source codes
 * @param {String[]} [page=[]] - Router/Page names of Web-site/app
 */
export  async function createRouter(name, path, page) {

    const tag = `${name}-router`;

    await outputFile(join(path, tag, 'index.js'),  router_js(name, page));

    console.info(`√ Generated ${tag}/index.js`);

    await addComponent(join(path, '../index.html'),  tag);

    for (let name of page)  await createCell(`page-${name}`, path);
}


/**
 * Bundle components to JS modules
 *
 * @param {string} path - Source directory
 *
 * @return {string[]} Component paths
 */
export  async function bundle(path) {

    var result = [ ];

    if (existsSync( join(path, 'index.js') )) {

        const component = new Component( path );

        result[0] = `dist/${component.name}.js`;

        await outputFile(result[0],  await component.toJS());
    }

    if (statSync( path ).isDirectory())
        result = result.concat(... await Promise.all(
            (await readdir( path )).map(file  =>  bundle( join(path, file) ))
        ));

    return result;
}


/**
 * Bundle components into a JS package
 *
 * @param {string} path - Source directory
 *
 * @return {string[]} Component paths
 */
export  async function pack(path) {

    const file = await bundle( path );

    await outputFile(
        'dist/index.js',
        file.map(item => {

            item = basename( item );

            console.info(`√ Component "${item}" is packed in`);

            return  `export * from './${item}';`;

        }).join('\n')
    );

    return file;
}