ngrx-rtk-query
Version:
Angular RTK Query
52 lines • 6.24 kB
JavaScript
/**
* The code in this file is adapted from TanStack/query
*
* TanStack/query is an open-source project licensed under the MIT license.
*
* For more information about the original code, see
* https://github.com/TanStack/query
*/
import { computed, untracked } from '@angular/core';
/**
* Exposes fields of an object passed via an Angular `Signal` as `Computed` signals.
*
* Functions on the object are passed through as-is.
*
* @param signal - `Signal` that must return an object.
*
*/
export function signalProxy(signal) {
const internalState = {};
return new Proxy(internalState, {
get(target, prop) {
// first check if we have it in our internal state and return it
const computedField = target[prop];
if (computedField)
return computedField;
// then, check if it's a function on the resultState and return it
const targetField = untracked(signal)[prop];
if (typeof targetField === 'function')
return targetField;
// finally, create a computed field, store it and return it
// @ts-expect-error bypass
return (target[prop] = computed(() => signal()[prop]));
},
has(_, prop) {
return !!untracked(signal)[prop];
},
ownKeys() {
return Reflect.ownKeys(untracked(signal));
},
getOwnPropertyDescriptor() {
return {
enumerable: true,
configurable: true,
};
},
});
}
export function toDeepSignal(signal) {
const deepSignal = signalProxy(signal);
return Object.assign(signal, deepSignal);
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLXByb3h5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbmdyeC1ydGstcXVlcnkvY29yZS9zcmMvdXRpbHMvc2lnbmFsLXByb3h5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7O0dBT0c7QUFDSCxPQUFPLEVBQTJCLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFlN0U7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQXlDLE1BQWlCO0lBQ25GLE1BQU0sYUFBYSxHQUFHLEVBQW1CLENBQUM7SUFFMUMsT0FBTyxJQUFJLEtBQUssQ0FBZ0IsYUFBYSxFQUFFO1FBQzdDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSTtZQUNkLGdFQUFnRTtZQUNoRSxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkMsSUFBSSxhQUFhO2dCQUFFLE9BQU8sYUFBYSxDQUFDO1lBRXhDLGtFQUFrRTtZQUNsRSxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUMsSUFBSSxPQUFPLFdBQVcsS0FBSyxVQUFVO2dCQUFFLE9BQU8sV0FBVyxDQUFDO1lBRTFELDJEQUEyRDtZQUMzRCwwQkFBMEI7WUFDMUIsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7UUFDRCxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUk7WUFDVCxPQUFPLENBQUMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUNELE9BQU87WUFDTCxPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUMsQ0FBQztRQUNELHdCQUF3QjtZQUN0QixPQUFPO2dCQUNMLFVBQVUsRUFBRSxJQUFJO2dCQUNoQixZQUFZLEVBQUUsSUFBSTthQUNuQixDQUFDO1FBQ0osQ0FBQztLQUNGLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUF5QyxNQUFpQjtJQUNwRixNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBUaGUgY29kZSBpbiB0aGlzIGZpbGUgaXMgYWRhcHRlZCBmcm9tIFRhblN0YWNrL3F1ZXJ5XG4gKlxuICogVGFuU3RhY2svcXVlcnkgaXMgYW4gb3Blbi1zb3VyY2UgcHJvamVjdCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG4gKlxuICogRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIGNvZGUsIHNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL1RhblN0YWNrL3F1ZXJ5XG4gKi9cbmltcG9ydCB7IHR5cGUgU2lnbmFsIGFzIE5nU2lnbmFsLCBjb21wdXRlZCwgdW50cmFja2VkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbi8vIEFuIGV4dGVuZGVkIFNpZ25hbCB0eXBlIHRoYXQgZW5hYmxlcyB0aGUgY29ycmVjdCB0eXBpbmdcbi8vIG9mIG5lc3RlZCBzaWduYWxzIHdpdGggdGhlIGBuYW1lYCBvciBgbGVuZ3RoYCBrZXkuXG5leHBvcnQgaW50ZXJmYWNlIFNpZ25hbDxUPiBleHRlbmRzIE5nU2lnbmFsPFQ+IHtcbiAgbmFtZTogdW5rbm93bjtcbiAgbGVuZ3RoOiB1bmtub3duO1xufVxuXG5leHBvcnQgdHlwZSBTaWduYWxzTWFwPFQ+ID0gUmVxdWlyZWQ8e1xuICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIEZ1bmN0aW9uID8gVFtLXSA6IFNpZ25hbDxUW0tdPjtcbn0+O1xuXG5leHBvcnQgdHlwZSBEZWVwU2lnbmFsPFQ+ID0gU2lnbmFsPFQ+ICYgU2lnbmFsc01hcDxUPjtcblxuLyoqXG4gKiBFeHBvc2VzIGZpZWxkcyBvZiBhbiBvYmplY3QgcGFzc2VkIHZpYSBhbiBBbmd1bGFyIGBTaWduYWxgIGFzIGBDb21wdXRlZGAgc2lnbmFscy5cbiAqXG4gKiBGdW5jdGlvbnMgb24gdGhlIG9iamVjdCBhcmUgcGFzc2VkIHRocm91Z2ggYXMtaXMuXG4gKlxuICogQHBhcmFtIHNpZ25hbCAtIGBTaWduYWxgIHRoYXQgbXVzdCByZXR1cm4gYW4gb2JqZWN0LlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbFByb3h5PFQgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBhbnk+PihzaWduYWw6IFNpZ25hbDxUPik6IFNpZ25hbHNNYXA8VD4ge1xuICBjb25zdCBpbnRlcm5hbFN0YXRlID0ge30gYXMgU2lnbmFsc01hcDxUPjtcblxuICByZXR1cm4gbmV3IFByb3h5PFNpZ25hbHNNYXA8VD4+KGludGVybmFsU3RhdGUsIHtcbiAgICBnZXQodGFyZ2V0LCBwcm9wKSB7XG4gICAgICAvLyBmaXJzdCBjaGVjayBpZiB3ZSBoYXZlIGl0IGluIG91ciBpbnRlcm5hbCBzdGF0ZSBhbmQgcmV0dXJuIGl0XG4gICAgICBjb25zdCBjb21wdXRlZEZpZWxkID0gdGFyZ2V0W3Byb3BdO1xuICAgICAgaWYgKGNvbXB1dGVkRmllbGQpIHJldHVybiBjb21wdXRlZEZpZWxkO1xuXG4gICAgICAvLyB0aGVuLCBjaGVjayBpZiBpdCdzIGEgZnVuY3Rpb24gb24gdGhlIHJlc3VsdFN0YXRlIGFuZCByZXR1cm4gaXRcbiAgICAgIGNvbnN0IHRhcmdldEZpZWxkID0gdW50cmFja2VkKHNpZ25hbClbcHJvcF07XG4gICAgICBpZiAodHlwZW9mIHRhcmdldEZpZWxkID09PSAnZnVuY3Rpb24nKSByZXR1cm4gdGFyZ2V0RmllbGQ7XG5cbiAgICAgIC8vIGZpbmFsbHksIGNyZWF0ZSBhIGNvbXB1dGVkIGZpZWxkLCBzdG9yZSBpdCBhbmQgcmV0dXJuIGl0XG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGJ5cGFzc1xuICAgICAgcmV0dXJuICh0YXJnZXRbcHJvcF0gPSBjb21wdXRlZCgoKSA9PiBzaWduYWwoKVtwcm9wXSkpO1xuICAgIH0sXG4gICAgaGFzKF8sIHByb3ApIHtcbiAgICAgIHJldHVybiAhIXVudHJhY2tlZChzaWduYWwpW3Byb3BdO1xuICAgIH0sXG4gICAgb3duS2V5cygpIHtcbiAgICAgIHJldHVybiBSZWZsZWN0Lm93bktleXModW50cmFja2VkKHNpZ25hbCkpO1xuICAgIH0sXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgfTtcbiAgICB9LFxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvRGVlcFNpZ25hbDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgYW55Pj4oc2lnbmFsOiBTaWduYWw8VD4pOiBEZWVwU2lnbmFsPFQ+IHtcbiAgY29uc3QgZGVlcFNpZ25hbCA9IHNpZ25hbFByb3h5KHNpZ25hbCk7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKHNpZ25hbCwgZGVlcFNpZ25hbCk7XG59XG4iXX0=