devshare
Version:
Library to communicate with devshare development sharing platform.
239 lines (209 loc) • 7.67 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getChild = exports.search = exports.unsync = exports.sync = exports.remove = exports.update = exports.add = exports.push = exports.setWithPriority = exports.setWithMeta = exports.set = exports.get = exports.createFirebaseRef = exports.createFirebaseUrl = exports.storage = exports.init = undefined;
var _isString2 = require('lodash/isString');
var _isString3 = _interopRequireDefault(_isString2);
var _isArray2 = require('lodash/isArray');
var _isArray3 = _interopRequireDefault(_isArray2);
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _firebase = require('firebase');
var _firebase2 = _interopRequireDefault(_firebase);
var _index = require('./index');
var _config = require('../config');
var _auth = require('../auth');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* @description Initialize firebase application
*/
var init = exports.init = function init(config) {
var fbConfig = config ? _config.firebase[config.env] : _config.firebase.prod;
try {
_firebase2.default.initializeApp(fbConfig);
} catch (err) {
console.warn('You only need to initialize Firebase once', JSON.stringify(err));
}
return _firebase2.default;
};
var storage = exports.storage = function storage() {
return _firebase2.default.storage();
};
/**
* @description Handles abnormal characters within paths
* @param {Array|String} relativePath - Releative path on firebase
* @return {String} realtive url string for Firebase
*/
var createFirebaseUrl = exports.createFirebaseUrl = function createFirebaseUrl(relativePath) {
return function () {
if (!(0, _isArray3.default)(relativePath)) relativePath = [relativePath];
// TODO: Check for path not being string
return relativePath.map(function (loc) {
return loc && (0, _isString3.default)(loc) ? loc.replace(/[.]/g, ':').replace(/[#$[\]]/g, '_-_') : loc;
}).join('/');
};
};
/**
* @description Handles abnormal characters within paths
* @param {Array|String} relativePath - Releative path
* @return {Promise}
*/
var createFirebaseRef = exports.createFirebaseRef = function createFirebaseRef(relativePath) {
return function () {
return _firebase2.default.database().ref(createFirebaseUrl(relativePath)());
};
}; // eslint-disable-line new-cap
/**
* @description Get a location on Firebase
* @param {Array|String} relativePath - Releative
* @return {Promise}
*/
var get = exports.get = function get(relativePath) {
return function () {
return createFirebaseRef(relativePath)().once('value').then(function (data) {
return data.val();
});
};
};
/**
* @description Set data to a Firebase location based on array or string path
* @param {Array|String} relativePath - Releative
* @return {Promise}
*/
var set = exports.set = function set(relativePath) {
return function (object, priority) {
return createFirebaseRef(relativePath)()[priority ? 'setWithPriority' : 'set'](object).then(function (data) {
return data ? data.val() : object;
});
};
};
/**
* @description Set data to a Firebase location based on array or string path
* @param {Array|String} relativePath - Releative
* @return {Promise}
*/
var setWithMeta = exports.setWithMeta = function setWithMeta(relativePath) {
return function (object, priority) {
var setData = _extends({}, object, {
createdAt: _firebase2.default.database.ServerValue.TIMESTAMP
});
if ((0, _auth.getCurrentUser)()) {
setData.createdBy = (0, _auth.getCurrentUser)().uid;
}
return createFirebaseRef(relativePath)().set(setData).then(function (data) {
return data ? data.val() : object;
});
};
};
/**
* @description Set data to a Firebase location based on array or string path
* @param {Array|String} relativePath - Releative
* @return {Promise}
*/
var setWithPriority = exports.setWithPriority = function setWithPriority(relativePath) {
return function (object, priority) {
return createFirebaseRef(relativePath)().setWithPriority(object).then(function (data) {
return data ? data.val() : object;
});
};
};
/**
* @description Push data to a Firebase location based on array or string path
* @param {Array|String} relativePath - Releative
* @return {Promise}
*/
var push = exports.push = function push(relativePath) {
return function (object, priority) {
var pushRef = createFirebaseRef(relativePath)().push();
return pushRef[priority ? 'setWithPriority' : 'set'](object).then(function (data) {
return data ? _extends({}, { key: pushRef.key }, data) : _extends(object, { key: pushRef.key });
});
};
};
var add = exports.add = push;
/**
* @description Update data at a Firebase location based on array or string path
* @param {Array|String} relativePath - Releative
* @return {Promise}
*/
var update = exports.update = function update(relativePath) {
return function (object) {
return createFirebaseRef(relativePath)().update(object).then(function (data) {
return data ? data.val() : object;
});
};
};
/**
* @description Remove data a Firebase location based on array or string path
* @param {Array|String} relativePath - Releative
* @return {Promise}
*/
var remove = exports.remove = function remove(relativePath) {
return function () {
return createFirebaseRef(relativePath)().remove().then(function (data) {
return null;
});
};
};
/**
* @description Set data to a Firebase location based on array or string path
* @param {Array|String} relativePath - Path from Firebase root
* @return {Promise}
*/
// TODO: Allow passing of type of sync like 'child_added'
var sync = exports.sync = function sync(relativePath) {
return function (callback) {
return createFirebaseRef(relativePath)().on('value', function (data) {
return callback(_extends(data.val(), { ref: data.ref }));
});
};
};
/**
* @description Set data to a Firebase location based on array or string path
* @param {Array|String} relativePath - Path from Firebase root
* @return {Promise}
*/
var unsync = exports.unsync = function unsync(relativePath) {
return function (callback) {
createFirebaseRef(relativePath)().off('value', callback, callback);
};
};
/**
* @description Search firebase router
* @param {Array|String} relativePath - Path from Firebase root
* @return {Promise}
*/
var search = exports.search = function search(relativePath) {
return function (param, q) {
return createFirebaseRef(relativePath)().orderByChild(param).startAt(q).once('value').then(function (data) {
return data.val();
});
};
};
/**
* @description Resolve the JSON value a Firebase location's child
* @param {Array|String} relativePath - Path from Firebase root
* @return {Promise}
*/
var getChild = exports.getChild = function getChild(relativePath) {
return function (child) {
return createFirebaseRef(relativePath)().child(child).once('value').then(function (data) {
return data.val();
});
};
};
exports.default = function (url, types) {
var methods = {
get: get,
getChild: getChild,
set: set,
setWithMeta: setWithMeta,
add: add,
sync: sync,
update: update,
remove: remove,
createFirebaseUrl: createFirebaseUrl,
createFirebaseRef: createFirebaseRef
};
return (0, _index.typeReducer)(url, types, methods, 'firebaser');
};