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. */
|
/*
|
||||||
|
Recall session storage data.
|
||||||
|
|
||||||
|
@param {string} path the path to the data
|
||||||
|
@return {object} the data
|
||||||
|
*/
|
||||||
static async read(path) {
|
static async read(path) {
|
||||||
/* Recursively find through each data, returning either that value or null when the object is not found.
|
|
||||||
|
|
||||||
@param {dictionary} DATA_ALL the data
|
|
||||||
@param {object} DATA_PATH the path of the data
|
|
||||||
@return {object} the data
|
|
||||||
*/
|
|
||||||
function find_data(DATA_ALL, DATA_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`]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Write the data to a specified path.
|
||||||
|
|
||||||
|
@param {string} PATH the path to the data
|
||||||
|
@param {object} DATA the data to be written
|
||||||
|
*/
|
||||||
static async write(PATH, DATA) {
|
static async write(PATH, DATA) {
|
||||||
/* Appropriately nest and merge the data.
|
|
||||||
|
|
||||||
@param {object} EXISTING the original data
|
|
||||||
@param {object} PATH the subpath
|
|
||||||
@param {object} VALUE the value
|
|
||||||
@return {object} the updated data
|
|
||||||
*/
|
|
||||||
function nest(EXISTING, SUBPATH, VALUE) {
|
|
||||||
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