@angular/compiler-cli 12.1.1 → 12.1.2
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/linker/src/file_linker/emit_scopes/iife_emit_scope.js +1 -1
- package/linker/src/file_linker/partial_linkers/partial_linker_selector.js +2 -2
- package/ngcc/src/dependencies/commonjs_dependency_host.js +1 -1
- package/ngcc/src/dependencies/dts_dependency_host.js +1 -1
- package/ngcc/src/dependencies/esm_dependency_host.js +1 -1
- package/ngcc/src/dependencies/umd_dependency_host.js +1 -1
- package/ngcc/src/entry_point_finder/program_based_entry_point_finder.js +1 -1
- package/ngcc/src/entry_point_finder/targeted_entry_point_finder.js +1 -1
- package/ngcc/src/execution/tasks/queues/parallel_task_queue.js +1 -1
- package/ngcc/src/execution/tasks/queues/serial_task_queue.js +1 -1
- package/ngcc/src/host/commonjs_host.js +1 -1
- package/ngcc/src/host/esm2015_host.js +1 -1
- package/ngcc/src/host/esm5_host.js +1 -1
- package/ngcc/src/host/umd_host.js +1 -1
- package/ngcc/src/packages/build_marker.d.ts +1 -1
- package/ngcc/src/packages/build_marker.js +1 -1
- package/ngcc/src/packages/entry_point_manifest.js +1 -1
- package/ngcc/src/packages/ngcc_compiler_host.js +1 -1
- package/ngcc/src/rendering/commonjs_rendering_formatter.js +1 -1
- package/ngcc/src/rendering/esm5_rendering_formatter.js +1 -1
- package/ngcc/src/rendering/umd_rendering_formatter.js +1 -1
- package/ngcc/src/writing/new_entry_point_file_writer.js +1 -1
- package/package.json +2 -2
- package/src/ngtsc/annotations/src/component.js +1 -1
- package/src/ngtsc/annotations/src/directive.js +1 -1
- package/src/ngtsc/annotations/src/ng_module.js +1 -1
- package/src/ngtsc/annotations/src/pipe.js +1 -1
- package/src/ngtsc/core/src/compiler.js +1 -1
- package/src/ngtsc/file_system/testing/src/mock_file_system_native.js +1 -1
- package/src/ngtsc/file_system/testing/src/mock_file_system_posix.js +1 -1
- package/src/ngtsc/file_system/testing/src/mock_file_system_windows.js +1 -1
- package/src/ngtsc/incremental/semantic_graph/src/graph.js +1 -1
- package/src/ngtsc/incremental/src/incremental.js +30 -4
- package/src/ngtsc/indexer/src/template.js +1 -1
- package/src/ngtsc/partial_evaluator/src/builtin.js +1 -1
- package/src/ngtsc/partial_evaluator/src/ts_helpers.js +1 -1
- package/src/ngtsc/program_driver/src/api.d.ts +20 -1
- package/src/ngtsc/program_driver/src/api.js +3 -2
- package/src/ngtsc/program_driver/src/ts_create_program_driver.d.ts +2 -2
- package/src/ngtsc/program_driver/src/ts_create_program_driver.js +7 -3
- package/src/ngtsc/reflection/src/typescript.js +4 -1
- package/src/ngtsc/transform/src/transform.js +1 -1
- package/src/ngtsc/typecheck/src/context.d.ts +2 -1
- package/src/ngtsc/typecheck/src/context.js +11 -3
- package/src/ngtsc/typecheck/src/template_semantics.js +1 -1
- package/src/ngtsc/typecheck/src/template_symbol_builder.js +21 -1
- package/src/ngtsc/typecheck/src/type_check_block.js +2 -2
- package/src/ngtsc/typecheck/src/type_check_file.js +1 -1
- package/src/ngtsc/typecheck/src/type_emitter.js +25 -6
- package/src/ngtsc/util/src/visitor.d.ts +1 -1
- package/src/ngtsc/util/src/visitor.js +1 -8
- package/src/version.js +1 -1
- package/compiler-cli.externs.js +0 -0
- package/index.mjs +0 -20
- package/linker/babel/babel.externs.js +0 -0
- package/linker/babel/index.mjs +0 -11
- package/linker/babel/src/ast/babel_ast_factory.mjs +0 -137
- package/linker/babel/src/ast/babel_ast_host.mjs +0 -154
- package/linker/babel/src/babel_declaration_scope.mjs +0 -52
- package/linker/babel/src/babel_plugin.mjs +0 -23
- package/linker/babel/src/es2015_linker_plugin.mjs +0 -158
- package/linker/babel/src/linker_plugin_options.mjs +0 -2
- package/linker/index.mjs +0 -7
- package/linker/linker.externs.js +0 -0
- package/linker/src/ast/ast_host.mjs +0 -9
- package/linker/src/ast/ast_value.mjs +0 -256
- package/linker/src/ast/typescript/typescript_ast_host.mjs +0 -156
- package/linker/src/ast/utils.mjs +0 -17
- package/linker/src/fatal_linker_error.mjs +0 -30
- package/linker/src/file_linker/declaration_scope.mjs +0 -9
- package/linker/src/file_linker/emit_scopes/emit_scope.mjs +0 -41
- package/linker/src/file_linker/emit_scopes/iife_emit_scope.mjs +0 -33
- package/linker/src/file_linker/file_linker.mjs +0 -70
- package/linker/src/file_linker/get_source_file.mjs +0 -28
- package/linker/src/file_linker/linker_environment.mjs +0 -23
- package/linker/src/file_linker/linker_options.mjs +0 -16
- package/linker/src/file_linker/needs_linking.mjs +0 -27
- package/linker/src/file_linker/partial_linkers/partial_class_metadata_linker_1.mjs +0 -29
- package/linker/src/file_linker/partial_linkers/partial_component_linker_1.mjs +0 -194
- package/linker/src/file_linker/partial_linkers/partial_directive_linker_1.mjs +0 -137
- package/linker/src/file_linker/partial_linkers/partial_factory_linker_1.mjs +0 -52
- package/linker/src/file_linker/partial_linkers/partial_injectable_linker_1.mjs +0 -56
- package/linker/src/file_linker/partial_linkers/partial_injector_linker_1.mjs +0 -38
- package/linker/src/file_linker/partial_linkers/partial_linker.mjs +0 -2
- package/linker/src/file_linker/partial_linkers/partial_linker_selector.mjs +0 -166
- package/linker/src/file_linker/partial_linkers/partial_ng_module_linker_1.mjs +0 -110
- package/linker/src/file_linker/partial_linkers/partial_pipe_linker_1.mjs +0 -42
- package/linker/src/file_linker/partial_linkers/util.mjs +0 -78
- package/linker/src/file_linker/translator.mjs +0 -23
- package/linker/src/linker_import_generator.mjs +0 -28
- package/ngcc/index.mjs +0 -16
- package/ngcc/main-ivy-ngcc.mjs +0 -12
- package/ngcc/main-ngcc.mjs +0 -32
- package/ngcc/ngcc.externs.js +0 -0
- package/ngcc/src/analysis/decoration_analyzer.mjs +0 -215
- package/ngcc/src/analysis/migration_host.mjs +0 -80
- package/ngcc/src/analysis/module_with_providers_analyzer.mjs +0 -178
- package/ngcc/src/analysis/ngcc_references_registry.mjs +0 -45
- package/ngcc/src/analysis/ngcc_trait_compiler.mjs +0 -70
- package/ngcc/src/analysis/private_declarations_analyzer.mjs +0 -47
- package/ngcc/src/analysis/switch_marker_analyzer.mjs +0 -34
- package/ngcc/src/analysis/types.mjs +0 -2
- package/ngcc/src/analysis/util.mjs +0 -19
- package/ngcc/src/command_line_options.mjs +0 -142
- package/ngcc/src/constants.mjs +0 -10
- package/ngcc/src/dependencies/commonjs_dependency_host.mjs +0 -87
- package/ngcc/src/dependencies/dependency_host.mjs +0 -102
- package/ngcc/src/dependencies/dependency_resolver.mjs +0 -151
- package/ngcc/src/dependencies/dts_dependency_host.mjs +0 -18
- package/ngcc/src/dependencies/esm_dependency_host.mjs +0 -286
- package/ngcc/src/dependencies/module_resolver.mjs +0 -233
- package/ngcc/src/dependencies/umd_dependency_host.mjs +0 -33
- package/ngcc/src/entry_point_finder/directory_walker_entry_point_finder.mjs +0 -42
- package/ngcc/src/entry_point_finder/entry_point_collector.mjs +0 -120
- package/ngcc/src/entry_point_finder/interface.mjs +0 -2
- package/ngcc/src/entry_point_finder/program_based_entry_point_finder.mjs +0 -91
- package/ngcc/src/entry_point_finder/targeted_entry_point_finder.mjs +0 -216
- package/ngcc/src/entry_point_finder/tracing_entry_point_finder.mjs +0 -63
- package/ngcc/src/entry_point_finder/utils.mjs +0 -176
- package/ngcc/src/execution/analyze_entry_points.mjs +0 -130
- package/ngcc/src/execution/api.mjs +0 -2
- package/ngcc/src/execution/cluster/api.mjs +0 -9
- package/ngcc/src/execution/cluster/executor.mjs +0 -27
- package/ngcc/src/execution/cluster/master.mjs +0 -261
- package/ngcc/src/execution/cluster/package_json_updater.mjs +0 -45
- package/ngcc/src/execution/cluster/utils.mjs +0 -59
- package/ngcc/src/execution/cluster/worker.mjs +0 -81
- package/ngcc/src/execution/create_compile_function.mjs +0 -62
- package/ngcc/src/execution/single_process_executor.mjs +0 -57
- package/ngcc/src/execution/tasks/api.mjs +0 -22
- package/ngcc/src/execution/tasks/completion.mjs +0 -61
- package/ngcc/src/execution/tasks/queues/base_task_queue.mjs +0 -78
- package/ngcc/src/execution/tasks/queues/parallel_task_queue.mjs +0 -53
- package/ngcc/src/execution/tasks/queues/serial_task_queue.mjs +0 -29
- package/ngcc/src/execution/tasks/utils.mjs +0 -114
- package/ngcc/src/host/commonjs_host.mjs +0 -220
- package/ngcc/src/host/commonjs_umd_utils.mjs +0 -186
- package/ngcc/src/host/delegating_host.mjs +0 -140
- package/ngcc/src/host/esm2015_host.mjs +0 -2293
- package/ngcc/src/host/esm5_host.mjs +0 -721
- package/ngcc/src/host/ngcc_host.mjs +0 -15
- package/ngcc/src/host/umd_host.mjs +0 -486
- package/ngcc/src/host/utils.mjs +0 -12
- package/ngcc/src/locking/async_locker.mjs +0 -76
- package/ngcc/src/locking/lock_file.mjs +0 -4
- package/ngcc/src/locking/lock_file_with_child_process/index.mjs +0 -78
- package/ngcc/src/locking/lock_file_with_child_process/unlocker.mjs +0 -34
- package/ngcc/src/locking/lock_file_with_child_process/util.mjs +0 -29
- package/ngcc/src/locking/sync_locker.mjs +0 -52
- package/ngcc/src/main.mjs +0 -134
- package/ngcc/src/migrations/migration.mjs +0 -2
- package/ngcc/src/migrations/missing_injectable_migration.mjs +0 -164
- package/ngcc/src/migrations/undecorated_child_migration.mjs +0 -61
- package/ngcc/src/migrations/undecorated_parent_migration.mjs +0 -86
- package/ngcc/src/migrations/utils.mjs +0 -117
- package/ngcc/src/ngcc_options.mjs +0 -119
- package/ngcc/src/packages/build_marker.mjs +0 -84
- package/ngcc/src/packages/bundle_program.mjs +0 -52
- package/ngcc/src/packages/configuration.mjs +0 -255
- package/ngcc/src/packages/entry_point.mjs +0 -239
- package/ngcc/src/packages/entry_point_bundle.mjs +0 -68
- package/ngcc/src/packages/entry_point_manifest.mjs +0 -162
- package/ngcc/src/packages/ngcc_compiler_host.mjs +0 -77
- package/ngcc/src/packages/patch_ts_expando_initializer.mjs +0 -166
- package/ngcc/src/packages/source_file_cache.mjs +0 -187
- package/ngcc/src/packages/transformer.mjs +0 -140
- package/ngcc/src/path_mappings.mjs +0 -13
- package/ngcc/src/rendering/commonjs_rendering_formatter.mjs +0 -65
- package/ngcc/src/rendering/dts_renderer.mjs +0 -139
- package/ngcc/src/rendering/esm5_rendering_formatter.mjs +0 -50
- package/ngcc/src/rendering/esm_rendering_formatter.mjs +0 -251
- package/ngcc/src/rendering/ngcc_import_rewriter.mjs +0 -32
- package/ngcc/src/rendering/renderer.mjs +0 -170
- package/ngcc/src/rendering/rendering_formatter.mjs +0 -2
- package/ngcc/src/rendering/source_maps.mjs +0 -54
- package/ngcc/src/rendering/umd_rendering_formatter.mjs +0 -292
- package/ngcc/src/rendering/utils.mjs +0 -20
- package/ngcc/src/utils.mjs +0 -144
- package/ngcc/src/writing/cleaning/cleaning_strategies.mjs +0 -61
- package/ngcc/src/writing/cleaning/package_cleaner.mjs +0 -67
- package/ngcc/src/writing/cleaning/utils.mjs +0 -16
- package/ngcc/src/writing/file_writer.mjs +0 -2
- package/ngcc/src/writing/in_place_file_writer.mjs +0 -62
- package/ngcc/src/writing/new_entry_point_file_writer.mjs +0 -161
- package/ngcc/src/writing/package_json_updater.mjs +0 -144
- package/src/diagnostics/translate_diagnostics.mjs +0 -47
- package/src/diagnostics/typescript_version.mjs +0 -79
- package/src/extract_i18n.mjs +0 -46
- package/src/language_services.mjs +0 -18
- package/src/main.mjs +0 -185
- package/src/metadata/bundle_index_host.mjs +0 -107
- package/src/metadata/bundler.mjs +0 -556
- package/src/metadata/collector.mjs +0 -701
- package/src/metadata/evaluator.mjs +0 -643
- package/src/metadata/index.mjs +0 -11
- package/src/metadata/index_writer.mjs +0 -44
- package/src/metadata/schema.mjs +0 -102
- package/src/metadata/symbols.mjs +0 -117
- package/src/ngtsc/annotations/annotations.externs.js +0 -0
- package/src/ngtsc/annotations/index.mjs +0 -15
- package/src/ngtsc/annotations/src/api.mjs +0 -9
- package/src/ngtsc/annotations/src/component.mjs +0 -1068
- package/src/ngtsc/annotations/src/diagnostics.mjs +0 -147
- package/src/ngtsc/annotations/src/directive.mjs +0 -692
- package/src/ngtsc/annotations/src/factory.mjs +0 -17
- package/src/ngtsc/annotations/src/injectable.mjs +0 -260
- package/src/ngtsc/annotations/src/metadata.mjs +0 -145
- package/src/ngtsc/annotations/src/ng_module.mjs +0 -565
- package/src/ngtsc/annotations/src/pipe.mjs +0 -151
- package/src/ngtsc/annotations/src/references_registry.mjs +0 -16
- package/src/ngtsc/annotations/src/util.mjs +0 -495
- package/src/ngtsc/core/api/index.mjs +0 -12
- package/src/ngtsc/core/api/src/adapter.mjs +0 -9
- package/src/ngtsc/core/api/src/interfaces.mjs +0 -9
- package/src/ngtsc/core/api/src/options.mjs +0 -9
- package/src/ngtsc/core/api/src/public_options.mjs +0 -9
- package/src/ngtsc/core/api.externs.js +0 -0
- package/src/ngtsc/core/core.externs.js +0 -0
- package/src/ngtsc/core/index.mjs +0 -10
- package/src/ngtsc/core/src/compiler.mjs +0 -917
- package/src/ngtsc/core/src/config.mjs +0 -15
- package/src/ngtsc/core/src/host.mjs +0 -229
- package/src/ngtsc/cycles/cycles.externs.js +0 -0
- package/src/ngtsc/cycles/index.mjs +0 -10
- package/src/ngtsc/cycles/src/analyzer.mjs +0 -60
- package/src/ngtsc/cycles/src/imports.mjs +0 -152
- package/src/ngtsc/diagnostics/diagnostics.externs.js +0 -0
- package/src/ngtsc/diagnostics/index.mjs +0 -11
- package/src/ngtsc/diagnostics/src/error.mjs +0 -51
- package/src/ngtsc/diagnostics/src/error_code.mjs +0 -198
- package/src/ngtsc/diagnostics/src/util.mjs +0 -21
- package/src/ngtsc/entry_point/entry_point.externs.js +0 -0
- package/src/ngtsc/entry_point/index.mjs +0 -12
- package/src/ngtsc/entry_point/src/generator.mjs +0 -35
- package/src/ngtsc/entry_point/src/logic.mjs +0 -35
- package/src/ngtsc/entry_point/src/private_export_checker.mjs +0 -122
- package/src/ngtsc/entry_point/src/reference_graph.mjs +0 -73
- package/src/ngtsc/file_system/file_system.externs.js +0 -0
- package/src/ngtsc/file_system/index.mjs +0 -13
- package/src/ngtsc/file_system/src/compiler_host.mjs +0 -64
- package/src/ngtsc/file_system/src/helpers.mjs +0 -99
- package/src/ngtsc/file_system/src/invalid_file_system.mjs +0 -95
- package/src/ngtsc/file_system/src/logical.mjs +0 -84
- package/src/ngtsc/file_system/src/node_js_file_system.mjs +0 -142
- package/src/ngtsc/file_system/src/types.mjs +0 -9
- package/src/ngtsc/file_system/src/util.mjs +0 -22
- package/src/ngtsc/file_system/testing/index.mjs +0 -13
- package/src/ngtsc/file_system/testing/src/mock_file_system.mjs +0 -293
- package/src/ngtsc/file_system/testing/src/mock_file_system_native.mjs +0 -57
- package/src/ngtsc/file_system/testing/src/mock_file_system_posix.mjs +0 -38
- package/src/ngtsc/file_system/testing/src/mock_file_system_windows.mjs +0 -38
- package/src/ngtsc/file_system/testing/src/test_helper.mjs +0 -108
- package/src/ngtsc/file_system/testing/testing.externs.js +0 -0
- package/src/ngtsc/imports/imports.externs.js +0 -0
- package/src/ngtsc/imports/index.mjs +0 -14
- package/src/ngtsc/imports/src/alias.mjs +0 -137
- package/src/ngtsc/imports/src/core.mjs +0 -78
- package/src/ngtsc/imports/src/default.mjs +0 -135
- package/src/ngtsc/imports/src/emitter.mjs +0 -266
- package/src/ngtsc/imports/src/find_export.mjs +0 -56
- package/src/ngtsc/imports/src/reexport.mjs +0 -9
- package/src/ngtsc/imports/src/references.mjs +0 -137
- package/src/ngtsc/imports/src/resolver.mjs +0 -24
- package/src/ngtsc/incremental/api.externs.js +0 -0
- package/src/ngtsc/incremental/api.mjs +0 -9
- package/src/ngtsc/incremental/incremental.externs.js +0 -0
- package/src/ngtsc/incremental/index.mjs +0 -12
- package/src/ngtsc/incremental/semantic_graph/index.mjs +0 -12
- package/src/ngtsc/incremental/semantic_graph/semantic_graph.externs.js +0 -0
- package/src/ngtsc/incremental/semantic_graph/src/api.mjs +0 -36
- package/src/ngtsc/incremental/semantic_graph/src/graph.mjs +0 -237
- package/src/ngtsc/incremental/semantic_graph/src/type_parameters.mjs +0 -40
- package/src/ngtsc/incremental/semantic_graph/src/util.mjs +0 -69
- package/src/ngtsc/incremental/src/dependency_tracking.mjs +0 -117
- package/src/ngtsc/incremental/src/incremental.mjs +0 -271
- package/src/ngtsc/incremental/src/noop.mjs +0 -13
- package/src/ngtsc/incremental/src/state.mjs +0 -17
- package/src/ngtsc/incremental/src/strategy.mjs +0 -76
- package/src/ngtsc/indexer/index.mjs +0 -11
- package/src/ngtsc/indexer/indexer.externs.js +0 -0
- package/src/ngtsc/indexer/src/api.mjs +0 -30
- package/src/ngtsc/indexer/src/context.mjs +0 -25
- package/src/ngtsc/indexer/src/template.mjs +0 -303
- package/src/ngtsc/indexer/src/transform.mjs +0 -51
- package/src/ngtsc/logging/index.mjs +0 -10
- package/src/ngtsc/logging/logging.externs.js +0 -0
- package/src/ngtsc/logging/src/console_logger.mjs +0 -43
- package/src/ngtsc/logging/src/logger.mjs +0 -15
- package/src/ngtsc/logging/testing/index.mjs +0 -9
- package/src/ngtsc/logging/testing/src/mock_logger.mjs +0 -32
- package/src/ngtsc/logging/testing/testing.externs.js +0 -0
- package/src/ngtsc/metadata/index.mjs +0 -15
- package/src/ngtsc/metadata/metadata.externs.js +0 -0
- package/src/ngtsc/metadata/src/api.mjs +0 -13
- package/src/ngtsc/metadata/src/dts.mjs +0 -143
- package/src/ngtsc/metadata/src/inheritance.mjs +0 -71
- package/src/ngtsc/metadata/src/property_mapping.mjs +0 -136
- package/src/ngtsc/metadata/src/registry.mjs +0 -80
- package/src/ngtsc/metadata/src/resource_registry.mjs +0 -81
- package/src/ngtsc/metadata/src/util.mjs +0 -200
- package/src/ngtsc/partial_evaluator/index.mjs +0 -12
- package/src/ngtsc/partial_evaluator/partial_evaluator.externs.js +0 -0
- package/src/ngtsc/partial_evaluator/src/builtin.mjs +0 -65
- package/src/ngtsc/partial_evaluator/src/diagnostics.mjs +0 -174
- package/src/ngtsc/partial_evaluator/src/dynamic.mjs +0 -94
- package/src/ngtsc/partial_evaluator/src/interface.mjs +0 -27
- package/src/ngtsc/partial_evaluator/src/interpreter.mjs +0 -719
- package/src/ngtsc/partial_evaluator/src/known_declaration.mjs +0 -43
- package/src/ngtsc/partial_evaluator/src/result.mjs +0 -50
- package/src/ngtsc/partial_evaluator/src/ts_helpers.mjs +0 -72
- package/src/ngtsc/perf/index.mjs +0 -11
- package/src/ngtsc/perf/perf.externs.js +0 -0
- package/src/ngtsc/perf/src/api.mjs +0 -278
- package/src/ngtsc/perf/src/clock.mjs +0 -15
- package/src/ngtsc/perf/src/noop.mjs +0 -21
- package/src/ngtsc/perf/src/recorder.mjs +0 -125
- package/src/ngtsc/program.mjs +0 -271
- package/src/ngtsc/program_driver/index.mjs +0 -10
- package/src/ngtsc/program_driver/program_driver.externs.js +0 -0
- package/src/ngtsc/program_driver/src/api.mjs +0 -22
- package/src/ngtsc/program_driver/src/ts_create_program_driver.mjs +0 -164
- package/src/ngtsc/reflection/index.mjs +0 -12
- package/src/ngtsc/reflection/reflection.externs.js +0 -0
- package/src/ngtsc/reflection/src/host.mjs +0 -73
- package/src/ngtsc/reflection/src/type_to_value.mjs +0 -243
- package/src/ngtsc/reflection/src/typescript.mjs +0 -608
- package/src/ngtsc/reflection/src/util.mjs +0 -21
- package/src/ngtsc/resource/index.mjs +0 -9
- package/src/ngtsc/resource/resource.externs.js +0 -0
- package/src/ngtsc/resource/src/loader.mjs +0 -242
- package/src/ngtsc/routing/index.mjs +0 -11
- package/src/ngtsc/routing/routing.externs.js +0 -0
- package/src/ngtsc/routing/src/analyzer.mjs +0 -69
- package/src/ngtsc/routing/src/lazy.mjs +0 -168
- package/src/ngtsc/routing/src/route.mjs +0 -51
- package/src/ngtsc/scope/index.mjs +0 -12
- package/src/ngtsc/scope/scope.externs.js +0 -0
- package/src/ngtsc/scope/src/api.mjs +0 -9
- package/src/ngtsc/scope/src/component_scope.mjs +0 -31
- package/src/ngtsc/scope/src/dependency.mjs +0 -134
- package/src/ngtsc/scope/src/local.mjs +0 -531
- package/src/ngtsc/scope/src/typecheck.mjs +0 -83
- package/src/ngtsc/shims/api.externs.js +0 -0
- package/src/ngtsc/shims/api.mjs +0 -2
- package/src/ngtsc/shims/index.mjs +0 -14
- package/src/ngtsc/shims/shims.externs.js +0 -0
- package/src/ngtsc/shims/src/adapter.mjs +0 -188
- package/src/ngtsc/shims/src/expando.mjs +0 -102
- package/src/ngtsc/shims/src/factory_generator.mjs +0 -265
- package/src/ngtsc/shims/src/reference_tagger.mjs +0 -67
- package/src/ngtsc/shims/src/summary_generator.mjs +0 -64
- package/src/ngtsc/shims/src/util.mjs +0 -26
- package/src/ngtsc/sourcemaps/index.mjs +0 -11
- package/src/ngtsc/sourcemaps/sourcemaps.externs.js +0 -0
- package/src/ngtsc/sourcemaps/src/content_origin.mjs +0 -35
- package/src/ngtsc/sourcemaps/src/raw_source_map.mjs +0 -2
- package/src/ngtsc/sourcemaps/src/segment_marker.mjs +0 -40
- package/src/ngtsc/sourcemaps/src/source_file.mjs +0 -459
- package/src/ngtsc/sourcemaps/src/source_file_loader.mjs +0 -213
- package/src/ngtsc/switch/index.mjs +0 -9
- package/src/ngtsc/switch/src/switch.mjs +0 -115
- package/src/ngtsc/switch/switch.externs.js +0 -0
- package/src/ngtsc/transform/index.mjs +0 -14
- package/src/ngtsc/transform/src/alias.mjs +0 -30
- package/src/ngtsc/transform/src/api.mjs +0 -63
- package/src/ngtsc/transform/src/compilation.mjs +0 -514
- package/src/ngtsc/transform/src/declaration.mjs +0 -182
- package/src/ngtsc/transform/src/trait.mjs +0 -95
- package/src/ngtsc/transform/src/transform.mjs +0 -298
- package/src/ngtsc/transform/src/utils.mjs +0 -57
- package/src/ngtsc/transform/transform.externs.js +0 -0
- package/src/ngtsc/translator/index.mjs +0 -14
- package/src/ngtsc/translator/src/api/ast_factory.mjs +0 -9
- package/src/ngtsc/translator/src/api/import_generator.mjs +0 -9
- package/src/ngtsc/translator/src/context.mjs +0 -24
- package/src/ngtsc/translator/src/import_manager.mjs +0 -48
- package/src/ngtsc/translator/src/translator.mjs +0 -317
- package/src/ngtsc/translator/src/type_translator.mjs +0 -204
- package/src/ngtsc/translator/src/typescript_ast_factory.mjs +0 -211
- package/src/ngtsc/translator/src/typescript_translator.mjs +0 -17
- package/src/ngtsc/translator/translator.externs.js +0 -0
- package/src/ngtsc/tsc_plugin.mjs +0 -98
- package/src/ngtsc/typecheck/api/api.externs.js +0 -0
- package/src/ngtsc/typecheck/api/api.mjs +0 -9
- package/src/ngtsc/typecheck/api/checker.mjs +0 -31
- package/src/ngtsc/typecheck/api/completion.mjs +0 -16
- package/src/ngtsc/typecheck/api/context.mjs +0 -9
- package/src/ngtsc/typecheck/api/index.mjs +0 -14
- package/src/ngtsc/typecheck/api/scope.mjs +0 -9
- package/src/ngtsc/typecheck/api/symbols.mjs +0 -22
- package/src/ngtsc/typecheck/diagnostics/diagnostics.externs.js +0 -0
- package/src/ngtsc/typecheck/diagnostics/index.mjs +0 -10
- package/src/ngtsc/typecheck/diagnostics/src/diagnostic.mjs +0 -99
- package/src/ngtsc/typecheck/diagnostics/src/id.mjs +0 -23
- package/src/ngtsc/typecheck/index.mjs +0 -12
- package/src/ngtsc/typecheck/src/checker.mjs +0 -591
- package/src/ngtsc/typecheck/src/comments.mjs +0 -159
- package/src/ngtsc/typecheck/src/completion.mjs +0 -155
- package/src/ngtsc/typecheck/src/context.mjs +0 -350
- package/src/ngtsc/typecheck/src/diagnostics.mjs +0 -95
- package/src/ngtsc/typecheck/src/dom.mjs +0 -68
- package/src/ngtsc/typecheck/src/environment.mjs +0 -146
- package/src/ngtsc/typecheck/src/expression.mjs +0 -412
- package/src/ngtsc/typecheck/src/line_mappings.mjs +0 -60
- package/src/ngtsc/typecheck/src/oob.mjs +0 -112
- package/src/ngtsc/typecheck/src/shim.mjs +0 -37
- package/src/ngtsc/typecheck/src/source.mjs +0 -74
- package/src/ngtsc/typecheck/src/tcb_util.mjs +0 -135
- package/src/ngtsc/typecheck/src/template_semantics.mjs +0 -34
- package/src/ngtsc/typecheck/src/template_symbol_builder.mjs +0 -485
- package/src/ngtsc/typecheck/src/ts_util.mjs +0 -157
- package/src/ngtsc/typecheck/src/type_check_block.mjs +0 -1770
- package/src/ngtsc/typecheck/src/type_check_file.mjs +0 -65
- package/src/ngtsc/typecheck/src/type_constructor.mjs +0 -227
- package/src/ngtsc/typecheck/src/type_emitter.mjs +0 -127
- package/src/ngtsc/typecheck/src/type_parameter_emitter.mjs +0 -93
- package/src/ngtsc/typecheck/typecheck.externs.js +0 -0
- package/src/ngtsc/util/src/path.mjs +0 -18
- package/src/ngtsc/util/src/typescript.mjs +0 -143
- package/src/ngtsc/util/src/visitor.mjs +0 -107
- package/src/ngtsc/util/util.externs.js +0 -0
- package/src/ngtsc/xi18n/index.mjs +0 -9
- package/src/ngtsc/xi18n/src/context.mjs +0 -9
- package/src/ngtsc/xi18n/xi18n.externs.js +0 -0
- package/src/perform_compile.mjs +0 -275
- package/src/perform_watch.mjs +0 -247
- package/src/tooling.mjs +0 -32
- package/src/transformers/api.mjs +0 -27
- package/src/transformers/compiler_host.mjs +0 -593
- package/src/transformers/downlevel_decorators_transform.mjs +0 -507
- package/src/transformers/entry_points.mjs +0 -10
- package/src/transformers/i18n.mjs +0 -59
- package/src/transformers/inline_resources.mjs +0 -269
- package/src/transformers/lower_expressions.mjs +0 -336
- package/src/transformers/metadata_cache.mjs +0 -53
- package/src/transformers/metadata_reader.mjs +0 -104
- package/src/transformers/node_emitter.mjs +0 -606
- package/src/transformers/node_emitter_transform.mjs +0 -78
- package/src/transformers/patch_alias_reference_resolution.mjs +0 -109
- package/src/transformers/program.mjs +0 -887
- package/src/transformers/r3_metadata_transform.mjs +0 -46
- package/src/transformers/r3_transform.mjs +0 -29
- package/src/transformers/util.mjs +0 -89
- package/src/typescript_support.mjs +0 -57
- package/src/version.mjs +0 -15
|
@@ -1,77 +0,0 @@
|
|
|
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 * as ts from 'typescript';
|
|
9
|
-
import { NgtscCompilerHost } from '../../../src/ngtsc/file_system';
|
|
10
|
-
import { isWithinPackage } from '../analysis/util';
|
|
11
|
-
import { isRelativePath } from '../utils';
|
|
12
|
-
/**
|
|
13
|
-
* Represents a compiler host that resolves a module import as a JavaScript source file if
|
|
14
|
-
* available, instead of the .d.ts typings file that would have been resolved by TypeScript. This
|
|
15
|
-
* is necessary for packages that have their typings in the same directory as the sources, which
|
|
16
|
-
* would otherwise let TypeScript prefer the .d.ts file instead of the JavaScript source file.
|
|
17
|
-
*/
|
|
18
|
-
export class NgccSourcesCompilerHost extends NgtscCompilerHost {
|
|
19
|
-
constructor(fs, options, cache, moduleResolutionCache, packagePath) {
|
|
20
|
-
super(fs, options);
|
|
21
|
-
this.cache = cache;
|
|
22
|
-
this.moduleResolutionCache = moduleResolutionCache;
|
|
23
|
-
this.packagePath = packagePath;
|
|
24
|
-
}
|
|
25
|
-
getSourceFile(fileName, languageVersion) {
|
|
26
|
-
return this.cache.getCachedSourceFile(fileName, languageVersion);
|
|
27
|
-
}
|
|
28
|
-
resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference) {
|
|
29
|
-
return moduleNames.map(moduleName => {
|
|
30
|
-
const { resolvedModule } = ts.resolveModuleName(moduleName, containingFile, this.options, this, this.moduleResolutionCache, redirectedReference);
|
|
31
|
-
// If the module request originated from a relative import in a JavaScript source file,
|
|
32
|
-
// TypeScript may have resolved the module to its .d.ts declaration file if the .js source
|
|
33
|
-
// file was in the same directory. This is undesirable, as we need to have the actual
|
|
34
|
-
// JavaScript being present in the program. This logic recognizes this scenario and rewrites
|
|
35
|
-
// the resolved .d.ts declaration file to its .js counterpart, if it exists.
|
|
36
|
-
if ((resolvedModule === null || resolvedModule === void 0 ? void 0 : resolvedModule.extension) === ts.Extension.Dts && containingFile.endsWith('.js') &&
|
|
37
|
-
isRelativePath(moduleName)) {
|
|
38
|
-
const jsFile = resolvedModule.resolvedFileName.replace(/\.d\.ts$/, '.js');
|
|
39
|
-
if (this.fileExists(jsFile)) {
|
|
40
|
-
return Object.assign(Object.assign({}, resolvedModule), { resolvedFileName: jsFile, extension: ts.Extension.Js });
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
// Prevent loading JavaScript source files outside of the package root, which would happen for
|
|
44
|
-
// packages that don't have .d.ts files. As ngcc should only operate on the .js files
|
|
45
|
-
// contained within the package, any files outside the package are simply discarded. This does
|
|
46
|
-
// result in a partial program with error diagnostics, however ngcc won't gather diagnostics
|
|
47
|
-
// for the program it creates so these diagnostics won't be reported.
|
|
48
|
-
if ((resolvedModule === null || resolvedModule === void 0 ? void 0 : resolvedModule.extension) === ts.Extension.Js &&
|
|
49
|
-
!isWithinPackage(this.packagePath, this.fs.resolve(resolvedModule.resolvedFileName))) {
|
|
50
|
-
return undefined;
|
|
51
|
-
}
|
|
52
|
-
return resolvedModule;
|
|
53
|
-
});
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* A compiler host implementation that is used for the typings program. It leverages the entry-point
|
|
58
|
-
* cache for source files and module resolution, as these results can be reused across the sources
|
|
59
|
-
* program.
|
|
60
|
-
*/
|
|
61
|
-
export class NgccDtsCompilerHost extends NgtscCompilerHost {
|
|
62
|
-
constructor(fs, options, cache, moduleResolutionCache) {
|
|
63
|
-
super(fs, options);
|
|
64
|
-
this.cache = cache;
|
|
65
|
-
this.moduleResolutionCache = moduleResolutionCache;
|
|
66
|
-
}
|
|
67
|
-
getSourceFile(fileName, languageVersion) {
|
|
68
|
-
return this.cache.getCachedSourceFile(fileName, languageVersion);
|
|
69
|
-
}
|
|
70
|
-
resolveModuleNames(moduleNames, containingFile, reusedNames, redirectedReference) {
|
|
71
|
-
return moduleNames.map(moduleName => {
|
|
72
|
-
const { resolvedModule } = ts.resolveModuleName(moduleName, containingFile, this.options, this, this.moduleResolutionCache, redirectedReference);
|
|
73
|
-
return resolvedModule;
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmdjY19jb21waWxlcl9ob3N0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXItY2xpL25nY2Mvc3JjL3BhY2thZ2VzL25nY2NfY29tcGlsZXJfaG9zdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxPQUFPLEtBQUssRUFBRSxNQUFNLFlBQVksQ0FBQztBQUVqQyxPQUFPLEVBQTZCLGlCQUFpQixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDN0YsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFHeEM7Ozs7O0dBS0c7QUFDSCxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsaUJBQWlCO0lBQzVELFlBQ0ksRUFBYyxFQUFFLE9BQTJCLEVBQVUsS0FBMEIsRUFDdkUscUJBQStDLEVBQzdDLFdBQTJCO1FBQ3ZDLEtBQUssQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFIb0MsVUFBSyxHQUFMLEtBQUssQ0FBcUI7UUFDdkUsMEJBQXFCLEdBQXJCLHFCQUFxQixDQUEwQjtRQUM3QyxnQkFBVyxHQUFYLFdBQVcsQ0FBZ0I7SUFFekMsQ0FBQztJQUVELGFBQWEsQ0FBQyxRQUFnQixFQUFFLGVBQWdDO1FBQzlELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbkUsQ0FBQztJQUVELGtCQUFrQixDQUNkLFdBQXFCLEVBQUUsY0FBc0IsRUFBRSxXQUFzQixFQUNyRSxtQkFBaUQ7UUFDbkQsT0FBTyxXQUFXLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2xDLE1BQU0sRUFBQyxjQUFjLEVBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLENBQ3pDLFVBQVUsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLHFCQUFxQixFQUMxRSxtQkFBbUIsQ0FBQyxDQUFDO1lBRXpCLHVGQUF1RjtZQUN2RiwwRkFBMEY7WUFDMUYscUZBQXFGO1lBQ3JGLDRGQUE0RjtZQUM1Riw0RUFBNEU7WUFDNUUsSUFBSSxDQUFBLGNBQWMsYUFBZCxjQUFjLHVCQUFkLGNBQWMsQ0FBRSxTQUFTLE1BQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksY0FBYyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUM7Z0JBQ2hGLGNBQWMsQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQzFFLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRTtvQkFDM0IsdUNBQVcsY0FBYyxLQUFFLGdCQUFnQixFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUU7aUJBQ2xGO2FBQ0Y7WUFFRCw4RkFBOEY7WUFDOUYscUZBQXFGO1lBQ3JGLDhGQUE4RjtZQUM5Riw0RkFBNEY7WUFDNUYscUVBQXFFO1lBQ3JFLElBQUksQ0FBQSxjQUFjLGFBQWQsY0FBYyx1QkFBZCxjQUFjLENBQUUsU0FBUyxNQUFLLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDN0MsQ0FBQyxlQUFlLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFO2dCQUN4RixPQUFPLFNBQVMsQ0FBQzthQUNsQjtZQUVELE9BQU8sY0FBYyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxpQkFBaUI7SUFDeEQsWUFDSSxFQUFjLEVBQUUsT0FBMkIsRUFBVSxLQUEwQixFQUN2RSxxQkFBK0M7UUFDekQsS0FBSyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUZvQyxVQUFLLEdBQUwsS0FBSyxDQUFxQjtRQUN2RSwwQkFBcUIsR0FBckIscUJBQXFCLENBQTBCO0lBRTNELENBQUM7SUFFRCxhQUFhLENBQUMsUUFBZ0IsRUFBRSxlQUFnQztRQUM5RCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ25FLENBQUM7SUFFRCxrQkFBa0IsQ0FDZCxXQUFxQixFQUFFLGNBQXNCLEVBQUUsV0FBc0IsRUFDckUsbUJBQWlEO1FBQ25ELE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNsQyxNQUFNLEVBQUMsY0FBYyxFQUFDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixDQUN6QyxVQUFVLEVBQUUsY0FBYyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxxQkFBcUIsRUFDMUUsbUJBQW1CLENBQUMsQ0FBQztZQUN6QixPQUFPLGNBQWMsQ0FBQztRQUN4QixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuaW1wb3J0ICogYXMgdHMgZnJvbSAndHlwZXNjcmlwdCc7XG5cbmltcG9ydCB7QWJzb2x1dGVGc1BhdGgsIEZpbGVTeXN0ZW0sIE5ndHNjQ29tcGlsZXJIb3N0fSBmcm9tICcuLi8uLi8uLi9zcmMvbmd0c2MvZmlsZV9zeXN0ZW0nO1xuaW1wb3J0IHtpc1dpdGhpblBhY2thZ2V9IGZyb20gJy4uL2FuYWx5c2lzL3V0aWwnO1xuaW1wb3J0IHtpc1JlbGF0aXZlUGF0aH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHtFbnRyeVBvaW50RmlsZUNhY2hlfSBmcm9tICcuL3NvdXJjZV9maWxlX2NhY2hlJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29tcGlsZXIgaG9zdCB0aGF0IHJlc29sdmVzIGEgbW9kdWxlIGltcG9ydCBhcyBhIEphdmFTY3JpcHQgc291cmNlIGZpbGUgaWZcbiAqIGF2YWlsYWJsZSwgaW5zdGVhZCBvZiB0aGUgLmQudHMgdHlwaW5ncyBmaWxlIHRoYXQgd291bGQgaGF2ZSBiZWVuIHJlc29sdmVkIGJ5IFR5cGVTY3JpcHQuIFRoaXNcbiAqIGlzIG5lY2Vzc2FyeSBmb3IgcGFja2FnZXMgdGhhdCBoYXZlIHRoZWlyIHR5cGluZ3MgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoZSBzb3VyY2VzLCB3aGljaFxuICogd291bGQgb3RoZXJ3aXNlIGxldCBUeXBlU2NyaXB0IHByZWZlciB0aGUgLmQudHMgZmlsZSBpbnN0ZWFkIG9mIHRoZSBKYXZhU2NyaXB0IHNvdXJjZSBmaWxlLlxuICovXG5leHBvcnQgY2xhc3MgTmdjY1NvdXJjZXNDb21waWxlckhvc3QgZXh0ZW5kcyBOZ3RzY0NvbXBpbGVySG9zdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgICAgZnM6IEZpbGVTeXN0ZW0sIG9wdGlvbnM6IHRzLkNvbXBpbGVyT3B0aW9ucywgcHJpdmF0ZSBjYWNoZTogRW50cnlQb2ludEZpbGVDYWNoZSxcbiAgICAgIHByaXZhdGUgbW9kdWxlUmVzb2x1dGlvbkNhY2hlOiB0cy5Nb2R1bGVSZXNvbHV0aW9uQ2FjaGUsXG4gICAgICBwcm90ZWN0ZWQgcGFja2FnZVBhdGg6IEFic29sdXRlRnNQYXRoKSB7XG4gICAgc3VwZXIoZnMsIG9wdGlvbnMpO1xuICB9XG5cbiAgZ2V0U291cmNlRmlsZShmaWxlTmFtZTogc3RyaW5nLCBsYW5ndWFnZVZlcnNpb246IHRzLlNjcmlwdFRhcmdldCk6IHRzLlNvdXJjZUZpbGV8dW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXRDYWNoZWRTb3VyY2VGaWxlKGZpbGVOYW1lLCBsYW5ndWFnZVZlcnNpb24pO1xuICB9XG5cbiAgcmVzb2x2ZU1vZHVsZU5hbWVzKFxuICAgICAgbW9kdWxlTmFtZXM6IHN0cmluZ1tdLCBjb250YWluaW5nRmlsZTogc3RyaW5nLCByZXVzZWROYW1lcz86IHN0cmluZ1tdLFxuICAgICAgcmVkaXJlY3RlZFJlZmVyZW5jZT86IHRzLlJlc29sdmVkUHJvamVjdFJlZmVyZW5jZSk6IEFycmF5PHRzLlJlc29sdmVkTW9kdWxlfHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiBtb2R1bGVOYW1lcy5tYXAobW9kdWxlTmFtZSA9PiB7XG4gICAgICBjb25zdCB7cmVzb2x2ZWRNb2R1bGV9ID0gdHMucmVzb2x2ZU1vZHVsZU5hbWUoXG4gICAgICAgICAgbW9kdWxlTmFtZSwgY29udGFpbmluZ0ZpbGUsIHRoaXMub3B0aW9ucywgdGhpcywgdGhpcy5tb2R1bGVSZXNvbHV0aW9uQ2FjaGUsXG4gICAgICAgICAgcmVkaXJlY3RlZFJlZmVyZW5jZSk7XG5cbiAgICAgIC8vIElmIHRoZSBtb2R1bGUgcmVxdWVzdCBvcmlnaW5hdGVkIGZyb20gYSByZWxhdGl2ZSBpbXBvcnQgaW4gYSBKYXZhU2NyaXB0IHNvdXJjZSBmaWxlLFxuICAgICAgLy8gVHlwZVNjcmlwdCBtYXkgaGF2ZSByZXNvbHZlZCB0aGUgbW9kdWxlIHRvIGl0cyAuZC50cyBkZWNsYXJhdGlvbiBmaWxlIGlmIHRoZSAuanMgc291cmNlXG4gICAgICAvLyBmaWxlIHdhcyBpbiB0aGUgc2FtZSBkaXJlY3RvcnkuIFRoaXMgaXMgdW5kZXNpcmFibGUsIGFzIHdlIG5lZWQgdG8gaGF2ZSB0aGUgYWN0dWFsXG4gICAgICAvLyBKYXZhU2NyaXB0IGJlaW5nIHByZXNlbnQgaW4gdGhlIHByb2dyYW0uIFRoaXMgbG9naWMgcmVjb2duaXplcyB0aGlzIHNjZW5hcmlvIGFuZCByZXdyaXRlc1xuICAgICAgLy8gdGhlIHJlc29sdmVkIC5kLnRzIGRlY2xhcmF0aW9uIGZpbGUgdG8gaXRzIC5qcyBjb3VudGVycGFydCwgaWYgaXQgZXhpc3RzLlxuICAgICAgaWYgKHJlc29sdmVkTW9kdWxlPy5leHRlbnNpb24gPT09IHRzLkV4dGVuc2lvbi5EdHMgJiYgY29udGFpbmluZ0ZpbGUuZW5kc1dpdGgoJy5qcycpICYmXG4gICAgICAgICAgaXNSZWxhdGl2ZVBhdGgobW9kdWxlTmFtZSkpIHtcbiAgICAgICAgY29uc3QganNGaWxlID0gcmVzb2x2ZWRNb2R1bGUucmVzb2x2ZWRGaWxlTmFtZS5yZXBsYWNlKC9cXC5kXFwudHMkLywgJy5qcycpO1xuICAgICAgICBpZiAodGhpcy5maWxlRXhpc3RzKGpzRmlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gey4uLnJlc29sdmVkTW9kdWxlLCByZXNvbHZlZEZpbGVOYW1lOiBqc0ZpbGUsIGV4dGVuc2lvbjogdHMuRXh0ZW5zaW9uLkpzfTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBQcmV2ZW50IGxvYWRpbmcgSmF2YVNjcmlwdCBzb3VyY2UgZmlsZXMgb3V0c2lkZSBvZiB0aGUgcGFja2FnZSByb290LCB3aGljaCB3b3VsZCBoYXBwZW4gZm9yXG4gICAgICAvLyBwYWNrYWdlcyB0aGF0IGRvbid0IGhhdmUgLmQudHMgZmlsZXMuIEFzIG5nY2Mgc2hvdWxkIG9ubHkgb3BlcmF0ZSBvbiB0aGUgLmpzIGZpbGVzXG4gICAgICAvLyBjb250YWluZWQgd2l0aGluIHRoZSBwYWNrYWdlLCBhbnkgZmlsZXMgb3V0c2lkZSB0aGUgcGFja2FnZSBhcmUgc2ltcGx5IGRpc2NhcmRlZC4gVGhpcyBkb2VzXG4gICAgICAvLyByZXN1bHQgaW4gYSBwYXJ0aWFsIHByb2dyYW0gd2l0aCBlcnJvciBkaWFnbm9zdGljcywgaG93ZXZlciBuZ2NjIHdvbid0IGdhdGhlciBkaWFnbm9zdGljc1xuICAgICAgLy8gZm9yIHRoZSBwcm9ncmFtIGl0IGNyZWF0ZXMgc28gdGhlc2UgZGlhZ25vc3RpY3Mgd29uJ3QgYmUgcmVwb3J0ZWQuXG4gICAgICBpZiAocmVzb2x2ZWRNb2R1bGU/LmV4dGVuc2lvbiA9PT0gdHMuRXh0ZW5zaW9uLkpzICYmXG4gICAgICAgICAgIWlzV2l0aGluUGFja2FnZSh0aGlzLnBhY2thZ2VQYXRoLCB0aGlzLmZzLnJlc29sdmUocmVzb2x2ZWRNb2R1bGUucmVzb2x2ZWRGaWxlTmFtZSkpKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiByZXNvbHZlZE1vZHVsZTtcbiAgICB9KTtcbiAgfVxufVxuXG4vKipcbiAqIEEgY29tcGlsZXIgaG9zdCBpbXBsZW1lbnRhdGlvbiB0aGF0IGlzIHVzZWQgZm9yIHRoZSB0eXBpbmdzIHByb2dyYW0uIEl0IGxldmVyYWdlcyB0aGUgZW50cnktcG9pbnRcbiAqIGNhY2hlIGZvciBzb3VyY2UgZmlsZXMgYW5kIG1vZHVsZSByZXNvbHV0aW9uLCBhcyB0aGVzZSByZXN1bHRzIGNhbiBiZSByZXVzZWQgYWNyb3NzIHRoZSBzb3VyY2VzXG4gKiBwcm9ncmFtLlxuICovXG5leHBvcnQgY2xhc3MgTmdjY0R0c0NvbXBpbGVySG9zdCBleHRlbmRzIE5ndHNjQ29tcGlsZXJIb3N0IHtcbiAgY29uc3RydWN0b3IoXG4gICAgICBmczogRmlsZVN5c3RlbSwgb3B0aW9uczogdHMuQ29tcGlsZXJPcHRpb25zLCBwcml2YXRlIGNhY2hlOiBFbnRyeVBvaW50RmlsZUNhY2hlLFxuICAgICAgcHJpdmF0ZSBtb2R1bGVSZXNvbHV0aW9uQ2FjaGU6IHRzLk1vZHVsZVJlc29sdXRpb25DYWNoZSkge1xuICAgIHN1cGVyKGZzLCBvcHRpb25zKTtcbiAgfVxuXG4gIGdldFNvdXJjZUZpbGUoZmlsZU5hbWU6IHN0cmluZywgbGFuZ3VhZ2VWZXJzaW9uOiB0cy5TY3JpcHRUYXJnZXQpOiB0cy5Tb3VyY2VGaWxlfHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuY2FjaGUuZ2V0Q2FjaGVkU291cmNlRmlsZShmaWxlTmFtZSwgbGFuZ3VhZ2VWZXJzaW9uKTtcbiAgfVxuXG4gIHJlc29sdmVNb2R1bGVOYW1lcyhcbiAgICAgIG1vZHVsZU5hbWVzOiBzdHJpbmdbXSwgY29udGFpbmluZ0ZpbGU6IHN0cmluZywgcmV1c2VkTmFtZXM/OiBzdHJpbmdbXSxcbiAgICAgIHJlZGlyZWN0ZWRSZWZlcmVuY2U/OiB0cy5SZXNvbHZlZFByb2plY3RSZWZlcmVuY2UpOiBBcnJheTx0cy5SZXNvbHZlZE1vZHVsZXx1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gbW9kdWxlTmFtZXMubWFwKG1vZHVsZU5hbWUgPT4ge1xuICAgICAgY29uc3Qge3Jlc29sdmVkTW9kdWxlfSA9IHRzLnJlc29sdmVNb2R1bGVOYW1lKFxuICAgICAgICAgIG1vZHVsZU5hbWUsIGNvbnRhaW5pbmdGaWxlLCB0aGlzLm9wdGlvbnMsIHRoaXMsIHRoaXMubW9kdWxlUmVzb2x1dGlvbkNhY2hlLFxuICAgICAgICAgIHJlZGlyZWN0ZWRSZWZlcmVuY2UpO1xuICAgICAgcmV0dXJuIHJlc29sdmVkTW9kdWxlO1xuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,166 +0,0 @@
|
|
|
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 * as ts from 'typescript';
|
|
9
|
-
import { hasNameIdentifier } from '../utils';
|
|
10
|
-
/**
|
|
11
|
-
* Consider the following ES5 code that may have been generated for a class:
|
|
12
|
-
*
|
|
13
|
-
* ```
|
|
14
|
-
* var A = (function(){
|
|
15
|
-
* function A() {}
|
|
16
|
-
* return A;
|
|
17
|
-
* }());
|
|
18
|
-
* A.staticProp = true;
|
|
19
|
-
* ```
|
|
20
|
-
*
|
|
21
|
-
* Here, TypeScript marks the symbol for "A" as a so-called "expando symbol", which causes
|
|
22
|
-
* "staticProp" to be added as an export of the "A" symbol.
|
|
23
|
-
*
|
|
24
|
-
* In the example above, symbol "A" has been assigned some flags to indicate that it represents a
|
|
25
|
-
* class. Due to this flag, the symbol is considered an expando symbol and as such, "staticProp" is
|
|
26
|
-
* stored in `ts.Symbol.exports`.
|
|
27
|
-
*
|
|
28
|
-
* A problem arises when "A" is not at the top-level, i.e. in UMD bundles. In that case, the symbol
|
|
29
|
-
* does not have the flag that marks the symbol as a class. Therefore, TypeScript inspects "A"'s
|
|
30
|
-
* initializer expression, which is an IIFE in the above example. Unfortunately however, only IIFEs
|
|
31
|
-
* of the form `(function(){})()` qualify as initializer for an "expando symbol"; the slightly
|
|
32
|
-
* different form seen in the example above, `(function(){}())`, does not. This prevents the "A"
|
|
33
|
-
* symbol from being considered an expando symbol, in turn preventing "staticProp" from being stored
|
|
34
|
-
* in `ts.Symbol.exports`.
|
|
35
|
-
*
|
|
36
|
-
* The logic for identifying symbols as "expando symbols" can be found here:
|
|
37
|
-
* https://github.com/microsoft/TypeScript/blob/v3.4.5/src/compiler/binder.ts#L2656-L2685
|
|
38
|
-
*
|
|
39
|
-
* Notice how the `getExpandoInitializer` function is available on the "ts" namespace in the
|
|
40
|
-
* compiled bundle, so we are able to override this function to accommodate for the alternative
|
|
41
|
-
* IIFE notation. The original implementation can be found at:
|
|
42
|
-
* https://github.com/Microsoft/TypeScript/blob/v3.4.5/src/compiler/utilities.ts#L1864-L1887
|
|
43
|
-
*
|
|
44
|
-
* Issue tracked in https://github.com/microsoft/TypeScript/issues/31778
|
|
45
|
-
*
|
|
46
|
-
* @returns the function to pass to `restoreGetExpandoInitializer` to undo the patch, or null if
|
|
47
|
-
* the issue is known to have been fixed.
|
|
48
|
-
*/
|
|
49
|
-
export function patchTsGetExpandoInitializer() {
|
|
50
|
-
if (isTs31778GetExpandoInitializerFixed()) {
|
|
51
|
-
return null;
|
|
52
|
-
}
|
|
53
|
-
const originalGetExpandoInitializer = ts.getExpandoInitializer;
|
|
54
|
-
if (originalGetExpandoInitializer === undefined) {
|
|
55
|
-
throw makeUnsupportedTypeScriptError();
|
|
56
|
-
}
|
|
57
|
-
// Override the function to add support for recognizing the IIFE structure used in ES5 bundles.
|
|
58
|
-
ts.getExpandoInitializer = (initializer, isPrototypeAssignment) => {
|
|
59
|
-
// If the initializer is a call expression within parenthesis, unwrap the parenthesis
|
|
60
|
-
// upfront such that unsupported IIFE syntax `(function(){}())` becomes `function(){}()`,
|
|
61
|
-
// which is supported.
|
|
62
|
-
if (ts.isParenthesizedExpression(initializer) && ts.isCallExpression(initializer.expression)) {
|
|
63
|
-
initializer = initializer.expression;
|
|
64
|
-
}
|
|
65
|
-
return originalGetExpandoInitializer(initializer, isPrototypeAssignment);
|
|
66
|
-
};
|
|
67
|
-
return originalGetExpandoInitializer;
|
|
68
|
-
}
|
|
69
|
-
export function restoreGetExpandoInitializer(originalGetExpandoInitializer) {
|
|
70
|
-
if (originalGetExpandoInitializer !== null) {
|
|
71
|
-
ts.getExpandoInitializer = originalGetExpandoInitializer;
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
let ts31778FixedResult = null;
|
|
75
|
-
function isTs31778GetExpandoInitializerFixed() {
|
|
76
|
-
// If the result has already been computed, return early.
|
|
77
|
-
if (ts31778FixedResult !== null) {
|
|
78
|
-
return ts31778FixedResult;
|
|
79
|
-
}
|
|
80
|
-
// Determine if the issue has been fixed by checking if an expando property is present in a
|
|
81
|
-
// minimum reproduction using unpatched TypeScript.
|
|
82
|
-
ts31778FixedResult = checkIfExpandoPropertyIsPresent();
|
|
83
|
-
// If the issue does not appear to have been fixed, verify that applying the patch has the desired
|
|
84
|
-
// effect.
|
|
85
|
-
if (!ts31778FixedResult) {
|
|
86
|
-
const originalGetExpandoInitializer = patchTsGetExpandoInitializer();
|
|
87
|
-
try {
|
|
88
|
-
const patchIsSuccessful = checkIfExpandoPropertyIsPresent();
|
|
89
|
-
if (!patchIsSuccessful) {
|
|
90
|
-
throw makeUnsupportedTypeScriptError();
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
finally {
|
|
94
|
-
restoreGetExpandoInitializer(originalGetExpandoInitializer);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
return ts31778FixedResult;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Verifies whether TS issue 31778 has been fixed by inspecting a symbol from a minimum
|
|
101
|
-
* reproduction. If the symbol does in fact have the "expando" as export, the issue has been fixed.
|
|
102
|
-
*
|
|
103
|
-
* See https://github.com/microsoft/TypeScript/issues/31778 for details.
|
|
104
|
-
*/
|
|
105
|
-
function checkIfExpandoPropertyIsPresent() {
|
|
106
|
-
const sourceText = `
|
|
107
|
-
(function() {
|
|
108
|
-
var A = (function() {
|
|
109
|
-
function A() {}
|
|
110
|
-
return A;
|
|
111
|
-
}());
|
|
112
|
-
A.expando = true;
|
|
113
|
-
}());`;
|
|
114
|
-
const sourceFile = ts.createSourceFile('test.js', sourceText, ts.ScriptTarget.ES5, true, ts.ScriptKind.JS);
|
|
115
|
-
const host = {
|
|
116
|
-
getSourceFile() {
|
|
117
|
-
return sourceFile;
|
|
118
|
-
},
|
|
119
|
-
fileExists() {
|
|
120
|
-
return true;
|
|
121
|
-
},
|
|
122
|
-
readFile() {
|
|
123
|
-
return '';
|
|
124
|
-
},
|
|
125
|
-
writeFile() { },
|
|
126
|
-
getDefaultLibFileName() {
|
|
127
|
-
return '';
|
|
128
|
-
},
|
|
129
|
-
getCurrentDirectory() {
|
|
130
|
-
return '';
|
|
131
|
-
},
|
|
132
|
-
getDirectories() {
|
|
133
|
-
return [];
|
|
134
|
-
},
|
|
135
|
-
getCanonicalFileName(fileName) {
|
|
136
|
-
return fileName;
|
|
137
|
-
},
|
|
138
|
-
useCaseSensitiveFileNames() {
|
|
139
|
-
return true;
|
|
140
|
-
},
|
|
141
|
-
getNewLine() {
|
|
142
|
-
return '\n';
|
|
143
|
-
},
|
|
144
|
-
};
|
|
145
|
-
const options = { noResolve: true, noLib: true, noEmit: true, allowJs: true };
|
|
146
|
-
const program = ts.createProgram(['test.js'], options, host);
|
|
147
|
-
function visitor(node) {
|
|
148
|
-
if (ts.isVariableDeclaration(node) && hasNameIdentifier(node) && node.name.text === 'A') {
|
|
149
|
-
return node;
|
|
150
|
-
}
|
|
151
|
-
return ts.forEachChild(node, visitor);
|
|
152
|
-
}
|
|
153
|
-
const declaration = ts.forEachChild(sourceFile, visitor);
|
|
154
|
-
if (declaration === undefined) {
|
|
155
|
-
throw new Error('Unable to find declaration of outer A');
|
|
156
|
-
}
|
|
157
|
-
const symbol = program.getTypeChecker().getSymbolAtLocation(declaration.name);
|
|
158
|
-
if (symbol === undefined) {
|
|
159
|
-
throw new Error('Unable to resolve symbol of outer A');
|
|
160
|
-
}
|
|
161
|
-
return symbol.exports !== undefined && symbol.exports.has('expando');
|
|
162
|
-
}
|
|
163
|
-
function makeUnsupportedTypeScriptError() {
|
|
164
|
-
return new Error('The TypeScript version used is not supported by ngcc.');
|
|
165
|
-
}
|
|
166
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGF0Y2hfdHNfZXhwYW5kb19pbml0aWFsaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvbXBpbGVyLWNsaS9uZ2NjL3NyYy9wYWNrYWdlcy9wYXRjaF90c19leHBhbmRvX2luaXRpYWxpemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUNILE9BQU8sS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUUzQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUFDSCxNQUFNLFVBQVUsNEJBQTRCO0lBQzFDLElBQUksbUNBQW1DLEVBQUUsRUFBRTtRQUN6QyxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSw2QkFBNkIsR0FBSSxFQUFVLENBQUMscUJBQXFCLENBQUM7SUFDeEUsSUFBSSw2QkFBNkIsS0FBSyxTQUFTLEVBQUU7UUFDL0MsTUFBTSw4QkFBOEIsRUFBRSxDQUFDO0tBQ3hDO0lBRUQsK0ZBQStGO0lBQzlGLEVBQVUsQ0FBQyxxQkFBcUIsR0FBRyxDQUFDLFdBQW9CLEVBQ3BCLHFCQUE4QixFQUEyQixFQUFFO1FBQzlGLHFGQUFxRjtRQUNyRix5RkFBeUY7UUFDekYsc0JBQXNCO1FBQ3RCLElBQUksRUFBRSxDQUFDLHlCQUF5QixDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDNUYsV0FBVyxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7U0FDdEM7UUFDRCxPQUFPLDZCQUE2QixDQUFDLFdBQVcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQzNFLENBQUMsQ0FBQztJQUNGLE9BQU8sNkJBQTZCLENBQUM7QUFDdkMsQ0FBQztBQUVELE1BQU0sVUFBVSw0QkFBNEIsQ0FBQyw2QkFBc0M7SUFDakYsSUFBSSw2QkFBNkIsS0FBSyxJQUFJLEVBQUU7UUFDekMsRUFBVSxDQUFDLHFCQUFxQixHQUFHLDZCQUE2QixDQUFDO0tBQ25FO0FBQ0gsQ0FBQztBQUVELElBQUksa0JBQWtCLEdBQWlCLElBQUksQ0FBQztBQUU1QyxTQUFTLG1DQUFtQztJQUMxQyx5REFBeUQ7SUFDekQsSUFBSSxrQkFBa0IsS0FBSyxJQUFJLEVBQUU7UUFDL0IsT0FBTyxrQkFBa0IsQ0FBQztLQUMzQjtJQUVELDJGQUEyRjtJQUMzRixtREFBbUQ7SUFDbkQsa0JBQWtCLEdBQUcsK0JBQStCLEVBQUUsQ0FBQztJQUV2RCxrR0FBa0c7SUFDbEcsVUFBVTtJQUNWLElBQUksQ0FBQyxrQkFBa0IsRUFBRTtRQUN2QixNQUFNLDZCQUE2QixHQUFHLDRCQUE0QixFQUFFLENBQUM7UUFDckUsSUFBSTtZQUNGLE1BQU0saUJBQWlCLEdBQUcsK0JBQStCLEVBQUUsQ0FBQztZQUM1RCxJQUFJLENBQUMsaUJBQWlCLEVBQUU7Z0JBQ3RCLE1BQU0sOEJBQThCLEVBQUUsQ0FBQzthQUN4QztTQUNGO2dCQUFTO1lBQ1IsNEJBQTRCLENBQUMsNkJBQTZCLENBQUMsQ0FBQztTQUM3RDtLQUNGO0lBRUQsT0FBTyxrQkFBa0IsQ0FBQztBQUM1QixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLCtCQUErQjtJQUN0QyxNQUFNLFVBQVUsR0FBRzs7Ozs7OztVQU9YLENBQUM7SUFDVCxNQUFNLFVBQVUsR0FDWixFQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxFQUFFLENBQUMsWUFBWSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1RixNQUFNLElBQUksR0FBb0I7UUFDNUIsYUFBYTtZQUVQLE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUM7UUFDTCxVQUFVO1lBQ1IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQ0QsUUFBUTtZQUVGLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNMLFNBQVMsS0FBSSxDQUFDO1FBQ2QscUJBQXFCO1lBQ25CLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztRQUNELG1CQUFtQjtZQUNqQixPQUFPLEVBQUUsQ0FBQztRQUNaLENBQUM7UUFDRCxjQUFjO1lBQ1osT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO1FBQ0Qsb0JBQW9CLENBQUMsUUFBZ0I7WUFDbkMsT0FBTyxRQUFRLENBQUM7UUFDbEIsQ0FBQztRQUNELHlCQUF5QjtZQUN2QixPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxVQUFVO1lBQ1IsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO0tBQ0YsQ0FBQztJQUNGLE1BQU0sT0FBTyxHQUFHLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQzVFLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFN0QsU0FBUyxPQUFPLENBQUMsSUFBYTtRQUM1QixJQUFJLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxHQUFHLEVBQUU7WUFDdkYsT0FBTyxJQUFJLENBQUM7U0FDYjtRQUNELE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3pELElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRTtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7S0FDMUQ7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxFQUFFLENBQUMsbUJBQW1CLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlFLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxDQUFDLENBQUM7S0FDeEQ7SUFDRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEtBQUssU0FBUyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQXdCLENBQUMsQ0FBQztBQUN0RixDQUFDO0FBRUQsU0FBUyw4QkFBOEI7SUFDckMsT0FBTyxJQUFJLEtBQUssQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0FBQzVFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cbmltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHtoYXNOYW1lSWRlbnRpZmllcn0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vKipcbiAqIENvbnNpZGVyIHRoZSBmb2xsb3dpbmcgRVM1IGNvZGUgdGhhdCBtYXkgaGF2ZSBiZWVuIGdlbmVyYXRlZCBmb3IgYSBjbGFzczpcbiAqXG4gKiBgYGBcbiAqIHZhciBBID0gKGZ1bmN0aW9uKCl7XG4gKiAgIGZ1bmN0aW9uIEEoKSB7fVxuICogICByZXR1cm4gQTtcbiAqIH0oKSk7XG4gKiBBLnN0YXRpY1Byb3AgPSB0cnVlO1xuICogYGBgXG4gKlxuICogSGVyZSwgVHlwZVNjcmlwdCBtYXJrcyB0aGUgc3ltYm9sIGZvciBcIkFcIiBhcyBhIHNvLWNhbGxlZCBcImV4cGFuZG8gc3ltYm9sXCIsIHdoaWNoIGNhdXNlc1xuICogXCJzdGF0aWNQcm9wXCIgdG8gYmUgYWRkZWQgYXMgYW4gZXhwb3J0IG9mIHRoZSBcIkFcIiBzeW1ib2wuXG4gKlxuICogSW4gdGhlIGV4YW1wbGUgYWJvdmUsIHN5bWJvbCBcIkFcIiBoYXMgYmVlbiBhc3NpZ25lZCBzb21lIGZsYWdzIHRvIGluZGljYXRlIHRoYXQgaXQgcmVwcmVzZW50cyBhXG4gKiBjbGFzcy4gRHVlIHRvIHRoaXMgZmxhZywgdGhlIHN5bWJvbCBpcyBjb25zaWRlcmVkIGFuIGV4cGFuZG8gc3ltYm9sIGFuZCBhcyBzdWNoLCBcInN0YXRpY1Byb3BcIiBpc1xuICogc3RvcmVkIGluIGB0cy5TeW1ib2wuZXhwb3J0c2AuXG4gKlxuICogQSBwcm9ibGVtIGFyaXNlcyB3aGVuIFwiQVwiIGlzIG5vdCBhdCB0aGUgdG9wLWxldmVsLCBpLmUuIGluIFVNRCBidW5kbGVzLiBJbiB0aGF0IGNhc2UsIHRoZSBzeW1ib2xcbiAqIGRvZXMgbm90IGhhdmUgdGhlIGZsYWcgdGhhdCBtYXJrcyB0aGUgc3ltYm9sIGFzIGEgY2xhc3MuIFRoZXJlZm9yZSwgVHlwZVNjcmlwdCBpbnNwZWN0cyBcIkFcIidzXG4gKiBpbml0aWFsaXplciBleHByZXNzaW9uLCB3aGljaCBpcyBhbiBJSUZFIGluIHRoZSBhYm92ZSBleGFtcGxlLiBVbmZvcnR1bmF0ZWx5IGhvd2V2ZXIsIG9ubHkgSUlGRXNcbiAqIG9mIHRoZSBmb3JtIGAoZnVuY3Rpb24oKXt9KSgpYCBxdWFsaWZ5IGFzIGluaXRpYWxpemVyIGZvciBhbiBcImV4cGFuZG8gc3ltYm9sXCI7IHRoZSBzbGlnaHRseVxuICogZGlmZmVyZW50IGZvcm0gc2VlbiBpbiB0aGUgZXhhbXBsZSBhYm92ZSwgYChmdW5jdGlvbigpe30oKSlgLCBkb2VzIG5vdC4gVGhpcyBwcmV2ZW50cyB0aGUgXCJBXCJcbiAqIHN5bWJvbCBmcm9tIGJlaW5nIGNvbnNpZGVyZWQgYW4gZXhwYW5kbyBzeW1ib2wsIGluIHR1cm4gcHJldmVudGluZyBcInN0YXRpY1Byb3BcIiBmcm9tIGJlaW5nIHN0b3JlZFxuICogaW4gYHRzLlN5bWJvbC5leHBvcnRzYC5cbiAqXG4gKiBUaGUgbG9naWMgZm9yIGlkZW50aWZ5aW5nIHN5bWJvbHMgYXMgXCJleHBhbmRvIHN5bWJvbHNcIiBjYW4gYmUgZm91bmQgaGVyZTpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9ibG9iL3YzLjQuNS9zcmMvY29tcGlsZXIvYmluZGVyLnRzI0wyNjU2LUwyNjg1XG4gKlxuICogTm90aWNlIGhvdyB0aGUgYGdldEV4cGFuZG9Jbml0aWFsaXplcmAgZnVuY3Rpb24gaXMgYXZhaWxhYmxlIG9uIHRoZSBcInRzXCIgbmFtZXNwYWNlIGluIHRoZVxuICogY29tcGlsZWQgYnVuZGxlLCBzbyB3ZSBhcmUgYWJsZSB0byBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGFjY29tbW9kYXRlIGZvciB0aGUgYWx0ZXJuYXRpdmVcbiAqIElJRkUgbm90YXRpb24uIFRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgYXQ6XG4gKiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvYmxvYi92My40LjUvc3JjL2NvbXBpbGVyL3V0aWxpdGllcy50cyNMMTg2NC1MMTg4N1xuICpcbiAqIElzc3VlIHRyYWNrZWQgaW4gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zMTc3OFxuICpcbiAqIEByZXR1cm5zIHRoZSBmdW5jdGlvbiB0byBwYXNzIHRvIGByZXN0b3JlR2V0RXhwYW5kb0luaXRpYWxpemVyYCB0byB1bmRvIHRoZSBwYXRjaCwgb3IgbnVsbCBpZlxuICogdGhlIGlzc3VlIGlzIGtub3duIHRvIGhhdmUgYmVlbiBmaXhlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhdGNoVHNHZXRFeHBhbmRvSW5pdGlhbGl6ZXIoKTogdW5rbm93biB7XG4gIGlmIChpc1RzMzE3NzhHZXRFeHBhbmRvSW5pdGlhbGl6ZXJGaXhlZCgpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBvcmlnaW5hbEdldEV4cGFuZG9Jbml0aWFsaXplciA9ICh0cyBhcyBhbnkpLmdldEV4cGFuZG9Jbml0aWFsaXplcjtcbiAgaWYgKG9yaWdpbmFsR2V0RXhwYW5kb0luaXRpYWxpemVyID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBtYWtlVW5zdXBwb3J0ZWRUeXBlU2NyaXB0RXJyb3IoKTtcbiAgfVxuXG4gIC8vIE92ZXJyaWRlIHRoZSBmdW5jdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IgcmVjb2duaXppbmcgdGhlIElJRkUgc3RydWN0dXJlIHVzZWQgaW4gRVM1IGJ1bmRsZXMuXG4gICh0cyBhcyBhbnkpLmdldEV4cGFuZG9Jbml0aWFsaXplciA9IChpbml0aWFsaXplcjogdHMuTm9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJvdG90eXBlQXNzaWdubWVudDogYm9vbGVhbik6IHRzLkV4cHJlc3Npb258dW5kZWZpbmVkID0+IHtcbiAgICAvLyBJZiB0aGUgaW5pdGlhbGl6ZXIgaXMgYSBjYWxsIGV4cHJlc3Npb24gd2l0aGluIHBhcmVudGhlc2lzLCB1bndyYXAgdGhlIHBhcmVudGhlc2lzXG4gICAgLy8gdXBmcm9udCBzdWNoIHRoYXQgdW5zdXBwb3J0ZWQgSUlGRSBzeW50YXggYChmdW5jdGlvbigpe30oKSlgIGJlY29tZXMgYGZ1bmN0aW9uKCl7fSgpYCxcbiAgICAvLyB3aGljaCBpcyBzdXBwb3J0ZWQuXG4gICAgaWYgKHRzLmlzUGFyZW50aGVzaXplZEV4cHJlc3Npb24oaW5pdGlhbGl6ZXIpICYmIHRzLmlzQ2FsbEV4cHJlc3Npb24oaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbikpIHtcbiAgICAgIGluaXRpYWxpemVyID0gaW5pdGlhbGl6ZXIuZXhwcmVzc2lvbjtcbiAgICB9XG4gICAgcmV0dXJuIG9yaWdpbmFsR2V0RXhwYW5kb0luaXRpYWxpemVyKGluaXRpYWxpemVyLCBpc1Byb3RvdHlwZUFzc2lnbm1lbnQpO1xuICB9O1xuICByZXR1cm4gb3JpZ2luYWxHZXRFeHBhbmRvSW5pdGlhbGl6ZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXN0b3JlR2V0RXhwYW5kb0luaXRpYWxpemVyKG9yaWdpbmFsR2V0RXhwYW5kb0luaXRpYWxpemVyOiB1bmtub3duKTogdm9pZCB7XG4gIGlmIChvcmlnaW5hbEdldEV4cGFuZG9Jbml0aWFsaXplciAhPT0gbnVsbCkge1xuICAgICh0cyBhcyBhbnkpLmdldEV4cGFuZG9Jbml0aWFsaXplciA9IG9yaWdpbmFsR2V0RXhwYW5kb0luaXRpYWxpemVyO1xuICB9XG59XG5cbmxldCB0czMxNzc4Rml4ZWRSZXN1bHQ6IGJvb2xlYW58bnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIGlzVHMzMTc3OEdldEV4cGFuZG9Jbml0aWFsaXplckZpeGVkKCk6IGJvb2xlYW4ge1xuICAvLyBJZiB0aGUgcmVzdWx0IGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQsIHJldHVybiBlYXJseS5cbiAgaWYgKHRzMzE3NzhGaXhlZFJlc3VsdCAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0czMxNzc4Rml4ZWRSZXN1bHQ7XG4gIH1cblxuICAvLyBEZXRlcm1pbmUgaWYgdGhlIGlzc3VlIGhhcyBiZWVuIGZpeGVkIGJ5IGNoZWNraW5nIGlmIGFuIGV4cGFuZG8gcHJvcGVydHkgaXMgcHJlc2VudCBpbiBhXG4gIC8vIG1pbmltdW0gcmVwcm9kdWN0aW9uIHVzaW5nIHVucGF0Y2hlZCBUeXBlU2NyaXB0LlxuICB0czMxNzc4Rml4ZWRSZXN1bHQgPSBjaGVja0lmRXhwYW5kb1Byb3BlcnR5SXNQcmVzZW50KCk7XG5cbiAgLy8gSWYgdGhlIGlzc3VlIGRvZXMgbm90IGFwcGVhciB0byBoYXZlIGJlZW4gZml4ZWQsIHZlcmlmeSB0aGF0IGFwcGx5aW5nIHRoZSBwYXRjaCBoYXMgdGhlIGRlc2lyZWRcbiAgLy8gZWZmZWN0LlxuICBpZiAoIXRzMzE3NzhGaXhlZFJlc3VsdCkge1xuICAgIGNvbnN0IG9yaWdpbmFsR2V0RXhwYW5kb0luaXRpYWxpemVyID0gcGF0Y2hUc0dldEV4cGFuZG9Jbml0aWFsaXplcigpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBwYXRjaElzU3VjY2Vzc2Z1bCA9IGNoZWNrSWZFeHBhbmRvUHJvcGVydHlJc1ByZXNlbnQoKTtcbiAgICAgIGlmICghcGF0Y2hJc1N1Y2Nlc3NmdWwpIHtcbiAgICAgICAgdGhyb3cgbWFrZVVuc3VwcG9ydGVkVHlwZVNjcmlwdEVycm9yKCk7XG4gICAgICB9XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIHJlc3RvcmVHZXRFeHBhbmRvSW5pdGlhbGl6ZXIob3JpZ2luYWxHZXRFeHBhbmRvSW5pdGlhbGl6ZXIpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0czMxNzc4Rml4ZWRSZXN1bHQ7XG59XG5cbi8qKlxuICogVmVyaWZpZXMgd2hldGhlciBUUyBpc3N1ZSAzMTc3OCBoYXMgYmVlbiBmaXhlZCBieSBpbnNwZWN0aW5nIGEgc3ltYm9sIGZyb20gYSBtaW5pbXVtXG4gKiByZXByb2R1Y3Rpb24uIElmIHRoZSBzeW1ib2wgZG9lcyBpbiBmYWN0IGhhdmUgdGhlIFwiZXhwYW5kb1wiIGFzIGV4cG9ydCwgdGhlIGlzc3VlIGhhcyBiZWVuIGZpeGVkLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzMxNzc4IGZvciBkZXRhaWxzLlxuICovXG5mdW5jdGlvbiBjaGVja0lmRXhwYW5kb1Byb3BlcnR5SXNQcmVzZW50KCk6IGJvb2xlYW4ge1xuICBjb25zdCBzb3VyY2VUZXh0ID0gYFxuICAgIChmdW5jdGlvbigpIHtcbiAgICAgIHZhciBBID0gKGZ1bmN0aW9uKCkge1xuICAgICAgICBmdW5jdGlvbiBBKCkge31cbiAgICAgICAgcmV0dXJuIEE7XG4gICAgICB9KCkpO1xuICAgICAgQS5leHBhbmRvID0gdHJ1ZTtcbiAgICB9KCkpO2A7XG4gIGNvbnN0IHNvdXJjZUZpbGUgPVxuICAgICAgdHMuY3JlYXRlU291cmNlRmlsZSgndGVzdC5qcycsIHNvdXJjZVRleHQsIHRzLlNjcmlwdFRhcmdldC5FUzUsIHRydWUsIHRzLlNjcmlwdEtpbmQuSlMpO1xuICBjb25zdCBob3N0OiB0cy5Db21waWxlckhvc3QgPSB7XG4gICAgZ2V0U291cmNlRmlsZSgpOiB0cy5Tb3VyY2VGaWxlIHxcbiAgICAgICAgdW5kZWZpbmVkIHtcbiAgICAgICAgICByZXR1cm4gc291cmNlRmlsZTtcbiAgICAgICAgfSxcbiAgICBmaWxlRXhpc3RzKCk6IGJvb2xlYW4ge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICByZWFkRmlsZSgpOiBzdHJpbmcgfFxuICAgICAgICB1bmRlZmluZWQge1xuICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfSxcbiAgICB3cml0ZUZpbGUoKSB7fSxcbiAgICBnZXREZWZhdWx0TGliRmlsZU5hbWUoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIGdldEN1cnJlbnREaXJlY3RvcnkoKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9LFxuICAgIGdldERpcmVjdG9yaWVzKCk6IHN0cmluZ1tdIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuICAgIGdldENhbm9uaWNhbEZpbGVOYW1lKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGZpbGVOYW1lO1xuICAgIH0sXG4gICAgdXNlQ2FzZVNlbnNpdGl2ZUZpbGVOYW1lcygpOiBib29sZWFuIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgZ2V0TmV3TGluZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuICdcXG4nO1xuICAgIH0sXG4gIH07XG4gIGNvbnN0IG9wdGlvbnMgPSB7bm9SZXNvbHZlOiB0cnVlLCBub0xpYjogdHJ1ZSwgbm9FbWl0OiB0cnVlLCBhbGxvd0pzOiB0cnVlfTtcbiAgY29uc3QgcHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oWyd0ZXN0LmpzJ10sIG9wdGlvbnMsIGhvc3QpO1xuXG4gIGZ1bmN0aW9uIHZpc2l0b3Iobm9kZTogdHMuTm9kZSk6IHRzLlZhcmlhYmxlRGVjbGFyYXRpb258dW5kZWZpbmVkIHtcbiAgICBpZiAodHMuaXNWYXJpYWJsZURlY2xhcmF0aW9uKG5vZGUpICYmIGhhc05hbWVJZGVudGlmaWVyKG5vZGUpICYmIG5vZGUubmFtZS50ZXh0ID09PSAnQScpIHtcbiAgICAgIHJldHVybiBub2RlO1xuICAgIH1cbiAgICByZXR1cm4gdHMuZm9yRWFjaENoaWxkKG5vZGUsIHZpc2l0b3IpO1xuICB9XG5cbiAgY29uc3QgZGVjbGFyYXRpb24gPSB0cy5mb3JFYWNoQ2hpbGQoc291cmNlRmlsZSwgdmlzaXRvcik7XG4gIGlmIChkZWNsYXJhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gZmluZCBkZWNsYXJhdGlvbiBvZiBvdXRlciBBJyk7XG4gIH1cblxuICBjb25zdCBzeW1ib2wgPSBwcm9ncmFtLmdldFR5cGVDaGVja2VyKCkuZ2V0U3ltYm9sQXRMb2NhdGlvbihkZWNsYXJhdGlvbi5uYW1lKTtcbiAgaWYgKHN5bWJvbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gcmVzb2x2ZSBzeW1ib2wgb2Ygb3V0ZXIgQScpO1xuICB9XG4gIHJldHVybiBzeW1ib2wuZXhwb3J0cyAhPT0gdW5kZWZpbmVkICYmIHN5bWJvbC5leHBvcnRzLmhhcygnZXhwYW5kbycgYXMgdHMuX19TdHJpbmcpO1xufVxuXG5mdW5jdGlvbiBtYWtlVW5zdXBwb3J0ZWRUeXBlU2NyaXB0RXJyb3IoKTogRXJyb3Ige1xuICByZXR1cm4gbmV3IEVycm9yKCdUaGUgVHlwZVNjcmlwdCB2ZXJzaW9uIHVzZWQgaXMgbm90IHN1cHBvcnRlZCBieSBuZ2NjLicpO1xufVxuIl19
|
|
@@ -1,187 +0,0 @@
|
|
|
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 * as ts from 'typescript';
|
|
9
|
-
/**
|
|
10
|
-
* A cache that holds on to source files that can be shared for processing all entry-points in a
|
|
11
|
-
* single invocation of ngcc. In particular, the following files are shared across all entry-points
|
|
12
|
-
* through this cache:
|
|
13
|
-
*
|
|
14
|
-
* 1. Default library files such as `lib.dom.d.ts` and `lib.es5.d.ts`. These files don't change
|
|
15
|
-
* and some are very large, so parsing is expensive. Therefore, the parsed `ts.SourceFile`s for
|
|
16
|
-
* the default library files are cached.
|
|
17
|
-
* 2. The typings of @angular scoped packages. The typing files for @angular packages are typically
|
|
18
|
-
* used in the entry-points that ngcc processes, so benefit from a single source file cache.
|
|
19
|
-
* Especially `@angular/core/core.d.ts` is large and expensive to parse repeatedly. In contrast
|
|
20
|
-
* to default library files, we have to account for these files to be invalidated during a single
|
|
21
|
-
* invocation of ngcc, as ngcc will overwrite the .d.ts files during its processing.
|
|
22
|
-
*
|
|
23
|
-
* The lifecycle of this cache corresponds with a single invocation of ngcc. Separate invocations,
|
|
24
|
-
* e.g. the CLI's synchronous module resolution fallback will therefore all have their own cache.
|
|
25
|
-
* This allows for the source file cache to be garbage collected once ngcc processing has completed.
|
|
26
|
-
*/
|
|
27
|
-
export class SharedFileCache {
|
|
28
|
-
constructor(fs) {
|
|
29
|
-
this.fs = fs;
|
|
30
|
-
this.sfCache = new Map();
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Loads a `ts.SourceFile` if the provided `fileName` is deemed appropriate to be cached. To
|
|
34
|
-
* optimize for memory usage, only files that are generally used in all entry-points are cached.
|
|
35
|
-
* If `fileName` is not considered to benefit from caching or the requested file does not exist,
|
|
36
|
-
* then `undefined` is returned.
|
|
37
|
-
*/
|
|
38
|
-
getCachedSourceFile(fileName) {
|
|
39
|
-
const absPath = this.fs.resolve(fileName);
|
|
40
|
-
if (isDefaultLibrary(absPath, this.fs)) {
|
|
41
|
-
return this.getStableCachedFile(absPath);
|
|
42
|
-
}
|
|
43
|
-
else if (isAngularDts(absPath, this.fs)) {
|
|
44
|
-
return this.getVolatileCachedFile(absPath);
|
|
45
|
-
}
|
|
46
|
-
else {
|
|
47
|
-
return undefined;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Attempts to load the source file from the cache, or parses the file into a `ts.SourceFile` if
|
|
52
|
-
* it's not yet cached. This method assumes that the file will not be modified for the duration
|
|
53
|
-
* that this cache is valid for. If that assumption does not hold, the `getVolatileCachedFile`
|
|
54
|
-
* method is to be used instead.
|
|
55
|
-
*/
|
|
56
|
-
getStableCachedFile(absPath) {
|
|
57
|
-
if (!this.sfCache.has(absPath)) {
|
|
58
|
-
const content = readFile(absPath, this.fs);
|
|
59
|
-
if (content === undefined) {
|
|
60
|
-
return undefined;
|
|
61
|
-
}
|
|
62
|
-
const sf = ts.createSourceFile(absPath, content, ts.ScriptTarget.ES2015);
|
|
63
|
-
this.sfCache.set(absPath, sf);
|
|
64
|
-
}
|
|
65
|
-
return this.sfCache.get(absPath);
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* In contrast to `getStableCachedFile`, this method always verifies that the cached source file
|
|
69
|
-
* is the same as what's stored on disk. This is done for files that are expected to change during
|
|
70
|
-
* ngcc's processing, such as @angular scoped packages for which the .d.ts files are overwritten
|
|
71
|
-
* by ngcc. If the contents on disk have changed compared to a previously cached source file, the
|
|
72
|
-
* content from disk is re-parsed and the cache entry is replaced.
|
|
73
|
-
*/
|
|
74
|
-
getVolatileCachedFile(absPath) {
|
|
75
|
-
const content = readFile(absPath, this.fs);
|
|
76
|
-
if (content === undefined) {
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
79
|
-
if (!this.sfCache.has(absPath) || this.sfCache.get(absPath).text !== content) {
|
|
80
|
-
const sf = ts.createSourceFile(absPath, content, ts.ScriptTarget.ES2015);
|
|
81
|
-
this.sfCache.set(absPath, sf);
|
|
82
|
-
}
|
|
83
|
-
return this.sfCache.get(absPath);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
const DEFAULT_LIB_PATTERN = ['node_modules', 'typescript', 'lib', /^lib\..+\.d\.ts$/];
|
|
87
|
-
/**
|
|
88
|
-
* Determines whether the provided path corresponds with a default library file inside of the
|
|
89
|
-
* typescript package.
|
|
90
|
-
*
|
|
91
|
-
* @param absPath The path for which to determine if it corresponds with a default library file.
|
|
92
|
-
* @param fs The filesystem to use for inspecting the path.
|
|
93
|
-
*/
|
|
94
|
-
export function isDefaultLibrary(absPath, fs) {
|
|
95
|
-
return isFile(absPath, DEFAULT_LIB_PATTERN, fs);
|
|
96
|
-
}
|
|
97
|
-
const ANGULAR_DTS_PATTERN = ['node_modules', '@angular', /./, /\.d\.ts$/];
|
|
98
|
-
/**
|
|
99
|
-
* Determines whether the provided path corresponds with a .d.ts file inside of an @angular
|
|
100
|
-
* scoped package. This logic only accounts for the .d.ts files in the root, which is sufficient
|
|
101
|
-
* to find the large, flattened entry-point files that benefit from caching.
|
|
102
|
-
*
|
|
103
|
-
* @param absPath The path for which to determine if it corresponds with an @angular .d.ts file.
|
|
104
|
-
* @param fs The filesystem to use for inspecting the path.
|
|
105
|
-
*/
|
|
106
|
-
export function isAngularDts(absPath, fs) {
|
|
107
|
-
return isFile(absPath, ANGULAR_DTS_PATTERN, fs);
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Helper function to determine whether a file corresponds with a given pattern of segments.
|
|
111
|
-
*
|
|
112
|
-
* @param path The path for which to determine if it corresponds with the provided segments.
|
|
113
|
-
* @param segments Array of segments; the `path` must have ending segments that match the
|
|
114
|
-
* patterns in this array.
|
|
115
|
-
* @param fs The filesystem to use for inspecting the path.
|
|
116
|
-
*/
|
|
117
|
-
function isFile(path, segments, fs) {
|
|
118
|
-
for (let i = segments.length - 1; i >= 0; i--) {
|
|
119
|
-
const pattern = segments[i];
|
|
120
|
-
const segment = fs.basename(path);
|
|
121
|
-
if (typeof pattern === 'string') {
|
|
122
|
-
if (pattern !== segment) {
|
|
123
|
-
return false;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
else {
|
|
127
|
-
if (!pattern.test(segment)) {
|
|
128
|
-
return false;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
path = fs.dirname(path);
|
|
132
|
-
}
|
|
133
|
-
return true;
|
|
134
|
-
}
|
|
135
|
-
/**
|
|
136
|
-
* A cache for processing a single entry-point. This exists to share `ts.SourceFile`s between the
|
|
137
|
-
* source and typing programs that are created for a single program.
|
|
138
|
-
*/
|
|
139
|
-
export class EntryPointFileCache {
|
|
140
|
-
constructor(fs, sharedFileCache) {
|
|
141
|
-
this.fs = fs;
|
|
142
|
-
this.sharedFileCache = sharedFileCache;
|
|
143
|
-
this.sfCache = new Map();
|
|
144
|
-
}
|
|
145
|
-
/**
|
|
146
|
-
* Returns and caches a parsed `ts.SourceFile` for the provided `fileName`. If the `fileName` is
|
|
147
|
-
* cached in the shared file cache, that result is used. Otherwise, the source file is cached
|
|
148
|
-
* internally. This method returns `undefined` if the requested file does not exist.
|
|
149
|
-
*
|
|
150
|
-
* @param fileName The path of the file to retrieve a source file for.
|
|
151
|
-
* @param languageVersion The language version to use for parsing the file.
|
|
152
|
-
*/
|
|
153
|
-
getCachedSourceFile(fileName, languageVersion) {
|
|
154
|
-
const staticSf = this.sharedFileCache.getCachedSourceFile(fileName);
|
|
155
|
-
if (staticSf !== undefined) {
|
|
156
|
-
return staticSf;
|
|
157
|
-
}
|
|
158
|
-
const absPath = this.fs.resolve(fileName);
|
|
159
|
-
if (this.sfCache.has(absPath)) {
|
|
160
|
-
return this.sfCache.get(absPath);
|
|
161
|
-
}
|
|
162
|
-
const content = readFile(absPath, this.fs);
|
|
163
|
-
if (content === undefined) {
|
|
164
|
-
return undefined;
|
|
165
|
-
}
|
|
166
|
-
const sf = ts.createSourceFile(fileName, content, languageVersion);
|
|
167
|
-
this.sfCache.set(absPath, sf);
|
|
168
|
-
return sf;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
function readFile(absPath, fs) {
|
|
172
|
-
if (!fs.exists(absPath) || !fs.stat(absPath).isFile()) {
|
|
173
|
-
return undefined;
|
|
174
|
-
}
|
|
175
|
-
return fs.readFile(absPath);
|
|
176
|
-
}
|
|
177
|
-
/**
|
|
178
|
-
* Creates a `ts.ModuleResolutionCache` that uses the provided filesystem for path operations.
|
|
179
|
-
*
|
|
180
|
-
* @param fs The filesystem to use for path operations.
|
|
181
|
-
*/
|
|
182
|
-
export function createModuleResolutionCache(fs) {
|
|
183
|
-
return ts.createModuleResolutionCache(fs.pwd(), fileName => {
|
|
184
|
-
return fs.isCaseSensitive() ? fileName : fileName.toLowerCase();
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic291cmNlX2ZpbGVfY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci1jbGkvbmdjYy9zcmMvcGFja2FnZXMvc291cmNlX2ZpbGVfY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBQ0gsT0FBTyxLQUFLLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFHakM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFHMUIsWUFBb0IsRUFBc0I7UUFBdEIsT0FBRSxHQUFGLEVBQUUsQ0FBb0I7UUFGbEMsWUFBTyxHQUFHLElBQUksR0FBRyxFQUFpQyxDQUFDO0lBRWQsQ0FBQztJQUU5Qzs7Ozs7T0FLRztJQUNILG1CQUFtQixDQUFDLFFBQWdCO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksZ0JBQWdCLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLENBQUMsRUFBRTtZQUN0QyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUMxQzthQUFNLElBQUksWUFBWSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUU7WUFDekMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDNUM7YUFBTTtZQUNMLE9BQU8sU0FBUyxDQUFDO1NBQ2xCO0lBQ0gsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ssbUJBQW1CLENBQUMsT0FBdUI7UUFDakQsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQzlCLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFD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RUFBRSxFQUFFO1FBQ3JELE9BQU8sU0FBUyxDQUFDO0tBQ2xCO0lBQ0QsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQzlCLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEVBQXNCO0lBQ2hFLE9BQU8sRUFBRSxDQUFDLDJCQUEyQixDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBRTtRQUN6RCxPQUFPLEVBQUUsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbEUsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5pbXBvcnQgKiBhcyB0cyBmcm9tICd0eXBlc2NyaXB0JztcbmltcG9ydCB7QWJzb2x1dGVGc1BhdGgsIFJlYWRvbmx5RmlsZVN5c3RlbX0gZnJvbSAnLi4vLi4vLi4vc3JjL25ndHNjL2ZpbGVfc3lzdGVtJztcblxuLyoqXG4gKiBBIGNhY2hlIHRoYXQgaG9sZHMgb24gdG8gc291cmNlIGZpbGVzIHRoYXQgY2FuIGJlIHNoYXJlZCBmb3IgcHJvY2Vzc2luZyBhbGwgZW50cnktcG9pbnRzIGluIGFcbiAqIHNpbmdsZSBpbnZvY2F0aW9uIG9mIG5nY2MuIEluIHBhcnRpY3VsYXIsIHRoZSBmb2xsb3dpbmcgZmlsZXMgYXJlIHNoYXJlZCBhY3Jvc3MgYWxsIGVudHJ5LXBvaW50c1xuICogdGhyb3VnaCB0aGlzIGNhY2hlOlxuICpcbiAqIDEuIERlZmF1bHQgbGlicmFyeSBmaWxlcyBzdWNoIGFzIGBsaWIuZG9tLmQudHNgIGFuZCBgbGliLmVzNS5kLnRzYC4gVGhlc2UgZmlsZXMgZG9uJ3QgY2hhbmdlXG4gKiAgICBhbmQgc29tZSBhcmUgdmVyeSBsYXJnZSwgc28gcGFyc2luZyBpcyBleHBlbnNpdmUuIFRoZXJlZm9yZSwgdGhlIHBhcnNlZCBgdHMuU291cmNlRmlsZWBzIGZvclxuICogICAgdGhlIGRlZmF1bHQgbGlicmFyeSBmaWxlcyBhcmUgY2FjaGVkLlxuICogMi4gVGhlIHR5cGluZ3Mgb2YgQGFuZ3VsYXIgc2NvcGVkIHBhY2thZ2VzLiBUaGUgdHlwaW5nIGZpbGVzIGZvciBAYW5ndWxhciBwYWNrYWdlcyBhcmUgdHlwaWNhbGx5XG4gKiAgICB1c2VkIGluIHRoZSBlbnRyeS1wb2ludHMgdGhhdCBuZ2NjIHByb2Nlc3Nlcywgc28gYmVuZWZpdCBmcm9tIGEgc2luZ2xlIHNvdXJjZSBmaWxlIGNhY2hlLlxuICogICAgRXNwZWNpYWxseSBgQGFuZ3VsYXIvY29yZS9jb3JlLmQudHNgIGlzIGxhcmdlIGFuZCBleHBlbnNpdmUgdG8gcGFyc2UgcmVwZWF0ZWRseS4gSW4gY29udHJhc3RcbiAqICAgIHRvIGRlZmF1bHQgbGlicmFyeSBmaWxlcywgd2UgaGF2ZSB0byBhY2NvdW50IGZvciB0aGVzZSBmaWxlcyB0byBiZSBpbnZhbGlkYXRlZCBkdXJpbmcgYSBzaW5nbGVcbiAqICAgIGludm9jYXRpb24gb2YgbmdjYywgYXMgbmdjYyB3aWxsIG92ZXJ3cml0ZSB0aGUgLmQudHMgZmlsZXMgZHVyaW5nIGl0cyBwcm9jZXNzaW5nLlxuICpcbiAqIFRoZSBsaWZlY3ljbGUgb2YgdGhpcyBjYWNoZSBjb3JyZXNwb25kcyB3aXRoIGEgc2luZ2xlIGludm9jYXRpb24gb2YgbmdjYy4gU2VwYXJhdGUgaW52b2NhdGlvbnMsXG4gKiBlLmcuIHRoZSBDTEkncyBzeW5jaHJvbm91cyBtb2R1bGUgcmVzb2x1dGlvbiBmYWxsYmFjayB3aWxsIHRoZXJlZm9yZSBhbGwgaGF2ZSB0aGVpciBvd24gY2FjaGUuXG4gKiBUaGlzIGFsbG93cyBmb3IgdGhlIHNvdXJjZSBmaWxlIGNhY2hlIHRvIGJlIGdhcmJhZ2UgY29sbGVjdGVkIG9uY2UgbmdjYyBwcm9jZXNzaW5nIGhhcyBjb21wbGV0ZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBTaGFyZWRGaWxlQ2FjaGUge1xuICBwcml2YXRlIHNmQ2FjaGUgPSBuZXcgTWFwPEFic29sdXRlRnNQYXRoLCB0cy5Tb3VyY2VGaWxlPigpO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZnM6IFJlYWRvbmx5RmlsZVN5c3RlbSkge31cblxuICAvKipcbiAgICogTG9hZHMgYSBgdHMuU291cmNlRmlsZWAgaWYgdGhlIHByb3ZpZGVkIGBmaWxlTmFtZWAgaXMgZGVlbWVkIGFwcHJvcHJpYXRlIHRvIGJlIGNhY2hlZC4gVG9cbiAgICogb3B0aW1pemUgZm9yIG1lbW9yeSB1c2FnZSwgb25seSBmaWxlcyB0aGF0IGFyZSBnZW5lcmFsbHkgdXNlZCBpbiBhbGwgZW50cnktcG9pbnRzIGFyZSBjYWNoZWQuXG4gICAqIElmIGBmaWxlTmFtZWAgaXMgbm90IGNvbnNpZGVyZWQgdG8gYmVuZWZpdCBmcm9tIGNhY2hpbmcgb3IgdGhlIHJlcXVlc3RlZCBmaWxlIGRvZXMgbm90IGV4aXN0LFxuICAgKiB0aGVuIGB1bmRlZmluZWRgIGlzIHJldHVybmVkLlxuICAgKi9cbiAgZ2V0Q2FjaGVkU291cmNlRmlsZShmaWxlTmFtZTogc3RyaW5nKTogdHMuU291cmNlRmlsZXx1bmRlZmluZWQge1xuICAgIGNvbnN0IGFic1BhdGggPSB0aGlzLmZzLnJlc29sdmUoZmlsZU5hbWUpO1xuICAgIGlmIChpc0RlZmF1bHRMaWJyYXJ5KGFic1BhdGgsIHRoaXMuZnMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRTdGFibGVDYWNoZWRGaWxlKGFic1BhdGgpO1xuICAgIH0gZWxzZSBpZiAoaXNBbmd1bGFyRHRzKGFic1BhdGgsIHRoaXMuZnMpKSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRWb2xhdGlsZUNhY2hlZEZpbGUoYWJzUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHRzIHRvIGxvYWQgdGhlIHNvdXJjZSBmaWxlIGZyb20gdGhlIGNhY2hlLCBvciBwYXJzZXMgdGhlIGZpbGUgaW50byBhIGB0cy5Tb3VyY2VGaWxlYCBpZlxuICAgKiBpdCdzIG5vdCB5ZXQgY2FjaGVkLiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgdGhlIGZpbGUgd2lsbCBub3QgYmUgbW9kaWZpZWQgZm9yIHRoZSBkdXJhdGlvblxuICAgKiB0aGF0IHRoaXMgY2FjaGUgaXMgdmFsaWQgZm9yLiBJZiB0aGF0IGFzc3VtcHRpb24gZG9lcyBub3QgaG9sZCwgdGhlIGBnZXRWb2xhdGlsZUNhY2hlZEZpbGVgXG4gICAqIG1ldGhvZCBpcyB0byBiZSB1c2VkIGluc3RlYWQuXG4gICAqL1xuICBwcml2YXRlIGdldFN0YWJsZUNhY2hlZEZpbGUoYWJzUGF0aDogQWJzb2x1dGVGc1BhdGgpOiB0cy5Tb3VyY2VGaWxlfHVuZGVmaW5lZCB7XG4gICAgaWYgKCF0aGlzLnNmQ2FjaGUuaGFzKGFic1BhdGgpKSB7XG4gICAgICBjb25zdCBjb250ZW50ID0gcmVhZEZpbGUoYWJzUGF0aCwgdGhpcy5mcyk7XG4gICAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjb25zdCBzZiA9IHRzLmNyZWF0ZVNvdXJjZUZpbGUoYWJzUGF0aCwgY29udGVudCwgdHMuU2NyaXB0VGFyZ2V0LkVTMjAxNSk7XG4gICAgICB0aGlzLnNmQ2FjaGUuc2V0KGFic1BhdGgsIHNmKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuc2ZDYWNoZS5nZXQoYWJzUGF0aCkhO1xuICB9XG5cbiAgLyoqXG4gICAqIEluIGNvbnRyYXN0IHRvIGBnZXRTdGFibGVDYWNoZWRGaWxlYCwgdGhpcyBtZXRob2QgYWx3YXlzIHZlcmlmaWVzIHRoYXQgdGhlIGNhY2hlZCBzb3VyY2UgZmlsZVxuICAgKiBpcyB0aGUgc2FtZSBhcyB3aGF0J3Mgc3RvcmVkIG9uIGRpc2suIFRoaXMgaXMgZG9uZSBmb3IgZmlsZXMgdGhhdCBhcmUgZXhwZWN0ZWQgdG8gY2hhbmdlIGR1cmluZ1xuICAgKiBuZ2NjJ3MgcHJvY2Vzc2luZywgc3VjaCBhcyBAYW5ndWxhciBzY29wZWQgcGFja2FnZXMgZm9yIHdoaWNoIHRoZSAuZC50cyBmaWxlcyBhcmUgb3ZlcndyaXR0ZW5cbiAgICogYnkgbmdjYy4gSWYgdGhlIGNvbnRlbnRzIG9uIGRpc2sgaGF2ZSBjaGFuZ2VkIGNvbXBhcmVkIHRvIGEgcHJldmlvdXNseSBjYWNoZWQgc291cmNlIGZpbGUsIHRoZVxuICAgKiBjb250ZW50IGZyb20gZGlzayBpcyByZS1wYXJzZWQgYW5kIHRoZSBjYWNoZSBlbnRyeSBpcyByZXBsYWNlZC5cbiAgICovXG4gIHByaXZhdGUgZ2V0Vm9sYXRpbGVDYWNoZWRGaWxlKGFic1BhdGg6IEFic29sdXRlRnNQYXRoKTogdHMuU291cmNlRmlsZXx1bmRlZmluZWQge1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkRmlsZShhYnNQYXRoLCB0aGlzLmZzKTtcbiAgICBpZiAoY29udGVudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc2ZDYWNoZS5oYXMoYWJzUGF0aCkgfHwgdGhpcy5zZkNhY2hlLmdldChhYnNQYXRoKSEudGV4dCAhPT0gY29udGVudCkge1xuICAgICAgY29uc3Qgc2YgPSB0cy5jcmVhdGVTb3VyY2VGaWxlKGFic1BhdGgsIGNvbnRlbnQsIHRzLlNjcmlwdFRhcmdldC5FUzIwMTUpO1xuICAgICAgdGhpcy5zZkNhY2hlLnNldChhYnNQYXRoLCBzZik7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNmQ2FjaGUuZ2V0KGFic1BhdGgpITtcbiAgfVxufVxuXG5jb25zdCBERUZBVUxUX0xJQl9QQVRURVJOID0gWydub2RlX21vZHVsZXMnLCAndHlwZXNjcmlwdCcsICdsaWInLCAvXmxpYlxcLi4rXFwuZFxcLnRzJC9dO1xuXG4vKipcbiAqIERldGVybWluZXMgd2hldGhlciB0aGUgcHJvdmlkZWQgcGF0aCBjb3JyZXNwb25kcyB3aXRoIGEgZGVmYXVsdCBsaWJyYXJ5IGZpbGUgaW5zaWRlIG9mIHRoZVxuICogdHlwZXNjcmlwdCBwYWNrYWdlLlxuICpcbiAqIEBwYXJhbSBhYnNQYXRoIFRoZSBwYXRoIGZvciB3aGljaCB0byBkZXRlcm1pbmUgaWYgaXQgY29ycmVzcG9uZHMgd2l0aCBhIGRlZmF1bHQgbGlicmFyeSBmaWxlLlxuICogQHBhcmFtIGZzIFRoZSBmaWxlc3lzdGVtIHRvIHVzZSBmb3IgaW5zcGVjdGluZyB0aGUgcGF0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGVmYXVsdExpYnJhcnkoYWJzUGF0aDogQWJzb2x1dGVGc1BhdGgsIGZzOiBSZWFkb25seUZpbGVTeXN0ZW0pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRmlsZShhYnNQYXRoLCBERUZBVUxUX0xJQl9QQVRURVJOLCBmcyk7XG59XG5cbmNvbnN0IEFOR1VMQVJfRFRTX1BBVFRFUk4gPSBbJ25vZGVfbW9kdWxlcycsICdAYW5ndWxhcicsIC8uLywgL1xcLmRcXC50cyQvXTtcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHByb3ZpZGVkIHBhdGggY29ycmVzcG9uZHMgd2l0aCBhIC5kLnRzIGZpbGUgaW5zaWRlIG9mIGFuIEBhbmd1bGFyXG4gKiBzY29wZWQgcGFja2FnZS4gVGhpcyBsb2dpYyBvbmx5IGFjY291bnRzIGZvciB0aGUgLmQudHMgZmlsZXMgaW4gdGhlIHJvb3QsIHdoaWNoIGlzIHN1ZmZpY2llbnRcbiAqIHRvIGZpbmQgdGhlIGxhcmdlLCBmbGF0dGVuZWQgZW50cnktcG9pbnQgZmlsZXMgdGhhdCBiZW5lZml0IGZyb20gY2FjaGluZy5cbiAqXG4gKiBAcGFyYW0gYWJzUGF0aCBUaGUgcGF0aCBmb3Igd2hpY2ggdG8gZGV0ZXJtaW5lIGlmIGl0IGNvcnJlc3BvbmRzIHdpdGggYW4gQGFuZ3VsYXIgLmQudHMgZmlsZS5cbiAqIEBwYXJhbSBmcyBUaGUgZmlsZXN5c3RlbSB0byB1c2UgZm9yIGluc3BlY3RpbmcgdGhlIHBhdGguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0FuZ3VsYXJEdHMoYWJzUGF0aDogQWJzb2x1dGVGc1BhdGgsIGZzOiBSZWFkb25seUZpbGVTeXN0ZW0pOiBib29sZWFuIHtcbiAgcmV0dXJuIGlzRmlsZShhYnNQYXRoLCBBTkdVTEFSX0RUU19QQVRURVJOLCBmcyk7XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGRldGVybWluZSB3aGV0aGVyIGEgZmlsZSBjb3JyZXNwb25kcyB3aXRoIGEgZ2l2ZW4gcGF0dGVybiBvZiBzZWdtZW50cy5cbiAqXG4gKiBAcGFyYW0gcGF0aCBUaGUgcGF0aCBmb3Igd2hpY2ggdG8gZGV0ZXJtaW5lIGlmIGl0IGNvcnJlc3BvbmRzIHdpdGggdGhlIHByb3ZpZGVkIHNlZ21lbnRzLlxuICogQHBhcmFtIHNlZ21lbnRzIEFycmF5IG9mIHNlZ21lbnRzOyB0aGUgYHBhdGhgIG11c3QgaGF2ZSBlbmRpbmcgc2VnbWVudHMgdGhhdCBtYXRjaCB0aGVcbiAqIHBhdHRlcm5zIGluIHRoaXMgYXJyYXkuXG4gKiBAcGFyYW0gZnMgVGhlIGZpbGVzeXN0ZW0gdG8gdXNlIGZvciBpbnNwZWN0aW5nIHRoZSBwYXRoLlxuICovXG5mdW5jdGlvbiBpc0ZpbGUoXG4gICAgcGF0aDogQWJzb2x1dGVGc1BhdGgsIHNlZ21lbnRzOiBSZWFkb25seUFycmF5PHN0cmluZ3xSZWdFeHA+LCBmczogUmVhZG9ubHlGaWxlU3lzdGVtKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSBzZWdtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBzZWdtZW50c1tpXTtcbiAgICBjb25zdCBzZWdtZW50ID0gZnMuYmFzZW5hbWUocGF0aCk7XG4gICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykge1xuICAgICAgaWYgKHBhdHRlcm4gIT09IHNlZ21lbnQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoIXBhdHRlcm4udGVzdChzZWdtZW50KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHBhdGggPSBmcy5kaXJuYW1lKHBhdGgpO1xuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEEgY2FjaGUgZm9yIHByb2Nlc3NpbmcgYSBzaW5nbGUgZW50cnktcG9pbnQuIFRoaXMgZXhpc3RzIHRvIHNoYXJlIGB0cy5Tb3VyY2VGaWxlYHMgYmV0d2VlbiB0aGVcbiAqIHNvdXJjZSBhbmQgdHlwaW5nIHByb2dyYW1zIHRoYXQgYXJlIGNyZWF0ZWQgZm9yIGEgc2luZ2xlIHByb2dyYW0uXG4gKi9cbmV4cG9ydCBjbGFzcyBFbnRyeVBvaW50RmlsZUNhY2hlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBzZkNhY2hlID0gbmV3IE1hcDxBYnNvbHV0ZUZzUGF0aCwgdHMuU291cmNlRmlsZT4oKTtcblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZzOiBSZWFkb25seUZpbGVTeXN0ZW0sIHByaXZhdGUgc2hhcmVkRmlsZUNhY2hlOiBTaGFyZWRGaWxlQ2FjaGUpIHt9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYW5kIGNhY2hlcyBhIHBhcnNlZCBgdHMuU291cmNlRmlsZWAgZm9yIHRoZSBwcm92aWRlZCBgZmlsZU5hbWVgLiBJZiB0aGUgYGZpbGVOYW1lYCBpc1xuICAgKiBjYWNoZWQgaW4gdGhlIHNoYXJlZCBmaWxlIGNhY2hlLCB0aGF0IHJlc3VsdCBpcyB1c2VkLiBPdGhlcndpc2UsIHRoZSBzb3VyY2UgZmlsZSBpcyBjYWNoZWRcbiAgICogaW50ZXJuYWxseS4gVGhpcyBtZXRob2QgcmV0dXJucyBgdW5kZWZpbmVkYCBpZiB0aGUgcmVxdWVzdGVkIGZpbGUgZG9lcyBub3QgZXhpc3QuXG4gICAqXG4gICAqIEBwYXJhbSBmaWxlTmFtZSBUaGUgcGF0aCBvZiB0aGUgZmlsZSB0byByZXRyaWV2ZSBhIHNvdXJjZSBmaWxlIGZvci5cbiAgICogQHBhcmFtIGxhbmd1YWdlVmVyc2lvbiBUaGUgbGFuZ3VhZ2UgdmVyc2lvbiB0byB1c2UgZm9yIHBhcnNpbmcgdGhlIGZpbGUuXG4gICAqL1xuICBnZXRDYWNoZWRTb3VyY2VGaWxlKGZpbGVOYW1lOiBzdHJpbmcsIGxhbmd1YWdlVmVyc2lvbjogdHMuU2NyaXB0VGFyZ2V0KTogdHMuU291cmNlRmlsZXx1bmRlZmluZWQge1xuICAgIGNvbnN0IHN0YXRpY1NmID0gdGhpcy5zaGFyZWRGaWxlQ2FjaGUuZ2V0Q2FjaGVkU291cmNlRmlsZShmaWxlTmFtZSk7XG4gICAgaWYgKHN0YXRpY1NmICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBzdGF0aWNTZjtcbiAgICB9XG5cbiAgICBjb25zdCBhYnNQYXRoID0gdGhpcy5mcy5yZXNvbHZlKGZpbGVOYW1lKTtcbiAgICBpZiAodGhpcy5zZkNhY2hlLmhhcyhhYnNQYXRoKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc2ZDYWNoZS5nZXQoYWJzUGF0aCk7XG4gICAgfVxuXG4gICAgY29uc3QgY29udGVudCA9IHJlYWRGaWxlKGFic1BhdGgsIHRoaXMuZnMpO1xuICAgIGlmIChjb250ZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGNvbnN0IHNmID0gdHMuY3JlYXRlU291cmNlRmlsZShmaWxlTmFtZSwgY29udGVudCwgbGFuZ3VhZ2VWZXJzaW9uKTtcbiAgICB0aGlzLnNmQ2FjaGUuc2V0KGFic1BhdGgsIHNmKTtcbiAgICByZXR1cm4gc2Y7XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVhZEZpbGUoYWJzUGF0aDogQWJzb2x1dGVGc1BhdGgsIGZzOiBSZWFkb25seUZpbGVTeXN0ZW0pOiBzdHJpbmd8dW5kZWZpbmVkIHtcbiAgaWYgKCFmcy5leGlzdHMoYWJzUGF0aCkgfHwgIWZzLnN0YXQoYWJzUGF0aCkuaXNGaWxlKCkpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIHJldHVybiBmcy5yZWFkRmlsZShhYnNQYXRoKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRzLk1vZHVsZVJlc29sdXRpb25DYWNoZWAgdGhhdCB1c2VzIHRoZSBwcm92aWRlZCBmaWxlc3lzdGVtIGZvciBwYXRoIG9wZXJhdGlvbnMuXG4gKlxuICogQHBhcmFtIGZzIFRoZSBmaWxlc3lzdGVtIHRvIHVzZSBmb3IgcGF0aCBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlTW9kdWxlUmVzb2x1dGlvbkNhY2hlKGZzOiBSZWFkb25seUZpbGVTeXN0ZW0pOiB0cy5Nb2R1bGVSZXNvbHV0aW9uQ2FjaGUge1xuICByZXR1cm4gdHMuY3JlYXRlTW9kdWxlUmVzb2x1dGlvbkNhY2hlKGZzLnB3ZCgpLCBmaWxlTmFtZSA9PiB7XG4gICAgcmV0dXJuIGZzLmlzQ2FzZVNlbnNpdGl2ZSgpID8gZmlsZU5hbWUgOiBmaWxlTmFtZS50b0xvd2VyQ2FzZSgpO1xuICB9KTtcbn1cbiJdfQ==
|