consume implementation code from jsforce-deploy and jsforce-connection

This commit is contained in:
Nate Black 2016-07-13 15:38:54 -07:00
Родитель 74c08523da
Коммит 3a3d68a0ee
7 изменённых файлов: 6 добавлений и 171 удалений

Просмотреть файл

@ -49,17 +49,5 @@ status "Installing modules"
cd $SALESFORCE_DIR
npm install | indent
# Allow the user to specify the salesforce source. We only want to zip one
# level above the source, and zip includes relative paths. So we first cd one
# level above, the SRC_DIR, then zip the source folder, the SRC_FOLDER.
SRC_PATH=${SALESFORCE_SRC_PATH:-"salesforce/src"}
SRC_DIR=$(dirname $SRC_PATH)
SRC_FOLDER=$(basename $SRC_PATH)
status "Building ZIP from $SRC_DIR to $SALESFORCE_DIR_NAME/src.zip"
rm -f $SALESFORCE_DIR/src.zip
cd $BUILD_DIR/$SRC_DIR
zip -r $SALESFORCE_DIR/src.zip $SRC_FOLDER | indent
echo ""
echo "Configure your application to invoke '$SALESFORCE_DIR_NAME/deploy' in your release phase script or Procfile"

Просмотреть файл

@ -1,47 +1,8 @@
const zipPath = '.salesforce/src.zip';
const fs = require('fs');
const jsforceConnection = require('./jsforce-connection');
const connection = require('jsforce-connection').connection;
const jsforceDeploy = require('jsforce-deploy');
const prompt = function(message) {
console.log(`-----> ${message}`);
};
const info = function(message) {
console.log(` ${message}`);
};
const error = function(message) {
console.error(` ! ${message}`);
};
return jsforceConnection()
.then( conn => {
return new Promise((resolve, reject) => {
console.log('-----> Deploying metadata');
const zipStream = fs.createReadStream(zipPath);
conn.metadata.pollTimeout = 240*1000;
const deployLocator = conn.metadata.deploy(zipStream, {});
deployLocator.complete(true, function(err, result) {
if (err) {
reject(err);
return;
}
resolve(result);
});
})
})
.then( result => {
info('done ? :' + result.done);
info('success ? : ' + result.true);
info('state : ' + result.state);
info('component errors: ' + result.numberComponentErrors);
info('components deployed: ' + result.numberComponentsDeployed);
info('tests completed: ' + result.numberTestsCompleted);
info(' ' + (result.success ? 'Success' : 'Failed'));
})
.catch( err => {
error(err.stack);
process.exit(1);
});
const srcPath = process.env.SALESFORCE_SRC_PATH || 'salesforce/src';
return connection().then((conn) => jsforceDeploy(conn)(srcPath));

Просмотреть файл

@ -1,21 +0,0 @@
const fetch = require('node-fetch');
module.exports = function getSalesforceIdentity(accessToken, idUrl) {
console.log('-----> Get Salesforce identity');
return fetch(idUrl, {
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
}
})
.then( response => {
const status = response.status;
if (status >= 300) { throw new Error(`Request status ${status} for ${idUrl}`) }
//console.log(' response status', status);
return response.json();
})
.then( salesforceIdentity => {
//console.log(' Identity', salesforceIdentity);
return salesforceIdentity;
});
}

Просмотреть файл

@ -1,46 +0,0 @@
const url = require('url');
const jsforce = require('jsforce');
const requireEnvVar = require('./require-env-var');
const refreshSalesforceAuth = require('./refresh-salesforce-auth');
const getSalesforceIdentity = require('./get-salesforce-identity');
// Return Promise of authenticated jsForce connection.
module.exports = function createJsforceConnection(forceComVersion = '37.0') {
const forceComAlmUrl = url.parse(requireEnvVar('SALESFORCE_URL'));
const forceComAuth = forceComAlmUrl.auth.split(':');
const forceComId = forceComAuth[0];
const forceComSecret = forceComAuth[1];
const forceComRefreshToken = forceComAuth[2];
const forceComHost = forceComAlmUrl.host;
const forceComUrl = `https://${forceComHost}`;
console.log('-----> Force.com connecting', forceComUrl);
// Dynamic assignments with top-level scope
let forceComAuthToken;
let forceComUserId;
let forceComUsername;
let connection;
return refreshSalesforceAuth(forceComHost, forceComId, forceComSecret, forceComRefreshToken)
.then( ({accessToken, idUrl}) => {
forceComAuthToken = accessToken;
connection = new jsforce.Connection({
accessToken: accessToken,
loginUrl: forceComUrl,
instanceUrl: forceComUrl,
serverUrl: `${forceComUrl}/services/Soap/u/${forceComVersion}`,
version: forceComVersion
});
return getSalesforceIdentity(accessToken, idUrl);
})
.then( res => {
console.log('-----> Salesforce org ID', res.organization_id);
console.log('-----> Salesforce admin user ID', res.user_id);
console.log('-----> Salesforce admin username', res.username);
return connection;
});
}

Просмотреть файл

@ -1,38 +0,0 @@
const url = require('url');
const fetch = require('node-fetch');
module.exports = function refreshSalesforceAuth(forceComHost, forceComId, forceComSecret, forceComRefreshToken) {
if (forceComHost == null || forceComId == null || forceComSecret == null || forceComRefreshToken == null) {
throw new Error('Requires arguments `forceComHost, forceComId, forceComSecret, forceComRefreshToken`');
}
const query = `grant_type=refresh_token&client_id=${
encodeURIComponent(forceComId)}&client_secret=${
encodeURIComponent(forceComSecret)}&refresh_token=${
encodeURIComponent(forceComRefreshToken)}`;
const refreshAuthUrl = `https://${forceComHost}/services/oauth2/token?${query}`;
console.log('-----> Refresh Salesforce auth');
return fetch(refreshAuthUrl, {
method: 'POST',
headers: {
Accept: 'application/json'
}
})
.then( response => {
const status = response.status;
if (status >= 300) { throw new Error(`Request status ${status} for ${refreshAuthUrl}`) }
//console.log(' response status', status);
return response.json();
})
.then( salesforceAuth => {
// Reset the identity URL to the specified instance host, otherwise Salesforce always uses "login.salesforce.com"
const salesforceIdentityUrl = url.parse(salesforceAuth.id);
salesforceIdentityUrl.host = forceComHost;
const idUrl = url.format(salesforceIdentityUrl);
//console.log(` instance identity URL ${idUrl}`);
return {
accessToken: salesforceAuth.access_token,
idUrl
}
});
}

Просмотреть файл

@ -1,9 +0,0 @@
module.exports = function requireEnvVar(name) {
var value = process.env[name];
if (value != null) {
return value;
} else {
throw new Error(`! Environment variable "${name}" is required`);
}
}

Просмотреть файл

@ -13,7 +13,7 @@
},
"homepage": "https://github.com/forcedotcom/force-com-buildpack#readme",
"dependencies": {
"jsforce": "^1.6.5",
"node-fetch": "^1.5.3"
"jsforce-deploy": "git+https://github.com/ntblack/jsforce-deploy.git",
"jsforce-connection": "git+https://github.com/ntblack/jsforce-connection.git"
}
}