@angular/core 15.2.0-rc.0 → 16.0.0-next.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/esm2020/src/core.mjs +2 -1
  2. package/esm2020/src/core_reactivity_export.mjs +11 -0
  3. package/esm2020/src/core_reactivity_export_internal.mjs +9 -0
  4. package/esm2020/src/di/interface/defs.mjs +4 -5
  5. package/esm2020/src/di/provider_collection.mjs +2 -2
  6. package/esm2020/src/metadata/directives.mjs +1 -1
  7. package/esm2020/src/render/api_flags.mjs +1 -1
  8. package/esm2020/src/signals/index.mjs +15 -0
  9. package/esm2020/src/signals/src/api.mjs +46 -0
  10. package/esm2020/src/signals/src/computed.mjs +142 -0
  11. package/esm2020/src/signals/src/effect.mjs +69 -0
  12. package/esm2020/src/signals/src/graph.mjs +114 -0
  13. package/esm2020/src/signals/src/signal.mjs +78 -0
  14. package/esm2020/src/signals/src/untracked.mjs +26 -0
  15. package/esm2020/src/signals/src/watch.mjs +54 -0
  16. package/esm2020/src/signals/src/weak_ref.mjs +11 -0
  17. package/esm2020/src/version.mjs +1 -1
  18. package/esm2020/testing/src/logger.mjs +3 -3
  19. package/esm2020/testing/src/ng_zone_mock.mjs +3 -3
  20. package/fesm2015/core.mjs +483 -7
  21. package/fesm2015/core.mjs.map +1 -1
  22. package/fesm2015/testing.mjs +5 -6
  23. package/fesm2015/testing.mjs.map +1 -1
  24. package/fesm2020/core.mjs +481 -7
  25. package/fesm2020/core.mjs.map +1 -1
  26. package/fesm2020/testing.mjs +5 -6
  27. package/fesm2020/testing.mjs.map +1 -1
  28. package/index.d.ts +287 -3
  29. package/package.json +1 -1
  30. package/schematics/ng-generate/standalone-migration/bundle.js +608 -804
  31. package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
  32. package/testing/index.d.ts +1 -1
  33. package/esm2020/src/view/index.mjs +0 -9
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ /**
9
+ * Symbol used to tell `Signal`s apart from other functions.
10
+ *
11
+ * This can be used to auto-unwrap signals in various cases, or to auto-wrap non-signal values.
12
+ */
13
+ const SIGNAL = Symbol('SIGNAL');
14
+ /**
15
+ * Checks if the given `value` function is a reactive `Signal`.
16
+ */
17
+ export function isSignal(value) {
18
+ return value[SIGNAL] ?? false;
19
+ }
20
+ /**
21
+ * Converts `fn` into a marked signal function (where `isSignal(fn)` will be `true`), and
22
+ * potentially add some set of extra properties (passed as an object record `extraApi`).
23
+ */
24
+ export function createSignalFromFunction(fn, extraApi = {}) {
25
+ fn[SIGNAL] = true;
26
+ // Copy properties from `extraApi` to `fn` to complete the desired API of the `Signal`.
27
+ return Object.assign(fn, extraApi);
28
+ }
29
+ /**
30
+ * The default equality function used for `signal` and `computed`, which treats objects and arrays
31
+ * as never equal, and all other primitive values using identity semantics.
32
+ *
33
+ * This allows signals to hold non-primitive values (arrays, objects, other collections) and still
34
+ * propagate change notification upon explicit mutation without identity change.
35
+ *
36
+ * @developerPreview
37
+ */
38
+ export function defaultEquals(a, b) {
39
+ // `Object.is` compares two values using identity semantics which is desired behavior for
40
+ // primitive values. If `Object.is` determines two values to be equal we need to make sure that
41
+ // those don't represent objects (we want to make sure that 2 objects are always considered
42
+ // "unequal"). The null check is needed for the special case of JavaScript reporting null values
43
+ // as objects (`typeof null === 'object'`).
44
+ return (a === null || typeof a !== 'object') && Object.is(a, b);
45
+ }
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFscy9zcmMvYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7QUFnQmhDOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxLQUFlO0lBQ3RDLE9BQVEsS0FBeUIsQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUM7QUFDckQsQ0FBQztBQW9CRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQ3BDLEVBQVcsRUFBRSxXQUFlLEVBQVE7SUFDckMsRUFBVSxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMzQix1RkFBdUY7SUFDdkYsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQW1CLENBQUM7QUFDdkQsQ0FBQztBQVNEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUN6Qyx5RkFBeUY7SUFDekYsK0ZBQStGO0lBQy9GLDJGQUEyRjtJQUMzRixnR0FBZ0c7SUFDaEcsMkNBQTJDO0lBQzNDLE9BQU8sQ0FBQyxDQUFDLEtBQUssSUFBSSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuLyoqXG4gKiBTeW1ib2wgdXNlZCB0byB0ZWxsIGBTaWduYWxgcyBhcGFydCBmcm9tIG90aGVyIGZ1bmN0aW9ucy5cbiAqXG4gKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGF1dG8tdW53cmFwIHNpZ25hbHMgaW4gdmFyaW91cyBjYXNlcywgb3IgdG8gYXV0by13cmFwIG5vbi1zaWduYWwgdmFsdWVzLlxuICovXG5jb25zdCBTSUdOQUwgPSBTeW1ib2woJ1NJR05BTCcpO1xuXG4vKipcbiAqIEEgcmVhY3RpdmUgdmFsdWUgd2hpY2ggbm90aWZpZXMgY29uc3VtZXJzIG9mIGFueSBjaGFuZ2VzLlxuICpcbiAqIFNpZ25hbHMgYXJlIGZ1bmN0aW9ucyB3aGljaCByZXR1cm5zIHRoZWlyIGN1cnJlbnQgdmFsdWUuIFRvIGFjY2VzcyB0aGUgY3VycmVudCB2YWx1ZSBvZiBhIHNpZ25hbCxcbiAqIGNhbGwgaXQuXG4gKlxuICogT3JkaW5hcnkgdmFsdWVzIGNhbiBiZSB0dXJuZWQgaW50byBgU2lnbmFsYHMgd2l0aCB0aGUgYHNpZ25hbGAgZnVuY3Rpb24uXG4gKlxuICogQGRldmVsb3BlclByZXZpZXdcbiAqL1xuZXhwb3J0IHR5cGUgU2lnbmFsPFQ+ID0gKCgpID0+IFQpJntcbiAgW1NJR05BTF06IHRydWU7XG59O1xuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gYHZhbHVlYCBmdW5jdGlvbiBpcyBhIHJlYWN0aXZlIGBTaWduYWxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNTaWduYWwodmFsdWU6IEZ1bmN0aW9uKTogdmFsdWUgaXMgU2lnbmFsPHVua25vd24+IHtcbiAgcmV0dXJuICh2YWx1ZSBhcyBTaWduYWw8dW5rbm93bj4pW1NJR05BTF0gPz8gZmFsc2U7XG59XG5cbi8qKlxuICogQ29udmVydHMgYGZuYCBpbnRvIGEgbWFya2VkIHNpZ25hbCBmdW5jdGlvbiAod2hlcmUgYGlzU2lnbmFsKGZuKWAgd2lsbCBiZSBgdHJ1ZWApLlxuICpcbiAqIEBwYXJhbSBmbiBBIHplcm8tYXJndW1lbnQgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjb252ZXJ0ZWQgaW50byBhIGBTaWduYWxgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2lnbmFsRnJvbUZ1bmN0aW9uPFQ+KGZuOiAoKSA9PiBUKTogU2lnbmFsPFQ+O1xuXG4vKipcbiAqIENvbnZlcnRzIGBmbmAgaW50byBhIG1hcmtlZCBzaWduYWwgZnVuY3Rpb24gKHdoZXJlIGBpc1NpZ25hbChmbilgIHdpbGwgYmUgYHRydWVgKSwgYW5kXG4gKiBwb3RlbnRpYWxseSBhZGQgc29tZSBzZXQgb2YgZXh0cmEgcHJvcGVydGllcyAocGFzc2VkIGFzIGFuIG9iamVjdCByZWNvcmQgYGV4dHJhQXBpYCkuXG4gKlxuICogQHBhcmFtIGZuIEEgemVyby1hcmd1bWVudCBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgYFNpZ25hbGAuXG4gKiBAcGFyYW0gZXh0cmFBcGkgQW4gb2JqZWN0IHdob3NlIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgb250byBgZm5gIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHNwZWNpZmljXG4gKiAgICAgZGVzaXJlZCBpbnRlcmZhY2UgZm9yIHRoZSBgU2lnbmFsYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpZ25hbEZyb21GdW5jdGlvbjxULCBVIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICAgIGZuOiAoKSA9PiBULCBleHRyYUFwaTogVSk6IFNpZ25hbDxUPiZVO1xuXG4vKipcbiAqIENvbnZlcnRzIGBmbmAgaW50byBhIG1hcmtlZCBzaWduYWwgZnVuY3Rpb24gKHdoZXJlIGBpc1NpZ25hbChmbilgIHdpbGwgYmUgYHRydWVgKSwgYW5kXG4gKiBwb3RlbnRpYWxseSBhZGQgc29tZSBzZXQgb2YgZXh0cmEgcHJvcGVydGllcyAocGFzc2VkIGFzIGFuIG9iamVjdCByZWNvcmQgYGV4dHJhQXBpYCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTaWduYWxGcm9tRnVuY3Rpb248VCwgVSBleHRlbmRzIFJlY29yZDxzdHJpbmcsIHVua25vd24+ID0ge30+KFxuICAgIGZuOiAoKSA9PiBULCBleHRyYUFwaTogVSA9ICh7fSBhcyBVKSk6IFNpZ25hbDxUPiZVIHtcbiAgKGZuIGFzIGFueSlbU0lHTkFMXSA9IHRydWU7XG4gIC8vIENvcHkgcHJvcGVydGllcyBmcm9tIGBleHRyYUFwaWAgdG8gYGZuYCB0byBjb21wbGV0ZSB0aGUgZGVzaXJlZCBBUEkgb2YgdGhlIGBTaWduYWxgLlxuICByZXR1cm4gT2JqZWN0LmFzc2lnbihmbiwgZXh0cmFBcGkpIGFzIChTaWduYWw8VD4mIFUpO1xufVxuXG4vKipcbiAqIEEgY29tcGFyaXNvbiBmdW5jdGlvbiB3aGljaCBjYW4gZGV0ZXJtaW5lIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsLlxuICpcbiAqIEBkZXZlbG9wZXJQcmV2aWV3XG4gKi9cbmV4cG9ydCB0eXBlIFZhbHVlRXF1YWxpdHlGbjxUPiA9IChhOiBULCBiOiBUKSA9PiBib29sZWFuO1xuXG4vKipcbiAqIFRoZSBkZWZhdWx0IGVxdWFsaXR5IGZ1bmN0aW9uIHVzZWQgZm9yIGBzaWduYWxgIGFuZCBgY29tcHV0ZWRgLCB3aGljaCB0cmVhdHMgb2JqZWN0cyBhbmQgYXJyYXlzXG4gKiBhcyBuZXZlciBlcXVhbCwgYW5kIGFsbCBvdGhlciBwcmltaXRpdmUgdmFsdWVzIHVzaW5nIGlkZW50aXR5IHNlbWFudGljcy5cbiAqXG4gKiBUaGlzIGFsbG93cyBzaWduYWxzIHRvIGhvbGQgbm9uLXByaW1pdGl2ZSB2YWx1ZXMgKGFycmF5cywgb2JqZWN0cywgb3RoZXIgY29sbGVjdGlvbnMpIGFuZCBzdGlsbFxuICogcHJvcGFnYXRlIGNoYW5nZSBub3RpZmljYXRpb24gdXBvbiBleHBsaWNpdCBtdXRhdGlvbiB3aXRob3V0IGlkZW50aXR5IGNoYW5nZS5cbiAqXG4gKiBAZGV2ZWxvcGVyUHJldmlld1xuICovXG5leHBvcnQgZnVuY3Rpb24gZGVmYXVsdEVxdWFsczxUPihhOiBULCBiOiBUKSB7XG4gIC8vIGBPYmplY3QuaXNgIGNvbXBhcmVzIHR3byB2YWx1ZXMgdXNpbmcgaWRlbnRpdHkgc2VtYW50aWNzIHdoaWNoIGlzIGRlc2lyZWQgYmVoYXZpb3IgZm9yXG4gIC8vIHByaW1pdGl2ZSB2YWx1ZXMuIElmIGBPYmplY3QuaXNgIGRldGVybWluZXMgdHdvIHZhbHVlcyB0byBiZSBlcXVhbCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0XG4gIC8vIHRob3NlIGRvbid0IHJlcHJlc2VudCBvYmplY3RzICh3ZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IDIgb2JqZWN0cyBhcmUgYWx3YXlzIGNvbnNpZGVyZWRcbiAgLy8gXCJ1bmVxdWFsXCIpLiBUaGUgbnVsbCBjaGVjayBpcyBuZWVkZWQgZm9yIHRoZSBzcGVjaWFsIGNhc2Ugb2YgSmF2YVNjcmlwdCByZXBvcnRpbmcgbnVsbCB2YWx1ZXNcbiAgLy8gYXMgb2JqZWN0cyAoYHR5cGVvZiBudWxsID09PSAnb2JqZWN0J2ApLlxuICByZXR1cm4gKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09ICdvYmplY3QnKSAmJiBPYmplY3QuaXMoYSwgYik7XG59XG4iXX0=
@@ -0,0 +1,142 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { createSignalFromFunction, defaultEquals } from './api';
9
+ import { consumerPollValueStatus, nextReactiveId, producerAccessed, producerNotifyConsumers, setActiveConsumer } from './graph';
10
+ import { WeakRef } from './weak_ref';
11
+ /**
12
+ * Create a computed `Signal` which derives a reactive value from an expression.
13
+ *
14
+ * @developerPreview
15
+ */
16
+ export function computed(computation, equal = defaultEquals) {
17
+ const node = new ComputedImpl(computation, equal);
18
+ return createSignalFromFunction(node.signal.bind(node));
19
+ }
20
+ /**
21
+ * A dedicated symbol used before a computed value has been calculated for the first time.
22
+ * Explicitly typed as `any` so we can use it as signal's value.
23
+ */
24
+ const UNSET = Symbol('UNSET');
25
+ /**
26
+ * A dedicated symbol used in place of a computed signal value to indicate that a given computation
27
+ * is in progress. Used to detect cycles in computation chains.
28
+ * Explicitly typed as `any` so we can use it as signal's value.
29
+ */
30
+ const COMPUTING = Symbol('COMPUTING');
31
+ /**
32
+ * A dedicated symbol used in place of a computed signal value to indicate that a given computation
33
+ * failed. The thrown error is cached until the computation gets dirty again.
34
+ * Explicitly typed as `any` so we can use it as signal's value.
35
+ */
36
+ const ERRORED = Symbol('ERRORED');
37
+ /**
38
+ * A computation, which derives a value from a declarative reactive expression.
39
+ *
40
+ * `Computed`s are both `Producer`s and `Consumer`s of reactivity.
41
+ */
42
+ class ComputedImpl {
43
+ constructor(computation, equal) {
44
+ this.computation = computation;
45
+ this.equal = equal;
46
+ /**
47
+ * Current value of the computation.
48
+ *
49
+ * This can also be one of the special values `UNSET`, `COMPUTING`, or `ERRORED`.
50
+ */
51
+ this.value = UNSET;
52
+ /**
53
+ * If `value` is `ERRORED`, the error caught from the last computation attempt which will
54
+ * be re-thrown.
55
+ */
56
+ this.error = null;
57
+ /**
58
+ * Flag indicating that the computation is currently stale, meaning that one of the
59
+ * dependencies has notified of a potential change.
60
+ *
61
+ * It's possible that no dependency has _actually_ changed, in which case the `stale`
62
+ * state can be resolved without recomputing the value.
63
+ */
64
+ this.stale = true;
65
+ this.id = nextReactiveId();
66
+ this.ref = new WeakRef(this);
67
+ this.producers = new Map();
68
+ this.consumers = new Map();
69
+ this.trackingVersion = 0;
70
+ this.valueVersion = 0;
71
+ }
72
+ checkForChangedValue() {
73
+ if (!this.stale) {
74
+ // The current value and its version are already up to date.
75
+ return;
76
+ }
77
+ // The current value is stale. Check whether we need to produce a new one.
78
+ if (this.value !== UNSET && this.value !== COMPUTING && !consumerPollValueStatus(this)) {
79
+ // Even though we were previously notified of a potential dependency update, all of
80
+ // our dependencies report that they have not actually changed in value, so we can
81
+ // resolve the stale state without needing to recompute the current value.
82
+ this.stale = false;
83
+ return;
84
+ }
85
+ // The current value is stale, and needs to be recomputed. It still may not change -
86
+ // that depends on whether the newly computed value is equal to the old.
87
+ this.recomputeValue();
88
+ }
89
+ recomputeValue() {
90
+ if (this.value === COMPUTING) {
91
+ // Our computation somehow led to a cyclic read of itself.
92
+ throw new Error('Detected cycle in computations.');
93
+ }
94
+ const oldValue = this.value;
95
+ this.value = COMPUTING;
96
+ // As we're re-running the computation, update our dependent tracking version number.
97
+ this.trackingVersion++;
98
+ const prevConsumer = setActiveConsumer(this);
99
+ let newValue;
100
+ try {
101
+ newValue = this.computation();
102
+ }
103
+ catch (err) {
104
+ newValue = ERRORED;
105
+ this.error = err;
106
+ }
107
+ finally {
108
+ setActiveConsumer(prevConsumer);
109
+ }
110
+ this.stale = false;
111
+ if (oldValue !== UNSET && oldValue !== ERRORED && newValue !== ERRORED &&
112
+ this.equal(oldValue, newValue)) {
113
+ // No change to `valueVersion` - old and new values are
114
+ // semantically equivalent.
115
+ this.value = oldValue;
116
+ return;
117
+ }
118
+ this.value = newValue;
119
+ this.valueVersion++;
120
+ }
121
+ notify() {
122
+ if (this.stale) {
123
+ // We've already notified consumers that this value has potentially changed.
124
+ return;
125
+ }
126
+ // Record that the currently cached value may be stale.
127
+ this.stale = true;
128
+ // Notify any consumers about the potential change.
129
+ producerNotifyConsumers(this);
130
+ }
131
+ signal() {
132
+ // Check if the value needs updating before returning it.
133
+ this.checkForChangedValue();
134
+ // Record that someone looked at this signal.
135
+ producerAccessed(this);
136
+ if (this.value === ERRORED) {
137
+ throw this.error;
138
+ }
139
+ return this.value;
140
+ }
141
+ }
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9zaWduYWxzL3NyYy9jb21wdXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsd0JBQXdCLEVBQUUsYUFBYSxFQUEwQixNQUFNLE9BQU8sQ0FBQztBQUN2RixPQUFPLEVBQXVCLHVCQUF1QixFQUFRLGNBQWMsRUFBWSxnQkFBZ0IsRUFBYyx1QkFBdUIsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNoTCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixXQUFvQixFQUFFLFFBQTRCLGFBQWE7SUFDakUsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xELE9BQU8sd0JBQXdCLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxLQUFLLEdBQVEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRW5DOzs7O0dBSUc7QUFDSCxNQUFNLFNBQVMsR0FBUSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxHQUFRLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV2Qzs7OztHQUlHO0FBQ0gsTUFBTSxZQUFZO0lBOEJoQixZQUFvQixXQUFvQixFQUFVLEtBQTRDO1FBQTFFLGdCQUFXLEdBQVgsV0FBVyxDQUFTO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBdUM7UUE3QjlGOzs7O1dBSUc7UUFDSyxVQUFLLEdBQU0sS0FBSyxDQUFDO1FBRXpCOzs7V0FHRztRQUNLLFVBQUssR0FBWSxJQUFJLENBQUM7UUFFOUI7Ozs7OztXQU1HO1FBQ0ssVUFBSyxHQUFHLElBQUksQ0FBQztRQUVaLE9BQUUsR0FBRyxjQUFjLEVBQUUsQ0FBQztRQUN0QixRQUFHLEdBQUcsSUFBSSxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDeEIsY0FBUyxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO1FBQ3hDLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztRQUNqRCxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUNwQixpQkFBWSxHQUFHLENBQUMsQ0FBQztJQUVnRixDQUFDO0lBRWxHLG9CQUFvQjtRQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLDREQUE0RDtZQUM1RCxPQUFPO1NBQ1I7UUFFRCwwRUFBMEU7UUFFMUUsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3RGLG1GQUFtRjtZQUNuRixrRkFBa0Y7WUFDbEYsMEVBQTBFO1lBQzFFLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO1lBQ25CLE9BQU87U0FDUjtRQUVELG9GQUFvRjtRQUNwRix3RUFBd0U7UUFDeEUsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxjQUFjO1FBQ3BCLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7WUFDNUIsMERBQTBEO1lBQzFELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNwRDtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxTQUFTLENBQUM7UUFFdkIscUZBQXFGO1FBQ3JGLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixNQUFNLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM3QyxJQUFJLFFBQVcsQ0FBQztRQUNoQixJQUFJO1lBQ0YsUUFBUSxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztTQUMvQjtRQUFDLE9BQU8sR0FBRyxFQUFFO1lBQ1osUUFBUSxHQUFHLE9BQU8sQ0FBQztZQUNuQixJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQztTQUNsQjtnQkFBUztZQUNSLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2pDO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxRQUFRLEtBQUssS0FBSyxJQUFJLFFBQVEsS0FBSyxPQUFPLElBQUksUUFBUSxLQUFLLE9BQU87WUFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLEVBQUU7WUFDbEMsdURBQXVEO1lBQ3ZELDJCQUEyQjtZQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztZQUN0QixPQUFPO1NBQ1I7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztRQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEIsQ0FBQztJQUVELE1BQU07UUFDSixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZCw0RUFBNEU7WUFDNUUsT0FBTztTQUNSO1FBRUQsdURBQXVEO1FBQ3ZELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRWxCLG1EQUFtRDtRQUNuRCx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTTtRQUNKLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUU1Qiw2Q0FBNkM7UUFDN0MsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdkIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFBRTtZQUMxQixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDbEI7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Y3JlYXRlU2lnbmFsRnJvbUZ1bmN0aW9uLCBkZWZhdWx0RXF1YWxzLCBTaWduYWwsIFZhbHVlRXF1YWxpdHlGbn0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHtDb25zdW1lciwgQ29uc3VtZXJJZCwgY29uc3VtZXJQb2xsVmFsdWVTdGF0dXMsIEVkZ2UsIG5leHRSZWFjdGl2ZUlkLCBQcm9kdWNlciwgcHJvZHVjZXJBY2Nlc3NlZCwgUHJvZHVjZXJJZCwgcHJvZHVjZXJOb3RpZnlDb25zdW1lcnMsIHNldEFjdGl2ZUNvbnN1bWVyfSBmcm9tICcuL2dyYXBoJztcbmltcG9ydCB7V2Vha1JlZn0gZnJvbSAnLi93ZWFrX3JlZic7XG5cbi8qKlxuICogQ3JlYXRlIGEgY29tcHV0ZWQgYFNpZ25hbGAgd2hpY2ggZGVyaXZlcyBhIHJlYWN0aXZlIHZhbHVlIGZyb20gYW4gZXhwcmVzc2lvbi5cbiAqXG4gKiBAZGV2ZWxvcGVyUHJldmlld1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZWQ8VD4oXG4gICAgY29tcHV0YXRpb246ICgpID0+IFQsIGVxdWFsOiBWYWx1ZUVxdWFsaXR5Rm48VD4gPSBkZWZhdWx0RXF1YWxzKTogU2lnbmFsPFQ+IHtcbiAgY29uc3Qgbm9kZSA9IG5ldyBDb21wdXRlZEltcGwoY29tcHV0YXRpb24sIGVxdWFsKTtcbiAgcmV0dXJuIGNyZWF0ZVNpZ25hbEZyb21GdW5jdGlvbihub2RlLnNpZ25hbC5iaW5kKG5vZGUpKTtcbn1cblxuLyoqXG4gKiBBIGRlZGljYXRlZCBzeW1ib2wgdXNlZCBiZWZvcmUgYSBjb21wdXRlZCB2YWx1ZSBoYXMgYmVlbiBjYWxjdWxhdGVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAqIEV4cGxpY2l0bHkgdHlwZWQgYXMgYGFueWAgc28gd2UgY2FuIHVzZSBpdCBhcyBzaWduYWwncyB2YWx1ZS5cbiAqL1xuY29uc3QgVU5TRVQ6IGFueSA9IFN5bWJvbCgnVU5TRVQnKTtcblxuLyoqXG4gKiBBIGRlZGljYXRlZCBzeW1ib2wgdXNlZCBpbiBwbGFjZSBvZiBhIGNvbXB1dGVkIHNpZ25hbCB2YWx1ZSB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gY29tcHV0YXRpb25cbiAqIGlzIGluIHByb2dyZXNzLiBVc2VkIHRvIGRldGVjdCBjeWNsZXMgaW4gY29tcHV0YXRpb24gY2hhaW5zLlxuICogRXhwbGljaXRseSB0eXBlZCBhcyBgYW55YCBzbyB3ZSBjYW4gdXNlIGl0IGFzIHNpZ25hbCdzIHZhbHVlLlxuICovXG5jb25zdCBDT01QVVRJTkc6IGFueSA9IFN5bWJvbCgnQ09NUFVUSU5HJyk7XG5cbi8qKlxuICogQSBkZWRpY2F0ZWQgc3ltYm9sIHVzZWQgaW4gcGxhY2Ugb2YgYSBjb21wdXRlZCBzaWduYWwgdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIGNvbXB1dGF0aW9uXG4gKiBmYWlsZWQuIFRoZSB0aHJvd24gZXJyb3IgaXMgY2FjaGVkIHVudGlsIHRoZSBjb21wdXRhdGlvbiBnZXRzIGRpcnR5IGFnYWluLlxuICogRXhwbGljaXRseSB0eXBlZCBhcyBgYW55YCBzbyB3ZSBjYW4gdXNlIGl0IGFzIHNpZ25hbCdzIHZhbHVlLlxuICovXG5jb25zdCBFUlJPUkVEOiBhbnkgPSBTeW1ib2woJ0VSUk9SRUQnKTtcblxuLyoqXG4gKiBBIGNvbXB1dGF0aW9uLCB3aGljaCBkZXJpdmVzIGEgdmFsdWUgZnJvbSBhIGRlY2xhcmF0aXZlIHJlYWN0aXZlIGV4cHJlc3Npb24uXG4gKlxuICogYENvbXB1dGVkYHMgYXJlIGJvdGggYFByb2R1Y2VyYHMgYW5kIGBDb25zdW1lcmBzIG9mIHJlYWN0aXZpdHkuXG4gKi9cbmNsYXNzIENvbXB1dGVkSW1wbDxUPiBpbXBsZW1lbnRzIFByb2R1Y2VyLCBDb25zdW1lciB7XG4gIC8qKlxuICAgKiBDdXJyZW50IHZhbHVlIG9mIHRoZSBjb21wdXRhdGlvbi5cbiAgICpcbiAgICogVGhpcyBjYW4gYWxzbyBiZSBvbmUgb2YgdGhlIHNwZWNpYWwgdmFsdWVzIGBVTlNFVGAsIGBDT01QVVRJTkdgLCBvciBgRVJST1JFRGAuXG4gICAqL1xuICBwcml2YXRlIHZhbHVlOiBUID0gVU5TRVQ7XG5cbiAgLyoqXG4gICAqIElmIGB2YWx1ZWAgaXMgYEVSUk9SRURgLCB0aGUgZXJyb3IgY2F1Z2h0IGZyb20gdGhlIGxhc3QgY29tcHV0YXRpb24gYXR0ZW1wdCB3aGljaCB3aWxsXG4gICAqIGJlIHJlLXRocm93bi5cbiAgICovXG4gIHByaXZhdGUgZXJyb3I6IHVua25vd24gPSBudWxsO1xuXG4gIC8qKlxuICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGUgY29tcHV0YXRpb24gaXMgY3VycmVudGx5IHN0YWxlLCBtZWFuaW5nIHRoYXQgb25lIG9mIHRoZVxuICAgKiBkZXBlbmRlbmNpZXMgaGFzIG5vdGlmaWVkIG9mIGEgcG90ZW50aWFsIGNoYW5nZS5cbiAgICpcbiAgICogSXQncyBwb3NzaWJsZSB0aGF0IG5vIGRlcGVuZGVuY3kgaGFzIF9hY3R1YWxseV8gY2hhbmdlZCwgaW4gd2hpY2ggY2FzZSB0aGUgYHN0YWxlYFxuICAgKiBzdGF0ZSBjYW4gYmUgcmVzb2x2ZWQgd2l0aG91dCByZWNvbXB1dGluZyB0aGUgdmFsdWUuXG4gICAqL1xuICBwcml2YXRlIHN0YWxlID0gdHJ1ZTtcblxuICByZWFkb25seSBpZCA9IG5leHRSZWFjdGl2ZUlkKCk7XG4gIHJlYWRvbmx5IHJlZiA9IG5ldyBXZWFrUmVmKHRoaXMpO1xuICByZWFkb25seSBwcm9kdWNlcnMgPSBuZXcgTWFwPFByb2R1Y2VySWQsIEVkZ2U+KCk7XG4gIHJlYWRvbmx5IGNvbnN1bWVycyA9IG5ldyBNYXA8Q29uc3VtZXJJZCwgRWRnZT4oKTtcbiAgdHJhY2tpbmdWZXJzaW9uID0gMDtcbiAgdmFsdWVWZXJzaW9uID0gMDtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNvbXB1dGF0aW9uOiAoKSA9PiBULCBwcml2YXRlIGVxdWFsOiAob2xkVmFsdWU6IFQsIG5ld1ZhbHVlOiBUKSA9PiBib29sZWFuKSB7fVxuXG4gIGNoZWNrRm9yQ2hhbmdlZFZhbHVlKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGFsZSkge1xuICAgICAgLy8gVGhlIGN1cnJlbnQgdmFsdWUgYW5kIGl0cyB2ZXJzaW9uIGFyZSBhbHJlYWR5IHVwIHRvIGRhdGUuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gVGhlIGN1cnJlbnQgdmFsdWUgaXMgc3RhbGUuIENoZWNrIHdoZXRoZXIgd2UgbmVlZCB0byBwcm9kdWNlIGEgbmV3IG9uZS5cblxuICAgIGlmICh0aGlzLnZhbHVlICE9PSBVTlNFVCAmJiB0aGlzLnZhbHVlICE9PSBDT01QVVRJTkcgJiYgIWNvbnN1bWVyUG9sbFZhbHVlU3RhdHVzKHRoaXMpKSB7XG4gICAgICAvLyBFdmVuIHRob3VnaCB3ZSB3ZXJlIHByZXZpb3VzbHkgbm90aWZpZWQgb2YgYSBwb3RlbnRpYWwgZGVwZW5kZW5jeSB1cGRhdGUsIGFsbCBvZlxuICAgICAgLy8gb3VyIGRlcGVuZGVuY2llcyByZXBvcnQgdGhhdCB0aGV5IGhhdmUgbm90IGFjdHVhbGx5IGNoYW5nZWQgaW4gdmFsdWUsIHNvIHdlIGNhblxuICAgICAgLy8gcmVzb2x2ZSB0aGUgc3RhbGUgc3RhdGUgd2l0aG91dCBuZWVkaW5nIHRvIHJlY29tcHV0ZSB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgIHRoaXMuc3RhbGUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgY3VycmVudCB2YWx1ZSBpcyBzdGFsZSwgYW5kIG5lZWRzIHRvIGJlIHJlY29tcHV0ZWQuIEl0IHN0aWxsIG1heSBub3QgY2hhbmdlIC1cbiAgICAvLyB0aGF0IGRlcGVuZHMgb24gd2hldGhlciB0aGUgbmV3bHkgY29tcHV0ZWQgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIG9sZC5cbiAgICB0aGlzLnJlY29tcHV0ZVZhbHVlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlY29tcHV0ZVZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZhbHVlID09PSBDT01QVVRJTkcpIHtcbiAgICAgIC8vIE91ciBjb21wdXRhdGlvbiBzb21laG93IGxlZCB0byBhIGN5Y2xpYyByZWFkIG9mIGl0c2VsZi5cbiAgICAgIHRocm93IG5ldyBFcnJvcignRGV0ZWN0ZWQgY3ljbGUgaW4gY29tcHV0YXRpb25zLicpO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gQ09NUFVUSU5HO1xuXG4gICAgLy8gQXMgd2UncmUgcmUtcnVubmluZyB0aGUgY29tcHV0YXRpb24sIHVwZGF0ZSBvdXIgZGVwZW5kZW50IHRyYWNraW5nIHZlcnNpb24gbnVtYmVyLlxuICAgIHRoaXMudHJhY2tpbmdWZXJzaW9uKys7XG4gICAgY29uc3QgcHJldkNvbnN1bWVyID0gc2V0QWN0aXZlQ29uc3VtZXIodGhpcyk7XG4gICAgbGV0IG5ld1ZhbHVlOiBUO1xuICAgIHRyeSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMuY29tcHV0YXRpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIG5ld1ZhbHVlID0gRVJST1JFRDtcbiAgICAgIHRoaXMuZXJyb3IgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEFjdGl2ZUNvbnN1bWVyKHByZXZDb25zdW1lcik7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFsZSA9IGZhbHNlO1xuXG4gICAgaWYgKG9sZFZhbHVlICE9PSBVTlNFVCAmJiBvbGRWYWx1ZSAhPT0gRVJST1JFRCAmJiBuZXdWYWx1ZSAhPT0gRVJST1JFRCAmJlxuICAgICAgICB0aGlzLmVxdWFsKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgIC8vIE5vIGNoYW5nZSB0byBgdmFsdWVWZXJzaW9uYCAtIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmVcbiAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50LlxuICAgICAgdGhpcy52YWx1ZSA9IG9sZFZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnZhbHVlVmVyc2lvbisrO1xuICB9XG5cbiAgbm90aWZ5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YWxlKSB7XG4gICAgICAvLyBXZSd2ZSBhbHJlYWR5IG5vdGlmaWVkIGNvbnN1bWVycyB0aGF0IHRoaXMgdmFsdWUgaGFzIHBvdGVudGlhbGx5IGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIHRoYXQgdGhlIGN1cnJlbnRseSBjYWNoZWQgdmFsdWUgbWF5IGJlIHN0YWxlLlxuICAgIHRoaXMuc3RhbGUgPSB0cnVlO1xuXG4gICAgLy8gTm90aWZ5IGFueSBjb25zdW1lcnMgYWJvdXQgdGhlIHBvdGVudGlhbCBjaGFuZ2UuXG4gICAgcHJvZHVjZXJOb3RpZnlDb25zdW1lcnModGhpcyk7XG4gIH1cblxuICBzaWduYWwoKTogVCB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIG5lZWRzIHVwZGF0aW5nIGJlZm9yZSByZXR1cm5pbmcgaXQuXG4gICAgdGhpcy5jaGVja0ZvckNoYW5nZWRWYWx1ZSgpO1xuXG4gICAgLy8gUmVjb3JkIHRoYXQgc29tZW9uZSBsb29rZWQgYXQgdGhpcyBzaWduYWwuXG4gICAgcHJvZHVjZXJBY2Nlc3NlZCh0aGlzKTtcblxuICAgIGlmICh0aGlzLnZhbHVlID09PSBFUlJPUkVEKSB7XG4gICAgICB0aHJvdyB0aGlzLmVycm9yO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { Watch } from './watch';
9
+ /**
10
+ * Create a global `Effect` for the given reactive function.
11
+ *
12
+ * @developerPreview
13
+ */
14
+ export function effect(effectFn) {
15
+ const watch = new Watch(effectFn, queueWatch);
16
+ globalWatches.add(watch);
17
+ // Effects start dirty.
18
+ watch.notify();
19
+ return {
20
+ consumer: watch,
21
+ schedule: watch.notify.bind(watch),
22
+ destroy: () => {
23
+ queuedWatches.delete(watch);
24
+ globalWatches.delete(watch);
25
+ },
26
+ };
27
+ }
28
+ /**
29
+ * Get a `Promise` that resolves when any scheduled effects have resolved.
30
+ */
31
+ export function effectsDone() {
32
+ return watchQueuePromise?.promise ?? Promise.resolve();
33
+ }
34
+ /**
35
+ * Shut down all active effects.
36
+ */
37
+ export function resetEffects() {
38
+ queuedWatches.clear();
39
+ globalWatches.clear();
40
+ }
41
+ const globalWatches = new Set();
42
+ const queuedWatches = new Set();
43
+ let watchQueuePromise = null;
44
+ function queueWatch(watch) {
45
+ if (queuedWatches.has(watch) || !globalWatches.has(watch)) {
46
+ return;
47
+ }
48
+ queuedWatches.add(watch);
49
+ if (watchQueuePromise === null) {
50
+ Promise.resolve().then(runWatchQueue);
51
+ let resolveFn;
52
+ const promise = new Promise((resolve) => {
53
+ resolveFn = resolve;
54
+ });
55
+ watchQueuePromise = {
56
+ promise,
57
+ resolveFn,
58
+ };
59
+ }
60
+ }
61
+ function runWatchQueue() {
62
+ for (const watch of queuedWatches) {
63
+ queuedWatches.delete(watch);
64
+ watch.run();
65
+ }
66
+ watchQueuePromise.resolveFn();
67
+ watchQueuePromise = null;
68
+ }
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWZmZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFscy9zcmMvZWZmZWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUdILE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUF3QjlCOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLFFBQW9CO0lBQ3pDLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM5QyxhQUFhLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXpCLHVCQUF1QjtJQUN2QixLQUFLLENBQUMsTUFBTSxFQUFFLENBQUM7SUFFZixPQUFPO1FBQ0wsUUFBUSxFQUFFLEtBQUs7UUFDZixRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ2xDLE9BQU8sRUFBRSxHQUFHLEVBQUU7WUFDWixhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzVCLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDOUIsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsV0FBVztJQUN6QixPQUFPLGlCQUFpQixFQUFFLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7QUFDekQsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxVQUFVLFlBQVk7SUFDMUIsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RCLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxHQUFHLEVBQVMsQ0FBQztBQUN2QyxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsRUFBUyxDQUFDO0FBRXZDLElBQUksaUJBQWlCLEdBQTBELElBQUksQ0FBQztBQUVwRixTQUFTLFVBQVUsQ0FBQyxLQUFZO0lBQzlCLElBQUksYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDekQsT0FBTztLQUNSO0lBRUQsYUFBYSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV6QixJQUFJLGlCQUFpQixLQUFLLElBQUksRUFBRTtRQUM5QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRXRDLElBQUksU0FBc0IsQ0FBQztRQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sQ0FBTyxDQUFDLE9BQU8sRUFBRSxFQUFFO1lBQzVDLFNBQVMsR0FBRyxPQUFPLENBQUM7UUFDdEIsQ0FBQyxDQUFDLENBQUM7UUFFSCxpQkFBaUIsR0FBRztZQUNsQixPQUFPO1lBQ1AsU0FBUztTQUNWLENBQUM7S0FDSDtBQUNILENBQUM7QUFFRCxTQUFTLGFBQWE7SUFDcEIsS0FBSyxNQUFNLEtBQUssSUFBSSxhQUFhLEVBQUU7UUFDakMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QixLQUFLLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDYjtJQUVELGlCQUFrQixDQUFDLFNBQVMsRUFBRSxDQUFDO0lBQy9CLGlCQUFpQixHQUFHLElBQUksQ0FBQztBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Q29uc3VtZXJ9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtXYXRjaH0gZnJvbSAnLi93YXRjaCc7XG5cbi8qKlxuICogQSBnbG9iYWwgcmVhY3RpdmUgZWZmZWN0LCB3aGljaCBjYW4gYmUgbWFudWFsbHkgc2NoZWR1bGVkIG9yIGRlc3Ryb3llZC5cbiAqXG4gKiBAZGV2ZWxvcGVyUHJldmlld1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEVmZmVjdCB7XG4gIC8qKlxuICAgKiBTY2hlZHVsZSB0aGUgZWZmZWN0IGZvciBtYW51YWwgZXhlY3V0aW9uLCBpZiBpdCdzIG5vdCBhbHJlYWR5LlxuICAgKi9cbiAgc2NoZWR1bGUoKTogdm9pZDtcblxuICAvKipcbiAgICogU2h1dCBkb3duIHRoZSBlZmZlY3QsIHJlbW92aW5nIGl0IGZyb20gYW55IHVwY29taW5nIHNjaGVkdWxlZCBleGVjdXRpb25zLlxuICAgKi9cbiAgZGVzdHJveSgpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBEaXJlY3QgYWNjZXNzIHRvIHRoZSBlZmZlY3QncyBgQ29uc3VtZXJgIGZvciBhZHZhbmNlZCB1c2UgY2FzZXMuXG4gICAqL1xuICByZWFkb25seSBjb25zdW1lcjogQ29uc3VtZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgZ2xvYmFsIGBFZmZlY3RgIGZvciB0aGUgZ2l2ZW4gcmVhY3RpdmUgZnVuY3Rpb24uXG4gKlxuICogQGRldmVsb3BlclByZXZpZXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdChlZmZlY3RGbjogKCkgPT4gdm9pZCk6IEVmZmVjdCB7XG4gIGNvbnN0IHdhdGNoID0gbmV3IFdhdGNoKGVmZmVjdEZuLCBxdWV1ZVdhdGNoKTtcbiAgZ2xvYmFsV2F0Y2hlcy5hZGQod2F0Y2gpO1xuXG4gIC8vIEVmZmVjdHMgc3RhcnQgZGlydHkuXG4gIHdhdGNoLm5vdGlmeSgpO1xuXG4gIHJldHVybiB7XG4gICAgY29uc3VtZXI6IHdhdGNoLFxuICAgIHNjaGVkdWxlOiB3YXRjaC5ub3RpZnkuYmluZCh3YXRjaCksXG4gICAgZGVzdHJveTogKCkgPT4ge1xuICAgICAgcXVldWVkV2F0Y2hlcy5kZWxldGUod2F0Y2gpO1xuICAgICAgZ2xvYmFsV2F0Y2hlcy5kZWxldGUod2F0Y2gpO1xuICAgIH0sXG4gIH07XG59XG5cbi8qKlxuICogR2V0IGEgYFByb21pc2VgIHRoYXQgcmVzb2x2ZXMgd2hlbiBhbnkgc2NoZWR1bGVkIGVmZmVjdHMgaGF2ZSByZXNvbHZlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVmZmVjdHNEb25lKCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gd2F0Y2hRdWV1ZVByb21pc2U/LnByb21pc2UgPz8gUHJvbWlzZS5yZXNvbHZlKCk7XG59XG5cbi8qKlxuICogU2h1dCBkb3duIGFsbCBhY3RpdmUgZWZmZWN0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc2V0RWZmZWN0cygpOiB2b2lkIHtcbiAgcXVldWVkV2F0Y2hlcy5jbGVhcigpO1xuICBnbG9iYWxXYXRjaGVzLmNsZWFyKCk7XG59XG5cbmNvbnN0IGdsb2JhbFdhdGNoZXMgPSBuZXcgU2V0PFdhdGNoPigpO1xuY29uc3QgcXVldWVkV2F0Y2hlcyA9IG5ldyBTZXQ8V2F0Y2g+KCk7XG5cbmxldCB3YXRjaFF1ZXVlUHJvbWlzZToge3Byb21pc2U6IFByb21pc2U8dm9pZD47IHJlc29sdmVGbjogKCkgPT4gdm9pZDt9fG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiBxdWV1ZVdhdGNoKHdhdGNoOiBXYXRjaCk6IHZvaWQge1xuICBpZiAocXVldWVkV2F0Y2hlcy5oYXMod2F0Y2gpIHx8ICFnbG9iYWxXYXRjaGVzLmhhcyh3YXRjaCkpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBxdWV1ZWRXYXRjaGVzLmFkZCh3YXRjaCk7XG5cbiAgaWYgKHdhdGNoUXVldWVQcm9taXNlID09PSBudWxsKSB7XG4gICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbihydW5XYXRjaFF1ZXVlKTtcblxuICAgIGxldCByZXNvbHZlRm4hOiAoKSA9PiB2b2lkO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuICAgICAgcmVzb2x2ZUZuID0gcmVzb2x2ZTtcbiAgICB9KTtcblxuICAgIHdhdGNoUXVldWVQcm9taXNlID0ge1xuICAgICAgcHJvbWlzZSxcbiAgICAgIHJlc29sdmVGbixcbiAgICB9O1xuICB9XG59XG5cbmZ1bmN0aW9uIHJ1bldhdGNoUXVldWUoKTogdm9pZCB7XG4gIGZvciAoY29uc3Qgd2F0Y2ggb2YgcXVldWVkV2F0Y2hlcykge1xuICAgIHF1ZXVlZFdhdGNoZXMuZGVsZXRlKHdhdGNoKTtcbiAgICB3YXRjaC5ydW4oKTtcbiAgfVxuXG4gIHdhdGNoUXVldWVQcm9taXNlIS5yZXNvbHZlRm4oKTtcbiAgd2F0Y2hRdWV1ZVByb21pc2UgPSBudWxsO1xufVxuIl19
@@ -0,0 +1,114 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ /**
9
+ * Tracks the currently active reactive context (or `null` if there is no active
10
+ * context).
11
+ */
12
+ let activeConsumer = null;
13
+ /**
14
+ * Counter tracking the next `ProducerId` or `ConsumerId`.
15
+ */
16
+ let _nextReactiveId = 0;
17
+ /**
18
+ * Get a new `ProducerId` or `ConsumerId`, allocated from the global sequence.
19
+ *
20
+ * The value returned is a type intersection of both branded types, and thus can be assigned to
21
+ * either.
22
+ */
23
+ export function nextReactiveId() {
24
+ return _nextReactiveId++;
25
+ }
26
+ /**
27
+ * Set `consumer` as the active reactive context, and return the previous `Consumer`
28
+ * (if any) for later restoration.
29
+ */
30
+ export function setActiveConsumer(consumer) {
31
+ const prevConsumer = activeConsumer;
32
+ activeConsumer = consumer;
33
+ return prevConsumer;
34
+ }
35
+ /**
36
+ * Notify all `Consumer`s of the given `Producer` that its value may have changed.
37
+ */
38
+ export function producerNotifyConsumers(producer) {
39
+ for (const [consumerId, edge] of producer.consumers) {
40
+ const consumer = edge.consumerRef.deref();
41
+ if (consumer === undefined || consumer.trackingVersion !== edge.atTrackingVersion) {
42
+ producer.consumers.delete(consumerId);
43
+ consumer?.producers.delete(producer.id);
44
+ continue;
45
+ }
46
+ consumer.notify();
47
+ }
48
+ }
49
+ /**
50
+ * Record a dependency on the given `Producer` by the current reactive `Consumer` if
51
+ * one is present.
52
+ */
53
+ export function producerAccessed(producer) {
54
+ if (activeConsumer === null) {
55
+ return;
56
+ }
57
+ // Either create or update the dependency `Edge` in both directions.
58
+ let edge = activeConsumer.producers.get(producer.id);
59
+ if (edge === undefined) {
60
+ edge = {
61
+ consumerRef: activeConsumer.ref,
62
+ producerRef: producer.ref,
63
+ seenValueVersion: producer.valueVersion,
64
+ atTrackingVersion: activeConsumer.trackingVersion,
65
+ };
66
+ activeConsumer.producers.set(producer.id, edge);
67
+ producer.consumers.set(activeConsumer.id, edge);
68
+ }
69
+ else {
70
+ edge.seenValueVersion = producer.valueVersion;
71
+ edge.atTrackingVersion = activeConsumer.trackingVersion;
72
+ }
73
+ }
74
+ /**
75
+ * Checks if a `Producer` has a current value which is different than the value
76
+ * last seen at a specific version by a `Consumer` which recorded a dependency on
77
+ * this `Producer`.
78
+ */
79
+ function producerPollStatus(producer, lastSeenValueVersion) {
80
+ // `producer.valueVersion` may be stale, but a mismatch still means that the value
81
+ // last seen by the `Consumer` is also stale.
82
+ if (producer.valueVersion !== lastSeenValueVersion) {
83
+ return true;
84
+ }
85
+ // Trigger the `Producer` to update its `valueVersion` if necessary.
86
+ producer.checkForChangedValue();
87
+ // At this point, we can trust `producer.valueVersion`.
88
+ return producer.valueVersion !== lastSeenValueVersion;
89
+ }
90
+ /**
91
+ * Function called to check the stale status of dependencies (producers) for a given consumer. This
92
+ * is a verification step before refreshing a given consumer: if none of the the dependencies
93
+ * reports a semantically new value, then the `Consumer` has not observed a real dependency change
94
+ * (even though it may have been notified of one).
95
+ */
96
+ export function consumerPollValueStatus(consumer) {
97
+ for (const [producerId, edge] of consumer.producers) {
98
+ const producer = edge.producerRef.deref();
99
+ if (producer === undefined || edge.atTrackingVersion !== consumer.trackingVersion) {
100
+ // This dependency edge is stale, so remove it.
101
+ consumer.producers.delete(producerId);
102
+ producer?.consumers.delete(consumer.id);
103
+ continue;
104
+ }
105
+ if (producerPollStatus(producer, edge.seenValueVersion)) {
106
+ // One of the dependencies reports a real value change.
107
+ return true;
108
+ }
109
+ }
110
+ // No dependency reported a real value change, so the `Consumer` has also not been
111
+ // impacted.
112
+ return false;
113
+ }
114
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9zaWduYWxzL3NyYy9ncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUE0Qkg7OztHQUdHO0FBQ0gsSUFBSSxjQUFjLEdBQWtCLElBQUksQ0FBQztBQUV6Qzs7R0FFRztBQUNILElBQUksZUFBZSxHQUFXLENBQUMsQ0FBQztBQUVoQzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxjQUFjO0lBQzVCLE9BQVEsZUFBZSxFQUE4QixDQUFDO0FBQ3hELENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsUUFBdUI7SUFDdkQsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDO0lBQ3BDLGNBQWMsR0FBRyxRQUFRLENBQUM7SUFDMUIsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQTJGRDs7R0FFRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxRQUFrQjtJQUN4RCxLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRTtRQUNuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUNqRixRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUN0QyxRQUFRLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDeEMsU0FBUztTQUNWO1FBRUQsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO0tBQ25CO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxRQUFrQjtJQUNqRCxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7UUFDM0IsT0FBTztLQUNSO0lBRUQsb0VBQW9FO0lBQ3BFLElBQUksSUFBSSxHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNyRCxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUU7UUFDdEIsSUFBSSxHQUFHO1lBQ0wsV0FBVyxFQUFFLGNBQWMsQ0FBQyxHQUFHO1lBQy9CLFdBQVcsRUFBRSxRQUFRLENBQUMsR0FBRztZQUN6QixnQkFBZ0IsRUFBRSxRQUFRLENBQUMsWUFBWTtZQUN2QyxpQkFBaUIsRUFBRSxjQUFjLENBQUMsZUFBZTtTQUNsRCxDQUFDO1FBQ0YsY0FBYyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRCxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ2pEO1NBQU07UUFDTCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUM5QyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsY0FBYyxDQUFDLGVBQWUsQ0FBQztLQUN6RDtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxrQkFBa0IsQ0FBQyxRQUFrQixFQUFFLG9CQUE0QjtJQUMxRSxrRkFBa0Y7SUFDbEYsNkNBQTZDO0lBQzdDLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxvQkFBb0IsRUFBRTtRQUNsRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsb0VBQW9FO0lBQ3BFLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBRWhDLHVEQUF1RDtJQUN2RCxPQUFPLFFBQVEsQ0FBQyxZQUFZLEtBQUssb0JBQW9CLENBQUM7QUFDeEQsQ0FBQztBQWdFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxRQUFrQjtJQUN4RCxLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLFNBQVMsRUFBRTtRQUNuRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBRTFDLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEtBQUssUUFBUSxDQUFDLGVBQWUsRUFBRTtZQUNqRiwrQ0FBK0M7WUFDL0MsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3hDLFNBQVM7U0FDVjtRQUVELElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1lBQ3ZELHVEQUF1RDtZQUN2RCxPQUFPLElBQUksQ0FBQztTQUNiO0tBQ0Y7SUFFRCxrRkFBa0Y7SUFDbEYsWUFBWTtJQUNaLE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge1dlYWtSZWZ9IGZyb20gJy4vd2Vha19yZWYnO1xuXG4vKipcbiAqIElkZW50aWZpZXIgZm9yIGEgYFByb2R1Y2VyYCwgd2hpY2ggaXMgYSBicmFuZGVkIGBudW1iZXJgLlxuICpcbiAqIE5vdGUgdGhhdCBgUHJvZHVjZXJJZGAgYW5kIGBDb25zdW1lcklkYCBhcmUgYXNzaWduZWQgZnJvbSB0aGUgc2FtZSBzZXF1ZW5jZSwgc28gdGhlIHNhbWUgYG51bWJlcmBcbiAqIHdpbGwgbmV2ZXIgYmUgdXNlZCBmb3IgYm90aC5cbiAqXG4gKiBCcmFuZGluZyBwcm92aWRlcyBhZGRpdGlvbmFsIHR5cGUgc2FmZXR5IGJ5IGVuc3VyaW5nIHRoYXQgYFByb2R1Y2VySWRgIGFuZCBgQ29uc3VtZXJJZGAgYXJlXG4gKiBtdXR1YWxseSB1bmFzc2lnbmFibGUgd2l0aG91dCBhIGNhc3QuIFNpbmNlIHNldmVyYWwgYE1hcGBzIGFyZSBrZXllZCBieSB0aGVzZSBJRHMsIHRoaXMgcHJldmVudHNcbiAqIGBQcm9kdWNlcklkYHMgZnJvbSBiZWluZyBpbmFkdmVydGVudGx5IHVzZWQgdG8gbG9vayB1cCBgQ29uc3VtZXJgcyBvciB2aWNlIHZlcnNhLlxuICovXG5leHBvcnQgdHlwZSBQcm9kdWNlcklkID0gbnVtYmVyJntfX3Byb2R1Y2VyOiB0cnVlfTtcblxuLyoqXG4gKiBJZGVudGlmaWVyIGZvciBhIGBDb25zdW1lcmAsIHdoaWNoIGlzIGEgYnJhbmRlZCBgbnVtYmVyYC5cbiAqXG4gKiBOb3RlIHRoYXQgYFByb2R1Y2VySWRgIGFuZCBgQ29uc3VtZXJJZGAgYXJlIGFzc2lnbmVkIGZyb20gdGhlIHNhbWUgc2VxdWVuY2UsIHNvIHRoZSBzYW1lIGBudW1iZXJgXG4gKiB3aWxsIG5ldmVyIGJlIHVzZWQgZm9yIGJvdGguXG4gKlxuICogQnJhbmRpbmcgcHJvdmlkZXMgYWRkaXRpb25hbCB0eXBlIHNhZmV0eSBieSBlbnN1cmluZyB0aGF0IGBQcm9kdWNlcklkYCBhbmQgYENvbnN1bWVySWRgIGFyZVxuICogbXV0dWFsbHkgdW5hc3NpZ25hYmxlIHdpdGhvdXQgYSBjYXN0LiBTaW5jZSBzZXZlcmFsIGBNYXBgcyBhcmUga2V5ZWQgYnkgdGhlc2UgSURzLCB0aGlzIHByZXZlbnRzXG4gKiBgQ29uc3VtZXJJZGBzIGZyb20gYmVpbmcgaW5hZHZlcnRlbnRseSB1c2VkIHRvIGxvb2sgdXAgYFByb2R1Y2VyYHMgb3IgdmljZSB2ZXJzYS5cbiAqL1xuZXhwb3J0IHR5cGUgQ29uc3VtZXJJZCA9IG51bWJlciZ7X19jb25zdW1lcjogdHJ1ZX07XG5cbi8qKlxuICogVHJhY2tzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHJlYWN0aXZlIGNvbnRleHQgKG9yIGBudWxsYCBpZiB0aGVyZSBpcyBubyBhY3RpdmVcbiAqIGNvbnRleHQpLlxuICovXG5sZXQgYWN0aXZlQ29uc3VtZXI6IENvbnN1bWVyfG51bGwgPSBudWxsO1xuXG4vKipcbiAqIENvdW50ZXIgdHJhY2tpbmcgdGhlIG5leHQgYFByb2R1Y2VySWRgIG9yIGBDb25zdW1lcklkYC5cbiAqL1xubGV0IF9uZXh0UmVhY3RpdmVJZDogbnVtYmVyID0gMDtcblxuLyoqXG4gKiBHZXQgYSBuZXcgYFByb2R1Y2VySWRgIG9yIGBDb25zdW1lcklkYCwgYWxsb2NhdGVkIGZyb20gdGhlIGdsb2JhbCBzZXF1ZW5jZS5cbiAqXG4gKiBUaGUgdmFsdWUgcmV0dXJuZWQgaXMgYSB0eXBlIGludGVyc2VjdGlvbiBvZiBib3RoIGJyYW5kZWQgdHlwZXMsIGFuZCB0aHVzIGNhbiBiZSBhc3NpZ25lZCB0b1xuICogZWl0aGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmV4dFJlYWN0aXZlSWQoKTogUHJvZHVjZXJJZCZDb25zdW1lcklkIHtcbiAgcmV0dXJuIChfbmV4dFJlYWN0aXZlSWQrKyBhcyBQcm9kdWNlcklkICYgQ29uc3VtZXJJZCk7XG59XG5cbi8qKlxuICogU2V0IGBjb25zdW1lcmAgYXMgdGhlIGFjdGl2ZSByZWFjdGl2ZSBjb250ZXh0LCBhbmQgcmV0dXJuIHRoZSBwcmV2aW91cyBgQ29uc3VtZXJgXG4gKiAoaWYgYW55KSBmb3IgbGF0ZXIgcmVzdG9yYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRBY3RpdmVDb25zdW1lcihjb25zdW1lcjogQ29uc3VtZXJ8bnVsbCk6IENvbnN1bWVyfG51bGwge1xuICBjb25zdCBwcmV2Q29uc3VtZXIgPSBhY3RpdmVDb25zdW1lcjtcbiAgYWN0aXZlQ29uc3VtZXIgPSBjb25zdW1lcjtcbiAgcmV0dXJuIHByZXZDb25zdW1lcjtcbn1cblxuLyoqXG4gKiBBIGJpZGlyZWN0aW9uYWwgZWRnZSBpbiB0aGUgcHJvZHVjZXItY29uc3VtZXIgZGVwZW5kZW5jeSBncmFwaC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFZGdlIHtcbiAgLyoqXG4gICAqIFdlYWtseSBoZWxkIHJlZmVyZW5jZSB0byB0aGUgYENvbnN1bWVyYCBzaWRlIG9mIHRoaXMgZWRnZS5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN1bWVyUmVmOiBXZWFrUmVmPENvbnN1bWVyPjtcblxuICAvKipcbiAgICogV2Vha2x5IGhlbGQgcmVmZXJlbmNlIHRvIHRoZSBgUHJvZHVjZXJgIHNpZGUgb2YgdGhpcyBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZHVjZXJSZWY6IFdlYWtSZWY8UHJvZHVjZXI+O1xuXG4gIC8qKlxuICAgKiBgdHJhY2tpbmdWZXJzaW9uYCBvZiB0aGUgYENvbnN1bWVyYCBhdCB3aGljaCB0aGlzIGRlcGVuZGVuY3kgZWRnZSB3YXMgbGFzdCBvYnNlcnZlZC5cbiAgICpcbiAgICogSWYgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZSBgQ29uc3VtZXJgJ3MgY3VycmVudCBgdHJhY2tpbmdWZXJzaW9uYCwgdGhlbiB0aGlzIGRlcGVuZGVuY3kgcmVjb3JkXG4gICAqIGlzIHN0YWxlLCBhbmQgbmVlZHMgdG8gYmUgY2xlYW5lZCB1cC5cbiAgICovXG4gIGF0VHJhY2tpbmdWZXJzaW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIGB2YWx1ZVZlcnNpb25gIG9mIHRoZSBgUHJvZHVjZXJgIGF0IHRoZSB0aW1lIHRoaXMgZGVwZW5kZW5jeSB3YXMgbGFzdCBhY2Nlc3NlZC5cbiAgICpcbiAgICogVGhpcyBpcyB1c2VkIGJ5IGBjb25zdW1lclBvbGxWYWx1ZVN0YXR1c2AgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBgQ29uc3VtZXJgJ3MgZGVwZW5kZW5jaWVzIGhhdmVcbiAgICogc2VtYW50aWNhbGx5IGNoYW5nZWQuXG4gICAqL1xuICBzZWVuVmFsdWVWZXJzaW9uOiBudW1iZXI7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHZhbHVlIHRoYXQgY2FuIGJlIHJlYWQgcmVhY3RpdmVseSwgYW5kIGNhbiBub3RpZnkgcmVhZGVycyAoYENvbnN1bWVyYHMpXG4gKiB3aGVuIGl0IGNoYW5nZXMuXG4gKlxuICogUHJvZHVjZXJzIG1haW50YWluIGEgd2VhayByZWZlcmVuY2UgdG8gYW55IGBDb25zdW1lcmBzIHdoaWNoIG1heSBkZXBlbmQgb24gdGhlXG4gKiBwcm9kdWNlcidzIHZhbHVlLlxuICpcbiAqIEltcGxlbWVudGVycyBvZiBgUHJvZHVjZXJgIGV4cG9zZSBhIG1vbm90b25pYyBgdmFsdWVWZXJzaW9uYCBjb3VudGVyLCBhbmQgYXJlIHJlc3BvbnNpYmxlXG4gKiBmb3IgaW5jcmVtZW50aW5nIHRoaXMgdmVyc2lvbiB3aGVuIHRoZWlyIHZhbHVlIHNlbWFudGljYWxseSBjaGFuZ2VzLiBTb21lIFByb2R1Y2VycyBtYXlcbiAqIHByb2R1Y2UgdGhpcyB2YWx1ZSBsYXppbHkgYW5kIHRodXMgYXQgdGltZXMgbmVlZCB0byBiZSBwb2xsZWQgZm9yIHBvdGVudGlhbCB1cGRhdGVzIHRvXG4gKiB0aGVpciB2YWx1ZSAoYW5kIGJ5IGV4dGVuc2lvbiB0aGVpciBgdmFsdWVWZXJzaW9uYCkuIFRoaXMgaXMgYWNjb21wbGlzaGVkIHZpYSB0aGVcbiAqIGBjaGVja0ZvckNoYW5nZWRWYWx1ZWAgbWV0aG9kIGZvciBQcm9kdWNlcnMsIHdoaWNoIHNob3VsZCBwZXJmb3JtIHdoYXRldmVyIGNhbGN1bGF0aW9uc1xuICogYXJlIG5lY2Vzc2FyeSB0byBlbnN1cmUgYHZhbHVlVmVyc2lvbmAgaXMgdXAgdG8gZGF0ZS5cbiAqXG4gKiBgUHJvZHVjZXJgcyBzdXBwb3J0IHR3byBvcGVyYXRpb25zOlxuICogICAqIGBwcm9kdWNlck5vdGlmeUNvbnN1bWVyc2BcbiAqICAgKiBgcHJvZHVjZXJBY2Nlc3NlZGBcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQcm9kdWNlciB7XG4gIC8qKlxuICAgKiBOdW1lcmljIGlkZW50aWZpZXIgb2YgdGhpcyBgUHJvZHVjZXJgLlxuICAgKlxuICAgKiBNYXkgYWxzbyBiZSB1c2VkIHRvIHNhdGlzZnkgdGhlIGludGVyZmFjZSBmb3IgYENvbnN1bWVyYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBQcm9kdWNlcklkO1xuXG4gIC8qKlxuICAgKiBBIGBXZWFrUmVmYCB0byB0aGlzIGBQcm9kdWNlcmAgaW5zdGFuY2UuXG4gICAqXG4gICAqIEFuIGltcGxlbWVudGVyIHByb3ZpZGVzIHRoaXMgYXMgYSBjYWNoZWQgdmFsdWUgdG8gYXZvaWQgdGhlIG5lZWQgdG8gaW5zdGFudGlhdGVcbiAgICogbXVsdGlwbGUgYFdlYWtSZWZgIGluc3RhbmNlcyBmb3IgdGhlIHNhbWUgYFByb2R1Y2VyYC5cbiAgICpcbiAgICogTWF5IGFsc28gYmUgdXNlZCB0byBzYXRpc2Z5IHRoZSBpbnRlcmZhY2UgZm9yIGBDb25zdW1lcmAuXG4gICAqL1xuICByZWFkb25seSByZWY6IFdlYWtSZWY8UHJvZHVjZXI+O1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBkZXBlbmRlbmN5IGBFZGdlYHMgdG8gYENvbnN1bWVyYHMsIGtleWVkIGJ5IHRoZSBgQ29uc3VtZXJJZGAuXG4gICAqXG4gICAqIFVzZWQgd2hlbiB0aGUgcHJvZHVjZWQgdmFsdWUgY2hhbmdlcyB0byBub3RpZnkgaW50ZXJlc3RlZCBgQ29uc3VtZXJgcy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbnN1bWVyczogTWFwPENvbnN1bWVySWQsIEVkZ2U+O1xuXG4gIC8qKlxuICAgKiBNb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgY291bnRlciB3aGljaCBpbmNyZWFzZXMgd2hlbiB0aGUgdmFsdWUgb2YgdGhpcyBgUHJvZHVjZXJgXG4gICAqIHNlbWFudGljYWxseSBjaGFuZ2VzLlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVWZXJzaW9uOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEVuc3VyZSB0aGF0IGB2YWx1ZVZlcnNpb25gIGlzIHVwIHRvIGRhdGUgZm9yIHRoZSBgUHJvZHVjZXJgJ3MgdmFsdWUuXG4gICAqXG4gICAqIFNvbWUgYFByb2R1Y2VyYHMgbWF5IHByb2R1Y2UgdmFsdWVzIGxhemlseSwgYW5kIHRodXMgcmVxdWlyZSBwb2xsaW5nIGJlZm9yZSB0aGVpclxuICAgKiBgdmFsdWVWZXJzaW9uYCBjYW4gYmUgY29tcGFyZWQgd2l0aCB0aGUgdmVyc2lvbiBjYXB0dXJlZCBkdXJpbmcgYSBwcmV2aW91cyByZWFkLlxuICAgKi9cbiAgY2hlY2tGb3JDaGFuZ2VkVmFsdWUoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBOb3RpZnkgYWxsIGBDb25zdW1lcmBzIG9mIHRoZSBnaXZlbiBgUHJvZHVjZXJgIHRoYXQgaXRzIHZhbHVlIG1heSBoYXZlIGNoYW5nZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcm9kdWNlck5vdGlmeUNvbnN1bWVycyhwcm9kdWNlcjogUHJvZHVjZXIpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBbY29uc3VtZXJJZCwgZWRnZV0gb2YgcHJvZHVjZXIuY29uc3VtZXJzKSB7XG4gICAgY29uc3QgY29uc3VtZXIgPSBlZGdlLmNvbnN1bWVyUmVmLmRlcmVmKCk7XG4gICAgaWYgKGNvbnN1bWVyID09PSB1bmRlZmluZWQgfHwgY29uc3VtZXIudHJhY2tpbmdWZXJzaW9uICE9PSBlZGdlLmF0VHJhY2tpbmdWZXJzaW9uKSB7XG4gICAgICBwcm9kdWNlci5jb25zdW1lcnMuZGVsZXRlKGNvbnN1bWVySWQpO1xuICAgICAgY29uc3VtZXI/LnByb2R1Y2Vycy5kZWxldGUocHJvZHVjZXIuaWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3VtZXIubm90aWZ5KCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZWNvcmQgYSBkZXBlbmRlbmN5IG9uIHRoZSBnaXZlbiBgUHJvZHVjZXJgIGJ5IHRoZSBjdXJyZW50IHJlYWN0aXZlIGBDb25zdW1lcmAgaWZcbiAqIG9uZSBpcyBwcmVzZW50LlxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJvZHVjZXJBY2Nlc3NlZChwcm9kdWNlcjogUHJvZHVjZXIpOiB2b2lkIHtcbiAgaWYgKGFjdGl2ZUNvbnN1bWVyID09PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRWl0aGVyIGNyZWF0ZSBvciB1cGRhdGUgdGhlIGRlcGVuZGVuY3kgYEVkZ2VgIGluIGJvdGggZGlyZWN0aW9ucy5cbiAgbGV0IGVkZ2UgPSBhY3RpdmVDb25zdW1lci5wcm9kdWNlcnMuZ2V0KHByb2R1Y2VyLmlkKTtcbiAgaWYgKGVkZ2UgPT09IHVuZGVmaW5lZCkge1xuICAgIGVkZ2UgPSB7XG4gICAgICBjb25zdW1lclJlZjogYWN0aXZlQ29uc3VtZXIucmVmLFxuICAgICAgcHJvZHVjZXJSZWY6IHByb2R1Y2VyLnJlZixcbiAgICAgIHNlZW5WYWx1ZVZlcnNpb246IHByb2R1Y2VyLnZhbHVlVmVyc2lvbixcbiAgICAgIGF0VHJhY2tpbmdWZXJzaW9uOiBhY3RpdmVDb25zdW1lci50cmFja2luZ1ZlcnNpb24sXG4gICAgfTtcbiAgICBhY3RpdmVDb25zdW1lci5wcm9kdWNlcnMuc2V0KHByb2R1Y2VyLmlkLCBlZGdlKTtcbiAgICBwcm9kdWNlci5jb25zdW1lcnMuc2V0KGFjdGl2ZUNvbnN1bWVyLmlkLCBlZGdlKTtcbiAgfSBlbHNlIHtcbiAgICBlZGdlLnNlZW5WYWx1ZVZlcnNpb24gPSBwcm9kdWNlci52YWx1ZVZlcnNpb247XG4gICAgZWRnZS5hdFRyYWNraW5nVmVyc2lvbiA9IGFjdGl2ZUNvbnN1bWVyLnRyYWNraW5nVmVyc2lvbjtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiBhIGBQcm9kdWNlcmAgaGFzIGEgY3VycmVudCB2YWx1ZSB3aGljaCBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgdmFsdWVcbiAqIGxhc3Qgc2VlbiBhdCBhIHNwZWNpZmljIHZlcnNpb24gYnkgYSBgQ29uc3VtZXJgIHdoaWNoIHJlY29yZGVkIGEgZGVwZW5kZW5jeSBvblxuICogdGhpcyBgUHJvZHVjZXJgLlxuICovXG5mdW5jdGlvbiBwcm9kdWNlclBvbGxTdGF0dXMocHJvZHVjZXI6IFByb2R1Y2VyLCBsYXN0U2VlblZhbHVlVmVyc2lvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIC8vIGBwcm9kdWNlci52YWx1ZVZlcnNpb25gIG1heSBiZSBzdGFsZSwgYnV0IGEgbWlzbWF0Y2ggc3RpbGwgbWVhbnMgdGhhdCB0aGUgdmFsdWVcbiAgLy8gbGFzdCBzZWVuIGJ5IHRoZSBgQ29uc3VtZXJgIGlzIGFsc28gc3RhbGUuXG4gIGlmIChwcm9kdWNlci52YWx1ZVZlcnNpb24gIT09IGxhc3RTZWVuVmFsdWVWZXJzaW9uKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBUcmlnZ2VyIHRoZSBgUHJvZHVjZXJgIHRvIHVwZGF0ZSBpdHMgYHZhbHVlVmVyc2lvbmAgaWYgbmVjZXNzYXJ5LlxuICBwcm9kdWNlci5jaGVja0ZvckNoYW5nZWRWYWx1ZSgpO1xuXG4gIC8vIEF0IHRoaXMgcG9pbnQsIHdlIGNhbiB0cnVzdCBgcHJvZHVjZXIudmFsdWVWZXJzaW9uYC5cbiAgcmV0dXJuIHByb2R1Y2VyLnZhbHVlVmVyc2lvbiAhPT0gbGFzdFNlZW5WYWx1ZVZlcnNpb247XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHJlYWRlciB0aGF0IGNhbiBkZXBlbmQgb24gcmVhY3RpdmUgdmFsdWVzIChgUHJvZHVjZXJgcykgYW5kIHJlY2VpdmVcbiAqIG5vdGlmaWNhdGlvbnMgd2hlbiB0aG9zZSB2YWx1ZXMgY2hhbmdlLlxuICpcbiAqIGBDb25zdW1lcmBzIGRvIG5vdCB3cmFwIHRoZSByZWFkcyB0aGV5IGNvbnN1bWUgdGhlbXNlbHZlcywgYnV0IHJhdGhlciBjYW4gYmUgc2V0XG4gKiBhcyB0aGUgYWN0aXZlIHJlYWRlciB2aWEgYHNldEFjdGl2ZUNvbnN1bWVyYC5cbiAqXG4gKiBUaGUgc2V0IG9mIGRlcGVuZGVuY2llcyBvZiBhIGBDb25zdW1lcmAgaXMgZHluYW1pYy4gSW1wbGVtZW50ZXJzIGV4cG9zZSBhXG4gKiBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgYHRyYWNraW5nVmVyc2lvbmAgY291bnRlciwgd2hpY2ggaW5jcmVtZW50cyB3aGVuZXZlclxuICogdGhlIGBDb25zdW1lcmAgaXMgYWJvdXQgdG8gcmUtcnVuIGFueSByZWFjdGl2ZSByZWFkcyBpdCBuZWVkcyBhbmQgZXN0YWJsaXNoIGFcbiAqIG5ldyBzZXQgb2YgZGVwZW5kZW5jaWVzIGFzIGEgcmVzdWx0LlxuICpcbiAqIGBQcm9kdWNlcmBzIHN0b3JlIHRoZSBsYXN0IGB0cmFja2luZ1ZlcnNpb25gIHRoZXkndmUgc2VlbiBmcm9tIGBDb25zdW1lcmBzIHdoaWNoXG4gKiBoYXZlIHJlYWQgdGhlbS4gVGhpcyBhbGxvd3MgYSBgUHJvZHVjZXJgIHRvIGlkZW50aWZ5IHdoZXRoZXIgaXRzIHJlY29yZCBvZiB0aGVcbiAqIGRlcGVuZGVuY3kgaXMgY3VycmVudCBvciBzdGFsZSwgYnkgY29tcGFyaW5nIHRoZSBgQ29uc3VtZXJgJ3MgYHRyYWNraW5nVmVyc2lvbmBcbiAqIHRvIHRoZSB2ZXJzaW9uIGF0IHdoaWNoIHRoZSBkZXBlbmRlbmN5IHdhcyBlc3RhYmxpc2hlZC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb25zdW1lciB7XG4gIC8qKlxuICAgKiBOdW1lcmljIGlkZW50aWZpZXIgb2YgdGhpcyBgUHJvZHVjZXJgLlxuICAgKlxuICAgKiBNYXkgYWxzbyBiZSB1c2VkIHRvIHNhdGlzZnkgdGhlIGludGVyZmFjZSBmb3IgYFByb2R1Y2VyYC5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBDb25zdW1lcklkO1xuXG4gIC8qKlxuICAgKiBBIGBXZWFrUmVmYCB0byB0aGlzIGBDb25zdW1lcmAgaW5zdGFuY2UuXG4gICAqXG4gICAqIEFuIGltcGxlbWVudGVyIHByb3ZpZGVzIHRoaXMgYXMgYSBjYWNoZWQgdmFsdWUgdG8gYXZvaWQgdGhlIG5lZWQgdG8gaW5zdGFudGlhdGVcbiAgICogbXVsdGlwbGUgYFdlYWtSZWZgIGluc3RhbmNlcyBmb3IgdGhlIHNhbWUgYENvbnN1bWVyYC5cbiAgICpcbiAgICogTWF5IGFsc28gYmUgdXNlZCB0byBzYXRpc2Z5IHRoZSBpbnRlcmZhY2UgZm9yIGBQcm9kdWNlcmAuXG4gICAqL1xuICByZWFkb25seSByZWY6IFdlYWtSZWY8Q29uc3VtZXI+O1xuXG4gIC8qKlxuICAgKiBBIG1hcCBvZiBgRWRnZWBzIHRvIGBQcm9kdWNlcmAgZGVwZW5kZW5jaWVzLCBrZXllZCBieSB0aGUgYFByb2R1Y2VySWRgLlxuICAgKlxuICAgKiBVc2VkIHRvIHBvbGwgYFByb2R1Y2VyYHMgdG8gZGV0ZXJtaW5lIGlmIHRoZSBgQ29uc3VtZXJgIGhhcyByZWFsbHkgdXBkYXRlZFxuICAgKiBvciBub3QuXG4gICAqL1xuICByZWFkb25seSBwcm9kdWNlcnM6IE1hcDxQcm9kdWNlcklkLCBFZGdlPjtcblxuICAvKipcbiAgICogTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGNvdW50ZXIgcmVwcmVzZW50aW5nIGEgdmVyc2lvbiBvZiB0aGlzIGBDb25zdW1lcmAnc1xuICAgKiBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICByZWFkb25seSB0cmFja2luZ1ZlcnNpb246IG51bWJlcjtcblxuICAvKipcbiAgICogQ2FsbGVkIHdoZW4gYSBgUHJvZHVjZXJgIGRlcGVuZGVuY3kgb2YgdGhpcyBgQ29uc3VtZXJgIGluZGljYXRlcyBpdCBtYXlcbiAgICogaGF2ZSBhIG5ldyB2YWx1ZS5cbiAgICpcbiAgICogTm90aWZpY2F0aW9uIGFsb25lIGRvZXMgbm90IG1lYW4gdGhlIGBQcm9kdWNlcmAgaGFzIGRlZmluaXRlbHkgcHJvZHVjZWQgYVxuICAgKiBzZW1hbnRpY2FsbHkgZGlmZmVyZW50IHZhbHVlLCBvbmx5IHRoYXQgaXQgX21heV8gaGF2ZSBjaGFuZ2VkLiBCZWZvcmUgYVxuICAgKiBgQ29uc3VtZXJgIHJlLXJ1bnMgYW55IGNvbXB1dGF0aW9ucyBvciBzaWRlIGVmZmVjdHMsIGl0IHNob3VsZCB1c2UgdGhlXG4gICAqIGBjb25zdW1lclBvbGxWYWx1ZVN0YXR1c2AgbWV0aG9kIHRvIHBvbGwgdGhlIGBQcm9kdWNlcmBzIG9uIHdoaWNoIGl0IGRlcGVuZHNcbiAgICogYW5kIGRldGVybWluZSBpZiBhbnkgb2YgdGhlbSBoYXZlIGFjdHVhbGx5IHVwZGF0ZWQuXG4gICAqL1xuICBub3RpZnkoKTogdm9pZDtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBjYWxsZWQgdG8gY2hlY2sgdGhlIHN0YWxlIHN0YXR1cyBvZiBkZXBlbmRlbmNpZXMgKHByb2R1Y2VycykgZm9yIGEgZ2l2ZW4gY29uc3VtZXIuIFRoaXNcbiAqIGlzIGEgdmVyaWZpY2F0aW9uIHN0ZXAgYmVmb3JlIHJlZnJlc2hpbmcgYSBnaXZlbiBjb25zdW1lcjogaWYgbm9uZSBvZiB0aGUgdGhlIGRlcGVuZGVuY2llc1xuICogcmVwb3J0cyBhIHNlbWFudGljYWxseSBuZXcgdmFsdWUsIHRoZW4gdGhlIGBDb25zdW1lcmAgaGFzIG5vdCBvYnNlcnZlZCBhIHJlYWwgZGVwZW5kZW5jeSBjaGFuZ2VcbiAqIChldmVuIHRob3VnaCBpdCBtYXkgaGF2ZSBiZWVuIG5vdGlmaWVkIG9mIG9uZSkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25zdW1lclBvbGxWYWx1ZVN0YXR1cyhjb25zdW1lcjogQ29uc3VtZXIpOiBib29sZWFuIHtcbiAgZm9yIChjb25zdCBbcHJvZHVjZXJJZCwgZWRnZV0gb2YgY29uc3VtZXIucHJvZHVjZXJzKSB7XG4gICAgY29uc3QgcHJvZHVjZXIgPSBlZGdlLnByb2R1Y2VyUmVmLmRlcmVmKCk7XG5cbiAgICBpZiAocHJvZHVjZXIgPT09IHVuZGVmaW5lZCB8fCBlZGdlLmF0VHJhY2tpbmdWZXJzaW9uICE9PSBjb25zdW1lci50cmFja2luZ1ZlcnNpb24pIHtcbiAgICAgIC8vIFRoaXMgZGVwZW5kZW5jeSBlZGdlIGlzIHN0YWxlLCBzbyByZW1vdmUgaXQuXG4gICAgICBjb25zdW1lci5wcm9kdWNlcnMuZGVsZXRlKHByb2R1Y2VySWQpO1xuICAgICAgcHJvZHVjZXI/LmNvbnN1bWVycy5kZWxldGUoY29uc3VtZXIuaWQpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHByb2R1Y2VyUG9sbFN0YXR1cyhwcm9kdWNlciwgZWRnZS5zZWVuVmFsdWVWZXJzaW9uKSkge1xuICAgICAgLy8gT25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgcmVwb3J0cyBhIHJlYWwgdmFsdWUgY2hhbmdlLlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG5cbiAgLy8gTm8gZGVwZW5kZW5jeSByZXBvcnRlZCBhIHJlYWwgdmFsdWUgY2hhbmdlLCBzbyB0aGUgYENvbnN1bWVyYCBoYXMgYWxzbyBub3QgYmVlblxuICAvLyBpbXBhY3RlZC5cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19
@@ -0,0 +1,78 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { createSignalFromFunction, defaultEquals } from './api';
9
+ import { nextReactiveId, producerAccessed, producerNotifyConsumers } from './graph';
10
+ import { WeakRef } from './weak_ref';
11
+ /**
12
+ * Backing type for a `SettableSignal`, a mutable reactive value.
13
+ */
14
+ class SettableSignalImpl {
15
+ constructor(value, equal) {
16
+ this.value = value;
17
+ this.equal = equal;
18
+ this.id = nextReactiveId();
19
+ this.ref = new WeakRef(this);
20
+ this.consumers = new Map();
21
+ this.valueVersion = 0;
22
+ }
23
+ checkForChangedValue() {
24
+ // Settable signals can only change when set, so there's nothing to check here.
25
+ }
26
+ /**
27
+ * Directly update the value of the signal to a new value, which may or may not be
28
+ * equal to the previous.
29
+ *
30
+ * In the event that `newValue` is semantically equal to the current value, `set` is
31
+ * a no-op.
32
+ */
33
+ set(newValue) {
34
+ if (!this.equal(this.value, newValue)) {
35
+ this.value = newValue;
36
+ this.valueVersion++;
37
+ producerNotifyConsumers(this);
38
+ }
39
+ }
40
+ /**
41
+ * Derive a new value for the signal from its current value using the `updater` function.
42
+ *
43
+ * This is equivalent to calling `set` on the result of running `updater` on the current
44
+ * value.
45
+ */
46
+ update(updater) {
47
+ this.set(updater(this.value));
48
+ }
49
+ /**
50
+ * Calls `mutator` on the current value and assumes that it has been mutated.
51
+ */
52
+ mutate(mutator) {
53
+ // Mutate bypasses equality checks as it's by definition changing the value.
54
+ mutator(this.value);
55
+ this.valueVersion++;
56
+ producerNotifyConsumers(this);
57
+ }
58
+ signal() {
59
+ producerAccessed(this);
60
+ return this.value;
61
+ }
62
+ }
63
+ /**
64
+ * Create a `Signal` that can be set or updated directly.
65
+ *
66
+ * @developerPreview
67
+ */
68
+ export function signal(initialValue, equal = defaultEquals) {
69
+ const signalNode = new SettableSignalImpl(initialValue, equal);
70
+ // Casting here is required for g3.
71
+ const signalFn = createSignalFromFunction(signalNode.signal.bind(signalNode), {
72
+ set: signalNode.set.bind(signalNode),
73
+ update: signalNode.update.bind(signalNode),
74
+ mutate: signalNode.mutate.bind(signalNode),
75
+ });
76
+ return signalFn;
77
+ }
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFscy9zcmMvc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyx3QkFBd0IsRUFBRSxhQUFhLEVBQTBCLE1BQU0sT0FBTyxDQUFDO0FBQ3ZGLE9BQU8sRUFBbUIsY0FBYyxFQUFZLGdCQUFnQixFQUFFLHVCQUF1QixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlHLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUEwQm5DOztHQUVHO0FBQ0gsTUFBTSxrQkFBa0I7SUFDdEIsWUFBb0IsS0FBUSxFQUFVLEtBQXlCO1FBQTNDLFVBQUssR0FBTCxLQUFLLENBQUc7UUFBVSxVQUFLLEdBQUwsS0FBSyxDQUFvQjtRQUV0RCxPQUFFLEdBQUcsY0FBYyxFQUFFLENBQUM7UUFDdEIsUUFBRyxHQUFHLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hCLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBb0IsQ0FBQztRQUNqRCxpQkFBWSxHQUFHLENBQUMsQ0FBQztJQUxpRCxDQUFDO0lBT25FLG9CQUFvQjtRQUNsQiwrRUFBK0U7SUFDakYsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEdBQUcsQ0FBQyxRQUFXO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsdUJBQXVCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsT0FBd0I7UUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE9BQTJCO1FBQ2hDLDRFQUE0RTtRQUM1RSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQix1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTTtRQUNKLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQztJQUNwQixDQUFDO0NBQ0Y7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsWUFBZSxFQUFFLFFBQTRCLGFBQWE7SUFDNUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxrQkFBa0IsQ0FBQyxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0QsbUNBQW1DO0lBQ25DLE1BQU0sUUFBUSxHQUFHLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQzNELEdBQUcsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDcEMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUMxQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO0tBQzNDLENBQWlDLENBQUM7SUFDcEQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQge2NyZWF0ZVNpZ25hbEZyb21GdW5jdGlvbiwgZGVmYXVsdEVxdWFscywgU2lnbmFsLCBWYWx1ZUVxdWFsaXR5Rm59IGZyb20gJy4vYXBpJztcbmltcG9ydCB7Q29uc3VtZXJJZCwgRWRnZSwgbmV4dFJlYWN0aXZlSWQsIFByb2R1Y2VyLCBwcm9kdWNlckFjY2Vzc2VkLCBwcm9kdWNlck5vdGlmeUNvbnN1bWVyc30gZnJvbSAnLi9ncmFwaCc7XG5pbXBvcnQge1dlYWtSZWZ9IGZyb20gJy4vd2Vha19yZWYnO1xuXG4vKipcbiAqIEEgYFNpZ25hbGAgd2l0aCBhIHZhbHVlIHRoYXQgY2FuIGJlIG11dGF0ZWQgdmlhIGEgc2V0dGVyIGludGVyZmFjZS5cbiAqXG4gKiBAZGV2ZWxvcGVyUHJldmlld1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFNldHRhYmxlU2lnbmFsPFQ+IGV4dGVuZHMgU2lnbmFsPFQ+IHtcbiAgLyoqXG4gICAqIERpcmVjdGx5IHNldCB0aGUgc2lnbmFsIHRvIGEgbmV3IHZhbHVlLCBhbmQgbm90aWZ5IGFueSBkZXBlbmRlbnRzLlxuICAgKi9cbiAgc2V0KHZhbHVlOiBUKTogdm9pZDtcblxuICAvKipcbiAgICogVXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgc2lnbmFsIGJhc2VkIG9uIGl0cyBjdXJyZW50IHZhbHVlLCBhbmRcbiAgICogbm90aWZ5IGFueSBkZXBlbmRlbnRzLlxuICAgKi9cbiAgdXBkYXRlKHVwZGF0ZUZuOiAodmFsdWU6IFQpID0+IFQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIGN1cnJlbnQgdmFsdWUgYnkgbXV0YXRpbmcgaXQgaW4tcGxhY2UsIGFuZFxuICAgKiBub3RpZnkgYW55IGRlcGVuZGVudHMuXG4gICAqL1xuICBtdXRhdGUobXV0YXRvckZuOiAodmFsdWU6IFQpID0+IHZvaWQpOiB2b2lkO1xufVxuXG4vKipcbiAqIEJhY2tpbmcgdHlwZSBmb3IgYSBgU2V0dGFibGVTaWduYWxgLCBhIG11dGFibGUgcmVhY3RpdmUgdmFsdWUuXG4gKi9cbmNsYXNzIFNldHRhYmxlU2lnbmFsSW1wbDxUPiBpbXBsZW1lbnRzIFByb2R1Y2VyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSB2YWx1ZTogVCwgcHJpdmF0ZSBlcXVhbDogVmFsdWVFcXVhbGl0eUZuPFQ+KSB7fVxuXG4gIHJlYWRvbmx5IGlkID0gbmV4dFJlYWN0aXZlSWQoKTtcbiAgcmVhZG9ubHkgcmVmID0gbmV3IFdlYWtSZWYodGhpcyk7XG4gIHJlYWRvbmx5IGNvbnN1bWVycyA9IG5ldyBNYXA8Q29uc3VtZXJJZCwgRWRnZT4oKTtcbiAgdmFsdWVWZXJzaW9uID0gMDtcblxuICBjaGVja0ZvckNoYW5nZWRWYWx1ZSgpOiB2b2lkIHtcbiAgICAvLyBTZXR0YWJsZSBzaWduYWxzIGNhbiBvbmx5IGNoYW5nZSB3aGVuIHNldCwgc28gdGhlcmUncyBub3RoaW5nIHRvIGNoZWNrIGhlcmUuXG4gIH1cblxuICAvKipcbiAgICogRGlyZWN0bHkgdXBkYXRlIHRoZSB2YWx1ZSBvZiB0aGUgc2lnbmFsIHRvIGEgbmV3IHZhbHVlLCB3aGljaCBtYXkgb3IgbWF5IG5vdCBiZVxuICAgKiBlcXVhbCB0byB0aGUgcHJldmlvdXMuXG4gICAqXG4gICAqIEluIHRoZSBldmVudCB0aGF0IGBuZXdWYWx1ZWAgaXMgc2VtYW50aWNhbGx5IGVxdWFsIHRvIHRoZSBjdXJyZW50IHZhbHVlLCBgc2V0YCBpc1xuICAgKiBhIG5vLW9wLlxuICAgKi9cbiAgc2V0KG5ld1ZhbHVlOiBUKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmVxdWFsKHRoaXMudmFsdWUsIG5ld1ZhbHVlKSkge1xuICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlO1xuICAgICAgdGhpcy52YWx1ZVZlcnNpb24rKztcbiAgICAgIHByb2R1Y2VyTm90aWZ5Q29uc3VtZXJzKHRoaXMpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZXJpdmUgYSBuZXcgdmFsdWUgZm9yIHRoZSBzaWduYWwgZnJvbSBpdHMgY3VycmVudCB2YWx1ZSB1c2luZyB0aGUgYHVwZGF0ZXJgIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY2FsbGluZyBgc2V0YCBvbiB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgYHVwZGF0ZXJgIG9uIHRoZSBjdXJyZW50XG4gICAqIHZhbHVlLlxuICAgKi9cbiAgdXBkYXRlKHVwZGF0ZXI6ICh2YWx1ZTogVCkgPT4gVCk6IHZvaWQge1xuICAgIHRoaXMuc2V0KHVwZGF0ZXIodGhpcy52YWx1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxzIGBtdXRhdG9yYCBvbiB0aGUgY3VycmVudCB2YWx1ZSBhbmQgYXNzdW1lcyB0aGF0IGl0IGhhcyBiZWVuIG11dGF0ZWQuXG4gICAqL1xuICBtdXRhdGUobXV0YXRvcjogKHZhbHVlOiBUKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgLy8gTXV0YXRlIGJ5cGFzc2VzIGVxdWFsaXR5IGNoZWNrcyBhcyBpdCdzIGJ5IGRlZmluaXRpb24gY2hhbmdpbmcgdGhlIHZhbHVlLlxuICAgIG11dGF0b3IodGhpcy52YWx1ZSk7XG4gICAgdGhpcy52YWx1ZVZlcnNpb24rKztcbiAgICBwcm9kdWNlck5vdGlmeUNvbnN1bWVycyh0aGlzKTtcbiAgfVxuXG4gIHNpZ25hbCgpOiBUIHtcbiAgICBwcm9kdWNlckFjY2Vzc2VkKHRoaXMpO1xuICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICB9XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYFNpZ25hbGAgdGhhdCBjYW4gYmUgc2V0IG9yIHVwZGF0ZWQgZGlyZWN0bHkuXG4gKlxuICogQGRldmVsb3BlclByZXZpZXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbDxUPihcbiAgICBpbml0aWFsVmFsdWU6IFQsIGVxdWFsOiBWYWx1ZUVxdWFsaXR5Rm48VD4gPSBkZWZhdWx0RXF1YWxzKTogU2V0dGFibGVTaWduYWw8VD4ge1xuICBjb25zdCBzaWduYWxOb2RlID0gbmV3IFNldHRhYmxlU2lnbmFsSW1wbChpbml0aWFsVmFsdWUsIGVxdWFsKTtcbiAgLy8gQ2FzdGluZyBoZXJlIGlzIHJlcXVpcmVkIGZvciBnMy5cbiAgY29uc3Qgc2lnbmFsRm4gPSBjcmVhdGVTaWduYWxGcm9tRnVuY3Rpb24oc2lnbmFsTm9kZS5zaWduYWwuYmluZChzaWduYWxOb2RlKSwge1xuICAgICAgICAgICAgICAgICAgICAgc2V0OiBzaWduYWxOb2RlLnNldC5iaW5kKHNpZ25hbE5vZGUpLFxuICAgICAgICAgICAgICAgICAgICAgdXBkYXRlOiBzaWduYWxOb2RlLnVwZGF0ZS5iaW5kKHNpZ25hbE5vZGUpLFxuICAgICAgICAgICAgICAgICAgICAgbXV0YXRlOiBzaWduYWxOb2RlLm11dGF0ZS5iaW5kKHNpZ25hbE5vZGUpLFxuICAgICAgICAgICAgICAgICAgIH0pIGFzIHVua25vd24gYXMgU2V0dGFibGVTaWduYWw8VD47XG4gIHJldHVybiBzaWduYWxGbjtcbn1cbiJdfQ==
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { setActiveConsumer } from './graph';
9
+ /**
10
+ * Execute an arbitrary function in a non-reactive (non-tracking) context. The executed function
11
+ * can, optionally, return a value.
12
+ *
13
+ * @developerPreview
14
+ */
15
+ export function untracked(nonReactiveReadsFn) {
16
+ const prevConsumer = setActiveConsumer(null);
17
+ // We are not trying to catch any particular errors here, just making sure that the consumers
18
+ // stack is restored in case of errors.
19
+ try {
20
+ return nonReactiveReadsFn();
21
+ }
22
+ finally {
23
+ setActiveConsumer(prevConsumer);
24
+ }
25
+ }
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW50cmFja2VkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFscy9zcmMvdW50cmFja2VkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUUxQzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUksa0JBQTJCO0lBQ3RELE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLDZGQUE2RjtJQUM3Rix1Q0FBdUM7SUFDdkMsSUFBSTtRQUNGLE9BQU8sa0JBQWtCLEVBQUUsQ0FBQztLQUM3QjtZQUFTO1FBQ1IsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDakM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7c2V0QWN0aXZlQ29uc3VtZXJ9IGZyb20gJy4vZ3JhcGgnO1xuXG4vKipcbiAqIEV4ZWN1dGUgYW4gYXJiaXRyYXJ5IGZ1bmN0aW9uIGluIGEgbm9uLXJlYWN0aXZlIChub24tdHJhY2tpbmcpIGNvbnRleHQuIFRoZSBleGVjdXRlZCBmdW5jdGlvblxuICogY2FuLCBvcHRpb25hbGx5LCByZXR1cm4gYSB2YWx1ZS5cbiAqXG4gKiBAZGV2ZWxvcGVyUHJldmlld1xuICovXG5leHBvcnQgZnVuY3Rpb24gdW50cmFja2VkPFQ+KG5vblJlYWN0aXZlUmVhZHNGbjogKCkgPT4gVCk6IFQge1xuICBjb25zdCBwcmV2Q29uc3VtZXIgPSBzZXRBY3RpdmVDb25zdW1lcihudWxsKTtcbiAgLy8gV2UgYXJlIG5vdCB0cnlpbmcgdG8gY2F0Y2ggYW55IHBhcnRpY3VsYXIgZXJyb3JzIGhlcmUsIGp1c3QgbWFraW5nIHN1cmUgdGhhdCB0aGUgY29uc3VtZXJzXG4gIC8vIHN0YWNrIGlzIHJlc3RvcmVkIGluIGNhc2Ugb2YgZXJyb3JzLlxuICB0cnkge1xuICAgIHJldHVybiBub25SZWFjdGl2ZVJlYWRzRm4oKTtcbiAgfSBmaW5hbGx5IHtcbiAgICBzZXRBY3RpdmVDb25zdW1lcihwcmV2Q29uc3VtZXIpO1xuICB9XG59XG4iXX0=
@@ -0,0 +1,54 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { consumerPollValueStatus, nextReactiveId, setActiveConsumer } from './graph';
9
+ import { WeakRef } from './weak_ref';
10
+ /**
11
+ * Watches a reactive expression and allows it to be scheduled to re-run
12
+ * when any dependencies notify of a change.
13
+ *
14
+ * `Watch` doesn't run reactive expressions itself, but relies on a consumer-
15
+ * provided scheduling operation to coordinate calling `Watch.run()`.
16
+ */
17
+ export class Watch {
18
+ constructor(watch, schedule) {
19
+ this.watch = watch;
20
+ this.schedule = schedule;
21
+ this.id = nextReactiveId();
22
+ this.ref = new WeakRef(this);
23
+ this.producers = new Map();
24
+ this.trackingVersion = 0;
25
+ this.dirty = false;
26
+ }
27
+ notify() {
28
+ if (!this.dirty) {
29
+ this.schedule(this);
30
+ }
31
+ this.dirty = true;
32
+ }
33
+ /**
34
+ * Execute the reactive expression in the context of this `Watch` consumer.
35
+ *
36
+ * Should be called by the user scheduling algorithm when the provided
37
+ * `schedule` hook is called by `Watch`.
38
+ */
39
+ run() {
40
+ this.dirty = false;
41
+ if (this.trackingVersion !== 0 && !consumerPollValueStatus(this)) {
42
+ return;
43
+ }
44
+ const prevConsumer = setActiveConsumer(this);
45
+ this.trackingVersion++;
46
+ try {
47
+ this.watch();
48
+ }
49
+ finally {
50
+ setActiveConsumer(prevConsumer);
51
+ }
52
+ }
53
+ }
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9zaWduYWxzL3NyYy93YXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQVcsdUJBQXVCLEVBQVEsY0FBYyxFQUFjLGlCQUFpQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQy9HLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLEtBQUs7SUFRaEIsWUFBb0IsS0FBaUIsRUFBVSxRQUFnQztRQUEzRCxVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBd0I7UUFQdEUsT0FBRSxHQUFHLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLFFBQUcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN4QixjQUFTLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFDakQsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFFWixVQUFLLEdBQUcsS0FBSyxDQUFDO0lBRTRELENBQUM7SUFFbkYsTUFBTTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2YsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyQjtRQUNELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO0lBQ3BCLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILEdBQUc7UUFDRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLElBQUksQ0FBQyxlQUFlLEtBQUssQ0FBQyxJQUFJLENBQUMsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDaEUsT0FBTztTQUNSO1FBRUQsTUFBTSxZQUFZLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDN0MsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUk7WUFDRixJQUFJLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDZDtnQkFBUztZQUNSLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Q29uc3VtZXIsIGNvbnN1bWVyUG9sbFZhbHVlU3RhdHVzLCBFZGdlLCBuZXh0UmVhY3RpdmVJZCwgUHJvZHVjZXJJZCwgc2V0QWN0aXZlQ29uc3VtZXJ9IGZyb20gJy4vZ3JhcGgnO1xuaW1wb3J0IHtXZWFrUmVmfSBmcm9tICcuL3dlYWtfcmVmJztcblxuLyoqXG4gKiBXYXRjaGVzIGEgcmVhY3RpdmUgZXhwcmVzc2lvbiBhbmQgYWxsb3dzIGl0IHRvIGJlIHNjaGVkdWxlZCB0byByZS1ydW5cbiAqIHdoZW4gYW55IGRlcGVuZGVuY2llcyBub3RpZnkgb2YgYSBjaGFuZ2UuXG4gKlxuICogYFdhdGNoYCBkb2Vzbid0IHJ1biByZWFjdGl2ZSBleHByZXNzaW9ucyBpdHNlbGYsIGJ1dCByZWxpZXMgb24gYSBjb25zdW1lci1cbiAqIHByb3ZpZGVkIHNjaGVkdWxpbmcgb3BlcmF0aW9uIHRvIGNvb3JkaW5hdGUgY2FsbGluZyBgV2F0Y2gucnVuKClgLlxuICovXG5leHBvcnQgY2xhc3MgV2F0Y2ggaW1wbGVtZW50cyBDb25zdW1lciB7XG4gIHJlYWRvbmx5IGlkID0gbmV4dFJlYWN0aXZlSWQoKTtcbiAgcmVhZG9ubHkgcmVmID0gbmV3IFdlYWtSZWYodGhpcyk7XG4gIHJlYWRvbmx5IHByb2R1Y2VycyA9IG5ldyBNYXA8UHJvZHVjZXJJZCwgRWRnZT4oKTtcbiAgdHJhY2tpbmdWZXJzaW9uID0gMDtcblxuICBwcml2YXRlIGRpcnR5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB3YXRjaDogKCkgPT4gdm9pZCwgcHJpdmF0ZSBzY2hlZHVsZTogKHdhdGNoOiBXYXRjaCkgPT4gdm9pZCkge31cblxuICBub3RpZnkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpcnR5KSB7XG4gICAgICB0aGlzLnNjaGVkdWxlKHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIHRoZSByZWFjdGl2ZSBleHByZXNzaW9uIGluIHRoZSBjb250ZXh0IG9mIHRoaXMgYFdhdGNoYCBjb25zdW1lci5cbiAgICpcbiAgICogU2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgdXNlciBzY2hlZHVsaW5nIGFsZ29yaXRobSB3aGVuIHRoZSBwcm92aWRlZFxuICAgKiBgc2NoZWR1bGVgIGhvb2sgaXMgY2FsbGVkIGJ5IGBXYXRjaGAuXG4gICAqL1xuICBydW4oKTogdm9pZCB7XG4gICAgdGhpcy5kaXJ0eSA9IGZhbHNlO1xuICAgIGlmICh0aGlzLnRyYWNraW5nVmVyc2lvbiAhPT0gMCAmJiAhY29uc3VtZXJQb2xsVmFsdWVTdGF0dXModGhpcykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2Q29uc3VtZXIgPSBzZXRBY3RpdmVDb25zdW1lcih0aGlzKTtcbiAgICB0aGlzLnRyYWNraW5nVmVyc2lvbisrO1xuICAgIHRyeSB7XG4gICAgICB0aGlzLndhdGNoKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEFjdGl2ZUNvbnN1bWVyKHByZXZDb25zdW1lcik7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @license
3
+ * Copyright Google LLC All Rights Reserved.
4
+ *
5
+ * Use of this source code is governed by an MIT-style license that can be
6
+ * found in the LICENSE file at https://angular.io/license
7
+ */
8
+ import { global } from '../../util/global';
9
+ // tslint:disable-next-line: no-toplevel-property-access
10
+ export const WeakRef = global['WeakRef'];
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vha19yZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9zaWduYWxzL3NyYy93ZWFrX3JlZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFhekMsd0RBQXdEO0FBQ3hELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBZ0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Z2xvYmFsfSBmcm9tICcuLi8uLi91dGlsL2dsb2JhbCc7XG5cbi8vIGBXZWFrUmVmYCBpcyBub3QgYWx3YXlzIGRlZmluZWQgaW4gZXZlcnkgVFMgZW52aXJvbm1lbnQgd2hlcmUgQW5ndWxhciBpcyBjb21waWxlZC4gSW5zdGVhZCxcbi8vIGFsaWFzIGl0IGFzIGEgbG9jYWwgZXhwb3J0IGJ5IHJlYWRpbmcgaXQgb2ZmIG9mIHRoZSBnbG9iYWwgY29udGV4dC5cblxuZXhwb3J0IGludGVyZmFjZSBXZWFrUmVmPFQgZXh0ZW5kcyBvYmplY3Q+IHtcbiAgZGVyZWYoKTogVHx1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2Vha1JlZkN0b3Ige1xuICBuZXc8VCBleHRlbmRzIG9iamVjdD4odmFsdWU6IFQpOiBXZWFrUmVmPFQ+O1xufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXRvcGxldmVsLXByb3BlcnR5LWFjY2Vzc1xuZXhwb3J0IGNvbnN0IFdlYWtSZWY6IFdlYWtSZWZDdG9yID0gZ2xvYmFsWydXZWFrUmVmJ107XG4iXX0=