jquery/jquery

View on GitHub
build/release/cdn.js

Summary

Maintainability
A
2 hrs
Test Coverage
var
    fs = require( "fs" ),
    shell = require( "shelljs" ),
    path = require( "path" ),

    cdnFolder = "dist/cdn",

    releaseFiles = {
        "jquery-VER.js": "dist/jquery.js",
        "jquery-VER.min.js": "dist/jquery.min.js",
        "jquery-VER.min.map": "dist/jquery.min.map",
        "jquery-VER.slim.js": "dist/jquery.slim.js",
        "jquery-VER.slim.min.js": "dist/jquery.slim.min.js",
        "jquery-VER.slim.min.map": "dist/jquery.slim.min.map"
    },

    googleFilesCDN = [
        "jquery.js", "jquery.min.js", "jquery.min.map",
        "jquery.slim.js", "jquery.slim.min.js", "jquery.slim.min.map"
    ],

    msFilesCDN = [
        "jquery-VER.js", "jquery-VER.min.js", "jquery-VER.min.map",
        "jquery-VER.slim.js", "jquery-VER.slim.min.js", "jquery-VER.slim.min.map"
    ];

/**
 * Generates copies for the CDNs
 */
function makeReleaseCopies( Release ) {
    shell.mkdir( "-p", cdnFolder );

    Object.keys( releaseFiles ).forEach( function( key ) {
        var text,
            builtFile = releaseFiles[ key ],
            unpathedFile = key.replace( /VER/g, Release.newVersion ),
            releaseFile = cdnFolder + "/" + unpathedFile;

        if ( /\.map$/.test( releaseFile ) ) {

            // Map files need to reference the new uncompressed name;
            // assume that all files reside in the same directory.
            // "file":"jquery.min.js" ... "sources":["jquery.js"]
            text = fs.readFileSync( builtFile, "utf8" )
                .replace( /"file":"([^"]+)"/,
                    "\"file\":\"" + unpathedFile.replace( /\.min\.map/, ".min.js\"" ) )
                .replace( /"sources":\["([^"]+)"\]/,
                    "\"sources\":[\"" + unpathedFile.replace( /\.min\.map/, ".js" ) + "\"]" );
            fs.writeFileSync( releaseFile, text );
        } else if ( builtFile !== releaseFile ) {
            shell.cp( "-f", builtFile, releaseFile );
        }
    } );
}

function makeArchives( Release, callback ) {

    Release.chdir( Release.dir.repo );

    function makeArchive( cdn, files, callback ) {
        if ( Release.preRelease ) {
            console.log( "Skipping archive creation for " + cdn + "; this is a beta release." );
            callback();
            return;
        }

        console.log( "Creating production archive for " + cdn );

        var sum,
            archiver = require( "archiver" )( "zip" ),
            md5file = cdnFolder + "/" + cdn + "-md5.txt",
            output = fs.createWriteStream(
                cdnFolder + "/" + cdn + "-jquery-" + Release.newVersion + ".zip"
            ),
            rver = /VER/;

        output.on( "close", callback );

        output.on( "error", function( err ) {
            throw err;
        } );

        archiver.pipe( output );

        files = files.map( function( item ) {
            return "dist" + ( rver.test( item ) ? "/cdn" : "" ) + "/" +
                item.replace( rver, Release.newVersion );
        } );

        sum = Release.exec( "md5 -r " + files.join( " " ), "Error retrieving md5sum" );
        fs.writeFileSync( md5file, sum );
        files.push( md5file );

        files.forEach( function( file ) {
            archiver.append( fs.createReadStream( file ),
                { name: path.basename( file ) } );
        } );

        archiver.finalize();
    }

    function buildGoogleCDN( callback ) {
        makeArchive( "googlecdn", googleFilesCDN, callback );
    }

    function buildMicrosoftCDN( callback ) {
        makeArchive( "mscdn", msFilesCDN, callback );
    }

    buildGoogleCDN( function() {
        buildMicrosoftCDN( callback );
    } );
}

module.exports = {
    makeReleaseCopies: makeReleaseCopies,
    makeArchives: makeArchives
};