cattr-app/frontend-application

View on GitHub
webpack/CattrWebpackPlugin.js

Summary

Maintainability
A
1 hr
Test Coverage
const { writeFileSync, readdirSync, mkdirSync, copyFileSync, existsSync } = require('fs');
const { join, resolve } = require('path');
const { merge } = require('lodash');

let env = require(resolve(__dirname, '..', 'app', 'etc', 'env.js'));

if (existsSync(resolve(__dirname, '..', 'app', 'etc', `env.${process.env.NODE_ENV}.js`))) {
    env = { ...env, ...require(resolve(__dirname, '..', 'app', 'etc', `env.${process.env.NODE_ENV}.js`)) };
}

if (existsSync(resolve(__dirname, '..', 'app', 'etc', 'env.local.js'))) {
    env = { ...env, ...require(resolve(__dirname, '..', 'app', 'etc', 'env.local.js')) };
}

const dirIterator = (sourcePath, destPath) => {
    readdirSync(sourcePath, { withFileTypes: true })
        .filter(item => ['.', '..'].indexOf(item.name) === -1)
        .forEach(el => {
            if (el.isDirectory()) {
                mkdirSync(join(destPath, el.name), { recursive: true });
                dirIterator(join(sourcePath, el.name), join(destPath, el.name));
            } else {
                copyFileSync(join(sourcePath, el.name), join(destPath, el.name));
            }
        });
};

module.exports = class CattrWebpackPlugin {
    constructor(
        options = {
            fileName: 'cattr.manifest',
            outputDir: 'output',
        },
    ) {
        this.options = options;
    }

    apply(compiler) {
        compiler.hooks.done.tap('CattrWebpackPlugin', stats => {
            // Finding plugins config
            let plugins = require('../app/etc/modules.config.json');

            if (
                existsSync(
                    join(stats.compilation.options.context, 'app', 'etc', `modules.${process.env.NODE_ENV}.json`),
                )
            ) {
                plugins = merge(
                    plugins,
                    require(join(
                        stats.compilation.options.context,
                        'app',
                        'etc',
                        `modules.${process.env.NODE_ENV}.json`,
                    )),
                );
            }

            if (existsSync(join(stats.compilation.options.context, 'app', 'etc', 'modules.local.json'))) {
                plugins = merge(
                    plugins,
                    require(join(stats.compilation.options.context, 'app', 'etc', 'modules.local.json')),
                );
            }

            const manifestPlugins = [];

            Object.keys(plugins).forEach(el => {
                manifestPlugins.push({ ...plugins[el], name: el });
            });

            // Create manifest file
            writeFileSync(
                join(stats.compilation.options.output.path, this.options.fileName),
                JSON.stringify({
                    backend_path: env.API_URL,
                    frontend_version: process.env.npm_package_version,
                    frontend_plugins: manifestPlugins,
                }),
            );

            // Copying to output dir
            dirIterator(
                stats.compilation.options.output.path,
                join(stats.compilation.options.context, this.options.outputDir),
            );
        });
    }
};