/** * Myext scripts and bags usage index * * Copyright (C) 2021 Wojtek Kosior * * This code is dual-licensed under: * - Asshole license 1.0, * - GPLv3 or (at your option) any later version * * "dual-licensed" means you can choose the license you prefer. * * This code is released under a permissive license because I disapprove of * copyright and wouldn't be willing to sue a violator. Despite not putting * this code under copyleft (which is also kind of copyright), I do not want * it to be made proprietary. Hence, the permissive alternative to GPL is the * Asshole license 1.0 that allows me to call you an asshole if you use it. * This means you're legally ok regardless of how you utilize this code but if * you make it into something nonfree, you're an asshole. * * You should have received a copy of both GPLv3 and Asshole license 1.0 * together with this code. If not, please see: * - https://www.gnu.org/licenses/gpl-3.0.en.html * - https://koszko.org/asshole-license.txt */ "use strict"; /* * Warning! * This script file has not been used for some time and underlying storage * model has changed since then! Fix required! */ /* * We want to count referenes to scripts and bags in order to know, * for example, whether one can be safely deleted. */ (() => { const TYPE_PREFIX = window.TYPE_PREFIX; const get_storage = window.get_storage; const make_once = window.make_once; var component_uses = new Map(); var storage; function add_use_info_by_item(prefix, item, components) { for (let component of components) { component = component.join(""); let used_by_info = component_uses.get(component); if (used_by_info === undefined) { used_by_info = {}; component_uses.set(component, used_by_info); } if (used_by_info[prefix] === undefined) used_by_info[prefix] = new Set(); used_by_info[prefix].add(item); } } function remove_use_info_by_item(prefix, item, components) { for (let component of components) { used_by_info = component_uses.get(component.join("")); if (used_by_info === undefined || used_by_info[prefix] === undefined) return; used_by_info[prefix].delete(item); } } function build_reverse_uses_info(entries_it, type_prefix) { for (let [item, components] of storage.get_all_it(type_prefix)) add_use_info_by_item(type_prefix, item, components); } function handle_change(change) { if (change.old_val !== undefined) remove_use_info_by_item(change.prefix, change.item, change.old_val); if (change.new_val !== undefined) add_use_info_by_item(change.prefix, change.item, change.new_val); } function get_uses(arg1, arg2=undefined) { let [prefix, item] = [arg1, arg2]; if (arg2 === undefined) [prefix, item] = arg1; return component_uses.get(prefix + item); } async function init() { storage = await get_storage(); prefixes = [TYPE_PREFIX.PAGE, TYPE_PREFIX.BAG]; for (let prefix of prefixes) build_reverse_uses_info(prefix); storage.add_change_listener(handle_change, prefixes); return get_uses; } window.get_reverse_use_info = make_once(init); })();