@itwin/appui-abstract 4.0.0-dev.48 → 4.0.0-dev.51
Sign up to get free protection for your applications and to get access to all the features.
- package/lib/cjs/appui-abstract/BaseUiItemsProvider.d.ts +30 -30
- package/lib/cjs/appui-abstract/BaseUiItemsProvider.js +79 -79
- package/lib/cjs/appui-abstract/BaseUiItemsProvider.js.map +1 -1
- package/lib/cjs/appui-abstract/UiAdmin.d.ts +221 -221
- package/lib/cjs/appui-abstract/UiAdmin.js +224 -224
- package/lib/cjs/appui-abstract/UiAdmin.js.map +1 -1
- package/lib/cjs/appui-abstract/UiItemsManager.d.ts +113 -113
- package/lib/cjs/appui-abstract/UiItemsManager.js +193 -193
- package/lib/cjs/appui-abstract/UiItemsManager.js.map +1 -1
- package/lib/cjs/appui-abstract/UiItemsProvider.d.ts +29 -29
- package/lib/cjs/appui-abstract/UiItemsProvider.js +9 -9
- package/lib/cjs/appui-abstract/UiItemsProvider.js.map +1 -1
- package/lib/cjs/appui-abstract/backstage/BackstageItem.d.ts +91 -91
- package/lib/cjs/appui-abstract/backstage/BackstageItem.js +70 -70
- package/lib/cjs/appui-abstract/backstage/BackstageItem.js.map +1 -1
- package/lib/cjs/appui-abstract/backstage/BackstageItemsManager.d.ts +38 -38
- package/lib/cjs/appui-abstract/backstage/BackstageItemsManager.js +133 -133
- package/lib/cjs/appui-abstract/backstage/BackstageItemsManager.js.map +1 -1
- package/lib/cjs/appui-abstract/common/KeyboardKey.d.ts +51 -51
- package/lib/cjs/appui-abstract/common/KeyboardKey.js +63 -63
- package/lib/cjs/appui-abstract/common/KeyboardKey.js.map +1 -1
- package/lib/cjs/appui-abstract/content/ContentLayoutProps.d.ts +62 -62
- package/lib/cjs/appui-abstract/content/ContentLayoutProps.js +9 -9
- package/lib/cjs/appui-abstract/content/ContentLayoutProps.js.map +1 -1
- package/lib/cjs/appui-abstract/content/StandardContentLayouts.d.ts +19 -19
- package/lib/cjs/appui-abstract/content/StandardContentLayouts.js +108 -108
- package/lib/cjs/appui-abstract/content/StandardContentLayouts.js.map +1 -1
- package/lib/cjs/appui-abstract/dialogs/DialogItem.d.ts +76 -76
- package/lib/cjs/appui-abstract/dialogs/DialogItem.js +67 -67
- package/lib/cjs/appui-abstract/dialogs/DialogItem.js.map +1 -1
- package/lib/cjs/appui-abstract/dialogs/UiDataProvider.d.ts +55 -55
- package/lib/cjs/appui-abstract/dialogs/UiDataProvider.js +66 -66
- package/lib/cjs/appui-abstract/dialogs/UiDataProvider.js.map +1 -1
- package/lib/cjs/appui-abstract/dialogs/UiLayoutDataProvider.d.ts +97 -97
- package/lib/cjs/appui-abstract/dialogs/UiLayoutDataProvider.js +175 -175
- package/lib/cjs/appui-abstract/dialogs/UiLayoutDataProvider.js.map +1 -1
- package/lib/cjs/appui-abstract/items/AbstractItemProps.d.ts +53 -53
- package/lib/cjs/appui-abstract/items/AbstractItemProps.js +9 -9
- package/lib/cjs/appui-abstract/items/AbstractItemProps.js.map +1 -1
- package/lib/cjs/appui-abstract/items/AbstractMenuItemProps.d.ts +20 -20
- package/lib/cjs/appui-abstract/items/AbstractMenuItemProps.js +9 -9
- package/lib/cjs/appui-abstract/items/AbstractMenuItemProps.js.map +1 -1
- package/lib/cjs/appui-abstract/items/AbstractToolbarProps.d.ts +13 -13
- package/lib/cjs/appui-abstract/items/AbstractToolbarProps.js +9 -9
- package/lib/cjs/appui-abstract/items/AbstractToolbarProps.js.map +1 -1
- package/lib/cjs/appui-abstract/items/BadgeType.d.ts +14 -14
- package/lib/cjs/appui-abstract/items/BadgeType.js +22 -22
- package/lib/cjs/appui-abstract/items/BadgeType.js.map +1 -1
- package/lib/cjs/appui-abstract/items/ConditionalBooleanValue.d.ts +27 -27
- package/lib/cjs/appui-abstract/items/ConditionalBooleanValue.js +60 -60
- package/lib/cjs/appui-abstract/items/ConditionalBooleanValue.js.map +1 -1
- package/lib/cjs/appui-abstract/items/ConditionalStringValue.d.ts +29 -29
- package/lib/cjs/appui-abstract/items/ConditionalStringValue.js +62 -62
- package/lib/cjs/appui-abstract/items/ConditionalStringValue.js.map +1 -1
- package/lib/cjs/appui-abstract/items/ProvidedItem.d.ts +11 -11
- package/lib/cjs/appui-abstract/items/ProvidedItem.js +9 -9
- package/lib/cjs/appui-abstract/items/ProvidedItem.js.map +1 -1
- package/lib/cjs/appui-abstract/items/RelativePosition.d.ts +18 -18
- package/lib/cjs/appui-abstract/items/RelativePosition.js +26 -26
- package/lib/cjs/appui-abstract/items/RelativePosition.js.map +1 -1
- package/lib/cjs/appui-abstract/items/StageUsage.d.ts +16 -16
- package/lib/cjs/appui-abstract/items/StageUsage.js +24 -24
- package/lib/cjs/appui-abstract/items/StageUsage.js.map +1 -1
- package/lib/cjs/appui-abstract/notification/MessagePresenter.d.ts +42 -42
- package/lib/cjs/appui-abstract/notification/MessagePresenter.js +24 -24
- package/lib/cjs/appui-abstract/notification/MessagePresenter.js.map +1 -1
- package/lib/cjs/appui-abstract/notification/MessageSeverity.d.ts +15 -15
- package/lib/cjs/appui-abstract/notification/MessageSeverity.js +23 -23
- package/lib/cjs/appui-abstract/notification/MessageSeverity.js.map +1 -1
- package/lib/cjs/appui-abstract/properties/Description.d.ts +127 -127
- package/lib/cjs/appui-abstract/properties/Description.js +196 -196
- package/lib/cjs/appui-abstract/properties/Description.js.map +1 -1
- package/lib/cjs/appui-abstract/properties/EditorParams.d.ts +260 -260
- package/lib/cjs/appui-abstract/properties/EditorParams.js +106 -106
- package/lib/cjs/appui-abstract/properties/EditorParams.js.map +1 -1
- package/lib/cjs/appui-abstract/properties/PrimitiveTypes.d.ts +60 -60
- package/lib/cjs/appui-abstract/properties/PrimitiveTypes.js +9 -9
- package/lib/cjs/appui-abstract/properties/PrimitiveTypes.js.map +1 -1
- package/lib/cjs/appui-abstract/properties/Record.d.ts +57 -57
- package/lib/cjs/appui-abstract/properties/Record.js +78 -78
- package/lib/cjs/appui-abstract/properties/Record.js.map +1 -1
- package/lib/cjs/appui-abstract/properties/StandardEditorNames.d.ts +22 -22
- package/lib/cjs/appui-abstract/properties/StandardEditorNames.js +30 -30
- package/lib/cjs/appui-abstract/properties/StandardEditorNames.js.map +1 -1
- package/lib/cjs/appui-abstract/properties/StandardTypeNames.d.ts +30 -30
- package/lib/cjs/appui-abstract/properties/StandardTypeNames.js +39 -39
- package/lib/cjs/appui-abstract/properties/StandardTypeNames.js.map +1 -1
- package/lib/cjs/appui-abstract/properties/Value.d.ts +49 -49
- package/lib/cjs/appui-abstract/properties/Value.js +20 -20
- package/lib/cjs/appui-abstract/properties/Value.js.map +1 -1
- package/lib/cjs/appui-abstract/quantity/BaseQuantityDescription.d.ts +22 -22
- package/lib/cjs/appui-abstract/quantity/BaseQuantityDescription.js +48 -48
- package/lib/cjs/appui-abstract/quantity/BaseQuantityDescription.js.map +1 -1
- package/lib/cjs/appui-abstract/statusbar/StatusBarItem.d.ts +128 -128
- package/lib/cjs/appui-abstract/statusbar/StatusBarItem.js +87 -87
- package/lib/cjs/appui-abstract/statusbar/StatusBarItem.js.map +1 -1
- package/lib/cjs/appui-abstract/statusbar/StatusBarItemsManager.d.ts +39 -39
- package/lib/cjs/appui-abstract/statusbar/StatusBarItemsManager.js +135 -135
- package/lib/cjs/appui-abstract/statusbar/StatusBarItemsManager.js.map +1 -1
- package/lib/cjs/appui-abstract/toolbars/ToolbarItem.d.ts +121 -121
- package/lib/cjs/appui-abstract/toolbars/ToolbarItem.js +64 -64
- package/lib/cjs/appui-abstract/toolbars/ToolbarItem.js.map +1 -1
- package/lib/cjs/appui-abstract/toolbars/ToolbarItemsManager.d.ts +45 -45
- package/lib/cjs/appui-abstract/toolbars/ToolbarItemsManager.js +235 -235
- package/lib/cjs/appui-abstract/toolbars/ToolbarItemsManager.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/IconSpecUtilities.d.ts +29 -29
- package/lib/cjs/appui-abstract/utils/IconSpecUtilities.js +51 -51
- package/lib/cjs/appui-abstract/utils/IconSpecUtilities.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/PointProps.d.ts +10 -10
- package/lib/cjs/appui-abstract/utils/PointProps.js +9 -9
- package/lib/cjs/appui-abstract/utils/PointProps.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/UiError.d.ts +12 -12
- package/lib/cjs/appui-abstract/utils/UiError.js +22 -22
- package/lib/cjs/appui-abstract/utils/UiError.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/UiEvent.d.ts +9 -9
- package/lib/cjs/appui-abstract/utils/UiEvent.js +17 -17
- package/lib/cjs/appui-abstract/utils/UiEvent.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/UiEventDispatcher.d.ts +46 -46
- package/lib/cjs/appui-abstract/utils/UiEventDispatcher.js +131 -131
- package/lib/cjs/appui-abstract/utils/UiEventDispatcher.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/callbacks.d.ts +20 -20
- package/lib/cjs/appui-abstract/utils/callbacks.js +9 -9
- package/lib/cjs/appui-abstract/utils/callbacks.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/filter/charCode.d.ts +416 -416
- package/lib/cjs/appui-abstract/utils/filter/charCode.js +6 -6
- package/lib/cjs/appui-abstract/utils/filter/charCode.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/filter/filters.d.ts +98 -98
- package/lib/cjs/appui-abstract/utils/filter/filters.js +709 -709
- package/lib/cjs/appui-abstract/utils/filter/filters.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/filter/map.d.ts +59 -59
- package/lib/cjs/appui-abstract/utils/filter/map.js +402 -402
- package/lib/cjs/appui-abstract/utils/filter/map.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/filter/strings.d.ts +20 -20
- package/lib/cjs/appui-abstract/utils/filter/strings.js +78 -78
- package/lib/cjs/appui-abstract/utils/filter/strings.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/isLetter.d.ts +9 -9
- package/lib/cjs/appui-abstract/utils/isLetter.js +19 -19
- package/lib/cjs/appui-abstract/utils/isLetter.js.map +1 -1
- package/lib/cjs/appui-abstract/utils/misc.d.ts +11 -11
- package/lib/cjs/appui-abstract/utils/misc.js +36 -36
- package/lib/cjs/appui-abstract/utils/misc.js.map +1 -1
- package/lib/cjs/appui-abstract/widget/AbstractWidgetProps.d.ts +86 -86
- package/lib/cjs/appui-abstract/widget/AbstractWidgetProps.js +9 -9
- package/lib/cjs/appui-abstract/widget/AbstractWidgetProps.js.map +1 -1
- package/lib/cjs/appui-abstract/widget/StagePanel.d.ts +36 -36
- package/lib/cjs/appui-abstract/widget/StagePanel.js +46 -46
- package/lib/cjs/appui-abstract/widget/StagePanel.js.map +1 -1
- package/lib/cjs/appui-abstract/widget/WidgetState.d.ts +19 -19
- package/lib/cjs/appui-abstract/widget/WidgetState.js +27 -27
- package/lib/cjs/appui-abstract/widget/WidgetState.js.map +1 -1
- package/lib/cjs/appui-abstract.d.ts +103 -103
- package/lib/cjs/appui-abstract.js +119 -119
- package/lib/cjs/appui-abstract.js.map +1 -1
- package/lib/esm/appui-abstract/BaseUiItemsProvider.d.ts +30 -30
- package/lib/esm/appui-abstract/BaseUiItemsProvider.js +75 -75
- package/lib/esm/appui-abstract/BaseUiItemsProvider.js.map +1 -1
- package/lib/esm/appui-abstract/UiAdmin.d.ts +221 -221
- package/lib/esm/appui-abstract/UiAdmin.js +219 -219
- package/lib/esm/appui-abstract/UiAdmin.js.map +1 -1
- package/lib/esm/appui-abstract/UiItemsManager.d.ts +113 -113
- package/lib/esm/appui-abstract/UiItemsManager.js +189 -189
- package/lib/esm/appui-abstract/UiItemsManager.js.map +1 -1
- package/lib/esm/appui-abstract/UiItemsProvider.d.ts +29 -29
- package/lib/esm/appui-abstract/UiItemsProvider.js +8 -8
- package/lib/esm/appui-abstract/UiItemsProvider.js.map +1 -1
- package/lib/esm/appui-abstract/backstage/BackstageItem.d.ts +91 -91
- package/lib/esm/appui-abstract/backstage/BackstageItem.js +64 -64
- package/lib/esm/appui-abstract/backstage/BackstageItem.js.map +1 -1
- package/lib/esm/appui-abstract/backstage/BackstageItemsManager.d.ts +38 -38
- package/lib/esm/appui-abstract/backstage/BackstageItemsManager.js +129 -129
- package/lib/esm/appui-abstract/backstage/BackstageItemsManager.js.map +1 -1
- package/lib/esm/appui-abstract/common/KeyboardKey.d.ts +51 -51
- package/lib/esm/appui-abstract/common/KeyboardKey.js +59 -59
- package/lib/esm/appui-abstract/common/KeyboardKey.js.map +1 -1
- package/lib/esm/appui-abstract/content/ContentLayoutProps.d.ts +62 -62
- package/lib/esm/appui-abstract/content/ContentLayoutProps.js +8 -8
- package/lib/esm/appui-abstract/content/ContentLayoutProps.js.map +1 -1
- package/lib/esm/appui-abstract/content/StandardContentLayouts.d.ts +19 -19
- package/lib/esm/appui-abstract/content/StandardContentLayouts.js +104 -104
- package/lib/esm/appui-abstract/content/StandardContentLayouts.js.map +1 -1
- package/lib/esm/appui-abstract/dialogs/DialogItem.d.ts +76 -76
- package/lib/esm/appui-abstract/dialogs/DialogItem.js +63 -63
- package/lib/esm/appui-abstract/dialogs/DialogItem.js.map +1 -1
- package/lib/esm/appui-abstract/dialogs/UiDataProvider.d.ts +55 -55
- package/lib/esm/appui-abstract/dialogs/UiDataProvider.js +61 -61
- package/lib/esm/appui-abstract/dialogs/UiDataProvider.js.map +1 -1
- package/lib/esm/appui-abstract/dialogs/UiLayoutDataProvider.d.ts +97 -97
- package/lib/esm/appui-abstract/dialogs/UiLayoutDataProvider.js +170 -170
- package/lib/esm/appui-abstract/dialogs/UiLayoutDataProvider.js.map +1 -1
- package/lib/esm/appui-abstract/items/AbstractItemProps.d.ts +53 -53
- package/lib/esm/appui-abstract/items/AbstractItemProps.js +8 -8
- package/lib/esm/appui-abstract/items/AbstractItemProps.js.map +1 -1
- package/lib/esm/appui-abstract/items/AbstractMenuItemProps.d.ts +20 -20
- package/lib/esm/appui-abstract/items/AbstractMenuItemProps.js +8 -8
- package/lib/esm/appui-abstract/items/AbstractMenuItemProps.js.map +1 -1
- package/lib/esm/appui-abstract/items/AbstractToolbarProps.d.ts +13 -13
- package/lib/esm/appui-abstract/items/AbstractToolbarProps.js +8 -8
- package/lib/esm/appui-abstract/items/AbstractToolbarProps.js.map +1 -1
- package/lib/esm/appui-abstract/items/BadgeType.d.ts +14 -14
- package/lib/esm/appui-abstract/items/BadgeType.js +19 -19
- package/lib/esm/appui-abstract/items/BadgeType.js.map +1 -1
- package/lib/esm/appui-abstract/items/ConditionalBooleanValue.d.ts +27 -27
- package/lib/esm/appui-abstract/items/ConditionalBooleanValue.js +56 -56
- package/lib/esm/appui-abstract/items/ConditionalBooleanValue.js.map +1 -1
- package/lib/esm/appui-abstract/items/ConditionalStringValue.d.ts +29 -29
- package/lib/esm/appui-abstract/items/ConditionalStringValue.js +58 -58
- package/lib/esm/appui-abstract/items/ConditionalStringValue.js.map +1 -1
- package/lib/esm/appui-abstract/items/ProvidedItem.d.ts +11 -11
- package/lib/esm/appui-abstract/items/ProvidedItem.js +8 -8
- package/lib/esm/appui-abstract/items/ProvidedItem.js.map +1 -1
- package/lib/esm/appui-abstract/items/RelativePosition.d.ts +18 -18
- package/lib/esm/appui-abstract/items/RelativePosition.js +23 -23
- package/lib/esm/appui-abstract/items/RelativePosition.js.map +1 -1
- package/lib/esm/appui-abstract/items/StageUsage.d.ts +16 -16
- package/lib/esm/appui-abstract/items/StageUsage.js +21 -21
- package/lib/esm/appui-abstract/items/StageUsage.js.map +1 -1
- package/lib/esm/appui-abstract/notification/MessagePresenter.d.ts +42 -42
- package/lib/esm/appui-abstract/notification/MessagePresenter.js +21 -21
- package/lib/esm/appui-abstract/notification/MessagePresenter.js.map +1 -1
- package/lib/esm/appui-abstract/notification/MessageSeverity.d.ts +15 -15
- package/lib/esm/appui-abstract/notification/MessageSeverity.js +20 -20
- package/lib/esm/appui-abstract/notification/MessageSeverity.js.map +1 -1
- package/lib/esm/appui-abstract/properties/Description.d.ts +127 -127
- package/lib/esm/appui-abstract/properties/Description.js +192 -192
- package/lib/esm/appui-abstract/properties/Description.js.map +1 -1
- package/lib/esm/appui-abstract/properties/EditorParams.d.ts +260 -260
- package/lib/esm/appui-abstract/properties/EditorParams.js +97 -97
- package/lib/esm/appui-abstract/properties/EditorParams.js.map +1 -1
- package/lib/esm/appui-abstract/properties/PrimitiveTypes.d.ts +60 -60
- package/lib/esm/appui-abstract/properties/PrimitiveTypes.js +8 -8
- package/lib/esm/appui-abstract/properties/PrimitiveTypes.js.map +1 -1
- package/lib/esm/appui-abstract/properties/Record.d.ts +57 -57
- package/lib/esm/appui-abstract/properties/Record.js +74 -74
- package/lib/esm/appui-abstract/properties/Record.js.map +1 -1
- package/lib/esm/appui-abstract/properties/StandardEditorNames.d.ts +22 -22
- package/lib/esm/appui-abstract/properties/StandardEditorNames.js +27 -27
- package/lib/esm/appui-abstract/properties/StandardEditorNames.js.map +1 -1
- package/lib/esm/appui-abstract/properties/StandardTypeNames.d.ts +30 -30
- package/lib/esm/appui-abstract/properties/StandardTypeNames.js +36 -36
- package/lib/esm/appui-abstract/properties/StandardTypeNames.js.map +1 -1
- package/lib/esm/appui-abstract/properties/Value.d.ts +49 -49
- package/lib/esm/appui-abstract/properties/Value.js +17 -17
- package/lib/esm/appui-abstract/properties/Value.js.map +1 -1
- package/lib/esm/appui-abstract/quantity/BaseQuantityDescription.d.ts +22 -22
- package/lib/esm/appui-abstract/quantity/BaseQuantityDescription.js +44 -44
- package/lib/esm/appui-abstract/quantity/BaseQuantityDescription.js.map +1 -1
- package/lib/esm/appui-abstract/statusbar/StatusBarItem.d.ts +128 -128
- package/lib/esm/appui-abstract/statusbar/StatusBarItem.js +80 -80
- package/lib/esm/appui-abstract/statusbar/StatusBarItem.js.map +1 -1
- package/lib/esm/appui-abstract/statusbar/StatusBarItemsManager.d.ts +39 -39
- package/lib/esm/appui-abstract/statusbar/StatusBarItemsManager.js +131 -131
- package/lib/esm/appui-abstract/statusbar/StatusBarItemsManager.js.map +1 -1
- package/lib/esm/appui-abstract/toolbars/ToolbarItem.d.ts +121 -121
- package/lib/esm/appui-abstract/toolbars/ToolbarItem.js +60 -60
- package/lib/esm/appui-abstract/toolbars/ToolbarItem.js.map +1 -1
- package/lib/esm/appui-abstract/toolbars/ToolbarItemsManager.d.ts +45 -45
- package/lib/esm/appui-abstract/toolbars/ToolbarItemsManager.js +231 -231
- package/lib/esm/appui-abstract/toolbars/ToolbarItemsManager.js.map +1 -1
- package/lib/esm/appui-abstract/utils/IconSpecUtilities.d.ts +29 -29
- package/lib/esm/appui-abstract/utils/IconSpecUtilities.js +47 -47
- package/lib/esm/appui-abstract/utils/IconSpecUtilities.js.map +1 -1
- package/lib/esm/appui-abstract/utils/PointProps.d.ts +10 -10
- package/lib/esm/appui-abstract/utils/PointProps.js +8 -8
- package/lib/esm/appui-abstract/utils/PointProps.js.map +1 -1
- package/lib/esm/appui-abstract/utils/UiError.d.ts +12 -12
- package/lib/esm/appui-abstract/utils/UiError.js +18 -18
- package/lib/esm/appui-abstract/utils/UiError.js.map +1 -1
- package/lib/esm/appui-abstract/utils/UiEvent.d.ts +9 -9
- package/lib/esm/appui-abstract/utils/UiEvent.js +13 -13
- package/lib/esm/appui-abstract/utils/UiEvent.js.map +1 -1
- package/lib/esm/appui-abstract/utils/UiEventDispatcher.d.ts +46 -46
- package/lib/esm/appui-abstract/utils/UiEventDispatcher.js +126 -126
- package/lib/esm/appui-abstract/utils/UiEventDispatcher.js.map +1 -1
- package/lib/esm/appui-abstract/utils/callbacks.d.ts +20 -20
- package/lib/esm/appui-abstract/utils/callbacks.js +8 -8
- package/lib/esm/appui-abstract/utils/callbacks.js.map +1 -1
- package/lib/esm/appui-abstract/utils/filter/charCode.d.ts +416 -416
- package/lib/esm/appui-abstract/utils/filter/charCode.js +5 -5
- package/lib/esm/appui-abstract/utils/filter/charCode.js.map +1 -1
- package/lib/esm/appui-abstract/utils/filter/filters.d.ts +98 -98
- package/lib/esm/appui-abstract/utils/filter/filters.js +694 -694
- package/lib/esm/appui-abstract/utils/filter/filters.js.map +1 -1
- package/lib/esm/appui-abstract/utils/filter/map.d.ts +59 -59
- package/lib/esm/appui-abstract/utils/filter/map.js +397 -397
- package/lib/esm/appui-abstract/utils/filter/map.js.map +1 -1
- package/lib/esm/appui-abstract/utils/filter/strings.d.ts +20 -20
- package/lib/esm/appui-abstract/utils/filter/strings.js +70 -70
- package/lib/esm/appui-abstract/utils/filter/strings.js.map +1 -1
- package/lib/esm/appui-abstract/utils/isLetter.d.ts +9 -9
- package/lib/esm/appui-abstract/utils/isLetter.js +15 -15
- package/lib/esm/appui-abstract/utils/isLetter.js.map +1 -1
- package/lib/esm/appui-abstract/utils/misc.d.ts +11 -11
- package/lib/esm/appui-abstract/utils/misc.js +31 -31
- package/lib/esm/appui-abstract/utils/misc.js.map +1 -1
- package/lib/esm/appui-abstract/widget/AbstractWidgetProps.d.ts +86 -86
- package/lib/esm/appui-abstract/widget/AbstractWidgetProps.js +8 -8
- package/lib/esm/appui-abstract/widget/AbstractWidgetProps.js.map +1 -1
- package/lib/esm/appui-abstract/widget/StagePanel.d.ts +36 -36
- package/lib/esm/appui-abstract/widget/StagePanel.js +43 -43
- package/lib/esm/appui-abstract/widget/StagePanel.js.map +1 -1
- package/lib/esm/appui-abstract/widget/WidgetState.d.ts +19 -19
- package/lib/esm/appui-abstract/widget/WidgetState.js +24 -24
- package/lib/esm/appui-abstract/widget/WidgetState.js.map +1 -1
- package/lib/esm/appui-abstract.d.ts +103 -103
- package/lib/esm/appui-abstract.js +107 -107
- package/lib/esm/appui-abstract.js.map +1 -1
- package/package.json +4 -4
@@ -1,710 +1,710 @@
|
|
1
|
-
"use strict";
|
2
|
-
/*---------------------------------------------------------------------------------------------
|
3
|
-
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
4
|
-
* See LICENSE.md in the project root for license terms and full copyright notice.
|
5
|
-
*--------------------------------------------------------------------------------------------*/
|
6
|
-
/** @packageDocumentation
|
7
|
-
* @module Utilities
|
8
|
-
*/
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
10
|
-
exports.fuzzyScoreGraceful = exports.fuzzyScoreGracefulAggressive = exports.fuzzyScore = exports.FuzzyScore = exports.isPatternInWord = exports.createMatches = exports.matchesFuzzy2 = exports.matchesFuzzy = exports.matchesWords = exports.matchesCamelCase = exports.matchesSubString = exports.matchesContiguousSubString = exports.matchesPrefix = exports.matchesStrictPrefix = exports.or = void 0;
|
11
|
-
const map_1 = require("./map");
|
12
|
-
const strings = require("./strings");
|
13
|
-
// Combined filters
|
14
|
-
/**
|
15
|
-
* @returns A filter which combines the provided set
|
16
|
-
* of filters with an or. The *first* filters that
|
17
|
-
* matches defined the return value of the returned
|
18
|
-
* filter.
|
19
|
-
* @internal
|
20
|
-
*/
|
21
|
-
function or(...filter) {
|
22
|
-
return function (word, wordToMatchAgainst) {
|
23
|
-
for (let i = 0, len = filter.length; i < len; i++) {
|
24
|
-
const match = filter[i](word, wordToMatchAgainst);
|
25
|
-
if (match) {
|
26
|
-
return match;
|
27
|
-
}
|
28
|
-
}
|
29
|
-
return null;
|
30
|
-
};
|
31
|
-
}
|
32
|
-
exports.or = or;
|
33
|
-
// Prefix
|
34
|
-
/** @internal */
|
35
|
-
exports.matchesStrictPrefix = _matchesPrefix.bind(undefined, false);
|
36
|
-
/** @internal */
|
37
|
-
exports.matchesPrefix = _matchesPrefix.bind(undefined, true);
|
38
|
-
function _matchesPrefix(ignoreCase, word, wordToMatchAgainst) {
|
39
|
-
if (!wordToMatchAgainst || wordToMatchAgainst.length < word.length) {
|
40
|
-
return null;
|
41
|
-
}
|
42
|
-
let matches;
|
43
|
-
if (ignoreCase) {
|
44
|
-
matches = strings.startsWithIgnoreCase(wordToMatchAgainst, word);
|
45
|
-
}
|
46
|
-
else {
|
47
|
-
matches = wordToMatchAgainst.indexOf(word) === 0;
|
48
|
-
}
|
49
|
-
if (!matches) {
|
50
|
-
return null;
|
51
|
-
}
|
52
|
-
return word.length > 0 ? [{ start: 0, end: word.length }] : [];
|
53
|
-
}
|
54
|
-
// Contiguous Substring
|
55
|
-
/** @internal */
|
56
|
-
function matchesContiguousSubString(word, wordToMatchAgainst) {
|
57
|
-
const index = wordToMatchAgainst.toLowerCase().indexOf(word.toLowerCase());
|
58
|
-
if (index === -1) {
|
59
|
-
return null;
|
60
|
-
}
|
61
|
-
return [{ start: index, end: index + word.length }];
|
62
|
-
}
|
63
|
-
exports.matchesContiguousSubString = matchesContiguousSubString;
|
64
|
-
// Substring
|
65
|
-
/**
|
66
|
-
* Return case insensitive substring matches
|
67
|
-
* @param word filter string
|
68
|
-
* @param wordToMatchAgainst string to test
|
69
|
-
* @internal
|
70
|
-
*/
|
71
|
-
function matchesSubString(word, wordToMatchAgainst) {
|
72
|
-
return _matchesSubString(word.toLowerCase(), wordToMatchAgainst.toLowerCase(), 0, 0);
|
73
|
-
}
|
74
|
-
exports.matchesSubString = matchesSubString;
|
75
|
-
function _matchesSubString(word, wordToMatchAgainst, i, j) {
|
76
|
-
if (i === word.length) {
|
77
|
-
return [];
|
78
|
-
}
|
79
|
-
else if (j === wordToMatchAgainst.length) {
|
80
|
-
return null;
|
81
|
-
}
|
82
|
-
else {
|
83
|
-
if (word[i] === wordToMatchAgainst[j]) {
|
84
|
-
let result = null;
|
85
|
-
if (result = _matchesSubString(word, wordToMatchAgainst, i + 1, j + 1)) {
|
86
|
-
return join({ start: j, end: j + 1 }, result);
|
87
|
-
}
|
88
|
-
return null;
|
89
|
-
}
|
90
|
-
return _matchesSubString(word, wordToMatchAgainst, i, j + 1);
|
91
|
-
}
|
92
|
-
}
|
93
|
-
// CamelCase
|
94
|
-
function isLower(code) {
|
95
|
-
return 97 /* a */ <= code && code <= 122 /* z */;
|
96
|
-
}
|
97
|
-
function isUpper(code) {
|
98
|
-
return 65 /* A */ <= code && code <= 90 /* Z */;
|
99
|
-
}
|
100
|
-
function isNumber(code) {
|
101
|
-
return 48 /* Digit0 */ <= code && code <= 57 /* Digit9 */;
|
102
|
-
}
|
103
|
-
function isWhitespace(code) {
|
104
|
-
return (code === 32 /* Space */
|
105
|
-
|| code === 9 /* Tab */
|
106
|
-
|| code === 10 /* LineFeed */
|
107
|
-
|| code === 13 /* CarriageReturn */);
|
108
|
-
}
|
109
|
-
const wordSeparators = new Set();
|
110
|
-
'`~!@#$%^&*()-=+[{]}\\|;:\'",.<>/?'
|
111
|
-
.split("")
|
112
|
-
.forEach((s) => wordSeparators.add(s.charCodeAt(0)));
|
113
|
-
function isWordSeparator(code) {
|
114
|
-
return isWhitespace(code) || wordSeparators.has(code);
|
115
|
-
}
|
116
|
-
function charactersMatch(codeA, codeB) {
|
117
|
-
return (codeA === codeB) || (isWordSeparator(codeA) && isWordSeparator(codeB));
|
118
|
-
}
|
119
|
-
function isAlphanumeric(code) {
|
120
|
-
return isLower(code) || isUpper(code) || isNumber(code);
|
121
|
-
}
|
122
|
-
function join(head, tail) {
|
123
|
-
if (tail.length === 0) {
|
124
|
-
tail = [head];
|
125
|
-
}
|
126
|
-
else if (head.end === tail[0].start) {
|
127
|
-
tail[0].start = head.start;
|
128
|
-
}
|
129
|
-
else {
|
130
|
-
tail.unshift(head);
|
131
|
-
}
|
132
|
-
return tail;
|
133
|
-
}
|
134
|
-
function nextAnchor(camelCaseWord, start) {
|
135
|
-
for (let i = start; i < camelCaseWord.length; i++) {
|
136
|
-
const c = camelCaseWord.charCodeAt(i);
|
137
|
-
if (isUpper(c) || isNumber(c) || (i > 0 && !isAlphanumeric(camelCaseWord.charCodeAt(i - 1)))) {
|
138
|
-
return i;
|
139
|
-
}
|
140
|
-
}
|
141
|
-
return camelCaseWord.length;
|
142
|
-
}
|
143
|
-
function _matchesCamelCase(word, camelCaseWord, i, j) {
|
144
|
-
if (i === word.length) {
|
145
|
-
return [];
|
146
|
-
}
|
147
|
-
else if (j === camelCaseWord.length) {
|
148
|
-
return null;
|
149
|
-
}
|
150
|
-
else if (word[i] !== camelCaseWord[j].toLowerCase()) {
|
151
|
-
return null;
|
152
|
-
}
|
153
|
-
else {
|
154
|
-
let result = null;
|
155
|
-
let nextUpperIndex = j + 1;
|
156
|
-
result = _matchesCamelCase(word, camelCaseWord, i + 1, j + 1);
|
157
|
-
while (!result && (nextUpperIndex = nextAnchor(camelCaseWord, nextUpperIndex)) < camelCaseWord.length) {
|
158
|
-
result = _matchesCamelCase(word, camelCaseWord, i + 1, nextUpperIndex);
|
159
|
-
nextUpperIndex++;
|
160
|
-
}
|
161
|
-
return result === null ? null : join({ start: j, end: j + 1 }, result);
|
162
|
-
}
|
163
|
-
}
|
164
|
-
// Heuristic to avoid computing camel case matcher for words that don't
|
165
|
-
// look like camelCaseWords.
|
166
|
-
function analyzeCamelCaseWord(word) {
|
167
|
-
let upper = 0, lower = 0, alpha = 0, numeric = 0, code = 0;
|
168
|
-
for (let i = 0; i < word.length; i++) {
|
169
|
-
code = word.charCodeAt(i);
|
170
|
-
if (isUpper(code)) {
|
171
|
-
upper++;
|
172
|
-
}
|
173
|
-
if (isLower(code)) {
|
174
|
-
lower++;
|
175
|
-
}
|
176
|
-
if (isAlphanumeric(code)) {
|
177
|
-
alpha++;
|
178
|
-
}
|
179
|
-
if (isNumber(code)) {
|
180
|
-
numeric++;
|
181
|
-
}
|
182
|
-
}
|
183
|
-
const upperPercent = upper / word.length;
|
184
|
-
const lowerPercent = lower / word.length;
|
185
|
-
const alphaPercent = alpha / word.length;
|
186
|
-
const numericPercent = numeric / word.length;
|
187
|
-
return { upperPercent, lowerPercent, alphaPercent, numericPercent };
|
188
|
-
}
|
189
|
-
function isUpperCaseWord(analysis) {
|
190
|
-
const { upperPercent, lowerPercent } = analysis;
|
191
|
-
return lowerPercent === 0 && upperPercent > 0.6;
|
192
|
-
}
|
193
|
-
function isCamelCaseWord(analysis) {
|
194
|
-
const { upperPercent, lowerPercent, alphaPercent, numericPercent } = analysis;
|
195
|
-
return lowerPercent > 0.2 && upperPercent < 0.8 && alphaPercent > 0.6 && numericPercent < 0.2;
|
196
|
-
}
|
197
|
-
// Heuristic to avoid computing camel case matcher for words that don't
|
198
|
-
// look like camel case patterns.
|
199
|
-
function isCamelCasePattern(word) {
|
200
|
-
let upper = 0, lower = 0, code = 0, whitespace = 0;
|
201
|
-
for (let i = 0; i < word.length; i++) {
|
202
|
-
code = word.charCodeAt(i);
|
203
|
-
if (isUpper(code)) {
|
204
|
-
upper++;
|
205
|
-
}
|
206
|
-
if (isLower(code)) {
|
207
|
-
lower++;
|
208
|
-
}
|
209
|
-
if (isWhitespace(code)) {
|
210
|
-
whitespace++;
|
211
|
-
}
|
212
|
-
}
|
213
|
-
if ((upper === 0 || lower === 0) && whitespace === 0) {
|
214
|
-
return word.length <= 30;
|
215
|
-
}
|
216
|
-
else {
|
217
|
-
return upper <= 5;
|
218
|
-
}
|
219
|
-
}
|
220
|
-
/**
|
221
|
-
* Return matches treating "camelCase" words separately. For example the filter string "gp" would return two matches in string "Git Pull".
|
222
|
-
* @param word filter string
|
223
|
-
* @param wordToMatchAgainst string to test
|
224
|
-
* @internal
|
225
|
-
*/
|
226
|
-
function matchesCamelCase(word, camelCaseWord) {
|
227
|
-
if (!camelCaseWord) {
|
228
|
-
return null;
|
229
|
-
}
|
230
|
-
camelCaseWord = camelCaseWord.trim();
|
231
|
-
if (camelCaseWord.length === 0) {
|
232
|
-
return null;
|
233
|
-
}
|
234
|
-
if (!isCamelCasePattern(camelCaseWord)) {
|
235
|
-
return null;
|
236
|
-
}
|
237
|
-
if (camelCaseWord.length > 60) {
|
238
|
-
return null;
|
239
|
-
}
|
240
|
-
const analysis = analyzeCamelCaseWord(camelCaseWord);
|
241
|
-
if (!isCamelCaseWord(analysis)) {
|
242
|
-
// istanbul ignore next
|
243
|
-
if (!isUpperCaseWord(analysis)) {
|
244
|
-
return null;
|
245
|
-
}
|
246
|
-
camelCaseWord = camelCaseWord.toLowerCase();
|
247
|
-
}
|
248
|
-
let result = null;
|
249
|
-
let i = 0;
|
250
|
-
word = word.toLowerCase();
|
251
|
-
while (i < camelCaseWord.length && (result = _matchesCamelCase(word, camelCaseWord, 0, i)) === null) {
|
252
|
-
i = nextAnchor(camelCaseWord, i + 1);
|
253
|
-
}
|
254
|
-
return result;
|
255
|
-
}
|
256
|
-
exports.matchesCamelCase = matchesCamelCase;
|
257
|
-
/**
|
258
|
-
* Matches beginning of words supporting non-ASCII languages.
|
259
|
-
* @param word Filter string
|
260
|
-
* @param target String being searched
|
261
|
-
* @param contiguous - If true the filter string must be found "contiguous" in the searched string (E.g. "pul" will match "Git: Pull").
|
262
|
-
* Otherwise also matches sub string of the word with beginnings of the words in the target (e.g. "gp" or "g p" will match "Git: Pull").
|
263
|
-
* Useful in cases where the target is words (e.g. command labels)
|
264
|
-
* @internal
|
265
|
-
*/
|
266
|
-
function matchesWords(word, target, contiguous = false) {
|
267
|
-
if (!target || target.length === 0) {
|
268
|
-
return null;
|
269
|
-
}
|
270
|
-
let result = null;
|
271
|
-
let i = 0;
|
272
|
-
word = word.toLowerCase();
|
273
|
-
target = target.toLowerCase();
|
274
|
-
while (i < target.length && (result = _matchesWords(word, target, 0, i, contiguous)) === null) {
|
275
|
-
i = nextWord(target, i + 1);
|
276
|
-
}
|
277
|
-
return result;
|
278
|
-
}
|
279
|
-
exports.matchesWords = matchesWords;
|
280
|
-
function _matchesWords(word, target, i, j, contiguous) {
|
281
|
-
if (i === word.length) {
|
282
|
-
return [];
|
283
|
-
}
|
284
|
-
else if (j === target.length) {
|
285
|
-
return null;
|
286
|
-
}
|
287
|
-
else if (!charactersMatch(word.charCodeAt(i), target.charCodeAt(j))) {
|
288
|
-
return null;
|
289
|
-
}
|
290
|
-
else {
|
291
|
-
let result = null;
|
292
|
-
let nextWordIndex = j + 1;
|
293
|
-
result = _matchesWords(word, target, i + 1, j + 1, contiguous);
|
294
|
-
// istanbul ignore else
|
295
|
-
if (!contiguous) {
|
296
|
-
while (!result && (nextWordIndex = nextWord(target, nextWordIndex)) < target.length) {
|
297
|
-
result = _matchesWords(word, target, i + 1, nextWordIndex, contiguous);
|
298
|
-
nextWordIndex++;
|
299
|
-
}
|
300
|
-
}
|
301
|
-
return result === null ? null : join({ start: j, end: j + 1 }, result);
|
302
|
-
}
|
303
|
-
}
|
304
|
-
function nextWord(word, start) {
|
305
|
-
for (let i = start; i < word.length; i++) {
|
306
|
-
if (isWordSeparator(word.charCodeAt(i)) ||
|
307
|
-
(i > 0 && isWordSeparator(word.charCodeAt(i - 1)))) {
|
308
|
-
return i;
|
309
|
-
}
|
310
|
-
}
|
311
|
-
return word.length;
|
312
|
-
}
|
313
|
-
// Fuzzy
|
314
|
-
const fuzzyContiguousFilter = or(exports.matchesPrefix, matchesCamelCase, matchesContiguousSubString);
|
315
|
-
const fuzzySeparateFilter = or(exports.matchesPrefix, matchesCamelCase, matchesSubString);
|
316
|
-
const fuzzyRegExpCache = new map_1.LRUCache(10000); // bounded to 10000 elements
|
317
|
-
/**
|
318
|
-
* Match pattern against word in a fuzzy way. This will only return a single match.
|
319
|
-
* @internal
|
320
|
-
*/
|
321
|
-
function matchesFuzzy(word, wordToMatchAgainst, enableSeparateSubstringMatching = false) {
|
322
|
-
// istanbul ignore next
|
323
|
-
if (typeof word !== "string" || typeof wordToMatchAgainst !== "string") {
|
324
|
-
return null; // return early for invalid input
|
325
|
-
}
|
326
|
-
// Form RegExp for wildcard matches
|
327
|
-
let regexp = fuzzyRegExpCache.get(word);
|
328
|
-
if (!regexp) {
|
329
|
-
regexp = new RegExp(strings.convertSimple2RegExpPattern(word), "i");
|
330
|
-
fuzzyRegExpCache.set(word, regexp);
|
331
|
-
}
|
332
|
-
// RegExp Filter
|
333
|
-
const match = regexp.exec(wordToMatchAgainst);
|
334
|
-
if (match) {
|
335
|
-
return [{ start: match.index, end: match.index + match[0].length }];
|
336
|
-
}
|
337
|
-
// Default Filter
|
338
|
-
return enableSeparateSubstringMatching ? /* istanbul ignore next */ fuzzySeparateFilter(word, wordToMatchAgainst) : fuzzyContiguousFilter(word, wordToMatchAgainst);
|
339
|
-
}
|
340
|
-
exports.matchesFuzzy = matchesFuzzy;
|
341
|
-
/**
|
342
|
-
* Match pattern against word in a fuzzy way. As in IntelliSense and faster and more
|
343
|
-
* powerful than `matchesFuzzy`. This will only return a single match.
|
344
|
-
* @internal
|
345
|
-
*/
|
346
|
-
function matchesFuzzy2(pattern, word) {
|
347
|
-
const score = fuzzyScore(pattern, pattern.toLowerCase(), 0, word, word.toLowerCase(), 0, true);
|
348
|
-
return score ? createMatches(score) : null;
|
349
|
-
}
|
350
|
-
exports.matchesFuzzy2 = matchesFuzzy2;
|
351
|
-
// #region --- fuzzyScore ---
|
352
|
-
/**
|
353
|
-
* @internal
|
354
|
-
*/
|
355
|
-
function createMatches(score) {
|
356
|
-
// istanbul ignore next
|
357
|
-
if (typeof score === "undefined") {
|
358
|
-
return [];
|
359
|
-
}
|
360
|
-
const matches = score[1].toString(2);
|
361
|
-
const wordStart = score[2];
|
362
|
-
const res = [];
|
363
|
-
for (let pos = wordStart; pos < _maxLen; pos++) {
|
364
|
-
if (matches[matches.length - (pos + 1)] === "1") {
|
365
|
-
const last = res[res.length - 1];
|
366
|
-
if (last && last.end === pos) {
|
367
|
-
last.end = pos + 1;
|
368
|
-
}
|
369
|
-
else {
|
370
|
-
res.push({ start: pos, end: pos + 1 });
|
371
|
-
}
|
372
|
-
}
|
373
|
-
}
|
374
|
-
return res;
|
375
|
-
}
|
376
|
-
exports.createMatches = createMatches;
|
377
|
-
const _maxLen = 128;
|
378
|
-
function initTable() {
|
379
|
-
const table = [];
|
380
|
-
const row = [0];
|
381
|
-
for (let i = 1; i <= _maxLen; i++) {
|
382
|
-
row.push(-i);
|
383
|
-
}
|
384
|
-
for (let i = 0; i <= _maxLen; i++) {
|
385
|
-
const thisRow = row.slice(0);
|
386
|
-
thisRow[0] = -i;
|
387
|
-
table.push(thisRow);
|
388
|
-
}
|
389
|
-
return table;
|
390
|
-
}
|
391
|
-
const _table = initTable();
|
392
|
-
const _scores = initTable();
|
393
|
-
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
394
|
-
const _arrows = initTable();
|
395
|
-
const _debug = false;
|
396
|
-
function isSeparatorAtPos(value, index) {
|
397
|
-
if (index < 0 || index >= value.length) {
|
398
|
-
return false;
|
399
|
-
}
|
400
|
-
const code = value.charCodeAt(index);
|
401
|
-
switch (code) {
|
402
|
-
case 95 /* Underline */:
|
403
|
-
case 45 /* Dash */:
|
404
|
-
case 46 /* Period */:
|
405
|
-
case 32 /* Space */:
|
406
|
-
case 47 /* Slash */:
|
407
|
-
case 92 /* Backslash */:
|
408
|
-
case 39 /* SingleQuote */:
|
409
|
-
case 34 /* DoubleQuote */:
|
410
|
-
case 58 /* Colon */:
|
411
|
-
case 36 /* DollarSign */:
|
412
|
-
return true;
|
413
|
-
default:
|
414
|
-
return false;
|
415
|
-
}
|
416
|
-
}
|
417
|
-
function isWhitespaceAtPos(value, index) {
|
418
|
-
if (index < 0 || index >= value.length) {
|
419
|
-
return false;
|
420
|
-
}
|
421
|
-
const code = value.charCodeAt(index);
|
422
|
-
switch (code) {
|
423
|
-
// istanbul ignore next
|
424
|
-
case 32 /* Space */:
|
425
|
-
case 9 /* Tab */:
|
426
|
-
return true;
|
427
|
-
default:
|
428
|
-
return false;
|
429
|
-
}
|
430
|
-
}
|
431
|
-
function isUpperCaseAtPos(pos, word, wordLow) {
|
432
|
-
return word[pos] !== wordLow[pos];
|
433
|
-
}
|
434
|
-
/** @internal */
|
435
|
-
function isPatternInWord(patternLow, patternPos, patternLen, wordLow, wordPos, wordLen) {
|
436
|
-
while (patternPos < patternLen && wordPos < wordLen) {
|
437
|
-
if (patternLow[patternPos] === wordLow[wordPos]) {
|
438
|
-
patternPos += 1;
|
439
|
-
}
|
440
|
-
wordPos += 1;
|
441
|
-
}
|
442
|
-
return patternPos === patternLen; // pattern must be exhausted
|
443
|
-
}
|
444
|
-
exports.isPatternInWord = isPatternInWord;
|
445
|
-
/** @internal */
|
446
|
-
var FuzzyScore;
|
447
|
-
(function (FuzzyScore) {
|
448
|
-
/**
|
449
|
-
* No matches and value `-100`
|
450
|
-
* @internal
|
451
|
-
*/
|
452
|
-
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
453
|
-
FuzzyScore.Default = Object.freeze([-100, 0, 0]);
|
454
|
-
// istanbul ignore next
|
455
|
-
/** @internal */
|
456
|
-
function isDefault(score) {
|
457
|
-
return !score || (score[0] === -100 && score[1] === 0 && score[2] === 0);
|
458
|
-
}
|
459
|
-
FuzzyScore.isDefault = isDefault;
|
460
|
-
})(FuzzyScore = exports.FuzzyScore || (exports.FuzzyScore = {}));
|
461
|
-
/** @internal */
|
462
|
-
function fuzzyScore(pattern, patternLow, patternStart, word, wordLow, wordStart, firstMatchCanBeWeak) {
|
463
|
-
// istanbul ignore next
|
464
|
-
const patternLen = pattern.length > _maxLen ? _maxLen : pattern.length;
|
465
|
-
const wordLen = word.length > _maxLen ? _maxLen : word.length;
|
466
|
-
if (patternStart >= patternLen || wordStart >= wordLen || (patternLen - patternStart) > (wordLen - wordStart)) {
|
467
|
-
return undefined;
|
468
|
-
}
|
469
|
-
// Run a simple check if the characters of pattern occur
|
470
|
-
// (in order) at all in word. If that isn't the case we
|
471
|
-
// stop because no match will be possible
|
472
|
-
if (!isPatternInWord(patternLow, patternStart, patternLen, wordLow, wordStart, wordLen)) {
|
473
|
-
return undefined;
|
474
|
-
}
|
475
|
-
let row = 1;
|
476
|
-
let column = 1;
|
477
|
-
let patternPos = patternStart;
|
478
|
-
let wordPos = wordStart;
|
479
|
-
let hasStrongFirstMatch = false;
|
480
|
-
// There will be a match, fill in tables
|
481
|
-
for (row = 1, patternPos = patternStart; patternPos < patternLen; row++, patternPos++) {
|
482
|
-
for (column = 1, wordPos = wordStart; wordPos < wordLen; column++, wordPos++) {
|
483
|
-
const score = _doScore(pattern, patternLow, patternPos, patternStart, word, wordLow, wordPos);
|
484
|
-
if (patternPos === patternStart && score > 1) {
|
485
|
-
hasStrongFirstMatch = true;
|
486
|
-
}
|
487
|
-
_scores[row][column] = score;
|
488
|
-
const diag = _table[row - 1][column - 1] + (score > 1 ? 1 : score);
|
489
|
-
const top = _table[row - 1][column] + -1;
|
490
|
-
const left = _table[row][column - 1] + -1;
|
491
|
-
if (left >= top) {
|
492
|
-
// left or diag
|
493
|
-
if (left > diag) {
|
494
|
-
_table[row][column] = left;
|
495
|
-
_arrows[row][column] = 4 /* Left */;
|
496
|
-
}
|
497
|
-
else if (left === diag) {
|
498
|
-
_table[row][column] = left;
|
499
|
-
_arrows[row][column] = 4 /* Left */ | 2 /* Diag */;
|
500
|
-
}
|
501
|
-
else {
|
502
|
-
_table[row][column] = diag;
|
503
|
-
_arrows[row][column] = 2 /* Diag */;
|
504
|
-
}
|
505
|
-
}
|
506
|
-
else {
|
507
|
-
// top or diag
|
508
|
-
if (top > diag) {
|
509
|
-
_table[row][column] = top;
|
510
|
-
_arrows[row][column] = 1 /* Top */;
|
511
|
-
}
|
512
|
-
else if (top === diag) {
|
513
|
-
_table[row][column] = top;
|
514
|
-
_arrows[row][column] = 1 /* Top */ | 2 /* Diag */;
|
515
|
-
}
|
516
|
-
else {
|
517
|
-
_table[row][column] = diag;
|
518
|
-
_arrows[row][column] = 2 /* Diag */;
|
519
|
-
}
|
520
|
-
}
|
521
|
-
}
|
522
|
-
}
|
523
|
-
if (!hasStrongFirstMatch && !firstMatchCanBeWeak) {
|
524
|
-
return undefined;
|
525
|
-
}
|
526
|
-
_matchesCount = 0;
|
527
|
-
_topScore = -100;
|
528
|
-
_wordStart = wordStart;
|
529
|
-
_firstMatchCanBeWeak = firstMatchCanBeWeak;
|
530
|
-
_findAllMatches2(row - 1, column - 1, patternLen === wordLen ? 1 : 0, 0, false);
|
531
|
-
if (_matchesCount === 0) {
|
532
|
-
return undefined;
|
533
|
-
}
|
534
|
-
return [_topScore, _topMatch2, wordStart];
|
535
|
-
}
|
536
|
-
exports.fuzzyScore = fuzzyScore;
|
537
|
-
function _doScore(pattern, patternLow, patternPos, patternStart, word, wordLow, wordPos) {
|
538
|
-
if (patternLow[patternPos] !== wordLow[wordPos]) {
|
539
|
-
return -1;
|
540
|
-
}
|
541
|
-
if (wordPos === (patternPos - patternStart)) {
|
542
|
-
// common prefix: `foobar <-> foobaz`
|
543
|
-
// ^^^^^
|
544
|
-
if (pattern[patternPos] === word[wordPos]) {
|
545
|
-
return 7;
|
546
|
-
}
|
547
|
-
else {
|
548
|
-
return 5;
|
549
|
-
}
|
550
|
-
}
|
551
|
-
else if (isUpperCaseAtPos(wordPos, word, wordLow) && (wordPos === 0 || !isUpperCaseAtPos(wordPos - 1, word, wordLow))) {
|
552
|
-
// hitting upper-case: `foo <-> forOthers`
|
553
|
-
// ^^ ^
|
554
|
-
if (pattern[patternPos] === word[wordPos]) {
|
555
|
-
return 7;
|
556
|
-
}
|
557
|
-
else {
|
558
|
-
return 5;
|
559
|
-
}
|
560
|
-
}
|
561
|
-
else if (isSeparatorAtPos(wordLow, wordPos) && (wordPos === 0 || !isSeparatorAtPos(wordLow, wordPos - 1))) {
|
562
|
-
// hitting a separator: `. <-> foo.bar`
|
563
|
-
// ^
|
564
|
-
return 5;
|
565
|
-
}
|
566
|
-
else if (isSeparatorAtPos(wordLow, wordPos - 1) || isWhitespaceAtPos(wordLow, wordPos - 1)) {
|
567
|
-
// post separator: `foo <-> bar_foo`
|
568
|
-
// ^^^
|
569
|
-
return 5;
|
570
|
-
}
|
571
|
-
else {
|
572
|
-
return 1;
|
573
|
-
}
|
574
|
-
}
|
575
|
-
let _matchesCount = 0;
|
576
|
-
let _topMatch2 = 0;
|
577
|
-
let _topScore = 0;
|
578
|
-
let _wordStart = 0;
|
579
|
-
let _firstMatchCanBeWeak = false;
|
580
|
-
function _findAllMatches2(row, column, total, matches, lastMatched) {
|
581
|
-
if (_matchesCount >= 10 || total < -25) {
|
582
|
-
// stop when having already 10 results, or
|
583
|
-
// when a potential alignment as already 5 gaps
|
584
|
-
return;
|
585
|
-
}
|
586
|
-
let simpleMatchCount = 0;
|
587
|
-
while (row > 0 && column > 0) {
|
588
|
-
const score = _scores[row][column];
|
589
|
-
const arrow = _arrows[row][column];
|
590
|
-
if (arrow === 4 /* Left */) {
|
591
|
-
// left -> no match, skip a word character
|
592
|
-
column -= 1;
|
593
|
-
if (lastMatched) {
|
594
|
-
total -= 5; // new gap penalty
|
595
|
-
}
|
596
|
-
else if (matches !== 0) {
|
597
|
-
total -= 1; // gap penalty after first match
|
598
|
-
}
|
599
|
-
lastMatched = false;
|
600
|
-
simpleMatchCount = 0;
|
601
|
-
}
|
602
|
-
else {
|
603
|
-
/* istanbul ignore else */
|
604
|
-
if (arrow & 2 /* Diag */) {
|
605
|
-
if (arrow & 4 /* Left */) {
|
606
|
-
// left
|
607
|
-
_findAllMatches2(row, column - 1, matches !== 0 ? total - 1 : total, // gap penalty after first match
|
608
|
-
matches, lastMatched);
|
609
|
-
}
|
610
|
-
// diag
|
611
|
-
total += score;
|
612
|
-
row -= 1;
|
613
|
-
column -= 1;
|
614
|
-
lastMatched = true;
|
615
|
-
// match -> set a 1 at the word pos
|
616
|
-
matches += 2 ** (column + _wordStart);
|
617
|
-
// count simple matches and boost a row of
|
618
|
-
// simple matches when they yield in a
|
619
|
-
// strong match.
|
620
|
-
if (score === 1) {
|
621
|
-
simpleMatchCount += 1;
|
622
|
-
if (row === 0 && !_firstMatchCanBeWeak) {
|
623
|
-
// when the first match is a weak
|
624
|
-
// match we discard it
|
625
|
-
return undefined;
|
626
|
-
}
|
627
|
-
}
|
628
|
-
else {
|
629
|
-
// boost
|
630
|
-
total += 1 + (simpleMatchCount * (score - 1));
|
631
|
-
simpleMatchCount = 0;
|
632
|
-
}
|
633
|
-
}
|
634
|
-
else {
|
635
|
-
// istanbul ignore next
|
636
|
-
return undefined;
|
637
|
-
}
|
638
|
-
}
|
639
|
-
}
|
640
|
-
total -= column >= 3 ? 9 : column * 3; // late start penalty
|
641
|
-
// dynamically keep track of the current top score
|
642
|
-
// and insert the current best score at head, the rest at tail
|
643
|
-
_matchesCount += 1;
|
644
|
-
if (total > _topScore) {
|
645
|
-
_topScore = total;
|
646
|
-
_topMatch2 = matches;
|
647
|
-
}
|
648
|
-
}
|
649
|
-
// #endregion
|
650
|
-
// #region --- graceful ---
|
651
|
-
/** @internal */
|
652
|
-
function fuzzyScoreGracefulAggressive(pattern, lowPattern, patternPos, word, lowWord, wordPos, firstMatchCanBeWeak) {
|
653
|
-
return fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, true, firstMatchCanBeWeak);
|
654
|
-
}
|
655
|
-
exports.fuzzyScoreGracefulAggressive = fuzzyScoreGracefulAggressive;
|
656
|
-
/** @internal */
|
657
|
-
function fuzzyScoreGraceful(pattern, lowPattern, patternPos, word, lowWord, wordPos, firstMatchCanBeWeak) {
|
658
|
-
return fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, false, firstMatchCanBeWeak);
|
659
|
-
}
|
660
|
-
exports.fuzzyScoreGraceful = fuzzyScoreGraceful;
|
661
|
-
function fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, aggressive, firstMatchCanBeWeak) {
|
662
|
-
let top = fuzzyScore(pattern, lowPattern, patternPos, word, lowWord, wordPos, firstMatchCanBeWeak);
|
663
|
-
if (top && !aggressive) {
|
664
|
-
// when using the original pattern yield a result we`
|
665
|
-
// return it unless we are aggressive and try to find
|
666
|
-
// a better alignment, e.g. `cno` -> `^co^ns^ole` or `^c^o^nsole`.
|
667
|
-
return top;
|
668
|
-
}
|
669
|
-
// istanbul ignore else
|
670
|
-
if (pattern.length >= 3) {
|
671
|
-
// When the pattern is long enough then try a few (max 7)
|
672
|
-
// permutations of the pattern to find a better match. The
|
673
|
-
// permutations only swap neighbouring characters, e.g
|
674
|
-
// `cnoso` becomes `conso`, `cnsoo`, `cnoos`.
|
675
|
-
const tries = Math.min(7, pattern.length - 1);
|
676
|
-
for (let movingPatternPos = patternPos + 1; movingPatternPos < tries; movingPatternPos++) {
|
677
|
-
const newPattern = nextTypoPermutation(pattern, movingPatternPos);
|
678
|
-
// istanbul ignore else
|
679
|
-
if (newPattern) {
|
680
|
-
const candidate = fuzzyScore(newPattern, newPattern.toLowerCase(), patternPos, word, lowWord, wordPos, firstMatchCanBeWeak);
|
681
|
-
if (candidate) {
|
682
|
-
candidate[0] -= 3; // permutation penalty
|
683
|
-
// istanbul ignore else
|
684
|
-
if (!top || candidate[0] > top[0]) {
|
685
|
-
top = candidate;
|
686
|
-
}
|
687
|
-
}
|
688
|
-
}
|
689
|
-
}
|
690
|
-
}
|
691
|
-
return top;
|
692
|
-
}
|
693
|
-
function nextTypoPermutation(pattern, patternPos) {
|
694
|
-
// istanbul ignore next
|
695
|
-
if (patternPos + 1 >= pattern.length) {
|
696
|
-
return undefined;
|
697
|
-
}
|
698
|
-
const swap1 = pattern[patternPos];
|
699
|
-
const swap2 = pattern[patternPos + 1];
|
700
|
-
// istanbul ignore next
|
701
|
-
if (swap1 === swap2) {
|
702
|
-
return undefined;
|
703
|
-
}
|
704
|
-
return pattern.slice(0, patternPos)
|
705
|
-
+ swap2
|
706
|
-
+ swap1
|
707
|
-
+ pattern.slice(patternPos + 2);
|
708
|
-
}
|
709
|
-
// #endregion
|
1
|
+
"use strict";
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
3
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
4
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
5
|
+
*--------------------------------------------------------------------------------------------*/
|
6
|
+
/** @packageDocumentation
|
7
|
+
* @module Utilities
|
8
|
+
*/
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
10
|
+
exports.fuzzyScoreGraceful = exports.fuzzyScoreGracefulAggressive = exports.fuzzyScore = exports.FuzzyScore = exports.isPatternInWord = exports.createMatches = exports.matchesFuzzy2 = exports.matchesFuzzy = exports.matchesWords = exports.matchesCamelCase = exports.matchesSubString = exports.matchesContiguousSubString = exports.matchesPrefix = exports.matchesStrictPrefix = exports.or = void 0;
|
11
|
+
const map_1 = require("./map");
|
12
|
+
const strings = require("./strings");
|
13
|
+
// Combined filters
|
14
|
+
/**
|
15
|
+
* @returns A filter which combines the provided set
|
16
|
+
* of filters with an or. The *first* filters that
|
17
|
+
* matches defined the return value of the returned
|
18
|
+
* filter.
|
19
|
+
* @internal
|
20
|
+
*/
|
21
|
+
function or(...filter) {
|
22
|
+
return function (word, wordToMatchAgainst) {
|
23
|
+
for (let i = 0, len = filter.length; i < len; i++) {
|
24
|
+
const match = filter[i](word, wordToMatchAgainst);
|
25
|
+
if (match) {
|
26
|
+
return match;
|
27
|
+
}
|
28
|
+
}
|
29
|
+
return null;
|
30
|
+
};
|
31
|
+
}
|
32
|
+
exports.or = or;
|
33
|
+
// Prefix
|
34
|
+
/** @internal */
|
35
|
+
exports.matchesStrictPrefix = _matchesPrefix.bind(undefined, false);
|
36
|
+
/** @internal */
|
37
|
+
exports.matchesPrefix = _matchesPrefix.bind(undefined, true);
|
38
|
+
function _matchesPrefix(ignoreCase, word, wordToMatchAgainst) {
|
39
|
+
if (!wordToMatchAgainst || wordToMatchAgainst.length < word.length) {
|
40
|
+
return null;
|
41
|
+
}
|
42
|
+
let matches;
|
43
|
+
if (ignoreCase) {
|
44
|
+
matches = strings.startsWithIgnoreCase(wordToMatchAgainst, word);
|
45
|
+
}
|
46
|
+
else {
|
47
|
+
matches = wordToMatchAgainst.indexOf(word) === 0;
|
48
|
+
}
|
49
|
+
if (!matches) {
|
50
|
+
return null;
|
51
|
+
}
|
52
|
+
return word.length > 0 ? [{ start: 0, end: word.length }] : [];
|
53
|
+
}
|
54
|
+
// Contiguous Substring
|
55
|
+
/** @internal */
|
56
|
+
function matchesContiguousSubString(word, wordToMatchAgainst) {
|
57
|
+
const index = wordToMatchAgainst.toLowerCase().indexOf(word.toLowerCase());
|
58
|
+
if (index === -1) {
|
59
|
+
return null;
|
60
|
+
}
|
61
|
+
return [{ start: index, end: index + word.length }];
|
62
|
+
}
|
63
|
+
exports.matchesContiguousSubString = matchesContiguousSubString;
|
64
|
+
// Substring
|
65
|
+
/**
|
66
|
+
* Return case insensitive substring matches
|
67
|
+
* @param word filter string
|
68
|
+
* @param wordToMatchAgainst string to test
|
69
|
+
* @internal
|
70
|
+
*/
|
71
|
+
function matchesSubString(word, wordToMatchAgainst) {
|
72
|
+
return _matchesSubString(word.toLowerCase(), wordToMatchAgainst.toLowerCase(), 0, 0);
|
73
|
+
}
|
74
|
+
exports.matchesSubString = matchesSubString;
|
75
|
+
function _matchesSubString(word, wordToMatchAgainst, i, j) {
|
76
|
+
if (i === word.length) {
|
77
|
+
return [];
|
78
|
+
}
|
79
|
+
else if (j === wordToMatchAgainst.length) {
|
80
|
+
return null;
|
81
|
+
}
|
82
|
+
else {
|
83
|
+
if (word[i] === wordToMatchAgainst[j]) {
|
84
|
+
let result = null;
|
85
|
+
if (result = _matchesSubString(word, wordToMatchAgainst, i + 1, j + 1)) {
|
86
|
+
return join({ start: j, end: j + 1 }, result);
|
87
|
+
}
|
88
|
+
return null;
|
89
|
+
}
|
90
|
+
return _matchesSubString(word, wordToMatchAgainst, i, j + 1);
|
91
|
+
}
|
92
|
+
}
|
93
|
+
// CamelCase
|
94
|
+
function isLower(code) {
|
95
|
+
return 97 /* a */ <= code && code <= 122 /* z */;
|
96
|
+
}
|
97
|
+
function isUpper(code) {
|
98
|
+
return 65 /* A */ <= code && code <= 90 /* Z */;
|
99
|
+
}
|
100
|
+
function isNumber(code) {
|
101
|
+
return 48 /* Digit0 */ <= code && code <= 57 /* Digit9 */;
|
102
|
+
}
|
103
|
+
function isWhitespace(code) {
|
104
|
+
return (code === 32 /* Space */
|
105
|
+
|| code === 9 /* Tab */
|
106
|
+
|| code === 10 /* LineFeed */
|
107
|
+
|| code === 13 /* CarriageReturn */);
|
108
|
+
}
|
109
|
+
const wordSeparators = new Set();
|
110
|
+
'`~!@#$%^&*()-=+[{]}\\|;:\'",.<>/?'
|
111
|
+
.split("")
|
112
|
+
.forEach((s) => wordSeparators.add(s.charCodeAt(0)));
|
113
|
+
function isWordSeparator(code) {
|
114
|
+
return isWhitespace(code) || wordSeparators.has(code);
|
115
|
+
}
|
116
|
+
function charactersMatch(codeA, codeB) {
|
117
|
+
return (codeA === codeB) || (isWordSeparator(codeA) && isWordSeparator(codeB));
|
118
|
+
}
|
119
|
+
function isAlphanumeric(code) {
|
120
|
+
return isLower(code) || isUpper(code) || isNumber(code);
|
121
|
+
}
|
122
|
+
function join(head, tail) {
|
123
|
+
if (tail.length === 0) {
|
124
|
+
tail = [head];
|
125
|
+
}
|
126
|
+
else if (head.end === tail[0].start) {
|
127
|
+
tail[0].start = head.start;
|
128
|
+
}
|
129
|
+
else {
|
130
|
+
tail.unshift(head);
|
131
|
+
}
|
132
|
+
return tail;
|
133
|
+
}
|
134
|
+
function nextAnchor(camelCaseWord, start) {
|
135
|
+
for (let i = start; i < camelCaseWord.length; i++) {
|
136
|
+
const c = camelCaseWord.charCodeAt(i);
|
137
|
+
if (isUpper(c) || isNumber(c) || (i > 0 && !isAlphanumeric(camelCaseWord.charCodeAt(i - 1)))) {
|
138
|
+
return i;
|
139
|
+
}
|
140
|
+
}
|
141
|
+
return camelCaseWord.length;
|
142
|
+
}
|
143
|
+
function _matchesCamelCase(word, camelCaseWord, i, j) {
|
144
|
+
if (i === word.length) {
|
145
|
+
return [];
|
146
|
+
}
|
147
|
+
else if (j === camelCaseWord.length) {
|
148
|
+
return null;
|
149
|
+
}
|
150
|
+
else if (word[i] !== camelCaseWord[j].toLowerCase()) {
|
151
|
+
return null;
|
152
|
+
}
|
153
|
+
else {
|
154
|
+
let result = null;
|
155
|
+
let nextUpperIndex = j + 1;
|
156
|
+
result = _matchesCamelCase(word, camelCaseWord, i + 1, j + 1);
|
157
|
+
while (!result && (nextUpperIndex = nextAnchor(camelCaseWord, nextUpperIndex)) < camelCaseWord.length) {
|
158
|
+
result = _matchesCamelCase(word, camelCaseWord, i + 1, nextUpperIndex);
|
159
|
+
nextUpperIndex++;
|
160
|
+
}
|
161
|
+
return result === null ? null : join({ start: j, end: j + 1 }, result);
|
162
|
+
}
|
163
|
+
}
|
164
|
+
// Heuristic to avoid computing camel case matcher for words that don't
|
165
|
+
// look like camelCaseWords.
|
166
|
+
function analyzeCamelCaseWord(word) {
|
167
|
+
let upper = 0, lower = 0, alpha = 0, numeric = 0, code = 0;
|
168
|
+
for (let i = 0; i < word.length; i++) {
|
169
|
+
code = word.charCodeAt(i);
|
170
|
+
if (isUpper(code)) {
|
171
|
+
upper++;
|
172
|
+
}
|
173
|
+
if (isLower(code)) {
|
174
|
+
lower++;
|
175
|
+
}
|
176
|
+
if (isAlphanumeric(code)) {
|
177
|
+
alpha++;
|
178
|
+
}
|
179
|
+
if (isNumber(code)) {
|
180
|
+
numeric++;
|
181
|
+
}
|
182
|
+
}
|
183
|
+
const upperPercent = upper / word.length;
|
184
|
+
const lowerPercent = lower / word.length;
|
185
|
+
const alphaPercent = alpha / word.length;
|
186
|
+
const numericPercent = numeric / word.length;
|
187
|
+
return { upperPercent, lowerPercent, alphaPercent, numericPercent };
|
188
|
+
}
|
189
|
+
function isUpperCaseWord(analysis) {
|
190
|
+
const { upperPercent, lowerPercent } = analysis;
|
191
|
+
return lowerPercent === 0 && upperPercent > 0.6;
|
192
|
+
}
|
193
|
+
function isCamelCaseWord(analysis) {
|
194
|
+
const { upperPercent, lowerPercent, alphaPercent, numericPercent } = analysis;
|
195
|
+
return lowerPercent > 0.2 && upperPercent < 0.8 && alphaPercent > 0.6 && numericPercent < 0.2;
|
196
|
+
}
|
197
|
+
// Heuristic to avoid computing camel case matcher for words that don't
|
198
|
+
// look like camel case patterns.
|
199
|
+
function isCamelCasePattern(word) {
|
200
|
+
let upper = 0, lower = 0, code = 0, whitespace = 0;
|
201
|
+
for (let i = 0; i < word.length; i++) {
|
202
|
+
code = word.charCodeAt(i);
|
203
|
+
if (isUpper(code)) {
|
204
|
+
upper++;
|
205
|
+
}
|
206
|
+
if (isLower(code)) {
|
207
|
+
lower++;
|
208
|
+
}
|
209
|
+
if (isWhitespace(code)) {
|
210
|
+
whitespace++;
|
211
|
+
}
|
212
|
+
}
|
213
|
+
if ((upper === 0 || lower === 0) && whitespace === 0) {
|
214
|
+
return word.length <= 30;
|
215
|
+
}
|
216
|
+
else {
|
217
|
+
return upper <= 5;
|
218
|
+
}
|
219
|
+
}
|
220
|
+
/**
|
221
|
+
* Return matches treating "camelCase" words separately. For example the filter string "gp" would return two matches in string "Git Pull".
|
222
|
+
* @param word filter string
|
223
|
+
* @param wordToMatchAgainst string to test
|
224
|
+
* @internal
|
225
|
+
*/
|
226
|
+
function matchesCamelCase(word, camelCaseWord) {
|
227
|
+
if (!camelCaseWord) {
|
228
|
+
return null;
|
229
|
+
}
|
230
|
+
camelCaseWord = camelCaseWord.trim();
|
231
|
+
if (camelCaseWord.length === 0) {
|
232
|
+
return null;
|
233
|
+
}
|
234
|
+
if (!isCamelCasePattern(camelCaseWord)) {
|
235
|
+
return null;
|
236
|
+
}
|
237
|
+
if (camelCaseWord.length > 60) {
|
238
|
+
return null;
|
239
|
+
}
|
240
|
+
const analysis = analyzeCamelCaseWord(camelCaseWord);
|
241
|
+
if (!isCamelCaseWord(analysis)) {
|
242
|
+
// istanbul ignore next
|
243
|
+
if (!isUpperCaseWord(analysis)) {
|
244
|
+
return null;
|
245
|
+
}
|
246
|
+
camelCaseWord = camelCaseWord.toLowerCase();
|
247
|
+
}
|
248
|
+
let result = null;
|
249
|
+
let i = 0;
|
250
|
+
word = word.toLowerCase();
|
251
|
+
while (i < camelCaseWord.length && (result = _matchesCamelCase(word, camelCaseWord, 0, i)) === null) {
|
252
|
+
i = nextAnchor(camelCaseWord, i + 1);
|
253
|
+
}
|
254
|
+
return result;
|
255
|
+
}
|
256
|
+
exports.matchesCamelCase = matchesCamelCase;
|
257
|
+
/**
|
258
|
+
* Matches beginning of words supporting non-ASCII languages.
|
259
|
+
* @param word Filter string
|
260
|
+
* @param target String being searched
|
261
|
+
* @param contiguous - If true the filter string must be found "contiguous" in the searched string (E.g. "pul" will match "Git: Pull").
|
262
|
+
* Otherwise also matches sub string of the word with beginnings of the words in the target (e.g. "gp" or "g p" will match "Git: Pull").
|
263
|
+
* Useful in cases where the target is words (e.g. command labels)
|
264
|
+
* @internal
|
265
|
+
*/
|
266
|
+
function matchesWords(word, target, contiguous = false) {
|
267
|
+
if (!target || target.length === 0) {
|
268
|
+
return null;
|
269
|
+
}
|
270
|
+
let result = null;
|
271
|
+
let i = 0;
|
272
|
+
word = word.toLowerCase();
|
273
|
+
target = target.toLowerCase();
|
274
|
+
while (i < target.length && (result = _matchesWords(word, target, 0, i, contiguous)) === null) {
|
275
|
+
i = nextWord(target, i + 1);
|
276
|
+
}
|
277
|
+
return result;
|
278
|
+
}
|
279
|
+
exports.matchesWords = matchesWords;
|
280
|
+
function _matchesWords(word, target, i, j, contiguous) {
|
281
|
+
if (i === word.length) {
|
282
|
+
return [];
|
283
|
+
}
|
284
|
+
else if (j === target.length) {
|
285
|
+
return null;
|
286
|
+
}
|
287
|
+
else if (!charactersMatch(word.charCodeAt(i), target.charCodeAt(j))) {
|
288
|
+
return null;
|
289
|
+
}
|
290
|
+
else {
|
291
|
+
let result = null;
|
292
|
+
let nextWordIndex = j + 1;
|
293
|
+
result = _matchesWords(word, target, i + 1, j + 1, contiguous);
|
294
|
+
// istanbul ignore else
|
295
|
+
if (!contiguous) {
|
296
|
+
while (!result && (nextWordIndex = nextWord(target, nextWordIndex)) < target.length) {
|
297
|
+
result = _matchesWords(word, target, i + 1, nextWordIndex, contiguous);
|
298
|
+
nextWordIndex++;
|
299
|
+
}
|
300
|
+
}
|
301
|
+
return result === null ? null : join({ start: j, end: j + 1 }, result);
|
302
|
+
}
|
303
|
+
}
|
304
|
+
function nextWord(word, start) {
|
305
|
+
for (let i = start; i < word.length; i++) {
|
306
|
+
if (isWordSeparator(word.charCodeAt(i)) ||
|
307
|
+
(i > 0 && isWordSeparator(word.charCodeAt(i - 1)))) {
|
308
|
+
return i;
|
309
|
+
}
|
310
|
+
}
|
311
|
+
return word.length;
|
312
|
+
}
|
313
|
+
// Fuzzy
|
314
|
+
const fuzzyContiguousFilter = or(exports.matchesPrefix, matchesCamelCase, matchesContiguousSubString);
|
315
|
+
const fuzzySeparateFilter = or(exports.matchesPrefix, matchesCamelCase, matchesSubString);
|
316
|
+
const fuzzyRegExpCache = new map_1.LRUCache(10000); // bounded to 10000 elements
|
317
|
+
/**
|
318
|
+
* Match pattern against word in a fuzzy way. This will only return a single match.
|
319
|
+
* @internal
|
320
|
+
*/
|
321
|
+
function matchesFuzzy(word, wordToMatchAgainst, enableSeparateSubstringMatching = false) {
|
322
|
+
// istanbul ignore next
|
323
|
+
if (typeof word !== "string" || typeof wordToMatchAgainst !== "string") {
|
324
|
+
return null; // return early for invalid input
|
325
|
+
}
|
326
|
+
// Form RegExp for wildcard matches
|
327
|
+
let regexp = fuzzyRegExpCache.get(word);
|
328
|
+
if (!regexp) {
|
329
|
+
regexp = new RegExp(strings.convertSimple2RegExpPattern(word), "i");
|
330
|
+
fuzzyRegExpCache.set(word, regexp);
|
331
|
+
}
|
332
|
+
// RegExp Filter
|
333
|
+
const match = regexp.exec(wordToMatchAgainst);
|
334
|
+
if (match) {
|
335
|
+
return [{ start: match.index, end: match.index + match[0].length }];
|
336
|
+
}
|
337
|
+
// Default Filter
|
338
|
+
return enableSeparateSubstringMatching ? /* istanbul ignore next */ fuzzySeparateFilter(word, wordToMatchAgainst) : fuzzyContiguousFilter(word, wordToMatchAgainst);
|
339
|
+
}
|
340
|
+
exports.matchesFuzzy = matchesFuzzy;
|
341
|
+
/**
|
342
|
+
* Match pattern against word in a fuzzy way. As in IntelliSense and faster and more
|
343
|
+
* powerful than `matchesFuzzy`. This will only return a single match.
|
344
|
+
* @internal
|
345
|
+
*/
|
346
|
+
function matchesFuzzy2(pattern, word) {
|
347
|
+
const score = fuzzyScore(pattern, pattern.toLowerCase(), 0, word, word.toLowerCase(), 0, true);
|
348
|
+
return score ? createMatches(score) : null;
|
349
|
+
}
|
350
|
+
exports.matchesFuzzy2 = matchesFuzzy2;
|
351
|
+
// #region --- fuzzyScore ---
|
352
|
+
/**
|
353
|
+
* @internal
|
354
|
+
*/
|
355
|
+
function createMatches(score) {
|
356
|
+
// istanbul ignore next
|
357
|
+
if (typeof score === "undefined") {
|
358
|
+
return [];
|
359
|
+
}
|
360
|
+
const matches = score[1].toString(2);
|
361
|
+
const wordStart = score[2];
|
362
|
+
const res = [];
|
363
|
+
for (let pos = wordStart; pos < _maxLen; pos++) {
|
364
|
+
if (matches[matches.length - (pos + 1)] === "1") {
|
365
|
+
const last = res[res.length - 1];
|
366
|
+
if (last && last.end === pos) {
|
367
|
+
last.end = pos + 1;
|
368
|
+
}
|
369
|
+
else {
|
370
|
+
res.push({ start: pos, end: pos + 1 });
|
371
|
+
}
|
372
|
+
}
|
373
|
+
}
|
374
|
+
return res;
|
375
|
+
}
|
376
|
+
exports.createMatches = createMatches;
|
377
|
+
const _maxLen = 128;
|
378
|
+
function initTable() {
|
379
|
+
const table = [];
|
380
|
+
const row = [0];
|
381
|
+
for (let i = 1; i <= _maxLen; i++) {
|
382
|
+
row.push(-i);
|
383
|
+
}
|
384
|
+
for (let i = 0; i <= _maxLen; i++) {
|
385
|
+
const thisRow = row.slice(0);
|
386
|
+
thisRow[0] = -i;
|
387
|
+
table.push(thisRow);
|
388
|
+
}
|
389
|
+
return table;
|
390
|
+
}
|
391
|
+
const _table = initTable();
|
392
|
+
const _scores = initTable();
|
393
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
394
|
+
const _arrows = initTable();
|
395
|
+
const _debug = false;
|
396
|
+
function isSeparatorAtPos(value, index) {
|
397
|
+
if (index < 0 || index >= value.length) {
|
398
|
+
return false;
|
399
|
+
}
|
400
|
+
const code = value.charCodeAt(index);
|
401
|
+
switch (code) {
|
402
|
+
case 95 /* Underline */:
|
403
|
+
case 45 /* Dash */:
|
404
|
+
case 46 /* Period */:
|
405
|
+
case 32 /* Space */:
|
406
|
+
case 47 /* Slash */:
|
407
|
+
case 92 /* Backslash */:
|
408
|
+
case 39 /* SingleQuote */:
|
409
|
+
case 34 /* DoubleQuote */:
|
410
|
+
case 58 /* Colon */:
|
411
|
+
case 36 /* DollarSign */:
|
412
|
+
return true;
|
413
|
+
default:
|
414
|
+
return false;
|
415
|
+
}
|
416
|
+
}
|
417
|
+
function isWhitespaceAtPos(value, index) {
|
418
|
+
if (index < 0 || index >= value.length) {
|
419
|
+
return false;
|
420
|
+
}
|
421
|
+
const code = value.charCodeAt(index);
|
422
|
+
switch (code) {
|
423
|
+
// istanbul ignore next
|
424
|
+
case 32 /* Space */:
|
425
|
+
case 9 /* Tab */:
|
426
|
+
return true;
|
427
|
+
default:
|
428
|
+
return false;
|
429
|
+
}
|
430
|
+
}
|
431
|
+
function isUpperCaseAtPos(pos, word, wordLow) {
|
432
|
+
return word[pos] !== wordLow[pos];
|
433
|
+
}
|
434
|
+
/** @internal */
|
435
|
+
function isPatternInWord(patternLow, patternPos, patternLen, wordLow, wordPos, wordLen) {
|
436
|
+
while (patternPos < patternLen && wordPos < wordLen) {
|
437
|
+
if (patternLow[patternPos] === wordLow[wordPos]) {
|
438
|
+
patternPos += 1;
|
439
|
+
}
|
440
|
+
wordPos += 1;
|
441
|
+
}
|
442
|
+
return patternPos === patternLen; // pattern must be exhausted
|
443
|
+
}
|
444
|
+
exports.isPatternInWord = isPatternInWord;
|
445
|
+
/** @internal */
|
446
|
+
var FuzzyScore;
|
447
|
+
(function (FuzzyScore) {
|
448
|
+
/**
|
449
|
+
* No matches and value `-100`
|
450
|
+
* @internal
|
451
|
+
*/
|
452
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-assertions
|
453
|
+
FuzzyScore.Default = Object.freeze([-100, 0, 0]);
|
454
|
+
// istanbul ignore next
|
455
|
+
/** @internal */
|
456
|
+
function isDefault(score) {
|
457
|
+
return !score || (score[0] === -100 && score[1] === 0 && score[2] === 0);
|
458
|
+
}
|
459
|
+
FuzzyScore.isDefault = isDefault;
|
460
|
+
})(FuzzyScore = exports.FuzzyScore || (exports.FuzzyScore = {}));
|
461
|
+
/** @internal */
|
462
|
+
function fuzzyScore(pattern, patternLow, patternStart, word, wordLow, wordStart, firstMatchCanBeWeak) {
|
463
|
+
// istanbul ignore next
|
464
|
+
const patternLen = pattern.length > _maxLen ? _maxLen : pattern.length;
|
465
|
+
const wordLen = word.length > _maxLen ? _maxLen : word.length;
|
466
|
+
if (patternStart >= patternLen || wordStart >= wordLen || (patternLen - patternStart) > (wordLen - wordStart)) {
|
467
|
+
return undefined;
|
468
|
+
}
|
469
|
+
// Run a simple check if the characters of pattern occur
|
470
|
+
// (in order) at all in word. If that isn't the case we
|
471
|
+
// stop because no match will be possible
|
472
|
+
if (!isPatternInWord(patternLow, patternStart, patternLen, wordLow, wordStart, wordLen)) {
|
473
|
+
return undefined;
|
474
|
+
}
|
475
|
+
let row = 1;
|
476
|
+
let column = 1;
|
477
|
+
let patternPos = patternStart;
|
478
|
+
let wordPos = wordStart;
|
479
|
+
let hasStrongFirstMatch = false;
|
480
|
+
// There will be a match, fill in tables
|
481
|
+
for (row = 1, patternPos = patternStart; patternPos < patternLen; row++, patternPos++) {
|
482
|
+
for (column = 1, wordPos = wordStart; wordPos < wordLen; column++, wordPos++) {
|
483
|
+
const score = _doScore(pattern, patternLow, patternPos, patternStart, word, wordLow, wordPos);
|
484
|
+
if (patternPos === patternStart && score > 1) {
|
485
|
+
hasStrongFirstMatch = true;
|
486
|
+
}
|
487
|
+
_scores[row][column] = score;
|
488
|
+
const diag = _table[row - 1][column - 1] + (score > 1 ? 1 : score);
|
489
|
+
const top = _table[row - 1][column] + -1;
|
490
|
+
const left = _table[row][column - 1] + -1;
|
491
|
+
if (left >= top) {
|
492
|
+
// left or diag
|
493
|
+
if (left > diag) {
|
494
|
+
_table[row][column] = left;
|
495
|
+
_arrows[row][column] = 4 /* Left */;
|
496
|
+
}
|
497
|
+
else if (left === diag) {
|
498
|
+
_table[row][column] = left;
|
499
|
+
_arrows[row][column] = 4 /* Left */ | 2 /* Diag */;
|
500
|
+
}
|
501
|
+
else {
|
502
|
+
_table[row][column] = diag;
|
503
|
+
_arrows[row][column] = 2 /* Diag */;
|
504
|
+
}
|
505
|
+
}
|
506
|
+
else {
|
507
|
+
// top or diag
|
508
|
+
if (top > diag) {
|
509
|
+
_table[row][column] = top;
|
510
|
+
_arrows[row][column] = 1 /* Top */;
|
511
|
+
}
|
512
|
+
else if (top === diag) {
|
513
|
+
_table[row][column] = top;
|
514
|
+
_arrows[row][column] = 1 /* Top */ | 2 /* Diag */;
|
515
|
+
}
|
516
|
+
else {
|
517
|
+
_table[row][column] = diag;
|
518
|
+
_arrows[row][column] = 2 /* Diag */;
|
519
|
+
}
|
520
|
+
}
|
521
|
+
}
|
522
|
+
}
|
523
|
+
if (!hasStrongFirstMatch && !firstMatchCanBeWeak) {
|
524
|
+
return undefined;
|
525
|
+
}
|
526
|
+
_matchesCount = 0;
|
527
|
+
_topScore = -100;
|
528
|
+
_wordStart = wordStart;
|
529
|
+
_firstMatchCanBeWeak = firstMatchCanBeWeak;
|
530
|
+
_findAllMatches2(row - 1, column - 1, patternLen === wordLen ? 1 : 0, 0, false);
|
531
|
+
if (_matchesCount === 0) {
|
532
|
+
return undefined;
|
533
|
+
}
|
534
|
+
return [_topScore, _topMatch2, wordStart];
|
535
|
+
}
|
536
|
+
exports.fuzzyScore = fuzzyScore;
|
537
|
+
function _doScore(pattern, patternLow, patternPos, patternStart, word, wordLow, wordPos) {
|
538
|
+
if (patternLow[patternPos] !== wordLow[wordPos]) {
|
539
|
+
return -1;
|
540
|
+
}
|
541
|
+
if (wordPos === (patternPos - patternStart)) {
|
542
|
+
// common prefix: `foobar <-> foobaz`
|
543
|
+
// ^^^^^
|
544
|
+
if (pattern[patternPos] === word[wordPos]) {
|
545
|
+
return 7;
|
546
|
+
}
|
547
|
+
else {
|
548
|
+
return 5;
|
549
|
+
}
|
550
|
+
}
|
551
|
+
else if (isUpperCaseAtPos(wordPos, word, wordLow) && (wordPos === 0 || !isUpperCaseAtPos(wordPos - 1, word, wordLow))) {
|
552
|
+
// hitting upper-case: `foo <-> forOthers`
|
553
|
+
// ^^ ^
|
554
|
+
if (pattern[patternPos] === word[wordPos]) {
|
555
|
+
return 7;
|
556
|
+
}
|
557
|
+
else {
|
558
|
+
return 5;
|
559
|
+
}
|
560
|
+
}
|
561
|
+
else if (isSeparatorAtPos(wordLow, wordPos) && (wordPos === 0 || !isSeparatorAtPos(wordLow, wordPos - 1))) {
|
562
|
+
// hitting a separator: `. <-> foo.bar`
|
563
|
+
// ^
|
564
|
+
return 5;
|
565
|
+
}
|
566
|
+
else if (isSeparatorAtPos(wordLow, wordPos - 1) || isWhitespaceAtPos(wordLow, wordPos - 1)) {
|
567
|
+
// post separator: `foo <-> bar_foo`
|
568
|
+
// ^^^
|
569
|
+
return 5;
|
570
|
+
}
|
571
|
+
else {
|
572
|
+
return 1;
|
573
|
+
}
|
574
|
+
}
|
575
|
+
let _matchesCount = 0;
|
576
|
+
let _topMatch2 = 0;
|
577
|
+
let _topScore = 0;
|
578
|
+
let _wordStart = 0;
|
579
|
+
let _firstMatchCanBeWeak = false;
|
580
|
+
function _findAllMatches2(row, column, total, matches, lastMatched) {
|
581
|
+
if (_matchesCount >= 10 || total < -25) {
|
582
|
+
// stop when having already 10 results, or
|
583
|
+
// when a potential alignment as already 5 gaps
|
584
|
+
return;
|
585
|
+
}
|
586
|
+
let simpleMatchCount = 0;
|
587
|
+
while (row > 0 && column > 0) {
|
588
|
+
const score = _scores[row][column];
|
589
|
+
const arrow = _arrows[row][column];
|
590
|
+
if (arrow === 4 /* Left */) {
|
591
|
+
// left -> no match, skip a word character
|
592
|
+
column -= 1;
|
593
|
+
if (lastMatched) {
|
594
|
+
total -= 5; // new gap penalty
|
595
|
+
}
|
596
|
+
else if (matches !== 0) {
|
597
|
+
total -= 1; // gap penalty after first match
|
598
|
+
}
|
599
|
+
lastMatched = false;
|
600
|
+
simpleMatchCount = 0;
|
601
|
+
}
|
602
|
+
else {
|
603
|
+
/* istanbul ignore else */
|
604
|
+
if (arrow & 2 /* Diag */) {
|
605
|
+
if (arrow & 4 /* Left */) {
|
606
|
+
// left
|
607
|
+
_findAllMatches2(row, column - 1, matches !== 0 ? total - 1 : total, // gap penalty after first match
|
608
|
+
matches, lastMatched);
|
609
|
+
}
|
610
|
+
// diag
|
611
|
+
total += score;
|
612
|
+
row -= 1;
|
613
|
+
column -= 1;
|
614
|
+
lastMatched = true;
|
615
|
+
// match -> set a 1 at the word pos
|
616
|
+
matches += 2 ** (column + _wordStart);
|
617
|
+
// count simple matches and boost a row of
|
618
|
+
// simple matches when they yield in a
|
619
|
+
// strong match.
|
620
|
+
if (score === 1) {
|
621
|
+
simpleMatchCount += 1;
|
622
|
+
if (row === 0 && !_firstMatchCanBeWeak) {
|
623
|
+
// when the first match is a weak
|
624
|
+
// match we discard it
|
625
|
+
return undefined;
|
626
|
+
}
|
627
|
+
}
|
628
|
+
else {
|
629
|
+
// boost
|
630
|
+
total += 1 + (simpleMatchCount * (score - 1));
|
631
|
+
simpleMatchCount = 0;
|
632
|
+
}
|
633
|
+
}
|
634
|
+
else {
|
635
|
+
// istanbul ignore next
|
636
|
+
return undefined;
|
637
|
+
}
|
638
|
+
}
|
639
|
+
}
|
640
|
+
total -= column >= 3 ? 9 : column * 3; // late start penalty
|
641
|
+
// dynamically keep track of the current top score
|
642
|
+
// and insert the current best score at head, the rest at tail
|
643
|
+
_matchesCount += 1;
|
644
|
+
if (total > _topScore) {
|
645
|
+
_topScore = total;
|
646
|
+
_topMatch2 = matches;
|
647
|
+
}
|
648
|
+
}
|
649
|
+
// #endregion
|
650
|
+
// #region --- graceful ---
|
651
|
+
/** @internal */
|
652
|
+
function fuzzyScoreGracefulAggressive(pattern, lowPattern, patternPos, word, lowWord, wordPos, firstMatchCanBeWeak) {
|
653
|
+
return fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, true, firstMatchCanBeWeak);
|
654
|
+
}
|
655
|
+
exports.fuzzyScoreGracefulAggressive = fuzzyScoreGracefulAggressive;
|
656
|
+
/** @internal */
|
657
|
+
function fuzzyScoreGraceful(pattern, lowPattern, patternPos, word, lowWord, wordPos, firstMatchCanBeWeak) {
|
658
|
+
return fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, false, firstMatchCanBeWeak);
|
659
|
+
}
|
660
|
+
exports.fuzzyScoreGraceful = fuzzyScoreGraceful;
|
661
|
+
function fuzzyScoreWithPermutations(pattern, lowPattern, patternPos, word, lowWord, wordPos, aggressive, firstMatchCanBeWeak) {
|
662
|
+
let top = fuzzyScore(pattern, lowPattern, patternPos, word, lowWord, wordPos, firstMatchCanBeWeak);
|
663
|
+
if (top && !aggressive) {
|
664
|
+
// when using the original pattern yield a result we`
|
665
|
+
// return it unless we are aggressive and try to find
|
666
|
+
// a better alignment, e.g. `cno` -> `^co^ns^ole` or `^c^o^nsole`.
|
667
|
+
return top;
|
668
|
+
}
|
669
|
+
// istanbul ignore else
|
670
|
+
if (pattern.length >= 3) {
|
671
|
+
// When the pattern is long enough then try a few (max 7)
|
672
|
+
// permutations of the pattern to find a better match. The
|
673
|
+
// permutations only swap neighbouring characters, e.g
|
674
|
+
// `cnoso` becomes `conso`, `cnsoo`, `cnoos`.
|
675
|
+
const tries = Math.min(7, pattern.length - 1);
|
676
|
+
for (let movingPatternPos = patternPos + 1; movingPatternPos < tries; movingPatternPos++) {
|
677
|
+
const newPattern = nextTypoPermutation(pattern, movingPatternPos);
|
678
|
+
// istanbul ignore else
|
679
|
+
if (newPattern) {
|
680
|
+
const candidate = fuzzyScore(newPattern, newPattern.toLowerCase(), patternPos, word, lowWord, wordPos, firstMatchCanBeWeak);
|
681
|
+
if (candidate) {
|
682
|
+
candidate[0] -= 3; // permutation penalty
|
683
|
+
// istanbul ignore else
|
684
|
+
if (!top || candidate[0] > top[0]) {
|
685
|
+
top = candidate;
|
686
|
+
}
|
687
|
+
}
|
688
|
+
}
|
689
|
+
}
|
690
|
+
}
|
691
|
+
return top;
|
692
|
+
}
|
693
|
+
function nextTypoPermutation(pattern, patternPos) {
|
694
|
+
// istanbul ignore next
|
695
|
+
if (patternPos + 1 >= pattern.length) {
|
696
|
+
return undefined;
|
697
|
+
}
|
698
|
+
const swap1 = pattern[patternPos];
|
699
|
+
const swap2 = pattern[patternPos + 1];
|
700
|
+
// istanbul ignore next
|
701
|
+
if (swap1 === swap2) {
|
702
|
+
return undefined;
|
703
|
+
}
|
704
|
+
return pattern.slice(0, patternPos)
|
705
|
+
+ swap2
|
706
|
+
+ swap1
|
707
|
+
+ pattern.slice(patternPos + 2);
|
708
|
+
}
|
709
|
+
// #endregion
|
710
710
|
//# sourceMappingURL=filters.js.map
|