use nested module for handling reading of paths only defined via a dictionary or string
This commit is contained in:
		
							parent
							
								
									ba42929d1d
								
							
						
					
					
						commit
						3cd5fb2172
					
				
					 1 changed files with 17 additions and 125 deletions
				
			
		|  | @ -5,6 +5,7 @@ Manage the local cache. | ||||||
| import logging from "/scripts/logging.js"; | import logging from "/scripts/logging.js"; | ||||||
| import texts from "/scripts/mapping/read.js"; | import texts from "/scripts/mapping/read.js"; | ||||||
| import hash from "/scripts/utils/hash.js"; | import hash from "/scripts/utils/hash.js"; | ||||||
|  | import nested from "/scripts/utils/nested.js"; | ||||||
| 
 | 
 | ||||||
| /* | /* | ||||||
| Global data storage, which refers to local and synchronized storage | Global data storage, which refers to local and synchronized storage | ||||||
|  | @ -26,36 +27,6 @@ class global { | ||||||
| 			return (chrome.storage[(SOURCE > 0) ? `sync` : `local`].get(null)); | 			return (chrome.storage[(SOURCE > 0) ? `sync` : `local`].get(null)); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		/* |  | ||||||
| 		Find a data given its path.  |  | ||||||
| 
 |  | ||||||
| 		@param {object} DATA_ALL the data |  | ||||||
| 		@param {object} path the path of the data |  | ||||||
| 		*/ |  | ||||||
| 		function find(DATA_ALL, path) { |  | ||||||
| 			let DATA_PATH = path; |  | ||||||
| 			let DATA = DATA_ALL; |  | ||||||
| 
 |  | ||||||
| 			// Pull the data out.
 |  | ||||||
| 			if (DATA_ALL != null && (Array.isArray(DATA_PATH) && DATA_PATH != null) ? DATA_PATH.length > 0 : false) { |  | ||||||
| 				let DATA_PATH_SELECTED = String(DATA_PATH.shift()).trim(); |  | ||||||
| 
 |  | ||||||
| 				// Get the selected data.
 |  | ||||||
| 				DATA = DATA_ALL[DATA_PATH_SELECTED]; |  | ||||||
| 
 |  | ||||||
| 				// must run if there is actually a parameter to test
 |  | ||||||
| 				if (DATA_PATH.length > 0) { |  | ||||||
| 					// Recursively run to make use of the existing data.
 |  | ||||||
| 					DATA = find(DATA, DATA_PATH); |  | ||||||
| 				}; |  | ||||||
| 			} else { |  | ||||||
| 				return null; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			// Now return the data.
 |  | ||||||
| 			return DATA; |  | ||||||
| 		}; |  | ||||||
| 
 |  | ||||||
| 		// Initialize the selected pref data.
 | 		// Initialize the selected pref data.
 | ||||||
| 		let DATA, DATA_RETURNED; | 		let DATA, DATA_RETURNED; | ||||||
| 
 | 
 | ||||||
|  | @ -87,7 +58,7 @@ class global { | ||||||
| 			default: | 			default: | ||||||
| 				cloud = (cloud > 0) ? 1 : -1; | 				cloud = (cloud > 0) ? 1 : -1; | ||||||
| 				DATA = await pull(cloud); | 				DATA = await pull(cloud); | ||||||
| 				DATA_RETURNED = (NAME) ? find(DATA, NAME) : DATA; | 				DATA_RETURNED = (NAME) ? nested.dictionary.get(DATA, NAME) : DATA; | ||||||
| 	 | 	 | ||||||
| 				return(DATA_RETURNED); | 				return(DATA_RETURNED); | ||||||
| 				break; | 				break; | ||||||
|  | @ -189,42 +160,6 @@ class global { | ||||||
| 	static async write(path, data, CLOUD = -1, OPTIONS = {}) { | 	static async write(path, data, CLOUD = -1, OPTIONS = {}) { | ||||||
| 		let DATA_INJECTED = {}; | 		let DATA_INJECTED = {}; | ||||||
| 
 | 
 | ||||||
| 		/* Appropriately nest and merge the data. |  | ||||||
| 
 |  | ||||||
| 		@param {object} EXISTING the original data |  | ||||||
| 		@param {object} PATH the subpath |  | ||||||
| 		@param {object} VALUE the value |  | ||||||
| 		@param {boolean} STRICT determines whether data is to be overridden or merged |  | ||||||
| 		@return {object} the updated data |  | ||||||
| 		*/ |  | ||||||
| 		function nest(existing, path, value, strict = false) { |  | ||||||
| 			let DATABASE = existing, SUBPATH = path; |  | ||||||
| 			 |  | ||||||
| 			// Get the current path.
 |  | ||||||
| 			let PATH = {}; |  | ||||||
| 			PATH[`current`] = (SUBPATH.length) ? String(SUBPATH.shift()).trim() : null; |  | ||||||
| 			PATH[`target`] = SUBPATH; |  | ||||||
| 
 |  | ||||||
| 			if (PATH[`target`].length > 0 && PATH[`current`] != undefined && PATH[`current`] != null) { |  | ||||||
| 				DATABASE[PATH[`current`]] = (DATABASE[PATH[`current`]] == null) |  | ||||||
| 					? {} |  | ||||||
| 					: DATABASE[PATH[`current`]]; |  | ||||||
| 				DATABASE[PATH[`current`]] = nest(DATABASE[PATH[`current`]], PATH[`target`], value, strict); |  | ||||||
| 			} else if (PATH[`current`]  != undefined && PATH[`current`] != null) { |  | ||||||
| 				// If not strict and the data selected is a dictionary, then merge them. 
 |  | ||||||
| 				DATABASE[PATH[`current`]] = (((DATABASE[PATH[`current`]]) ? ((typeof DATABASE[PATH[`current`]]).includes(`obj`) && !Array.isArray(DATABASE[PATH[`current`]])) : false) && !strict) |  | ||||||
| 					? Object.assign(DATABASE[PATH[`current`]], value) |  | ||||||
| 					: value; |  | ||||||
| 			} else { |  | ||||||
| 				DATABASE = (DATABASE == null || DATABASE == undefined) ? {} : DATABASE; |  | ||||||
| 
 |  | ||||||
| 				DATABASE = (((typeof DATABASE).includes(`obj`) && !Array.isArray(DATABASE) && !strict) ? Object.assign(DATABASE, value) : value); |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			// Return the value.
 |  | ||||||
| 			return DATABASE; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		async function verify (NAME, DATA) { | 		async function verify (NAME, DATA) { | ||||||
| 			let DATA_CHECK = {}; | 			let DATA_CHECK = {}; | ||||||
| 
 | 
 | ||||||
|  | @ -259,7 +194,7 @@ class global { | ||||||
| 			: ((path != null) ? path : []) // Ensure that path isn't empty. 
 | 			: ((path != null) ? path : []) // Ensure that path isn't empty. 
 | ||||||
| 
 | 
 | ||||||
| 		// Merge!
 | 		// Merge!
 | ||||||
| 		DATA_INJECTED = nest(DATA_ALL, (DATA_NAME != null) ? [...DATA_NAME] : DATA_NAME, data, (OPTIONS[`strict`] != null) ? OPTIONS[`strict`] : false); | 		DATA_INJECTED = nested.dictionary.set(DATA_ALL, (DATA_NAME != null) ? [...DATA_NAME] : DATA_NAME, data, (OPTIONS[`strict`] != null) ? OPTIONS[`strict`] : false); | ||||||
| 
 | 
 | ||||||
| 		// If cloud is not selected, get where the data is already existent. 
 | 		// If cloud is not selected, get where the data is already existent. 
 | ||||||
| 		(CLOUD == 0 || CLOUD == null) | 		(CLOUD == 0 || CLOUD == null) | ||||||
|  | @ -364,37 +299,13 @@ class global { | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| class session { | class session { | ||||||
| 	/* Recall session storage data. */ | 	/* | ||||||
| 	static async read(path) { | 	Recall session storage data.  | ||||||
| 		/* Recursively find through each data, returning either that value or null when the object is not found. |  | ||||||
| 	 | 	 | ||||||
| 		@param {dictionary} DATA_ALL the data | 	@param {string} path the path to the data | ||||||
| 		@param {object} DATA_PATH the path of the data |  | ||||||
| 	@return {object} the data | 	@return {object} the data | ||||||
| 	*/ | 	*/ | ||||||
| 		function find_data(DATA_ALL, DATA_PATH) { | 	static async read(path) { | ||||||
| 			let DATA = DATA_ALL; |  | ||||||
| 
 |  | ||||||
| 			// Pull the data out.
 |  | ||||||
| 			if (DATA_ALL != null && (Array.isArray(DATA_PATH)) ? DATA_PATH.length > 0 : false) { |  | ||||||
| 				let DATA_PATH_SELECTED = String(DATA_PATH.shift()).trim(); |  | ||||||
| 
 |  | ||||||
| 				// Get the selected data.
 |  | ||||||
| 				DATA = DATA_ALL[DATA_PATH_SELECTED]; |  | ||||||
| 
 |  | ||||||
| 				// must run if there is actually a parameter to test
 |  | ||||||
| 				if (DATA_PATH.length > 0) { |  | ||||||
| 					// Recursively run to make use of the existing data.
 |  | ||||||
| 					DATA = find_data(DATA, DATA_PATH); |  | ||||||
| 				}; |  | ||||||
| 			} else { |  | ||||||
| 				return null; |  | ||||||
| 			} |  | ||||||
| 
 |  | ||||||
| 			// Now return the data.
 |  | ||||||
| 			return DATA; |  | ||||||
| 		}; |  | ||||||
| 
 |  | ||||||
| 		// Change PATH to array if it isn't. 
 | 		// Change PATH to array if it isn't. 
 | ||||||
| 		let PATH = (!(Array.isArray(path)) && path && path != undefined) | 		let PATH = (!(Array.isArray(path)) && path && path != undefined) | ||||||
| 			? String(path).trim().split(",") | 			? String(path).trim().split(",") | ||||||
|  | @ -403,37 +314,18 @@ class session { | ||||||
| 		// Prepare data. 
 | 		// Prepare data. 
 | ||||||
| 		let DATA = {}; | 		let DATA = {}; | ||||||
| 		DATA[`all`] = await chrome.storage.session.get(null); | 		DATA[`all`] = await chrome.storage.session.get(null); | ||||||
| 		(DATA[`all`]) ? DATA[`selected`] = find_data(DATA[`all`], [...PATH]) : false; | 		(DATA[`all`]) ? DATA[`selected`] = nested.dictionary.get(DATA[`all`], [...PATH]) : false; | ||||||
| 		 | 		 | ||||||
| 		return (DATA[`selected`]); | 		return (DATA[`selected`]); | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	static async write(PATH, DATA) { | 	/* | ||||||
| 		/* Appropriately nest and merge the data. | 	Write the data to a specified path.  | ||||||
| 
 | 
 | ||||||
| 		@param {object} EXISTING the original data | 	@param {string} PATH the path to the data | ||||||
| 		@param {object} PATH the subpath | 	@param {object} DATA the data to be written | ||||||
| 		@param {object} VALUE the value |  | ||||||
| 		@return {object} the updated data |  | ||||||
| 	*/ | 	*/ | ||||||
| 		function nest(EXISTING, SUBPATH, VALUE) { | 	static async write(PATH, DATA) { | ||||||
| 			let DATABASE = EXISTING; |  | ||||||
| 
 |  | ||||||
| 			// Get the current path.
 |  | ||||||
| 			let PATH = {}; |  | ||||||
| 			PATH[`current`] = String(SUBPATH.shift()).trim(); |  | ||||||
| 			PATH[`target`] = SUBPATH; |  | ||||||
| 
 |  | ||||||
| 			if (PATH[`target`].length > 0) { |  | ||||||
| 				(DATABASE[PATH[`current`]] == null) ? DATABASE[PATH[`current`]] = {} : false; |  | ||||||
| 				DATABASE[PATH[`current`]] = nest(DATABASE[PATH[`current`]], PATH[`target`], VALUE); |  | ||||||
| 			} else { |  | ||||||
| 				DATABASE[PATH[`current`]] = VALUE; |  | ||||||
| 			} |  | ||||||
| 			// Return the value.
 |  | ||||||
| 			return DATABASE; |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		async function verify (NAME, DATA) { | 		async function verify (NAME, DATA) { | ||||||
| 			let DATA_CHECK = {}; | 			let DATA_CHECK = {}; | ||||||
| 
 | 
 | ||||||
|  | @ -457,7 +349,7 @@ class session { | ||||||
| 		let TARGET = (!(typeof PATH).includes(`obj`)) ? String(PATH).trim().split(",") : PATH; | 		let TARGET = (!(typeof PATH).includes(`obj`)) ? String(PATH).trim().split(",") : PATH; | ||||||
| 
 | 
 | ||||||
| 		// Merge!
 | 		// Merge!
 | ||||||
| 		DATA[`inject`] = nest(DATA[`all`], [...TARGET], DATA[`write`]); | 		DATA[`inject`] = nested.dictionary.set(DATA[`all`], [...TARGET], DATA[`write`]); | ||||||
| 
 | 
 | ||||||
| 		// Write!
 | 		// Write!
 | ||||||
| 		chrome.storage.session.set(DATA[`inject`]); | 		chrome.storage.session.set(DATA[`inject`]); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue