@tanstack/query-core
Version:
The framework agnostic core that powers TanStack Query
205 lines (204 loc) • 12.2 kB
JavaScript
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
const require_classPrivateFieldSet2 = require("./classPrivateFieldSet2-Bo0ZyOIv.cjs");
const require_utils = require("./utils.cjs");
const require_subscribable = require("./subscribable.cjs");
const require_notifyManager = require("./notifyManager.cjs");
const require_classPrivateMethodInitSpec = require("./classPrivateMethodInitSpec-DVhcLejn.cjs");
const require_queryObserver = require("./queryObserver.cjs");
//#region src/queriesObserver.ts
function difference(array1, array2) {
const excludeSet = new Set(array2);
return array1.filter((x) => !excludeSet.has(x));
}
var _client = /* @__PURE__ */ new WeakMap();
var _result = /* @__PURE__ */ new WeakMap();
var _queries = /* @__PURE__ */ new WeakMap();
var _options = /* @__PURE__ */ new WeakMap();
var _observers = /* @__PURE__ */ new WeakMap();
var _combinedResult = /* @__PURE__ */ new WeakMap();
var _lastCombine = /* @__PURE__ */ new WeakMap();
var _lastResult = /* @__PURE__ */ new WeakMap();
var _lastQueryHashes = /* @__PURE__ */ new WeakMap();
var _observerMatches = /* @__PURE__ */ new WeakMap();
var _QueriesObserver_brand = /* @__PURE__ */ new WeakSet();
var QueriesObserver = class extends require_subscribable.Subscribable {
constructor(client, queries, options) {
super();
require_classPrivateMethodInitSpec._classPrivateMethodInitSpec(this, _QueriesObserver_brand);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _client, void 0);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _result, void 0);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _queries, void 0);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _options, void 0);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _observers, void 0);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _combinedResult, void 0);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _lastCombine, void 0);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _lastResult, void 0);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _lastQueryHashes, void 0);
require_classPrivateFieldSet2._classPrivateFieldInitSpec(this, _observerMatches, []);
require_classPrivateFieldSet2._classPrivateFieldSet2(_client, this, client);
require_classPrivateFieldSet2._classPrivateFieldSet2(_options, this, options);
require_classPrivateFieldSet2._classPrivateFieldSet2(_queries, this, []);
require_classPrivateFieldSet2._classPrivateFieldSet2(_observers, this, []);
require_classPrivateFieldSet2._classPrivateFieldSet2(_result, this, []);
this.setQueries(queries);
}
onSubscribe() {
if (this.listeners.size === 1) require_classPrivateFieldSet2._classPrivateFieldGet2(_observers, this).forEach((observer) => {
observer.subscribe((result) => {
require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _onUpdate).call(this, observer, result);
});
});
}
onUnsubscribe() {
if (!this.listeners.size) this.destroy();
}
destroy() {
this.listeners = /* @__PURE__ */ new Set();
require_classPrivateFieldSet2._classPrivateFieldGet2(_observers, this).forEach((observer) => {
observer.destroy();
});
}
setQueries(queries, options) {
require_classPrivateFieldSet2._classPrivateFieldSet2(_queries, this, queries);
require_classPrivateFieldSet2._classPrivateFieldSet2(_options, this, options);
if (process.env.NODE_ENV !== "production") {
const queryHashes = queries.map((query) => require_classPrivateFieldSet2._classPrivateFieldGet2(_client, this).defaultQueryOptions(query).queryHash);
if (new Set(queryHashes).size !== queryHashes.length) console.warn("[QueriesObserver]: Duplicate Queries found. This might result in unexpected behavior.");
}
require_notifyManager.notifyManager.batch(() => {
const prevObservers = require_classPrivateFieldSet2._classPrivateFieldGet2(_observers, this);
const newObserverMatches = require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _findMatchingObservers).call(this, require_classPrivateFieldSet2._classPrivateFieldGet2(_queries, this));
newObserverMatches.forEach((match) => match.observer.setOptions(match.defaultedQueryOptions));
const newObservers = newObserverMatches.map((match) => match.observer);
const newResult = newObservers.map((observer) => observer.getCurrentResult());
const hasLengthChange = prevObservers.length !== newObservers.length;
const hasIndexChange = newObservers.some((observer, index) => observer !== prevObservers[index]);
const hasStructuralChange = hasLengthChange || hasIndexChange;
const hasResultChange = hasStructuralChange ? true : newResult.some((result, index) => {
const prev = require_classPrivateFieldSet2._classPrivateFieldGet2(_result, this)[index];
return !prev || !require_utils.shallowEqualObjects(result, prev);
});
if (!hasStructuralChange && !hasResultChange) return;
if (hasStructuralChange) {
require_classPrivateFieldSet2._classPrivateFieldSet2(_observerMatches, this, newObserverMatches);
require_classPrivateFieldSet2._classPrivateFieldSet2(_observers, this, newObservers);
}
require_classPrivateFieldSet2._classPrivateFieldSet2(_result, this, newResult);
if (!this.hasListeners()) return;
if (hasStructuralChange) {
difference(prevObservers, newObservers).forEach((observer) => {
observer.destroy();
});
difference(newObservers, prevObservers).forEach((observer) => {
observer.subscribe((result) => {
require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _onUpdate).call(this, observer, result);
});
});
}
require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _notify).call(this);
});
}
getCurrentResult() {
return require_classPrivateFieldSet2._classPrivateFieldGet2(_result, this);
}
getQueries() {
return require_classPrivateFieldSet2._classPrivateFieldGet2(_observers, this).map((observer) => observer.getCurrentQuery());
}
getObservers() {
return require_classPrivateFieldSet2._classPrivateFieldGet2(_observers, this);
}
getOptimisticResult(queries, combine) {
const matches = require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _findMatchingObservers).call(this, queries);
const result = matches.map((match) => match.observer.getOptimisticResult(match.defaultedQueryOptions));
const queryHashes = matches.map((match) => match.defaultedQueryOptions.queryHash);
return [
result,
(r) => {
return require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _combineResult).call(this, r ?? result, combine, queryHashes);
},
() => {
return require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _trackResult).call(this, result, matches);
}
];
}
};
function _trackResult(result, matches) {
const trackedProps = /* @__PURE__ */ new Set();
return matches.map((match, index) => {
const observerResult = result[index];
return !match.defaultedQueryOptions.notifyOnChangeProps ? match.observer.trackResult(observerResult, (accessedProp) => {
if (!trackedProps.has(accessedProp)) {
trackedProps.add(accessedProp);
matches.forEach((m) => {
m.observer.trackProp(accessedProp);
});
}
}) : observerResult;
});
}
function _combineResult(input, combine, queryHashes) {
if (combine) {
const lastHashes = require_classPrivateFieldSet2._classPrivateFieldGet2(_lastQueryHashes, this);
const queryHashesChanged = queryHashes !== void 0 && lastHashes !== void 0 && (lastHashes.length !== queryHashes.length || queryHashes.some((hash, i) => hash !== lastHashes[i]));
if (require_classPrivateFieldSet2._classPrivateFieldGet2(_result, this) !== require_classPrivateFieldSet2._classPrivateFieldGet2(_lastResult, this) || queryHashesChanged || combine !== require_classPrivateFieldSet2._classPrivateFieldGet2(_lastCombine, this)) {
require_classPrivateFieldSet2._classPrivateFieldSet2(_lastCombine, this, combine);
require_classPrivateFieldSet2._classPrivateFieldSet2(_lastResult, this, require_classPrivateFieldSet2._classPrivateFieldGet2(_result, this));
if (queryHashes !== void 0) require_classPrivateFieldSet2._classPrivateFieldSet2(_lastQueryHashes, this, queryHashes);
require_classPrivateFieldSet2._classPrivateFieldSet2(_combinedResult, this, require_utils.replaceEqualDeep(require_classPrivateFieldSet2._classPrivateFieldGet2(_combinedResult, this), combine(input)));
}
return require_classPrivateFieldSet2._classPrivateFieldGet2(_combinedResult, this);
}
return input;
}
function _shouldSkipCombine() {
var _classPrivateFieldGet2$1;
return !((_classPrivateFieldGet2$1 = require_classPrivateFieldSet2._classPrivateFieldGet2(_options, this)) === null || _classPrivateFieldGet2$1 === void 0 ? void 0 : _classPrivateFieldGet2$1.combine) || require_classPrivateFieldSet2._classPrivateFieldGet2(_observers, this).some((observer, index) => {
var _classPrivateFieldGet3;
return observer.options.suspense && ((_classPrivateFieldGet3 = require_classPrivateFieldSet2._classPrivateFieldGet2(_result, this)[index]) === null || _classPrivateFieldGet3 === void 0 ? void 0 : _classPrivateFieldGet3.data) === void 0;
});
}
function _findMatchingObservers(queries) {
const prevObserversMap = /* @__PURE__ */ new Map();
require_classPrivateFieldSet2._classPrivateFieldGet2(_observers, this).forEach((observer) => {
const key = observer.options.queryHash;
if (!key) return;
const previousObservers = prevObserversMap.get(key);
if (previousObservers) previousObservers.push(observer);
else prevObserversMap.set(key, [observer]);
});
const observers = [];
queries.forEach((options) => {
var _prevObserversMap$get;
const defaultedOptions = require_classPrivateFieldSet2._classPrivateFieldGet2(_client, this).defaultQueryOptions(options);
const observer = ((_prevObserversMap$get = prevObserversMap.get(defaultedOptions.queryHash)) === null || _prevObserversMap$get === void 0 ? void 0 : _prevObserversMap$get.shift()) ?? new require_queryObserver.QueryObserver(require_classPrivateFieldSet2._classPrivateFieldGet2(_client, this), defaultedOptions);
observers.push({
defaultedQueryOptions: defaultedOptions,
observer
});
});
return observers;
}
function _onUpdate(observer, result) {
const index = require_classPrivateFieldSet2._classPrivateFieldGet2(_observers, this).indexOf(observer);
if (index !== -1) {
require_classPrivateFieldSet2._classPrivateFieldSet2(_result, this, require_classPrivateFieldSet2._classPrivateFieldGet2(_result, this).slice());
require_classPrivateFieldSet2._classPrivateFieldGet2(_result, this)[index] = result;
require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _notify).call(this);
}
}
function _notify() {
if (this.hasListeners()) {
var _classPrivateFieldGet4;
const shouldSkipCombine = require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _shouldSkipCombine).call(this);
const previousResult = require_classPrivateFieldSet2._classPrivateFieldGet2(_combinedResult, this);
const newResult = shouldSkipCombine ? previousResult : require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _combineResult).call(this, require_classPrivateFieldSet2._assertClassBrand(_QueriesObserver_brand, this, _trackResult).call(this, require_classPrivateFieldSet2._classPrivateFieldGet2(_result, this), require_classPrivateFieldSet2._classPrivateFieldGet2(_observerMatches, this)), (_classPrivateFieldGet4 = require_classPrivateFieldSet2._classPrivateFieldGet2(_options, this)) === null || _classPrivateFieldGet4 === void 0 ? void 0 : _classPrivateFieldGet4.combine);
if (shouldSkipCombine || previousResult !== newResult) require_notifyManager.notifyManager.batch(() => {
this.listeners.forEach((listener) => {
listener(require_classPrivateFieldSet2._classPrivateFieldGet2(_result, this));
});
});
}
}
//#endregion
exports.QueriesObserver = QueriesObserver;
//# sourceMappingURL=queriesObserver.cjs.map