@gravityforms/gulp-tasks
Version:
Configurable Gulp tasks for use in Gravity Forms projects.
110 lines (97 loc) • 4.07 kB
JavaScript
const gulp = require( 'gulp' );
const path = require( 'path' );
const awspublish = require( 'gulp-awspublish' );
const awspublishRouter = require( 'gulp-awspublish-router' );
const getPluginVersion = require( '../utils/get-plugin-version' );
const sendSlackMessage = require( '../utils/send-slack-message' );
const getConfig = require('../../config');
const { config } = getConfig();
const { isGravityFormsAddon, trailingSlashIt } = require( '../utils/tools' );
const version = () => process.env.GRAVITY_PLUGIN_VERSION || getPluginVersion( config.paths.root, config.settings.rootPluginFile );
const zipPath = () => ! isGravityFormsAddon( config ) ? 'releases' : `addons/${ config.settings.slug.replace( 'gravityforms', '' ) }`;
const getBucketName = ( publishConfig ) => {
let bucketName = publishConfig?.bucket || config?.settings?.awsBucket || process.env.AWS_GRAVITYFORMS_BUCKET;
const buildEnvironment = process.env.BUILD_ENVIRONMENT;
if ( ! buildEnvironment ) {
bucketName += `.dev`;
} else if ( buildEnvironment !== 'prod' ) {
bucketName += `.${ buildEnvironment }`;
}
return bucketName;
};
const createPublisher = ( publishConfig ) => {
const bucketName = getBucketName( publishConfig );
return awspublish.create( {
credentials: {
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
signatureVersion: 'v3',
},
region: publishConfig.region || process.env.AWS_DEFAULT_REGION || 'us-east-1',
params: {
Bucket: bucketName,
},
} );
};
const generatePublishTask = ( { filePath, uploadPathFunc, publishConfig } ) => () => {
// Check if not in production mode and exit early
if ( process.env.GULP_PRODUCTION_MODE !== 'true' ) {
console.log( 'Skipping publishing task because GULP_PRODUCTION_MODE is not set to true.' );
// Using a dummy task to signal completion
return gulp.task( 'dummy', done => done() )();
}
const filePathResolved = typeof filePath === 'function' ? filePath() : filePath;
const uploadPath = publishConfig.path || uploadPathFunc();
const accessLevel = publishConfig.access || 'private';
const force = publishConfig.force || false;
const publisher = createPublisher( publishConfig );
const bucket = getBucketName( publishConfig );
const headers = { 'x-amz-acl': accessLevel };
console.log( `Publishing ${ filePathResolved } to S3 on the ${ bucket } bucket at ${ uploadPath } with ${ accessLevel } access` );
return gulp.src( filePathResolved )
.pipe( awspublishRouter( {
routes: {
"^.+$": {
key: `${ trailingSlashIt( uploadPath ) }${ path.basename( filePathResolved ) }`,
headers,
}
}
} ) )
.pipe( publisher.publish( headers, { force } ) )
.on( 'error', function( err ) {
console.error( 'AWS publishing error:', err );
sendSlackMessage( `Failed to upload to AWS during publish: ${ err }`, 'error' ).then( () => {
process.exit( 1 );
} );
} )
.pipe( awspublish.reporter() );
};
module.exports = {
publishReleaseZip: generatePublishTask( {
filePath: () => `${ trailingSlashIt( config.paths.root ) }${ config.settings.slug }_${ version() }.zip`,
uploadPathFunc: zipPath,
publishConfig: config?.publish?.release?.zip || {},
} ),
publishReleaseChangelog: generatePublishTask( {
filePath: `${ trailingSlashIt( config.paths.root ) }change_log.txt`,
uploadPathFunc: zipPath,
publishConfig: config?.publish?.release?.changeLog || {
access: 'public-read',
},
} ),
publishReleaseChecksums: generatePublishTask( {
filePath: () => path.join( config.paths.root, 'checksums', `${ config.settings.slug }_${ version() }.md5` ),
uploadPathFunc: () => `${ trailingSlashIt( zipPath() ) }checksums`,
publishConfig: config?.publish?.release?.checksums || {
access: 'public-read',
force: true,
},
} ),
publishReleasePotFile: generatePublishTask( {
filePath: () => path.join( config.paths.root, 'languages', `${ config.settings.slug }.pot` ),
uploadPathFunc: () => 'translations/pots',
publishConfig: config?.publish?.release?.pot || {
access: 'public-read',
},
} ),
};