您需要先安装一个扩展,例如 篡改猴、Greasemonkey 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 暴力猴,之后才能安装此脚本。
您需要先安装一个扩展,例如 篡改猴 或 Userscripts ,之后才能安装此脚本。
您需要先安装一款用户脚本管理器扩展,例如 Tampermonkey,才能安装此脚本。
您需要先安装用户脚本管理器扩展后才能安装此脚本。
Proxy wrapper around GM storage API, with support for nested object by proxy.
此脚本不应直接安装。它是供其他脚本使用的外部库,要使用该库请加入元指令 // @require https://update.cn-greasyfork.org/scripts/488549/1335042/proxy-storage.js
- // ==UserScript==
- // @name proxy-storage
- // @description Proxy wrapper around GM storage API, with support for nested object by proxy.
- // @version 0.0.1
- // @namespace owowed.moe
- // @author owowed <island@owowed.moe>
- // @grant GM_getValue
- // @grant GM_setValue
- // @grant GM_deleteValue
- // @grant GM_listValues
- // @license LGPL-3.0
- // ==/UserScript==
- function createGmProxyStorage({
- get = GM_getValue,
- set = GM_setValue,
- deleteValue = GM_deleteValue,
- list = GM_listValues
- } = {}) {
- const storage = { get, set, deleteValue, list };
- return new Proxy({}, {
- get(target, prop, receiver) {
- const value = storage.get(prop);
- if (isObjectOrArray(value)) {
- return makeNestedTargetProxy(value, prop, storage.set);
- }
- else {
- return value;
- }
- },
- set(target, prop, newValue, receiver) {
- storage.set(prop, newValue);
- return true;
- },
- deleteProperty(target, prop) {
- storage.deleteValue(prop);
- return true;
- },
- ownKeys(target) {
- return storage.list();
- },
- has(target, prop) {
- return this.ownKeys(target).includes(prop);
- },
- getOwnPropertyDescriptor(target, prop) {
- if (this.has(target, prop)) {
- return {
- enumerable: true,
- configurable: true,
- writable: false,
- value: this.get(target, prop)
- };
- }
- },
- });
- }
- function isObjectOrArray(value) {
- return Array.isArray(value) || (typeof value == "object" && value != null);
- }
- function makeNestedTargetProxy(rootTarget, rootTargetProp, setter) {
- const set = (target, prop, value) => {
- target[prop] = value;
- setter(rootTargetProp, rootTarget); /* `rootTarget` reference will always get updated */
- return value;
- };
- const get = (target, prop) => {
- const value = target[prop];
- if (isObjectOrArray(value)) {
- return new Proxy(value, { get, set });
- }
- return value;
- };
- return new Proxy(rootTarget, { get, set });
- }