Properly delete and write data under shorter pathnames
This commit is contained in:
		
							parent
							
								
									50d02b8c06
								
							
						
					
					
						commit
						1812672f9d
					
				
					 1 changed files with 84 additions and 36 deletions
				
			
		|  | @ -30,9 +30,10 @@ class global { | ||||||
| 		Find a data given its path.  | 		Find a data given its path.  | ||||||
| 
 | 
 | ||||||
| 		@param {object} DATA_ALL the data | 		@param {object} DATA_ALL the data | ||||||
| 		@param {object} DATA_PATH the path of the data | 		@param {object} path the path of the data | ||||||
| 		*/ | 		*/ | ||||||
| 		function find(DATA_ALL, DATA_PATH) { | 		function find(DATA_ALL, path) { | ||||||
|  | 			let DATA_PATH = path; | ||||||
| 			let DATA = DATA_ALL; | 			let DATA = DATA_ALL; | ||||||
| 
 | 
 | ||||||
| 			// Pull the data out.
 | 			// Pull the data out.
 | ||||||
|  | @ -188,11 +189,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 = {}; | ||||||
| 
 | 
 | ||||||
| 		// Inform the user that saving is in progress.
 |  | ||||||
| 		(((typeof OPTIONS).includes(`obj`) && OPTIONS != null) ? (!(!!OPTIONS[`silent`])) : true)  |  | ||||||
| 			? new logging ((new texts(`saving_current`)).localized, (new texts(`saving_current_message`)).localized, false) |  | ||||||
| 			: false; |  | ||||||
| 
 |  | ||||||
| 		/* Appropriately nest and merge the data. | 		/* Appropriately nest and merge the data. | ||||||
| 
 | 
 | ||||||
| 		@param {object} EXISTING the original data | 		@param {object} EXISTING the original data | ||||||
|  | @ -201,24 +197,28 @@ class global { | ||||||
| 		@param {boolean} STRICT determines whether data is to be overridden or merged | 		@param {boolean} STRICT determines whether data is to be overridden or merged | ||||||
| 		@return {object} the updated data | 		@return {object} the updated data | ||||||
| 		*/ | 		*/ | ||||||
| 		function nest(EXISTING, SUBPATH, VALUE, STRICT = false) { | 		function nest(existing, path, value, strict = false) { | ||||||
| 			let DATABASE = EXISTING; | 			let DATABASE = existing, SUBPATH = path; | ||||||
| 			 | 			 | ||||||
| 			// Get the current path.
 | 			// Get the current path.
 | ||||||
| 			let PATH = {}; | 			let PATH = {}; | ||||||
| 			PATH[`current`] = String(SUBPATH.shift()).trim(); | 			PATH[`current`] = (SUBPATH.length) ? String(SUBPATH.shift()).trim() : null; | ||||||
| 			PATH[`target`] = SUBPATH; | 			PATH[`target`] = SUBPATH; | ||||||
| 
 | 
 | ||||||
| 			if (PATH[`target`].length > 0) { | 			if (PATH[`target`].length > 0 && PATH[`current`] != undefined && PATH[`current`] != null) { | ||||||
| 				DATABASE[PATH[`current`]] = (DATABASE[PATH[`current`]] == null) | 				DATABASE[PATH[`current`]] = (DATABASE[PATH[`current`]] == null) | ||||||
| 					? {} | 					? {} | ||||||
| 					: DATABASE[PATH[`current`]]; | 					: DATABASE[PATH[`current`]]; | ||||||
| 				DATABASE[PATH[`current`]] = nest(DATABASE[PATH[`current`]], PATH[`target`], VALUE, STRICT); | 				DATABASE[PATH[`current`]] = nest(DATABASE[PATH[`current`]], PATH[`target`], value, strict); | ||||||
| 			} else { | 			} else if (PATH[`current`]  != undefined && PATH[`current`] != null) { | ||||||
| 				// If not strict and the data selected is a dictionary, then merge them. 
 | 				// 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) | 				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) | 					? Object.assign(DATABASE[PATH[`current`]], value) | ||||||
| 					: 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 the value.
 | ||||||
|  | @ -242,19 +242,24 @@ class global { | ||||||
| 
 | 
 | ||||||
| 		let DATA_ALL; | 		let DATA_ALL; | ||||||
| 
 | 
 | ||||||
|  | 		// Inform the user that saving is in progress.
 | ||||||
|  | 		(((typeof OPTIONS).includes(`obj`) && OPTIONS != null) ? (!(!!OPTIONS[`silent`])) : true)  | ||||||
|  | 			? new logging ((new texts(`saving_current`)).localized, (new texts(`saving_current_message`)).localized, false) | ||||||
|  | 			: false; | ||||||
|  | 
 | ||||||
| 		// Get all data and set a blank value if it doesn't exist yet. 
 | 		// Get all data and set a blank value if it doesn't exist yet. 
 | ||||||
| 		DATA_ALL = await global.read(null, CLOUD); | 		DATA_ALL = await global.read(null, CLOUD); | ||||||
| 		DATA_ALL = ((DATA_ALL != null && (typeof DATA_ALL).includes(`obj`)) ? Object.keys(DATA_ALL).length <= 0 : true)  | 		DATA_ALL = ((DATA_ALL != null && DATA_ALL != undefined && (typeof DATA_ALL).includes(`obj`)) ? Object.keys(DATA_ALL).length <= 0 : true)  | ||||||
| 			? {} | 			? {} | ||||||
| 			: DATA_ALL; | 			: DATA_ALL; | ||||||
| 
 | 
 | ||||||
| 		// Set the data name. 
 | 		// Set the data name. 
 | ||||||
| 		let DATA_NAME = (!(Array.isArray(path)) && path) | 		let DATA_NAME = (!(Array.isArray(path)) && path && path != undefined) | ||||||
| 			? String(path).trim().split(",") | 			? String(path).trim().split(",") | ||||||
| 			: path; | 			: ((path != null) ? path : []) // Ensure that path isn't empty. 
 | ||||||
| 
 | 
 | ||||||
| 		// Merge!
 | 		// Merge!
 | ||||||
| 		DATA_INJECTED = nest(DATA_ALL, [...DATA_NAME], data, (OPTIONS[`strict`] != null) ? OPTIONS[`strict`] : false); | 		DATA_INJECTED = nest(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) | ||||||
|  | @ -267,14 +272,14 @@ class global { | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	/* | 	/* | ||||||
| 	Dangerous: Resets a particular data.  | 	Removes a particular data.  | ||||||
| 
 | 
 | ||||||
| 	@param {string} preference the preference name to delete | 	@param {string} preference the preference name to delete | ||||||
| 	@param {string} subpreference the subpreference name to delete | 	@param {string} subpreference the subpreference name to delete | ||||||
| 	@param {int} CLOUD the storage of the data | 	@param {int} CLOUD the storage of the data | ||||||
| 	@return {boolean} the user's confirmation | 	@return {boolean} the user's confirmation | ||||||
| 	*/ | 	*/ | ||||||
| 	static async forget(preference, CLOUD = 0, override = false) { | 	static async forget(preference, cloud = 0, override = false) { | ||||||
| 		// Confirm the action.
 | 		// Confirm the action.
 | ||||||
| 		let CONFIRMATION = override ? override : await logging.confirm(); | 		let CONFIRMATION = override ? override : await logging.confirm(); | ||||||
| 
 | 
 | ||||||
|  | @ -286,28 +291,71 @@ class global { | ||||||
| 				@param {string} name the name of the data | 				@param {string} name the name of the data | ||||||
| 				@param {int} cloud the usage of cloud storage | 				@param {int} cloud the usage of cloud storage | ||||||
| 				*/ | 				*/ | ||||||
| 				async function erase(name, cloud) { | 				async function erase(path, cloud) { | ||||||
| 					let DATA_NAME = (!(Array.isArray(name))) ? String(name).trim().split(",") : name; | 					/* | ||||||
|  | 					Securely erase by replacing any existing value with null. | ||||||
| 
 | 
 | ||||||
| 					console.log(DATA_NAME, cloud, [...DATA_NAME.slice(0,-1)]); | 					@param {string} name the name of the data | ||||||
|  | 					@param {int} cloud the usage of cloud storage | ||||||
|  | 					*/ | ||||||
|  | 					function secure(name, cloud) { | ||||||
|  | 						let PATH = name;  | ||||||
|  | 						// Check if the value already exists. 
 | ||||||
|  | 						return(global.read([...PATH], cloud).then(async (DATA) => { | ||||||
|  | 							return((DATA != null) | ||||||
|  | 								// Then erase the data. 
 | ||||||
|  | 								? await global.write(PATH, null, cloud, {"strict": true}) | ||||||
|  | 								: true); | ||||||
|  | 						})); | ||||||
|  | 					}; | ||||||
| 					 | 					 | ||||||
| 					let DATA = await global.read((DATA_NAME.length > 1) ? [...DATA_NAME.slice(0,-1)] : null, cloud); | 					/* | ||||||
|  | 					Remove the key from existence.  | ||||||
| 
 | 
 | ||||||
| 					console.log(DATA, DATA_NAME, cloud, [...DATA_NAME.slice(0,-1)]); | 					@param {string} name the name of the data | ||||||
|  | 					@param {int} cloud the usage of cloud storage | ||||||
|  | 					*/ | ||||||
|  | 					async function eliminate(name, cloud) { | ||||||
|  | 						// Store the variable seperately to avoid overwriting. 
 | ||||||
|  | 						let PATH = name; | ||||||
| 
 | 
 | ||||||
| 					(((((typeof (DATA)).includes(`obj`) && !Array.isArray(DATA) && DATA != null) ? Object.keys(DATA) : false) ? Object.keys(DATA).includes(DATA_NAME[DATA_NAME.length - 1]) : false)) | 						// There are two methods to erase the data. 
 | ||||||
| 						? delete DATA[DATA_NAME[DATA_NAME.length - 1]] | 						// The first only occurs when the root is selected and the path is just a direct descendant. 
 | ||||||
| 						: false; | 						if (PATH.length == 1) { | ||||||
|  | 							chrome.storage[(cloud > 0) ? `sync` : `local`].remove(PATH[0]); | ||||||
|  | 						} else { | ||||||
|  | 							(global.read(((PATH.length > 1) ? [...PATH.slice(0,-1)] : null), cloud)).then((DATA) => { | ||||||
|  | 								// Move the existing data into a new object to help in identifying.
 | ||||||
|  | 								DATA = {"all": DATA}; | ||||||
| 
 | 
 | ||||||
| 					await global.write(DATA_NAME.slice(0,-1), DATA, CLOUD, {"strict": true}); | 								if ((((typeof (DATA[`all`])).includes(`obj`) && !Array.isArray(DATA[`all`])) ? Object.keys(DATA[`all`]) : false) ? Object.hasOwn(DATA[`all`], PATH[PATH.length - 1]) : false) { | ||||||
|  | 									DATA[`modified`] = DATA[`all`]; | ||||||
|  | 							 | ||||||
|  | 									delete DATA[`modified`][PATH[PATH.length - 1]]; | ||||||
|  | 
 | ||||||
|  | 									return(global.write(((PATH && Array.isArray(PATH)) ? (PATH.slice(0,-1)) : null), DATA[`modified`], cloud, {"strict": true})); | ||||||
|  | 								} | ||||||
|  | 							}); | ||||||
|  | 						} | ||||||
|  | 
 | ||||||
|  | 						 | ||||||
|  | 					}; | ||||||
|  | 
 | ||||||
|  | 					// Set the data path. 
 | ||||||
|  | 					let DATA_NAME = (!(Array.isArray(path)) && path && path != undefined) | ||||||
|  | 						? String(path).trim().split(",") | ||||||
|  | 						: ((path != null) ? path : []) // Ensure that path isn't empty. 
 | ||||||
|  | 
 | ||||||
|  | 					await secure([...DATA_NAME], cloud); | ||||||
|  | 					eliminate([...DATA_NAME], cloud); | ||||||
| 				} | 				} | ||||||
| 
 | 
 | ||||||
| 				(CLOUD >= 0) ? await erase(preference, 1) : false; | 				(cloud >= 0) ? erase(preference, 1) : false; | ||||||
| 				(CLOUD <= 0) ? await erase(preference, -1) : false; | 				(cloud <= 0) ? erase(preference, -1) : false; | ||||||
| 			} else { | 			} else { | ||||||
| 				// Clear the data storage.
 | 				// Clear the data storage.
 | ||||||
| 				(CLOUD >= 0) ? chrome.storage.sync.clear() : false; | 				(cloud >= 0) ? chrome.storage.sync.clear() : false; | ||||||
| 				(CLOUD <= 0) ? chrome.storage.local.clear() : false; | 				(cloud <= 0) ? chrome.storage.local.clear() : false; | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue