UNPKG

devshare

Version:

Library to communicate with devshare development sharing platform.

1,264 lines (1,037 loc) 1.07 MB
/*! devshare.js v0.4.0-alpha | (c) Prescott Prue */ (function webpackUniversalModuleDefinition(root, factory) { if(typeof exports === 'object' && typeof module === 'object') module.exports = factory(require("firepad")); else if(typeof define === 'function' && define.amd) define(["firepad"], factory); else if(typeof exports === 'object') exports["Devshare"] = factory(require("firepad")); else root["Devshare"] = factory(root["Firepad"]); })(this, function(__WEBPACK_EXTERNAL_MODULE_150__) { return /******/ (function(modules) { // webpackBootstrap /******/ // The module cache /******/ var installedModules = {}; /******/ // The require function /******/ function __webpack_require__(moduleId) { /******/ // Check if module is in cache /******/ if(installedModules[moduleId]) /******/ return installedModules[moduleId].exports; /******/ // Create a new module (and put it into the cache) /******/ var module = installedModules[moduleId] = { /******/ exports: {}, /******/ id: moduleId, /******/ loaded: false /******/ }; /******/ // Execute the module function /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); /******/ // Flag the module as loaded /******/ module.loaded = true; /******/ // Return the exports of the module /******/ return module.exports; /******/ } /******/ // expose the modules object (__webpack_modules__) /******/ __webpack_require__.m = modules; /******/ // expose the module cache /******/ __webpack_require__.c = installedModules; /******/ // __webpack_public_path__ /******/ __webpack_require__.p = "/dist/"; /******/ // Load entry module and return exports /******/ return __webpack_require__(0); /******/ }) /************************************************************************/ /******/ ([ /* 0 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.templates = exports.template = exports.init = exports.getCurrentUser = exports.signup = exports.logout = exports.login = exports.authWithProvider = exports.auth = exports.users = exports.user = exports.projects = exports.project = undefined; 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 _projects2 = __webpack_require__(1); var _projects3 = _interopRequireDefault(_projects2); var _project2 = __webpack_require__(31); var _project3 = _interopRequireDefault(_project2); var _users2 = __webpack_require__(276); var _users3 = _interopRequireDefault(_users2); var _user2 = __webpack_require__(275); var _user3 = _interopRequireDefault(_user2); var _auth2 = __webpack_require__(3); var _auth3 = _interopRequireDefault(_auth2); var _templates = __webpack_require__(269); var _templates2 = _interopRequireDefault(_templates); var _template = __webpack_require__(268); var _template2 = _interopRequireDefault(_template); var _firebaser = __webpack_require__(140); var _firebase = __webpack_require__(25); var _firebase2 = _interopRequireDefault(_firebase); var _config = __webpack_require__(2); var _config2 = _interopRequireDefault(_config); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var devshare = { projects: _projects3.default, project: _project3.default, users: _users3.default, user: _user3.default, templates: _templates2.default, template: _template2.default, init: _firebaser.init, firebase: _firebase2.default, constants: _config2.default }; exports.default = _extends({}, devshare, _auth3.default); var project = exports.project = _project3.default; var projects = exports.projects = _projects3.default; var user = exports.user = _user3.default; var users = exports.users = _users3.default; var auth = exports.auth = _auth3.default; var authWithProvider = _auth3.default.authWithProvider, login = _auth3.default.login, logout = _auth3.default.logout, signup = _auth3.default.signup, getCurrentUser = _auth3.default.getCurrentUser; exports.authWithProvider = authWithProvider; exports.login = login; exports.logout = logout; exports.signup = signup; exports.getCurrentUser = getCurrentUser; exports.init = _firebaser.init; exports.template = _template2.default; exports.templates = _templates2.default; /***/ }), /* 1 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); 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 _config = __webpack_require__(2); var _auth = __webpack_require__(3); var _template = __webpack_require__(268); var _template2 = _interopRequireDefault(_template); var _firebaser = __webpack_require__(140); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } exports.default = function (username) { var addProject = function addProject(project) { if (!project.name) return Promise.reject('Name is required.'); if (project.name.match(/[/\s]/g)) { return Promise.reject('Name may not contain spaces.'); } if (project.name.match(/[.$#[\]/]/g)) { return Promise.reject('Name may contain letters and symbols except for ., $, #, [, ], /.'); } var currentUser = (0, _auth.getCurrentUser)(); if (!currentUser || !currentUser.uid) { console.error('You must be logged in to create a project'); return Promise.reject('You must be logged in to create a project'); } // TODO: Handle project owner being username or uid // TODO: Handle project owner being object // TODO: Handle project owner not being provided // if (!project.owner) { // get([paths.projects, currentUser.uid, 'username'])().then(username => ) // } // Check for existance of project name return (0, _firebaser.get)([_config.paths.projects, username || project.owner, project.name])().then(function (loadedProject) { return ( // Push new project to projects list if it does not already exist loadedProject && loadedProject.name === project.name ? Promise.reject('Error adding project: User already has a project named ' + project.name) : (0, _firebaser.setWithMeta)([_config.paths.projects, username || project.owner, project.name])(project).then(function (newProject) { return ( // get list of projects within user (0, _firebaser.get)([_config.paths.users, currentUser.uid, _config.paths.projects])().then(function (projectsList) { return projectsList === null ? (0, _firebaser.set)([_config.paths.users, currentUser.uid, _config.paths.projects])([project.name]).then(function () { return project; }) : (0, _firebaser.set)([_config.paths.users, currentUser.uid, _config.paths.projects, projectsList.length])(project.name).then(function () { return project; }); }) ); }) ); }); }; var methods = { search: function search(query) { return username ? (0, _firebaser.search)([_config.paths.projects, username])('name', query) : (0, _firebaser.search)(_config.paths.projects)('name', query); }, get: function get() { return (0, _firebaser.get)([_config.paths.usernames, username])().then(function (uid) { return (0, _firebaser.get)([_config.paths.projects, uid])(); }); }, add: addProject, addFromTemplate: function addFromTemplate(templateName, project) { return (0, _firebaser.get)([_config.paths.usernames, (0, _auth.getCurrentUser)().uid])().then(function (username) { return addProject(_extends({}, project, { owner: username })).then(function (newProject) { return (0, _template2.default)(templateName).copyToProject(username, newProject.name); }); }); } }; return _extends({}, methods); }; module.exports = exports['default']; /***/ }), /* 2 */ /***/ (function(module, exports) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = { paths: { files: 'files', users: 'users', uids: 'uids', projects: 'projects', projectNames: 'projectNames', usernames: 'usernames', requests: 'requests', templateFiles: 'templateFiles', templates: 'templates' }, github: { apiUrl: 'https://api.github.com' }, firebase: { prod: { apiKey: 'AIzaSyBQw-StxUsUhoQwZqaawegUFO7YOyG_HDA', authDomain: 'devshare-1.firebaseapp.com', databaseURL: 'https://devshare-1.firebaseio.com', storageBucket: 'devshare-1.appspot.com' }, stg: { apiKey: 'AIzaSyBuwR21cO0lMzMr_T-Dl_jG1dsORXZ1fwY', authDomain: 'devshare-stg.firebaseapp.com', databaseURL: 'https://devshare-stg.firebaseio.com', storageBucket: 'devshare-stg.appspot.com' }, int: { apiKey: 'AIzaSyDiVbMbj7nPXTBXxZlr_HiZ2AOY7yXWkYY', authDomain: 'devshare-int.firebaseapp.com', databaseURL: 'https://devshare-int.firebaseio.com', storageBucket: 'devshare-int.appspot.com' }, dev: { apiKey: 'AIzaSyDiVbMbj7nPXTBXxZlr_HiZ2AOY7yXWkYY', authDomain: 'devshare-int.firebaseapp.com', databaseURL: 'https://devshare-int.firebaseio.com', storageBucket: 'devshare-int.appspot.com' } }, highlightColors: ['#FF0000', '#FF00F1', '#F1C40F', '#D35400', '#FF08', '#2980B9', '#9B59B6'], zipSuffix: '-devShare-export' }; module.exports = exports['default']; /***/ }), /* 3 */ /***/ (function(module, exports, __webpack_require__) { 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.updateEmail = exports.updateUser = exports.getCurrentUser = exports.signup = exports.logout = exports.login = exports.createUserProfile = undefined; var _capitalize2 = __webpack_require__(4); var _capitalize3 = _interopRequireDefault(_capitalize2); 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 = __webpack_require__(25); var _firebase2 = _interopRequireDefault(_firebase); var _project = __webpack_require__(31); var _project2 = _interopRequireDefault(_project); var _firebaser = __webpack_require__(140); var _cruder = __webpack_require__(143); var _config = __webpack_require__(2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } /** * @description Get correct login method and params order based on provided credentials * @param {Object} credentials - Login credentials * @param {String} credentials.email - Email to login with (only needed for email login) * @param {String} credentials.password - Password to login with (only needed for email login) * @param {String} credentials.provider - Provider name such as google, twitter * @param {String} credentials.type - Popup or redirect (only needed for 3rd party provider login) * @param {String} credentials.token - Custom or provider token */ var getLoginMethodAndParams = function getLoginMethodAndParams(_ref) { var email = _ref.email, password = _ref.password, provider = _ref.provider, type = _ref.type, token = _ref.token; if (provider) { if (token) { return { method: 'signInWithCredential', params: [provider, token] }; } var authProvider = new _firebase2.default.auth[(0, _capitalize3.default)(provider) + 'AuthProvider'](); authProvider.addScope('email'); if (provider.toLowerCase() === 'github') { authProvider.addScope('user'); authProvider.addScope('repo'); } if (type === 'popup') { return { method: 'signInWithPopup', params: [authProvider] }; } return { method: 'signInWithRedirect', params: [authProvider] }; } if (token) { return { method: 'signInWithCustomToken', params: [token] }; } return { method: 'signInWithEmailAndPassword', params: [email, password] }; }; /** * @description Create new user account * @param {Object} userInfo - Object containing signup data * @param {String} userInfo.username - Username of new user * @param {String} userInfo.displayName - Display name of new user * @param {String} userInfo.email - Email of new user * @param {String} userInfo.avatarUrl - Url of avatar image * @param {String} userInfo.uid - User's uid * @param {Array} userInfo.providerData - Data from external provider accounts */ var profileFromUserData = function profileFromUserData(_ref2) { var email = _ref2.email, username = _ref2.username, avatarUrl = _ref2.avatarUrl, providerData = _ref2.providerData, uid = _ref2.uid; var data = providerData && providerData[0]; if (!username) username = data.email.split('@')[0].replace(/[^\w\s]/gi, ''); if (data.photoURL) { avatarUrl = data.photoURL; } var profile = { email: email, username: username }; if (providerData) { profile.providerData = {}; var _data = providerData[0]; profile.providerData[_data.providerId.split('.')[0]] = _data; } if (avatarUrl) profile.avatarUrl = avatarUrl; profile.uid = uid; return profile; }; /** * @description Create new user account * @param {Object} userInfo - Object containing signup data * @param {String} userInfo.username - Username of new user * @param {String} userInfo.displayName - Display name of new user * @param {String} userInfo.email - Email of new user */ var createUserProfile = exports.createUserProfile = function createUserProfile(newUser) { // TODO: Verify that username does not already exist var profile = profileFromUserData(newUser); return (0, _firebaser.get)([_config.paths.users, newUser.uid])().then(function (loadedProfile) { return ( // Only write profile if it does not already exist loadedProfile || Promise.all([(0, _firebaser.set)([_config.paths.users, newUser.uid])(profile), (0, _firebaser.set)([_config.paths.usernames, newUser.uid])(profile.username), (0, _firebaser.set)([_config.paths.uids, profile.username])(newUser.uid)]).then(function () { return profile; }) ); }); }; /** * @description Login/Authenticate as a user * @param {String|Object} username - Username or email of user to login as. * Or object containing username, password, and project (optional) * @param {String} password - Password of user to login as * @param {String} project - Name of project to clone to account after login (optional) */ var login = exports.login = function login(credentials, projectName) { var _firebase$auth; if (!credentials.email && !credentials.username && !credentials.provider) { return Promise.reject({ message: 'Username/Email or Provider is required to login ' }); } var _getLoginMethodAndPar = getLoginMethodAndParams(credentials), method = _getLoginMethodAndPar.method, params = _getLoginMethodAndPar.params; // TODO: Username login // if (method === 'signInWithEmailAndPassword' && !credentials.email) { // devshare.firebase.database().ref().child(devshare._.config.usernames) // } return (_firebase$auth = _firebase2.default.auth())[method].apply(_firebase$auth, _toConsumableArray(params)).then(function (userData) { // Get username from Github API if provider is github if (userData.credential && userData.credential.provider === 'github.com') { return (0, _cruder.getWithHeaders)(_config.github.apiUrl + '/user')({ Authorization: 'token ' + userData.credential.accessToken }).then(function (_ref3) { var login = _ref3.login; userData.user.username = login; return userData; }); } return userData; }).then(function (userData) { return ( // For email auth return uid (createUser is used for creating a profile) userData.email ? userData : createUserProfile(userData.user) ); }).then(function (user) { return ( // If project name is included, clone project !projectName ? user : (0, _project2.default)('anon', projectName).clone(user.username, projectName).then(function (cloneRes) { return user; }).catch(function (error) { return _extends(user, { error: error }); }) ); }); }; /** * @description Logout of currently logged in user */ var logout = exports.logout = function logout() { return _firebase2.default.auth().signOut(); }; /** * @description Signup and login as a new user * @param {Object} userInfo - Object containing signup data * @param {String} userInfo.username - Username of new user * @param {String} userInfo.email - Email of new user * @param {String} userInfo.displayName - Display name of new user * @param {String} userInfo.password - Password of new user * @param {String} userInfo.project - Name of project to clone to account after signup (optional) */ var signup = exports.signup = function signup(_ref4, projectName) { var username = _ref4.username, email = _ref4.email, password = _ref4.password, project = _ref4.project, name = _ref4.name, provider = _ref4.provider; if (!email || !username || !password) { return Promise.reject('email, username and password are required'); } // Handle spaces in username if (username.match(/[/\s]/g)) { return Promise.reject('Username may not contain spaces'); } // Handle symbols in username if (username.match(/[.$#[\]/]/g)) { return Promise.reject('Username may contain symbols except for ., $, #, [, ], /'); } // Handle clone project name as part of first param if (project) projectName = project; // Set name to username if not provided if (!name) name = username; // Handle external provider signup if (provider) { return login({ provider: provider }, projectName); } return _firebase2.default.auth().createUserWithEmailAndPassword(email, password).then(function (_ref5) { var providerData = _ref5.providerData, uid = _ref5.uid; return createUserProfile({ username: username, email: email, name: name, providerData: providerData, uid: uid }).then(function (newUser) { return !projectName ? newUser : project('anon', projectName).clone(username, projectName).then(function (cloneRes) { return newUser; }); }); }); }; var getCurrentUser = exports.getCurrentUser = function getCurrentUser() { return _firebase2.default.auth().currentUser; }; /** * @description Update user profile in firebase auuth and users path * @param {Object} userInfo - Object containing signup data * @param {String} userInfo.username - Username of new user * @param {String} userInfo.email - Email of new user * @param {String} userInfo.displayName - Display name of new user */ var updateUser = exports.updateUser = function updateUser(newUserData) { var currentUser = getCurrentUser(); return currentUser.updateProfile(newUserData).then(function () { return (0, _firebaser.update)([_config.paths.users, currentUser.uid])(newUserData); }).then(function () { return currentUser; }); }; /** * @description Update user email * @param {String} email - New email for current user */ var updateEmail = exports.updateEmail = function updateEmail(newEmail) { var currentUser = getCurrentUser(); return currentUser.updateEmail(newEmail).then(function () { return (0, _firebaser.update)([_config.paths.users, currentUser.uid])({ email: newEmail }); }).then(function () { return currentUser; }); }; exports.default = { getCurrentUser: getCurrentUser, updateUser: updateUser, updateEmail: updateEmail, login: login, logout: logout, signup: signup }; /***/ }), /* 4 */ /***/ (function(module, exports, __webpack_require__) { var toString = __webpack_require__(5), upperFirst = __webpack_require__(17); /** * Converts the first character of `string` to upper case and the remaining * to lower case. * * @static * @memberOf _ * @since 3.0.0 * @category String * @param {string} [string=''] The string to capitalize. * @returns {string} Returns the capitalized string. * @example * * _.capitalize('FRED'); * // => 'Fred' */ function capitalize(string) { return upperFirst(toString(string).toLowerCase()); } module.exports = capitalize; /***/ }), /* 5 */ /***/ (function(module, exports, __webpack_require__) { var baseToString = __webpack_require__(6); /** * Converts `value` to a string. An empty string is returned for `null` * and `undefined` values. The sign of `-0` is preserved. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {string} Returns the converted string. * @example * * _.toString(null); * // => '' * * _.toString(-0); * // => '-0' * * _.toString([1, 2, 3]); * // => '1,2,3' */ function toString(value) { return value == null ? '' : baseToString(value); } module.exports = toString; /***/ }), /* 6 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(7), arrayMap = __webpack_require__(10), isArray = __webpack_require__(11), isSymbol = __webpack_require__(12); /** Used as references for various `Number` constants. */ var INFINITY = 1 / 0; /** Used to convert symbols to primitives and strings. */ var symbolProto = Symbol ? Symbol.prototype : undefined, symbolToString = symbolProto ? symbolProto.toString : undefined; /** * The base implementation of `_.toString` which doesn't convert nullish * values to empty strings. * * @private * @param {*} value The value to process. * @returns {string} Returns the string. */ function baseToString(value) { // Exit early for strings to avoid a performance hit in some environments. if (typeof value == 'string') { return value; } if (isArray(value)) { // Recursively convert values (susceptible to call stack limits). return arrayMap(value, baseToString) + ''; } if (isSymbol(value)) { return symbolToString ? symbolToString.call(value) : ''; } var result = (value + ''); return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result; } module.exports = baseToString; /***/ }), /* 7 */ /***/ (function(module, exports, __webpack_require__) { var root = __webpack_require__(8); /** Built-in value references. */ var Symbol = root.Symbol; module.exports = Symbol; /***/ }), /* 8 */ /***/ (function(module, exports, __webpack_require__) { var freeGlobal = __webpack_require__(9); /** Detect free variable `self`. */ var freeSelf = typeof self == 'object' && self && self.Object === Object && self; /** Used as a reference to the global object. */ var root = freeGlobal || freeSelf || Function('return this')(); module.exports = root; /***/ }), /* 9 */ /***/ (function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {/** Detect free variable `global` from Node.js. */ var freeGlobal = typeof global == 'object' && global && global.Object === Object && global; module.exports = freeGlobal; /* WEBPACK VAR INJECTION */}.call(exports, (function() { return this; }()))) /***/ }), /* 10 */ /***/ (function(module, exports) { /** * A specialized version of `_.map` for arrays without support for iteratee * shorthands. * * @private * @param {Array} [array] The array to iterate over. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the new mapped array. */ function arrayMap(array, iteratee) { var index = -1, length = array == null ? 0 : array.length, result = Array(length); while (++index < length) { result[index] = iteratee(array[index], index, array); } return result; } module.exports = arrayMap; /***/ }), /* 11 */ /***/ (function(module, exports) { /** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */ var isArray = Array.isArray; module.exports = isArray; /***/ }), /* 12 */ /***/ (function(module, exports, __webpack_require__) { var baseGetTag = __webpack_require__(13), isObjectLike = __webpack_require__(16); /** `Object#toString` result references. */ var symbolTag = '[object Symbol]'; /** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */ function isSymbol(value) { return typeof value == 'symbol' || (isObjectLike(value) && baseGetTag(value) == symbolTag); } module.exports = isSymbol; /***/ }), /* 13 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(7), getRawTag = __webpack_require__(14), objectToString = __webpack_require__(15); /** `Object#toString` result references. */ var nullTag = '[object Null]', undefinedTag = '[object Undefined]'; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * The base implementation of `getTag` without fallbacks for buggy environments. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */ function baseGetTag(value) { if (value == null) { return value === undefined ? undefinedTag : nullTag; } return (symToStringTag && symToStringTag in Object(value)) ? getRawTag(value) : objectToString(value); } module.exports = baseGetTag; /***/ }), /* 14 */ /***/ (function(module, exports, __webpack_require__) { var Symbol = __webpack_require__(7); /** Used for built-in method references. */ var objectProto = Object.prototype; /** Used to check objects for own properties. */ var hasOwnProperty = objectProto.hasOwnProperty; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** Built-in value references. */ var symToStringTag = Symbol ? Symbol.toStringTag : undefined; /** * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values. * * @private * @param {*} value The value to query. * @returns {string} Returns the raw `toStringTag`. */ function getRawTag(value) { var isOwn = hasOwnProperty.call(value, symToStringTag), tag = value[symToStringTag]; try { value[symToStringTag] = undefined; var unmasked = true; } catch (e) {} var result = nativeObjectToString.call(value); if (unmasked) { if (isOwn) { value[symToStringTag] = tag; } else { delete value[symToStringTag]; } } return result; } module.exports = getRawTag; /***/ }), /* 15 */ /***/ (function(module, exports) { /** Used for built-in method references. */ var objectProto = Object.prototype; /** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */ var nativeObjectToString = objectProto.toString; /** * Converts `value` to a string using `Object.prototype.toString`. * * @private * @param {*} value The value to convert. * @returns {string} Returns the converted string. */ function objectToString(value) { return nativeObjectToString.call(value); } module.exports = objectToString; /***/ }), /* 16 */ /***/ (function(module, exports) { /** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */ function isObjectLike(value) { return value != null && typeof value == 'object'; } module.exports = isObjectLike; /***/ }), /* 17 */ /***/ (function(module, exports, __webpack_require__) { var createCaseFirst = __webpack_require__(18); /** * Converts the first character of `string` to upper case. * * @static * @memberOf _ * @since 4.0.0 * @category String * @param {string} [string=''] The string to convert. * @returns {string} Returns the converted string. * @example * * _.upperFirst('fred'); * // => 'Fred' * * _.upperFirst('FRED'); * // => 'FRED' */ var upperFirst = createCaseFirst('toUpperCase'); module.exports = upperFirst; /***/ }), /* 18 */ /***/ (function(module, exports, __webpack_require__) { var castSlice = __webpack_require__(19), hasUnicode = __webpack_require__(21), stringToArray = __webpack_require__(22), toString = __webpack_require__(5); /** * Creates a function like `_.lowerFirst`. * * @private * @param {string} methodName The name of the `String` case method to use. * @returns {Function} Returns the new case function. */ function createCaseFirst(methodName) { return function(string) { string = toString(string); var strSymbols = hasUnicode(string) ? stringToArray(string) : undefined; var chr = strSymbols ? strSymbols[0] : string.charAt(0); var trailing = strSymbols ? castSlice(strSymbols, 1).join('') : string.slice(1); return chr[methodName]() + trailing; }; } module.exports = createCaseFirst; /***/ }), /* 19 */ /***/ (function(module, exports, __webpack_require__) { var baseSlice = __webpack_require__(20); /** * Casts `array` to a slice if it's needed. * * @private * @param {Array} array The array to inspect. * @param {number} start The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the cast slice. */ function castSlice(array, start, end) { var length = array.length; end = end === undefined ? length : end; return (!start && end >= length) ? array : baseSlice(array, start, end); } module.exports = castSlice; /***/ }), /* 20 */ /***/ (function(module, exports) { /** * The base implementation of `_.slice` without an iteratee call guard. * * @private * @param {Array} array The array to slice. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the slice of `array`. */ function baseSlice(array, start, end) { var index = -1, length = array.length; if (start < 0) { start = -start > length ? 0 : (length + start); } end = end > length ? length : end; if (end < 0) { end += length; } length = start > end ? 0 : ((end - start) >>> 0); start >>>= 0; var result = Array(length); while (++index < length) { result[index] = array[index + start]; } return result; } module.exports = baseSlice; /***/ }), /* 21 */ /***/ (function(module, exports) { /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', rsComboMarksRange = '\\u0300-\\u036f', reComboHalfMarksRange = '\\ufe20-\\ufe2f', rsComboSymbolsRange = '\\u20d0-\\u20ff', rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsZWJ = '\\u200d'; /** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */ var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']'); /** * Checks if `string` contains Unicode symbols. * * @private * @param {string} string The string to inspect. * @returns {boolean} Returns `true` if a symbol is found, else `false`. */ function hasUnicode(string) { return reHasUnicode.test(string); } module.exports = hasUnicode; /***/ }), /* 22 */ /***/ (function(module, exports, __webpack_require__) { var asciiToArray = __webpack_require__(23), hasUnicode = __webpack_require__(21), unicodeToArray = __webpack_require__(24); /** * Converts `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function stringToArray(string) { return hasUnicode(string) ? unicodeToArray(string) : asciiToArray(string); } module.exports = stringToArray; /***/ }), /* 23 */ /***/ (function(module, exports) { /** * Converts an ASCII `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function asciiToArray(string) { return string.split(''); } module.exports = asciiToArray; /***/ }), /* 24 */ /***/ (function(module, exports) { /** Used to compose unicode character classes. */ var rsAstralRange = '\\ud800-\\udfff', rsComboMarksRange = '\\u0300-\\u036f', reComboHalfMarksRange = '\\ufe20-\\ufe2f', rsComboSymbolsRange = '\\u20d0-\\u20ff', rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange, rsVarRange = '\\ufe0e\\ufe0f'; /** Used to compose unicode capture groups. */ var rsAstral = '[' + rsAstralRange + ']', rsCombo = '[' + rsComboRange + ']', rsFitz = '\\ud83c[\\udffb-\\udfff]', rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')', rsNonAstral = '[^' + rsAstralRange + ']', rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}', rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]', rsZWJ = '\\u200d'; /** Used to compose unicode regexes. */ var reOptMod = rsModifier + '?', rsOptVar = '[' + rsVarRange + ']?', rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*', rsSeq = rsOptVar + reOptMod + rsOptJoin, rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')'; /** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */ var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g'); /** * Converts a Unicode `string` to an array. * * @private * @param {string} string The string to convert. * @returns {Array} Returns the converted array. */ function unicodeToArray(string) { return string.match(reUnicode) || []; } module.exports = unicodeToArray; /***/ }), /* 25 */ /***/ (function(module, exports, __webpack_require__) { /** * Firebase libraries for browser - npm package. * * Usage: * * firebase = require('firebase'); */ var firebase = __webpack_require__(26); __webpack_require__(27); __webpack_require__(28); __webpack_require__(29); __webpack_require__(30); module.exports = firebase; /***/ }), /* 26 */ /***/ (function(module, exports) { /* WEBPACK VAR INJECTION */(function(global) {var firebase = (function(){ /*! @license Firebase v3.7.0 Build: 3.7.0-rc.2 Terms: https://firebase.google.com/terms/ */ var firebase = null; (function() { var aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(c.get||c.set)throw new TypeError("ES3 does not support getters and setters.");a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},k="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this,l=function(){l=function(){};k.Symbol||(k.Symbol=ba)},ca=0,ba=function(a){return"jscomp_symbol_"+(a||"")+ca++},n=function(){l();var a=k.Symbol.iterator;a||(a=k.Symbol.iterator= k.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&aa(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return m(this)}});n=function(){}},m=function(a){var b=0;return da(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})},da=function(a){n();a={next:a};a[k.Symbol.iterator]=function(){return this};return a},q=this,r=function(){},t=function(a){var b=typeof a;if("object"==b)if(a){if(a instanceof Array)return"array";if(a instanceof Object)return b;var c=Object.prototype.toString.call(a); if("[object Window]"==c)return"object";if("[object Array]"==c||"number"==typeof a.length&&"undefined"!=typeof a.splice&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("splice"))return"array";if("[object Function]"==c||"undefined"!=typeof a.call&&"undefined"!=typeof a.propertyIsEnumerable&&!a.propertyIsEnumerable("call"))return"function"}else return"null";else if("function"==b&&"undefined"==typeof a.call)return"object";return b},v=function(a){return"function"==t(a)},ea=function(a, b,c){return a.call.apply(a.bind,arguments)},fa=function(a,b,c){if(!a)throw Error();if(2<arguments.length){var d=Array.prototype.slice.call(arguments,2);return function(){var c=Array.prototype.slice.call(arguments);Array.prototype.unshift.apply(c,d);return a.apply(b,c)}}return function(){return a.apply(b,arguments)}},w=function(a,b,c){w=Function.prototype.bind&&-1!=Function.prototype.bind.toString().indexOf("native code")?ea:fa;return w.apply(null,arguments)},x=function(a,b){var c=Array.prototype.slice.call(arguments, 1);return function(){var b=c.slice();b.push.apply(b,arguments);return a.apply(this,b)}},y=function(a,b){function c(){}c.prototype=b.prototype;a.ha=b.prototype;a.prototype=new c;a.prototype.constructor=a;a.base=function(a,c,h){for(var e=Array(arguments.length-2),d=2;d<arguments.length;d++)e[d-2]=arguments[d];return b.prototype[c].apply(a,e)}};var A;A="undefined"!==typeof window?window:"undefined"!==typeof self?self:global; var __extends=function(a,b){function c(){this.constructor=a}for(var d in b)b.hasOwnProperty(d)&&(a[d]=b[d]);a.prototype=null===b?Object.create(b):(c.prototype=b.prototype,new c)},__assign=Object.assign||function(a){for(var b,c=1,d=arguments.length;c<d;c++){b=arguments[c];for(var e in b)Object.prototype.hasOwnProperty.call(b,e)&&(a[e]=b[e])}return a},__rest=function(a,b){var c={},d;for(d in a)Object.prototype.hasOwnProperty.call(a,d)&&0>b.indexOf(d)&&(c[d]=a[d]);if(null!=a&&"function"===typeof Object.getOwnPropertySymbols){var e= 0;for(d=Object.getOwnPropertySymbols(a);e<d.length;e++)0>b.indexOf(d[e])&&(c[d[e]]=a[d[e]])}return c},__decorate=function(a,b,c,d){var e=arguments.length,h=3>e?b:null===d?d=Object.getOwnPropertyDescriptor(b,c):d,g;g=A.Reflect;if("object"===typeof g&&"function"===typeof g.decorate)h=g.decorate(a,b,c,d);else for(var f=a.length-1;0<=f;f--)if(g=a[f])h=(3>e?g(h):3<e?g(b,c,h):g(b,c))||h;return 3<e&&h&&Object.defineProperty(b,c,h),h},__metadata=function(a,b){var c=A.Reflect;if("object"===typeof c&&"function"=== typeof c.metadata)return c.metadata(a,b)},__param=function(a,b){return function(c,d){b(c,d,a)}},__awaiter=function(a,b,c,d){return new (c||(c=Promise))(function(e,h){function g(a){try{p(d.next(a))}catch(u){h(u)}}function f(a){try{p(d["throw"](a))}catch(u){h(u)}}function p(a){a.done?e(a.value):(new c(function(b){b(a.value)})).then(g,f)}p((d=d.apply(a,b)).next())})},__generator=function(a,b){function c(a){return function(b){return d([a,b])}}function d(c){if(h)throw new TypeError("Generator is already executing."); for(;e;)try{if(h=1,g&&(f=g[c[0]&2?"return":c[0]?"throw":"next"])&&!(f=f.call(g,c[1])).done)return f;if(g=0,f)c=[0,f.value];switch(c[0]){case 0:case 1:f=c;break;case 4:return e.label++,{value:c[1],done:!1};case 5:e.label++;g=c[1];c=[0];continue;case 7:c=e.G.pop();e.I.pop();continue;default:if(!(f=e.I,f=0<f.length&&f[f.length-1])&&(6===c[0]||2===c[0])){e=0;continue}if(3===c[0]&&(!f||c[1]>f[0]&&c[1]<f[3]))e.label=c[1];else if(6===c[0]&&e.label<f[1])e.label=f[1],f=c;else if(f&&e.label<f[2])e.label=f[2], e.G.push(c);else{f[2]&&e.G.pop();e.I.pop();continue}}c=b.call(a,e)}catch(z){c=[6,z],g=0}finally{h=f=0}if(c[0]&5)throw c[1];return{value:c[0]?c[1]:void 0,done:!0}}var e={label:0,ga:function(){if(f[0]&1)throw f[1];return f[1]},I:[],G:[]},h,g,f;return{next:c(0),"throw":c(1),"return":c(2)}}; "undefined"!==typeof A.S&&A.S||(A.__extends=__extends,A.__assign=__assign,A.__rest=__rest,A.__extends=__extends,A.__decorate=__decorate,A.__metadata=__metadata,A.__param=__param,A.__awaiter=__awaiter,A.__generator=__generator);var B=function(a){if(Error.captureStackTrace)Error.captureStackTrace(this,B);else{var b=Error().stack;b&&(this.stack=b)}a&&(this.message=String(a))};y(B,Error);B.prototype.name="CustomError";var ga=function(a,b){for(var c=a.split("%s"),d="",e=Array.prototype.slice.call(arguments,1);e.length&&1<c.length;)d+=c.shift()+e.shift();return d+c.join("%s")};var C=function(a,b){b.unshift(a);B.call(this,ga.apply(null,b));b.shift()};y(C,B);C.prototype.name="AssertionError";var ha=function(a,b,c,d){var e="Assertion failed";if(c)var e=e+(": "+c),h=d;else a&&(e+=": "+a,h=b);throw new C(""+e,h||[]);},D=function(a,b,c){a||ha("",null,b,Array.prototype.slice.call(arguments,2))},E=function(a,b,c){v(a)||ha("Expected function but got %s: %s.",[t(a),a],b,Array.prototype.slice.call(arguments,2))};var F=function(a,b,c){this.Y=c;this.T=a;this.Z=b;this.s=0;this.o=null};F.prototype.get=function(){var a;0<this.s?(this.s--,a=this.o,this.o=a.next,a.next=null):a=this.T();return a};F.prototype.put=function(a){this.Z(a);this.s<this.Y&&(this.s++,a.next=this.o,this.o=a)};var G;a:{var ia=q.navigator;if(ia){var ja=ia.userAgent;if(ja){G=ja;break a}}G=""};var ka=function(a){q.setTimeout(function(){throw a;},0)},H,la=function(){var a=q.MessageChannel;"undefined"===typeof a&&"undefined"!==typeof window&&window.postMessage&&window.addEventListener&&-1==G.indexOf("Presto")&&(a=function(){var a=document.createElement("IFRAME");a.style.display="none";a.src="";document.documentElement.appendChild(a);var b=a.contentWindow,a=b.document;a.open();a.write("");a.close();var c="callImmediate"+Math.random(),d="file:"==b.location.protocol?"*":b.location.protocol+ "//"+b.location.host,a=w(function(a){if(("*"==d||a.origin==d)&&a.data==c)this.port1.onmessage()},this);b.addEventListener("message",a,!1);this.port1={};this.port2={postMessage:function(){b.postMessage(c,d)}}});if("undefined"!==typeof a&&-1==G.indexOf("Trident")&&-1==G.indexOf("MSIE")){var b=new a,c={},d=c;b.port1.onmessage=function(){if(void 0!==c.next){c=c.next;var a=c.J;c.J=null;a()}};return function(a){d.next={J:a};d=d.next;b.port2.postMessage(0)}}return"undefined"!==typeof document&&"onreadystatechange"in document.createElement("SCRIPT")?function(a){var b=document.createElement("SCRIPT");b.onreadystatechange=function(){b.onreadystatechange=null;b.parentNode.removeChild(b);b=null;a();a=null};document.documentElement.appendChild(b)}:function(a){q.setTimeout(a,0)}};var I=function(){this.v=this.g=null},ma=new F(function(){return new J},function(a){a.reset()},100);I.prototype.add=function(a,b){var c=ma.get();c.set(a,b);this.v?this.v.next=c:(D(!this.g),this.g=c);this.v=c};I.prototype.remove=function(){var a=null;this.g&&(a=this.g,this.g=this.g.next,this.g||(this.v=null),a.next=null);return a};var J=function(){this.next=this.scope=this.B=null};J.prototype.set=function(a,b){this.B=a;this.scope=b;this.next=null}; J.prototype.reset=function(){this.next=this.scope=this.B=null};var M=function(a,b){K||na();L||(K(),L=!0);oa.add(a,b)},K,na=function(){if(-1!=String(q.Promise).indexOf("[native code]")){var a=q.Promise.resolve(void 0);K=function(){a.then(pa)}}else K=function(){var a=pa;!v(q.setImmediate)||q.Window&&q.Window.prototype&&-1==G.indexOf("Edge")&&q.Window.prototype.setImmediate==q.setImmediate?(H||(H=la()),H(a)):q.setImmediate(a)}},L=!1,oa=new I,pa=function(){for(var a;a=oa.remove();){try{a.B.call(a.scope)}catch(b){ka(b)}ma.put(a)}L=!1};var O=function(a,b){this.b=0;this.R=void 0;this.j=this.h=this.u=null;this.m=this.A=!1;if(a!=r)try{var c=this;a.call(b,function(a){N(c,2,a)},function(a){try{if(a instanceof Error)throw a;throw Error("Promise rejected.");}catch(e){}N(c,3,a)})}catch(d){N(this,3,d)}},qa=function(){this.next=this.context=this.i=this.f=this.child=null;this.w=!1};qa.prototype.reset=function(){this.context=this.i=this.f=this.child=null;this.w=!1}; var ra=new F(function(){return new qa},function(a){a.reset()},100),sa=function(a,b,c){var d=ra.get();d.f=a;d.i=b;d.context=c;return d},ua=function(a,b,c){ta(a,b,c,null)||M(x(b,a))};O.prototype.then=function(a,b,c){null!=a&&E(a,"opt_onFulfilled should be a function.");null!=b&&E(b,"opt_onRejected should be a function. Did you pass opt_context as the second argument instead of the third?");return va(this,v(a)?a:null,v(b)?b:null,c)};O.prototype.then=O.prototype.then;O.prototype.$goog_Thenable=!0; O.prototype.ba=function(a,b){return va(this,null,a,b)};var xa=function(a,b){a.h||2!=a.b&&3!=a.b||wa(a);D(null!=b.f);a.j?a.j.next=b:a.h=b;a.j=b},va=function(a,b,c,d){var e=sa(null,null,null);e.child=new O(function(a,g){e.f=b?function(c){try{var e=b.call(d,c);a(e)}catch(z){g(z)}}:a;e.i=c?function(b){try{var e=c.call(d,b);a(e)}catch(z){g(z)}}:g});e.child.u=a;xa(a,e);return e.child};O.prototype.da=function(a){D(1==this.b);this.b=0;N(this,2,a)}; O.prototype.ea=function(a){D(1==this.b);this.b=0;N(this,3,a)}; var N=function(a,b,c){0==a.b&&(a===c&&(b=3,c=new TypeError("Promise cannot resolve to itself")),a.b=1,ta(c,a.da,a.ea,a)||(a.R=c,a.b=b,a.u=null,wa(a),3!=b||ya(a,c)))},ta=function(a,b,c,d){if(a instanceof O)return null!=b&&E(b,"opt_onFulfilled should be a function."),null!=c&&E(c,"opt_onRejected should be a function. Did you pass opt_context as the second argument instead of the third?"),xa(a,sa(b||r,c||null,d)),!0;var e;if(a)try{e=!!a.$goog_Thenable}catch(g){e=!1}else e=!1;if(e)return a.then(b,c,d), !0;e=typeof a;if("object"==e&&null!=a||"function"==e)try{var h=a.then;if(v(h))return za(a,h,b,c,d),!0}catch(g){return c.call(d,g),!0}return!1},za=function(a,b,c,d,e){var h=!1,g=function(a){h||(h=!0,c.call(e,a))},f=function(a){h||(h=!0,d.call(e,a))};try{b.call(a,g,f)}catch(p){f(p)}},wa=function(a){a.A||(a.A=!0,M(a.V,a))},Aa=function(a){var b=null;a.h&&(b=a.h,a.h=b.next,b.next=null);a.h||(a.j=null);null!=b&&D(null!=b.f);return b}; O.prototype.V=function(){for(var a;a=Aa(this);){var b=this.b,c=this.R;if(3==b&&a.i&&!a.w){var d;for(d=this;d&&d.m;d=d.u)d.m=!1}if(a.child)a.child.u=null,Ba(a,b,c);else try{a.w?a.f.call(a.context):Ba(a,b,c)}catch(e){Ca.call(null,e)}ra.put(a)}this.A=!1};var Ba=function(a,b,c){2==b?a.f.call(a.context,c):a.i&&a.i.call(a.context,c)},ya=function(a,b){a.m=!0;M(function(){a.m&&Ca.call(null,b)})},Ca=ka;function P(a,b){if(!(b instanceof Object))return b;switch(b.constructor){case Date:return new Date(b.getTime());case Object:void 0===a&&(a={});break;case Array:a=[];break;default:return b}for(var c in b)b.hasOwnProperty(c)&&(a[c]=P(a[c],b[c]));return a};O.all=function(a){return new O(function(b,c){var d=a.length,e=[];if(d)for(var h=function(a,c){d--;e[a]=c;0==d&&b(e)},g=function(a){c(a)},f=0,p;f<a.length;f++)p=a[f],ua(p,x(h,f),g);else b(e)})};O.resolve=function(a){if(a instanceof O)return a;var b=new O(r);N(b,2,a);return b};O.reject=function(a){return new O(function(b,c){c(a)})};O.prototype["catch"]=O.prototype.ba;var Q=O;"undefined"!==typeof Promise&&(Q=Promise);var Da=Q;function Ea(a,b){a=new R(a,b);return a.subscribe.bind(a)}var R=function(a,b){var c=this;this.a=[];this.P=0;this.task=Da.resolve();this.l=!1;this.F=b;this.task.then(function(){a(c)}).catch(function(a){c.error(a)})};R.prototype.next=function(a){S(this,function(b){b.next(a)})};R.prototype.error=function(a){S(this,function(b){b.error(a)});this.close(a)};R.prototype.complete=function(){S(this,function(a){a.complete()});this.close()}; R.prototype.subscribe=function(a,b,c){var d=this,e;if(void 0===a&&void 0===b&&void 0===c)throw Error("Missing Observer.");e=Fa(a)?a:{next:a,error:b,complete:c};void 0===e.next&&(e.next=T);void 0===e.error&&(e.error=T);void 0===e.complete&&(e.complete=T);a=this.fa.bind(this,this.a.length);this.l&&this.task.then(function(){try{d.K?e.error(d.K):e.complete()}catch(h){}});this.a.push(e);return a}; R.prototype.fa=function(a){void 0!==this.a&&void 0!==this.a[a]&&(delete this.a[a],--this.P,0===this.P&&void 0!==this.F&&this.F(this))};var S=function(a,b){if(!a.l)for(var c=0;c<a.a.length;c++)Ga(a,c,b)},Ga=function(a,b,c){a.task.then(function(){if(v