gulp-spsync-creds
Version:
Gulp plugin that syncs with a library in SharePoint Online and on-premises
316 lines (315 loc) • 13.5 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
var sprequest = require("sp-request");
var Promise = require("bluebird");
var gutil = require("gulp-util");
var moment = require("moment");
var defer_1 = require("./defer");
var folderCreator_1 = require("./folderCreator");
var fileHelper = require("./fileHelper");
var fileHlp = new fileHelper.FileHelper();
var digestVal = {
digest: null,
retrieved: null,
url: ""
};
var forceCheckoutValue = false;
var docLibChecked = false;
var FileSync = (function () {
function FileSync(options) {
this.config = options;
this.spr = sprequest.create({ username: options.username, password: options.password });
}
FileSync.prototype.init = function () {
var _this = this;
this.started = moment();
return new Promise(function (resolve, reject) {
if (!_this.CheckDigestLifespan() || _this.config.site !== digestVal.url) {
_this.spr.requestDigest(_this.config.site).then(function (result) {
digestVal.digest = result;
digestVal.retrieved = moment();
digestVal.url = _this.config.site;
if (_this.config.verbose) {
gutil.log('INFO: New digest received');
}
_this.start().then(function () {
resolve(null);
}).catch(function (error) {
if (typeof error === "string") {
gutil.log(gutil.colors.red("ERROR: " + error));
}
else {
gutil.log(gutil.colors.red('ERROR:'), JSON.stringify(error));
}
resolve(null);
});
});
}
else {
if (_this.config.verbose) {
gutil.log('INFO: Use cached digest value');
}
_this.start().then(function () {
resolve(null);
}).catch(function (error) {
if (typeof error === "string") {
gutil.log(gutil.colors.red("ERROR: " + error));
}
else {
gutil.log(gutil.colors.red('ERROR:'), JSON.stringify(error));
}
resolve(null);
});
}
});
};
FileSync.prototype.CheckDigestLifespan = function () {
if (digestVal.digest !== null && digestVal.retrieved !== null) {
var now = moment();
if (now.diff(digestVal.retrieved, 'minutes') < 25) {
return true;
}
}
return false;
};
FileSync.prototype.start = function () {
var _this = this;
this.fileInfo = fileHlp.getFileContext(this.config);
this.folderCreator = new folderCreator_1.FolderCreator(this.config, this.spr, digestVal.digest, this.fileInfo);
return new Promise(function (resolve, reject) {
_this.checkLibrarySettings().then(function () {
return _this.folderCreator.checkFoldersAndCreateIfNotExist()
.then(function () {
return _this.upload();
})
.then(function () {
_this.started = moment();
return _this.updateFileMetadata();
})
.then(function () {
_this.started = moment();
return _this.publishFile();
})
.then(function () {
resolve(null);
})
.catch(function (err) {
reject(err);
});
});
});
};
FileSync.prototype.checkLibrarySettings = function () {
var _this = this;
var headers = {
"headers": {
"X-RequestDigest": digestVal.digest,
"content-type": "application/json;odata=verbose",
"Accept": "application/json;odata=verbose"
}
};
return new Promise(function (resolve, reject) {
if (!docLibChecked) {
var libSettingsUrl = _this.config.site + "/_api/Web/GetCatalog(116)?$select=forceCheckoutValue";
if (_this.fileInfo.library.indexOf('_catalogs/masterpage') !== 0) {
libSettingsUrl = _this.config.site + "/_api/web/GetFolderByServerRelativeUrl('" + _this.fileInfo.library + "')/Properties";
}
_this.spr.get(libSettingsUrl, headers).then(function (listInfo) {
docLibChecked = true;
if (listInfo !== null && (typeof listInfo.body.d.ForceCheckout !== "undefined" || listInfo.body.d.vti_x005f_listrequirecheckout !== "undefined")) {
if (_this.config.verbose) {
gutil.log('INFO: ForceCheckout value of the document libary is set to:', (listInfo.body.d.ForceCheckout || listInfo.body.d.vti_x005f_listrequirecheckout));
}
forceCheckoutValue = (listInfo.body.d.ForceCheckout || listInfo.body.d.vti_x005f_listrequirecheckout);
resolve(forceCheckoutValue);
}
else {
resolve(forceCheckoutValue);
}
}).catch(function (err) {
docLibChecked = true;
resolve(forceCheckoutValue);
});
}
else {
resolve(forceCheckoutValue);
}
});
};
FileSync.prototype.upload = function () {
var _this = this;
var headers = {
"headers": {
"X-RequestDigest": digestVal.digest
},
"body": this.config.content,
"json": false
};
return new Promise(function (resolve, reject) {
_this.checkoutBeforeUpload().then(function () {
return _this.spr.post(_this.config.site + "/_api/web/GetFolderByServerRelativeUrl('" + _this.fileInfo.library + "')/Files/add(url='" + _this.fileInfo.filename + "',overwrite=true)", headers)
.then(function (success) {
gutil.log(gutil.colors.green('Upload successful'), gutil.colors.magenta(moment().diff(_this.started, 'milliseconds').toString() + 'ms'));
resolve(success);
})
.catch(function (err) {
gutil.log(gutil.colors.red("Unable to upload file, it might be checked out to someone"));
reject(err);
});
});
});
};
FileSync.prototype.checkoutBeforeUpload = function () {
var _this = this;
return new Promise(function (resolve, reject) {
if (forceCheckoutValue) {
return _this.checkout().then(function () {
if (_this.config.verbose) {
gutil.log("INFO: File " + _this.fileInfo.filename + " is now checked out and ready for new upload");
}
resolve(null);
}).catch(function () {
resolve(null);
});
}
else {
resolve(null);
}
});
};
FileSync.prototype.updateFileMetadata = function () {
var _this = this;
return new Promise(function (resolve, reject) {
if (_this.config.update_metadata) {
if (_this.config.files_metadata.length <= 0) {
resolve(null);
}
var fileMetadata = _this.config.files_metadata.filter(function (fm) {
if (fm.name.toLowerCase() === _this.fileInfo.filename.toLowerCase()) {
return fm;
}
});
if (fileMetadata.length > 0) {
var metadata = fileMetadata[0].metadata;
var header = {
headers: {
"content-type": "application/json;odata=verbose",
"Accept": "application/json;odata=verbose",
"X-HTTP-Method": "MERGE",
"If-Match": "*",
"X-RequestDigest": digestVal.digest
},
body: metadata
};
_this.spr.post(_this.config.site + "/_api/web/GetFolderByServerRelativeUrl('" + _this.fileInfo.library + "')/Files('" + _this.fileInfo.filename + "')/listitemallfields", header).then(function (postData) {
gutil.log(gutil.colors.green('Metadata updated successfully'), gutil.colors.magenta(moment().diff(_this.started, 'milliseconds').toString() + 'ms'));
resolve(postData);
}).catch(function (err) {
gutil.log(gutil.colors.red("Unable to update metadata of the file"));
reject(err);
});
}
else {
resolve(null);
}
}
else {
resolve(null);
}
});
};
FileSync.prototype.publishFile = function () {
var _this = this;
var deferred = defer_1.defer();
if (this.config.publish) {
return this.checkout().then(function () {
return _this.checkin(deferred, 1);
}).catch(function (err) {
gutil.log(gutil.colors.red("Unable to publish file"));
deferred.reject(err);
});
}
else {
deferred.resolve(null);
}
return deferred.promise;
};
FileSync.prototype.checkouttype = function () {
var _this = this;
return new Promise(function (resolve, reject) {
var header = {
"headers": {
"content-type": "application/json;odata=verbose",
"X-RequestDigest": digestVal.digest
}
};
_this.spr.post(_this.config.site + "/_api/web/GetFolderByServerRelativeUrl('" + _this.fileInfo.library + "')/Files('" + _this.fileInfo.filename + "')/checkOutType", header)
.then(function (success) {
resolve(success);
})
.catch(function (err) {
reject(err);
});
});
};
FileSync.prototype.checkout = function () {
var _this = this;
return new Promise(function (resolve, reject) {
if (_this.config.verbose) {
gutil.log("INFO: Checking if file (" + _this.fileInfo.filename + ") is checked out");
}
_this.checkouttype()
.then(function (data) {
if (typeof data.body === "undefined" || typeof data.body.d === "undefined" || typeof data.body.d.CheckOutType === "undefined") {
resolve(data);
}
if (_this.config.verbose) {
gutil.log('INFO: File checkout type:', data.body.d.CheckOutType);
}
if (data.body.d.CheckOutType !== 0) {
var header = {
"headers": {
"content-type": "application/json;odata=verbose",
"X-RequestDigest": digestVal.digest
}
};
return _this.spr.post(_this.config.site + "/_api/web/GetFolderByServerRelativeUrl('" + _this.fileInfo.library + "')/Files('" + _this.fileInfo.filename + "')/CheckOut()", header)
.then(function (success) {
if (_this.config.verbose) {
gutil.log('INFO: File is now checked out and ready to be published');
}
resolve(success);
})
.catch(function (err) {
reject(err);
});
}
else {
resolve(data);
}
})
.catch(function (err) {
reject(err);
});
});
};
FileSync.prototype.checkin = function (deferred, type) {
var _this = this;
if (!type) {
type = 0;
}
var header = {
"headers": {
"content-type": "application/json;odata=verbose",
"X-RequestDigest": digestVal.digest
}
};
this.spr.post(this.config.site + "/_api/web/GetFolderByServerRelativeUrl('" + this.fileInfo.library + "')/Files('" + this.fileInfo.filename + "')/CheckIn(comment='Checked in via GULP', checkintype=" + type + ")", header).then(function (result) {
gutil.log(gutil.colors.green('Published file'), gutil.colors.magenta(moment().diff(_this.started, 'milliseconds').toString() + 'ms'));
deferred.resolve(result);
});
return deferred.promise;
};
return FileSync;
}());
exports.FileSync = FileSync;