UNPKG

devshare

Version:

Library to communicate with devshare development sharing platform.

239 lines (209 loc) 7.67 kB
'use strict'; 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'); };