45 lines
1.4 KiB
JavaScript
45 lines
1.4 KiB
JavaScript
(function exposeStateStore(global) {
|
|
"use strict";
|
|
|
|
function create(domains) {
|
|
const owners = new Map();
|
|
const stores = {};
|
|
Object.entries(domains).forEach(([domain, values]) => {
|
|
stores[domain] = { ...values };
|
|
Object.keys(values).forEach((key) => {
|
|
if (owners.has(key)) throw new Error(`Duplicate state field: ${key}`);
|
|
owners.set(key, domain);
|
|
});
|
|
});
|
|
|
|
const proxy = new Proxy({}, {
|
|
get(_target, key) {
|
|
if (key === "domain") return (name) => stores[name];
|
|
if (key === "domains") return Object.freeze({ ...stores });
|
|
if (typeof key !== "string" || !owners.has(key)) return undefined;
|
|
return stores[owners.get(key)][key];
|
|
},
|
|
set(_target, key, value) {
|
|
if (typeof key !== "string" || !owners.has(key)) {
|
|
throw new Error(`Unregistered application state field: ${String(key)}`);
|
|
}
|
|
stores[owners.get(key)][key] = value;
|
|
return true;
|
|
},
|
|
has(_target, key) {
|
|
return key === "domain" || key === "domains" || owners.has(key);
|
|
},
|
|
ownKeys() {
|
|
return [...owners.keys()];
|
|
},
|
|
getOwnPropertyDescriptor(_target, key) {
|
|
if (!owners.has(key)) return undefined;
|
|
return { enumerable: true, configurable: true };
|
|
},
|
|
});
|
|
return proxy;
|
|
}
|
|
|
|
global.XiaobaiState = Object.freeze({ create });
|
|
})(window);
|