From 5b8ea8295b88f351a87bae0244d415fa9bd2f2e5 Mon Sep 17 00:00:00 2001 From: Luca Ban - Black Birdy Date: Sun, 1 Jul 2018 13:24:49 +0900 Subject: [PATCH] Move hooks inside 'sync' object in config + Bug fix server hooks --- README.md | 19 +++++++++-------- dist/index.cjs.js | 41 ++++++++++++++++++------------------- dist/index.cjs.js.map | 2 +- dist/index.cjs.min.js | 2 +- dist/index.cjs.min.js.map | 2 +- dist/index.es.js | 41 ++++++++++++++++++------------------- dist/index.es.js.map | 2 +- dist/index.es.min.js | 2 +- dist/index.es.min.js.map | 2 +- dist/index.iife.js | 41 ++++++++++++++++++------------------- dist/index.iife.js.map | 2 +- dist/index.iife.min.js | 2 +- dist/index.iife.min.js.map | 2 +- dist/index.umd.js | 41 ++++++++++++++++++------------------- dist/index.umd.js.map | 2 +- dist/index.umd.min.js | 2 +- dist/index.umd.min.js.map | 2 +- package.json | 2 +- src/module/actions.js | 18 ++++++++-------- src/module/defaultConfig.js | 9 ++++---- 20 files changed, 116 insertions(+), 120 deletions(-) diff --git a/README.md b/README.md index 1f4cbda9..92c169d9 100644 --- a/README.md +++ b/README.md @@ -231,7 +231,7 @@ The filters set in `sync: {}` are applied before the DB Channel is openend. They sync: { fillables: [], guard: [], - }, + } } ``` @@ -244,9 +244,11 @@ May choose not to call this to abort the mutation. ```js { // your other config... - insertHook: function (updateStore, doc, store) { updateStore(doc) }, - patchHook: function (updateStore, doc, store) { updateStore(doc) }, - deleteHook: function (updateStore, id, store) { updateStore(id) }, + sync: { + insertHook: function (updateStore, doc, store) { updateStore(doc) }, + patchHook: function (updateStore, doc, store) { updateStore(doc) }, + deleteHook: function (updateStore, id, store) { updateStore(id) }, + } } ``` @@ -303,13 +305,12 @@ const firestoreModule = { orderBy: [], fillables: [], guard: [], + // HOOKS for local changes: + insertHook: function (updateStore, doc, store) { return updateStore(doc) }, + patchHook: function (updateStore, doc, store) { return updateStore(doc) }, + deleteHook: function (updateStore, id, store) { return updateStore(id) }, }, - // HOOKS: - insertHook: function (updateStore, doc, store) { return updateStore(doc) }, - patchHook: function (updateStore, doc, store) { return updateStore(doc) }, - deleteHook: function (updateStore, id, store) { return updateStore(id) }, - // When items on the server side are changed: serverChange: { defaultValues: {}, diff --git a/dist/index.cjs.js b/dist/index.cjs.js index f14c05f6..c58f4015 100644 --- a/dist/index.cjs.js +++ b/dist/index.cjs.js @@ -193,18 +193,17 @@ var defaultConfig = { where: [], orderBy: [], fillables: [], - guard: [] - }, - - // HOOKS: - insertHook: function insertHook(updateStore, doc, store) { - return updateStore(doc); - }, - patchHook: function patchHook(updateStore, doc, store) { - return updateStore(doc); - }, - deleteHook: function deleteHook(updateStore, id, store) { - return updateStore(id); + guard: [], + // HOOKS for local changes: + insertHook: function insertHook(updateStore, doc, store) { + return updateStore(doc); + }, + patchHook: function patchHook(updateStore, doc, store) { + return updateStore(doc); + }, + deleteHook: function deleteHook(updateStore, id, store) { + return updateStore(id); + } }, // When items on the server side are changed: @@ -733,7 +732,7 @@ var actions = { return dispatch('serverUpdate', { change: change, id: id, doc: _doc }); } // get user set sync hook function - var syncHookFn = state._conf.sync[change + 'Hook']; + var syncHookFn = state._conf.serverChange[change + 'Hook']; if (syncHookFn) { syncHookFn(storeUpdateFn, doc, id, this, source, change); } else { @@ -795,8 +794,8 @@ var actions = { return dispatch('insertDoc', _doc); } // check for hooks - if (state._conf.insertHook) { - return state._conf.insertHook(storeUpdateFn, doc, this); + if (state._conf.sync.insertHook) { + return state._conf.sync.insertHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -814,8 +813,8 @@ var actions = { return dispatch('patchDoc', { id: _doc.id, doc: _doc }); } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this); + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -835,8 +834,8 @@ var actions = { return dispatch('patchDoc', { ids: ids, doc: _doc }); } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this); + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -852,8 +851,8 @@ var actions = { return dispatch('deleteDoc', _id); } // check for hooks - if (state._conf.deleteHook) { - return state._conf.deleteHook(storeUpdateFn, id, this); + if (state._conf.sync.deleteHook) { + return state._conf.sync.deleteHook(storeUpdateFn, id, this); } return storeUpdateFn(id); }, diff --git a/dist/index.cjs.js.map b/dist/index.cjs.js.map index 84162c3c..6f45460d 100644 --- a/dist/index.cjs.js.map +++ b/dist/index.cjs.js.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n },\n\n // HOOKS:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.sync[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.insertHook) {\n return state._conf.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.deleteHook) {\n return state._conf.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","strategy","determineType","is","name","elements","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","error","deepmerge","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","deltaT","refresh","retrievePaths","path","reduce","carry","pathUntilNow","newPath","extra","actions","getters","commit","dispatch","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","signedIn","debounceTimer","startDebounce","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","fields","k","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","remainingSyncStack","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","serverChange","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","userActions","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","storeRef","checkFillables","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","reqProps","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.cjs.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n // HOOKS for local changes:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.serverChange[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.sync.insertHook) {\n return state._conf.sync.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.sync.deleteHook) {\n return state._conf.sync.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","strategy","determineType","is","name","elements","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","error","deepmerge","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","deltaT","refresh","retrievePaths","path","reduce","carry","pathUntilNow","newPath","extra","actions","getters","commit","dispatch","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","signedIn","debounceTimer","startDebounce","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","fields","k","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","remainingSyncStack","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","serverChange","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","userActions","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","storeRef","checkFillables","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","reqProps","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.cjs.min.js b/dist/index.cjs.min.js index b2c53fa8..29ecf9d1 100644 --- a/dist/index.cjs.min.js +++ b/dist/index.cjs.min.js @@ -1,2 +1,2 @@ -"use strict";function _interopDefault(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var isWhat=require("is-what"),vuexEasyAccess=require("vuex-easy-access"),Firebase=_interopDefault(require("firebase/app"));require("firebase/firestore"),require("firebase/auth");var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},toConsumableArray=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0;--n){var r=types[n];if(r.is(e)&&r.is(t))return r;if(r.is(e)||r.is(t))break}return null}(n,r);if(!o)return nanoclone(r);var c=e.strategy[o.name]||o.default;return o.merge[c](t,n,r)}return e||(e={}),e={strategy:e.strategy||{}},function(){return toArray$1(arguments).reduceRight(function(e,n){return t(n,e)})}}function wrapper(){var e=toArray$1(arguments);return 1===e.length?merge(e[0]):merge().apply(null,e)}function merge$1(){for(var e=arguments.length;e>0;e--){var t=arguments.length<=e-1?void 0:arguments[e-1];if(!isWhat.isObject(t))return console.error("trying to merge a non-object: ",t),t}return wrapper.apply(void 0,arguments)}var defaultConfig={firestorePath:"",firestoreRefType:"",moduleName:"",statePropName:"",sync:{where:[],orderBy:[],fillables:[],guard:[]},insertHook:function(e,t,n){return e(t)},patchHook:function(e,t,n){return e(t)},deleteHook:function(e,t,n){return e(t)},serverChange:{defaultValues:{},addedHook:function(e,t,n,r,o,c){return e(t)},modifiedHook:function(e,t,n,r,o,c){return e(t)},removedHook:function(e,t,n,r,o,c){return e(t)}},fetch:{docLimit:50},state:{},getters:{},mutations:{},actions:{}},initialState={_sync:{signedIn:!1,patching:!1,syncStack:{updates:{},deletions:[],inserts:[],debounceTimer:null},fetched:[],stopPatchingTimeout:null}},mutations={resetSyncStack:function(e){e._sync.syncStack={updates:{},deletions:[],inserts:[],debounceTimer:null}},INSERT_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$set(e[e._conf.statePropName],t.id,t)},PATCH_DOC:function(e,t){var n=this;if("doc"===e._conf.firestoreRefType.toLowerCase())return e._conf.statePropName?void(e[e._conf.statePropName]=merge$1(e[e._conf.statePropName],t)):Object.keys(t).forEach(function(r){var o=void 0===e[r]?t[r]:isWhat.isObject(e[r])&&isWhat.isObject(t[r])?merge$1(e[r],t[r]):t[r];n._vm.$set(e,r,o)});var r=void 0===e[e._conf.statePropName][t.id]?t:isWhat.isObject(e[e._conf.statePropName][t.id])&&isWhat.isObject(t)?merge$1(e[e._conf.statePropName][t.id],t):t;this._vm.$set(e[e._conf.statePropName],t.id,r)},DELETE_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$delete(e[e._conf.statePropName],t)}};function iniMutations(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],n=vuexEasyAccess.defaultMutations(t);return Object.assign({},n,mutations,e)}function copyObj(e){var t=void 0;if("object"!=(void 0===e?"undefined":_typeof(e)))return e;if(!e)return e;if("[object Object]"!==Object.prototype.toString.call(e)||"[object Array]"!==Object.prototype.toString.call(e))return JSON.parse(JSON.stringify(e));if("[object Array]"===Object.prototype.toString.call(e)){t=[];for(var n=0,r=e.length;n=e&&(clearInterval(o),n(!0))},10)}),refresh:function(){return t=Date.now()}}}function retrievePaths(e,t,n){return isWhat.isObject(e)&&Object.keys(e).length?Object.keys(e).reduce(function(r,o){var c=(t?t+".":"")+o,i=retrievePaths(e[o],c,n);return Object.assign(r,i)},{}):t?(n[t]=e,n):e}function flattenToPaths(e){return retrievePaths(e,null,{})}var actions={patchDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ids:[],doc:{}},c=o.id,i=void 0===c?"":c,a=o.ids,s=void 0===a?[]:a,u=o.doc;if(!isWhat.isArray(s))return console.log("ids needs to be an array");i&&s.push(i),u.id&&delete u.id;var f=n.prepareForPatch(s,u);return Object.keys(f).forEach(function(e){var n=t._sync.syncStack.updates[e]?merge$1(t._sync.syncStack.updates[e],f[e]):f[e];t._sync.syncStack.updates[e]=n}),r("handleSyncStackDebounce")},deleteDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];isWhat.isArray(o)||(o=[o]);var c=n.prepareForDeletion(o),i=t._sync.syncStack.deletions.concat(c);if(t._sync.syncStack.deletions=i,t._sync.syncStack.deletions.length)return r("handleSyncStackDebounce")},insertDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];isWhat.isArray(o)||(o=[o]);var c=n.prepareForInsert(o),i=t._sync.syncStack.inserts.concat(c);return t._sync.syncStack.inserts=i,r("handleSyncStackDebounce")},handleSyncStackDebounce:function(e){var t=e.state,n=(e.commit,e.dispatch);if(!e.getters.signedIn)return!1;if(!t._sync.syncStack.debounceTimer){var r=startDebounce(1e3);r.done.then(function(e){return n("batchSync")}),t._sync.syncStack.debounceTimer=r}t._sync.syncStack.debounceTimer.refresh()},batchSync:function(e){var t=e.getters,n=(e.commit,e.dispatch),r=e.state,o=t.collectionMode,c=t.dbRef,i=Firebase.firestore().batch(),a=0,s=copyObj(r._sync.syncStack.updates),u=Object.keys(s).map(function(e){return{id:e,fields:s[e]}});if(u.length>=500){a=500;var f=u.slice(0,500),d=u.slice(500,-1);r._sync.syncStack.updates=d.reduce(function(e,t){return e[t.id]=t,delete t.id,e},{}),u=f}else r._sync.syncStack.updates={},a=u.length;u.forEach(function(e){var t=e.id,n=o?c.doc(t):c,r=flattenToPaths(e.fields);console.log("fields → ",r),i.update(n,r)});var l=copyObj(r._sync.syncStack.deletions);if(a>=500)l=[];else{var h=500-a,y=l.slice(0,h),p=l.slice(h,-1);r._sync.syncStack.deletions=p,a+=y.length,l=y}l.forEach(function(e){var t=c.doc(e);i.delete(t)});var m=copyObj(r._sync.syncStack.inserts);if(a>=500)m=[];else{var g=500-a,v=m.slice(0,g),_=m.slice(g,-1);r._sync.syncStack.inserts=_,a+=v.length,m=v}return m.forEach(function(e){var n=t.dbRef.doc(e.id);i.set(n,e)}),n("_startPatching"),r._sync.syncStack.debounceTimer=null,new Promise(function(e,t){i.commit().then(function(t){return console.log("[batchSync] RESOLVED:",t,"\n updates: ",Object.keys(u).length?u:{},"\n deletions: ",l.length?l:[],"\n inserts: ",m.length?m:[]),Object.keys(r._sync.syncStack.updates).length+r._sync.syncStack.deletions.length+r._sync.syncStack.inserts.length&&n("batchSync"),n("_stopPatching"),e()}).catch(function(e){return r._sync.patching="error",r._sync.syncStack.debounceTimer=null,t()})})},fetch:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{whereFilters:[],orderBy:[]}),o=r.whereFilters,c=void 0===o?[]:o,i=r.orderBy,a=void 0===i?[]:i;return new Promise(function(e,r){if(console.log("[fetch] starting"),!n.signedIn)return e();var o=JSON.stringify({whereFilters:c,orderBy:a});if(!t._sync.fetched[o]){var i,s=n.dbRef;if(c.forEach(function(e){var t;s=(t=s).where.apply(t,toConsumableArray(e))}),a.length)s=(i=s).orderBy.apply(i,toConsumableArray(a));t._sync.fetched[o]={ref:s,done:!1,retrievedFetchRefs:[],nextFetchRef:null}}var u=t._sync.fetched[o];if(u.done)return console.log("done fetching"),e("fetchedAll");var f=t._sync.fetched[o].ref;if(u.nextFetchRef&&(f=t._sync.fetched[o].nextFetchRef),f=f.limit(t._conf.fetch.docLimit),u.retrievedFetchRefs.includes(f))return console.log("Already retrieved this part."),e();f.get().then(function(n){var r=n.docs;if(0===r.length)return t._sync.fetched[o].done=!0,void e("fetchedAll");r.length0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},actions,e)}function checkFillables(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return isWhat.isObject(e)?(t.length&&Object.keys(e).forEach(function(n){t.includes(n)||delete e[n]}),n.forEach(function(t){delete e[t]}),e):e}var getters={signedIn:function(e,t,n,r){return e._sync.signedIn},dbRef:function(e,t,n,r){if(!t.signedIn)return!1;if(!Firebase.auth().currentUser)return!1;var o=Firebase.auth().currentUser.uid,c=e._conf.firestorePath.replace("{userId}",o);return"collection"===e._conf.firestoreRefType.toLowerCase()?Firebase.firestore().collection(c):Firebase.firestore().doc(c)},storeRef:function(e,t,n){var r=e._conf.statePropName?e._conf.moduleName+"/"+e._conf.statePropName:e._conf.moduleName;return vuexEasyAccess.getDeepRef(n,r)},collectionMode:function(e,t,n){return"collection"===e._conf.firestoreRefType.toLowerCase()},prepareForPatch:function(e,t,n,r){return function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=t.collectionMode;return o||n.push("singleDoc"),n.reduce(function(n,c){var i={};return(i=checkFillables(i=copyObj(i=Object.keys(r).length?r:o?t.storeRef[c]:t.storeRef),e._conf.sync.fillables,e._conf.sync.guard)).updated_at=Firebase.firestore.FieldValue.serverTimestamp(),n[c]=i,n},{})}},prepareForDeletion:function(e,t,n,r){return function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).reduce(function(e,t){return e.push(t),e},[])}},prepareForInsert:function(e,t,n,r){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(t=copyObj(t)).reduce(function(t,n){return(n=checkFillables(n,e._conf.sync.fillables,e._conf.sync.guard)).created_at=Firebase.firestore.FieldValue.serverTimestamp(),n.created_by=r["user/id"],t.push(n),t},[])}}};function iniGetters(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},getters,e)}function errorCheck(e){return["firestorePath","moduleName"].forEach(function(t){if(!e[t])return console.error("Missing "+t+" from your config!"),!1}),/(\.|\/)/.test(e.statePropName)?(console.error("statePropName must only include letters from [a-z]"),!1):!/\./.test(e.moduleName)||(console.error("moduleName must only include letters from [a-z] and forward slashes '/'"),!1)}function iniModule(e){var t=merge$1(defaultConfig,e);if(errorCheck(t)){var n=t.state,r=t.mutations,o=t.actions,c=t.getters;delete t.state,delete t.mutations,delete t.actions,delete t.getters;var i={};return t.statePropName&&(i[t.statePropName]={}),{namespaced:!0,state:merge$1(initialState,n,i,{_conf:t}),mutations:iniMutations(r,merge$1(initialState,n)),actions:iniActions(o),getters:iniGetters(c)}}}function createEasyFirestore(e){return function(t){isWhat.isArray(e)||(e=[e]),e.forEach(function(e){var n=vuexEasyAccess.getKeysFromPath(e.moduleName);t.registerModule(n,iniModule(e))}),t.setDoc=function(e,n){return t.dispatch(e+"/setDoc",n)},t.insert=function(e,n){return t.dispatch(e+"/insert",n)},t.patch=function(e,n){return t.dispatch(e+"/patch",n)},t.patchBatch=function(e,n){return t.dispatch(e+"/patchBatch",n)},t.delete=function(e,n){return t.dispatch(e+"/delete",n)}}}module.exports=createEasyFirestore; +"use strict";function _interopDefault(e){return e&&"object"==typeof e&&"default"in e?e.default:e}var isWhat=require("is-what"),vuexEasyAccess=require("vuex-easy-access"),Firebase=_interopDefault(require("firebase/app"));require("firebase/firestore"),require("firebase/auth");var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},toConsumableArray=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0;--n){var r=types[n];if(r.is(e)&&r.is(t))return r;if(r.is(e)||r.is(t))break}return null}(n,r);if(!o)return nanoclone(r);var c=e.strategy[o.name]||o.default;return o.merge[c](t,n,r)}return e||(e={}),e={strategy:e.strategy||{}},function(){return toArray$1(arguments).reduceRight(function(e,n){return t(n,e)})}}function wrapper(){var e=toArray$1(arguments);return 1===e.length?merge(e[0]):merge().apply(null,e)}function merge$1(){for(var e=arguments.length;e>0;e--){var t=arguments.length<=e-1?void 0:arguments[e-1];if(!isWhat.isObject(t))return console.error("trying to merge a non-object: ",t),t}return wrapper.apply(void 0,arguments)}var defaultConfig={firestorePath:"",firestoreRefType:"",moduleName:"",statePropName:"",sync:{where:[],orderBy:[],fillables:[],guard:[],insertHook:function(e,t,n){return e(t)},patchHook:function(e,t,n){return e(t)},deleteHook:function(e,t,n){return e(t)}},serverChange:{defaultValues:{},addedHook:function(e,t,n,r,o,c){return e(t)},modifiedHook:function(e,t,n,r,o,c){return e(t)},removedHook:function(e,t,n,r,o,c){return e(t)}},fetch:{docLimit:50},state:{},getters:{},mutations:{},actions:{}},initialState={_sync:{signedIn:!1,patching:!1,syncStack:{updates:{},deletions:[],inserts:[],debounceTimer:null},fetched:[],stopPatchingTimeout:null}},mutations={resetSyncStack:function(e){e._sync.syncStack={updates:{},deletions:[],inserts:[],debounceTimer:null}},INSERT_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$set(e[e._conf.statePropName],t.id,t)},PATCH_DOC:function(e,t){var n=this;if("doc"===e._conf.firestoreRefType.toLowerCase())return e._conf.statePropName?void(e[e._conf.statePropName]=merge$1(e[e._conf.statePropName],t)):Object.keys(t).forEach(function(r){var o=void 0===e[r]?t[r]:isWhat.isObject(e[r])&&isWhat.isObject(t[r])?merge$1(e[r],t[r]):t[r];n._vm.$set(e,r,o)});var r=void 0===e[e._conf.statePropName][t.id]?t:isWhat.isObject(e[e._conf.statePropName][t.id])&&isWhat.isObject(t)?merge$1(e[e._conf.statePropName][t.id],t):t;this._vm.$set(e[e._conf.statePropName],t.id,r)},DELETE_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$delete(e[e._conf.statePropName],t)}};function iniMutations(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],n=vuexEasyAccess.defaultMutations(t);return Object.assign({},n,mutations,e)}function copyObj(e){var t=void 0;if("object"!=(void 0===e?"undefined":_typeof(e)))return e;if(!e)return e;if("[object Object]"!==Object.prototype.toString.call(e)||"[object Array]"!==Object.prototype.toString.call(e))return JSON.parse(JSON.stringify(e));if("[object Array]"===Object.prototype.toString.call(e)){t=[];for(var n=0,r=e.length;n=e&&(clearInterval(o),n(!0))},10)}),refresh:function(){return t=Date.now()}}}function retrievePaths(e,t,n){return isWhat.isObject(e)&&Object.keys(e).length?Object.keys(e).reduce(function(r,o){var c=(t?t+".":"")+o,i=retrievePaths(e[o],c,n);return Object.assign(r,i)},{}):t?(n[t]=e,n):e}function flattenToPaths(e){return retrievePaths(e,null,{})}var actions={patchDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ids:[],doc:{}},c=o.id,i=void 0===c?"":c,a=o.ids,s=void 0===a?[]:a,u=o.doc;if(!isWhat.isArray(s))return console.log("ids needs to be an array");i&&s.push(i),u.id&&delete u.id;var f=n.prepareForPatch(s,u);return Object.keys(f).forEach(function(e){var n=t._sync.syncStack.updates[e]?merge$1(t._sync.syncStack.updates[e],f[e]):f[e];t._sync.syncStack.updates[e]=n}),r("handleSyncStackDebounce")},deleteDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];isWhat.isArray(o)||(o=[o]);var c=n.prepareForDeletion(o),i=t._sync.syncStack.deletions.concat(c);if(t._sync.syncStack.deletions=i,t._sync.syncStack.deletions.length)return r("handleSyncStackDebounce")},insertDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];isWhat.isArray(o)||(o=[o]);var c=n.prepareForInsert(o),i=t._sync.syncStack.inserts.concat(c);return t._sync.syncStack.inserts=i,r("handleSyncStackDebounce")},handleSyncStackDebounce:function(e){var t=e.state,n=(e.commit,e.dispatch);if(!e.getters.signedIn)return!1;if(!t._sync.syncStack.debounceTimer){var r=startDebounce(1e3);r.done.then(function(e){return n("batchSync")}),t._sync.syncStack.debounceTimer=r}t._sync.syncStack.debounceTimer.refresh()},batchSync:function(e){var t=e.getters,n=(e.commit,e.dispatch),r=e.state,o=t.collectionMode,c=t.dbRef,i=Firebase.firestore().batch(),a=0,s=copyObj(r._sync.syncStack.updates),u=Object.keys(s).map(function(e){return{id:e,fields:s[e]}});if(u.length>=500){a=500;var f=u.slice(0,500),d=u.slice(500,-1);r._sync.syncStack.updates=d.reduce(function(e,t){return e[t.id]=t,delete t.id,e},{}),u=f}else r._sync.syncStack.updates={},a=u.length;u.forEach(function(e){var t=e.id,n=o?c.doc(t):c,r=flattenToPaths(e.fields);console.log("fields → ",r),i.update(n,r)});var l=copyObj(r._sync.syncStack.deletions);if(a>=500)l=[];else{var h=500-a,y=l.slice(0,h),p=l.slice(h,-1);r._sync.syncStack.deletions=p,a+=y.length,l=y}l.forEach(function(e){var t=c.doc(e);i.delete(t)});var m=copyObj(r._sync.syncStack.inserts);if(a>=500)m=[];else{var g=500-a,v=m.slice(0,g),_=m.slice(g,-1);r._sync.syncStack.inserts=_,a+=v.length,m=v}return m.forEach(function(e){var n=t.dbRef.doc(e.id);i.set(n,e)}),n("_startPatching"),r._sync.syncStack.debounceTimer=null,new Promise(function(e,t){i.commit().then(function(t){return console.log("[batchSync] RESOLVED:",t,"\n updates: ",Object.keys(u).length?u:{},"\n deletions: ",l.length?l:[],"\n inserts: ",m.length?m:[]),Object.keys(r._sync.syncStack.updates).length+r._sync.syncStack.deletions.length+r._sync.syncStack.inserts.length&&n("batchSync"),n("_stopPatching"),e()}).catch(function(e){return r._sync.patching="error",r._sync.syncStack.debounceTimer=null,t()})})},fetch:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{whereFilters:[],orderBy:[]}),o=r.whereFilters,c=void 0===o?[]:o,i=r.orderBy,a=void 0===i?[]:i;return new Promise(function(e,r){if(console.log("[fetch] starting"),!n.signedIn)return e();var o=JSON.stringify({whereFilters:c,orderBy:a});if(!t._sync.fetched[o]){var i,s=n.dbRef;if(c.forEach(function(e){var t;s=(t=s).where.apply(t,toConsumableArray(e))}),a.length)s=(i=s).orderBy.apply(i,toConsumableArray(a));t._sync.fetched[o]={ref:s,done:!1,retrievedFetchRefs:[],nextFetchRef:null}}var u=t._sync.fetched[o];if(u.done)return console.log("done fetching"),e("fetchedAll");var f=t._sync.fetched[o].ref;if(u.nextFetchRef&&(f=t._sync.fetched[o].nextFetchRef),f=f.limit(t._conf.fetch.docLimit),u.retrievedFetchRefs.includes(f))return console.log("Already retrieved this part."),e();f.get().then(function(n){var r=n.docs;if(0===r.length)return t._sync.fetched[o].done=!0,void e("fetchedAll");r.length0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},actions,e)}function checkFillables(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return isWhat.isObject(e)?(t.length&&Object.keys(e).forEach(function(n){t.includes(n)||delete e[n]}),n.forEach(function(t){delete e[t]}),e):e}var getters={signedIn:function(e,t,n,r){return e._sync.signedIn},dbRef:function(e,t,n,r){if(!t.signedIn)return!1;if(!Firebase.auth().currentUser)return!1;var o=Firebase.auth().currentUser.uid,c=e._conf.firestorePath.replace("{userId}",o);return"collection"===e._conf.firestoreRefType.toLowerCase()?Firebase.firestore().collection(c):Firebase.firestore().doc(c)},storeRef:function(e,t,n){var r=e._conf.statePropName?e._conf.moduleName+"/"+e._conf.statePropName:e._conf.moduleName;return vuexEasyAccess.getDeepRef(n,r)},collectionMode:function(e,t,n){return"collection"===e._conf.firestoreRefType.toLowerCase()},prepareForPatch:function(e,t,n,r){return function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=t.collectionMode;return o||n.push("singleDoc"),n.reduce(function(n,c){var i={};return(i=checkFillables(i=copyObj(i=Object.keys(r).length?r:o?t.storeRef[c]:t.storeRef),e._conf.sync.fillables,e._conf.sync.guard)).updated_at=Firebase.firestore.FieldValue.serverTimestamp(),n[c]=i,n},{})}},prepareForDeletion:function(e,t,n,r){return function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).reduce(function(e,t){return e.push(t),e},[])}},prepareForInsert:function(e,t,n,r){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(t=copyObj(t)).reduce(function(t,n){return(n=checkFillables(n,e._conf.sync.fillables,e._conf.sync.guard)).created_at=Firebase.firestore.FieldValue.serverTimestamp(),n.created_by=r["user/id"],t.push(n),t},[])}}};function iniGetters(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},getters,e)}function errorCheck(e){return["firestorePath","moduleName"].forEach(function(t){if(!e[t])return console.error("Missing "+t+" from your config!"),!1}),/(\.|\/)/.test(e.statePropName)?(console.error("statePropName must only include letters from [a-z]"),!1):!/\./.test(e.moduleName)||(console.error("moduleName must only include letters from [a-z] and forward slashes '/'"),!1)}function iniModule(e){var t=merge$1(defaultConfig,e);if(errorCheck(t)){var n=t.state,r=t.mutations,o=t.actions,c=t.getters;delete t.state,delete t.mutations,delete t.actions,delete t.getters;var i={};return t.statePropName&&(i[t.statePropName]={}),{namespaced:!0,state:merge$1(initialState,n,i,{_conf:t}),mutations:iniMutations(r,merge$1(initialState,n)),actions:iniActions(o),getters:iniGetters(c)}}}function createEasyFirestore(e){return function(t){isWhat.isArray(e)||(e=[e]),e.forEach(function(e){var n=vuexEasyAccess.getKeysFromPath(e.moduleName);t.registerModule(n,iniModule(e))}),t.setDoc=function(e,n){return t.dispatch(e+"/setDoc",n)},t.insert=function(e,n){return t.dispatch(e+"/insert",n)},t.patch=function(e,n){return t.dispatch(e+"/patch",n)},t.patchBatch=function(e,n){return t.dispatch(e+"/patchBatch",n)},t.delete=function(e,n){return t.dispatch(e+"/delete",n)}}}module.exports=createEasyFirestore; //# sourceMappingURL=index.cjs.min.js.map diff --git a/dist/index.cjs.min.js.map b/dist/index.cjs.min.js.map index cbc30b59..223d9a26 100644 --- a/dist/index.cjs.min.js.map +++ b/dist/index.cjs.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index.cjs.min.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n },\n\n // HOOKS:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.sync[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.insertHook) {\n return state._conf.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.deleteHook) {\n return state._conf.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","is","determineType","strategy","name","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","error","deepmerge","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","refresh","retrievePaths","path","reduce","carry","newPath","extra","actions","getters","dispatch","commit","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","signedIn","debounceTimer","startDebounce","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","k","fields","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","this","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","serverChange","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","userActions","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","checkFillables","storeRef","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.cjs.min.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n // HOOKS for local changes:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.serverChange[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.sync.insertHook) {\n return state._conf.sync.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.sync.deleteHook) {\n return state._conf.sync.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","is","determineType","strategy","name","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","error","deepmerge","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","refresh","retrievePaths","path","reduce","carry","newPath","extra","actions","getters","dispatch","commit","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","signedIn","debounceTimer","startDebounce","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","k","fields","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","serverChange","this","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","userActions","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","checkFillables","storeRef","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.es.js b/dist/index.es.js index 8f60a8d2..7985157e 100644 --- a/dist/index.es.js +++ b/dist/index.es.js @@ -189,18 +189,17 @@ var defaultConfig = { where: [], orderBy: [], fillables: [], - guard: [] - }, - - // HOOKS: - insertHook: function insertHook(updateStore, doc, store) { - return updateStore(doc); - }, - patchHook: function patchHook(updateStore, doc, store) { - return updateStore(doc); - }, - deleteHook: function deleteHook(updateStore, id, store) { - return updateStore(id); + guard: [], + // HOOKS for local changes: + insertHook: function insertHook(updateStore, doc, store) { + return updateStore(doc); + }, + patchHook: function patchHook(updateStore, doc, store) { + return updateStore(doc); + }, + deleteHook: function deleteHook(updateStore, id, store) { + return updateStore(id); + } }, // When items on the server side are changed: @@ -729,7 +728,7 @@ var actions = { return dispatch('serverUpdate', { change: change, id: id, doc: _doc }); } // get user set sync hook function - var syncHookFn = state._conf.sync[change + 'Hook']; + var syncHookFn = state._conf.serverChange[change + 'Hook']; if (syncHookFn) { syncHookFn(storeUpdateFn, doc, id, this, source, change); } else { @@ -791,8 +790,8 @@ var actions = { return dispatch('insertDoc', _doc); } // check for hooks - if (state._conf.insertHook) { - return state._conf.insertHook(storeUpdateFn, doc, this); + if (state._conf.sync.insertHook) { + return state._conf.sync.insertHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -810,8 +809,8 @@ var actions = { return dispatch('patchDoc', { id: _doc.id, doc: _doc }); } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this); + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -831,8 +830,8 @@ var actions = { return dispatch('patchDoc', { ids: ids, doc: _doc }); } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this); + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -848,8 +847,8 @@ var actions = { return dispatch('deleteDoc', _id); } // check for hooks - if (state._conf.deleteHook) { - return state._conf.deleteHook(storeUpdateFn, id, this); + if (state._conf.sync.deleteHook) { + return state._conf.sync.deleteHook(storeUpdateFn, id, this); } return storeUpdateFn(id); }, diff --git a/dist/index.es.js.map b/dist/index.es.js.map index 793aeed1..d11fb377 100644 --- a/dist/index.es.js.map +++ b/dist/index.es.js.map @@ -1 +1 @@ -{"version":3,"file":"index.es.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n },\n\n // HOOKS:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.sync[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.insertHook) {\n return state._conf.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.deleteHook) {\n return state._conf.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","strategy","determineType","is","name","elements","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","error","deepmerge","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","deltaT","refresh","retrievePaths","path","reduce","carry","pathUntilNow","newPath","extra","actions","getters","commit","dispatch","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","signedIn","debounceTimer","startDebounce","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","fields","k","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","remainingSyncStack","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","serverChange","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","userActions","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","storeRef","checkFillables","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","reqProps","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAAA,IAAIA,YAAYC,QAAQ,WAAR,EAAqBC,OAArC;;AAEA,SAASC,SAAT,CAAkBC,MAAlB,EAA0B;MACpBC,SAAS,EAAb;;OAEK,IAAIC,IAAI,CAAb,EAAgBA,IAAIF,OAAOG,MAA3B,EAAmC,EAAED,CAArC,EAAwC;WAC/BE,IAAP,CAAYJ,OAAOE,CAAP,CAAZ;;;SAGKD,MAAP;;;AAGF,IAAII,QAAQ,CACV;QACQ,WADR;;MAGM,YAAUC,EAAV,EAAc;QACZC,cAAcD,EAAd,yCAAcA,EAAd,CAAJ;;WAEQC,SAAS,QAAT,IAAqBA,SAAS,QAA9B,IAA0CA,SAAS,SAA3D;GANJ;;WASW,SATX;;SAWS;aACI,kBAAUC,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;aACxBA,CAAP;;;CAdI,EAmBV;QACQ,QADR;;MAGM,YAAUJ,EAAV,EAAc;WACTA,OAAO,IAAP,IAAgB,QAAOA,EAAP,yCAAOA,EAAP,OAAc,QAArC;GAJJ;;WAOW,MAPX;;SASS;UACC,cAAUE,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;UACxBT,SAAS,EAAb;;UAEIU,OAAO;WACNC,OAAOD,IAAP,CAAYF,CAAZ,CADM;WAENG,OAAOD,IAAP,CAAYD,CAAZ;OAFL;;WAKKD,CAAL,CAAOI,MAAP,CAAcF,KAAKD,CAAnB,EAAsBI,OAAtB,CAA8B,UAAUC,GAAV,EAAe;eACpCA,GAAP,IAAcP,OAAOC,EAAEM,GAAF,CAAP,EAAeL,EAAEK,GAAF,CAAf,CAAd;OADF;;aAIOd,MAAP;;;CAzCI,EA8CV;QACQ,OADR;;MAGM,YAAUK,EAAV,EAAc;WACTU,MAAMC,OAAN,CAAcX,EAAd,CAAP;GAJJ;;WAOW,SAPX;;SASS;WACE,eAAUE,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;UACzBT,SAAS,EAAb;;WAEK,IAAIC,IAAI,CAAb,EAAgBA,IAAIgB,KAAKC,GAAL,CAASV,EAAEN,MAAX,EAAmBO,EAAEP,MAArB,CAApB,EAAkD,EAAED,CAApD,EAAuD;eAC9CE,IAAP,CAAYI,OAAOC,EAAEP,CAAF,CAAP,EAAaQ,EAAER,CAAF,CAAb,CAAZ;;;aAGKD,MAAP;KARG;;aAWI,iBAAUO,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;aACxBd,UAAUc,CAAV,CAAP;KAZG;;YAeG,gBAAUF,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;aACrB,EAAD,CAAKG,MAAL,CAAYJ,CAAZ,CAAD,CAAiBI,MAAjB,CAAwBH,CAAxB,CAAP;;;CAvEI,CAAZ;;AA6EA,SAASU,KAAT,CAAgBC,MAAhB,EAAwB;MAClB,CAACA,MAAL,EAAa;aACF,EAAT;;;WAGO;cACGA,OAAOC,QAAP,IAAmB;GAD/B;;WAISC,aAAT,CAAwBd,CAAxB,EAA2BC,CAA3B,EAA8B;SACvB,IAAIR,IAAIG,MAAMF,MAAN,GAAe,CAA5B,EAA+BD,KAAK,CAApC,EAAuC,EAAEA,CAAzC,EAA4C;UACtCK,OAAOF,MAAMH,CAAN,CAAX;;UAEIK,KAAKiB,EAAL,CAAQf,CAAR,KAAcF,KAAKiB,EAAL,CAAQd,CAAR,CAAlB,EAA8B;eACrBH,IAAP;OADF,MAEO,IAAIA,KAAKiB,EAAL,CAAQf,CAAR,KAAcF,KAAKiB,EAAL,CAAQd,CAAR,CAAlB,EAA8B;;;;;WAKhC,IAAP;;;WAGOF,MAAT,CAAiBC,CAAjB,EAAoBC,CAApB,EAAuB;QACjBA,MAAM,KAAK,CAAf,EAAkB;aACTd,UAAUa,CAAV,CAAP;;;QAGEF,OAAOgB,cAAcd,CAAd,EAAiBC,CAAjB,CAAX;;QAEI,CAACH,IAAL,EAAW;aACFX,UAAUc,CAAV,CAAP;;;QAGEY,WAAWD,OAAOC,QAAP,CAAgBf,KAAKkB,IAArB,KAA8BlB,KAAKT,OAAlD;;WAEOS,KAAKa,KAAL,CAAWE,QAAX,EAAqBd,MAArB,EAA6BC,CAA7B,EAAgCC,CAAhC,CAAP;;;SAGK,YAAY;QACbgB,WAAW3B,UAAQ4B,SAAR,CAAf;;WAEOD,SAASE,WAAT,CAAqB,UAAU3B,MAAV,EAAkB4B,OAAlB,EAA2B;aAC9CrB,OAAOqB,OAAP,EAAgB5B,MAAhB,CAAP;KADK,CAAP;GAHF;;;AASF,SAAS6B,OAAT,GAAoB;MACdC,OAAOhC,UAAQ4B,SAAR,CAAX;;;MAGII,KAAK5B,MAAL,KAAgB,CAApB,EAAuB;WACdiB,MAAMW,KAAK,CAAL,CAAN,CAAP;;;SAGKX,QAAQY,KAAR,CAAc,IAAd,EAAoBD,IAApB,CAAP;;;AC9IF,SAASX,OAAT,GAA2B;MACrBa,IAAI,UAAO9B,MAAf;OACK8B,CAAL,EAAQA,IAAI,CAAZ,EAAeA,GAAf,EAAoB;QACZC,2BAAcD,IAAI,CAAlB,yBAAcA,IAAI,CAAlB,CAAN;QACI,CAACE,SAASD,IAAT,CAAL,EAAqB;cACXE,KAAR,CAAc,gCAAd,EAAgDF,IAAhD;aACOA,IAAP;;;SAGGG,mCAAP;;;ACXF,oBAAe;iBACE,EADF;;oBAGK,EAHL;;cAKD,EALC;;iBAOE,EAPF;;;;QAWP;WACG,EADH;aAEK,EAFL;eAGO,EAHP;WAIG;GAfI;;;cAmBD,oBAAUC,WAAV,EAAuBC,GAAvB,EAA4BC,KAA5B,EAAmC;WAASF,YAAYC,GAAZ,CAAP;GAnBpC;aAoBF,mBAAUD,WAAV,EAAuBC,GAAvB,EAA4BC,KAA5B,EAAmC;WAASF,YAAYC,GAAZ,CAAP;GApBnC;cAqBD,oBAAUD,WAAV,EAAuBG,EAAvB,EAA2BD,KAA3B,EAAkC;WAASF,YAAYG,EAAZ,CAAP;GArBnC;;;gBAwBC;mBACG,EADH;;eAGD,mBAAUH,WAAV,EAAuBC,GAAvB,EAA4BE,EAA5B,EAAgCD,KAAhC,EAAuCE,MAAvC,EAA+CC,MAA/C,EAAuD;aAASL,YAAYC,GAAZ,CAAP;KAHxD;kBAIE,sBAAUD,WAAV,EAAuBC,GAAvB,EAA4BE,EAA5B,EAAgCD,KAAhC,EAAuCE,MAAvC,EAA+CC,MAA/C,EAAuD;aAASL,YAAYC,GAAZ,CAAP;KAJ3D;iBAKC,qBAAUD,WAAV,EAAuBC,GAAvB,EAA4BE,EAA5B,EAAgCD,KAAhC,EAAuCE,MAAvC,EAA+CC,MAA/C,EAAuD;aAASL,YAAYC,GAAZ,CAAP;;GA7B3D;;;SAiCN;;cAEK;GAnCC;;;SAuCN,EAvCM;WAwCJ,EAxCI;aAyCF,EAzCE;WA0CJ;CA1CX;;ACAA,mBAAe;SACN;cACK,KADL;cAEK,KAFL;eAGM;eACA,EADA;iBAEE,EAFF;eAGA,EAHA;qBAIM;KAPZ;aASI,EATJ;yBAUgB;;CAXzB;;ACGA,IAAMK,YAAY;gBAAA,0BACAC,KADA,EACO;UACfC,KAAN,CAAYC,SAAZ,GAAwB;eACb,EADa;iBAEX,EAFW;eAGb,EAHa;qBAIP;KAJjB;GAFc;YAAA,sBASJF,KATI,EASGN,GATH,EASQ;QAClBM,MAAMG,KAAN,CAAYC,gBAAZ,CAA6BC,WAA7B,OAA+C,KAAnD,EAA0D;SACrDC,GAAL,CAASC,IAAT,CAAcP,MAAMA,MAAMG,KAAN,CAAYK,aAAlB,CAAd,EAAgDd,IAAIE,EAApD,EAAwDF,GAAxD;GAXc;WAAA,qBAaLM,KAbK,EAaEN,GAbF,EAaO;;;QACjBM,MAAMG,KAAN,CAAYC,gBAAZ,CAA6BC,WAA7B,OAA+C,KAAnD,EAA0D;UACpD,CAACL,MAAMG,KAAN,CAAYK,aAAjB,EAAgC;eACvBzC,OAAOD,IAAP,CAAY4B,GAAZ,EAAiBzB,OAAjB,CAAyB,eAAO;;cAE/BwC,SAAUT,MAAM9B,GAAN,MAAewC,SAAhB,GACXhB,IAAIxB,GAAJ,CADW,GAEV,CAACoB,SAASU,MAAM9B,GAAN,CAAT,CAAD,IAAyB,CAACoB,SAASI,IAAIxB,GAAJ,CAAT,CAA3B,GACEwB,IAAIxB,GAAJ,CADF,GAEEK,QAAMyB,MAAM9B,GAAN,CAAN,EAAkBwB,IAAIxB,GAAJ,CAAlB,CAJN;gBAKKoC,GAAL,CAASC,IAAT,CAAcP,KAAd,EAAqB9B,GAArB,EAA0BuC,MAA1B;SAPK,CAAP;;;YAWIT,MAAMG,KAAN,CAAYK,aAAlB,IAAmCjC,QAAMyB,MAAMA,MAAMG,KAAN,CAAYK,aAAlB,CAAN,EAAwCd,GAAxC,CAAnC;;;;QAIIe,SAAUT,MAAMA,MAAMG,KAAN,CAAYK,aAAlB,EAAiCd,IAAIE,EAArC,MAA6Cc,SAA9C,GACXhB,GADW,GAEV,CAACJ,SAASU,MAAMA,MAAMG,KAAN,CAAYK,aAAlB,EAAiCd,IAAIE,EAArC,CAAT,CAAD,IAAuD,CAACN,SAASI,GAAT,CAAzD,GACEA,GADF,GAEEnB,QAAMyB,MAAMA,MAAMG,KAAN,CAAYK,aAAlB,EAAiCd,IAAIE,EAArC,CAAN,EAAgDF,GAAhD,CAJN;SAKKY,GAAL,CAASC,IAAT,CAAcP,MAAMA,MAAMG,KAAN,CAAYK,aAAlB,CAAd,EAAgDd,IAAIE,EAApD,EAAwDa,MAAxD;GApCc;YAAA,sBAsCJT,KAtCI,EAsCGJ,EAtCH,EAsCO;QACjBI,MAAMG,KAAN,CAAYC,gBAAZ,CAA6BC,WAA7B,OAA+C,KAAnD,EAA0D;SACrDC,GAAL,CAASK,OAAT,CAAiBX,MAAMA,MAAMG,KAAN,CAAYK,aAAlB,CAAjB,EAAmDZ,EAAnD;;CAxCJ;;AA4CA,AAAe,yBAAqC;MAA3BgB,aAA2B,uEAAX,EAAW;MAAPZ,KAAO;;MAC5Ca,oBAAoBC,iBAAiBd,KAAjB,CAA1B;SACOjC,OAAOgD,MAAP,CAAc,EAAd,EAAkBF,iBAAlB,EAAqCd,SAArC,EAAgDa,aAAhD,CAAP;;;AClDF;;;;;;AAMA,AAAe,SAASI,OAAT,CAAkBC,GAAlB,EAAuB;MAChCC,eAAJ;MACI,QAAOD,GAAP,yCAAOA,GAAP,MAAc,QAAlB,EAA4B;WACnBA,GAAP;;MAEE,CAACA,GAAL,EAAU;WACDA,GAAP;;MAEE,sBAAsBlD,OAAOoD,SAAP,CAAiBC,QAAjB,CAA0BC,IAA1B,CAA+BJ,GAA/B,CAAtB,IACF,qBAAqBlD,OAAOoD,SAAP,CAAiBC,QAAjB,CAA0BC,IAA1B,CAA+BJ,GAA/B,CADvB,EAEE;WACOK,KAAKC,KAAL,CAAWD,KAAKE,SAAL,CAAeP,GAAf,CAAX,CAAP;;;MAGE,qBAAqBlD,OAAOoD,SAAP,CAAiBC,QAAjB,CAA0BC,IAA1B,CAA+BJ,GAA/B,CAAzB,EAA8D;aACnD,EAAT;SACK,IAAI5D,IAAI,CAAR,EAAWoE,MAAMR,IAAI3D,MAA1B,EAAkCD,IAAIoE,GAAtC,EAA2CpE,GAA3C,EAAgD;aACvCA,CAAP,IAAY2D,QAAQC,IAAI5D,CAAJ,CAAR,CAAZ;;WAEK6D,MAAP;;;WAGO,EAAT;OACK,IAAI7D,EAAT,IAAc4D,GAAd,EAAmB;QACbA,IAAIS,cAAJ,CAAmBrE,EAAnB,CAAJ,EAA2B;aAClBA,EAAP,IAAY2D,QAAQC,IAAI5D,EAAJ,CAAR,CAAZ;;;SAGG6D,MAAP;;;AChCF;;;;;;AAMA,AAAe,2BAAUD,GAAV,EAAeU,aAAf,EAA8B;SACpCpD,QAAMoD,aAAN,EAAqBV,GAArB,CAAP;;;ACTF;;;;;;;;;;;;AAYA,AAAe,wBAAUW,EAAV,EAAc;MACvBC,YAAYC,KAAKC,GAAL,EAAhB;MACMC,OAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;QACtCC,WAAWC,YAAY,aAAK;UAC1BN,MAAMD,KAAKC,GAAL,EAAZ;UACMO,SAASP,MAAMF,SAArB;UACIS,UAAUV,EAAd,EAAkB;sBACFQ,QAAd;gBACQ,IAAR;;KALa,EAOd,EAPc,CAAjB;GADW,CAAb;MAUMG,UAAU,SAAVA,OAAU;WAAOV,YAAYC,KAAKC,GAAL,EAAnB;GAAhB;SACO,EAAEC,UAAF,EAAQO,gBAAR,EAAP;;;ACvBF,SAASC,aAAT,CAAwBrF,MAAxB,EAAgCsF,IAAhC,EAAsCrF,MAAtC,EAA8C;MACxC,CAACkC,SAASnC,MAAT,CAAD,IAAqB,CAACY,OAAOD,IAAP,CAAYX,MAAZ,EAAoBG,MAA9C,EAAsD;QAChD,CAACmF,IAAL,EAAW,OAAOtF,MAAP;WACJsF,IAAP,IAAetF,MAAf;WACOC,MAAP;;SAEKW,OAAOD,IAAP,CAAYX,MAAZ,EAAoBuF,MAApB,CAA2B,UAACC,KAAD,EAAQzE,GAAR,EAAgB;QAC1C0E,eAAgBH,IAAD,GACjBA,OAAO,GADU,GAEjB,EAFJ;QAGMI,UAAUD,eAAe1E,GAA/B;QACM4E,QAAQN,cAAcrF,OAAOe,GAAP,CAAd,EAA2B2E,OAA3B,EAAoCzF,MAApC,CAAd;WACOW,OAAOgD,MAAP,CAAc4B,KAAd,EAAqBG,KAArB,CAAP;GANK,EAOJ,EAPI,CAAP;;;AAUF,AAAe,yBAAU3F,MAAV,EAAkB;MACzBC,SAAS,EAAf;SACOoF,cAAcrF,MAAd,EAAsB,IAAtB,EAA4BC,MAA5B,CAAP;;;ACVF,IAAM2F,UAAU;UAAA,0BAIZ;QAFC/C,KAED,QAFCA,KAED;QAFQgD,OAER,QAFQA,OAER;QAFiBC,MAEjB,QAFiBA,MAEjB;QAFyBC,QAEzB,QAFyBA,QAEzB;;oFAD2B,EAACC,KAAK,EAAN,EAAUzD,KAAK,EAAf,EAC3B;yBADCE,EACD;QADCA,EACD,4BADM,EACN;0BADUuD,GACV;QADUA,GACV,6BADgB,EAChB;QADoBzD,GACpB,SADoBA,GACpB;;;QAEI,CAACtB,QAAQ+E,GAAR,CAAL,EAAmB,OAAOC,QAAQC,GAAR,CAAY,0BAAZ,CAAP;QACfzD,EAAJ,EAAQuD,IAAI5F,IAAJ,CAASqC,EAAT;QACJF,IAAIE,EAAR,EAAY,OAAOF,IAAIE,EAAX;;;QAGR0D,iBAAiBN,QAAQO,eAAR,CAAwBJ,GAAxB,EAA6BzD,GAA7B,CAArB;;;WAGO5B,IAAP,CAAYwF,cAAZ,EAA4BrF,OAA5B,CAAoC,cAAM;UAClCwC,SAAU,CAACT,MAAMC,KAAN,CAAYC,SAAZ,CAAsBsD,OAAtB,CAA8B5D,EAA9B,CAAF,GACX0D,eAAe1D,EAAf,CADW,GAEXrB,QAAMyB,MAAMC,KAAN,CAAYC,SAAZ,CAAsBsD,OAAtB,CAA8B5D,EAA9B,CAAN,EACM0D,eAAe1D,EAAf,CADN,CAFJ;YAIMK,KAAN,CAAYC,SAAZ,CAAsBsD,OAAtB,CAA8B5D,EAA9B,IAAoCa,MAApC;KALF;;;WASOyC,SAAS,yBAAT,CAAP;GAvBY;WAAA,4BA0BJ;QADElD,KACF,SADEA,KACF;QADSgD,OACT,SADSA,OACT;QADkBC,MAClB,SADkBA,MAClB;QAD0BC,QAC1B,SAD0BA,QAC1B;QAAVC,GAAU,uEAAJ,EAAI;;;QAEJ,CAAC/E,QAAQ+E,GAAR,CAAL,EAAmBA,MAAM,CAACA,GAAD,CAAN;;;QAGbM,eAAeT,QAAQU,kBAAR,CAA2BP,GAA3B,CAArB;;;QAGMQ,YAAY3D,MAAMC,KAAN,CAAYC,SAAZ,CAAsByD,SAAtB,CAAgC3F,MAAhC,CAAuCyF,YAAvC,CAAlB;UACMxD,KAAN,CAAYC,SAAZ,CAAsByD,SAAtB,GAAkCA,SAAlC;;QAEI,CAAC3D,MAAMC,KAAN,CAAYC,SAAZ,CAAsByD,SAAtB,CAAgCrG,MAArC,EAA6C;;WAEtC4F,SAAS,yBAAT,CAAP;GAvCY;WAAA,4BA0CH;QADClD,KACD,SADCA,KACD;QADQgD,OACR,SADQA,OACR;QADiBC,MACjB,SADiBA,MACjB;QADyBC,QACzB,SADyBA,QACzB;QAAXU,IAAW,uEAAJ,EAAI;;;QAEL,CAACxF,QAAQwF,IAAR,CAAL,EAAoBA,OAAO,CAACA,IAAD,CAAP;;;QAGd1D,YAAY8C,QAAQa,gBAAR,CAAyBD,IAAzB,CAAlB;;;QAGME,UAAU9D,MAAMC,KAAN,CAAYC,SAAZ,CAAsB4D,OAAtB,CAA8B9F,MAA9B,CAAqCkC,SAArC,CAAhB;UACMD,KAAN,CAAYC,SAAZ,CAAsB4D,OAAtB,GAAgCA,OAAhC;;;WAGOZ,SAAS,yBAAT,CAAP;GAtDY;yBAAA,0CAwD+C;QAAnClD,KAAmC,SAAnCA,KAAmC;QAA5BiD,MAA4B,SAA5BA,MAA4B;QAApBC,QAAoB,SAApBA,QAAoB;QAAVF,OAAU,SAAVA,OAAU;;QACvD,CAACA,QAAQe,QAAb,EAAuB,OAAO,KAAP;QACnB,CAAC/D,MAAMC,KAAN,CAAYC,SAAZ,CAAsB8D,aAA3B,EAA0C;UAClCA,gBAAgBC,cAAc,IAAd,CAAtB;oBACcjC,IAAd,CAAmBkC,IAAnB,CAAwB;eAAKhB,SAAS,WAAT,CAAL;OAAxB;YACMjD,KAAN,CAAYC,SAAZ,CAAsB8D,aAAtB,GAAsCA,aAAtC;;UAEI/D,KAAN,CAAYC,SAAZ,CAAsB8D,aAAtB,CAAoCzB,OAApC;GA/DY;WAAA,4BAiEiC;QAAnCS,OAAmC,SAAnCA,OAAmC;QAA1BC,MAA0B,SAA1BA,MAA0B;QAAlBC,QAAkB,SAAlBA,QAAkB;QAARlD,KAAQ,SAARA,KAAQ;;QACvCmE,iBAAiBnB,QAAQmB,cAA/B;QACMC,QAAQpB,QAAQoB,KAAtB;QACIC,QAAQC,SAASC,SAAT,GAAqBF,KAArB,EAAZ;QACIG,QAAQ,CAAZ;;QAEIC,kBAAkBzD,QAAQhB,MAAMC,KAAN,CAAYC,SAAZ,CAAsBsD,OAA9B,CAAtB;QACIA,UAAUzF,OAAOD,IAAP,CAAY2G,eAAZ,EAA6BC,GAA7B,CAAiC,aAAK;UAC9CC,SAASF,gBAAgBG,CAAhB,CAAb;aACO,EAAChF,IAAIgF,CAAL,EAAQD,cAAR,EAAP;KAFY,CAAd;;QAKInB,QAAQlG,MAAR,IAAkB,GAAtB,EAA2B;;cAEjB,GAAR;UACIuH,YAAYrB,QAAQsB,KAAR,CAAc,CAAd,EAAiB,GAAjB,CAAhB;UACIC,cAAcvB,QAAQsB,KAAR,CAAc,GAAd,EAAmB,CAAC,CAApB,CAAlB;;YAEM7E,KAAN,CAAYC,SAAZ,CAAsBsD,OAAtB,GAAgCuB,YAAYrC,MAAZ,CAAmB,UAACC,KAAD,EAAQtD,IAAR,EAAiB;cAC5DA,KAAKO,EAAX,IAAiBP,IAAjB;eACOA,KAAKO,EAAZ;eACO+C,KAAP;OAH8B,EAI7B,EAJ6B,CAAhC;gBAKUkC,SAAV;KAXF,MAYO;YACC5E,KAAN,CAAYC,SAAZ,CAAsBsD,OAAtB,GAAgC,EAAhC;cACQA,QAAQlG,MAAhB;;;YAGMW,OAAR,CAAgB,gBAAQ;UAClB2B,KAAKP,KAAKO,EAAd;UACIoF,SAAUb,cAAD,GAAmBC,MAAM1E,GAAN,CAAUE,EAAV,CAAnB,GAAmCwE,KAAhD;UACIO,SAASM,eAAe5F,KAAKsF,MAApB,CAAb;cACQtB,GAAR,CAAY,WAAZ,EAAyBsB,MAAzB;YACMO,MAAN,CAAaF,MAAb,EAAqBL,MAArB;KALF;;QAQIhB,YAAY3C,QAAQhB,MAAMC,KAAN,CAAYC,SAAZ,CAAsByD,SAA9B,CAAhB;;QAEIa,SAAS,GAAb,EAAkB;;kBAEJ,EAAZ;KAFF,MAGO;;UAEDW,kBAAkB,MAAMX,KAA5B;UACIY,cAAczB,UAAUmB,KAAV,CAAgB,CAAhB,EAAmBK,eAAnB,CAAlB;UACIE,gBAAgB1B,UAAUmB,KAAV,CAAgBK,eAAhB,EAAiC,CAAC,CAAlC,CAApB;;YAEMlF,KAAN,CAAYC,SAAZ,CAAsByD,SAAtB,GAAkC0B,aAAlC;cACQb,QAAQY,YAAY9H,MAA5B;;kBAEY8H,WAAZ;;;cAGQnH,OAAV,CAAkB,cAAM;UAClB+G,SAASZ,MAAM1E,GAAN,CAAUE,EAAV,CAAb;YACM0F,MAAN,CAAaN,MAAb;KAFF;;QAKIlB,UAAU9C,QAAQhB,MAAMC,KAAN,CAAYC,SAAZ,CAAsB4D,OAA9B,CAAd;;QAEIU,SAAS,GAAb,EAAkB;;gBAEN,EAAV;KAFF,MAGO;;UAEDe,gBAAgB,MAAMf,KAA1B;UACIgB,YAAY1B,QAAQgB,KAAR,CAAc,CAAd,EAAiBS,aAAjB,CAAhB;UACIE,cAAc3B,QAAQgB,KAAR,CAAcS,aAAd,EAA6B,CAAC,CAA9B,CAAlB;;YAEMtF,KAAN,CAAYC,SAAZ,CAAsB4D,OAAtB,GAAgC2B,WAAhC;cACQjB,QAAQgB,UAAUlI,MAA1B;;gBAEUkI,SAAV;;;YAGMvH,OAAR,CAAgB,gBAAQ;UAClByH,SAAS1C,QAAQoB,KAAR,CAAc1E,GAAd,CAAkBL,KAAKO,EAAvB,CAAb;YACM+F,GAAN,CAAUD,MAAV,EAAkBrG,IAAlB;KAFF;;;;;;;aAUS,gBAAT;UACMY,KAAN,CAAYC,SAAZ,CAAsB8D,aAAtB,GAAsC,IAAtC;WACO,IAAI/B,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;YAChCc,MAAN,GACCiB,IADD,CACM,eAAO;gBACHb,GAAR,0BAAqCuC,GAArC,2BACc7H,OAAOD,IAAP,CAAY0F,OAAZ,EAAqBlG,MAArB,GAA8BkG,OAA9B,GAAwC,EADtD,6BAEgBG,UAAUrG,MAAV,GAAmBqG,SAAnB,GAA+B,EAF/C,2BAGcG,QAAQxG,MAAR,GAAiBwG,OAAjB,GAA2B,EAHzC;YAKI+B,qBAAqB9H,OAAOD,IAAP,CAAYkC,MAAMC,KAAN,CAAYC,SAAZ,CAAsBsD,OAAlC,EAA2ClG,MAA3C,GACrB0C,MAAMC,KAAN,CAAYC,SAAZ,CAAsByD,SAAtB,CAAgCrG,MADX,GAErB0C,MAAMC,KAAN,CAAYC,SAAZ,CAAsB4D,OAAtB,CAA8BxG,MAFlC;YAGIuI,kBAAJ,EAAwB;mBAAW,WAAT;;iBACjB,eAAT;eACO3D,SAAP;;;;;;;;;;;;;OAZF,EAyBG4D,KAzBH,CAyBS,iBAAS;cACV7F,KAAN,CAAY8F,QAAZ,GAAuB,OAAvB;cACM9F,KAAN,CAAYC,SAAZ,CAAsB8D,aAAtB,GAAsC,IAAtC;eACO7B,QAAP;OA5BF;KADK,CAAP;GAzJY;OAAA,wBA+LZ;QAJCnC,KAID,SAJCA,KAID;QAJQgD,OAIR,SAJQA,OAIR;QAJiBC,MAIjB,SAJiBA,MAIjB;QAJyBC,QAIzB,SAJyBA,QAIzB;;oFAHoC,EAAC8C,cAAc,EAAf,EAAmBC,SAAS;;;KAGhE;mCAHCD,YAGD;QAHCA,YAGD,sCAHgB,EAGhB;8BAHoBC,OAGpB;QAHoBA,OAGpB,iCAH8B,EAG9B;;WACO,IAAIhE,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;cAC9BkB,GAAR,CAAY,kBAAZ;UACI,CAACL,QAAQe,QAAb,EAAuB,OAAO7B,SAAP;UACjBgE,aAAa5E,KAAKE,SAAL,CAAe,EAACwE,0BAAD,EAAeC,gBAAf,EAAf,CAAnB;UACME,UAAUnG,MAAMC,KAAN,CAAYkG,OAAZ,CAAoBD,UAApB,CAAhB;;UAEI,CAACC,OAAL,EAAc;YACRC,MAAMpD,QAAQoB,KAAlB;;qBAEanG,OAAb,CAAqB,qBAAa;;;gBAC1B,cAAIoI,KAAJ,gCAAaC,SAAb,EAAN;SADF;YAGIL,QAAQ3I,MAAZ,EAAoB;;;gBACZ,eAAI2I,OAAJ,iCAAeA,OAAf,EAAN;;cAEIhG,KAAN,CAAYkG,OAAZ,CAAoBD,UAApB,IAAkC;kBAAA;gBAE1B,KAF0B;8BAGZ,EAHY;wBAIlB;SAJhB;;UAOIK,WAAWvG,MAAMC,KAAN,CAAYkG,OAAZ,CAAoBD,UAApB,CAAjB;;UAEIK,SAASvE,IAAb,EAAmB;gBACTqB,GAAR,CAAY,eAAZ;eACOnB,QAAQ,YAAR,CAAP;;;UAGEsE,OAAOxG,MAAMC,KAAN,CAAYkG,OAAZ,CAAoBD,UAApB,EAAgCE,GAA3C;UACIG,SAASE,YAAb,EAA2B;;eAElBzG,MAAMC,KAAN,CAAYkG,OAAZ,CAAoBD,UAApB,EAAgCO,YAAvC;;aAEKD,KAAKE,KAAL,CAAW1G,MAAMG,KAAN,CAAYwG,KAAZ,CAAkBC,QAA7B,CAAP;;UAEIL,SAASM,kBAAT,CAA4BC,QAA5B,CAAqCN,IAArC,CAAJ,EAAgD;gBACtCnD,GAAR,CAAY,8BAAZ;eACOnB,SAAP;;;WAGG6E,GAAL,GACC7C,IADD,CACM,yBAAiB;YACfN,OAAOoD,cAAcpD,IAA3B;YACIA,KAAKtG,MAAL,KAAgB,CAApB,EAAuB;gBACf2C,KAAN,CAAYkG,OAAZ,CAAoBD,UAApB,EAAgClE,IAAhC,GAAuC,IAAvC;kBACQ,YAAR;;;;YAIE4B,KAAKtG,MAAL,GAAc0C,MAAMG,KAAN,CAAYwG,KAAZ,CAAkBC,QAApC,EAA8C;gBACtC3G,KAAN,CAAYkG,OAAZ,CAAoBD,UAApB,EAAgClE,IAAhC,GAAuC,IAAvC;;cAEI/B,KAAN,CAAYkG,OAAZ,CAAoBD,UAApB,EAAgCW,kBAAhC,CAAmDtJ,IAAnD,CAAwD0J,QAAxD;;gBAEQD,aAAR;YACME,cAActD,KAAKA,KAAKtG,MAAL,GAAc,CAAnB,CAApB;;YAEM6J,OAAOX,KAAKY,UAAL,CAAgBF,WAAhB,CAAb;cACMjH,KAAN,CAAYkG,OAAZ,CAAoBD,UAApB,EAAgCO,YAAhC,GAA+CU,IAA/C;OAlBF,EAmBGrB,KAnBH,CAmBS,iBAAS;gBACRzC,GAAR,CAAY9D,KAAZ;eACO4C,OAAO5C,KAAP,CAAP;OArBF;KAzCK,CAAP;GAhMY;cAAA,wCAkQkC;QAAjC0D,MAAiC,UAAjCA,MAAiC;QAAvBnD,MAAuB,UAAvBA,MAAuB;QAAfF,EAAe,UAAfA,EAAe;4BAAXF,GAAW;QAAXA,GAAW,8BAAL,EAAK;;QAC1CE,EAAJ,GAASA,EAAT;YACQE,MAAR;WACO,OAAL;eACS,YAAP,EAAqBJ,GAArB;;WAEG,SAAL;eACS,YAAP,EAAqBE,EAArB;;;eAGO,WAAP,EAAoBF,GAApB;;;GA5QQ;eAAA,iCAgRqC;QAAnCsD,OAAmC,UAAnCA,OAAmC;QAA1BhD,KAA0B,UAA1BA,KAA0B;QAAnBiD,MAAmB,UAAnBA,MAAmB;QAAXC,QAAW,UAAXA,QAAW;;QAC7CoB,SAAS+C,IAAT,GAAgBC,WAApB,EAAiCtH,MAAMC,KAAN,CAAY8D,QAAZ,GAAuB,IAAvB;QAC3BI,iBAAiBnB,QAAQmB,cAA/B;QACIC,QAAQpB,QAAQoB,KAApB;;QAEIpE,MAAMG,KAAN,CAAYC,gBAAZ,CAA6BC,WAA7B,OAA+C,KAAnD,EAA0D;YAClDF,KAAN,CAAYoH,IAAZ,CAAiBlB,KAAjB,CAAuBpI,OAAvB,CAA+B,qBAAa;;;gBAClC,iBAAMoI,KAAN,iCAAeC,SAAf,EAAR;OADF;UAGItG,MAAMG,KAAN,CAAYoH,IAAZ,CAAiBtB,OAAjB,CAAyB3I,MAA7B,EAAqC;;;gBAC3B,kBAAM2I,OAAN,kCAAiBjG,MAAMG,KAAN,CAAYoH,IAAZ,CAAiBtB,OAAlC,EAAR;;;;aAIKuB,SAAT,CAAoB1H,MAApB,EAA4BF,EAA5B,EAAgCF,GAAhC,EAAqCG,MAArC,EAA6C;eACjC,CAACC,MAAF,GAAY,UAAZ,GAAyBA,OAAOpC,IAAzC;;eAES+J,aAAT,CAAwBC,IAAxB,EAA8B;eACrBxE,SAAS,cAAT,EAAyB,EAACpD,cAAD,EAASF,MAAT,EAAaF,KAAKgI,IAAlB,EAAzB,CAAP;;;UAGIC,aAAa3H,MAAMG,KAAN,CAAYoH,IAAZ,CAAiBzH,SAAS,MAA1B,CAAnB;UACI6H,UAAJ,EAAgB;mBACHF,aAAX,EAA0B/H,GAA1B,EAA+BE,EAA/B,EAAmC,IAAnC,EAAyCC,MAAzC,EAAiDC,MAAjD;OADF,MAEO;sBACSJ,GAAd;;;;WAIG,IAAIuC,OAAJ,CAAa,UAACC,OAAD,EAAUC,MAAV,EAAqB;YAEtCyF,UADD,CACY,yBAAiB;YACvB/H,SAASmH,cAAca,QAAd,CAAuBC,gBAAvB,GAA0C,OAA1C,GAAoD,QAAjE;YACI,CAAC3D,cAAL,EAAqB;cACbzE,MAAMqI,iBAAiBf,cAAcgB,IAAd,EAAjB,EAAuChI,MAAMG,KAAN,CAAY8H,YAAZ,CAAyBtG,aAAhE,CAAZ;cACI9B,WAAW,OAAf,EAAwB,OAAOqC,SAAP;oBACd,IAAV,EAAgB,IAAhB,EAAsBxC,GAAtB,EAA2BG,MAA3B;iBACOqC,SAAP;;sBAEYgG,UAAd,GAA2BjK,OAA3B,CAAmC,kBAAU;;cAEvC4B,WAAW,OAAX,KACDC,OAAOpC,IAAP,KAAgB,UAAhB,IAA8BoC,OAAOpC,IAAP,KAAgB,SAD7C,CAAJ,EAEE;mBACOwE,SAAP;;cAEItC,KAAKE,OAAOJ,GAAP,CAAWE,EAAtB;cACMF,MAAOI,OAAOpC,IAAP,KAAgB,OAAjB,GACRqK,iBAAiBjI,OAAOJ,GAAP,CAAWsI,IAAX,EAAjB,EAAoChI,MAAMG,KAAN,CAAY8H,YAAZ,CAAyBtG,aAA7D,CADQ,GAER7B,OAAOJ,GAAP,CAAWsI,IAAX,EAFJ;oBAGUlI,MAAV,EAAkBF,EAAlB,EAAsBF,GAAtB,EAA2BG,MAA3B;iBACOqC,SAAP;SAZF;OATF,EAuBG,iBAAS;cACJjC,KAAN,CAAY8F,QAAZ,GAAuB,OAAvB;eACO5D,OAAO5C,KAAP,CAAP;OAzBF;KADK,CAAP;GA7SY;KAAA,0BA2U2BG,GA3U3B,EA2UgC;QAAxCuD,MAAwC,UAAxCA,MAAwC;QAAhCC,QAAgC,UAAhCA,QAAgC;QAAtBF,OAAsB,UAAtBA,OAAsB;QAAbhD,KAAa,UAAbA,KAAa;;QACxC,CAACN,GAAL,EAAU;QACN,CAACsD,QAAQmB,cAAb,EAA6B;aACpBjB,SAAS,OAAT,EAAkBxD,GAAlB,CAAP;;QAEE,CAACA,IAAIE,EAAL,IAAW,CAACI,MAAMA,MAAMG,KAAN,CAAYK,aAAlB,EAAiCd,IAAIE,EAArC,CAAhB,EAA0D;aACjDsD,SAAS,QAAT,EAAmBxD,GAAnB,CAAP;;WAEKwD,SAAS,OAAT,EAAkBxD,GAAlB,CAAP;GAnVY;QAAA,0BAqV8BA,GArV9B,EAqVmC;QAAxCM,KAAwC,UAAxCA,KAAwC;QAAjCgD,OAAiC,UAAjCA,OAAiC;QAAxBC,MAAwB,UAAxBA,MAAwB;QAAhBC,QAAgB,UAAhBA,QAAgB;;QAC3C,CAACxD,GAAL,EAAU;QACN,CAACA,IAAIE,EAAT,EAAaF,IAAIE,EAAJ,GAASoD,QAAQoB,KAAR,CAAc1E,GAAd,GAAoBE,EAA7B;;aAEJ6H,aAAT,CAAwBC,IAAxB,EAA8B;aACrB,YAAP,EAAqBA,IAArB;aACOxE,SAAS,WAAT,EAAsBwE,IAAtB,CAAP;;;QAGE1H,MAAMG,KAAN,CAAYgI,UAAhB,EAA4B;aACnBnI,MAAMG,KAAN,CAAYgI,UAAZ,CAAuBV,aAAvB,EAAsC/H,GAAtC,EAA2C,IAA3C,CAAP;;WAEK+H,cAAc/H,GAAd,CAAP;GAjWY;OAAA,yBAmW6BA,GAnW7B,EAmWkC;QAAxCM,KAAwC,UAAxCA,KAAwC;QAAjCgD,OAAiC,UAAjCA,OAAiC;QAAxBC,MAAwB,UAAxBA,MAAwB;QAAhBC,QAAgB,UAAhBA,QAAgB;;QAC1C,CAACxD,GAAL,EAAU;QACN,CAACA,IAAIE,EAAL,IAAWoD,QAAQmB,cAAvB,EAAuC;;aAE9BsD,aAAT,CAAwBC,IAAxB,EAA8B;aACrB,WAAP,EAAoBA,IAApB;aACOxE,SAAS,UAAT,EAAqB,EAACtD,IAAI8H,KAAK9H,EAAV,EAAcF,KAAKgI,IAAnB,EAArB,CAAP;;;QAGE1H,MAAMG,KAAN,CAAYiI,SAAhB,EAA2B;aAClBpI,MAAMG,KAAN,CAAYiI,SAAZ,CAAsBX,aAAtB,EAAqC/H,GAArC,EAA0C,IAA1C,CAAP;;WAEK+H,cAAc/H,GAAd,CAAP;GA/WY;YAAA,sCAoXZ;QAFCM,KAED,UAFCA,KAED;QAFQgD,OAER,UAFQA,OAER;QAFiBC,MAEjB,UAFiBA,MAEjB;QAFyBC,QAEzB,UAFyBA,QAEzB;QADCxD,GACD,UADCA,GACD;4BADMyD,GACN;QADMA,GACN,8BADY,EACZ;;QACI,CAACzD,GAAL,EAAU;;aAED+H,aAAT,CAAwBC,IAAxB,EAA8B;aACrB,WAAP,EAAoBA,IAApB;aACOxE,SAAS,UAAT,EAAqB,EAACC,QAAD,EAAMzD,KAAKgI,IAAX,EAArB,CAAP;;;QAGE1H,MAAMG,KAAN,CAAYiI,SAAhB,EAA2B;aAClBpI,MAAMG,KAAN,CAAYiI,SAAZ,CAAsBX,aAAtB,EAAqC/H,GAArC,EAA0C,IAA1C,CAAP;;WAEK+H,cAAc/H,GAAd,CAAP;GA/XY;QAAA,2BAiY8BE,EAjY9B,EAiYkC;QAAvCI,KAAuC,UAAvCA,KAAuC;QAAhCgD,OAAgC,UAAhCA,OAAgC;QAAvBC,MAAuB,UAAvBA,MAAuB;QAAfC,QAAe,UAAfA,QAAe;;;aAErCuE,aAAT,CAAwBY,GAAxB,EAA6B;aACpB,YAAP,EAAqBA,GAArB;aACOnF,SAAS,WAAT,EAAsBmF,GAAtB,CAAP;;;QAGErI,MAAMG,KAAN,CAAYmI,UAAhB,EAA4B;aACnBtI,MAAMG,KAAN,CAAYmI,UAAZ,CAAuBb,aAAvB,EAAsC7H,EAAtC,EAA0C,IAA1C,CAAP;;WAEK6H,cAAc7H,EAAd,CAAP;GA3YY;eAAA,iCA6YkB;QAAhBI,KAAgB,UAAhBA,KAAgB;QAATiD,MAAS,UAATA,MAAS;;QAC1BjD,MAAMC,KAAN,CAAYsI,mBAAhB,EAAqC;mBAAevI,MAAMC,KAAN,CAAYsI,mBAAzB;;UACjCtI,KAAN,CAAYsI,mBAAZ,GAAkCC,WAAW,aAAK;YAAQvI,KAAN,CAAY8F,QAAZ,GAAuB,KAAvB;KAAlB,EAAkD,GAAlD,CAAlC;GA/YY;gBAAA,kCAiZmB;QAAhB/F,KAAgB,UAAhBA,KAAgB;QAATiD,MAAS,UAATA,MAAS;;QAC3BjD,MAAMC,KAAN,CAAYsI,mBAAhB,EAAqC;mBAAevI,MAAMC,KAAN,CAAYsI,mBAAzB;;UACjCtI,KAAN,CAAY8F,QAAZ,GAAuB,IAAvB;;CAnZJ;;AAuZA,AAAe,uBAA4B;MAAlB0C,WAAkB,uEAAJ,EAAI;;SAClC1K,OAAOgD,MAAP,CAAc,EAAd,EAAkBgC,OAAlB,EAA2B0F,WAA3B,CAAP;;;AChaF;;;;;;;;;AASA,AAAe,yBAAUxH,GAAV,EAA2C;MAA5ByH,SAA4B,uEAAhB,EAAgB;MAAZC,KAAY,uEAAJ,EAAI;;MACpD,CAACrJ,SAAS2B,GAAT,CAAL,EAAoB,OAAOA,GAAP;MAChByH,UAAUpL,MAAd,EAAsB;WACbQ,IAAP,CAAYmD,GAAZ,EAAiBhD,OAAjB,CAAyB,eAAO;UAC1B,CAACyK,UAAU5B,QAAV,CAAmB5I,GAAnB,CAAL,EAA8B;eACrB+C,IAAI/C,GAAJ,CAAP;;KAFJ;;QAMID,OAAN,CAAc,eAAO;WACZgD,IAAI/C,GAAJ,CAAP;GADF;SAGO+C,GAAP;;;AChBF,IAAM+B,UAAU;YACJ,kBAAChD,KAAD,EAAQgD,OAAR,EAAiB4F,SAAjB,EAA4BC,WAA5B,EAA4C;WAC7C7I,MAAMC,KAAN,CAAY8D,QAAnB;GAFY;SAIP,eAAC/D,KAAD,EAAQgD,OAAR,EAAiB4F,SAAjB,EAA4BC,WAA5B,EAA4C;QAC7C,CAAC7F,QAAQe,QAAb,EAAuB,OAAO,KAAP;QACnB,CAACO,SAAS+C,IAAT,GAAgBC,WAArB,EAAkC,OAAO,KAAP;QAC5BwB,SAASxE,SAAS+C,IAAT,GAAgBC,WAAhB,CAA4ByB,GAA3C;QACMtG,OAAOzC,MAAMG,KAAN,CAAY6I,aAAZ,CAA0BC,OAA1B,CAAkC,UAAlC,EAA8CH,MAA9C,CAAb;WACQ9I,MAAMG,KAAN,CAAYC,gBAAZ,CAA6BC,WAA7B,OAA+C,YAAhD,GACHiE,SAASC,SAAT,GAAqB2E,UAArB,CAAgCzG,IAAhC,CADG,GAEH6B,SAASC,SAAT,GAAqB7E,GAArB,CAAyB+C,IAAzB,CAFJ;GATY;YAaJ,kBAACzC,KAAD,EAAQgD,OAAR,EAAiB4F,SAAjB,EAA+B;QACjCnG,OAAQzC,MAAMG,KAAN,CAAYK,aAAb,GACNR,MAAMG,KAAN,CAAYgJ,UADN,SACoBnJ,MAAMG,KAAN,CAAYK,aADhC,GAETR,MAAMG,KAAN,CAAYgJ,UAFhB;WAGOC,WAAWR,SAAX,EAAsBnG,IAAtB,CAAP;GAjBY;kBAmBE,wBAACzC,KAAD,EAAQgD,OAAR,EAAiB4F,SAAjB,EAA+B;WACrC5I,MAAMG,KAAN,CAAYC,gBAAZ,CAA6BC,WAA7B,OAA+C,YAAvD;GApBY;mBAsBG,yBAACL,KAAD,EAAQgD,OAAR,EAAiB4F,SAAjB,EAA4BC,WAA5B;WACjB,YAAwB;UAAvB1F,GAAuB,uEAAjB,EAAiB;UAAbzD,GAAa,uEAAP,EAAO;;;UAEhByE,iBAAiBnB,QAAQmB,cAA/B;UACI,CAACA,cAAL,EAAqBhB,IAAI5F,IAAJ,CAAS,WAAT;;aAEd4F,IAAIT,MAAJ,CAAW,UAACC,KAAD,EAAQ/C,EAAR,EAAe;YAC3ByJ,YAAY,EAAhB;;YAEI,CAACtL,OAAOD,IAAP,CAAY4B,GAAZ,EAAiBpC,MAAtB,EAA8B;sBACf6G,cAAD,GACRnB,QAAQsG,QAAR,CAAiB1J,EAAjB,CADQ,GAERoD,QAAQsG,QAFZ;SADF,MAIO;sBACO5J,GAAZ;;oBAEUsB,QAAQqI,SAAR,CAAZ;oBACYE,eAAeF,SAAf,EAA0BrJ,MAAMG,KAAN,CAAYoH,IAAZ,CAAiBmB,SAA3C,EAAsD1I,MAAMG,KAAN,CAAYoH,IAAZ,CAAiBoB,KAAvE,CAAZ;kBACUa,UAAV,GAAuBlF,SAASC,SAAT,CAAmBkF,UAAnB,CAA8BC,eAA9B,EAAvB;cACM9J,EAAN,IAAYyJ,SAAZ;eACO1G,KAAP;OAdK,EAeJ,EAfI,CAAP;KANe;GAtBH;sBA6CM,4BAAC3C,KAAD,EAAQgD,OAAR,EAAiB4F,SAAjB,EAA4BC,WAA5B;WACpB,YAAc;UAAb1F,GAAa,uEAAP,EAAO;;aACLA,IAAIT,MAAJ,CAAW,UAACC,KAAD,EAAQ/C,EAAR,EAAe;cACzBrC,IAAN,CAAWqC,EAAX;eACO+C,KAAP;OAFK,EAGJ,EAHI,CAAP;KAFkB;GA7CN;oBAoDI,0BAAC3C,KAAD,EAAQgD,OAAR,EAAiB4F,SAAjB,EAA4BC,WAA5B;WAClB,YAAgB;UAAfc,KAAe,uEAAP,EAAO;;cACN3I,QAAQ2I,KAAR,CAAR;aACOA,MAAMjH,MAAN,CAAa,UAACC,KAAD,EAAQtD,IAAR,EAAiB;eAC5BkK,eAAelK,IAAf,EAAqBW,MAAMG,KAAN,CAAYoH,IAAZ,CAAiBmB,SAAtC,EAAiD1I,MAAMG,KAAN,CAAYoH,IAAZ,CAAiBoB,KAAlE,CAAP;aACKiB,UAAL,GAAkBtF,SAASC,SAAT,CAAmBkF,UAAnB,CAA8BC,eAA9B,EAAlB;aACKG,UAAL,GAAkBhB,YAAY,SAAZ,CAAlB;cACMtL,IAAN,CAAW8B,IAAX;eACOsD,KAAP;OALK,EAMJ,EANI,CAAP;KAHgB;;CApDpB;;AAiEA,AAAe,uBAA4B;MAAlBmH,WAAkB,uEAAJ,EAAI;;SAClC/L,OAAOgD,MAAP,CAAc,EAAd,EAAkBiC,OAAlB,EAA2B8G,WAA3B,CAAP;;;ACxEa,SAASC,UAAT,CAAqBvL,MAArB,EAA6B;MACtCwL,WAAW,CAAC,eAAD,EAAkB,YAAlB,CAAf;WACS/L,OAAT,CAAiB,gBAAQ;QACnB,CAACO,OAAOyL,IAAP,CAAL,EAAmB;cACT1K,KAAR,cAAyB0K,IAAzB;aACO,KAAP;;GAHJ;MAMI,UAAUC,IAAV,CAAe1L,OAAOgC,aAAtB,CAAJ,EAA0C;YAChCjB,KAAR;WACO,KAAP;;MAEE,KAAK2K,IAAL,CAAU1L,OAAO2K,UAAjB,CAAJ,EAAkC;YACxB5J,KAAR;WACO,KAAP;;SAEK,IAAP;;;ACRF;;;;;;AAMA,AAAe,oBAAU4K,UAAV,EAAsB;MAC7BC,OAAO7L,QAAM8L,aAAN,EAAqBF,UAArB,CAAb;MACI,CAACJ,WAAWK,IAAX,CAAL,EAAuB;MACjBE,YAAYF,KAAKpK,KAAvB;MACMY,gBAAgBwJ,KAAKrK,SAA3B;MACM0I,cAAc2B,KAAKrH,OAAzB;MACM+G,cAAcM,KAAKpH,OAAzB;SACOoH,KAAKpK,KAAZ;SACOoK,KAAKrK,SAAZ;SACOqK,KAAKrH,OAAZ;SACOqH,KAAKpH,OAAZ;;MAEMuH,eAAe,EAArB;MACIH,KAAK5J,aAAT,EAAwB+J,aAAaH,KAAK5J,aAAlB,IAAmC,EAAnC;MAClBR,QAAQzB,QAAMiM,YAAN,EAAoBF,SAApB,EAA+BC,YAA/B,EAA6C,EAACpK,OAAOiK,IAAR,EAA7C,CAAd;SACO;gBACO,IADP;gBAAA;eAGMK,aAAa7J,aAAb,EAA4BrC,QAAMiM,YAAN,EAAoBF,SAApB,CAA5B,CAHN;aAIII,WAAWjC,WAAX,CAJJ;aAKIkC,WAAWb,WAAX;GALX;;;ACxBa,SAASc,mBAAT,CAA8BT,UAA9B,EAA0C;SAChD,iBAAS;;QAEV,CAAC/L,QAAQ+L,UAAR,CAAL,EAA0BA,aAAa,CAACA,UAAD,CAAb;;eAEflM,OAAX,CAAmB,kBAAU;UACrBkL,aAAa0B,gBAAgBrM,OAAO2K,UAAvB,CAAnB;YACM2B,cAAN,CAAqB3B,UAArB,EAAiC4B,UAAUvM,MAAV,CAAjC;KAFF;UAIMwM,MAAN,GAAe,UAACvI,IAAD,EAAOwI,OAAP,EAAmB;aACzBtL,MAAMuD,QAAN,CAAeT,OAAO,SAAtB,EAAiCwI,OAAjC,CAAP;KADF;UAGMC,MAAN,GAAe,UAACzI,IAAD,EAAOwI,OAAP,EAAmB;aACzBtL,MAAMuD,QAAN,CAAeT,OAAO,SAAtB,EAAiCwI,OAAjC,CAAP;KADF;UAGME,KAAN,GAAc,UAAC1I,IAAD,EAAOwI,OAAP,EAAmB;aACxBtL,MAAMuD,QAAN,CAAeT,OAAO,QAAtB,EAAgCwI,OAAhC,CAAP;KADF;UAGMG,UAAN,GAAmB,UAAC3I,IAAD,EAAOwI,OAAP,EAAmB;aAC7BtL,MAAMuD,QAAN,CAAeT,OAAO,aAAtB,EAAqCwI,OAArC,CAAP;KADF;UAGM3F,MAAN,GAAe,UAAC7C,IAAD,EAAOwI,OAAP,EAAmB;aACzBtL,MAAMuD,QAAN,CAAeT,OAAO,SAAtB,EAAiCwI,OAAjC,CAAP;KADF;GApBF;;;;;"} \ No newline at end of file +{"version":3,"file":"index.es.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n // HOOKS for local changes:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.serverChange[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.sync.insertHook) {\n return state._conf.sync.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.sync.deleteHook) {\n return state._conf.sync.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","strategy","determineType","is","name","elements","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","error","deepmerge","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","deltaT","refresh","retrievePaths","path","reduce","carry","pathUntilNow","newPath","extra","actions","getters","commit","dispatch","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","signedIn","debounceTimer","startDebounce","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","fields","k","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","remainingSyncStack","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","serverChange","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","userActions","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","storeRef","checkFillables","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","reqProps","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.es.min.js b/dist/index.es.min.js index bdf1e386..0eed77b0 100644 --- a/dist/index.es.min.js +++ b/dist/index.es.min.js @@ -1,2 +1,2 @@ -import{isObject,isArray}from"is-what";import{defaultMutations,getDeepRef,getKeysFromPath}from"vuex-easy-access";import Firebase from"firebase/app";import"firebase/firestore";import"firebase/auth";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},toConsumableArray=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0;--n){var r=types[n];if(r.is(e)&&r.is(t))return r;if(r.is(e)||r.is(t))break}return null}(n,r);if(!o)return nanoclone(r);var c=e.strategy[o.name]||o.default;return o.merge[c](t,n,r)}return e||(e={}),e={strategy:e.strategy||{}},function(){return toArray$1(arguments).reduceRight(function(e,n){return t(n,e)})}}function wrapper(){var e=toArray$1(arguments);return 1===e.length?merge(e[0]):merge().apply(null,e)}function merge$1(){for(var e=arguments.length;e>0;e--){var t=arguments.length<=e-1?void 0:arguments[e-1];if(!isObject(t))return console.error("trying to merge a non-object: ",t),t}return wrapper.apply(void 0,arguments)}var defaultConfig={firestorePath:"",firestoreRefType:"",moduleName:"",statePropName:"",sync:{where:[],orderBy:[],fillables:[],guard:[]},insertHook:function(e,t,n){return e(t)},patchHook:function(e,t,n){return e(t)},deleteHook:function(e,t,n){return e(t)},serverChange:{defaultValues:{},addedHook:function(e,t,n,r,o,c){return e(t)},modifiedHook:function(e,t,n,r,o,c){return e(t)},removedHook:function(e,t,n,r,o,c){return e(t)}},fetch:{docLimit:50},state:{},getters:{},mutations:{},actions:{}},initialState={_sync:{signedIn:!1,patching:!1,syncStack:{updates:{},deletions:[],inserts:[],debounceTimer:null},fetched:[],stopPatchingTimeout:null}},mutations={resetSyncStack:function(e){e._sync.syncStack={updates:{},deletions:[],inserts:[],debounceTimer:null}},INSERT_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$set(e[e._conf.statePropName],t.id,t)},PATCH_DOC:function(e,t){var n=this;if("doc"===e._conf.firestoreRefType.toLowerCase())return e._conf.statePropName?void(e[e._conf.statePropName]=merge$1(e[e._conf.statePropName],t)):Object.keys(t).forEach(function(r){var o=void 0===e[r]?t[r]:isObject(e[r])&&isObject(t[r])?merge$1(e[r],t[r]):t[r];n._vm.$set(e,r,o)});var r=void 0===e[e._conf.statePropName][t.id]?t:isObject(e[e._conf.statePropName][t.id])&&isObject(t)?merge$1(e[e._conf.statePropName][t.id],t):t;this._vm.$set(e[e._conf.statePropName],t.id,r)},DELETE_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$delete(e[e._conf.statePropName],t)}};function iniMutations(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],n=defaultMutations(t);return Object.assign({},n,mutations,e)}function copyObj(e){var t=void 0;if("object"!=(void 0===e?"undefined":_typeof(e)))return e;if(!e)return e;if("[object Object]"!==Object.prototype.toString.call(e)||"[object Array]"!==Object.prototype.toString.call(e))return JSON.parse(JSON.stringify(e));if("[object Array]"===Object.prototype.toString.call(e)){t=[];for(var n=0,r=e.length;n=e&&(clearInterval(o),n(!0))},10)}),refresh:function(){return t=Date.now()}}}function retrievePaths(e,t,n){return isObject(e)&&Object.keys(e).length?Object.keys(e).reduce(function(r,o){var c=(t?t+".":"")+o,i=retrievePaths(e[o],c,n);return Object.assign(r,i)},{}):t?(n[t]=e,n):e}function flattenToPaths(e){return retrievePaths(e,null,{})}var actions={patchDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ids:[],doc:{}},c=o.id,i=void 0===c?"":c,a=o.ids,s=void 0===a?[]:a,u=o.doc;if(!isArray(s))return console.log("ids needs to be an array");i&&s.push(i),u.id&&delete u.id;var f=n.prepareForPatch(s,u);return Object.keys(f).forEach(function(e){var n=t._sync.syncStack.updates[e]?merge$1(t._sync.syncStack.updates[e],f[e]):f[e];t._sync.syncStack.updates[e]=n}),r("handleSyncStackDebounce")},deleteDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];isArray(o)||(o=[o]);var c=n.prepareForDeletion(o),i=t._sync.syncStack.deletions.concat(c);if(t._sync.syncStack.deletions=i,t._sync.syncStack.deletions.length)return r("handleSyncStackDebounce")},insertDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];isArray(o)||(o=[o]);var c=n.prepareForInsert(o),i=t._sync.syncStack.inserts.concat(c);return t._sync.syncStack.inserts=i,r("handleSyncStackDebounce")},handleSyncStackDebounce:function(e){var t=e.state,n=(e.commit,e.dispatch);if(!e.getters.signedIn)return!1;if(!t._sync.syncStack.debounceTimer){var r=startDebounce(1e3);r.done.then(function(e){return n("batchSync")}),t._sync.syncStack.debounceTimer=r}t._sync.syncStack.debounceTimer.refresh()},batchSync:function(e){var t=e.getters,n=(e.commit,e.dispatch),r=e.state,o=t.collectionMode,c=t.dbRef,i=Firebase.firestore().batch(),a=0,s=copyObj(r._sync.syncStack.updates),u=Object.keys(s).map(function(e){return{id:e,fields:s[e]}});if(u.length>=500){a=500;var f=u.slice(0,500),d=u.slice(500,-1);r._sync.syncStack.updates=d.reduce(function(e,t){return e[t.id]=t,delete t.id,e},{}),u=f}else r._sync.syncStack.updates={},a=u.length;u.forEach(function(e){var t=e.id,n=o?c.doc(t):c,r=flattenToPaths(e.fields);console.log("fields → ",r),i.update(n,r)});var l=copyObj(r._sync.syncStack.deletions);if(a>=500)l=[];else{var h=500-a,y=l.slice(0,h),p=l.slice(h,-1);r._sync.syncStack.deletions=p,a+=y.length,l=y}l.forEach(function(e){var t=c.doc(e);i.delete(t)});var m=copyObj(r._sync.syncStack.inserts);if(a>=500)m=[];else{var g=500-a,v=m.slice(0,g),_=m.slice(g,-1);r._sync.syncStack.inserts=_,a+=v.length,m=v}return m.forEach(function(e){var n=t.dbRef.doc(e.id);i.set(n,e)}),n("_startPatching"),r._sync.syncStack.debounceTimer=null,new Promise(function(e,t){i.commit().then(function(t){return console.log("[batchSync] RESOLVED:",t,"\n updates: ",Object.keys(u).length?u:{},"\n deletions: ",l.length?l:[],"\n inserts: ",m.length?m:[]),Object.keys(r._sync.syncStack.updates).length+r._sync.syncStack.deletions.length+r._sync.syncStack.inserts.length&&n("batchSync"),n("_stopPatching"),e()}).catch(function(e){return r._sync.patching="error",r._sync.syncStack.debounceTimer=null,t()})})},fetch:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{whereFilters:[],orderBy:[]}),o=r.whereFilters,c=void 0===o?[]:o,i=r.orderBy,a=void 0===i?[]:i;return new Promise(function(e,r){if(console.log("[fetch] starting"),!n.signedIn)return e();var o=JSON.stringify({whereFilters:c,orderBy:a});if(!t._sync.fetched[o]){var i,s=n.dbRef;if(c.forEach(function(e){var t;s=(t=s).where.apply(t,toConsumableArray(e))}),a.length)s=(i=s).orderBy.apply(i,toConsumableArray(a));t._sync.fetched[o]={ref:s,done:!1,retrievedFetchRefs:[],nextFetchRef:null}}var u=t._sync.fetched[o];if(u.done)return console.log("done fetching"),e("fetchedAll");var f=t._sync.fetched[o].ref;if(u.nextFetchRef&&(f=t._sync.fetched[o].nextFetchRef),f=f.limit(t._conf.fetch.docLimit),u.retrievedFetchRefs.includes(f))return console.log("Already retrieved this part."),e();f.get().then(function(n){var r=n.docs;if(0===r.length)return t._sync.fetched[o].done=!0,void e("fetchedAll");r.length0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},actions,e)}function checkFillables(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return isObject(e)?(t.length&&Object.keys(e).forEach(function(n){t.includes(n)||delete e[n]}),n.forEach(function(t){delete e[t]}),e):e}var getters={signedIn:function(e,t,n,r){return e._sync.signedIn},dbRef:function(e,t,n,r){if(!t.signedIn)return!1;if(!Firebase.auth().currentUser)return!1;var o=Firebase.auth().currentUser.uid,c=e._conf.firestorePath.replace("{userId}",o);return"collection"===e._conf.firestoreRefType.toLowerCase()?Firebase.firestore().collection(c):Firebase.firestore().doc(c)},storeRef:function(e,t,n){var r=e._conf.statePropName?e._conf.moduleName+"/"+e._conf.statePropName:e._conf.moduleName;return getDeepRef(n,r)},collectionMode:function(e,t,n){return"collection"===e._conf.firestoreRefType.toLowerCase()},prepareForPatch:function(e,t,n,r){return function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=t.collectionMode;return o||n.push("singleDoc"),n.reduce(function(n,c){var i={};return(i=checkFillables(i=copyObj(i=Object.keys(r).length?r:o?t.storeRef[c]:t.storeRef),e._conf.sync.fillables,e._conf.sync.guard)).updated_at=Firebase.firestore.FieldValue.serverTimestamp(),n[c]=i,n},{})}},prepareForDeletion:function(e,t,n,r){return function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).reduce(function(e,t){return e.push(t),e},[])}},prepareForInsert:function(e,t,n,r){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(t=copyObj(t)).reduce(function(t,n){return(n=checkFillables(n,e._conf.sync.fillables,e._conf.sync.guard)).created_at=Firebase.firestore.FieldValue.serverTimestamp(),n.created_by=r["user/id"],t.push(n),t},[])}}};function iniGetters(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},getters,e)}function errorCheck(e){return["firestorePath","moduleName"].forEach(function(t){if(!e[t])return console.error("Missing "+t+" from your config!"),!1}),/(\.|\/)/.test(e.statePropName)?(console.error("statePropName must only include letters from [a-z]"),!1):!/\./.test(e.moduleName)||(console.error("moduleName must only include letters from [a-z] and forward slashes '/'"),!1)}function iniModule(e){var t=merge$1(defaultConfig,e);if(errorCheck(t)){var n=t.state,r=t.mutations,o=t.actions,c=t.getters;delete t.state,delete t.mutations,delete t.actions,delete t.getters;var i={};return t.statePropName&&(i[t.statePropName]={}),{namespaced:!0,state:merge$1(initialState,n,i,{_conf:t}),mutations:iniMutations(r,merge$1(initialState,n)),actions:iniActions(o),getters:iniGetters(c)}}}function createEasyFirestore(e){return function(t){isArray(e)||(e=[e]),e.forEach(function(e){var n=getKeysFromPath(e.moduleName);t.registerModule(n,iniModule(e))}),t.setDoc=function(e,n){return t.dispatch(e+"/setDoc",n)},t.insert=function(e,n){return t.dispatch(e+"/insert",n)},t.patch=function(e,n){return t.dispatch(e+"/patch",n)},t.patchBatch=function(e,n){return t.dispatch(e+"/patchBatch",n)},t.delete=function(e,n){return t.dispatch(e+"/delete",n)}}}export default createEasyFirestore; +import{isObject,isArray}from"is-what";import{defaultMutations,getDeepRef,getKeysFromPath}from"vuex-easy-access";import Firebase from"firebase/app";import"firebase/firestore";import"firebase/auth";var _typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},toConsumableArray=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0;--n){var r=types[n];if(r.is(e)&&r.is(t))return r;if(r.is(e)||r.is(t))break}return null}(n,r);if(!o)return nanoclone(r);var c=e.strategy[o.name]||o.default;return o.merge[c](t,n,r)}return e||(e={}),e={strategy:e.strategy||{}},function(){return toArray$1(arguments).reduceRight(function(e,n){return t(n,e)})}}function wrapper(){var e=toArray$1(arguments);return 1===e.length?merge(e[0]):merge().apply(null,e)}function merge$1(){for(var e=arguments.length;e>0;e--){var t=arguments.length<=e-1?void 0:arguments[e-1];if(!isObject(t))return console.error("trying to merge a non-object: ",t),t}return wrapper.apply(void 0,arguments)}var defaultConfig={firestorePath:"",firestoreRefType:"",moduleName:"",statePropName:"",sync:{where:[],orderBy:[],fillables:[],guard:[],insertHook:function(e,t,n){return e(t)},patchHook:function(e,t,n){return e(t)},deleteHook:function(e,t,n){return e(t)}},serverChange:{defaultValues:{},addedHook:function(e,t,n,r,o,c){return e(t)},modifiedHook:function(e,t,n,r,o,c){return e(t)},removedHook:function(e,t,n,r,o,c){return e(t)}},fetch:{docLimit:50},state:{},getters:{},mutations:{},actions:{}},initialState={_sync:{signedIn:!1,patching:!1,syncStack:{updates:{},deletions:[],inserts:[],debounceTimer:null},fetched:[],stopPatchingTimeout:null}},mutations={resetSyncStack:function(e){e._sync.syncStack={updates:{},deletions:[],inserts:[],debounceTimer:null}},INSERT_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$set(e[e._conf.statePropName],t.id,t)},PATCH_DOC:function(e,t){var n=this;if("doc"===e._conf.firestoreRefType.toLowerCase())return e._conf.statePropName?void(e[e._conf.statePropName]=merge$1(e[e._conf.statePropName],t)):Object.keys(t).forEach(function(r){var o=void 0===e[r]?t[r]:isObject(e[r])&&isObject(t[r])?merge$1(e[r],t[r]):t[r];n._vm.$set(e,r,o)});var r=void 0===e[e._conf.statePropName][t.id]?t:isObject(e[e._conf.statePropName][t.id])&&isObject(t)?merge$1(e[e._conf.statePropName][t.id],t):t;this._vm.$set(e[e._conf.statePropName],t.id,r)},DELETE_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$delete(e[e._conf.statePropName],t)}};function iniMutations(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments[1],n=defaultMutations(t);return Object.assign({},n,mutations,e)}function copyObj(e){var t=void 0;if("object"!=(void 0===e?"undefined":_typeof(e)))return e;if(!e)return e;if("[object Object]"!==Object.prototype.toString.call(e)||"[object Array]"!==Object.prototype.toString.call(e))return JSON.parse(JSON.stringify(e));if("[object Array]"===Object.prototype.toString.call(e)){t=[];for(var n=0,r=e.length;n=e&&(clearInterval(o),n(!0))},10)}),refresh:function(){return t=Date.now()}}}function retrievePaths(e,t,n){return isObject(e)&&Object.keys(e).length?Object.keys(e).reduce(function(r,o){var c=(t?t+".":"")+o,i=retrievePaths(e[o],c,n);return Object.assign(r,i)},{}):t?(n[t]=e,n):e}function flattenToPaths(e){return retrievePaths(e,null,{})}var actions={patchDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{ids:[],doc:{}},c=o.id,i=void 0===c?"":c,a=o.ids,s=void 0===a?[]:a,u=o.doc;if(!isArray(s))return console.log("ids needs to be an array");i&&s.push(i),u.id&&delete u.id;var f=n.prepareForPatch(s,u);return Object.keys(f).forEach(function(e){var n=t._sync.syncStack.updates[e]?merge$1(t._sync.syncStack.updates[e],f[e]):f[e];t._sync.syncStack.updates[e]=n}),r("handleSyncStackDebounce")},deleteDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];isArray(o)||(o=[o]);var c=n.prepareForDeletion(o),i=t._sync.syncStack.deletions.concat(c);if(t._sync.syncStack.deletions=i,t._sync.syncStack.deletions.length)return r("handleSyncStackDebounce")},insertDoc:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];isArray(o)||(o=[o]);var c=n.prepareForInsert(o),i=t._sync.syncStack.inserts.concat(c);return t._sync.syncStack.inserts=i,r("handleSyncStackDebounce")},handleSyncStackDebounce:function(e){var t=e.state,n=(e.commit,e.dispatch);if(!e.getters.signedIn)return!1;if(!t._sync.syncStack.debounceTimer){var r=startDebounce(1e3);r.done.then(function(e){return n("batchSync")}),t._sync.syncStack.debounceTimer=r}t._sync.syncStack.debounceTimer.refresh()},batchSync:function(e){var t=e.getters,n=(e.commit,e.dispatch),r=e.state,o=t.collectionMode,c=t.dbRef,i=Firebase.firestore().batch(),a=0,s=copyObj(r._sync.syncStack.updates),u=Object.keys(s).map(function(e){return{id:e,fields:s[e]}});if(u.length>=500){a=500;var f=u.slice(0,500),d=u.slice(500,-1);r._sync.syncStack.updates=d.reduce(function(e,t){return e[t.id]=t,delete t.id,e},{}),u=f}else r._sync.syncStack.updates={},a=u.length;u.forEach(function(e){var t=e.id,n=o?c.doc(t):c,r=flattenToPaths(e.fields);console.log("fields → ",r),i.update(n,r)});var l=copyObj(r._sync.syncStack.deletions);if(a>=500)l=[];else{var h=500-a,y=l.slice(0,h),p=l.slice(h,-1);r._sync.syncStack.deletions=p,a+=y.length,l=y}l.forEach(function(e){var t=c.doc(e);i.delete(t)});var m=copyObj(r._sync.syncStack.inserts);if(a>=500)m=[];else{var g=500-a,v=m.slice(0,g),_=m.slice(g,-1);r._sync.syncStack.inserts=_,a+=v.length,m=v}return m.forEach(function(e){var n=t.dbRef.doc(e.id);i.set(n,e)}),n("_startPatching"),r._sync.syncStack.debounceTimer=null,new Promise(function(e,t){i.commit().then(function(t){return console.log("[batchSync] RESOLVED:",t,"\n updates: ",Object.keys(u).length?u:{},"\n deletions: ",l.length?l:[],"\n inserts: ",m.length?m:[]),Object.keys(r._sync.syncStack.updates).length+r._sync.syncStack.deletions.length+r._sync.syncStack.inserts.length&&n("batchSync"),n("_stopPatching"),e()}).catch(function(e){return r._sync.patching="error",r._sync.syncStack.debounceTimer=null,t()})})},fetch:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{whereFilters:[],orderBy:[]}),o=r.whereFilters,c=void 0===o?[]:o,i=r.orderBy,a=void 0===i?[]:i;return new Promise(function(e,r){if(console.log("[fetch] starting"),!n.signedIn)return e();var o=JSON.stringify({whereFilters:c,orderBy:a});if(!t._sync.fetched[o]){var i,s=n.dbRef;if(c.forEach(function(e){var t;s=(t=s).where.apply(t,toConsumableArray(e))}),a.length)s=(i=s).orderBy.apply(i,toConsumableArray(a));t._sync.fetched[o]={ref:s,done:!1,retrievedFetchRefs:[],nextFetchRef:null}}var u=t._sync.fetched[o];if(u.done)return console.log("done fetching"),e("fetchedAll");var f=t._sync.fetched[o].ref;if(u.nextFetchRef&&(f=t._sync.fetched[o].nextFetchRef),f=f.limit(t._conf.fetch.docLimit),u.retrievedFetchRefs.includes(f))return console.log("Already retrieved this part."),e();f.get().then(function(n){var r=n.docs;if(0===r.length)return t._sync.fetched[o].done=!0,void e("fetchedAll");r.length0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},actions,e)}function checkFillables(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return isObject(e)?(t.length&&Object.keys(e).forEach(function(n){t.includes(n)||delete e[n]}),n.forEach(function(t){delete e[t]}),e):e}var getters={signedIn:function(e,t,n,r){return e._sync.signedIn},dbRef:function(e,t,n,r){if(!t.signedIn)return!1;if(!Firebase.auth().currentUser)return!1;var o=Firebase.auth().currentUser.uid,c=e._conf.firestorePath.replace("{userId}",o);return"collection"===e._conf.firestoreRefType.toLowerCase()?Firebase.firestore().collection(c):Firebase.firestore().doc(c)},storeRef:function(e,t,n){var r=e._conf.statePropName?e._conf.moduleName+"/"+e._conf.statePropName:e._conf.moduleName;return getDeepRef(n,r)},collectionMode:function(e,t,n){return"collection"===e._conf.firestoreRefType.toLowerCase()},prepareForPatch:function(e,t,n,r){return function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=t.collectionMode;return o||n.push("singleDoc"),n.reduce(function(n,c){var i={};return(i=checkFillables(i=copyObj(i=Object.keys(r).length?r:o?t.storeRef[c]:t.storeRef),e._conf.sync.fillables,e._conf.sync.guard)).updated_at=Firebase.firestore.FieldValue.serverTimestamp(),n[c]=i,n},{})}},prepareForDeletion:function(e,t,n,r){return function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).reduce(function(e,t){return e.push(t),e},[])}},prepareForInsert:function(e,t,n,r){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(t=copyObj(t)).reduce(function(t,n){return(n=checkFillables(n,e._conf.sync.fillables,e._conf.sync.guard)).created_at=Firebase.firestore.FieldValue.serverTimestamp(),n.created_by=r["user/id"],t.push(n),t},[])}}};function iniGetters(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},getters,e)}function errorCheck(e){return["firestorePath","moduleName"].forEach(function(t){if(!e[t])return console.error("Missing "+t+" from your config!"),!1}),/(\.|\/)/.test(e.statePropName)?(console.error("statePropName must only include letters from [a-z]"),!1):!/\./.test(e.moduleName)||(console.error("moduleName must only include letters from [a-z] and forward slashes '/'"),!1)}function iniModule(e){var t=merge$1(defaultConfig,e);if(errorCheck(t)){var n=t.state,r=t.mutations,o=t.actions,c=t.getters;delete t.state,delete t.mutations,delete t.actions,delete t.getters;var i={};return t.statePropName&&(i[t.statePropName]={}),{namespaced:!0,state:merge$1(initialState,n,i,{_conf:t}),mutations:iniMutations(r,merge$1(initialState,n)),actions:iniActions(o),getters:iniGetters(c)}}}function createEasyFirestore(e){return function(t){isArray(e)||(e=[e]),e.forEach(function(e){var n=getKeysFromPath(e.moduleName);t.registerModule(n,iniModule(e))}),t.setDoc=function(e,n){return t.dispatch(e+"/setDoc",n)},t.insert=function(e,n){return t.dispatch(e+"/insert",n)},t.patch=function(e,n){return t.dispatch(e+"/patch",n)},t.patchBatch=function(e,n){return t.dispatch(e+"/patchBatch",n)},t.delete=function(e,n){return t.dispatch(e+"/delete",n)}}}export default createEasyFirestore; //# sourceMappingURL=index.es.min.js.map diff --git a/dist/index.es.min.js.map b/dist/index.es.min.js.map index 3c47d896..53372c09 100644 --- a/dist/index.es.min.js.map +++ b/dist/index.es.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index.es.min.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n },\n\n // HOOKS:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.sync[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.insertHook) {\n return state._conf.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.deleteHook) {\n return state._conf.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","is","determineType","strategy","name","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","error","deepmerge","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","refresh","retrievePaths","path","reduce","carry","newPath","extra","actions","getters","dispatch","commit","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","signedIn","debounceTimer","startDebounce","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","k","fields","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","this","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","serverChange","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","userActions","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","checkFillables","storeRef","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.es.min.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n // HOOKS for local changes:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.serverChange[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.sync.insertHook) {\n return state._conf.sync.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.sync.deleteHook) {\n return state._conf.sync.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","is","determineType","strategy","name","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","error","deepmerge","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","refresh","retrievePaths","path","reduce","carry","newPath","extra","actions","getters","dispatch","commit","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","signedIn","debounceTimer","startDebounce","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","k","fields","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","serverChange","this","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","userActions","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","checkFillables","storeRef","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.iife.js b/dist/index.iife.js index 3f53593b..81a82873 100644 --- a/dist/index.iife.js +++ b/dist/index.iife.js @@ -188,18 +188,17 @@ var VuexEasyFirestore = (function (isWhat,vuexEasyAccess,Firebase) { where: [], orderBy: [], fillables: [], - guard: [] - }, - - // HOOKS: - insertHook: function insertHook(updateStore, doc, store) { - return updateStore(doc); - }, - patchHook: function patchHook(updateStore, doc, store) { - return updateStore(doc); - }, - deleteHook: function deleteHook(updateStore, id, store) { - return updateStore(id); + guard: [], + // HOOKS for local changes: + insertHook: function insertHook(updateStore, doc, store) { + return updateStore(doc); + }, + patchHook: function patchHook(updateStore, doc, store) { + return updateStore(doc); + }, + deleteHook: function deleteHook(updateStore, id, store) { + return updateStore(id); + } }, // When items on the server side are changed: @@ -728,7 +727,7 @@ var VuexEasyFirestore = (function (isWhat,vuexEasyAccess,Firebase) { return dispatch('serverUpdate', { change: change, id: id, doc: _doc }); } // get user set sync hook function - var syncHookFn = state._conf.sync[change + 'Hook']; + var syncHookFn = state._conf.serverChange[change + 'Hook']; if (syncHookFn) { syncHookFn(storeUpdateFn, doc, id, this, source, change); } else { @@ -790,8 +789,8 @@ var VuexEasyFirestore = (function (isWhat,vuexEasyAccess,Firebase) { return dispatch('insertDoc', _doc); } // check for hooks - if (state._conf.insertHook) { - return state._conf.insertHook(storeUpdateFn, doc, this); + if (state._conf.sync.insertHook) { + return state._conf.sync.insertHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -809,8 +808,8 @@ var VuexEasyFirestore = (function (isWhat,vuexEasyAccess,Firebase) { return dispatch('patchDoc', { id: _doc.id, doc: _doc }); } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this); + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -830,8 +829,8 @@ var VuexEasyFirestore = (function (isWhat,vuexEasyAccess,Firebase) { return dispatch('patchDoc', { ids: ids, doc: _doc }); } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this); + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -847,8 +846,8 @@ var VuexEasyFirestore = (function (isWhat,vuexEasyAccess,Firebase) { return dispatch('deleteDoc', _id); } // check for hooks - if (state._conf.deleteHook) { - return state._conf.deleteHook(storeUpdateFn, id, this); + if (state._conf.sync.deleteHook) { + return state._conf.sync.deleteHook(storeUpdateFn, id, this); } return storeUpdateFn(id); }, diff --git a/dist/index.iife.js.map b/dist/index.iife.js.map index 847f2c74..7a18234a 100644 --- a/dist/index.iife.js.map +++ b/dist/index.iife.js.map @@ -1 +1 @@ -{"version":3,"file":"index.iife.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n },\n\n // HOOKS:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.sync[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.insertHook) {\n return state._conf.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.deleteHook) {\n return state._conf.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","name","is","el","type","merge","merger","a","b","deep","keys","Object","concat","forEach","key","Array","isArray","Math","max","replace","config","strategy","determineType","elements","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","console","error","deepmerge","firestorePath","firestoreRefType","moduleName","statePropName","sync","where","orderBy","fillables","guard","insertHook","updateStore","doc","store","patchHook","deleteHook","id","serverChange","defaultValues","addedHook","source","change","modifiedHook","removedHook","fetch","docLimit","state","getters","mutations","actions","_sync","signedIn","patching","syncStack","updates","deletions","inserts","debounceTimer","fetched","stopPatchingTimeout","resetSyncStack","INSERT_DOC","_conf","toLowerCase","_vm","$set","PATCH_DOC","newVal","undefined","DELETE_DOC","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","deltaT","clearInterval","refresh","retrievePaths","path","reduce","carry","pathUntilNow","newPath","extra","patchDoc","commit","dispatch","ids","log","syncStackItems","prepareForPatch","deleteDoc","syncStackIds","prepareForDeletion","insertDoc","docs","prepareForInsert","handleSyncStackDebounce","startDebounce","then","batchSync","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","fields","k","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","remainingSyncStack","catch","whereFilters","identifier","ref","paramsArr","retrievedFetchRefs","nextFetchRef","fRequest","fRef","limit","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","serverUpdate","openDBChannel","auth","currentUser","handleDoc","storeUpdateFn","_doc","syncHookFn","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insert","patch","patchBatch","_id","_stopPatching","clearTimeout","setTimeout","_startPatching","userActions","rootState","rootGetters","userId","uid","collection","storeRef","getDeepRef","patchData","checkFillables","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","reqProps","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","namespaced","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.iife.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n // HOOKS for local changes:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.serverChange[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.sync.insertHook) {\n return state._conf.sync.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.sync.deleteHook) {\n return state._conf.sync.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","name","is","el","type","merge","merger","a","b","deep","keys","Object","concat","forEach","key","Array","isArray","Math","max","replace","config","strategy","determineType","elements","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","console","error","deepmerge","firestorePath","firestoreRefType","moduleName","statePropName","sync","where","orderBy","fillables","guard","insertHook","updateStore","doc","store","patchHook","deleteHook","id","serverChange","defaultValues","addedHook","source","change","modifiedHook","removedHook","fetch","docLimit","state","getters","mutations","actions","_sync","signedIn","patching","syncStack","updates","deletions","inserts","debounceTimer","fetched","stopPatchingTimeout","resetSyncStack","INSERT_DOC","_conf","toLowerCase","_vm","$set","PATCH_DOC","newVal","undefined","DELETE_DOC","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","deltaT","clearInterval","refresh","retrievePaths","path","reduce","carry","pathUntilNow","newPath","extra","patchDoc","commit","dispatch","ids","log","syncStackItems","prepareForPatch","deleteDoc","syncStackIds","prepareForDeletion","insertDoc","docs","prepareForInsert","handleSyncStackDebounce","startDebounce","then","batchSync","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","fields","k","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","remainingSyncStack","catch","whereFilters","identifier","ref","paramsArr","retrievedFetchRefs","nextFetchRef","fRequest","fRef","limit","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","serverUpdate","openDBChannel","auth","currentUser","handleDoc","storeUpdateFn","_doc","syncHookFn","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insert","patch","patchBatch","_id","_stopPatching","clearTimeout","setTimeout","_startPatching","userActions","rootState","rootGetters","userId","uid","collection","storeRef","getDeepRef","patchData","checkFillables","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","reqProps","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","namespaced","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload"],"mappings":";;;;;;;;;;;;;;;;;;;;;EAAA,IAAIA,YAAYC,QAAQ,WAAR,EAAqBC,OAArC;;EAEA,SAASC,SAAT,CAAkBC,MAAlB,EAA0B;EACxB,MAAIC,SAAS,EAAb;;EAEA,OAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIF,OAAOG,MAA3B,EAAmC,EAAED,CAArC,EAAwC;EACtCD,WAAOG,IAAP,CAAYJ,OAAOE,CAAP,CAAZ;EACD;;EAED,SAAOD,MAAP;EACD;;EAED,IAAII,QAAQ,CACV;EACEC,QAAM,WADR;;EAGEC,MAAI,YAAUC,EAAV,EAAc;EAChB,QAAIC,cAAcD,EAAd,yCAAcA,EAAd,CAAJ;;EAEA,WAAQC,SAAS,QAAT,IAAqBA,SAAS,QAA9B,IAA0CA,SAAS,SAA3D;EACD,GAPH;;EASEX,WAAS,SATX;;EAWEY,SAAO;EACLZ,aAAS,kBAAUa,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;EAC/B,aAAOA,CAAP;EACD;EAHI;EAXT,CADU,EAmBV;EACEP,QAAM,QADR;;EAGEC,MAAI,YAAUC,EAAV,EAAc;EAChB,WAAOA,OAAO,IAAP,IAAgB,QAAOA,EAAP,yCAAOA,EAAP,OAAc,QAArC;EACD,GALH;;EAOEV,WAAS,MAPX;;EASEY,SAAO;EACLI,UAAM,cAAUH,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;EAC5B,UAAIZ,SAAS,EAAb;;EAEA,UAAIc,OAAO;EACTH,WAAGI,OAAOD,IAAP,CAAYH,CAAZ,CADM;EAETC,WAAGG,OAAOD,IAAP,CAAYF,CAAZ;EAFM,OAAX;;EAKAE,WAAKH,CAAL,CAAOK,MAAP,CAAcF,KAAKF,CAAnB,EAAsBK,OAAtB,CAA8B,UAAUC,GAAV,EAAe;EAC3ClB,eAAOkB,GAAP,IAAcR,OAAOC,EAAEO,GAAF,CAAP,EAAeN,EAAEM,GAAF,CAAf,CAAd;EACD,OAFD;;EAIA,aAAOlB,MAAP;EACD;EAdI;EATT,CAnBU,EA8CV;EACEK,QAAM,OADR;;EAGEC,MAAI,YAAUC,EAAV,EAAc;EAChB,WAAOY,MAAMC,OAAN,CAAcb,EAAd,CAAP;EACD,GALH;;EAOEV,WAAS,SAPX;;EASEY,SAAO;EACLA,WAAO,eAAUC,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;EAC7B,UAAIZ,SAAS,EAAb;;EAEA,WAAK,IAAIC,IAAI,CAAb,EAAgBA,IAAIoB,KAAKC,GAAL,CAASX,EAAET,MAAX,EAAmBU,EAAEV,MAArB,CAApB,EAAkD,EAAED,CAApD,EAAuD;EACrDD,eAAOG,IAAP,CAAYO,OAAOC,EAAEV,CAAF,CAAP,EAAaW,EAAEX,CAAF,CAAb,CAAZ;EACD;;EAED,aAAOD,MAAP;EACD,KATI;;EAWLuB,aAAS,iBAAUb,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;EAC/B,aAAOjB,UAAUiB,CAAV,CAAP;EACD,KAbI;;EAeLI,YAAQ,gBAAUN,MAAV,EAAkBC,CAAlB,EAAqBC,CAArB,EAAwB;EAC9B,aAAS,EAAD,CAAKI,MAAL,CAAYL,CAAZ,CAAD,CAAiBK,MAAjB,CAAwBJ,CAAxB,CAAP;EACD;EAjBI;EATT,CA9CU,CAAZ;;EA6EA,SAASH,KAAT,CAAgBe,MAAhB,EAAwB;EACtB,MAAI,CAACA,MAAL,EAAa;EACXA,aAAS,EAAT;EACD;;EAEDA,WAAS;EACPC,cAAUD,OAAOC,QAAP,IAAmB;EADtB,GAAT;;EAIA,WAASC,aAAT,CAAwBf,CAAxB,EAA2BC,CAA3B,EAA8B;EAC5B,SAAK,IAAIX,IAAIG,MAAMF,MAAN,GAAe,CAA5B,EAA+BD,KAAK,CAApC,EAAuC,EAAEA,CAAzC,EAA4C;EAC1C,UAAIO,OAAOJ,MAAMH,CAAN,CAAX;;EAEA,UAAIO,KAAKF,EAAL,CAAQK,CAAR,KAAcH,KAAKF,EAAL,CAAQM,CAAR,CAAlB,EAA8B;EAC5B,eAAOJ,IAAP;EACD,OAFD,MAEO,IAAIA,KAAKF,EAAL,CAAQK,CAAR,KAAcH,KAAKF,EAAL,CAAQM,CAAR,CAAlB,EAA8B;EACnC;EACD;EACF;;EAED,WAAO,IAAP;EACD;;EAED,WAASF,MAAT,CAAiBC,CAAjB,EAAoBC,CAApB,EAAuB;EACrB,QAAIA,MAAM,KAAK,CAAf,EAAkB;EAChB,aAAOjB,UAAUgB,CAAV,CAAP;EACD;;EAED,QAAIH,OAAOkB,cAAcf,CAAd,EAAiBC,CAAjB,CAAX;;EAEA,QAAI,CAACJ,IAAL,EAAW;EACT,aAAOb,UAAUiB,CAAV,CAAP;EACD;;EAED,QAAIa,WAAWD,OAAOC,QAAP,CAAgBjB,KAAKH,IAArB,KAA8BG,KAAKX,OAAlD;;EAEA,WAAOW,KAAKC,KAAL,CAAWgB,QAAX,EAAqBf,MAArB,EAA6BC,CAA7B,EAAgCC,CAAhC,CAAP;EACD;;EAED,SAAO,YAAY;EACjB,QAAIe,WAAW7B,UAAQ8B,SAAR,CAAf;;EAEA,WAAOD,SAASE,WAAT,CAAqB,UAAU7B,MAAV,EAAkB8B,OAAlB,EAA2B;EACrD,aAAOpB,OAAOoB,OAAP,EAAgB9B,MAAhB,CAAP;EACD,KAFM,CAAP;EAGD,GAND;EAOD;;EAED,SAAS+B,OAAT,GAAoB;EAClB,MAAIC,OAAOlC,UAAQ8B,SAAR,CAAX;;EAEA;EACA,MAAII,KAAK9B,MAAL,KAAgB,CAApB,EAAuB;EACrB,WAAOO,MAAMuB,KAAK,CAAL,CAAN,CAAP;EACD;;EAED,SAAOvB,QAAQwB,KAAR,CAAc,IAAd,EAAoBD,IAApB,CAAP;EACD;;EC/ID,SAASvB,OAAT,GAA2B;EACzB,MAAIyB,IAAI,UAAOhC,MAAf;EACA,OAAKgC,CAAL,EAAQA,IAAI,CAAZ,EAAeA,GAAf,EAAoB;EAClB,QAAMC,2BAAcD,IAAI,CAAlB,yBAAcA,IAAI,CAAlB,CAAN;EACA,QAAI,CAACE,gBAASD,IAAT,CAAL,EAAqB;EACnBE,cAAQC,KAAR,CAAc,gCAAd,EAAgDH,IAAhD;EACA,aAAOA,IAAP;EACD;EACF;EACD,SAAOI,mCAAP;EACD;;ACZD,sBAAe;EACbC,iBAAe,EADF;EAEX;EACFC,oBAAkB,EAHL;EAIX;EACFC,cAAY,EALC;EAMX;EACFC,iBAAe,EAPF;EAQX;;EAEF;EACAC,QAAM;EACJC,WAAO,EADH;EAEJC,aAAS,EAFL;EAGJC,eAAW,EAHP;EAIJC,WAAO,EAJH;EAKJ;EACAC,gBAAY,oBAAUC,WAAV,EAAuBC,GAAvB,EAA4BC,KAA5B,EAAmC;EAAE,aAAOF,YAAYC,GAAZ,CAAP;EAAyB,KANtE;EAOJE,eAAW,mBAAUH,WAAV,EAAuBC,GAAvB,EAA4BC,KAA5B,EAAmC;EAAE,aAAOF,YAAYC,GAAZ,CAAP;EAAyB,KAPrE;EAQJG,gBAAY,oBAAUJ,WAAV,EAAuBK,EAAvB,EAA2BH,KAA3B,EAAkC;EAAE,aAAOF,YAAYK,EAAZ,CAAP;EAAwB;EARpE,GAXO;;EAsBb;EACAC,gBAAc;EACZC,mBAAe,EADH;EAEZ;EACAC,eAAW,mBAAUR,WAAV,EAAuBC,GAAvB,EAA4BI,EAA5B,EAAgCH,KAAhC,EAAuCO,MAAvC,EAA+CC,MAA/C,EAAuD;EAAE,aAAOV,YAAYC,GAAZ,CAAP;EAAyB,KAHjF;EAIZU,kBAAc,sBAAUX,WAAV,EAAuBC,GAAvB,EAA4BI,EAA5B,EAAgCH,KAAhC,EAAuCO,MAAvC,EAA+CC,MAA/C,EAAuD;EAAE,aAAOV,YAAYC,GAAZ,CAAP;EAAyB,KAJpF;EAKZW,iBAAa,qBAAUZ,WAAV,EAAuBC,GAAvB,EAA4BI,EAA5B,EAAgCH,KAAhC,EAAuCO,MAAvC,EAA+CC,MAA/C,EAAuD;EAAE,aAAOV,YAAYC,GAAZ,CAAP;EAAyB;EALnF,GAvBD;;EA+Bb;EACAY,SAAO;EACL;EACAC,cAAU;EAFL,GAhCM;;EAqCb;EACAC,SAAO,EAtCM;EAuCbC,WAAS,EAvCI;EAwCbC,aAAW,EAxCE;EAyCbC,WAAS;EAzCI,CAAf;;ACAA,qBAAe;EACbC,SAAO;EACLC,cAAU,KADL;EAELC,cAAU,KAFL;EAGLC,eAAW;EACTC,eAAS,EADA;EAETC,iBAAW,EAFF;EAGTC,eAAS,EAHA;EAITC,qBAAe;EAJN,KAHN;EASLC,aAAS,EATJ;EAULC,yBAAqB;EAVhB;EADM,CAAf;;ECGA,IAAMX,YAAY;EAChBY,gBADgB,0BACAd,KADA,EACO;EACrBA,UAAMI,KAAN,CAAYG,SAAZ,GAAwB;EACtBC,eAAS,EADa;EAEtBC,iBAAW,EAFW;EAGtBC,eAAS,EAHa;EAItBC,qBAAe;EAJO,KAAxB;EAMD,GARe;EAShBI,YATgB,sBASJf,KATI,EASGd,GATH,EASQ;EACtB,QAAIc,MAAMgB,KAAN,CAAYxC,gBAAZ,CAA6ByC,WAA7B,OAA+C,KAAnD,EAA0D;EAC1D,SAAKC,GAAL,CAASC,IAAT,CAAcnB,MAAMA,MAAMgB,KAAN,CAAYtC,aAAlB,CAAd,EAAgDQ,IAAII,EAApD,EAAwDJ,GAAxD;EACD,GAZe;EAahBkC,WAbgB,qBAaLpB,KAbK,EAaEd,GAbF,EAaO;EAAA;;EACrB,QAAIc,MAAMgB,KAAN,CAAYxC,gBAAZ,CAA6ByC,WAA7B,OAA+C,KAAnD,EAA0D;EACxD,UAAI,CAACjB,MAAMgB,KAAN,CAAYtC,aAAjB,EAAgC;EAC9B,eAAO5B,OAAOD,IAAP,CAAYqC,GAAZ,EAAiBlC,OAAjB,CAAyB,eAAO;EACrC;EACA,cAAMqE,SAAUrB,MAAM/C,GAAN,MAAeqE,SAAhB,GACXpC,IAAIjC,GAAJ,CADW,GAEV,CAACkB,gBAAS6B,MAAM/C,GAAN,CAAT,CAAD,IAAyB,CAACkB,gBAASe,IAAIjC,GAAJ,CAAT,CAA3B,GACEiC,IAAIjC,GAAJ,CADF,GAEET,QAAMwD,MAAM/C,GAAN,CAAN,EAAkBiC,IAAIjC,GAAJ,CAAlB,CAJN;EAKA,gBAAKiE,GAAL,CAASC,IAAT,CAAcnB,KAAd,EAAqB/C,GAArB,EAA0BoE,MAA1B;EACD,SARM,CAAP;EASD;EACD;EACArB,YAAMA,MAAMgB,KAAN,CAAYtC,aAAlB,IAAmClC,QAAMwD,MAAMA,MAAMgB,KAAN,CAAYtC,aAAlB,CAAN,EAAwCQ,GAAxC,CAAnC;EACA;EACD;EACD;EACA,QAAMmC,SAAUrB,MAAMA,MAAMgB,KAAN,CAAYtC,aAAlB,EAAiCQ,IAAII,EAArC,MAA6CgC,SAA9C,GACXpC,GADW,GAEV,CAACf,gBAAS6B,MAAMA,MAAMgB,KAAN,CAAYtC,aAAlB,EAAiCQ,IAAII,EAArC,CAAT,CAAD,IAAuD,CAACnB,gBAASe,GAAT,CAAzD,GACEA,GADF,GAEE1C,QAAMwD,MAAMA,MAAMgB,KAAN,CAAYtC,aAAlB,EAAiCQ,IAAII,EAArC,CAAN,EAAgDJ,GAAhD,CAJN;EAKA,SAAKgC,GAAL,CAASC,IAAT,CAAcnB,MAAMA,MAAMgB,KAAN,CAAYtC,aAAlB,CAAd,EAAgDQ,IAAII,EAApD,EAAwD+B,MAAxD;EACD,GArCe;EAsChBE,YAtCgB,sBAsCJvB,KAtCI,EAsCGV,EAtCH,EAsCO;EACrB,QAAIU,MAAMgB,KAAN,CAAYxC,gBAAZ,CAA6ByC,WAA7B,OAA+C,KAAnD,EAA0D;EAC1D,SAAKC,GAAL,CAASM,OAAT,CAAiBxB,MAAMA,MAAMgB,KAAN,CAAYtC,aAAlB,CAAjB,EAAmDY,EAAnD;EACD;EAzCe,CAAlB;;AA4CA,EAAe,yBAAqC;EAAA,MAA3BmC,aAA2B,uEAAX,EAAW;EAAA,MAAPzB,KAAO;;EAClD,MAAM0B,oBAAoBC,gCAAiB3B,KAAjB,CAA1B;EACA,SAAOlD,OAAO8E,MAAP,CAAc,EAAd,EAAkBF,iBAAlB,EAAqCxB,SAArC,EAAgDuB,aAAhD,CAAP;EACD;;ECnDD;;;;;;AAMA,EAAe,SAASI,OAAT,CAAkBC,GAAlB,EAAuB;EACpC,MAAIC,eAAJ;EACA,MAAI,QAAOD,GAAP,yCAAOA,GAAP,MAAc,QAAlB,EAA4B;EAC1B,WAAOA,GAAP;EACD;EACD,MAAI,CAACA,GAAL,EAAU;EACR,WAAOA,GAAP;EACD;EACD,MAAI,sBAAsBhF,OAAOkF,SAAP,CAAiBC,QAAjB,CAA0BC,IAA1B,CAA+BJ,GAA/B,CAAtB,IACF,qBAAqBhF,OAAOkF,SAAP,CAAiBC,QAAjB,CAA0BC,IAA1B,CAA+BJ,GAA/B,CADvB,EAEE;EACA,WAAOK,KAAKC,KAAL,CAAWD,KAAKE,SAAL,CAAeP,GAAf,CAAX,CAAP;EACD;EACD;EACA,MAAI,qBAAqBhF,OAAOkF,SAAP,CAAiBC,QAAjB,CAA0BC,IAA1B,CAA+BJ,GAA/B,CAAzB,EAA8D;EAC5DC,aAAS,EAAT;EACA,SAAK,IAAI/F,IAAI,CAAR,EAAWsG,MAAMR,IAAI7F,MAA1B,EAAkCD,IAAIsG,GAAtC,EAA2CtG,GAA3C,EAAgD;EAC9C+F,aAAO/F,CAAP,IAAY6F,QAAQC,IAAI9F,CAAJ,CAAR,CAAZ;EACD;EACD,WAAO+F,MAAP;EACD;EACD;EACAA,WAAS,EAAT;EACA,OAAK,IAAI/F,EAAT,IAAc8F,GAAd,EAAmB;EACjB,QAAIA,IAAIS,cAAJ,CAAmBvG,EAAnB,CAAJ,EAA2B;EACzB+F,aAAO/F,EAAP,IAAY6F,QAAQC,IAAI9F,EAAJ,CAAR,CAAZ;EACD;EACF;EACD,SAAO+F,MAAP;EACD;;ECjCD;;;;;;AAMA,EAAe,2BAAUD,GAAV,EAAetC,aAAf,EAA8B;EAC3C,SAAOhD,QAAMgD,aAAN,EAAqBsC,GAArB,CAAP;EACD;;ECVD;;;;;;;EAOA;EACA;EACA;EACA;;AAEA,EAAe,wBAAUU,EAAV,EAAc;EAC3B,MAAIC,YAAYC,KAAKC,GAAL,EAAhB;EACA,MAAMC,OAAO,IAAIC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;EAC5C,QAAMC,WAAWC,YAAY,aAAK;EAChC,UAAMN,MAAMD,KAAKC,GAAL,EAAZ;EACA,UAAMO,SAASP,MAAMF,SAArB;EACA,UAAIS,UAAUV,EAAd,EAAkB;EAChBW,sBAAcH,QAAd;EACAF,gBAAQ,IAAR;EACD;EACF,KAPgB,EAOd,EAPc,CAAjB;EAQD,GATY,CAAb;EAUA,MAAMM,UAAU,SAAVA,OAAU;EAAA,WAAOX,YAAYC,KAAKC,GAAL,EAAnB;EAAA,GAAhB;EACA,SAAO,EAAEC,UAAF,EAAQQ,gBAAR,EAAP;EACD;;ECxBD,SAASC,aAAT,CAAwBvH,MAAxB,EAAgCwH,IAAhC,EAAsCvH,MAAtC,EAA8C;EAC5C,MAAI,CAACoC,gBAASrC,MAAT,CAAD,IAAqB,CAACgB,OAAOD,IAAP,CAAYf,MAAZ,EAAoBG,MAA9C,EAAsD;EACpD,QAAI,CAACqH,IAAL,EAAW,OAAOxH,MAAP;EACXC,WAAOuH,IAAP,IAAexH,MAAf;EACA,WAAOC,MAAP;EACD;EACD,SAAOe,OAAOD,IAAP,CAAYf,MAAZ,EAAoByH,MAApB,CAA2B,UAACC,KAAD,EAAQvG,GAAR,EAAgB;EAChD,QAAMwG,eAAgBH,IAAD,GACjBA,OAAO,GADU,GAEjB,EAFJ;EAGA,QAAMI,UAAUD,eAAexG,GAA/B;EACA,QAAM0G,QAAQN,cAAcvH,OAAOmB,GAAP,CAAd,EAA2ByG,OAA3B,EAAoC3H,MAApC,CAAd;EACA,WAAOe,OAAO8E,MAAP,CAAc4B,KAAd,EAAqBG,KAArB,CAAP;EACD,GAPM,EAOJ,EAPI,CAAP;EAQD;;AAED,EAAe,yBAAU7H,MAAV,EAAkB;EAC/B,MAAMC,SAAS,EAAf;EACA,SAAOsH,cAAcvH,MAAd,EAAsB,IAAtB,EAA4BC,MAA5B,CAAP;EACD;;ECXD,IAAMoE,UAAU;EACdyD,UADc,0BAIZ;EAAA,QAFC5D,KAED,QAFCA,KAED;EAAA,QAFQC,OAER,QAFQA,OAER;EAAA,QAFiB4D,MAEjB,QAFiBA,MAEjB;EAAA,QAFyBC,QAEzB,QAFyBA,QAEzB;;EAAA,oFAD2B,EAACC,KAAK,EAAN,EAAU7E,KAAK,EAAf,EAC3B;EAAA,yBADCI,EACD;EAAA,QADCA,EACD,4BADM,EACN;EAAA,0BADUyE,GACV;EAAA,QADUA,GACV,6BADgB,EAChB;EAAA,QADoB7E,GACpB,SADoBA,GACpB;;EACA;EACA,QAAI,CAAC/B,eAAQ4G,GAAR,CAAL,EAAmB,OAAO3F,QAAQ4F,GAAR,CAAY,0BAAZ,CAAP;EACnB,QAAI1E,EAAJ,EAAQyE,IAAI7H,IAAJ,CAASoD,EAAT;EACR,QAAIJ,IAAII,EAAR,EAAY,OAAOJ,IAAII,EAAX;;EAEZ;EACA,QAAI2E,iBAAiBhE,QAAQiE,eAAR,CAAwBH,GAAxB,EAA6B7E,GAA7B,CAArB;;EAEA;EACApC,WAAOD,IAAP,CAAYoH,cAAZ,EAA4BjH,OAA5B,CAAoC,cAAM;EACxC,UAAMqE,SAAU,CAACrB,MAAMI,KAAN,CAAYG,SAAZ,CAAsBC,OAAtB,CAA8BlB,EAA9B,CAAF,GACX2E,eAAe3E,EAAf,CADW,GAEX9C,QAAMwD,MAAMI,KAAN,CAAYG,SAAZ,CAAsBC,OAAtB,CAA8BlB,EAA9B,CAAN,EACM2E,eAAe3E,EAAf,CADN,CAFJ;EAIAU,YAAMI,KAAN,CAAYG,SAAZ,CAAsBC,OAAtB,CAA8BlB,EAA9B,IAAoC+B,MAApC;EACD,KAND;;EAQA;EACA,WAAOyC,SAAS,yBAAT,CAAP;EACD,GAxBa;EAyBdK,WAzBc,4BA0BJ;EAAA,QADEnE,KACF,SADEA,KACF;EAAA,QADSC,OACT,SADSA,OACT;EAAA,QADkB4D,MAClB,SADkBA,MAClB;EAAA,QAD0BC,QAC1B,SAD0BA,QAC1B;EAAA,QAAVC,GAAU,uEAAJ,EAAI;;EACR;EACA,QAAI,CAAC5G,eAAQ4G,GAAR,CAAL,EAAmBA,MAAM,CAACA,GAAD,CAAN;;EAEnB;EACA,QAAMK,eAAenE,QAAQoE,kBAAR,CAA2BN,GAA3B,CAArB;;EAEA;EACA,QAAMtD,YAAYT,MAAMI,KAAN,CAAYG,SAAZ,CAAsBE,SAAtB,CAAgC1D,MAAhC,CAAuCqH,YAAvC,CAAlB;EACApE,UAAMI,KAAN,CAAYG,SAAZ,CAAsBE,SAAtB,GAAkCA,SAAlC;;EAEA,QAAI,CAACT,MAAMI,KAAN,CAAYG,SAAZ,CAAsBE,SAAtB,CAAgCxE,MAArC,EAA6C;EAC7C;EACA,WAAO6H,SAAS,yBAAT,CAAP;EACD,GAxCa;EAyCdQ,WAzCc,4BA0CH;EAAA,QADCtE,KACD,SADCA,KACD;EAAA,QADQC,OACR,SADQA,OACR;EAAA,QADiB4D,MACjB,SADiBA,MACjB;EAAA,QADyBC,QACzB,SADyBA,QACzB;EAAA,QAAXS,IAAW,uEAAJ,EAAI;;EACT;EACA,QAAI,CAACpH,eAAQoH,IAAR,CAAL,EAAoBA,OAAO,CAACA,IAAD,CAAP;;EAEpB;EACA,QAAMhE,YAAYN,QAAQuE,gBAAR,CAAyBD,IAAzB,CAAlB;;EAEA;EACA,QAAM7D,UAAUV,MAAMI,KAAN,CAAYG,SAAZ,CAAsBG,OAAtB,CAA8B3D,MAA9B,CAAqCwD,SAArC,CAAhB;EACAP,UAAMI,KAAN,CAAYG,SAAZ,CAAsBG,OAAtB,GAAgCA,OAAhC;;EAEA;EACA,WAAOoD,SAAS,yBAAT,CAAP;EACD,GAvDa;EAwDdW,yBAxDc,0CAwD+C;EAAA,QAAnCzE,KAAmC,SAAnCA,KAAmC;EAAA,QAA5B6D,MAA4B,SAA5BA,MAA4B;EAAA,QAApBC,QAAoB,SAApBA,QAAoB;EAAA,QAAV7D,OAAU,SAAVA,OAAU;;EAC3D,QAAI,CAACA,QAAQI,QAAb,EAAuB,OAAO,KAAP;EACvB,QAAI,CAACL,MAAMI,KAAN,CAAYG,SAAZ,CAAsBI,aAA3B,EAA0C;EACxC,UAAMA,gBAAgB+D,cAAc,IAAd,CAAtB;EACA/D,oBAAciC,IAAd,CAAmB+B,IAAnB,CAAwB;EAAA,eAAKb,SAAS,WAAT,CAAL;EAAA,OAAxB;EACA9D,YAAMI,KAAN,CAAYG,SAAZ,CAAsBI,aAAtB,GAAsCA,aAAtC;EACD;EACDX,UAAMI,KAAN,CAAYG,SAAZ,CAAsBI,aAAtB,CAAoCyC,OAApC;EACD,GAhEa;EAiEdwB,WAjEc,4BAiEiC;EAAA,QAAnC3E,OAAmC,SAAnCA,OAAmC;EAAA,QAA1B4D,MAA0B,SAA1BA,MAA0B;EAAA,QAAlBC,QAAkB,SAAlBA,QAAkB;EAAA,QAAR9D,KAAQ,SAARA,KAAQ;;EAC7C,QAAM6E,iBAAiB5E,QAAQ4E,cAA/B;EACA,QAAMC,QAAQ7E,QAAQ6E,KAAtB;EACA,QAAIC,QAAQC,SAASC,SAAT,GAAqBF,KAArB,EAAZ;EACA,QAAIG,QAAQ,CAAZ;EACA;EACA,QAAIC,kBAAkBtD,QAAQ7B,MAAMI,KAAN,CAAYG,SAAZ,CAAsBC,OAA9B,CAAtB;EACA,QAAIA,UAAU1D,OAAOD,IAAP,CAAYsI,eAAZ,EAA6BC,GAA7B,CAAiC,aAAK;EAClD,UAAIC,SAASF,gBAAgBG,CAAhB,CAAb;EACA,aAAO,EAAChG,IAAIgG,CAAL,EAAQD,cAAR,EAAP;EACD,KAHa,CAAd;EAIA;EACA,QAAI7E,QAAQvE,MAAR,IAAkB,GAAtB,EAA2B;EACzB;EACAiJ,cAAQ,GAAR;EACA,UAAIK,YAAY/E,QAAQgF,KAAR,CAAc,CAAd,EAAiB,GAAjB,CAAhB;EACA,UAAIC,cAAcjF,QAAQgF,KAAR,CAAc,GAAd,EAAmB,CAAC,CAApB,CAAlB;EACA;EACAxF,YAAMI,KAAN,CAAYG,SAAZ,CAAsBC,OAAtB,GAAgCiF,YAAYlC,MAAZ,CAAmB,UAACC,KAAD,EAAQtF,IAAR,EAAiB;EAClEsF,cAAMtF,KAAKoB,EAAX,IAAiBpB,IAAjB;EACA,eAAOA,KAAKoB,EAAZ;EACA,eAAOkE,KAAP;EACD,OAJ+B,EAI7B,EAJ6B,CAAhC;EAKAhD,gBAAU+E,SAAV;EACD,KAZD,MAYO;EACLvF,YAAMI,KAAN,CAAYG,SAAZ,CAAsBC,OAAtB,GAAgC,EAAhC;EACA0E,cAAQ1E,QAAQvE,MAAhB;EACD;EACD;EACAuE,YAAQxD,OAAR,CAAgB,gBAAQ;EACtB,UAAIsC,KAAKpB,KAAKoB,EAAd;EACA,UAAIoG,SAAUb,cAAD,GAAmBC,MAAM5F,GAAN,CAAUI,EAAV,CAAnB,GAAmCwF,KAAhD;EACA,UAAIO,SAASM,eAAezH,KAAKmH,MAApB,CAAb;EACAjH,cAAQ4F,GAAR,CAAY,WAAZ,EAAyBqB,MAAzB;EACAN,YAAMa,MAAN,CAAaF,MAAb,EAAqBL,MAArB;EACD,KAND;EAOA;EACA,QAAI5E,YAAYoB,QAAQ7B,MAAMI,KAAN,CAAYG,SAAZ,CAAsBE,SAA9B,CAAhB;EACA;EACA,QAAIyE,SAAS,GAAb,EAAkB;EAChB;EACAzE,kBAAY,EAAZ;EACD,KAHD,MAGO;EACL;EACA,UAAIoF,kBAAkB,MAAMX,KAA5B;EACA,UAAIY,cAAcrF,UAAU+E,KAAV,CAAgB,CAAhB,EAAmBK,eAAnB,CAAlB;EACA,UAAIE,gBAAgBtF,UAAU+E,KAAV,CAAgBK,eAAhB,EAAiC,CAAC,CAAlC,CAApB;EACA;EACA7F,YAAMI,KAAN,CAAYG,SAAZ,CAAsBE,SAAtB,GAAkCsF,aAAlC;EACAb,cAAQA,QAAQY,YAAY7J,MAA5B;EACA;EACAwE,kBAAYqF,WAAZ;EACD;EACD;EACArF,cAAUzD,OAAV,CAAkB,cAAM;EACtB,UAAI0I,SAASZ,MAAM5F,GAAN,CAAUI,EAAV,CAAb;EACAyF,YAAMiB,MAAN,CAAaN,MAAb;EACD,KAHD;EAIA;EACA,QAAIhF,UAAUmB,QAAQ7B,MAAMI,KAAN,CAAYG,SAAZ,CAAsBG,OAA9B,CAAd;EACA;EACA,QAAIwE,SAAS,GAAb,EAAkB;EAChB;EACAxE,gBAAU,EAAV;EACD,KAHD,MAGO;EACL;EACA,UAAIuF,gBAAgB,MAAMf,KAA1B;EACA,UAAIgB,YAAYxF,QAAQ8E,KAAR,CAAc,CAAd,EAAiBS,aAAjB,CAAhB;EACA,UAAIE,cAAczF,QAAQ8E,KAAR,CAAcS,aAAd,EAA6B,CAAC,CAA9B,CAAlB;EACA;EACAjG,YAAMI,KAAN,CAAYG,SAAZ,CAAsBG,OAAtB,GAAgCyF,WAAhC;EACAjB,cAAQA,QAAQgB,UAAUjK,MAA1B;EACA;EACAyE,gBAAUwF,SAAV;EACD;EACD;EACAxF,YAAQ1D,OAAR,CAAgB,gBAAQ;EACtB,UAAIoJ,SAASnG,QAAQ6E,KAAR,CAAc5F,GAAd,CAAkBhB,KAAKoB,EAAvB,CAAb;EACAyF,YAAMsB,GAAN,CAAUD,MAAV,EAAkBlI,IAAlB;EACD,KAHD;EAIA;EACA;EACA;EACA;EACA;EACA;EACA4F,aAAS,gBAAT;EACA9D,UAAMI,KAAN,CAAYG,SAAZ,CAAsBI,aAAtB,GAAsC,IAAtC;EACA,WAAO,IAAIkC,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;EACtCgC,YAAMlB,MAAN,GACCc,IADD,CACM,eAAO;EACXvG,gBAAQ4F,GAAR,0BAAqCsC,GAArC,2BACcxJ,OAAOD,IAAP,CAAY2D,OAAZ,EAAqBvE,MAArB,GAA8BuE,OAA9B,GAAwC,EADtD,6BAEgBC,UAAUxE,MAAV,GAAmBwE,SAAnB,GAA+B,EAF/C,2BAGcC,QAAQzE,MAAR,GAAiByE,OAAjB,GAA2B,EAHzC;EAKA,YAAI6F,qBAAqBzJ,OAAOD,IAAP,CAAYmD,MAAMI,KAAN,CAAYG,SAAZ,CAAsBC,OAAlC,EAA2CvE,MAA3C,GACrB+D,MAAMI,KAAN,CAAYG,SAAZ,CAAsBE,SAAtB,CAAgCxE,MADX,GAErB+D,MAAMI,KAAN,CAAYG,SAAZ,CAAsBG,OAAtB,CAA8BzE,MAFlC;EAGA,YAAIsK,kBAAJ,EAAwB;EAAEzC,mBAAS,WAAT;EAAuB;EACjDA,iBAAS,eAAT;EACA,eAAOhB,SAAP;EACA;EACA;EACE;EACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACL,OAzBD,EAyBG0D,KAzBH,CAyBS,iBAAS;EAChBxG,cAAMI,KAAN,CAAYE,QAAZ,GAAuB,OAAvB;EACAN,cAAMI,KAAN,CAAYG,SAAZ,CAAsBI,aAAtB,GAAsC,IAAtC;EACA,eAAOoC,QAAP;EACD,OA7BD;EA8BD,KA/BM,CAAP;EAgCD,GAzLa;EA0LdjD,OA1Lc,wBA+LZ;EAAA,QAJCE,KAID,SAJCA,KAID;EAAA,QAJQC,OAIR,SAJQA,OAIR;EAAA,QAJiB4D,MAIjB,SAJiBA,MAIjB;EAAA,QAJyBC,QAIzB,SAJyBA,QAIzB;;EAAA,oFAHoC,EAAC2C,cAAc,EAAf,EAAmB5H,SAAS;EAChE;EACA;EAFoC,KAGpC;EAAA,mCAHC4H,YAGD;EAAA,QAHCA,YAGD,sCAHgB,EAGhB;EAAA,8BAHoB5H,OAGpB;EAAA,QAHoBA,OAGpB,iCAH8B,EAG9B;;EACA,WAAO,IAAIgE,OAAJ,CAAY,UAACC,OAAD,EAAUC,MAAV,EAAqB;EACtC3E,cAAQ4F,GAAR,CAAY,kBAAZ;EACA,UAAI,CAAC/D,QAAQI,QAAb,EAAuB,OAAOyC,SAAP;EACvB,UAAM4D,aAAavE,KAAKE,SAAL,CAAe,EAACoE,0BAAD,EAAe5H,gBAAf,EAAf,CAAnB;EACA,UAAM+B,UAAUZ,MAAMI,KAAN,CAAYQ,OAAZ,CAAoB8F,UAApB,CAAhB;EACA;EACA,UAAI,CAAC9F,OAAL,EAAc;EACZ,YAAI+F,MAAM1G,QAAQ6E,KAAlB;EACA;EACA2B,qBAAazJ,OAAb,CAAqB,qBAAa;EAAA;;EAChC2J,gBAAM,cAAI/H,KAAJ,gCAAagI,SAAb,EAAN;EACD,SAFD;EAGA,YAAI/H,QAAQ5C,MAAZ,EAAoB;EAAA;;EAClB0K,gBAAM,eAAI9H,OAAJ,iCAAeA,OAAf,EAAN;EACD;EACDmB,cAAMI,KAAN,CAAYQ,OAAZ,CAAoB8F,UAApB,IAAkC;EAChCC,kBADgC;EAEhC/D,gBAAM,KAF0B;EAGhCiE,8BAAoB,EAHY;EAIhCC,wBAAc;EAJkB,SAAlC;EAMD;EACD,UAAMC,WAAW/G,MAAMI,KAAN,CAAYQ,OAAZ,CAAoB8F,UAApB,CAAjB;EACA;EACA,UAAIK,SAASnE,IAAb,EAAmB;EACjBxE,gBAAQ4F,GAAR,CAAY,eAAZ;EACA,eAAOlB,QAAQ,YAAR,CAAP;EACD;EACD;EACA,UAAIkE,OAAOhH,MAAMI,KAAN,CAAYQ,OAAZ,CAAoB8F,UAApB,EAAgCC,GAA3C;EACA,UAAII,SAASD,YAAb,EAA2B;EACzB;EACAE,eAAOhH,MAAMI,KAAN,CAAYQ,OAAZ,CAAoB8F,UAApB,EAAgCI,YAAvC;EACD;EACDE,aAAOA,KAAKC,KAAL,CAAWjH,MAAMgB,KAAN,CAAYlB,KAAZ,CAAkBC,QAA7B,CAAP;EACA;EACA,UAAIgH,SAASF,kBAAT,CAA4BK,QAA5B,CAAqCF,IAArC,CAAJ,EAAgD;EAC9C5I,gBAAQ4F,GAAR,CAAY,8BAAZ;EACA,eAAOlB,SAAP;EACD;EACD;EACAkE,WAAKG,GAAL,GACCxC,IADD,CACM,yBAAiB;EACrB,YAAMJ,OAAO6C,cAAc7C,IAA3B;EACA,YAAIA,KAAKtI,MAAL,KAAgB,CAApB,EAAuB;EACrB+D,gBAAMI,KAAN,CAAYQ,OAAZ,CAAoB8F,UAApB,EAAgC9D,IAAhC,GAAuC,IAAvC;EACAE,kBAAQ,YAAR;;EAEA;EACD;EACD,YAAIyB,KAAKtI,MAAL,GAAc+D,MAAMgB,KAAN,CAAYlB,KAAZ,CAAkBC,QAApC,EAA8C;EAC5CC,gBAAMI,KAAN,CAAYQ,OAAZ,CAAoB8F,UAApB,EAAgC9D,IAAhC,GAAuC,IAAvC;EACD;EACD5C,cAAMI,KAAN,CAAYQ,OAAZ,CAAoB8F,UAApB,EAAgCG,kBAAhC,CAAmD3K,IAAnD,CAAwDmL,QAAxD;EACA;EACAvE,gBAAQsE,aAAR;EACA,YAAME,cAAc/C,KAAKA,KAAKtI,MAAL,GAAc,CAAnB,CAApB;EACA;EACA,YAAMsL,OAAOP,KAAKQ,UAAL,CAAgBF,WAAhB,CAAb;EACAtH,cAAMI,KAAN,CAAYQ,OAAZ,CAAoB8F,UAApB,EAAgCI,YAAhC,GAA+CS,IAA/C;EACD,OAnBD,EAmBGf,KAnBH,CAmBS,iBAAS;EAChBpI,gBAAQ4F,GAAR,CAAY3F,KAAZ;EACA,eAAO0E,OAAO1E,KAAP,CAAP;EACD,OAtBD;EAuBD,KAhEM,CAAP;EAiED,GAjQa;EAkQdoJ,cAlQc,wCAkQkC;EAAA,QAAjC5D,MAAiC,UAAjCA,MAAiC;EAAA,QAAvBlE,MAAuB,UAAvBA,MAAuB;EAAA,QAAfL,EAAe,UAAfA,EAAe;EAAA,4BAAXJ,GAAW;EAAA,QAAXA,GAAW,8BAAL,EAAK;;EAC9CA,QAAII,EAAJ,GAASA,EAAT;EACA,YAAQK,MAAR;EACE,WAAK,OAAL;EACEkE,eAAO,YAAP,EAAqB3E,GAArB;EACA;EACF,WAAK,SAAL;EACE2E,eAAO,YAAP,EAAqBvE,EAArB;EACA;EACF;EACEuE,eAAO,WAAP,EAAoB3E,GAApB;EACA;EATJ;EAWD,GA/Qa;EAgRdwI,eAhRc,iCAgRqC;EAAA,QAAnCzH,OAAmC,UAAnCA,OAAmC;EAAA,QAA1BD,KAA0B,UAA1BA,KAA0B;EAAA,QAAnB6D,MAAmB,UAAnBA,MAAmB;EAAA,QAAXC,QAAW,UAAXA,QAAW;;EACjD,QAAIkB,SAAS2C,IAAT,GAAgBC,WAApB,EAAiC5H,MAAMI,KAAN,CAAYC,QAAZ,GAAuB,IAAvB;EACjC,QAAMwE,iBAAiB5E,QAAQ4E,cAA/B;EACA,QAAIC,QAAQ7E,QAAQ6E,KAApB;EACA;EACA,QAAI9E,MAAMgB,KAAN,CAAYxC,gBAAZ,CAA6ByC,WAA7B,OAA+C,KAAnD,EAA0D;EACxDjB,YAAMgB,KAAN,CAAYrC,IAAZ,CAAiBC,KAAjB,CAAuB5B,OAAvB,CAA+B,qBAAa;EAAA;;EAC1C8H,gBAAQ,iBAAMlG,KAAN,iCAAegI,SAAf,EAAR;EACD,OAFD;EAGA,UAAI5G,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBE,OAAjB,CAAyB5C,MAA7B,EAAqC;EAAA;;EACnC6I,gBAAQ,kBAAMjG,OAAN,kCAAiBmB,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBE,OAAlC,EAAR;EACD;EACF;EACD;EACA,aAASgJ,SAAT,CAAoBlI,MAApB,EAA4BL,EAA5B,EAAgCJ,GAAhC,EAAqCQ,MAArC,EAA6C;EAC3CC,eAAU,CAACA,MAAF,GAAY,UAAZ,GAAyBA,OAAOpD,IAAzC;EACA;EACA,eAASuL,aAAT,CAAwBC,IAAxB,EAA8B;EAC5B,eAAOjE,SAAS,cAAT,EAAyB,EAACnE,cAAD,EAASL,MAAT,EAAaJ,KAAK6I,IAAlB,EAAzB,CAAP;EACD;EACD;EACA,UAAMC,aAAahI,MAAMgB,KAAN,CAAYzB,YAAZ,CAAyBI,SAAS,MAAlC,CAAnB;EACA,UAAIqI,UAAJ,EAAgB;EACdA,mBAAWF,aAAX,EAA0B5I,GAA1B,EAA+BI,EAA/B,EAAmC,IAAnC,EAAyCI,MAAzC,EAAiDC,MAAjD;EACD,OAFD,MAEO;EACLmI,sBAAc5I,GAAd;EACD;EACF;EACD;EACA,WAAO,IAAI2D,OAAJ,CAAa,UAACC,OAAD,EAAUC,MAAV,EAAqB;EACvC+B,YACCmD,UADD,CACY,yBAAiB;EAC3B,YAAIvI,SAAS0H,cAAcc,QAAd,CAAuBC,gBAAvB,GAA0C,OAA1C,GAAoD,QAAjE;EACA,YAAI,CAACtD,cAAL,EAAqB;EACnB,cAAM3F,MAAMkJ,iBAAiBhB,cAAciB,IAAd,EAAjB,EAAuCrI,MAAMgB,KAAN,CAAYzB,YAAZ,CAAyBC,aAAhE,CAAZ;EACA,cAAIE,WAAW,OAAf,EAAwB,OAAOoD,SAAP;EACxB+E,oBAAU,IAAV,EAAgB,IAAhB,EAAsB3I,GAAtB,EAA2BQ,MAA3B;EACA,iBAAOoD,SAAP;EACD;EACDsE,sBAAckB,UAAd,GAA2BtL,OAA3B,CAAmC,kBAAU;EAC3C;EACA,cAAI0C,WAAW,OAAX,KACDC,OAAOpD,IAAP,KAAgB,UAAhB,IAA8BoD,OAAOpD,IAAP,KAAgB,SAD7C,CAAJ,EAEE;EACA,mBAAOuG,SAAP;EACD;EACD,cAAMxD,KAAKK,OAAOT,GAAP,CAAWI,EAAtB;EACA,cAAMJ,MAAOS,OAAOpD,IAAP,KAAgB,OAAjB,GACR6L,iBAAiBzI,OAAOT,GAAP,CAAWmJ,IAAX,EAAjB,EAAoCrI,MAAMgB,KAAN,CAAYzB,YAAZ,CAAyBC,aAA7D,CADQ,GAERG,OAAOT,GAAP,CAAWmJ,IAAX,EAFJ;EAGAR,oBAAUlI,MAAV,EAAkBL,EAAlB,EAAsBJ,GAAtB,EAA2BQ,MAA3B;EACA,iBAAOoD,SAAP;EACD,SAbD;EAcD,OAvBD,EAuBG,iBAAS;EACV9C,cAAMI,KAAN,CAAYE,QAAZ,GAAuB,OAAvB;EACA,eAAOyC,OAAO1E,KAAP,CAAP;EACD,OA1BD;EA2BD,KA5BM,CAAP;EA6BD,GA1Ua;EA2UdgI,KA3Uc,0BA2U2BnH,GA3U3B,EA2UgC;EAAA,QAAxC2E,MAAwC,UAAxCA,MAAwC;EAAA,QAAhCC,QAAgC,UAAhCA,QAAgC;EAAA,QAAtB7D,OAAsB,UAAtBA,OAAsB;EAAA,QAAbD,KAAa,UAAbA,KAAa;;EAC5C,QAAI,CAACd,GAAL,EAAU;EACV,QAAI,CAACe,QAAQ4E,cAAb,EAA6B;EAC3B,aAAOf,SAAS,OAAT,EAAkB5E,GAAlB,CAAP;EACD;EACD,QAAI,CAACA,IAAII,EAAL,IAAW,CAACU,MAAMA,MAAMgB,KAAN,CAAYtC,aAAlB,EAAiCQ,IAAII,EAArC,CAAhB,EAA0D;EACxD,aAAOwE,SAAS,QAAT,EAAmB5E,GAAnB,CAAP;EACD;EACD,WAAO4E,SAAS,OAAT,EAAkB5E,GAAlB,CAAP;EACD,GApVa;EAqVdqJ,QArVc,0BAqV8BrJ,GArV9B,EAqVmC;EAAA,QAAxCc,KAAwC,UAAxCA,KAAwC;EAAA,QAAjCC,OAAiC,UAAjCA,OAAiC;EAAA,QAAxB4D,MAAwB,UAAxBA,MAAwB;EAAA,QAAhBC,QAAgB,UAAhBA,QAAgB;;EAC/C,QAAI,CAAC5E,GAAL,EAAU;EACV,QAAI,CAACA,IAAII,EAAT,EAAaJ,IAAII,EAAJ,GAASW,QAAQ6E,KAAR,CAAc5F,GAAd,GAAoBI,EAA7B;EACb;EACA,aAASwI,aAAT,CAAwBC,IAAxB,EAA8B;EAC5BlE,aAAO,YAAP,EAAqBkE,IAArB;EACA,aAAOjE,SAAS,WAAT,EAAsBiE,IAAtB,CAAP;EACD;EACD;EACA,QAAI/H,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBK,UAArB,EAAiC;EAC/B,aAAOgB,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBK,UAAjB,CAA4B8I,aAA5B,EAA2C5I,GAA3C,EAAgD,IAAhD,CAAP;EACD;EACD,WAAO4I,cAAc5I,GAAd,CAAP;EACD,GAlWa;EAmWdsJ,OAnWc,yBAmW6BtJ,GAnW7B,EAmWkC;EAAA,QAAxCc,KAAwC,UAAxCA,KAAwC;EAAA,QAAjCC,OAAiC,UAAjCA,OAAiC;EAAA,QAAxB4D,MAAwB,UAAxBA,MAAwB;EAAA,QAAhBC,QAAgB,UAAhBA,QAAgB;;EAC9C,QAAI,CAAC5E,GAAL,EAAU;EACV,QAAI,CAACA,IAAII,EAAL,IAAWW,QAAQ4E,cAAvB,EAAuC;EACvC;EACA,aAASiD,aAAT,CAAwBC,IAAxB,EAA8B;EAC5BlE,aAAO,WAAP,EAAoBkE,IAApB;EACA,aAAOjE,SAAS,UAAT,EAAqB,EAACxE,IAAIyI,KAAKzI,EAAV,EAAcJ,KAAK6I,IAAnB,EAArB,CAAP;EACD;EACD;EACA,QAAI/H,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBS,SAArB,EAAgC;EAC9B,aAAOY,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBS,SAAjB,CAA2B0I,aAA3B,EAA0C5I,GAA1C,EAA+C,IAA/C,CAAP;EACD;EACD,WAAO4I,cAAc5I,GAAd,CAAP;EACD,GAhXa;EAiXduJ,YAjXc,sCAoXZ;EAAA,QAFCzI,KAED,UAFCA,KAED;EAAA,QAFQC,OAER,UAFQA,OAER;EAAA,QAFiB4D,MAEjB,UAFiBA,MAEjB;EAAA,QAFyBC,QAEzB,UAFyBA,QAEzB;EAAA,QADC5E,GACD,UADCA,GACD;EAAA,4BADM6E,GACN;EAAA,QADMA,GACN,8BADY,EACZ;;EACA,QAAI,CAAC7E,GAAL,EAAU;EACV;EACA,aAAS4I,aAAT,CAAwBC,IAAxB,EAA8B;EAC5BlE,aAAO,WAAP,EAAoBkE,IAApB;EACA,aAAOjE,SAAS,UAAT,EAAqB,EAACC,QAAD,EAAM7E,KAAK6I,IAAX,EAArB,CAAP;EACD;EACD;EACA,QAAI/H,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBS,SAArB,EAAgC;EAC9B,aAAOY,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBS,SAAjB,CAA2B0I,aAA3B,EAA0C5I,GAA1C,EAA+C,IAA/C,CAAP;EACD;EACD,WAAO4I,cAAc5I,GAAd,CAAP;EACD,GAhYa;EAiYd8G,QAjYc,2BAiY8B1G,EAjY9B,EAiYkC;EAAA,QAAvCU,KAAuC,UAAvCA,KAAuC;EAAA,QAAhCC,OAAgC,UAAhCA,OAAgC;EAAA,QAAvB4D,MAAuB,UAAvBA,MAAuB;EAAA,QAAfC,QAAe,UAAfA,QAAe;;EAC9C;EACA,aAASgE,aAAT,CAAwBY,GAAxB,EAA6B;EAC3B7E,aAAO,YAAP,EAAqB6E,GAArB;EACA,aAAO5E,SAAS,WAAT,EAAsB4E,GAAtB,CAAP;EACD;EACD;EACA,QAAI1I,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBU,UAArB,EAAiC;EAC/B,aAAOW,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBU,UAAjB,CAA4ByI,aAA5B,EAA2CxI,EAA3C,EAA+C,IAA/C,CAAP;EACD;EACD,WAAOwI,cAAcxI,EAAd,CAAP;EACD,GA5Ya;EA6YdqJ,eA7Yc,iCA6YkB;EAAA,QAAhB3I,KAAgB,UAAhBA,KAAgB;EAAA,QAAT6D,MAAS,UAATA,MAAS;;EAC9B,QAAI7D,MAAMI,KAAN,CAAYS,mBAAhB,EAAqC;EAAE+H,mBAAa5I,MAAMI,KAAN,CAAYS,mBAAzB;EAA+C;EACtFb,UAAMI,KAAN,CAAYS,mBAAZ,GAAkCgI,WAAW,aAAK;EAAE7I,YAAMI,KAAN,CAAYE,QAAZ,GAAuB,KAAvB;EAA8B,KAAhD,EAAkD,GAAlD,CAAlC;EACD,GAhZa;EAiZdwI,gBAjZc,kCAiZmB;EAAA,QAAhB9I,KAAgB,UAAhBA,KAAgB;EAAA,QAAT6D,MAAS,UAATA,MAAS;;EAC/B,QAAI7D,MAAMI,KAAN,CAAYS,mBAAhB,EAAqC;EAAE+H,mBAAa5I,MAAMI,KAAN,CAAYS,mBAAzB;EAA+C;EACtFb,UAAMI,KAAN,CAAYE,QAAZ,GAAuB,IAAvB;EACD;EApZa,CAAhB;;AAuZA,EAAe,uBAA4B;EAAA,MAAlByI,WAAkB,uEAAJ,EAAI;;EACzC,SAAOjM,OAAO8E,MAAP,CAAc,EAAd,EAAkBzB,OAAlB,EAA2B4I,WAA3B,CAAP;EACD;;ECjaD;;;;;;;;;AASA,EAAe,yBAAUjH,GAAV,EAA2C;EAAA,MAA5BhD,SAA4B,uEAAhB,EAAgB;EAAA,MAAZC,KAAY,uEAAJ,EAAI;;EACxD,MAAI,CAACZ,gBAAS2D,GAAT,CAAL,EAAoB,OAAOA,GAAP;EACpB,MAAIhD,UAAU7C,MAAd,EAAsB;EACpBa,WAAOD,IAAP,CAAYiF,GAAZ,EAAiB9E,OAAjB,CAAyB,eAAO;EAC9B,UAAI,CAAC8B,UAAUoI,QAAV,CAAmBjK,GAAnB,CAAL,EAA8B;EAC5B,eAAO6E,IAAI7E,GAAJ,CAAP;EACD;EACF,KAJD;EAKD;EACD8B,QAAM/B,OAAN,CAAc,eAAO;EACnB,WAAO8E,IAAI7E,GAAJ,CAAP;EACD,GAFD;EAGA,SAAO6E,GAAP;EACD;;ECjBD,IAAM7B,UAAU;EACdI,YAAU,kBAACL,KAAD,EAAQC,OAAR,EAAiB+I,SAAjB,EAA4BC,WAA5B,EAA4C;EACpD,WAAOjJ,MAAMI,KAAN,CAAYC,QAAnB;EACD,GAHa;EAIdyE,SAAO,eAAC9E,KAAD,EAAQC,OAAR,EAAiB+I,SAAjB,EAA4BC,WAA5B,EAA4C;EACjD,QAAI,CAAChJ,QAAQI,QAAb,EAAuB,OAAO,KAAP;EACvB,QAAI,CAAC2E,SAAS2C,IAAT,GAAgBC,WAArB,EAAkC,OAAO,KAAP;EAClC,QAAMsB,SAASlE,SAAS2C,IAAT,GAAgBC,WAAhB,CAA4BuB,GAA3C;EACA,QAAM7F,OAAOtD,MAAMgB,KAAN,CAAYzC,aAAZ,CAA0BjB,OAA1B,CAAkC,UAAlC,EAA8C4L,MAA9C,CAAb;EACA,WAAQlJ,MAAMgB,KAAN,CAAYxC,gBAAZ,CAA6ByC,WAA7B,OAA+C,YAAhD,GACH+D,SAASC,SAAT,GAAqBmE,UAArB,CAAgC9F,IAAhC,CADG,GAEH0B,SAASC,SAAT,GAAqB/F,GAArB,CAAyBoE,IAAzB,CAFJ;EAGD,GAZa;EAad+F,YAAU,kBAACrJ,KAAD,EAAQC,OAAR,EAAiB+I,SAAjB,EAA+B;EACvC,QAAM1F,OAAQtD,MAAMgB,KAAN,CAAYtC,aAAb,GACNsB,MAAMgB,KAAN,CAAYvC,UADN,SACoBuB,MAAMgB,KAAN,CAAYtC,aADhC,GAETsB,MAAMgB,KAAN,CAAYvC,UAFhB;EAGA,WAAO6K,0BAAWN,SAAX,EAAsB1F,IAAtB,CAAP;EACD,GAlBa;EAmBduB,kBAAgB,wBAAC7E,KAAD,EAAQC,OAAR,EAAiB+I,SAAjB,EAA+B;EAC7C,WAAQhJ,MAAMgB,KAAN,CAAYxC,gBAAZ,CAA6ByC,WAA7B,OAA+C,YAAvD;EACD,GArBa;EAsBdiD,mBAAiB,yBAAClE,KAAD,EAAQC,OAAR,EAAiB+I,SAAjB,EAA4BC,WAA5B;EAAA,WACjB,YAAwB;EAAA,UAAvBlF,GAAuB,uEAAjB,EAAiB;EAAA,UAAb7E,GAAa,uEAAP,EAAO;;EACtB;EACA,UAAM2F,iBAAiB5E,QAAQ4E,cAA/B;EACA,UAAI,CAACA,cAAL,EAAqBd,IAAI7H,IAAJ,CAAS,WAAT;EACrB;EACA,aAAO6H,IAAIR,MAAJ,CAAW,UAACC,KAAD,EAAQlE,EAAR,EAAe;EAC/B,YAAIiK,YAAY,EAAhB;EACA;EACA,YAAI,CAACzM,OAAOD,IAAP,CAAYqC,GAAZ,EAAiBjD,MAAtB,EAA8B;EAC5BsN,sBAAa1E,cAAD,GACR5E,QAAQoJ,QAAR,CAAiB/J,EAAjB,CADQ,GAERW,QAAQoJ,QAFZ;EAGD,SAJD,MAIO;EACLE,sBAAYrK,GAAZ;EACD;EACDqK,oBAAY1H,QAAQ0H,SAAR,CAAZ;EACAA,oBAAYC,eAAeD,SAAf,EAA0BvJ,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBG,SAA3C,EAAsDkB,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBI,KAAvE,CAAZ;EACAwK,kBAAUE,UAAV,GAAuBzE,SAASC,SAAT,CAAmByE,UAAnB,CAA8BC,eAA9B,EAAvB;EACAnG,cAAMlE,EAAN,IAAYiK,SAAZ;EACA,eAAO/F,KAAP;EACD,OAfM,EAeJ,EAfI,CAAP;EAgBD,KAtBgB;EAAA,GAtBH;EA6Cda,sBAAoB,4BAACrE,KAAD,EAAQC,OAAR,EAAiB+I,SAAjB,EAA4BC,WAA5B;EAAA,WACpB,YAAc;EAAA,UAAblF,GAAa,uEAAP,EAAO;;EACZ,aAAOA,IAAIR,MAAJ,CAAW,UAACC,KAAD,EAAQlE,EAAR,EAAe;EAC/BkE,cAAMtH,IAAN,CAAWoD,EAAX;EACA,eAAOkE,KAAP;EACD,OAHM,EAGJ,EAHI,CAAP;EAID,KANmB;EAAA,GA7CN;EAoDdgB,oBAAkB,0BAACxE,KAAD,EAAQC,OAAR,EAAiB+I,SAAjB,EAA4BC,WAA5B;EAAA,WAClB,YAAgB;EAAA,UAAfW,KAAe,uEAAP,EAAO;;EACdA,cAAQ/H,QAAQ+H,KAAR,CAAR;EACA,aAAOA,MAAMrG,MAAN,CAAa,UAACC,KAAD,EAAQtF,IAAR,EAAiB;EACnCA,eAAOsL,eAAetL,IAAf,EAAqB8B,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBG,SAAtC,EAAiDkB,MAAMgB,KAAN,CAAYrC,IAAZ,CAAiBI,KAAlE,CAAP;EACAb,aAAK2L,UAAL,GAAkB7E,SAASC,SAAT,CAAmByE,UAAnB,CAA8BC,eAA9B,EAAlB;EACAzL,aAAK4L,UAAL,GAAkBb,YAAY,SAAZ,CAAlB;EACAzF,cAAMtH,IAAN,CAAWgC,IAAX;EACA,eAAOsF,KAAP;EACD,OANM,EAMJ,EANI,CAAP;EAOD,KAViB;EAAA;EApDJ,CAAhB;;AAiEA,EAAe,uBAA4B;EAAA,MAAlBuG,WAAkB,uEAAJ,EAAI;;EACzC,SAAOjN,OAAO8E,MAAP,CAAc,EAAd,EAAkB3B,OAAlB,EAA2B8J,WAA3B,CAAP;EACD;;ECzEc,SAASC,UAAT,CAAqBzM,MAArB,EAA6B;EAC1C,MAAI0M,WAAW,CAAC,eAAD,EAAkB,YAAlB,CAAf;EACAA,WAASjN,OAAT,CAAiB,gBAAQ;EACvB,QAAI,CAACO,OAAO2M,IAAP,CAAL,EAAmB;EACjB9L,cAAQC,KAAR,cAAyB6L,IAAzB;EACA,aAAO,KAAP;EACD;EACF,GALD;EAMA,MAAI,UAAUC,IAAV,CAAe5M,OAAOmB,aAAtB,CAAJ,EAA0C;EACxCN,YAAQC,KAAR;EACA,WAAO,KAAP;EACD;EACD,MAAI,KAAK8L,IAAL,CAAU5M,OAAOkB,UAAjB,CAAJ,EAAkC;EAChCL,YAAQC,KAAR;EACA,WAAO,KAAP;EACD;EACD,SAAO,IAAP;EACD;;ECTD;;;;;;AAMA,EAAe,oBAAU+L,UAAV,EAAsB;EACnC,MAAMC,OAAO7N,QAAM8N,aAAN,EAAqBF,UAArB,CAAb;EACA,MAAI,CAACJ,WAAWK,IAAX,CAAL,EAAuB;EACvB,MAAME,YAAYF,KAAKrK,KAAvB;EACA,MAAMyB,gBAAgB4I,KAAKnK,SAA3B;EACA,MAAM6I,cAAcsB,KAAKlK,OAAzB;EACA,MAAM4J,cAAcM,KAAKpK,OAAzB;EACA,SAAOoK,KAAKrK,KAAZ;EACA,SAAOqK,KAAKnK,SAAZ;EACA,SAAOmK,KAAKlK,OAAZ;EACA,SAAOkK,KAAKpK,OAAZ;;EAEA,MAAMuK,eAAe,EAArB;EACA,MAAIH,KAAK3L,aAAT,EAAwB8L,aAAaH,KAAK3L,aAAlB,IAAmC,EAAnC;EACxB,MAAMsB,QAAQxD,QAAMiO,YAAN,EAAoBF,SAApB,EAA+BC,YAA/B,EAA6C,EAACxJ,OAAOqJ,IAAR,EAA7C,CAAd;EACA,SAAO;EACLK,gBAAY,IADP;EAEL1K,gBAFK;EAGLE,eAAWyK,aAAalJ,aAAb,EAA4BjF,QAAMiO,YAAN,EAAoBF,SAApB,CAA5B,CAHN;EAILpK,aAASyK,WAAW7B,WAAX,CAJJ;EAKL9I,aAAS4K,WAAWd,WAAX;EALJ,GAAP;EAOD;;EC/Bc,SAASe,mBAAT,CAA8BV,UAA9B,EAA0C;EACvD,SAAO,iBAAS;EACd;EACA,QAAI,CAACjN,eAAQiN,UAAR,CAAL,EAA0BA,aAAa,CAACA,UAAD,CAAb;EAC1B;EACAA,eAAWpN,OAAX,CAAmB,kBAAU;EAC3B,UAAMyB,aAAasM,+BAAgBxN,OAAOkB,UAAvB,CAAnB;EACAU,YAAM6L,cAAN,CAAqBvM,UAArB,EAAiCwM,UAAU1N,MAAV,CAAjC;EACD,KAHD;EAIA4B,UAAM+L,MAAN,GAAe,UAAC5H,IAAD,EAAO6H,OAAP,EAAmB;EAChC,aAAOhM,MAAM2E,QAAN,CAAeR,OAAO,SAAtB,EAAiC6H,OAAjC,CAAP;EACD,KAFD;EAGAhM,UAAMoJ,MAAN,GAAe,UAACjF,IAAD,EAAO6H,OAAP,EAAmB;EAChC,aAAOhM,MAAM2E,QAAN,CAAeR,OAAO,SAAtB,EAAiC6H,OAAjC,CAAP;EACD,KAFD;EAGAhM,UAAMqJ,KAAN,GAAc,UAAClF,IAAD,EAAO6H,OAAP,EAAmB;EAC/B,aAAOhM,MAAM2E,QAAN,CAAeR,OAAO,QAAtB,EAAgC6H,OAAhC,CAAP;EACD,KAFD;EAGAhM,UAAMsJ,UAAN,GAAmB,UAACnF,IAAD,EAAO6H,OAAP,EAAmB;EACpC,aAAOhM,MAAM2E,QAAN,CAAeR,OAAO,aAAtB,EAAqC6H,OAArC,CAAP;EACD,KAFD;EAGAhM,UAAM6G,MAAN,GAAe,UAAC1C,IAAD,EAAO6H,OAAP,EAAmB;EAChC,aAAOhM,MAAM2E,QAAN,CAAeR,OAAO,SAAtB,EAAiC6H,OAAjC,CAAP;EACD,KAFD;EAGD,GAvBD;EAwBD;;;;;;;;"} \ No newline at end of file diff --git a/dist/index.iife.min.js b/dist/index.iife.min.js index 0c93b162..292727cf 100644 --- a/dist/index.iife.min.js +++ b/dist/index.iife.min.js @@ -1,2 +1,2 @@ -var VuexEasyFirestore=function(e,t,n){"use strict";n=n&&n.hasOwnProperty("default")?n.default:n;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0;--n){var r=a[n];if(r.is(e)&&r.is(t))return r;if(r.is(e)||r.is(t))break}return null}(n,r);if(!c)return o(r);var i=e.strategy[c.name]||c.default;return c.merge[i](t,n,r)}return e||(e={}),e={strategy:e.strategy||{}},function(){return i(arguments).reduceRight(function(e,n){return t(n,e)})}}function u(){for(var t=arguments.length;t>0;t--){var n=arguments.length<=t-1?void 0:arguments[t-1];if(!e.isObject(n))return console.error("trying to merge a non-object: ",n),n}return function(){var e=i(arguments);return 1===e.length?s(e[0]):s().apply(null,e)}.apply(void 0,arguments)}var f={firestorePath:"",firestoreRefType:"",moduleName:"",statePropName:"",sync:{where:[],orderBy:[],fillables:[],guard:[]},insertHook:function(e,t,n){return e(t)},patchHook:function(e,t,n){return e(t)},deleteHook:function(e,t,n){return e(t)},serverChange:{defaultValues:{},addedHook:function(e,t,n,r,c,o){return e(t)},modifiedHook:function(e,t,n,r,c,o){return e(t)},removedHook:function(e,t,n,r,c,o){return e(t)}},fetch:{docLimit:50},state:{},getters:{},mutations:{},actions:{}},d={_sync:{signedIn:!1,patching:!1,syncStack:{updates:{},deletions:[],inserts:[],debounceTimer:null},fetched:[],stopPatchingTimeout:null}},l={resetSyncStack:function(e){e._sync.syncStack={updates:{},deletions:[],inserts:[],debounceTimer:null}},INSERT_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$set(e[e._conf.statePropName],t.id,t)},PATCH_DOC:function(t,n){var r=this;if("doc"===t._conf.firestoreRefType.toLowerCase())return t._conf.statePropName?void(t[t._conf.statePropName]=u(t[t._conf.statePropName],n)):Object.keys(n).forEach(function(c){var o=void 0===t[c]?n[c]:e.isObject(t[c])&&e.isObject(n[c])?u(t[c],n[c]):n[c];r._vm.$set(t,c,o)});var c=void 0===t[t._conf.statePropName][n.id]?n:e.isObject(t[t._conf.statePropName][n.id])&&e.isObject(n)?u(t[t._conf.statePropName][n.id],n):n;this._vm.$set(t[t._conf.statePropName],n.id,c)},DELETE_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$delete(e[e._conf.statePropName],t)}};function h(e){var t=void 0;if("object"!=(void 0===e?"undefined":r(e)))return e;if(!e)return e;if("[object Object]"!==Object.prototype.toString.call(e)||"[object Array]"!==Object.prototype.toString.call(e))return JSON.parse(JSON.stringify(e));if("[object Array]"===Object.prototype.toString.call(e)){t=[];for(var n=0,c=e.length;n1&&void 0!==arguments[1]?arguments[1]:{ids:[],doc:{}},i=o.id,a=void 0===i?"":i,s=o.ids,f=void 0===s?[]:s,d=o.doc;if(!e.isArray(f))return console.log("ids needs to be an array");a&&f.push(a),d.id&&delete d.id;var l=r.prepareForPatch(f,d);return Object.keys(l).forEach(function(e){var t=n._sync.syncStack.updates[e]?u(n._sync.syncStack.updates[e],l[e]):l[e];n._sync.syncStack.updates[e]=t}),c("handleSyncStackDebounce")},deleteDoc:function(t){var n=t.state,r=t.getters,c=(t.commit,t.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];e.isArray(o)||(o=[o]);var i=r.prepareForDeletion(o),a=n._sync.syncStack.deletions.concat(i);if(n._sync.syncStack.deletions=a,n._sync.syncStack.deletions.length)return c("handleSyncStackDebounce")},insertDoc:function(t){var n=t.state,r=t.getters,c=(t.commit,t.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];e.isArray(o)||(o=[o]);var i=r.prepareForInsert(o),a=n._sync.syncStack.inserts.concat(i);return n._sync.syncStack.inserts=a,c("handleSyncStackDebounce")},handleSyncStackDebounce:function(e){var t,n,r=e.state,c=(e.commit,e.dispatch);if(!e.getters.signedIn)return!1;if(!r._sync.syncStack.debounceTimer){var o=(t=1e3,n=Date.now(),{done:new Promise(function(e,r){var c=setInterval(function(r){Date.now()-n>=t&&(clearInterval(c),e(!0))},10)}),refresh:function(){return n=Date.now()}});o.done.then(function(e){return c("batchSync")}),r._sync.syncStack.debounceTimer=o}r._sync.syncStack.debounceTimer.refresh()},batchSync:function(e){var t=e.getters,r=(e.commit,e.dispatch),c=e.state,o=t.collectionMode,i=t.dbRef,a=n.firestore().batch(),s=0,u=h(c._sync.syncStack.updates),f=Object.keys(u).map(function(e){return{id:e,fields:u[e]}});if(f.length>=500){s=500;var d=f.slice(0,500),l=f.slice(500,-1);c._sync.syncStack.updates=l.reduce(function(e,t){return e[t.id]=t,delete t.id,e},{}),f=d}else c._sync.syncStack.updates={},s=f.length;f.forEach(function(e){var t=e.id,n=o?i.doc(t):i,r=p(e.fields);console.log("fields → ",r),a.update(n,r)});var y=h(c._sync.syncStack.deletions);if(s>=500)y=[];else{var m=500-s,v=y.slice(0,m),g=y.slice(m,-1);c._sync.syncStack.deletions=g,s+=v.length,y=v}y.forEach(function(e){var t=i.doc(e);a.delete(t)});var _=h(c._sync.syncStack.inserts);if(s>=500)_=[];else{var b=500-s,k=_.slice(0,b),S=_.slice(b,-1);c._sync.syncStack.inserts=S,s+=k.length,_=k}return _.forEach(function(e){var n=t.dbRef.doc(e.id);a.set(n,e)}),r("_startPatching"),c._sync.syncStack.debounceTimer=null,new Promise(function(e,t){a.commit().then(function(t){return console.log("[batchSync] RESOLVED:",t,"\n updates: ",Object.keys(f).length?f:{},"\n deletions: ",y.length?y:[],"\n inserts: ",_.length?_:[]),Object.keys(c._sync.syncStack.updates).length+c._sync.syncStack.deletions.length+c._sync.syncStack.inserts.length&&r("batchSync"),r("_stopPatching"),e()}).catch(function(e){return c._sync.patching="error",c._sync.syncStack.debounceTimer=null,t()})})},fetch:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{whereFilters:[],orderBy:[]}),o=r.whereFilters,i=void 0===o?[]:o,a=r.orderBy,s=void 0===a?[]:a;return new Promise(function(e,r){if(console.log("[fetch] starting"),!n.signedIn)return e();var o=JSON.stringify({whereFilters:i,orderBy:s});if(!t._sync.fetched[o]){var a,u=n.dbRef;if(i.forEach(function(e){var t;u=(t=u).where.apply(t,c(e))}),s.length)u=(a=u).orderBy.apply(a,c(s));t._sync.fetched[o]={ref:u,done:!1,retrievedFetchRefs:[],nextFetchRef:null}}var f=t._sync.fetched[o];if(f.done)return console.log("done fetching"),e("fetchedAll");var d=t._sync.fetched[o].ref;if(f.nextFetchRef&&(d=t._sync.fetched[o].nextFetchRef),d=d.limit(t._conf.fetch.docLimit),f.retrievedFetchRefs.includes(d))return console.log("Already retrieved this part."),e();d.get().then(function(n){var r=n.docs;if(0===r.length)return t._sync.fetched[o].done=!0,void e("fetchedAll");r.length1&&void 0!==arguments[1]?arguments[1]:[],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return e.isObject(t)?(n.length&&Object.keys(t).forEach(function(e){n.includes(e)||delete t[e]}),r.forEach(function(e){delete t[e]}),t):t}var g={signedIn:function(e,t,n,r){return e._sync.signedIn},dbRef:function(e,t,r,c){if(!t.signedIn)return!1;if(!n.auth().currentUser)return!1;var o=n.auth().currentUser.uid,i=e._conf.firestorePath.replace("{userId}",o);return"collection"===e._conf.firestoreRefType.toLowerCase()?n.firestore().collection(i):n.firestore().doc(i)},storeRef:function(e,n,r){var c=e._conf.statePropName?e._conf.moduleName+"/"+e._conf.statePropName:e._conf.moduleName;return t.getDeepRef(r,c)},collectionMode:function(e,t,n){return"collection"===e._conf.firestoreRefType.toLowerCase()},prepareForPatch:function(e,t,r,c){return function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=t.collectionMode;return o||r.push("singleDoc"),r.reduce(function(r,i){var a={};return(a=v(a=h(a=Object.keys(c).length?c:o?t.storeRef[i]:t.storeRef),e._conf.sync.fillables,e._conf.sync.guard)).updated_at=n.firestore.FieldValue.serverTimestamp(),r[i]=a,r},{})}},prepareForDeletion:function(e,t,n,r){return function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).reduce(function(e,t){return e.push(t),e},[])}},prepareForInsert:function(e,t,r,c){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(t=h(t)).reduce(function(t,r){return(r=v(r,e._conf.sync.fillables,e._conf.sync.guard)).created_at=n.firestore.FieldValue.serverTimestamp(),r.created_by=c["user/id"],t.push(r),t},[])}}};function _(e){var n=u(f,e);if(r=n,["firestorePath","moduleName"].forEach(function(e){if(!r[e])return console.error("Missing "+e+" from your config!"),!1}),/(\.|\/)/.test(r.statePropName)?(console.error("statePropName must only include letters from [a-z]"),0):!/\./.test(r.moduleName)||(console.error("moduleName must only include letters from [a-z] and forward slashes '/'"),0)){var r,c=n.state,o=n.mutations,i=n.actions,a=n.getters;delete n.state,delete n.mutations,delete n.actions,delete n.getters;var s={};return n.statePropName&&(s[n.statePropName]={}),{namespaced:!0,state:u(d,c,s,{_conf:n}),mutations:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments[1],r=t.defaultMutations(n);return Object.assign({},r,l,e)}(o,u(d,c)),actions:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},m,e)}(i),getters:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},g,e)}(a)}}}return function(n){return function(r){e.isArray(n)||(n=[n]),n.forEach(function(e){var n=t.getKeysFromPath(e.moduleName);r.registerModule(n,_(e))}),r.setDoc=function(e,t){return r.dispatch(e+"/setDoc",t)},r.insert=function(e,t){return r.dispatch(e+"/insert",t)},r.patch=function(e,t){return r.dispatch(e+"/patch",t)},r.patchBatch=function(e,t){return r.dispatch(e+"/patchBatch",t)},r.delete=function(e,t){return r.dispatch(e+"/delete",t)}}}}(isWhat,vuexEasyAccess,Firebase); +var VuexEasyFirestore=function(e,t,n){"use strict";n=n&&n.hasOwnProperty("default")?n.default:n;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0;--n){var r=a[n];if(r.is(e)&&r.is(t))return r;if(r.is(e)||r.is(t))break}return null}(n,r);if(!c)return o(r);var i=e.strategy[c.name]||c.default;return c.merge[i](t,n,r)}return e||(e={}),e={strategy:e.strategy||{}},function(){return i(arguments).reduceRight(function(e,n){return t(n,e)})}}function u(){for(var t=arguments.length;t>0;t--){var n=arguments.length<=t-1?void 0:arguments[t-1];if(!e.isObject(n))return console.error("trying to merge a non-object: ",n),n}return function(){var e=i(arguments);return 1===e.length?s(e[0]):s().apply(null,e)}.apply(void 0,arguments)}var f={firestorePath:"",firestoreRefType:"",moduleName:"",statePropName:"",sync:{where:[],orderBy:[],fillables:[],guard:[],insertHook:function(e,t,n){return e(t)},patchHook:function(e,t,n){return e(t)},deleteHook:function(e,t,n){return e(t)}},serverChange:{defaultValues:{},addedHook:function(e,t,n,r,c,o){return e(t)},modifiedHook:function(e,t,n,r,c,o){return e(t)},removedHook:function(e,t,n,r,c,o){return e(t)}},fetch:{docLimit:50},state:{},getters:{},mutations:{},actions:{}},d={_sync:{signedIn:!1,patching:!1,syncStack:{updates:{},deletions:[],inserts:[],debounceTimer:null},fetched:[],stopPatchingTimeout:null}},l={resetSyncStack:function(e){e._sync.syncStack={updates:{},deletions:[],inserts:[],debounceTimer:null}},INSERT_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$set(e[e._conf.statePropName],t.id,t)},PATCH_DOC:function(t,n){var r=this;if("doc"===t._conf.firestoreRefType.toLowerCase())return t._conf.statePropName?void(t[t._conf.statePropName]=u(t[t._conf.statePropName],n)):Object.keys(n).forEach(function(c){var o=void 0===t[c]?n[c]:e.isObject(t[c])&&e.isObject(n[c])?u(t[c],n[c]):n[c];r._vm.$set(t,c,o)});var c=void 0===t[t._conf.statePropName][n.id]?n:e.isObject(t[t._conf.statePropName][n.id])&&e.isObject(n)?u(t[t._conf.statePropName][n.id],n):n;this._vm.$set(t[t._conf.statePropName],n.id,c)},DELETE_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$delete(e[e._conf.statePropName],t)}};function h(e){var t=void 0;if("object"!=(void 0===e?"undefined":r(e)))return e;if(!e)return e;if("[object Object]"!==Object.prototype.toString.call(e)||"[object Array]"!==Object.prototype.toString.call(e))return JSON.parse(JSON.stringify(e));if("[object Array]"===Object.prototype.toString.call(e)){t=[];for(var n=0,c=e.length;n1&&void 0!==arguments[1]?arguments[1]:{ids:[],doc:{}},i=o.id,a=void 0===i?"":i,s=o.ids,f=void 0===s?[]:s,d=o.doc;if(!e.isArray(f))return console.log("ids needs to be an array");a&&f.push(a),d.id&&delete d.id;var l=r.prepareForPatch(f,d);return Object.keys(l).forEach(function(e){var t=n._sync.syncStack.updates[e]?u(n._sync.syncStack.updates[e],l[e]):l[e];n._sync.syncStack.updates[e]=t}),c("handleSyncStackDebounce")},deleteDoc:function(t){var n=t.state,r=t.getters,c=(t.commit,t.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];e.isArray(o)||(o=[o]);var i=r.prepareForDeletion(o),a=n._sync.syncStack.deletions.concat(i);if(n._sync.syncStack.deletions=a,n._sync.syncStack.deletions.length)return c("handleSyncStackDebounce")},insertDoc:function(t){var n=t.state,r=t.getters,c=(t.commit,t.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];e.isArray(o)||(o=[o]);var i=r.prepareForInsert(o),a=n._sync.syncStack.inserts.concat(i);return n._sync.syncStack.inserts=a,c("handleSyncStackDebounce")},handleSyncStackDebounce:function(e){var t,n,r=e.state,c=(e.commit,e.dispatch);if(!e.getters.signedIn)return!1;if(!r._sync.syncStack.debounceTimer){var o=(t=1e3,n=Date.now(),{done:new Promise(function(e,r){var c=setInterval(function(r){Date.now()-n>=t&&(clearInterval(c),e(!0))},10)}),refresh:function(){return n=Date.now()}});o.done.then(function(e){return c("batchSync")}),r._sync.syncStack.debounceTimer=o}r._sync.syncStack.debounceTimer.refresh()},batchSync:function(e){var t=e.getters,r=(e.commit,e.dispatch),c=e.state,o=t.collectionMode,i=t.dbRef,a=n.firestore().batch(),s=0,u=h(c._sync.syncStack.updates),f=Object.keys(u).map(function(e){return{id:e,fields:u[e]}});if(f.length>=500){s=500;var d=f.slice(0,500),l=f.slice(500,-1);c._sync.syncStack.updates=l.reduce(function(e,t){return e[t.id]=t,delete t.id,e},{}),f=d}else c._sync.syncStack.updates={},s=f.length;f.forEach(function(e){var t=e.id,n=o?i.doc(t):i,r=p(e.fields);console.log("fields → ",r),a.update(n,r)});var y=h(c._sync.syncStack.deletions);if(s>=500)y=[];else{var m=500-s,v=y.slice(0,m),g=y.slice(m,-1);c._sync.syncStack.deletions=g,s+=v.length,y=v}y.forEach(function(e){var t=i.doc(e);a.delete(t)});var _=h(c._sync.syncStack.inserts);if(s>=500)_=[];else{var b=500-s,k=_.slice(0,b),S=_.slice(b,-1);c._sync.syncStack.inserts=S,s+=k.length,_=k}return _.forEach(function(e){var n=t.dbRef.doc(e.id);a.set(n,e)}),r("_startPatching"),c._sync.syncStack.debounceTimer=null,new Promise(function(e,t){a.commit().then(function(t){return console.log("[batchSync] RESOLVED:",t,"\n updates: ",Object.keys(f).length?f:{},"\n deletions: ",y.length?y:[],"\n inserts: ",_.length?_:[]),Object.keys(c._sync.syncStack.updates).length+c._sync.syncStack.deletions.length+c._sync.syncStack.inserts.length&&r("batchSync"),r("_stopPatching"),e()}).catch(function(e){return c._sync.patching="error",c._sync.syncStack.debounceTimer=null,t()})})},fetch:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{whereFilters:[],orderBy:[]}),o=r.whereFilters,i=void 0===o?[]:o,a=r.orderBy,s=void 0===a?[]:a;return new Promise(function(e,r){if(console.log("[fetch] starting"),!n.signedIn)return e();var o=JSON.stringify({whereFilters:i,orderBy:s});if(!t._sync.fetched[o]){var a,u=n.dbRef;if(i.forEach(function(e){var t;u=(t=u).where.apply(t,c(e))}),s.length)u=(a=u).orderBy.apply(a,c(s));t._sync.fetched[o]={ref:u,done:!1,retrievedFetchRefs:[],nextFetchRef:null}}var f=t._sync.fetched[o];if(f.done)return console.log("done fetching"),e("fetchedAll");var d=t._sync.fetched[o].ref;if(f.nextFetchRef&&(d=t._sync.fetched[o].nextFetchRef),d=d.limit(t._conf.fetch.docLimit),f.retrievedFetchRefs.includes(d))return console.log("Already retrieved this part."),e();d.get().then(function(n){var r=n.docs;if(0===r.length)return t._sync.fetched[o].done=!0,void e("fetchedAll");r.length1&&void 0!==arguments[1]?arguments[1]:[],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return e.isObject(t)?(n.length&&Object.keys(t).forEach(function(e){n.includes(e)||delete t[e]}),r.forEach(function(e){delete t[e]}),t):t}var g={signedIn:function(e,t,n,r){return e._sync.signedIn},dbRef:function(e,t,r,c){if(!t.signedIn)return!1;if(!n.auth().currentUser)return!1;var o=n.auth().currentUser.uid,i=e._conf.firestorePath.replace("{userId}",o);return"collection"===e._conf.firestoreRefType.toLowerCase()?n.firestore().collection(i):n.firestore().doc(i)},storeRef:function(e,n,r){var c=e._conf.statePropName?e._conf.moduleName+"/"+e._conf.statePropName:e._conf.moduleName;return t.getDeepRef(r,c)},collectionMode:function(e,t,n){return"collection"===e._conf.firestoreRefType.toLowerCase()},prepareForPatch:function(e,t,r,c){return function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=t.collectionMode;return o||r.push("singleDoc"),r.reduce(function(r,i){var a={};return(a=v(a=h(a=Object.keys(c).length?c:o?t.storeRef[i]:t.storeRef),e._conf.sync.fillables,e._conf.sync.guard)).updated_at=n.firestore.FieldValue.serverTimestamp(),r[i]=a,r},{})}},prepareForDeletion:function(e,t,n,r){return function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).reduce(function(e,t){return e.push(t),e},[])}},prepareForInsert:function(e,t,r,c){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(t=h(t)).reduce(function(t,r){return(r=v(r,e._conf.sync.fillables,e._conf.sync.guard)).created_at=n.firestore.FieldValue.serverTimestamp(),r.created_by=c["user/id"],t.push(r),t},[])}}};function _(e){var n=u(f,e);if(r=n,["firestorePath","moduleName"].forEach(function(e){if(!r[e])return console.error("Missing "+e+" from your config!"),!1}),/(\.|\/)/.test(r.statePropName)?(console.error("statePropName must only include letters from [a-z]"),0):!/\./.test(r.moduleName)||(console.error("moduleName must only include letters from [a-z] and forward slashes '/'"),0)){var r,c=n.state,o=n.mutations,i=n.actions,a=n.getters;delete n.state,delete n.mutations,delete n.actions,delete n.getters;var s={};return n.statePropName&&(s[n.statePropName]={}),{namespaced:!0,state:u(d,c,s,{_conf:n}),mutations:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments[1],r=t.defaultMutations(n);return Object.assign({},r,l,e)}(o,u(d,c)),actions:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},m,e)}(i),getters:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},g,e)}(a)}}}return function(n){return function(r){e.isArray(n)||(n=[n]),n.forEach(function(e){var n=t.getKeysFromPath(e.moduleName);r.registerModule(n,_(e))}),r.setDoc=function(e,t){return r.dispatch(e+"/setDoc",t)},r.insert=function(e,t){return r.dispatch(e+"/insert",t)},r.patch=function(e,t){return r.dispatch(e+"/patch",t)},r.patchBatch=function(e,t){return r.dispatch(e+"/patchBatch",t)},r.delete=function(e,t){return r.dispatch(e+"/delete",t)}}}}(isWhat,vuexEasyAccess,Firebase); //# sourceMappingURL=index.iife.min.js.map diff --git a/dist/index.iife.min.js.map b/dist/index.iife.min.js.map index 3f7cc58c..f0ed9bc7 100644 --- a/dist/index.iife.min.js.map +++ b/dist/index.iife.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index.iife.min.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/debounceHelper.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/index.js","../src/module/errorCheck.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n },\n\n // HOOKS:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.sync[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.insertHook) {\n return state._conf.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.deleteHook) {\n return state._conf.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","is","determineType","strategy","name","arguments","reduceRight","element","l","item","isObject","error","args","apply","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","retrievePaths","path","reduce","carry","newPath","extra","assign","actions","getters","dispatch","commit","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","ms","startTime","signedIn","debounceTimer","Date","now","done","Promise","resolve","reject","interval","setInterval","refresh","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","k","fields","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","this","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","serverChange","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","checkFillables","storeRef","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userConfig","conf","defaultConfig","prop","test","userState","userMutations","userActions","userGetters","docContainer","initialState","vuexEasyMutations","defaultMutations","iniMutations","iniActions","iniGetters","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.iife.min.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/debounceHelper.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/index.js","../src/module/errorCheck.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n // HOOKS for local changes:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.serverChange[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.sync.insertHook) {\n return state._conf.sync.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.sync.deleteHook) {\n return state._conf.sync.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","is","determineType","strategy","name","arguments","reduceRight","element","l","item","isObject","error","args","apply","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","retrievePaths","path","reduce","carry","newPath","extra","assign","actions","getters","dispatch","commit","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","ms","startTime","signedIn","debounceTimer","Date","now","done","Promise","resolve","reject","interval","setInterval","refresh","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","k","fields","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","serverChange","this","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","checkFillables","storeRef","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userConfig","conf","defaultConfig","prop","test","userState","userMutations","userActions","userGetters","docContainer","initialState","vuexEasyMutations","defaultMutations","iniMutations","iniActions","iniGetters","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.umd.js b/dist/index.umd.js index 27e79279..fccd27a6 100644 --- a/dist/index.umd.js +++ b/dist/index.umd.js @@ -191,18 +191,17 @@ where: [], orderBy: [], fillables: [], - guard: [] - }, - - // HOOKS: - insertHook: function insertHook(updateStore, doc, store) { - return updateStore(doc); - }, - patchHook: function patchHook(updateStore, doc, store) { - return updateStore(doc); - }, - deleteHook: function deleteHook(updateStore, id, store) { - return updateStore(id); + guard: [], + // HOOKS for local changes: + insertHook: function insertHook(updateStore, doc, store) { + return updateStore(doc); + }, + patchHook: function patchHook(updateStore, doc, store) { + return updateStore(doc); + }, + deleteHook: function deleteHook(updateStore, id, store) { + return updateStore(id); + } }, // When items on the server side are changed: @@ -731,7 +730,7 @@ return dispatch('serverUpdate', { change: change, id: id, doc: _doc }); } // get user set sync hook function - var syncHookFn = state._conf.sync[change + 'Hook']; + var syncHookFn = state._conf.serverChange[change + 'Hook']; if (syncHookFn) { syncHookFn(storeUpdateFn, doc, id, this, source, change); } else { @@ -793,8 +792,8 @@ return dispatch('insertDoc', _doc); } // check for hooks - if (state._conf.insertHook) { - return state._conf.insertHook(storeUpdateFn, doc, this); + if (state._conf.sync.insertHook) { + return state._conf.sync.insertHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -812,8 +811,8 @@ return dispatch('patchDoc', { id: _doc.id, doc: _doc }); } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this); + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -833,8 +832,8 @@ return dispatch('patchDoc', { ids: ids, doc: _doc }); } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this); + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this); } return storeUpdateFn(doc); }, @@ -850,8 +849,8 @@ return dispatch('deleteDoc', _id); } // check for hooks - if (state._conf.deleteHook) { - return state._conf.deleteHook(storeUpdateFn, id, this); + if (state._conf.sync.deleteHook) { + return state._conf.sync.deleteHook(storeUpdateFn, id, this); } return storeUpdateFn(id); }, diff --git a/dist/index.umd.js.map b/dist/index.umd.js.map index 057afe64..0b22db53 100644 --- a/dist/index.umd.js.map +++ b/dist/index.umd.js.map @@ -1 +1 @@ -{"version":3,"file":"index.umd.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n },\n\n // HOOKS:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.sync[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.insertHook) {\n return state._conf.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.deleteHook) {\n return state._conf.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","name","is","el","type","merge","merger","a","b","deep","keys","Object","concat","forEach","key","Array","isArray","Math","max","replace","config","strategy","determineType","elements","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","console","error","deepmerge","firestorePath","firestoreRefType","moduleName","statePropName","sync","where","orderBy","fillables","guard","insertHook","updateStore","doc","store","patchHook","deleteHook","id","serverChange","defaultValues","addedHook","source","change","modifiedHook","removedHook","fetch","docLimit","state","getters","mutations","actions","_sync","signedIn","patching","syncStack","updates","deletions","inserts","debounceTimer","fetched","stopPatchingTimeout","resetSyncStack","INSERT_DOC","_conf","toLowerCase","_vm","$set","PATCH_DOC","newVal","undefined","DELETE_DOC","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","deltaT","clearInterval","refresh","retrievePaths","path","reduce","carry","pathUntilNow","newPath","extra","patchDoc","commit","dispatch","ids","log","syncStackItems","prepareForPatch","deleteDoc","syncStackIds","prepareForDeletion","insertDoc","docs","prepareForInsert","handleSyncStackDebounce","startDebounce","then","batchSync","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","fields","k","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","remainingSyncStack","catch","whereFilters","identifier","ref","paramsArr","retrievedFetchRefs","nextFetchRef","fRequest","fRef","limit","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","serverUpdate","openDBChannel","auth","currentUser","handleDoc","storeUpdateFn","_doc","syncHookFn","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insert","patch","patchBatch","_id","_stopPatching","clearTimeout","setTimeout","_startPatching","userActions","rootState","rootGetters","userId","uid","collection","storeRef","getDeepRef","patchData","checkFillables","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","reqProps","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","namespaced","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.umd.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/debounceHelper.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/errorCheck.js","../src/module/index.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n // HOOKS for local changes:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.serverChange[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.sync.insertHook) {\n return state._conf.sync.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.sync.deleteHook) {\n return state._conf.sync.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","name","is","el","type","merge","merger","a","b","deep","keys","Object","concat","forEach","key","Array","isArray","Math","max","replace","config","strategy","determineType","elements","arguments","reduceRight","element","wrapper","args","apply","l","item","isObject","console","error","deepmerge","firestorePath","firestoreRefType","moduleName","statePropName","sync","where","orderBy","fillables","guard","insertHook","updateStore","doc","store","patchHook","deleteHook","id","serverChange","defaultValues","addedHook","source","change","modifiedHook","removedHook","fetch","docLimit","state","getters","mutations","actions","_sync","signedIn","patching","syncStack","updates","deletions","inserts","debounceTimer","fetched","stopPatchingTimeout","resetSyncStack","INSERT_DOC","_conf","toLowerCase","_vm","$set","PATCH_DOC","newVal","undefined","DELETE_DOC","$delete","userMutations","vuexEasyMutations","defaultMutations","assign","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","ms","startTime","Date","now","done","Promise","resolve","reject","interval","setInterval","deltaT","clearInterval","refresh","retrievePaths","path","reduce","carry","pathUntilNow","newPath","extra","patchDoc","commit","dispatch","ids","log","syncStackItems","prepareForPatch","deleteDoc","syncStackIds","prepareForDeletion","insertDoc","docs","prepareForInsert","handleSyncStackDebounce","startDebounce","then","batchSync","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","fields","k","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","remainingSyncStack","catch","whereFilters","identifier","ref","paramsArr","retrievedFetchRefs","nextFetchRef","fRequest","fRef","limit","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","serverUpdate","openDBChannel","auth","currentUser","handleDoc","storeUpdateFn","_doc","syncHookFn","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insert","patch","patchBatch","_id","_stopPatching","clearTimeout","setTimeout","_startPatching","userActions","rootState","rootGetters","userId","uid","collection","storeRef","getDeepRef","patchData","checkFillables","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userGetters","errorCheck","reqProps","prop","test","userConfig","conf","defaultConfig","userState","docContainer","initialState","namespaced","iniMutations","iniActions","iniGetters","createEasyFirestore","getKeysFromPath","registerModule","iniModule","setDoc","payload"],"mappings":"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"} \ No newline at end of file diff --git a/dist/index.umd.min.js b/dist/index.umd.min.js index c8c7381a..c27bc585 100644 --- a/dist/index.umd.min.js +++ b/dist/index.umd.min.js @@ -1,2 +1,2 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("is-what"),require("vuex-easy-access"),require("firebase/app"),require("firebase/firestore"),require("firebase/auth")):"function"==typeof define&&define.amd?define(["is-what","vuex-easy-access","firebase/app","firebase/firestore","firebase/auth"],t):e.VuexEasyFirestore=t(e.isWhat,e.vuexEasyAccess,e.Firebase)}(this,function(e,t,n){"use strict";n=n&&n.hasOwnProperty("default")?n.default:n;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0;--n){var r=a[n];if(r.is(e)&&r.is(t))return r;if(r.is(e)||r.is(t))break}return null}(n,r);if(!c)return o(r);var i=e.strategy[c.name]||c.default;return c.merge[i](t,n,r)}return e||(e={}),e={strategy:e.strategy||{}},function(){return i(arguments).reduceRight(function(e,n){return t(n,e)})}}function u(){for(var t=arguments.length;t>0;t--){var n=arguments.length<=t-1?void 0:arguments[t-1];if(!e.isObject(n))return console.error("trying to merge a non-object: ",n),n}return function(){var e=i(arguments);return 1===e.length?s(e[0]):s().apply(null,e)}.apply(void 0,arguments)}var f={firestorePath:"",firestoreRefType:"",moduleName:"",statePropName:"",sync:{where:[],orderBy:[],fillables:[],guard:[]},insertHook:function(e,t,n){return e(t)},patchHook:function(e,t,n){return e(t)},deleteHook:function(e,t,n){return e(t)},serverChange:{defaultValues:{},addedHook:function(e,t,n,r,c,o){return e(t)},modifiedHook:function(e,t,n,r,c,o){return e(t)},removedHook:function(e,t,n,r,c,o){return e(t)}},fetch:{docLimit:50},state:{},getters:{},mutations:{},actions:{}},d={_sync:{signedIn:!1,patching:!1,syncStack:{updates:{},deletions:[],inserts:[],debounceTimer:null},fetched:[],stopPatchingTimeout:null}},l={resetSyncStack:function(e){e._sync.syncStack={updates:{},deletions:[],inserts:[],debounceTimer:null}},INSERT_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$set(e[e._conf.statePropName],t.id,t)},PATCH_DOC:function(t,n){var r=this;if("doc"===t._conf.firestoreRefType.toLowerCase())return t._conf.statePropName?void(t[t._conf.statePropName]=u(t[t._conf.statePropName],n)):Object.keys(n).forEach(function(c){var o=void 0===t[c]?n[c]:e.isObject(t[c])&&e.isObject(n[c])?u(t[c],n[c]):n[c];r._vm.$set(t,c,o)});var c=void 0===t[t._conf.statePropName][n.id]?n:e.isObject(t[t._conf.statePropName][n.id])&&e.isObject(n)?u(t[t._conf.statePropName][n.id],n):n;this._vm.$set(t[t._conf.statePropName],n.id,c)},DELETE_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$delete(e[e._conf.statePropName],t)}};function h(e){var t=void 0;if("object"!=(void 0===e?"undefined":r(e)))return e;if(!e)return e;if("[object Object]"!==Object.prototype.toString.call(e)||"[object Array]"!==Object.prototype.toString.call(e))return JSON.parse(JSON.stringify(e));if("[object Array]"===Object.prototype.toString.call(e)){t=[];for(var n=0,c=e.length;n1&&void 0!==arguments[1]?arguments[1]:{ids:[],doc:{}},i=o.id,a=void 0===i?"":i,s=o.ids,f=void 0===s?[]:s,d=o.doc;if(!e.isArray(f))return console.log("ids needs to be an array");a&&f.push(a),d.id&&delete d.id;var l=r.prepareForPatch(f,d);return Object.keys(l).forEach(function(e){var t=n._sync.syncStack.updates[e]?u(n._sync.syncStack.updates[e],l[e]):l[e];n._sync.syncStack.updates[e]=t}),c("handleSyncStackDebounce")},deleteDoc:function(t){var n=t.state,r=t.getters,c=(t.commit,t.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];e.isArray(o)||(o=[o]);var i=r.prepareForDeletion(o),a=n._sync.syncStack.deletions.concat(i);if(n._sync.syncStack.deletions=a,n._sync.syncStack.deletions.length)return c("handleSyncStackDebounce")},insertDoc:function(t){var n=t.state,r=t.getters,c=(t.commit,t.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];e.isArray(o)||(o=[o]);var i=r.prepareForInsert(o),a=n._sync.syncStack.inserts.concat(i);return n._sync.syncStack.inserts=a,c("handleSyncStackDebounce")},handleSyncStackDebounce:function(e){var t,n,r=e.state,c=(e.commit,e.dispatch);if(!e.getters.signedIn)return!1;if(!r._sync.syncStack.debounceTimer){var o=(t=1e3,n=Date.now(),{done:new Promise(function(e,r){var c=setInterval(function(r){Date.now()-n>=t&&(clearInterval(c),e(!0))},10)}),refresh:function(){return n=Date.now()}});o.done.then(function(e){return c("batchSync")}),r._sync.syncStack.debounceTimer=o}r._sync.syncStack.debounceTimer.refresh()},batchSync:function(e){var t=e.getters,r=(e.commit,e.dispatch),c=e.state,o=t.collectionMode,i=t.dbRef,a=n.firestore().batch(),s=0,u=h(c._sync.syncStack.updates),f=Object.keys(u).map(function(e){return{id:e,fields:u[e]}});if(f.length>=500){s=500;var d=f.slice(0,500),l=f.slice(500,-1);c._sync.syncStack.updates=l.reduce(function(e,t){return e[t.id]=t,delete t.id,e},{}),f=d}else c._sync.syncStack.updates={},s=f.length;f.forEach(function(e){var t=e.id,n=o?i.doc(t):i,r=p(e.fields);console.log("fields → ",r),a.update(n,r)});var y=h(c._sync.syncStack.deletions);if(s>=500)y=[];else{var m=500-s,v=y.slice(0,m),g=y.slice(m,-1);c._sync.syncStack.deletions=g,s+=v.length,y=v}y.forEach(function(e){var t=i.doc(e);a.delete(t)});var _=h(c._sync.syncStack.inserts);if(s>=500)_=[];else{var b=500-s,k=_.slice(0,b),S=_.slice(b,-1);c._sync.syncStack.inserts=S,s+=k.length,_=k}return _.forEach(function(e){var n=t.dbRef.doc(e.id);a.set(n,e)}),r("_startPatching"),c._sync.syncStack.debounceTimer=null,new Promise(function(e,t){a.commit().then(function(t){return console.log("[batchSync] RESOLVED:",t,"\n updates: ",Object.keys(f).length?f:{},"\n deletions: ",y.length?y:[],"\n inserts: ",_.length?_:[]),Object.keys(c._sync.syncStack.updates).length+c._sync.syncStack.deletions.length+c._sync.syncStack.inserts.length&&r("batchSync"),r("_stopPatching"),e()}).catch(function(e){return c._sync.patching="error",c._sync.syncStack.debounceTimer=null,t()})})},fetch:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{whereFilters:[],orderBy:[]}),o=r.whereFilters,i=void 0===o?[]:o,a=r.orderBy,s=void 0===a?[]:a;return new Promise(function(e,r){if(console.log("[fetch] starting"),!n.signedIn)return e();var o=JSON.stringify({whereFilters:i,orderBy:s});if(!t._sync.fetched[o]){var a,u=n.dbRef;if(i.forEach(function(e){var t;u=(t=u).where.apply(t,c(e))}),s.length)u=(a=u).orderBy.apply(a,c(s));t._sync.fetched[o]={ref:u,done:!1,retrievedFetchRefs:[],nextFetchRef:null}}var f=t._sync.fetched[o];if(f.done)return console.log("done fetching"),e("fetchedAll");var d=t._sync.fetched[o].ref;if(f.nextFetchRef&&(d=t._sync.fetched[o].nextFetchRef),d=d.limit(t._conf.fetch.docLimit),f.retrievedFetchRefs.includes(d))return console.log("Already retrieved this part."),e();d.get().then(function(n){var r=n.docs;if(0===r.length)return t._sync.fetched[o].done=!0,void e("fetchedAll");r.length1&&void 0!==arguments[1]?arguments[1]:[],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return e.isObject(t)?(n.length&&Object.keys(t).forEach(function(e){n.includes(e)||delete t[e]}),r.forEach(function(e){delete t[e]}),t):t}var g={signedIn:function(e,t,n,r){return e._sync.signedIn},dbRef:function(e,t,r,c){if(!t.signedIn)return!1;if(!n.auth().currentUser)return!1;var o=n.auth().currentUser.uid,i=e._conf.firestorePath.replace("{userId}",o);return"collection"===e._conf.firestoreRefType.toLowerCase()?n.firestore().collection(i):n.firestore().doc(i)},storeRef:function(e,n,r){var c=e._conf.statePropName?e._conf.moduleName+"/"+e._conf.statePropName:e._conf.moduleName;return t.getDeepRef(r,c)},collectionMode:function(e,t,n){return"collection"===e._conf.firestoreRefType.toLowerCase()},prepareForPatch:function(e,t,r,c){return function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=t.collectionMode;return o||r.push("singleDoc"),r.reduce(function(r,i){var a={};return(a=v(a=h(a=Object.keys(c).length?c:o?t.storeRef[i]:t.storeRef),e._conf.sync.fillables,e._conf.sync.guard)).updated_at=n.firestore.FieldValue.serverTimestamp(),r[i]=a,r},{})}},prepareForDeletion:function(e,t,n,r){return function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).reduce(function(e,t){return e.push(t),e},[])}},prepareForInsert:function(e,t,r,c){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(t=h(t)).reduce(function(t,r){return(r=v(r,e._conf.sync.fillables,e._conf.sync.guard)).created_at=n.firestore.FieldValue.serverTimestamp(),r.created_by=c["user/id"],t.push(r),t},[])}}};function _(e){var n=u(f,e);if(r=n,["firestorePath","moduleName"].forEach(function(e){if(!r[e])return console.error("Missing "+e+" from your config!"),!1}),/(\.|\/)/.test(r.statePropName)?(console.error("statePropName must only include letters from [a-z]"),0):!/\./.test(r.moduleName)||(console.error("moduleName must only include letters from [a-z] and forward slashes '/'"),0)){var r,c=n.state,o=n.mutations,i=n.actions,a=n.getters;delete n.state,delete n.mutations,delete n.actions,delete n.getters;var s={};return n.statePropName&&(s[n.statePropName]={}),{namespaced:!0,state:u(d,c,s,{_conf:n}),mutations:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments[1],r=t.defaultMutations(n);return Object.assign({},r,l,e)}(o,u(d,c)),actions:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},m,e)}(i),getters:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},g,e)}(a)}}}return function(n){return function(r){e.isArray(n)||(n=[n]),n.forEach(function(e){var n=t.getKeysFromPath(e.moduleName);r.registerModule(n,_(e))}),r.setDoc=function(e,t){return r.dispatch(e+"/setDoc",t)},r.insert=function(e,t){return r.dispatch(e+"/insert",t)},r.patch=function(e,t){return r.dispatch(e+"/patch",t)},r.patchBatch=function(e,t){return r.dispatch(e+"/patchBatch",t)},r.delete=function(e,t){return r.dispatch(e+"/delete",t)}}}}); +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("is-what"),require("vuex-easy-access"),require("firebase/app"),require("firebase/firestore"),require("firebase/auth")):"function"==typeof define&&define.amd?define(["is-what","vuex-easy-access","firebase/app","firebase/firestore","firebase/auth"],t):e.VuexEasyFirestore=t(e.isWhat,e.vuexEasyAccess,e.Firebase)}(this,function(e,t,n){"use strict";n=n&&n.hasOwnProperty("default")?n.default:n;var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c=function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t=0;--n){var r=a[n];if(r.is(e)&&r.is(t))return r;if(r.is(e)||r.is(t))break}return null}(n,r);if(!c)return o(r);var i=e.strategy[c.name]||c.default;return c.merge[i](t,n,r)}return e||(e={}),e={strategy:e.strategy||{}},function(){return i(arguments).reduceRight(function(e,n){return t(n,e)})}}function u(){for(var t=arguments.length;t>0;t--){var n=arguments.length<=t-1?void 0:arguments[t-1];if(!e.isObject(n))return console.error("trying to merge a non-object: ",n),n}return function(){var e=i(arguments);return 1===e.length?s(e[0]):s().apply(null,e)}.apply(void 0,arguments)}var f={firestorePath:"",firestoreRefType:"",moduleName:"",statePropName:"",sync:{where:[],orderBy:[],fillables:[],guard:[],insertHook:function(e,t,n){return e(t)},patchHook:function(e,t,n){return e(t)},deleteHook:function(e,t,n){return e(t)}},serverChange:{defaultValues:{},addedHook:function(e,t,n,r,c,o){return e(t)},modifiedHook:function(e,t,n,r,c,o){return e(t)},removedHook:function(e,t,n,r,c,o){return e(t)}},fetch:{docLimit:50},state:{},getters:{},mutations:{},actions:{}},d={_sync:{signedIn:!1,patching:!1,syncStack:{updates:{},deletions:[],inserts:[],debounceTimer:null},fetched:[],stopPatchingTimeout:null}},l={resetSyncStack:function(e){e._sync.syncStack={updates:{},deletions:[],inserts:[],debounceTimer:null}},INSERT_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$set(e[e._conf.statePropName],t.id,t)},PATCH_DOC:function(t,n){var r=this;if("doc"===t._conf.firestoreRefType.toLowerCase())return t._conf.statePropName?void(t[t._conf.statePropName]=u(t[t._conf.statePropName],n)):Object.keys(n).forEach(function(c){var o=void 0===t[c]?n[c]:e.isObject(t[c])&&e.isObject(n[c])?u(t[c],n[c]):n[c];r._vm.$set(t,c,o)});var c=void 0===t[t._conf.statePropName][n.id]?n:e.isObject(t[t._conf.statePropName][n.id])&&e.isObject(n)?u(t[t._conf.statePropName][n.id],n):n;this._vm.$set(t[t._conf.statePropName],n.id,c)},DELETE_DOC:function(e,t){"doc"!==e._conf.firestoreRefType.toLowerCase()&&this._vm.$delete(e[e._conf.statePropName],t)}};function h(e){var t=void 0;if("object"!=(void 0===e?"undefined":r(e)))return e;if(!e)return e;if("[object Object]"!==Object.prototype.toString.call(e)||"[object Array]"!==Object.prototype.toString.call(e))return JSON.parse(JSON.stringify(e));if("[object Array]"===Object.prototype.toString.call(e)){t=[];for(var n=0,c=e.length;n1&&void 0!==arguments[1]?arguments[1]:{ids:[],doc:{}},i=o.id,a=void 0===i?"":i,s=o.ids,f=void 0===s?[]:s,d=o.doc;if(!e.isArray(f))return console.log("ids needs to be an array");a&&f.push(a),d.id&&delete d.id;var l=r.prepareForPatch(f,d);return Object.keys(l).forEach(function(e){var t=n._sync.syncStack.updates[e]?u(n._sync.syncStack.updates[e],l[e]):l[e];n._sync.syncStack.updates[e]=t}),c("handleSyncStackDebounce")},deleteDoc:function(t){var n=t.state,r=t.getters,c=(t.commit,t.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];e.isArray(o)||(o=[o]);var i=r.prepareForDeletion(o),a=n._sync.syncStack.deletions.concat(i);if(n._sync.syncStack.deletions=a,n._sync.syncStack.deletions.length)return c("handleSyncStackDebounce")},insertDoc:function(t){var n=t.state,r=t.getters,c=(t.commit,t.dispatch),o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];e.isArray(o)||(o=[o]);var i=r.prepareForInsert(o),a=n._sync.syncStack.inserts.concat(i);return n._sync.syncStack.inserts=a,c("handleSyncStackDebounce")},handleSyncStackDebounce:function(e){var t,n,r=e.state,c=(e.commit,e.dispatch);if(!e.getters.signedIn)return!1;if(!r._sync.syncStack.debounceTimer){var o=(t=1e3,n=Date.now(),{done:new Promise(function(e,r){var c=setInterval(function(r){Date.now()-n>=t&&(clearInterval(c),e(!0))},10)}),refresh:function(){return n=Date.now()}});o.done.then(function(e){return c("batchSync")}),r._sync.syncStack.debounceTimer=o}r._sync.syncStack.debounceTimer.refresh()},batchSync:function(e){var t=e.getters,r=(e.commit,e.dispatch),c=e.state,o=t.collectionMode,i=t.dbRef,a=n.firestore().batch(),s=0,u=h(c._sync.syncStack.updates),f=Object.keys(u).map(function(e){return{id:e,fields:u[e]}});if(f.length>=500){s=500;var d=f.slice(0,500),l=f.slice(500,-1);c._sync.syncStack.updates=l.reduce(function(e,t){return e[t.id]=t,delete t.id,e},{}),f=d}else c._sync.syncStack.updates={},s=f.length;f.forEach(function(e){var t=e.id,n=o?i.doc(t):i,r=p(e.fields);console.log("fields → ",r),a.update(n,r)});var y=h(c._sync.syncStack.deletions);if(s>=500)y=[];else{var m=500-s,v=y.slice(0,m),g=y.slice(m,-1);c._sync.syncStack.deletions=g,s+=v.length,y=v}y.forEach(function(e){var t=i.doc(e);a.delete(t)});var _=h(c._sync.syncStack.inserts);if(s>=500)_=[];else{var b=500-s,k=_.slice(0,b),S=_.slice(b,-1);c._sync.syncStack.inserts=S,s+=k.length,_=k}return _.forEach(function(e){var n=t.dbRef.doc(e.id);a.set(n,e)}),r("_startPatching"),c._sync.syncStack.debounceTimer=null,new Promise(function(e,t){a.commit().then(function(t){return console.log("[batchSync] RESOLVED:",t,"\n updates: ",Object.keys(f).length?f:{},"\n deletions: ",y.length?y:[],"\n inserts: ",_.length?_:[]),Object.keys(c._sync.syncStack.updates).length+c._sync.syncStack.deletions.length+c._sync.syncStack.inserts.length&&r("batchSync"),r("_stopPatching"),e()}).catch(function(e){return c._sync.patching="error",c._sync.syncStack.debounceTimer=null,t()})})},fetch:function(e){var t=e.state,n=e.getters,r=(e.commit,e.dispatch,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{whereFilters:[],orderBy:[]}),o=r.whereFilters,i=void 0===o?[]:o,a=r.orderBy,s=void 0===a?[]:a;return new Promise(function(e,r){if(console.log("[fetch] starting"),!n.signedIn)return e();var o=JSON.stringify({whereFilters:i,orderBy:s});if(!t._sync.fetched[o]){var a,u=n.dbRef;if(i.forEach(function(e){var t;u=(t=u).where.apply(t,c(e))}),s.length)u=(a=u).orderBy.apply(a,c(s));t._sync.fetched[o]={ref:u,done:!1,retrievedFetchRefs:[],nextFetchRef:null}}var f=t._sync.fetched[o];if(f.done)return console.log("done fetching"),e("fetchedAll");var d=t._sync.fetched[o].ref;if(f.nextFetchRef&&(d=t._sync.fetched[o].nextFetchRef),d=d.limit(t._conf.fetch.docLimit),f.retrievedFetchRefs.includes(d))return console.log("Already retrieved this part."),e();d.get().then(function(n){var r=n.docs;if(0===r.length)return t._sync.fetched[o].done=!0,void e("fetchedAll");r.length1&&void 0!==arguments[1]?arguments[1]:[],r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];return e.isObject(t)?(n.length&&Object.keys(t).forEach(function(e){n.includes(e)||delete t[e]}),r.forEach(function(e){delete t[e]}),t):t}var g={signedIn:function(e,t,n,r){return e._sync.signedIn},dbRef:function(e,t,r,c){if(!t.signedIn)return!1;if(!n.auth().currentUser)return!1;var o=n.auth().currentUser.uid,i=e._conf.firestorePath.replace("{userId}",o);return"collection"===e._conf.firestoreRefType.toLowerCase()?n.firestore().collection(i):n.firestore().doc(i)},storeRef:function(e,n,r){var c=e._conf.statePropName?e._conf.moduleName+"/"+e._conf.statePropName:e._conf.moduleName;return t.getDeepRef(r,c)},collectionMode:function(e,t,n){return"collection"===e._conf.firestoreRefType.toLowerCase()},prepareForPatch:function(e,t,r,c){return function(){var r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],c=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},o=t.collectionMode;return o||r.push("singleDoc"),r.reduce(function(r,i){var a={};return(a=v(a=h(a=Object.keys(c).length?c:o?t.storeRef[i]:t.storeRef),e._conf.sync.fillables,e._conf.sync.guard)).updated_at=n.firestore.FieldValue.serverTimestamp(),r[i]=a,r},{})}},prepareForDeletion:function(e,t,n,r){return function(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:[]).reduce(function(e,t){return e.push(t),e},[])}},prepareForInsert:function(e,t,r,c){return function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(t=h(t)).reduce(function(t,r){return(r=v(r,e._conf.sync.fillables,e._conf.sync.guard)).created_at=n.firestore.FieldValue.serverTimestamp(),r.created_by=c["user/id"],t.push(r),t},[])}}};function _(e){var n=u(f,e);if(r=n,["firestorePath","moduleName"].forEach(function(e){if(!r[e])return console.error("Missing "+e+" from your config!"),!1}),/(\.|\/)/.test(r.statePropName)?(console.error("statePropName must only include letters from [a-z]"),0):!/\./.test(r.moduleName)||(console.error("moduleName must only include letters from [a-z] and forward slashes '/'"),0)){var r,c=n.state,o=n.mutations,i=n.actions,a=n.getters;delete n.state,delete n.mutations,delete n.actions,delete n.getters;var s={};return n.statePropName&&(s[n.statePropName]={}),{namespaced:!0,state:u(d,c,s,{_conf:n}),mutations:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},n=arguments[1],r=t.defaultMutations(n);return Object.assign({},r,l,e)}(o,u(d,c)),actions:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},m,e)}(i),getters:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};return Object.assign({},g,e)}(a)}}}return function(n){return function(r){e.isArray(n)||(n=[n]),n.forEach(function(e){var n=t.getKeysFromPath(e.moduleName);r.registerModule(n,_(e))}),r.setDoc=function(e,t){return r.dispatch(e+"/setDoc",t)},r.insert=function(e,t){return r.dispatch(e+"/insert",t)},r.patch=function(e,t){return r.dispatch(e+"/patch",t)},r.patchBatch=function(e,t){return r.dispatch(e+"/patchBatch",t)},r.delete=function(e,t){return r.dispatch(e+"/delete",t)}}}}); //# sourceMappingURL=index.umd.min.js.map diff --git a/dist/index.umd.min.js.map b/dist/index.umd.min.js.map index 31408e2b..4e0a35ae 100644 --- a/dist/index.umd.min.js.map +++ b/dist/index.umd.min.js.map @@ -1 +1 @@ -{"version":3,"file":"index.umd.min.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/debounceHelper.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/index.js","../src/module/errorCheck.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n },\n\n // HOOKS:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.sync[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.insertHook) {\n return state._conf.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.patchHook) {\n return state._conf.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.deleteHook) {\n return state._conf.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","is","determineType","strategy","name","arguments","reduceRight","element","l","item","isObject","error","args","apply","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","retrievePaths","path","reduce","carry","newPath","extra","assign","actions","getters","dispatch","commit","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","ms","startTime","signedIn","debounceTimer","Date","now","done","Promise","resolve","reject","interval","setInterval","refresh","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","k","fields","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","this","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","serverChange","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","checkFillables","storeRef","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userConfig","conf","defaultConfig","prop","test","userState","userMutations","userActions","userGetters","docContainer","initialState","vuexEasyMutations","defaultMutations","iniMutations","iniActions","iniGetters","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.umd.min.js","sources":["../src/utils/nanomerge.js","../src/utils/deepmerge.js","../src/module/defaultConfig.js","../src/module/state.js","../src/module/mutations.js","../src/utils/copyObj.js","../src/utils/setDefaultValues.js","../src/utils/objectFlattenToPaths.js","../src/module/actions.js","../src/utils/debounceHelper.js","../src/utils/checkFillables.js","../src/module/getters.js","../src/module/index.js","../src/module/errorCheck.js","../src/index.js"],"sourcesContent":["var nanoclone = require('nanoclone').default\n\nfunction toArray (object) {\n var result = []\n\n for (var i = 0; i < object.length; ++i) {\n result.push(object[i])\n }\n\n return result\n}\n\nvar types = [\n {\n name: 'primitive',\n\n is: function (el) {\n var type = typeof el\n\n return (type === 'number' || type === 'string' || type === 'boolean')\n },\n\n default: 'default',\n\n merge: {\n default: function (merger, a, b) {\n return b\n }\n }\n },\n\n {\n name: 'object',\n\n is: function (el) {\n return el !== null && (typeof el === 'object')\n },\n\n default: 'deep',\n\n merge: {\n deep: function (merger, a, b) {\n var result = {}\n\n var keys = {\n a: Object.keys(a),\n b: Object.keys(b)\n }\n\n keys.a.concat(keys.b).forEach(function (key) {\n result[key] = merger(a[key], b[key])\n })\n\n return result\n }\n }\n },\n\n {\n name: 'array',\n\n is: function (el) {\n return Array.isArray(el)\n },\n\n default: 'replace',\n\n merge: {\n merge: function (merger, a, b) {\n var result = []\n\n for (var i = 0; i < Math.max(a.length, b.length); ++i) {\n result.push(merger(a[i], b[i]))\n }\n\n return result\n },\n\n replace: function (merger, a, b) {\n return nanoclone(b)\n },\n\n concat: function (merger, a, b) {\n return (([]).concat(a)).concat(b)\n }\n }\n }\n]\n\nfunction merge (config) {\n if (!config) {\n config = {}\n }\n\n config = {\n strategy: config.strategy || {}\n }\n\n function determineType (a, b) {\n for (var i = types.length - 1; i >= 0; --i) {\n var type = types[i]\n\n if (type.is(a) && type.is(b)) {\n return type\n } else if (type.is(a) || type.is(b)) {\n break\n }\n }\n\n return null\n }\n\n function merger (a, b) {\n if (b === void 0) {\n return nanoclone(a)\n }\n\n var type = determineType(a, b)\n\n if (!type) {\n return nanoclone(b)\n }\n\n var strategy = config.strategy[type.name] || type.default\n\n return type.merge[strategy](merger, a, b)\n }\n\n return function () {\n var elements = toArray(arguments)\n\n return elements.reduceRight(function (result, element) {\n return merger(element, result)\n })\n }\n}\n\nfunction wrapper () {\n var args = toArray(arguments)\n\n // custom config\n if (args.length === 1) {\n return merge(args[0])\n }\n\n return merge().apply(null, args)\n}\n\nexport default wrapper\n// module.exports = wrapper\n","import { isObject } from 'is-what'\nimport deepmerge from './nanomerge'\n\nfunction merge (...params) {\n let l = params.length\n for (l; l > 0; l--) {\n const item = params[l - 1]\n if (!isObject(item)) {\n console.error('trying to merge a non-object: ', item)\n return item\n }\n }\n return deepmerge(...params)\n}\n\nexport default merge\n","\nexport default {\n firestorePath: '',\n // The path to a collection or doc in firestore. You can use `{userId}` which will be replaced with the user Id.\n firestoreRefType: '',\n // `'collection'` or `'doc'`. Depending on your `firestorePath`.\n moduleName: '',\n // The module name. Can be nested, eg. `'user/items'`\n statePropName: '',\n // The name of the property where the docs or doc will be synced to. If left blank it will be synced on the state of the module. (Please see [Sync directly to module state](#sync-directly-to-module-state) for more info)\n\n // Related to the 2-way sync:\n sync: {\n where: [],\n orderBy: [],\n fillables: [],\n guard: [],\n // HOOKS for local changes:\n insertHook: function (updateStore, doc, store) { return updateStore(doc) },\n patchHook: function (updateStore, doc, store) { return updateStore(doc) },\n deleteHook: function (updateStore, id, store) { return updateStore(id) },\n },\n\n // When items on the server side are changed:\n serverChange: {\n defaultValues: {},\n // HOOKS for changes on SERVER:\n addedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n modifiedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n removedHook: function (updateStore, doc, id, store, source, change) { return updateStore(doc) },\n },\n\n // When items are fetched through `dispatch('module/fetch', filters)`.\n fetch: {\n // The max amount of documents to be fetched. Defaults to 50.\n docLimit: 50,\n },\n\n // You can also add custom state/getters/mutations/actions. These will be added to your module.\n state: {},\n getters: {},\n mutations: {},\n actions: {},\n}\n","\nexport default {\n _sync: {\n signedIn: false,\n patching: false,\n syncStack: {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n },\n fetched: [],\n stopPatchingTimeout: null\n }\n}\n","import { defaultMutations } from 'vuex-easy-access'\nimport { isObject } from 'is-what'\nimport merge from '../utils/deepmerge'\n\nconst mutations = {\n resetSyncStack (state) {\n state._sync.syncStack = {\n updates: {},\n deletions: [],\n inserts: [],\n debounceTimer: null\n }\n },\n INSERT_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$set(state[state._conf.statePropName], doc.id, doc)\n },\n PATCH_DOC (state, doc) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') {\n if (!state._conf.statePropName) {\n return Object.keys(doc).forEach(key => {\n // Merge if exists\n const newVal = (state[key] === undefined)\n ? doc[key]\n : (!isObject(state[key]) || !isObject(doc[key]))\n ? doc[key]\n : merge(state[key], doc[key])\n this._vm.$set(state, key, newVal)\n })\n }\n // state[state._conf.statePropName] will always be an empty object by default\n state[state._conf.statePropName] = merge(state[state._conf.statePropName], doc)\n return\n }\n // Merge if exists\n const newVal = (state[state._conf.statePropName][doc.id] === undefined)\n ? doc\n : (!isObject(state[state._conf.statePropName][doc.id]) || !isObject(doc))\n ? doc\n : merge(state[state._conf.statePropName][doc.id], doc)\n this._vm.$set(state[state._conf.statePropName], doc.id, newVal)\n },\n DELETE_DOC (state, id) {\n if (state._conf.firestoreRefType.toLowerCase() === 'doc') return\n this._vm.$delete(state[state._conf.statePropName], id)\n }\n}\n\nexport default function (userMutations = {}, state) {\n const vuexEasyMutations = defaultMutations(state)\n return Object.assign({}, vuexEasyMutations, mutations, userMutations)\n}\n","/**\n * copyObj helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\nexport default function copyObj (obj) {\n let newObj\n if (typeof obj != 'object') {\n return obj\n }\n if (!obj) {\n return obj\n }\n if ('[object Object]' !== Object.prototype.toString.call(obj) ||\n '[object Array]' !== Object.prototype.toString.call(obj)\n ) {\n return JSON.parse(JSON.stringify(obj))\n }\n // Object is an Array\n if ('[object Array]' === Object.prototype.toString.call(obj)) {\n newObj = []\n for (let i = 0, len = obj.length; i < len; i++) {\n newObj[i] = copyObj(obj[i])\n }\n return newObj\n }\n // Object is an Object\n newObj = {}\n for (let i in obj) {\n if (obj.hasOwnProperty(i)) {\n newObj[i] = copyObj(obj[i])\n }\n }\n return newObj\n}\n","import merge from './deepmerge'\n\n/**\n * Sets default values on an object\n *\n * @param {object} obj on which to set the default values\n * @param {object} defaultValues the default values\n */\nexport default function (obj, defaultValues) {\n return merge(defaultValues, obj)\n}\n","import { isObject } from 'is-what'\n\nfunction retrievePaths (object, path, result) {\n if (!isObject(object) || !Object.keys(object).length) {\n if (!path) return object\n result[path] = object\n return result\n }\n return Object.keys(object).reduce((carry, key) => {\n const pathUntilNow = (path)\n ? path + '.'\n : ''\n const newPath = pathUntilNow + key\n const extra = retrievePaths(object[key], newPath, result)\n return Object.assign(carry, extra)\n }, {})\n}\n\nexport default function (object) {\n const result = {}\n return retrievePaths(object, null, result)\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport { isArray, isString } from 'is-what'\nimport merge from '../utils/deepmerge'\nimport copyObj from '../utils/copyObj'\nimport setDefaultValues from '../utils/setDefaultValues'\nimport startDebounce from '../utils/debounceHelper'\nimport flattenToPaths from '../utils/objectFlattenToPaths'\n\nconst actions = {\n patchDoc (\n {state, getters, commit, dispatch},\n {id = '', ids = [], doc} = {ids: [], doc: {}}\n ) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) return console.log('ids needs to be an array')\n if (id) ids.push(id)\n if (doc.id) delete doc.id\n\n // 1. Prepare for patching\n let syncStackItems = getters.prepareForPatch(ids, doc)\n\n // 2. Push to syncStack\n Object.keys(syncStackItems).forEach(id => {\n const newVal = (!state._sync.syncStack.updates[id])\n ? syncStackItems[id]\n : merge(state._sync.syncStack.updates[id],\n syncStackItems[id])\n state._sync.syncStack.updates[id] = newVal\n })\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n deleteDoc ({state, getters, commit, dispatch},\n ids = []) {\n // 0. payload correction (only arrays)\n if (!isArray(ids)) ids = [ids]\n\n // 1. Prepare for patching\n const syncStackIds = getters.prepareForDeletion(ids)\n\n // 2. Push to syncStack\n const deletions = state._sync.syncStack.deletions.concat(syncStackIds)\n state._sync.syncStack.deletions = deletions\n\n if (!state._sync.syncStack.deletions.length) return\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n insertDoc ({state, getters, commit, dispatch},\n docs = []) {\n // 0. payload correction (only arrays)\n if (!isArray(docs)) docs = [docs]\n\n // 1. Prepare for patching\n const syncStack = getters.prepareForInsert(docs)\n\n // 2. Push to syncStack\n const inserts = state._sync.syncStack.inserts.concat(syncStack)\n state._sync.syncStack.inserts = inserts\n\n // 3. Create or refresh debounce\n return dispatch('handleSyncStackDebounce')\n },\n handleSyncStackDebounce ({state, commit, dispatch, getters}) {\n if (!getters.signedIn) return false\n if (!state._sync.syncStack.debounceTimer) {\n const debounceTimer = startDebounce(1000)\n debounceTimer.done.then(_ => dispatch('batchSync'))\n state._sync.syncStack.debounceTimer = debounceTimer\n }\n state._sync.syncStack.debounceTimer.refresh()\n },\n batchSync ({getters, commit, dispatch, state}) {\n const collectionMode = getters.collectionMode\n const dbRef = getters.dbRef\n let batch = Firebase.firestore().batch()\n let count = 0\n // Add 'updateds' to batch\n let updatesOriginal = copyObj(state._sync.syncStack.updates)\n let updates = Object.keys(updatesOriginal).map(k => {\n let fields = updatesOriginal[k]\n return {id: k, fields}\n })\n // Check if there are more than 500 batch items already\n if (updates.length >= 500) {\n // Batch supports only until 500 items\n count = 500\n let updatesOK = updates.slice(0, 500)\n let updatesLeft = updates.slice(500, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.updates = updatesLeft.reduce((carry, item) => {\n carry[item.id] = item\n delete item.id\n return carry\n }, {})\n updates = updatesOK\n } else {\n state._sync.syncStack.updates = {}\n count = updates.length\n }\n // Add to batch\n updates.forEach(item => {\n let id = item.id\n let docRef = (collectionMode) ? dbRef.doc(id) : dbRef\n let fields = flattenToPaths(item.fields)\n console.log('fields → ', fields)\n batch.update(docRef, fields)\n })\n // Add 'deletions' to batch\n let deletions = copyObj(state._sync.syncStack.deletions)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n deletions = []\n } else {\n // Batch supports only until 500 items\n let deletionsAmount = 500 - count\n let deletionsOK = deletions.slice(0, deletionsAmount)\n let deletionsLeft = deletions.slice(deletionsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.deletions = deletionsLeft\n count = count + deletionsOK.length\n // Define the items we'll add below\n deletions = deletionsOK\n }\n // Add to batch\n deletions.forEach(id => {\n let docRef = dbRef.doc(id)\n batch.delete(docRef)\n })\n // Add 'inserts' to batch\n let inserts = copyObj(state._sync.syncStack.inserts)\n // Check if there are more than 500 batch items already\n if (count >= 500) {\n // already at 500 or more, leave items in syncstack, and don't add anything to batch\n inserts = []\n } else {\n // Batch supports only until 500 items\n let insertsAmount = 500 - count\n let insertsOK = inserts.slice(0, insertsAmount)\n let insertsLeft = inserts.slice(insertsAmount, -1)\n // Put back the remaining items over 500\n state._sync.syncStack.inserts = insertsLeft\n count = count + insertsOK.length\n // Define the items we'll add below\n inserts = insertsOK\n }\n // Add to batch\n inserts.forEach(item => {\n let newRef = getters.dbRef.doc(item.id)\n batch.set(newRef, item)\n })\n // Commit the batch:\n // console.log(`[batchSync] START:\n // ${Object.keys(updates).length} updates,\n // ${deletions.length} deletions,\n // ${inserts.length} inserts`\n // )\n dispatch('_startPatching')\n state._sync.syncStack.debounceTimer = null\n return new Promise((resolve, reject) => {\n batch.commit()\n .then(res => {\n console.log(`[batchSync] RESOLVED:`, res, `\n updates: `, Object.keys(updates).length ? updates : {}, `\n deletions: `, deletions.length ? deletions : [], `\n inserts: `, inserts.length ? inserts : []\n )\n let remainingSyncStack = Object.keys(state._sync.syncStack.updates).length\n + state._sync.syncStack.deletions.length\n + state._sync.syncStack.inserts.length\n if (remainingSyncStack) { dispatch('batchSync') }\n dispatch('_stopPatching')\n return resolve()\n // // Fetch the item if it was added as an Archived item:\n // if (item.archived) {\n // get_ters.dbRef.doc(res.id).get()\n // .then(doc => {\n // let tempId = doc.data().id\n // let id = doc.id\n // let item = doc.data()\n // item.id = id\n // console.log('retrieved Archived new item: ', id, item)\n // dispatch('newItemFromServer', {item, tempId})\n // })\n // }\n }).catch(error => {\n state._sync.patching = 'error'\n state._sync.syncStack.debounceTimer = null\n return reject()\n })\n })\n },\n fetch (\n {state, getters, commit, dispatch},\n {whereFilters = [], orderBy = []} = {whereFilters: [], orderBy: []}\n // whereFilters: [['archived', '==', true]]\n // orderBy: ['done_date', 'desc']\n ) {\n return new Promise((resolve, reject) => {\n console.log('[fetch] starting')\n if (!getters.signedIn) return resolve()\n const identifier = JSON.stringify({whereFilters, orderBy})\n const fetched = state._sync.fetched[identifier]\n // We've never fetched this before:\n if (!fetched) {\n let ref = getters.dbRef\n // apply where filters and orderBy\n whereFilters.forEach(paramsArr => {\n ref = ref.where(...paramsArr)\n })\n if (orderBy.length) {\n ref = ref.orderBy(...orderBy)\n }\n state._sync.fetched[identifier] = {\n ref,\n done: false,\n retrievedFetchRefs: [],\n nextFetchRef: null\n }\n }\n const fRequest = state._sync.fetched[identifier]\n // We're already done fetching everything:\n if (fRequest.done) {\n console.log('done fetching')\n return resolve('fetchedAll')\n }\n // attach fetch filters\n let fRef = state._sync.fetched[identifier].ref\n if (fRequest.nextFetchRef) {\n // get next ref if saved in state\n fRef = state._sync.fetched[identifier].nextFetchRef\n }\n fRef = fRef.limit(state._conf.fetch.docLimit)\n // Stop if all records already fetched\n if (fRequest.retrievedFetchRefs.includes(fRef)) {\n console.log('Already retrieved this part.')\n return resolve()\n }\n // make fetch request\n fRef.get()\n .then(querySnapshot => {\n const docs = querySnapshot.docs\n if (docs.length === 0) {\n state._sync.fetched[identifier].done = true\n resolve('fetchedAll')\n\n return\n }\n if (docs.length < state._conf.fetch.docLimit) {\n state._sync.fetched[identifier].done = true\n }\n state._sync.fetched[identifier].retrievedFetchRefs.push(fetchRef)\n // Get the last visible document\n resolve(querySnapshot)\n const lastVisible = docs[docs.length - 1]\n // get the next records.\n const next = fRef.startAfter(lastVisible)\n state._sync.fetched[identifier].nextFetchRef = next\n }).catch(error => {\n console.log(error)\n return reject(error)\n })\n })\n },\n serverUpdate ({commit}, {change, id, doc = {}}) {\n doc.id = id\n switch (change) {\n case 'added':\n commit('INSERT_DOC', doc)\n break\n case 'removed':\n commit('DELETE_DOC', id)\n break\n default:\n commit('PATCH_DOC', doc)\n break\n }\n },\n openDBChannel ({getters, state, commit, dispatch}) {\n if (Firebase.auth().currentUser) state._sync.signedIn = true\n const collectionMode = getters.collectionMode\n let dbRef = getters.dbRef\n // apply where filters and orderBy\n if (state._conf.firestoreRefType.toLowerCase() !== 'doc') {\n state._conf.sync.where.forEach(paramsArr => {\n dbRef = dbRef.where(...paramsArr)\n })\n if (state._conf.sync.orderBy.length) {\n dbRef = dbRef.orderBy(...state._conf.sync.orderBy)\n }\n }\n // define handleDoc()\n function handleDoc (change, id, doc, source) {\n change = (!change) ? 'modified' : change.type\n // define storeUpdateFn()\n function storeUpdateFn (_doc) {\n return dispatch('serverUpdate', {change, id, doc: _doc})\n }\n // get user set sync hook function\n const syncHookFn = state._conf.serverChange[change + 'Hook']\n if (syncHookFn) {\n syncHookFn(storeUpdateFn, doc, id, this, source, change)\n } else {\n storeUpdateFn(doc)\n }\n }\n // make a promise\n return new Promise ((resolve, reject) => {\n dbRef\n .onSnapshot(querySnapshot => {\n let source = querySnapshot.metadata.hasPendingWrites ? 'local' : 'server'\n if (!collectionMode) {\n const doc = setDefaultValues(querySnapshot.data(), state._conf.serverChange.defaultValues)\n if (source === 'local') return resolve()\n handleDoc(null, null, doc, source)\n return resolve()\n }\n querySnapshot.docChanges().forEach(change => {\n // Don't do anything for local modifications & removals\n if (source === 'local' &&\n (change.type === 'modified' || change.type === 'removed')\n ) {\n return resolve()\n }\n const id = change.doc.id\n const doc = (change.type === 'added')\n ? setDefaultValues(change.doc.data(), state._conf.serverChange.defaultValues)\n : change.doc.data()\n handleDoc(change, id, doc, source)\n return resolve()\n })\n }, error => {\n state._sync.patching = 'error'\n return reject(error)\n })\n })\n },\n set ({commit, dispatch, getters, state}, doc) {\n if (!doc) return\n if (!getters.collectionMode) {\n return dispatch('patch', doc)\n }\n if (!doc.id || !state[state._conf.statePropName][doc.id]) {\n return dispatch('insert', doc)\n }\n return dispatch('patch', doc)\n },\n insert ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id) doc.id = getters.dbRef.doc().id\n // define the store update\n function storeUpdateFn (_doc) {\n commit('INSERT_DOC', _doc)\n return dispatch('insertDoc', _doc)\n }\n // check for hooks\n if (state._conf.sync.insertHook) {\n return state._conf.sync.insertHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patch ({state, getters, commit, dispatch}, doc) {\n if (!doc) return\n if (!doc.id && getters.collectionMode) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {id: _doc.id, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n patchBatch (\n {state, getters, commit, dispatch},\n {doc, ids = []}\n ) {\n if (!doc) return\n // define the store update\n function storeUpdateFn (_doc) {\n commit('PATCH_DOC', _doc)\n return dispatch('patchDoc', {ids, doc: _doc})\n }\n // check for hooks\n if (state._conf.sync.patchHook) {\n return state._conf.sync.patchHook(storeUpdateFn, doc, this)\n }\n return storeUpdateFn(doc)\n },\n delete ({state, getters, commit, dispatch}, id) {\n // define the store update\n function storeUpdateFn (_id) {\n commit('DELETE_DOC', _id)\n return dispatch('deleteDoc', _id)\n }\n // check for hooks\n if (state._conf.sync.deleteHook) {\n return state._conf.sync.deleteHook(storeUpdateFn, id, this)\n }\n return storeUpdateFn(id)\n },\n _stopPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.stopPatchingTimeout = setTimeout(_ => { state._sync.patching = false }, 300)\n },\n _startPatching ({state, commit}) {\n if (state._sync.stopPatchingTimeout) { clearTimeout(state._sync.stopPatchingTimeout) }\n state._sync.patching = true\n }\n}\n\nexport default function (userActions = {}) {\n return Object.assign({}, actions, userActions)\n}\n","/**\n * debounce helper\n *\n * @author Adam Dorling\n * @contact https://codepen.io/naito\n */\n\n// USAGE:\n// let d = startDebounce(1000)\n// d.done.then(_ => handle())\n// d.refresh() // to refresh\n\nexport default function (ms) {\n let startTime = Date.now()\n const done = new Promise((resolve, reject) => {\n const interval = setInterval(_ => {\n const now = Date.now()\n const deltaT = now - startTime\n if (deltaT >= ms) {\n clearInterval(interval)\n resolve(true)\n }\n }, 10)\n })\n const refresh = () => (startTime = Date.now())\n return { done, refresh }\n}\n","\nimport { isObject } from 'is-what'\n/**\n * Checks all props of an object and deletes guarded and non-fillables.\n *\n * @param {object} obj the target object to check\n * @param {array} fillables an array of strings, with the props which should be allowed on returned object\n * @param {array} guard an array of strings, with the props which should NOT be allowed on returned object\n *\n * @returns {object} the cleaned object after deleting guard and non-fillables\n */\nexport default function (obj, fillables = [], guard = []) {\n if (!isObject(obj)) return obj\n if (fillables.length) {\n Object.keys(obj).forEach(key => {\n if (!fillables.includes(key)) {\n delete obj[key]\n }\n })\n }\n guard.forEach(key => {\n delete obj[key]\n })\n return obj\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/firestore'\nimport 'firebase/auth'\nimport copyObj from '../utils/copyObj'\nimport { getDeepRef } from 'vuex-easy-access'\nimport checkFillables from '../utils/checkFillables'\n\nconst getters = {\n signedIn: (state, getters, rootState, rootGetters) => {\n return state._sync.signedIn\n },\n dbRef: (state, getters, rootState, rootGetters) => {\n if (!getters.signedIn) return false\n if (!Firebase.auth().currentUser) return false\n const userId = Firebase.auth().currentUser.uid\n const path = state._conf.firestorePath.replace('{userId}', userId)\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n ? Firebase.firestore().collection(path)\n : Firebase.firestore().doc(path)\n },\n storeRef: (state, getters, rootState) => {\n const path = (state._conf.statePropName)\n ? `${state._conf.moduleName}/${state._conf.statePropName}`\n : state._conf.moduleName\n return getDeepRef(rootState, path)\n },\n collectionMode: (state, getters, rootState) => {\n return (state._conf.firestoreRefType.toLowerCase() === 'collection')\n },\n prepareForPatch: (state, getters, rootState, rootGetters) =>\n (ids = [], doc = {}) => {\n // get relevant data from the storeRef\n const collectionMode = getters.collectionMode\n if (!collectionMode) ids.push('singleDoc')\n // returns {object} -> {id: data}\n return ids.reduce((carry, id) => {\n let patchData = {}\n // retrieve full object\n if (!Object.keys(doc).length) {\n patchData = (collectionMode)\n ? getters.storeRef[id]\n : getters.storeRef\n } else {\n patchData = doc\n }\n patchData = copyObj(patchData)\n patchData = checkFillables(patchData, state._conf.sync.fillables, state._conf.sync.guard)\n patchData.updated_at = Firebase.firestore.FieldValue.serverTimestamp()\n carry[id] = patchData\n return carry\n }, {})\n },\n prepareForDeletion: (state, getters, rootState, rootGetters) =>\n (ids = []) => {\n return ids.reduce((carry, id) => {\n carry.push(id)\n return carry\n }, [])\n },\n prepareForInsert: (state, getters, rootState, rootGetters) =>\n (items = []) => {\n items = copyObj(items)\n return items.reduce((carry, item) => {\n item = checkFillables(item, state._conf.sync.fillables, state._conf.sync.guard)\n item.created_at = Firebase.firestore.FieldValue.serverTimestamp()\n item.created_by = rootGetters['user/id']\n carry.push(item)\n return carry\n }, [])\n }\n}\n\nexport default function (userGetters = {}) {\n return Object.assign({}, getters, userGetters)\n}\n","import merge from '../utils/deepmerge'\n// store\nimport defaultConfig from './defaultConfig'\nimport initialState from './state'\nimport iniMutations from './mutations'\nimport iniActions from './actions'\nimport iniGetters from './getters'\nimport errorCheck from './errorCheck'\n\n/**\n * A function that returns a vuex module object with seamless 2-way sync for firestore.\n *\n * @param {object} userConfig Takes a config object as per ...\n * @returns {object} the module ready to be included in your vuex store\n */\nexport default function (userConfig) {\n const conf = merge(defaultConfig, userConfig)\n if (!errorCheck(conf)) return\n const userState = conf.state\n const userMutations = conf.mutations\n const userActions = conf.actions\n const userGetters = conf.getters\n delete conf.state\n delete conf.mutations\n delete conf.actions\n delete conf.getters\n\n const docContainer = {}\n if (conf.statePropName) docContainer[conf.statePropName] = {}\n const state = merge(initialState, userState, docContainer, {_conf: conf})\n return {\n namespaced: true,\n state,\n mutations: iniMutations(userMutations, merge(initialState, userState)),\n actions: iniActions(userActions),\n getters: iniGetters(userGetters)\n }\n}\n","\nexport default function errorCheck (config) {\n let reqProps = ['firestorePath', 'moduleName']\n reqProps.forEach(prop => {\n if (!config[prop]) {\n console.error(`Missing ${prop} from your config!`)\n return false\n }\n })\n if (/(\\.|\\/)/.test(config.statePropName)) {\n console.error(`statePropName must only include letters from [a-z]`)\n return false\n }\n if (/\\./.test(config.moduleName)) {\n console.error(`moduleName must only include letters from [a-z] and forward slashes '/'`)\n return false\n }\n return true\n}\n","import Firebase from 'firebase/app'\nimport 'firebase/auth'\nimport { getKeysFromPath } from 'vuex-easy-access'\nimport { isArray } from 'is-what'\nimport iniModule from './module/index'\n\nexport default function createEasyFirestore (userConfig) {\n return store => {\n // Get an array of config files\n if (!isArray(userConfig)) userConfig = [userConfig]\n // Create a module for each config file\n userConfig.forEach(config => {\n const moduleName = getKeysFromPath(config.moduleName)\n store.registerModule(moduleName, iniModule(config))\n })\n store.setDoc = (path, payload) => {\n return store.dispatch(path + '/setDoc', payload)\n }\n store.insert = (path, payload) => {\n return store.dispatch(path + '/insert', payload)\n }\n store.patch = (path, payload) => {\n return store.dispatch(path + '/patch', payload)\n }\n store.patchBatch = (path, payload) => {\n return store.dispatch(path + '/patchBatch', payload)\n }\n store.delete = (path, payload) => {\n return store.dispatch(path + '/delete', payload)\n }\n }\n}\n"],"names":["nanoclone","require","default","toArray","object","result","i","length","push","types","el","type","merger","a","b","keys","Object","concat","forEach","key","Array","isArray","Math","max","merge","config","is","determineType","strategy","name","arguments","reduceRight","element","l","item","isObject","error","args","apply","updateStore","doc","store","id","source","change","mutations","state","_sync","syncStack","_conf","firestoreRefType","toLowerCase","_vm","$set","statePropName","newVal","undefined","$delete","copyObj","obj","newObj","prototype","toString","call","JSON","parse","stringify","len","hasOwnProperty","defaultValues","retrievePaths","path","reduce","carry","newPath","extra","assign","actions","getters","dispatch","commit","ids","console","log","syncStackItems","prepareForPatch","updates","syncStackIds","prepareForDeletion","deletions","docs","prepareForInsert","inserts","ms","startTime","signedIn","debounceTimer","Date","now","done","Promise","resolve","reject","interval","setInterval","refresh","then","collectionMode","dbRef","batch","Firebase","firestore","count","updatesOriginal","map","k","fields","updatesOK","slice","updatesLeft","docRef","flattenToPaths","update","deletionsAmount","deletionsOK","deletionsLeft","delete","insertsAmount","insertsOK","insertsLeft","newRef","set","res","catch","patching","whereFilters","orderBy","identifier","fetched","ref","where","paramsArr","fRequest","fRef","nextFetchRef","limit","fetch","docLimit","retrievedFetchRefs","includes","get","querySnapshot","fetchRef","lastVisible","next","startAfter","auth","currentUser","sync","handleDoc","storeUpdateFn","_doc","syncHookFn","serverChange","this","onSnapshot","metadata","hasPendingWrites","setDefaultValues","data","docChanges","insertHook","patchHook","_id","deleteHook","stopPatchingTimeout","setTimeout","fillables","guard","rootState","rootGetters","userId","uid","firestorePath","replace","collection","moduleName","getDeepRef","patchData","checkFillables","storeRef","updated_at","FieldValue","serverTimestamp","items","created_at","created_by","userConfig","conf","defaultConfig","prop","test","userState","userMutations","userActions","userGetters","docContainer","initialState","vuexEasyMutations","defaultMutations","iniMutations","iniActions","iniGetters","getKeysFromPath","registerModule","iniModule","setDoc","payload","insert","patch","patchBatch"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 4cf98908..8f0e8d53 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "vuex-easy-firestore", - "version": "1.0.0", + "version": "1.0.1", "description": "Easy coupling of firestore and a vuex module. 2-way sync with 0 boilerplate!", "main": "dist/index.cjs.js", "module": "dist/index.es.js", diff --git a/src/module/actions.js b/src/module/actions.js index ae811485..1ba82b4c 100644 --- a/src/module/actions.js +++ b/src/module/actions.js @@ -301,7 +301,7 @@ const actions = { return dispatch('serverUpdate', {change, id, doc: _doc}) } // get user set sync hook function - const syncHookFn = state._conf.sync[change + 'Hook'] + const syncHookFn = state._conf.serverChange[change + 'Hook'] if (syncHookFn) { syncHookFn(storeUpdateFn, doc, id, this, source, change) } else { @@ -358,8 +358,8 @@ const actions = { return dispatch('insertDoc', _doc) } // check for hooks - if (state._conf.insertHook) { - return state._conf.insertHook(storeUpdateFn, doc, this) + if (state._conf.sync.insertHook) { + return state._conf.sync.insertHook(storeUpdateFn, doc, this) } return storeUpdateFn(doc) }, @@ -372,8 +372,8 @@ const actions = { return dispatch('patchDoc', {id: _doc.id, doc: _doc}) } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this) + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this) } return storeUpdateFn(doc) }, @@ -388,8 +388,8 @@ const actions = { return dispatch('patchDoc', {ids, doc: _doc}) } // check for hooks - if (state._conf.patchHook) { - return state._conf.patchHook(storeUpdateFn, doc, this) + if (state._conf.sync.patchHook) { + return state._conf.sync.patchHook(storeUpdateFn, doc, this) } return storeUpdateFn(doc) }, @@ -400,8 +400,8 @@ const actions = { return dispatch('deleteDoc', _id) } // check for hooks - if (state._conf.deleteHook) { - return state._conf.deleteHook(storeUpdateFn, id, this) + if (state._conf.sync.deleteHook) { + return state._conf.sync.deleteHook(storeUpdateFn, id, this) } return storeUpdateFn(id) }, diff --git a/src/module/defaultConfig.js b/src/module/defaultConfig.js index 5c1cecda..c53c43ea 100644 --- a/src/module/defaultConfig.js +++ b/src/module/defaultConfig.js @@ -15,13 +15,12 @@ export default { orderBy: [], fillables: [], guard: [], + // HOOKS for local changes: + insertHook: function (updateStore, doc, store) { return updateStore(doc) }, + patchHook: function (updateStore, doc, store) { return updateStore(doc) }, + deleteHook: function (updateStore, id, store) { return updateStore(id) }, }, - // HOOKS: - insertHook: function (updateStore, doc, store) { return updateStore(doc) }, - patchHook: function (updateStore, doc, store) { return updateStore(doc) }, - deleteHook: function (updateStore, id, store) { return updateStore(id) }, - // When items on the server side are changed: serverChange: { defaultValues: {},