@angular/core 16.0.0-next.4 → 16.0.0-next.5
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 → esm2022}/src/application_init.mjs +3 -3
- package/{esm2020 → esm2022}/src/application_module.mjs +4 -4
- package/esm2022/src/application_ref.mjs +908 -0
- package/{esm2020 → esm2022}/src/change_detection/change_detector_ref.mjs +6 -6
- package/esm2022/src/change_detection/differs/iterable_differs.mjs +81 -0
- package/esm2022/src/change_detection/differs/keyvalue_differs.mjs +74 -0
- package/{esm2020 → esm2022}/src/console.mjs +3 -3
- package/{esm2020 → esm2022}/src/core.mjs +2 -1
- package/esm2022/src/core_private_export.mjs +39 -0
- package/esm2022/src/core_reactivity_export_internal.mjs +12 -0
- package/esm2022/src/di/contextual.mjs +54 -0
- package/esm2022/src/di/index.mjs +29 -0
- package/esm2022/src/di/injector.mjs +62 -0
- package/esm2022/src/di/injector_compatibility.mjs +239 -0
- package/esm2022/src/di/provider_collection.mjs +279 -0
- package/esm2022/src/di/reflective_injector.mjs +311 -0
- package/esm2022/src/hydration/annotate.mjs +426 -0
- package/esm2022/src/hydration/api.mjs +143 -0
- package/esm2022/src/hydration/cleanup.mjs +103 -0
- package/esm2022/src/hydration/node_lookup_utils.mjs +273 -0
- package/esm2022/src/hydration/utils.mjs +219 -0
- package/esm2022/src/initial_render_pending_tasks.mjs +75 -0
- package/{esm2020 → esm2022}/src/linker/compiler.mjs +5 -5
- package/esm2022/src/linker/component_factory_resolver.mjs +42 -0
- package/{esm2020 → esm2022}/src/linker/destroy_ref.mjs +11 -11
- package/{esm2020 → esm2022}/src/linker/element_ref.mjs +6 -6
- package/esm2022/src/linker/query_list.mjs +169 -0
- package/{esm2020 → esm2022}/src/linker/template_ref.mjs +6 -6
- package/{esm2020 → esm2022}/src/linker/view_container_ref.mjs +6 -6
- package/esm2022/src/metadata/di.mjs +69 -0
- package/{esm2020 → esm2022}/src/metadata/directives.mjs +1 -1
- package/{esm2020 → esm2022}/src/metadata/do_boostrap.mjs +1 -1
- package/{esm2020 → esm2022}/src/metadata/ng_module.mjs +2 -2
- package/esm2022/src/metadata.mjs +18 -0
- package/{esm2020 → esm2022}/src/render/api.mjs +6 -6
- package/esm2022/src/render3/component_ref.mjs +386 -0
- package/{esm2020 → esm2022}/src/render3/context_discovery.mjs +1 -1
- package/esm2022/src/render3/features/standalone_feature.mjs +70 -0
- package/{esm2020 → esm2022}/src/render3/instructions/element.mjs +2 -2
- package/esm2022/src/render3/instructions/listener.mjs +244 -0
- package/esm2022/src/render3/instructions/mark_view_dirty.mjs +35 -0
- package/esm2022/src/render3/instructions/shared.mjs +1681 -0
- package/{esm2020 → esm2022}/src/render3/instructions/styling.mjs +5 -2
- package/esm2022/src/render3/interfaces/view.mjs +49 -0
- package/esm2022/src/render3/jit/module.mjs +531 -0
- package/esm2022/src/render3/node_manipulation.mjs +960 -0
- package/esm2022/src/render3/reactive_lview_consumer.mjs +80 -0
- package/esm2022/src/render3/reactivity/effect.mjs +67 -0
- package/{esm2020 → esm2022}/src/render3/util/change_detection_utils.mjs +2 -2
- package/esm2022/src/render3/view_ref.mjs +307 -0
- package/{esm2020 → esm2022}/src/sanitization/sanitizer.mjs +7 -7
- package/esm2022/src/signals/index.mjs +15 -0
- package/esm2022/src/signals/src/api.mjs +47 -0
- package/esm2022/src/signals/src/computed.mjs +139 -0
- package/esm2022/src/signals/src/graph.mjs +165 -0
- package/esm2022/src/signals/src/signal.mjs +75 -0
- package/esm2022/src/signals/src/watch.mjs +62 -0
- package/esm2022/src/signals/src/weak_ref.mjs +35 -0
- package/{esm2020 → esm2022}/src/testability/testability.mjs +5 -5
- package/esm2022/src/transfer_state.mjs +153 -0
- package/{esm2020 → esm2022}/src/version.mjs +1 -1
- package/{esm2020 → esm2022}/testing/src/logger.mjs +4 -4
- package/{esm2020 → esm2022}/testing/src/ng_zone_mock.mjs +4 -4
- package/{esm2020 → esm2022}/testing/src/test_bed.mjs +2 -2
- package/{fesm2020 → fesm2022}/core.mjs +869 -639
- package/fesm2022/core.mjs.map +1 -0
- package/{fesm2020 → fesm2022}/testing.mjs +406 -124
- package/fesm2022/testing.mjs.map +1 -0
- package/index.d.ts +334 -187
- package/package.json +8 -16
- package/schematics/migrations/guard-and-resolve-interfaces/bundle.js +694 -0
- package/schematics/migrations/guard-and-resolve-interfaces/bundle.js.map +7 -0
- package/schematics/migrations/{router-link-with-href → remove-module-id}/bundle.js +149 -151
- package/schematics/migrations/remove-module-id/bundle.js.map +7 -0
- package/schematics/migrations.json +8 -8
- package/schematics/ng-generate/standalone-migration/bundle.js +617 -251
- package/schematics/ng-generate/standalone-migration/bundle.js.map +2 -2
- package/testing/index.d.ts +1 -1
- package/esm2020/src/application_ref.mjs +0 -907
- package/esm2020/src/change_detection/differs/iterable_differs.mjs +0 -81
- package/esm2020/src/change_detection/differs/keyvalue_differs.mjs +0 -74
- package/esm2020/src/core_private_export.mjs +0 -38
- package/esm2020/src/core_reactivity_export_internal.mjs +0 -9
- package/esm2020/src/di/contextual.mjs +0 -37
- package/esm2020/src/di/index.mjs +0 -29
- package/esm2020/src/di/injector.mjs +0 -62
- package/esm2020/src/di/injector_compatibility.mjs +0 -236
- package/esm2020/src/di/provider_collection.mjs +0 -279
- package/esm2020/src/di/reflective_injector.mjs +0 -311
- package/esm2020/src/hydration/annotate.mjs +0 -384
- package/esm2020/src/hydration/api.mjs +0 -141
- package/esm2020/src/hydration/cleanup.mjs +0 -101
- package/esm2020/src/hydration/node_lookup_utils.mjs +0 -275
- package/esm2020/src/hydration/utils.mjs +0 -219
- package/esm2020/src/linker/component_factory_resolver.mjs +0 -42
- package/esm2020/src/linker/query_list.mjs +0 -169
- package/esm2020/src/metadata/di.mjs +0 -108
- package/esm2020/src/metadata.mjs +0 -18
- package/esm2020/src/render3/component_ref.mjs +0 -377
- package/esm2020/src/render3/features/standalone_feature.mjs +0 -70
- package/esm2020/src/render3/instructions/listener.mjs +0 -243
- package/esm2020/src/render3/instructions/shared.mjs +0 -1696
- package/esm2020/src/render3/interfaces/view.mjs +0 -47
- package/esm2020/src/render3/jit/module.mjs +0 -544
- package/esm2020/src/render3/node_manipulation.mjs +0 -961
- package/esm2020/src/render3/view_ref.mjs +0 -306
- package/esm2020/src/signals/index.mjs +0 -16
- package/esm2020/src/signals/src/api.mjs +0 -46
- package/esm2020/src/signals/src/computed.mjs +0 -142
- package/esm2020/src/signals/src/effect.mjs +0 -67
- package/esm2020/src/signals/src/graph.mjs +0 -114
- package/esm2020/src/signals/src/signal.mjs +0 -78
- package/esm2020/src/signals/src/watch.mjs +0 -54
- package/esm2020/src/signals/src/weak_ref.mjs +0 -27
- package/esm2020/src/transfer_state.mjs +0 -153
- package/fesm2015/core.mjs +0 -30473
- package/fesm2015/core.mjs.map +0 -1
- package/fesm2015/testing.mjs +0 -26417
- package/fesm2015/testing.mjs.map +0 -1
- package/fesm2020/core.mjs.map +0 -1
- package/fesm2020/testing.mjs.map +0 -1
- package/schematics/migrations/relative-link-resolution/bundle.js +0 -283
- package/schematics/migrations/relative-link-resolution/bundle.js.map +0 -7
- package/schematics/migrations/router-link-with-href/bundle.js.map +0 -7
- /package/{esm2020 → esm2022}/core.mjs +0 -0
- /package/{esm2020 → esm2022}/index.mjs +0 -0
- /package/{esm2020 → esm2022}/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/src/application_config.mjs +0 -0
- /package/{esm2020 → esm2022}/src/application_tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/src/change_detection/change_detection.mjs +0 -0
- /package/{esm2020 → esm2022}/src/change_detection/constants.mjs +0 -0
- /package/{esm2020 → esm2022}/src/change_detection/differs/default_iterable_differ.mjs +0 -0
- /package/{esm2020 → esm2022}/src/change_detection/differs/default_keyvalue_differ.mjs +0 -0
- /package/{esm2020 → esm2022}/src/change_detection/pipe_transform.mjs +0 -0
- /package/{esm2020 → esm2022}/src/change_detection.mjs +0 -0
- /package/{esm2020 → esm2022}/src/compiler/compiler_facade.mjs +0 -0
- /package/{esm2020 → esm2022}/src/compiler/compiler_facade_interface.mjs +0 -0
- /package/{esm2020 → esm2022}/src/core_reactivity_export.mjs +0 -0
- /package/{esm2020 → esm2022}/src/core_render3_private_export.mjs +0 -0
- /package/{esm2020 → esm2022}/src/debug/debug_node.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/create_injector.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/forward_ref.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/initializer_token.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/inject_switch.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/injectable.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/injection_token.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/injector_marker.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/injector_token.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/interface/defs.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/interface/injector.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/interface/provider.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/internal_tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/jit/environment.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/jit/injectable.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/jit/util.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/metadata.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/metadata_attr.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/null_injector.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/provider_token.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/r3_injector.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/reflective_errors.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/reflective_key.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/reflective_provider.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di/scope.mjs +0 -0
- /package/{esm2020 → esm2022}/src/di.mjs +0 -0
- /package/{esm2020 → esm2022}/src/error_details_base_url.mjs +0 -0
- /package/{esm2020 → esm2022}/src/error_handler.mjs +0 -0
- /package/{esm2020 → esm2022}/src/errors.mjs +0 -0
- /package/{esm2020 → esm2022}/src/event_emitter.mjs +0 -0
- /package/{esm2020 → esm2022}/src/hydration/compression.mjs +0 -0
- /package/{esm2020 → esm2022}/src/hydration/error_handling.mjs +0 -0
- /package/{esm2020 → esm2022}/src/hydration/interfaces.mjs +0 -0
- /package/{esm2020 → esm2022}/src/hydration/skip_hydration.mjs +0 -0
- /package/{esm2020 → esm2022}/src/hydration/tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/src/hydration/views.mjs +0 -0
- /package/{esm2020 → esm2022}/src/i18n/locale_data_api.mjs +0 -0
- /package/{esm2020 → esm2022}/src/i18n/locale_en.mjs +0 -0
- /package/{esm2020 → esm2022}/src/i18n/localization.mjs +0 -0
- /package/{esm2020 → esm2022}/src/i18n/tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/src/interface/lifecycle_hooks.mjs +0 -0
- /package/{esm2020 → esm2022}/src/interface/simple_change.mjs +0 -0
- /package/{esm2020 → esm2022}/src/interface/type.mjs +0 -0
- /package/{esm2020 → esm2022}/src/linker/component_factory.mjs +0 -0
- /package/{esm2020 → esm2022}/src/linker/ng_module_factory.mjs +0 -0
- /package/{esm2020 → esm2022}/src/linker/ng_module_factory_loader.mjs +0 -0
- /package/{esm2020 → esm2022}/src/linker/ng_module_factory_loader_impl.mjs +0 -0
- /package/{esm2020 → esm2022}/src/linker/ng_module_registration.mjs +0 -0
- /package/{esm2020 → esm2022}/src/linker/view_ref.mjs +0 -0
- /package/{esm2020 → esm2022}/src/linker.mjs +0 -0
- /package/{esm2020 → esm2022}/src/metadata/ng_module_def.mjs +0 -0
- /package/{esm2020 → esm2022}/src/metadata/resource_loading.mjs +0 -0
- /package/{esm2020 → esm2022}/src/metadata/schema.mjs +0 -0
- /package/{esm2020 → esm2022}/src/metadata/view.mjs +0 -0
- /package/{esm2020 → esm2022}/src/platform_core_providers.mjs +0 -0
- /package/{esm2020 → esm2022}/src/r3_symbols.mjs +0 -0
- /package/{esm2020 → esm2022}/src/reflection/platform_reflection_capabilities.mjs +0 -0
- /package/{esm2020 → esm2022}/src/reflection/reflection_capabilities.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render/api_flags.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/assert.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/bindings.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/collect_native_nodes.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/component.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/definition.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/definition_factory.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/di.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/di_setup.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/errors.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/errors_di.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/features/copy_definition_feature.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/features/host_directives_feature.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/features/inherit_definition_feature.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/features/ng_onchanges_feature.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/features/providers_feature.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/fields.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/global_utils_api.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/hooks.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/i18n/i18n_apply.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/i18n/i18n_debug.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/i18n/i18n_insert_before_index.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/i18n/i18n_locale_id.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/i18n/i18n_parse.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/i18n/i18n_postprocess.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/i18n/i18n_tree_shaking.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/i18n/i18n_util.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/index.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/advance.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/all.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/attribute.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/attribute_interpolation.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/change_detection.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/class_map_interpolation.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/di.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/di_attr.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/element_container.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/element_validation.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/get_current_view.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/host_property.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/i18n.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/i18n_icu_container_visitor.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/interpolation.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/namespace.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/next_context.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/projection.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/property.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/property_interpolation.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/storage.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/style_map_interpolation.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/style_prop_interpolation.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/template.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/text.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/instructions/text_interpolation.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/container.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/context.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/definition.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/document.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/i18n.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/injector.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/lview_tracking.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/node.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/projection.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/public_definitions.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/query.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/renderer.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/renderer_dom.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/sanitization.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/styling.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/interfaces/type_checks.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/jit/directive.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/jit/environment.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/jit/jit_options.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/jit/module_patch.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/jit/partial.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/jit/pipe.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/jit/util.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/metadata.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/namespaces.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/ng_module_ref.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/node_assert.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/node_manipulation_i18n.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/node_selector_matcher.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/pipe.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/profiler.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/pure_function.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/query.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/state.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/styling/class_differ.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/styling/static_styling.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/styling/style_binding_list.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/styling/styling_parser.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/tokens.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/util/attrs_utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/util/discovery_utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/util/global_utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/util/injector_utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/util/misc_utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/util/stringify_utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/util/view_traversal_utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/util/view_utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/render3/view_engine_compatibility_prebound.mjs +0 -0
- /package/{esm2020 → esm2022}/src/sanitization/bypass.mjs +0 -0
- /package/{esm2020 → esm2022}/src/sanitization/html_sanitizer.mjs +0 -0
- /package/{esm2020 → esm2022}/src/sanitization/iframe_attrs_validation.mjs +0 -0
- /package/{esm2020 → esm2022}/src/sanitization/inert_body.mjs +0 -0
- /package/{esm2020 → esm2022}/src/sanitization/sanitization.mjs +0 -0
- /package/{esm2020 → esm2022}/src/sanitization/security.mjs +0 -0
- /package/{esm2020 → esm2022}/src/sanitization/url_sanitizer.mjs +0 -0
- /package/{esm2020 → esm2022}/src/signals/src/untracked.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/array_utils.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/assert.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/char_code.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/closure.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/coercion.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/comparison.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/decorators.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/dom.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/empty.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/errors.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/global.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/is_dev_mode.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/iterable.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/lang.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/microtask.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/ng_dev_mode.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/ng_i18n_closure_mode.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/ng_jit_mode.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/ng_reflect.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/noop.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/property.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/raf.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/security/trusted_type_defs.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/security/trusted_types.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/security/trusted_types_bypass.mjs +0 -0
- /package/{esm2020 → esm2022}/src/util/stringify.mjs +0 -0
- /package/{esm2020 → esm2022}/src/view/provider_flags.mjs +0 -0
- /package/{esm2020 → esm2022}/src/zone/async-stack-tagging.mjs +0 -0
- /package/{esm2020 → esm2022}/src/zone/ng_zone.mjs +0 -0
- /package/{esm2020 → esm2022}/src/zone.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/index.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/public_api.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/async.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/component_fixture.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/fake_async.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/metadata_override.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/metadata_overrider.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/resolvers.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/styling.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/test_bed_common.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/test_bed_compiler.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/test_hooks.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/testing.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/src/testing_internal.mjs +0 -0
- /package/{esm2020 → esm2022}/testing/testing.mjs +0 -0
|
@@ -0,0 +1,139 @@
|
|
|
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 { ReactiveNode, setActiveConsumer } from './graph';
|
|
10
|
+
/**
|
|
11
|
+
* Create a computed `Signal` which derives a reactive value from an expression.
|
|
12
|
+
*
|
|
13
|
+
* @developerPreview
|
|
14
|
+
*/
|
|
15
|
+
export function computed(computation, options) {
|
|
16
|
+
const node = new ComputedImpl(computation, options?.equal ?? defaultEquals);
|
|
17
|
+
// Casting here is required for g3, as TS inference behavior is slightly different between our
|
|
18
|
+
// version/options and g3's.
|
|
19
|
+
return createSignalFromFunction(node, node.signal.bind(node));
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* A dedicated symbol used before a computed value has been calculated for the first time.
|
|
23
|
+
* Explicitly typed as `any` so we can use it as signal's value.
|
|
24
|
+
*/
|
|
25
|
+
const UNSET = Symbol('UNSET');
|
|
26
|
+
/**
|
|
27
|
+
* A dedicated symbol used in place of a computed signal value to indicate that a given computation
|
|
28
|
+
* is in progress. Used to detect cycles in computation chains.
|
|
29
|
+
* Explicitly typed as `any` so we can use it as signal's value.
|
|
30
|
+
*/
|
|
31
|
+
const COMPUTING = Symbol('COMPUTING');
|
|
32
|
+
/**
|
|
33
|
+
* A dedicated symbol used in place of a computed signal value to indicate that a given computation
|
|
34
|
+
* failed. The thrown error is cached until the computation gets dirty again.
|
|
35
|
+
* Explicitly typed as `any` so we can use it as signal's value.
|
|
36
|
+
*/
|
|
37
|
+
const ERRORED = Symbol('ERRORED');
|
|
38
|
+
/**
|
|
39
|
+
* A computation, which derives a value from a declarative reactive expression.
|
|
40
|
+
*
|
|
41
|
+
* `Computed`s are both producers and consumers of reactivity.
|
|
42
|
+
*/
|
|
43
|
+
class ComputedImpl extends ReactiveNode {
|
|
44
|
+
constructor(computation, equal) {
|
|
45
|
+
super();
|
|
46
|
+
this.computation = computation;
|
|
47
|
+
this.equal = equal;
|
|
48
|
+
/**
|
|
49
|
+
* Current value of the computation.
|
|
50
|
+
*
|
|
51
|
+
* This can also be one of the special values `UNSET`, `COMPUTING`, or `ERRORED`.
|
|
52
|
+
*/
|
|
53
|
+
this.value = UNSET;
|
|
54
|
+
/**
|
|
55
|
+
* If `value` is `ERRORED`, the error caught from the last computation attempt which will
|
|
56
|
+
* be re-thrown.
|
|
57
|
+
*/
|
|
58
|
+
this.error = null;
|
|
59
|
+
/**
|
|
60
|
+
* Flag indicating that the computation is currently stale, meaning that one of the
|
|
61
|
+
* dependencies has notified of a potential change.
|
|
62
|
+
*
|
|
63
|
+
* It's possible that no dependency has _actually_ changed, in which case the `stale`
|
|
64
|
+
* state can be resolved without recomputing the value.
|
|
65
|
+
*/
|
|
66
|
+
this.stale = true;
|
|
67
|
+
}
|
|
68
|
+
onConsumerDependencyMayHaveChanged() {
|
|
69
|
+
if (this.stale) {
|
|
70
|
+
// We've already notified consumers that this value has potentially changed.
|
|
71
|
+
return;
|
|
72
|
+
}
|
|
73
|
+
// Record that the currently cached value may be stale.
|
|
74
|
+
this.stale = true;
|
|
75
|
+
// Notify any consumers about the potential change.
|
|
76
|
+
this.producerMayHaveChanged();
|
|
77
|
+
}
|
|
78
|
+
onProducerUpdateValueVersion() {
|
|
79
|
+
if (!this.stale) {
|
|
80
|
+
// The current value and its version are already up to date.
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
// The current value is stale. Check whether we need to produce a new one.
|
|
84
|
+
if (this.value !== UNSET && this.value !== COMPUTING &&
|
|
85
|
+
!this.consumerPollProducersForChange()) {
|
|
86
|
+
// Even though we were previously notified of a potential dependency update, all of
|
|
87
|
+
// our dependencies report that they have not actually changed in value, so we can
|
|
88
|
+
// resolve the stale state without needing to recompute the current value.
|
|
89
|
+
this.stale = false;
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
// The current value is stale, and needs to be recomputed. It still may not change -
|
|
93
|
+
// that depends on whether the newly computed value is equal to the old.
|
|
94
|
+
this.recomputeValue();
|
|
95
|
+
}
|
|
96
|
+
recomputeValue() {
|
|
97
|
+
if (this.value === COMPUTING) {
|
|
98
|
+
// Our computation somehow led to a cyclic read of itself.
|
|
99
|
+
throw new Error('Detected cycle in computations.');
|
|
100
|
+
}
|
|
101
|
+
const oldValue = this.value;
|
|
102
|
+
this.value = COMPUTING;
|
|
103
|
+
// As we're re-running the computation, update our dependent tracking version number.
|
|
104
|
+
this.trackingVersion++;
|
|
105
|
+
const prevConsumer = setActiveConsumer(this);
|
|
106
|
+
let newValue;
|
|
107
|
+
try {
|
|
108
|
+
newValue = this.computation();
|
|
109
|
+
}
|
|
110
|
+
catch (err) {
|
|
111
|
+
newValue = ERRORED;
|
|
112
|
+
this.error = err;
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
setActiveConsumer(prevConsumer);
|
|
116
|
+
}
|
|
117
|
+
this.stale = false;
|
|
118
|
+
if (oldValue !== UNSET && oldValue !== ERRORED && newValue !== ERRORED &&
|
|
119
|
+
this.equal(oldValue, newValue)) {
|
|
120
|
+
// No change to `valueVersion` - old and new values are
|
|
121
|
+
// semantically equivalent.
|
|
122
|
+
this.value = oldValue;
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
this.value = newValue;
|
|
126
|
+
this.valueVersion++;
|
|
127
|
+
}
|
|
128
|
+
signal() {
|
|
129
|
+
// Check if the value needs updating before returning it.
|
|
130
|
+
this.onProducerUpdateValueVersion();
|
|
131
|
+
// Record that someone looked at this signal.
|
|
132
|
+
this.producerAccessed();
|
|
133
|
+
if (this.value === ERRORED) {
|
|
134
|
+
throw this.error;
|
|
135
|
+
}
|
|
136
|
+
return this.value;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9zaWduYWxzL3NyYy9jb21wdXRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsd0JBQXdCLEVBQUUsYUFBYSxFQUEwQixNQUFNLE9BQU8sQ0FBQztBQUN2RixPQUFPLEVBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBZXhEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFJLFdBQW9CLEVBQUUsT0FBa0M7SUFDbEYsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksYUFBYSxDQUFDLENBQUM7SUFFNUUsOEZBQThGO0lBQzlGLDRCQUE0QjtJQUM1QixPQUFPLHdCQUF3QixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBeUIsQ0FBQztBQUN4RixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxLQUFLLEdBQVEsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBRW5DOzs7O0dBSUc7QUFDSCxNQUFNLFNBQVMsR0FBUSxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFM0M7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxHQUFRLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUV2Qzs7OztHQUlHO0FBQ0gsTUFBTSxZQUFnQixTQUFRLFlBQVk7SUFDeEMsWUFBb0IsV0FBb0IsRUFBVSxLQUE0QztRQUM1RixLQUFLLEVBQUUsQ0FBQztRQURVLGdCQUFXLEdBQVgsV0FBVyxDQUFTO1FBQVUsVUFBSyxHQUFMLEtBQUssQ0FBdUM7UUFHOUY7Ozs7V0FJRztRQUNLLFVBQUssR0FBTSxLQUFLLENBQUM7UUFFekI7OztXQUdHO1FBQ0ssVUFBSyxHQUFZLElBQUksQ0FBQztRQUU5Qjs7Ozs7O1dBTUc7UUFDSyxVQUFLLEdBQUcsSUFBSSxDQUFDO0lBckJyQixDQUFDO0lBdUJrQixrQ0FBa0M7UUFDbkQsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2QsNEVBQTRFO1lBQzVFLE9BQU87U0FDUjtRQUVELHVEQUF1RDtRQUN2RCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztRQUVsQixtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVrQiw0QkFBNEI7UUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZiw0REFBNEQ7WUFDNUQsT0FBTztTQUNSO1FBRUQsMEVBQTBFO1FBRTFFLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxTQUFTO1lBQ2hELENBQUMsSUFBSSxDQUFDLDhCQUE4QixFQUFFLEVBQUU7WUFDMUMsbUZBQW1GO1lBQ25GLGtGQUFrRjtZQUNsRiwwRUFBMEU7WUFDMUUsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7WUFDbkIsT0FBTztTQUNSO1FBRUQsb0ZBQW9GO1FBQ3BGLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQUVPLGNBQWM7UUFDcEIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUM1QiwwREFBMEQ7WUFDMUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ3BEO1FBRUQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUV2QixxRkFBcUY7UUFDckYsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksUUFBVyxDQUFDO1FBQ2hCLElBQUk7WUFDRixRQUFRLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQy9CO1FBQUMsT0FBTyxHQUFHLEVBQUU7WUFDWixRQUFRLEdBQUcsT0FBTyxDQUFDO1lBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsR0FBRyxDQUFDO1NBQ2xCO2dCQUFTO1lBQ1IsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUVuQixJQUFJLFFBQVEsS0FBSyxLQUFLLElBQUksUUFBUSxLQUFLLE9BQU8sSUFBSSxRQUFRLEtBQUssT0FBTztZQUNsRSxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNsQyx1REFBdUQ7WUFDdkQsMkJBQTJCO1lBQzNCLElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1lBQ3RCLE9BQU87U0FDUjtRQUVELElBQUksQ0FBQyxLQUFLLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUN0QixDQUFDO0lBRUQsTUFBTTtRQUNKLHlEQUF5RDtRQUN6RCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztRQUVwQyw2Q0FBNkM7UUFDN0MsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFeEIsSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLE9BQU8sRUFBRTtZQUMxQixNQUFNLElBQUksQ0FBQyxLQUFLLENBQUM7U0FDbEI7UUFFRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUM7SUFDcEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Y3JlYXRlU2lnbmFsRnJvbUZ1bmN0aW9uLCBkZWZhdWx0RXF1YWxzLCBTaWduYWwsIFZhbHVlRXF1YWxpdHlGbn0gZnJvbSAnLi9hcGknO1xuaW1wb3J0IHtSZWFjdGl2ZU5vZGUsIHNldEFjdGl2ZUNvbnN1bWVyfSBmcm9tICcuL2dyYXBoJztcblxuLyoqXG4gKiBPcHRpb25zIHBhc3NlZCB0byB0aGUgYGNvbXB1dGVkYCBjcmVhdGlvbiBmdW5jdGlvbi5cbiAqXG4gKiBAZGV2ZWxvcGVyUHJldmlld1xuICovXG5leHBvcnQgaW50ZXJmYWNlIENyZWF0ZUNvbXB1dGVkT3B0aW9uczxUPiB7XG4gIC8qKlxuICAgKiBBIGNvbXBhcmlzb24gZnVuY3Rpb24gd2hpY2ggZGVmaW5lcyBlcXVhbGl0eSBmb3IgY29tcHV0ZWQgdmFsdWVzLlxuICAgKi9cbiAgZXF1YWw/OiBWYWx1ZUVxdWFsaXR5Rm48VD47XG59XG5cblxuLyoqXG4gKiBDcmVhdGUgYSBjb21wdXRlZCBgU2lnbmFsYCB3aGljaCBkZXJpdmVzIGEgcmVhY3RpdmUgdmFsdWUgZnJvbSBhbiBleHByZXNzaW9uLlxuICpcbiAqIEBkZXZlbG9wZXJQcmV2aWV3XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlZDxUPihjb21wdXRhdGlvbjogKCkgPT4gVCwgb3B0aW9ucz86IENyZWF0ZUNvbXB1dGVkT3B0aW9uczxUPik6IFNpZ25hbDxUPiB7XG4gIGNvbnN0IG5vZGUgPSBuZXcgQ29tcHV0ZWRJbXBsKGNvbXB1dGF0aW9uLCBvcHRpb25zPy5lcXVhbCA/PyBkZWZhdWx0RXF1YWxzKTtcblxuICAvLyBDYXN0aW5nIGhlcmUgaXMgcmVxdWlyZWQgZm9yIGczLCBhcyBUUyBpbmZlcmVuY2UgYmVoYXZpb3IgaXMgc2xpZ2h0bHkgZGlmZmVyZW50IGJldHdlZW4gb3VyXG4gIC8vIHZlcnNpb24vb3B0aW9ucyBhbmQgZzMncy5cbiAgcmV0dXJuIGNyZWF0ZVNpZ25hbEZyb21GdW5jdGlvbihub2RlLCBub2RlLnNpZ25hbC5iaW5kKG5vZGUpKSBhcyB1bmtub3duIGFzIFNpZ25hbDxUPjtcbn1cblxuLyoqXG4gKiBBIGRlZGljYXRlZCBzeW1ib2wgdXNlZCBiZWZvcmUgYSBjb21wdXRlZCB2YWx1ZSBoYXMgYmVlbiBjYWxjdWxhdGVkIGZvciB0aGUgZmlyc3QgdGltZS5cbiAqIEV4cGxpY2l0bHkgdHlwZWQgYXMgYGFueWAgc28gd2UgY2FuIHVzZSBpdCBhcyBzaWduYWwncyB2YWx1ZS5cbiAqL1xuY29uc3QgVU5TRVQ6IGFueSA9IFN5bWJvbCgnVU5TRVQnKTtcblxuLyoqXG4gKiBBIGRlZGljYXRlZCBzeW1ib2wgdXNlZCBpbiBwbGFjZSBvZiBhIGNvbXB1dGVkIHNpZ25hbCB2YWx1ZSB0byBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gY29tcHV0YXRpb25cbiAqIGlzIGluIHByb2dyZXNzLiBVc2VkIHRvIGRldGVjdCBjeWNsZXMgaW4gY29tcHV0YXRpb24gY2hhaW5zLlxuICogRXhwbGljaXRseSB0eXBlZCBhcyBgYW55YCBzbyB3ZSBjYW4gdXNlIGl0IGFzIHNpZ25hbCdzIHZhbHVlLlxuICovXG5jb25zdCBDT01QVVRJTkc6IGFueSA9IFN5bWJvbCgnQ09NUFVUSU5HJyk7XG5cbi8qKlxuICogQSBkZWRpY2F0ZWQgc3ltYm9sIHVzZWQgaW4gcGxhY2Ugb2YgYSBjb21wdXRlZCBzaWduYWwgdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCBhIGdpdmVuIGNvbXB1dGF0aW9uXG4gKiBmYWlsZWQuIFRoZSB0aHJvd24gZXJyb3IgaXMgY2FjaGVkIHVudGlsIHRoZSBjb21wdXRhdGlvbiBnZXRzIGRpcnR5IGFnYWluLlxuICogRXhwbGljaXRseSB0eXBlZCBhcyBgYW55YCBzbyB3ZSBjYW4gdXNlIGl0IGFzIHNpZ25hbCdzIHZhbHVlLlxuICovXG5jb25zdCBFUlJPUkVEOiBhbnkgPSBTeW1ib2woJ0VSUk9SRUQnKTtcblxuLyoqXG4gKiBBIGNvbXB1dGF0aW9uLCB3aGljaCBkZXJpdmVzIGEgdmFsdWUgZnJvbSBhIGRlY2xhcmF0aXZlIHJlYWN0aXZlIGV4cHJlc3Npb24uXG4gKlxuICogYENvbXB1dGVkYHMgYXJlIGJvdGggcHJvZHVjZXJzIGFuZCBjb25zdW1lcnMgb2YgcmVhY3Rpdml0eS5cbiAqL1xuY2xhc3MgQ29tcHV0ZWRJbXBsPFQ+IGV4dGVuZHMgUmVhY3RpdmVOb2RlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjb21wdXRhdGlvbjogKCkgPT4gVCwgcHJpdmF0ZSBlcXVhbDogKG9sZFZhbHVlOiBULCBuZXdWYWx1ZTogVCkgPT4gYm9vbGVhbikge1xuICAgIHN1cGVyKCk7XG4gIH1cbiAgLyoqXG4gICAqIEN1cnJlbnQgdmFsdWUgb2YgdGhlIGNvbXB1dGF0aW9uLlxuICAgKlxuICAgKiBUaGlzIGNhbiBhbHNvIGJlIG9uZSBvZiB0aGUgc3BlY2lhbCB2YWx1ZXMgYFVOU0VUYCwgYENPTVBVVElOR2AsIG9yIGBFUlJPUkVEYC5cbiAgICovXG4gIHByaXZhdGUgdmFsdWU6IFQgPSBVTlNFVDtcblxuICAvKipcbiAgICogSWYgYHZhbHVlYCBpcyBgRVJST1JFRGAsIHRoZSBlcnJvciBjYXVnaHQgZnJvbSB0aGUgbGFzdCBjb21wdXRhdGlvbiBhdHRlbXB0IHdoaWNoIHdpbGxcbiAgICogYmUgcmUtdGhyb3duLlxuICAgKi9cbiAgcHJpdmF0ZSBlcnJvcjogdW5rbm93biA9IG51bGw7XG5cbiAgLyoqXG4gICAqIEZsYWcgaW5kaWNhdGluZyB0aGF0IHRoZSBjb21wdXRhdGlvbiBpcyBjdXJyZW50bHkgc3RhbGUsIG1lYW5pbmcgdGhhdCBvbmUgb2YgdGhlXG4gICAqIGRlcGVuZGVuY2llcyBoYXMgbm90aWZpZWQgb2YgYSBwb3RlbnRpYWwgY2hhbmdlLlxuICAgKlxuICAgKiBJdCdzIHBvc3NpYmxlIHRoYXQgbm8gZGVwZW5kZW5jeSBoYXMgX2FjdHVhbGx5XyBjaGFuZ2VkLCBpbiB3aGljaCBjYXNlIHRoZSBgc3RhbGVgXG4gICAqIHN0YXRlIGNhbiBiZSByZXNvbHZlZCB3aXRob3V0IHJlY29tcHV0aW5nIHRoZSB2YWx1ZS5cbiAgICovXG4gIHByaXZhdGUgc3RhbGUgPSB0cnVlO1xuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvbkNvbnN1bWVyRGVwZW5kZW5jeU1heUhhdmVDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnN0YWxlKSB7XG4gICAgICAvLyBXZSd2ZSBhbHJlYWR5IG5vdGlmaWVkIGNvbnN1bWVycyB0aGF0IHRoaXMgdmFsdWUgaGFzIHBvdGVudGlhbGx5IGNoYW5nZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gUmVjb3JkIHRoYXQgdGhlIGN1cnJlbnRseSBjYWNoZWQgdmFsdWUgbWF5IGJlIHN0YWxlLlxuICAgIHRoaXMuc3RhbGUgPSB0cnVlO1xuXG4gICAgLy8gTm90aWZ5IGFueSBjb25zdW1lcnMgYWJvdXQgdGhlIHBvdGVudGlhbCBjaGFuZ2UuXG4gICAgdGhpcy5wcm9kdWNlck1heUhhdmVDaGFuZ2VkKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb25Qcm9kdWNlclVwZGF0ZVZhbHVlVmVyc2lvbigpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuc3RhbGUpIHtcbiAgICAgIC8vIFRoZSBjdXJyZW50IHZhbHVlIGFuZCBpdHMgdmVyc2lvbiBhcmUgYWxyZWFkeSB1cCB0byBkYXRlLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRoZSBjdXJyZW50IHZhbHVlIGlzIHN0YWxlLiBDaGVjayB3aGV0aGVyIHdlIG5lZWQgdG8gcHJvZHVjZSBhIG5ldyBvbmUuXG5cbiAgICBpZiAodGhpcy52YWx1ZSAhPT0gVU5TRVQgJiYgdGhpcy52YWx1ZSAhPT0gQ09NUFVUSU5HICYmXG4gICAgICAgICF0aGlzLmNvbnN1bWVyUG9sbFByb2R1Y2Vyc0ZvckNoYW5nZSgpKSB7XG4gICAgICAvLyBFdmVuIHRob3VnaCB3ZSB3ZXJlIHByZXZpb3VzbHkgbm90aWZpZWQgb2YgYSBwb3RlbnRpYWwgZGVwZW5kZW5jeSB1cGRhdGUsIGFsbCBvZlxuICAgICAgLy8gb3VyIGRlcGVuZGVuY2llcyByZXBvcnQgdGhhdCB0aGV5IGhhdmUgbm90IGFjdHVhbGx5IGNoYW5nZWQgaW4gdmFsdWUsIHNvIHdlIGNhblxuICAgICAgLy8gcmVzb2x2ZSB0aGUgc3RhbGUgc3RhdGUgd2l0aG91dCBuZWVkaW5nIHRvIHJlY29tcHV0ZSB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgIHRoaXMuc3RhbGUgPSBmYWxzZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUaGUgY3VycmVudCB2YWx1ZSBpcyBzdGFsZSwgYW5kIG5lZWRzIHRvIGJlIHJlY29tcHV0ZWQuIEl0IHN0aWxsIG1heSBub3QgY2hhbmdlIC1cbiAgICAvLyB0aGF0IGRlcGVuZHMgb24gd2hldGhlciB0aGUgbmV3bHkgY29tcHV0ZWQgdmFsdWUgaXMgZXF1YWwgdG8gdGhlIG9sZC5cbiAgICB0aGlzLnJlY29tcHV0ZVZhbHVlKCk7XG4gIH1cblxuICBwcml2YXRlIHJlY29tcHV0ZVZhbHVlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZhbHVlID09PSBDT01QVVRJTkcpIHtcbiAgICAgIC8vIE91ciBjb21wdXRhdGlvbiBzb21laG93IGxlZCB0byBhIGN5Y2xpYyByZWFkIG9mIGl0c2VsZi5cbiAgICAgIHRocm93IG5ldyBFcnJvcignRGV0ZWN0ZWQgY3ljbGUgaW4gY29tcHV0YXRpb25zLicpO1xuICAgIH1cblxuICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICB0aGlzLnZhbHVlID0gQ09NUFVUSU5HO1xuXG4gICAgLy8gQXMgd2UncmUgcmUtcnVubmluZyB0aGUgY29tcHV0YXRpb24sIHVwZGF0ZSBvdXIgZGVwZW5kZW50IHRyYWNraW5nIHZlcnNpb24gbnVtYmVyLlxuICAgIHRoaXMudHJhY2tpbmdWZXJzaW9uKys7XG4gICAgY29uc3QgcHJldkNvbnN1bWVyID0gc2V0QWN0aXZlQ29uc3VtZXIodGhpcyk7XG4gICAgbGV0IG5ld1ZhbHVlOiBUO1xuICAgIHRyeSB7XG4gICAgICBuZXdWYWx1ZSA9IHRoaXMuY29tcHV0YXRpb24oKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIG5ld1ZhbHVlID0gRVJST1JFRDtcbiAgICAgIHRoaXMuZXJyb3IgPSBlcnI7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHNldEFjdGl2ZUNvbnN1bWVyKHByZXZDb25zdW1lcik7XG4gICAgfVxuXG4gICAgdGhpcy5zdGFsZSA9IGZhbHNlO1xuXG4gICAgaWYgKG9sZFZhbHVlICE9PSBVTlNFVCAmJiBvbGRWYWx1ZSAhPT0gRVJST1JFRCAmJiBuZXdWYWx1ZSAhPT0gRVJST1JFRCAmJlxuICAgICAgICB0aGlzLmVxdWFsKG9sZFZhbHVlLCBuZXdWYWx1ZSkpIHtcbiAgICAgIC8vIE5vIGNoYW5nZSB0byBgdmFsdWVWZXJzaW9uYCAtIG9sZCBhbmQgbmV3IHZhbHVlcyBhcmVcbiAgICAgIC8vIHNlbWFudGljYWxseSBlcXVpdmFsZW50LlxuICAgICAgdGhpcy52YWx1ZSA9IG9sZFZhbHVlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTtcbiAgICB0aGlzLnZhbHVlVmVyc2lvbisrO1xuICB9XG5cbiAgc2lnbmFsKCk6IFQge1xuICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBuZWVkcyB1cGRhdGluZyBiZWZvcmUgcmV0dXJuaW5nIGl0LlxuICAgIHRoaXMub25Qcm9kdWNlclVwZGF0ZVZhbHVlVmVyc2lvbigpO1xuXG4gICAgLy8gUmVjb3JkIHRoYXQgc29tZW9uZSBsb29rZWQgYXQgdGhpcyBzaWduYWwuXG4gICAgdGhpcy5wcm9kdWNlckFjY2Vzc2VkKCk7XG5cbiAgICBpZiAodGhpcy52YWx1ZSA9PT0gRVJST1JFRCkge1xuICAgICAgdGhyb3cgdGhpcy5lcnJvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy52YWx1ZTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,165 @@
|
|
|
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 { newWeakRef } from './weak_ref';
|
|
9
|
+
/**
|
|
10
|
+
* Counter tracking the next `ProducerId` or `ConsumerId`.
|
|
11
|
+
*/
|
|
12
|
+
let _nextReactiveId = 0;
|
|
13
|
+
/**
|
|
14
|
+
* Tracks the currently active reactive consumer (or `null` if there is no active
|
|
15
|
+
* consumer).
|
|
16
|
+
*/
|
|
17
|
+
let activeConsumer = null;
|
|
18
|
+
export function setActiveConsumer(consumer) {
|
|
19
|
+
const prev = activeConsumer;
|
|
20
|
+
activeConsumer = consumer;
|
|
21
|
+
return prev;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A node in the reactive graph.
|
|
25
|
+
*
|
|
26
|
+
* Nodes can be producers of reactive values, consumers of other reactive values, or both.
|
|
27
|
+
*
|
|
28
|
+
* Producers are nodes that produce values, and can be depended upon by consumer nodes.
|
|
29
|
+
*
|
|
30
|
+
* Producers expose a monotonic `valueVersion` counter, and are responsible for incrementing this
|
|
31
|
+
* version when their value semantically changes. Some producers may produce their values lazily and
|
|
32
|
+
* thus at times need to be polled for potential updates to their value (and by extension their
|
|
33
|
+
* `valueVersion`). This is accomplished via the `onProducerUpdateValueVersion` method for
|
|
34
|
+
* implemented by producers, which should perform whatever calculations are necessary to ensure
|
|
35
|
+
* `valueVersion` is up to date.
|
|
36
|
+
*
|
|
37
|
+
* Consumers are nodes that depend on the values of producers and are notified when those values
|
|
38
|
+
* might have changed.
|
|
39
|
+
*
|
|
40
|
+
* Consumers do not wrap the reads they consume themselves, but rather can be set as the active
|
|
41
|
+
* reader via `setActiveConsumer`. Reads of producers that happen while a consumer is active will
|
|
42
|
+
* result in those producers being added as dependencies of that consumer node.
|
|
43
|
+
*
|
|
44
|
+
* The set of dependencies of a consumer is dynamic. Implementers expose a monotonically increasing
|
|
45
|
+
* `trackingVersion` counter, which increments whenever the consumer is about to re-run any reactive
|
|
46
|
+
* reads it needs and establish a new set of dependencies as a result.
|
|
47
|
+
*
|
|
48
|
+
* Producers store the last `trackingVersion` they've seen from `Consumer`s which have read them.
|
|
49
|
+
* This allows a producer to identify whether its record of the dependency is current or stale, by
|
|
50
|
+
* comparing the consumer's `trackingVersion` to the version at which the dependency was
|
|
51
|
+
* last observed.
|
|
52
|
+
*/
|
|
53
|
+
export class ReactiveNode {
|
|
54
|
+
constructor() {
|
|
55
|
+
this.id = _nextReactiveId++;
|
|
56
|
+
/**
|
|
57
|
+
* A cached weak reference to this node, which will be used in `ReactiveEdge`s.
|
|
58
|
+
*/
|
|
59
|
+
this.ref = newWeakRef(this);
|
|
60
|
+
/**
|
|
61
|
+
* Edges to producers on which this node depends (in its consumer capacity).
|
|
62
|
+
*/
|
|
63
|
+
this.producers = new Map();
|
|
64
|
+
/**
|
|
65
|
+
* Edges to consumers on which this node depends (in its producer capacity).
|
|
66
|
+
*/
|
|
67
|
+
this.consumers = new Map();
|
|
68
|
+
/**
|
|
69
|
+
* Monotonically increasing counter representing a version of this `Consumer`'s
|
|
70
|
+
* dependencies.
|
|
71
|
+
*/
|
|
72
|
+
this.trackingVersion = 0;
|
|
73
|
+
/**
|
|
74
|
+
* Monotonically increasing counter which increases when the value of this `Producer`
|
|
75
|
+
* semantically changes.
|
|
76
|
+
*/
|
|
77
|
+
this.valueVersion = 0;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Polls dependencies of a consumer to determine if they have actually changed.
|
|
81
|
+
*
|
|
82
|
+
* If this returns `false`, then even though the consumer may have previously been notified of a
|
|
83
|
+
* change, the values of its dependencies have not actually changed and the consumer should not
|
|
84
|
+
* rerun any reactions.
|
|
85
|
+
*/
|
|
86
|
+
consumerPollProducersForChange() {
|
|
87
|
+
for (const [producerId, edge] of this.producers) {
|
|
88
|
+
const producer = edge.producerNode.deref();
|
|
89
|
+
if (producer === undefined || edge.atTrackingVersion !== this.trackingVersion) {
|
|
90
|
+
// This dependency edge is stale, so remove it.
|
|
91
|
+
this.producers.delete(producerId);
|
|
92
|
+
producer?.consumers.delete(this.id);
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
if (producer.producerPollStatus(edge.seenValueVersion)) {
|
|
96
|
+
// One of the dependencies reports a real value change.
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// No dependency reported a real value change, so the `Consumer` has also not been
|
|
101
|
+
// impacted.
|
|
102
|
+
return false;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Notify all consumers of this producer that its value may have changed.
|
|
106
|
+
*/
|
|
107
|
+
producerMayHaveChanged() {
|
|
108
|
+
for (const [consumerId, edge] of this.consumers) {
|
|
109
|
+
const consumer = edge.consumerNode.deref();
|
|
110
|
+
if (consumer === undefined || consumer.trackingVersion !== edge.atTrackingVersion) {
|
|
111
|
+
this.consumers.delete(consumerId);
|
|
112
|
+
consumer?.producers.delete(this.id);
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
consumer.onConsumerDependencyMayHaveChanged();
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Mark that this producer node has been accessed in the current reactive context.
|
|
120
|
+
*/
|
|
121
|
+
producerAccessed() {
|
|
122
|
+
if (activeConsumer === null) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
// Either create or update the dependency `Edge` in both directions.
|
|
126
|
+
let edge = activeConsumer.producers.get(this.id);
|
|
127
|
+
if (edge === undefined) {
|
|
128
|
+
edge = {
|
|
129
|
+
consumerNode: activeConsumer.ref,
|
|
130
|
+
producerNode: this.ref,
|
|
131
|
+
seenValueVersion: this.valueVersion,
|
|
132
|
+
atTrackingVersion: activeConsumer.trackingVersion,
|
|
133
|
+
};
|
|
134
|
+
activeConsumer.producers.set(this.id, edge);
|
|
135
|
+
this.consumers.set(activeConsumer.id, edge);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
edge.seenValueVersion = this.valueVersion;
|
|
139
|
+
edge.atTrackingVersion = activeConsumer.trackingVersion;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Whether this consumer currently has any producers registered.
|
|
144
|
+
*/
|
|
145
|
+
get hasProducers() {
|
|
146
|
+
return this.producers.size > 0;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Checks if a `Producer` has a current value which is different than the value
|
|
150
|
+
* last seen at a specific version by a `Consumer` which recorded a dependency on
|
|
151
|
+
* this `Producer`.
|
|
152
|
+
*/
|
|
153
|
+
producerPollStatus(lastSeenValueVersion) {
|
|
154
|
+
// `producer.valueVersion` may be stale, but a mismatch still means that the value
|
|
155
|
+
// last seen by the `Consumer` is also stale.
|
|
156
|
+
if (this.valueVersion !== lastSeenValueVersion) {
|
|
157
|
+
return true;
|
|
158
|
+
}
|
|
159
|
+
// Trigger the `Producer` to update its `valueVersion` if necessary.
|
|
160
|
+
this.onProducerUpdateValueVersion();
|
|
161
|
+
// At this point, we can trust `producer.valueVersion`.
|
|
162
|
+
return this.valueVersion !== lastSeenValueVersion;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9zaWduYWxzL3NyYy9ncmFwaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFVLE1BQU0sWUFBWSxDQUFDO0FBRS9DOztHQUVHO0FBQ0gsSUFBSSxlQUFlLEdBQVcsQ0FBQyxDQUFDO0FBRWhDOzs7R0FHRztBQUNILElBQUksY0FBYyxHQUFzQixJQUFJLENBQUM7QUFFN0MsTUFBTSxVQUFVLGlCQUFpQixDQUFDLFFBQTJCO0lBQzNELE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQztJQUM1QixjQUFjLEdBQUcsUUFBUSxDQUFDO0lBQzFCLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQTZCRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxNQUFNLE9BQWdCLFlBQVk7SUFBbEM7UUFDbUIsT0FBRSxHQUFHLGVBQWUsRUFBRSxDQUFDO1FBRXhDOztXQUVHO1FBQ2MsUUFBRyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4Qzs7V0FFRztRQUNjLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztRQUU3RDs7V0FFRztRQUNjLGNBQVMsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztRQUU3RDs7O1dBR0c7UUFDTyxvQkFBZSxHQUFHLENBQUMsQ0FBQztRQUU5Qjs7O1dBR0c7UUFDTyxpQkFBWSxHQUFHLENBQUMsQ0FBQztJQTZHN0IsQ0FBQztJQS9GQzs7Ozs7O09BTUc7SUFDTyw4QkFBOEI7UUFDdEMsS0FBSyxNQUFNLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDL0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUUzQyxJQUFJLFFBQVEsS0FBSyxTQUFTLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQzdFLCtDQUErQztnQkFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xDLFFBQVEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEMsU0FBUzthQUNWO1lBRUQsSUFBSSxRQUFRLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLEVBQUU7Z0JBQ3RELHVEQUF1RDtnQkFDdkQsT0FBTyxJQUFJLENBQUM7YUFDYjtTQUNGO1FBRUQsa0ZBQWtGO1FBQ2xGLFlBQVk7UUFDWixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNPLHNCQUFzQjtRQUM5QixLQUFLLE1BQU0sQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUMvQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzNDLElBQUksUUFBUSxLQUFLLFNBQVMsSUFBSSxRQUFRLENBQUMsZUFBZSxLQUFLLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDakYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7Z0JBQ2xDLFFBQVEsRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDcEMsU0FBUzthQUNWO1lBRUQsUUFBUSxDQUFDLGtDQUFrQyxFQUFFLENBQUM7U0FDL0M7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDTyxnQkFBZ0I7UUFDeEIsSUFBSSxjQUFjLEtBQUssSUFBSSxFQUFFO1lBQzNCLE9BQU87U0FDUjtRQUVELG9FQUFvRTtRQUNwRSxJQUFJLElBQUksR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakQsSUFBSSxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQ3RCLElBQUksR0FBRztnQkFDTCxZQUFZLEVBQUUsY0FBYyxDQUFDLEdBQUc7Z0JBQ2hDLFlBQVksRUFBRSxJQUFJLENBQUMsR0FBRztnQkFDdEIsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLFlBQVk7Z0JBQ25DLGlCQUFpQixFQUFFLGNBQWMsQ0FBQyxlQUFlO2FBQ2xELENBQUM7WUFDRixjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDN0M7YUFBTTtZQUNMLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1lBQzFDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxjQUFjLENBQUMsZUFBZSxDQUFDO1NBQ3pEO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBYyxZQUFZO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssa0JBQWtCLENBQUMsb0JBQTRCO1FBQ3JELGtGQUFrRjtRQUNsRiw2Q0FBNkM7UUFDN0MsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLG9CQUFvQixFQUFFO1lBQzlDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxvRUFBb0U7UUFDcEUsSUFBSSxDQUFDLDRCQUE0QixFQUFFLENBQUM7UUFFcEMsdURBQXVEO1FBQ3ZELE9BQU8sSUFBSSxDQUFDLFlBQVksS0FBSyxvQkFBb0IsQ0FBQztJQUNwRCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtuZXdXZWFrUmVmLCBXZWFrUmVmfSBmcm9tICcuL3dlYWtfcmVmJztcblxuLyoqXG4gKiBDb3VudGVyIHRyYWNraW5nIHRoZSBuZXh0IGBQcm9kdWNlcklkYCBvciBgQ29uc3VtZXJJZGAuXG4gKi9cbmxldCBfbmV4dFJlYWN0aXZlSWQ6IG51bWJlciA9IDA7XG5cbi8qKlxuICogVHJhY2tzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHJlYWN0aXZlIGNvbnN1bWVyIChvciBgbnVsbGAgaWYgdGhlcmUgaXMgbm8gYWN0aXZlXG4gKiBjb25zdW1lcikuXG4gKi9cbmxldCBhY3RpdmVDb25zdW1lcjogUmVhY3RpdmVOb2RlfG51bGwgPSBudWxsO1xuXG5leHBvcnQgZnVuY3Rpb24gc2V0QWN0aXZlQ29uc3VtZXIoY29uc3VtZXI6IFJlYWN0aXZlTm9kZXxudWxsKTogUmVhY3RpdmVOb2RlfG51bGwge1xuICBjb25zdCBwcmV2ID0gYWN0aXZlQ29uc3VtZXI7XG4gIGFjdGl2ZUNvbnN1bWVyID0gY29uc3VtZXI7XG4gIHJldHVybiBwcmV2O1xufVxuXG4vKipcbiAqIEEgYmlkaXJlY3Rpb25hbCBlZGdlIGluIHRoZSBkZXBlbmRlbmN5IGdyYXBoIG9mIGBSZWFjdGl2ZU5vZGVgcy5cbiAqL1xuaW50ZXJmYWNlIFJlYWN0aXZlRWRnZSB7XG4gIC8qKlxuICAgKiBXZWFrbHkgaGVsZCByZWZlcmVuY2UgdG8gdGhlIGNvbnN1bWVyIHNpZGUgb2YgdGhpcyBlZGdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJvZHVjZXJOb2RlOiBXZWFrUmVmPFJlYWN0aXZlTm9kZT47XG5cbiAgLyoqXG4gICAqIFdlYWtseSBoZWxkIHJlZmVyZW5jZSB0byB0aGUgcHJvZHVjZXIgc2lkZSBvZiB0aGlzIGVkZ2UuXG4gICAqL1xuICByZWFkb25seSBjb25zdW1lck5vZGU6IFdlYWtSZWY8UmVhY3RpdmVOb2RlPjtcbiAgLyoqXG4gICAqIGB0cmFja2luZ1ZlcnNpb25gIG9mIHRoZSBjb25zdW1lciBhdCB3aGljaCB0aGlzIGRlcGVuZGVuY3kgZWRnZSB3YXMgbGFzdCBvYnNlcnZlZC5cbiAgICpcbiAgICogSWYgdGhpcyBkb2Vzbid0IG1hdGNoIHRoZSBjb25zdW1lcidzIGN1cnJlbnQgYHRyYWNraW5nVmVyc2lvbmAsIHRoZW4gdGhpcyBkZXBlbmRlbmN5IHJlY29yZFxuICAgKiBpcyBzdGFsZSwgYW5kIG5lZWRzIHRvIGJlIGNsZWFuZWQgdXAuXG4gICAqL1xuICBhdFRyYWNraW5nVmVyc2lvbjogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBgdmFsdWVWZXJzaW9uYCBvZiB0aGUgcHJvZHVjZXIgYXQgdGhlIHRpbWUgdGhpcyBkZXBlbmRlbmN5IHdhcyBsYXN0IGFjY2Vzc2VkLlxuICAgKi9cbiAgc2VlblZhbHVlVmVyc2lvbjogbnVtYmVyO1xufVxuXG4vKipcbiAqIEEgbm9kZSBpbiB0aGUgcmVhY3RpdmUgZ3JhcGguXG4gKlxuICogTm9kZXMgY2FuIGJlIHByb2R1Y2VycyBvZiByZWFjdGl2ZSB2YWx1ZXMsIGNvbnN1bWVycyBvZiBvdGhlciByZWFjdGl2ZSB2YWx1ZXMsIG9yIGJvdGguXG4gKlxuICogUHJvZHVjZXJzIGFyZSBub2RlcyB0aGF0IHByb2R1Y2UgdmFsdWVzLCBhbmQgY2FuIGJlIGRlcGVuZGVkIHVwb24gYnkgY29uc3VtZXIgbm9kZXMuXG4gKlxuICogUHJvZHVjZXJzIGV4cG9zZSBhIG1vbm90b25pYyBgdmFsdWVWZXJzaW9uYCBjb3VudGVyLCBhbmQgYXJlIHJlc3BvbnNpYmxlIGZvciBpbmNyZW1lbnRpbmcgdGhpc1xuICogdmVyc2lvbiB3aGVuIHRoZWlyIHZhbHVlIHNlbWFudGljYWxseSBjaGFuZ2VzLiBTb21lIHByb2R1Y2VycyBtYXkgcHJvZHVjZSB0aGVpciB2YWx1ZXMgbGF6aWx5IGFuZFxuICogdGh1cyBhdCB0aW1lcyBuZWVkIHRvIGJlIHBvbGxlZCBmb3IgcG90ZW50aWFsIHVwZGF0ZXMgdG8gdGhlaXIgdmFsdWUgKGFuZCBieSBleHRlbnNpb24gdGhlaXJcbiAqIGB2YWx1ZVZlcnNpb25gKS4gVGhpcyBpcyBhY2NvbXBsaXNoZWQgdmlhIHRoZSBgb25Qcm9kdWNlclVwZGF0ZVZhbHVlVmVyc2lvbmAgbWV0aG9kIGZvclxuICogaW1wbGVtZW50ZWQgYnkgcHJvZHVjZXJzLCB3aGljaCBzaG91bGQgcGVyZm9ybSB3aGF0ZXZlciBjYWxjdWxhdGlvbnMgYXJlIG5lY2Vzc2FyeSB0byBlbnN1cmVcbiAqIGB2YWx1ZVZlcnNpb25gIGlzIHVwIHRvIGRhdGUuXG4gKlxuICogQ29uc3VtZXJzIGFyZSBub2RlcyB0aGF0IGRlcGVuZCBvbiB0aGUgdmFsdWVzIG9mIHByb2R1Y2VycyBhbmQgYXJlIG5vdGlmaWVkIHdoZW4gdGhvc2UgdmFsdWVzXG4gKiBtaWdodCBoYXZlIGNoYW5nZWQuXG4gKlxuICogQ29uc3VtZXJzIGRvIG5vdCB3cmFwIHRoZSByZWFkcyB0aGV5IGNvbnN1bWUgdGhlbXNlbHZlcywgYnV0IHJhdGhlciBjYW4gYmUgc2V0IGFzIHRoZSBhY3RpdmVcbiAqIHJlYWRlciB2aWEgYHNldEFjdGl2ZUNvbnN1bWVyYC4gUmVhZHMgb2YgcHJvZHVjZXJzIHRoYXQgaGFwcGVuIHdoaWxlIGEgY29uc3VtZXIgaXMgYWN0aXZlIHdpbGxcbiAqIHJlc3VsdCBpbiB0aG9zZSBwcm9kdWNlcnMgYmVpbmcgYWRkZWQgYXMgZGVwZW5kZW5jaWVzIG9mIHRoYXQgY29uc3VtZXIgbm9kZS5cbiAqXG4gKiBUaGUgc2V0IG9mIGRlcGVuZGVuY2llcyBvZiBhIGNvbnN1bWVyIGlzIGR5bmFtaWMuIEltcGxlbWVudGVycyBleHBvc2UgYSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmdcbiAqIGB0cmFja2luZ1ZlcnNpb25gIGNvdW50ZXIsIHdoaWNoIGluY3JlbWVudHMgd2hlbmV2ZXIgdGhlIGNvbnN1bWVyIGlzIGFib3V0IHRvIHJlLXJ1biBhbnkgcmVhY3RpdmVcbiAqIHJlYWRzIGl0IG5lZWRzIGFuZCBlc3RhYmxpc2ggYSBuZXcgc2V0IG9mIGRlcGVuZGVuY2llcyBhcyBhIHJlc3VsdC5cbiAqXG4gKiBQcm9kdWNlcnMgc3RvcmUgdGhlIGxhc3QgYHRyYWNraW5nVmVyc2lvbmAgdGhleSd2ZSBzZWVuIGZyb20gYENvbnN1bWVyYHMgd2hpY2ggaGF2ZSByZWFkIHRoZW0uXG4gKiBUaGlzIGFsbG93cyBhIHByb2R1Y2VyIHRvIGlkZW50aWZ5IHdoZXRoZXIgaXRzIHJlY29yZCBvZiB0aGUgZGVwZW5kZW5jeSBpcyBjdXJyZW50IG9yIHN0YWxlLCBieVxuICogY29tcGFyaW5nIHRoZSBjb25zdW1lcidzIGB0cmFja2luZ1ZlcnNpb25gIHRvIHRoZSB2ZXJzaW9uIGF0IHdoaWNoIHRoZSBkZXBlbmRlbmN5IHdhc1xuICogbGFzdCBvYnNlcnZlZC5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFJlYWN0aXZlTm9kZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgaWQgPSBfbmV4dFJlYWN0aXZlSWQrKztcblxuICAvKipcbiAgICogQSBjYWNoZWQgd2VhayByZWZlcmVuY2UgdG8gdGhpcyBub2RlLCB3aGljaCB3aWxsIGJlIHVzZWQgaW4gYFJlYWN0aXZlRWRnZWBzLlxuICAgKi9cbiAgcHJpdmF0ZSByZWFkb25seSByZWYgPSBuZXdXZWFrUmVmKHRoaXMpO1xuXG4gIC8qKlxuICAgKiBFZGdlcyB0byBwcm9kdWNlcnMgb24gd2hpY2ggdGhpcyBub2RlIGRlcGVuZHMgKGluIGl0cyBjb25zdW1lciBjYXBhY2l0eSkuXG4gICAqL1xuICBwcml2YXRlIHJlYWRvbmx5IHByb2R1Y2VycyA9IG5ldyBNYXA8bnVtYmVyLCBSZWFjdGl2ZUVkZ2U+KCk7XG5cbiAgLyoqXG4gICAqIEVkZ2VzIHRvIGNvbnN1bWVycyBvbiB3aGljaCB0aGlzIG5vZGUgZGVwZW5kcyAoaW4gaXRzIHByb2R1Y2VyIGNhcGFjaXR5KS5cbiAgICovXG4gIHByaXZhdGUgcmVhZG9ubHkgY29uc3VtZXJzID0gbmV3IE1hcDxudW1iZXIsIFJlYWN0aXZlRWRnZT4oKTtcblxuICAvKipcbiAgICogTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGNvdW50ZXIgcmVwcmVzZW50aW5nIGEgdmVyc2lvbiBvZiB0aGlzIGBDb25zdW1lcmAnc1xuICAgKiBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgdHJhY2tpbmdWZXJzaW9uID0gMDtcblxuICAvKipcbiAgICogTW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGNvdW50ZXIgd2hpY2ggaW5jcmVhc2VzIHdoZW4gdGhlIHZhbHVlIG9mIHRoaXMgYFByb2R1Y2VyYFxuICAgKiBzZW1hbnRpY2FsbHkgY2hhbmdlcy5cbiAgICovXG4gIHByb3RlY3RlZCB2YWx1ZVZlcnNpb24gPSAwO1xuXG4gIC8qKlxuICAgKiBDYWxsZWQgZm9yIGNvbnN1bWVycyB3aGVuZXZlciBvbmUgb2YgdGhlaXIgZGVwZW5kZW5jaWVzIG5vdGlmaWVzIHRoYXQgaXQgbWlnaHQgaGF2ZSBhIG5ld1xuICAgKiB2YWx1ZS5cbiAgICovXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBvbkNvbnN1bWVyRGVwZW5kZW5jeU1heUhhdmVDaGFuZ2VkKCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENhbGxlZCBmb3IgcHJvZHVjZXJzIHdoZW4gYSBkZXBlbmRlbnQgY29uc3VtZXIgaXMgY2hlY2tpbmcgaWYgdGhlIHByb2R1Y2VyJ3MgdmFsdWUgaGFzIGFjdHVhbGx5XG4gICAqIGNoYW5nZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3Qgb25Qcm9kdWNlclVwZGF0ZVZhbHVlVmVyc2lvbigpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBQb2xscyBkZXBlbmRlbmNpZXMgb2YgYSBjb25zdW1lciB0byBkZXRlcm1pbmUgaWYgdGhleSBoYXZlIGFjdHVhbGx5IGNoYW5nZWQuXG4gICAqXG4gICAqIElmIHRoaXMgcmV0dXJucyBgZmFsc2VgLCB0aGVuIGV2ZW4gdGhvdWdoIHRoZSBjb25zdW1lciBtYXkgaGF2ZSBwcmV2aW91c2x5IGJlZW4gbm90aWZpZWQgb2YgYVxuICAgKiBjaGFuZ2UsIHRoZSB2YWx1ZXMgb2YgaXRzIGRlcGVuZGVuY2llcyBoYXZlIG5vdCBhY3R1YWxseSBjaGFuZ2VkIGFuZCB0aGUgY29uc3VtZXIgc2hvdWxkIG5vdFxuICAgKiByZXJ1biBhbnkgcmVhY3Rpb25zLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNvbnN1bWVyUG9sbFByb2R1Y2Vyc0ZvckNoYW5nZSgpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IFtwcm9kdWNlcklkLCBlZGdlXSBvZiB0aGlzLnByb2R1Y2Vycykge1xuICAgICAgY29uc3QgcHJvZHVjZXIgPSBlZGdlLnByb2R1Y2VyTm9kZS5kZXJlZigpO1xuXG4gICAgICBpZiAocHJvZHVjZXIgPT09IHVuZGVmaW5lZCB8fCBlZGdlLmF0VHJhY2tpbmdWZXJzaW9uICE9PSB0aGlzLnRyYWNraW5nVmVyc2lvbikge1xuICAgICAgICAvLyBUaGlzIGRlcGVuZGVuY3kgZWRnZSBpcyBzdGFsZSwgc28gcmVtb3ZlIGl0LlxuICAgICAgICB0aGlzLnByb2R1Y2Vycy5kZWxldGUocHJvZHVjZXJJZCk7XG4gICAgICAgIHByb2R1Y2VyPy5jb25zdW1lcnMuZGVsZXRlKHRoaXMuaWQpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHByb2R1Y2VyLnByb2R1Y2VyUG9sbFN0YXR1cyhlZGdlLnNlZW5WYWx1ZVZlcnNpb24pKSB7XG4gICAgICAgIC8vIE9uZSBvZiB0aGUgZGVwZW5kZW5jaWVzIHJlcG9ydHMgYSByZWFsIHZhbHVlIGNoYW5nZS5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gTm8gZGVwZW5kZW5jeSByZXBvcnRlZCBhIHJlYWwgdmFsdWUgY2hhbmdlLCBzbyB0aGUgYENvbnN1bWVyYCBoYXMgYWxzbyBub3QgYmVlblxuICAgIC8vIGltcGFjdGVkLlxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RpZnkgYWxsIGNvbnN1bWVycyBvZiB0aGlzIHByb2R1Y2VyIHRoYXQgaXRzIHZhbHVlIG1heSBoYXZlIGNoYW5nZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgcHJvZHVjZXJNYXlIYXZlQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IFtjb25zdW1lcklkLCBlZGdlXSBvZiB0aGlzLmNvbnN1bWVycykge1xuICAgICAgY29uc3QgY29uc3VtZXIgPSBlZGdlLmNvbnN1bWVyTm9kZS5kZXJlZigpO1xuICAgICAgaWYgKGNvbnN1bWVyID09PSB1bmRlZmluZWQgfHwgY29uc3VtZXIudHJhY2tpbmdWZXJzaW9uICE9PSBlZGdlLmF0VHJhY2tpbmdWZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuY29uc3VtZXJzLmRlbGV0ZShjb25zdW1lcklkKTtcbiAgICAgICAgY29uc3VtZXI/LnByb2R1Y2Vycy5kZWxldGUodGhpcy5pZCk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBjb25zdW1lci5vbkNvbnN1bWVyRGVwZW5kZW5jeU1heUhhdmVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1hcmsgdGhhdCB0aGlzIHByb2R1Y2VyIG5vZGUgaGFzIGJlZW4gYWNjZXNzZWQgaW4gdGhlIGN1cnJlbnQgcmVhY3RpdmUgY29udGV4dC5cbiAgICovXG4gIHByb3RlY3RlZCBwcm9kdWNlckFjY2Vzc2VkKCk6IHZvaWQge1xuICAgIGlmIChhY3RpdmVDb25zdW1lciA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEVpdGhlciBjcmVhdGUgb3IgdXBkYXRlIHRoZSBkZXBlbmRlbmN5IGBFZGdlYCBpbiBib3RoIGRpcmVjdGlvbnMuXG4gICAgbGV0IGVkZ2UgPSBhY3RpdmVDb25zdW1lci5wcm9kdWNlcnMuZ2V0KHRoaXMuaWQpO1xuICAgIGlmIChlZGdlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGVkZ2UgPSB7XG4gICAgICAgIGNvbnN1bWVyTm9kZTogYWN0aXZlQ29uc3VtZXIucmVmLFxuICAgICAgICBwcm9kdWNlck5vZGU6IHRoaXMucmVmLFxuICAgICAgICBzZWVuVmFsdWVWZXJzaW9uOiB0aGlzLnZhbHVlVmVyc2lvbixcbiAgICAgICAgYXRUcmFja2luZ1ZlcnNpb246IGFjdGl2ZUNvbnN1bWVyLnRyYWNraW5nVmVyc2lvbixcbiAgICAgIH07XG4gICAgICBhY3RpdmVDb25zdW1lci5wcm9kdWNlcnMuc2V0KHRoaXMuaWQsIGVkZ2UpO1xuICAgICAgdGhpcy5jb25zdW1lcnMuc2V0KGFjdGl2ZUNvbnN1bWVyLmlkLCBlZGdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWRnZS5zZWVuVmFsdWVWZXJzaW9uID0gdGhpcy52YWx1ZVZlcnNpb247XG4gICAgICBlZGdlLmF0VHJhY2tpbmdWZXJzaW9uID0gYWN0aXZlQ29uc3VtZXIudHJhY2tpbmdWZXJzaW9uO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoaXMgY29uc3VtZXIgY3VycmVudGx5IGhhcyBhbnkgcHJvZHVjZXJzIHJlZ2lzdGVyZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgZ2V0IGhhc1Byb2R1Y2VycygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5wcm9kdWNlcnMuc2l6ZSA+IDA7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIGEgYFByb2R1Y2VyYCBoYXMgYSBjdXJyZW50IHZhbHVlIHdoaWNoIGlzIGRpZmZlcmVudCB0aGFuIHRoZSB2YWx1ZVxuICAgKiBsYXN0IHNlZW4gYXQgYSBzcGVjaWZpYyB2ZXJzaW9uIGJ5IGEgYENvbnN1bWVyYCB3aGljaCByZWNvcmRlZCBhIGRlcGVuZGVuY3kgb25cbiAgICogdGhpcyBgUHJvZHVjZXJgLlxuICAgKi9cbiAgcHJpdmF0ZSBwcm9kdWNlclBvbGxTdGF0dXMobGFzdFNlZW5WYWx1ZVZlcnNpb246IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIGBwcm9kdWNlci52YWx1ZVZlcnNpb25gIG1heSBiZSBzdGFsZSwgYnV0IGEgbWlzbWF0Y2ggc3RpbGwgbWVhbnMgdGhhdCB0aGUgdmFsdWVcbiAgICAvLyBsYXN0IHNlZW4gYnkgdGhlIGBDb25zdW1lcmAgaXMgYWxzbyBzdGFsZS5cbiAgICBpZiAodGhpcy52YWx1ZVZlcnNpb24gIT09IGxhc3RTZWVuVmFsdWVWZXJzaW9uKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyIHRoZSBgUHJvZHVjZXJgIHRvIHVwZGF0ZSBpdHMgYHZhbHVlVmVyc2lvbmAgaWYgbmVjZXNzYXJ5LlxuICAgIHRoaXMub25Qcm9kdWNlclVwZGF0ZVZhbHVlVmVyc2lvbigpO1xuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgd2UgY2FuIHRydXN0IGBwcm9kdWNlci52YWx1ZVZlcnNpb25gLlxuICAgIHJldHVybiB0aGlzLnZhbHVlVmVyc2lvbiAhPT0gbGFzdFNlZW5WYWx1ZVZlcnNpb247XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,75 @@
|
|
|
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 { ReactiveNode } from './graph';
|
|
10
|
+
class WritableSignalImpl extends ReactiveNode {
|
|
11
|
+
constructor(value, equal) {
|
|
12
|
+
super();
|
|
13
|
+
this.value = value;
|
|
14
|
+
this.equal = equal;
|
|
15
|
+
}
|
|
16
|
+
onConsumerDependencyMayHaveChanged() {
|
|
17
|
+
// This never happens for writable signals as they're not consumers.
|
|
18
|
+
}
|
|
19
|
+
onProducerUpdateValueVersion() {
|
|
20
|
+
// Writable signal value versions are always up to date.
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Directly update the value of the signal to a new value, which may or may not be
|
|
24
|
+
* equal to the previous.
|
|
25
|
+
*
|
|
26
|
+
* In the event that `newValue` is semantically equal to the current value, `set` is
|
|
27
|
+
* a no-op.
|
|
28
|
+
*/
|
|
29
|
+
set(newValue) {
|
|
30
|
+
if (!this.equal(this.value, newValue)) {
|
|
31
|
+
this.value = newValue;
|
|
32
|
+
this.valueVersion++;
|
|
33
|
+
this.producerMayHaveChanged();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Derive a new value for the signal from its current value using the `updater` function.
|
|
38
|
+
*
|
|
39
|
+
* This is equivalent to calling `set` on the result of running `updater` on the current
|
|
40
|
+
* value.
|
|
41
|
+
*/
|
|
42
|
+
update(updater) {
|
|
43
|
+
this.set(updater(this.value));
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Calls `mutator` on the current value and assumes that it has been mutated.
|
|
47
|
+
*/
|
|
48
|
+
mutate(mutator) {
|
|
49
|
+
// Mutate bypasses equality checks as it's by definition changing the value.
|
|
50
|
+
mutator(this.value);
|
|
51
|
+
this.valueVersion++;
|
|
52
|
+
this.producerMayHaveChanged();
|
|
53
|
+
}
|
|
54
|
+
signal() {
|
|
55
|
+
this.producerAccessed();
|
|
56
|
+
return this.value;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Create a `Signal` that can be set or updated directly.
|
|
61
|
+
*
|
|
62
|
+
* @developerPreview
|
|
63
|
+
*/
|
|
64
|
+
export function signal(initialValue, options) {
|
|
65
|
+
const signalNode = new WritableSignalImpl(initialValue, options?.equal ?? defaultEquals);
|
|
66
|
+
// Casting here is required for g3, as TS inference behavior is slightly different between our
|
|
67
|
+
// version/options and g3's.
|
|
68
|
+
const signalFn = createSignalFromFunction(signalNode, signalNode.signal.bind(signalNode), {
|
|
69
|
+
set: signalNode.set.bind(signalNode),
|
|
70
|
+
update: signalNode.update.bind(signalNode),
|
|
71
|
+
mutate: signalNode.mutate.bind(signalNode),
|
|
72
|
+
});
|
|
73
|
+
return signalFn;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvc2lnbmFscy9zcmMvc2lnbmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyx3QkFBd0IsRUFBZ0IsYUFBYSxFQUEwQixNQUFNLE9BQU8sQ0FBQztBQUNyRyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBMEJyQyxNQUFNLGtCQUFzQixTQUFRLFlBQVk7SUFDOUMsWUFBb0IsS0FBUSxFQUFVLEtBQXlCO1FBQzdELEtBQUssRUFBRSxDQUFDO1FBRFUsVUFBSyxHQUFMLEtBQUssQ0FBRztRQUFVLFVBQUssR0FBTCxLQUFLLENBQW9CO0lBRS9ELENBQUM7SUFFa0Isa0NBQWtDO1FBQ25ELG9FQUFvRTtJQUN0RSxDQUFDO0lBRWtCLDRCQUE0QjtRQUM3Qyx3REFBd0Q7SUFDMUQsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEdBQUcsQ0FBQyxRQUFXO1FBQ2IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsRUFBRTtZQUNyQyxJQUFJLENBQUMsS0FBSyxHQUFHLFFBQVEsQ0FBQztZQUN0QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDcEIsSUFBSSxDQUFDLHNCQUFzQixFQUFFLENBQUM7U0FDL0I7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsT0FBd0I7UUFDN0IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE9BQTJCO1FBQ2hDLDRFQUE0RTtRQUM1RSxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BCLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLEtBQW1DLENBQUM7SUFDbEQsQ0FBQztDQUNGO0FBY0Q7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQUksWUFBZSxFQUFFLE9BQWdDO0lBQ3pFLE1BQU0sVUFBVSxHQUFHLElBQUksa0JBQWtCLENBQUMsWUFBWSxFQUFFLE9BQU8sRUFBRSxLQUFLLElBQUksYUFBYSxDQUFDLENBQUM7SUFFekYsOEZBQThGO0lBQzlGLDRCQUE0QjtJQUM1QixNQUFNLFFBQVEsR0FBRyx3QkFBd0IsQ0FBQyxVQUFVLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDdkUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUNwQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzFDLE1BQU0sRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7S0FDM0MsQ0FBaUMsQ0FBQztJQUNwRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Y3JlYXRlU2lnbmFsRnJvbUZ1bmN0aW9uLCBEZWVwUmVhZG9ubHksIGRlZmF1bHRFcXVhbHMsIFNpZ25hbCwgVmFsdWVFcXVhbGl0eUZufSBmcm9tICcuL2FwaSc7XG5pbXBvcnQge1JlYWN0aXZlTm9kZX0gZnJvbSAnLi9ncmFwaCc7XG5cbi8qKlxuICogQSBgU2lnbmFsYCB3aXRoIGEgdmFsdWUgdGhhdCBjYW4gYmUgbXV0YXRlZCB2aWEgYSBzZXR0ZXIgaW50ZXJmYWNlLlxuICpcbiAqIEBkZXZlbG9wZXJQcmV2aWV3XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgV3JpdGFibGVTaWduYWw8VD4gZXh0ZW5kcyBTaWduYWw8VD4ge1xuICAvKipcbiAgICogRGlyZWN0bHkgc2V0IHRoZSBzaWduYWwgdG8gYSBuZXcgdmFsdWUsIGFuZCBub3RpZnkgYW55IGRlcGVuZGVudHMuXG4gICAqL1xuICBzZXQodmFsdWU6IFQpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBzaWduYWwgYmFzZWQgb24gaXRzIGN1cnJlbnQgdmFsdWUsIGFuZFxuICAgKiBub3RpZnkgYW55IGRlcGVuZGVudHMuXG4gICAqL1xuICB1cGRhdGUodXBkYXRlRm46ICh2YWx1ZTogVCkgPT4gVCk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVwZGF0ZSB0aGUgY3VycmVudCB2YWx1ZSBieSBtdXRhdGluZyBpdCBpbi1wbGFjZSwgYW5kXG4gICAqIG5vdGlmeSBhbnkgZGVwZW5kZW50cy5cbiAgICovXG4gIG11dGF0ZShtdXRhdG9yRm46ICh2YWx1ZTogVCkgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmNsYXNzIFdyaXRhYmxlU2lnbmFsSW1wbDxUPiBleHRlbmRzIFJlYWN0aXZlTm9kZSB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgdmFsdWU6IFQsIHByaXZhdGUgZXF1YWw6IFZhbHVlRXF1YWxpdHlGbjxUPikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb25Db25zdW1lckRlcGVuZGVuY3lNYXlIYXZlQ2hhbmdlZCgpOiB2b2lkIHtcbiAgICAvLyBUaGlzIG5ldmVyIGhhcHBlbnMgZm9yIHdyaXRhYmxlIHNpZ25hbHMgYXMgdGhleSdyZSBub3QgY29uc3VtZXJzLlxuICB9XG5cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIG9uUHJvZHVjZXJVcGRhdGVWYWx1ZVZlcnNpb24oKTogdm9pZCB7XG4gICAgLy8gV3JpdGFibGUgc2lnbmFsIHZhbHVlIHZlcnNpb25zIGFyZSBhbHdheXMgdXAgdG8gZGF0ZS5cbiAgfVxuXG4gIC8qKlxuICAgKiBEaXJlY3RseSB1cGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBzaWduYWwgdG8gYSBuZXcgdmFsdWUsIHdoaWNoIG1heSBvciBtYXkgbm90IGJlXG4gICAqIGVxdWFsIHRvIHRoZSBwcmV2aW91cy5cbiAgICpcbiAgICogSW4gdGhlIGV2ZW50IHRoYXQgYG5ld1ZhbHVlYCBpcyBzZW1hbnRpY2FsbHkgZXF1YWwgdG8gdGhlIGN1cnJlbnQgdmFsdWUsIGBzZXRgIGlzXG4gICAqIGEgbm8tb3AuXG4gICAqL1xuICBzZXQobmV3VmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuZXF1YWwodGhpcy52YWx1ZSwgbmV3VmFsdWUpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gbmV3VmFsdWU7XG4gICAgICB0aGlzLnZhbHVlVmVyc2lvbisrO1xuICAgICAgdGhpcy5wcm9kdWNlck1heUhhdmVDaGFuZ2VkKCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERlcml2ZSBhIG5ldyB2YWx1ZSBmb3IgdGhlIHNpZ25hbCBmcm9tIGl0cyBjdXJyZW50IHZhbHVlIHVzaW5nIHRoZSBgdXBkYXRlcmAgZnVuY3Rpb24uXG4gICAqXG4gICAqIFRoaXMgaXMgZXF1aXZhbGVudCB0byBjYWxsaW5nIGBzZXRgIG9uIHRoZSByZXN1bHQgb2YgcnVubmluZyBgdXBkYXRlcmAgb24gdGhlIGN1cnJlbnRcbiAgICogdmFsdWUuXG4gICAqL1xuICB1cGRhdGUodXBkYXRlcjogKHZhbHVlOiBUKSA9PiBUKTogdm9pZCB7XG4gICAgdGhpcy5zZXQodXBkYXRlcih0aGlzLnZhbHVlKSk7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbHMgYG11dGF0b3JgIG9uIHRoZSBjdXJyZW50IHZhbHVlIGFuZCBhc3N1bWVzIHRoYXQgaXQgaGFzIGJlZW4gbXV0YXRlZC5cbiAgICovXG4gIG11dGF0ZShtdXRhdG9yOiAodmFsdWU6IFQpID0+IHZvaWQpOiB2b2lkIHtcbiAgICAvLyBNdXRhdGUgYnlwYXNzZXMgZXF1YWxpdHkgY2hlY2tzIGFzIGl0J3MgYnkgZGVmaW5pdGlvbiBjaGFuZ2luZyB0aGUgdmFsdWUuXG4gICAgbXV0YXRvcih0aGlzLnZhbHVlKTtcbiAgICB0aGlzLnZhbHVlVmVyc2lvbisrO1xuICAgIHRoaXMucHJvZHVjZXJNYXlIYXZlQ2hhbmdlZCgpO1xuICB9XG5cbiAgc2lnbmFsKCk6IERlZXBSZWFkb25seTxUPiB7XG4gICAgdGhpcy5wcm9kdWNlckFjY2Vzc2VkKCk7XG4gICAgcmV0dXJuIHRoaXMudmFsdWUgYXMgdW5rbm93biBhcyBEZWVwUmVhZG9ubHk8VD47XG4gIH1cbn1cblxuLyoqXG4gKiBPcHRpb25zIHBhc3NlZCB0byB0aGUgYHNpZ25hbGAgY3JlYXRpb24gZnVuY3Rpb24uXG4gKlxuICogQGRldmVsb3BlclByZXZpZXdcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDcmVhdGVTaWduYWxPcHRpb25zPFQ+IHtcbiAgLyoqXG4gICAqIEEgY29tcGFyaXNvbiBmdW5jdGlvbiB3aGljaCBkZWZpbmVzIGVxdWFsaXR5IGZvciBzaWduYWwgdmFsdWVzLlxuICAgKi9cbiAgZXF1YWw/OiBWYWx1ZUVxdWFsaXR5Rm48VD47XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYFNpZ25hbGAgdGhhdCBjYW4gYmUgc2V0IG9yIHVwZGF0ZWQgZGlyZWN0bHkuXG4gKlxuICogQGRldmVsb3BlclByZXZpZXdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ25hbDxUPihpbml0aWFsVmFsdWU6IFQsIG9wdGlvbnM/OiBDcmVhdGVTaWduYWxPcHRpb25zPFQ+KTogV3JpdGFibGVTaWduYWw8VD4ge1xuICBjb25zdCBzaWduYWxOb2RlID0gbmV3IFdyaXRhYmxlU2lnbmFsSW1wbChpbml0aWFsVmFsdWUsIG9wdGlvbnM/LmVxdWFsID8/IGRlZmF1bHRFcXVhbHMpO1xuXG4gIC8vIENhc3RpbmcgaGVyZSBpcyByZXF1aXJlZCBmb3IgZzMsIGFzIFRTIGluZmVyZW5jZSBiZWhhdmlvciBpcyBzbGlnaHRseSBkaWZmZXJlbnQgYmV0d2VlbiBvdXJcbiAgLy8gdmVyc2lvbi9vcHRpb25zIGFuZCBnMydzLlxuICBjb25zdCBzaWduYWxGbiA9IGNyZWF0ZVNpZ25hbEZyb21GdW5jdGlvbihzaWduYWxOb2RlLCBzaWduYWxOb2RlLnNpZ25hbC5iaW5kKHNpZ25hbE5vZGUpLCB7XG4gICAgICAgICAgICAgICAgICAgICBzZXQ6IHNpZ25hbE5vZGUuc2V0LmJpbmQoc2lnbmFsTm9kZSksXG4gICAgICAgICAgICAgICAgICAgICB1cGRhdGU6IHNpZ25hbE5vZGUudXBkYXRlLmJpbmQoc2lnbmFsTm9kZSksXG4gICAgICAgICAgICAgICAgICAgICBtdXRhdGU6IHNpZ25hbE5vZGUubXV0YXRlLmJpbmQoc2lnbmFsTm9kZSksXG4gICAgICAgICAgICAgICAgICAgfSkgYXMgdW5rbm93biBhcyBXcml0YWJsZVNpZ25hbDxUPjtcbiAgcmV0dXJuIHNpZ25hbEZuO1xufVxuIl19
|
|
@@ -0,0 +1,62 @@
|
|
|
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 { ReactiveNode, setActiveConsumer } from './graph';
|
|
9
|
+
const NOOP_CLEANUP_FN = () => { };
|
|
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 extends ReactiveNode {
|
|
18
|
+
constructor(watch, schedule) {
|
|
19
|
+
super();
|
|
20
|
+
this.watch = watch;
|
|
21
|
+
this.schedule = schedule;
|
|
22
|
+
this.dirty = false;
|
|
23
|
+
this.cleanupFn = NOOP_CLEANUP_FN;
|
|
24
|
+
}
|
|
25
|
+
notify() {
|
|
26
|
+
if (!this.dirty) {
|
|
27
|
+
this.schedule(this);
|
|
28
|
+
}
|
|
29
|
+
this.dirty = true;
|
|
30
|
+
}
|
|
31
|
+
onConsumerDependencyMayHaveChanged() {
|
|
32
|
+
this.notify();
|
|
33
|
+
}
|
|
34
|
+
onProducerUpdateValueVersion() {
|
|
35
|
+
// Watches are not producers.
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Execute the reactive expression in the context of this `Watch` consumer.
|
|
39
|
+
*
|
|
40
|
+
* Should be called by the user scheduling algorithm when the provided
|
|
41
|
+
* `schedule` hook is called by `Watch`.
|
|
42
|
+
*/
|
|
43
|
+
run() {
|
|
44
|
+
this.dirty = false;
|
|
45
|
+
if (this.trackingVersion !== 0 && !this.consumerPollProducersForChange()) {
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const prevConsumer = setActiveConsumer(this);
|
|
49
|
+
this.trackingVersion++;
|
|
50
|
+
try {
|
|
51
|
+
this.cleanupFn();
|
|
52
|
+
this.cleanupFn = this.watch() ?? NOOP_CLEANUP_FN;
|
|
53
|
+
}
|
|
54
|
+
finally {
|
|
55
|
+
setActiveConsumer(prevConsumer);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
cleanup() {
|
|
59
|
+
this.cleanupFn();
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9zaWduYWxzL3NyYy93YXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLGlCQUFpQixFQUFDLE1BQU0sU0FBUyxDQUFDO0FBUXhELE1BQU0sZUFBZSxHQUFtQixHQUFHLEVBQUUsR0FBRSxDQUFDLENBQUM7QUFFakQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLEtBQU0sU0FBUSxZQUFZO0lBSXJDLFlBQW9CLEtBQWdDLEVBQVUsUUFBZ0M7UUFDNUYsS0FBSyxFQUFFLENBQUM7UUFEVSxVQUFLLEdBQUwsS0FBSyxDQUEyQjtRQUFVLGFBQVEsR0FBUixRQUFRLENBQXdCO1FBSHRGLFVBQUssR0FBRyxLQUFLLENBQUM7UUFDZCxjQUFTLEdBQUcsZUFBZSxDQUFDO0lBSXBDLENBQUM7SUFFRCxNQUFNO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUVrQixrQ0FBa0M7UUFDbkQsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQ2hCLENBQUM7SUFFa0IsNEJBQTRCO1FBQzdDLDZCQUE2QjtJQUMvQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxHQUFHO1FBQ0QsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsZUFBZSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyw4QkFBOEIsRUFBRSxFQUFFO1lBQ3hFLE9BQU87U0FDUjtRQUVELE1BQU0sWUFBWSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixJQUFJO1lBQ0YsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLGVBQWUsQ0FBQztTQUNsRDtnQkFBUztZQUNSLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ2pDO0lBQ0gsQ0FBQztJQUVELE9BQU87UUFDTCxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDbkIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7UmVhY3RpdmVOb2RlLCBzZXRBY3RpdmVDb25zdW1lcn0gZnJvbSAnLi9ncmFwaCc7XG5cbi8qKlxuICogQSBjbGVhbnVwIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIG9wdGlvbmFsbHkgcmV0dXJuZWQgZnJvbSB0aGUgd2F0Y2ggbG9naWMuIFdoZW4gcmV0dXJuZWQsIHRoZVxuICogY2xlYW51cCBsb2dpYyBydW5zIGJlZm9yZSB0aGUgbmV4dCB3YXRjaCBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIFdhdGNoQ2xlYW51cEZuID0gKCkgPT4gdm9pZDtcblxuY29uc3QgTk9PUF9DTEVBTlVQX0ZOOiBXYXRjaENsZWFudXBGbiA9ICgpID0+IHt9O1xuXG4vKipcbiAqIFdhdGNoZXMgYSByZWFjdGl2ZSBleHByZXNzaW9uIGFuZCBhbGxvd3MgaXQgdG8gYmUgc2NoZWR1bGVkIHRvIHJlLXJ1blxuICogd2hlbiBhbnkgZGVwZW5kZW5jaWVzIG5vdGlmeSBvZiBhIGNoYW5nZS5cbiAqXG4gKiBgV2F0Y2hgIGRvZXNuJ3QgcnVuIHJlYWN0aXZlIGV4cHJlc3Npb25zIGl0c2VsZiwgYnV0IHJlbGllcyBvbiBhIGNvbnN1bWVyLVxuICogcHJvdmlkZWQgc2NoZWR1bGluZyBvcGVyYXRpb24gdG8gY29vcmRpbmF0ZSBjYWxsaW5nIGBXYXRjaC5ydW4oKWAuXG4gKi9cbmV4cG9ydCBjbGFzcyBXYXRjaCBleHRlbmRzIFJlYWN0aXZlTm9kZSB7XG4gIHByaXZhdGUgZGlydHkgPSBmYWxzZTtcbiAgcHJpdmF0ZSBjbGVhbnVwRm4gPSBOT09QX0NMRUFOVVBfRk47XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSB3YXRjaDogKCkgPT4gdm9pZHxXYXRjaENsZWFudXBGbiwgcHJpdmF0ZSBzY2hlZHVsZTogKHdhdGNoOiBXYXRjaCkgPT4gdm9pZCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBub3RpZnkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmRpcnR5KSB7XG4gICAgICB0aGlzLnNjaGVkdWxlKHRoaXMpO1xuICAgIH1cbiAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBvdmVycmlkZSBvbkNvbnN1bWVyRGVwZW5kZW5jeU1heUhhdmVDaGFuZ2VkKCk6IHZvaWQge1xuICAgIHRoaXMubm90aWZ5KCk7XG4gIH1cblxuICBwcm90ZWN0ZWQgb3ZlcnJpZGUgb25Qcm9kdWNlclVwZGF0ZVZhbHVlVmVyc2lvbigpOiB2b2lkIHtcbiAgICAvLyBXYXRjaGVzIGFyZSBub3QgcHJvZHVjZXJzLlxuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIHJlYWN0aXZlIGV4cHJlc3Npb24gaW4gdGhlIGNvbnRleHQgb2YgdGhpcyBgV2F0Y2hgIGNvbnN1bWVyLlxuICAgKlxuICAgKiBTaG91bGQgYmUgY2FsbGVkIGJ5IHRoZSB1c2VyIHNjaGVkdWxpbmcgYWxnb3JpdGhtIHdoZW4gdGhlIHByb3ZpZGVkXG4gICAqIGBzY2hlZHVsZWAgaG9vayBpcyBjYWxsZWQgYnkgYFdhdGNoYC5cbiAgICovXG4gIHJ1bigpOiB2b2lkIHtcbiAgICB0aGlzLmRpcnR5ID0gZmFsc2U7XG4gICAgaWYgKHRoaXMudHJhY2tpbmdWZXJzaW9uICE9PSAwICYmICF0aGlzLmNvbnN1bWVyUG9sbFByb2R1Y2Vyc0ZvckNoYW5nZSgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgcHJldkNvbnN1bWVyID0gc2V0QWN0aXZlQ29uc3VtZXIodGhpcyk7XG4gICAgdGhpcy50cmFja2luZ1ZlcnNpb24rKztcbiAgICB0cnkge1xuICAgICAgdGhpcy5jbGVhbnVwRm4oKTtcbiAgICAgIHRoaXMuY2xlYW51cEZuID0gdGhpcy53YXRjaCgpID8/IE5PT1BfQ0xFQU5VUF9GTjtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgc2V0QWN0aXZlQ29uc3VtZXIocHJldkNvbnN1bWVyKTtcbiAgICB9XG4gIH1cblxuICBjbGVhbnVwKCkge1xuICAgIHRoaXMuY2xlYW51cEZuKCk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,35 @@
|
|
|
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
|
+
/**
|
|
10
|
+
* A `WeakRef`-compatible reference that fakes the API with a strong reference
|
|
11
|
+
* internally.
|
|
12
|
+
*/
|
|
13
|
+
class LeakyRef {
|
|
14
|
+
constructor(ref) {
|
|
15
|
+
this.ref = ref;
|
|
16
|
+
}
|
|
17
|
+
deref() {
|
|
18
|
+
return this.ref;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// `WeakRef` is not always defined in every TS environment where Angular is compiled. Instead,
|
|
22
|
+
// read it off of the global context if available.
|
|
23
|
+
// tslint:disable-next-line: no-toplevel-property-access
|
|
24
|
+
let WeakRefImpl = global['WeakRef'] ?? LeakyRef;
|
|
25
|
+
export function newWeakRef(value) {
|
|
26
|
+
if (typeof ngDevMode !== 'undefined' && ngDevMode && WeakRefImpl === undefined) {
|
|
27
|
+
throw new Error(`Angular requires a browser which supports the 'WeakRef' API`);
|
|
28
|
+
}
|
|
29
|
+
return new WeakRefImpl(value);
|
|
30
|
+
}
|
|
31
|
+
export function setAlternateWeakRefImpl(impl) {
|
|
32
|
+
// no-op since the alternate impl is included by default by the framework. Remove once internal
|
|
33
|
+
// migration is complete.
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vha19yZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9zaWduYWxzL3NyYy93ZWFrX3JlZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFekM7OztHQUdHO0FBQ0gsTUFBTSxRQUFRO0lBQ1osWUFBNkIsR0FBTTtRQUFOLFFBQUcsR0FBSCxHQUFHLENBQUc7SUFBRyxDQUFDO0lBRXZDLEtBQUs7UUFDSCxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbEIsQ0FBQztDQUNGO0FBRUQsOEZBQThGO0FBQzlGLGtEQUFrRDtBQUNsRCx3REFBd0Q7QUFDeEQsSUFBSSxXQUFXLEdBQTBCLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxRQUFRLENBQUM7QUFNdkUsTUFBTSxVQUFVLFVBQVUsQ0FBbUIsS0FBUTtJQUNuRCxJQUFJLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtRQUM5RSxNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7S0FDaEY7SUFDRCxPQUFPLElBQUksV0FBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2pDLENBQUM7QUFNRCxNQUFNLFVBQVUsdUJBQXVCLENBQUMsSUFBaUI7SUFDdkQsK0ZBQStGO0lBQy9GLHlCQUF5QjtBQUMzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7Z2xvYmFsfSBmcm9tICcuLi8uLi91dGlsL2dsb2JhbCc7XG5cbi8qKlxuICogQSBgV2Vha1JlZmAtY29tcGF0aWJsZSByZWZlcmVuY2UgdGhhdCBmYWtlcyB0aGUgQVBJIHdpdGggYSBzdHJvbmcgcmVmZXJlbmNlXG4gKiBpbnRlcm5hbGx5LlxuICovXG5jbGFzcyBMZWFreVJlZjxUPi8qIGltcGxlbWVudHMgV2Vha1JlZjxUPiAqLyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgcmVmOiBUKSB7fVxuXG4gIGRlcmVmKCk6IFR8dW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5yZWY7XG4gIH1cbn1cblxuLy8gYFdlYWtSZWZgIGlzIG5vdCBhbHdheXMgZGVmaW5lZCBpbiBldmVyeSBUUyBlbnZpcm9ubWVudCB3aGVyZSBBbmd1bGFyIGlzIGNvbXBpbGVkLiBJbnN0ZWFkLFxuLy8gcmVhZCBpdCBvZmYgb2YgdGhlIGdsb2JhbCBjb250ZXh0IGlmIGF2YWlsYWJsZS5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzXG5sZXQgV2Vha1JlZkltcGw6IFdlYWtSZWZDdG9yfHVuZGVmaW5lZCA9IGdsb2JhbFsnV2Vha1JlZiddID8/IExlYWt5UmVmO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdlYWtSZWY8VCBleHRlbmRzIG9iamVjdD4ge1xuICBkZXJlZigpOiBUfHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5ld1dlYWtSZWY8VCBleHRlbmRzIG9iamVjdD4odmFsdWU6IFQpOiBXZWFrUmVmPFQ+IHtcbiAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgIT09ICd1bmRlZmluZWQnICYmIG5nRGV2TW9kZSAmJiBXZWFrUmVmSW1wbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBBbmd1bGFyIHJlcXVpcmVzIGEgYnJvd3NlciB3aGljaCBzdXBwb3J0cyB0aGUgJ1dlYWtSZWYnIEFQSWApO1xuICB9XG4gIHJldHVybiBuZXcgV2Vha1JlZkltcGwhKHZhbHVlKTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWFrUmVmQ3RvciB7XG4gIG5ldzxUIGV4dGVuZHMgb2JqZWN0Pih2YWx1ZTogVCk6IFdlYWtSZWY8VD47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBbHRlcm5hdGVXZWFrUmVmSW1wbChpbXBsOiBXZWFrUmVmQ3Rvcikge1xuICAvLyBuby1vcCBzaW5jZSB0aGUgYWx0ZXJuYXRlIGltcGwgaXMgaW5jbHVkZWQgYnkgZGVmYXVsdCBieSB0aGUgZnJhbWV3b3JrLiBSZW1vdmUgb25jZSBpbnRlcm5hbFxuICAvLyBtaWdyYXRpb24gaXMgY29tcGxldGUuXG59XG4iXX0=
|