@angular/material 9.1.3 → 9.2.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/autocomplete/index.metadata.json +1 -1
- package/autocomplete/testing/autocomplete-harness.d.ts +4 -1
- package/badge/index.metadata.json +1 -1
- package/bottom-sheet/bottom-sheet.d.ts +2 -1
- package/bundles/material-autocomplete-testing.umd.js +55 -8
- package/bundles/material-autocomplete-testing.umd.js.map +1 -1
- package/bundles/material-autocomplete-testing.umd.min.js +4 -5
- package/bundles/material-autocomplete-testing.umd.min.js.map +1 -1
- package/bundles/material-autocomplete.umd.js +23 -24
- package/bundles/material-autocomplete.umd.js.map +1 -1
- package/bundles/material-autocomplete.umd.min.js +5 -5
- package/bundles/material-autocomplete.umd.min.js.map +1 -1
- package/bundles/material-badge.umd.js +1 -1
- package/bundles/material-badge.umd.js.map +1 -1
- package/bundles/material-badge.umd.min.js +1 -1
- package/bundles/material-badge.umd.min.js.map +1 -1
- package/bundles/material-bottom-sheet.umd.js +3 -2
- package/bundles/material-bottom-sheet.umd.js.map +1 -1
- package/bundles/material-bottom-sheet.umd.min.js +1 -1
- package/bundles/material-bottom-sheet.umd.min.js.map +1 -1
- package/bundles/material-button-toggle.umd.js +16 -6
- package/bundles/material-button-toggle.umd.js.map +1 -1
- package/bundles/material-button-toggle.umd.min.js +3 -3
- package/bundles/material-button-toggle.umd.min.js.map +1 -1
- package/bundles/material-chips.umd.js +3 -0
- package/bundles/material-chips.umd.js.map +1 -1
- package/bundles/material-chips.umd.min.js +1 -1
- package/bundles/material-chips.umd.min.js.map +1 -1
- package/bundles/material-core.umd.js +96 -73
- package/bundles/material-core.umd.js.map +1 -1
- package/bundles/material-core.umd.min.js +10 -10
- package/bundles/material-core.umd.min.js.map +1 -1
- package/bundles/material-datepicker.umd.js +23 -10
- package/bundles/material-datepicker.umd.js.map +1 -1
- package/bundles/material-datepicker.umd.min.js +7 -7
- package/bundles/material-datepicker.umd.min.js.map +1 -1
- package/bundles/material-dialog.umd.js +43 -23
- package/bundles/material-dialog.umd.js.map +1 -1
- package/bundles/material-dialog.umd.min.js +6 -6
- package/bundles/material-dialog.umd.min.js.map +1 -1
- package/bundles/material-expansion.umd.js +3 -3
- package/bundles/material-expansion.umd.js.map +1 -1
- package/bundles/material-expansion.umd.min.js +1 -1
- package/bundles/material-expansion.umd.min.js.map +1 -1
- package/bundles/material-form-field.umd.js +12 -2
- package/bundles/material-form-field.umd.js.map +1 -1
- package/bundles/material-form-field.umd.min.js +2 -2
- package/bundles/material-form-field.umd.min.js.map +1 -1
- package/bundles/material-input.umd.js +14 -4
- package/bundles/material-input.umd.js.map +1 -1
- package/bundles/material-input.umd.min.js +1 -1
- package/bundles/material-input.umd.min.js.map +1 -1
- package/bundles/material-list.umd.js +7 -6
- package/bundles/material-list.umd.js.map +1 -1
- package/bundles/material-list.umd.min.js +2 -2
- package/bundles/material-list.umd.min.js.map +1 -1
- package/bundles/material-menu.umd.js +5 -5
- package/bundles/material-menu.umd.js.map +1 -1
- package/bundles/material-menu.umd.min.js +6 -6
- package/bundles/material-menu.umd.min.js.map +1 -1
- package/bundles/material-radio.umd.js +62 -47
- package/bundles/material-radio.umd.js.map +1 -1
- package/bundles/material-radio.umd.min.js +10 -2
- package/bundles/material-radio.umd.min.js.map +1 -1
- package/bundles/material-select-testing.umd.js +45 -10
- package/bundles/material-select-testing.umd.js.map +1 -1
- package/bundles/material-select-testing.umd.min.js +2 -3
- package/bundles/material-select-testing.umd.min.js.map +1 -1
- package/bundles/material-select.umd.js +24 -15
- package/bundles/material-select.umd.js.map +1 -1
- package/bundles/material-select.umd.min.js +3 -3
- package/bundles/material-select.umd.min.js.map +1 -1
- package/bundles/material-sidenav.umd.js +2 -1
- package/bundles/material-sidenav.umd.js.map +1 -1
- package/bundles/material-sidenav.umd.min.js +2 -2
- package/bundles/material-sidenav.umd.min.js.map +1 -1
- package/bundles/material-slider.umd.js +14 -12
- package/bundles/material-slider.umd.js.map +1 -1
- package/bundles/material-slider.umd.min.js +1 -1
- package/bundles/material-slider.umd.min.js.map +1 -1
- package/bundles/material-snack-bar-testing.umd.js +24 -2
- package/bundles/material-snack-bar-testing.umd.js.map +1 -1
- package/bundles/material-snack-bar-testing.umd.min.js +3 -3
- package/bundles/material-snack-bar-testing.umd.min.js.map +1 -1
- package/bundles/material-snack-bar.umd.js +4 -0
- package/bundles/material-snack-bar.umd.js.map +1 -1
- package/bundles/material-snack-bar.umd.min.js +2 -2
- package/bundles/material-snack-bar.umd.min.js.map +1 -1
- package/bundles/material-table.umd.js +5 -2
- package/bundles/material-table.umd.js.map +1 -1
- package/bundles/material-table.umd.min.js +2 -2
- package/bundles/material-table.umd.min.js.map +1 -1
- package/bundles/material-tabs.umd.js +5 -4
- package/bundles/material-tabs.umd.js.map +1 -1
- package/bundles/material-tabs.umd.min.js +1 -1
- package/bundles/material-tabs.umd.min.js.map +1 -1
- package/bundles/material-tooltip.umd.js +5 -5
- package/bundles/material-tooltip.umd.js.map +1 -1
- package/bundles/material-tooltip.umd.min.js +3 -3
- package/bundles/material-tooltip.umd.min.js.map +1 -1
- package/bundles/material-tree.umd.js +1 -1
- package/bundles/material-tree.umd.js.map +1 -1
- package/bundles/material-tree.umd.min.js +1 -1
- package/bundles/material-tree.umd.min.js.map +1 -1
- package/button-toggle/index.metadata.json +1 -1
- package/core/index.metadata.json +1 -1
- package/core/ripple/ripple-renderer.d.ts +10 -3
- package/core/ripple/ripple.d.ts +2 -1
- package/datepicker/datepicker-input.d.ts +5 -2
- package/datepicker/index.metadata.json +1 -1
- package/dialog/dialog-container.d.ts +6 -0
- package/dialog/dialog-ref.d.ts +5 -0
- package/dialog/index.metadata.json +1 -1
- package/esm2015/autocomplete/autocomplete-module.js +3 -1
- package/esm2015/autocomplete/autocomplete-trigger.js +21 -22
- package/esm2015/autocomplete/testing/autocomplete-harness.js +18 -7
- package/esm2015/badge/badge-module.js +2 -2
- package/esm2015/bottom-sheet/bottom-sheet.js +5 -3
- package/esm2015/button-toggle/button-toggle.js +18 -7
- package/esm2015/chips/chip-list.js +4 -1
- package/esm2015/core/common-behaviors/common-module.js +3 -4
- package/esm2015/core/ripple/ripple-renderer.js +140 -119
- package/esm2015/core/ripple/ripple.js +10 -7
- package/esm2015/core/version.js +1 -1
- package/esm2015/datepicker/calendar-body.js +1 -1
- package/esm2015/datepicker/calendar.js +3 -3
- package/esm2015/datepicker/datepicker-input.js +19 -4
- package/esm2015/datepicker/datepicker-module.js +3 -1
- package/esm2015/datepicker/datepicker.js +8 -2
- package/esm2015/dialog/dialog-container.js +40 -13
- package/esm2015/dialog/dialog-ref.js +24 -6
- package/esm2015/dialog/dialog.js +1 -12
- package/esm2015/expansion/expansion-panel-header.js +3 -3
- package/esm2015/expansion/expansion-panel.js +1 -1
- package/esm2015/form-field/form-field.js +13 -3
- package/esm2015/form-field/public-api.js +2 -2
- package/esm2015/input/input.js +16 -6
- package/esm2015/list/list.js +2 -2
- package/esm2015/list/selection-list.js +9 -6
- package/esm2015/menu/menu-module.js +3 -2
- package/esm2015/radio/public-api.js +2 -2
- package/esm2015/radio/radio.js +70 -59
- package/esm2015/select/select-module.js +10 -2
- package/esm2015/select/select.js +14 -12
- package/esm2015/select/testing/select-harness.js +11 -6
- package/esm2015/sidenav/sidenav-module.js +4 -3
- package/esm2015/slider/slider.js +17 -15
- package/esm2015/snack-bar/snack-bar-container.js +5 -1
- package/esm2015/snack-bar/testing/snack-bar-harness.js +18 -3
- package/esm2015/table/table-module.js +2 -2
- package/esm2015/table/table.js +6 -3
- package/esm2015/tabs/paginated-tab-header.js +3 -2
- package/esm2015/tabs/tab-header.js +1 -1
- package/esm2015/tabs/tab-nav-bar/tab-nav-bar.js +3 -3
- package/esm2015/tooltip/tooltip-module.js +3 -2
- package/esm2015/tree/tree-module.js +2 -2
- package/esm5/autocomplete/autocomplete-module.js +3 -1
- package/esm5/autocomplete/autocomplete-trigger.js +20 -22
- package/esm5/autocomplete/testing/autocomplete-harness.js +56 -9
- package/esm5/badge/badge-module.js +2 -2
- package/esm5/bottom-sheet/bottom-sheet.js +4 -3
- package/esm5/button-toggle/button-toggle.js +17 -7
- package/esm5/chips/chip-list.js +4 -1
- package/esm5/core/common-behaviors/common-module.js +3 -4
- package/esm5/core/ripple/ripple-renderer.js +91 -65
- package/esm5/core/ripple/ripple.js +4 -6
- package/esm5/core/version.js +1 -1
- package/esm5/datepicker/calendar-body.js +1 -1
- package/esm5/datepicker/calendar.js +3 -3
- package/esm5/datepicker/datepicker-input.js +10 -4
- package/esm5/datepicker/datepicker-module.js +3 -1
- package/esm5/datepicker/datepicker.js +8 -2
- package/esm5/dialog/dialog-container.js +26 -11
- package/esm5/dialog/dialog-ref.js +19 -6
- package/esm5/dialog/dialog.js +1 -9
- package/esm5/expansion/expansion-panel-header.js +3 -3
- package/esm5/expansion/expansion-panel.js +1 -1
- package/esm5/form-field/form-field.js +12 -3
- package/esm5/input/input.js +16 -6
- package/esm5/list/list.js +2 -2
- package/esm5/list/selection-list.js +6 -5
- package/esm5/menu/menu-module.js +3 -2
- package/esm5/radio/radio.js +63 -48
- package/esm5/select/select-module.js +10 -2
- package/esm5/select/select.js +14 -12
- package/esm5/select/testing/select-harness.js +46 -11
- package/esm5/sidenav/sidenav-module.js +4 -3
- package/esm5/slider/slider.js +15 -13
- package/esm5/snack-bar/snack-bar-container.js +5 -1
- package/esm5/snack-bar/testing/snack-bar-harness.js +26 -4
- package/esm5/table/table-module.js +2 -2
- package/esm5/table/table.js +6 -3
- package/esm5/tabs/paginated-tab-header.js +3 -2
- package/esm5/tabs/tab-header.js +1 -1
- package/esm5/tabs/tab-nav-bar/tab-nav-bar.js +3 -3
- package/esm5/tooltip/tooltip-module.js +3 -2
- package/esm5/tree/tree-module.js +2 -2
- package/expansion/index.metadata.json +1 -1
- package/fesm2015/autocomplete/testing.js +17 -6
- package/fesm2015/autocomplete/testing.js.map +1 -1
- package/fesm2015/autocomplete.js +22 -22
- package/fesm2015/autocomplete.js.map +1 -1
- package/fesm2015/badge.js +1 -1
- package/fesm2015/badge.js.map +1 -1
- package/fesm2015/bottom-sheet.js +4 -2
- package/fesm2015/bottom-sheet.js.map +1 -1
- package/fesm2015/button-toggle.js +17 -6
- package/fesm2015/button-toggle.js.map +1 -1
- package/fesm2015/chips.js +3 -0
- package/fesm2015/chips.js.map +1 -1
- package/fesm2015/core.js +151 -128
- package/fesm2015/core.js.map +1 -1
- package/fesm2015/datepicker.js +30 -7
- package/fesm2015/datepicker.js.map +1 -1
- package/fesm2015/dialog.js +62 -28
- package/fesm2015/dialog.js.map +1 -1
- package/fesm2015/expansion.js +3 -3
- package/fesm2015/expansion.js.map +1 -1
- package/fesm2015/form-field.js +13 -3
- package/fesm2015/form-field.js.map +1 -1
- package/fesm2015/input.js +15 -5
- package/fesm2015/input.js.map +1 -1
- package/fesm2015/list.js +10 -7
- package/fesm2015/list.js.map +1 -1
- package/fesm2015/menu.js +2 -1
- package/fesm2015/menu.js.map +1 -1
- package/fesm2015/radio.js +71 -60
- package/fesm2015/radio.js.map +1 -1
- package/fesm2015/select/testing.js +10 -5
- package/fesm2015/select/testing.js.map +1 -1
- package/fesm2015/select.js +23 -14
- package/fesm2015/select.js.map +1 -1
- package/fesm2015/sidenav.js +3 -2
- package/fesm2015/sidenav.js.map +1 -1
- package/fesm2015/slider.js +16 -14
- package/fesm2015/slider.js.map +1 -1
- package/fesm2015/snack-bar/testing.js +17 -2
- package/fesm2015/snack-bar/testing.js.map +1 -1
- package/fesm2015/snack-bar.js +4 -0
- package/fesm2015/snack-bar.js.map +1 -1
- package/fesm2015/table.js +6 -3
- package/fesm2015/table.js.map +1 -1
- package/fesm2015/tabs.js +5 -4
- package/fesm2015/tabs.js.map +1 -1
- package/fesm2015/tooltip.js +2 -2
- package/fesm2015/tooltip.js.map +1 -1
- package/fesm2015/tree.js +1 -1
- package/fesm2015/tree.js.map +1 -1
- package/fesm5/autocomplete/testing.js +55 -8
- package/fesm5/autocomplete/testing.js.map +1 -1
- package/fesm5/autocomplete.js +21 -22
- package/fesm5/autocomplete.js.map +1 -1
- package/fesm5/badge.js +1 -1
- package/fesm5/badge.js.map +1 -1
- package/fesm5/bottom-sheet.js +3 -2
- package/fesm5/bottom-sheet.js.map +1 -1
- package/fesm5/button-toggle.js +16 -6
- package/fesm5/button-toggle.js.map +1 -1
- package/fesm5/chips.js +3 -0
- package/fesm5/chips.js.map +1 -1
- package/fesm5/core.js +96 -73
- package/fesm5/core.js.map +1 -1
- package/fesm5/datepicker.js +21 -7
- package/fesm5/datepicker.js.map +1 -1
- package/fesm5/dialog.js +43 -23
- package/fesm5/dialog.js.map +1 -1
- package/fesm5/expansion.js +3 -3
- package/fesm5/expansion.js.map +1 -1
- package/fesm5/form-field.js +12 -3
- package/fesm5/form-field.js.map +1 -1
- package/fesm5/input.js +15 -5
- package/fesm5/input.js.map +1 -1
- package/fesm5/list.js +7 -6
- package/fesm5/list.js.map +1 -1
- package/fesm5/menu.js +2 -1
- package/fesm5/menu.js.map +1 -1
- package/fesm5/radio.js +63 -49
- package/fesm5/radio.js.map +1 -1
- package/fesm5/select/testing.js +45 -10
- package/fesm5/select/testing.js.map +1 -1
- package/fesm5/select.js +23 -14
- package/fesm5/select.js.map +1 -1
- package/fesm5/sidenav.js +3 -2
- package/fesm5/sidenav.js.map +1 -1
- package/fesm5/slider.js +14 -12
- package/fesm5/slider.js.map +1 -1
- package/fesm5/snack-bar/testing.js +25 -3
- package/fesm5/snack-bar/testing.js.map +1 -1
- package/fesm5/snack-bar.js +4 -0
- package/fesm5/snack-bar.js.map +1 -1
- package/fesm5/table.js +6 -3
- package/fesm5/table.js.map +1 -1
- package/fesm5/tabs.js +5 -4
- package/fesm5/tabs.js.map +1 -1
- package/fesm5/tooltip.js +2 -2
- package/fesm5/tooltip.js.map +1 -1
- package/fesm5/tree.js +1 -1
- package/fesm5/tree.js.map +1 -1
- package/form-field/form-field.d.ts +6 -0
- package/form-field/index.metadata.json +1 -1
- package/input/index.metadata.json +1 -1
- package/list/index.metadata.json +1 -1
- package/menu/index.metadata.json +1 -1
- package/package.json +2 -2
- package/radio/index.metadata.json +1 -1
- package/radio/radio.d.ts +8 -2
- package/schematics/collection.json +0 -7
- package/schematics/ng-add/index.js +1 -1
- package/schematics/ng-update/index.js +23 -23
- package/schematics/ng-update/{upgrade-rules → migrations}/hammer-gestures-v9/find-hammer-script-tags.d.ts +1 -1
- package/schematics/ng-update/migrations/hammer-gestures-v9/find-hammer-script-tags.js +51 -0
- package/schematics/ng-update/{upgrade-rules → migrations}/hammer-gestures-v9/find-main-module.d.ts +1 -1
- package/schematics/ng-update/migrations/hammer-gestures-v9/find-main-module.js +41 -0
- package/schematics/ng-update/{upgrade-rules → migrations}/hammer-gestures-v9/gesture-config.template +0 -0
- package/schematics/ng-update/{upgrade-rules/hammer-gestures-v9/hammer-gestures-rule.d.ts → migrations/hammer-gestures-v9/hammer-gestures-migration.d.ts} +6 -6
- package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-gestures-migration.js +784 -0
- package/schematics/ng-update/{upgrade-rules → migrations}/hammer-gestures-v9/hammer-template-check.d.ts +1 -1
- package/schematics/ng-update/migrations/hammer-gestures-v9/hammer-template-check.js +65 -0
- package/schematics/ng-update/{upgrade-rules → migrations}/hammer-gestures-v9/import-manager.d.ts +4 -4
- package/schematics/ng-update/migrations/hammer-gestures-v9/import-manager.js +379 -0
- package/schematics/ng-update/{upgrade-rules → migrations}/hammer-gestures-v9/remove-array-element.d.ts +1 -1
- package/schematics/ng-update/migrations/hammer-gestures-v9/remove-array-element.js +75 -0
- package/schematics/ng-update/{upgrade-rules → migrations}/hammer-gestures-v9/remove-element-from-html.d.ts +1 -1
- package/schematics/ng-update/migrations/hammer-gestures-v9/remove-element-from-html.js +37 -0
- package/schematics/ng-update/migrations/misc-checks/misc-class-inheritance.d.ts +19 -0
- package/schematics/ng-update/migrations/misc-checks/misc-class-inheritance.js +57 -0
- package/schematics/ng-update/{upgrade-rules/misc-checks/misc-class-names-rule.d.ts → migrations/misc-checks/misc-class-names.d.ts} +5 -5
- package/schematics/ng-update/migrations/misc-checks/misc-class-names.js +52 -0
- package/schematics/ng-update/{upgrade-rules/misc-checks/misc-imports-rule.d.ts → migrations/misc-checks/misc-imports.d.ts} +5 -5
- package/schematics/ng-update/migrations/misc-checks/misc-imports.js +63 -0
- package/schematics/ng-update/{upgrade-rules/misc-checks/misc-property-names-rule.d.ts → migrations/misc-checks/misc-property-names.d.ts} +5 -5
- package/schematics/ng-update/migrations/misc-checks/misc-property-names.js +56 -0
- package/schematics/ng-update/migrations/misc-checks/misc-template.d.ts +17 -0
- package/schematics/ng-update/migrations/misc-checks/misc-template.js +69 -0
- package/schematics/ng-update/{upgrade-rules/misc-ripples-v7/ripple-speed-factor-rule.d.ts → migrations/misc-ripples-v7/ripple-speed-factor-migration.d.ts} +5 -5
- package/schematics/ng-update/migrations/misc-ripples-v7/ripple-speed-factor-migration.js +147 -0
- package/schematics/ng-update/{upgrade-rules → migrations}/misc-ripples-v7/ripple-speed-factor.d.ts +1 -1
- package/schematics/ng-update/migrations/misc-ripples-v7/ripple-speed-factor.js +39 -0
- package/schematics/ng-update/{upgrade-rules → migrations}/package-imports-v8/material-symbols.json +0 -0
- package/schematics/ng-update/{upgrade-rules/package-imports-v8/secondary-entry-points-rule.d.ts → migrations/package-imports-v8/secondary-entry-points-migration.d.ts} +5 -5
- package/schematics/ng-update/migrations/package-imports-v8/secondary-entry-points-migration.js +177 -0
- package/schematics/ng-update/upgrade-data.d.ts +2 -2
- package/schematics/ng-update/upgrade-data.js +1 -1
- package/select/index.metadata.json +1 -1
- package/select/testing/select-harness.d.ts +2 -1
- package/sidenav/index.metadata.json +1 -1
- package/snack-bar/testing/snack-bar-harness.d.ts +2 -0
- package/table/index.metadata.json +1 -1
- package/tabs/_tabs-common.scss +5 -3
- package/tabs/index.metadata.json +1 -1
- package/tooltip/index.metadata.json +1 -1
- package/tree/index.metadata.json +1 -1
- package/schematics/ng-update/upgrade-rules/hammer-gestures-v9/find-hammer-script-tags.js +0 -51
- package/schematics/ng-update/upgrade-rules/hammer-gestures-v9/find-main-module.js +0 -41
- package/schematics/ng-update/upgrade-rules/hammer-gestures-v9/hammer-gestures-rule.js +0 -781
- package/schematics/ng-update/upgrade-rules/hammer-gestures-v9/hammer-template-check.js +0 -65
- package/schematics/ng-update/upgrade-rules/hammer-gestures-v9/import-manager.js +0 -379
- package/schematics/ng-update/upgrade-rules/hammer-gestures-v9/remove-array-element.js +0 -75
- package/schematics/ng-update/upgrade-rules/hammer-gestures-v9/remove-element-from-html.js +0 -37
- package/schematics/ng-update/upgrade-rules/misc-checks/misc-class-inheritance-rule.d.ts +0 -19
- package/schematics/ng-update/upgrade-rules/misc-checks/misc-class-inheritance-rule.js +0 -57
- package/schematics/ng-update/upgrade-rules/misc-checks/misc-class-names-rule.js +0 -52
- package/schematics/ng-update/upgrade-rules/misc-checks/misc-imports-rule.js +0 -63
- package/schematics/ng-update/upgrade-rules/misc-checks/misc-property-names-rule.js +0 -56
- package/schematics/ng-update/upgrade-rules/misc-checks/misc-template-rule.d.ts +0 -17
- package/schematics/ng-update/upgrade-rules/misc-checks/misc-template-rule.js +0 -69
- package/schematics/ng-update/upgrade-rules/misc-ripples-v7/ripple-speed-factor-rule.js +0 -147
- package/schematics/ng-update/upgrade-rules/misc-ripples-v7/ripple-speed-factor.js +0 -39
- package/schematics/ng-update/upgrade-rules/package-imports-v8/secondary-entry-points-rule.js +0 -177
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
6
|
* found in the LICENSE file at https://angular.io/license
|
|
7
7
|
*/
|
|
8
|
-
/// <amd-module name="@angular/material/schematics/ng-update/
|
|
8
|
+
/// <amd-module name="@angular/material/schematics/ng-update/migrations/hammer-gestures-v9/hammer-template-check" />
|
|
9
9
|
/**
|
|
10
10
|
* Parses the specified HTML and searches for elements with Angular outputs listening to
|
|
11
11
|
* one of the known HammerJS events. This check naively assumes that the bindings never
|
|
@@ -0,0 +1,65 @@
|
|
|
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
|
+
(function (factory) {
|
|
9
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
10
|
+
var v = factory(require, exports);
|
|
11
|
+
if (v !== undefined) module.exports = v;
|
|
12
|
+
}
|
|
13
|
+
else if (typeof define === "function" && define.amd) {
|
|
14
|
+
define("@angular/material/schematics/ng-update/migrations/hammer-gestures-v9/hammer-template-check", ["require", "exports", "@angular/cdk/schematics"], factory);
|
|
15
|
+
}
|
|
16
|
+
})(function (require, exports) {
|
|
17
|
+
"use strict";
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
const schematics_1 = require("@angular/cdk/schematics");
|
|
20
|
+
/** List of known events which are supported by the "HammerGesturesPlugin". */
|
|
21
|
+
const STANDARD_HAMMERJS_EVENTS = [
|
|
22
|
+
// Events supported by the "HammerGesturesPlugin". See:
|
|
23
|
+
// angular/angular/blob/0119f46d/packages/platform-browser/src/dom/events/hammer_gestures.ts#L19
|
|
24
|
+
'pan', 'panstart', 'panmove', 'panend', 'pancancel', 'panleft',
|
|
25
|
+
'panright', 'panup', 'pandown', 'pinch', 'pinchstart', 'pinchmove',
|
|
26
|
+
'pinchend', 'pinchcancel', 'pinchin', 'pinchout', 'press', 'pressup',
|
|
27
|
+
'rotate', 'rotatestart', 'rotatemove', 'rotateend', 'rotatecancel', 'swipe',
|
|
28
|
+
'swipeleft', 'swiperight', 'swipeup', 'swipedown', 'tap',
|
|
29
|
+
];
|
|
30
|
+
/** List of events which are provided by the deprecated Angular Material "GestureConfig". */
|
|
31
|
+
const CUSTOM_MATERIAL_HAMMERJS_EVENS = ['longpress', 'slide', 'slidestart', 'slideend', 'slideright', 'slideleft'];
|
|
32
|
+
/**
|
|
33
|
+
* Parses the specified HTML and searches for elements with Angular outputs listening to
|
|
34
|
+
* one of the known HammerJS events. This check naively assumes that the bindings never
|
|
35
|
+
* match on a component output, but only on the Hammer plugin.
|
|
36
|
+
*/
|
|
37
|
+
function isHammerJsUsedInTemplate(html) {
|
|
38
|
+
const document = schematics_1.parse5.parseFragment(html, { sourceCodeLocationInfo: true });
|
|
39
|
+
let customEvents = false;
|
|
40
|
+
let standardEvents = false;
|
|
41
|
+
const visitNodes = nodes => {
|
|
42
|
+
nodes.forEach((node) => {
|
|
43
|
+
if (node.attrs) {
|
|
44
|
+
for (let attr of node.attrs) {
|
|
45
|
+
if (!customEvents && CUSTOM_MATERIAL_HAMMERJS_EVENS.some(e => `(${e})` === attr.name)) {
|
|
46
|
+
customEvents = true;
|
|
47
|
+
}
|
|
48
|
+
if (!standardEvents && STANDARD_HAMMERJS_EVENTS.some(e => `(${e})` === attr.name)) {
|
|
49
|
+
standardEvents = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Do not continue traversing the AST if both type of HammerJS
|
|
54
|
+
// usages have been detected already.
|
|
55
|
+
if (node.childNodes && (!customEvents || !standardEvents)) {
|
|
56
|
+
visitNodes(node.childNodes);
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
};
|
|
60
|
+
visitNodes(document.childNodes);
|
|
61
|
+
return { customEvents, standardEvents };
|
|
62
|
+
}
|
|
63
|
+
exports.isHammerJsUsedInTemplate = isHammerJsUsedInTemplate;
|
|
64
|
+
});
|
|
65
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWVyLXRlbXBsYXRlLWNoZWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vc3JjL21hdGVyaWFsL3NjaGVtYXRpY3MvbmctdXBkYXRlL21pZ3JhdGlvbnMvaGFtbWVyLWdlc3R1cmVzLXY5L2hhbW1lci10ZW1wbGF0ZS1jaGVjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7Ozs7Ozs7Ozs7OztJQUVILHdEQUErQztJQUUvQyw4RUFBOEU7SUFDOUUsTUFBTSx3QkFBd0IsR0FBRztRQUMvQix1REFBdUQ7UUFDdkQsZ0dBQWdHO1FBQ2hHLEtBQUssRUFBUSxVQUFVLEVBQUssU0FBUyxFQUFLLFFBQVEsRUFBSyxXQUFXLEVBQUssU0FBUztRQUNoRixVQUFVLEVBQUcsT0FBTyxFQUFRLFNBQVMsRUFBSyxPQUFPLEVBQU0sWUFBWSxFQUFJLFdBQVc7UUFDbEYsVUFBVSxFQUFHLGFBQWEsRUFBRSxTQUFTLEVBQUssVUFBVSxFQUFHLE9BQU8sRUFBUyxTQUFTO1FBQ2hGLFFBQVEsRUFBSyxhQUFhLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBRSxjQUFjLEVBQUUsT0FBTztRQUM5RSxXQUFXLEVBQUUsWUFBWSxFQUFHLFNBQVMsRUFBSyxXQUFXLEVBQUUsS0FBSztLQUM3RCxDQUFDO0lBRUYsNEZBQTRGO0lBQzVGLE1BQU0sOEJBQThCLEdBQ2hDLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVoRjs7OztPQUlHO0lBQ0gsU0FBZ0Isd0JBQXdCLENBQUMsSUFBWTtRQUVuRCxNQUFNLFFBQVEsR0FDVixtQkFBTSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEVBQUUsRUFBQyxzQkFBc0IsRUFBRSxJQUFJLEVBQUMsQ0FBK0IsQ0FBQztRQUM3RixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7UUFDekIsSUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzNCLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFO1lBQ3pCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUErQixFQUFFLEVBQUU7Z0JBQ2hELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtvQkFDZCxLQUFLLElBQUksSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7d0JBQzNCLElBQUksQ0FBQyxZQUFZLElBQUksOEJBQThCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQ3JGLFlBQVksR0FBRyxJQUFJLENBQUM7eUJBQ3JCO3dCQUNELElBQUksQ0FBQyxjQUFjLElBQUksd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7NEJBQ2pGLGNBQWMsR0FBRyxJQUFJLENBQUM7eUJBQ3ZCO3FCQUNGO2lCQUNGO2dCQUVELDhEQUE4RDtnQkFDOUQscUNBQXFDO2dCQUNyQyxJQUFJLElBQUksQ0FBQyxVQUFVLElBQUksQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFO29CQUN6RCxVQUFVLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO2lCQUM3QjtZQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBQ0YsVUFBVSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNoQyxPQUFPLEVBQUMsWUFBWSxFQUFFLGNBQWMsRUFBQyxDQUFDO0lBQ3hDLENBQUM7SUE1QkQsNERBNEJDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7cGFyc2U1fSBmcm9tICdAYW5ndWxhci9jZGsvc2NoZW1hdGljcyc7XG5cbi8qKiBMaXN0IG9mIGtub3duIGV2ZW50cyB3aGljaCBhcmUgc3VwcG9ydGVkIGJ5IHRoZSBcIkhhbW1lckdlc3R1cmVzUGx1Z2luXCIuICovXG5jb25zdCBTVEFOREFSRF9IQU1NRVJKU19FVkVOVFMgPSBbXG4gIC8vIEV2ZW50cyBzdXBwb3J0ZWQgYnkgdGhlIFwiSGFtbWVyR2VzdHVyZXNQbHVnaW5cIi4gU2VlOlxuICAvLyBhbmd1bGFyL2FuZ3VsYXIvYmxvYi8wMTE5ZjQ2ZC9wYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9kb20vZXZlbnRzL2hhbW1lcl9nZXN0dXJlcy50cyNMMTlcbiAgJ3BhbicsICAgICAgICdwYW5zdGFydCcsICAgICdwYW5tb3ZlJywgICAgJ3BhbmVuZCcsICAgICdwYW5jYW5jZWwnLCAgICAncGFubGVmdCcsXG4gICdwYW5yaWdodCcsICAncGFudXAnLCAgICAgICAncGFuZG93bicsICAgICdwaW5jaCcsICAgICAncGluY2hzdGFydCcsICAgJ3BpbmNobW92ZScsXG4gICdwaW5jaGVuZCcsICAncGluY2hjYW5jZWwnLCAncGluY2hpbicsICAgICdwaW5jaG91dCcsICAncHJlc3MnLCAgICAgICAgJ3ByZXNzdXAnLFxuICAncm90YXRlJywgICAgJ3JvdGF0ZXN0YXJ0JywgJ3JvdGF0ZW1vdmUnLCAncm90YXRlZW5kJywgJ3JvdGF0ZWNhbmNlbCcsICdzd2lwZScsXG4gICdzd2lwZWxlZnQnLCAnc3dpcGVyaWdodCcsICAnc3dpcGV1cCcsICAgICdzd2lwZWRvd24nLCAndGFwJyxcbl07XG5cbi8qKiBMaXN0IG9mIGV2ZW50cyB3aGljaCBhcmUgcHJvdmlkZWQgYnkgdGhlIGRlcHJlY2F0ZWQgQW5ndWxhciBNYXRlcmlhbCBcIkdlc3R1cmVDb25maWdcIi4gKi9cbmNvbnN0IENVU1RPTV9NQVRFUklBTF9IQU1NRVJKU19FVkVOUyA9XG4gICAgWydsb25ncHJlc3MnLCAnc2xpZGUnLCAnc2xpZGVzdGFydCcsICdzbGlkZWVuZCcsICdzbGlkZXJpZ2h0JywgJ3NsaWRlbGVmdCddO1xuXG4vKipcbiAqIFBhcnNlcyB0aGUgc3BlY2lmaWVkIEhUTUwgYW5kIHNlYXJjaGVzIGZvciBlbGVtZW50cyB3aXRoIEFuZ3VsYXIgb3V0cHV0cyBsaXN0ZW5pbmcgdG9cbiAqIG9uZSBvZiB0aGUga25vd24gSGFtbWVySlMgZXZlbnRzLiBUaGlzIGNoZWNrIG5haXZlbHkgYXNzdW1lcyB0aGF0IHRoZSBiaW5kaW5ncyBuZXZlclxuICogbWF0Y2ggb24gYSBjb21wb25lbnQgb3V0cHV0LCBidXQgb25seSBvbiB0aGUgSGFtbWVyIHBsdWdpbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSGFtbWVySnNVc2VkSW5UZW1wbGF0ZShodG1sOiBzdHJpbmcpOlxuICAgIHtzdGFuZGFyZEV2ZW50czogYm9vbGVhbiwgY3VzdG9tRXZlbnRzOiBib29sZWFufSB7XG4gIGNvbnN0IGRvY3VtZW50ID1cbiAgICAgIHBhcnNlNS5wYXJzZUZyYWdtZW50KGh0bWwsIHtzb3VyY2VDb2RlTG9jYXRpb25JbmZvOiB0cnVlfSkgYXMgcGFyc2U1LkRlZmF1bHRUcmVlRG9jdW1lbnQ7XG4gIGxldCBjdXN0b21FdmVudHMgPSBmYWxzZTtcbiAgbGV0IHN0YW5kYXJkRXZlbnRzID0gZmFsc2U7XG4gIGNvbnN0IHZpc2l0Tm9kZXMgPSBub2RlcyA9PiB7XG4gICAgbm9kZXMuZm9yRWFjaCgobm9kZTogcGFyc2U1LkRlZmF1bHRUcmVlRWxlbWVudCkgPT4ge1xuICAgICAgaWYgKG5vZGUuYXR0cnMpIHtcbiAgICAgICAgZm9yIChsZXQgYXR0ciBvZiBub2RlLmF0dHJzKSB7XG4gICAgICAgICAgaWYgKCFjdXN0b21FdmVudHMgJiYgQ1VTVE9NX01BVEVSSUFMX0hBTU1FUkpTX0VWRU5TLnNvbWUoZSA9PiBgKCR7ZX0pYCA9PT0gYXR0ci5uYW1lKSkge1xuICAgICAgICAgICAgY3VzdG9tRXZlbnRzID0gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFzdGFuZGFyZEV2ZW50cyAmJiBTVEFOREFSRF9IQU1NRVJKU19FVkVOVFMuc29tZShlID0+IGAoJHtlfSlgID09PSBhdHRyLm5hbWUpKSB7XG4gICAgICAgICAgICBzdGFuZGFyZEV2ZW50cyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIERvIG5vdCBjb250aW51ZSB0cmF2ZXJzaW5nIHRoZSBBU1QgaWYgYm90aCB0eXBlIG9mIEhhbW1lckpTXG4gICAgICAvLyB1c2FnZXMgaGF2ZSBiZWVuIGRldGVjdGVkIGFscmVhZHkuXG4gICAgICBpZiAobm9kZS5jaGlsZE5vZGVzICYmICghY3VzdG9tRXZlbnRzIHx8ICFzdGFuZGFyZEV2ZW50cykpIHtcbiAgICAgICAgdmlzaXROb2Rlcyhub2RlLmNoaWxkTm9kZXMpO1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICB2aXNpdE5vZGVzKGRvY3VtZW50LmNoaWxkTm9kZXMpO1xuICByZXR1cm4ge2N1c3RvbUV2ZW50cywgc3RhbmRhcmRFdmVudHN9O1xufVxuIl19
|
package/schematics/ng-update/{upgrade-rules → migrations}/hammer-gestures-v9/import-manager.d.ts
RENAMED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
6
|
* found in the LICENSE file at https://angular.io/license
|
|
7
7
|
*/
|
|
8
|
-
/// <amd-module name="@angular/material/schematics/ng-update/
|
|
9
|
-
import {
|
|
8
|
+
/// <amd-module name="@angular/material/schematics/ng-update/migrations/hammer-gestures-v9/import-manager" />
|
|
9
|
+
import { FileSystem } from '@angular/cdk/schematics';
|
|
10
10
|
import * as ts from 'typescript';
|
|
11
11
|
/**
|
|
12
12
|
* Import manager that can be used to add or remove TypeScript imports within source
|
|
@@ -14,13 +14,13 @@ import * as ts from 'typescript';
|
|
|
14
14
|
* without shifted offsets and that existing imports are re-used.
|
|
15
15
|
*/
|
|
16
16
|
export declare class ImportManager {
|
|
17
|
-
private
|
|
17
|
+
private _fileSystem;
|
|
18
18
|
private _printer;
|
|
19
19
|
/** Map of source-files and their previously used identifier names. */
|
|
20
20
|
private _usedIdentifierNames;
|
|
21
21
|
/** Map of source files and their analyzed imports. */
|
|
22
22
|
private _importCache;
|
|
23
|
-
constructor(
|
|
23
|
+
constructor(_fileSystem: FileSystem, _printer: ts.Printer);
|
|
24
24
|
/**
|
|
25
25
|
* Analyzes the import of the specified source file if needed. In order to perform
|
|
26
26
|
* modifications to imports of a source file, we store all imports in memory and
|
|
@@ -0,0 +1,379 @@
|
|
|
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
|
+
(function (factory) {
|
|
9
|
+
if (typeof module === "object" && typeof module.exports === "object") {
|
|
10
|
+
var v = factory(require, exports);
|
|
11
|
+
if (v !== undefined) module.exports = v;
|
|
12
|
+
}
|
|
13
|
+
else if (typeof define === "function" && define.amd) {
|
|
14
|
+
define("@angular/material/schematics/ng-update/migrations/hammer-gestures-v9/import-manager", ["require", "exports", "path", "typescript"], factory);
|
|
15
|
+
}
|
|
16
|
+
})(function (require, exports) {
|
|
17
|
+
"use strict";
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
const path_1 = require("path");
|
|
20
|
+
const ts = require("typescript");
|
|
21
|
+
/** Checks whether an analyzed import has the given import flag set. */
|
|
22
|
+
const hasFlag = (data, flag) => (data.state & flag) !== 0;
|
|
23
|
+
/**
|
|
24
|
+
* Import manager that can be used to add or remove TypeScript imports within source
|
|
25
|
+
* files. The manager ensures that multiple transformations are applied properly
|
|
26
|
+
* without shifted offsets and that existing imports are re-used.
|
|
27
|
+
*/
|
|
28
|
+
class ImportManager {
|
|
29
|
+
constructor(_fileSystem, _printer) {
|
|
30
|
+
this._fileSystem = _fileSystem;
|
|
31
|
+
this._printer = _printer;
|
|
32
|
+
/** Map of source-files and their previously used identifier names. */
|
|
33
|
+
this._usedIdentifierNames = new Map();
|
|
34
|
+
/** Map of source files and their analyzed imports. */
|
|
35
|
+
this._importCache = new Map();
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Analyzes the import of the specified source file if needed. In order to perform
|
|
39
|
+
* modifications to imports of a source file, we store all imports in memory and
|
|
40
|
+
* update the source file once all changes have been made. This is essential to
|
|
41
|
+
* ensure that we can re-use newly added imports and not break file offsets.
|
|
42
|
+
*/
|
|
43
|
+
_analyzeImportsIfNeeded(sourceFile) {
|
|
44
|
+
if (this._importCache.has(sourceFile)) {
|
|
45
|
+
return this._importCache.get(sourceFile);
|
|
46
|
+
}
|
|
47
|
+
const result = [];
|
|
48
|
+
for (let node of sourceFile.statements) {
|
|
49
|
+
if (!ts.isImportDeclaration(node) || !ts.isStringLiteral(node.moduleSpecifier)) {
|
|
50
|
+
continue;
|
|
51
|
+
}
|
|
52
|
+
const moduleName = node.moduleSpecifier.text;
|
|
53
|
+
// Handles side-effect imports which do neither have a name or
|
|
54
|
+
// specifiers. e.g. `import "my-package";`
|
|
55
|
+
if (!node.importClause) {
|
|
56
|
+
result.push({ moduleName, node, state: 0 /* UNMODIFIED */ });
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
// Handles imports resolving to default exports of a module.
|
|
60
|
+
// e.g. `import moment from "moment";`
|
|
61
|
+
if (!node.importClause.namedBindings) {
|
|
62
|
+
result.push({ moduleName, node, name: node.importClause.name, state: 0 /* UNMODIFIED */ });
|
|
63
|
+
continue;
|
|
64
|
+
}
|
|
65
|
+
// Handles imports with individual symbol specifiers.
|
|
66
|
+
// e.g. `import {A, B, C} from "my-module";`
|
|
67
|
+
if (ts.isNamedImports(node.importClause.namedBindings)) {
|
|
68
|
+
result.push({
|
|
69
|
+
moduleName,
|
|
70
|
+
node,
|
|
71
|
+
specifiers: node.importClause.namedBindings.elements.map(el => ({ name: el.name, propertyName: el.propertyName })),
|
|
72
|
+
state: 0 /* UNMODIFIED */,
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
else {
|
|
76
|
+
// Handles namespaced imports. e.g. `import * as core from "my-pkg";`
|
|
77
|
+
result.push({
|
|
78
|
+
moduleName,
|
|
79
|
+
node,
|
|
80
|
+
name: node.importClause.namedBindings.name,
|
|
81
|
+
namespace: true,
|
|
82
|
+
state: 0 /* UNMODIFIED */,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
this._importCache.set(sourceFile, result);
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Checks whether the given specifier, which can be relative to the base path,
|
|
91
|
+
* matches the passed module name.
|
|
92
|
+
*/
|
|
93
|
+
_isModuleSpecifierMatching(basePath, specifier, moduleName) {
|
|
94
|
+
return specifier.startsWith('.') ?
|
|
95
|
+
path_1.resolve(basePath, specifier) === path_1.resolve(basePath, moduleName) :
|
|
96
|
+
specifier === moduleName;
|
|
97
|
+
}
|
|
98
|
+
/** Deletes a given named binding import from the specified source file. */
|
|
99
|
+
deleteNamedBindingImport(sourceFile, symbolName, moduleName) {
|
|
100
|
+
const sourceDir = path_1.dirname(sourceFile.fileName);
|
|
101
|
+
const fileImports = this._analyzeImportsIfNeeded(sourceFile);
|
|
102
|
+
for (let importData of fileImports) {
|
|
103
|
+
if (!this._isModuleSpecifierMatching(sourceDir, importData.moduleName, moduleName) ||
|
|
104
|
+
!importData.specifiers) {
|
|
105
|
+
continue;
|
|
106
|
+
}
|
|
107
|
+
const specifierIndex = importData.specifiers.findIndex(d => (d.propertyName || d.name).text === symbolName);
|
|
108
|
+
if (specifierIndex !== -1) {
|
|
109
|
+
importData.specifiers.splice(specifierIndex, 1);
|
|
110
|
+
// if the import does no longer contain any specifiers after the removal of the
|
|
111
|
+
// given symbol, we can just mark the whole import for deletion. Otherwise, we mark
|
|
112
|
+
// it as modified so that it will be re-printed.
|
|
113
|
+
if (importData.specifiers.length === 0) {
|
|
114
|
+
importData.state |= 8 /* DELETED */;
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
importData.state |= 2 /* MODIFIED */;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** Deletes the import that matches the given import declaration if found. */
|
|
123
|
+
deleteImportByDeclaration(declaration) {
|
|
124
|
+
const fileImports = this._analyzeImportsIfNeeded(declaration.getSourceFile());
|
|
125
|
+
for (let importData of fileImports) {
|
|
126
|
+
if (importData.node === declaration) {
|
|
127
|
+
importData.state |= 8 /* DELETED */;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Adds an import to the given source file and returns the TypeScript expression that
|
|
133
|
+
* can be used to access the newly imported symbol.
|
|
134
|
+
*
|
|
135
|
+
* Whenever an import is added to a source file, it's recommended that the returned
|
|
136
|
+
* expression is used to reference th symbol. This is necessary because the symbol
|
|
137
|
+
* could be aliased if it would collide with existing imports in source file.
|
|
138
|
+
*
|
|
139
|
+
* @param sourceFile Source file to which the import should be added.
|
|
140
|
+
* @param symbolName Name of the symbol that should be imported. Can be null if
|
|
141
|
+
* the default export is requested.
|
|
142
|
+
* @param moduleName Name of the module of which the symbol should be imported.
|
|
143
|
+
* @param typeImport Whether the symbol is a type.
|
|
144
|
+
* @param ignoreIdentifierCollisions List of identifiers which can be ignored when
|
|
145
|
+
* the import manager checks for import collisions.
|
|
146
|
+
*/
|
|
147
|
+
addImportToSourceFile(sourceFile, symbolName, moduleName, typeImport = false, ignoreIdentifierCollisions = []) {
|
|
148
|
+
const sourceDir = path_1.dirname(sourceFile.fileName);
|
|
149
|
+
const fileImports = this._analyzeImportsIfNeeded(sourceFile);
|
|
150
|
+
let existingImport = null;
|
|
151
|
+
for (let importData of fileImports) {
|
|
152
|
+
if (!this._isModuleSpecifierMatching(sourceDir, importData.moduleName, moduleName)) {
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
// If no symbol name has been specified, the default import is requested. In that
|
|
156
|
+
// case we search for non-namespace and non-specifier imports.
|
|
157
|
+
if (!symbolName && !importData.namespace && !importData.specifiers) {
|
|
158
|
+
return ts.createIdentifier(importData.name.text);
|
|
159
|
+
}
|
|
160
|
+
// In case a "Type" symbol is imported, we can't use namespace imports
|
|
161
|
+
// because these only export symbols available at runtime (no types)
|
|
162
|
+
if (importData.namespace && !typeImport) {
|
|
163
|
+
return ts.createPropertyAccess(ts.createIdentifier(importData.name.text), ts.createIdentifier(symbolName || 'default'));
|
|
164
|
+
}
|
|
165
|
+
else if (importData.specifiers && symbolName) {
|
|
166
|
+
const existingSpecifier = importData.specifiers.find(s => s.propertyName ? s.propertyName.text === symbolName : s.name.text === symbolName);
|
|
167
|
+
if (existingSpecifier) {
|
|
168
|
+
return ts.createIdentifier(existingSpecifier.name.text);
|
|
169
|
+
}
|
|
170
|
+
// In case the symbol could not be found in an existing import, we
|
|
171
|
+
// keep track of the import declaration as it can be updated to include
|
|
172
|
+
// the specified symbol name without having to create a new import.
|
|
173
|
+
existingImport = importData;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// If there is an existing import that matches the specified module, we
|
|
177
|
+
// just update the import specifiers to also import the requested symbol.
|
|
178
|
+
if (existingImport) {
|
|
179
|
+
const propertyIdentifier = ts.createIdentifier(symbolName);
|
|
180
|
+
const generatedUniqueIdentifier = this._getUniqueIdentifier(sourceFile, symbolName, ignoreIdentifierCollisions);
|
|
181
|
+
const needsGeneratedUniqueName = generatedUniqueIdentifier.text !== symbolName;
|
|
182
|
+
const importName = needsGeneratedUniqueName ? generatedUniqueIdentifier : propertyIdentifier;
|
|
183
|
+
existingImport.specifiers.push({
|
|
184
|
+
name: importName,
|
|
185
|
+
propertyName: needsGeneratedUniqueName ? propertyIdentifier : undefined,
|
|
186
|
+
});
|
|
187
|
+
existingImport.state |= 2 /* MODIFIED */;
|
|
188
|
+
if (hasFlag(existingImport, 8 /* DELETED */)) {
|
|
189
|
+
// unset the deleted flag if the import is pending deletion, but
|
|
190
|
+
// can now be used for the new imported symbol.
|
|
191
|
+
existingImport.state &= ~8 /* DELETED */;
|
|
192
|
+
}
|
|
193
|
+
return importName;
|
|
194
|
+
}
|
|
195
|
+
let identifier = null;
|
|
196
|
+
let newImport = null;
|
|
197
|
+
if (symbolName) {
|
|
198
|
+
const propertyIdentifier = ts.createIdentifier(symbolName);
|
|
199
|
+
const generatedUniqueIdentifier = this._getUniqueIdentifier(sourceFile, symbolName, ignoreIdentifierCollisions);
|
|
200
|
+
const needsGeneratedUniqueName = generatedUniqueIdentifier.text !== symbolName;
|
|
201
|
+
identifier = needsGeneratedUniqueName ? generatedUniqueIdentifier : propertyIdentifier;
|
|
202
|
+
const newImportDecl = ts.createImportDeclaration(undefined, undefined, ts.createImportClause(undefined, ts.createNamedImports([])), ts.createStringLiteral(moduleName));
|
|
203
|
+
newImport = {
|
|
204
|
+
moduleName,
|
|
205
|
+
node: newImportDecl,
|
|
206
|
+
specifiers: [{
|
|
207
|
+
propertyName: needsGeneratedUniqueName ? propertyIdentifier : undefined,
|
|
208
|
+
name: identifier
|
|
209
|
+
}],
|
|
210
|
+
state: 4 /* ADDED */,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
else {
|
|
214
|
+
identifier =
|
|
215
|
+
this._getUniqueIdentifier(sourceFile, 'defaultExport', ignoreIdentifierCollisions);
|
|
216
|
+
const newImportDecl = ts.createImportDeclaration(undefined, undefined, ts.createImportClause(identifier, undefined), ts.createStringLiteral(moduleName));
|
|
217
|
+
newImport = {
|
|
218
|
+
moduleName,
|
|
219
|
+
node: newImportDecl,
|
|
220
|
+
name: identifier,
|
|
221
|
+
state: 4 /* ADDED */,
|
|
222
|
+
};
|
|
223
|
+
}
|
|
224
|
+
fileImports.push(newImport);
|
|
225
|
+
return identifier;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Applies the recorded changes in the update recorders of the corresponding source files.
|
|
229
|
+
* The changes are applied separately after all changes have been recorded because otherwise
|
|
230
|
+
* file offsets will change and the source files would need to be re-parsed after each change.
|
|
231
|
+
*/
|
|
232
|
+
recordChanges() {
|
|
233
|
+
this._importCache.forEach((fileImports, sourceFile) => {
|
|
234
|
+
const recorder = this._fileSystem.edit(sourceFile.fileName);
|
|
235
|
+
const lastUnmodifiedImport = fileImports.reverse().find(i => i.state === 0 /* UNMODIFIED */);
|
|
236
|
+
const importStartIndex = lastUnmodifiedImport ? this._getEndPositionOfNode(lastUnmodifiedImport.node) : 0;
|
|
237
|
+
fileImports.forEach(importData => {
|
|
238
|
+
if (importData.state === 0 /* UNMODIFIED */) {
|
|
239
|
+
return;
|
|
240
|
+
}
|
|
241
|
+
if (hasFlag(importData, 8 /* DELETED */)) {
|
|
242
|
+
// Imports which do not exist in source file, can be just skipped as
|
|
243
|
+
// we do not need any replacement to delete the import.
|
|
244
|
+
if (!hasFlag(importData, 4 /* ADDED */)) {
|
|
245
|
+
recorder.remove(importData.node.getFullStart(), importData.node.getFullWidth());
|
|
246
|
+
}
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
if (importData.specifiers) {
|
|
250
|
+
const namedBindings = importData.node.importClause.namedBindings;
|
|
251
|
+
const importSpecifiers = importData.specifiers.map(s => ts.createImportSpecifier(s.propertyName, s.name));
|
|
252
|
+
const updatedBindings = ts.updateNamedImports(namedBindings, importSpecifiers);
|
|
253
|
+
// In case an import has been added newly, we need to print the whole import
|
|
254
|
+
// declaration and insert it at the import start index. Otherwise, we just
|
|
255
|
+
// update the named bindings to not re-print the whole import (which could
|
|
256
|
+
// cause unnecessary formatting changes)
|
|
257
|
+
if (hasFlag(importData, 4 /* ADDED */)) {
|
|
258
|
+
const updatedImport = ts.updateImportDeclaration(importData.node, undefined, undefined, ts.createImportClause(undefined, updatedBindings), ts.createStringLiteral(importData.moduleName));
|
|
259
|
+
const newImportText = this._printer.printNode(ts.EmitHint.Unspecified, updatedImport, sourceFile);
|
|
260
|
+
recorder.insertLeft(importStartIndex, importStartIndex === 0 ? `${newImportText}\n` : `\n${newImportText}`);
|
|
261
|
+
return;
|
|
262
|
+
}
|
|
263
|
+
else if (hasFlag(importData, 2 /* MODIFIED */)) {
|
|
264
|
+
const newNamedBindingsText = this._printer.printNode(ts.EmitHint.Unspecified, updatedBindings, sourceFile);
|
|
265
|
+
recorder.remove(namedBindings.getStart(), namedBindings.getWidth());
|
|
266
|
+
recorder.insertRight(namedBindings.getStart(), newNamedBindingsText);
|
|
267
|
+
return;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
else if (hasFlag(importData, 4 /* ADDED */)) {
|
|
271
|
+
const newImportText = this._printer.printNode(ts.EmitHint.Unspecified, importData.node, sourceFile);
|
|
272
|
+
recorder.insertLeft(importStartIndex, importStartIndex === 0 ? `${newImportText}\n` : `\n${newImportText}`);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
// we should never hit this, but we rather want to print a custom exception
|
|
276
|
+
// instead of just skipping imports silently.
|
|
277
|
+
throw Error('Unexpected import modification.');
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Corrects the line and character position of a given node. Since nodes of
|
|
283
|
+
* source files are immutable and we sometimes make changes to the containing
|
|
284
|
+
* source file, the node position might shift (e.g. if we add a new import before).
|
|
285
|
+
*
|
|
286
|
+
* This method can be used to retrieve a corrected position of the given node. This
|
|
287
|
+
* is helpful when printing out error messages which should reflect the new state of
|
|
288
|
+
* source files.
|
|
289
|
+
*/
|
|
290
|
+
correctNodePosition(node, offset, position) {
|
|
291
|
+
const sourceFile = node.getSourceFile();
|
|
292
|
+
if (!this._importCache.has(sourceFile)) {
|
|
293
|
+
return position;
|
|
294
|
+
}
|
|
295
|
+
const newPosition = Object.assign({}, position);
|
|
296
|
+
const fileImports = this._importCache.get(sourceFile);
|
|
297
|
+
for (let importData of fileImports) {
|
|
298
|
+
const fullEnd = importData.node.getFullStart() + importData.node.getFullWidth();
|
|
299
|
+
// Subtract or add lines based on whether an import has been deleted or removed
|
|
300
|
+
// before the actual node offset.
|
|
301
|
+
if (offset > fullEnd && hasFlag(importData, 8 /* DELETED */)) {
|
|
302
|
+
newPosition.line--;
|
|
303
|
+
}
|
|
304
|
+
else if (offset > fullEnd && hasFlag(importData, 4 /* ADDED */)) {
|
|
305
|
+
newPosition.line++;
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
return newPosition;
|
|
309
|
+
}
|
|
310
|
+
/**
|
|
311
|
+
* Returns an unique identifier name for the specified symbol name.
|
|
312
|
+
* @param sourceFile Source file to check for identifier collisions.
|
|
313
|
+
* @param symbolName Name of the symbol for which we want to generate an unique name.
|
|
314
|
+
* @param ignoreIdentifierCollisions List of identifiers which should be ignored when
|
|
315
|
+
* checking for identifier collisions in the given source file.
|
|
316
|
+
*/
|
|
317
|
+
_getUniqueIdentifier(sourceFile, symbolName, ignoreIdentifierCollisions) {
|
|
318
|
+
if (this._isUniqueIdentifierName(sourceFile, symbolName, ignoreIdentifierCollisions)) {
|
|
319
|
+
this._recordUsedIdentifier(sourceFile, symbolName);
|
|
320
|
+
return ts.createIdentifier(symbolName);
|
|
321
|
+
}
|
|
322
|
+
let name = null;
|
|
323
|
+
let counter = 1;
|
|
324
|
+
do {
|
|
325
|
+
name = `${symbolName}_${counter++}`;
|
|
326
|
+
} while (!this._isUniqueIdentifierName(sourceFile, name, ignoreIdentifierCollisions));
|
|
327
|
+
this._recordUsedIdentifier(sourceFile, name);
|
|
328
|
+
return ts.createIdentifier(name);
|
|
329
|
+
}
|
|
330
|
+
/**
|
|
331
|
+
* Checks whether the specified identifier name is used within the given source file.
|
|
332
|
+
* @param sourceFile Source file to check for identifier collisions.
|
|
333
|
+
* @param name Name of the identifier which is checked for its uniqueness.
|
|
334
|
+
* @param ignoreIdentifierCollisions List of identifiers which should be ignored when
|
|
335
|
+
* checking for identifier collisions in the given source file.
|
|
336
|
+
*/
|
|
337
|
+
_isUniqueIdentifierName(sourceFile, name, ignoreIdentifierCollisions) {
|
|
338
|
+
if (this._usedIdentifierNames.has(sourceFile) &&
|
|
339
|
+
this._usedIdentifierNames.get(sourceFile).indexOf(name) !== -1) {
|
|
340
|
+
return false;
|
|
341
|
+
}
|
|
342
|
+
// Walk through the source file and search for an identifier matching
|
|
343
|
+
// the given name. In that case, it's not guaranteed that this name
|
|
344
|
+
// is unique in the given declaration scope and we just return false.
|
|
345
|
+
const nodeQueue = [sourceFile];
|
|
346
|
+
while (nodeQueue.length) {
|
|
347
|
+
const node = nodeQueue.shift();
|
|
348
|
+
if (ts.isIdentifier(node) && node.text === name &&
|
|
349
|
+
!ignoreIdentifierCollisions.includes(node)) {
|
|
350
|
+
return false;
|
|
351
|
+
}
|
|
352
|
+
nodeQueue.push(...node.getChildren());
|
|
353
|
+
}
|
|
354
|
+
return true;
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Records that the given identifier is used within the specified source file. This
|
|
358
|
+
* is necessary since we do not apply changes to source files per change, but still
|
|
359
|
+
* want to avoid conflicts with newly imported symbols.
|
|
360
|
+
*/
|
|
361
|
+
_recordUsedIdentifier(sourceFile, identifierName) {
|
|
362
|
+
this._usedIdentifierNames.set(sourceFile, (this._usedIdentifierNames.get(sourceFile) || []).concat(identifierName));
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Determines the full end of a given node. By default the end position of a node is
|
|
366
|
+
* before all trailing comments. This could mean that generated imports shift comments.
|
|
367
|
+
*/
|
|
368
|
+
_getEndPositionOfNode(node) {
|
|
369
|
+
const nodeEndPos = node.getEnd();
|
|
370
|
+
const commentRanges = ts.getTrailingCommentRanges(node.getSourceFile().text, nodeEndPos);
|
|
371
|
+
if (!commentRanges || !commentRanges.length) {
|
|
372
|
+
return nodeEndPos;
|
|
373
|
+
}
|
|
374
|
+
return commentRanges[commentRanges.length - 1].end;
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
exports.ImportManager = ImportManager;
|
|
378
|
+
});
|
|
379
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1wb3J0LW1hbmFnZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9zcmMvbWF0ZXJpYWwvc2NoZW1hdGljcy9uZy11cGRhdGUvbWlncmF0aW9ucy9oYW1tZXItZ2VzdHVyZXMtdjkvaW1wb3J0LW1hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HOzs7Ozs7Ozs7Ozs7SUFHSCwrQkFBc0M7SUFDdEMsaUNBQWlDO0lBNEJqQyx1RUFBdUU7SUFDdkUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUFvQixFQUFFLElBQWlCLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFdkY7Ozs7T0FJRztJQUNILE1BQWEsYUFBYTtRQU94QixZQUNZLFdBQXVCLEVBQ3ZCLFFBQW9CO1lBRHBCLGdCQUFXLEdBQVgsV0FBVyxDQUFZO1lBQ3ZCLGFBQVEsR0FBUixRQUFRLENBQVk7WUFSaEMsc0VBQXNFO1lBQzlELHlCQUFvQixHQUFHLElBQUksR0FBRyxFQUEyQixDQUFDO1lBRWxFLHNEQUFzRDtZQUM5QyxpQkFBWSxHQUFHLElBQUksR0FBRyxFQUFtQyxDQUFDO1FBSS9CLENBQUM7UUFFcEM7Ozs7O1dBS0c7UUFDSyx1QkFBdUIsQ0FBQyxVQUF5QjtZQUN2RCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxFQUFFO2dCQUNyQyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBRSxDQUFDO2FBQzNDO1lBRUQsTUFBTSxNQUFNLEdBQXFCLEVBQUUsQ0FBQztZQUNwQyxLQUFLLElBQUksSUFBSSxJQUFJLFVBQVUsQ0FBQyxVQUFVLEVBQUU7Z0JBQ3RDLElBQUksQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENB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QUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztZQUN6RixJQUFJLENBQUMsYUFBYSxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRTtnQkFDM0MsT0FBTyxVQUFVLENBQUM7YUFDbkI7WUFDRCxPQUFPLGFBQWEsQ0FBQyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBRSxDQUFDLEdBQUcsQ0FBQztRQUN0RCxDQUFDO0tBQ0Y7SUFoYUQsc0NBZ2FDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7RmlsZVN5c3RlbX0gZnJvbSAnQGFuZ3VsYXIvY2RrL3NjaGVtYXRpY3MnO1xuaW1wb3J0IHtkaXJuYW1lLCByZXNvbHZlfSBmcm9tICdwYXRoJztcbmltcG9ydCAqIGFzIHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1iaXR3aXNlXG5cbi8qKiBFbnVtIGRlc2NyaWJpbmcgdGhlIHBvc3NpYmxlIHN0YXRlcyBvZiBhbiBhbmFseXplZCBpbXBvcnQuICovXG5jb25zdCBlbnVtIEltcG9ydFN0YXRlIHtcbiAgVU5NT0RJRklFRCA9IDBiMCxcbiAgTU9ESUZJRUQgPSAwYjEwLFxuICBBRERFRCA9IDBiMTAwLFxuICBERUxFVEVEID0gMGIxMDAwLFxufVxuXG4vKiogSW50ZXJmYWNlIGRlc2NyaWJpbmcgYW4gaW1wb3J0IHNwZWNpZmllci4gKi9cbmludGVyZmFjZSBJbXBvcnRTcGVjaWZpZXIge1xuICBuYW1lOiB0cy5JZGVudGlmaWVyO1xuICBwcm9wZXJ0eU5hbWU/OiB0cy5JZGVudGlmaWVyO1xufVxuXG4vKiogSW50ZXJmYWNlIGRlc2NyaWJpbmcgYW4gYW5hbHl6ZWQgaW1wb3J0LiAqL1xuaW50ZXJmYWNlIEFuYWx5emVkSW1wb3J0IHtcbiAgbm9kZTogdHMuSW1wb3J0RGVjbGFyYXRpb247XG4gIG1vZHVsZU5hbWU6IHN0cmluZztcbiAgbmFtZT86IHRzLklkZW50aWZpZXI7XG4gIHNwZWNpZmllcnM/OiBJbXBvcnRTcGVjaWZpZXJbXTtcbiAgbmFtZXNwYWNlPzogYm9vbGVhbjtcbiAgc3RhdGU6IEltcG9ydFN0YXRlO1xufVxuXG4vKiogQ2hlY2tzIHdoZXRoZXIgYW4gYW5hbHl6ZWQgaW1wb3J0IGhhcyB0aGUgZ2l2ZW4gaW1wb3J0IGZsYWcgc2V0LiAqL1xuY29uc3QgaGFzRmxhZyA9IChkYXRhOiBBbmFseXplZEltcG9ydCwgZmxhZzogSW1wb3J0U3RhdGUpID0+IChkYXRhLnN0YXRlICYgZmxhZykgIT09IDA7XG5cbi8qKlxuICogSW1wb3J0IG1hbmFnZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBhZGQgb3IgcmVtb3ZlIFR5cGVTY3JpcHQgaW1wb3J0cyB3aXRoaW4gc291cmNlXG4gKiBmaWxlcy4gVGhlIG1hbmFnZXIgZW5zdXJlcyB0aGF0IG11bHRpcGxlIHRyYW5zZm9ybWF0aW9ucyBhcmUgYXBwbGllZCBwcm9wZXJseVxuICogd2l0aG91dCBzaGlmdGVkIG9mZnNldHMgYW5kIHRoYXQgZXhpc3RpbmcgaW1wb3J0cyBhcmUgcmUtdXNlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIEltcG9ydE1hbmFnZXIge1xuICAvKiogTWFwIG9mIHNvdXJjZS1maWxlcyBhbmQgdGhlaXIgcHJldmlvdXNseSB1c2VkIGlkZW50aWZpZXIgbmFtZXMuICovXG4gIHByaXZhdGUgX3VzZWRJZGVudGlmaWVyTmFtZXMgPSBuZXcgTWFwPHRzLlNvdXJjZUZpbGUsIHN0cmluZ1tdPigpO1xuXG4gIC8qKiBNYXAgb2Ygc291cmNlIGZpbGVzIGFuZCB0aGVpciBhbmFseXplZCBpbXBvcnRzLiAqL1xuICBwcml2YXRlIF9pbXBvcnRDYWNoZSA9IG5ldyBNYXA8dHMuU291cmNlRmlsZSwgQW5hbHl6ZWRJbXBvcnRbXT4oKTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgX2ZpbGVTeXN0ZW06IEZpbGVTeXN0ZW0sXG4gICAgICBwcml2YXRlIF9wcmludGVyOiB0cy5QcmludGVyKSB7fVxuXG4gIC8qKlxuICAgKiBBbmFseXplcyB0aGUgaW1wb3J0IG9mIHRoZSBzcGVjaWZpZWQgc291cmNlIGZpbGUgaWYgbmVlZGVkLiBJbiBvcmRlciB0byBwZXJmb3JtXG4gICAqIG1vZGlmaWNhdGlvbnMgdG8gaW1wb3J0cyBvZiBhIHNvdXJjZSBmaWxlLCB3ZSBzdG9yZSBhbGwgaW1wb3J0cyBpbiBtZW1vcnkgYW5kXG4gICAqIHVwZGF0ZSB0aGUgc291cmNlIGZpbGUgb25jZSBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gbWFkZS4gVGhpcyBpcyBlc3NlbnRpYWwgdG9cbiAgICogZW5zdXJlIHRoYXQgd2UgY2FuIHJlLXVzZSBuZXdseSBhZGRlZCBpbXBvcnRzIGFuZCBub3QgYnJlYWsgZmlsZSBvZmZzZXRzLlxuICAgKi9cbiAgcHJpdmF0ZSBfYW5hbHl6ZUltcG9ydHNJZk5lZWRlZChzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlKTogQW5hbHl6ZWRJbXBvcnRbXSB7XG4gICAgaWYgKHRoaXMuX2ltcG9ydENhY2hlLmhhcyhzb3VyY2VGaWxlKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX2ltcG9ydENhY2hlLmdldChzb3VyY2VGaWxlKSE7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBBbmFseXplZEltcG9ydFtdID0gW107XG4gICAgZm9yIChsZXQgbm9kZSBvZiBzb3VyY2VGaWxlLnN0YXRlbWVudHMpIHtcbiAgICAgIGlmICghdHMuaXNJbXBvcnREZWNsYXJhdGlvbihub2RlKSB8fCAhdHMuaXNTdHJpbmdMaXRlcmFsKG5vZGUubW9kdWxlU3BlY2lmaWVyKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IG5vZGUubW9kdWxlU3BlY2lmaWVyLnRleHQ7XG5cbiAgICAgIC8vIEhhbmRsZXMgc2lkZS1lZmZlY3QgaW1wb3J0cyB3aGljaCBkbyBuZWl0aGVyIGhhdmUgYSBuYW1lIG9yXG4gICAgICAvLyBzcGVjaWZpZXJzLiBlLmcuIGBpbXBvcnQgXCJteS1wYWNrYWdlXCI7YFxuICAgICAgaWYgKCFub2RlLmltcG9ydENsYXVzZSkge1xuICAgICAgICByZXN1bHQucHVzaCh7bW9kdWxlTmFtZSwgbm9kZSwgc3RhdGU6IEltcG9ydFN0YXRlLlVOTU9ESUZJRUR9KTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8vIEhhbmRsZXMgaW1wb3J0cyByZXNvbHZpbmcgdG8gZGVmYXVsdCBleHBvcnRzIG9mIGEgbW9kdWxlLlxuICAgICAgLy8gZS5nLiBgaW1wb3J0IG1vbWVudCBmcm9tIFwibW9tZW50XCI7YFxuICAgICAgaWYgKCFub2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKFxuICAgICAgICAgICAge21vZHVsZU5hbWUsIG5vZGUsIG5hbWU6IG5vZGUuaW1wb3J0Q2xhdXNlLm5hbWUsIHN0YXRlOiBJbXBvcnRTdGF0ZS5VTk1PRElGSUVEfSk7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGVzIGltcG9ydHMgd2l0aCBpbmRpdmlkdWFsIHN5bWJvbCBzcGVjaWZpZXJzLlxuICAgICAgLy8gZS5nLiBgaW1wb3J0IHtBLCBCLCBDfSBmcm9tIFwibXktbW9kdWxlXCI7YFxuICAgICAgaWYgKHRzLmlzTmFtZWRJbXBvcnRzKG5vZGUuaW1wb3J0Q2xhdXNlLm5hbWVkQmluZGluZ3MpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHtcbiAgICAgICAgICBtb2R1bGVOYW1lLFxuICAgICAgICAgIG5vZGUsXG4gICAgICAgICAgc3BlY2lmaWVyczogbm9kZS5pbXBvcnRDbGF1c2UubmFtZWRCaW5kaW5ncy5lbGVtZW50cy5tYXAoXG4gICAgICAgICAgICAgIGVsID0+ICh7bmFtZTogZWwubmFtZSwgcHJvcGVydHlOYW1lOiBlbC5wcm9wZXJ0eU5hbWV9KSksXG4gICAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLlVOTU9ESUZJRUQsXG4gICAgICAgIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gSGFuZGxlcyBuYW1lc3BhY2VkIGltcG9ydHMuIGUuZy4gYGltcG9ydCAqIGFzIGNvcmUgZnJvbSBcIm15LXBrZ1wiO2BcbiAgICAgICAgcmVzdWx0LnB1c2goe1xuICAgICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgICAgbm9kZSxcbiAgICAgICAgICBuYW1lOiBub2RlLmltcG9ydENsYXVzZS5uYW1lZEJpbmRpbmdzLm5hbWUsXG4gICAgICAgICAgbmFtZXNwYWNlOiB0cnVlLFxuICAgICAgICAgIHN0YXRlOiBJbXBvcnRTdGF0ZS5VTk1PRElGSUVELFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5faW1wb3J0Q2FjaGUuc2V0KHNvdXJjZUZpbGUsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gc3BlY2lmaWVyLCB3aGljaCBjYW4gYmUgcmVsYXRpdmUgdG8gdGhlIGJhc2UgcGF0aCxcbiAgICogbWF0Y2hlcyB0aGUgcGFzc2VkIG1vZHVsZSBuYW1lLlxuICAgKi9cbiAgcHJpdmF0ZSBfaXNNb2R1bGVTcGVjaWZpZXJNYXRjaGluZyhiYXNlUGF0aDogc3RyaW5nLCBzcGVjaWZpZXI6IHN0cmluZywgbW9kdWxlTmFtZTogc3RyaW5nKTpcbiAgICAgIGJvb2xlYW4ge1xuICAgIHJldHVybiBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLicpID9cbiAgICAgICAgcmVzb2x2ZShiYXNlUGF0aCwgc3BlY2lmaWVyKSA9PT0gcmVzb2x2ZShiYXNlUGF0aCwgbW9kdWxlTmFtZSkgOlxuICAgICAgICBzcGVjaWZpZXIgPT09IG1vZHVsZU5hbWU7XG4gIH1cblxuICAvKiogRGVsZXRlcyBhIGdpdmVuIG5hbWVkIGJpbmRpbmcgaW1wb3J0IGZyb20gdGhlIHNwZWNpZmllZCBzb3VyY2UgZmlsZS4gKi9cbiAgZGVsZXRlTmFtZWRCaW5kaW5nSW1wb3J0KHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsIHN5bWJvbE5hbWU6IHN0cmluZywgbW9kdWxlTmFtZTogc3RyaW5nKSB7XG4gICAgY29uc3Qgc291cmNlRGlyID0gZGlybmFtZShzb3VyY2VGaWxlLmZpbGVOYW1lKTtcbiAgICBjb25zdCBmaWxlSW1wb3J0cyA9IHRoaXMuX2FuYWx5emVJbXBvcnRzSWZOZWVkZWQoc291cmNlRmlsZSk7XG5cbiAgICBmb3IgKGxldCBpbXBvcnREYXRhIG9mIGZpbGVJbXBvcnRzKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzTW9kdWxlU3BlY2lmaWVyTWF0Y2hpbmcoc291cmNlRGlyLCBpbXBvcnREYXRhLm1vZHVsZU5hbWUsIG1vZHVsZU5hbWUpIHx8XG4gICAgICAgICAgIWltcG9ydERhdGEuc3BlY2lmaWVycykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3BlY2lmaWVySW5kZXggPVxuICAgICAgICAgIGltcG9ydERhdGEuc3BlY2lmaWVycy5maW5kSW5kZXgoZCA9PiAoZC5wcm9wZXJ0eU5hbWUgfHwgZC5uYW1lKS50ZXh0ID09PSBzeW1ib2xOYW1lKTtcbiAgICAgIGlmIChzcGVjaWZpZXJJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgaW1wb3J0RGF0YS5zcGVjaWZpZXJzLnNwbGljZShzcGVjaWZpZXJJbmRleCwgMSk7XG4gICAgICAgIC8vIGlmIHRoZSBpbXBvcnQgZG9lcyBubyBsb25nZXIgY29udGFpbiBhbnkgc3BlY2lmaWVycyBhZnRlciB0aGUgcmVtb3ZhbCBvZiB0aGVcbiAgICAgICAgLy8gZ2l2ZW4gc3ltYm9sLCB3ZSBjYW4ganVzdCBtYXJrIHRoZSB3aG9sZSBpbXBvcnQgZm9yIGRlbGV0aW9uLiBPdGhlcndpc2UsIHdlIG1hcmtcbiAgICAgICAgLy8gaXQgYXMgbW9kaWZpZWQgc28gdGhhdCBpdCB3aWxsIGJlIHJlLXByaW50ZWQuXG4gICAgICAgIGlmIChpbXBvcnREYXRhLnNwZWNpZmllcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgaW1wb3J0RGF0YS5zdGF0ZSB8PSBJbXBvcnRTdGF0ZS5ERUxFVEVEO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGltcG9ydERhdGEuc3RhdGUgfD0gSW1wb3J0U3RhdGUuTU9ESUZJRUQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogRGVsZXRlcyB0aGUgaW1wb3J0IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gaW1wb3J0IGRlY2xhcmF0aW9uIGlmIGZvdW5kLiAqL1xuICBkZWxldGVJbXBvcnRCeURlY2xhcmF0aW9uKGRlY2xhcmF0aW9uOiB0cy5JbXBvcnREZWNsYXJhdGlvbikge1xuICAgIGNvbnN0IGZpbGVJbXBvcnRzID0gdGhpcy5fYW5hbHl6ZUltcG9ydHNJZk5lZWRlZChkZWNsYXJhdGlvbi5nZXRTb3VyY2VGaWxlKCkpO1xuICAgIGZvciAobGV0IGltcG9ydERhdGEgb2YgZmlsZUltcG9ydHMpIHtcbiAgICAgIGlmIChpbXBvcnREYXRhLm5vZGUgPT09IGRlY2xhcmF0aW9uKSB7XG4gICAgICAgIGltcG9ydERhdGEuc3RhdGUgfD0gSW1wb3J0U3RhdGUuREVMRVRFRDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhbiBpbXBvcnQgdG8gdGhlIGdpdmVuIHNvdXJjZSBmaWxlIGFuZCByZXR1cm5zIHRoZSBUeXBlU2NyaXB0IGV4cHJlc3Npb24gdGhhdFxuICAgKiBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIG5ld2x5IGltcG9ydGVkIHN5bWJvbC5cbiAgICpcbiAgICogV2hlbmV2ZXIgYW4gaW1wb3J0IGlzIGFkZGVkIHRvIGEgc291cmNlIGZpbGUsIGl0J3MgcmVjb21tZW5kZWQgdGhhdCB0aGUgcmV0dXJuZWRcbiAgICogZXhwcmVzc2lvbiBpcyB1c2VkIHRvIHJlZmVyZW5jZSB0aCBzeW1ib2wuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2UgdGhlIHN5bWJvbFxuICAgKiBjb3VsZCBiZSBhbGlhc2VkIGlmIGl0IHdvdWxkIGNvbGxpZGUgd2l0aCBleGlzdGluZyBpbXBvcnRzIGluIHNvdXJjZSBmaWxlLlxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlRmlsZSBTb3VyY2UgZmlsZSB0byB3aGljaCB0aGUgaW1wb3J0IHNob3VsZCBiZSBhZGRlZC5cbiAgICogQHBhcmFtIHN5bWJvbE5hbWUgTmFtZSBvZiB0aGUgc3ltYm9sIHRoYXQgc2hvdWxkIGJlIGltcG9ydGVkLiBDYW4gYmUgbnVsbCBpZlxuICAgKiAgICB0aGUgZGVmYXVsdCBleHBvcnQgaXMgcmVxdWVzdGVkLlxuICAgKiBAcGFyYW0gbW9kdWxlTmFtZSBOYW1lIG9mIHRoZSBtb2R1bGUgb2Ygd2hpY2ggdGhlIHN5bWJvbCBzaG91bGQgYmUgaW1wb3J0ZWQuXG4gICAqIEBwYXJhbSB0eXBlSW1wb3J0IFdoZXRoZXIgdGhlIHN5bWJvbCBpcyBhIHR5cGUuXG4gICAqIEBwYXJhbSBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyBMaXN0IG9mIGlkZW50aWZpZXJzIHdoaWNoIGNhbiBiZSBpZ25vcmVkIHdoZW5cbiAgICogICAgdGhlIGltcG9ydCBtYW5hZ2VyIGNoZWNrcyBmb3IgaW1wb3J0IGNvbGxpc2lvbnMuXG4gICAqL1xuICBhZGRJbXBvcnRUb1NvdXJjZUZpbGUoXG4gICAgICBzb3VyY2VGaWxlOiB0cy5Tb3VyY2VGaWxlLCBzeW1ib2xOYW1lOiBzdHJpbmd8bnVsbCwgbW9kdWxlTmFtZTogc3RyaW5nLCB0eXBlSW1wb3J0ID0gZmFsc2UsXG4gICAgICBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9uczogdHMuSWRlbnRpZmllcltdID0gW10pOiB0cy5FeHByZXNzaW9uIHtcbiAgICBjb25zdCBzb3VyY2VEaXIgPSBkaXJuYW1lKHNvdXJjZUZpbGUuZmlsZU5hbWUpO1xuICAgIGNvbnN0IGZpbGVJbXBvcnRzID0gdGhpcy5fYW5hbHl6ZUltcG9ydHNJZk5lZWRlZChzb3VyY2VGaWxlKTtcblxuICAgIGxldCBleGlzdGluZ0ltcG9ydDogQW5hbHl6ZWRJbXBvcnR8bnVsbCA9IG51bGw7XG4gICAgZm9yIChsZXQgaW1wb3J0RGF0YSBvZiBmaWxlSW1wb3J0cykge1xuICAgICAgaWYgKCF0aGlzLl9pc01vZHVsZVNwZWNpZmllck1hdGNoaW5nKHNvdXJjZURpciwgaW1wb3J0RGF0YS5tb2R1bGVOYW1lLCBtb2R1bGVOYW1lKSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gc3ltYm9sIG5hbWUgaGFzIGJlZW4gc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBpbXBvcnQgaXMgcmVxdWVzdGVkLiBJbiB0aGF0XG4gICAgICAvLyBjYXNlIHdlIHNlYXJjaCBmb3Igbm9uLW5hbWVzcGFjZSBhbmQgbm9uLXNwZWNpZmllciBpbXBvcnRzLlxuICAgICAgaWYgKCFzeW1ib2xOYW1lICYmICFpbXBvcnREYXRhLm5hbWVzcGFjZSAmJiAhaW1wb3J0RGF0YS5zcGVjaWZpZXJzKSB7XG4gICAgICAgIHJldHVybiB0cy5jcmVhdGVJZGVudGlmaWVyKGltcG9ydERhdGEubmFtZSEudGV4dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIEluIGNhc2UgYSBcIlR5cGVcIiBzeW1ib2wgaXMgaW1wb3J0ZWQsIHdlIGNhbid0IHVzZSBuYW1lc3BhY2UgaW1wb3J0c1xuICAgICAgLy8gYmVjYXVzZSB0aGVzZSBvbmx5IGV4cG9ydCBzeW1ib2xzIGF2YWlsYWJsZSBhdCBydW50aW1lIChubyB0eXBlcylcbiAgICAgIGlmIChpbXBvcnREYXRhLm5hbWVzcGFjZSAmJiAhdHlwZUltcG9ydCkge1xuICAgICAgICByZXR1cm4gdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MoXG4gICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKGltcG9ydERhdGEubmFtZSEudGV4dCksXG4gICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKHN5bWJvbE5hbWUgfHwgJ2RlZmF1bHQnKSk7XG4gICAgICB9IGVsc2UgaWYgKGltcG9ydERhdGEuc3BlY2lmaWVycyAmJiBzeW1ib2xOYW1lKSB7XG4gICAgICAgIGNvbnN0IGV4aXN0aW5nU3BlY2lmaWVyID0gaW1wb3J0RGF0YS5zcGVjaWZpZXJzLmZpbmQoXG4gICAgICAgICAgICBzID0+IHMucHJvcGVydHlOYW1lID8gcy5wcm9wZXJ0eU5hbWUudGV4dCA9PT0gc3ltYm9sTmFtZSA6IHMubmFtZS50ZXh0ID09PSBzeW1ib2xOYW1lKTtcblxuICAgICAgICBpZiAoZXhpc3RpbmdTcGVjaWZpZXIpIHtcbiAgICAgICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcihleGlzdGluZ1NwZWNpZmllci5uYW1lLnRleHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gY2FzZSB0aGUgc3ltYm9sIGNvdWxkIG5vdCBiZSBmb3VuZCBpbiBhbiBleGlzdGluZyBpbXBvcnQsIHdlXG4gICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIGltcG9ydCBkZWNsYXJhdGlvbiBhcyBpdCBjYW4gYmUgdXBkYXRlZCB0byBpbmNsdWRlXG4gICAgICAgIC8vIHRoZSBzcGVjaWZpZWQgc3ltYm9sIG5hbWUgd2l0aG91dCBoYXZpbmcgdG8gY3JlYXRlIGEgbmV3IGltcG9ydC5cbiAgICAgICAgZXhpc3RpbmdJbXBvcnQgPSBpbXBvcnREYXRhO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIGltcG9ydCB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBtb2R1bGUsIHdlXG4gICAgLy8ganVzdCB1cGRhdGUgdGhlIGltcG9ydCBzcGVjaWZpZXJzIHRvIGFsc28gaW1wb3J0IHRoZSByZXF1ZXN0ZWQgc3ltYm9sLlxuICAgIGlmIChleGlzdGluZ0ltcG9ydCkge1xuICAgICAgY29uc3QgcHJvcGVydHlJZGVudGlmaWVyID0gdHMuY3JlYXRlSWRlbnRpZmllcihzeW1ib2xOYW1lISk7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyID1cbiAgICAgICAgICB0aGlzLl9nZXRVbmlxdWVJZGVudGlmaWVyKHNvdXJjZUZpbGUsIHN5bWJvbE5hbWUhLCBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyk7XG4gICAgICBjb25zdCBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPSBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyLnRleHQgIT09IHN5bWJvbE5hbWU7XG4gICAgICBjb25zdCBpbXBvcnROYW1lID0gbmVlZHNHZW5lcmF0ZWRVbmlxdWVOYW1lID8gZ2VuZXJhdGVkVW5pcXVlSWRlbnRpZmllciA6IHByb3BlcnR5SWRlbnRpZmllcjtcblxuICAgICAgZXhpc3RpbmdJbXBvcnQuc3BlY2lmaWVycyEucHVzaCh7XG4gICAgICAgIG5hbWU6IGltcG9ydE5hbWUsXG4gICAgICAgIHByb3BlcnR5TmFtZTogbmVlZHNHZW5lcmF0ZWRVbmlxdWVOYW1lID8gcHJvcGVydHlJZGVudGlmaWVyIDogdW5kZWZpbmVkLFxuICAgICAgfSk7XG4gICAgICBleGlzdGluZ0ltcG9ydC5zdGF0ZSB8PSBJbXBvcnRTdGF0ZS5NT0RJRklFRDtcblxuICAgICAgaWYgKGhhc0ZsYWcoZXhpc3RpbmdJbXBvcnQsIEltcG9ydFN0YXRlLkRFTEVURUQpKSB7XG4gICAgICAgIC8vIHVuc2V0IHRoZSBkZWxldGVkIGZsYWcgaWYgdGhlIGltcG9ydCBpcyBwZW5kaW5nIGRlbGV0aW9uLCBidXRcbiAgICAgICAgLy8gY2FuIG5vdyBiZSB1c2VkIGZvciB0aGUgbmV3IGltcG9ydGVkIHN5bWJvbC5cbiAgICAgICAgZXhpc3RpbmdJbXBvcnQuc3RhdGUgJj0gfkltcG9ydFN0YXRlLkRFTEVURUQ7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpbXBvcnROYW1lO1xuICAgIH1cblxuICAgIGxldCBpZGVudGlmaWVyOiB0cy5JZGVudGlmaWVyfG51bGwgPSBudWxsO1xuICAgIGxldCBuZXdJbXBvcnQ6IEFuYWx5emVkSW1wb3J0fG51bGwgPSBudWxsO1xuXG4gICAgaWYgKHN5bWJvbE5hbWUpIHtcbiAgICAgIGNvbnN0IHByb3BlcnR5SWRlbnRpZmllciA9IHRzLmNyZWF0ZUlkZW50aWZpZXIoc3ltYm9sTmFtZSk7XG4gICAgICBjb25zdCBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyID1cbiAgICAgICAgICB0aGlzLl9nZXRVbmlxdWVJZGVudGlmaWVyKHNvdXJjZUZpbGUsIHN5bWJvbE5hbWUsIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zKTtcbiAgICAgIGNvbnN0IG5lZWRzR2VuZXJhdGVkVW5pcXVlTmFtZSA9IGdlbmVyYXRlZFVuaXF1ZUlkZW50aWZpZXIudGV4dCAhPT0gc3ltYm9sTmFtZTtcbiAgICAgIGlkZW50aWZpZXIgPSBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPyBnZW5lcmF0ZWRVbmlxdWVJZGVudGlmaWVyIDogcHJvcGVydHlJZGVudGlmaWVyO1xuXG4gICAgICBjb25zdCBuZXdJbXBvcnREZWNsID0gdHMuY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRzLmNyZWF0ZUltcG9ydENsYXVzZSh1bmRlZmluZWQsIHRzLmNyZWF0ZU5hbWVkSW1wb3J0cyhbXSkpLFxuICAgICAgICAgIHRzLmNyZWF0ZVN0cmluZ0xpdGVyYWwobW9kdWxlTmFtZSkpO1xuXG4gICAgICBuZXdJbXBvcnQgPSB7XG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgIG5vZGU6IG5ld0ltcG9ydERlY2wsXG4gICAgICAgIHNwZWNpZmllcnM6IFt7XG4gICAgICAgICAgcHJvcGVydHlOYW1lOiBuZWVkc0dlbmVyYXRlZFVuaXF1ZU5hbWUgPyBwcm9wZXJ0eUlkZW50aWZpZXIgOiB1bmRlZmluZWQsXG4gICAgICAgICAgbmFtZTogaWRlbnRpZmllclxuICAgICAgICB9XSxcbiAgICAgICAgc3RhdGU6IEltcG9ydFN0YXRlLkFEREVELFxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWRlbnRpZmllciA9XG4gICAgICAgICAgdGhpcy5fZ2V0VW5pcXVlSWRlbnRpZmllcihzb3VyY2VGaWxlLCAnZGVmYXVsdEV4cG9ydCcsIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zKTtcbiAgICAgIGNvbnN0IG5ld0ltcG9ydERlY2wgPSB0cy5jcmVhdGVJbXBvcnREZWNsYXJhdGlvbihcbiAgICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdHMuY3JlYXRlSW1wb3J0Q2xhdXNlKGlkZW50aWZpZXIsIHVuZGVmaW5lZCksXG4gICAgICAgICAgdHMuY3JlYXRlU3RyaW5nTGl0ZXJhbChtb2R1bGVOYW1lKSk7XG4gICAgICBuZXdJbXBvcnQgPSB7XG4gICAgICAgIG1vZHVsZU5hbWUsXG4gICAgICAgIG5vZGU6IG5ld0ltcG9ydERlY2wsXG4gICAgICAgIG5hbWU6IGlkZW50aWZpZXIsXG4gICAgICAgIHN0YXRlOiBJbXBvcnRTdGF0ZS5BRERFRCxcbiAgICAgIH07XG4gICAgfVxuICAgIGZpbGVJbXBvcnRzLnB1c2gobmV3SW1wb3J0KTtcbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSByZWNvcmRlZCBjaGFuZ2VzIGluIHRoZSB1cGRhdGUgcmVjb3JkZXJzIG9mIHRoZSBjb3JyZXNwb25kaW5nIHNvdXJjZSBmaWxlcy5cbiAgICogVGhlIGNoYW5nZXMgYXJlIGFwcGxpZWQgc2VwYXJhdGVseSBhZnRlciBhbGwgY2hhbmdlcyBoYXZlIGJlZW4gcmVjb3JkZWQgYmVjYXVzZSBvdGhlcndpc2VcbiAgICogZmlsZSBvZmZzZXRzIHdpbGwgY2hhbmdlIGFuZCB0aGUgc291cmNlIGZpbGVzIHdvdWxkIG5lZWQgdG8gYmUgcmUtcGFyc2VkIGFmdGVyIGVhY2ggY2hhbmdlLlxuICAgKi9cbiAgcmVjb3JkQ2hhbmdlcygpIHtcbiAgICB0aGlzLl9pbXBvcnRDYWNoZS5mb3JFYWNoKChmaWxlSW1wb3J0cywgc291cmNlRmlsZSkgPT4ge1xuICAgICAgY29uc3QgcmVjb3JkZXIgPSB0aGlzLl9maWxlU3lzdGVtLmVkaXQoc291cmNlRmlsZS5maWxlTmFtZSk7XG4gICAgICBjb25zdCBsYXN0VW5tb2RpZmllZEltcG9ydCA9XG4gICAgICAgICAgZmlsZUltcG9ydHMucmV2ZXJzZSgpLmZpbmQoaSA9PiBpLnN0YXRlID09PSBJbXBvcnRTdGF0ZS5VTk1PRElGSUVEKTtcbiAgICAgIGNvbnN0IGltcG9ydFN0YXJ0SW5kZXggPVxuICAgICAgICAgIGxhc3RVbm1vZGlmaWVkSW1wb3J0ID8gdGhpcy5fZ2V0RW5kUG9zaXRpb25PZk5vZGUobGFzdFVubW9kaWZpZWRJbXBvcnQubm9kZSkgOiAwO1xuXG4gICAgICBmaWxlSW1wb3J0cy5mb3JFYWNoKGltcG9ydERhdGEgPT4ge1xuICAgICAgICBpZiAoaW1wb3J0RGF0YS5zdGF0ZSA9PT0gSW1wb3J0U3RhdGUuVU5NT0RJRklFRCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkRFTEVURUQpKSB7XG4gICAgICAgICAgLy8gSW1wb3J0cyB3aGljaCBkbyBub3QgZXhpc3QgaW4gc291cmNlIGZpbGUsIGNhbiBiZSBqdXN0IHNraXBwZWQgYXNcbiAgICAgICAgICAvLyB3ZSBkbyBub3QgbmVlZCBhbnkgcmVwbGFjZW1lbnQgdG8gZGVsZXRlIHRoZSBpbXBvcnQuXG4gICAgICAgICAgaWYgKCFoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkFEREVEKSkge1xuICAgICAgICAgICAgcmVjb3JkZXIucmVtb3ZlKGltcG9ydERhdGEubm9kZS5nZXRGdWxsU3RhcnQoKSwgaW1wb3J0RGF0YS5ub2RlLmdldEZ1bGxXaWR0aCgpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGltcG9ydERhdGEuc3BlY2lmaWVycykge1xuICAgICAgICAgIGNvbnN0IG5hbWVkQmluZGluZ3MgPSBpbXBvcnREYXRhLm5vZGUuaW1wb3J0Q2xhdXNlIS5uYW1lZEJpbmRpbmdzIGFzIHRzLk5hbWVkSW1wb3J0cztcbiAgICAgICAgICBjb25zdCBpbXBvcnRTcGVjaWZpZXJzID1cbiAgICAgICAgICAgICAgaW1wb3J0RGF0YS5zcGVjaWZpZXJzLm1hcChzID0+IHRzLmNyZWF0ZUltcG9ydFNwZWNpZmllcihzLnByb3BlcnR5TmFtZSwgcy5uYW1lKSk7XG4gICAgICAgICAgY29uc3QgdXBkYXRlZEJpbmRpbmdzID0gdHMudXBkYXRlTmFtZWRJbXBvcnRzKG5hbWVkQmluZGluZ3MsIGltcG9ydFNwZWNpZmllcnMpO1xuXG4gICAgICAgICAgLy8gSW4gY2FzZSBhbiBpbXBvcnQgaGFzIGJlZW4gYWRkZWQgbmV3bHksIHdlIG5lZWQgdG8gcHJpbnQgdGhlIHdob2xlIGltcG9ydFxuICAgICAgICAgIC8vIGRlY2xhcmF0aW9uIGFuZCBpbnNlcnQgaXQgYXQgdGhlIGltcG9ydCBzdGFydCBpbmRleC4gT3RoZXJ3aXNlLCB3ZSBqdXN0XG4gICAgICAgICAgLy8gdXBkYXRlIHRoZSBuYW1lZCBiaW5kaW5ncyB0byBub3QgcmUtcHJpbnQgdGhlIHdob2xlIGltcG9ydCAod2hpY2ggY291bGRcbiAgICAgICAgICAvLyBjYXVzZSB1bm5lY2Vzc2FyeSBmb3JtYXR0aW5nIGNoYW5nZXMpXG4gICAgICAgICAgaWYgKGhhc0ZsYWcoaW1wb3J0RGF0YSwgSW1wb3J0U3RhdGUuQURERUQpKSB7XG4gICAgICAgICAgICBjb25zdCB1cGRhdGVkSW1wb3J0ID0gdHMudXBkYXRlSW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgICAgaW1wb3J0RGF0YS5ub2RlLCB1bmRlZmluZWQsIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB0cy5jcmVhdGVJbXBvcnRDbGF1c2UodW5kZWZpbmVkLCB1cGRhdGVkQmluZGluZ3MpLFxuICAgICAgICAgICAgICAgIHRzLmNyZWF0ZVN0cmluZ0xpdGVyYWwoaW1wb3J0RGF0YS5tb2R1bGVOYW1lKSk7XG4gICAgICAgICAgICBjb25zdCBuZXdJbXBvcnRUZXh0ID1cbiAgICAgICAgICAgICAgICB0aGlzLl9wcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgdXBkYXRlZEltcG9ydCwgc291cmNlRmlsZSk7XG4gICAgICAgICAgICByZWNvcmRlci5pbnNlcnRMZWZ0KFxuICAgICAgICAgICAgICAgIGltcG9ydFN0YXJ0SW5kZXgsXG4gICAgICAgICAgICAgICAgaW1wb3J0U3RhcnRJbmRleCA9PT0gMCA/IGAke25ld0ltcG9ydFRleHR9XFxuYCA6IGBcXG4ke25ld0ltcG9ydFRleHR9YCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfSBlbHNlIGlmIChoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLk1PRElGSUVEKSkge1xuICAgICAgICAgICAgY29uc3QgbmV3TmFtZWRCaW5kaW5nc1RleHQgPVxuICAgICAgICAgICAgICAgIHRoaXMuX3ByaW50ZXIucHJpbnROb2RlKHRzLkVtaXRIaW50LlVuc3BlY2lmaWVkLCB1cGRhdGVkQmluZGluZ3MsIHNvdXJjZUZpbGUpO1xuICAgICAgICAgICAgcmVjb3JkZXIucmVtb3ZlKG5hbWVkQmluZGluZ3MuZ2V0U3RhcnQoKSwgbmFtZWRCaW5kaW5ncy5nZXRXaWR0aCgpKTtcbiAgICAgICAgICAgIHJlY29yZGVyLmluc2VydFJpZ2h0KG5hbWVkQmluZGluZ3MuZ2V0U3RhcnQoKSwgbmV3TmFtZWRCaW5kaW5nc1RleHQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChoYXNGbGFnKGltcG9ydERhdGEsIEltcG9ydFN0YXRlLkFEREVEKSkge1xuICAgICAgICAgIGNvbnN0IG5ld0ltcG9ydFRleHQgPVxuICAgICAgICAgICAgICB0aGlzLl9wcmludGVyLnByaW50Tm9kZSh0cy5FbWl0SGludC5VbnNwZWNpZmllZCwgaW1wb3J0RGF0YS5ub2RlLCBzb3VyY2VGaWxlKTtcbiAgICAgICAgICByZWNvcmRlci5pbnNlcnRMZWZ0KFxuICAgICAgICAgICAgICBpbXBvcnRTdGFydEluZGV4LFxuICAgICAgICAgICAgICBpbXBvcnRTdGFydEluZGV4ID09PSAwID8gYCR7bmV3SW1wb3J0VGV4dH1cXG5gIDogYFxcbiR7bmV3SW1wb3J0VGV4dH1gKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3ZSBzaG91bGQgbmV2ZXIgaGl0IHRoaXMsIGJ1dCB3ZSByYXRoZXIgd2FudCB0byBwcmludCBhIGN1c3RvbSBleGNlcHRpb25cbiAgICAgICAgLy8gaW5zdGVhZCBvZiBqdXN0IHNraXBwaW5nIGltcG9ydHMgc2lsZW50bHkuXG4gICAgICAgIHRocm93IEVycm9yKCdVbmV4cGVjdGVkIGltcG9ydCBtb2RpZmljYXRpb24uJyk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb3JyZWN0cyB0aGUgbGluZSBhbmQgY2hhcmFjdGVyIHBvc2l0aW9uIG9mIGEgZ2l2ZW4gbm9kZS4gU2luY2Ugbm9kZXMgb2ZcbiAgICogc291cmNlIGZpbGVzIGFyZSBpbW11dGFibGUgYW5kIHdlIHNvbWV0aW1lcyBtYWtlIGNoYW5nZXMgdG8gdGhlIGNvbnRhaW5pbmdcbiAgICogc291cmNlIGZpbGUsIHRoZSBub2RlIHBvc2l0aW9uIG1pZ2h0IHNoaWZ0IChlLmcuIGlmIHdlIGFkZCBhIG5ldyBpbXBvcnQgYmVmb3JlKS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmV0cmlldmUgYSBjb3JyZWN0ZWQgcG9zaXRpb24gb2YgdGhlIGdpdmVuIG5vZGUuIFRoaXNcbiAgICogaXMgaGVscGZ1bCB3aGVuIHByaW50aW5nIG91dCBlcnJvciBtZXNzYWdlcyB3aGljaCBzaG91bGQgcmVmbGVjdCB0aGUgbmV3IHN0YXRlIG9mXG4gICAqIHNvdXJjZSBmaWxlcy5cbiAgICovXG4gIGNvcnJlY3ROb2RlUG9zaXRpb24obm9kZTogdHMuTm9kZSwgb2Zmc2V0OiBudW1iZXIsIHBvc2l0aW9uOiB0cy5MaW5lQW5kQ2hhcmFjdGVyKSB7XG4gICAgY29uc3Qgc291cmNlRmlsZSA9IG5vZGUuZ2V0U291cmNlRmlsZSgpO1xuXG4gICAgaWYgKCF0aGlzLl9pbXBvcnRDYWNoZS5oYXMoc291cmNlRmlsZSkpIHtcbiAgICAgIHJldHVybiBwb3NpdGlvbjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdQb3NpdGlvbjogdHMuTGluZUFuZENoYXJhY3RlciA9IHsuLi5wb3NpdGlvbn07XG4gICAgY29uc3QgZmlsZUltcG9ydHMgPSB0aGlzLl9pbXBvcnRDYWNoZS5nZXQoc291cmNlRmlsZSkhO1xuXG4gICAgZm9yIChsZXQgaW1wb3J0RGF0YSBvZiBmaWxlSW1wb3J0cykge1xuICAgICAgY29uc3QgZnVsbEVuZCA9IGltcG9ydERhdGEubm9kZS5nZXRGdWxsU3RhcnQoKSArIGltcG9ydERhdGEubm9kZS5nZXRGdWxsV2lkdGgoKTtcbiAgICAgIC8vIFN1YnRyYWN0IG9yIGFkZCBsaW5lcyBiYXNlZCBvbiB3aGV0aGVyIGFuIGltcG9ydCBoYXMgYmVlbiBkZWxldGVkIG9yIHJlbW92ZWRcbiAgICAgIC8vIGJlZm9yZSB0aGUgYWN0dWFsIG5vZGUgb2Zmc2V0LlxuICAgICAgaWYgKG9mZnNldCA+IGZ1bGxFbmQgJiYgaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5ERUxFVEVEKSkge1xuICAgICAgICBuZXdQb3NpdGlvbi5saW5lLS07XG4gICAgICB9IGVsc2UgaWYgKG9mZnNldCA+IGZ1bGxFbmQgJiYgaGFzRmxhZyhpbXBvcnREYXRhLCBJbXBvcnRTdGF0ZS5BRERFRCkpIHtcbiAgICAgICAgbmV3UG9zaXRpb24ubGluZSsrO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV3UG9zaXRpb247XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhbiB1bmlxdWUgaWRlbnRpZmllciBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIHN5bWJvbCBuYW1lLlxuICAgKiBAcGFyYW0gc291cmNlRmlsZSBTb3VyY2UgZmlsZSB0byBjaGVjayBmb3IgaWRlbnRpZmllciBjb2xsaXNpb25zLlxuICAgKiBAcGFyYW0gc3ltYm9sTmFtZSBOYW1lIG9mIHRoZSBzeW1ib2wgZm9yIHdoaWNoIHdlIHdhbnQgdG8gZ2VuZXJhdGUgYW4gdW5pcXVlIG5hbWUuXG4gICAqIEBwYXJhbSBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyBMaXN0IG9mIGlkZW50aWZpZXJzIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIHdoZW5cbiAgICogICAgY2hlY2tpbmcgZm9yIGlkZW50aWZpZXIgY29sbGlzaW9ucyBpbiB0aGUgZ2l2ZW4gc291cmNlIGZpbGUuXG4gICAqL1xuICBwcml2YXRlIF9nZXRVbmlxdWVJZGVudGlmaWVyKFxuICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgc3ltYm9sTmFtZTogc3RyaW5nLFxuICAgICAgaWdub3JlSWRlbnRpZmllckNvbGxpc2lvbnM6IHRzLklkZW50aWZpZXJbXSk6IHRzLklkZW50aWZpZXIge1xuICAgIGlmICh0aGlzLl9pc1VuaXF1ZUlkZW50aWZpZXJOYW1lKHNvdXJjZUZpbGUsIHN5bWJvbE5hbWUsIGlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zKSkge1xuICAgICAgdGhpcy5fcmVjb3JkVXNlZElkZW50aWZpZXIoc291cmNlRmlsZSwgc3ltYm9sTmFtZSk7XG4gICAgICByZXR1cm4gdHMuY3JlYXRlSWRlbnRpZmllcihzeW1ib2xOYW1lKTtcbiAgICB9XG5cbiAgICBsZXQgbmFtZTogc3RyaW5nfG51bGwgPSBudWxsO1xuICAgIGxldCBjb3VudGVyID0gMTtcbiAgICBkbyB7XG4gICAgICBuYW1lID0gYCR7c3ltYm9sTmFtZX1fJHtjb3VudGVyKyt9YDtcbiAgICB9IHdoaWxlICghdGhpcy5faXNVbmlxdWVJZGVudGlmaWVyTmFtZShzb3VyY2VGaWxlLCBuYW1lLCBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucykpO1xuXG4gICAgdGhpcy5fcmVjb3JkVXNlZElkZW50aWZpZXIoc291cmNlRmlsZSwgbmFtZSEpO1xuICAgIHJldHVybiB0cy5jcmVhdGVJZGVudGlmaWVyKG5hbWUhKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGlkZW50aWZpZXIgbmFtZSBpcyB1c2VkIHdpdGhpbiB0aGUgZ2l2ZW4gc291cmNlIGZpbGUuXG4gICAqIEBwYXJhbSBzb3VyY2VGaWxlIFNvdXJjZSBmaWxlIHRvIGNoZWNrIGZvciBpZGVudGlmaWVyIGNvbGxpc2lvbnMuXG4gICAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIGlkZW50aWZpZXIgd2hpY2ggaXMgY2hlY2tlZCBmb3IgaXRzIHVuaXF1ZW5lc3MuXG4gICAqIEBwYXJhbSBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9ucyBMaXN0IG9mIGlkZW50aWZpZXJzIHdoaWNoIHNob3VsZCBiZSBpZ25vcmVkIHdoZW5cbiAgICogICAgY2hlY2tpbmcgZm9yIGlkZW50aWZpZXIgY29sbGlzaW9ucyBpbiB0aGUgZ2l2ZW4gc291cmNlIGZpbGUuXG4gICAqL1xuICBwcml2YXRlIF9pc1VuaXF1ZUlkZW50aWZpZXJOYW1lKFxuICAgICAgc291cmNlRmlsZTogdHMuU291cmNlRmlsZSwgbmFtZTogc3RyaW5nLCBpZ25vcmVJZGVudGlmaWVyQ29sbGlzaW9uczogdHMuSWRlbnRpZmllcltdKSB7XG4gICAgaWYgKHRoaXMuX3VzZWRJZGVudGlmaWVyTmFtZXMuaGFzKHNvdXJjZUZpbGUpICYmXG4gICAgICAgIHRoaXMuX3VzZWRJZGVudGlmaWVyTmFtZXMuZ2V0KHNvdXJjZUZpbGUpIS5pbmRleE9mKG5hbWUpICE9PSAtMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFdhbGsgdGhyb3VnaCB0aGUgc291cmNlIGZpbGUgYW5kIHNlYXJjaCBmb3IgYW4gaWRlbnRpZmllciBtYXRjaGluZ1xuICAgIC8vIHRoZSBnaXZlbiBuYW1lLiBJbiB0aGF0IGNhc2UsIGl0J3Mgbm90IGd1YXJhbnRlZWQgdGhhdCB0aGlzIG5hbWVcbiAgICAvLyBpcyB1bmlxdWUgaW4gdGhlIGdpdmVuIGRlY2xhcmF0aW9uIHNjb3BlIGFuZCB3ZSBqdXN0IHJldHVybiBmYWxzZS5cbiAgICBjb25zdCBub2RlUXVldWU6IHRzLk5vZGVbXSA9IFtzb3VyY2VGaWxlXTtcbiAgICB3aGlsZSAobm9kZVF1ZXVlLmxlbmd0aCkge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVRdWV1ZS5zaGlmdCgpITtcbiAgICAgIGlmICh0cy5pc0lkZW50aWZpZXIobm9kZSkgJiYgbm9kZS50ZXh0ID09PSBuYW1lICYmXG4gICAgICAgICAgIWlnbm9yZUlkZW50aWZpZXJDb2xsaXNpb25zLmluY2x1ZGVzKG5vZGUpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG5vZGVRdWV1ZS5wdXNoKC4uLm5vZGUuZ2V0Q2hpbGRyZW4oKSk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlY29yZHMgdGhhdCB0aGUgZ2l2ZW4gaWRlbnRpZmllciBpcyB1c2VkIHdpdGhpbiB0aGUgc3BlY2lmaWVkIHNvdXJjZSBmaWxlLiBUaGlzXG4gICAqIGlzIG5lY2Vzc2FyeSBzaW5jZSB3ZSBkbyBub3QgYXBwbHkgY2hhbmdlcyB0byBzb3VyY2UgZmlsZXMgcGVyIGNoYW5nZSwgYnV0IHN0aWxsXG4gICAqIHdhbnQgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggbmV3bHkgaW1wb3J0ZWQgc3ltYm9scy5cbiAgICovXG4gIHByaXZhdGUgX3JlY29yZFVzZWRJZGVudGlmaWVyKHNvdXJjZUZpbGU6IHRzLlNvdXJjZUZpbGUsIGlkZW50aWZpZXJOYW1lOiBzdHJpbmcpIHtcbiAgICB0aGlzLl91c2VkSWRlbnRpZmllck5hbWVzLnNldChcbiAgICAgICAgc291cmNlRmlsZSwgKHRoaXMuX3VzZWRJZGVudGlmaWVyTmFtZXMuZ2V0KHNvdXJjZUZpbGUpIHx8IFtdKS5jb25jYXQoaWRlbnRpZmllck5hbWUpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIHRoZSBmdWxsIGVuZCBvZiBhIGdpdmVuIG5vZGUuIEJ5IGRlZmF1bHQgdGhlIGVuZCBwb3NpdGlvbiBvZiBhIG5vZGUgaXNcbiAgICogYmVmb3JlIGFsbCB0cmFpbGluZyBjb21tZW50cy4gVGhpcyBjb3VsZCBtZWFuIHRoYXQgZ2VuZXJhdGVkIGltcG9ydHMgc2hpZnQgY29tbWVudHMuXG4gICAqL1xuICBwcml2YXRlIF9nZXRFbmRQb3NpdGlvbk9mTm9kZShub2RlOiB0cy5Ob2RlKSB7XG4gICAgY29uc3Qgbm9kZUVuZFBvcyA9IG5vZGUuZ2V0RW5kKCk7XG4gICAgY29uc3QgY29tbWVudFJhbmdlcyA9IHRzLmdldFRyYWlsaW5nQ29tbWVudFJhbmdlcyhub2RlLmdldFNvdXJjZUZpbGUoKS50ZXh0LCBub2RlRW5kUG9zKTtcbiAgICBpZiAoIWNvbW1lbnRSYW5nZXMgfHwgIWNvbW1lbnRSYW5nZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gbm9kZUVuZFBvcztcbiAgICB9XG4gICAgcmV0dXJuIGNvbW1lbnRSYW5nZXNbY29tbWVudFJhbmdlcy5sZW5ndGggLSAxXSEuZW5kO1xuICB9XG59XG4iXX0=
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Use of this source code is governed by an MIT-style license that can be
|
|
6
6
|
* found in the LICENSE file at https://angular.io/license
|
|
7
7
|
*/
|
|
8
|
-
/// <amd-module name="@angular/material/schematics/ng-update/
|
|
8
|
+
/// <amd-module name="@angular/material/schematics/ng-update/migrations/hammer-gestures-v9/remove-array-element" />
|
|
9
9
|
import { UpdateRecorder } from '@angular-devkit/schematics';
|
|
10
10
|
import * as ts from 'typescript';
|
|
11
11
|
/**
|