@theia/core 1.53.0-next.5 → 1.53.0-next.55
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/README.md +7 -7
- package/i18n/nls.cs.json +582 -552
- package/i18n/nls.de.json +582 -552
- package/i18n/nls.es.json +582 -552
- package/i18n/nls.fr.json +582 -552
- package/i18n/nls.hu.json +582 -552
- package/i18n/nls.it.json +582 -552
- package/i18n/nls.ja.json +582 -552
- package/i18n/nls.json +582 -552
- package/i18n/nls.ko.json +582 -0
- package/i18n/nls.pl.json +582 -552
- package/i18n/nls.pt-br.json +582 -552
- package/i18n/nls.ru.json +582 -552
- package/i18n/nls.tr.json +582 -0
- package/i18n/nls.zh-cn.json +582 -552
- package/i18n/nls.zh-tw.json +582 -0
- package/lib/browser/authentication-service.d.ts +15 -14
- package/lib/browser/authentication-service.d.ts.map +1 -1
- package/lib/browser/authentication-service.js +5 -5
- package/lib/browser/authentication-service.js.map +1 -1
- package/lib/browser/catalog.json +6889 -0
- package/lib/browser/common-frontend-contribution.js +3 -3
- package/lib/browser/common-styling-participants.js +166 -166
- package/lib/browser/context-key-service.d.ts +3 -2
- package/lib/browser/context-key-service.d.ts.map +1 -1
- package/lib/browser/context-key-service.js.map +1 -1
- package/lib/browser/core-preferences.d.ts.map +1 -1
- package/lib/browser/core-preferences.js +9 -0
- package/lib/browser/core-preferences.js.map +1 -1
- package/lib/browser/frontend-application-module.d.ts.map +1 -1
- package/lib/browser/frontend-application-module.js.map +1 -1
- package/lib/browser/json-schema-store.d.ts +0 -3
- package/lib/browser/json-schema-store.d.ts.map +1 -1
- package/lib/browser/json-schema-store.js +2 -12
- package/lib/browser/json-schema-store.js.map +1 -1
- package/lib/browser/open-with-service.d.ts +13 -1
- package/lib/browser/open-with-service.d.ts.map +1 -1
- package/lib/browser/open-with-service.js +48 -9
- package/lib/browser/open-with-service.js.map +1 -1
- package/lib/browser/opener-service.d.ts +8 -0
- package/lib/browser/opener-service.d.ts.map +1 -1
- package/lib/browser/opener-service.js +18 -3
- package/lib/browser/opener-service.js.map +1 -1
- package/lib/browser/progress-location-service.spec.js +7 -7
- package/lib/browser/saveable-service.d.ts.map +1 -1
- package/lib/browser/saveable-service.js +6 -2
- package/lib/browser/saveable-service.js.map +1 -1
- package/lib/browser/saveable.d.ts +17 -1
- package/lib/browser/saveable.d.ts.map +1 -1
- package/lib/browser/saveable.js +62 -1
- package/lib/browser/saveable.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts +5 -4
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js +2 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts +6 -16
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js +12 -29
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.d.ts +43 -78
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.js +8 -39
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.js.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts +10 -10
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.d.ts.map +1 -1
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js +43 -32
- package/lib/browser/shell/tab-bar-toolbar/tab-bar-toolbar.js.map +1 -1
- package/lib/browser/storage-service.js +3 -3
- package/lib/browser/tree/tree.spec.js +75 -75
- package/lib/browser/view-container.d.ts +2 -2
- package/lib/browser/view-container.d.ts.map +1 -1
- package/lib/browser/view-container.js.map +1 -1
- package/lib/browser/widget-open-handler.d.ts +4 -1
- package/lib/browser/widget-open-handler.d.ts.map +1 -1
- package/lib/browser/widget-open-handler.js.map +1 -1
- package/lib/browser/widgets/extractable-widget.js +1 -1
- package/lib/browser/widgets/extractable-widget.js.map +1 -1
- package/lib/browser/widgets/index.d.ts +1 -0
- package/lib/browser/widgets/index.d.ts.map +1 -1
- package/lib/browser/widgets/index.js +1 -0
- package/lib/browser/widgets/index.js.map +1 -1
- package/lib/browser/widgets/split-widget.d.ts +45 -0
- package/lib/browser/widgets/split-widget.d.ts.map +1 -0
- package/lib/browser/widgets/split-widget.js +126 -0
- package/lib/browser/widgets/split-widget.js.map +1 -0
- package/lib/common/event.d.ts +2 -0
- package/lib/common/event.d.ts.map +1 -1
- package/lib/common/event.js +4 -0
- package/lib/common/event.js.map +1 -1
- package/lib/common/glob.d.ts +4 -4
- package/lib/common/json-schema.d.ts +2 -0
- package/lib/common/json-schema.d.ts.map +1 -1
- package/lib/common/menu/menu-types.d.ts.map +1 -1
- package/lib/common/menu/menu-types.js.map +1 -1
- package/lib/electron-browser/electron-uri-handler.d.ts +6 -0
- package/lib/electron-browser/electron-uri-handler.d.ts.map +1 -0
- package/lib/electron-browser/electron-uri-handler.js +49 -0
- package/lib/electron-browser/electron-uri-handler.js.map +1 -0
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.d.ts.map +1 -1
- package/lib/electron-browser/menu/electron-main-menu-factory.js +6 -6
- package/lib/electron-browser/menu/electron-main-menu-factory.js.map +1 -1
- package/lib/electron-browser/preload.d.ts.map +1 -1
- package/lib/electron-browser/preload.js +12 -0
- package/lib/electron-browser/preload.js.map +1 -1
- package/lib/electron-browser/window/electron-window-module.d.ts.map +1 -1
- package/lib/electron-browser/window/electron-window-module.js +3 -0
- package/lib/electron-browser/window/electron-window-module.js.map +1 -1
- package/lib/electron-browser/window/external-app-open-handler.js +1 -1
- package/lib/electron-browser/window/external-app-open-handler.js.map +1 -1
- package/lib/electron-common/electron-api.d.ts +2 -0
- package/lib/electron-common/electron-api.d.ts.map +1 -1
- package/lib/electron-common/electron-api.js +2 -1
- package/lib/electron-common/electron-api.js.map +1 -1
- package/lib/electron-main/electron-api-main.d.ts +2 -0
- package/lib/electron-main/electron-api-main.d.ts.map +1 -1
- package/lib/electron-main/electron-api-main.js +27 -3
- package/lib/electron-main/electron-api-main.js.map +1 -1
- package/lib/electron-main/electron-main-application.d.ts +5 -3
- package/lib/electron-main/electron-main-application.d.ts.map +1 -1
- package/lib/electron-main/electron-main-application.js +57 -14
- package/lib/electron-main/electron-main-application.js.map +1 -1
- package/lib/electron-main/theia-electron-window.d.ts +1 -0
- package/lib/electron-main/theia-electron-window.d.ts.map +1 -1
- package/lib/electron-main/theia-electron-window.js +3 -0
- package/lib/electron-main/theia-electron-window.js.map +1 -1
- package/lib/node/i18n/theia-localization-contribution.d.ts.map +1 -1
- package/lib/node/i18n/theia-localization-contribution.js +12 -8
- package/lib/node/i18n/theia-localization-contribution.js.map +1 -1
- package/lib/node/process-utils.spec.js +8 -8
- package/package.json +10 -8
- package/shared/ajv/index.d.ts +2 -2
- package/shared/markdown-it.d.ts +2 -2
- package/shared/markdown-it.js +1 -1
- package/shared/reflect-metadata/index.d.ts +1 -1
- package/shared/reflect-metadata/index.js +1 -1
- package/shared/vscode-languageserver-types/index.d.ts +1 -1
- package/src/browser/about-dialog.tsx +137 -137
- package/src/browser/authentication-service.ts +467 -468
- package/src/browser/breadcrumbs/breadcrumb-popup-container.ts +101 -101
- package/src/browser/breadcrumbs/breadcrumb-renderer.tsx +41 -41
- package/src/browser/breadcrumbs/breadcrumbs-constants.ts +79 -79
- package/src/browser/breadcrumbs/breadcrumbs-renderer.tsx +185 -185
- package/src/browser/breadcrumbs/breadcrumbs-service.ts +108 -108
- package/src/browser/breadcrumbs/index.ts +21 -21
- package/src/browser/browser-clipboard-service.ts +122 -122
- package/src/browser/browser.ts +239 -239
- package/src/browser/clipboard-service.ts +23 -23
- package/src/browser/color-application-contribution.ts +110 -110
- package/src/browser/color-registry.ts +60 -60
- package/src/browser/command-open-handler.ts +54 -54
- package/src/browser/common-frontend-contribution.ts +2680 -2680
- package/src/browser/common-styling-participants.ts +361 -361
- package/src/browser/connection-status-service.spec.ts +200 -200
- package/src/browser/connection-status-service.ts +216 -216
- package/src/browser/context-key-service.ts +142 -142
- package/src/browser/context-menu-renderer.ts +124 -124
- package/src/browser/core-preferences.ts +343 -334
- package/src/browser/credentials-service.ts +106 -106
- package/src/browser/decoration-style.ts +65 -65
- package/src/browser/decorations-service.ts +209 -209
- package/src/browser/dialogs/react-dialog.tsx +56 -56
- package/src/browser/dialogs.ts +534 -534
- package/src/browser/diff-uris.ts +117 -117
- package/src/browser/encoding-registry.ts +97 -97
- package/src/browser/endpoint.spec.ts +148 -148
- package/src/browser/endpoint.ts +136 -136
- package/src/browser/external-uri-service.ts +79 -79
- package/src/browser/file-icons-js.d.ts +20 -20
- package/src/browser/frontend-application-bindings.ts +62 -62
- package/src/browser/frontend-application-config-provider.spec.ts +45 -45
- package/src/browser/frontend-application-config-provider.ts +50 -50
- package/src/browser/frontend-application-contribution.ts +110 -110
- package/src/browser/frontend-application-module.ts +474 -475
- package/src/browser/frontend-application-state.ts +74 -74
- package/src/browser/frontend-application.ts +326 -326
- package/src/browser/hover-service.ts +218 -218
- package/src/browser/http-open-handler.ts +49 -49
- package/src/browser/i18n/i18n-frontend-module.ts +27 -27
- package/src/browser/i18n/language-quick-pick-service.ts +130 -130
- package/src/browser/icon-registry.ts +87 -87
- package/src/browser/icon-theme-contribution.ts +64 -64
- package/src/browser/icon-theme-service.ts +217 -217
- package/src/browser/icons/CollapseAll.svg +7 -7
- package/src/browser/icons/CollapseAll_inverse.svg +7 -7
- package/src/browser/icons/Refresh.svg +7 -7
- package/src/browser/icons/Refresh_inverse.svg +7 -7
- package/src/browser/icons/add-inverse.svg +4 -4
- package/src/browser/icons/add.svg +4 -4
- package/src/browser/icons/arrow-down-bright.svg +6 -6
- package/src/browser/icons/arrow-down-dark.svg +6 -6
- package/src/browser/icons/arrow-up-bright.svg +6 -6
- package/src/browser/icons/arrow-up-dark.svg +6 -6
- package/src/browser/icons/case-sensitive-dark.svg +16 -16
- package/src/browser/icons/case-sensitive.svg +16 -16
- package/src/browser/icons/chevron-right-dark.svg +5 -5
- package/src/browser/icons/chevron-right-light.svg +6 -6
- package/src/browser/icons/circle-bright.svg +7 -7
- package/src/browser/icons/circle-dark.svg +7 -7
- package/src/browser/icons/clear-search-results-dark.svg +7 -7
- package/src/browser/icons/clear-search-results.svg +7 -7
- package/src/browser/icons/close-all-bright.svg +7 -7
- package/src/browser/icons/close-all-dark.svg +7 -7
- package/src/browser/icons/close-bright.svg +7 -7
- package/src/browser/icons/close-dark.svg +7 -7
- package/src/browser/icons/collapse.svg +4 -4
- package/src/browser/icons/edit-json-dark.svg +6 -6
- package/src/browser/icons/edit-json.svg +6 -6
- package/src/browser/icons/expand.svg +4 -4
- package/src/browser/icons/loading-dark.svg +6 -6
- package/src/browser/icons/loading-light.svg +6 -6
- package/src/browser/icons/open-change-bright.svg +3 -3
- package/src/browser/icons/open-change-dark.svg +4 -4
- package/src/browser/icons/open-file-bright.svg +4 -4
- package/src/browser/icons/open-file-dark.svg +4 -4
- package/src/browser/icons/preview-bright.svg +3 -3
- package/src/browser/icons/preview-dark.svg +3 -3
- package/src/browser/icons/regex-dark.svg +10 -10
- package/src/browser/icons/regex.svg +10 -10
- package/src/browser/icons/remove-all-inverse.svg +4 -4
- package/src/browser/icons/remove-all.svg +4 -4
- package/src/browser/icons/replace-all-inverse.svg +13 -13
- package/src/browser/icons/replace-all.svg +13 -13
- package/src/browser/icons/replace-inverse.svg +15 -15
- package/src/browser/icons/replace.svg +15 -15
- package/src/browser/icons/whole-word-dark.svg +19 -19
- package/src/browser/icons/whole-word.svg +19 -19
- package/src/browser/index.ts +50 -50
- package/src/browser/json-schema-store.ts +118 -127
- package/src/browser/keybinding.spec.ts +554 -554
- package/src/browser/keybinding.ts +759 -759
- package/src/browser/keyboard/browser-keyboard-frontend-contribution.ts +108 -108
- package/src/browser/keyboard/browser-keyboard-layout-provider.spec.ts +171 -171
- package/src/browser/keyboard/browser-keyboard-layout-provider.ts +469 -469
- package/src/browser/keyboard/browser-keyboard-module.ts +30 -30
- package/src/browser/keyboard/index.ts +20 -20
- package/src/browser/keyboard/keyboard-layout-service.spec.ts +121 -121
- package/src/browser/keyboard/keyboard-layout-service.ts +455 -455
- package/src/browser/keyboard/keys.spec.ts +258 -258
- package/src/browser/keyboard/keys.ts +20 -20
- package/src/browser/keys.ts +21 -21
- package/src/browser/label-parser.spec.ts +165 -165
- package/src/browser/label-parser.ts +108 -108
- package/src/browser/label-provider.spec.ts +62 -62
- package/src/browser/label-provider.ts +385 -385
- package/src/browser/language-icon-provider.ts +55 -55
- package/src/browser/language-service.ts +77 -77
- package/src/browser/logger-frontend-module.ts +65 -65
- package/src/browser/markdown-rendering/markdown-renderer.ts +98 -98
- package/src/browser/menu/browser-context-menu-renderer.ts +48 -48
- package/src/browser/menu/browser-menu-module.ts +28 -28
- package/src/browser/menu/browser-menu-plugin.ts +491 -491
- package/src/browser/menu/context-menu-context.ts +41 -41
- package/src/browser/messaging/connection-source.ts +26 -26
- package/src/browser/messaging/frontend-id-provider.ts +37 -37
- package/src/browser/messaging/index.ts +18 -18
- package/src/browser/messaging/messaging-frontend-module.ts +41 -41
- package/src/browser/messaging/service-connection-provider.ts +140 -140
- package/src/browser/messaging/ws-connection-provider.ts +49 -49
- package/src/browser/messaging/ws-connection-source.ts +230 -230
- package/src/browser/mime-service.ts +30 -30
- package/src/browser/navigatable-types.ts +81 -81
- package/src/browser/navigatable.ts +39 -39
- package/src/browser/open-with-service.ts +140 -93
- package/src/browser/opener-service.spec.ts +49 -49
- package/src/browser/opener-service.ts +169 -146
- package/src/browser/performance/frontend-stopwatch.ts +65 -65
- package/src/browser/performance/index.ts +18 -18
- package/src/browser/performance/measurement-frontend-bindings.ts +31 -31
- package/src/browser/preferences/index.ts +23 -23
- package/src/browser/preferences/injectable-preference-proxy.ts +283 -283
- package/src/browser/preferences/preference-configurations.ts +82 -82
- package/src/browser/preferences/preference-contribution.ts +436 -436
- package/src/browser/preferences/preference-language-override-service.ts +111 -111
- package/src/browser/preferences/preference-provider.spec.ts +36 -36
- package/src/browser/preferences/preference-provider.ts +277 -277
- package/src/browser/preferences/preference-proxy.spec.ts +367 -367
- package/src/browser/preferences/preference-proxy.ts +367 -367
- package/src/browser/preferences/preference-schema-provider.spec.ts +130 -130
- package/src/browser/preferences/preference-scope.ts +18 -18
- package/src/browser/preferences/preference-service.spec.ts +613 -613
- package/src/browser/preferences/preference-service.ts +594 -594
- package/src/browser/preferences/preference-validation-service.spec.ts +334 -334
- package/src/browser/preferences/preference-validation-service.ts +358 -358
- package/src/browser/preferences/test/index.ts +19 -19
- package/src/browser/preferences/test/mock-preference-provider.ts +50 -50
- package/src/browser/preferences/test/mock-preference-proxy.ts +48 -48
- package/src/browser/preferences/test/mock-preference-service.ts +63 -63
- package/src/browser/preload/i18n-preload-contribution.ts +50 -50
- package/src/browser/preload/os-preload-contribution.ts +37 -37
- package/src/browser/preload/preload-module.ts +45 -45
- package/src/browser/preload/preloader.ts +37 -37
- package/src/browser/preload/theme-preload-contribution.ts +31 -31
- package/src/browser/progress-bar-factory.ts +29 -29
- package/src/browser/progress-bar.ts +76 -76
- package/src/browser/progress-client.ts +53 -53
- package/src/browser/progress-location-service.spec.ts +50 -50
- package/src/browser/progress-location-service.ts +96 -96
- package/src/browser/progress-status-bar-item.ts +83 -83
- package/src/browser/quick-input/index.ts +23 -23
- package/src/browser/quick-input/quick-access.ts +75 -75
- package/src/browser/quick-input/quick-command-frontend-contribution.ts +89 -89
- package/src/browser/quick-input/quick-command-service.ts +246 -246
- package/src/browser/quick-input/quick-help-service.ts +87 -87
- package/src/browser/quick-input/quick-input-frontend-contribution.ts +33 -33
- package/src/browser/quick-input/quick-input-service.spec.ts +176 -176
- package/src/browser/quick-input/quick-input-service.ts +17 -17
- package/src/browser/quick-input/quick-pick-service-impl.ts +69 -69
- package/src/browser/quick-input/quick-view-service.ts +83 -83
- package/src/browser/request/browser-request-module.ts +23 -23
- package/src/browser/request/browser-request-service.ts +172 -172
- package/src/browser/resource-context-key.ts +77 -77
- package/src/browser/saveable-service.ts +332 -328
- package/src/browser/saveable.ts +395 -327
- package/src/browser/secondary-window-handler.ts +211 -211
- package/src/browser/shell/additional-views-menu-widget.tsx +71 -71
- package/src/browser/shell/application-shell-mouse-tracker.ts +103 -103
- package/src/browser/shell/application-shell.ts +2271 -2271
- package/src/browser/shell/current-widget-command-adapter.ts +57 -57
- package/src/browser/shell/index.ts +23 -23
- package/src/browser/shell/shell-layout-restorer.ts +399 -399
- package/src/browser/shell/side-panel-handler.ts +794 -794
- package/src/browser/shell/side-panel-toolbar.ts +111 -111
- package/src/browser/shell/sidebar-bottom-menu-widget.tsx +39 -39
- package/src/browser/shell/sidebar-menu-widget.tsx +183 -183
- package/src/browser/shell/sidebar-top-menu-widget.tsx +26 -26
- package/src/browser/shell/split-panels.ts +191 -191
- package/src/browser/shell/tab-bar-decorator.ts +106 -106
- package/src/browser/shell/tab-bar-toolbar/index.ts +19 -19
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-menu-adapters.ts +31 -31
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-registry.ts +242 -256
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar-types.ts +149 -207
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.spec.ts +62 -62
- package/src/browser/shell/tab-bar-toolbar/tab-bar-toolbar.tsx +443 -428
- package/src/browser/shell/tab-bars.spec.ts +63 -63
- package/src/browser/shell/tab-bars.ts +1468 -1468
- package/src/browser/shell/theia-dock-panel.ts +265 -265
- package/src/browser/shell/view-column-service.ts +125 -125
- package/src/browser/shell/view-contribution.ts +178 -178
- package/src/browser/source-tree/index.ts +19 -19
- package/src/browser/source-tree/source-tree-widget.tsx +107 -107
- package/src/browser/source-tree/source-tree.ts +146 -146
- package/src/browser/source-tree/tree-source.ts +73 -73
- package/src/browser/status-bar/index.ts +29 -29
- package/src/browser/status-bar/status-bar-types.ts +97 -97
- package/src/browser/status-bar/status-bar-view-model.ts +209 -209
- package/src/browser/status-bar/status-bar.tsx +189 -189
- package/src/browser/storage-service.spec.ts +76 -76
- package/src/browser/storage-service.ts +129 -129
- package/src/browser/style/about.css +36 -36
- package/src/browser/style/alert-messages.css +62 -62
- package/src/browser/style/ansi.css +88 -88
- package/src/browser/style/breadcrumbs.css +130 -130
- package/src/browser/style/dialog.css +126 -126
- package/src/browser/style/dockpanel.css +76 -76
- package/src/browser/style/hover-service.css +101 -101
- package/src/browser/style/icons.css +61 -61
- package/src/browser/style/index.css +353 -352
- package/src/browser/style/materialcolors.css +278 -278
- package/src/browser/style/menus.css +230 -230
- package/src/browser/style/notification.css +39 -39
- package/src/browser/style/os.css +87 -87
- package/src/browser/style/progress-bar.css +43 -43
- package/src/browser/style/quick-title-bar.css +45 -45
- package/src/browser/style/scrollbars.css +172 -172
- package/src/browser/style/search-box.css +123 -123
- package/src/browser/style/select-component.css +107 -107
- package/src/browser/style/sidepanel.css +367 -367
- package/src/browser/style/split-widget.css +38 -0
- package/src/browser/style/status-bar.css +127 -127
- package/src/browser/style/tabs.css +647 -658
- package/src/browser/style/tooltip.css +28 -28
- package/src/browser/style/tree-decorators.css +81 -81
- package/src/browser/style/tree.css +232 -232
- package/src/browser/style/view-container.css +187 -194
- package/src/browser/style/widget.css +19 -19
- package/src/browser/styling-service.ts +96 -96
- package/src/browser/supported-encodings.ts +262 -262
- package/src/browser/test/jsdom.ts +69 -69
- package/src/browser/test/mock-connection-status-service.ts +33 -33
- package/src/browser/test/mock-env-variables-server.ts +47 -47
- package/src/browser/test/mock-opener-service.ts +34 -34
- package/src/browser/test/mock-storage-service.ts +49 -49
- package/src/browser/theming.ts +206 -206
- package/src/browser/tooltip-service.tsx +96 -96
- package/src/browser/tree/fuzzy-search.spec.ts +99 -99
- package/src/browser/tree/fuzzy-search.ts +136 -136
- package/src/browser/tree/index.ts +29 -29
- package/src/browser/tree/search-box-debounce.ts +96 -96
- package/src/browser/tree/search-box.ts +355 -355
- package/src/browser/tree/test/mock-selectable-tree-model.ts +109 -109
- package/src/browser/tree/test/mock-tree-model.ts +136 -136
- package/src/browser/tree/test/tree-test-container.ts +50 -50
- package/src/browser/tree/tree-compression/compressed-tree-expansion-service.ts +46 -46
- package/src/browser/tree/tree-compression/compressed-tree-model.ts +88 -88
- package/src/browser/tree/tree-compression/compressed-tree-widget.tsx +203 -203
- package/src/browser/tree/tree-compression/index.ts +20 -20
- package/src/browser/tree/tree-compression/tree-compression-service.ts +125 -125
- package/src/browser/tree/tree-compression/tree-compression.css +28 -28
- package/src/browser/tree/tree-consistency.spec.ts +105 -105
- package/src/browser/tree/tree-container.spec.ts +45 -45
- package/src/browser/tree/tree-container.ts +155 -155
- package/src/browser/tree/tree-decorator.spec.ts +162 -162
- package/src/browser/tree/tree-decorator.ts +238 -238
- package/src/browser/tree/tree-expansion.spec.ts +173 -173
- package/src/browser/tree/tree-expansion.ts +165 -165
- package/src/browser/tree/tree-focus-service.ts +55 -55
- package/src/browser/tree/tree-iterator.spec.ts +170 -170
- package/src/browser/tree/tree-iterator.ts +256 -256
- package/src/browser/tree/tree-label-provider.ts +40 -40
- package/src/browser/tree/tree-model.ts +562 -562
- package/src/browser/tree/tree-navigation.ts +58 -58
- package/src/browser/tree/tree-preference.ts +50 -50
- package/src/browser/tree/tree-search.ts +128 -128
- package/src/browser/tree/tree-selectable.spec.ts +152 -152
- package/src/browser/tree/tree-selection-impl.ts +176 -176
- package/src/browser/tree/tree-selection-state.spec.ts +462 -462
- package/src/browser/tree/tree-selection-state.ts +245 -245
- package/src/browser/tree/tree-selection.ts +159 -159
- package/src/browser/tree/tree-view-welcome-widget.tsx +263 -263
- package/src/browser/tree/tree-widget-selection.ts +45 -45
- package/src/browser/tree/tree-widget.tsx +1591 -1591
- package/src/browser/tree/tree.spec.ts +241 -241
- package/src/browser/tree/tree.ts +425 -425
- package/src/browser/undo-redo-handler.ts +85 -85
- package/src/browser/user-working-directory-provider.ts +77 -77
- package/src/browser/view-container.ts +1640 -1640
- package/src/browser/widget-decoration.ts +358 -358
- package/src/browser/widget-manager.spec.ts +102 -102
- package/src/browser/widget-manager.ts +318 -318
- package/src/browser/widget-open-handler.ts +168 -165
- package/src/browser/widgets/alert-message.tsx +56 -56
- package/src/browser/widgets/enhanced-preview-widget.ts +27 -27
- package/src/browser/widgets/extractable-widget.ts +33 -33
- package/src/browser/widgets/index.ts +21 -20
- package/src/browser/widgets/previewable-widget.ts +31 -31
- package/src/browser/widgets/react-renderer.tsx +53 -53
- package/src/browser/widgets/react-widget.tsx +51 -51
- package/src/browser/widgets/select-component.tsx +367 -367
- package/src/browser/widgets/split-widget.ts +163 -0
- package/src/browser/widgets/widget.ts +406 -406
- package/src/browser/window/browser-window-module.ts +32 -32
- package/src/browser/window/default-secondary-window-service.ts +189 -189
- package/src/browser/window/default-window-service.spec.ts +78 -78
- package/src/browser/window/default-window-service.ts +171 -171
- package/src/browser/window/secondary-window-service.ts +39 -39
- package/src/browser/window/test/mock-window-service.ts +29 -29
- package/src/browser/window/window-service.ts +78 -78
- package/src/browser/window/window-title-service.ts +107 -107
- package/src/browser/window/window-title-updater.ts +95 -95
- package/src/browser/window-contribution.ts +64 -64
- package/src/browser-only/frontend-only-application-module.ts +116 -116
- package/src/browser-only/i18n/i18n-frontend-only-module.ts +37 -37
- package/src/browser-only/logger-frontend-only-module.ts +63 -63
- package/src/browser-only/messaging/frontend-only-service-connection-provider.ts +39 -39
- package/src/browser-only/messaging/messaging-frontend-only-module.ts +42 -42
- package/src/browser-only/preload/frontend-only-preload-module.ts +49 -49
- package/src/common/accessibility.ts +33 -33
- package/src/common/application-error.spec.ts +27 -27
- package/src/common/application-error.ts +76 -76
- package/src/common/application-protocol.ts +42 -42
- package/src/common/array-utils.ts +129 -129
- package/src/common/buffer.ts +228 -228
- package/src/common/cancellation.ts +163 -163
- package/src/common/char-code.ts +438 -438
- package/src/common/collections.ts +125 -125
- package/src/common/color.ts +103 -103
- package/src/common/command.spec.ts +208 -208
- package/src/common/command.ts +489 -489
- package/src/common/contribution-filter/contribution-filter-registry.ts +79 -79
- package/src/common/contribution-filter/contribution-filter.ts +64 -64
- package/src/common/contribution-filter/filter.ts +23 -23
- package/src/common/contribution-filter/index.ts +19 -19
- package/src/common/contribution-provider.ts +96 -96
- package/src/common/disposable.spec.ts +94 -94
- package/src/common/disposable.ts +188 -188
- package/src/common/encoding-service.ts +380 -380
- package/src/common/encodings.ts +24 -24
- package/src/common/env-variables/env-variables-protocol.ts +38 -38
- package/src/common/env-variables/index.ts +17 -17
- package/src/common/event.spec.ts +32 -32
- package/src/common/event.ts +493 -487
- package/src/common/file-uri.ts +61 -61
- package/src/common/frontend-application-state.ts +38 -38
- package/src/common/glob.ts +741 -741
- package/src/common/hash.ts +85 -85
- package/src/common/i18n/localization-server.ts +25 -25
- package/src/common/i18n/localization.ts +80 -80
- package/src/common/i18n/nls.metadata.json +34112 -34112
- package/src/common/index.ts +51 -51
- package/src/common/json-schema.ts +108 -106
- package/src/common/key-store.ts +26 -26
- package/src/common/keybinding.ts +152 -152
- package/src/common/keyboard/keyboard-layout-provider.ts +51 -51
- package/src/common/keys.ts +694 -694
- package/src/common/label-protocol.ts +35 -35
- package/src/common/logger-protocol.ts +119 -119
- package/src/common/logger-watcher.ts +48 -48
- package/src/common/logger.spec.ts +46 -46
- package/src/common/logger.ts +389 -389
- package/src/common/lsp-types.ts +34 -34
- package/src/common/markdown-rendering/icon-utilities.ts +30 -30
- package/src/common/markdown-rendering/index.ts +18 -18
- package/src/common/markdown-rendering/markdown-string.ts +152 -152
- package/src/common/menu/action-menu-node.ts +65 -65
- package/src/common/menu/composite-menu-node.spec.ts +67 -67
- package/src/common/menu/composite-menu-node.ts +114 -114
- package/src/common/menu/index.ts +21 -21
- package/src/common/menu/menu-adapter.ts +103 -103
- package/src/common/menu/menu-model-registry.ts +374 -374
- package/src/common/menu/menu-types.ts +220 -219
- package/src/common/menu/menu.spec.ts +101 -101
- package/src/common/message-rpc/channel.spec.ts +88 -88
- package/src/common/message-rpc/channel.ts +300 -300
- package/src/common/message-rpc/index.ts +22 -22
- package/src/common/message-rpc/message-buffer.ts +105 -105
- package/src/common/message-rpc/msg-pack-extension-manager.ts +70 -70
- package/src/common/message-rpc/rpc-message-encoder.spec.ts +65 -65
- package/src/common/message-rpc/rpc-message-encoder.ts +190 -190
- package/src/common/message-rpc/rpc-protocol.ts +255 -255
- package/src/common/message-rpc/uint8-array-message-buffer.spec.ts +41 -41
- package/src/common/message-rpc/uint8-array-message-buffer.ts +213 -213
- package/src/common/message-service-protocol.ts +148 -148
- package/src/common/message-service.ts +226 -226
- package/src/common/messaging/connection-error-handler.ts +73 -73
- package/src/common/messaging/connection-management.ts +43 -43
- package/src/common/messaging/handler.ts +26 -26
- package/src/common/messaging/index.ts +19 -19
- package/src/common/messaging/proxy-factory.spec.ts +108 -108
- package/src/common/messaging/proxy-factory.ts +336 -336
- package/src/common/messaging/socket-write-buffer.ts +52 -52
- package/src/common/messaging/web-socket-channel.ts +76 -76
- package/src/common/nls.ts +151 -151
- package/src/common/numbers.ts +21 -21
- package/src/common/objects.spec.ts +112 -112
- package/src/common/objects.ts +123 -123
- package/src/common/os.ts +82 -82
- package/src/common/path.spec.ts +415 -415
- package/src/common/path.ts +334 -334
- package/src/common/paths.ts +250 -250
- package/src/common/performance/index.ts +19 -19
- package/src/common/performance/measurement-protocol.ts +104 -104
- package/src/common/performance/measurement.ts +130 -130
- package/src/common/performance/stopwatch.ts +183 -183
- package/src/common/preferences/preference-schema.ts +101 -101
- package/src/common/preferences/preference-scope.spec.ts +48 -48
- package/src/common/preferences/preference-scope.ts +68 -68
- package/src/common/prioritizeable.ts +58 -58
- package/src/common/progress-service-protocol.ts +35 -35
- package/src/common/progress-service.ts +82 -82
- package/src/common/promise-util.spec.ts +102 -102
- package/src/common/promise-util.ts +143 -143
- package/src/common/quick-pick-service.ts +353 -353
- package/src/common/reference.spec.ts +145 -145
- package/src/common/reference.ts +230 -230
- package/src/common/resource.ts +430 -430
- package/src/common/selection-command-handler.ts +101 -101
- package/src/common/selection-service.spec.ts +43 -43
- package/src/common/selection-service.ts +49 -49
- package/src/common/selection.ts +50 -50
- package/src/common/severity.ts +111 -111
- package/src/common/stream.ts +718 -718
- package/src/common/strings.ts +231 -231
- package/src/common/telemetry.ts +45 -45
- package/src/common/ternary-search-tree.ts +417 -417
- package/src/common/test/expect.ts +34 -34
- package/src/common/test/mock-logger.ts +118 -118
- package/src/common/test/mock-menu.ts +35 -35
- package/src/common/test/mock-resource-provider.ts +33 -33
- package/src/common/theme.ts +68 -68
- package/src/common/types.spec.ts +86 -86
- package/src/common/types.ts +140 -140
- package/src/common/uri-command-handler.spec.ts +90 -90
- package/src/common/uri-command-handler.ts +148 -148
- package/src/common/uri.spec.ts +278 -278
- package/src/common/uri.ts +279 -279
- package/src/common/uuid.ts +45 -45
- package/src/common/version.ts +17 -17
- package/src/common/view-column.ts +33 -33
- package/src/common/window.ts +34 -34
- package/src/electron-browser/electron-clipboard-service.ts +32 -32
- package/src/electron-browser/electron-uri-handler.ts +42 -0
- package/src/electron-browser/keyboard/electron-keyboard-layout-change-notifier.ts +39 -39
- package/src/electron-browser/keyboard/electron-keyboard-module.ts +28 -28
- package/src/electron-browser/menu/electron-context-menu-renderer.ts +122 -122
- package/src/electron-browser/menu/electron-main-menu-factory.ts +339 -338
- package/src/electron-browser/menu/electron-menu-contribution.ts +506 -506
- package/src/electron-browser/menu/electron-menu-module.ts +40 -40
- package/src/electron-browser/menu/electron-menu-style.css +110 -110
- package/src/electron-browser/messaging/electron-frontend-id-provider.ts +25 -25
- package/src/electron-browser/messaging/electron-ipc-connection-source.ts +65 -65
- package/src/electron-browser/messaging/electron-local-ws-connection-source.ts +45 -45
- package/src/electron-browser/messaging/electron-messaging-frontend-module.ts +78 -78
- package/src/electron-browser/messaging/electron-ws-connection-source.ts +38 -38
- package/src/electron-browser/preload.ts +264 -249
- package/src/electron-browser/request/electron-browser-request-module.ts +26 -26
- package/src/electron-browser/token/electron-token-frontend-module.ts +22 -22
- package/src/electron-browser/window/electron-frontend-application-state.ts +26 -26
- package/src/electron-browser/window/electron-secondary-window-service.ts +35 -35
- package/src/electron-browser/window/electron-window-module.ts +48 -45
- package/src/electron-browser/window/electron-window-preferences.ts +76 -76
- package/src/electron-browser/window/electron-window-service.ts +109 -109
- package/src/electron-browser/window/external-app-open-handler.ts +42 -42
- package/src/electron-common/electron-api.ts +157 -154
- package/src/electron-common/electron-main-window-service.ts +24 -24
- package/src/electron-common/electron-token.ts +27 -27
- package/src/electron-main/electron-api-main.ts +373 -347
- package/src/electron-main/electron-main-application-module.ts +65 -65
- package/src/electron-main/electron-main-application.ts +860 -818
- package/src/electron-main/electron-main-constants.ts +23 -23
- package/src/electron-main/electron-main-window-service-impl.ts +44 -44
- package/src/electron-main/electron-security-token-service.ts +36 -36
- package/src/electron-main/event-utils.ts +36 -36
- package/src/electron-main/messaging/electron-connection-handler.ts +21 -21
- package/src/electron-main/messaging/electron-messaging-contribution.ts +143 -143
- package/src/electron-main/messaging/electron-messaging-service.ts +35 -35
- package/src/electron-main/theia-electron-window.ts +219 -214
- package/src/electron-node/cli/electron-backend-cli-module.ts +24 -24
- package/src/electron-node/cli/electron-cli-contribution.ts +35 -35
- package/src/electron-node/hosting/electron-backend-hosting-module.ts +24 -24
- package/src/electron-node/hosting/electron-ws-origin-validator.ts +37 -37
- package/src/electron-node/keyboard/electron-backend-keyboard-module.ts +30 -30
- package/src/electron-node/keyboard/electron-keyboard-layout-provider.ts +35 -35
- package/src/electron-node/request/electron-backend-request-module.ts +23 -23
- package/src/electron-node/request/electron-backend-request-service.ts +78 -78
- package/src/electron-node/token/electron-token-backend-contribution.ts +48 -48
- package/src/electron-node/token/electron-token-backend-module.ts +28 -28
- package/src/electron-node/token/electron-token-validator.ts +93 -93
- package/src/node/application-server.ts +59 -59
- package/src/node/backend-application-config-provider.spec.ts +29 -29
- package/src/node/backend-application-config-provider.ts +48 -48
- package/src/node/backend-application-module.ts +139 -139
- package/src/node/backend-application.ts +374 -374
- package/src/node/cli.spec.ts +94 -94
- package/src/node/cli.ts +63 -63
- package/src/node/console-logger-server.spec.ts +59 -59
- package/src/node/console-logger-server.ts +76 -76
- package/src/node/debug.ts +30 -30
- package/src/node/dynamic-require.ts +56 -56
- package/src/node/env-variables/env-variables-server.ts +123 -123
- package/src/node/env-variables/index.ts +17 -17
- package/src/node/environment-utils.spec.ts +92 -92
- package/src/node/environment-utils.ts +66 -66
- package/src/node/file-uri.spec.ts +76 -76
- package/src/node/filesystem-locking.ts +77 -77
- package/src/node/hosting/backend-application-hosts.ts +60 -60
- package/src/node/hosting/backend-hosting-module.ts +26 -26
- package/src/node/hosting/ws-origin-validator.ts +36 -36
- package/src/node/i18n/i18n-backend-module.ts +42 -42
- package/src/node/i18n/localization-contribution.ts +112 -112
- package/src/node/i18n/localization-provider.ts +125 -125
- package/src/node/i18n/localization-server.ts +52 -52
- package/src/node/i18n/theia-localization-contribution.ts +40 -36
- package/src/node/index.ts +22 -22
- package/src/node/key-store-server.ts +162 -162
- package/src/node/logger-backend-module.ts +88 -88
- package/src/node/logger-cli-contribution.spec.ts +245 -245
- package/src/node/logger-cli-contribution.ts +168 -168
- package/src/node/main.ts +33 -33
- package/src/node/messaging/binary-message-pipe.ts +168 -168
- package/src/node/messaging/connection-container-module.ts +96 -96
- package/src/node/messaging/default-messaging-service.ts +129 -129
- package/src/node/messaging/frontend-connection-service.ts +24 -24
- package/src/node/messaging/index.ts +19 -19
- package/src/node/messaging/ipc-bootstrap.ts +27 -27
- package/src/node/messaging/ipc-channel.ts +77 -77
- package/src/node/messaging/ipc-connection-provider.ts +107 -107
- package/src/node/messaging/ipc-protocol.ts +76 -76
- package/src/node/messaging/messaging-backend-module.ts +52 -52
- package/src/node/messaging/messaging-listeners.ts +52 -52
- package/src/node/messaging/messaging-service.ts +46 -46
- package/src/node/messaging/test/test-web-socket-channel.ts +61 -61
- package/src/node/messaging/websocket-endpoint.ts +79 -79
- package/src/node/messaging/websocket-frontend-connection-service.ts +186 -186
- package/src/node/os-backend-provider.ts +25 -25
- package/src/node/performance/index.ts +18 -18
- package/src/node/performance/measurement-backend-bindings.ts +35 -35
- package/src/node/performance/node-stopwatch.ts +40 -40
- package/src/node/process-utils.spec.ts +48 -48
- package/src/node/process-utils.ts +102 -102
- package/src/node/remote/backend-remote-service.ts +25 -25
- package/src/node/remote/remote-cli-contribution.ts +34 -34
- package/src/node/remote/remote-copy-contribution.ts +45 -45
- package/src/node/request/backend-request-facade.ts +39 -39
- package/src/node/request/backend-request-module.ts +25 -25
- package/src/node/request/proxy-cli-contribution.ts +65 -65
- package/src/node/ws-request-validators.ts +56 -56
- package/src/typings/native-keymap.d.ts +108 -108
- package/i18n/nls.pt-pt.json +0 -552
|
@@ -1,380 +1,380 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2020 TypeFox and others.
|
|
3
|
-
//
|
|
4
|
-
// This program and the accompanying materials are made available under the
|
|
5
|
-
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
-
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
-
//
|
|
8
|
-
// This Source Code may also be made available under the following Secondary
|
|
9
|
-
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
-
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
-
// with the GNU Classpath Exception which is available at
|
|
12
|
-
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
-
//
|
|
14
|
-
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
-
// *****************************************************************************
|
|
16
|
-
/*---------------------------------------------------------------------------------------------
|
|
17
|
-
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
18
|
-
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
19
|
-
*--------------------------------------------------------------------------------------------*/
|
|
20
|
-
// based on https://github.com/microsoft/vscode/blob/04c36be045a94fee58e5f8992d3e3fd980294a84/src/vs/workbench/services/textfile/common/encoding.ts
|
|
21
|
-
|
|
22
|
-
/* eslint-disable no-null/no-null */
|
|
23
|
-
|
|
24
|
-
import * as iconv from 'iconv-lite';
|
|
25
|
-
import { Buffer } from 'safer-buffer';
|
|
26
|
-
import { injectable } from 'inversify';
|
|
27
|
-
import { BinaryBuffer, BinaryBufferReadableStream, BinaryBufferReadable } from './buffer';
|
|
28
|
-
import { UTF8, UTF8_with_bom, UTF16be, UTF16le, UTF16be_BOM, UTF16le_BOM, UTF8_BOM } from './encodings';
|
|
29
|
-
import { newWriteableStream, ReadableStream, Readable } from './stream';
|
|
30
|
-
|
|
31
|
-
const ZERO_BYTE_DETECTION_BUFFER_MAX_LEN = 512; // number of bytes to look at to decide about a file being binary or not
|
|
32
|
-
const NO_ENCODING_GUESS_MIN_BYTES = 512; // when not auto guessing the encoding, small number of bytes are enough
|
|
33
|
-
const AUTO_ENCODING_GUESS_MIN_BYTES = 512 * 8; // with auto guessing we want a lot more content to be read for guessing
|
|
34
|
-
const AUTO_ENCODING_GUESS_MAX_BYTES = 512 * 128; // set an upper limit for the number of bytes we pass on to jschardet
|
|
35
|
-
|
|
36
|
-
// we explicitly ignore a specific set of encodings from auto guessing
|
|
37
|
-
// - ASCII: we never want this encoding (most UTF-8 files would happily detect as
|
|
38
|
-
// ASCII files and then you could not type non-ASCII characters anymore)
|
|
39
|
-
// - UTF-16: we have our own detection logic for UTF-16
|
|
40
|
-
// - UTF-32: we do not support this encoding in VSCode
|
|
41
|
-
const IGNORE_ENCODINGS = ['ascii', 'utf-16', 'utf-32'];
|
|
42
|
-
|
|
43
|
-
export interface ResourceEncoding {
|
|
44
|
-
encoding: string
|
|
45
|
-
hasBOM: boolean
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
export interface DetectedEncoding {
|
|
49
|
-
encoding?: string
|
|
50
|
-
seemsBinary?: boolean
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export interface DecodeStreamOptions {
|
|
54
|
-
guessEncoding?: boolean;
|
|
55
|
-
minBytesRequiredForDetection?: number;
|
|
56
|
-
|
|
57
|
-
overwriteEncoding(detectedEncoding: string | undefined): Promise<string>;
|
|
58
|
-
}
|
|
59
|
-
export interface DecodeStreamResult {
|
|
60
|
-
stream: ReadableStream<string>;
|
|
61
|
-
detected: DetectedEncoding;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
@injectable()
|
|
65
|
-
export class EncodingService {
|
|
66
|
-
|
|
67
|
-
encode(value: string, options?: ResourceEncoding): BinaryBuffer {
|
|
68
|
-
let encoding = options?.encoding;
|
|
69
|
-
const addBOM = options?.hasBOM;
|
|
70
|
-
encoding = this.toIconvEncoding(encoding);
|
|
71
|
-
if (encoding === UTF8 && !addBOM) {
|
|
72
|
-
return BinaryBuffer.fromString(value);
|
|
73
|
-
}
|
|
74
|
-
const buffer = iconv.encode(value, encoding, { addBOM });
|
|
75
|
-
return BinaryBuffer.wrap(buffer);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
decode(value: BinaryBuffer, encoding?: string): string {
|
|
79
|
-
const buffer = Buffer.from(value.buffer);
|
|
80
|
-
encoding = this.toIconvEncoding(encoding);
|
|
81
|
-
return iconv.decode(buffer, encoding);
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
exists(encoding: string): boolean {
|
|
85
|
-
encoding = this.toIconvEncoding(encoding);
|
|
86
|
-
return iconv.encodingExists(encoding);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
toIconvEncoding(encoding?: string): string {
|
|
90
|
-
if (encoding === UTF8_with_bom || !encoding) {
|
|
91
|
-
return UTF8; // iconv does not distinguish UTF 8 with or without BOM, so we need to help it
|
|
92
|
-
}
|
|
93
|
-
return encoding;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
async toResourceEncoding(encoding: string, options: {
|
|
97
|
-
overwriteEncoding?: boolean,
|
|
98
|
-
read: (length: number) => Promise<Uint8Array>
|
|
99
|
-
}): Promise<ResourceEncoding> {
|
|
100
|
-
// Some encodings come with a BOM automatically
|
|
101
|
-
if (encoding === UTF16be || encoding === UTF16le || encoding === UTF8_with_bom) {
|
|
102
|
-
return { encoding, hasBOM: true };
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
// Ensure that we preserve an existing BOM if found for UTF8
|
|
106
|
-
// unless we are instructed to overwrite the encoding
|
|
107
|
-
const overwriteEncoding = options?.overwriteEncoding;
|
|
108
|
-
if (!overwriteEncoding && encoding === UTF8) {
|
|
109
|
-
try {
|
|
110
|
-
// stream here to avoid fetching the whole content on write
|
|
111
|
-
const buffer = await options.read(UTF8_BOM.length);
|
|
112
|
-
if (this.detectEncodingByBOMFromBuffer(Buffer.from(buffer), buffer.byteLength) === UTF8_with_bom) {
|
|
113
|
-
return { encoding, hasBOM: true };
|
|
114
|
-
}
|
|
115
|
-
} catch (error) {
|
|
116
|
-
// ignore - file might not exist
|
|
117
|
-
}
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
return { encoding, hasBOM: false };
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
async detectEncoding(data: BinaryBuffer, autoGuessEncoding?: boolean): Promise<DetectedEncoding> {
|
|
124
|
-
const buffer = Buffer.from(data.buffer);
|
|
125
|
-
const bytesRead = data.byteLength;
|
|
126
|
-
// Always first check for BOM to find out about encoding
|
|
127
|
-
let encoding = this.detectEncodingByBOMFromBuffer(buffer, bytesRead);
|
|
128
|
-
|
|
129
|
-
// Detect 0 bytes to see if file is binary or UTF-16 LE/BEÏ
|
|
130
|
-
// unless we already know that this file has a UTF-16 encoding
|
|
131
|
-
let seemsBinary = false;
|
|
132
|
-
if (encoding !== UTF16be && encoding !== UTF16le && buffer) {
|
|
133
|
-
let couldBeUTF16LE = true; // e.g. 0xAA 0x00
|
|
134
|
-
let couldBeUTF16BE = true; // e.g. 0x00 0xAA
|
|
135
|
-
let containsZeroByte = false;
|
|
136
|
-
|
|
137
|
-
// This is a simplified guess to detect UTF-16 BE or LE by just checking if
|
|
138
|
-
// the first 512 bytes have the 0-byte at a specific location. For UTF-16 LE
|
|
139
|
-
// this would be the odd byte index and for UTF-16 BE the even one.
|
|
140
|
-
// Note: this can produce false positives (a binary file that uses a 2-byte
|
|
141
|
-
// encoding of the same format as UTF-16) and false negatives (a UTF-16 file
|
|
142
|
-
// that is using 4 bytes to encode a character).
|
|
143
|
-
for (let i = 0; i < bytesRead && i < ZERO_BYTE_DETECTION_BUFFER_MAX_LEN; i++) {
|
|
144
|
-
const isEndian = (i % 2 === 1); // assume 2-byte sequences typical for UTF-16
|
|
145
|
-
const isZeroByte = (buffer.readUInt8(i) === 0);
|
|
146
|
-
|
|
147
|
-
if (isZeroByte) {
|
|
148
|
-
containsZeroByte = true;
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
// UTF-16 LE: expect e.g. 0xAA 0x00
|
|
152
|
-
if (couldBeUTF16LE && (isEndian && !isZeroByte || !isEndian && isZeroByte)) {
|
|
153
|
-
couldBeUTF16LE = false;
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// UTF-16 BE: expect e.g. 0x00 0xAA
|
|
157
|
-
if (couldBeUTF16BE && (isEndian && isZeroByte || !isEndian && !isZeroByte)) {
|
|
158
|
-
couldBeUTF16BE = false;
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
// Return if this is neither UTF16-LE nor UTF16-BE and thus treat as binary
|
|
162
|
-
if (isZeroByte && !couldBeUTF16LE && !couldBeUTF16BE) {
|
|
163
|
-
break;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
|
-
// Handle case of 0-byte included
|
|
168
|
-
if (containsZeroByte) {
|
|
169
|
-
if (couldBeUTF16LE) {
|
|
170
|
-
encoding = UTF16le;
|
|
171
|
-
} else if (couldBeUTF16BE) {
|
|
172
|
-
encoding = UTF16be;
|
|
173
|
-
} else {
|
|
174
|
-
seemsBinary = true;
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
// Auto guess encoding if configured
|
|
180
|
-
if (autoGuessEncoding && !seemsBinary && !encoding && buffer) {
|
|
181
|
-
const guessedEncoding = await this.guessEncodingByBuffer(buffer.slice(0, bytesRead));
|
|
182
|
-
return {
|
|
183
|
-
seemsBinary: false,
|
|
184
|
-
encoding: guessedEncoding
|
|
185
|
-
};
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return { seemsBinary, encoding };
|
|
189
|
-
}
|
|
190
|
-
|
|
191
|
-
protected detectEncodingByBOMFromBuffer(buffer: Buffer, bytesRead: number): typeof UTF8_with_bom | typeof UTF16le | typeof UTF16be | undefined {
|
|
192
|
-
if (!buffer || bytesRead < UTF16be_BOM.length) {
|
|
193
|
-
return undefined;
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
const b0 = buffer.readUInt8(0);
|
|
197
|
-
const b1 = buffer.readUInt8(1);
|
|
198
|
-
|
|
199
|
-
// UTF-16 BE
|
|
200
|
-
if (b0 === UTF16be_BOM[0] && b1 === UTF16be_BOM[1]) {
|
|
201
|
-
return UTF16be;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
// UTF-16 LE
|
|
205
|
-
if (b0 === UTF16le_BOM[0] && b1 === UTF16le_BOM[1]) {
|
|
206
|
-
return UTF16le;
|
|
207
|
-
}
|
|
208
|
-
|
|
209
|
-
if (bytesRead < UTF8_BOM.length) {
|
|
210
|
-
return undefined;
|
|
211
|
-
}
|
|
212
|
-
|
|
213
|
-
const b2 = buffer.readUInt8(2);
|
|
214
|
-
|
|
215
|
-
// UTF-8
|
|
216
|
-
if (b0 === UTF8_BOM[0] && b1 === UTF8_BOM[1] && b2 === UTF8_BOM[2]) {
|
|
217
|
-
return UTF8_with_bom;
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
return undefined;
|
|
221
|
-
}
|
|
222
|
-
|
|
223
|
-
protected async guessEncodingByBuffer(buffer: Buffer): Promise<string | undefined> {
|
|
224
|
-
const jschardet = await import('jschardet');
|
|
225
|
-
|
|
226
|
-
const guessed = jschardet.detect(buffer.slice(0, AUTO_ENCODING_GUESS_MAX_BYTES)); // ensure to limit buffer for guessing due to https://github.com/aadsm/jschardet/issues/53
|
|
227
|
-
if (!guessed || !guessed.encoding) {
|
|
228
|
-
return undefined;
|
|
229
|
-
}
|
|
230
|
-
|
|
231
|
-
const enc = guessed.encoding.toLowerCase();
|
|
232
|
-
if (0 <= IGNORE_ENCODINGS.indexOf(enc)) {
|
|
233
|
-
return undefined; // see comment above why we ignore some encodings
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return this.toIconvEncoding(guessed.encoding);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
decodeStream(source: BinaryBufferReadableStream, options: DecodeStreamOptions): Promise<DecodeStreamResult> {
|
|
240
|
-
const minBytesRequiredForDetection = options.minBytesRequiredForDetection ?? options.guessEncoding ? AUTO_ENCODING_GUESS_MIN_BYTES : NO_ENCODING_GUESS_MIN_BYTES;
|
|
241
|
-
|
|
242
|
-
return new Promise<DecodeStreamResult>((resolve, reject) => {
|
|
243
|
-
const target = newWriteableStream<string>(strings => strings.join(''));
|
|
244
|
-
|
|
245
|
-
const bufferedChunks: BinaryBuffer[] = [];
|
|
246
|
-
let bytesBuffered = 0;
|
|
247
|
-
|
|
248
|
-
let decoder: iconv.DecoderStream | undefined = undefined;
|
|
249
|
-
|
|
250
|
-
const createDecoder = async () => {
|
|
251
|
-
try {
|
|
252
|
-
|
|
253
|
-
// detect encoding from buffer
|
|
254
|
-
const detected = await this.detectEncoding(BinaryBuffer.concat(bufferedChunks), options.guessEncoding);
|
|
255
|
-
|
|
256
|
-
// ensure to respect overwrite of encoding
|
|
257
|
-
detected.encoding = await options.overwriteEncoding(detected.encoding);
|
|
258
|
-
|
|
259
|
-
// decode and write buffered content
|
|
260
|
-
decoder = iconv.getDecoder(this.toIconvEncoding(detected.encoding));
|
|
261
|
-
const decoded = decoder.write(Buffer.from(BinaryBuffer.concat(bufferedChunks).buffer));
|
|
262
|
-
target.write(decoded);
|
|
263
|
-
|
|
264
|
-
bufferedChunks.length = 0;
|
|
265
|
-
bytesBuffered = 0;
|
|
266
|
-
|
|
267
|
-
// signal to the outside our detected encoding and final decoder stream
|
|
268
|
-
resolve({
|
|
269
|
-
stream: target,
|
|
270
|
-
detected
|
|
271
|
-
});
|
|
272
|
-
} catch (error) {
|
|
273
|
-
reject(error);
|
|
274
|
-
}
|
|
275
|
-
};
|
|
276
|
-
|
|
277
|
-
// Stream error: forward to target
|
|
278
|
-
source.on('error', error => target.error(error));
|
|
279
|
-
|
|
280
|
-
// Stream data
|
|
281
|
-
source.on('data', async chunk => {
|
|
282
|
-
|
|
283
|
-
// if the decoder is ready, we just write directly
|
|
284
|
-
if (decoder) {
|
|
285
|
-
target.write(decoder.write(Buffer.from(chunk.buffer)));
|
|
286
|
-
} else {
|
|
287
|
-
bufferedChunks.push(chunk);
|
|
288
|
-
bytesBuffered += chunk.byteLength;
|
|
289
|
-
|
|
290
|
-
// buffered enough data for encoding detection, create stream
|
|
291
|
-
if (bytesBuffered >= minBytesRequiredForDetection) {
|
|
292
|
-
|
|
293
|
-
// pause stream here until the decoder is ready
|
|
294
|
-
source.pause();
|
|
295
|
-
|
|
296
|
-
await createDecoder();
|
|
297
|
-
|
|
298
|
-
// resume stream now that decoder is ready but
|
|
299
|
-
// outside of this stack to reduce recursion
|
|
300
|
-
setTimeout(() => source.resume());
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
});
|
|
304
|
-
|
|
305
|
-
// Stream end
|
|
306
|
-
source.on('end', async () => {
|
|
307
|
-
|
|
308
|
-
// we were still waiting for data to do the encoding
|
|
309
|
-
// detection. thus, wrap up starting the stream even
|
|
310
|
-
// without all the data to get things going
|
|
311
|
-
if (!decoder) {
|
|
312
|
-
await createDecoder();
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// end the target with the remainders of the decoder
|
|
316
|
-
target.end(decoder?.end());
|
|
317
|
-
});
|
|
318
|
-
});
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
encodeStream(value: string | Readable<string>, options?: ResourceEncoding): Promise<BinaryBuffer | BinaryBufferReadable>;
|
|
322
|
-
encodeStream(value?: string | Readable<string>, options?: ResourceEncoding): Promise<BinaryBuffer | BinaryBufferReadable | undefined>;
|
|
323
|
-
async encodeStream(value: string | Readable<string> | undefined, options?: ResourceEncoding): Promise<BinaryBuffer | BinaryBufferReadable | undefined> {
|
|
324
|
-
let encoding = options?.encoding;
|
|
325
|
-
const addBOM = options?.hasBOM;
|
|
326
|
-
encoding = this.toIconvEncoding(encoding);
|
|
327
|
-
if (encoding === UTF8 && !addBOM) {
|
|
328
|
-
return value === undefined ? undefined : typeof value === 'string' ?
|
|
329
|
-
BinaryBuffer.fromString(value) : BinaryBufferReadable.fromReadable(value);
|
|
330
|
-
}
|
|
331
|
-
|
|
332
|
-
value = value || '';
|
|
333
|
-
const readable = typeof value === 'string' ? Readable.fromString(value) : value;
|
|
334
|
-
const encoder = iconv.getEncoder(encoding, { addBOM });
|
|
335
|
-
|
|
336
|
-
let bytesWritten = false;
|
|
337
|
-
let done = false;
|
|
338
|
-
|
|
339
|
-
return {
|
|
340
|
-
read(): BinaryBuffer | null {
|
|
341
|
-
if (done) {
|
|
342
|
-
return null;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
const chunk = readable.read();
|
|
346
|
-
if (typeof chunk !== 'string') {
|
|
347
|
-
done = true;
|
|
348
|
-
|
|
349
|
-
// If we are instructed to add a BOM but we detect that no
|
|
350
|
-
// bytes have been written, we must ensure to return the BOM
|
|
351
|
-
// ourselves so that we comply with the contract.
|
|
352
|
-
if (!bytesWritten && addBOM) {
|
|
353
|
-
switch (encoding) {
|
|
354
|
-
case UTF8:
|
|
355
|
-
case UTF8_with_bom:
|
|
356
|
-
return BinaryBuffer.wrap(Uint8Array.from(UTF8_BOM));
|
|
357
|
-
case UTF16be:
|
|
358
|
-
return BinaryBuffer.wrap(Uint8Array.from(UTF16be_BOM));
|
|
359
|
-
case UTF16le:
|
|
360
|
-
return BinaryBuffer.wrap(Uint8Array.from(UTF16le_BOM));
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
|
|
364
|
-
const leftovers = encoder.end();
|
|
365
|
-
if (leftovers && leftovers.length > 0) {
|
|
366
|
-
bytesWritten = true;
|
|
367
|
-
return BinaryBuffer.wrap(leftovers);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
return null;
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
bytesWritten = true;
|
|
374
|
-
|
|
375
|
-
return BinaryBuffer.wrap(encoder.write(chunk));
|
|
376
|
-
}
|
|
377
|
-
};
|
|
378
|
-
}
|
|
379
|
-
|
|
380
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2020 TypeFox and others.
|
|
3
|
+
//
|
|
4
|
+
// This program and the accompanying materials are made available under the
|
|
5
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
6
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
7
|
+
//
|
|
8
|
+
// This Source Code may also be made available under the following Secondary
|
|
9
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
10
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
11
|
+
// with the GNU Classpath Exception which is available at
|
|
12
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
13
|
+
//
|
|
14
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
15
|
+
// *****************************************************************************
|
|
16
|
+
/*---------------------------------------------------------------------------------------------
|
|
17
|
+
* Copyright (c) Microsoft Corporation. All rights reserved.
|
|
18
|
+
* Licensed under the MIT License. See License.txt in the project root for license information.
|
|
19
|
+
*--------------------------------------------------------------------------------------------*/
|
|
20
|
+
// based on https://github.com/microsoft/vscode/blob/04c36be045a94fee58e5f8992d3e3fd980294a84/src/vs/workbench/services/textfile/common/encoding.ts
|
|
21
|
+
|
|
22
|
+
/* eslint-disable no-null/no-null */
|
|
23
|
+
|
|
24
|
+
import * as iconv from 'iconv-lite';
|
|
25
|
+
import { Buffer } from 'safer-buffer';
|
|
26
|
+
import { injectable } from 'inversify';
|
|
27
|
+
import { BinaryBuffer, BinaryBufferReadableStream, BinaryBufferReadable } from './buffer';
|
|
28
|
+
import { UTF8, UTF8_with_bom, UTF16be, UTF16le, UTF16be_BOM, UTF16le_BOM, UTF8_BOM } from './encodings';
|
|
29
|
+
import { newWriteableStream, ReadableStream, Readable } from './stream';
|
|
30
|
+
|
|
31
|
+
const ZERO_BYTE_DETECTION_BUFFER_MAX_LEN = 512; // number of bytes to look at to decide about a file being binary or not
|
|
32
|
+
const NO_ENCODING_GUESS_MIN_BYTES = 512; // when not auto guessing the encoding, small number of bytes are enough
|
|
33
|
+
const AUTO_ENCODING_GUESS_MIN_BYTES = 512 * 8; // with auto guessing we want a lot more content to be read for guessing
|
|
34
|
+
const AUTO_ENCODING_GUESS_MAX_BYTES = 512 * 128; // set an upper limit for the number of bytes we pass on to jschardet
|
|
35
|
+
|
|
36
|
+
// we explicitly ignore a specific set of encodings from auto guessing
|
|
37
|
+
// - ASCII: we never want this encoding (most UTF-8 files would happily detect as
|
|
38
|
+
// ASCII files and then you could not type non-ASCII characters anymore)
|
|
39
|
+
// - UTF-16: we have our own detection logic for UTF-16
|
|
40
|
+
// - UTF-32: we do not support this encoding in VSCode
|
|
41
|
+
const IGNORE_ENCODINGS = ['ascii', 'utf-16', 'utf-32'];
|
|
42
|
+
|
|
43
|
+
export interface ResourceEncoding {
|
|
44
|
+
encoding: string
|
|
45
|
+
hasBOM: boolean
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
export interface DetectedEncoding {
|
|
49
|
+
encoding?: string
|
|
50
|
+
seemsBinary?: boolean
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export interface DecodeStreamOptions {
|
|
54
|
+
guessEncoding?: boolean;
|
|
55
|
+
minBytesRequiredForDetection?: number;
|
|
56
|
+
|
|
57
|
+
overwriteEncoding(detectedEncoding: string | undefined): Promise<string>;
|
|
58
|
+
}
|
|
59
|
+
export interface DecodeStreamResult {
|
|
60
|
+
stream: ReadableStream<string>;
|
|
61
|
+
detected: DetectedEncoding;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
@injectable()
|
|
65
|
+
export class EncodingService {
|
|
66
|
+
|
|
67
|
+
encode(value: string, options?: ResourceEncoding): BinaryBuffer {
|
|
68
|
+
let encoding = options?.encoding;
|
|
69
|
+
const addBOM = options?.hasBOM;
|
|
70
|
+
encoding = this.toIconvEncoding(encoding);
|
|
71
|
+
if (encoding === UTF8 && !addBOM) {
|
|
72
|
+
return BinaryBuffer.fromString(value);
|
|
73
|
+
}
|
|
74
|
+
const buffer = iconv.encode(value, encoding, { addBOM });
|
|
75
|
+
return BinaryBuffer.wrap(buffer);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
decode(value: BinaryBuffer, encoding?: string): string {
|
|
79
|
+
const buffer = Buffer.from(value.buffer);
|
|
80
|
+
encoding = this.toIconvEncoding(encoding);
|
|
81
|
+
return iconv.decode(buffer, encoding);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
exists(encoding: string): boolean {
|
|
85
|
+
encoding = this.toIconvEncoding(encoding);
|
|
86
|
+
return iconv.encodingExists(encoding);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
toIconvEncoding(encoding?: string): string {
|
|
90
|
+
if (encoding === UTF8_with_bom || !encoding) {
|
|
91
|
+
return UTF8; // iconv does not distinguish UTF 8 with or without BOM, so we need to help it
|
|
92
|
+
}
|
|
93
|
+
return encoding;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async toResourceEncoding(encoding: string, options: {
|
|
97
|
+
overwriteEncoding?: boolean,
|
|
98
|
+
read: (length: number) => Promise<Uint8Array>
|
|
99
|
+
}): Promise<ResourceEncoding> {
|
|
100
|
+
// Some encodings come with a BOM automatically
|
|
101
|
+
if (encoding === UTF16be || encoding === UTF16le || encoding === UTF8_with_bom) {
|
|
102
|
+
return { encoding, hasBOM: true };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Ensure that we preserve an existing BOM if found for UTF8
|
|
106
|
+
// unless we are instructed to overwrite the encoding
|
|
107
|
+
const overwriteEncoding = options?.overwriteEncoding;
|
|
108
|
+
if (!overwriteEncoding && encoding === UTF8) {
|
|
109
|
+
try {
|
|
110
|
+
// stream here to avoid fetching the whole content on write
|
|
111
|
+
const buffer = await options.read(UTF8_BOM.length);
|
|
112
|
+
if (this.detectEncodingByBOMFromBuffer(Buffer.from(buffer), buffer.byteLength) === UTF8_with_bom) {
|
|
113
|
+
return { encoding, hasBOM: true };
|
|
114
|
+
}
|
|
115
|
+
} catch (error) {
|
|
116
|
+
// ignore - file might not exist
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
return { encoding, hasBOM: false };
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async detectEncoding(data: BinaryBuffer, autoGuessEncoding?: boolean): Promise<DetectedEncoding> {
|
|
124
|
+
const buffer = Buffer.from(data.buffer);
|
|
125
|
+
const bytesRead = data.byteLength;
|
|
126
|
+
// Always first check for BOM to find out about encoding
|
|
127
|
+
let encoding = this.detectEncodingByBOMFromBuffer(buffer, bytesRead);
|
|
128
|
+
|
|
129
|
+
// Detect 0 bytes to see if file is binary or UTF-16 LE/BEÏ
|
|
130
|
+
// unless we already know that this file has a UTF-16 encoding
|
|
131
|
+
let seemsBinary = false;
|
|
132
|
+
if (encoding !== UTF16be && encoding !== UTF16le && buffer) {
|
|
133
|
+
let couldBeUTF16LE = true; // e.g. 0xAA 0x00
|
|
134
|
+
let couldBeUTF16BE = true; // e.g. 0x00 0xAA
|
|
135
|
+
let containsZeroByte = false;
|
|
136
|
+
|
|
137
|
+
// This is a simplified guess to detect UTF-16 BE or LE by just checking if
|
|
138
|
+
// the first 512 bytes have the 0-byte at a specific location. For UTF-16 LE
|
|
139
|
+
// this would be the odd byte index and for UTF-16 BE the even one.
|
|
140
|
+
// Note: this can produce false positives (a binary file that uses a 2-byte
|
|
141
|
+
// encoding of the same format as UTF-16) and false negatives (a UTF-16 file
|
|
142
|
+
// that is using 4 bytes to encode a character).
|
|
143
|
+
for (let i = 0; i < bytesRead && i < ZERO_BYTE_DETECTION_BUFFER_MAX_LEN; i++) {
|
|
144
|
+
const isEndian = (i % 2 === 1); // assume 2-byte sequences typical for UTF-16
|
|
145
|
+
const isZeroByte = (buffer.readUInt8(i) === 0);
|
|
146
|
+
|
|
147
|
+
if (isZeroByte) {
|
|
148
|
+
containsZeroByte = true;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// UTF-16 LE: expect e.g. 0xAA 0x00
|
|
152
|
+
if (couldBeUTF16LE && (isEndian && !isZeroByte || !isEndian && isZeroByte)) {
|
|
153
|
+
couldBeUTF16LE = false;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
// UTF-16 BE: expect e.g. 0x00 0xAA
|
|
157
|
+
if (couldBeUTF16BE && (isEndian && isZeroByte || !isEndian && !isZeroByte)) {
|
|
158
|
+
couldBeUTF16BE = false;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
// Return if this is neither UTF16-LE nor UTF16-BE and thus treat as binary
|
|
162
|
+
if (isZeroByte && !couldBeUTF16LE && !couldBeUTF16BE) {
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
// Handle case of 0-byte included
|
|
168
|
+
if (containsZeroByte) {
|
|
169
|
+
if (couldBeUTF16LE) {
|
|
170
|
+
encoding = UTF16le;
|
|
171
|
+
} else if (couldBeUTF16BE) {
|
|
172
|
+
encoding = UTF16be;
|
|
173
|
+
} else {
|
|
174
|
+
seemsBinary = true;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Auto guess encoding if configured
|
|
180
|
+
if (autoGuessEncoding && !seemsBinary && !encoding && buffer) {
|
|
181
|
+
const guessedEncoding = await this.guessEncodingByBuffer(buffer.slice(0, bytesRead));
|
|
182
|
+
return {
|
|
183
|
+
seemsBinary: false,
|
|
184
|
+
encoding: guessedEncoding
|
|
185
|
+
};
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
return { seemsBinary, encoding };
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
protected detectEncodingByBOMFromBuffer(buffer: Buffer, bytesRead: number): typeof UTF8_with_bom | typeof UTF16le | typeof UTF16be | undefined {
|
|
192
|
+
if (!buffer || bytesRead < UTF16be_BOM.length) {
|
|
193
|
+
return undefined;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const b0 = buffer.readUInt8(0);
|
|
197
|
+
const b1 = buffer.readUInt8(1);
|
|
198
|
+
|
|
199
|
+
// UTF-16 BE
|
|
200
|
+
if (b0 === UTF16be_BOM[0] && b1 === UTF16be_BOM[1]) {
|
|
201
|
+
return UTF16be;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
// UTF-16 LE
|
|
205
|
+
if (b0 === UTF16le_BOM[0] && b1 === UTF16le_BOM[1]) {
|
|
206
|
+
return UTF16le;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
if (bytesRead < UTF8_BOM.length) {
|
|
210
|
+
return undefined;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
const b2 = buffer.readUInt8(2);
|
|
214
|
+
|
|
215
|
+
// UTF-8
|
|
216
|
+
if (b0 === UTF8_BOM[0] && b1 === UTF8_BOM[1] && b2 === UTF8_BOM[2]) {
|
|
217
|
+
return UTF8_with_bom;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
return undefined;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
protected async guessEncodingByBuffer(buffer: Buffer): Promise<string | undefined> {
|
|
224
|
+
const jschardet = await import('jschardet');
|
|
225
|
+
|
|
226
|
+
const guessed = jschardet.detect(buffer.slice(0, AUTO_ENCODING_GUESS_MAX_BYTES)); // ensure to limit buffer for guessing due to https://github.com/aadsm/jschardet/issues/53
|
|
227
|
+
if (!guessed || !guessed.encoding) {
|
|
228
|
+
return undefined;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const enc = guessed.encoding.toLowerCase();
|
|
232
|
+
if (0 <= IGNORE_ENCODINGS.indexOf(enc)) {
|
|
233
|
+
return undefined; // see comment above why we ignore some encodings
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
return this.toIconvEncoding(guessed.encoding);
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
decodeStream(source: BinaryBufferReadableStream, options: DecodeStreamOptions): Promise<DecodeStreamResult> {
|
|
240
|
+
const minBytesRequiredForDetection = options.minBytesRequiredForDetection ?? options.guessEncoding ? AUTO_ENCODING_GUESS_MIN_BYTES : NO_ENCODING_GUESS_MIN_BYTES;
|
|
241
|
+
|
|
242
|
+
return new Promise<DecodeStreamResult>((resolve, reject) => {
|
|
243
|
+
const target = newWriteableStream<string>(strings => strings.join(''));
|
|
244
|
+
|
|
245
|
+
const bufferedChunks: BinaryBuffer[] = [];
|
|
246
|
+
let bytesBuffered = 0;
|
|
247
|
+
|
|
248
|
+
let decoder: iconv.DecoderStream | undefined = undefined;
|
|
249
|
+
|
|
250
|
+
const createDecoder = async () => {
|
|
251
|
+
try {
|
|
252
|
+
|
|
253
|
+
// detect encoding from buffer
|
|
254
|
+
const detected = await this.detectEncoding(BinaryBuffer.concat(bufferedChunks), options.guessEncoding);
|
|
255
|
+
|
|
256
|
+
// ensure to respect overwrite of encoding
|
|
257
|
+
detected.encoding = await options.overwriteEncoding(detected.encoding);
|
|
258
|
+
|
|
259
|
+
// decode and write buffered content
|
|
260
|
+
decoder = iconv.getDecoder(this.toIconvEncoding(detected.encoding));
|
|
261
|
+
const decoded = decoder.write(Buffer.from(BinaryBuffer.concat(bufferedChunks).buffer));
|
|
262
|
+
target.write(decoded);
|
|
263
|
+
|
|
264
|
+
bufferedChunks.length = 0;
|
|
265
|
+
bytesBuffered = 0;
|
|
266
|
+
|
|
267
|
+
// signal to the outside our detected encoding and final decoder stream
|
|
268
|
+
resolve({
|
|
269
|
+
stream: target,
|
|
270
|
+
detected
|
|
271
|
+
});
|
|
272
|
+
} catch (error) {
|
|
273
|
+
reject(error);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
|
|
277
|
+
// Stream error: forward to target
|
|
278
|
+
source.on('error', error => target.error(error));
|
|
279
|
+
|
|
280
|
+
// Stream data
|
|
281
|
+
source.on('data', async chunk => {
|
|
282
|
+
|
|
283
|
+
// if the decoder is ready, we just write directly
|
|
284
|
+
if (decoder) {
|
|
285
|
+
target.write(decoder.write(Buffer.from(chunk.buffer)));
|
|
286
|
+
} else {
|
|
287
|
+
bufferedChunks.push(chunk);
|
|
288
|
+
bytesBuffered += chunk.byteLength;
|
|
289
|
+
|
|
290
|
+
// buffered enough data for encoding detection, create stream
|
|
291
|
+
if (bytesBuffered >= minBytesRequiredForDetection) {
|
|
292
|
+
|
|
293
|
+
// pause stream here until the decoder is ready
|
|
294
|
+
source.pause();
|
|
295
|
+
|
|
296
|
+
await createDecoder();
|
|
297
|
+
|
|
298
|
+
// resume stream now that decoder is ready but
|
|
299
|
+
// outside of this stack to reduce recursion
|
|
300
|
+
setTimeout(() => source.resume());
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
});
|
|
304
|
+
|
|
305
|
+
// Stream end
|
|
306
|
+
source.on('end', async () => {
|
|
307
|
+
|
|
308
|
+
// we were still waiting for data to do the encoding
|
|
309
|
+
// detection. thus, wrap up starting the stream even
|
|
310
|
+
// without all the data to get things going
|
|
311
|
+
if (!decoder) {
|
|
312
|
+
await createDecoder();
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
// end the target with the remainders of the decoder
|
|
316
|
+
target.end(decoder?.end());
|
|
317
|
+
});
|
|
318
|
+
});
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
encodeStream(value: string | Readable<string>, options?: ResourceEncoding): Promise<BinaryBuffer | BinaryBufferReadable>;
|
|
322
|
+
encodeStream(value?: string | Readable<string>, options?: ResourceEncoding): Promise<BinaryBuffer | BinaryBufferReadable | undefined>;
|
|
323
|
+
async encodeStream(value: string | Readable<string> | undefined, options?: ResourceEncoding): Promise<BinaryBuffer | BinaryBufferReadable | undefined> {
|
|
324
|
+
let encoding = options?.encoding;
|
|
325
|
+
const addBOM = options?.hasBOM;
|
|
326
|
+
encoding = this.toIconvEncoding(encoding);
|
|
327
|
+
if (encoding === UTF8 && !addBOM) {
|
|
328
|
+
return value === undefined ? undefined : typeof value === 'string' ?
|
|
329
|
+
BinaryBuffer.fromString(value) : BinaryBufferReadable.fromReadable(value);
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
value = value || '';
|
|
333
|
+
const readable = typeof value === 'string' ? Readable.fromString(value) : value;
|
|
334
|
+
const encoder = iconv.getEncoder(encoding, { addBOM });
|
|
335
|
+
|
|
336
|
+
let bytesWritten = false;
|
|
337
|
+
let done = false;
|
|
338
|
+
|
|
339
|
+
return {
|
|
340
|
+
read(): BinaryBuffer | null {
|
|
341
|
+
if (done) {
|
|
342
|
+
return null;
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
const chunk = readable.read();
|
|
346
|
+
if (typeof chunk !== 'string') {
|
|
347
|
+
done = true;
|
|
348
|
+
|
|
349
|
+
// If we are instructed to add a BOM but we detect that no
|
|
350
|
+
// bytes have been written, we must ensure to return the BOM
|
|
351
|
+
// ourselves so that we comply with the contract.
|
|
352
|
+
if (!bytesWritten && addBOM) {
|
|
353
|
+
switch (encoding) {
|
|
354
|
+
case UTF8:
|
|
355
|
+
case UTF8_with_bom:
|
|
356
|
+
return BinaryBuffer.wrap(Uint8Array.from(UTF8_BOM));
|
|
357
|
+
case UTF16be:
|
|
358
|
+
return BinaryBuffer.wrap(Uint8Array.from(UTF16be_BOM));
|
|
359
|
+
case UTF16le:
|
|
360
|
+
return BinaryBuffer.wrap(Uint8Array.from(UTF16le_BOM));
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const leftovers = encoder.end();
|
|
365
|
+
if (leftovers && leftovers.length > 0) {
|
|
366
|
+
bytesWritten = true;
|
|
367
|
+
return BinaryBuffer.wrap(leftovers);
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
return null;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
bytesWritten = true;
|
|
374
|
+
|
|
375
|
+
return BinaryBuffer.wrap(encoder.write(chunk));
|
|
376
|
+
}
|
|
377
|
+
};
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
}
|