mavensmate
Version:
Core APIs that drive MavensMate IDEs for Salesforce1/Force.com
409 lines (385 loc) • 13.1 kB
JavaScript
/**
* @file Responsible for CRUD of Lightning metadata
* @author Joseph Ferraro <@joeferraro>
*/
;
var Promise = require('bluebird');
var _ = require('lodash');
var path = require('path');
var logger = require('winston');
var util = require('../util');
// TODO: move source strings to swig templates
var LightningService = function(project){
this.project = project;
};
LightningService.prototype.getAll = function() {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.query('Select Id, AuraDefinitionBundleId,AuraDefinitionBundle.DeveloperName,DefType,Format FROM AuraDefinition', function(err, res) {
if (err) {
reject(err);
} else {
resolve(res.records);
}
});
});
};
LightningService.prototype.createBundle = function(apiName, description) {
var self = this;
logger.debug('Creating lightning bundle: '+apiName);
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinitionBundle').create({
Description: description, // my description
DeveloperName: apiName, // cool_bro
MasterLabel: apiName, // cool bro
ApiVersion: self.project.sfdcClient.apiVersion || '32.0'
}, function(err, res) {
if (err) {
reject(err);
} else {
logger.debug('Lightning bundle creation result: ');
logger.debug(res);
resolve(res);
}
});
});
};
LightningService.prototype.deleteBundle = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinitionBundle').delete(bundleId, function(err, res) {
if (err) {
reject(new Error('Could not delete AuraBundle: '+err.message));
} else {
resolve(res);
}
});
});
};
LightningService.prototype.deleteBundleItems = function(mavensmateFiles) {
var self = this;
return new Promise(function(resolve, reject) {
if (mavensmateFiles.length === 0) {
return resolve();
} else {
self.project.getLightningIndex()
.then(function(lightningIndex) {
logger.debug(lightningIndex);
var deleteIds = [];
_.each(mavensmateFiles, function(mmf) {
var lightningBundleName = mmf.folderName; //mybundle
var lightningType = mmf.lightningType;
logger.debug('deleting lightning type: '+lightningType);
logger.debug('deleting lightningBundleName: '+lightningBundleName);
deleteIds.push(_.find(lightningIndex, { AuraDefinitionBundle : { DeveloperName: lightningBundleName }, DefType: lightningType }).Id);
});
logger.debug('deleting lightning components!!');
logger.debug(mavensmateFiles);
logger.debug(deleteIds);
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').delete(deleteIds, function(err, res) {
if (err) {
reject(new Error('Could not delete AuraBundle item: '+err.message));
} else {
resolve(res);
}
});
})
.catch(function(err) {
reject(new Error('Could not get delete bundle items: '+err.message));
});
}
});
};
LightningService.prototype.getBundle = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.query('Select Id, AuraDefinitionBundleId,AuraDefinitionBundle.DeveloperName,DefType,Format FROM AuraDefinition WHERE AuraDefinitionBundleId = \''+bundleId+'\'', function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.getBundleItems = function(mavensmateFiles) {
var self = this;
return new Promise(function(resolve, reject) {
if (mavensmateFiles.length === 0) {
return resolve();
} else {
logger.debug('attempting to get index');
self.project.getLightningIndex()
.then(function(lightningIndex) {
logger.debug('got lightning index');
logger.debug(lightningIndex);
var itemIds = [];
_.each(mavensmateFiles, function(mmf) {
var lightningBundleName = mmf.folderName; //mybundle
var lightningType = mmf.lightningType;
logger.debug('getting lightning type: '+lightningType);
logger.debug('getting lightningBundleName: '+lightningBundleName);
itemIds.push(_.find(lightningIndex, { AuraDefinitionBundle : { DeveloperName: lightningBundleName }, DefType: lightningType }).Id);
});
logger.debug('getting lightning components!!');
logger.debug(itemIds);
self.project.sfdcClient.conn.tooling.query('Select Id,AuraDefinitionBundleId,AuraDefinitionBundle.DeveloperName,DefType,Format,Source FROM AuraDefinition WHERE Id IN ('+util.joinForQuery(itemIds)+')', function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
})
.catch(function(err) {
reject(new Error('Could not get bundle items: '+err.message));
});
}
});
};
/**
* Updates one or more lightning components
* @param {Array} - array of File instances
* @return {Promise}
*/
LightningService.prototype.update = function(files) {
var self = this;
return new Promise(function(resolve, reject) {
if (files.length === 0) {
resolve();
} else {
self.project.getLightningIndex()
.then(function(lightningIndex) {
logger.debug(lightningIndex);
var updatePayload = [];
_.each(files, function(f) {
var lightningBundleName = path.basename(path.dirname(f.path)); //mybundle
var lightningType = f.lightningType;
logger.debug('lightning type: '+lightningType);
logger.debug('lightningBundleName: '+lightningBundleName);
var payloadItem = {
Source: f.body,
Id: _.find(lightningIndex, { AuraDefinitionBundle : { DeveloperName: lightningBundleName }, DefType: lightningType }).Id
};
updatePayload.push(payloadItem);
});
logger.debug('updating lightning components!!');
logger.debug(updatePayload);
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').update(updatePayload, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
})
.catch(function(err) {
reject(new Error('Could not update lightning components: '+err.message));
});
}
});
};
LightningService.prototype.updateComponent = function(id, source) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').update({
Id : id,
Source : source
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createComponent = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'COMPONENT',
Format: 'XML',
Source: '<aura:component></aura:component>'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createApplication = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'APPLICATION',
Format: 'XML',
Source: '<aura:application></aura:application>'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createInterface = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'INTERFACE',
Format: 'XML',
Source: '<aura:interface description="Interface template">\n\t<aura:attribute name="example" type="String" default="" description="An example attribute."/>\n</aura:interface>'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createDocumentation = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'DOCUMENTATION',
Format: 'XML',
Source: '<aura:documentation>\n\t<aura:description>Documentation</aura:description>\n\t<aura:example name="ExampleName" ref="exampleComponentName" label="Label">\n\t\tExample Description\n\t</aura:example>\n</aura:documentation>'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createController = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'CONTROLLER',
Format: 'JS',
Source: '({\n\tmyAction : function(component, event, helper) {\n\t}\n})'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createRenderer = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'RENDERER',
Format: 'JS',
Source: '({\n\t// Your renderer method overrides go here\n})'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createHelper = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'HELPER',
Format: 'JS',
Source: '({\n\thelperMethod : function() {\n\t}\n})'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createStyle = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'STYLE',
Format: 'CSS',
Source: '.THIS {\n}'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createDesign = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
logger.warn('creating design', bundleId);
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'DESIGN',
Format: 'XML',
Source: '<design:component>\n\n</design:component>'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createSvg = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'SVG',
Format: 'SVG',
Source: '<?xml version="1.0" encoding="UTF-8" standalone="no"?>\n<svg width="120px" height="120px" viewBox="0 0 120 120" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">\n</svg>'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
LightningService.prototype.createEvent = function(bundleId) {
var self = this;
return new Promise(function(resolve, reject) {
self.project.sfdcClient.conn.tooling.sobject('AuraDefinition').create({
AuraDefinitionBundleId: bundleId,
DefType: 'EVENT',
Format: 'XML',
Source: '<aura:event type="APPLICATION" description="Event template" />'
}, function(err, res) {
if (err) {
reject(err);
} else {
resolve(res);
}
});
});
};
module.exports = LightningService;