@theia/plugin-ext 1.53.0-next.4 → 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 +54 -54
- package/lib/common/plugin-api-rpc.d.ts +19 -4
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js +4 -2
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/common/rpc-protocol.d.ts +14 -13
- package/lib/common/rpc-protocol.d.ts.map +1 -1
- package/lib/common/rpc-protocol.js +56 -53
- package/lib/common/rpc-protocol.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin.d.ts +1 -0
- package/lib/hosted/browser/hosted-plugin.d.ts.map +1 -1
- package/lib/hosted/browser/hosted-plugin.js +22 -12
- package/lib/hosted/browser/hosted-plugin.js.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.d.ts.map +1 -1
- package/lib/hosted/node/scanners/scanner-theia.js +13 -1
- package/lib/hosted/node/scanners/scanner-theia.js.map +1 -1
- package/lib/main/browser/authentication-main.d.ts +6 -5
- package/lib/main/browser/authentication-main.d.ts.map +1 -1
- package/lib/main/browser/authentication-main.js +15 -9
- package/lib/main/browser/authentication-main.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts +9 -3
- package/lib/main/browser/custom-editors/custom-editor-opener.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.js +120 -31
- package/lib/main/browser/custom-editors/custom-editor-opener.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-widget.d.ts +7 -4
- package/lib/main/browser/custom-editors/custom-editor-widget.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-widget.js +21 -7
- package/lib/main/browser/custom-editors/custom-editor-widget.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editors-main.d.ts +3 -4
- package/lib/main/browser/custom-editors/custom-editors-main.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editors-main.js +5 -55
- package/lib/main/browser/custom-editors/custom-editors-main.js.map +1 -1
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.d.ts +4 -3
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.js +24 -16
- package/lib/main/browser/custom-editors/plugin-custom-editor-registry.js.map +1 -1
- package/lib/main/browser/main-context.d.ts.map +1 -1
- package/lib/main/browser/main-context.js +3 -0
- package/lib/main/browser/main-context.js.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.d.ts.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.js +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.js.map +1 -1
- package/lib/main/browser/menus/plugin-menu-command-adapter.d.ts +1 -0
- package/lib/main/browser/menus/plugin-menu-command-adapter.d.ts.map +1 -1
- package/lib/main/browser/menus/plugin-menu-command-adapter.js +22 -1
- package/lib/main/browser/menus/plugin-menu-command-adapter.js.map +1 -1
- package/lib/main/browser/menus/vscode-theia-menu-mappings.d.ts +2 -2
- package/lib/main/browser/menus/vscode-theia-menu-mappings.d.ts.map +1 -1
- package/lib/main/browser/menus/vscode-theia-menu-mappings.js +2 -0
- package/lib/main/browser/menus/vscode-theia-menu-mappings.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-and-editors-main.js +1 -1
- package/lib/main/browser/notebooks/notebook-documents-and-editors-main.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-main.d.ts.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-main.js +22 -3
- package/lib/main/browser/notebooks/notebook-documents-main.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-editors-main.d.ts +1 -1
- package/lib/main/browser/notebooks/notebook-editors-main.d.ts.map +1 -1
- package/lib/main/browser/notebooks/notebook-editors-main.js +16 -2
- package/lib/main/browser/notebooks/notebook-editors-main.js.map +1 -1
- package/lib/main/browser/notebooks/renderers/cell-output-webview.d.ts +1 -1
- package/lib/main/browser/notebooks/renderers/cell-output-webview.d.ts.map +1 -1
- package/lib/main/browser/notebooks/renderers/cell-output-webview.js +152 -77
- package/lib/main/browser/notebooks/renderers/cell-output-webview.js.map +1 -1
- package/lib/main/browser/notebooks/renderers/output-webview-internal.d.ts.map +1 -1
- package/lib/main/browser/notebooks/renderers/output-webview-internal.js +38 -19
- package/lib/main/browser/notebooks/renderers/output-webview-internal.js.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.d.ts.map +1 -1
- package/lib/main/browser/plugin-ext-frontend-module.js +18 -0
- package/lib/main/browser/plugin-ext-frontend-module.js.map +1 -1
- package/lib/main/browser/plugin-icon-theme-service.js +20 -20
- package/lib/main/browser/plugin-shared-style.js +14 -14
- package/lib/main/browser/uri-main.d.ts +16 -0
- package/lib/main/browser/uri-main.d.ts.map +1 -0
- package/lib/main/browser/uri-main.js +64 -0
- package/lib/main/browser/uri-main.js.map +1 -0
- package/lib/main/browser/view/plugin-view-registry.js +3 -3
- package/lib/main/browser/webview/webview-frontend-security-warnings.js +2 -2
- package/lib/main/browser/webview/webview-secondary-window-support.js +10 -10
- package/lib/main/browser/webview/webview.d.ts +1 -3
- package/lib/main/browser/webview/webview.d.ts.map +1 -1
- package/lib/main/browser/webview/webview.js +5 -4
- package/lib/main/browser/webview/webview.js.map +1 -1
- package/lib/main/browser/webviews-main.d.ts.map +1 -1
- package/lib/main/browser/webviews-main.js +6 -1
- package/lib/main/browser/webviews-main.js.map +1 -1
- package/lib/main/browser/workspace-main.d.ts +2 -0
- package/lib/main/browser/workspace-main.d.ts.map +1 -1
- package/lib/main/node/plugin-service.d.ts +1 -1
- package/lib/main/node/webview-backend-security-warnings.js +6 -6
- package/lib/plugin/authentication-ext.d.ts +3 -2
- package/lib/plugin/authentication-ext.d.ts.map +1 -1
- package/lib/plugin/authentication-ext.js +8 -5
- package/lib/plugin/authentication-ext.js.map +1 -1
- package/lib/plugin/custom-editors.d.ts +2 -4
- package/lib/plugin/custom-editors.d.ts.map +1 -1
- package/lib/plugin/custom-editors.js +5 -7
- package/lib/plugin/custom-editors.js.map +1 -1
- package/lib/plugin/env.d.ts +2 -0
- package/lib/plugin/env.d.ts.map +1 -1
- package/lib/plugin/env.js +4 -1
- package/lib/plugin/env.js.map +1 -1
- package/lib/plugin/known-commands.d.ts.map +1 -1
- package/lib/plugin/known-commands.js +1 -0
- package/lib/plugin/known-commands.js.map +1 -1
- package/lib/plugin/languages.d.ts +1 -0
- package/lib/plugin/languages.d.ts.map +1 -1
- package/lib/plugin/notebook/notebook-kernels.d.ts +2 -0
- package/lib/plugin/notebook/notebook-kernels.d.ts.map +1 -1
- package/lib/plugin/plugin-context.d.ts.map +1 -1
- package/lib/plugin/plugin-context.js +17 -6
- package/lib/plugin/plugin-context.js.map +1 -1
- package/lib/plugin/plugin-manager.d.ts.map +1 -1
- package/lib/plugin/plugin-manager.js +2 -1
- package/lib/plugin/plugin-manager.js.map +1 -1
- package/lib/plugin/scm.d.ts +1 -0
- package/lib/plugin/scm.d.ts.map +1 -1
- package/lib/plugin/terminal-ext.d.ts +3 -0
- package/lib/plugin/terminal-ext.d.ts.map +1 -1
- package/lib/plugin/terminal-ext.js +2 -0
- package/lib/plugin/terminal-ext.js.map +1 -1
- package/lib/plugin/type-converters.d.ts +6 -0
- package/lib/plugin/type-converters.d.ts.map +1 -1
- package/lib/plugin/type-converters.js +24 -3
- package/lib/plugin/type-converters.js.map +1 -1
- package/lib/plugin/types-impl.d.ts +8 -2
- package/lib/plugin/types-impl.d.ts.map +1 -1
- package/lib/plugin/types-impl.js +9 -1
- package/lib/plugin/types-impl.js.map +1 -1
- package/lib/plugin/uri-ext.d.ts +37 -0
- package/lib/plugin/uri-ext.d.ts.map +1 -0
- package/lib/plugin/uri-ext.js +50 -0
- package/lib/plugin/uri-ext.js.map +1 -0
- package/lib/plugin/webviews.js +1 -1
- package/lib/plugin/webviews.js.map +1 -1
- package/lib/plugin/workspace.d.ts +4 -0
- package/lib/plugin/workspace.d.ts.map +1 -1
- package/package.json +29 -29
- package/src/common/arrays.ts +70 -70
- package/src/common/assert.ts +23 -23
- package/src/common/cache.ts +51 -51
- package/src/common/character-classifier.ts +73 -73
- package/src/common/collections.ts +54 -54
- package/src/common/commands.ts +19 -19
- package/src/common/connection.ts +137 -137
- package/src/common/disposable-util.ts +39 -39
- package/src/common/editor-options.ts +74 -74
- package/src/common/env.ts +19 -19
- package/src/common/errors.ts +63 -63
- package/src/common/id-generator.ts +26 -26
- package/src/common/index.ts +24 -24
- package/src/common/language-pack-service.ts +34 -34
- package/src/common/link-computer.ts +354 -354
- package/src/common/object-identifier.ts +33 -33
- package/src/common/objects.ts +50 -50
- package/src/common/paths-util.ts +158 -158
- package/src/common/plugin-api-rpc-model.ts +907 -907
- package/src/common/plugin-api-rpc.ts +2752 -2738
- package/src/common/plugin-ext-api-contribution.ts +115 -115
- package/src/common/plugin-identifiers.ts +84 -84
- package/src/common/plugin-protocol.ts +1094 -1094
- package/src/common/reference-map.ts +38 -38
- package/src/common/rpc-protocol.ts +306 -310
- package/src/common/semantic-tokens-dto.ts +182 -182
- package/src/common/test-types.ts +154 -154
- package/src/common/types.ts +129 -129
- package/src/common/uint.ts +37 -37
- package/src/common/uri-components.ts +81 -81
- package/src/hosted/browser/hosted-plugin-watcher.ts +54 -54
- package/src/hosted/browser/hosted-plugin.ts +635 -624
- package/src/hosted/browser/plugin-worker.ts +52 -52
- package/src/hosted/browser/worker/debug-stub.ts +29 -29
- package/src/hosted/browser/worker/plugin-manifest-loader.ts +114 -114
- package/src/hosted/browser/worker/worker-env-ext.ts +40 -40
- package/src/hosted/browser/worker/worker-main.ts +212 -212
- package/src/hosted/browser/worker/worker-plugin-module.ts +80 -80
- package/src/hosted/common/hosted-plugin.ts +456 -456
- package/src/hosted/node/hosted-plugin-cli-contribution.ts +75 -75
- package/src/hosted/node/hosted-plugin-deployer-handler.ts +274 -274
- package/src/hosted/node/hosted-plugin-localization-service.ts +410 -410
- package/src/hosted/node/hosted-plugin-process.ts +248 -248
- package/src/hosted/node/hosted-plugin-protocol.ts +49 -49
- package/src/hosted/node/hosted-plugin.ts +116 -116
- package/src/hosted/node/metadata-scanner.ts +64 -64
- package/src/hosted/node/plugin-activation-events.ts +112 -112
- package/src/hosted/node/plugin-ext-hosted-backend-module.ts +94 -94
- package/src/hosted/node/plugin-host-module.ts +69 -69
- package/src/hosted/node/plugin-host-proxy.ts +82 -82
- package/src/hosted/node/plugin-host-rpc.ts +377 -377
- package/src/hosted/node/plugin-host.ts +110 -110
- package/src/hosted/node/plugin-language-pack-service.ts +43 -43
- package/src/hosted/node/plugin-manifest-loader.ts +32 -32
- package/src/hosted/node/plugin-reader.ts +136 -136
- package/src/hosted/node/plugin-service.ts +197 -197
- package/src/hosted/node/scanners/backend-init-theia.ts +71 -71
- package/src/hosted/node/scanners/file-plugin-uri-factory.ts +32 -32
- package/src/hosted/node/scanners/grammars-reader.ts +57 -57
- package/src/hosted/node/scanners/plugin-uri-factory.ts +33 -33
- package/src/hosted/node/scanners/scanner-theia.ts +963 -952
- package/src/hosted/node-electron/plugin-ext-hosted-electron-backend-module.ts +26 -26
- package/src/hosted/node-electron/scanner-theia-electron.ts +32 -32
- package/src/main/browser/authentication-main.ts +401 -388
- package/src/main/browser/clipboard-main.ts +38 -38
- package/src/main/browser/command-registry-main.ts +130 -130
- package/src/main/browser/commands.ts +104 -104
- package/src/main/browser/comments/comment-glyph-widget.ts +66 -66
- package/src/main/browser/comments/comment-thread-widget.tsx +696 -696
- package/src/main/browser/comments/comments-context-key-service.ts +68 -68
- package/src/main/browser/comments/comments-contribution.ts +268 -268
- package/src/main/browser/comments/comments-decorator.ts +110 -110
- package/src/main/browser/comments/comments-main.ts +482 -482
- package/src/main/browser/comments/comments-service.ts +205 -205
- package/src/main/browser/custom-editors/custom-editor-opener.tsx +205 -105
- package/src/main/browser/custom-editors/custom-editor-service.ts +108 -108
- package/src/main/browser/custom-editors/custom-editor-undo-redo-handler.ts +41 -41
- package/src/main/browser/custom-editors/custom-editor-widget-factory.ts +44 -44
- package/src/main/browser/custom-editors/custom-editor-widget.ts +127 -118
- package/src/main/browser/custom-editors/custom-editors-main.ts +526 -585
- package/src/main/browser/custom-editors/plugin-custom-editor-registry.ts +126 -120
- package/src/main/browser/data-transfer/data-transfer-type-converters.ts +68 -68
- package/src/main/browser/debug/debug-main.ts +397 -397
- package/src/main/browser/debug/plugin-debug-adapter-contribution.ts +48 -48
- package/src/main/browser/debug/plugin-debug-configuration-provider.ts +63 -63
- package/src/main/browser/debug/plugin-debug-service.ts +427 -427
- package/src/main/browser/debug/plugin-debug-session-contribution-registry.ts +76 -76
- package/src/main/browser/debug/plugin-debug-session-factory.ts +115 -115
- package/src/main/browser/decorations/decorations-main.ts +146 -146
- package/src/main/browser/dialogs/modal-notification.ts +112 -112
- package/src/main/browser/dialogs/style/modal-notification.css +123 -123
- package/src/main/browser/dialogs-main.ts +185 -185
- package/src/main/browser/documents-main.ts +275 -275
- package/src/main/browser/editors-and-documents-main.ts +425 -425
- package/src/main/browser/env-main.ts +60 -60
- package/src/main/browser/file-system-main-impl.ts +267 -267
- package/src/main/browser/hierarchy/hierarchy-types-converters.ts +189 -189
- package/src/main/browser/keybindings/keybindings-contribution-handler.ts +66 -66
- package/src/main/browser/label-service-main.ts +51 -51
- package/src/main/browser/languages-main.ts +1439 -1439
- package/src/main/browser/localization-main.ts +34 -34
- package/src/main/browser/main-context.ts +210 -206
- package/src/main/browser/main-file-system-event-service.ts +76 -76
- package/src/main/browser/menus/menus-contribution-handler.ts +172 -171
- package/src/main/browser/menus/plugin-menu-command-adapter.ts +358 -337
- package/src/main/browser/menus/vscode-theia-menu-mappings.ts +118 -116
- package/src/main/browser/message-registry-main.ts +43 -43
- package/src/main/browser/notebooks/notebook-documents-and-editors-main.ts +249 -249
- package/src/main/browser/notebooks/notebook-documents-main.ts +202 -182
- package/src/main/browser/notebooks/notebook-dto.ts +131 -131
- package/src/main/browser/notebooks/notebook-editors-main.ts +88 -75
- package/src/main/browser/notebooks/notebook-kernels-main.ts +339 -339
- package/src/main/browser/notebooks/notebook-renderers-main.ts +47 -47
- package/src/main/browser/notebooks/notebooks-main.ts +164 -164
- package/src/main/browser/notebooks/renderers/cell-output-webview.tsx +452 -375
- package/src/main/browser/notebooks/renderers/output-webview-internal.ts +636 -613
- package/src/main/browser/notebooks/renderers/webview-communication.ts +107 -107
- package/src/main/browser/notification-main.ts +26 -26
- package/src/main/browser/output-channel-registry-main.ts +53 -53
- package/src/main/browser/plugin-authentication-service.ts +71 -71
- package/src/main/browser/plugin-contribution-handler.ts +698 -698
- package/src/main/browser/plugin-ext-frontend-module.ts +291 -272
- package/src/main/browser/plugin-ext-widget.tsx +132 -132
- package/src/main/browser/plugin-frontend-contribution.ts +70 -70
- package/src/main/browser/plugin-frontend-view-contribution.ts +38 -38
- package/src/main/browser/plugin-icon-service.ts +92 -92
- package/src/main/browser/plugin-icon-theme-service.ts +625 -625
- package/src/main/browser/plugin-shared-style.ts +154 -154
- package/src/main/browser/plugin-storage.ts +55 -55
- package/src/main/browser/plugin-terminal-registry.ts +27 -27
- package/src/main/browser/preference-registry-main.ts +123 -123
- package/src/main/browser/quick-open-main.ts +367 -367
- package/src/main/browser/scm-main.ts +472 -472
- package/src/main/browser/secrets-main.ts +82 -82
- package/src/main/browser/selection-provider-command.ts +45 -45
- package/src/main/browser/status-bar-message-registry-main.ts +90 -90
- package/src/main/browser/style/comments.css +345 -345
- package/src/main/browser/style/index.css +84 -84
- package/src/main/browser/style/plugin-sidebar.css +73 -73
- package/src/main/browser/style/tree.css +54 -54
- package/src/main/browser/style/webview.css +55 -55
- package/src/main/browser/tabs/tabs-main.ts +384 -384
- package/src/main/browser/tasks-main.ts +268 -268
- package/src/main/browser/terminal-main.ts +370 -370
- package/src/main/browser/test-main.ts +632 -632
- package/src/main/browser/text-editor-main.ts +478 -478
- package/src/main/browser/text-editor-model-service.ts +111 -111
- package/src/main/browser/text-editors-main.ts +234 -234
- package/src/main/browser/theme-icon-override.ts +246 -246
- package/src/main/browser/theming-main.ts +42 -42
- package/src/main/browser/timeline-main.ts +80 -80
- package/src/main/browser/uri-main.ts +72 -0
- package/src/main/browser/view/dnd-file-content-store.ts +42 -42
- package/src/main/browser/view/plugin-tree-view-node-label-provider.ts +81 -81
- package/src/main/browser/view/plugin-view-registry.ts +967 -967
- package/src/main/browser/view/plugin-view-widget.ts +221 -221
- package/src/main/browser/view/tree-view-decorator-service.ts +51 -51
- package/src/main/browser/view/tree-view-widget.tsx +931 -931
- package/src/main/browser/view/tree-views-main.ts +205 -205
- package/src/main/browser/view/view-context-key-service.ts +64 -64
- package/src/main/browser/webview/pre/fake.html +14 -14
- package/src/main/browser/webview/pre/host.js +130 -130
- package/src/main/browser/webview/pre/index.html +17 -17
- package/src/main/browser/webview/pre/main.js +682 -682
- package/src/main/browser/webview/pre/service-worker.js +296 -295
- package/src/main/browser/webview/webview-context-keys.ts +62 -62
- package/src/main/browser/webview/webview-environment.ts +87 -87
- package/src/main/browser/webview/webview-frontend-security-warnings.ts +59 -59
- package/src/main/browser/webview/webview-preferences.ts +72 -72
- package/src/main/browser/webview/webview-resource-cache.ts +88 -88
- package/src/main/browser/webview/webview-secondary-window-support.ts +47 -47
- package/src/main/browser/webview/webview-theme-data-provider.ts +124 -124
- package/src/main/browser/webview/webview.ts +718 -719
- package/src/main/browser/webview-views/webview-views-main.ts +154 -154
- package/src/main/browser/webview-views/webview-views.ts +43 -43
- package/src/main/browser/webviews-main.ts +287 -282
- package/src/main/browser/window-activity-tracker.ts +96 -96
- package/src/main/browser/window-state-main.ts +85 -85
- package/src/main/browser/workspace-main.ts +424 -424
- package/src/main/common/basic-message-registry-main.ts +53 -53
- package/src/main/common/basic-notification-main.ts +86 -86
- package/src/main/common/env-main.ts +44 -44
- package/src/main/common/plugin-paths-protocol.ts +26 -26
- package/src/main/common/plugin-theia-environment.ts +36 -36
- package/src/main/common/webview-protocol.ts +28 -28
- package/src/main/electron-browser/plugin-ext-frontend-electron-module.ts +25 -25
- package/src/main/electron-browser/webview/electron-webview-widget-factory.ts +59 -59
- package/src/main/node/errors.spec.ts +37 -37
- package/src/main/node/handlers/plugin-theia-directory-handler.ts +137 -137
- package/src/main/node/handlers/plugin-theia-file-handler.ts +66 -66
- package/src/main/node/paths/const.ts +21 -21
- package/src/main/node/paths/plugin-paths-service.ts +163 -163
- package/src/main/node/plugin-cli-contribution.ts +85 -85
- package/src/main/node/plugin-deployer-contribution.ts +35 -35
- package/src/main/node/plugin-deployer-directory-handler-context-impl.ts +45 -45
- package/src/main/node/plugin-deployer-entry-impl.ts +132 -132
- package/src/main/node/plugin-deployer-file-handler-context-impl.ts +33 -33
- package/src/main/node/plugin-deployer-impl.ts +375 -375
- package/src/main/node/plugin-deployer-proxy-entry-impl.ts +96 -96
- package/src/main/node/plugin-deployer-resolver-context-impl.ts +55 -55
- package/src/main/node/plugin-ext-backend-module.ts +106 -106
- package/src/main/node/plugin-github-resolver.ts +139 -139
- package/src/main/node/plugin-http-resolver.ts +92 -92
- package/src/main/node/plugin-localization-server.ts +42 -42
- package/src/main/node/plugin-mgmt-cli-contribution.ts +64 -64
- package/src/main/node/plugin-remote-cli-contribution.ts +36 -36
- package/src/main/node/plugin-remote-copy-contribution.ts +36 -36
- package/src/main/node/plugin-server-handler.ts +69 -69
- package/src/main/node/plugin-service.ts +97 -97
- package/src/main/node/plugin-theia-deployer-participant.ts +32 -32
- package/src/main/node/plugin-uninstallation-manager.ts +74 -74
- package/src/main/node/plugins-key-value-storage.spec.ts +110 -110
- package/src/main/node/plugins-key-value-storage.ts +161 -161
- package/src/main/node/resolvers/local-directory-plugin-deployer-resolver.ts +37 -37
- package/src/main/node/resolvers/local-plugin-deployer-resolver.ts +56 -56
- package/src/main/node/temp-dir-util.ts +36 -36
- package/src/main/node/webview-backend-security-warnings.ts +45 -45
- package/src/main/style/status-bar.css +35 -35
- package/src/plugin/authentication-ext.ts +140 -136
- package/src/plugin/clipboard-ext.ts +43 -43
- package/src/plugin/command-registry.ts +219 -219
- package/src/plugin/comments.ts +549 -549
- package/src/plugin/custom-editors.ts +334 -336
- package/src/plugin/debug/debug-ext.ts +549 -549
- package/src/plugin/debug/plugin-debug-adapter-creator.ts +50 -50
- package/src/plugin/debug/plugin-debug-adapter-session.ts +106 -106
- package/src/plugin/debug/plugin-debug-adapter-tracker.ts +85 -85
- package/src/plugin/decorations.ts +140 -140
- package/src/plugin/dialogs.ts +96 -96
- package/src/plugin/document-data.ts +366 -366
- package/src/plugin/documents.ts +283 -283
- package/src/plugin/editors-and-documents.ts +176 -176
- package/src/plugin/env.ts +134 -129
- package/src/plugin/file-system-event-service-ext-impl.ts +256 -256
- package/src/plugin/file-system-ext-impl.ts +415 -415
- package/src/plugin/known-commands.spec.ts +50 -50
- package/src/plugin/known-commands.ts +429 -428
- package/src/plugin/label-service.ts +36 -36
- package/src/plugin/languages/call-hierarchy.ts +124 -124
- package/src/plugin/languages/code-action.ts +162 -162
- package/src/plugin/languages/color.ts +75 -75
- package/src/plugin/languages/completion.ts +183 -183
- package/src/plugin/languages/declaration.ts +72 -72
- package/src/plugin/languages/definition.ts +73 -73
- package/src/plugin/languages/diagnostics.ts +325 -325
- package/src/plugin/languages/document-drop-edit.ts +44 -44
- package/src/plugin/languages/document-formatting.ts +47 -47
- package/src/plugin/languages/document-highlight.ts +61 -61
- package/src/plugin/languages/evaluatable-expression.ts +47 -47
- package/src/plugin/languages/folding.ts +46 -46
- package/src/plugin/languages/hover.ts +58 -58
- package/src/plugin/languages/implementation.ts +73 -73
- package/src/plugin/languages/inlay-hints.ts +149 -149
- package/src/plugin/languages/inline-completion.ts +126 -126
- package/src/plugin/languages/inline-values.ts +50 -50
- package/src/plugin/languages/lens.ts +102 -102
- package/src/plugin/languages/link-provider.ts +81 -81
- package/src/plugin/languages/linked-editing-range.ts +48 -48
- package/src/plugin/languages/on-type-formatting.ts +50 -50
- package/src/plugin/languages/outline.ts +126 -126
- package/src/plugin/languages/range-formatting.ts +48 -48
- package/src/plugin/languages/reference.ts +58 -58
- package/src/plugin/languages/rename.ts +130 -130
- package/src/plugin/languages/selection-range.ts +80 -80
- package/src/plugin/languages/semantic-highlighting.ts +211 -211
- package/src/plugin/languages/signature.ts +82 -82
- package/src/plugin/languages/type-definition.ts +73 -73
- package/src/plugin/languages/type-hierarchy.ts +117 -117
- package/src/plugin/languages/util.ts +26 -26
- package/src/plugin/languages/workspace-symbol.ts +66 -66
- package/src/plugin/languages-utils.ts +68 -68
- package/src/plugin/languages.ts +1022 -1022
- package/src/plugin/localization-ext.ts +89 -89
- package/src/plugin/markdown-string.ts +115 -115
- package/src/plugin/message-registry.ts +70 -70
- package/src/plugin/node/debug/debug.spec.ts +98 -98
- package/src/plugin/node/debug/plugin-node-debug-adapter-creator.ts +167 -167
- package/src/plugin/node/env-node-ext.ts +64 -64
- package/src/plugin/node/plugin-container-module.ts +165 -165
- package/src/plugin/notebook/notebook-document.ts +446 -446
- package/src/plugin/notebook/notebook-documents.ts +58 -58
- package/src/plugin/notebook/notebook-editor.ts +116 -116
- package/src/plugin/notebook/notebook-editors.ts +71 -71
- package/src/plugin/notebook/notebook-kernels.ts +631 -631
- package/src/plugin/notebook/notebook-renderers.ts +71 -71
- package/src/plugin/notebook/notebooks.ts +449 -449
- package/src/plugin/notification.ts +80 -80
- package/src/plugin/output-channel/log-output-channel.ts +108 -108
- package/src/plugin/output-channel/output-channel-item.ts +73 -73
- package/src/plugin/output-channel-registry.ts +52 -52
- package/src/plugin/path.spec.ts +40 -40
- package/src/plugin/path.ts +68 -68
- package/src/plugin/plugin-context.ts +1606 -1595
- package/src/plugin/plugin-icon-path.ts +53 -53
- package/src/plugin/plugin-manager.ts +508 -507
- package/src/plugin/plugin-storage.ts +138 -138
- package/src/plugin/preference-registry.spec.ts +288 -288
- package/src/plugin/preference-registry.ts +335 -335
- package/src/plugin/prefix-sum-computer.ts +218 -218
- package/src/plugin/quick-open.ts +735 -735
- package/src/plugin/scm.ts +919 -919
- package/src/plugin/secrets-ext.ts +104 -104
- package/src/plugin/status-bar/status-bar-item.ts +193 -193
- package/src/plugin/status-bar-message-registry.ts +103 -103
- package/src/plugin/tabs.ts +431 -431
- package/src/plugin/tasks/task-provider.ts +57 -57
- package/src/plugin/tasks/tasks.ts +252 -252
- package/src/plugin/telemetry-ext.ts +298 -298
- package/src/plugin/terminal-ext.ts +569 -566
- package/src/plugin/test-item.ts +174 -174
- package/src/plugin/tests.ts +545 -545
- package/src/plugin/text-editor.ts +581 -581
- package/src/plugin/text-editors.ts +157 -157
- package/src/plugin/theming.ts +73 -73
- package/src/plugin/timeline.ts +186 -186
- package/src/plugin/tree/tree-views.ts +682 -682
- package/src/plugin/type-converters.spec.ts +476 -476
- package/src/plugin/type-converters.ts +1768 -1748
- package/src/plugin/types-impl.spec.ts +85 -85
- package/src/plugin/types-impl.ts +4011 -4001
- package/src/plugin/uri-ext.ts +60 -0
- package/src/plugin/webview-views.ts +228 -228
- package/src/plugin/webviews.ts +468 -468
- package/src/plugin/window-state.ts +75 -75
- package/src/plugin/word-helper.ts +162 -162
- package/src/plugin/workspace.ts +505 -505
- package/src/plugin-ext-backend-electron-module.ts +24 -24
- package/src/plugin-ext-backend-module.ts +24 -24
- package/src/plugin-ext-frontend-electron-module.ts +19 -19
- package/src/plugin-ext-frontend-module.ts +19 -19
- package/lib/common/proxy-handler.d.ts +0 -73
- package/lib/common/proxy-handler.d.ts.map +0 -1
- package/lib/common/proxy-handler.js +0 -106
- package/lib/common/proxy-handler.js.map +0 -1
- package/src/common/proxy-handler.ts +0 -143
|
@@ -1,274 +1,274 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2019 RedHat 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
|
-
import * as fs from '@theia/core/shared/fs-extra';
|
|
18
|
-
import { injectable, inject } from '@theia/core/shared/inversify';
|
|
19
|
-
import { ILogger } from '@theia/core';
|
|
20
|
-
import {
|
|
21
|
-
PluginDeployerHandler, PluginDeployerEntry, PluginEntryPoint, DeployedPlugin,
|
|
22
|
-
PluginDependencies, PluginType, PluginIdentifiers
|
|
23
|
-
} from '../../common/plugin-protocol';
|
|
24
|
-
import { HostedPluginReader } from './plugin-reader';
|
|
25
|
-
import { Deferred } from '@theia/core/lib/common/promise-util';
|
|
26
|
-
import { HostedPluginLocalizationService } from './hosted-plugin-localization-service';
|
|
27
|
-
import { Stopwatch } from '@theia/core/lib/common';
|
|
28
|
-
import { PluginUninstallationManager } from '../../main/node/plugin-uninstallation-manager';
|
|
29
|
-
|
|
30
|
-
@injectable()
|
|
31
|
-
export class HostedPluginDeployerHandler implements PluginDeployerHandler {
|
|
32
|
-
|
|
33
|
-
@inject(ILogger)
|
|
34
|
-
protected readonly logger: ILogger;
|
|
35
|
-
|
|
36
|
-
@inject(HostedPluginReader)
|
|
37
|
-
private readonly reader: HostedPluginReader;
|
|
38
|
-
|
|
39
|
-
@inject(HostedPluginLocalizationService)
|
|
40
|
-
private readonly localizationService: HostedPluginLocalizationService;
|
|
41
|
-
|
|
42
|
-
@inject(Stopwatch)
|
|
43
|
-
protected readonly stopwatch: Stopwatch;
|
|
44
|
-
|
|
45
|
-
@inject(PluginUninstallationManager)
|
|
46
|
-
protected readonly uninstallationManager: PluginUninstallationManager;
|
|
47
|
-
|
|
48
|
-
private readonly deployedLocations = new Map<PluginIdentifiers.VersionedId, Set<string>>();
|
|
49
|
-
protected readonly sourceLocations = new Map<PluginIdentifiers.VersionedId, Set<string>>();
|
|
50
|
-
|
|
51
|
-
/**
|
|
52
|
-
* Managed plugin metadata backend entries.
|
|
53
|
-
*/
|
|
54
|
-
private readonly deployedBackendPlugins = new Map<PluginIdentifiers.VersionedId, DeployedPlugin>();
|
|
55
|
-
|
|
56
|
-
/**
|
|
57
|
-
* Managed plugin metadata frontend entries.
|
|
58
|
-
*/
|
|
59
|
-
private readonly deployedFrontendPlugins = new Map<PluginIdentifiers.VersionedId, DeployedPlugin>();
|
|
60
|
-
|
|
61
|
-
private backendPluginsMetadataDeferred = new Deferred<void>();
|
|
62
|
-
|
|
63
|
-
private frontendPluginsMetadataDeferred = new Deferred<void>();
|
|
64
|
-
|
|
65
|
-
async getDeployedFrontendPluginIds(): Promise<PluginIdentifiers.VersionedId[]> {
|
|
66
|
-
// await first deploy
|
|
67
|
-
await this.frontendPluginsMetadataDeferred.promise;
|
|
68
|
-
// fetch the last deployed state
|
|
69
|
-
return Array.from(this.deployedFrontendPlugins.keys());
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
async getDeployedBackendPluginIds(): Promise<PluginIdentifiers.VersionedId[]> {
|
|
73
|
-
// await first deploy
|
|
74
|
-
await this.backendPluginsMetadataDeferred.promise;
|
|
75
|
-
// fetch the last deployed state
|
|
76
|
-
return Array.from(this.deployedBackendPlugins.keys());
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
async getDeployedBackendPlugins(): Promise<DeployedPlugin[]> {
|
|
80
|
-
// await first deploy
|
|
81
|
-
await this.backendPluginsMetadataDeferred.promise;
|
|
82
|
-
// fetch the last deployed state
|
|
83
|
-
return Array.from(this.deployedBackendPlugins.values());
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
async getDeployedPlugins(): Promise<DeployedPlugin[]> {
|
|
87
|
-
await this.frontendPluginsMetadataDeferred.promise;
|
|
88
|
-
await this.backendPluginsMetadataDeferred.promise;
|
|
89
|
-
return [...this.deployedFrontendPlugins.values(), ...this.deployedBackendPlugins.values()];
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
getDeployedPluginsById(pluginId: string): DeployedPlugin[] {
|
|
93
|
-
const matches: DeployedPlugin[] = [];
|
|
94
|
-
const handle = (plugins: Iterable<DeployedPlugin>): void => {
|
|
95
|
-
for (const plugin of plugins) {
|
|
96
|
-
if (PluginIdentifiers.componentsToVersionWithId(plugin.metadata.model).id === pluginId) {
|
|
97
|
-
matches.push(plugin);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
handle(this.deployedFrontendPlugins.values());
|
|
102
|
-
handle(this.deployedBackendPlugins.values());
|
|
103
|
-
return matches;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
getDeployedPlugin(pluginId: PluginIdentifiers.VersionedId): DeployedPlugin | undefined {
|
|
107
|
-
return this.deployedBackendPlugins.get(pluginId) ?? this.deployedFrontendPlugins.get(pluginId);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
/**
|
|
111
|
-
* @throws never! in order to isolate plugin deployment
|
|
112
|
-
*/
|
|
113
|
-
async getPluginDependencies(entry: PluginDeployerEntry): Promise<PluginDependencies | undefined> {
|
|
114
|
-
const pluginPath = entry.path();
|
|
115
|
-
try {
|
|
116
|
-
const manifest = await this.reader.readPackage(pluginPath);
|
|
117
|
-
if (!manifest) {
|
|
118
|
-
return undefined;
|
|
119
|
-
}
|
|
120
|
-
const metadata = this.reader.readMetadata(manifest);
|
|
121
|
-
const dependencies: PluginDependencies = { metadata };
|
|
122
|
-
// Do not resolve system (aka builtin) plugins because it should be done statically at build time.
|
|
123
|
-
if (entry.type !== PluginType.System) {
|
|
124
|
-
dependencies.mapping = this.reader.readDependencies(manifest);
|
|
125
|
-
}
|
|
126
|
-
return dependencies;
|
|
127
|
-
} catch (e) {
|
|
128
|
-
console.error(`Failed to load plugin dependencies from '${pluginPath}' path`, e);
|
|
129
|
-
return undefined;
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
async deployFrontendPlugins(frontendPlugins: PluginDeployerEntry[]): Promise<number> {
|
|
134
|
-
let successes = 0;
|
|
135
|
-
for (const plugin of frontendPlugins) {
|
|
136
|
-
if (await this.deployPlugin(plugin, 'frontend')) { successes++; }
|
|
137
|
-
}
|
|
138
|
-
// resolve on first deploy
|
|
139
|
-
this.frontendPluginsMetadataDeferred.resolve(undefined);
|
|
140
|
-
return successes;
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
async deployBackendPlugins(backendPlugins: PluginDeployerEntry[]): Promise<number> {
|
|
144
|
-
let successes = 0;
|
|
145
|
-
for (const plugin of backendPlugins) {
|
|
146
|
-
if (await this.deployPlugin(plugin, 'backend')) { successes++; }
|
|
147
|
-
}
|
|
148
|
-
// rebuild translation config after deployment
|
|
149
|
-
await this.localizationService.buildTranslationConfig([...this.deployedBackendPlugins.values()]);
|
|
150
|
-
// resolve on first deploy
|
|
151
|
-
this.backendPluginsMetadataDeferred.resolve(undefined);
|
|
152
|
-
return successes;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
/**
|
|
156
|
-
* @throws never! in order to isolate plugin deployment.
|
|
157
|
-
* @returns whether the plugin is deployed after running this function. If the plugin was already installed, will still return `true`.
|
|
158
|
-
*/
|
|
159
|
-
protected async deployPlugin(entry: PluginDeployerEntry, entryPoint: keyof PluginEntryPoint): Promise<boolean> {
|
|
160
|
-
const pluginPath = entry.path();
|
|
161
|
-
const deployPlugin = this.stopwatch.start('deployPlugin');
|
|
162
|
-
let id;
|
|
163
|
-
let success = true;
|
|
164
|
-
try {
|
|
165
|
-
const manifest = await this.reader.readPackage(pluginPath);
|
|
166
|
-
if (!manifest) {
|
|
167
|
-
deployPlugin.error(`Failed to read ${entryPoint} plugin manifest from '${pluginPath}''`);
|
|
168
|
-
return success = false;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
const metadata = this.reader.readMetadata(manifest);
|
|
172
|
-
metadata.isUnderDevelopment = entry.getValue('isUnderDevelopment') ?? false;
|
|
173
|
-
|
|
174
|
-
id = PluginIdentifiers.componentsToVersionedId(metadata.model);
|
|
175
|
-
|
|
176
|
-
const deployedLocations = this.deployedLocations.get(id) ?? new Set<string>();
|
|
177
|
-
deployedLocations.add(entry.rootPath);
|
|
178
|
-
this.deployedLocations.set(id, deployedLocations);
|
|
179
|
-
this.setSourceLocationsForPlugin(id, entry);
|
|
180
|
-
|
|
181
|
-
const deployedPlugins = entryPoint === 'backend' ? this.deployedBackendPlugins : this.deployedFrontendPlugins;
|
|
182
|
-
if (deployedPlugins.has(id)) {
|
|
183
|
-
deployPlugin.debug(`Skipped ${entryPoint} plugin ${metadata.model.name} already deployed`);
|
|
184
|
-
return true;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
const { type } = entry;
|
|
188
|
-
const deployed: DeployedPlugin = { metadata, type };
|
|
189
|
-
deployed.contributes = await this.reader.readContribution(manifest);
|
|
190
|
-
await this.localizationService.deployLocalizations(deployed);
|
|
191
|
-
deployedPlugins.set(id, deployed);
|
|
192
|
-
deployPlugin.debug(`Deployed ${entryPoint} plugin "${id}" from "${metadata.model.entryPoint[entryPoint] || pluginPath}"`);
|
|
193
|
-
} catch (e) {
|
|
194
|
-
deployPlugin.error(`Failed to deploy ${entryPoint} plugin from '${pluginPath}' path`, e);
|
|
195
|
-
return success = false;
|
|
196
|
-
} finally {
|
|
197
|
-
if (success && id) {
|
|
198
|
-
this.markAsInstalled(id);
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
return success;
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
async uninstallPlugin(pluginId: PluginIdentifiers.VersionedId): Promise<boolean> {
|
|
205
|
-
try {
|
|
206
|
-
const sourceLocations = this.sourceLocations.get(pluginId);
|
|
207
|
-
if (!sourceLocations) {
|
|
208
|
-
return false;
|
|
209
|
-
}
|
|
210
|
-
await Promise.all(Array.from(sourceLocations,
|
|
211
|
-
location => fs.remove(location).catch(err => console.error(`Failed to remove source for ${pluginId} at ${location}`, err))));
|
|
212
|
-
this.sourceLocations.delete(pluginId);
|
|
213
|
-
this.localizationService.undeployLocalizations(pluginId);
|
|
214
|
-
this.uninstallationManager.markAsUninstalled(pluginId);
|
|
215
|
-
return true;
|
|
216
|
-
} catch (e) {
|
|
217
|
-
console.error('Error uninstalling plugin', e);
|
|
218
|
-
return false;
|
|
219
|
-
}
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
protected markAsInstalled(id: PluginIdentifiers.VersionedId): void {
|
|
223
|
-
const metadata = PluginIdentifiers.idAndVersionFromVersionedId(id);
|
|
224
|
-
if (metadata) {
|
|
225
|
-
const toMarkAsUninstalled: PluginIdentifiers.VersionedId[] = [];
|
|
226
|
-
const checkForDifferentVersions = (others: Iterable<PluginIdentifiers.VersionedId>) => {
|
|
227
|
-
for (const other of others) {
|
|
228
|
-
const otherMetadata = PluginIdentifiers.idAndVersionFromVersionedId(other);
|
|
229
|
-
if (metadata.id === otherMetadata?.id && metadata.version !== otherMetadata.version) {
|
|
230
|
-
toMarkAsUninstalled.push(other);
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
};
|
|
234
|
-
checkForDifferentVersions(this.deployedFrontendPlugins.keys());
|
|
235
|
-
checkForDifferentVersions(this.deployedBackendPlugins.keys());
|
|
236
|
-
this.uninstallationManager.markAsUninstalled(...toMarkAsUninstalled);
|
|
237
|
-
this.uninstallationManager.markAsInstalled(id);
|
|
238
|
-
toMarkAsUninstalled.forEach(pluginToUninstall => this.uninstallPlugin(pluginToUninstall));
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
|
|
242
|
-
async undeployPlugin(pluginId: PluginIdentifiers.VersionedId): Promise<boolean> {
|
|
243
|
-
this.deployedBackendPlugins.delete(pluginId);
|
|
244
|
-
this.deployedFrontendPlugins.delete(pluginId);
|
|
245
|
-
const deployedLocations = this.deployedLocations.get(pluginId);
|
|
246
|
-
if (!deployedLocations) {
|
|
247
|
-
return false;
|
|
248
|
-
}
|
|
249
|
-
|
|
250
|
-
const undeployPlugin = this.stopwatch.start('undeployPlugin');
|
|
251
|
-
this.deployedLocations.delete(pluginId);
|
|
252
|
-
|
|
253
|
-
for (const location of deployedLocations) {
|
|
254
|
-
try {
|
|
255
|
-
await fs.remove(location);
|
|
256
|
-
undeployPlugin.log(`[${pluginId}]: undeployed from "${location}"`);
|
|
257
|
-
} catch (e) {
|
|
258
|
-
undeployPlugin.error(`[${pluginId}]: failed to undeploy from location "${location}". reason:`, e);
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
return true;
|
|
263
|
-
}
|
|
264
|
-
|
|
265
|
-
protected setSourceLocationsForPlugin(id: PluginIdentifiers.VersionedId, entry: PluginDeployerEntry): void {
|
|
266
|
-
const knownLocations = this.sourceLocations.get(id) ?? new Set();
|
|
267
|
-
const maybeStoredLocations = entry.getValue('sourceLocations');
|
|
268
|
-
const storedLocations = Array.isArray(maybeStoredLocations) && maybeStoredLocations.every(location => typeof location === 'string')
|
|
269
|
-
? maybeStoredLocations.concat(entry.rootPath)
|
|
270
|
-
: [entry.rootPath];
|
|
271
|
-
storedLocations.forEach(location => knownLocations.add(location));
|
|
272
|
-
this.sourceLocations.set(id, knownLocations);
|
|
273
|
-
}
|
|
274
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2019 RedHat 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
|
+
import * as fs from '@theia/core/shared/fs-extra';
|
|
18
|
+
import { injectable, inject } from '@theia/core/shared/inversify';
|
|
19
|
+
import { ILogger } from '@theia/core';
|
|
20
|
+
import {
|
|
21
|
+
PluginDeployerHandler, PluginDeployerEntry, PluginEntryPoint, DeployedPlugin,
|
|
22
|
+
PluginDependencies, PluginType, PluginIdentifiers
|
|
23
|
+
} from '../../common/plugin-protocol';
|
|
24
|
+
import { HostedPluginReader } from './plugin-reader';
|
|
25
|
+
import { Deferred } from '@theia/core/lib/common/promise-util';
|
|
26
|
+
import { HostedPluginLocalizationService } from './hosted-plugin-localization-service';
|
|
27
|
+
import { Stopwatch } from '@theia/core/lib/common';
|
|
28
|
+
import { PluginUninstallationManager } from '../../main/node/plugin-uninstallation-manager';
|
|
29
|
+
|
|
30
|
+
@injectable()
|
|
31
|
+
export class HostedPluginDeployerHandler implements PluginDeployerHandler {
|
|
32
|
+
|
|
33
|
+
@inject(ILogger)
|
|
34
|
+
protected readonly logger: ILogger;
|
|
35
|
+
|
|
36
|
+
@inject(HostedPluginReader)
|
|
37
|
+
private readonly reader: HostedPluginReader;
|
|
38
|
+
|
|
39
|
+
@inject(HostedPluginLocalizationService)
|
|
40
|
+
private readonly localizationService: HostedPluginLocalizationService;
|
|
41
|
+
|
|
42
|
+
@inject(Stopwatch)
|
|
43
|
+
protected readonly stopwatch: Stopwatch;
|
|
44
|
+
|
|
45
|
+
@inject(PluginUninstallationManager)
|
|
46
|
+
protected readonly uninstallationManager: PluginUninstallationManager;
|
|
47
|
+
|
|
48
|
+
private readonly deployedLocations = new Map<PluginIdentifiers.VersionedId, Set<string>>();
|
|
49
|
+
protected readonly sourceLocations = new Map<PluginIdentifiers.VersionedId, Set<string>>();
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Managed plugin metadata backend entries.
|
|
53
|
+
*/
|
|
54
|
+
private readonly deployedBackendPlugins = new Map<PluginIdentifiers.VersionedId, DeployedPlugin>();
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Managed plugin metadata frontend entries.
|
|
58
|
+
*/
|
|
59
|
+
private readonly deployedFrontendPlugins = new Map<PluginIdentifiers.VersionedId, DeployedPlugin>();
|
|
60
|
+
|
|
61
|
+
private backendPluginsMetadataDeferred = new Deferred<void>();
|
|
62
|
+
|
|
63
|
+
private frontendPluginsMetadataDeferred = new Deferred<void>();
|
|
64
|
+
|
|
65
|
+
async getDeployedFrontendPluginIds(): Promise<PluginIdentifiers.VersionedId[]> {
|
|
66
|
+
// await first deploy
|
|
67
|
+
await this.frontendPluginsMetadataDeferred.promise;
|
|
68
|
+
// fetch the last deployed state
|
|
69
|
+
return Array.from(this.deployedFrontendPlugins.keys());
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
async getDeployedBackendPluginIds(): Promise<PluginIdentifiers.VersionedId[]> {
|
|
73
|
+
// await first deploy
|
|
74
|
+
await this.backendPluginsMetadataDeferred.promise;
|
|
75
|
+
// fetch the last deployed state
|
|
76
|
+
return Array.from(this.deployedBackendPlugins.keys());
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
async getDeployedBackendPlugins(): Promise<DeployedPlugin[]> {
|
|
80
|
+
// await first deploy
|
|
81
|
+
await this.backendPluginsMetadataDeferred.promise;
|
|
82
|
+
// fetch the last deployed state
|
|
83
|
+
return Array.from(this.deployedBackendPlugins.values());
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
async getDeployedPlugins(): Promise<DeployedPlugin[]> {
|
|
87
|
+
await this.frontendPluginsMetadataDeferred.promise;
|
|
88
|
+
await this.backendPluginsMetadataDeferred.promise;
|
|
89
|
+
return [...this.deployedFrontendPlugins.values(), ...this.deployedBackendPlugins.values()];
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
getDeployedPluginsById(pluginId: string): DeployedPlugin[] {
|
|
93
|
+
const matches: DeployedPlugin[] = [];
|
|
94
|
+
const handle = (plugins: Iterable<DeployedPlugin>): void => {
|
|
95
|
+
for (const plugin of plugins) {
|
|
96
|
+
if (PluginIdentifiers.componentsToVersionWithId(plugin.metadata.model).id === pluginId) {
|
|
97
|
+
matches.push(plugin);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
};
|
|
101
|
+
handle(this.deployedFrontendPlugins.values());
|
|
102
|
+
handle(this.deployedBackendPlugins.values());
|
|
103
|
+
return matches;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
getDeployedPlugin(pluginId: PluginIdentifiers.VersionedId): DeployedPlugin | undefined {
|
|
107
|
+
return this.deployedBackendPlugins.get(pluginId) ?? this.deployedFrontendPlugins.get(pluginId);
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* @throws never! in order to isolate plugin deployment
|
|
112
|
+
*/
|
|
113
|
+
async getPluginDependencies(entry: PluginDeployerEntry): Promise<PluginDependencies | undefined> {
|
|
114
|
+
const pluginPath = entry.path();
|
|
115
|
+
try {
|
|
116
|
+
const manifest = await this.reader.readPackage(pluginPath);
|
|
117
|
+
if (!manifest) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
const metadata = this.reader.readMetadata(manifest);
|
|
121
|
+
const dependencies: PluginDependencies = { metadata };
|
|
122
|
+
// Do not resolve system (aka builtin) plugins because it should be done statically at build time.
|
|
123
|
+
if (entry.type !== PluginType.System) {
|
|
124
|
+
dependencies.mapping = this.reader.readDependencies(manifest);
|
|
125
|
+
}
|
|
126
|
+
return dependencies;
|
|
127
|
+
} catch (e) {
|
|
128
|
+
console.error(`Failed to load plugin dependencies from '${pluginPath}' path`, e);
|
|
129
|
+
return undefined;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async deployFrontendPlugins(frontendPlugins: PluginDeployerEntry[]): Promise<number> {
|
|
134
|
+
let successes = 0;
|
|
135
|
+
for (const plugin of frontendPlugins) {
|
|
136
|
+
if (await this.deployPlugin(plugin, 'frontend')) { successes++; }
|
|
137
|
+
}
|
|
138
|
+
// resolve on first deploy
|
|
139
|
+
this.frontendPluginsMetadataDeferred.resolve(undefined);
|
|
140
|
+
return successes;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
async deployBackendPlugins(backendPlugins: PluginDeployerEntry[]): Promise<number> {
|
|
144
|
+
let successes = 0;
|
|
145
|
+
for (const plugin of backendPlugins) {
|
|
146
|
+
if (await this.deployPlugin(plugin, 'backend')) { successes++; }
|
|
147
|
+
}
|
|
148
|
+
// rebuild translation config after deployment
|
|
149
|
+
await this.localizationService.buildTranslationConfig([...this.deployedBackendPlugins.values()]);
|
|
150
|
+
// resolve on first deploy
|
|
151
|
+
this.backendPluginsMetadataDeferred.resolve(undefined);
|
|
152
|
+
return successes;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* @throws never! in order to isolate plugin deployment.
|
|
157
|
+
* @returns whether the plugin is deployed after running this function. If the plugin was already installed, will still return `true`.
|
|
158
|
+
*/
|
|
159
|
+
protected async deployPlugin(entry: PluginDeployerEntry, entryPoint: keyof PluginEntryPoint): Promise<boolean> {
|
|
160
|
+
const pluginPath = entry.path();
|
|
161
|
+
const deployPlugin = this.stopwatch.start('deployPlugin');
|
|
162
|
+
let id;
|
|
163
|
+
let success = true;
|
|
164
|
+
try {
|
|
165
|
+
const manifest = await this.reader.readPackage(pluginPath);
|
|
166
|
+
if (!manifest) {
|
|
167
|
+
deployPlugin.error(`Failed to read ${entryPoint} plugin manifest from '${pluginPath}''`);
|
|
168
|
+
return success = false;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
const metadata = this.reader.readMetadata(manifest);
|
|
172
|
+
metadata.isUnderDevelopment = entry.getValue('isUnderDevelopment') ?? false;
|
|
173
|
+
|
|
174
|
+
id = PluginIdentifiers.componentsToVersionedId(metadata.model);
|
|
175
|
+
|
|
176
|
+
const deployedLocations = this.deployedLocations.get(id) ?? new Set<string>();
|
|
177
|
+
deployedLocations.add(entry.rootPath);
|
|
178
|
+
this.deployedLocations.set(id, deployedLocations);
|
|
179
|
+
this.setSourceLocationsForPlugin(id, entry);
|
|
180
|
+
|
|
181
|
+
const deployedPlugins = entryPoint === 'backend' ? this.deployedBackendPlugins : this.deployedFrontendPlugins;
|
|
182
|
+
if (deployedPlugins.has(id)) {
|
|
183
|
+
deployPlugin.debug(`Skipped ${entryPoint} plugin ${metadata.model.name} already deployed`);
|
|
184
|
+
return true;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
const { type } = entry;
|
|
188
|
+
const deployed: DeployedPlugin = { metadata, type };
|
|
189
|
+
deployed.contributes = await this.reader.readContribution(manifest);
|
|
190
|
+
await this.localizationService.deployLocalizations(deployed);
|
|
191
|
+
deployedPlugins.set(id, deployed);
|
|
192
|
+
deployPlugin.debug(`Deployed ${entryPoint} plugin "${id}" from "${metadata.model.entryPoint[entryPoint] || pluginPath}"`);
|
|
193
|
+
} catch (e) {
|
|
194
|
+
deployPlugin.error(`Failed to deploy ${entryPoint} plugin from '${pluginPath}' path`, e);
|
|
195
|
+
return success = false;
|
|
196
|
+
} finally {
|
|
197
|
+
if (success && id) {
|
|
198
|
+
this.markAsInstalled(id);
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
return success;
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
async uninstallPlugin(pluginId: PluginIdentifiers.VersionedId): Promise<boolean> {
|
|
205
|
+
try {
|
|
206
|
+
const sourceLocations = this.sourceLocations.get(pluginId);
|
|
207
|
+
if (!sourceLocations) {
|
|
208
|
+
return false;
|
|
209
|
+
}
|
|
210
|
+
await Promise.all(Array.from(sourceLocations,
|
|
211
|
+
location => fs.remove(location).catch(err => console.error(`Failed to remove source for ${pluginId} at ${location}`, err))));
|
|
212
|
+
this.sourceLocations.delete(pluginId);
|
|
213
|
+
this.localizationService.undeployLocalizations(pluginId);
|
|
214
|
+
this.uninstallationManager.markAsUninstalled(pluginId);
|
|
215
|
+
return true;
|
|
216
|
+
} catch (e) {
|
|
217
|
+
console.error('Error uninstalling plugin', e);
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
protected markAsInstalled(id: PluginIdentifiers.VersionedId): void {
|
|
223
|
+
const metadata = PluginIdentifiers.idAndVersionFromVersionedId(id);
|
|
224
|
+
if (metadata) {
|
|
225
|
+
const toMarkAsUninstalled: PluginIdentifiers.VersionedId[] = [];
|
|
226
|
+
const checkForDifferentVersions = (others: Iterable<PluginIdentifiers.VersionedId>) => {
|
|
227
|
+
for (const other of others) {
|
|
228
|
+
const otherMetadata = PluginIdentifiers.idAndVersionFromVersionedId(other);
|
|
229
|
+
if (metadata.id === otherMetadata?.id && metadata.version !== otherMetadata.version) {
|
|
230
|
+
toMarkAsUninstalled.push(other);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
checkForDifferentVersions(this.deployedFrontendPlugins.keys());
|
|
235
|
+
checkForDifferentVersions(this.deployedBackendPlugins.keys());
|
|
236
|
+
this.uninstallationManager.markAsUninstalled(...toMarkAsUninstalled);
|
|
237
|
+
this.uninstallationManager.markAsInstalled(id);
|
|
238
|
+
toMarkAsUninstalled.forEach(pluginToUninstall => this.uninstallPlugin(pluginToUninstall));
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
async undeployPlugin(pluginId: PluginIdentifiers.VersionedId): Promise<boolean> {
|
|
243
|
+
this.deployedBackendPlugins.delete(pluginId);
|
|
244
|
+
this.deployedFrontendPlugins.delete(pluginId);
|
|
245
|
+
const deployedLocations = this.deployedLocations.get(pluginId);
|
|
246
|
+
if (!deployedLocations) {
|
|
247
|
+
return false;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
const undeployPlugin = this.stopwatch.start('undeployPlugin');
|
|
251
|
+
this.deployedLocations.delete(pluginId);
|
|
252
|
+
|
|
253
|
+
for (const location of deployedLocations) {
|
|
254
|
+
try {
|
|
255
|
+
await fs.remove(location);
|
|
256
|
+
undeployPlugin.log(`[${pluginId}]: undeployed from "${location}"`);
|
|
257
|
+
} catch (e) {
|
|
258
|
+
undeployPlugin.error(`[${pluginId}]: failed to undeploy from location "${location}". reason:`, e);
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
return true;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
protected setSourceLocationsForPlugin(id: PluginIdentifiers.VersionedId, entry: PluginDeployerEntry): void {
|
|
266
|
+
const knownLocations = this.sourceLocations.get(id) ?? new Set();
|
|
267
|
+
const maybeStoredLocations = entry.getValue('sourceLocations');
|
|
268
|
+
const storedLocations = Array.isArray(maybeStoredLocations) && maybeStoredLocations.every(location => typeof location === 'string')
|
|
269
|
+
? maybeStoredLocations.concat(entry.rootPath)
|
|
270
|
+
: [entry.rootPath];
|
|
271
|
+
storedLocations.forEach(location => knownLocations.add(location));
|
|
272
|
+
this.sourceLocations.set(id, knownLocations);
|
|
273
|
+
}
|
|
274
|
+
}
|