// a bit terser code than I usually write but it's 10 LOC within 80 cols // if you are struggling to follow the code you can replace 1-char // references around with the following one, hoping that helps :-) // d => descriptors // k => key // p => promise // r => response const d = Object.getOwnPropertyDescriptors(Response.prototype); const isFunction = value => typeof value === 'function'; const bypass = (p, k, { get, value }) => get || !isFunction(value) ? p.then(r => r[k]) : (...args) => p.then(r => r[k](...args)); const direct = (p, value) => isFunction(value) ? value.bind(p) : value; const handler = { get: (p, k) => d.hasOwnProperty(k) ? bypass(p, k, d[k]) : direct(p, p[k]) }; /** * @param {RequestInfo | URL} input * @param {...RequestInit} init * @returns {Promise & Response} */ export default (input, ...init) => new Proxy(fetch(input, ...init), handler);