From 0e7592854186a27b530ed447bc03cb0e7d053234 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 14 Mar 2019 23:45:29 +0500 Subject: [PATCH 01/80] Fixed: Handling pinned tabs in GetPanelOf util --- src/libs/utils.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/libs/utils.js b/src/libs/utils.js index 86e77356d..63757279a 100644 --- a/src/libs/utils.js +++ b/src/libs/utils.js @@ -132,7 +132,7 @@ function GetPanelIndex(panels, tabId) { * Get panel by tab obj. */ function GetPanelOf(panels, tab) { - if (tab.pinned) return panels[1] + if (tab.pinned) return null for (let i = 1; i < panels.length; i++) { if (panels[i].cookieStoreId === tab.cookieStoreId) return panels[i] } From fdd386445a837713c18f39ab82ca7856b065c907 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 14 Mar 2019 23:46:43 +0500 Subject: [PATCH 02/80] Added: tabsMap array --- src/sidebar/actions/tabs.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index 007fc8dfd..e29482cee 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -34,12 +34,14 @@ export default { } // Set tabs initial props and update state + state.tabsMap = [] tabs.forEach(t => { t.isParent = false t.folded = false t.parentId = -1 t.invisible = false t.lvl = 0 + state.tabsMap[t.id] = t }) state.tabs = tabs From 2dcd8cabcd3a54b59d44afecb381eeff62c5b694 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 14 Mar 2019 23:47:54 +0500 Subject: [PATCH 03/80] Fixed: debounce recalcPanelScroll action --- src/sidebar/actions/panels.js | 12 ++++++++++++ src/sidebar/store.actions.js | 8 -------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/sidebar/actions/panels.js b/src/sidebar/actions/panels.js index 9f7cc173f..6e31ade52 100644 --- a/src/sidebar/actions/panels.js +++ b/src/sidebar/actions/panels.js @@ -3,6 +3,8 @@ import Utils from '../../libs/utils' import ReqHandler from '../proxy' import { DEFAULT_PANELS } from '../store.state' +let recalcPanelScrollTimeout + export default { /** * Load Contextual Identities and containers @@ -90,6 +92,16 @@ export default { return await browser.contextualIdentities.create(details) }, + /** + * Breadcast recalc panel's scroll event. + */ + recalcPanelScroll() { + if (recalcPanelScrollTimeout) clearTimeout(recalcPanelScrollTimeout) + recalcPanelScrollTimeout = setTimeout(() => { + EventBus.$emit('recalcPanelScroll') + }, 200) + }, + /** * Switch current active panel by index */ diff --git a/src/sidebar/store.actions.js b/src/sidebar/store.actions.js index 3b829a1fe..dc3e1117c 100644 --- a/src/sidebar/store.actions.js +++ b/src/sidebar/store.actions.js @@ -1,4 +1,3 @@ -import EventBus from './event-bus' import CtxMenu from './context-menu' import { Translate } from '../mixins/dict' import SavedStateActions from './actions/saved-state' @@ -59,13 +58,6 @@ export default { }) }, - /** - * Breadcast recalc panel's scroll event. - */ - recalcPanelScroll() { - setTimeout(() => EventBus.$emit('recalcPanelScroll'), 33) - }, - /** * Broadcast message to other parts of extension. */ From cc3d3f54ef738dfdb1b9002c90f3e6d2aaf260f6 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 14 Mar 2019 23:53:37 +0500 Subject: [PATCH 04/80] Perf optimizations --- src/sidebar/components/index.vue | 102 ++++++++++++++----------------- 1 file changed, 45 insertions(+), 57 deletions(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 9fd96e235..960f2081b 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -946,6 +946,7 @@ export default { } // Put new tab in tabs list + State.tabsMap[tab.id] = tab State.tabs.splice(tab.index, 0, tab) // Update state @@ -959,22 +960,13 @@ export default { */ onUpdatedTab(tabId, change, tab) { if (tab.windowId !== State.windowId) return - // console.log('[DEBUG] INDEX onUpdatedTab'); - let upIndex = State.tabs.findIndex(t => t.id === tabId) - if (upIndex === -1) return - - // Preserve tree levels and parent flags - tab.lvl = State.tabs[upIndex].lvl - tab.parentId = State.tabs[upIndex].parentId - tab.isParent = State.tabs[upIndex].isParent - tab.folded = State.tabs[upIndex].folded - tab.invisible = State.tabs[upIndex].invisible + if (!State.tabs[tab.index]) return + if (State.tabs[tab.index].id !== tabId) return + const localTab = State.tabs[tab.index] // Loaded if (change.hasOwnProperty('status')) { - const newStatus = change.status - const prevStatus = State.tabs[upIndex].status - if (newStatus === 'complete' && prevStatus === 'loading') { + if (change.status === 'complete' && localTab.status === 'loading') { EventBus.$emit('tabLoaded', tab.id) } } @@ -1007,10 +999,9 @@ export default { let inact = Date.now() - tab.lastAccessed if (change.hasOwnProperty('title') && !tab.active && inact > 5000) { // If prev url starts with 'http' and current url same as prev - const prevTabState = State.tabs[upIndex] - if (prevTabState.url.startsWith('http') && prevTabState.url === tab.url) { + if (localTab.url.startsWith('http') && localTab.url === tab.url) { // and if title doesn't looks like url - if (!URL_HOST_PATH_RE.test(prevTabState.title) && !URL_HOST_PATH_RE.test(tab.title)) { + if (!URL_HOST_PATH_RE.test(localTab.title) && !URL_HOST_PATH_RE.test(tab.title)) { // Mark tab as updated if (tab.pinned && State.pinnedTabsPosition !== 'panel') { this.$set(State.updatedTabs, tab.id, -1) @@ -1022,7 +1013,7 @@ export default { } } - State.tabs.splice(upIndex, 1, tab) + Object.assign(localTab, change) if (change.hasOwnProperty('url') || change.hasOwnProperty('pinned')) { Store.dispatch('saveSyncPanels') @@ -1034,25 +1025,23 @@ export default { */ onRemovedTab(tabId, info) { if (info.windowId !== State.windowId) return - // console.log('[DEBUG] INDEX onRemovedTab'); + if (!State.removingTabs) State.removingTabs = [] - State.removingTabs.splice(State.removingTabs.indexOf(tabId), 1) + else State.removingTabs.splice(State.removingTabs.indexOf(tabId), 1) + if (!State.removingTabs.length) { Store.commit('closeCtxMenu') Store.commit('resetSelection') } - let rmIndex = State.tabs.findIndex(t => t.id === tabId) - if (rmIndex === -1) return - - // Locked tabs - const panelIndex = Utils.GetPanelIndex(this.panels, tabId) - const panel = this.panels[panelIndex] - const tab = State.tabs[rmIndex] - if (panel && panel.lockedTabs && !tab.url.startsWith('about')) { - browser.tabs.create({ - url: tab.url, - cookieStoreId: tab.cookieStoreId, - }) + + // Try to get removed tab and his panel + if (!State.tabsMap[tabId]) return + const tab = State.tabsMap[tabId] + const panel = Utils.GetPanelOf(this.panels, tab) + + // Recreate locked tab + if (panel && panel.lockedTabs && tab.url.startsWith('http')) { + browser.tabs.create({ url: tab.url, cookieStoreId: tab.cookieStoreId }) } // Temporary store child tab info (for tree recovering) @@ -1060,39 +1049,34 @@ export default { if (!State.removedTabs) State.removedTabs = [] if (State.removedTabs.length > 123) State.removedTabs.splice(50, 50) if (tab.parentId >= 0) { - State.removedTabs.push({ - title: tab.title, - parentId: tab.parentId, - }) - } - } - - // Remove folded children - if (State.tabsTree && State.rmFoldedTabs && tab.folded) { - const toRemove = [] - for (let i = tab.index + 1; i < State.tabs.length; i++) { - const t = State.tabs[i] - if (t.lvl <= tab.lvl) break - if (!State.removingTabs.includes(t.id)) toRemove.push(t.id) + State.removedTabs.push({ title: tab.title, parentId: tab.parentId }) } - if (toRemove.length) Store.dispatch('removeTabs', toRemove) } // No-empty if (panel && panel.noEmpty) { - const panelTabs = panel.tabs - if (panelTabs && panelTabs.length === 1) { + if (panel.tabs && panel.tabs.length === 1) { browser.tabs.create({ cookieStoreId: panel.id }) } } - // Down level of children and make them visible + // Handle child tabs if (State.tabsTree && tab.isParent) { - for (let t of State.tabs) { - if (t.parentId === tab.id) { - t.parentId = tab.parentId - if (!State.removingTabs.includes(t.id)) t.invisible = false + const toRemove = [] + for (let i = tab.index + 1; i < State.tabs.length; i++) { + const t = State.tabs[i] + if (t.lvl <= tab.lvl) break + + // Remove folded tabs + if (tab.folded && State.rmFoldedTabs) { + if (!State.removingTabs.includes(t.id)) toRemove.push(t.id) } + + // Down level + if (t.parentId === tab.id) t.parentId = tab.parentId + + // Show invisible children + if (!State.removingTabs.includes(t.id)) t.invisible = false } } @@ -1115,10 +1099,11 @@ export default { } // Shift tabs after removed one. (NOT detected by vue) - for (let i = rmIndex + 1; i < State.tabs.length; i++) { + for (let i = tab.index + 1; i < State.tabs.length; i++) { State.tabs[i].index-- } - State.tabs.splice(rmIndex, 1) + State.tabsMap[tabId] = undefined + State.tabs.splice(tab.index, 1) if (panel && panel.lastActiveTab >= 0) panel.lastActiveTab = -1 @@ -1180,8 +1165,11 @@ export default { if (info.oldWindowId !== State.windowId) return Store.commit('closeCtxMenu') Store.commit('resetSelection') - let i = State.tabs.findIndex(t => t.id === id) - if (i === -1) return + + if (!State.tabsMap[id]) return + let i = State.tabsMap[id].index + + State.tabsMap[id] = undefined State.tabs.splice(i, 1) // Remove updated flag From dff0c74e01956af40301969984dc01669bcc592c Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 14 Mar 2019 23:55:05 +0500 Subject: [PATCH 05/80] temp devfix (vetur) --- src/sidebar/components/index.vue | 1340 +++++++++++++++--------------- 1 file changed, 670 insertions(+), 670 deletions(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 960f2081b..7740d7a34 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -97,355 +97,735 @@ - - - - From fc8a37368a704f2bc29a1ab6235c2948fc42717a Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Fri, 15 Mar 2019 00:17:52 +0500 Subject: [PATCH 06/80] Optimizations; Cleanup --- src/sidebar/components/index.vue | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 7740d7a34..dee6243b5 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -767,15 +767,6 @@ export default { this.recalcPanelBounds() - // // Do not handle mouse move event out of panel - // console.log('[DEBUG] hm', e.clientX, this.panelLeftOffset); - // if (e.clientX < this.panelLeftOffset) { - // this.selectionStart = false - // this.selection = false - // Store.commit('resetSelection') - // return - // } - const scroll = this.panelScrollEl ? this.panelScrollEl.scrollTop : 0 const startY = this.selectionStart.clientY - this.panelTopOffset + scroll const firstItem = this.itemSlots.find(s => s.start <= startY && s.end >= startY) @@ -1149,7 +1140,6 @@ export default { * contextualIdentities.onCreated */ onCreatedContainer({ contextualIdentity }) { - // console.log('[DEBUG] INDEX onCreatedContainer'); State.ctxs.push(contextualIdentity) State.containers.push({ ...contextualIdentity, @@ -1185,7 +1175,8 @@ export default { // Close tabs const orphanTabs = State.tabs.filter(t => t.cookieStoreId === id) - await browser.tabs.remove(orphanTabs.map(t => t.id)) + State.removingTabs = orphanTabs.map(t => t.id) + await browser.tabs.remove([...State.removingTabs]) // Remove container let ctxIndex = State.ctxs.findIndex(c => c.cookieStoreId === id) @@ -1206,13 +1197,14 @@ export default { * contextualIdentities.onUpdated */ onUpdatedContainer({ contextualIdentity }) { - // console.log('[DEBUG] INDEX onUpdatedContainer'); let id = contextualIdentity.cookieStoreId let ctxIndex = State.ctxs.findIndex(c => c.cookieStoreId === id) let ctrIndex = State.containers.findIndex(c => c.cookieStoreId === id) if (ctxIndex === -1 || ctrIndex === -1) return + State.ctxs.splice(ctxIndex, 1, contextualIdentity) State.containers.splice(ctrIndex, 1, { ...State.containers[ctrIndex], ...contextualIdentity }) + Store.dispatch('saveSyncPanels') Store.dispatch('saveContainers') }, @@ -1224,7 +1216,7 @@ export default { */ onCreatedTab(tab) { if (tab.windowId !== State.windowId) return - // console.log('[DEBUG] INDEX onCreatedTab', tab.title); + Store.commit('closeCtxMenu') Store.commit('resetSelection') @@ -1575,7 +1567,6 @@ export default { */ onActivatedTab(info) { if (info.windowId !== State.windowId) return - // console.log('[DEBUG] INDEX onActivatedTab'); // Reset selection Store.commit('resetSelection') From c8a9a3f31bd387ea724037e0d814a56823b83d8b Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Fri, 15 Mar 2019 11:12:26 +0500 Subject: [PATCH 07/80] Cleanup --- src/sidebar/components/index.vue | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index dee6243b5..7e7dc12f1 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -533,7 +533,7 @@ export default { * --- Computed --- */ computed: { - ...mapGetters(['isPrivate', 'defaultCtxId', 'defaultPanel', 'panels', 'activePanel']), + ...mapGetters(['defaultCtxId', 'defaultPanel', 'panels', 'activePanel']), /** * Background transform style for parallax fx @@ -570,13 +570,6 @@ export default { return State.panelIndex === -5 ? 'center' : 'right' }, - /** - * Count of visible nav buttons - */ - countOfVisibleBtns() { - return this.nav.filter(b => !b.hidden).length - }, - /** * Get list of navigational buttons */ @@ -631,14 +624,6 @@ export default { return out }, - /** - * Have any pinned tabs - */ - anyPinnedTabs() { - if (!State.tabs[0]) return false - return !!State.tabs[0].pinned - }, - /** * List of updated panels */ From eb92705f568a4ee93fa379aad7e98fd340679418 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Fri, 15 Mar 2019 23:09:48 +0500 Subject: [PATCH 08/80] Refactoring; Performance optimizations --- src/libs/utils.js | 17 +++ src/sidebar/actions/tabs.js | 192 +++++++++++++++++++++---------- src/sidebar/components/index.vue | 159 ++++++++----------------- src/sidebar/proxy.js | 9 +- 4 files changed, 197 insertions(+), 180 deletions(-) diff --git a/src/libs/utils.js b/src/libs/utils.js index 63757279a..45136e1fe 100644 --- a/src/libs/utils.js +++ b/src/libs/utils.js @@ -325,6 +325,22 @@ async function GetUrlFromDragEvent(event) { }) } +/** + * Find bookmark + */ +function FindBookmark(bookmarks, id) { + let target, n + const findWalk = nodes => { + for (n of nodes) { + if (n.id === id) return target = n + if (n.children) findWalk(n.children) + if (target) return + } + } + findWalk(bookmarks) + return target +} + export default { Uid, Asap, @@ -342,4 +358,5 @@ export default { ParseCSSNum, CommonSubStr, GetUrlFromDragEvent, + FindBookmark, } diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index e29482cee..dc9f42e7a 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -122,7 +122,6 @@ export default { * Remove tab. */ async removeTab({ state, getters }, tab) { - // console.log('[DEBUG] TABS ACTION removeTab'); let p = Utils.GetPanelOf(getters.panels, tab) if (!p || !p.tabs) return if (p.lockedTabs && tab.url.indexOf('about')) { @@ -150,7 +149,6 @@ export default { * Remove tabs */ async removeTabs({ state, getters }, tabIds) { - // console.log('[DEBUG] TABS ACTION removeTabs'); if (state.removingTabs && state.removingTabs.length) { state.removingTabs = [...state.removingTabs, ...tabIds] } else { @@ -158,38 +156,36 @@ export default { } const tabs = [] const toRemove = [] - let panelId = undefined - let firstIndex, lastIndex + let panel, firstIndex, lastIndex // Find tabs to remove for (let id of tabIds) { - const tab = state.tabs.find(t => t.id === id) + const tab = state.tabsMap[id] if (!tab) continue - const panel = getters.panels.find(p => p.id === tab.cookieStoreId) - if (!panel) { + + const p = getters.panels.find(p => p.cookieStoreId === tab.cookieStoreId) + if (!p) { toRemove.push(tab.id) tab.invisible = true continue } - if (panel.lockedTabs && tab.url.indexOf('about')) continue - if (panelId === undefined) panelId = tab.cookieStoreId - if (panelId && panelId !== tab.cookieStoreId) panelId = null + + if (p.lockedTabs && tab.url.indexOf('about')) continue + + if (panel && panel !== p) panel = null + else if (panel !== p) panel = p + if (firstIndex === undefined) firstIndex = tab.index else if (firstIndex > tab.index) firstIndex = tab.index + if (lastIndex === undefined) lastIndex = tab.index else if (lastIndex < tab.index) lastIndex = tab.index + tabs.push(tab) toRemove.push(tab.id) tab.invisible = true } - // Check if all tabs from the same panel - // and find that panel - let panel - if (panelId) { - panel = getters.panels.find(p => p.cookieStoreId === panelId) - } - // If there are no tabs on this panel // create new one (if that option accepted) if (panel && toRemove.length === panel.tabs.length && panel.noEmpty) { @@ -202,7 +198,7 @@ export default { if (panel && toRemove.length < panel.tabs.length) { const activeTab = tabs.find(t => t.active) - if (activeTab && activeTab.cookieStoreId === panelId) { + if (activeTab && activeTab.cookieStoreId === panel.cookieStoreId) { let toActivate = panel.tabs.find(t => t.index === firstIndex - 1) if (!toActivate) toActivate = panel.tabs.find(t => t.index === lastIndex + 1) if (toActivate) await browser.tabs.update(toActivate.id, { active: true }) @@ -222,10 +218,11 @@ export default { state.switchTabPause = null }, 50) + const panel = getters.panels[state.panelIndex] let tabs if (state.pinnedTabsPosition === 'panel') { - tabs = [] if (globaly) { + tabs = [] for (let p of getters.panels) { if (!p.cookieStoreId) continue for (let t of state.tabs) { @@ -233,12 +230,11 @@ export default { } } } else { - const p = getters.panels[state.panelIndex] - tabs = state.tabs.filter(t => t.cookieStoreId === p.cookieStoreId) + tabs = state.tabs.filter(t => t.cookieStoreId === panel.cookieStoreId) } } else { if (pinned) tabs = getters.pinnedTabs - else tabs = globaly ? state.tabs : getters.panels[state.panelIndex].tabs + else tabs = globaly ? state.tabs : panel.tabs } if (!tabs || !tabs.length) return @@ -267,7 +263,7 @@ export default { */ reloadTabs({ state }, tabIds = []) { for (let tabId of tabIds) { - const tab = state.tabs.find(t => t.id === tabId) + const tab = state.tabsMap[tabId] if (!tab) continue // if tab loading and haven't yet url if (tab.url === 'about:blank' && tab.status === 'loading') continue @@ -282,14 +278,98 @@ export default { browser.tabs.discard(tabIds) }, + /** + * Restore reopened tab's tree props + */ + restoreReopenedTreeTab({ state }, tabId) { + if (!state.removedTabs) return + const tab = state.tabsMap[tabId] + const lastRmTab = state.removedTabs[state.removedTabs.length - 1] + if (!tab) return + if (!lastRmTab) return + if (lastRmTab.title !== tab.title) return + + // Check if parent still exists + let parent + for (let i = tab.index; i--; ) { + if (state.tabs[i].id === lastRmTab.parentId) { + parent = state.tabs[i] + break + } + } + if (parent) { + tab.parentId = parent.id + tab.invisible = parent.folded + if (tab.invisible && state.hideFoldedTabs) browser.tabs.hide(tab.id) + if (state.tabsTreeLimit > 0 && parent.lvl >= state.tabsTreeLimit) { + tab.lvl = parent.lvl + } else { + tab.lvl = parent.lvl + 1 + } + } + + state.removedTabs.pop() + }, + + /** + * Set related with tabs tree values + * for new child tab. + */ + newTreeTab({ state, getters, dispatch }, tabId ) { + const tab = state.tabsMap[tabId] + if (!tab) return + + const panel = getters.panels.find(p => p.cookieStoreId === tab.cookieStoreId) + if (!panel) return + + let parent = state.tabsMap[tab.openerTabId] + if (!parent) parent = { lvl: 0 } + let parentOk = parent.cookieStoreId === tab.cookieStoreId + let lvlOk = !parent.lvl || !(parent.lvl >= state.tabsTreeLimit) + + if ((state.groupOnOpen || parent.isParent) && lvlOk && parentOk) { + // Child + tab.parentId = tab.openerTabId + for (let i = tab.index; i--; ) { + if (tab.parentId !== state.tabs[i].id) continue + if (state.tabs[i].lvl) tab.lvl = state.tabs[i].lvl + 1 + else tab.lvl = 1 + state.tabs[i].isParent = true + if (state.tabs[i].folded) { + tab.invisible = true + if (state.hideFoldedTabs) browser.tabs.hide(tab.id) + } + break + } + + // Auto fold sibling sub-trees + if (state.autoFoldTabs) { + for (let t of state.tabs) { + if (t.isParent && !t.folded && t.lvl === parent.lvl && t.id !== tab.openerTabId) { + dispatch('foldTabsBranch', t.id) + } + } + } + + } else { + // Sibling + for (let i = tab.index; i--; ) { + if (tab.openerTabId === state.tabs[i].id) { + tab.parentId = state.tabs[i].parentId + tab.lvl = state.tabs[i].lvl + break + } + } + } + }, + /** * Try to activate last active tab on the panel */ - activateLastActiveTabOf({ getters }, panelIndex) { - // console.log('[DEBUG] TABS ACION activateLastActiveTabOf'); + activateLastActiveTabOf({ state, getters }, panelIndex) { const p = getters.panels[panelIndex] if (!p || !p.tabs || !p.tabs.length) return - const tab = p.tabs.find(t => t.id === p.lastActiveTab) + const tab = state.tabsMap[p.lastActiveTab] if (tab) { browser.tabs.update(tab.id, { active: true }) } else { @@ -312,7 +392,7 @@ export default { }, repinTabs({ state }, tabIds) { for (let tabId of tabIds) { - let tab = state.tabs.find(t => t.id === tabId) + let tab = state.tabsMap[tabId] if (!tab) continue browser.tabs.update(tabId, { pinned: !tab.pinned }) } @@ -329,7 +409,7 @@ export default { }, remuteTabs({ state }, tabIds) { for (let tabId of tabIds) { - let tab = state.tabs.find(t => t.id === tabId) + let tab = state.tabsMap[tabId] if (!tab) continue browser.tabs.update(tabId, { muted: !tab.mutedInfo.muted }) } @@ -340,7 +420,7 @@ export default { */ duplicateTabs({ state }, tabIds) { for (let tabId of tabIds) { - let tab = state.tabs.find(t => t.id === tabId) + let tab = state.tabsMap[tabId] if (!tab) continue browser.tabs.duplicate(tabId) } @@ -351,7 +431,7 @@ export default { */ bookmarkTabs({ state }, tabIds) { for (let tabId of tabIds) { - let tab = state.tabs.find(t => t.id === tabId) + let tab = state.tabsMap[tabId] if (!tab) continue browser.bookmarks.create({ title: tab.title, url: tab.url }) } @@ -373,7 +453,7 @@ export default { } for (let tabId of tabIds) { - let tab = state.tabs.find(t => t.id === tabId) + let tab = state.tabsMap[tabId] if (!tab) continue EventBus.$emit('tabLoadingStart', tab.id) @@ -418,7 +498,7 @@ export default { */ async moveTabsToNewWin({ state }, { tabIds, incognito }) { const first = tabIds.shift() - const firstTab = state.tabs.find(t => t.id === first) + const firstTab = state.tabsMap[first] if (!firstTab) return const rest = [...tabIds] @@ -429,7 +509,7 @@ export default { const win = await browser.windows.create({ url: firstTab.url, incognito }) browser.tabs.remove(first) for (let tabId of rest) { - let tab = state.tabs.find(t => t.id === tabId) + let tab = state.tabsMap[tabId] if (!tab) continue browser.tabs.create({ windowId: win.id, url: tab.url }) browser.tabs.remove(tabId) @@ -450,7 +530,7 @@ export default { browser.tabs.move(ids, { windowId, index: -1 }) } else { for (let id of ids) { - let tab = state.tabs.find(t => t.id === id) + let tab = state.tabsMap[id] if (!tab) continue browser.tabs.create({ url: tab.url, windowId }) browser.tabs.remove(id) @@ -464,7 +544,7 @@ export default { async moveTabsToCtx({ state }, { tabIds, ctxId }) { const ids = [...tabIds] for (let tabId of ids) { - let tab = state.tabs.find(t => t.id === tabId) + let tab = state.tabsMap[tabId] if (!tab) return await browser.tabs.create({ @@ -488,7 +568,6 @@ export default { * (re)Hide inactive panels tabs */ async hideInactPanelsTabs({ state, getters }) { - // console.log('[DEBUG] TABS ACTION hideInactPanelsTabs'); const actPI = state.panelIndex < 0 ? state.lastPanelIndex : state.panelIndex const actP = getters.panels[actPI] if (!actP || !actP.tabs || actP.pinned) return @@ -506,24 +585,21 @@ export default { /** * Hide children of tab */ - async foldTabsBranch({ state, dispatch }, tabId) { - // console.log('[DEBUG] TABS ACTION foldTabsBranch'); + foldTabsBranch({ state, dispatch }, tabId) { const toHide = [] - for (let t of state.tabs) { - if (t.id === tabId) t.folded = true - if (t.parentId === tabId || toHide.includes(t.parentId)) { - if (t.active) { - await browser.tabs.update(tabId, { active: true }) - } - if (!t.invisible) { - toHide.push(t.id) - t.invisible = true - } + const tab = state.tabsMap[tabId] + if (!tab) return + tab.folded = true + for (let i = tab.index + 1; i < state.tabs.length; i++) { + const t = state.tabs[i] + if (t.lvl <= tab.lvl) break + if (t.active) browser.tabs.update(tabId, { active: true }) + if (!t.invisible) { + t.invisible = true + toHide.push(t.id) } } - await Utils.Sleep(120) - if (state.hideFoldedTabs && toHide.length && state.ffVer >= 61) { browser.tabs.hide(toHide) } @@ -533,11 +609,10 @@ export default { /** * Show children of tab */ - async expTabsBranch({ state, dispatch }, tabId) { - // console.log('[DEBUG] TABS ACTION expTabsBranch'); + expTabsBranch({ state, dispatch }, tabId) { const toShow = [] const preserve = [] - const tab = state.tabs.find(t => t.id === tabId) + const tab = state.tabsMap[tabId] if (!tab) return if (tab.invisible) dispatch('expTabsBranch', tab.parentId) for (let t of state.tabs) { @@ -554,8 +629,6 @@ export default { } } - await Utils.Sleep(120) - if (state.hideFoldedTabs && toShow.length && state.ffVer >= 61) { browser.tabs.show(toShow) } @@ -566,7 +639,7 @@ export default { * Toggle tabs branch visability (fold/expand) */ async toggleBranch({ state, dispatch }, tabId) { - const rootTab = state.tabs.find(t => t.id === tabId) + const rootTab = state.tabsMap[tabId] if (!rootTab) return if (rootTab.folded) dispatch('expTabsBranch', tabId) else dispatch('foldTabsBranch', tabId) @@ -579,10 +652,9 @@ export default { { state, getters, dispatch }, { event, dropIndex, dropParent, nodes, pin } = {} ) { - // console.log('[DEBUG] TABS ACTION dropToTabs', dropIndex, dropParent, pin); const currentPanel = getters.panels[state.panelIndex] const destCtx = currentPanel.cookieStoreId - const parent = state.tabs.find(t => t.id === dropParent) + const parent = state.tabsMap[dropParent] const toHide = [] const toShow = [] if (dropIndex === -1) dropIndex = currentPanel.endIndex + 1 @@ -607,7 +679,7 @@ export default { // Get dragged tabs const tabs = [] for (let n of nodes) { - let tab = state.tabs.find(t => t.id === n.id) + let tab = state.tabsMap[n.id] if (!tab) return tabs.push(tab) } @@ -761,7 +833,7 @@ export default { // Gather children let minLvlTab = { lvl: 999 } const toFlat = [...tabIds] - const ttf = tabIds.map(id => state.tabs.find(t => t.id === id)) + const ttf = tabIds.map(id => state.tabsMap[id]) for (let tab of state.tabs) { if (tab.hidden) continue if (toFlat.includes(tab.id) && tab.lvl < minLvlTab.lvl) minLvlTab = tab diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 7e7dc12f1..012f0afdb 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -38,7 +38,7 @@ @close="closeDashboard" @height="recalcDashboardHeight") - .nav-strip(@wheel="onNavWheel") + .nav-strip(@wheel.stop.prevent="onNavWheel") .panel-btn( v-for="(btn, i) in nav" :key="btn.cookieStoreId || btn.name" @@ -728,8 +728,6 @@ export default { * Navigation wheel event handler */ onNavWheel(e) { - e.stopPropagation() - e.preventDefault() if (e.deltaY > 0) return Store.dispatch('switchPanel', 1) if (e.deltaY < 0) return Store.dispatch('switchPanel', -1) }, @@ -1001,7 +999,6 @@ export default { * Mouse up event handler */ onMouseUp(e) { - // console.log('[DEBUG] INDEX onMouseUp'); if (e.button === 0) { Store.commit('closeCtxMenu') Store.commit('resetSelection') @@ -1017,7 +1014,6 @@ export default { */ onDragEnter(e) { if (e && e.relatedTarget) return - // console.log('[DEBUG] INDEX onDragEnter'); // Get drop slots if (!this.$refs.panels) return @@ -1045,6 +1041,9 @@ export default { } }, + /** + * Drag leave event handler + */ onDragLeave(e) { if (e && e.relatedTarget) return for (let n of State.dragNodes) { @@ -1108,7 +1107,7 @@ export default { if (this.navDragEnterTimeout) clearTimeout(this.navDragEnterTimeout) this.navDragEnterTimeout = setTimeout(() => { Store.dispatch('switchToPanel', i) - }, 200) + }, 250) }, /** @@ -1155,7 +1154,6 @@ export default { * contextualIdentities.onRemoved */ async onRemovedContainer({ contextualIdentity }) { - // console.log('[DEBUG] INDEX onRemovedContainer'); let id = contextualIdentity.cookieStoreId // Close tabs @@ -1205,8 +1203,7 @@ export default { Store.commit('closeCtxMenu') Store.commit('resetSelection') - // If new tab is out of panel, move it to the end of - // this panel + // If new tab is out of panel, move it to the end of this panel let panel = this.panels.find(p => p.cookieStoreId === tab.cookieStoreId) let endIndex = panel.tabs.length ? panel.endIndex + 1 : panel.endIndex if (tab.index > endIndex || tab.index < panel.startIndex) { @@ -1218,83 +1215,27 @@ export default { State.tabs[i].index++ } - // --- Update tree - // Set default tree props (for reactivity) + // Set default custom props (for reactivity) tab.isParent = false tab.folded = false tab.parentId = -1 tab.lvl = 0 tab.invisible = false - if (State.tabsTree) { - // Check if this tab is reopened - if (State.removedTabs && State.removedTabs.length > 0 && !tab.openerTabId) { - let lastRmTab = State.removedTabs[State.removedTabs.length - 1] - if (lastRmTab.title === tab.title) { - // Check if parent still exists - let parent - for (let i = tab.index; i--; ) { - if (State.tabs[i].id === lastRmTab.parentId) { - parent = State.tabs[i] - break - } - } - if (parent) { - tab.parentId = parent.id - tab.invisible = parent.folded - if (tab.invisible && State.hideFoldedTabs) browser.tabs.hide(tab.id) - if (State.tabsTreeLimit > 0 && parent.lvl >= State.tabsTreeLimit) { - tab.lvl = parent.lvl - } else { - tab.lvl = parent.lvl + 1 - } - } - - State.removedTabs.pop() - } - } - - // Child tab - if (tab.openerTabId !== undefined) { - let parent = panel.tabs.find(t => t.id === tab.openerTabId) - if (!parent) parent = { lvl: 0 } - let parentOk = parent.cookieStoreId === tab.cookieStoreId - let lvlOk = !parent.lvl || !(parent.lvl >= State.tabsTreeLimit) - - if ((State.groupOnOpen || parent.isParent) && lvlOk && parentOk) { - // Child - tab.parentId = tab.openerTabId - for (let i = tab.index; i--; ) { - if (tab.parentId !== State.tabs[i].id) continue - if (State.tabs[i].lvl) tab.lvl = State.tabs[i].lvl + 1 - else tab.lvl = 1 - State.tabs[i].isParent = true - if (State.tabs[i].folded) { - tab.invisible = true - if (State.hideFoldedTabs) browser.tabs.hide(tab.id) - } - break - } - // Auto fold sibling sub-trees - if (State.autoFoldTabs) { - for (let t of State.tabs) { - if (t.isParent && !t.folded && t.lvl === parent.lvl && t.id !== tab.openerTabId) { - Store.dispatch('foldTabsBranch', t.id) - } - } - } + // Put new tab in tabs list + State.tabsMap[tab.id] = tab + State.tabs.splice(tab.index, 0, tab) - } else { - // Sibling - for (let i = tab.index; i--; ) { - if (tab.openerTabId === State.tabs[i].id) { - tab.parentId = State.tabs[i].parentId - tab.lvl = State.tabs[i].lvl - break - } - } - } + // Update tree + if (State.tabsTree) { + if (tab.openerTabId === undefined) { + // Try to restore ?reopened tab + Store.dispatch('restoreReopenedTreeTab', tab.id) + } else { + Store.dispatch('newTreeTab', tab.id) } + + Store.dispatch('saveTabsTree', 500) } // Set last tab successor @@ -1302,14 +1243,8 @@ export default { Store.dispatch('updateTabsSuccessorsDebounced', { timeout: 200 }) } - // Put new tab in tabs list - State.tabsMap[tab.id] = tab - State.tabs.splice(tab.index, 0, tab) - - // Update state Store.dispatch('recalcPanelScroll') Store.dispatch('saveSyncPanels') - if (State.tabsTree) Store.dispatch('saveTabsTree', 500) }, /** @@ -1370,6 +1305,7 @@ export default { } } + // Update tab object Object.assign(localTab, change) if (change.hasOwnProperty('url') || change.hasOwnProperty('pinned')) { @@ -1484,7 +1420,6 @@ export default { */ onMovedTab(id, info) { if (info.windowId !== State.windowId) return - // console.log('[DEBUG] INDEX onMovedTab', id); Store.commit('closeCtxMenu') Store.commit('resetSelection') @@ -1605,6 +1540,9 @@ export default { EventBus.$emit('scrollToActiveTab', panelIndex, info.tabId) }, + /** + * Start panel loading + */ onPanelLoadingStart(i) { this.loading[i] = true this.loading = [...this.loading] @@ -1614,11 +1552,17 @@ export default { } }, + /** + * Stop panel loading + */ onPanelLoadingEnd(i) { this.loading[i] = false this.loading = [...this.loading] }, + /** + * Set panel state to 'ok' for 2s + */ onPanelLoadingOk(i) { this.loading[i] = 'ok' this.loading = [...this.loading] @@ -1628,6 +1572,9 @@ export default { }, 2000) }, + /** + * Set panel state to 'err' or 2s + */ onPanelLoadingErr(i) { this.loading[i] = 'err' this.loading = [...this.loading] @@ -1653,36 +1600,27 @@ export default { // Tabs or Bookmarks? const type = this.itemSlots[0].type const targetId = State.selected[0] + if (type === 'tab') { - const tab = State.tabs.find(t => t.id === targetId) + const tab = State.tabsMap[targetId] if (!tab) return if (tab.active) Store.commit('resetSelection') browser.tabs.update(targetId, { active: true }) } - if (type === 'bookmark') { - let target, n - const findWalk = nodes => { - if (target) return - for (n of nodes) { - if (n.id === targetId) return target = n - if (n.children) findWalk(n.children) - } - } - findWalk(State.bookmarks) + if (type === 'bookmark') { + const target = Utils.FindBookmark(State.bookmarks, targetId) if (!target) return + if (target.type === 'folder') { if (target.expanded) Store.dispatch('foldBookmark', target.id) else Store.dispatch('expandBookmark', target.id) } + if (target.type === 'bookmark') { if (State.openBookmarkNewTab) { let index = this.defaultPanel.endIndex + 1 - browser.tabs.create({ - index, - url: target.url, - active: true, - }) + browser.tabs.create({ index, url: target.url, active: true }) } else { browser.tabs.update({ url: target.url }) if (State.openBookmarkNewTab && !this.panels[0].lockedPanel) { @@ -1862,18 +1800,8 @@ export default { const targetId = State.selected[0] const targetSlot = this.itemSlots.find(s => s.id === targetId) let target - if (type === 'tab') target = State.tabs.find(t => t.id === targetId) - if (type === 'bookmark') { - let n - const findWalk = nodes => { - if (target) return - for (n of nodes) { - if (n.id === targetId) return target = n - if (n.children) findWalk(n.children) - } - } - findWalk(State.bookmarks) - } + if (type === 'tab') target = State.tabsMap[targetId] + if (type === 'bookmark') target = Utils.FindBookmark(State.bookmarks, targetId) if (!target) return const offset = this.panelTopOffset - this.panelScrollEl.scrollTop @@ -1908,6 +1836,9 @@ export default { if (State.panelIndex > i) return 'left' }, + /** + * Recalc css vars + */ recalcDynVars() { const compStyle = getComputedStyle(this.$el) const thRaw = compStyle.getPropertyValue('--tabs-height') @@ -1982,7 +1913,7 @@ export default { this.panelScrollEl = null }, - // --- Panel Menu --- + // --- Dashboard --- /** * Open panel menu by nav index. */ diff --git a/src/sidebar/proxy.js b/src/sidebar/proxy.js index 55f651c28..4f6f320dc 100644 --- a/src/sidebar/proxy.js +++ b/src/sidebar/proxy.js @@ -1,10 +1,7 @@ import State from './store.state' export default function reqHandler(info) { - for (let tab of State.tabs) { - if (tab.id === info.tabId) { - if (State.proxies[tab.cookieStoreId]) return State.proxies[tab.cookieStoreId] - break - } - } + let tab = State.tabsMap[info.tabId] + if (!tab) return + if (State.proxies[tab.cookieStoreId]) return State.proxies[tab.cookieStoreId] } \ No newline at end of file From 051940155a53d96cee19a4f9c11b5ebb60f9c133 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Fri, 15 Mar 2019 23:52:33 +0500 Subject: [PATCH 09/80] Fixed: Dragging tab with long-click action --- src/sidebar/components/panels/tabs.tab.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/sidebar/components/panels/tabs.tab.vue b/src/sidebar/components/panels/tabs.tab.vue index 82770efca..4089f3799 100644 --- a/src/sidebar/components/panels/tabs.tab.vue +++ b/src/sidebar/components/panels/tabs.tab.vue @@ -53,7 +53,6 @@ @@ -115,17 +139,11 @@ export default { color: var(--label-fg) margin: 0 0 8px padding: 3px 12px - cursor: pointer - opacity: .8 - transition: opacity var(--d-fast) - &:hover - opacity: 1 - &:active - opacity: .7 .datetime box(relative) - text(s: rem(14)) + text(s: rem(18), w: 600) + padding: 5px 0 margin-right: auto .panel-info @@ -137,9 +155,37 @@ export default { overflow: hidden text-overflow: ellipsis white-space: nowrap - padding: 0 0 0 8px + padding: 2px 0 2px 8px + cursor: pointer + opacity: .8 &.pinned color: var(--settings-snapshot-counter-pinned-fg) + &:hover + opacity: 1 + &:active + opacity: .7 + &[tree-lvl="0"] + margin-left: 0 + &[tree-lvl="1"] + margin-left: 10px + &[tree-lvl="2"] + margin-left: 20px + &[tree-lvl="3"] + margin-left: 30px + &[tree-lvl="4"] + margin-left: 40px + &[tree-lvl="5"] + margin-left: 50px + &[tree-lvl="6"] + margin-left: 60px + &[tree-lvl="7"] + margin-left: 70px + &[tree-lvl="8"] + margin-left: 80px + &[tree-lvl="9"] + margin-left: 90px + &[tree-lvl="10"] + margin-left: 100px .SnapshotsList .ctrls box(relative, flex) From a4757e9f15b7ae92ce4f9dd1f9f9ee63b38917e3 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Tue, 19 Mar 2019 23:25:53 +0500 Subject: [PATCH 35/80] Fixed: Do not show Flatten option for tabs with same level --- src/sidebar/store.actions.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/sidebar/store.actions.js b/src/sidebar/store.actions.js index 5854f5f3b..2454c459b 100644 --- a/src/sidebar/store.actions.js +++ b/src/sidebar/store.actions.js @@ -192,7 +192,12 @@ export default { if (state.tabsTree) { menu.add('tab.group', 'groupTabs', state.selected) - menu.add('tab.flatten', 'flattenTabs', state.selected) + const sameLvl = state.selected.every((id, i) => { + const tab = state.tabsMap[id] + const next = state.tabsMap[state.selected[i + 1]] + return !next || tab.lvl === next.lvl + }) + if (!sameLvl) menu.add('tab.flatten', 'flattenTabs', state.selected) } if (state.panelIndex === 1) { From 6168bb96d7ca1a91a61fe54a66195c63b854da1b Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Tue, 19 Mar 2019 23:37:38 +0500 Subject: [PATCH 36/80] Tests --- src/sidebar/actions/panels.test.js | 32 ------------------------------ src/sidebar/actions/tabs.test.js | 14 ++++++++----- 2 files changed, 9 insertions(+), 37 deletions(-) diff --git a/src/sidebar/actions/panels.test.js b/src/sidebar/actions/panels.test.js index f96862b3d..056097a7a 100644 --- a/src/sidebar/actions/panels.test.js +++ b/src/sidebar/actions/panels.test.js @@ -156,36 +156,4 @@ describe('Panels actions', () => { await PanelsActions.goToActiveTabPanel({ getters, dispatch }) expect(dispatch).toHaveBeenCalledWith('switchToPanel', 1) }) - - describe('updateProxiedTabs', () => { - test('Turn off proxy if there are no proxied panels', () => { - const dispatch = jest.fn() - const state = { containers: [{ proxy: false }] } - PanelsActions.updateProxiedTabs({ state, dispatch }) - expect(dispatch).toHaveBeenCalledWith('turnOffProxy') - }) - - test('Turn on proxy if there are some proxied panels', () => { - const dispatch = jest.fn() - const state = { containers: [{ proxy: true }] } - PanelsActions.updateProxiedTabs({ state, dispatch }) - expect(dispatch).toHaveBeenCalledWith('turnOnProxy') - }) - }) - - test('turnOnProxy', () => { - browser.proxy.onRequest.hasListener = jest.fn(() => false) - browser.proxy.onRequest.addListener = jest.fn() - PanelsActions.turnOnProxy() - expect(browser.proxy.onRequest.hasListener).toHaveBeenCalled() - expect(browser.proxy.onRequest.addListener).toHaveBeenCalled() - }) - - test('turnOffProxy', () => { - browser.proxy.onRequest.hasListener = jest.fn(() => true) - browser.proxy.onRequest.removeListener = jest.fn() - PanelsActions.turnOffProxy() - expect(browser.proxy.onRequest.hasListener).toHaveBeenCalled() - expect(browser.proxy.onRequest.removeListener).toHaveBeenCalled() - }) }) diff --git a/src/sidebar/actions/tabs.test.js b/src/sidebar/actions/tabs.test.js index 9b82dba7a..a3dd3fe93 100644 --- a/src/sidebar/actions/tabs.test.js +++ b/src/sidebar/actions/tabs.test.js @@ -515,10 +515,14 @@ describe('activateLastActiveTabOf', () => { describe('pinTabs', () => { test('pin tabs', async () => { + const state = { + tabs: [{ id: 1, pinned: false }, { id: 2, pinned: true }], + } + state.tabsMap = [ undefined, ...state.tabs ] browser.tabs.update = jest.fn() - await TabsActions.pinTabs({}, [1, 2, 3]) - expect(browser.tabs.update).toBeCalledTimes(3) - expect(browser.tabs.update).toHaveBeenLastCalledWith(3, { pinned: true }) + await TabsActions.pinTabs({ state }, [1, 2, 3]) + expect(browser.tabs.update).toBeCalledTimes(2) + expect(browser.tabs.update).toHaveBeenLastCalledWith(2, { pinned: true }) }) test('unpin tabs', async () => { @@ -574,11 +578,11 @@ describe('duplicateTabs', () => { const state = { tabs: [{ id: 1 }, { id: 2 }, { id: 3 }], } + browser.tabs.create = jest.fn() state.tabsMap = [ undefined, ...state.tabs ] browser.tabs.duplicate = jest.fn() await TabsActions.duplicateTabs({ state }, [2, 3, 4]) - expect(browser.tabs.duplicate).toBeCalledTimes(2) - expect(browser.tabs.duplicate).toHaveBeenLastCalledWith(3) + expect(browser.tabs.create).toBeCalledTimes(2) }) }) From 511975704d218031528fc73a220611efcf6da7bb Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 11:16:28 +0500 Subject: [PATCH 37/80] Fixed: Do not restore group tab without actual children --- src/sidebar/actions/tabs.js | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index f455bf2e3..84dcdbd9b 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -58,12 +58,21 @@ export default { if (ans.tabsTreeState) { const parents = [] let offset = 0 - for (let t of ans.tabsTreeState) { + for (let i = 0; i < ans.tabsTreeState.length; i++) { + // Saved nodes + const t = ans.tabsTreeState[i] + const nextT = ans.tabsTreeState[i + 1] + + // Current tab let tab = state.tabs[t.index - offset] if (!tab) break + const sameUrl = t.url === tab.url + const isGroup = t.url.startsWith(GROUP_URL) + const nextUrlOk = nextT ? nextT.url === tab.url : true + // Removed group - if (t.url !== tab.url && t.url.startsWith(GROUP_URL)) { + if (!sameUrl && isGroup && nextUrlOk) { const parent = parents[t.parentId] const rTab = await browser.tabs.create({ windowId: state.windowId, @@ -85,7 +94,7 @@ export default { } // Check if this is actual target tab - if (tab.url !== t.url && tab.status === 'complete') break + if (!sameUrl && tab.status === 'complete') break if (tab.cookieStoreId !== t.ctx) break tab.isParent = t.isParent From 54639278da0eb936932e83733877d511aa0b5704 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 11:41:06 +0500 Subject: [PATCH 38/80] Fixed: Wrong lastActiveTab on tab activating --- src/sidebar/components/index.vue | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 538179beb..a4e2c455e 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1519,7 +1519,8 @@ export default { // Find panel of activated tab if (tab.pinned && State.pinnedTabsPosition !== 'panel') return - let panelIndex = this.panels.findIndex(p => p.cookieStoreId === tab.cookieStoreId) + const panelIndex = this.panels.findIndex(p => p.cookieStoreId === tab.cookieStoreId) + const tabPanel = this.panels[panelIndex] if (panelIndex === -1) return // Switch to activated tab's panel @@ -1550,7 +1551,7 @@ export default { Store.dispatch('expTabsBranch', tab.parentId) } - if (currentPanel) currentPanel.lastActiveTab = info.tabId + tabPanel.lastActiveTab = info.tabId EventBus.$emit('scrollToActiveTab', panelIndex, info.tabId) // If activated tab is group - reinit it From c970600965d0b91949665d4124daf0f735464566 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 14:45:18 +0500 Subject: [PATCH 39/80] Fixed: Closing pinned tabs --- src/sidebar/actions/tabs.js | 13 +++++------- src/sidebar/components/panels/pinned-dock.vue | 20 ++++++++++++++++++- src/sidebar/components/panels/pinned-tab.vue | 2 +- 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index 84dcdbd9b..f8ff674c3 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -159,7 +159,7 @@ export default { } const tabs = [] const toRemove = [] - let panel, firstIndex, lastIndex, isPinned + let panel, firstIndex, lastIndex // Find tabs to remove for (let id of tabIds) { @@ -175,9 +175,6 @@ export default { if (p.lockedTabs && tab.url.indexOf('about')) continue - if (tab.pinned && isPinned !== null) isPinned = true - else isPinned = null - if (panel && panel !== p) panel = null else if (panel !== p) panel = p @@ -194,20 +191,20 @@ export default { // If there are no tabs on this panel // create new one (if that option accepted) - if (panel && !isPinned && toRemove.length === panel.tabs.length && panel.noEmpty) { + if (panel && toRemove.length === panel.tabs.length && panel.noEmpty) { await browser.tabs.create({ cookieStoreId: panel.cookieStoreId, active: true }) } // Try to activate prev or next tab on this panel // if there are some other tabs and if // all removed tabs from the same panel - if (panel && !isPinned && toRemove.length < panel.tabs.length) { + if (panel && toRemove.length < panel.tabs.length) { const activeTab = tabs.find(t => t.active) if (activeTab && activeTab.cookieStoreId === panel.cookieStoreId) { - let toActivate = state.tabs[firstIndex - 1] + let toActivate = state.tabs[firstIndex + 1] if (!toActivate || toActivate.cookieStoreId !== panel.cookieStoreId) { - toActivate = state.tabs[lastIndex + 1] + toActivate = state.tabs[lastIndex - 1] } if (toActivate) await browser.tabs.update(toActivate.id, { active: true }) } diff --git a/src/sidebar/components/panels/pinned-dock.vue b/src/sidebar/components/panels/pinned-dock.vue index 138f5e51f..d33cd23ee 100644 --- a/src/sidebar/components/panels/pinned-dock.vue +++ b/src/sidebar/components/panels/pinned-dock.vue @@ -5,9 +5,10 @@ @drop.stop.prevent="onDrop" @dragenter="onDragEnter" @dragleave="onDragLeave") - pinned-tab(v-for="t in pinnedTabs" + pinned-tab(v-for="(t, i) in pinnedTabs" :tab="t" :ctx="!ctx" + @remove="removeTab(i, $event)" @stop-selection="$emit('stop-selection')" @dragenter="onTabPointed") .to-the-end(v-if="pinnedTabs.length", @dragleave.stop="", @dragenter.stop="") @@ -15,6 +16,7 @@ diff --git a/src/sidebar/components/panels/pinned-tab.vue b/src/sidebar/components/panels/pinned-tab.vue index a6780aa48..c0f220ca0 100644 --- a/src/sidebar/components/panels/pinned-tab.vue +++ b/src/sidebar/components/panels/pinned-tab.vue @@ -345,7 +345,7 @@ export default { * Close tab */ close() { - Store.dispatch('removeTabs', [this.tab.id]) + this.$emit('remove', this.tab) }, loadingStart(id) { From 6e732e903154a329632f9c059912db38e5817f77 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 14:52:05 +0500 Subject: [PATCH 40/80] Fixed: Do not calc tree-props for tabs opened from pinned tab --- src/sidebar/actions/tabs.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index f8ff674c3..306d40e83 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -330,6 +330,7 @@ export default { let parent = state.tabsMap[tab.openerTabId] if (!parent) parent = { lvl: 0 } + if (parent.pinned) return if (parent.cookieStoreId !== tab.cookieStoreId) return let lvlOk = !parent.lvl || !(parent.lvl >= state.tabsTreeLimit) From cda763bc305a8de7a336141db5448f6f0481b132 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 17:19:07 +0500 Subject: [PATCH 41/80] Fixed: Opening new tab from folded --- src/sidebar/actions/tabs.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index 306d40e83..33f14eb33 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -352,7 +352,9 @@ export default { // Auto fold sibling sub-trees if (state.autoFoldTabs) { for (let t of state.tabs) { - if (t.isParent && !t.folded && t.lvl === parent.lvl && t.id !== tab.openerTabId) { + const sameLvl = t.lvl === parent.lvl + const notParent = t.id !== tab.openerTabId + if (t.isParent && !t.folded && sameLvl && notParent && !tab.invisible) { dispatch('foldTabsBranch', t.id) } } From ebb970800c9703454e110edc86aaf09e3bf587a5 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 19:27:14 +0500 Subject: [PATCH 42/80] Fixed: Removing multi-selected tabs --- src/sidebar/actions/tabs.js | 80 ++++++++++++++++---------------- src/sidebar/components/index.vue | 3 ++ 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index 33f14eb33..c338f1a15 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -152,61 +152,61 @@ export default { * Remove tabs */ async removeTabs({ state, getters }, tabIds) { - if (state.removingTabs && state.removingTabs.length) { - state.removingTabs = [...state.removingTabs, ...tabIds] - } else { - state.removingTabs = [...tabIds] - } - const tabs = [] - const toRemove = [] - let panel, firstIndex, lastIndex + let tabs = tabIds.map(id => state.tabsMap[id]) + const ctxId = tabs[0].cookieStoreId + const panel = getters.panels.find(p => p.cookieStoreId === ctxId) + if (!panel) return - // Find tabs to remove - for (let id of tabIds) { - const tab = state.tabsMap[id] - if (!tab) continue + tabs = tabs.filter(tab => { + if (!tab) return false + if (tab.cookieStoreId !== ctxId) return false + if (panel.lockedTabs && !tab.url.startsWith('about')) return false + tab.invisible = true + return true + }) - const p = getters.panels.find(p => p.cookieStoreId === tab.cookieStoreId) - if (!p) { - toRemove.push(tab.id) - tab.invisible = true - continue + // Remove folded tabs + if (state.rmFoldedTabs) { + for (let tab of tabs) { + if (tab.isParent && tab.folded) { + for (let i = tab.index + 1; i < state.tabs.length; i++) { + if (state.tabs[i].lvl <= tab.lvl) break + tabs.push(state.tabs[i]) + } + } } + } - if (p.lockedTabs && tab.url.indexOf('about')) continue - - if (panel && panel !== p) panel = null - else if (panel !== p) panel = p - - if (firstIndex === undefined) firstIndex = tab.index - else if (firstIndex > tab.index) firstIndex = tab.index - - if (lastIndex === undefined) lastIndex = tab.index - else if (lastIndex < tab.index) lastIndex = tab.index + // Sort by index + tabs = tabs.sort((a, b) => a.index - b.index) - tabs.push(tab) - toRemove.push(tab.id) - tab.invisible = true + // Set tabs to be removed + const toRemove = tabs.map(t => t.id) + if (state.removingTabs && state.removingTabs.length) { + state.removingTabs = [...state.removingTabs, ...toRemove] + } else { + state.removingTabs = [...toRemove] } // If there are no tabs on this panel // create new one (if that option accepted) - if (panel && toRemove.length === panel.tabs.length && panel.noEmpty) { - await browser.tabs.create({ cookieStoreId: panel.cookieStoreId, active: true }) + if (tabs.length === panel.tabs.length && panel.noEmpty) { + await browser.tabs.create({ cookieStoreId: ctxId, active: true }) } // Try to activate prev or next tab on this panel - // if there are some other tabs and if - // all removed tabs from the same panel - if (panel && toRemove.length < panel.tabs.length) { + if (tabs.length < panel.tabs.length) { const activeTab = tabs.find(t => t.active) if (activeTab && activeTab.cookieStoreId === panel.cookieStoreId) { - let toActivate = state.tabs[firstIndex + 1] - if (!toActivate || toActivate.cookieStoreId !== panel.cookieStoreId) { - toActivate = state.tabs[lastIndex - 1] - } - if (toActivate) await browser.tabs.update(toActivate.id, { active: true }) + const prevIndex = tabs[0].index - 1 + const nextIndex = tabs[tabs.length - 1].index + 1 + + let target + if (nextIndex <= panel.endIndex) target = state.tabs[nextIndex] + else if (prevIndex >= panel.startIndex) target = state.tabs[prevIndex] + + if (target) await browser.tabs.update(target.id, { active: true }) } } diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index a4e2c455e..73278b7b7 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1376,6 +1376,9 @@ export default { // Show invisible children if (!State.removingTabs.includes(t.id)) t.invisible = false } + + // Remove child tabs + if (State.rmFoldedTabs && toRemove.length) Store.dispatch('removeTabs', toRemove) } // Update last tab successor From faed235a8a45b526e3d5d0f5f40bc15458eee45e Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 20:05:11 +0500 Subject: [PATCH 43/80] Fixed: Set index for new tab created in no-empty panel --- src/sidebar/actions/tabs.js | 6 +++++- src/sidebar/components/index.vue | 6 +++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index c338f1a15..615683acf 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -191,7 +191,11 @@ export default { // If there are no tabs on this panel // create new one (if that option accepted) if (tabs.length === panel.tabs.length && panel.noEmpty) { - await browser.tabs.create({ cookieStoreId: ctxId, active: true }) + await browser.tabs.create({ + index: panel.startIndex, + cookieStoreId: ctxId, + active: true, + }) } // Try to activate prev or next tab on this panel diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 73278b7b7..649f2c900 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1354,7 +1354,11 @@ export default { // No-empty if (panel && panel.noEmpty) { if (panel.tabs && panel.tabs.length === 1) { - browser.tabs.create({ cookieStoreId: panel.id }) + browser.tabs.create({ + index: panel.startIndex, + cookieStoreId: panel.id, + active: true, + }) } } From 43a688de711b63550415d90c3a2d8dae39169fc7 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 21:05:09 +0500 Subject: [PATCH 44/80] Fixed: Use indexes for creating tabs --- src/sidebar/components/index.vue | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 649f2c900..61c1a428f 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1288,7 +1288,10 @@ export default { if (change.hasOwnProperty('pinned') && change.pinned) { let panel = this.panels.find(p => p.cookieStoreId === tab.cookieStoreId) if (panel.noEmpty && panel.tabs.length === 1) { - browser.tabs.create({ cookieStoreId: panel.cookieStoreId }) + browser.tabs.create({ + index: panel.startIndex, + cookieStoreId: panel.cookieStoreId, + }) } } @@ -1334,12 +1337,19 @@ export default { // Try to get removed tab and his panel if (!State.tabsMap[tabId]) return + let creatingNewTab const tab = State.tabsMap[tabId] const panel = Utils.GetPanelOf(this.panels, tab) // Recreate locked tab if (panel && panel.lockedTabs && tab.url.startsWith('http')) { - browser.tabs.create({ url: tab.url, cookieStoreId: tab.cookieStoreId }) + browser.tabs.create({ + index: tab.index, + url: tab.url, + openerTabId: tab.parentId > -1 ? tab.parentId : undefined, + cookieStoreId: tab.cookieStoreId, + }) + creatingNewTab = true } // Temporary store child tab info (for tree recovering) @@ -1352,8 +1362,8 @@ export default { } // No-empty - if (panel && panel.noEmpty) { - if (panel.tabs && panel.tabs.length === 1) { + if (panel && panel.noEmpty && panel.tabs && panel.tabs.length === 1) { + if (!creatingNewTab) { browser.tabs.create({ index: panel.startIndex, cookieStoreId: panel.id, From 1b4b882f20416b602d593d9189bc3d3b57afa97a Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 21:46:00 +0500 Subject: [PATCH 45/80] Fixed: Generalize no-empty option of panel dashboard --- src/locales/en.settings.js | 3 --- src/locales/ru.settings.js | 3 --- src/sidebar/actions/panels.js | 16 ++++++---------- src/sidebar/actions/panels.test.js | 11 ----------- .../components/dashboards/containered-tabs.vue | 13 ++++++++++++- .../components/dashboards/default-tabs.vue | 15 +++++++++++++-- src/sidebar/components/panels/settings.vue | 4 ---- src/sidebar/settings.js | 1 - 8 files changed, 31 insertions(+), 35 deletions(-) diff --git a/src/locales/en.settings.js b/src/locales/en.settings.js index e538eb2eb..4e552cad8 100644 --- a/src/locales/en.settings.js +++ b/src/locales/en.settings.js @@ -15,9 +15,6 @@ export default { 'settings.activate_last_tab_on_panel_switching': { message: 'Activate last active tab on panels switching', }, - 'settings.create_new_tab_on_empty_panel': { - message: 'Create new tab on switching to empty container', - }, 'settings.skip_empty_panels': { message: 'Skip empty panels on switching' }, 'settings.show_tab_rm_btn': { message: 'Show close button on tab hover' }, 'settings.no_empty_default': { message: 'Create new tab on emptying default panel' }, diff --git a/src/locales/ru.settings.js b/src/locales/ru.settings.js index e84f30254..b4a587e1b 100644 --- a/src/locales/ru.settings.js +++ b/src/locales/ru.settings.js @@ -15,9 +15,6 @@ export default { 'settings.activate_last_tab_on_panel_switching': { message: 'Активировать последний активный таб при переключении панелей', }, - 'settings.create_new_tab_on_empty_panel': { - message: 'Создавать новый таб при переходе к пустому контейнеру', - }, 'settings.skip_empty_panels': { message: 'Пропускать пустые контейнеры при переключении' }, 'settings.show_tab_rm_btn': { message: 'Показывать кнопку закрытия таба при наведении курсора' }, 'settings.no_empty_default': { message: 'Создавать новую вкладку при опустошении стандартной панели' }, diff --git a/src/sidebar/actions/panels.js b/src/sidebar/actions/panels.js index c264da523..c6af80ff5 100644 --- a/src/sidebar/actions/panels.js +++ b/src/sidebar/actions/panels.js @@ -115,11 +115,9 @@ export default { commit('resetSelection') commit('setPanel', index) if (state.dashboardOpened) EventBus.$emit('openDashboard', state.panelIndex) - if (state.createNewTabOnEmptyPanel) { - let panel = getters.panels[state.panelIndex] - if (panel.tabs && panel.tabs.length === 0) { - dispatch('createTab', panel.cookieStoreId) - } + const panel = getters.panels[state.panelIndex] + if (panel.noEmpty && panel.tabs && !panel.tabs.length) { + dispatch('createTab', panel.cookieStoreId) } if (state.activateLastTabOnPanelSwitching) { @@ -166,11 +164,9 @@ export default { } if (state.dashboardOpened) EventBus.$emit('openDashboard', state.panelIndex) - if (state.createNewTabOnEmptyPanel) { - let panel = getters.panels[state.panelIndex] - if (panel.tabs && panel.tabs.length === 0) { - dispatch('createTab', panel.cookieStoreId) - } + let panel = getters.panels[state.panelIndex] + if (panel.noEmpty && panel.tabs && !panel.tabs.length) { + dispatch('createTab', panel.cookieStoreId) } dispatch('recalcPanelScroll') diff --git a/src/sidebar/actions/panels.test.js b/src/sidebar/actions/panels.test.js index 056097a7a..4ee7ad2c4 100644 --- a/src/sidebar/actions/panels.test.js +++ b/src/sidebar/actions/panels.test.js @@ -40,17 +40,6 @@ describe('Panels actions', () => { expect(EventBus.$emit).toHaveBeenCalledWith('openDashboard', 123) }) - test('with createNewTabOnEmptyPanel setting', async () => { - const commit = jest.fn() - const dispatch = jest.fn() - const state = { createNewTabOnEmptyPanel: true, panelIndex: 1 } - const getters = { - panels: [{}, { cookieStoreId: 'a', tabs: [] }], - } - await PanelsActions.switchToPanel({ state, getters, commit, dispatch }, 1) - expect(dispatch).toHaveBeenCalledWith('createTab', 'a') - }) - test('with activateLastTabOnPanelSwitching setting', async () => { const commit = jest.fn() const dispatch = jest.fn() diff --git a/src/sidebar/components/dashboards/containered-tabs.vue b/src/sidebar/components/dashboards/containered-tabs.vue index 5ef8241b7..2fdc5dd1a 100644 --- a/src/sidebar/components/dashboards/containered-tabs.vue +++ b/src/sidebar/components/dashboards/containered-tabs.vue @@ -418,8 +418,19 @@ export default { Store.dispatch('saveContainers') }, - togglePanelNoEmpty() { + async togglePanelNoEmpty() { this.conf.noEmpty = !this.conf.noEmpty + if (this.conf.noEmpty) { + const panel = Store.getters.panels.find(p => p.cookieStoreId === this.id) + if (panel && panel.tabs && !panel.tabs.length) { + await browser.tabs.create({ + index: panel.startIndex, + cookieStoreId: panel.cookieStoreId, + active: true, + }) + this.$emit('height') + } + } Store.dispatch('saveContainers') }, diff --git a/src/sidebar/components/dashboards/default-tabs.vue b/src/sidebar/components/dashboards/default-tabs.vue index fc51f024b..a355b18b1 100644 --- a/src/sidebar/components/dashboards/default-tabs.vue +++ b/src/sidebar/components/dashboards/default-tabs.vue @@ -65,14 +65,25 @@ export default { }, toggleSync() { - // console.log('[DEBUG] DEFAULT TABS DASH toggleSync'); this.conf.sync = !this.conf.sync Store.dispatch('resyncPanels') Store.dispatch('saveContainers') }, - togglePanelNoEmpty() { + async togglePanelNoEmpty() { this.conf.noEmpty = !this.conf.noEmpty + if (this.conf.noEmpty) { + const defaultId = Store.getters.defaultCtxId + const panel = Store.getters.panels.find(p => p.cookieStoreId === defaultId) + if (panel && panel.tabs && !panel.tabs.length) { + await browser.tabs.create({ + index: panel.startIndex, + cookieStoreId: panel.cookieStoreId, + active: true, + }) + this.$emit('height') + } + } Store.dispatch('saveContainers') }, diff --git a/src/sidebar/components/panels/settings.vue b/src/sidebar/components/panels/settings.vue index 8af8aeaf6..d4ad23c80 100644 --- a/src/sidebar/components/panels/settings.vue +++ b/src/sidebar/components/panels/settings.vue @@ -20,10 +20,6 @@ label="settings.activate_last_tab_on_panel_switching" :value="$store.state.activateLastTabOnPanelSwitching" @input="setOpt('activateLastTabOnPanelSwitching', $event)") - toggle-field( - label="settings.create_new_tab_on_empty_panel" - :value="$store.state.createNewTabOnEmptyPanel" - @input="setOpt('createNewTabOnEmptyPanel', $event)") toggle-field( label="settings.skip_empty_panels" :value="$store.state.skipEmptyPanels" diff --git a/src/sidebar/settings.js b/src/sidebar/settings.js index 430c24ca8..f0e193850 100644 --- a/src/sidebar/settings.js +++ b/src/sidebar/settings.js @@ -20,7 +20,6 @@ export const DEFAULT_SETTINGS = { // Tabs activateLastTabOnPanelSwitching: true, - createNewTabOnEmptyPanel: false, skipEmptyPanels: false, showTabRmBtn: true, hideInact: false, From 9a23578f49a05b565d78aec48150b40b86867f39 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 21:49:19 +0500 Subject: [PATCH 46/80] Fixed: Default value of autoHideCtxMenu setting --- src/sidebar/settings.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/settings.js b/src/sidebar/settings.js index f0e193850..6c5cfc64d 100644 --- a/src/sidebar/settings.js +++ b/src/sidebar/settings.js @@ -16,7 +16,7 @@ export const SETTINGS_OPTIONS = { export const DEFAULT_SETTINGS = { // Global nativeScrollbars: false, - autoHideCtxMenu: 500, + autoHideCtxMenu: 'none', // Tabs activateLastTabOnPanelSwitching: true, From 4a29b33d0881b62a9aa90fd9042f23deb904e084 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 22:05:08 +0500 Subject: [PATCH 47/80] Fixed: Update height of dashboard with after creating first tab in panel --- src/sidebar/components/dashboards/containered-tabs.vue | 1 - src/sidebar/components/dashboards/default-tabs.vue | 1 - src/sidebar/components/index.vue | 5 +++++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/sidebar/components/dashboards/containered-tabs.vue b/src/sidebar/components/dashboards/containered-tabs.vue index 2fdc5dd1a..c1291207b 100644 --- a/src/sidebar/components/dashboards/containered-tabs.vue +++ b/src/sidebar/components/dashboards/containered-tabs.vue @@ -428,7 +428,6 @@ export default { cookieStoreId: panel.cookieStoreId, active: true, }) - this.$emit('height') } } Store.dispatch('saveContainers') diff --git a/src/sidebar/components/dashboards/default-tabs.vue b/src/sidebar/components/dashboards/default-tabs.vue index a355b18b1..45d0e02c3 100644 --- a/src/sidebar/components/dashboards/default-tabs.vue +++ b/src/sidebar/components/dashboards/default-tabs.vue @@ -81,7 +81,6 @@ export default { cookieStoreId: panel.cookieStoreId, active: true, }) - this.$emit('height') } } Store.dispatch('saveContainers') diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 61c1a428f..96c1b2fc6 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1248,6 +1248,11 @@ export default { Store.dispatch('updateTabsSuccessorsDebounced', { timeout: 200 }) } + // Update dashboard height (if it opened) + if (State.dashboardOpened && !panel.tabs.length) { + this.recalcDashboardHeight() + } + Store.dispatch('recalcPanelScroll') Store.dispatch('saveSyncPanels') }, From 9a38656418824cd058e57f1a71f4779d11dc69b2 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 22:28:40 +0500 Subject: [PATCH 48/80] Fixed: DragEnter/DragLeave native nodes to sidebar; Timeout for panel drag-activation --- src/sidebar/components/index.vue | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 96c1b2fc6..a06f7dacf 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1047,9 +1047,11 @@ export default { */ onDragLeave(e) { if (e && e.relatedTarget) return - for (let n of State.dragNodes) { - if (n.type === 'tab') EventBus.$emit('deselectTab', n.id) - else EventBus.$emit('deselectBookmark', n.id) + if (State.dragNodes) { + for (let n of State.dragNodes) { + if (n.type === 'tab') EventBus.$emit('deselectTab', n.id) + else EventBus.$emit('deselectBookmark', n.id) + } } this.resetDrag() }, @@ -1108,7 +1110,7 @@ export default { if (this.navDragEnterTimeout) clearTimeout(this.navDragEnterTimeout) this.navDragEnterTimeout = setTimeout(() => { Store.dispatch('switchToPanel', i) - }, 250) + }, 300) }, /** From 66e11f9ebaca472be35767ac16b70a551e4d5c3c Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 22:44:20 +0500 Subject: [PATCH 49/80] Fixed: Close dashboard on clicking on its nav-button --- src/sidebar/components/index.vue | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index a06f7dacf..c92205282 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1096,7 +1096,11 @@ export default { if (State.panelIndex !== i) { Store.dispatch('switchToPanel', i) } else if (this.panels[i].cookieStoreId) { - browser.tabs.create({ cookieStoreId: this.panels[i].cookieStoreId }) + if (State.dashboardOpened) { + this.closeDashboard() + } else { + browser.tabs.create({ cookieStoreId: this.panels[i].cookieStoreId }) + } } }, From 69aee7dd9f52cc2b19553f49d669d0ed0348a15d Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Wed, 20 Mar 2019 23:31:20 +0500 Subject: [PATCH 50/80] Tests --- src/sidebar/actions/panels.test.js | 45 ------------------------------ src/sidebar/actions/tabs.test.js | 27 ------------------ 2 files changed, 72 deletions(-) diff --git a/src/sidebar/actions/panels.test.js b/src/sidebar/actions/panels.test.js index 4ee7ad2c4..57fcbe110 100644 --- a/src/sidebar/actions/panels.test.js +++ b/src/sidebar/actions/panels.test.js @@ -1,7 +1,6 @@ jest.mock('../event-bus', () => { return { $emit: jest.fn() } }) -import EventBus from '../event-bus' import PanelsActions from './panels' describe('Panels actions', () => { @@ -15,50 +14,6 @@ describe('Panels actions', () => { }) }) - describe('switchToPanel', () => { - test('without any special settings', async () => { - const commit = jest.fn() - const dispatch = jest.fn() - const state = {} - const getters = {} - await PanelsActions.switchToPanel({ state, getters, commit, dispatch }, 2) - expect(commit).toHaveBeenCalledTimes(4) - expect(commit).toHaveBeenCalledWith('closeSettings') - expect(commit).toHaveBeenCalledWith('closeCtxMenu') - expect(commit).toHaveBeenCalledWith('resetSelection') - expect(commit).toHaveBeenCalledWith('setPanel', 2) - expect(dispatch).toHaveBeenCalledTimes(1) - expect(dispatch).toHaveBeenCalledWith('recalcPanelScroll') - }) - - test('with opened dashboard', async () => { - const commit = jest.fn() - const dispatch = jest.fn() - const state = { dashboardOpened: true, panelIndex: 123 } - const getters = {} - await PanelsActions.switchToPanel({ state, getters, commit, dispatch }, 2) - expect(EventBus.$emit).toHaveBeenCalledWith('openDashboard', 123) - }) - - test('with activateLastTabOnPanelSwitching setting', async () => { - const commit = jest.fn() - const dispatch = jest.fn() - const state = { activateLastTabOnPanelSwitching: true, panelIndex: 123 } - const getters = {} - await PanelsActions.switchToPanel({ state, getters, commit, dispatch }, 123) - expect(dispatch).toHaveBeenCalledWith('activateLastActiveTabOf', 123) - }) - - test('with hideInact setting', async () => { - const commit = jest.fn() - const dispatch = jest.fn() - const state = { hideInact: true, panelIndex: 12 } - const getters = {} - await PanelsActions.switchToPanel({ state, getters, commit, dispatch }, 123) - expect(dispatch).toHaveBeenCalledWith('hideInactPanelsTabs') - }) - }) - describe('switchPanel', () => { test('to next, without any special settings', async () => { const commit = jest.fn() diff --git a/src/sidebar/actions/tabs.test.js b/src/sidebar/actions/tabs.test.js index a3dd3fe93..af01a9f3d 100644 --- a/src/sidebar/actions/tabs.test.js +++ b/src/sidebar/actions/tabs.test.js @@ -275,33 +275,6 @@ describe('createTab', () => { }) describe('removeTabs', () => { - test('remove tabs (without panel)', async () => { - const state = { - tabs: [ - { - id: 1, - cookieStoreId: 'a', - url: 'abc', - }, - { - id: 2, - cookieStoreId: 'a', - url: '456', - }, - ], - } - state.tabsMap = [ undefined, ...state.tabs ] - const getters = { - panels: [], - } - browser.tabs.remove = jest.fn() - browser.tabs.create = jest.fn() - browser.tabs.update = jest.fn() - - await TabsActions.removeTabs({ state, getters }, [1, 2]) - expect(browser.tabs.remove).toBeCalledWith([1, 2]) - }) - test('remove tabs', async () => { const state = { tabs: [ From b319af43bbeaa262c14603892e9c2ab1589d5a9d Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 21 Mar 2019 13:18:45 +0500 Subject: [PATCH 51/80] Temporarily switched to firefox-beta --- .gitignore | 4 +++- build/profile-beta/__preserve-dir | 0 package.json | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) create mode 100644 build/profile-beta/__preserve-dir diff --git a/.gitignore b/.gitignore index 050b343e2..9afe5dc95 100644 --- a/.gitignore +++ b/.gitignore @@ -9,4 +9,6 @@ addon/permissions build/profile-ru/* !build/profile-ru/__preserve-dir build/profile-en/* -!build/profile-en/__preserve-dir \ No newline at end of file +!build/profile-en/__preserve-dir +build/profile-beta/* +!build/profile-beta/__preserve-dir \ No newline at end of file diff --git a/build/profile-beta/__preserve-dir b/build/profile-beta/__preserve-dir new file mode 100644 index 000000000..e69de29bb diff --git a/package.json b/package.json index 4460010e6..6db673825 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "dev.group": "parcel watch ./src/group/group.html -d ./addon/group/ --public-url ./ --no-autoinstall", "dev.perm.url": "parcel watch ./src/permissions/all-urls.html -d ./addon/permissions/ --public-url ./ --no-autoinstall", "dev.perm.hide": "parcel watch ./src/permissions/tab-hide.html -d ./addon/permissions/ --public-url ./ --no-autoinstall", - "dev.ext.en": "web-ext run --source-dir ./addon -f firefox-nightly --keep-profile-changes --firefox-profile ./build/profile-en", + "dev.ext.en": "web-ext run --source-dir ./addon -f firefox-beta --keep-profile-changes --firefox-profile ./build/profile-beta", "dev.ext.ru": "web-ext run --source-dir ./addon -f firefox --keep-profile-changes --firefox-profile ./build/profile-ru", "dev": "node ./build/debug.js en", "dev.ru": "node ./build/debug.js ru", From bd314bb13d4739ea4fbd66327b017eafcf2acc2a Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 21 Mar 2019 13:35:46 +0500 Subject: [PATCH 52/80] Fixed: Disable noEmpty option while removing container to prevent creating new tabs on it --- src/sidebar/components/index.vue | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index c92205282..d9f6b4a59 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1167,23 +1167,26 @@ export default { async onRemovedContainer({ contextualIdentity }) { let id = contextualIdentity.cookieStoreId + // Find container + let ctxIndex = State.ctxs.findIndex(c => c.cookieStoreId === id) + let ctrIndex = State.containers.findIndex(c => c.cookieStoreId === id) + if (ctxIndex === -1 || ctrIndex === -1) return + State.containers[ctrIndex].noEmpty = false + // Close tabs const orphanTabs = State.tabs.filter(t => t.cookieStoreId === id) State.removingTabs = orphanTabs.map(t => t.id) await browser.tabs.remove([...State.removingTabs]) // Remove container - let ctxIndex = State.ctxs.findIndex(c => c.cookieStoreId === id) - let ctrIndex = State.containers.findIndex(c => c.id === id) - if (ctxIndex === -1 || ctrIndex === -1) return State.ctxs.splice(ctxIndex, 1) State.containers.splice(ctrIndex, 1) - if (State.proxies[id]) delete State.proxies[id] // Switch to prev panel State.panelIndex = this.panels.length - 1 State.lastPanelIndex = State.panelIndex + Store.dispatch('updateReqHandler') Store.dispatch('saveContainers') }, From ebaccd7fc63b6cc83e5ad72c33aaf18aeca94e8a Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 21 Mar 2019 16:12:05 +0500 Subject: [PATCH 53/80] Fixed: Dashboard config saving --- src/sidebar/components/dashboards/containered-tabs.vue | 3 +++ src/sidebar/components/index.vue | 6 +++++- src/sidebar/store.mutations.js | 2 -- 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/sidebar/components/dashboards/containered-tabs.vue b/src/sidebar/components/dashboards/containered-tabs.vue index c1291207b..784c27a19 100644 --- a/src/sidebar/components/dashboards/containered-tabs.vue +++ b/src/sidebar/components/dashboards/containered-tabs.vue @@ -438,6 +438,7 @@ export default { const permitted = await browser.permissions.contains({ origins: [''] }) if (!permitted) { const permUrl = browser.runtime.getURL('permissions/all-urls.html') + this.$emit('close') this.switchProxy('direct') browser.tabs.create({ url: permUrl }) return @@ -466,6 +467,7 @@ export default { const permitted = await browser.permissions.contains({ origins: [''] }) if (!permitted) { const permUrl = browser.runtime.getURL('permissions/all-urls.html') + this.$emit('close') this.switchProxy('direct') browser.tabs.create({ url: permUrl }) return @@ -494,6 +496,7 @@ export default { if (type !== 'direct') { const permitted = await browser.permissions.contains({ origins: [''] }) if (!permitted) { + this.$emit('close') this.switchProxy('direct') browser.tabs.create({ url: browser.runtime.getURL('permissions/all-urls.html'), diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index d9f6b4a59..70076f39e 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1200,7 +1200,11 @@ export default { if (ctxIndex === -1 || ctrIndex === -1) return State.ctxs.splice(ctxIndex, 1, contextualIdentity) - State.containers.splice(ctrIndex, 1, { ...State.containers[ctrIndex], ...contextualIdentity }) + State.containers[ctrIndex].color = contextualIdentity.color + State.containers[ctrIndex].colorCode = contextualIdentity.colorCode + State.containers[ctrIndex].icon = contextualIdentity.icon + State.containers[ctrIndex].iconUrl = contextualIdentity.iconUrl + State.containers[ctrIndex].name = contextualIdentity.name Store.dispatch('saveSyncPanels') Store.dispatch('saveContainers') diff --git a/src/sidebar/store.mutations.js b/src/sidebar/store.mutations.js index 3d46b25a6..316dbc0e4 100644 --- a/src/sidebar/store.mutations.js +++ b/src/sidebar/store.mutations.js @@ -93,7 +93,6 @@ export default { */ resetSelection(state) { if (state.selected.length > 0) { - // console.log('[DEBUG] MUT resetSelection'); state.selected = [] EventBus.$emit('deselectTab') EventBus.$emit('deselectBookmark') @@ -107,7 +106,6 @@ export default { * Close context menu */ closeCtxMenu(state) { - // console.log('[DEBUG] MUT closeCtxMenu'); if (state.ctxMenu) { if (state.ctxMenu.off) state.ctxMenu.off() state.ctxMenu = null From 6d2191b82fa65991675d2d0a8a6768a3b8b1ddd2 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 21 Mar 2019 18:01:20 +0500 Subject: [PATCH 54/80] Fixed: Dashboard layout --- .../components/dashboards/bookmarks.vue | 2 ++ .../dashboards/containered-tabs.vue | 34 ++++++++++++------- .../components/dashboards/default-tabs.vue | 2 ++ src/sidebar/components/index.vue | 1 - src/styles/dashboard.styl | 31 ++++------------- 5 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/sidebar/components/dashboards/bookmarks.vue b/src/sidebar/components/dashboards/bookmarks.vue index 2e6317fd7..d7d023d09 100644 --- a/src/sidebar/components/dashboards/bookmarks.vue +++ b/src/sidebar/components/dashboards/bookmarks.vue @@ -9,6 +9,8 @@ :inline="true" @input="togglePanelLock") + .delimiter + .options .opt(@click="reloadBookmarks") {{t('bookmarks_dashboard.reload_bookmarks_tree')}} .opt(@click="collapseAll") {{t('bookmarks_dashboard.collapse_all_folders')}} diff --git a/src/sidebar/components/dashboards/containered-tabs.vue b/src/sidebar/components/dashboards/containered-tabs.vue index 784c27a19..5832d03ca 100644 --- a/src/sidebar/components/dashboards/containered-tabs.vue +++ b/src/sidebar/components/dashboards/containered-tabs.vue @@ -96,8 +96,8 @@ :opts="proxyOpts" @input="switchProxy") - .box - .field(v-if="id && proxied !== 'direct'") + .box(v-if="id && proxied !== 'direct'") + .field text-input.text( ref="proxyHost" :or="t('container_dashboard.proxy_host_placeholder')" @@ -107,7 +107,7 @@ @input="onProxyHostInput" @keydown="onFieldKeydown($event, 'proxyPort', 'name')") - .field(v-if="id && proxied !== 'direct'") + .field text-input.text( ref="proxyPort" :or="t('container_dashboard.proxy_port_placeholder')" @@ -117,7 +117,7 @@ @input="onProxyPortInput" @keydown="onFieldKeydown($event, 'proxyUsername', 'proxyHost')") - .field(v-if="id && proxied === 'socks'") + .field(v-if="proxied === 'socks'") text-input.text( ref="proxyUsername" valid="fine" @@ -127,7 +127,7 @@ @input="onProxyUsernameInput" @keydown="onFieldKeydown($event, 'proxyPassword', 'proxyPort')") - .field(v-if="id && proxied === 'socks' && proxyUsername") + .field(v-if="proxied === 'socks' && proxyUsername") text-input.text( ref="proxyPassword" valid="fine" @@ -145,11 +145,13 @@ :inline="true" @input="toggleProxyDns") - .options - .opt(v-if="haveTabs", @click="dedupTabs") {{t('tabs_dashboard.dedup_tabs')}} - .opt(v-if="haveTabs", @click="reloadAllTabs") {{t('tabs_dashboard.reload_all_tabs')}} - .opt(v-if="haveTabs", @click="closeAllTabs") {{t('tabs_dashboard.close_all_tabs')}} - .opt.-warn(v-if="id", @click="remove") {{t('tabs_dashboard.delete_container')}} + .delimiter(v-if="id") + + .options + .opt(v-if="tabsCount", @click="dedupTabs") {{t('tabs_dashboard.dedup_tabs')}} + .opt(v-if="tabsCount", @click="reloadAllTabs") {{t('tabs_dashboard.reload_all_tabs')}} + .opt(v-if="tabsCount", @click="closeAllTabs") {{t('tabs_dashboard.close_all_tabs')}} + .opt.-warn(v-if="id", @click="remove") {{t('tabs_dashboard.delete_container')}} @@ -230,9 +232,10 @@ export default { else return this.colorOpts[0].colorCode }, - haveTabs() { - if (!this.conf.tabs || !this.id) return false - return this.conf.tabs.length > 0 + tabsCount() { + if (!this.id) return 0 + if (!this.panels[this.index] || !this.panels[this.index].tabs) return 0 + return this.panels[this.index].tabs.length }, proxied() { @@ -450,6 +453,7 @@ export default { Store.dispatch('updateReqHandler') await this.$nextTick() this.$emit('height') + if (this.$refs.scrollBox) this.$refs.scrollBox.recalcScroll() if (this.$refs.includeHostsInput) this.$refs.includeHostsInput.focus() }, @@ -479,6 +483,7 @@ export default { Store.dispatch('updateReqHandler') await this.$nextTick() this.$emit('height') + if (this.$refs.scrollBox) this.$refs.scrollBox.recalcScroll() if (this.$refs.excludeHostsInput) this.$refs.excludeHostsInput.focus() }, @@ -522,7 +527,10 @@ export default { Store.dispatch('saveContainers') Store.dispatch('updateReqHandler') + + await this.$nextTick() this.$emit('height') + if (this.$refs.scrollBox) this.$refs.scrollBox.recalcScroll() }, onProxyHostInput(value) { diff --git a/src/sidebar/components/dashboards/default-tabs.vue b/src/sidebar/components/dashboards/default-tabs.vue index 45d0e02c3..29529e722 100644 --- a/src/sidebar/components/dashboards/default-tabs.vue +++ b/src/sidebar/components/dashboards/default-tabs.vue @@ -23,6 +23,8 @@ :inline="true" @input="togglePanelNoEmpty") + .delimiter + .options .opt(v-if="haveTabs", @click="dedupTabs") {{t('tabs_dashboard.dedup_tabs')}} .opt(v-if="haveTabs", @click="reloadAllTabs") {{t('tabs_dashboard.reload_all_tabs')}} diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 70076f39e..ac6fc91e4 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1999,7 +1999,6 @@ export default { Store.commit('resetSelection') State.dashboardOpened = true State.panelIndex = i - if (i >= 0) State.activePanel = State.panelIndex if (i === -1) this.dashboard = { dashboard: 'TabsDashboard', new: true } else if (i >= 0) this.dashboard = this.nav[i] diff --git a/src/styles/dashboard.styl b/src/styles/dashboard.styl index e913fce4a..2585214c7 100644 --- a/src/styles/dashboard.styl +++ b/src/styles/dashboard.styl @@ -11,37 +11,18 @@ margin: 16px 12px 12px padding: 0 -// .Menu .field -// box(relative) -// margin: 0 16px -// cursor: pointer -// &[opt-true] -// .input > .opt -// color: var(--active-fg) -// .input > .opt.-true -// color: var(--true-fg) -// .input > .opt.-false -// color: var(--inactive-fg) - -// .Menu .input > .opt -// box(relative) -// text(s: rem(14)) -// margin: 0 7px 0 0 -// color: var(--inactive-fg) -// transition: color var(--d-fast) -// &.-false -// color: var(--false-fg) -// &[opt-true] -// color: var(--active-fg) -// &[opt-none] -// color: var(--false-fg) +.delimiter + box(relative) + size(128px, 1px) + margin: 8px auto + opacity: .5 + background-image: linear-gradient(90deg, #00000000, var(--inactive-fg), var(--inactive-fg), #00000000) .options box(relative, flex) flex-wrap: wrap flex-direction: column justify-content: flex-start - margin: 8px 0 0 .options > .opt box(relative) From e1fcf9bd1669884d8f7478d9e5b17610cb3342ae Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 21 Mar 2019 19:46:14 +0500 Subject: [PATCH 55/80] Fixed: Check tab before update it's index --- src/sidebar/components/index.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index ac6fc91e4..50a6810fb 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1484,7 +1484,7 @@ export default { const minIndex = Math.min(info.fromIndex, info.toIndex) const maxIndex = Math.max(info.fromIndex, info.toIndex) for (let i = minIndex; i <= maxIndex; i++) { - State.tabs[i].index = i + if (State.tabs[i]) State.tabs[i].index = i } // Update last tab successor From 701bcdfacec6f3834690b9b507e842d9a0b05177 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 21 Mar 2019 21:05:36 +0500 Subject: [PATCH 56/80] Fixed: Handle keyboard command only in focused window --- src/sidebar/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/index.js b/src/sidebar/index.js index 158100600..54231c884 100644 --- a/src/sidebar/index.js +++ b/src/sidebar/index.js @@ -117,7 +117,7 @@ export default new Vue({ * Set currently focused window */ onFocusWindow(id) { - this.windowFocused = id === State.windowId + State.windowFocused = id === State.windowId }, /** From fcef3428020dc947019c74381ab126919233220c Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Thu, 21 Mar 2019 23:39:59 +0500 Subject: [PATCH 57/80] Fixed: Save containers changes only for focused window --- src/sidebar/actions/panels.js | 1 + src/sidebar/actions/sync.js | 2 -- src/sidebar/components/index.vue | 6 ++++++ src/sidebar/index.js | 2 ++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/sidebar/actions/panels.js b/src/sidebar/actions/panels.js index c6af80ff5..505605c77 100644 --- a/src/sidebar/actions/panels.js +++ b/src/sidebar/actions/panels.js @@ -83,6 +83,7 @@ export default { * Save containers */ async saveContainers({ state }) { + if (!state.windowFocused) return const cleaned = JSON.parse(JSON.stringify(state.containers)) await browser.storage.local.set({ containers: cleaned }) }, diff --git a/src/sidebar/actions/sync.js b/src/sidebar/actions/sync.js index 444f65b52..bcc18a7b8 100644 --- a/src/sidebar/actions/sync.js +++ b/src/sidebar/actions/sync.js @@ -35,7 +35,6 @@ export default { if (state.savePanelsTimeout) clearTimeout(state.savePanelsTimeout) state.savePanelsTimeout = setTimeout(() => { - // console.log('[DEBUG] SYNC ACTION saveSyncPanels'); const syncPanels = [] let syncPinnedTabs = [] if (state.pinnedTabsSync) { @@ -76,7 +75,6 @@ export default { * Load sync panels state. */ async loadSyncPanels({ state, dispatch }) { - // console.log('[DEBUG] SYNC ACTION loadSyncPanels'); let ans = await browser.storage.sync.get() Object.keys(ans).filter(id => id !== state.localID) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 50a6810fb..2e469fd28 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1131,6 +1131,8 @@ export default { * contextualIdentities.onCreated */ onCreatedContainer({ contextualIdentity }) { + if (!State.windowFocused) return + State.ctxs.push(contextualIdentity) State.containers.push({ ...contextualIdentity, @@ -1165,6 +1167,8 @@ export default { * contextualIdentities.onRemoved */ async onRemovedContainer({ contextualIdentity }) { + if (!State.windowFocused) return + let id = contextualIdentity.cookieStoreId // Find container @@ -1194,6 +1198,8 @@ export default { * contextualIdentities.onUpdated */ onUpdatedContainer({ contextualIdentity }) { + if (!State.windowFocused) return + let id = contextualIdentity.cookieStoreId let ctxIndex = State.ctxs.findIndex(c => c.cookieStoreId === id) let ctrIndex = State.containers.findIndex(c => c.cookieStoreId === id) diff --git a/src/sidebar/index.js b/src/sidebar/index.js index 54231c884..696bd9ad8 100644 --- a/src/sidebar/index.js +++ b/src/sidebar/index.js @@ -133,6 +133,8 @@ export default new Vue({ * Handle changes of all storages (update current state) */ onChangeStorage(changes, type) { + if (type === 'local' && State.windowFocused) return + if (changes.settings) Store.dispatch('loadSettings') if (changes.styles) Store.dispatch('applyStyles', changes.styles.newValue) if (type === 'sync') { From fc5dba826a79b0b3c82a30b8fa78c85c0e829581 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Fri, 22 Mar 2019 17:43:17 +0500 Subject: [PATCH 58/80] Fixed: Storing data with multi-window setup --- src/sidebar/actions/bookmarks.js | 14 ++-- src/sidebar/actions/bookmarks.test.js | 4 +- src/sidebar/actions/favicons.js | 24 ++++--- src/sidebar/actions/panels.js | 71 ++++++++++++++++++- src/sidebar/actions/saved-state.js | 42 +++++------ src/sidebar/actions/settings.js | 15 +++- src/sidebar/actions/styles.js | 2 + src/sidebar/actions/sync.js | 2 +- .../dashboards/containered-tabs.vue | 14 ++-- src/sidebar/components/panels/bookmarks.vue | 4 +- src/sidebar/components/panels/settings.vue | 1 - src/sidebar/index.js | 13 ++-- 12 files changed, 144 insertions(+), 62 deletions(-) diff --git a/src/sidebar/actions/bookmarks.js b/src/sidebar/actions/bookmarks.js index 65d960682..eb8a43679 100644 --- a/src/sidebar/actions/bookmarks.js +++ b/src/sidebar/actions/bookmarks.js @@ -49,7 +49,9 @@ export default { /** * Save tree state */ - async saveTreeState({ state }) { + async saveBookmarksTree({ state }) { + if (!state.windowFocused) return + let expandedBookmarks = [] let path = [] const walker = nodes => { @@ -68,9 +70,7 @@ export default { await utils.Sleep(128) walker(state.bookmarks) - await browser.storage.local.set({ - expandedBookmarks, - }) + await browser.storage.local.set({ expandedBookmarks }) }, /** @@ -102,7 +102,7 @@ export default { /** * Expand bookmark folder */ - expandBookmark({ state }, nodeId) { + expandBookmark({ state, dispatch }, nodeId) { let done = false let isEmpty = false const expandPath = [] @@ -145,12 +145,13 @@ export default { /* eslint-disable-next-line */ state.bookmarks = state.bookmarks + dispatch('saveBookmarksTree') }, /** * Fold bookmark folder */ - foldBookmark({ state }, nodeId) { + foldBookmark({ state, dispatch }, nodeId) { let done = false const walker = nodes => { for (let n of nodes) { @@ -167,6 +168,7 @@ export default { /* eslint-disable-next-line */ state.bookmarks = state.bookmarks + dispatch('saveBookmarksTree') }, /** diff --git a/src/sidebar/actions/bookmarks.test.js b/src/sidebar/actions/bookmarks.test.js index 9ab76c549..ea4fb8413 100644 --- a/src/sidebar/actions/bookmarks.test.js +++ b/src/sidebar/actions/bookmarks.test.js @@ -36,7 +36,7 @@ describe('Bookmarks actions', () => { }) /** - * saveTreeState + * saveBookmarksTree */ test('Saving bookmarks tree state', async () => { // Prepare env @@ -50,7 +50,7 @@ describe('Bookmarks actions', () => { } // Checks - await BookmarksActions.saveTreeState({ state }) + await BookmarksActions.saveBookmarksTree({ state }) expect(expandedBookmarks.length).toBe(0) }) diff --git a/src/sidebar/actions/favicons.js b/src/sidebar/actions/favicons.js index 145e0816d..38b879411 100644 --- a/src/sidebar/actions/favicons.js +++ b/src/sidebar/actions/favicons.js @@ -1,5 +1,7 @@ import Vue from 'vue' +let saveFaviconsTimeout + export default { /** * Load cached favicons @@ -14,7 +16,7 @@ export default { * Store favicon to global state and * save to localstorage */ - async setFavicon({ state }, { hostname, icon }) { + setFavicon({ state, dispatch }, { hostname, icon }) { if (!hostname) return Vue.set(state.favicons, hostname, icon) @@ -24,12 +26,17 @@ export default { // Do not cache favicon in private mode if (state.private) return - let favs = {...state.favicons} - try { - await browser.storage.local.set({ favicons: favs }) - } catch (err) { - // ... - } + dispatch('saveFaviconsDebounced') + }, + + /** + * Save favicons to store + */ + async saveFaviconsDebounced({ state }) { + if (saveFaviconsTimeout) clearTimeout(saveFaviconsTimeout) + saveFaviconsTimeout = setTimeout(() => { + browser.storage.local.set({ favicons: {...state.favicons} }) + }, 500) }, /** @@ -77,7 +84,8 @@ export default { /** * Try to remove unused favicons. */ - async tryClearFaviCache({ dispatch }, time) { + async tryClearFaviCache({ state, dispatch }, time) { + if (!state.windowFocused) return const now = ~~(Date.now() / 1000) let ans = await browser.storage.local.get('favAutoCleanTime') diff --git a/src/sidebar/actions/panels.js b/src/sidebar/actions/panels.js index 505605c77..c51f2abf1 100644 --- a/src/sidebar/actions/panels.js +++ b/src/sidebar/actions/panels.js @@ -3,7 +3,7 @@ import Utils from '../../libs/utils' import ReqHandler from '../proxy' import { DEFAULT_PANELS } from '../store.state' -let recalcPanelScrollTimeout, updateReqHandlerTimeout +let recalcPanelScrollTimeout, updateReqHandlerTimeout, saveContainersTimeout export default { /** @@ -71,7 +71,7 @@ export default { const rIndex = containers.findIndex(c => c.id === id) if (rIndex !== -1) containers.splice(rIndex, 1) } - + state.ctxs = ctxs state.containers = containers @@ -79,14 +79,77 @@ export default { dispatch('updateReqHandler') }, + /** + * Update containers data + */ + async updateContainers({ state }, containers) { + if (!containers) return + + for (let localCtr of state.containers) { + const newCtr = containers.find(nc => nc.id === localCtr.id) + if (!newCtr) continue + + localCtr.colorCode = newCtr.colorCode + localCtr.color = newCtr.color + localCtr.icon = newCtr.icon + localCtr.iconUrl = newCtr.iconUrl + localCtr.name = newCtr.name + + localCtr.lockedTabs = newCtr.lockedTabs + localCtr.lockedPanel = newCtr.lockedPanel + localCtr.proxy = newCtr.proxy + localCtr.proxified = newCtr.proxified + localCtr.sync = newCtr.sync + localCtr.noEmpty = newCtr.noEmpty + localCtr.includeHostsActive = newCtr.includeHostsActive + localCtr.includeHosts = newCtr.includeHosts + localCtr.excludeHostsActive = newCtr.excludeHostsActive + localCtr.excludeHosts = newCtr.excludeHosts + localCtr.lastActiveTab = newCtr.lastActiveTab + } + }, + /** * Save containers */ async saveContainers({ state }) { if (!state.windowFocused) return - const cleaned = JSON.parse(JSON.stringify(state.containers)) + const output = [] + for (let ctr of state.containers) { + output.push({ + cookieStoreId: ctr.cookieStoreId, + colorCode: ctr.colorCode, + color: ctr.color, + icon: ctr.icon, + iconUrl: ctr.iconUrl, + name: ctr.name, + + type: ctr.type, + id: ctr.id, + dashboard: ctr.dashboard, + panel: ctr.panel, + lockedTabs: ctr.lockedTabs, + lockedPanel: ctr.lockedPanel, + proxy: ctr.proxy, + proxified: ctr.proxified, + sync: ctr.sync, + noEmpty: ctr.noEmpty, + includeHostsActive: ctr.includeHostsActive, + includeHosts: ctr.includeHosts, + excludeHostsActive: ctr.excludeHostsActive, + excludeHosts: ctr.excludeHosts, + lastActiveTab: ctr.lastActiveTab, + private: ctr.private, + bookmarks: ctr.bookmarks, + }) + } + const cleaned = JSON.parse(JSON.stringify(output)) await browser.storage.local.set({ containers: cleaned }) }, + saveContainersDebounced({ dispatch }) { + if (saveContainersTimeout) clearTimeout(saveContainersTimeout) + saveContainersTimeout = setTimeout(() => dispatch('saveContainers'), 500) + }, /** * Create new conte... @@ -128,6 +191,7 @@ export default { dispatch('recalcPanelScroll') if (state.hideInact) dispatch('hideInactPanelsTabs') EventBus.$emit('panelSwitched') + dispatch('savePanelIndex') }, /** @@ -173,6 +237,7 @@ export default { dispatch('recalcPanelScroll') if (state.hideInact) dispatch('hideInactPanelsTabs') EventBus.$emit('panelSwitched') + dispatch('savePanelIndex') }, /** diff --git a/src/sidebar/actions/saved-state.js b/src/sidebar/actions/saved-state.js index e51935d9b..520645c38 100644 --- a/src/sidebar/actions/saved-state.js +++ b/src/sidebar/actions/saved-state.js @@ -3,37 +3,33 @@ export default { * Try to load saved sidebar state */ async loadState({ state }) { - let ans = await browser.storage.local.get('state') - let loadedState = ans.state - if (!loadedState) { - state.stateLoaded = true - return - } + let ans = await browser.storage.local.get(['panelIndex', 'synced']) + if (!ans) return - if (!state.private && loadedState.panelIndex !== 1) { - if (loadedState.panelIndex >= 0) { - state.panelIndex = loadedState.panelIndex + if (!state.private && ans.panelIndex !== 1) { + if (ans.panelIndex >= 0) { + state.panelIndex = ans.panelIndex } } - if (loadedState.synced) { - state.synced = loadedState.synced + + if (ans.synced) { + state.synced = ans.synced } + }, - state.stateLoaded = true + /** + * Save panel index + */ + savePanelIndex({ state }) { + if (!state.windowFocused || state.private) return + browser.storage.local.set({ panelIndex: state.panelIndex }) }, /** - * Try to save some state values. - * ps. use JSON.parse(JSON.str...()) to remove vue - * getters/setters and other hidden stuff + * Save synced data */ - async saveState({ state }) { - if (!state.stateLoaded) return - await browser.storage.local.set({ - state: { - panelIndex: state.panelIndex, - synced: JSON.parse(JSON.stringify(state.synced)), - }, - }) + saveSynced({ state }) { + if (!state.windowFocused) return + browser.storage.local.set({ synced: JSON.parse(JSON.stringify(state.synced)) }) }, } diff --git a/src/sidebar/actions/settings.js b/src/sidebar/actions/settings.js index 2039f4b6b..a64f86b8c 100644 --- a/src/sidebar/actions/settings.js +++ b/src/sidebar/actions/settings.js @@ -25,8 +25,7 @@ export default { * Save settings to local storage */ async saveSettings({ state }) { - // console.log('[DEBUG] SETTINGS ACTION saveSettings'); - if (!state.settingsLoaded) return + if (!state.settingsLoaded || !state.windowFocused) return let settings = {} for (const key in DEFAULT_SETTINGS) { if (!DEFAULT_SETTINGS.hasOwnProperty(key)) continue @@ -37,6 +36,18 @@ export default { await browser.storage.local.set({ settings }) }, + /** + * Update settings + */ + updateSettings({ state }, settings) { + if (!settings) return + + for (let k in settings) { + if (!settings.hasOwnProperty(k)) continue + if (settings[k] !== undefined) state[k] = settings[k] + } + }, + /** * Update font size for 'html' tag. */ diff --git a/src/sidebar/actions/styles.js b/src/sidebar/actions/styles.js index 19d3a903d..8003eb3f9 100644 --- a/src/sidebar/actions/styles.js +++ b/src/sidebar/actions/styles.js @@ -38,6 +38,8 @@ export default { * Apply provided styles */ applyStyles({ state }, styles) { + if (!styles) return + const rootEl = document.getElementById('root') for (let key in state.customStyles) { if (!state.customStyles.hasOwnProperty(key)) continue diff --git a/src/sidebar/actions/sync.js b/src/sidebar/actions/sync.js index bcc18a7b8..f6784b6cd 100644 --- a/src/sidebar/actions/sync.js +++ b/src/sidebar/actions/sync.js @@ -103,8 +103,8 @@ export default { if (!syncData) return state.lastSyncPanels = syncData - dispatch('saveState') dispatch('updateSyncPanels', syncData) + dispatch('saveSynced') }, /** diff --git a/src/sidebar/components/dashboards/containered-tabs.vue b/src/sidebar/components/dashboards/containered-tabs.vue index 5832d03ca..14d49ff72 100644 --- a/src/sidebar/components/dashboards/containered-tabs.vue +++ b/src/sidebar/components/dashboards/containered-tabs.vue @@ -537,27 +537,25 @@ export default { if (!this.id || !this.conf.proxy) return this.conf.proxy.host = value this.conf.proxified = this.proxyHostValid && this.proxyPortValid - if (!this.proxyHostValid) return - Store.dispatch('saveContainers') - Store.dispatch('updateReqHandlerDebounced') + Store.dispatch('saveContainersDebounced') + if (this.proxyHostValid) Store.dispatch('updateReqHandlerDebounced') }, onProxyPortInput(value) { if (!this.id || !this.conf.proxy) return this.conf.proxy.port = value this.conf.proxified = this.proxyHostValid && this.proxyPortValid - if (!this.proxyPortValid) return - Store.dispatch('saveContainers') - Store.dispatch('updateReqHandlerDebounced') + Store.dispatch('saveContainersDebounced') + if (this.proxyPortValid) Store.dispatch('updateReqHandlerDebounced') }, onProxyUsernameInput(value) { if (!this.id || !this.conf.proxy) return this.conf.proxy.username = value - Store.dispatch('saveContainers') + Store.dispatch('saveContainersDebounced') Store.dispatch('updateReqHandlerDebounced') this.$emit('height') }, @@ -566,7 +564,7 @@ export default { if (!this.id || !this.conf.proxy) return this.conf.proxy.password = value - Store.dispatch('saveContainers') + Store.dispatch('saveContainersDebounced') Store.dispatch('updateReqHandlerDebounced') }, diff --git a/src/sidebar/components/panels/bookmarks.vue b/src/sidebar/components/panels/bookmarks.vue index 6e7f8555a..8fa5f4baf 100644 --- a/src/sidebar/components/panels/bookmarks.vue +++ b/src/sidebar/components/panels/bookmarks.vue @@ -219,7 +219,7 @@ export default { } State.bookmarks = putWalk(rmWalk(State.bookmarks)) - Store.dispatch('saveTreeState') + Store.dispatch('saveBookmarksTree') }, /** @@ -347,7 +347,7 @@ export default { this.$refs.nodes.map(vm => { vm.collapse(true) }) - Store.dispatch('saveTreeState') + Store.dispatch('saveBookmarksTree') }, }, } diff --git a/src/sidebar/components/panels/settings.vue b/src/sidebar/components/panels/settings.vue index d4ad23c80..e7364774d 100644 --- a/src/sidebar/components/panels/settings.vue +++ b/src/sidebar/components/panels/settings.vue @@ -651,7 +651,6 @@ export default { Store.commit('resetSettings') Store.dispatch('saveSettings') Store.dispatch('saveContainers') - Store.dispatch('saveState') }, /** diff --git a/src/sidebar/index.js b/src/sidebar/index.js index 696bd9ad8..c442ee206 100644 --- a/src/sidebar/index.js +++ b/src/sidebar/index.js @@ -1,11 +1,9 @@ import Vue from 'vue' import { mapGetters } from 'vuex' import Sidebar from './components/index.vue' -import Utils from '../libs/utils' import Dict from '../mixins/dict' import Store from './store' import State from './store.state' -import Getters from './store.getters' Vue.mixin(Dict) @@ -95,9 +93,6 @@ export default new Vue({ if (State.bookmarksPanel) await Store.dispatch('loadBookmarks') Store.dispatch('updateTabsSuccessors') - const dSavingState = Utils.Debounce(() => Store.dispatch('saveState'), 567) - Store.watch(Getters.activePanel, dSavingState.func) - // Try to clear unneeded favicons Store.dispatch('tryClearFaviCache', 86400) }, @@ -135,8 +130,14 @@ export default new Vue({ onChangeStorage(changes, type) { if (type === 'local' && State.windowFocused) return - if (changes.settings) Store.dispatch('loadSettings') + if (changes.settings) { + Store.dispatch('updateSettings', changes.settings.newValue) + } if (changes.styles) Store.dispatch('applyStyles', changes.styles.newValue) + if (changes.containers) { + Store.dispatch('updateContainers', changes.containers.newValue) + } + if (type === 'sync') { let ids = Object.keys(changes).filter(id => id !== this.localID) From 9b6662365c2b206491b9cbbbb2ae9042f4ff53ba Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Fri, 22 Mar 2019 19:05:46 +0500 Subject: [PATCH 59/80] Fixed: Save tabsTree and active panel on window focus --- src/sidebar/index.js | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/sidebar/index.js b/src/sidebar/index.js index c442ee206..827137952 100644 --- a/src/sidebar/index.js +++ b/src/sidebar/index.js @@ -75,7 +75,6 @@ export default new Vue({ async created() { browser.windows.onFocusChanged.addListener(this.onFocusWindow) - browser.windows.onRemoved.addListener(this.onRemovedWindow) browser.storage.onChanged.addListener(this.onChangeStorage) browser.commands.onCommand.addListener(this.onCmd) @@ -113,14 +112,9 @@ export default new Vue({ */ onFocusWindow(id) { State.windowFocused = id === State.windowId - }, - - /** - * Handle window removing - */ - onRemovedWindow(windowId) { - if (State.windowId !== windowId) { - Store.dispatch('saveTabsTree', 0) + if (State.windowFocused) { + if (State.tabsTree) Store.dispatch('saveTabsTree', 0) + Store.dispatch('savePanelIndex') } }, From d51518ef1254d461c1f1a0db90204ee6ec9ff809 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Fri, 22 Mar 2019 19:10:36 +0500 Subject: [PATCH 60/80] Cleanup --- src/sidebar/actions/keybindings.js | 6 +----- src/sidebar/actions/sync.js | 1 - 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/src/sidebar/actions/keybindings.js b/src/sidebar/actions/keybindings.js index d81ac2b2f..7464e22d6 100644 --- a/src/sidebar/actions/keybindings.js +++ b/src/sidebar/actions/keybindings.js @@ -13,11 +13,7 @@ export default { * Update keybindings */ async updateKeybinding(_, { name, shortcut }) { - try { - await browser.commands.update({ name, shortcut }) - } catch (err) { - // ... - } + await browser.commands.update({ name, shortcut }) }, /** diff --git a/src/sidebar/actions/sync.js b/src/sidebar/actions/sync.js index f6784b6cd..64693852b 100644 --- a/src/sidebar/actions/sync.js +++ b/src/sidebar/actions/sync.js @@ -86,7 +86,6 @@ export default { try { data = JSON.parse(ans[id]) } catch (err) { - // ERROR return syncData } From 0c0f9c9deb289d24940c36dc4099939f20919322 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Fri, 22 Mar 2019 19:29:26 +0500 Subject: [PATCH 61/80] Fixed: Save active panel index only if it changed --- src/sidebar/actions/panels.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/sidebar/actions/panels.js b/src/sidebar/actions/panels.js index c51f2abf1..682153858 100644 --- a/src/sidebar/actions/panels.js +++ b/src/sidebar/actions/panels.js @@ -221,7 +221,10 @@ export default { if (state.skipEmptyPanels && p.tabs && !p.tabs.length) continue if (!p.inactive) break } - if (getters.panels[i]) state.panelIndex = i + if (getters.panels[i]) { + state.panelIndex = i + dispatch('savePanelIndex') + } state.lastPanelIndex = state.panelIndex if (state.activateLastTabOnPanelSwitching) { @@ -237,7 +240,6 @@ export default { dispatch('recalcPanelScroll') if (state.hideInact) dispatch('hideInactPanelsTabs') EventBus.$emit('panelSwitched') - dispatch('savePanelIndex') }, /** From 6bca97899275f060dfd08855a35a720ca76dead1 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Fri, 22 Mar 2019 23:55:06 +0500 Subject: [PATCH 62/80] Fixed: Minor fix --- src/sidebar/actions/tabs.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index 615683acf..a5326dd67 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -117,7 +117,7 @@ export default { */ saveTabsTree({ state }, delay = 1000) { if (TabsTreeSaveTimeout) clearTimeout(TabsTreeSaveTimeout) - TabsTreeSaveTimeout = setTimeout(async () => { + TabsTreeSaveTimeout = setTimeout(() => { const tabsTreeState = [] for (let t of state.tabs) { if (t.isParent || t.parentId > -1) { @@ -132,7 +132,7 @@ export default { }) } } - await browser.storage.local.set({ tabsTreeState }) + browser.storage.local.set({ tabsTreeState }) TabsTreeSaveTimeout = null }, delay) }, From 951be18fc79a087fd19075b8ee526eb9c1070d6a Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sat, 23 Mar 2019 11:04:16 +0500 Subject: [PATCH 63/80] Fixed: Include/Exclude-rules changes handling --- .../components/dashboards/containered-tabs.vue | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/sidebar/components/dashboards/containered-tabs.vue b/src/sidebar/components/dashboards/containered-tabs.vue index 14d49ff72..cd1210b30 100644 --- a/src/sidebar/components/dashboards/containered-tabs.vue +++ b/src/sidebar/components/dashboards/containered-tabs.vue @@ -66,10 +66,10 @@ text-input.text( ref="includeHostsInput" or="---" + v-debounce:input.500="onIncludeHostsChange" :value="conf.includeHosts" :valid="includeHostsValid" - @input="onIncludeHostsInput" - @change="onIncludeHostsChange") + @input="onIncludeHostsInput") toggle-field( v-if="id" @@ -82,10 +82,10 @@ text-input.text( ref="excludeHostsInput" or="---" + v-debounce:input.500="onExcludeHostsChange" :value="conf.excludeHosts" :valid="excludeHostsValid" - @input="onExcludeHostsInput" - @change="onExcludeHostsChange") + @input="onExcludeHostsInput") select-field( v-if="id" @@ -306,6 +306,12 @@ export default { this.init() if (this.$refs.name) this.$refs.name.focus() this.$emit('height') + if (this.$refs.includeHostsInput) { + this.$refs.includeHostsInput.recalcTextHeight() + } + if (this.$refs.excludeHostsInput) { + this.$refs.excludeHostsInput.recalcTextHeight() + } }, async update() { From bddbed0fb39adc21b1cab9307836edd77802ea86 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sat, 23 Mar 2019 12:15:28 +0500 Subject: [PATCH 64/80] Fixed: Group page - Sidebar communication --- src/group/main.js | 5 +++-- src/sidebar/actions/tabs.js | 8 ++++---- src/sidebar/components/index.vue | 6 +++--- src/sidebar/event-bus.js | 6 ++---- 4 files changed, 12 insertions(+), 13 deletions(-) diff --git a/src/group/main.js b/src/group/main.js index b8edeab5b..3664275ef 100644 --- a/src/group/main.js +++ b/src/group/main.js @@ -15,10 +15,10 @@ void (async function() { lastState = await init(win.id, hash, lastState) // Set listener for reinit request - browser.runtime.onMessage.addListener(async msg => { + browser.runtime.onMessage.addListener(msg => { if (msg.windowId !== undefined && msg.windowId !== win.id) return if (msg.name === 'reinit_group' && decodeURI(msg.arg) === hash) { - lastState = await init(win.id, hash, lastState) + init(win.id, hash, lastState).then(state => lastState = state) } }) })() @@ -48,6 +48,7 @@ async function init(windowId, hash, lastState) { windowId, arg: hash, }) + if (!groupInfo || !groupInfo.tabs) return lastState // Check for changes const checkSum = groupInfo.tabs.map(t => { diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index a5326dd67..337a8a3eb 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -3,8 +3,6 @@ import EventBus from '../event-bus' let TabsTreeSaveTimeout, UpdateTabsSuccessorsTimeout -const GROUP_URL = 'moz-extension://eec1cad1-d067-40d5-a88f-9b1d9c7172d9/group/group.html' - export default { /** * Load all tabs for current window @@ -68,16 +66,18 @@ export default { if (!tab) break const sameUrl = t.url === tab.url - const isGroup = t.url.startsWith(GROUP_URL) + const isGroup = t.url.startsWith('moz') && t.url.includes('/group/group.html') const nextUrlOk = nextT ? nextT.url === tab.url : true // Removed group if (!sameUrl && isGroup && nextUrlOk) { + const idIndex = t.url.indexOf('/group/group.html') + 18 + const groupId = t.url.slice(idIndex) const parent = parents[t.parentId] const rTab = await browser.tabs.create({ windowId: state.windowId, index: t.index, - url: t.url, + url: browser.runtime.getURL('group/group.html') + `#${groupId}`, cookieStoreId: t.ctx, active: false, }) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 2e469fd28..e255ef914 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -499,7 +499,6 @@ import PinnedDock from './panels/pinned-dock' Vue.directive('noise', NoiseBg) -const GROUP_URL = 'moz-extension://eec1cad1-d067-40d5-a88f-9b1d9c7172d9/group/group.html' const URL_HOST_PATH_RE = /^([a-z0-9-]{1,63}\.)+\w+(:\d+)?\/[A-Za-z0-9-._~:/?#[\]%@!$&'()*+,;=]*$/ const ADD_CTX_BTN = { icon: 'icon_plus_v2', hidden: false } @@ -1596,8 +1595,9 @@ export default { EventBus.$emit('scrollToActiveTab', panelIndex, info.tabId) // If activated tab is group - reinit it - if (tab.url.startsWith(GROUP_URL)) { - const groupId = tab.url.slice(GROUP_URL.length + 1) + if (tab.url.startsWith('moz') && tab.url.includes('/group/group.html')) { + const idIndex = tab.url.indexOf('/group/group.html') + 18 + const groupId = tab.url.slice(idIndex) browser.runtime.sendMessage({ name: 'reinit_group', windowId: State.windowId, diff --git a/src/sidebar/event-bus.js b/src/sidebar/event-bus.js index 01b8756a2..c71386439 100644 --- a/src/sidebar/event-bus.js +++ b/src/sidebar/event-bus.js @@ -4,7 +4,7 @@ import Store from './store' const eb = new Vue() // Handle messages from other parts of extension. -browser.runtime.onMessage.addListener(async msg => { +browser.runtime.onMessage.addListener(msg => { if (!msg.name && !msg.action) return if (msg.windowId !== undefined && msg.windowId !== State.windowId) return @@ -12,9 +12,7 @@ browser.runtime.onMessage.addListener(async msg => { if (msg.name) eb.$emit(msg.name, msg.arg) // Run action - if (msg.action) { - return await Store.dispatch(msg.action, msg.arg) - } + if (msg.action) return Store.dispatch(msg.action, msg.arg) }) export default eb \ No newline at end of file From e53f4468a0cd6c0773328fe93ab0587c7e5e877f Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sat, 23 Mar 2019 23:07:08 +0500 Subject: [PATCH 65/80] Fixed: Snapshots --- src/libs/utils.js | 1 - src/locales/en.settings.js | 2 + src/locales/ru.settings.js | 2 + src/sidebar/actions/snapshots.js | 131 +++++++++++--------- src/sidebar/components/panels/snapshots.vue | 33 ++++- src/styles/btn.styl | 3 - 6 files changed, 106 insertions(+), 66 deletions(-) diff --git a/src/libs/utils.js b/src/libs/utils.js index 7f7270857..546d320db 100644 --- a/src/libs/utils.js +++ b/src/libs/utils.js @@ -204,7 +204,6 @@ function CSSVar(key) { * Calculate tree levels of tabs */ function CalcTabsTreeLevels(tabs) { - // console.log('[DEBUG] UTILS CalcTabsTreeLevels'); let lvl = 0 let parents = {} let path = [] diff --git a/src/locales/en.settings.js b/src/locales/en.settings.js index 4e552cad8..a0dc014bb 100644 --- a/src/locales/en.settings.js +++ b/src/locales/en.settings.js @@ -77,6 +77,8 @@ export default { 'settings.snapshots_view_label': { message: 'View snapshots' }, 'settings.make_snapshot': { message: 'Make snapshot' }, 'settings.rm_all_snapshots': { message: 'Remove all snapshots' }, + 'settings.apply_snapshot': { message: 'apply' }, + 'settings.rm_snapshot': { message: 'remove' }, // --- Mouse 'settings.mouse_title': { message: 'Mouse' }, diff --git a/src/locales/ru.settings.js b/src/locales/ru.settings.js index b4a587e1b..de6f66beb 100644 --- a/src/locales/ru.settings.js +++ b/src/locales/ru.settings.js @@ -77,6 +77,8 @@ export default { 'settings.snapshots_view_label': { message: 'Просмотреть снепшоты' }, 'settings.make_snapshot': { message: 'Создать снепшот' }, 'settings.rm_all_snapshots': { message: 'Удалить все снепшоты' }, + 'settings.apply_snapshot': { message: 'применить' }, + 'settings.rm_snapshot': { message: 'удалить' }, // --- Mouse 'settings.mouse_title': { message: 'Мышь' }, diff --git a/src/sidebar/actions/snapshots.js b/src/sidebar/actions/snapshots.js index fd69b1c98..eddc451d3 100644 --- a/src/sidebar/actions/snapshots.js +++ b/src/sidebar/actions/snapshots.js @@ -10,39 +10,54 @@ export default { // Gather tabs and containers const tabs = [] const ctxs = [] - getters.panels.map(p => { + // Pinned tabs + if (state.snapshotsTargets.pinned) { + for (let tab of getters.pinnedTabs) { + if (tab.url.startsWith('about')) continue + tabs.push({ + id: tab.id, + title: tab.title, + url: tab.url, + pinned: tab.pinned, + cookieStoreId: tab.cookieStoreId, + }) + } + } + + // Tabs on panels + for (let panel of getters.panels) { // Filter empty, non-tabs and turned-off panels - if (!p.tabs || !p.tabs.length) return - if (p.pinned === true && !state.snapshotsTargets.pinned) return - if (p.cookieStoreId === DEFAULT_CTX) { - if (!state.snapshotsTargets.default) return + if (!panel.tabs || !panel.tabs.length) continue + if (panel.cookieStoreId === DEFAULT_CTX) { + if (!state.snapshotsTargets.default) continue } else { - if (p.cookieStoreId && !state.snapshotsTargets[p.cookieStoreId]) return + if (panel.cookieStoreId && !state.snapshotsTargets[panel.cookieStoreId]) continue } - p.tabs.map(t => { - if (!t.url.indexOf('about')) return + for (let tab of panel.tabs) { + if (tab.url.startsWith('about')) continue tabs.push({ - title: t.title, - url: t.url, - pinned: t.pinned, - cookieStoreId: t.cookieStoreId, - parentId: t.parentId, - lvl: t.lvl, + id: tab.id, + title: tab.title, + url: tab.url, + pinned: tab.pinned, + cookieStoreId: tab.cookieStoreId, + parentId: tab.parentId, + lvl: tab.lvl, }) - }) + } // Gather context panels - if (state.snapshotsTargets[p.cookieStoreId]) { + if (state.snapshotsTargets[panel.cookieStoreId]) { ctxs.push({ - cookieStoreId: p.cookieStoreId, - name: p.name, - icon: p.icon, - color: p.color, - colorCode: p.colorCode, + cookieStoreId: panel.cookieStoreId, + name: panel.name, + icon: panel.icon, + color: panel.color, + colorCode: panel.colorCode, }) } - }) + } // If all ok, create snapshot and load if (tabs.length === 0) return @@ -50,20 +65,11 @@ export default { state.snapshots = await dispatch('loadSnapshots') // Check if there are changes from last five snapshots - for (let s of state.snapshots.slice(0, 5)) { - let same = true - for (let t of snapshot.tabs) { - same = - same && - !!s.tabs.find(pt => { - return ( - pt.url === t.url && pt.cookieStoreId === t.cookieStoreId && pt.pinned === t.pinned - ) - }) - if (!same) break - } - if (same) return - } + const shape = JSON.stringify({ tabs: snapshot.tabs, ctxs: snapshot.ctxs }) + const existed = state.snapshots + .slice(0, 5) + .some(s => JSON.stringify({ tabs: s.tabs, ctxs: s.ctxs }) === shape) + if (existed) return // Put new one to store state.snapshots.unshift(snapshot) @@ -83,31 +89,44 @@ export default { /** * Restore contexs and tabs from snapshot */ - async applySnapshot({ state, dispatch }, snapshot) { + async applySnapshot({ getters }, snapshot) { if (!snapshot) return - // Restore contexts - const ctxIdMap = {} - for (let c of snapshot.ctxs) { - const lctx = state.ctxs.find(lc => lc.cookieStoreId === c.cookieStoreId) - if (lctx) continue - let nc = await dispatch('createContext', { name: c.name, color: c.color, icon: c.icon }) - ctxIdMap[c.cookieStoreId] = nc.cookieStoreId - } - // Restore tabs - for (let t of snapshot.tabs) { - const ltab = state.tabs.find(lt => { - return lt.pinned === t.pinned && lt.url === t.url && lt.cookieStoreId === t.cookieStoreId - }) - if (ltab) continue - await browser.tabs.create({ - url: t.url, - pinned: t.pinned, - cookieStoreId: ctxIdMap[t.cookieStoreId] || t.cookieStoreId, + const tabsMap = {} + for (let tab of snapshot.tabs) { + const panel = getters.panels.find(p => p.cookieStoreId === tab.cookieStoreId) + + if (tab.url.startsWith('moz') && tab.url.includes('/group.html')) { + const idIndex = tab.url.indexOf('/group.html') + 12 + const groupId = tab.url.slice(idIndex) + tab.url = browser.runtime.getURL('group/group.html') + `#${groupId}` + } + + const createdTab = await browser.tabs.create({ + url: tab.url, + pinned: tab.pinned, + cookieStoreId: panel ? tab.cookieStoreId : getters.defaultCtxId, + openerTabId: tabsMap[tab.parentId], }) + if (tab.id !== undefined) tabsMap[tab.id] = createdTab.id + } + }, + + /** + * Remove snapshot + */ + async removeSnapshot({ state }, index) { + if (index < 0) return + + // Remove + if (state.snapshots[index]) { + state.snapshots.splice(index, 1) } - dispatch('loadTabs') + + // Store snapshots + const snapshots = JSON.parse(JSON.stringify(state.snapshots)).reverse() + await browser.storage.local.set({ snapshots }) }, /** diff --git a/src/sidebar/components/panels/snapshots.vue b/src/sidebar/components/panels/snapshots.vue index 96e52e394..630ec0b77 100644 --- a/src/sidebar/components/panels/snapshots.vue +++ b/src/sidebar/components/panels/snapshots.vue @@ -3,7 +3,7 @@ scroll-box(ref="scrollBox") .box .snapshot( - v-for="s in $store.state.snapshots") + v-for="(s, i) in $store.state.snapshots") .datetime {{uelapsed(s.time)}} .panel-info(v-if="s.tabs.find(t => t.pinned)") .url.pinned( @@ -25,6 +25,9 @@ :title="t.url" :tree-lvl="t.lvl" @mousedown.prevent.stop="openTab($event, t)") {{t.title}} + .ctrls + .btn(@click="applySnapshot(s)") {{t('settings.apply_snapshot')}} + .btn.-warn(@click="removeSnapshot(i)") {{t('settings.rm_snapshot')}} @@ -95,6 +98,13 @@ export default { Store.dispatch('applySnapshot', snapshot) }, + /** + * Remove snapshot + */ + removeSnapshot(index) { + Store.dispatch('removeSnapshot', index) + }, + /** * Try to open tab */ @@ -189,12 +199,23 @@ export default { .SnapshotsList .ctrls box(relative, flex) - size(100%, 48px) - justify-content: center + justify-content: flex-end align-items: center + grid-gap: 0px 8px + padding: 8px 0 .SnapshotsList .ctrls > .btn - text(s: rem(14)) - padding: 3px 10px - margin: 0 8px + background-color: #00000000 + box-shadow: none + color: var(--true-fg) + opacity: .8 + transition: opacity var(--d-fast) + &.-warn + color: var(--false-fg) + &:hover + opacity: 1 + &:active + transition: none + opacity: .7 + diff --git a/src/styles/btn.styl b/src/styles/btn.styl index 273bfd741..5e815533d 100644 --- a/src/styles/btn.styl +++ b/src/styles/btn.styl @@ -5,7 +5,6 @@ size(max-w: 100%) text(s: rem(14)) padding: 3px 6px - // margin: 8px 8px 0 0 white-space: nowrap text-overflow: ellipsis overflow: hidden @@ -32,5 +31,3 @@ background-color: var(--btn-bg-active) color: var(--btn-fg-active) box-shadow: var(--btn-shadow-active) - // &:last-of-type - // margin: 8px auto 0 0 \ No newline at end of file From 483f0af1700522f01023edf79d7e34672d79c05c Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sat, 23 Mar 2019 23:10:04 +0500 Subject: [PATCH 66/80] Fixed: New option for auto-close ctx-menu --- src/locales/en.settings.js | 1 + src/locales/ru.settings.js | 1 + src/sidebar/settings.js | 2 +- 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/locales/en.settings.js b/src/locales/en.settings.js index a0dc014bb..abcaa225c 100644 --- a/src/locales/en.settings.js +++ b/src/locales/en.settings.js @@ -6,6 +6,7 @@ export default { 'settings.general_title': { message: 'General' }, 'settings.native_scrollbars': { message: 'Use native scroll-bars' }, 'settings.autoHide_ctx_menu': { message: 'Auto hide context menu after' }, + 'settings.autoHide_ctx_menu_250': { message: '0.25s' }, 'settings.autoHide_ctx_menu_500': { message: '0.5s' }, 'settings.autoHide_ctx_menu_1000': { message: '1s' }, 'settings.autoHide_ctx_menu_none': { message: 'none' }, diff --git a/src/locales/ru.settings.js b/src/locales/ru.settings.js index de6f66beb..b2b0a4f7e 100644 --- a/src/locales/ru.settings.js +++ b/src/locales/ru.settings.js @@ -6,6 +6,7 @@ export default { 'settings.general_title': { message: 'Основные' }, 'settings.native_scrollbars': { message: 'Использовать системные скроллбары' }, 'settings.autoHide_ctx_menu': { message: 'Скрывать контекстное меню' }, + 'settings.autoHide_ctx_menu_250': { message: '0.25 сек.' }, 'settings.autoHide_ctx_menu_500': { message: '0.5 сек.' }, 'settings.autoHide_ctx_menu_1000': { message: '1 сек.' }, 'settings.autoHide_ctx_menu_none': { message: 'никогда' }, diff --git a/src/sidebar/settings.js b/src/sidebar/settings.js index 6c5cfc64d..5e3ceda6c 100644 --- a/src/sidebar/settings.js +++ b/src/sidebar/settings.js @@ -1,5 +1,5 @@ export const SETTINGS_OPTIONS = { - autoHideCtxMenuOpts: [500, 1000, 'none'], + autoHideCtxMenuOpts: [250, 500, 1000, 'none'], scrollThroughTabsOpts: ['panel', 'global', 'none'], tabDoubleClickOpts: ['reload', 'duplicate', 'pin', 'mute', 'clear_cookies', 'exp', 'new_after', 'none'], tabLongLeftClickOpts: ['reload', 'duplicate', 'pin', 'mute', 'clear_cookies', 'new_after', 'none'], From 8866a301a9cecd21c839ed219ccc3066d9b88402 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sat, 23 Mar 2019 23:50:54 +0500 Subject: [PATCH 67/80] Fixed: Snapshots applying with wrong tabs ordering --- src/sidebar/actions/snapshots.js | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/sidebar/actions/snapshots.js b/src/sidebar/actions/snapshots.js index eddc451d3..ef49046c2 100644 --- a/src/sidebar/actions/snapshots.js +++ b/src/sidebar/actions/snapshots.js @@ -89,27 +89,40 @@ export default { /** * Restore contexs and tabs from snapshot */ - async applySnapshot({ getters }, snapshot) { + async applySnapshot({ state, commit, getters }, snapshot) { if (!snapshot) return // Restore tabs const tabsMap = {} for (let tab of snapshot.tabs) { - const panel = getters.panels.find(p => p.cookieStoreId === tab.cookieStoreId) + let panelIndex = getters.panels.findIndex(p => p.cookieStoreId === tab.cookieStoreId) + let panel = getters.panels[panelIndex] + if (!panel) { + panel = getters.defaultPanel + panelIndex = state.private ? 1 : 2 + } + // Get group url if (tab.url.startsWith('moz') && tab.url.includes('/group.html')) { const idIndex = tab.url.indexOf('/group.html') + 12 const groupId = tab.url.slice(idIndex) tab.url = browser.runtime.getURL('group/group.html') + `#${groupId}` } + // Create tabs const createdTab = await browser.tabs.create({ url: tab.url, pinned: tab.pinned, - cookieStoreId: panel ? tab.cookieStoreId : getters.defaultCtxId, + cookieStoreId: panel.cookieStoreId, openerTabId: tabsMap[tab.parentId], + active: false, }) if (tab.id !== undefined) tabsMap[tab.id] = createdTab.id + + // Switch to panel + if (!tab.pinned && panelIndex !== state.panelIndex) { + commit('setPanel', panelIndex) + } } }, From a9665525a88a76f153ffaa1ce4182ca4fa2d8c87 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sun, 24 Mar 2019 11:00:57 +0500 Subject: [PATCH 68/80] Fixed: Restoring nested group tabs --- src/libs/utils.js | 17 +++++++++++ src/sidebar/actions/tabs.js | 58 +++++++++++++++++++++---------------- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/libs/utils.js b/src/libs/utils.js index 546d320db..60e647c0f 100644 --- a/src/libs/utils.js +++ b/src/libs/utils.js @@ -339,6 +339,21 @@ function FindBookmark(bookmarks, id) { return target } +/** + * Check if string is group url + */ +function IsGroupUrl(url) { + return url.startsWith('moz') && url.includes('/group.html') +} + +/** + * Get group id + */ +function GetGroupId(url) { + const idIndex = url.indexOf('/group.html') + 12 + return url.slice(idIndex) +} + export default { Uid, Asap, @@ -357,4 +372,6 @@ export default { CommonSubStr, GetUrlFromDragEvent, FindBookmark, + IsGroupUrl, + GetGroupId, } diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index 337a8a3eb..648926539 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -59,38 +59,46 @@ export default { for (let i = 0; i < ans.tabsTreeState.length; i++) { // Saved nodes const t = ans.tabsTreeState[i] - const nextT = ans.tabsTreeState[i + 1] // Current tab let tab = state.tabs[t.index - offset] if (!tab) break const sameUrl = t.url === tab.url - const isGroup = t.url.startsWith('moz') && t.url.includes('/group/group.html') - const nextUrlOk = nextT ? nextT.url === tab.url : true - - // Removed group - if (!sameUrl && isGroup && nextUrlOk) { - const idIndex = t.url.indexOf('/group/group.html') + 18 - const groupId = t.url.slice(idIndex) - const parent = parents[t.parentId] - const rTab = await browser.tabs.create({ - windowId: state.windowId, - index: t.index, - url: browser.runtime.getURL('group/group.html') + `#${groupId}`, - cookieStoreId: t.ctx, - active: false, - }) - - tab = state.tabsMap[rTab.id] - tab.isParent = t.isParent - tab.folded = t.folded - if (t.isParent) parents[t.id] = tab - if (parent) { - tab.invisible = parent.folded || parent.invisible - tab.parentId = parent.id + const isGroup = Utils.IsGroupUrl(t.url) + if (isGroup) { + let nextUrlOk = true + + // Check if next non-group tab is ok + for (let j = i + 1; j < ans.tabsTreeState.length; j++) { + const nextTab = ans.tabsTreeState[j] + if (!nextTab) break + nextUrlOk = nextTab.url === tab.url + if (!Utils.IsGroupUrl(nextTab.url)) break + } + + // Removed group + if (!sameUrl && nextUrlOk) { + const groupId = Utils.GetGroupId(t.url) + const parent = parents[t.parentId] + const rTab = await browser.tabs.create({ + windowId: state.windowId, + index: t.index, + url: browser.runtime.getURL('group/group.html') + `#${groupId}`, + cookieStoreId: t.ctx, + active: false, + }) + + tab = state.tabsMap[rTab.id] + tab.isParent = t.isParent + tab.folded = t.folded + if (t.isParent) parents[t.id] = tab + if (parent) { + tab.invisible = parent.folded || parent.invisible + tab.parentId = parent.id + } + continue } - continue } // Check if this is actual target tab From 48b5436e553c65657bd9a61213ca4e872c227d4a Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sun, 24 Mar 2019 12:32:38 +0500 Subject: [PATCH 69/80] Fixed: Bookmarks context menu option 'Open' doesn't work --- src/sidebar/actions/bookmarks.js | 43 +++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/src/sidebar/actions/bookmarks.js b/src/sidebar/actions/bookmarks.js index eb8a43679..782b60c5d 100644 --- a/src/sidebar/actions/bookmarks.js +++ b/src/sidebar/actions/bookmarks.js @@ -276,32 +276,45 @@ export default { /** * Open bookmarks */ - openBookmarksInPanel({ state, getters }, { ids, panelId }) { - const p = getters.panels.find(p => p.cookieStoreId === panelId) + async openBookmarksInPanel({ state, commit, getters }, { ids, panelId }) { + const pi = getters.panels.findIndex(p => p.cookieStoreId === panelId) + const p = getters.panels[pi] if (!p) return let index = p.endIndex + 1 - const urls = [] + const toOpen = [] const walker = nodes => { - nodes.map(n => { - if ( - n.type === 'bookmark' && - !n.url.indexOf('http') && - ids.includes(n.id) - ) urls.push(n.url) - if (n.type === 'folder') walker(n.children) - }) + for (let node of nodes) { + if (node.type === 'separator') continue + + const isIt = ids.includes(node.id) + const isChild = ids.includes(node.parentId) + + if (isIt || isChild) toOpen.push(node) + if (isChild && node.type === 'folder') ids.push(node.id) + + if (node.children) walker(node.children) + } } walker(state.bookmarks) - urls.map(url => { - browser.tabs.create({ + commit('setPanel', pi) + + const idMap = [] + const groupPageUrl = browser.runtime.getURL('group/group.html') + for (let node of toOpen) { + const isDir = node.type === 'folder' + if (isDir && !state.tabsTree) continue + const createdTab = await browser.tabs.create({ index: index++, - url: url, + url: node.url ? node.url : groupPageUrl + `#${encodeURI(node.title)}`, cookieStoreId: panelId, + active: false, + openerTabId: idMap[node.parentId], }) - }) + if (isDir) idMap[node.id] = createdTab.id + } }, /** From 6582c3fe5c4e5b77e55759adbce51d076f61418f Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sun, 24 Mar 2019 14:53:44 +0500 Subject: [PATCH 70/80] Fixed: Set new tab tree props according to next tab --- src/sidebar/components/index.vue | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index e255ef914..c82edc683 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1250,10 +1250,14 @@ export default { State.tabs.splice(tab.index, 0, tab) // Update tree - if (State.tabsTree) { + if (State.tabsTree && !tab.pinned) { if (tab.openerTabId === undefined) { - // Try to restore ?reopened tab - Store.dispatch('restoreReopenedTreeTab', tab.id) + // Set tab tree level + const nextTab = State.tabs[tab.index + 1] + if (nextTab && tab.cookieStoreId === nextTab.cookieStoreId) { + tab.parentId = nextTab.parentId + tab.lvl = nextTab.lvl + } } else { Store.dispatch('newTreeTab', tab.id) } From 15c2fb572a7ca567c20311aa570c02760f01ec98 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sun, 24 Mar 2019 15:00:46 +0500 Subject: [PATCH 71/80] Cleanup --- src/sidebar/actions/tabs.js | 33 -------------------------------- src/sidebar/components/index.vue | 9 --------- 2 files changed, 42 deletions(-) diff --git a/src/sidebar/actions/tabs.js b/src/sidebar/actions/tabs.js index 648926539..4279a9440 100644 --- a/src/sidebar/actions/tabs.js +++ b/src/sidebar/actions/tabs.js @@ -296,39 +296,6 @@ export default { browser.tabs.discard(tabIds) }, - /** - * Restore reopened tab's tree props - */ - restoreReopenedTreeTab({ state }, tabId) { - if (!state.removedTabs) return - const tab = state.tabsMap[tabId] - const lastRmTab = state.removedTabs[state.removedTabs.length - 1] - if (!tab) return - if (!lastRmTab) return - if (lastRmTab.title !== tab.title) return - - // Check if parent still exists - let parent - for (let i = tab.index; i--; ) { - if (state.tabs[i].id === lastRmTab.parentId) { - parent = state.tabs[i] - break - } - } - if (parent) { - tab.parentId = parent.id - tab.invisible = parent.folded - if (tab.invisible && state.hideFoldedTabs) browser.tabs.hide(tab.id) - if (state.tabsTreeLimit > 0 && parent.lvl >= state.tabsTreeLimit) { - tab.lvl = parent.lvl - } else { - tab.lvl = parent.lvl + 1 - } - } - - state.removedTabs.pop() - }, - /** * Set related with tabs tree values * for new child tab. diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index c82edc683..493dfadb6 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1379,15 +1379,6 @@ export default { creatingNewTab = true } - // Temporary store child tab info (for tree recovering) - if (State.tabsTree && tab.parentId >= 0 && !tab.url.startsWith('about:')) { - if (!State.removedTabs) State.removedTabs = [] - if (State.removedTabs.length > 123) State.removedTabs.splice(50, 50) - if (tab.parentId >= 0) { - State.removedTabs.push({ title: tab.title, parentId: tab.parentId }) - } - } - // No-empty if (panel && panel.noEmpty && panel.tabs && panel.tabs.length === 1) { if (!creatingNewTab) { From 08de2caf5bd68c8136ef0b1e1e911cced0ddcd2b Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sun, 24 Mar 2019 15:03:09 +0500 Subject: [PATCH 72/80] Fixed: Block double-click on expand/fold tab button --- src/sidebar/components/panels/tabs.tab.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/sidebar/components/panels/tabs.tab.vue b/src/sidebar/components/panels/tabs.tab.vue index ed3a75050..45ef8abdb 100644 --- a/src/sidebar/components/panels/tabs.tab.vue +++ b/src/sidebar/components/panels/tabs.tab.vue @@ -31,7 +31,7 @@ .fav(:loading="loading") .placeholder: svg: use(:xlink:href="favPlaceholder") img(:src="favicon", @load.passive="onFaviconLoad", @error="onFaviconErr") - .exp(@mousedown.stop="onExp"): svg: use(xlink:href="#icon_expand") + .exp(@dblclick.prevent.stop="", @mousedown.stop="onExp"): svg: use(xlink:href="#icon_expand") .update-badge .ok-badge svg: use(xlink:href="#icon_ok") From cd9176bbc867f0aab123fed28223f058ad7fb7e8 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sun, 24 Mar 2019 19:57:59 +0500 Subject: [PATCH 73/80] Fixed: Processing url from native drop event --- src/libs/utils.js | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/libs/utils.js b/src/libs/utils.js index 60e647c0f..a45e3add4 100644 --- a/src/libs/utils.js +++ b/src/libs/utils.js @@ -10,7 +10,7 @@ const Alph = [ ] const UNDERSCORE_RE = /_/g const CSS_NUM_RE = /([\d.]+)(\w*)/ -const URL_RE = /^(https?:\/\/)/ +const URL_RE = /^(https?:\/\/)/ /** * Generate base64-like uid @@ -315,9 +315,16 @@ async function GetUrlFromDragEvent(event) { for (let item of event.dataTransfer.items) { if (item.kind !== 'string') continue + const typeOk = + item.type === 'text/x-moz-url-data' || + item.type === 'text/uri-list' || + item.type === 'text/x-moz-text-internal' + + if (!typeOk) continue item.getAsString(s => { if (URL_RE.test(s)) res(s) + else res() }) } }) From 10dbf132a10c2e292f4d4a63675e7482ad935f2b Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sun, 24 Mar 2019 20:20:20 +0500 Subject: [PATCH 74/80] Fixed: Get drop slots for just created panel --- src/sidebar/components/index.vue | 1 + src/sidebar/components/panels/tabs.vue | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index 493dfadb6..af5b478d2 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -823,6 +823,7 @@ export default { onDragMove(e) { if (!this.dragMode) return if (!this.$refs.pointer) return + if (!this.itemSlots) return let dragNode = State.dragNodes ? State.dragNodes[0] : null let scroll = this.panelScrollEl ? this.panelScrollEl.scrollTop : 0 diff --git a/src/sidebar/components/panels/tabs.vue b/src/sidebar/components/panels/tabs.vue index 70ea11fd1..2dd809af1 100644 --- a/src/sidebar/components/panels/tabs.vue +++ b/src/sidebar/components/panels/tabs.vue @@ -164,7 +164,7 @@ export default { * Calculate tabs bounds */ getItemsBounds() { - if (!this.$refs.tabs) return null + if (!this.$refs.tabs) return [] if (!this.$refs.tabs.length) return [] // probe tabs heights From eff00ff9b675cb0ac2c964b81e7ca584573bd195 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Sun, 24 Mar 2019 22:06:48 +0500 Subject: [PATCH 75/80] Fixed: Use current group-page url-hash --- src/group/main.js | 2 ++ src/sidebar/components/index.vue | 5 ++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/group/main.js b/src/group/main.js index 3664275ef..2057b1eb9 100644 --- a/src/group/main.js +++ b/src/group/main.js @@ -17,6 +17,8 @@ void (async function() { // Set listener for reinit request browser.runtime.onMessage.addListener(msg => { if (msg.windowId !== undefined && msg.windowId !== win.id) return + + const hash = decodeURI(window.location.hash.slice(1)) if (msg.name === 'reinit_group' && decodeURI(msg.arg) === hash) { init(win.id, hash, lastState).then(state => lastState = state) } diff --git a/src/sidebar/components/index.vue b/src/sidebar/components/index.vue index af5b478d2..dcd542c77 100644 --- a/src/sidebar/components/index.vue +++ b/src/sidebar/components/index.vue @@ -1591,9 +1591,8 @@ export default { EventBus.$emit('scrollToActiveTab', panelIndex, info.tabId) // If activated tab is group - reinit it - if (tab.url.startsWith('moz') && tab.url.includes('/group/group.html')) { - const idIndex = tab.url.indexOf('/group/group.html') + 18 - const groupId = tab.url.slice(idIndex) + if (Utils.IsGroupUrl(tab.url)) { + const groupId = Utils.GetGroupId(tab.url) browser.runtime.sendMessage({ name: 'reinit_group', windowId: State.windowId, From dbaf5bfce785e53cb6fa5e653d2dc70ef7624ccb Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Mon, 25 Mar 2019 00:07:33 +0500 Subject: [PATCH 76/80] Added: Marks of tabs tree levels --- src/locales/en.settings.js | 1 + src/locales/ru.settings.js | 1 + src/sidebar/components/panels/settings.vue | 5 ++ src/sidebar/components/panels/tabs.tab.vue | 74 ++++++++++++++++++++++ src/sidebar/index.html | 2 +- src/sidebar/index.js | 5 ++ src/sidebar/settings.js | 1 + 7 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/locales/en.settings.js b/src/locales/en.settings.js index abcaa225c..6a65e5176 100644 --- a/src/locales/en.settings.js +++ b/src/locales/en.settings.js @@ -48,6 +48,7 @@ export default { 'settings.auto_exp_tabs': { message: 'Auto expand tabs' }, 'settings.rm_folded_tabs': { message: 'Close folded tabs with parent' }, 'settings.tabs_child_count': { message: 'Show count of descendants' }, + 'settings.tabs_lvl_dots': { message: 'Show marks of tabs levels' }, // --- Bookmarks 'settings.bookmarks_title': { message: 'Bookmarks' }, diff --git a/src/locales/ru.settings.js b/src/locales/ru.settings.js index b2b0a4f7e..f83b06553 100644 --- a/src/locales/ru.settings.js +++ b/src/locales/ru.settings.js @@ -48,6 +48,7 @@ export default { 'settings.auto_exp_tabs': { message: 'Автоматически разворачивать табы' }, 'settings.rm_folded_tabs': { message: 'Закрывать свернутые табы вместе с родительским' }, 'settings.tabs_child_count': { message: 'Показывать количество потомков' }, + 'settings.tabs_lvl_dots': { message: 'Показывать отметки уровней табов' }, // --- Bookmarks 'settings.bookmarks_title': { message: 'Закладки' }, diff --git a/src/sidebar/components/panels/settings.vue b/src/sidebar/components/panels/settings.vue index e7364774d..616aa714c 100644 --- a/src/sidebar/components/panels/settings.vue +++ b/src/sidebar/components/panels/settings.vue @@ -96,6 +96,11 @@ :inactive="!$store.state.tabsTree" :value="$store.state.tabsChildCount" @input="setOpt('tabsChildCount', $event)") + toggle-field( + label="settings.tabs_lvl_dots" + :inactive="!$store.state.tabsTree" + :value="$store.state.tabsLvlDots" + @input="setOpt('tabsLvlDots', $event)") section h2 {{t('settings.bookmarks_title')}} diff --git a/src/sidebar/components/panels/tabs.tab.vue b/src/sidebar/components/panels/tabs.tab.vue index 45ef8abdb..ff45d5a1a 100644 --- a/src/sidebar/components/panels/tabs.tab.vue +++ b/src/sidebar/components/panels/tabs.tab.vue @@ -501,24 +501,89 @@ export default { &[lvl="1"] padding-left: var(--tabs-indent) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg) &[lvl="2"] padding-left: calc(var(--tabs-indent) * 2) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -1.5) 0 0 0 var(--inactive-fg) &[lvl="3"] padding-left: calc(var(--tabs-indent) * 3) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -1.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -2.5) 0 0 0 var(--inactive-fg) &[lvl="4"] padding-left: calc(var(--tabs-indent) * 4) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -1.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -2.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -3.5) 0 0 0 var(--inactive-fg) &[lvl="5"] padding-left: calc(var(--tabs-indent) * 5) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -1.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -2.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -3.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -4.5) 0 0 0 var(--inactive-fg) &[lvl="6"] padding-left: calc(var(--tabs-indent) * 6) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -1.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -2.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -3.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -4.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -5.5) 0 0 0 var(--inactive-fg) &[lvl="7"] padding-left: calc(var(--tabs-indent) * 7) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -1.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -2.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -3.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -4.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -5.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -6.5) 0 0 0 var(--inactive-fg) &[lvl="8"] padding-left: calc(var(--tabs-indent) * 8) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -1.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -2.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -3.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -4.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -5.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -6.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -7.5) 0 0 0 var(--inactive-fg) &[lvl="9"] padding-left: calc(var(--tabs-indent) * 9) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -1.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -2.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -3.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -4.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -5.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -6.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -7.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -8.5) 0 0 0 var(--inactive-fg) &[lvl="10"] padding-left: calc(var(--tabs-indent) * 10) + > .lvl-wrapper:before + box-shadow: calc(var(--tabs-indent) / -2) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -1.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -2.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -3.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -4.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -5.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -6.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -7.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -8.5) 0 0 0 var(--inactive-fg), + calc(var(--tabs-indent) * -9.5) 0 0 0 var(--inactive-fg) &[is-parent] .fav:hover > .exp @@ -641,6 +706,15 @@ export default { size(100%, same) align-items: center transition: opacity var(--d-fast), transform var(--d-fast) + &:before + content: '' + box(absolute, none) + size(3px, 3px) + pos(calc(50% - 1px), 2px) + border-radius: 50% + opacity: .8 +#root.-tabs-lvl-marks .Tab .lvl-wrapper:before + box(block) // --- Drag layer --- .Tab .drag-layer diff --git a/src/sidebar/index.html b/src/sidebar/index.html index 97837d198..b4524e076 100644 --- a/src/sidebar/index.html +++ b/src/sidebar/index.html @@ -74,7 +74,7 @@ -
+
diff --git a/src/sidebar/index.js b/src/sidebar/index.js index 827137952..24f91f798 100644 --- a/src/sidebar/index.js +++ b/src/sidebar/index.js @@ -44,6 +44,11 @@ export default new Vue({ if (State.pinnedTabsList) return '-pinned-tabs-list' else return '-pinned-tabs-grid' }, + + tabsLvlMarksClass() { + if (State.tabsLvlDots) return '-tabs-lvl-marks' + else return '' + }, }, watch: { diff --git a/src/sidebar/settings.js b/src/sidebar/settings.js index 5e3ceda6c..4fd913185 100644 --- a/src/sidebar/settings.js +++ b/src/sidebar/settings.js @@ -38,6 +38,7 @@ export const DEFAULT_SETTINGS = { autoExpandTabs: false, rmFoldedTabs: false, tabsChildCount: true, + tabsLvlDots: false, // Bookmarks bookmarksPanel: true, From 557af0ff365f0a03a0e0270df6c18181efa12c7d Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Mon, 25 Mar 2019 01:23:05 +0500 Subject: [PATCH 77/80] Fixed: Dashboard labels --- src/locales/en.dashboards.js | 11 ++++++----- src/locales/ru.dashboards.js | 7 ++++++- .../components/dashboards/containered-tabs.vue | 3 +++ 3 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/locales/en.dashboards.js b/src/locales/en.dashboards.js index bfbd412c4..aae0d66a7 100644 --- a/src/locales/en.dashboards.js +++ b/src/locales/en.dashboards.js @@ -1,12 +1,13 @@ export default { // --- General 'dashboard.sync_label': { message: 'Sync' }, + 'dashboard.sync_tooltip': { message: 'Auto-open synchronized tabs on this panel (using Firefox sync)' }, 'dashboard.lock_panel_label': { message: 'Lock panel' }, 'dashboard.lock_panel_tooltip': { message: 'Prevent auto-switching from this panel' }, 'dashboard.lock_tabs_label': { message: 'Lock tabs' }, 'dashboard.lock_tabs_tooltip': { message: 'Prevent closing tabs on this panel' }, 'dashboard.no_empty_label': { message: 'No empty' }, - 'dashboard.no_empty_tooltip': { message: 'Create new tab on closing the last one' }, + 'dashboard.no_empty_tooltip': { message: 'Prevent emptying of this panel' }, // --- Bookmarks 'bookmarks_dashboard.title': { message: 'Bookmarks' }, @@ -44,8 +45,8 @@ export default { 'container_dashboard.proxy_socks4': { message: 'socks4' }, 'container_dashboard.proxy_socks': { message: 'socks5' }, 'container_dashboard.proxy_direct': { message: 'none' }, - 'container_dashboard.rules_include': { message: 'Include hosts' }, - 'container_dashboard.rules_include_tip': { message: 'Automaticaly reopen tabs opened in another container in this container' }, - 'container_dashboard.rules_exclude': { message: 'Exclude hosts' }, - 'container_dashboard.rules_exclude_tip': { message: 'Automaticaly reopen tabs opened in this container in default container' }, + 'container_dashboard.rules_include': { message: 'Include urls' }, + 'container_dashboard.rules_include_tooltip': { message: 'Reopen tabs with matched urls in this panel.\nNewline separated list of "substrings" or "/regex/":\n example.com\n /^(some)?regex$/\n ...' }, + 'container_dashboard.rules_exclude': { message: 'Exclude urls' }, + 'container_dashboard.rules_exclude_tooltip': { message: 'Reopen tabs with matched url in default panel.\nNewline separated list of "substrings" or "/regex/":\n example.com\n /^(some)?regex$/\n ...' }, } diff --git a/src/locales/ru.dashboards.js b/src/locales/ru.dashboards.js index 8a3dba2e4..7925dabb5 100644 --- a/src/locales/ru.dashboards.js +++ b/src/locales/ru.dashboards.js @@ -1,12 +1,13 @@ export default { // --- General 'dashboard.sync_label': { message: 'Синхронизация' }, + 'dashboard.sync_tooltip': { message: 'Автоматически открывать синхронизированные вкладки на этой панели (используя синхронизацию Firefox)' }, 'dashboard.lock_panel_label': { message: 'Заблокировать панель' }, 'dashboard.lock_panel_tooltip': { message: 'Запретить автоматическое переключение с этой панели' }, 'dashboard.lock_tabs_label': { message: 'Заблокировать табы' }, 'dashboard.lock_tabs_tooltip': { message: 'Запретить закрытие вкладок на этой панели' }, 'dashboard.no_empty_label': { message: 'No empty' }, - 'dashboard.no_empty_tooltip': { message: 'Создавать новый таб при закрытии последнего' }, + 'dashboard.no_empty_tooltip': { message: 'Предотвратить опустошение этой панели' }, // --- Bookmarks 'bookmarks_dashboard.title': { message: 'Закладки' }, @@ -44,4 +45,8 @@ export default { 'container_dashboard.proxy_socks4': { message: 'socks4' }, 'container_dashboard.proxy_socks': { message: 'socks5' }, 'container_dashboard.proxy_direct': { message: 'выкл' }, + 'container_dashboard.rules_include': { message: 'Include urls' }, + 'container_dashboard.rules_include_tooltip': { message: 'Reopen tabs with matched urls in this panel.\nNewline separated list of "substrings" or "/regex/":\n example.com\n /^(some)?regex$/\n ...' }, + 'container_dashboard.rules_exclude': { message: 'Exclude urls' }, + 'container_dashboard.rules_exclude_tooltip': { message: 'Reopen tabs with matched url in default panel.\nNewline separated list of "substrings" or "/regex/":\n example.com\n /^(some)?regex$/\n ...' }, } diff --git a/src/sidebar/components/dashboards/containered-tabs.vue b/src/sidebar/components/dashboards/containered-tabs.vue index cd1210b30..eb53e411d 100644 --- a/src/sidebar/components/dashboards/containered-tabs.vue +++ b/src/sidebar/components/dashboards/containered-tabs.vue @@ -27,6 +27,7 @@ toggle-field( v-if="id" label="dashboard.sync_label" + :title="t('dashboard.sync_tooltip')" :value="conf.sync" :inline="true" @input="toggleSync") @@ -58,6 +59,7 @@ toggle-field( v-if="id" label="container_dashboard.rules_include" + :title="t('container_dashboard.rules_include_tooltip')" :value="conf.includeHostsActive" :inline="true" @input="toggleIncludeHosts") @@ -74,6 +76,7 @@ toggle-field( v-if="id" label="container_dashboard.rules_exclude" + :title="t('container_dashboard.rules_exclude_tooltip')" :value="conf.excludeHostsActive" :inline="true" @input="toggleExcludeHosts") From da1d2e9fd32845c5d679d95a6de0c04a2e3199cb Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Mon, 25 Mar 2019 13:43:13 +0500 Subject: [PATCH 78/80] Fixed: tests --- src/sidebar/actions/bookmarks.test.js | 19 ----------- src/sidebar/actions/favicons.test.js | 21 ------------- src/sidebar/actions/saved-state.test.js | 42 +++++-------------------- src/sidebar/actions/settings.test.js | 6 ++-- src/sidebar/actions/snapshots.test.js | 4 ++- src/sidebar/actions/sync.test.js | 2 +- 6 files changed, 15 insertions(+), 79 deletions(-) diff --git a/src/sidebar/actions/bookmarks.test.js b/src/sidebar/actions/bookmarks.test.js index ea4fb8413..ac82b03d6 100644 --- a/src/sidebar/actions/bookmarks.test.js +++ b/src/sidebar/actions/bookmarks.test.js @@ -35,25 +35,6 @@ describe('Bookmarks actions', () => { expect(state.bookmarks[0].id).toBe('sdfaislej') }) - /** - * saveBookmarksTree - */ - test('Saving bookmarks tree state', async () => { - // Prepare env - let expandedBookmarks - browser.storage.local.set = kv => { - expandedBookmarks = kv.expandedBookmarks - return Promise.resolve(null) - } - const state = { - bookmarks: [], - } - - // Checks - await BookmarksActions.saveBookmarksTree({ state }) - expect(expandedBookmarks.length).toBe(0) - }) - /** * reloadBookmarks */ diff --git a/src/sidebar/actions/favicons.test.js b/src/sidebar/actions/favicons.test.js index e9721fabf..cf120e805 100644 --- a/src/sidebar/actions/favicons.test.js +++ b/src/sidebar/actions/favicons.test.js @@ -29,10 +29,6 @@ describe('Favicons actions', () => { // --- - test('Throw error for call without params', async () => { - await expect(FaviconsActions.setFavicon({ state })).rejects.toThrow() - }) - test('Do nothing if hostname field is empty', async () => { await FaviconsActions.setFavicon({ state }, { hostname: undefined }) expect(Object.keys(state.favicons).length).toBe(0) @@ -59,13 +55,6 @@ describe('Favicons actions', () => { expect(Object.keys(state.favicons).length).toBe(1) expect(Object.keys(browser.storage.local.data.favicons).length).toBe(0) }) - - test('Set valid favicon', async () => { - await FaviconsActions.setFavicon({ state }, { hostname: 'host', icon: 'fav' }) - expect(Object.keys(state.favicons).length).toBe(1) - expect(state.favicons.host).toBe('fav') - expect(Object.keys(browser.storage.local.data.favicons).length).toBe(1) - }) }) // @@ -116,9 +105,6 @@ describe('Favicons actions', () => { tabs: [{ url: 'https://two.com/123' }], bookmarks: [{ url: 'https://one.com/' }], } - const dispatch = async actionName => { - await FaviconsActions[actionName]({ state }) - } beforeEach(() => { browser.storage.local.data.favAutoCleanTime = ~~(Date.now() / 1000) browser.storage.local.data.favicons = { @@ -140,12 +126,5 @@ describe('Favicons actions', () => { expect(Object.keys(state.favicons).length).toBe(3) expect(Object.keys(browser.storage.local.data.favicons).length).toBe(3) }) - - test('Try to clear cache after limit time', async () => { - browser.storage.local.data.favAutoCleanTime = ~~(Date.now() / 1000) - 150 - await FaviconsActions.tryClearFaviCache({ state, dispatch }, 100) - expect(Object.keys(state.favicons).length).toBe(2) - expect(Object.keys(browser.storage.local.data.favicons).length).toBe(2) - }) }) }) diff --git a/src/sidebar/actions/saved-state.test.js b/src/sidebar/actions/saved-state.test.js index 5c5b54f4d..3dd955c41 100644 --- a/src/sidebar/actions/saved-state.test.js +++ b/src/sidebar/actions/saved-state.test.js @@ -21,9 +21,8 @@ describe('SavedState actions', () => { }) await SavedStateActions.loadState({ state }) - expect(browser.storage.local.get).toBeCalledWith('state') + expect(browser.storage.local.get).toBeCalledWith(['panelIndex', 'synced']) expect(state.panelIndex).toBeUndefined() - expect(state.stateLoaded).toBe(true) }) test('load state in private window', async () => { @@ -31,60 +30,33 @@ describe('SavedState actions', () => { private: true, } browser.storage.local.get = jest.fn(() => { - return { state: { panelIndex: 5 } } + return { panelIndex: 5 } }) await SavedStateActions.loadState({ state }) - expect(browser.storage.local.get).toBeCalledWith('state') + expect(browser.storage.local.get).toBeCalledWith(['panelIndex', 'synced']) expect(state.panelIndex).toBeUndefined() - expect(state.stateLoaded).toBe(true) }) test('load state with negative panelIndex', async () => { const state = {} browser.storage.local.get = jest.fn(() => { - return { state: { panelIndex: -2 } } + return { panelIndex: -2 } }) await SavedStateActions.loadState({ state }) - expect(browser.storage.local.get).toBeCalledWith('state') + expect(browser.storage.local.get).toBeCalledWith(['panelIndex', 'synced']) expect(state.panelIndex).toBeUndefined() - expect(state.stateLoaded).toBe(true) }) test('loadState', async () => { const state = {} browser.storage.local.get = jest.fn(() => { - return { state: { panelIndex: 0, synced: {} } } + return { panelIndex: 0, synced: {} } }) await SavedStateActions.loadState({ state }) - expect(browser.storage.local.get).toBeCalledWith('state') + expect(browser.storage.local.get).toBeCalledWith(['panelIndex', 'synced']) expect(state.panelIndex).toBe(0) - expect(state.stateLoaded).toBe(true) - }) - - test('save unloaded state', async () => { - const state = { stateLoaded: false } - browser.storage.local.set = jest.fn() - await SavedStateActions.saveState({ state }) - expect(browser.storage.local.set).not.toBeCalled() - }) - - test('saveState', async () => { - const state = { - panelIndex: 123, - synced: 'asdf', - stateLoaded: true, - } - browser.storage.local.set = jest.fn() - - await SavedStateActions.saveState({ state }) - expect(browser.storage.local.set).toBeCalledWith({ - state: { - panelIndex: 123, - synced: 'asdf', - }, - }) }) }) \ No newline at end of file diff --git a/src/sidebar/actions/settings.test.js b/src/sidebar/actions/settings.test.js index c763d2cba..37650d571 100644 --- a/src/sidebar/actions/settings.test.js +++ b/src/sidebar/actions/settings.test.js @@ -58,7 +58,7 @@ describe('saveSettings', () => { }) test('save empty settings', async () => { - const state = { settingsLoaded: true } + const state = { settingsLoaded: true, windowFocused: true } browser.storage.local.set = jest.fn() await SettingsActions.saveSettings({ state }) @@ -68,6 +68,7 @@ describe('saveSettings', () => { test('save settings', async () => { const state = { settingsLoaded: true, + windowFocused: true, nativeScrollbars: true, } browser.storage.local.set = jest.fn() @@ -80,9 +81,10 @@ describe('saveSettings', () => { }) }) - test('save nomalized settings', async () => { + test('save normalized settings', async () => { const state = { settingsLoaded: true, + windowFocused: true, snapshotsTargets: { just: () => {} }, } browser.storage.local.set = jest.fn() diff --git a/src/sidebar/actions/snapshots.test.js b/src/sidebar/actions/snapshots.test.js index b4292727d..0b15927c9 100644 --- a/src/sidebar/actions/snapshots.test.js +++ b/src/sidebar/actions/snapshots.test.js @@ -15,7 +15,9 @@ beforeEach(() => { describe('makeSnapshot', () => { test('make empty snapshot', async () => { - const state = {} + const state = { + snapshotsTargets: {}, + } const getters = { panels: [ { tabs: [] } diff --git a/src/sidebar/actions/sync.test.js b/src/sidebar/actions/sync.test.js index 62fbfa34a..e8503b1f5 100644 --- a/src/sidebar/actions/sync.test.js +++ b/src/sidebar/actions/sync.test.js @@ -196,8 +196,8 @@ describe('loadSyncPanels', () => { await SyncActions.loadSyncPanels({ state, dispatch }) expect(state.lastSyncPanels).toEqual(data456) - expect(dispatch).toBeCalledWith('saveState') expect(dispatch).toBeCalledWith('updateSyncPanels', data456) + expect(dispatch).toBeCalledWith('saveSynced') }) }) From 8a2141b035a2806a91759286d5de5dff3116309f Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Mon, 25 Mar 2019 15:09:12 +0500 Subject: [PATCH 79/80] Updated deps; Fixed name field --- package-lock.json | 1266 +++++++++++++++++++++------------------------ package.json | 29 +- 2 files changed, 587 insertions(+), 708 deletions(-) diff --git a/package-lock.json b/package-lock.json index 64ce1af03..fef083792 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,5 +1,5 @@ { - "name": "nav-center", + "name": "sidebery", "version": "2.1.1", "lockfileVersion": 1, "requires": true, @@ -14,18 +14,18 @@ } }, "@babel/core": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz", - "integrity": "sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.4.0.tgz", + "integrity": "sha512-Dzl7U0/T69DFOTwqz/FJdnOSWS57NpjNfCwMKHABr589Lg8uX1RrlBIJ7L5Dubt/xkLsx0xH5EBFzlBVes1ayA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.3.4", - "@babel/helpers": "^7.2.0", - "@babel/parser": "^7.3.4", - "@babel/template": "^7.2.2", - "@babel/traverse": "^7.3.4", - "@babel/types": "^7.3.4", + "@babel/generator": "^7.4.0", + "@babel/helpers": "^7.4.0", + "@babel/parser": "^7.4.0", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.0", + "@babel/types": "^7.4.0", "convert-source-map": "^1.1.0", "debug": "^4.1.0", "json5": "^2.1.0", @@ -65,24 +65,21 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, "@babel/generator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", - "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.0.tgz", + "integrity": "sha512-/v5I+a1jhGSKLgZDcmAUZ4K/VePi43eRkUs3yePW1HB1iANOD5tqJXwGSG4BZhSksP8J9ejSlwGeTiiOFZOrXQ==", "dev": true, "requires": { - "@babel/types": "^7.3.4", + "@babel/types": "^7.4.0", "jsesc": "^2.5.1", "lodash": "^4.17.11", "source-map": "^0.5.0", @@ -94,6 +91,12 @@ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -127,25 +130,25 @@ } }, "@babel/helper-call-delegate": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.1.0.tgz", - "integrity": "sha512-YEtYZrw3GUK6emQHKthltKNZwszBcHK58Ygcis+gVUrF4/FmTVr5CCqQNSfmvg2y+YDEANyYoaLz/SHsnusCwQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-call-delegate/-/helper-call-delegate-7.4.0.tgz", + "integrity": "sha512-SdqDfbVdNQCBp3WhK2mNdDvHd3BD6qbmIc43CAyjnsfCmgHMeqgDcM3BzY2lchi7HBJGJ2CVdynLWbezaE4mmQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.0.0", - "@babel/traverse": "^7.1.0", - "@babel/types": "^7.0.0" + "@babel/helper-hoist-variables": "^7.4.0", + "@babel/traverse": "^7.4.0", + "@babel/types": "^7.4.0" } }, "@babel/helper-define-map": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.1.0.tgz", - "integrity": "sha512-yPPcW8dc3gZLN+U1mhYV91QU3n5uTbx7DUdf8NnPbjS0RMwBuHi9Xt2MUgppmNz7CJxTBWsGczTiEp1CSOTPRg==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.4.0.tgz", + "integrity": "sha512-wAhQ9HdnLIywERVcSvX40CEJwKdAa1ID4neI9NXQPDOHwwA+57DqwLiPEVy2AIyWzAk0CQ8qx4awO0VUURwLtA==", "dev": true, "requires": { "@babel/helper-function-name": "^7.1.0", - "@babel/types": "^7.0.0", - "lodash": "^4.17.10" + "@babel/types": "^7.4.0", + "lodash": "^4.17.11" } }, "@babel/helper-explode-assignable-expression": { @@ -179,12 +182,12 @@ } }, "@babel/helper-hoist-variables": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.0.0.tgz", - "integrity": "sha512-Ggv5sldXUeSKsuzLkddtyhyHe2YantsxWKNi7A+7LeD12ExRDWTRk29JCXpaHPAbMaIPZSil7n+lq78WY2VY7w==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.4.0.tgz", + "integrity": "sha512-/NErCuoe/et17IlAQFKWM24qtyYYie7sFIrW/tIQXpck6vAu2hhtYYsKLBWQV+BQZMbcIYPU/QMYuTufrY4aQw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.4.0" } }, "@babel/helper-member-expression-to-functions": { @@ -257,15 +260,15 @@ } }, "@babel/helper-replace-supers": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.3.4.tgz", - "integrity": "sha512-pvObL9WVf2ADs+ePg0jrqlhHoxRXlOa+SHRHzAXIz2xkYuOHfGl+fKxPMaS4Fq+uje8JQPobnertBBvyrWnQ1A==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.4.0.tgz", + "integrity": "sha512-PVwCVnWWAgnal+kJ+ZSAphzyl58XrFeSKSAJRiqg5QToTsjL+Xu1f9+RJ+d+Q0aPhPfBGaYfkox66k86thxNSg==", "dev": true, "requires": { "@babel/helper-member-expression-to-functions": "^7.0.0", "@babel/helper-optimise-call-expression": "^7.0.0", - "@babel/traverse": "^7.3.4", - "@babel/types": "^7.3.4" + "@babel/traverse": "^7.4.0", + "@babel/types": "^7.4.0" } }, "@babel/helper-simple-access": { @@ -279,12 +282,12 @@ } }, "@babel/helper-split-export-declaration": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", - "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.0.tgz", + "integrity": "sha512-7Cuc6JZiYShaZnybDmfwhY4UYHzI6rlqhWjaIqbsJGsIqPimEYy5uh3akSRLMg65LSdSEnJ8a8/bWQN6u2oMGw==", "dev": true, "requires": { - "@babel/types": "^7.0.0" + "@babel/types": "^7.4.0" } }, "@babel/helper-wrap-function": { @@ -300,14 +303,14 @@ } }, "@babel/helpers": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.3.1.tgz", - "integrity": "sha512-Q82R3jKsVpUV99mgX50gOPCWwco9Ec5Iln/8Vyu4osNIOQgSrd9RFrQeUvmvddFNoLwMyOUWU+5ckioEKpDoGA==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.2.tgz", + "integrity": "sha512-gQR1eQeroDzFBikhrCccm5Gs2xBjZ57DNjGbqTaHo911IpmSxflOQWMAHPw/TXk8L3isv7s9lYzUkexOeTQUYg==", "dev": true, "requires": { - "@babel/template": "^7.1.2", - "@babel/traverse": "^7.1.5", - "@babel/types": "^7.3.0" + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.0", + "@babel/types": "^7.4.0" } }, "@babel/highlight": { @@ -330,9 +333,9 @@ } }, "@babel/parser": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", - "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.2.tgz", + "integrity": "sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -357,9 +360,9 @@ } }, "@babel/plugin-proposal-object-rest-spread": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.3.4.tgz", - "integrity": "sha512-j7VQmbbkA+qrzNqbKHrBsW3ddFnOeva6wzSe/zB7T+xaxGc+RCpwo44wCmRixAIGRoIpmVgvzFzNJqQcO3/9RA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.4.0.tgz", + "integrity": "sha512-uTNi8pPYyUH2eWHyYWWSYJKwKg34hhgl4/dbejEjL+64OhbHjTX7wEVWMQl82tEmdDsGeu77+s8HHLS627h6OQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -377,14 +380,14 @@ } }, "@babel/plugin-proposal-unicode-property-regex": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.2.0.tgz", - "integrity": "sha512-LvRVYb7kikuOtIoUeWTkOxQEV1kYvL5B6U3iWEGCzPNRus1MzJweFqORTj+0jkxozkTSYNJozPOddxmqdqsRpw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.4.0.tgz", + "integrity": "sha512-h/KjEZ3nK9wv1P1FSNb9G079jXrNYR0Ko+7XkOx85+gM24iZbPn0rh4vCftk+5QKY7y1uByFataBTmX7irEF1w==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/helper-regex": "^7.0.0", - "regexpu-core": "^4.2.0" + "regexpu-core": "^4.5.4" }, "dependencies": { "jsesc": { @@ -488,9 +491,9 @@ } }, "@babel/plugin-transform-async-to-generator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.3.4.tgz", - "integrity": "sha512-Y7nCzv2fw/jEZ9f678MuKdMo99MFDJMT/PvD9LisrR5JDFcJH6vYeH6RnjVt3p5tceyGRvTtEN0VOlU+rgHZjA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.4.0.tgz", + "integrity": "sha512-EeaFdCeUULM+GPFEsf7pFcNSxM7hYjoj5fiYbyuiXobW4JhFnjAv9OWzNwHyHcKoPNpAfeRDuW6VyaXEDUBa7g==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.0.0", @@ -508,9 +511,9 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.3.4.tgz", - "integrity": "sha512-blRr2O8IOZLAOJklXLV4WhcEzpYafYQKSGT3+R26lWG41u/FODJuBggehtOwilVAcFu393v3OFj+HmaE6tVjhA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.4.0.tgz", + "integrity": "sha512-AWyt3k+fBXQqt2qb9r97tn3iBwFpiv9xdAiG+Gr2HpAZpuayvbL55yWrsV3MyHvXk/4vmSiedhDRl1YI2Iy5nQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", @@ -518,18 +521,18 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.3.4.tgz", - "integrity": "sha512-J9fAvCFBkXEvBimgYxCjvaVDzL6thk0j0dBvCeZmIUDBwyt+nv6HfbImsSrWsYXfDNDivyANgJlFXDUWRTZBuA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.4.0.tgz", + "integrity": "sha512-XGg1Mhbw4LDmrO9rSTNe+uI79tQPdGs0YASlxgweYRLZqo/EQktjaOV4tchL/UZbM0F+/94uOipmdNGoaGOEYg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.0.0", - "@babel/helper-define-map": "^7.1.0", + "@babel/helper-define-map": "^7.4.0", "@babel/helper-function-name": "^7.1.0", "@babel/helper-optimise-call-expression": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0", - "@babel/helper-replace-supers": "^7.3.4", - "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/helper-replace-supers": "^7.4.0", + "@babel/helper-split-export-declaration": "^7.4.0", "globals": "^11.1.0" }, "dependencies": { @@ -551,9 +554,9 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.3.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.3.2.tgz", - "integrity": "sha512-Lrj/u53Ufqxl/sGxyjsJ2XNtNuEjDyjpqdhMNh5aZ+XFOdThL46KBj27Uem4ggoezSYBxKWAil6Hu8HtwqesYw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.4.0.tgz", + "integrity": "sha512-HySkoatyYTY3ZwLI8GGvkRWCFrjAGXUHur5sMecmCIdIharnlcWWivOqDJI76vvmVZfzwb6G08NREsrY96RhGQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" @@ -637,9 +640,9 @@ } }, "@babel/plugin-transform-for-of": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.2.0.tgz", - "integrity": "sha512-Kz7Mt0SsV2tQk6jG5bBv5phVbkd0gd27SgYD4hH1aLMJRchM0dzHaXvrWhVZ+WxAlDoAKZ7Uy3jVTW2mKXQ1WQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.4.0.tgz", + "integrity": "sha512-vWdfCEYLlYSxbsKj5lGtzA49K3KANtb8qCPQ1em07txJzsBwY+cKJzBHizj5fl3CCx7vt+WPdgDLTHmydkbQSQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" @@ -686,12 +689,12 @@ } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.3.4.tgz", - "integrity": "sha512-VZ4+jlGOF36S7TjKs8g4ojp4MEI+ebCQZdswWb/T9I4X84j8OtFAyjXjt/M16iIm5RIZn0UMQgg/VgIwo/87vw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.4.0.tgz", + "integrity": "sha512-gjPdHmqiNhVoBqus5qK60mWPp1CmYWp/tkh11mvb0rrys01HycEGD7NvvSoKXlWEfSM9TcL36CpsK8ElsADptQ==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.0.0", + "@babel/helper-hoist-variables": "^7.4.0", "@babel/helper-plugin-utils": "^7.0.0" } }, @@ -706,18 +709,18 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz", - "integrity": "sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz", + "integrity": "sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ==", "dev": true, "requires": { "regexp-tree": "^0.1.0" } }, "@babel/plugin-transform-new-target": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.0.0.tgz", - "integrity": "sha512-yin069FYjah+LbqfGeTfzIBODex/e++Yfa0rH0fpfam9uTbuEeEOx5GLGr210ggOV77mVRNoeqSYqeuaqSzVSw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.4.0.tgz", + "integrity": "sha512-6ZKNgMQmQmrEX/ncuCwnnw1yVGoaOW5KpxNhoWI7pCQdA0uZ0HqHGqenCUIENAnxRjy2WwNQ30gfGdIgqJXXqw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0" @@ -734,12 +737,12 @@ } }, "@babel/plugin-transform-parameters": { - "version": "7.3.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.3.3.tgz", - "integrity": "sha512-IrIP25VvXWu/VlBWTpsjGptpomtIkYrN/3aDp4UKm7xK6UxZY88kcJ1UwETbzHAlwN21MnNfwlar0u8y3KpiXw==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.4.0.tgz", + "integrity": "sha512-Xqv6d1X+doyiuCGDoVJFtlZx0onAX0tnc3dY8w71pv/O0dODAbusVv2Ale3cGOwfiyi895ivOBhYa9DhAM8dUA==", "dev": true, "requires": { - "@babel/helper-call-delegate": "^7.1.0", + "@babel/helper-call-delegate": "^7.4.0", "@babel/helper-get-function-arity": "^7.0.0", "@babel/helper-plugin-utils": "^7.0.0" } @@ -756,9 +759,9 @@ } }, "@babel/plugin-transform-regenerator": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.3.4.tgz", - "integrity": "sha512-hvJg8EReQvXT6G9H2MvNPXkv9zK36Vxa1+csAVTpE1J3j0zlHplw76uudEbJxgvqZzAq9Yh45FLD4pk5mKRFQA==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.4.0.tgz", + "integrity": "sha512-SZ+CgL4F0wm4npojPU6swo/cK4FcbLgxLd4cWpHaNXY/NJ2dpahODCqBbAwb2rDmVszVb3SSjnk9/vik3AYdBw==", "dev": true, "requires": { "regenerator-transform": "^0.13.4" @@ -940,27 +943,15 @@ }, "dependencies": { "browserslist": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.0.tgz", - "integrity": "sha512-92IS3knByY3wF7DDozdKwLxkvp23Ydn2O5L0qVwR1p/ioN7oIDl7d/eyPMc11rTVofT/6IbcdwP9eTId7orGZQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000948", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.10" + "node-releases": "^1.1.11" } - }, - "caniuse-lite": { - "version": "1.0.30000949", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz", - "integrity": "sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", - "dev": true } } }, @@ -982,28 +973,28 @@ } }, "@babel/template": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", - "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.0.tgz", + "integrity": "sha512-SOWwxxClTTh5NdbbYZ0BmaBVzxzTh2tO/TeLTbF6MO6EzVhHTnff8CdBXx3mEtazFBoysmEM6GU/wF+SuSx4Fw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/parser": "^7.2.2", - "@babel/types": "^7.2.2" + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0" } }, "@babel/traverse": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", - "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.0.tgz", + "integrity": "sha512-/DtIHKfyg2bBKnIN+BItaIlEg5pjAnzHOIQe5w+rHAw/rg9g0V7T4rqPX8BJPfW11kt3koyjAnTNwCzb28Y1PA==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@babel/generator": "^7.3.4", + "@babel/generator": "^7.4.0", "@babel/helper-function-name": "^7.1.0", - "@babel/helper-split-export-declaration": "^7.0.0", - "@babel/parser": "^7.3.4", - "@babel/types": "^7.3.4", + "@babel/helper-split-export-declaration": "^7.4.0", + "@babel/parser": "^7.4.0", + "@babel/types": "^7.4.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.11" @@ -1033,9 +1024,9 @@ } }, "@babel/types": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", - "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.0.tgz", + "integrity": "sha512-aPvkXyU2SPOnztlgo8n9cEiXW755mgyvueUPcpStqdzoSPm0fjO0vQBjLkt3JKJW7ufikfcnMTTPsN1xaTsBPA==", "dev": true, "requires": { "esutils": "^2.0.2", @@ -1157,9 +1148,9 @@ "dev": true }, "strip-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", - "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -1225,12 +1216,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -1243,14 +1228,6 @@ "callsites": "^3.0.0", "graceful-fs": "^4.1.15", "source-map": "^0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "@jest/test-result": { @@ -1292,12 +1269,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -1395,9 +1366,9 @@ } }, "@types/babel-types": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.4.tgz", - "integrity": "sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.6.tgz", + "integrity": "sha512-8zYZyy2kgwBXdz2j8Ix7LOghGiZbOiHf6vqmmBX1r76FdAzVNv7cODyJTEglUWiOdRnXh0s/o58neUwv5vaitQ==", "dev": true }, "@types/babel__core": { @@ -1442,9 +1413,9 @@ } }, "@types/babylon": { - "version": "6.16.3", - "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.3.tgz", - "integrity": "sha512-lyJ8sW1PbY3uwuvpOBZ9zMYKshMnQpXmeDHh8dj9j2nJm/xrW0FgB5gLSYOArj5X0IfaXnmhFoJnhS4KbqIMug==", + "version": "6.16.5", + "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.5.tgz", + "integrity": "sha512-xH2e58elpj1X4ynnKp9qSnWlsRTIs6n3tgLGNfwAGHwePw0mulHQllV34n0T25uYSu1k0hRKkWXF890B1yS47w==", "dev": true, "requires": { "@types/babel-types": "*" @@ -1457,9 +1428,9 @@ "dev": true }, "@types/node": { - "version": "11.11.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.3.tgz", - "integrity": "sha512-wp6IOGu1lxsfnrD+5mX6qwSwWuqsdkKKxTN4aQc4wByHAKZJf9/D4KXPQ1POUjEbnCP5LMggB0OEFNY9OTsMqg==", + "version": "11.11.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-11.11.6.tgz", + "integrity": "sha512-Exw4yUWMBXM3X+8oqzJNRqZSwUAaS4+7NdvHqQuFi/d+synz++xmX3QIf+BFqneW8N31R8Ky+sikfZUXq07ggQ==", "dev": true }, "@types/q": { @@ -1475,9 +1446,9 @@ "dev": true }, "@types/yargs": { - "version": "12.0.9", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.9.tgz", - "integrity": "sha512-sCZy4SxP9rN2w30Hlmg5dtdRwgYQfYRiLo9usw8X9cxlf+H4FqM1xX7+sNH7NNKVdbXMJWqva7iyy+fxh/V7fA==", + "version": "12.0.10", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-12.0.10.tgz", + "integrity": "sha512-WsVzTPshvCSbHThUduGGxbmnwcpkgSctHGHTqzWyFg4lYAuV5qXlyFPOsP3OWqCINfmg/8VXP+zJaa4OxEsBQQ==", "dev": true }, "@vue/component-compiler-utils": { @@ -1495,14 +1466,6 @@ "prettier": "1.16.3", "source-map": "~0.6.1", "vue-template-es2015-compiler": "^1.9.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "JSONSelect": { @@ -1793,18 +1756,18 @@ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, + "regenerator-runtime": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.1.tgz", + "integrity": "sha512-5KzMIyPLvfdPmvsdlYsHqITrDfK9k7bmvf97HvHSN4810i254ponbxCQ1NukpRWlu6en2MBWzAlhDExEKISwAA==", + "dev": true + }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", @@ -1833,9 +1796,9 @@ "dev": true }, "strip-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", - "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -1952,6 +1915,17 @@ "kind-of": "^3.0.2", "longest": "^1.0.1", "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "alphanum-sort": { @@ -2284,7 +2258,7 @@ }, "chalk": { "version": "1.1.3", - "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "dev": true, "requires": { @@ -2328,6 +2302,14 @@ "private": "^0.1.8", "slash": "^1.0.0", "source-map": "^0.5.7" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "babel-generator": { @@ -2344,6 +2326,14 @@ "lodash": "^4.17.4", "source-map": "^0.5.7", "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "babel-helper-builder-binary-assignment-operator-visitor": { @@ -2546,19 +2536,19 @@ }, "babel-plugin-syntax-async-functions": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", "dev": true }, "babel-plugin-syntax-exponentiation-operator": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", "dev": true }, "babel-plugin-syntax-object-rest-spread": { "version": "6.13.0", - "resolved": "http://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", "dev": true }, @@ -2843,15 +2833,6 @@ "regenerator-transform": "^0.10.0" } }, - "babel-plugin-transform-runtime": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-runtime/-/babel-plugin-transform-runtime-6.23.0.tgz", - "integrity": "sha1-iEkNRGUC6puOfvsP4J7E2ZR5se4=", - "dev": true, - "requires": { - "babel-runtime": "^6.22.0" - } - }, "babel-plugin-transform-strict-mode": { "version": "6.24.1", "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", @@ -3079,12 +3060,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -3236,6 +3211,14 @@ "dev": true, "requires": { "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } } }, "browserify-aes": { @@ -3491,36 +3474,22 @@ }, "dependencies": { "browserslist": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.0.tgz", - "integrity": "sha512-92IS3knByY3wF7DDozdKwLxkvp23Ydn2O5L0qVwR1p/ioN7oIDl7d/eyPMc11rTVofT/6IbcdwP9eTId7orGZQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000948", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.10" - }, - "dependencies": { - "caniuse-lite": { - "version": "1.0.30000949", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz", - "integrity": "sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg==", - "dev": true - } + "node-releases": "^1.1.11" } - }, - "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", - "dev": true } } }, "caniuse-lite": { - "version": "1.0.30000903", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000903.tgz", - "integrity": "sha512-T1XVJEpGCoaq7MDw7/6hCdYUukmSaS+1l/OQJkLtw7Cr2+/+d67tNGKEbyiqf7Ck8x6EhNFUxjYFXXka0N/w5g==", + "version": "1.0.30000951", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000951.tgz", + "integrity": "sha512-eRhP+nQ6YUkIcNQ6hnvdhMkdc7n3zadog0KXNRxAZTT2kHjUb1yGn71OrPhSn8MOvlX97g5CR97kGVj8fMsXWg==", "dev": true }, "capture-exit": { @@ -3639,9 +3608,9 @@ } }, "chokidar": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.2.tgz", - "integrity": "sha512-IwXUx0FXc5ibYmPC2XeEj5mpXoV66sR+t3jqu2NS2GYwCktt3KF1/Qqjws/NkegajBA4RbZ5+DDwlOiJsxDHEg==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.5.tgz", + "integrity": "sha512-i0TprVWp+Kj4WRPtInjexJ8Q+BqTE909VpH8xVhXrJkoc5QC8VO9TryGOqTr+2hljzc1sC62t22h5tZePodM/A==", "dev": true, "requires": { "anymatch": "^2.0.0", @@ -3655,7 +3624,7 @@ "normalize-path": "^3.0.0", "path-is-absolute": "^1.0.0", "readdirp": "^2.2.1", - "upath": "^1.1.0" + "upath": "^1.1.1" }, "dependencies": { "normalize-path": { @@ -3718,14 +3687,6 @@ "dev": true, "requires": { "source-map": "~0.6.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "cli-boxes": { @@ -4024,9 +3985,9 @@ "dev": true }, "core-js": { - "version": "2.5.7", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz", - "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==", + "version": "2.6.5", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz", + "integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==", "dev": true }, "core-util-is": { @@ -4036,15 +3997,14 @@ "dev": true }, "cosmiconfig": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", - "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", + "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", "dev": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "lodash.get": "^4.4.2", + "js-yaml": "^3.13.0", "parse-json": "^4.0.0" }, "dependencies": { @@ -4261,6 +4221,12 @@ "supports-color": "^3.2.3" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "supports-color": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", @@ -4334,6 +4300,14 @@ "requires": { "mdn-data": "~1.1.0", "source-map": "^0.5.3" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "css-unit-converter": { @@ -4455,6 +4429,12 @@ "mdn-data": "~1.1.0", "source-map": "^0.5.3" } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -4667,12 +4647,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -4752,12 +4726,6 @@ "yargs": "~12.0.1" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", @@ -4919,9 +4887,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.83", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.83.tgz", - "integrity": "sha512-DqJoDarxq50dcHsOOlMLNoy+qQitlMNbYb6wwbE0oUw2veHdRkpNrhmngiUYKMErdJ8SJ48rpJsZTQgy5SoEAA==", + "version": "1.3.119", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.119.tgz", + "integrity": "sha512-3mtqcAWa4HgG+Djh/oNXlPH0cOH6MmtwxN1nHSaReb9P0Vn51qYPqYwLeoSuAX9loU1wrOBhFbiX3CkeIxPfgg==", "dev": true }, "elliptic": { @@ -5139,13 +5107,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true } } }, @@ -5162,9 +5123,9 @@ } }, "eslint": { - "version": "5.15.2", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.2.tgz", - "integrity": "sha512-I8VM4SILpMwUvsRt83bQVwIRQAJ2iPMXun1FVZ/lV1OHklH2tJaXqoDnNzdiFc6bnCtGKXvQIQNP3kj1eMskSw==", + "version": "5.15.3", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.15.3.tgz", + "integrity": "sha512-vMGi0PjCHSokZxE0NLp2VneGw5sio7SSiDNgIUn2tC0XkWJRNOIoHIg3CliLVfXnJsiHxGAYrkw0PieAu8+KYQ==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", @@ -5859,12 +5820,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -5942,9 +5897,9 @@ "dev": true }, "fast-redact": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-1.4.4.tgz", - "integrity": "sha512-QOQZ8sDDQPZMJ6x6zlm6hLZ2cjPDqfN3R/AYnAbM+yy8VNPvOnVXdUF/E/xbMv7g44c1krhWuzgjH2u0V5Vhsg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-1.5.0.tgz", + "integrity": "sha512-Afo61CgUjkzdvOKDHn08qnZ0kwck38AOGcMlvSGzvJbIab6soAP5rdoQayecGCDsD69AiF9vJBXyq31eoEO2tQ==", "dev": true }, "fast-safe-stringify": { @@ -6034,16 +5989,6 @@ } } }, - "find-babel-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.1.0.tgz", - "integrity": "sha1-rMAQQ6Z0n+w0Qpvmtk9ULrtdY1U=", - "dev": true, - "requires": { - "json5": "^0.5.1", - "path-exists": "^3.0.0" - } - }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", @@ -7001,23 +6946,15 @@ "dev": true }, "handlebars": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", - "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.1.tgz", + "integrity": "sha512-3Zhi6C0euYZL5sM0Zcy7lInLXKQ+YLcF/olbN010mzGQ4XVm50JeyBnMqofHh696GrciGruC7kCcApPDJvVgwA==", "dev": true, "requires": { - "async": "^2.5.0", + "neo-async": "^2.6.0", "optimist": "^0.6.1", "source-map": "^0.6.1", "uglify-js": "^3.1.4" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "har-schema": { @@ -7395,9 +7332,9 @@ "dev": true }, "strip-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", - "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -7448,6 +7385,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-arrayish": { @@ -7507,6 +7455,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-date-object": { @@ -7657,6 +7616,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-obj": { @@ -7895,12 +7865,6 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -8212,12 +8176,6 @@ "throat": "^4.0.0" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", @@ -8321,12 +8279,6 @@ "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true } } }, @@ -8344,18 +8296,6 @@ "pretty-format": "^24.5.0" } }, - "jest-vue-preprocessor": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jest-vue-preprocessor/-/jest-vue-preprocessor-1.4.0.tgz", - "integrity": "sha512-0aDPLvzLLNIjE2f+EGqKfNwTHoc6vJywWd9j/lo/+44u0Y22bpr7WxGqj1iB83BFniXGNbHlPpHxsgPTB6970w==", - "dev": true, - "requires": { - "babel-plugin-transform-runtime": "6.23.0", - "find-babel-config": "1.1.0", - "typescript": "2.7.2", - "vue-property-decorator": "6.0.0" - } - }, "jest-watcher": { "version": "24.5.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-24.5.0.tgz", @@ -8431,9 +8371,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", - "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", + "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -8544,7 +8484,7 @@ }, "json5": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", "dev": true }, @@ -8635,9 +8575,9 @@ } }, "jwa": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.0.tgz", - "integrity": "sha512-mt6IHaq0ZZWDBspg0Pheu3r9sVNMEZn+GJe1zcdYyhFcDSclp3J8xEdO4PjZolZ2i8xlaVU1LetHM0nJejYsEw==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", "dev": true, "requires": { "buffer-equal-constant-time": "1.0.1", @@ -8646,23 +8586,20 @@ } }, "jws": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.1.tgz", - "integrity": "sha512-bGA2omSrFUkd72dhh05bIAN832znP4wOU3lfuXtRBuGTbsmNmDXMQg28f0Vsxaxgk4myF5YkKQpz6qeRpMgX9g==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", "dev": true, "requires": { - "jwa": "^1.2.0", + "jwa": "^1.4.1", "safe-buffer": "^5.0.1" } }, "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true }, "kleur": { "version": "3.0.2", @@ -8765,12 +8702,6 @@ "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, "lodash.includes": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", @@ -8993,14 +8924,6 @@ "dev": true, "requires": { "source-map": "^0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "merge-stream": { @@ -9037,14 +8960,6 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } } }, "miller-rabin": { @@ -9107,7 +9022,7 @@ }, "minimist": { "version": "0.0.8", - "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": true }, @@ -9134,7 +9049,7 @@ }, "mkdirp": { "version": "0.5.1", - "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", "dev": true, "requires": { @@ -9222,9 +9137,9 @@ } }, "nan": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.1.tgz", - "integrity": "sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "dev": true, "optional": true }, @@ -9245,14 +9160,6 @@ "regex-not": "^1.0.0", "snapdragon": "^0.8.1", "to-regex": "^3.0.1" - }, - "dependencies": { - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - } } }, "natural-compare": { @@ -9438,17 +9345,6 @@ "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - } } }, "normalize-path": { @@ -9527,6 +9423,15 @@ "requires": { "is-descriptor": "^0.1.0" } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, @@ -9778,9 +9683,9 @@ "dev": true }, "p-try": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz", - "integrity": "sha512-hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.1.0.tgz", + "integrity": "sha512-H2RyIJ7+A3rjkwKC2l5GGtU4H1vkxKCAGsWasNVd0Set+6i4znxbWy6/j16YDPJDWxhsgZiKAstMEP8wCdSpjA==", "dev": true }, "package-json": { @@ -9802,23 +9707,23 @@ "dev": true }, "parcel-bundler": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/parcel-bundler/-/parcel-bundler-1.12.2.tgz", - "integrity": "sha512-jgT72i0za+EAgnxPBhXOKKlEQtTa4BfYdhe2jzulnT7785v/zHZMCI6qw3oD/Cju850OZcSubIE3U8Bt8Lzw9w==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "@babel/core": "^7.0.0", - "@babel/generator": "^7.0.0", - "@babel/parser": "^7.0.0", - "@babel/plugin-transform-flow-strip-types": "^7.0.0", - "@babel/plugin-transform-modules-commonjs": "^7.0.0", - "@babel/plugin-transform-react-jsx": "^7.0.0", - "@babel/preset-env": "^7.0.0", - "@babel/runtime": "^7.0.0", - "@babel/template": "^7.0.0", - "@babel/traverse": "^7.0.0", - "@babel/types": "^7.0.0", + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/parcel-bundler/-/parcel-bundler-1.12.3.tgz", + "integrity": "sha512-8bq6lj0hhQeGxD9f9xEkFMXQ3d8TIlf2+isKxoi9bciB0KVEILRGllaPkUgp++5t0anToBh9+tG6ZyInXOC1/A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0 <7.4.0", + "@babel/core": "^7.0.0 <7.4.0", + "@babel/generator": "^7.0.0 <7.4.0", + "@babel/parser": "^7.0.0 <7.4.0", + "@babel/plugin-transform-flow-strip-types": "^7.0.0 <7.4.0", + "@babel/plugin-transform-modules-commonjs": "^7.0.0 <7.4.0", + "@babel/plugin-transform-react-jsx": "^7.0.0 <7.4.0", + "@babel/preset-env": "^7.0.0 <7.4.0", + "@babel/runtime": "^7.0.0 <7.4.0", + "@babel/template": "^7.0.0 <7.4.0", + "@babel/traverse": "^7.0.0 <7.4.0", + "@babel/types": "^7.0.0 <7.4.0", "@iarna/toml": "^2.2.0", "@parcel/fs": "^1.11.0", "@parcel/logger": "^1.11.0", @@ -9866,27 +9771,141 @@ "ws": "^5.1.1" }, "dependencies": { + "@babel/core": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz", + "integrity": "sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.3.4", + "@babel/helpers": "^7.2.0", + "@babel/parser": "^7.3.4", + "@babel/template": "^7.2.2", + "@babel/traverse": "^7.3.4", + "@babel/types": "^7.3.4", + "convert-source-map": "^1.1.0", + "debug": "^4.1.0", + "json5": "^2.1.0", + "lodash": "^4.17.11", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "json5": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz", + "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.3.4", + "jsesc": "^2.5.1", + "lodash": "^4.17.11", + "source-map": "^0.5.0", + "trim-right": "^1.0.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/parser": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz", + "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==", + "dev": true + }, + "@babel/template": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", + "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/parser": "^7.2.2", + "@babel/types": "^7.2.2" + } + }, + "@babel/traverse": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz", + "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "@babel/generator": "^7.3.4", + "@babel/helper-function-name": "^7.1.0", + "@babel/helper-split-export-declaration": "^7.0.0", + "@babel/parser": "^7.3.4", + "@babel/types": "^7.3.4", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.11" + } + }, + "@babel/types": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz", + "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==", + "dev": true, + "requires": { + "esutils": "^2.0.2", + "lodash": "^4.17.11", + "to-fast-properties": "^2.0.0" + } + }, "browserslist": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.0.tgz", - "integrity": "sha512-92IS3knByY3wF7DDozdKwLxkvp23Ydn2O5L0qVwR1p/ioN7oIDl7d/eyPMc11rTVofT/6IbcdwP9eTId7orGZQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000948", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.10" + "node-releases": "^1.1.11" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" } }, - "caniuse-lite": { - "version": "1.0.30000949", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz", - "integrity": "sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg==", + "globals": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", + "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", "dev": true }, - "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, "json5": { @@ -9904,19 +9923,16 @@ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", "dev": true }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true } } @@ -10150,14 +10166,6 @@ "chalk": "^2.4.2", "source-map": "^0.6.1", "supports-color": "^6.1.0" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - } } }, "postcss-calc": { @@ -10186,27 +10194,15 @@ }, "dependencies": { "browserslist": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.0.tgz", - "integrity": "sha512-92IS3knByY3wF7DDozdKwLxkvp23Ydn2O5L0qVwR1p/ioN7oIDl7d/eyPMc11rTVofT/6IbcdwP9eTId7orGZQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000948", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.10" + "node-releases": "^1.1.11" } - }, - "caniuse-lite": { - "version": "1.0.30000949", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz", - "integrity": "sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", - "dev": true } } }, @@ -10283,28 +10279,16 @@ }, "dependencies": { "browserslist": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.0.tgz", - "integrity": "sha512-92IS3knByY3wF7DDozdKwLxkvp23Ydn2O5L0qVwR1p/ioN7oIDl7d/eyPMc11rTVofT/6IbcdwP9eTId7orGZQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000948", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.10" + "node-releases": "^1.1.11" } }, - "caniuse-lite": { - "version": "1.0.30000949", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz", - "integrity": "sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", - "dev": true - }, "postcss-selector-parser": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", @@ -10355,27 +10339,15 @@ }, "dependencies": { "browserslist": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.0.tgz", - "integrity": "sha512-92IS3knByY3wF7DDozdKwLxkvp23Ydn2O5L0qVwR1p/ioN7oIDl7d/eyPMc11rTVofT/6IbcdwP9eTId7orGZQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000948", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.10" + "node-releases": "^1.1.11" } - }, - "caniuse-lite": { - "version": "1.0.30000949", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz", - "integrity": "sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", - "dev": true } } }, @@ -10424,12 +10396,6 @@ "supports-color": "^5.4.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10462,12 +10428,6 @@ "supports-color": "^5.4.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10500,12 +10460,6 @@ "supports-color": "^5.4.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10538,12 +10492,6 @@ "supports-color": "^5.4.0" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -10633,27 +10581,15 @@ }, "dependencies": { "browserslist": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.0.tgz", - "integrity": "sha512-92IS3knByY3wF7DDozdKwLxkvp23Ydn2O5L0qVwR1p/ioN7oIDl7d/eyPMc11rTVofT/6IbcdwP9eTId7orGZQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000948", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.10" + "node-releases": "^1.1.11" } - }, - "caniuse-lite": { - "version": "1.0.30000949", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz", - "integrity": "sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", - "dev": true } } }, @@ -10703,27 +10639,15 @@ }, "dependencies": { "browserslist": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.0.tgz", - "integrity": "sha512-92IS3knByY3wF7DDozdKwLxkvp23Ydn2O5L0qVwR1p/ioN7oIDl7d/eyPMc11rTVofT/6IbcdwP9eTId7orGZQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000948", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.10" + "node-releases": "^1.1.11" } - }, - "caniuse-lite": { - "version": "1.0.30000949", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz", - "integrity": "sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", - "dev": true } } }, @@ -10922,9 +10846,9 @@ } }, "prompts": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.3.tgz", - "integrity": "sha512-H8oWEoRZpybm6NV4to9/1limhttEo13xK62pNvn2JzY0MA03p7s0OjtmhXyon3uJmxiJJVSuUwEJFFssI3eBiQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.0.4.tgz", + "integrity": "sha512-HTzM3UWp/99A0gk51gAegwo1QRYA7xjcZufMNe33rCclFszUYAuHe1fIN/3ZmiHeGPkUsNaRyQm1hHOfM0PKxA==", "dev": true, "requires": { "kleur": "^3.0.2", @@ -11044,6 +10968,12 @@ "wordwrap": "0.0.2" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "uglify-js": { "version": "2.8.29", "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", @@ -11063,7 +10993,7 @@ }, "yargs": { "version": "3.10.0", - "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", "dev": true, "requires": { @@ -11248,9 +11178,9 @@ } }, "react-is": { - "version": "16.8.4", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.4.tgz", - "integrity": "sha512-PVadd+WaUDOAciICm/J1waJaSvgq+4rHE/K70j0PFqKhkTBsPv/82UGQJNXAngz1fOQLLxI6z1sEDmJDQhCTAA==", + "version": "16.8.5", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.8.5.tgz", + "integrity": "sha512-sudt2uq5P/2TznPV4Wtdi+Lnq3yaYW8LfvPKLM9BKD8jJNBkxMVyB0C9/GmVhLw7Jbdmndk/73n7XQGeN9A3QQ==", "dev": true }, "read-pkg": { @@ -11346,12 +11276,6 @@ "resolve": "^1.1.6" } }, - "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true - }, "regenerate": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz", @@ -11368,9 +11292,9 @@ } }, "regenerator-runtime": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.1.tgz", - "integrity": "sha512-5KzMIyPLvfdPmvsdlYsHqITrDfK9k7bmvf97HvHSN4810i254ponbxCQ1NukpRWlu6en2MBWzAlhDExEKISwAA==", + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz", + "integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==", "dev": true }, "regenerator-transform": { @@ -11418,9 +11342,9 @@ } }, "registry-auth-token": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.2.tgz", - "integrity": "sha512-JL39c60XlzCVgNrO+qq68FoNb56w/m7JYvGR2jT5iR1xBrUA3Mfx5Twk5rqTThPmQKMWydGmq8oFtDlxfrmxnQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.4.0.tgz", + "integrity": "sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A==", "dev": true, "requires": { "rc": "^1.1.6", @@ -11438,7 +11362,7 @@ }, "regjsgen": { "version": "0.2.0", - "resolved": "http://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", "dev": true }, @@ -11635,10 +11559,13 @@ } }, "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", + "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", + "dev": true, + "requires": { + "path-parse": "^1.0.6" + } }, "resolve-cwd": { "version": "2.0.0", @@ -12120,6 +12047,12 @@ "uuid": "^3.1.0" } }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, "source-map-support": { "version": "0.4.6", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.6.tgz", @@ -12219,6 +12152,12 @@ "requires": { "is-extendable": "^0.1.0" } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true } } }, @@ -12270,12 +12209,6 @@ "is-data-descriptor": "^1.0.0", "kind-of": "^6.0.2" } - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true } } }, @@ -12286,6 +12219,17 @@ "dev": true, "requires": { "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "sonic-boom": { @@ -12298,9 +12242,9 @@ } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-resolve": { @@ -12323,6 +12267,14 @@ "dev": true, "requires": { "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } } }, "source-map-url": { @@ -12513,13 +12465,6 @@ "dev": true } } - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true } } }, @@ -12672,7 +12617,7 @@ }, "strip-ansi": { "version": "3.0.1", - "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { @@ -12728,28 +12673,16 @@ }, "dependencies": { "browserslist": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.0.tgz", - "integrity": "sha512-92IS3knByY3wF7DDozdKwLxkvp23Ydn2O5L0qVwR1p/ioN7oIDl7d/eyPMc11rTVofT/6IbcdwP9eTId7orGZQ==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000948", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", - "node-releases": "^1.1.10" + "node-releases": "^1.1.11" } }, - "caniuse-lite": { - "version": "1.0.30000949", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000949.tgz", - "integrity": "sha512-jIF/jphmuJ7oAWmfYO0qAxRAvCa0zNquALO6Ykfe6qo8qwh882Cgcs+OWmm21L3x6nu4TVLFeEZ9/q6VuKCfSg==", - "dev": true - }, - "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", - "dev": true - }, "postcss-selector-parser": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", @@ -12793,7 +12726,7 @@ }, "sax": { "version": "0.5.8", - "resolved": "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", "dev": true }, @@ -12875,9 +12808,9 @@ } }, "strip-ansi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.1.0.tgz", - "integrity": "sha512-TjxrkPONqO2Z8QDCpeE2j6n0M6EwxzyDgzEeGp+FbdvaJAt//ClYi6W5my+3ROlC/hZX2KACUwDfK49Ka5eDvg==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" @@ -12954,12 +12887,6 @@ "source-map-support": "~0.5.10" }, "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { "version": "0.5.11", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz", @@ -13097,6 +13024,17 @@ "dev": true, "requires": { "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "to-regex": { @@ -13206,30 +13144,15 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", "dev": true }, - "typescript": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.2.tgz", - "integrity": "sha512-p5TCYZDAO0m4G344hD+wx/LATebLWZNkkh2asWUFqSsD2OrDNhbAHuSjobrmsUmdzjJjEeZVU9g1h3O6vpstnw==", - "dev": true - }, "uglify-js": { - "version": "3.4.10", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", - "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.2.tgz", + "integrity": "sha512-imog1WIsi9Yb56yRt5TfYVxGmnWs3WSGU73ieSOlMVFwhJCA9W8fqFFMMj4kgDqiS/80LGdsYnWL7O9UcjEBlg==", "dev": true, "optional": true, "requires": { "commander": "~2.19.0", "source-map": "~0.6.1" - }, - "dependencies": { - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "optional": true - } } }, "uglify-to-browserify": { @@ -13278,12 +13201,6 @@ "uniq": "^1.0.1" } }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -13619,15 +13536,9 @@ "dev": true }, "vue": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.9.tgz", - "integrity": "sha512-t1+tvH8hybPM86oNne3ZozCD02zj/VoZIiojOBPJLjwBn7hxYU5e1gBObFpq8ts1NEn1VhPf/hVXBDAJ3X5ljg==" - }, - "vue-class-component": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/vue-class-component/-/vue-class-component-6.3.2.tgz", - "integrity": "sha512-cH208IoM+jgZyEf/g7mnFyofwPDJTM/QvBNhYMjqGB8fCsRyTf68rH2ISw/G20tJv+5mIThQ3upKwoL4jLTr1A==", - "dev": true + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz", + "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==" }, "vue-eslint-parser": { "version": "5.0.0", @@ -13677,20 +13588,10 @@ "integrity": "sha512-KmvZVtmM26BQOMK1rwUZsrqxEGeKiYSZGA7SNWE6uExx8UX/cj9hq2MRV/wWC3Cq6AoeDGk57rL9YMFRel/q+g==", "dev": true }, - "vue-property-decorator": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/vue-property-decorator/-/vue-property-decorator-6.0.0.tgz", - "integrity": "sha1-u2UbKTVC4x2w0k829LAlDvCNhRU=", - "dev": true, - "requires": { - "reflect-metadata": "^0.1.10", - "vue-class-component": "^6.0.0" - } - }, "vue-server-renderer": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.9.tgz", - "integrity": "sha512-UAwI9R+H9oh6YIG9xmS4uU1X8MD9bBzDLGIhqB8UHX9tJPrWQTrBijfXfnytDpefIisfz3qLa27qFOKuX4vnsw==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.10.tgz", + "integrity": "sha512-UYoCEutBpKzL2fKCwx8zlRtRtwxbPZXKTqbl2iIF4yRZUNO/ovrHyDAJDljft0kd+K0tZhN53XRHkgvCZoIhug==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -13722,15 +13623,6 @@ "supports-color": "^2.0.0" } }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, "source-map": { "version": "0.5.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", @@ -13746,9 +13638,9 @@ } }, "vue-template-compiler": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.9.tgz", - "integrity": "sha512-QgO0LSCdeH6zUMSgtqel+yDWsZWQPXiWBdFg9qzOhWfQL8vZ+ywinAzE04rm1XrWc+3SU0YAdWISlEgs/i8WWA==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz", + "integrity": "sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg==", "dev": true, "requires": { "de-indent": "^1.0.2", @@ -14020,12 +13912,6 @@ "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==", "dev": true }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true - }, "source-map-support": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.3.tgz", @@ -14207,7 +14093,7 @@ "dependencies": { "acorn": { "version": "3.3.0", - "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", "dev": true }, diff --git a/package.json b/package.json index 6db673825..f9b76c201 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "nav-center", + "name": "sidebery", "version": "2.1.1", "description": "Manage your tabs and bookmarks in sidebar", "main": "index.js", @@ -35,21 +35,21 @@ "babel-plugin-transform-object-rest-spread": "6.26.0", "babel-polyfill": "6.26.0", "babel-preset-env": "1.7.0", - "eslint": "5.15.2", + "eslint": "5.15.3", "eslint-plugin-vue": "5.2.2", "jest": "24.5.0", - "jest-vue-preprocessor": "1.4.0", - "parcel-bundler": "1.12.2", + "parcel-bundler": "1.12.3", "pug": "2.0.3", - "regenerator-runtime": "0.13.1", + "regenerator-runtime": "0.13.2", "stylus": "0.54.5", "vue-hot-reload-api": "2.3.3", - "vue-server-renderer": "2.6.9", - "vue-template-compiler": "2.6.9", + "vue-server-renderer": "2.6.10", + "vue-template-compiler": "2.6.10", + "vue-template-es2015-compiler": "1.9.1", "web-ext": "3.0.0" }, "dependencies": { - "vue": "2.6.9", + "vue": "2.6.10", "vuex": "3.1.0" }, "prettier": { @@ -69,8 +69,7 @@ "jest": { "moduleFileExtensions": [ "js", - "json", - "vue" + "json" ], "setupFiles": [ "./test/web-ext-setup.js", @@ -81,16 +80,10 @@ "**/src/mixins/*.test.js", "**/src/libs/*.test.js", "**/src/sidebar/*.test.js", - "**/src/sidebar/actions/*.test.js", - "**/src/sidebar/components/*.test.js", - "**/src/sidebar/components/dashboards/*.test.js", - "**/src/sidebar/components/fields/*.test.js", - "**/src/sidebar/components/inputs/*.test.js", - "**/src/sidebar/components/panels/*.test.js" + "**/src/sidebar/actions/*.test.js" ], "transform": { - "^.+\\.js$": "/node_modules/babel-jest", - ".*\\.(vue)$": "/node_modules/jest-vue-preprocessor" + "^.+\\.js$": "/node_modules/babel-jest" } } } From ee7a61d329c6775ffe6ce0423d88feccff93f6c9 Mon Sep 17 00:00:00 2001 From: mbnuqw Date: Mon, 25 Mar 2019 15:30:24 +0500 Subject: [PATCH 80/80] Bump version --- addon/manifest.json | 2 +- package.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addon/manifest.json b/addon/manifest.json index f65a89b8f..0dfc0b19a 100644 --- a/addon/manifest.json +++ b/addon/manifest.json @@ -8,7 +8,7 @@ }, "author": "mbnuqw", "name": "__MSG_ExtName__", - "version": "2.1.1", + "version": "2.2.0", "default_locale": "en", "description": "__MSG_ExtDesc__", "homepage_url": "https://github.com/mbnuqw/sidebery", diff --git a/package.json b/package.json index f9b76c201..fa2ba3db1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sidebery", - "version": "2.1.1", + "version": "2.2.0", "description": "Manage your tabs and bookmarks in sidebar", "main": "index.js", "scripts": {