untracked-BKcld_ew.mjs 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. /**
  2. * @license Angular v19.2.13
  3. * (c) 2010-2025 Google LLC. https://angular.io/
  4. * License: MIT
  5. */
  6. /**
  7. * The default equality function used for `signal` and `computed`, which uses referential equality.
  8. */
  9. function defaultEquals(a, b) {
  10. return Object.is(a, b);
  11. }
  12. /**
  13. * The currently active consumer `ReactiveNode`, if running code in a reactive context.
  14. *
  15. * Change this via `setActiveConsumer`.
  16. */
  17. let activeConsumer = null;
  18. let inNotificationPhase = false;
  19. /**
  20. * Global epoch counter. Incremented whenever a source signal is set.
  21. */
  22. let epoch = 1;
  23. /**
  24. * Symbol used to tell `Signal`s apart from other functions.
  25. *
  26. * This can be used to auto-unwrap signals in various cases, or to auto-wrap non-signal values.
  27. */
  28. const SIGNAL = /* @__PURE__ */ Symbol('SIGNAL');
  29. function setActiveConsumer(consumer) {
  30. const prev = activeConsumer;
  31. activeConsumer = consumer;
  32. return prev;
  33. }
  34. function getActiveConsumer() {
  35. return activeConsumer;
  36. }
  37. function isInNotificationPhase() {
  38. return inNotificationPhase;
  39. }
  40. function isReactive(value) {
  41. return value[SIGNAL] !== undefined;
  42. }
  43. const REACTIVE_NODE = {
  44. version: 0,
  45. lastCleanEpoch: 0,
  46. dirty: false,
  47. producerNode: undefined,
  48. producerLastReadVersion: undefined,
  49. producerIndexOfThis: undefined,
  50. nextProducerIndex: 0,
  51. liveConsumerNode: undefined,
  52. liveConsumerIndexOfThis: undefined,
  53. consumerAllowSignalWrites: false,
  54. consumerIsAlwaysLive: false,
  55. kind: 'unknown',
  56. producerMustRecompute: () => false,
  57. producerRecomputeValue: () => { },
  58. consumerMarkedDirty: () => { },
  59. consumerOnSignalRead: () => { },
  60. };
  61. /**
  62. * Called by implementations when a producer's signal is read.
  63. */
  64. function producerAccessed(node) {
  65. if (inNotificationPhase) {
  66. throw new Error(typeof ngDevMode !== 'undefined' && ngDevMode
  67. ? `Assertion error: signal read during notification phase`
  68. : '');
  69. }
  70. if (activeConsumer === null) {
  71. // Accessed outside of a reactive context, so nothing to record.
  72. return;
  73. }
  74. activeConsumer.consumerOnSignalRead(node);
  75. // This producer is the `idx`th dependency of `activeConsumer`.
  76. const idx = activeConsumer.nextProducerIndex++;
  77. assertConsumerNode(activeConsumer);
  78. if (idx < activeConsumer.producerNode.length && activeConsumer.producerNode[idx] !== node) {
  79. // There's been a change in producers since the last execution of `activeConsumer`.
  80. // `activeConsumer.producerNode[idx]` holds a stale dependency which will be be removed and
  81. // replaced with `this`.
  82. //
  83. // If `activeConsumer` isn't live, then this is a no-op, since we can replace the producer in
  84. // `activeConsumer.producerNode` directly. However, if `activeConsumer` is live, then we need
  85. // to remove it from the stale producer's `liveConsumer`s.
  86. if (consumerIsLive(activeConsumer)) {
  87. const staleProducer = activeConsumer.producerNode[idx];
  88. producerRemoveLiveConsumerAtIndex(staleProducer, activeConsumer.producerIndexOfThis[idx]);
  89. // At this point, the only record of `staleProducer` is the reference at
  90. // `activeConsumer.producerNode[idx]` which will be overwritten below.
  91. }
  92. }
  93. if (activeConsumer.producerNode[idx] !== node) {
  94. // We're a new dependency of the consumer (at `idx`).
  95. activeConsumer.producerNode[idx] = node;
  96. // If the active consumer is live, then add it as a live consumer. If not, then use 0 as a
  97. // placeholder value.
  98. activeConsumer.producerIndexOfThis[idx] = consumerIsLive(activeConsumer)
  99. ? producerAddLiveConsumer(node, activeConsumer, idx)
  100. : 0;
  101. }
  102. activeConsumer.producerLastReadVersion[idx] = node.version;
  103. }
  104. /**
  105. * Increment the global epoch counter.
  106. *
  107. * Called by source producers (that is, not computeds) whenever their values change.
  108. */
  109. function producerIncrementEpoch() {
  110. epoch++;
  111. }
  112. /**
  113. * Ensure this producer's `version` is up-to-date.
  114. */
  115. function producerUpdateValueVersion(node) {
  116. if (consumerIsLive(node) && !node.dirty) {
  117. // A live consumer will be marked dirty by producers, so a clean state means that its version
  118. // is guaranteed to be up-to-date.
  119. return;
  120. }
  121. if (!node.dirty && node.lastCleanEpoch === epoch) {
  122. // Even non-live consumers can skip polling if they previously found themselves to be clean at
  123. // the current epoch, since their dependencies could not possibly have changed (such a change
  124. // would've increased the epoch).
  125. return;
  126. }
  127. if (!node.producerMustRecompute(node) && !consumerPollProducersForChange(node)) {
  128. // None of our producers report a change since the last time they were read, so no
  129. // recomputation of our value is necessary, and we can consider ourselves clean.
  130. producerMarkClean(node);
  131. return;
  132. }
  133. node.producerRecomputeValue(node);
  134. // After recomputing the value, we're no longer dirty.
  135. producerMarkClean(node);
  136. }
  137. /**
  138. * Propagate a dirty notification to live consumers of this producer.
  139. */
  140. function producerNotifyConsumers(node) {
  141. if (node.liveConsumerNode === undefined) {
  142. return;
  143. }
  144. // Prevent signal reads when we're updating the graph
  145. const prev = inNotificationPhase;
  146. inNotificationPhase = true;
  147. try {
  148. for (const consumer of node.liveConsumerNode) {
  149. if (!consumer.dirty) {
  150. consumerMarkDirty(consumer);
  151. }
  152. }
  153. }
  154. finally {
  155. inNotificationPhase = prev;
  156. }
  157. }
  158. /**
  159. * Whether this `ReactiveNode` in its producer capacity is currently allowed to initiate updates,
  160. * based on the current consumer context.
  161. */
  162. function producerUpdatesAllowed() {
  163. return activeConsumer?.consumerAllowSignalWrites !== false;
  164. }
  165. function consumerMarkDirty(node) {
  166. node.dirty = true;
  167. producerNotifyConsumers(node);
  168. node.consumerMarkedDirty?.(node);
  169. }
  170. function producerMarkClean(node) {
  171. node.dirty = false;
  172. node.lastCleanEpoch = epoch;
  173. }
  174. /**
  175. * Prepare this consumer to run a computation in its reactive context.
  176. *
  177. * Must be called by subclasses which represent reactive computations, before those computations
  178. * begin.
  179. */
  180. function consumerBeforeComputation(node) {
  181. node && (node.nextProducerIndex = 0);
  182. return setActiveConsumer(node);
  183. }
  184. /**
  185. * Finalize this consumer's state after a reactive computation has run.
  186. *
  187. * Must be called by subclasses which represent reactive computations, after those computations
  188. * have finished.
  189. */
  190. function consumerAfterComputation(node, prevConsumer) {
  191. setActiveConsumer(prevConsumer);
  192. if (!node ||
  193. node.producerNode === undefined ||
  194. node.producerIndexOfThis === undefined ||
  195. node.producerLastReadVersion === undefined) {
  196. return;
  197. }
  198. if (consumerIsLive(node)) {
  199. // For live consumers, we need to remove the producer -> consumer edge for any stale producers
  200. // which weren't dependencies after the recomputation.
  201. for (let i = node.nextProducerIndex; i < node.producerNode.length; i++) {
  202. producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);
  203. }
  204. }
  205. // Truncate the producer tracking arrays.
  206. // Perf note: this is essentially truncating the length to `node.nextProducerIndex`, but
  207. // benchmarking has shown that individual pop operations are faster.
  208. while (node.producerNode.length > node.nextProducerIndex) {
  209. node.producerNode.pop();
  210. node.producerLastReadVersion.pop();
  211. node.producerIndexOfThis.pop();
  212. }
  213. }
  214. /**
  215. * Determine whether this consumer has any dependencies which have changed since the last time
  216. * they were read.
  217. */
  218. function consumerPollProducersForChange(node) {
  219. assertConsumerNode(node);
  220. // Poll producers for change.
  221. for (let i = 0; i < node.producerNode.length; i++) {
  222. const producer = node.producerNode[i];
  223. const seenVersion = node.producerLastReadVersion[i];
  224. // First check the versions. A mismatch means that the producer's value is known to have
  225. // changed since the last time we read it.
  226. if (seenVersion !== producer.version) {
  227. return true;
  228. }
  229. // The producer's version is the same as the last time we read it, but it might itself be
  230. // stale. Force the producer to recompute its version (calculating a new value if necessary).
  231. producerUpdateValueVersion(producer);
  232. // Now when we do this check, `producer.version` is guaranteed to be up to date, so if the
  233. // versions still match then it has not changed since the last time we read it.
  234. if (seenVersion !== producer.version) {
  235. return true;
  236. }
  237. }
  238. return false;
  239. }
  240. /**
  241. * Disconnect this consumer from the graph.
  242. */
  243. function consumerDestroy(node) {
  244. assertConsumerNode(node);
  245. if (consumerIsLive(node)) {
  246. // Drop all connections from the graph to this node.
  247. for (let i = 0; i < node.producerNode.length; i++) {
  248. producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);
  249. }
  250. }
  251. // Truncate all the arrays to drop all connection from this node to the graph.
  252. node.producerNode.length =
  253. node.producerLastReadVersion.length =
  254. node.producerIndexOfThis.length =
  255. 0;
  256. if (node.liveConsumerNode) {
  257. node.liveConsumerNode.length = node.liveConsumerIndexOfThis.length = 0;
  258. }
  259. }
  260. /**
  261. * Add `consumer` as a live consumer of this node.
  262. *
  263. * Note that this operation is potentially transitive. If this node becomes live, then it becomes
  264. * a live consumer of all of its current producers.
  265. */
  266. function producerAddLiveConsumer(node, consumer, indexOfThis) {
  267. assertProducerNode(node);
  268. if (node.liveConsumerNode.length === 0 && isConsumerNode(node)) {
  269. // When going from 0 to 1 live consumers, we become a live consumer to our producers.
  270. for (let i = 0; i < node.producerNode.length; i++) {
  271. node.producerIndexOfThis[i] = producerAddLiveConsumer(node.producerNode[i], node, i);
  272. }
  273. }
  274. node.liveConsumerIndexOfThis.push(indexOfThis);
  275. return node.liveConsumerNode.push(consumer) - 1;
  276. }
  277. /**
  278. * Remove the live consumer at `idx`.
  279. */
  280. function producerRemoveLiveConsumerAtIndex(node, idx) {
  281. assertProducerNode(node);
  282. if (typeof ngDevMode !== 'undefined' && ngDevMode && idx >= node.liveConsumerNode.length) {
  283. throw new Error(`Assertion error: active consumer index ${idx} is out of bounds of ${node.liveConsumerNode.length} consumers)`);
  284. }
  285. if (node.liveConsumerNode.length === 1 && isConsumerNode(node)) {
  286. // When removing the last live consumer, we will no longer be live. We need to remove
  287. // ourselves from our producers' tracking (which may cause consumer-producers to lose
  288. // liveness as well).
  289. for (let i = 0; i < node.producerNode.length; i++) {
  290. producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);
  291. }
  292. }
  293. // Move the last value of `liveConsumers` into `idx`. Note that if there's only a single
  294. // live consumer, this is a no-op.
  295. const lastIdx = node.liveConsumerNode.length - 1;
  296. node.liveConsumerNode[idx] = node.liveConsumerNode[lastIdx];
  297. node.liveConsumerIndexOfThis[idx] = node.liveConsumerIndexOfThis[lastIdx];
  298. // Truncate the array.
  299. node.liveConsumerNode.length--;
  300. node.liveConsumerIndexOfThis.length--;
  301. // If the index is still valid, then we need to fix the index pointer from the producer to this
  302. // consumer, and update it from `lastIdx` to `idx` (accounting for the move above).
  303. if (idx < node.liveConsumerNode.length) {
  304. const idxProducer = node.liveConsumerIndexOfThis[idx];
  305. const consumer = node.liveConsumerNode[idx];
  306. assertConsumerNode(consumer);
  307. consumer.producerIndexOfThis[idxProducer] = idx;
  308. }
  309. }
  310. function consumerIsLive(node) {
  311. return node.consumerIsAlwaysLive || (node?.liveConsumerNode?.length ?? 0) > 0;
  312. }
  313. function assertConsumerNode(node) {
  314. node.producerNode ??= [];
  315. node.producerIndexOfThis ??= [];
  316. node.producerLastReadVersion ??= [];
  317. }
  318. function assertProducerNode(node) {
  319. node.liveConsumerNode ??= [];
  320. node.liveConsumerIndexOfThis ??= [];
  321. }
  322. function isConsumerNode(node) {
  323. return node.producerNode !== undefined;
  324. }
  325. /**
  326. * Create a computed signal which derives a reactive value from an expression.
  327. */
  328. function createComputed(computation, equal) {
  329. const node = Object.create(COMPUTED_NODE);
  330. node.computation = computation;
  331. if (equal !== undefined) {
  332. node.equal = equal;
  333. }
  334. const computed = () => {
  335. // Check if the value needs updating before returning it.
  336. producerUpdateValueVersion(node);
  337. // Record that someone looked at this signal.
  338. producerAccessed(node);
  339. if (node.value === ERRORED) {
  340. throw node.error;
  341. }
  342. return node.value;
  343. };
  344. computed[SIGNAL] = node;
  345. return computed;
  346. }
  347. /**
  348. * A dedicated symbol used before a computed value has been calculated for the first time.
  349. * Explicitly typed as `any` so we can use it as signal's value.
  350. */
  351. const UNSET = /* @__PURE__ */ Symbol('UNSET');
  352. /**
  353. * A dedicated symbol used in place of a computed signal value to indicate that a given computation
  354. * is in progress. Used to detect cycles in computation chains.
  355. * Explicitly typed as `any` so we can use it as signal's value.
  356. */
  357. const COMPUTING = /* @__PURE__ */ Symbol('COMPUTING');
  358. /**
  359. * A dedicated symbol used in place of a computed signal value to indicate that a given computation
  360. * failed. The thrown error is cached until the computation gets dirty again.
  361. * Explicitly typed as `any` so we can use it as signal's value.
  362. */
  363. const ERRORED = /* @__PURE__ */ Symbol('ERRORED');
  364. // Note: Using an IIFE here to ensure that the spread assignment is not considered
  365. // a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
  366. // TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
  367. const COMPUTED_NODE = /* @__PURE__ */ (() => {
  368. return {
  369. ...REACTIVE_NODE,
  370. value: UNSET,
  371. dirty: true,
  372. error: null,
  373. equal: defaultEquals,
  374. kind: 'computed',
  375. producerMustRecompute(node) {
  376. // Force a recomputation if there's no current value, or if the current value is in the
  377. // process of being calculated (which should throw an error).
  378. return node.value === UNSET || node.value === COMPUTING;
  379. },
  380. producerRecomputeValue(node) {
  381. if (node.value === COMPUTING) {
  382. // Our computation somehow led to a cyclic read of itself.
  383. throw new Error('Detected cycle in computations.');
  384. }
  385. const oldValue = node.value;
  386. node.value = COMPUTING;
  387. const prevConsumer = consumerBeforeComputation(node);
  388. let newValue;
  389. let wasEqual = false;
  390. try {
  391. newValue = node.computation();
  392. // We want to mark this node as errored if calling `equal` throws; however, we don't want
  393. // to track any reactive reads inside `equal`.
  394. setActiveConsumer(null);
  395. wasEqual =
  396. oldValue !== UNSET &&
  397. oldValue !== ERRORED &&
  398. newValue !== ERRORED &&
  399. node.equal(oldValue, newValue);
  400. }
  401. catch (err) {
  402. newValue = ERRORED;
  403. node.error = err;
  404. }
  405. finally {
  406. consumerAfterComputation(node, prevConsumer);
  407. }
  408. if (wasEqual) {
  409. // No change to `valueVersion` - old and new values are
  410. // semantically equivalent.
  411. node.value = oldValue;
  412. return;
  413. }
  414. node.value = newValue;
  415. node.version++;
  416. },
  417. };
  418. })();
  419. function defaultThrowError() {
  420. throw new Error();
  421. }
  422. let throwInvalidWriteToSignalErrorFn = defaultThrowError;
  423. function throwInvalidWriteToSignalError(node) {
  424. throwInvalidWriteToSignalErrorFn(node);
  425. }
  426. function setThrowInvalidWriteToSignalError(fn) {
  427. throwInvalidWriteToSignalErrorFn = fn;
  428. }
  429. /**
  430. * If set, called after `WritableSignal`s are updated.
  431. *
  432. * This hook can be used to achieve various effects, such as running effects synchronously as part
  433. * of setting a signal.
  434. */
  435. let postSignalSetFn = null;
  436. /**
  437. * Create a `Signal` that can be set or updated directly.
  438. */
  439. function createSignal(initialValue, equal) {
  440. const node = Object.create(SIGNAL_NODE);
  441. node.value = initialValue;
  442. if (equal !== undefined) {
  443. node.equal = equal;
  444. }
  445. const getter = (() => {
  446. producerAccessed(node);
  447. return node.value;
  448. });
  449. getter[SIGNAL] = node;
  450. return getter;
  451. }
  452. function setPostSignalSetFn(fn) {
  453. const prev = postSignalSetFn;
  454. postSignalSetFn = fn;
  455. return prev;
  456. }
  457. function signalSetFn(node, newValue) {
  458. if (!producerUpdatesAllowed()) {
  459. throwInvalidWriteToSignalError(node);
  460. }
  461. if (!node.equal(node.value, newValue)) {
  462. node.value = newValue;
  463. signalValueChanged(node);
  464. }
  465. }
  466. function signalUpdateFn(node, updater) {
  467. if (!producerUpdatesAllowed()) {
  468. throwInvalidWriteToSignalError(node);
  469. }
  470. signalSetFn(node, updater(node.value));
  471. }
  472. function runPostSignalSetFn() {
  473. postSignalSetFn?.();
  474. }
  475. // Note: Using an IIFE here to ensure that the spread assignment is not considered
  476. // a side-effect, ending up preserving `COMPUTED_NODE` and `REACTIVE_NODE`.
  477. // TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
  478. const SIGNAL_NODE = /* @__PURE__ */ (() => {
  479. return {
  480. ...REACTIVE_NODE,
  481. equal: defaultEquals,
  482. value: undefined,
  483. kind: 'signal',
  484. };
  485. })();
  486. function signalValueChanged(node) {
  487. node.version++;
  488. producerIncrementEpoch();
  489. producerNotifyConsumers(node);
  490. postSignalSetFn?.();
  491. }
  492. function createLinkedSignal(sourceFn, computationFn, equalityFn) {
  493. const node = Object.create(LINKED_SIGNAL_NODE);
  494. node.source = sourceFn;
  495. node.computation = computationFn;
  496. if (equalityFn != undefined) {
  497. node.equal = equalityFn;
  498. }
  499. const linkedSignalGetter = () => {
  500. // Check if the value needs updating before returning it.
  501. producerUpdateValueVersion(node);
  502. // Record that someone looked at this signal.
  503. producerAccessed(node);
  504. if (node.value === ERRORED) {
  505. throw node.error;
  506. }
  507. return node.value;
  508. };
  509. const getter = linkedSignalGetter;
  510. getter[SIGNAL] = node;
  511. return getter;
  512. }
  513. function linkedSignalSetFn(node, newValue) {
  514. producerUpdateValueVersion(node);
  515. signalSetFn(node, newValue);
  516. producerMarkClean(node);
  517. }
  518. function linkedSignalUpdateFn(node, updater) {
  519. producerUpdateValueVersion(node);
  520. signalUpdateFn(node, updater);
  521. producerMarkClean(node);
  522. }
  523. // Note: Using an IIFE here to ensure that the spread assignment is not considered
  524. // a side-effect, ending up preserving `LINKED_SIGNAL_NODE` and `REACTIVE_NODE`.
  525. // TODO: remove when https://github.com/evanw/esbuild/issues/3392 is resolved.
  526. const LINKED_SIGNAL_NODE = /* @__PURE__ */ (() => {
  527. return {
  528. ...REACTIVE_NODE,
  529. value: UNSET,
  530. dirty: true,
  531. error: null,
  532. equal: defaultEquals,
  533. kind: 'linkedSignal',
  534. producerMustRecompute(node) {
  535. // Force a recomputation if there's no current value, or if the current value is in the
  536. // process of being calculated (which should throw an error).
  537. return node.value === UNSET || node.value === COMPUTING;
  538. },
  539. producerRecomputeValue(node) {
  540. if (node.value === COMPUTING) {
  541. // Our computation somehow led to a cyclic read of itself.
  542. throw new Error('Detected cycle in computations.');
  543. }
  544. const oldValue = node.value;
  545. node.value = COMPUTING;
  546. const prevConsumer = consumerBeforeComputation(node);
  547. let newValue;
  548. try {
  549. const newSourceValue = node.source();
  550. const prev = oldValue === UNSET || oldValue === ERRORED
  551. ? undefined
  552. : {
  553. source: node.sourceValue,
  554. value: oldValue,
  555. };
  556. newValue = node.computation(newSourceValue, prev);
  557. node.sourceValue = newSourceValue;
  558. }
  559. catch (err) {
  560. newValue = ERRORED;
  561. node.error = err;
  562. }
  563. finally {
  564. consumerAfterComputation(node, prevConsumer);
  565. }
  566. if (oldValue !== UNSET && newValue !== ERRORED && node.equal(oldValue, newValue)) {
  567. // No change to `valueVersion` - old and new values are
  568. // semantically equivalent.
  569. node.value = oldValue;
  570. return;
  571. }
  572. node.value = newValue;
  573. node.version++;
  574. },
  575. };
  576. })();
  577. function setAlternateWeakRefImpl(impl) {
  578. // TODO: remove this function
  579. }
  580. /**
  581. * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
  582. * can, optionally, return a value.
  583. */
  584. function untracked(nonReactiveReadsFn) {
  585. const prevConsumer = setActiveConsumer(null);
  586. // We are not trying to catch any particular errors here, just making sure that the consumers
  587. // stack is restored in case of errors.
  588. try {
  589. return nonReactiveReadsFn();
  590. }
  591. finally {
  592. setActiveConsumer(prevConsumer);
  593. }
  594. }
  595. export { REACTIVE_NODE, SIGNAL, SIGNAL_NODE, consumerAfterComputation, consumerBeforeComputation, consumerDestroy, consumerMarkDirty, consumerPollProducersForChange, createComputed, createLinkedSignal, createSignal, defaultEquals, getActiveConsumer, isInNotificationPhase, isReactive, linkedSignalSetFn, linkedSignalUpdateFn, producerAccessed, producerIncrementEpoch, producerMarkClean, producerNotifyConsumers, producerUpdateValueVersion, producerUpdatesAllowed, runPostSignalSetFn, setActiveConsumer, setAlternateWeakRefImpl, setPostSignalSetFn, setThrowInvalidWriteToSignalError, signalSetFn, signalUpdateFn, untracked };
  596. //# sourceMappingURL=untracked-BKcld_ew.mjs.map