UNPKG

apiful

Version:

Extensible, typed API tooling

34 lines (33 loc) 1.17 kB
//#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 };