@angular/core 15.2.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.
- package/esm2020/src/core.mjs +2 -1
- package/esm2020/src/core_reactivity_export.mjs +11 -0
- package/esm2020/src/core_reactivity_export_internal.mjs +9 -0
- package/esm2020/src/render/api_flags.mjs +1 -1
- package/esm2020/src/signals/index.mjs +15 -0
- package/esm2020/src/signals/src/api.mjs +46 -0
- package/esm2020/src/signals/src/computed.mjs +142 -0
- package/esm2020/src/signals/src/effect.mjs +69 -0
- package/esm2020/src/signals/src/graph.mjs +114 -0
- package/esm2020/src/signals/src/signal.mjs +78 -0
- package/esm2020/src/signals/src/untracked.mjs +26 -0
- package/esm2020/src/signals/src/watch.mjs +54 -0
- package/esm2020/src/signals/src/weak_ref.mjs +11 -0
- package/esm2020/src/version.mjs +1 -1
- package/esm2020/testing/src/logger.mjs +3 -3
- package/esm2020/testing/src/ng_zone_mock.mjs +3 -3
- package/fesm2015/core.mjs +480 -3
- package/fesm2015/core.mjs.map +1 -1
- package/fesm2015/testing.mjs +2 -2
- package/fesm2015/testing.mjs.map +1 -1
- package/fesm2020/core.mjs +478 -3
- package/fesm2020/core.mjs.map +1 -1
- package/fesm2020/testing.mjs +2 -2
- package/fesm2020/testing.mjs.map +1 -1
- package/index.d.ts +286 -2
- package/package.json +1 -1
- package/schematics/ng-generate/standalone-migration/bundle.js +530 -767
- package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
- package/testing/index.d.ts +1 -1
package/esm2020/src/core.mjs
CHANGED
|
@@ -32,6 +32,7 @@ export { EventEmitter } from './event_emitter';
|
|
|
32
32
|
export { ErrorHandler } from './error_handler';
|
|
33
33
|
export * from './core_private_export';
|
|
34
34
|
export * from './core_render3_private_export';
|
|
35
|
+
export * from './core_reactivity_export';
|
|
35
36
|
export { SecurityContext } from './sanitization/security';
|
|
36
37
|
export { Sanitizer } from './sanitization/sanitizer';
|
|
37
38
|
export { createNgModule, createNgModuleRef, createEnvironmentInjector } from './render3/ng_module_ref';
|
|
@@ -50,4 +51,4 @@ if (typeof ngDevMode !== 'undefined' && ngDevMode) {
|
|
|
50
51
|
'For server-side rendering applications add the import to your `main.server.ts` file.)');
|
|
51
52
|
};
|
|
52
53
|
}
|
|
53
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
54
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2NvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUg7Ozs7R0FJRztBQUNILGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsV0FBVyxDQUFDO0FBRTFCLGNBQWMsTUFBTSxDQUFDO0FBQ3JCLE9BQU8sRUFBQyxjQUFjLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQW9CLFdBQVcsRUFBRSxjQUFjLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbkwsT0FBTyxFQUFDLGNBQWMsRUFBRSxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsTUFBTSxFQUFFLGdCQUFnQixFQUFFLG9CQUFvQixFQUFFLFdBQVcsRUFBRSxzQkFBc0IsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hKLE9BQU8sRUFBQyxlQUFlLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMxRSxjQUFjLFFBQVEsQ0FBQztBQUN2QixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLFVBQVUsQ0FBQztBQUN6QixjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQzFILE9BQU8sRUFBaUIsV0FBVyxFQUFFLG1CQUFtQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakgsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLDJCQUEyQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixFQUFFLDBCQUEwQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzlILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBZSxJQUFJLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDbkQsT0FBTyxFQUFDLGNBQWMsRUFBRSxpQkFBaUIsRUFBRSx5QkFBeUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JHLE9BQU8sRUFBQyxlQUFlLEVBQUUsb0JBQW9CLEVBQWtCLE1BQU0scUJBQXFCLENBQUM7QUFDM0YsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRWxELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsSUFBSSxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxFQUFFO0lBQ2pELGdHQUFnRztJQUNoRyw4Q0FBOEM7SUFDOUMsd0RBQXdEO0lBQ3hELE1BQU0sQ0FBQyxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBQVMsSUFBSTtRQUNyQyxNQUFNLElBQUksS0FBSyxDQUNYLDRFQUE0RTtZQUM1RSxpRkFBaUY7WUFDakYsK0RBQStEO1lBQy9ELGdHQUFnRztZQUNoRyx1RkFBdUYsQ0FBQyxDQUFDO0lBQy9GLENBQUMsQ0FBQztDQUNIIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8qKlxuICogQG1vZHVsZVxuICogQGRlc2NyaXB0aW9uXG4gKiBFbnRyeSBwb2ludCBmcm9tIHdoaWNoIHlvdSBzaG91bGQgaW1wb3J0IGFsbCBwdWJsaWMgY29yZSBBUElzLlxuICovXG5leHBvcnQgKiBmcm9tICcuL21ldGFkYXRhJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbic7XG5leHBvcnQge1R5cGVEZWNvcmF0b3J9IGZyb20gJy4vdXRpbC9kZWNvcmF0b3JzJztcbmV4cG9ydCAqIGZyb20gJy4vZGknO1xuZXhwb3J0IHtjcmVhdGVQbGF0Zm9ybSwgYXNzZXJ0UGxhdGZvcm0sIGRlc3Ryb3lQbGF0Zm9ybSwgZ2V0UGxhdGZvcm0sIEJvb3RzdHJhcE9wdGlvbnMsIFBsYXRmb3JtUmVmLCBBcHBsaWNhdGlvblJlZiwgY3JlYXRlUGxhdGZvcm1GYWN0b3J5LCBOZ1Byb2JlVG9rZW59IGZyb20gJy4vYXBwbGljYXRpb25fcmVmJztcbmV4cG9ydCB7ZW5hYmxlUHJvZE1vZGUsIGlzRGV2TW9kZX0gZnJvbSAnLi91dGlsL2lzX2Rldl9tb2RlJztcbmV4cG9ydCB7QVBQX0lELCBQQUNLQUdFX1JPT1RfVVJMLCBQTEFURk9STV9JTklUSUFMSVpFUiwgUExBVEZPUk1fSUQsIEFQUF9CT09UU1RSQVBfTElTVEVORVIsIEFOSU1BVElPTl9NT0RVTEVfVFlQRX0gZnJvbSAnLi9hcHBsaWNhdGlvbl90b2tlbnMnO1xuZXhwb3J0IHtBUFBfSU5JVElBTElaRVIsIEFwcGxpY2F0aW9uSW5pdFN0YXR1c30gZnJvbSAnLi9hcHBsaWNhdGlvbl9pbml0JztcbmV4cG9ydCAqIGZyb20gJy4vem9uZSc7XG5leHBvcnQgKiBmcm9tICcuL3JlbmRlcic7XG5leHBvcnQgKiBmcm9tICcuL2xpbmtlcic7XG5leHBvcnQgKiBmcm9tICcuL2xpbmtlci9uZ19tb2R1bGVfZmFjdG9yeV9sb2FkZXJfaW1wbCc7XG5leHBvcnQge0RlYnVnRWxlbWVudCwgRGVidWdFdmVudExpc3RlbmVyLCBEZWJ1Z05vZGUsIGFzTmF0aXZlRWxlbWVudHMsIGdldERlYnVnTm9kZSwgUHJlZGljYXRlfSBmcm9tICcuL2RlYnVnL2RlYnVnX25vZGUnO1xuZXhwb3J0IHtHZXRUZXN0YWJpbGl0eSwgVGVzdGFiaWxpdHksIFRlc3RhYmlsaXR5UmVnaXN0cnksIHNldFRlc3RhYmlsaXR5R2V0dGVyfSBmcm9tICcuL3Rlc3RhYmlsaXR5L3Rlc3RhYmlsaXR5JztcbmV4cG9ydCAqIGZyb20gJy4vY2hhbmdlX2RldGVjdGlvbic7XG5leHBvcnQgKiBmcm9tICcuL3BsYXRmb3JtX2NvcmVfcHJvdmlkZXJzJztcbmV4cG9ydCB7VFJBTlNMQVRJT05TLCBUUkFOU0xBVElPTlNfRk9STUFULCBMT0NBTEVfSUQsIERFRkFVTFRfQ1VSUkVOQ1lfQ09ERSwgTWlzc2luZ1RyYW5zbGF0aW9uU3RyYXRlZ3l9IGZyb20gJy4vaTE4bi90b2tlbnMnO1xuZXhwb3J0IHtBcHBsaWNhdGlvbk1vZHVsZX0gZnJvbSAnLi9hcHBsaWNhdGlvbl9tb2R1bGUnO1xuZXhwb3J0IHtBYnN0cmFjdFR5cGUsIFR5cGV9IGZyb20gJy4vaW50ZXJmYWNlL3R5cGUnO1xuZXhwb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJy4vZXZlbnRfZW1pdHRlcic7XG5leHBvcnQge0Vycm9ySGFuZGxlcn0gZnJvbSAnLi9lcnJvcl9oYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29yZV9wcml2YXRlX2V4cG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmVfcmVuZGVyM19wcml2YXRlX2V4cG9ydCc7XG5leHBvcnQgKiBmcm9tICcuL2NvcmVfcmVhY3Rpdml0eV9leHBvcnQnO1xuZXhwb3J0IHtTZWN1cml0eUNvbnRleHR9IGZyb20gJy4vc2FuaXRpemF0aW9uL3NlY3VyaXR5JztcbmV4cG9ydCB7U2FuaXRpemVyfSBmcm9tICcuL3Nhbml0aXphdGlvbi9zYW5pdGl6ZXInO1xuZXhwb3J0IHtjcmVhdGVOZ01vZHVsZSwgY3JlYXRlTmdNb2R1bGVSZWYsIGNyZWF0ZUVudmlyb25tZW50SW5qZWN0b3J9IGZyb20gJy4vcmVuZGVyMy9uZ19tb2R1bGVfcmVmJztcbmV4cG9ydCB7Y3JlYXRlQ29tcG9uZW50LCByZWZsZWN0Q29tcG9uZW50VHlwZSwgQ29tcG9uZW50TWlycm9yfSBmcm9tICcuL3JlbmRlcjMvY29tcG9uZW50JztcbmV4cG9ydCB7aXNTdGFuZGFsb25lfSBmcm9tICcuL3JlbmRlcjMvZGVmaW5pdGlvbic7XG5cbmltcG9ydCB7Z2xvYmFsfSBmcm9tICcuL3V0aWwvZ2xvYmFsJztcbmlmICh0eXBlb2YgbmdEZXZNb2RlICE9PSAndW5kZWZpbmVkJyAmJiBuZ0Rldk1vZGUpIHtcbiAgLy8gVGhpcyBoZWxwZXIgaXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgZXJyb3IgbWVzc2FnZSB0byBwZW9wbGUgdXBncmFkaW5nIHRvIHY5IHRoYXQgaGF2ZSBub3QgeWV0XG4gIC8vIGluc3RhbGxlZCBgQGFuZ3VsYXIvbG9jYWxpemVgIGluIHRoZWlyIGFwcC5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3NcbiAgZ2xvYmFsLiRsb2NhbGl6ZSA9IGdsb2JhbC4kbG9jYWxpemUgfHwgZnVuY3Rpb24oKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSXQgbG9va3MgbGlrZSB5b3VyIGFwcGxpY2F0aW9uIG9yIG9uZSBvZiBpdHMgZGVwZW5kZW5jaWVzIGlzIHVzaW5nIGkxOG4uXFxuJyArXG4gICAgICAgICdBbmd1bGFyIDkgaW50cm9kdWNlZCBhIGdsb2JhbCBgJGxvY2FsaXplKClgIGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgbG9hZGVkLlxcbicgK1xuICAgICAgICAnUGxlYXNlIHJ1biBgbmcgYWRkIEBhbmd1bGFyL2xvY2FsaXplYCBmcm9tIHRoZSBBbmd1bGFyIENMSS5cXG4nICtcbiAgICAgICAgJyhGb3Igbm9uLUNMSSBwcm9qZWN0cywgYWRkIGBpbXBvcnQgXFwnQGFuZ3VsYXIvbG9jYWxpemUvaW5pdFxcJztgIHRvIHlvdXIgYHBvbHlmaWxscy50c2AgZmlsZS5cXG4nICtcbiAgICAgICAgJ0ZvciBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgYXBwbGljYXRpb25zIGFkZCB0aGUgaW1wb3J0IHRvIHlvdXIgYG1haW4uc2VydmVyLnRzYCBmaWxlLiknKTtcbiAgfTtcbn1cbiJdfQ==
|
|
@@ -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
|
+
// This file exists to allow the set of reactivity exports to be modified in g3, as these APIs are
|
|
9
|
+
// only "beta" for the time being.
|
|
10
|
+
export * from './core_reactivity_export_internal';
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZV9yZWFjdGl2aXR5X2V4cG9ydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2NvcmVfcmVhY3Rpdml0eV9leHBvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsa0dBQWtHO0FBQ2xHLGtDQUFrQztBQUVsQyxjQUFjLG1DQUFtQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbi8vIFRoaXMgZmlsZSBleGlzdHMgdG8gYWxsb3cgdGhlIHNldCBvZiByZWFjdGl2aXR5IGV4cG9ydHMgdG8gYmUgbW9kaWZpZWQgaW4gZzMsIGFzIHRoZXNlIEFQSXMgYXJlXG4vLyBvbmx5IFwiYmV0YVwiIGZvciB0aGUgdGltZSBiZWluZy5cblxuZXhwb3J0ICogZnJvbSAnLi9jb3JlX3JlYWN0aXZpdHlfZXhwb3J0X2ludGVybmFsJztcbiJdfQ==
|
|
@@ -0,0 +1,9 @@
|
|
|
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
|
+
export { computed, effect, isSignal, signal, untracked } from './signals';
|
|
9
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZV9yZWFjdGl2aXR5X2V4cG9ydF9pbnRlcm5hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2NvcmVfcmVhY3Rpdml0eV9leHBvcnRfaW50ZXJuYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQVUsUUFBUSxFQUEwQixNQUFNLEVBQUUsU0FBUyxFQUFrQixNQUFNLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5leHBvcnQge2NvbXB1dGVkLCBlZmZlY3QsIEVmZmVjdCwgaXNTaWduYWwsIFNldHRhYmxlU2lnbmFsLCBTaWduYWwsIHNpZ25hbCwgdW50cmFja2VkLCBWYWx1ZUVxdWFsaXR5Rm59IGZyb20gJy4vc2lnbmFscyc7XG4iXX0=
|
|
@@ -23,4 +23,4 @@ export var RendererStyleFlags2;
|
|
|
23
23
|
*/
|
|
24
24
|
RendererStyleFlags2[RendererStyleFlags2["DashCase"] = 2] = "DashCase";
|
|
25
25
|
})(RendererStyleFlags2 || (RendererStyleFlags2 = {}));
|
|
26
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpX2ZsYWdzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyL2FwaV9mbGFncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUF1Q0g7OztHQUdHO0FBQ0gsTUFBTSxDQUFOLElBQVksbUJBWVg7QUFaRCxXQUFZLG1CQUFtQjtJQUM3QixnR0FBZ0c7SUFDaEcsK0ZBQStGO0lBQy9GLDRGQUE0RjtJQUM1Rjs7T0FFRztJQUNILHVFQUFrQixDQUFBO0lBQ2xCOztPQUVHO0lBQ0gscUVBQWlCLENBQUE7QUFDbkIsQ0FBQyxFQVpXLG1CQUFtQixLQUFuQixtQkFBbUIsUUFZOUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtWaWV3RW5jYXBzdWxhdGlvbn0gZnJvbSAnLi4vbWV0YWRhdGEvdmlldyc7XG5cblxuLyoqXG4gKiBVc2VkIGJ5IGBSZW5kZXJlckZhY3RvcnkyYCB0byBhc3NvY2lhdGUgY3VzdG9tIHJlbmRlcmluZyBkYXRhIGFuZCBzdHlsZXNcbiAqIHdpdGggYSByZW5kZXJpbmcgaW1wbGVtZW50YXRpb24uXG4gKiAgQHB1YmxpY0FwaVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlcmVyVHlwZTIge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWRlbnRpZnlpbmcgc3RyaW5nIGZvciB0aGUgbmV3IHJlbmRlcmVyLCB1c2VkIHdoZW4gY3JlYXRpbmdcbiAgICogdW5pcXVlIHN0eWxlcyBmb3IgZW5jYXBzdWxhdGlvbi5cbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBUaGUgdmlldyBlbmNhcHN1bGF0aW9uIHR5cGUsIHdoaWNoIGRldGVybWluZXMgaG93IHN0eWxlcyBhcmUgYXBwbGllZCB0b1xuICAgKiBET00gZWxlbWVudHMuIE9uZSBvZlxuICAgKiAtIGBFbXVsYXRlZGAgKGRlZmF1bHQpOiBFbXVsYXRlIG5hdGl2ZSBzY29waW5nIG9mIHN0eWxlcy5cbiAgICogLSBgTmF0aXZlYDogVXNlIHRoZSBuYXRpdmUgZW5jYXBzdWxhdGlvbiBtZWNoYW5pc20gb2YgdGhlIHJlbmRlcmVyLlxuICAgKiAtIGBTaGFkb3dEb21gOiBVc2UgbW9kZXJuIFtTaGFkb3dcbiAgICogRE9NXShodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL3NoYWRvdy8pIGFuZFxuICAgKiBjcmVhdGUgYSBTaGFkb3dSb290IGZvciBjb21wb25lbnQncyBob3N0IGVsZW1lbnQuXG4gICAqIC0gYE5vbmVgOiBEbyBub3QgcHJvdmlkZSBhbnkgdGVtcGxhdGUgb3Igc3R5bGUgZW5jYXBzdWxhdGlvbi5cbiAgICovXG4gIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uO1xuICAvKipcbiAgICogRGVmaW5lcyBDU1Mgc3R5bGVzIHRvIGJlIHN0b3JlZCBvbiBhIHJlbmRlcmVyIGluc3RhbmNlLlxuICAgKi9cbiAgc3R5bGVzOiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIERlZmluZXMgYXJiaXRyYXJ5IGRldmVsb3Blci1kZWZpbmVkIGRhdGEgdG8gYmUgc3RvcmVkIG9uIGEgcmVuZGVyZXIgaW5zdGFuY2UuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciByZW5kZXJlcnMgdGhhdCBkZWxlZ2F0ZSB0byBvdGhlciByZW5kZXJlcnMuXG4gICAqL1xuICBkYXRhOiB7W2tpbmQ6IHN0cmluZ106IGFueX07XG59XG5cblxuLyoqXG4gKiBGbGFncyBmb3IgcmVuZGVyZXItc3BlY2lmaWMgc3R5bGUgbW9kaWZpZXJzLlxuICogQHB1YmxpY0FwaVxuICovXG5leHBvcnQgZW51bSBSZW5kZXJlclN0eWxlRmxhZ3MyIHtcbiAgLy8gVE9ETyhtaXNrbyk6IFRoaXMgbmVlZHMgdG8gYmUgcmVmYWN0b3JlZCBpbnRvIGEgc2VwYXJhdGUgZmlsZSBzbyB0aGF0IGl0IGNhbiBiZSBpbXBvcnRlZCBmcm9tXG4gIC8vIGBub2RlX21hbmlwdWxhdGlvbi50c2AgQ3VycmVudGx5IGRvaW5nIHRoZSBpbXBvcnQgY2F1c2UgcmVzb2x1dGlvbiBvcmRlciB0byBjaGFuZ2UgYW5kIGZhaWxzXG4gIC8vIHRoZSB0ZXN0cy4gVGhlIHdvcmsgYXJvdW5kIGlzIHRvIGhhdmUgaGFyZCBjb2RlZCB2YWx1ZSBpbiBgbm9kZV9tYW5pcHVsYXRpb24udHNgIGZvciBub3cuXG4gIC8qKlxuICAgKiBNYXJrcyBhIHN0eWxlIGFzIGltcG9ydGFudC5cbiAgICovXG4gIEltcG9ydGFudCA9IDEgPDwgMCxcbiAgLyoqXG4gICAqIE1hcmtzIGEgc3R5bGUgYXMgdXNpbmcgZGFzaCBjYXNlIG5hbWluZyAodGhpcy1pcy1kYXNoLWNhc2UpLlxuICAgKi9cbiAgRGFzaENhc2UgPSAxIDw8IDFcbn1cbiJdfQ==
|
|
@@ -0,0 +1,15 @@
|
|
|
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
|
+
export { isSignal } from './src/api';
|
|
9
|
+
export { computed } from './src/computed';
|
|
10
|
+
export { effect } from './src/effect';
|
|
11
|
+
export { setActiveConsumer } from './src/graph';
|
|
12
|
+
export { signal } from './src/signal';
|
|
13
|
+
export { untracked } from './src/untracked';
|
|
14
|
+
export { Watch } from './src/watch';
|
|
15
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9zaWduYWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQTBCLE1BQU0sV0FBVyxDQUFDO0FBQzVELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsTUFBTSxFQUFTLE1BQU0sY0FBYyxDQUFDO0FBQzVDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM5QyxPQUFPLEVBQWlCLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGFBQWEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5leHBvcnQge2lzU2lnbmFsLCBTaWduYWwsIFZhbHVlRXF1YWxpdHlGbn0gZnJvbSAnLi9zcmMvYXBpJztcbmV4cG9ydCB7Y29tcHV0ZWR9IGZyb20gJy4vc3JjL2NvbXB1dGVkJztcbmV4cG9ydCB7ZWZmZWN0LCBFZmZlY3R9IGZyb20gJy4vc3JjL2VmZmVjdCc7XG5leHBvcnQge3NldEFjdGl2ZUNvbnN1bWVyfSBmcm9tICcuL3NyYy9ncmFwaCc7XG5leHBvcnQge1NldHRhYmxlU2lnbmFsLCBzaWduYWx9IGZyb20gJy4vc3JjL3NpZ25hbCc7XG5leHBvcnQge3VudHJhY2tlZH0gZnJvbSAnLi9zcmMvdW50cmFja2VkJztcbmV4cG9ydCB7V2F0Y2h9IGZyb20gJy4vc3JjL3dhdGNoJztcbiJdfQ==
|
|
@@ -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
|