@angular/compiler 19.0.0-next.1 → 19.0.0-next.11
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/LICENSE +21 -0
- package/fesm2022/compiler.mjs +5465 -4675
- package/fesm2022/compiler.mjs.map +1 -1
- package/index.d.ts +115 -15
- package/package.json +2 -4
- package/esm2022/compiler.mjs +0 -13
- package/esm2022/index.mjs +0 -13
- package/esm2022/public_api.mjs +0 -15
- package/esm2022/src/assertions.mjs +0 -31
- package/esm2022/src/chars.mjs +0 -90
- package/esm2022/src/compiler.mjs +0 -88
- package/esm2022/src/compiler_facade_interface.mjs +0 -29
- package/esm2022/src/config.mjs +0 -20
- package/esm2022/src/constant_pool.mjs +0 -285
- package/esm2022/src/core.mjs +0 -96
- package/esm2022/src/expression_parser/ast.mjs +0 -755
- package/esm2022/src/expression_parser/lexer.mjs +0 -421
- package/esm2022/src/expression_parser/parser.mjs +0 -1222
- package/esm2022/src/i18n/digest.mjs +0 -322
- package/esm2022/src/i18n/extractor_merger.mjs +0 -409
- package/esm2022/src/i18n/i18n_ast.mjs +0 -212
- package/esm2022/src/i18n/i18n_html_parser.mjs +0 -54
- package/esm2022/src/i18n/i18n_parser.mjs +0 -247
- package/esm2022/src/i18n/index.mjs +0 -16
- package/esm2022/src/i18n/message_bundle.mjs +0 -93
- package/esm2022/src/i18n/parse_util.mjs +0 -17
- package/esm2022/src/i18n/serializers/placeholder.mjs +0 -139
- package/esm2022/src/i18n/serializers/serializer.mjs +0 -77
- package/esm2022/src/i18n/serializers/xliff.mjs +0 -300
- package/esm2022/src/i18n/serializers/xliff2.mjs +0 -349
- package/esm2022/src/i18n/serializers/xmb.mjs +0 -188
- package/esm2022/src/i18n/serializers/xml_helper.mjs +0 -94
- package/esm2022/src/i18n/serializers/xtb.mjs +0 -186
- package/esm2022/src/i18n/translation_bundle.mjs +0 -164
- package/esm2022/src/injectable_compiler_2.mjs +0 -138
- package/esm2022/src/jit_compiler_facade.mjs +0 -681
- package/esm2022/src/ml_parser/ast.mjs +0 -167
- package/esm2022/src/ml_parser/defaults.mjs +0 -24
- package/esm2022/src/ml_parser/entities.mjs +0 -2144
- package/esm2022/src/ml_parser/html_parser.mjs +0 -18
- package/esm2022/src/ml_parser/html_tags.mjs +0 -156
- package/esm2022/src/ml_parser/html_whitespaces.mjs +0 -107
- package/esm2022/src/ml_parser/icu_ast_expander.mjs +0 -125
- package/esm2022/src/ml_parser/lexer.mjs +0 -1210
- package/esm2022/src/ml_parser/parser.mjs +0 -539
- package/esm2022/src/ml_parser/tags.mjs +0 -47
- package/esm2022/src/ml_parser/tokens.mjs +0 -9
- package/esm2022/src/ml_parser/xml_parser.mjs +0 -19
- package/esm2022/src/ml_parser/xml_tags.mjs +0 -32
- package/esm2022/src/output/abstract_emitter.mjs +0 -524
- package/esm2022/src/output/abstract_js_emitter.mjs +0 -130
- package/esm2022/src/output/map_util.mjs +0 -19
- package/esm2022/src/output/output_ast.mjs +0 -1301
- package/esm2022/src/output/output_jit.mjs +0 -138
- package/esm2022/src/output/output_jit_trusted_types.mjs +0 -100
- package/esm2022/src/output/source_map.mjs +0 -150
- package/esm2022/src/parse_util.mjs +0 -198
- package/esm2022/src/render3/partial/api.mjs +0 -9
- package/esm2022/src/render3/partial/class_metadata.mjs +0 -52
- package/esm2022/src/render3/partial/component.mjs +0 -197
- package/esm2022/src/render3/partial/directive.mjs +0 -264
- package/esm2022/src/render3/partial/factory.mjs +0 -35
- package/esm2022/src/render3/partial/injectable.mjs +0 -67
- package/esm2022/src/render3/partial/injector.mjs +0 -41
- package/esm2022/src/render3/partial/ng_module.mjs +0 -63
- package/esm2022/src/render3/partial/pipe.mjs +0 -50
- package/esm2022/src/render3/partial/util.mjs +0 -79
- package/esm2022/src/render3/r3_ast.mjs +0 -493
- package/esm2022/src/render3/r3_class_debug_info_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_class_metadata_compiler.mjs +0 -92
- package/esm2022/src/render3/r3_control_flow.mjs +0 -421
- package/esm2022/src/render3/r3_deferred_blocks.mjs +0 -170
- package/esm2022/src/render3/r3_deferred_triggers.mjs +0 -316
- package/esm2022/src/render3/r3_factory.mjs +0 -200
- package/esm2022/src/render3/r3_identifiers.mjs +0 -480
- package/esm2022/src/render3/r3_injector_compiler.mjs +0 -28
- package/esm2022/src/render3/r3_jit.mjs +0 -29
- package/esm2022/src/render3/r3_module_compiler.mjs +0 -211
- package/esm2022/src/render3/r3_pipe_compiler.mjs +0 -35
- package/esm2022/src/render3/r3_template_transform.mjs +0 -560
- package/esm2022/src/render3/util.mjs +0 -90
- package/esm2022/src/render3/view/api.mjs +0 -14
- package/esm2022/src/render3/view/compiler.mjs +0 -546
- package/esm2022/src/render3/view/i18n/get_msg_utils.mjs +0 -113
- package/esm2022/src/render3/view/i18n/icu_serializer.mjs +0 -43
- package/esm2022/src/render3/view/i18n/localize_utils.mjs +0 -118
- package/esm2022/src/render3/view/i18n/meta.mjs +0 -259
- package/esm2022/src/render3/view/i18n/util.mjs +0 -70
- package/esm2022/src/render3/view/query_generation.mjs +0 -182
- package/esm2022/src/render3/view/t2_api.mjs +0 -9
- package/esm2022/src/render3/view/t2_binder.mjs +0 -823
- package/esm2022/src/render3/view/template.mjs +0 -113
- package/esm2022/src/render3/view/util.mjs +0 -192
- package/esm2022/src/resource_loader.mjs +0 -17
- package/esm2022/src/schema/dom_element_schema_registry.mjs +0 -471
- package/esm2022/src/schema/dom_security_schema.mjs +0 -96
- package/esm2022/src/schema/element_schema_registry.mjs +0 -10
- package/esm2022/src/schema/trusted_types_sinks.mjs +0 -41
- package/esm2022/src/selector.mjs +0 -400
- package/esm2022/src/shadow_css.mjs +0 -1053
- package/esm2022/src/style_url_resolver.mjs +0 -17
- package/esm2022/src/template/pipeline/ir/index.mjs +0 -18
- package/esm2022/src/template/pipeline/ir/src/enums.mjs +0 -503
- package/esm2022/src/template/pipeline/ir/src/expression.mjs +0 -997
- package/esm2022/src/template/pipeline/ir/src/handle.mjs +0 -13
- package/esm2022/src/template/pipeline/ir/src/operations.mjs +0 -261
- package/esm2022/src/template/pipeline/ir/src/ops/create.mjs +0 -405
- package/esm2022/src/template/pipeline/ir/src/ops/host.mjs +0 -25
- package/esm2022/src/template/pipeline/ir/src/ops/shared.mjs +0 -43
- package/esm2022/src/template/pipeline/ir/src/ops/update.mjs +0 -277
- package/esm2022/src/template/pipeline/ir/src/traits.mjs +0 -64
- package/esm2022/src/template/pipeline/ir/src/variable.mjs +0 -13
- package/esm2022/src/template/pipeline/src/compilation.mjs +0 -194
- package/esm2022/src/template/pipeline/src/conversion.mjs +0 -64
- package/esm2022/src/template/pipeline/src/emit.mjs +0 -238
- package/esm2022/src/template/pipeline/src/ingest.mjs +0 -1058
- package/esm2022/src/template/pipeline/src/instruction.mjs +0 -564
- package/esm2022/src/template/pipeline/src/phases/any_cast.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/apply_i18n_expressions.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/assign_i18n_slot_dependencies.mjs +0 -63
- package/esm2022/src/template/pipeline/src/phases/attribute_extraction.mjs +0 -138
- package/esm2022/src/template/pipeline/src/phases/binding_specialization.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/chaining.mjs +0 -112
- package/esm2022/src/template/pipeline/src/phases/collapse_singleton_interpolations.mjs +0 -32
- package/esm2022/src/template/pipeline/src/phases/conditionals.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/const_collection.mjs +0 -214
- package/esm2022/src/template/pipeline/src/phases/convert_i18n_bindings.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/create_i18n_contexts.mjs +0 -105
- package/esm2022/src/template/pipeline/src/phases/deduplicate_text_bindings.mjs +0 -40
- package/esm2022/src/template/pipeline/src/phases/defer_configs.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/defer_resolve_targets.mjs +0 -113
- package/esm2022/src/template/pipeline/src/phases/empty_elements.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/expand_safe_reads.mjs +0 -192
- package/esm2022/src/template/pipeline/src/phases/extract_i18n_messages.mjs +0 -218
- package/esm2022/src/template/pipeline/src/phases/generate_advance.mjs +0 -66
- package/esm2022/src/template/pipeline/src/phases/generate_local_let_references.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/generate_projection_def.mjs +0 -46
- package/esm2022/src/template/pipeline/src/phases/generate_variables.mjs +0 -170
- package/esm2022/src/template/pipeline/src/phases/has_const_expression_collection.mjs +0 -28
- package/esm2022/src/template/pipeline/src/phases/host_style_property_parsing.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/i18n_const_collection.mjs +0 -309
- package/esm2022/src/template/pipeline/src/phases/i18n_text_extraction.mjs +0 -97
- package/esm2022/src/template/pipeline/src/phases/local_refs.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/namespace.mjs +0 -26
- package/esm2022/src/template/pipeline/src/phases/naming.mjs +0 -179
- package/esm2022/src/template/pipeline/src/phases/next_context_merging.mjs +0 -75
- package/esm2022/src/template/pipeline/src/phases/ng_container.mjs +0 -29
- package/esm2022/src/template/pipeline/src/phases/nonbindable.mjs +0 -47
- package/esm2022/src/template/pipeline/src/phases/nullish_coalescing.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/ordering.mjs +0 -140
- package/esm2022/src/template/pipeline/src/phases/parse_extracted_styles.mjs +0 -137
- package/esm2022/src/template/pipeline/src/phases/phase_remove_content_selectors.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/pipe_creation.mjs +0 -74
- package/esm2022/src/template/pipeline/src/phases/pipe_variadic.mjs +0 -30
- package/esm2022/src/template/pipeline/src/phases/propagate_i18n_blocks.mjs +0 -81
- package/esm2022/src/template/pipeline/src/phases/pure_function_extraction.mjs +0 -55
- package/esm2022/src/template/pipeline/src/phases/pure_literal_structures.mjs +0 -58
- package/esm2022/src/template/pipeline/src/phases/reify.mjs +0 -433
- package/esm2022/src/template/pipeline/src/phases/remove_empty_bindings.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/remove_i18n_contexts.mjs +0 -27
- package/esm2022/src/template/pipeline/src/phases/remove_illegal_let_references.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/remove_unused_i18n_attrs.mjs +0 -33
- package/esm2022/src/template/pipeline/src/phases/resolve_contexts.mjs +0 -60
- package/esm2022/src/template/pipeline/src/phases/resolve_defer_deps_fns.mjs +0 -31
- package/esm2022/src/template/pipeline/src/phases/resolve_dollar_event.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_element_placeholders.mjs +0 -266
- package/esm2022/src/template/pipeline/src/phases/resolve_i18n_expression_placeholders.mjs +0 -70
- package/esm2022/src/template/pipeline/src/phases/resolve_names.mjs +0 -124
- package/esm2022/src/template/pipeline/src/phases/resolve_sanitizers.mjs +0 -123
- package/esm2022/src/template/pipeline/src/phases/save_restore_view.mjs +0 -64
- package/esm2022/src/template/pipeline/src/phases/slot_allocation.mjs +0 -62
- package/esm2022/src/template/pipeline/src/phases/store_let_optimization.mjs +0 -35
- package/esm2022/src/template/pipeline/src/phases/style_binding_specialization.mjs +0 -42
- package/esm2022/src/template/pipeline/src/phases/temporary_variables.mjs +0 -87
- package/esm2022/src/template/pipeline/src/phases/track_fn_generation.mjs +0 -52
- package/esm2022/src/template/pipeline/src/phases/track_fn_optimization.mjs +0 -88
- package/esm2022/src/template/pipeline/src/phases/track_variables.mjs +0 -36
- package/esm2022/src/template/pipeline/src/phases/transform_two_way_binding_set.mjs +0 -43
- package/esm2022/src/template/pipeline/src/phases/var_counting.mjs +0 -155
- package/esm2022/src/template/pipeline/src/phases/variable_optimization.mjs +0 -423
- package/esm2022/src/template/pipeline/src/phases/wrap_icus.mjs +0 -41
- package/esm2022/src/template/pipeline/src/util/elements.mjs +0 -29
- package/esm2022/src/template_parser/binding_parser.mjs +0 -465
- package/esm2022/src/template_parser/template_preparser.mjs +0 -84
- package/esm2022/src/util.mjs +0 -124
- package/esm2022/src/version.mjs +0 -15
|
@@ -1,113 +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 ir from '../../ir';
|
|
9
|
-
/**
|
|
10
|
-
* Some `defer` conditions can reference other elements in the template, using their local reference
|
|
11
|
-
* names. However, the semantics are quite different from the normal local reference system: in
|
|
12
|
-
* particular, we need to look at local reference names in enclosing views. This phase resolves
|
|
13
|
-
* all such references to actual xrefs.
|
|
14
|
-
*/
|
|
15
|
-
export function resolveDeferTargetNames(job) {
|
|
16
|
-
const scopes = new Map();
|
|
17
|
-
function getScopeForView(view) {
|
|
18
|
-
if (scopes.has(view.xref)) {
|
|
19
|
-
return scopes.get(view.xref);
|
|
20
|
-
}
|
|
21
|
-
const scope = new Scope();
|
|
22
|
-
for (const op of view.create) {
|
|
23
|
-
// add everything that can be referenced.
|
|
24
|
-
if (!ir.isElementOrContainerOp(op) || op.localRefs === null) {
|
|
25
|
-
continue;
|
|
26
|
-
}
|
|
27
|
-
if (!Array.isArray(op.localRefs)) {
|
|
28
|
-
throw new Error('LocalRefs were already processed, but were needed to resolve defer targets.');
|
|
29
|
-
}
|
|
30
|
-
for (const ref of op.localRefs) {
|
|
31
|
-
if (ref.target !== '') {
|
|
32
|
-
continue;
|
|
33
|
-
}
|
|
34
|
-
scope.targets.set(ref.name, { xref: op.xref, slot: op.handle });
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
scopes.set(view.xref, scope);
|
|
38
|
-
return scope;
|
|
39
|
-
}
|
|
40
|
-
function resolveTrigger(deferOwnerView, op, placeholderView) {
|
|
41
|
-
switch (op.trigger.kind) {
|
|
42
|
-
case ir.DeferTriggerKind.Idle:
|
|
43
|
-
case ir.DeferTriggerKind.Immediate:
|
|
44
|
-
case ir.DeferTriggerKind.Timer:
|
|
45
|
-
return;
|
|
46
|
-
case ir.DeferTriggerKind.Hover:
|
|
47
|
-
case ir.DeferTriggerKind.Interaction:
|
|
48
|
-
case ir.DeferTriggerKind.Viewport:
|
|
49
|
-
if (op.trigger.targetName === null) {
|
|
50
|
-
// A `null` target name indicates we should default to the first element in the
|
|
51
|
-
// placeholder block.
|
|
52
|
-
if (placeholderView === null) {
|
|
53
|
-
throw new Error('defer on trigger with no target name must have a placeholder block');
|
|
54
|
-
}
|
|
55
|
-
const placeholder = job.views.get(placeholderView);
|
|
56
|
-
if (placeholder == undefined) {
|
|
57
|
-
throw new Error('AssertionError: could not find placeholder view for defer on trigger');
|
|
58
|
-
}
|
|
59
|
-
for (const placeholderOp of placeholder.create) {
|
|
60
|
-
if (ir.hasConsumesSlotTrait(placeholderOp) &&
|
|
61
|
-
(ir.isElementOrContainerOp(placeholderOp) ||
|
|
62
|
-
placeholderOp.kind === ir.OpKind.Projection)) {
|
|
63
|
-
op.trigger.targetXref = placeholderOp.xref;
|
|
64
|
-
op.trigger.targetView = placeholderView;
|
|
65
|
-
op.trigger.targetSlotViewSteps = -1;
|
|
66
|
-
op.trigger.targetSlot = placeholderOp.handle;
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
}
|
|
70
|
-
return;
|
|
71
|
-
}
|
|
72
|
-
let view = placeholderView !== null ? job.views.get(placeholderView) : deferOwnerView;
|
|
73
|
-
let step = placeholderView !== null ? -1 : 0;
|
|
74
|
-
while (view !== null) {
|
|
75
|
-
const scope = getScopeForView(view);
|
|
76
|
-
if (scope.targets.has(op.trigger.targetName)) {
|
|
77
|
-
const { xref, slot } = scope.targets.get(op.trigger.targetName);
|
|
78
|
-
op.trigger.targetXref = xref;
|
|
79
|
-
op.trigger.targetView = view.xref;
|
|
80
|
-
op.trigger.targetSlotViewSteps = step;
|
|
81
|
-
op.trigger.targetSlot = slot;
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
view = view.parent !== null ? job.views.get(view.parent) : null;
|
|
85
|
-
step++;
|
|
86
|
-
}
|
|
87
|
-
break;
|
|
88
|
-
default:
|
|
89
|
-
throw new Error(`Trigger kind ${op.trigger.kind} not handled`);
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
// Find the defer ops, and assign the data about their targets.
|
|
93
|
-
for (const unit of job.units) {
|
|
94
|
-
const defers = new Map();
|
|
95
|
-
for (const op of unit.create) {
|
|
96
|
-
switch (op.kind) {
|
|
97
|
-
case ir.OpKind.Defer:
|
|
98
|
-
defers.set(op.xref, op);
|
|
99
|
-
break;
|
|
100
|
-
case ir.OpKind.DeferOn:
|
|
101
|
-
const deferOp = defers.get(op.defer);
|
|
102
|
-
resolveTrigger(unit, op, deferOp.placeholderView);
|
|
103
|
-
break;
|
|
104
|
-
}
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
class Scope {
|
|
109
|
-
constructor() {
|
|
110
|
-
this.targets = new Map();
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmZXJfcmVzb2x2ZV90YXJnZXRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29tcGlsZXIvc3JjL3RlbXBsYXRlL3BpcGVsaW5lL3NyYy9waGFzZXMvZGVmZXJfcmVzb2x2ZV90YXJnZXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBRy9COzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEdBQTRCO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLElBQUksR0FBRyxFQUFvQixDQUFDO0lBRTNDLFNBQVMsZUFBZSxDQUFDLElBQXlCO1FBQ2hELElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUMxQixPQUFPLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBRSxDQUFDO1FBQ2hDLENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssRUFBRSxDQUFDO1FBQzFCLEtBQUssTUFBTSxFQUFFLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQzdCLHlDQUF5QztZQUN6QyxJQUFJLENBQUMsRUFBRSxDQUFDLHNCQUFzQixDQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzVELFNBQVM7WUFDWCxDQUFDO1lBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7Z0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQ2IsNkVBQTZFLENBQzlFLENBQUM7WUFDSixDQUFDO1lBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQy9CLElBQUksR0FB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RSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztvQkFDeEIsTUFBTTtnQkFDUixLQUFLLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTztvQkFDcEIsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFFLENBQUM7b0JBQ3RDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDbEQsTUFBTTtZQUNWLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLEtBQUs7SUFBWDtRQUNFLFlBQU8sR0FBRyxJQUFJLEdBQUcsRUFBa0QsQ0FBQztJQUN0RSxDQUFDO0NBQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHR5cGUge0NvbXBvbmVudENvbXBpbGF0aW9uSm9iLCBWaWV3Q29tcGlsYXRpb25Vbml0fSBmcm9tICcuLi9jb21waWxhdGlvbic7XG5cbi8qKlxuICogU29tZSBgZGVmZXJgIGNvbmRpdGlvbnMgY2FuIHJlZmVyZW5jZSBvdGhlciBlbGVtZW50cyBpbiB0aGUgdGVtcGxhdGUsIHVzaW5nIHRoZWlyIGxvY2FsIHJlZmVyZW5jZVxuICogbmFtZXMuIEhvd2V2ZXIsIHRoZSBzZW1hbnRpY3MgYXJlIHF1aXRlIGRpZmZlcmVudCBmcm9tIHRoZSBub3JtYWwgbG9jYWwgcmVmZXJlbmNlIHN5c3RlbTogaW5cbiAqIHBhcnRpY3VsYXIsIHdlIG5lZWQgdG8gbG9vayBhdCBsb2NhbCByZWZlcmVuY2UgbmFtZXMgaW4gZW5jbG9zaW5nIHZpZXdzLiBUaGlzIHBoYXNlIHJlc29sdmVzXG4gKiBhbGwgc3VjaCByZWZlcmVuY2VzIHRvIGFjdHVhbCB4cmVmcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVEZWZlclRhcmdldE5hbWVzKGpvYjogQ29tcG9uZW50Q29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgY29uc3Qgc2NvcGVzID0gbmV3IE1hcDxpci5YcmVmSWQsIFNjb3BlPigpO1xuXG4gIGZ1bmN0aW9uIGdldFNjb3BlRm9yVmlldyh2aWV3OiBWaWV3Q29tcGlsYXRpb25Vbml0KTogU2NvcGUge1xuICAgIGlmIChzY29wZXMuaGFzKHZpZXcueHJlZikpIHtcbiAgICAgIHJldHVybiBzY29wZXMuZ2V0KHZpZXcueHJlZikhO1xuICAgIH1cblxuICAgIGNvbnN0IHNjb3BlID0gbmV3IFNjb3BlKCk7XG4gICAgZm9yIChjb25zdCBvcCBvZiB2aWV3LmNyZWF0ZSkge1xuICAgICAgLy8gYWRkIGV2ZXJ5dGhpbmcgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZC5cbiAgICAgIGlmICghaXIuaXNFbGVtZW50T3JDb250YWluZXJPcChvcCkgfHwgb3AubG9jYWxSZWZzID09PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG9wLmxvY2FsUmVmcykpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdMb2NhbFJlZnMgd2VyZSBhbHJlYWR5IHByb2Nlc3NlZCwgYnV0IHdlcmUgbmVlZGVkIHRvIHJlc29sdmUgZGVmZXIgdGFyZ2V0cy4nLFxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBmb3IgKGNvbnN0IHJlZiBvZiBvcC5sb2NhbFJlZnMpIHtcbiAgICAgICAgaWYgKHJlZi50YXJnZXQgIT09ICcnKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgc2NvcGUudGFyZ2V0cy5zZXQocmVmLm5hbWUsIHt4cmVmOiBvcC54cmVmLCBzbG90OiBvcC5oYW5kbGV9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzY29wZXMuc2V0KHZpZXcueHJlZiwgc2NvcGUpO1xuICAgIHJldHVybiBzY29wZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlc29sdmVUcmlnZ2VyKFxuICAgIGRlZmVyT3duZXJWaWV3OiBWaWV3Q29tcGlsYXRpb25Vbml0LFxuICAgIG9wOiBpci5EZWZlck9uT3AsXG4gICAgcGxhY2Vob2xkZXJWaWV3OiBpci5YcmVmSWQgfCBudWxsLFxuICApOiB2b2lkIHtcbiAgICBzd2l0Y2ggKG9wLnRyaWdnZXIua2luZCkge1xuICAgICAgY2FzZSBpci5EZWZlclRyaWdnZXJLaW5kLklkbGU6XG4gICAgICBjYXNlIGlyLkRlZmVyVHJpZ2dlcktpbmQuSW1tZWRpYXRlOlxuICAgICAgY2FzZSBpci5EZWZlclRyaWdnZXJLaW5kLlRpbWVyOlxuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlIGlyLkRlZmVyVHJpZ2dlcktpbmQuSG92ZXI6XG4gICAgICBjYXNlIGlyLkRlZmVyVHJpZ2dlcktpbmQuSW50ZXJhY3Rpb246XG4gICAgICBjYXNlIGlyLkRlZmVyVHJpZ2dlcktpbmQuVmlld3BvcnQ6XG4gICAgICAgIGlmIChvcC50cmlnZ2VyLnRhcmdldE5hbWUgPT09IG51bGwpIHtcbiAgICAgICAgICAvLyBBIGBudWxsYCB0YXJnZXQgbmFtZSBpbmRpY2F0ZXMgd2Ugc2hvdWxkIGRlZmF1bHQgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlXG4gICAgICAgICAgLy8gcGxhY2Vob2xkZXIgYmxvY2suXG4gICAgICAgICAgaWYgKHBsYWNlaG9sZGVyVmlldyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdkZWZlciBvbiB0cmlnZ2VyIHdpdGggbm8gdGFyZ2V0IG5hbWUgbXVzdCBoYXZlIGEgcGxhY2Vob2xkZXIgYmxvY2snKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSBqb2Iudmlld3MuZ2V0KHBsYWNlaG9sZGVyVmlldyk7XG4gICAgICAgICAgaWYgKHBsYWNlaG9sZGVyID09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBc3NlcnRpb25FcnJvcjogY291bGQgbm90IGZpbmQgcGxhY2Vob2xkZXIgdmlldyBmb3IgZGVmZXIgb24gdHJpZ2dlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHBsYWNlaG9sZGVyT3Agb2YgcGxhY2Vob2xkZXIuY3JlYXRlKSB7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGlyLmhhc0NvbnN1bWVzU2xvdFRyYWl0KHBsYWNlaG9sZGVyT3ApICYmXG4gICAgICAgICAgICAgIChpci5pc0VsZW1lbnRPckNvbnRhaW5lck9wKHBsYWNlaG9sZGVyT3ApIHx8XG4gICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJPcC5raW5kID09PSBpci5PcEtpbmQuUHJvamVjdGlvbilcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBvcC50cmlnZ2VyLnRhcmdldFhyZWYgPSBwbGFjZWhvbGRlck9wLnhyZWY7XG4gICAgICAgICAgICAgIG9wLnRyaWdnZXIudGFyZ2V0VmlldyA9IHBsYWNlaG9sZGVyVmlldztcbiAgICAgICAgICAgICAgb3AudHJpZ2dlci50YXJnZXRTbG90Vmlld1N0ZXBzID0gLTE7XG4gICAgICAgICAgICAgIG9wLnRyaWdnZXIudGFyZ2V0U2xvdCA9IHBsYWNlaG9sZGVyT3AuaGFuZGxlO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgdmlldzogVmlld0NvbXBpbGF0aW9uVW5pdCB8IG51bGwgPVxuICAgICAgICAgIHBsYWNlaG9sZGVyVmlldyAhPT0gbnVsbCA/IGpvYi52aWV3cy5nZXQocGxhY2Vob2xkZXJWaWV3KSEgOiBkZWZlck93bmVyVmlldztcbiAgICAgICAgbGV0IHN0ZXAgPSBwbGFjZWhvbGRlclZpZXcgIT09IG51bGwgPyAtMSA6IDA7XG5cbiAgICAgICAgd2hpbGUgKHZpZXcgIT09IG51bGwpIHtcbiAgICAgICAgICBjb25zdCBzY29wZSA9IGdldFNjb3BlRm9yVmlldyh2aWV3KTtcbiAgICAgICAgICBpZiAoc2NvcGUudGFyZ2V0cy5oYXMob3AudHJpZ2dlci50YXJnZXROYW1lKSkge1xuICAgICAgICAgICAgY29uc3Qge3hyZWYsIHNsb3R9ID0gc2NvcGUudGFyZ2V0cy5nZXQob3AudHJpZ2dlci50YXJnZXROYW1lKSE7XG5cbiAgICAgICAgICAgIG9wLnRyaWdnZXIudGFyZ2V0WHJlZiA9IHhyZWY7XG4gICAgICAgICAgICBvcC50cmlnZ2VyLnRhcmdldFZpZXcgPSB2aWV3LnhyZWY7XG4gICAgICAgICAgICBvcC50cmlnZ2VyLnRhcmdldFNsb3RWaWV3U3RlcHMgPSBzdGVwO1xuICAgICAgICAgICAgb3AudHJpZ2dlci50YXJnZXRTbG90ID0gc2xvdDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2aWV3ID0gdmlldy5wYXJlbnQgIT09IG51bGwgPyBqb2Iudmlld3MuZ2V0KHZpZXcucGFyZW50KSEgOiBudWxsO1xuICAgICAgICAgIHN0ZXArKztcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZ2dlciBraW5kICR7KG9wLnRyaWdnZXIgYXMgYW55KS5raW5kfSBub3QgaGFuZGxlZGApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmQgdGhlIGRlZmVyIG9wcywgYW5kIGFzc2lnbiB0aGUgZGF0YSBhYm91dCB0aGVpciB0YXJnZXRzLlxuICBmb3IgKGNvbnN0IHVuaXQgb2Ygam9iLnVuaXRzKSB7XG4gICAgY29uc3QgZGVmZXJzID0gbmV3IE1hcDxpci5YcmVmSWQsIGlyLkRlZmVyT3A+KCk7XG4gICAgZm9yIChjb25zdCBvcCBvZiB1bml0LmNyZWF0ZSkge1xuICAgICAgc3dpdGNoIChvcC5raW5kKSB7XG4gICAgICAgIGNhc2UgaXIuT3BLaW5kLkRlZmVyOlxuICAgICAgICAgIGRlZmVycy5zZXQob3AueHJlZiwgb3ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIGlyLk9wS2luZC5EZWZlck9uOlxuICAgICAgICAgIGNvbnN0IGRlZmVyT3AgPSBkZWZlcnMuZ2V0KG9wLmRlZmVyKSE7XG4gICAgICAgICAgcmVzb2x2ZVRyaWdnZXIodW5pdCwgb3AsIGRlZmVyT3AucGxhY2Vob2xkZXJWaWV3KTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgU2NvcGUge1xuICB0YXJnZXRzID0gbmV3IE1hcDxzdHJpbmcsIHt4cmVmOiBpci5YcmVmSWQ7IHNsb3Q6IGlyLlNsb3RIYW5kbGV9PigpO1xufVxuIl19
|
|
@@ -1,47 +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 ir from '../../ir';
|
|
9
|
-
const REPLACEMENTS = new Map([
|
|
10
|
-
[ir.OpKind.ElementEnd, [ir.OpKind.ElementStart, ir.OpKind.Element]],
|
|
11
|
-
[ir.OpKind.ContainerEnd, [ir.OpKind.ContainerStart, ir.OpKind.Container]],
|
|
12
|
-
[ir.OpKind.I18nEnd, [ir.OpKind.I18nStart, ir.OpKind.I18n]],
|
|
13
|
-
]);
|
|
14
|
-
/**
|
|
15
|
-
* Op kinds that should not prevent merging of start/end ops.
|
|
16
|
-
*/
|
|
17
|
-
const IGNORED_OP_KINDS = new Set([ir.OpKind.Pipe]);
|
|
18
|
-
/**
|
|
19
|
-
* Replace sequences of mergable instructions (e.g. `ElementStart` and `ElementEnd`) with a
|
|
20
|
-
* consolidated instruction (e.g. `Element`).
|
|
21
|
-
*/
|
|
22
|
-
export function collapseEmptyInstructions(job) {
|
|
23
|
-
for (const unit of job.units) {
|
|
24
|
-
for (const op of unit.create) {
|
|
25
|
-
// Find end ops that may be able to be merged.
|
|
26
|
-
const opReplacements = REPLACEMENTS.get(op.kind);
|
|
27
|
-
if (opReplacements === undefined) {
|
|
28
|
-
continue;
|
|
29
|
-
}
|
|
30
|
-
const [startKind, mergedKind] = opReplacements;
|
|
31
|
-
// Locate the previous (non-ignored) op.
|
|
32
|
-
let prevOp = op.prev;
|
|
33
|
-
while (prevOp !== null && IGNORED_OP_KINDS.has(prevOp.kind)) {
|
|
34
|
-
prevOp = prevOp.prev;
|
|
35
|
-
}
|
|
36
|
-
// If the previous op is the corresponding start op, we can megre.
|
|
37
|
-
if (prevOp !== null && prevOp.kind === startKind) {
|
|
38
|
-
// Transmute the start instruction to the merged version. This is safe as they're designed
|
|
39
|
-
// to be identical apart from the `kind`.
|
|
40
|
-
prevOp.kind = mergedKind;
|
|
41
|
-
// Remove the end instruction.
|
|
42
|
-
ir.OpList.remove(op);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1wdHlfZWxlbWVudHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9lbXB0eV9lbGVtZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUcvQixNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBb0M7SUFDOUQsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbkUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDekUsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7Q0FDM0QsQ0FBQyxDQUFDO0FBRUg7O0dBRUc7QUFDSCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0FBRW5EOzs7R0FHRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxHQUFtQjtJQUMzRCxLQUFLLE1BQU0sSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUM3QixLQUFLLE1BQU0sRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUM3Qiw4Q0FBOEM7WUFDOUMsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDakQsSUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pDLFNBQVM7WUFDWCxDQUFDO1lBQ0QsTUFBTSxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsR0FBRyxjQUFjLENBQUM7WUFFL0Msd0NBQXdDO1lBQ3hDLElBQUksTUFBTSxHQUF1QixFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3pDLE9BQU8sTUFBTSxLQUFLLElBQUksSUFBSSxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7Z0JBQzVELE1BQU0sR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ3ZCLENBQUM7WUFFRCxrRUFBa0U7WUFDbEUsSUFBSSxNQUFNLEtBQUssSUFBSSxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUyxFQUFFLENBQUM7Z0JBQ2pELDBGQUEwRjtnQkFDMUYseUNBQXlDO2dCQUN4QyxNQUE2QixDQUFDLElBQUksR0FBRyxVQUFVLENBQUM7Z0JBRWpELDhCQUE4QjtnQkFDOUIsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQWMsRUFBRSxDQUFDLENBQUM7WUFDcEMsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2VcbiAqL1xuXG5pbXBvcnQgKiBhcyBpciBmcm9tICcuLi8uLi9pcic7XG5pbXBvcnQgdHlwZSB7Q29tcGlsYXRpb25Kb2J9IGZyb20gJy4uL2NvbXBpbGF0aW9uJztcblxuY29uc3QgUkVQTEFDRU1FTlRTID0gbmV3IE1hcDxpci5PcEtpbmQsIFtpci5PcEtpbmQsIGlyLk9wS2luZF0+KFtcbiAgW2lyLk9wS2luZC5FbGVtZW50RW5kLCBbaXIuT3BLaW5kLkVsZW1lbnRTdGFydCwgaXIuT3BLaW5kLkVsZW1lbnRdXSxcbiAgW2lyLk9wS2luZC5Db250YWluZXJFbmQsIFtpci5PcEtpbmQuQ29udGFpbmVyU3RhcnQsIGlyLk9wS2luZC5Db250YWluZXJdXSxcbiAgW2lyLk9wS2luZC5JMThuRW5kLCBbaXIuT3BLaW5kLkkxOG5TdGFydCwgaXIuT3BLaW5kLkkxOG5dXSxcbl0pO1xuXG4vKipcbiAqIE9wIGtpbmRzIHRoYXQgc2hvdWxkIG5vdCBwcmV2ZW50IG1lcmdpbmcgb2Ygc3RhcnQvZW5kIG9wcy5cbiAqL1xuY29uc3QgSUdOT1JFRF9PUF9LSU5EUyA9IG5ldyBTZXQoW2lyLk9wS2luZC5QaXBlXSk7XG5cbi8qKlxuICogUmVwbGFjZSBzZXF1ZW5jZXMgb2YgbWVyZ2FibGUgaW5zdHJ1Y3Rpb25zIChlLmcuIGBFbGVtZW50U3RhcnRgIGFuZCBgRWxlbWVudEVuZGApIHdpdGggYVxuICogY29uc29saWRhdGVkIGluc3RydWN0aW9uIChlLmcuIGBFbGVtZW50YCkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb2xsYXBzZUVtcHR5SW5zdHJ1Y3Rpb25zKGpvYjogQ29tcGlsYXRpb25Kb2IpOiB2b2lkIHtcbiAgZm9yIChjb25zdCB1bml0IG9mIGpvYi51bml0cykge1xuICAgIGZvciAoY29uc3Qgb3Agb2YgdW5pdC5jcmVhdGUpIHtcbiAgICAgIC8vIEZpbmQgZW5kIG9wcyB0aGF0IG1heSBiZSBhYmxlIHRvIGJlIG1lcmdlZC5cbiAgICAgIGNvbnN0IG9wUmVwbGFjZW1lbnRzID0gUkVQTEFDRU1FTlRTLmdldChvcC5raW5kKTtcbiAgICAgIGlmIChvcFJlcGxhY2VtZW50cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgW3N0YXJ0S2luZCwgbWVyZ2VkS2luZF0gPSBvcFJlcGxhY2VtZW50cztcblxuICAgICAgLy8gTG9jYXRlIHRoZSBwcmV2aW91cyAobm9uLWlnbm9yZWQpIG9wLlxuICAgICAgbGV0IHByZXZPcDogaXIuQ3JlYXRlT3AgfCBudWxsID0gb3AucHJldjtcbiAgICAgIHdoaWxlIChwcmV2T3AgIT09IG51bGwgJiYgSUdOT1JFRF9PUF9LSU5EUy5oYXMocHJldk9wLmtpbmQpKSB7XG4gICAgICAgIHByZXZPcCA9IHByZXZPcC5wcmV2O1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGUgcHJldmlvdXMgb3AgaXMgdGhlIGNvcnJlc3BvbmRpbmcgc3RhcnQgb3AsIHdlIGNhbiBtZWdyZS5cbiAgICAgIGlmIChwcmV2T3AgIT09IG51bGwgJiYgcHJldk9wLmtpbmQgPT09IHN0YXJ0S2luZCkge1xuICAgICAgICAvLyBUcmFuc211dGUgdGhlIHN0YXJ0IGluc3RydWN0aW9uIHRvIHRoZSBtZXJnZWQgdmVyc2lvbi4gVGhpcyBpcyBzYWZlIGFzIHRoZXkncmUgZGVzaWduZWRcbiAgICAgICAgLy8gdG8gYmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIGBraW5kYC5cbiAgICAgICAgKHByZXZPcCBhcyBpci5PcDxpci5DcmVhdGVPcD4pLmtpbmQgPSBtZXJnZWRLaW5kO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGUgZW5kIGluc3RydWN0aW9uLlxuICAgICAgICBpci5PcExpc3QucmVtb3ZlPGlyLkNyZWF0ZU9wPihvcCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -1,192 +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 o from '../../../../output/output_ast';
|
|
9
|
-
import * as ir from '../../ir';
|
|
10
|
-
/**
|
|
11
|
-
* Safe read expressions such as `a?.b` have different semantics in Angular templates as
|
|
12
|
-
* compared to JavaScript. In particular, they default to `null` instead of `undefined`. This phase
|
|
13
|
-
* finds all unresolved safe read expressions, and converts them into the appropriate output AST
|
|
14
|
-
* reads, guarded by null checks. We generate temporaries as needed, to avoid re-evaluating the same
|
|
15
|
-
* sub-expression multiple times.
|
|
16
|
-
*/
|
|
17
|
-
export function expandSafeReads(job) {
|
|
18
|
-
for (const unit of job.units) {
|
|
19
|
-
for (const op of unit.ops()) {
|
|
20
|
-
ir.transformExpressionsInOp(op, (e) => safeTransform(e, { job }), ir.VisitorContextFlag.None);
|
|
21
|
-
ir.transformExpressionsInOp(op, ternaryTransform, ir.VisitorContextFlag.None);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
// A lookup set of all the expression kinds that require a temporary variable to be generated.
|
|
26
|
-
const requiresTemporary = [
|
|
27
|
-
o.InvokeFunctionExpr,
|
|
28
|
-
o.LiteralArrayExpr,
|
|
29
|
-
o.LiteralMapExpr,
|
|
30
|
-
ir.SafeInvokeFunctionExpr,
|
|
31
|
-
ir.PipeBindingExpr,
|
|
32
|
-
].map((e) => e.constructor.name);
|
|
33
|
-
function needsTemporaryInSafeAccess(e) {
|
|
34
|
-
// TODO: We probably want to use an expression visitor to recursively visit all descendents.
|
|
35
|
-
// However, that would potentially do a lot of extra work (because it cannot short circuit), so we
|
|
36
|
-
// implement the logic ourselves for now.
|
|
37
|
-
if (e instanceof o.UnaryOperatorExpr) {
|
|
38
|
-
return needsTemporaryInSafeAccess(e.expr);
|
|
39
|
-
}
|
|
40
|
-
else if (e instanceof o.BinaryOperatorExpr) {
|
|
41
|
-
return needsTemporaryInSafeAccess(e.lhs) || needsTemporaryInSafeAccess(e.rhs);
|
|
42
|
-
}
|
|
43
|
-
else if (e instanceof o.ConditionalExpr) {
|
|
44
|
-
if (e.falseCase && needsTemporaryInSafeAccess(e.falseCase))
|
|
45
|
-
return true;
|
|
46
|
-
return needsTemporaryInSafeAccess(e.condition) || needsTemporaryInSafeAccess(e.trueCase);
|
|
47
|
-
}
|
|
48
|
-
else if (e instanceof o.NotExpr) {
|
|
49
|
-
return needsTemporaryInSafeAccess(e.condition);
|
|
50
|
-
}
|
|
51
|
-
else if (e instanceof ir.AssignTemporaryExpr) {
|
|
52
|
-
return needsTemporaryInSafeAccess(e.expr);
|
|
53
|
-
}
|
|
54
|
-
else if (e instanceof o.ReadPropExpr) {
|
|
55
|
-
return needsTemporaryInSafeAccess(e.receiver);
|
|
56
|
-
}
|
|
57
|
-
else if (e instanceof o.ReadKeyExpr) {
|
|
58
|
-
return needsTemporaryInSafeAccess(e.receiver) || needsTemporaryInSafeAccess(e.index);
|
|
59
|
-
}
|
|
60
|
-
// TODO: Switch to a method which is exhaustive of newly added expression subtypes.
|
|
61
|
-
return (e instanceof o.InvokeFunctionExpr ||
|
|
62
|
-
e instanceof o.LiteralArrayExpr ||
|
|
63
|
-
e instanceof o.LiteralMapExpr ||
|
|
64
|
-
e instanceof ir.SafeInvokeFunctionExpr ||
|
|
65
|
-
e instanceof ir.PipeBindingExpr);
|
|
66
|
-
}
|
|
67
|
-
function temporariesIn(e) {
|
|
68
|
-
const temporaries = new Set();
|
|
69
|
-
// TODO: Although it's not currently supported by the transform helper, we should be able to
|
|
70
|
-
// short-circuit exploring the tree to do less work. In particular, we don't have to penetrate
|
|
71
|
-
// into the subexpressions of temporary assignments.
|
|
72
|
-
ir.transformExpressionsInExpression(e, (e) => {
|
|
73
|
-
if (e instanceof ir.AssignTemporaryExpr) {
|
|
74
|
-
temporaries.add(e.xref);
|
|
75
|
-
}
|
|
76
|
-
return e;
|
|
77
|
-
}, ir.VisitorContextFlag.None);
|
|
78
|
-
return temporaries;
|
|
79
|
-
}
|
|
80
|
-
function eliminateTemporaryAssignments(e, tmps, ctx) {
|
|
81
|
-
// TODO: We can be more efficient than the transform helper here. We don't need to visit any
|
|
82
|
-
// descendents of temporary assignments.
|
|
83
|
-
ir.transformExpressionsInExpression(e, (e) => {
|
|
84
|
-
if (e instanceof ir.AssignTemporaryExpr && tmps.has(e.xref)) {
|
|
85
|
-
const read = new ir.ReadTemporaryExpr(e.xref);
|
|
86
|
-
// `TemplateDefinitionBuilder` has the (accidental?) behavior of generating assignments of
|
|
87
|
-
// temporary variables to themselves. This happens because some subexpression that the
|
|
88
|
-
// temporary refers to, possibly through nested temporaries, has a function call. We copy that
|
|
89
|
-
// behavior here.
|
|
90
|
-
return ctx.job.compatibility === ir.CompatibilityMode.TemplateDefinitionBuilder
|
|
91
|
-
? new ir.AssignTemporaryExpr(read, read.xref)
|
|
92
|
-
: read;
|
|
93
|
-
}
|
|
94
|
-
return e;
|
|
95
|
-
}, ir.VisitorContextFlag.None);
|
|
96
|
-
return e;
|
|
97
|
-
}
|
|
98
|
-
/**
|
|
99
|
-
* Creates a safe ternary guarded by the input expression, and with a body generated by the provided
|
|
100
|
-
* callback on the input expression. Generates a temporary variable assignment if needed, and
|
|
101
|
-
* deduplicates nested temporary assignments if needed.
|
|
102
|
-
*/
|
|
103
|
-
function safeTernaryWithTemporary(guard, body, ctx) {
|
|
104
|
-
let result;
|
|
105
|
-
if (needsTemporaryInSafeAccess(guard)) {
|
|
106
|
-
const xref = ctx.job.allocateXrefId();
|
|
107
|
-
result = [new ir.AssignTemporaryExpr(guard, xref), new ir.ReadTemporaryExpr(xref)];
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
result = [guard, guard.clone()];
|
|
111
|
-
// Consider an expression like `a?.[b?.c()]?.d`. The `b?.c()` will be transformed first,
|
|
112
|
-
// introducing a temporary assignment into the key. Then, as part of expanding the `?.d`. That
|
|
113
|
-
// assignment will be duplicated into both the guard and expression sides. We de-duplicate it,
|
|
114
|
-
// by transforming it from an assignment into a read on the expression side.
|
|
115
|
-
eliminateTemporaryAssignments(result[1], temporariesIn(result[0]), ctx);
|
|
116
|
-
}
|
|
117
|
-
return new ir.SafeTernaryExpr(result[0], body(result[1]));
|
|
118
|
-
}
|
|
119
|
-
function isSafeAccessExpression(e) {
|
|
120
|
-
return (e instanceof ir.SafePropertyReadExpr ||
|
|
121
|
-
e instanceof ir.SafeKeyedReadExpr ||
|
|
122
|
-
e instanceof ir.SafeInvokeFunctionExpr);
|
|
123
|
-
}
|
|
124
|
-
function isUnsafeAccessExpression(e) {
|
|
125
|
-
return (e instanceof o.ReadPropExpr || e instanceof o.ReadKeyExpr || e instanceof o.InvokeFunctionExpr);
|
|
126
|
-
}
|
|
127
|
-
function isAccessExpression(e) {
|
|
128
|
-
return isSafeAccessExpression(e) || isUnsafeAccessExpression(e);
|
|
129
|
-
}
|
|
130
|
-
function deepestSafeTernary(e) {
|
|
131
|
-
if (isAccessExpression(e) && e.receiver instanceof ir.SafeTernaryExpr) {
|
|
132
|
-
let st = e.receiver;
|
|
133
|
-
while (st.expr instanceof ir.SafeTernaryExpr) {
|
|
134
|
-
st = st.expr;
|
|
135
|
-
}
|
|
136
|
-
return st;
|
|
137
|
-
}
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
// TODO: When strict compatibility with TemplateDefinitionBuilder is not required, we can use `&&`
|
|
141
|
-
// instead to save some code size.
|
|
142
|
-
function safeTransform(e, ctx) {
|
|
143
|
-
if (!isAccessExpression(e)) {
|
|
144
|
-
return e;
|
|
145
|
-
}
|
|
146
|
-
const dst = deepestSafeTernary(e);
|
|
147
|
-
if (dst) {
|
|
148
|
-
if (e instanceof o.InvokeFunctionExpr) {
|
|
149
|
-
dst.expr = dst.expr.callFn(e.args);
|
|
150
|
-
return e.receiver;
|
|
151
|
-
}
|
|
152
|
-
if (e instanceof o.ReadPropExpr) {
|
|
153
|
-
dst.expr = dst.expr.prop(e.name);
|
|
154
|
-
return e.receiver;
|
|
155
|
-
}
|
|
156
|
-
if (e instanceof o.ReadKeyExpr) {
|
|
157
|
-
dst.expr = dst.expr.key(e.index);
|
|
158
|
-
return e.receiver;
|
|
159
|
-
}
|
|
160
|
-
if (e instanceof ir.SafeInvokeFunctionExpr) {
|
|
161
|
-
dst.expr = safeTernaryWithTemporary(dst.expr, (r) => r.callFn(e.args), ctx);
|
|
162
|
-
return e.receiver;
|
|
163
|
-
}
|
|
164
|
-
if (e instanceof ir.SafePropertyReadExpr) {
|
|
165
|
-
dst.expr = safeTernaryWithTemporary(dst.expr, (r) => r.prop(e.name), ctx);
|
|
166
|
-
return e.receiver;
|
|
167
|
-
}
|
|
168
|
-
if (e instanceof ir.SafeKeyedReadExpr) {
|
|
169
|
-
dst.expr = safeTernaryWithTemporary(dst.expr, (r) => r.key(e.index), ctx);
|
|
170
|
-
return e.receiver;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
if (e instanceof ir.SafeInvokeFunctionExpr) {
|
|
175
|
-
return safeTernaryWithTemporary(e.receiver, (r) => r.callFn(e.args), ctx);
|
|
176
|
-
}
|
|
177
|
-
if (e instanceof ir.SafePropertyReadExpr) {
|
|
178
|
-
return safeTernaryWithTemporary(e.receiver, (r) => r.prop(e.name), ctx);
|
|
179
|
-
}
|
|
180
|
-
if (e instanceof ir.SafeKeyedReadExpr) {
|
|
181
|
-
return safeTernaryWithTemporary(e.receiver, (r) => r.key(e.index), ctx);
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
return e;
|
|
185
|
-
}
|
|
186
|
-
function ternaryTransform(e) {
|
|
187
|
-
if (!(e instanceof ir.SafeTernaryExpr)) {
|
|
188
|
-
return e;
|
|
189
|
-
}
|
|
190
|
-
return new o.ConditionalExpr(new o.BinaryOperatorExpr(o.BinaryOperator.Equals, e.guard, o.NULL_EXPR), o.NULL_EXPR, e.expr);
|
|
191
|
-
}
|
|
192
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kX3NhZmVfcmVhZHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb21waWxlci9zcmMvdGVtcGxhdGUvcGlwZWxpbmUvc3JjL3BoYXNlcy9leHBhbmRfc2FmZV9yZWFkcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEtBQUssQ0FBQyxNQUFNLCtCQUErQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBTy9COzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBbUI7SUFDakQsS0FBSyxNQUFNLElBQUksSUFBSSxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0IsS0FBSyxNQUFNLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztZQUM1QixFQUFFLENBQUMsd0JBQXdCLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLEVBQUMsR0FBRyxFQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUYsRUFBRSxDQUFDLHdCQUF3QixDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEYsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDO0FBRUQsOEZBQThGO0FBQzlGLE1BQU0saUJBQWlCLEdBQUc7SUFDeEIsQ0FBQyxDQUFDLGtCQUFrQjtJQUNwQixDQUFDLENBQUMsZ0JBQWdCO0lBQ2xCLENBQUMsQ0FBQyxjQUFjO0lBQ2hCLEVBQUUsQ0FBQyxzQkFBc0I7SUFDekIsRUFBRSxDQUFDLGVBQWU7Q0FDbkIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMs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SUFBSSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEYsQ0FBQztRQUNELElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3RDLE9BQU8sd0JBQXdCLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDeEYsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLENBQWU7SUFDdkMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUNELE9BQU8sSUFBSSxDQUFDLENBQUMsZUFBZSxDQUMxQixJQUFJLENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFDdkUsQ0FBQyxDQUFDLFNBQVMsRUFDWCxDQUFDLENBQUMsSUFBSSxDQUNQLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCAqIGFzIG8gZnJvbSAnLi4vLi4vLi4vLi4vb3V0cHV0L291dHB1dF9hc3QnO1xuaW1wb3J0ICogYXMgaXIgZnJvbSAnLi4vLi4vaXInO1xuaW1wb3J0IHtDb21waWxhdGlvbkpvYn0gZnJvbSAnLi4vY29tcGlsYXRpb24nO1xuXG5pbnRlcmZhY2UgU2FmZVRyYW5zZm9ybUNvbnRleHQge1xuICBqb2I6IENvbXBpbGF0aW9uSm9iO1xufVxuXG4vKipcbiAqIFNhZmUgcmVhZCBleHByZXNzaW9ucyBzdWNoIGFzIGBhPy5iYCBoYXZlIGRpZmZlcmVudCBzZW1hbnRpY3MgaW4gQW5ndWxhciB0ZW1wbGF0ZXMgYXNcbiAqIGNvbXBhcmVkIHRvIEphdmFTY3JpcHQuIEluIHBhcnRpY3VsYXIsIHRoZXkgZGVmYXVsdCB0byBgbnVsbGAgaW5zdGVhZCBvZiBgdW5kZWZpbmVkYC4gVGhpcyBwaGFzZVxuICogZmluZHMgYWxsIHVucmVzb2x2ZWQgc2FmZSByZWFkIGV4cHJlc3Npb25zLCBhbmQgY29udmVydHMgdGhlbSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBvdXRwdXQgQVNUXG4gKiByZWFkcywgZ3VhcmRlZCBieSBudWxsIGNoZWNrcy4gV2UgZ2VuZXJhdGUgdGVtcG9yYXJpZXMgYXMgbmVlZGVkLCB0byBhdm9pZCByZS1ldmFsdWF0aW5nIHRoZSBzYW1lXG4gKiBzdWItZXhwcmVzc2lvbiBtdWx0aXBsZSB0aW1lcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cGFuZFNhZmVSZWFkcyhqb2I6IENvbXBpbGF0aW9uSm9iKTogdm9pZCB7XG4gIGZvciAoY29uc3QgdW5pdCBvZiBqb2IudW5pdHMpIHtcbiAgICBmb3IgKGNvbnN0IG9wIG9mIHVuaXQub3BzKCkpIHtcbiAgICAgIGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5PcChvcCwgKGUpID0+IHNhZmVUcmFuc2Zvcm0oZSwge2pvYn0pLCBpci5WaXNpdG9yQ29udGV4dEZsYWcuTm9uZSk7XG4gICAgICBpci50cmFuc2Zvcm1FeHByZXNzaW9uc0luT3Aob3AsIHRlcm5hcnlUcmFuc2Zvcm0sIGlyLlZpc2l0b3JDb250ZXh0RmxhZy5Ob25lKTtcbiAgICB9XG4gIH1cbn1cblxuLy8gQSBsb29rdXAgc2V0IG9mIGFsbCB0aGUgZXhwcmVzc2lvbiBraW5kcyB0aGF0IHJlcXVpcmUgYSB0ZW1wb3JhcnkgdmFyaWFibGUgdG8gYmUgZ2VuZXJhdGVkLlxuY29uc3QgcmVxdWlyZXNUZW1wb3JhcnkgPSBbXG4gIG8uSW52b2tlRnVuY3Rpb25FeHByLFxuICBvLkxpdGVyYWxBcnJheUV4cHIsXG4gIG8uTGl0ZXJhbE1hcEV4cHIsXG4gIGlyLlNhZmVJbnZva2VGdW5jdGlvbkV4cHIsXG4gIGlyLlBpcGVCaW5kaW5nRXhwcixcbl0ubWFwKChlKSA9PiBlLmNvbnN0cnVjdG9yLm5hbWUpO1xuXG5mdW5jdGlvbiBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlOiBvLkV4cHJlc3Npb24pOiBib29sZWFuIHtcbiAgLy8gVE9ETzogV2UgcHJvYmFibHkgd2FudCB0byB1c2UgYW4gZXhwcmVzc2lvbiB2aXNpdG9yIHRvIHJlY3Vyc2l2ZWx5IHZpc2l0IGFsbCBkZXNjZW5kZW50cy5cbiAgLy8gSG93ZXZlciwgdGhhdCB3b3VsZCBwb3RlbnRpYWxseSBkbyBhIGxvdCBvZiBleHRyYSB3b3JrIChiZWNhdXNlIGl0IGNhbm5vdCBzaG9ydCBjaXJjdWl0KSwgc28gd2VcbiAgLy8gaW1wbGVtZW50IHRoZSBsb2dpYyBvdXJzZWx2ZXMgZm9yIG5vdy5cbiAgaWYgKGUgaW5zdGFuY2VvZiBvLlVuYXJ5T3BlcmF0b3JFeHByKSB7XG4gICAgcmV0dXJuIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUuZXhwcik7XG4gIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIG8uQmluYXJ5T3BlcmF0b3JFeHByKSB7XG4gICAgcmV0dXJuIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUubGhzKSB8fCBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLnJocyk7XG4gIH0gZWxzZSBpZiAoZSBpbnN0YW5jZW9mIG8uQ29uZGl0aW9uYWxFeHByKSB7XG4gICAgaWYgKGUuZmFsc2VDYXNlICYmIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUuZmFsc2VDYXNlKSkgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUuY29uZGl0aW9uKSB8fCBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLnRydWVDYXNlKTtcbiAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2Ygby5Ob3RFeHByKSB7XG4gICAgcmV0dXJuIG5lZWRzVGVtcG9yYXJ5SW5TYWZlQWNjZXNzKGUuY29uZGl0aW9uKTtcbiAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2YgaXIuQXNzaWduVGVtcG9yYXJ5RXhwcikge1xuICAgIHJldHVybiBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLmV4cHIpO1xuICB9IGVsc2UgaWYgKGUgaW5zdGFuY2VvZiBvLlJlYWRQcm9wRXhwcikge1xuICAgIHJldHVybiBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLnJlY2VpdmVyKTtcbiAgfSBlbHNlIGlmIChlIGluc3RhbmNlb2Ygby5SZWFkS2V5RXhwcikge1xuICAgIHJldHVybiBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLnJlY2VpdmVyKSB8fCBuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhlLmluZGV4KTtcbiAgfVxuICAvLyBUT0RPOiBTd2l0Y2ggdG8gYSBtZXRob2Qgd2hpY2ggaXMgZXhoYXVzdGl2ZSBvZiBuZXdseSBhZGRlZCBleHByZXNzaW9uIHN1YnR5cGVzLlxuICByZXR1cm4gKFxuICAgIGUgaW5zdGFuY2VvZiBvLkludm9rZUZ1bmN0aW9uRXhwciB8fFxuICAgIGUgaW5zdGFuY2VvZiBvLkxpdGVyYWxBcnJheUV4cHIgfHxcbiAgICBlIGluc3RhbmNlb2Ygby5MaXRlcmFsTWFwRXhwciB8fFxuICAgIGUgaW5zdGFuY2VvZiBpci5TYWZlSW52b2tlRnVuY3Rpb25FeHByIHx8XG4gICAgZSBpbnN0YW5jZW9mIGlyLlBpcGVCaW5kaW5nRXhwclxuICApO1xufVxuXG5mdW5jdGlvbiB0ZW1wb3Jhcmllc0luKGU6IG8uRXhwcmVzc2lvbik6IFNldDxpci5YcmVmSWQ+IHtcbiAgY29uc3QgdGVtcG9yYXJpZXMgPSBuZXcgU2V0PGlyLlhyZWZJZD4oKTtcbiAgLy8gVE9ETzogQWx0aG91Z2ggaXQncyBub3QgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgdHJhbnNmb3JtIGhlbHBlciwgd2Ugc2hvdWxkIGJlIGFibGUgdG9cbiAgLy8gc2hvcnQtY2lyY3VpdCBleHBsb3JpbmcgdGhlIHRyZWUgdG8gZG8gbGVzcyB3b3JrLiBJbiBwYXJ0aWN1bGFyLCB3ZSBkb24ndCBoYXZlIHRvIHBlbmV0cmF0ZVxuICAvLyBpbnRvIHRoZSBzdWJleHByZXNzaW9ucyBvZiB0ZW1wb3JhcnkgYXNzaWdubWVudHMuXG4gIGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKFxuICAgIGUsXG4gICAgKGUpID0+IHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgaXIuQXNzaWduVGVtcG9yYXJ5RXhwcikge1xuICAgICAgICB0ZW1wb3Jhcmllcy5hZGQoZS54cmVmKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlO1xuICAgIH0sXG4gICAgaXIuVmlzaXRvckNvbnRleHRGbGFnLk5vbmUsXG4gICk7XG4gIHJldHVybiB0ZW1wb3Jhcmllcztcbn1cblxuZnVuY3Rpb24gZWxpbWluYXRlVGVtcG9yYXJ5QXNzaWdubWVudHMoXG4gIGU6IG8uRXhwcmVzc2lvbixcbiAgdG1wczogU2V0PGlyLlhyZWZJZD4sXG4gIGN0eDogU2FmZVRyYW5zZm9ybUNvbnRleHQsXG4pOiBvLkV4cHJlc3Npb24ge1xuICAvLyBUT0RPOiBXZSBjYW4gYmUgbW9yZSBlZmZpY2llbnQgdGhhbiB0aGUgdHJhbnNmb3JtIGhlbHBlciBoZXJlLiBXZSBkb24ndCBuZWVkIHRvIHZpc2l0IGFueVxuICAvLyBkZXNjZW5kZW50cyBvZiB0ZW1wb3JhcnkgYXNzaWdubWVudHMuXG4gIGlyLnRyYW5zZm9ybUV4cHJlc3Npb25zSW5FeHByZXNzaW9uKFxuICAgIGUsXG4gICAgKGUpID0+IHtcbiAgICAgIGlmIChlIGluc3RhbmNlb2YgaXIuQXNzaWduVGVtcG9yYXJ5RXhwciAmJiB0bXBzLmhhcyhlLnhyZWYpKSB7XG4gICAgICAgIGNvbnN0IHJlYWQgPSBuZXcgaXIuUmVhZFRlbXBvcmFyeUV4cHIoZS54cmVmKTtcbiAgICAgICAgLy8gYFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXJgIGhhcyB0aGUgKGFjY2lkZW50YWw/KSBiZWhhdmlvciBvZiBnZW5lcmF0aW5nIGFzc2lnbm1lbnRzIG9mXG4gICAgICAgIC8vIHRlbXBvcmFyeSB2YXJpYWJsZXMgdG8gdGhlbXNlbHZlcy4gVGhpcyBoYXBwZW5zIGJlY2F1c2Ugc29tZSBzdWJleHByZXNzaW9uIHRoYXQgdGhlXG4gICAgICAgIC8vIHRlbXBvcmFyeSByZWZlcnMgdG8sIHBvc3NpYmx5IHRocm91Z2ggbmVzdGVkIHRlbXBvcmFyaWVzLCBoYXMgYSBmdW5jdGlvbiBjYWxsLiBXZSBjb3B5IHRoYXRcbiAgICAgICAgLy8gYmVoYXZpb3IgaGVyZS5cbiAgICAgICAgcmV0dXJuIGN0eC5qb2IuY29tcGF0aWJpbGl0eSA9PT0gaXIuQ29tcGF0aWJpbGl0eU1vZGUuVGVtcGxhdGVEZWZpbml0aW9uQnVpbGRlclxuICAgICAgICAgID8gbmV3IGlyLkFzc2lnblRlbXBvcmFyeUV4cHIocmVhZCwgcmVhZC54cmVmKVxuICAgICAgICAgIDogcmVhZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBlO1xuICAgIH0sXG4gICAgaXIuVmlzaXRvckNvbnRleHRGbGFnLk5vbmUsXG4gICk7XG4gIHJldHVybiBlO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBzYWZlIHRlcm5hcnkgZ3VhcmRlZCBieSB0aGUgaW5wdXQgZXhwcmVzc2lvbiwgYW5kIHdpdGggYSBib2R5IGdlbmVyYXRlZCBieSB0aGUgcHJvdmlkZWRcbiAqIGNhbGxiYWNrIG9uIHRoZSBpbnB1dCBleHByZXNzaW9uLiBHZW5lcmF0ZXMgYSB0ZW1wb3JhcnkgdmFyaWFibGUgYXNzaWdubWVudCBpZiBuZWVkZWQsIGFuZFxuICogZGVkdXBsaWNhdGVzIG5lc3RlZCB0ZW1wb3JhcnkgYXNzaWdubWVudHMgaWYgbmVlZGVkLlxuICovXG5mdW5jdGlvbiBzYWZlVGVybmFyeVdpdGhUZW1wb3JhcnkoXG4gIGd1YXJkOiBvLkV4cHJlc3Npb24sXG4gIGJvZHk6IChlOiBvLkV4cHJlc3Npb24pID0+IG8uRXhwcmVzc2lvbixcbiAgY3R4OiBTYWZlVHJhbnNmb3JtQ29udGV4dCxcbik6IGlyLlNhZmVUZXJuYXJ5RXhwciB7XG4gIGxldCByZXN1bHQ6IFtvLkV4cHJlc3Npb24sIG8uRXhwcmVzc2lvbl07XG4gIGlmIChuZWVkc1RlbXBvcmFyeUluU2FmZUFjY2VzcyhndWFyZCkpIHtcbiAgICBjb25zdCB4cmVmID0gY3R4LmpvYi5hbGxvY2F0ZVhyZWZJZCgpO1xuICAgIHJlc3VsdCA9IFtuZXcgaXIuQXNzaWduVGVtcG9yYXJ5RXhwcihndWFyZCwgeHJlZiksIG5ldyBpci5SZWFkVGVtcG9yYXJ5RXhwcih4cmVmKV07XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gW2d1YXJkLCBndWFyZC5jbG9uZSgpXTtcbiAgICAvLyBDb25zaWRlciBhbiBleHByZXNzaW9uIGxpa2UgYGE/LltiPy5jKCldPy5kYC4gVGhlIGBiPy5jKClgIHdpbGwgYmUgdHJhbnNmb3JtZWQgZmlyc3QsXG4gICAgLy8gaW50cm9kdWNpbmcgYSB0ZW1wb3JhcnkgYXNzaWdubWVudCBpbnRvIHRoZSBrZXkuIFRoZW4sIGFzIHBhcnQgb2YgZXhwYW5kaW5nIHRoZSBgPy5kYC4gVGhhdFxuICAgIC8vIGFzc2lnbm1lbnQgd2lsbCBiZSBkdXBsaWNhdGVkIGludG8gYm90aCB0aGUgZ3VhcmQgYW5kIGV4cHJlc3Npb24gc2lkZXMuIFdlIGRlLWR1cGxpY2F0ZSBpdCxcbiAgICAvLyBieSB0cmFuc2Zvcm1pbmcgaXQgZnJvbSBhbiBhc3NpZ25tZW50IGludG8gYSByZWFkIG9uIHRoZSBleHByZXNzaW9uIHNpZGUuXG4gICAgZWxpbWluYXRlVGVtcG9yYXJ5QXNzaWdubWVudHMocmVzdWx0WzFdLCB0ZW1wb3Jhcmllc0luKHJlc3VsdFswXSksIGN0eCk7XG4gIH1cbiAgcmV0dXJuIG5ldyBpci5TYWZlVGVybmFyeUV4cHIocmVzdWx0WzBdLCBib2R5KHJlc3VsdFsxXSkpO1xufVxuXG5mdW5jdGlvbiBpc1NhZmVBY2Nlc3NFeHByZXNzaW9uKFxuICBlOiBvLkV4cHJlc3Npb24sXG4pOiBlIGlzIGlyLlNhZmVQcm9wZXJ0eVJlYWRFeHByIHwgaXIuU2FmZUtleWVkUmVhZEV4cHIgfCBpci5TYWZlSW52b2tlRnVuY3Rpb25FeHByIHtcbiAgcmV0dXJuIChcbiAgICBlIGluc3RhbmNlb2YgaXIuU2FmZVByb3BlcnR5UmVhZEV4cHIgfHxcbiAgICBlIGluc3RhbmNlb2YgaXIuU2FmZUtleWVkUmVhZEV4cHIgfHxcbiAgICBlIGluc3RhbmNlb2YgaXIuU2FmZUludm9rZUZ1bmN0aW9uRXhwclxuICApO1xufVxuXG5mdW5jdGlvbiBpc1Vuc2FmZUFjY2Vzc0V4cHJlc3Npb24oXG4gIGU6IG8uRXhwcmVzc2lvbixcbik6IGUgaXMgby5SZWFkUHJvcEV4cHIgfCBvLlJlYWRLZXlFeHByIHwgby5JbnZva2VGdW5jdGlvbkV4cHIge1xuICByZXR1cm4gKFxuICAgIGUgaW5zdGFuY2VvZiBvLlJlYWRQcm9wRXhwciB8fCBlIGluc3RhbmNlb2Ygby5SZWFkS2V5RXhwciB8fCBlIGluc3RhbmNlb2Ygby5JbnZva2VGdW5jdGlvbkV4cHJcbiAgKTtcbn1cblxuZnVuY3Rpb24gaXNBY2Nlc3NFeHByZXNzaW9uKFxuICBlOiBvLkV4cHJlc3Npb24sXG4pOiBlIGlzXG4gIHwgby5SZWFkUHJvcEV4cHJcbiAgfCBpci5TYWZlUHJvcGVydHlSZWFkRXhwclxuICB8IG8uUmVhZEtleUV4cHJcbiAgfCBpci5TYWZlS2V5ZWRSZWFkRXhwclxuICB8IG8uSW52b2tlRnVuY3Rpb25FeHByXG4gIHwgaXIuU2FmZUludm9rZUZ1bmN0aW9uRXhwciB7XG4gIHJldHVybiBpc1NhZmVBY2Nlc3NFeHByZXNzaW9uKGUpIHx8IGlzVW5zYWZlQWNjZXNzRXhwcmVzc2lvbihlKTtcbn1cblxuZnVuY3Rpb24gZGVlcGVzdFNhZmVUZXJuYXJ5KGU6IG8uRXhwcmVzc2lvbik6IGlyLlNhZmVUZXJuYXJ5RXhwciB8IG51bGwge1xuICBpZiAoaXNBY2Nlc3NFeHByZXNzaW9uKGUpICYmIGUucmVjZWl2ZXIgaW5zdGFuY2VvZiBpci5TYWZlVGVybmFyeUV4cHIpIHtcbiAgICBsZXQgc3QgPSBlLnJlY2VpdmVyO1xuICAgIHdoaWxlIChzdC5leHByIGluc3RhbmNlb2YgaXIuU2FmZVRlcm5hcnlFeHByKSB7XG4gICAgICBzdCA9IHN0LmV4cHI7XG4gICAgfVxuICAgIHJldHVybiBzdDtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gVE9ETzogV2hlbiBzdHJpY3QgY29tcGF0aWJpbGl0eSB3aXRoIFRlbXBsYXRlRGVmaW5pdGlvbkJ1aWxkZXIgaXMgbm90IHJlcXVpcmVkLCB3ZSBjYW4gdXNlIGAmJmBcbi8vIGluc3RlYWQgdG8gc2F2ZSBzb21lIGNvZGUgc2l6ZS5cbmZ1bmN0aW9uIHNhZmVUcmFuc2Zvcm0oZTogby5FeHByZXNzaW9uLCBjdHg6IFNhZmVUcmFuc2Zvcm1Db250ZXh0KTogby5FeHByZXNzaW9uIHtcbiAgaWYgKCFpc0FjY2Vzc0V4cHJlc3Npb24oZSkpIHtcbiAgICByZXR1cm4gZTtcbiAgfVxuXG4gIGNvbnN0IGRzdCA9IGRlZXBlc3RTYWZlVGVybmFyeShlKTtcblxuICBpZiAoZHN0KSB7XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBvLkludm9rZUZ1bmN0aW9uRXhwcikge1xuICAgICAgZHN0LmV4cHIgPSBkc3QuZXhwci5jYWxsRm4oZS5hcmdzKTtcbiAgICAgIHJldHVybiBlLnJlY2VpdmVyO1xuICAgIH1cbiAgICBpZiAoZSBpbnN0YW5jZW9mIG8uUmVhZFByb3BFeHByKSB7XG4gICAgICBkc3QuZXhwciA9IGRzdC5leHByLnByb3AoZS5uYW1lKTtcbiAgICAgIHJldHVybiBlLnJlY2VpdmVyO1xuICAgIH1cbiAgICBpZiAoZSBpbnN0YW5jZW9mIG8uUmVhZEtleUV4cHIpIHtcbiAgICAgIGRzdC5leHByID0gZHN0LmV4cHIua2V5KGUuaW5kZXgpO1xuICAgICAgcmV0dXJuIGUucmVjZWl2ZXI7XG4gICAgfVxuICAgIGlmIChlIGluc3RhbmNlb2YgaXIuU2FmZUludm9rZUZ1bmN0aW9uRXhwcikge1xuICAgICAgZHN0LmV4cHIgPSBzYWZlVGVybmFyeVdpdGhUZW1wb3JhcnkoZHN0LmV4cHIsIChyOiBvLkV4cHJlc3Npb24pID0+IHIuY2FsbEZuKGUuYXJncyksIGN0eCk7XG4gICAgICByZXR1cm4gZS5yZWNlaXZlcjtcbiAgICB9XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBpci5TYWZlUHJvcGVydHlSZWFkRXhwcikge1xuICAgICAgZHN0LmV4cHIgPSBzYWZlVGVybmFyeVdpdGhUZW1wb3JhcnkoZHN0LmV4cHIsIChyOiBvLkV4cHJlc3Npb24pID0+IHIucHJvcChlLm5hbWUpLCBjdHgpO1xuICAgICAgcmV0dXJuIGUucmVjZWl2ZXI7XG4gICAgfVxuICAgIGlmIChlIGluc3RhbmNlb2YgaXIuU2FmZUtleWVkUmVhZEV4cHIpIHtcbiAgICAgIGRzdC5leHByID0gc2FmZVRlcm5hcnlXaXRoVGVtcG9yYXJ5KGRzdC5leHByLCAocjogby5FeHByZXNzaW9uKSA9PiByLmtleShlLmluZGV4KSwgY3R4KTtcbiAgICAgIHJldHVybiBlLnJlY2VpdmVyO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZSBpbnN0YW5jZW9mIGlyLlNhZmVJbnZva2VGdW5jdGlvbkV4cHIpIHtcbiAgICAgIHJldHVybiBzYWZlVGVybmFyeVdpdGhUZW1wb3JhcnkoZS5yZWNlaXZlciwgKHI6IG8uRXhwcmVzc2lvbikgPT4gci5jYWxsRm4oZS5hcmdzKSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBpci5TYWZlUHJvcGVydHlSZWFkRXhwcikge1xuICAgICAgcmV0dXJuIHNhZmVUZXJuYXJ5V2l0aFRlbXBvcmFyeShlLnJlY2VpdmVyLCAocjogby5FeHByZXNzaW9uKSA9PiByLnByb3AoZS5uYW1lKSwgY3R4KTtcbiAgICB9XG4gICAgaWYgKGUgaW5zdGFuY2VvZiBpci5TYWZlS2V5ZWRSZWFkRXhwcikge1xuICAgICAgcmV0dXJuIHNhZmVUZXJuYXJ5V2l0aFRlbXBvcmFyeShlLnJlY2VpdmVyLCAocjogby5FeHByZXNzaW9uKSA9PiByLmtleShlLmluZGV4KSwgY3R4KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZTtcbn1cblxuZnVuY3Rpb24gdGVybmFyeVRyYW5zZm9ybShlOiBvLkV4cHJlc3Npb24pOiBvLkV4cHJlc3Npb24ge1xuICBpZiAoIShlIGluc3RhbmNlb2YgaXIuU2FmZVRlcm5hcnlFeHByKSkge1xuICAgIHJldHVybiBlO1xuICB9XG4gIHJldHVybiBuZXcgby5Db25kaXRpb25hbEV4cHIoXG4gICAgbmV3IG8uQmluYXJ5T3BlcmF0b3JFeHByKG8uQmluYXJ5T3BlcmF0b3IuRXF1YWxzLCBlLmd1YXJkLCBvLk5VTExfRVhQUiksXG4gICAgby5OVUxMX0VYUFIsXG4gICAgZS5leHByLFxuICApO1xufVxuIl19
|