GUSCRAWFORD/fpm

View on GitHub
src/transform-command.ts

Summary

Maintainability
D
1 day
Test Coverage
import * as fs from "fs";
import * as path from 'path';
export class TransformCommand {
    static from = transformCommand;
    static capture = captureVariants;
}
function captureVariants() {
    const REAL_TR = 'transform';
    let commandIndex = 2, command = process.argv[commandIndex];
    if (command === 'help') {
        commandIndex = 3;
        command = process.argv[commandIndex];
    }
    switch(command) {
        case 't': case 'p': case 'package':
            process.argv[commandIndex] = REAL_TR;
            break;
        default:
    }
}
function transformCommand(args, options, logger) {

    if (!args.directories) args.directories = [];
    if (args.directory) args.directories.push(args.directory);
    logger.info(options);
    args.directories.forEach(createPackageJsonFor);
    function createPackageJsonFor (projectPath) {
        var absPath = path.resolve(projectPath);
        logger.info(`ℹ️ Creating package.json for project in: ${absPath}`);
        fs.lstat(absPath,function lstat_cb (error, info) {
            //logger.info(info);
            fs.readFile(`${path.join(absPath,'package.json')}`, {encoding:'utf8'}, transformPackage);
        });
        function transformPackage (error, packageJson) {
            if (error) {
                logger.error(error);
                return error;
            }
            var packageData = JSON.parse(packageJson);
            logger.info(`♻️  Transforming: ${path.join(absPath,'package.json')} to ${path.join(absPath,options.distFolder||'dist','package.json')}`)
            if (options.dry) logger.info(packageData);
            if (packageData["@fpm:transform"]) {
                //console.log(Object.keys(packageData["@fpm:transform"]));
                Object.keys(packageData["@fpm:transform"]).forEach(keyToTransform=>{
                    if (keyToTransform === "@fpm:transform") return;
                    //logger.info(packageData["@fpm:transform"][keyToTransform])
                    transformKey(error, packageData, packageData["@fpm:transform"], keyToTransform);
                    // switch(typeof (packageData["@fpm:transform"][keyToTransform]) ) {
                    //     case "object":
                    //         Object.keys(packageData["@fpm:transform"][keyToTransform]).forEach(opr=>{
                    //             switch(opr) {

                    //                 case '@fpm:replace':
                    //                     Object.keys(packageData["@fpm:transform"][keyToTransform][opr])
                    //                         .forEach(replace=>
                    //                             packageData[keyToTransform] = packageData[keyToTransform].replace(
                    //                                 new RegExp(replace, 'g'),
                    //                                 packageData["@fpm:transform"][keyToTransform][opr][replace]
                    //                             )
                    //                         );
                    //                     break;
                    //                 case '@fpm:add':
                    //                     if (typeof packageData["@fpm:transform"][keyToTransform][opr] === 'object')
                    //                         Object.keys(packageData["@fpm:transform"][keyToTransform][opr])
                    //                             .forEach(append=> {
                    //                                     packageData[keyToTransform] = packageData["@fpm:transform"][keyToTransform][opr];
                    //                             });
                    //                     else if (typeof packageData["@fpm:transform"][keyToTransform][opr]  === 'string')
                    //                         packageData[keyToTransform] = packageData["@fpm:transform"][keyToTransform][opr];
                    //                     break;
                    //                 default:

                    //             }
                    //         });
                    //         break;
                    //     case "string":
                    //         switch(packageData["@fpm:transform"][keyToTransform]) {
                    //             case '@fpm:remove':
                    //                 delete packageData[keyToTransform];
                    //             break;
                    //             default:
                    //         }
                    // }
                });
                // ?
                if (packageData["@fpm:transform"]["@fpm:transform"]) packageData["@fpm:transform"] = packageData["@fpm:transform"]["@fpm:transform"]["@fpm:add"];
            }
            delete packageData["@fpm:transform"];
            if (options.dry) logger.info(`✅  Into:`);
            if (options.dry) logger.info(packageData);
            savePackage(JSON.stringify(packageData, null, '\t'), `${path.join(absPath, options.distFolder||'dist','package.json')}`);
        }
        function transformKey (error, packageData, pack, key) {
            switch(typeof (pack[key]) ) {
                case "object":
                    Object.keys(pack[key]).forEach(opr=>{
                        switch(opr) {

                            case '@fpm:replace':
                                Object.keys(pack[key][opr])
                                    .forEach(replace=> {
                                        // console.info('pack:')
                                        // console.info(pack);
                                        // console.info(`key: ${key} opr: ${opr}`)
                                        // console.info(`packageData[key]: ${JSON.stringify(packageData[key])}`)
                                        packageData[key] = packageData[key].replace(
                                            new RegExp(replace, 'g'),
                                            pack[key][opr][replace]
                                        ) }
                                    );
                                break;
                            case '@fpm:add':
                                if (typeof pack[key][opr] === 'object')
                                    Object.keys(pack[key][opr])
                                        .forEach(append=> {
                                                packageData[key] = pack[key][opr];
                                        });
                                else if (typeof pack[key][opr]  === 'string')
                                    packageData[key] = pack[key][opr];
                                break;
                            default:
                                transformKey(error, packageData[key], pack[key], opr);
                        }
                    });
                    break;
                case "string":
                    switch(pack[key]) {
                        case '@fpm:remove':
                            delete pack[key];
                        break;
                        default:
                    }
            }
        }
    }

    function savePackage(packageData, packagePath) {
        if (options.dry) logger.info(`ℹ️  writes to: ${packagePath}`);
        else fs.writeFile(packagePath, packageData, 'utf8', (err)=>
            err?logger.error(`❌  ${err}`):
                logger.info(`📝  ${packagePath}`))
    }
}