/** * Myext scripts and bundles usage index * * Copyright (C) 2021 Wojtek Kosior * * Dual-licensed under: * - 0BSD license * - GPLv3 or (at your option) any later version */ "use strict"; /* * We want to count referenes to scripts and bundles 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.BUNDLE]; 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); })();