all files / src/ install.ts

100% Statements 36/36
87.5% Branches 7/8
100% Functions 5/5
100% Lines 32/32
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55                                             
import { Vue, VueConstructor, Option } from './interfaces'
import LSStorage from './lsstorage'
import { set, copy } from './objpath'
 
import defaultMerge from './merge'
 
function applyPersistence(vm, option: Option) {
	const { keys, merge = defaultMerge, namespace: ns } = option
 
	const ls = new LSStorage(option)
 
	let optdata = {}
	for (const k of keys) {
		copy(optdata, vm, k)
	}
 
	let data = null
	if (ls.has(ns)) {
		data = ls.get(ns)
	} else {
		const tmp = {}
		for (const k of keys) {
			copy(tmp, optdata, k)
		}
		data = tmp
	}
	ls.set(ns, data)
	data = merge(optdata, data)
	for (const k of keys) {
		copy(vm, data, k)
		vm.$watch(k, {
			handler: value => {
				set(data, k, value)
				ls.set(ns, data)
			},
			deep: true
		})
	}
}
 
export function install(Vue: VueConstructor) {
	Vue.mixin({
		created() {
			Eif ('storage' in this.$options) {
				const option: Option | Option[] = this.$options.storage
				if (Array.isArray(option)) {
					option.forEach(opt => applyPersistence(this, opt))
					return
				}
				applyPersistence(this, option)
			}
		}
	})
}