apiful
Version:
Extensible, typed API tooling
34 lines (33 loc) • 1.17 kB
JavaScript
//#region src/client.ts
function createClient(defaultOptions = {}) {
const client = (() => {});
client.defaultOptions = defaultOptions;
client._extensions = Object.create(null);
client.with = function(createExtension) {
const extension = createExtension(this);
if (typeof extension === "function") this._handler = extension;
else for (const key of Object.keys(extension)) this._extensions[key] = extension[key];
return new Proxy(this, {
get(target, prop, receiver) {
if (prop in target._extensions) return target._extensions[prop];
if (prop in target) return Reflect.get(target, prop, receiver);
return Reflect.get(extension, prop, receiver);
},
set(target, prop, value, receiver) {
if (prop in target._extensions) {
target._extensions[prop] = value;
return true;
}
if (prop in target) return Reflect.set(target, prop, value, receiver);
return Reflect.set(extension, prop, value, receiver);
},
apply(target, thisArg, args) {
if (target._handler) return target._handler(...args);
return Reflect.apply(target, thisArg, args);
}
});
};
return client;
}
//#endregion
export { createClient };