@theia/plugin-ext 1.53.0-next.55 → 1.53.0-next.64
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 +1 -4
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin.js +9 -9
- package/lib/main/browser/editors-and-documents-main.d.ts.map +1 -1
- package/lib/main/browser/editors-and-documents-main.js +14 -2
- package/lib/main/browser/editors-and-documents-main.js.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-and-editors-main.d.ts.map +1 -1
- package/lib/main/browser/notebooks/notebook-documents-and-editors-main.js +2 -0
- package/lib/main/browser/notebooks/notebook-documents-and-editors-main.js.map +1 -1
- package/lib/main/browser/notebooks/renderers/cell-output-webview.js +86 -86
- 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/tabs/tabs-main.d.ts +1 -1
- package/lib/main/browser/tabs/tabs-main.d.ts.map +1 -1
- package/lib/main/browser/tabs/tabs-main.js +1 -1
- package/lib/main/browser/tabs/tabs-main.js.map +1 -1
- package/lib/main/browser/text-editor-main.d.ts +6 -3
- package/lib/main/browser/text-editor-main.d.ts.map +1 -1
- package/lib/main/browser/text-editor-main.js +39 -5
- package/lib/main/browser/text-editor-main.js.map +1 -1
- 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/workspace-main.d.ts +0 -2
- 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/languages.d.ts +0 -1
- package/lib/plugin/languages.d.ts.map +1 -1
- package/lib/plugin/notebook/notebook-kernels.d.ts +0 -2
- package/lib/plugin/notebook/notebook-kernels.d.ts.map +1 -1
- package/lib/plugin/notebook/notebooks.d.ts +1 -0
- package/lib/plugin/notebook/notebooks.d.ts.map +1 -1
- package/lib/plugin/notebook/notebooks.js +22 -2
- package/lib/plugin/notebook/notebooks.js.map +1 -1
- package/lib/plugin/scm.d.ts +0 -1
- package/lib/plugin/scm.d.ts.map +1 -1
- package/lib/plugin/terminal-ext.d.ts +0 -1
- package/lib/plugin/terminal-ext.d.ts.map +1 -1
- package/lib/plugin/text-editor.d.ts +1 -1
- package/lib/plugin/text-editor.d.ts.map +1 -1
- package/lib/plugin/text-editor.js.map +1 -1
- package/lib/plugin/type-converters.d.ts +0 -1
- package/lib/plugin/type-converters.d.ts.map +1 -1
- package/lib/plugin/types-impl.d.ts +2 -3
- package/lib/plugin/types-impl.d.ts.map +1 -1
- package/lib/plugin/workspace.d.ts +0 -4
- package/lib/plugin/workspace.d.ts.map +1 -1
- package/package.json +28 -28
- 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 +2753 -2752
- 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 -306
- 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 -635
- 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 -963
- 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 -401
- 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 -205
- 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 -127
- package/src/main/browser/custom-editors/custom-editors-main.ts +526 -526
- package/src/main/browser/custom-editors/plugin-custom-editor-registry.ts +126 -126
- 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 +448 -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 -210
- package/src/main/browser/main-file-system-event-service.ts +76 -76
- package/src/main/browser/menus/menus-contribution-handler.ts +172 -172
- package/src/main/browser/menus/plugin-menu-command-adapter.ts +358 -358
- package/src/main/browser/menus/vscode-theia-menu-mappings.ts +118 -118
- package/src/main/browser/message-registry-main.ts +43 -43
- package/src/main/browser/notebooks/notebook-documents-and-editors-main.ts +252 -249
- package/src/main/browser/notebooks/notebook-documents-main.ts +202 -202
- package/src/main/browser/notebooks/notebook-dto.ts +131 -131
- package/src/main/browser/notebooks/notebook-editors-main.ts +88 -88
- 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 -452
- package/src/main/browser/notebooks/renderers/output-webview-internal.ts +636 -636
- 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 -291
- 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 +388 -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 +519 -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 -72
- 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 -296
- 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 -718
- 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 -287
- 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 -140
- 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 -334
- 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 -134
- 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 -429
- 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 +470 -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 -1606
- package/src/plugin/plugin-icon-path.ts +53 -53
- package/src/plugin/plugin-manager.ts +508 -508
- 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 -569
- 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 -1768
- package/src/plugin/types-impl.spec.ts +85 -85
- package/src/plugin/types-impl.ts +4011 -4011
- package/src/plugin/uri-ext.ts +60 -60
- 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
|
@@ -1,110 +1,110 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2018 Red Hat, Inc. 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
|
-
import '@theia/core/shared/reflect-metadata';
|
|
17
|
-
import { Container } from '@theia/core/shared/inversify';
|
|
18
|
-
import { ConnectionClosedError, RPCProtocol } from '../../common/rpc-protocol';
|
|
19
|
-
import { ProcessTerminatedMessage, ProcessTerminateMessage } from './hosted-plugin-protocol';
|
|
20
|
-
import { PluginHostRPC } from './plugin-host-rpc';
|
|
21
|
-
import pluginHostModule from './plugin-host-module';
|
|
22
|
-
|
|
23
|
-
console.log('PLUGIN_HOST(' + process.pid + ') starting instance');
|
|
24
|
-
|
|
25
|
-
// override exit() function, to do not allow plugin kill this node
|
|
26
|
-
process.exit = function (code?: number): void {
|
|
27
|
-
const err = new Error('An plugin call process.exit() and it was prevented.');
|
|
28
|
-
console.warn(err.stack);
|
|
29
|
-
} as (code?: number) => never;
|
|
30
|
-
|
|
31
|
-
// same for 'crash'(works only in electron)
|
|
32
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
-
const proc = process as any;
|
|
34
|
-
if (proc.crash) {
|
|
35
|
-
proc.crash = function (): void {
|
|
36
|
-
const err = new Error('An plugin call process.crash() and it was prevented.');
|
|
37
|
-
console.warn(err.stack);
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
process.on('uncaughtException', (err: Error) => {
|
|
42
|
-
console.error(err);
|
|
43
|
-
});
|
|
44
|
-
|
|
45
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
-
const unhandledPromises: Promise<any>[] = [];
|
|
47
|
-
|
|
48
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
-
process.on('unhandledRejection', (reason: any, promise: Promise<any>) => {
|
|
50
|
-
unhandledPromises.push(promise);
|
|
51
|
-
setTimeout(() => {
|
|
52
|
-
const index = unhandledPromises.indexOf(promise);
|
|
53
|
-
if (index >= 0) {
|
|
54
|
-
promise.catch(err => {
|
|
55
|
-
unhandledPromises.splice(index, 1);
|
|
56
|
-
if (terminating && (ConnectionClosedError.is(err) || ConnectionClosedError.is(reason))) {
|
|
57
|
-
// during termination it is expected that pending rpc request are rejected
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
console.error(`Promise rejection not handled in one second: ${err} , reason: ${reason}`);
|
|
61
|
-
if (err && err.stack) {
|
|
62
|
-
console.error(`With stack trace: ${err.stack}`);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
}, 1000);
|
|
67
|
-
});
|
|
68
|
-
|
|
69
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
-
process.on('rejectionHandled', (promise: Promise<any>) => {
|
|
71
|
-
const index = unhandledPromises.indexOf(promise);
|
|
72
|
-
if (index >= 0) {
|
|
73
|
-
unhandledPromises.splice(index, 1);
|
|
74
|
-
}
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
let terminating = false;
|
|
78
|
-
|
|
79
|
-
const container = new Container();
|
|
80
|
-
container.load(pluginHostModule);
|
|
81
|
-
|
|
82
|
-
const rpc: RPCProtocol = container.get(RPCProtocol);
|
|
83
|
-
const pluginHostRPC = container.get(PluginHostRPC);
|
|
84
|
-
|
|
85
|
-
process.on('message', async (message: string) => {
|
|
86
|
-
if (terminating) {
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
try {
|
|
90
|
-
const msg = JSON.parse(message);
|
|
91
|
-
if (ProcessTerminateMessage.is(msg)) {
|
|
92
|
-
terminating = true;
|
|
93
|
-
if (msg.stopTimeout) {
|
|
94
|
-
await Promise.race([
|
|
95
|
-
pluginHostRPC.terminate(),
|
|
96
|
-
new Promise(resolve => setTimeout(resolve, msg.stopTimeout))
|
|
97
|
-
]);
|
|
98
|
-
} else {
|
|
99
|
-
await pluginHostRPC.terminate();
|
|
100
|
-
}
|
|
101
|
-
rpc.dispose();
|
|
102
|
-
if (process.send) {
|
|
103
|
-
process.send(JSON.stringify({ type: ProcessTerminatedMessage.TYPE }));
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
}
|
|
107
|
-
} catch (e) {
|
|
108
|
-
console.error(e);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2018 Red Hat, Inc. 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
|
+
import '@theia/core/shared/reflect-metadata';
|
|
17
|
+
import { Container } from '@theia/core/shared/inversify';
|
|
18
|
+
import { ConnectionClosedError, RPCProtocol } from '../../common/rpc-protocol';
|
|
19
|
+
import { ProcessTerminatedMessage, ProcessTerminateMessage } from './hosted-plugin-protocol';
|
|
20
|
+
import { PluginHostRPC } from './plugin-host-rpc';
|
|
21
|
+
import pluginHostModule from './plugin-host-module';
|
|
22
|
+
|
|
23
|
+
console.log('PLUGIN_HOST(' + process.pid + ') starting instance');
|
|
24
|
+
|
|
25
|
+
// override exit() function, to do not allow plugin kill this node
|
|
26
|
+
process.exit = function (code?: number): void {
|
|
27
|
+
const err = new Error('An plugin call process.exit() and it was prevented.');
|
|
28
|
+
console.warn(err.stack);
|
|
29
|
+
} as (code?: number) => never;
|
|
30
|
+
|
|
31
|
+
// same for 'crash'(works only in electron)
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
+
const proc = process as any;
|
|
34
|
+
if (proc.crash) {
|
|
35
|
+
proc.crash = function (): void {
|
|
36
|
+
const err = new Error('An plugin call process.crash() and it was prevented.');
|
|
37
|
+
console.warn(err.stack);
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
process.on('uncaughtException', (err: Error) => {
|
|
42
|
+
console.error(err);
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
46
|
+
const unhandledPromises: Promise<any>[] = [];
|
|
47
|
+
|
|
48
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
49
|
+
process.on('unhandledRejection', (reason: any, promise: Promise<any>) => {
|
|
50
|
+
unhandledPromises.push(promise);
|
|
51
|
+
setTimeout(() => {
|
|
52
|
+
const index = unhandledPromises.indexOf(promise);
|
|
53
|
+
if (index >= 0) {
|
|
54
|
+
promise.catch(err => {
|
|
55
|
+
unhandledPromises.splice(index, 1);
|
|
56
|
+
if (terminating && (ConnectionClosedError.is(err) || ConnectionClosedError.is(reason))) {
|
|
57
|
+
// during termination it is expected that pending rpc request are rejected
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
console.error(`Promise rejection not handled in one second: ${err} , reason: ${reason}`);
|
|
61
|
+
if (err && err.stack) {
|
|
62
|
+
console.error(`With stack trace: ${err.stack}`);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
}, 1000);
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
process.on('rejectionHandled', (promise: Promise<any>) => {
|
|
71
|
+
const index = unhandledPromises.indexOf(promise);
|
|
72
|
+
if (index >= 0) {
|
|
73
|
+
unhandledPromises.splice(index, 1);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
let terminating = false;
|
|
78
|
+
|
|
79
|
+
const container = new Container();
|
|
80
|
+
container.load(pluginHostModule);
|
|
81
|
+
|
|
82
|
+
const rpc: RPCProtocol = container.get(RPCProtocol);
|
|
83
|
+
const pluginHostRPC = container.get(PluginHostRPC);
|
|
84
|
+
|
|
85
|
+
process.on('message', async (message: string) => {
|
|
86
|
+
if (terminating) {
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
const msg = JSON.parse(message);
|
|
91
|
+
if (ProcessTerminateMessage.is(msg)) {
|
|
92
|
+
terminating = true;
|
|
93
|
+
if (msg.stopTimeout) {
|
|
94
|
+
await Promise.race([
|
|
95
|
+
pluginHostRPC.terminate(),
|
|
96
|
+
new Promise(resolve => setTimeout(resolve, msg.stopTimeout))
|
|
97
|
+
]);
|
|
98
|
+
} else {
|
|
99
|
+
await pluginHostRPC.terminate();
|
|
100
|
+
}
|
|
101
|
+
rpc.dispose();
|
|
102
|
+
if (process.send) {
|
|
103
|
+
process.send(JSON.stringify({ type: ProcessTerminatedMessage.TYPE }));
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
}
|
|
107
|
+
} catch (e) {
|
|
108
|
+
console.error(e);
|
|
109
|
+
}
|
|
110
|
+
});
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2023 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
|
-
import { injectable } from '@theia/core/shared/inversify';
|
|
18
|
-
import { LanguagePackBundle, LanguagePackService } from '../../common/language-pack-service';
|
|
19
|
-
|
|
20
|
-
@injectable()
|
|
21
|
-
export class PluginLanguagePackService implements LanguagePackService {
|
|
22
|
-
|
|
23
|
-
protected readonly storage = new Map<string, Map<string, LanguagePackBundle>>();
|
|
24
|
-
|
|
25
|
-
storeBundle(pluginId: string, locale: string, bundle: LanguagePackBundle): void {
|
|
26
|
-
if (!this.storage.has(pluginId)) {
|
|
27
|
-
this.storage.set(pluginId, new Map());
|
|
28
|
-
}
|
|
29
|
-
this.storage.get(pluginId)!.set(locale, bundle);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
deleteBundle(pluginId: string, locale?: string): void {
|
|
33
|
-
if (locale) {
|
|
34
|
-
this.storage.get(pluginId)?.delete(locale);
|
|
35
|
-
} else {
|
|
36
|
-
this.storage.delete(pluginId);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
async getBundle(pluginId: string, locale: string): Promise<LanguagePackBundle | undefined> {
|
|
41
|
-
return this.storage.get(pluginId)?.get(locale);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2023 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
|
+
import { injectable } from '@theia/core/shared/inversify';
|
|
18
|
+
import { LanguagePackBundle, LanguagePackService } from '../../common/language-pack-service';
|
|
19
|
+
|
|
20
|
+
@injectable()
|
|
21
|
+
export class PluginLanguagePackService implements LanguagePackService {
|
|
22
|
+
|
|
23
|
+
protected readonly storage = new Map<string, Map<string, LanguagePackBundle>>();
|
|
24
|
+
|
|
25
|
+
storeBundle(pluginId: string, locale: string, bundle: LanguagePackBundle): void {
|
|
26
|
+
if (!this.storage.has(pluginId)) {
|
|
27
|
+
this.storage.set(pluginId, new Map());
|
|
28
|
+
}
|
|
29
|
+
this.storage.get(pluginId)!.set(locale, bundle);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
deleteBundle(pluginId: string, locale?: string): void {
|
|
33
|
+
if (locale) {
|
|
34
|
+
this.storage.get(pluginId)?.delete(locale);
|
|
35
|
+
} else {
|
|
36
|
+
this.storage.delete(pluginId);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async getBundle(pluginId: string, locale: string): Promise<LanguagePackBundle | undefined> {
|
|
41
|
+
return this.storage.get(pluginId)?.get(locale);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -1,32 +1,32 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2018 Red Hat, Inc. 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 path from 'path';
|
|
18
|
-
import * as fs from '@theia/core/shared/fs-extra';
|
|
19
|
-
import { PluginIdentifiers, PluginPackage } from '../../common';
|
|
20
|
-
import { updateActivationEvents } from './plugin-activation-events';
|
|
21
|
-
|
|
22
|
-
export async function loadManifest(pluginPath: string): Promise<PluginPackage> {
|
|
23
|
-
const manifest = await fs.readJson(path.join(pluginPath, 'package.json'));
|
|
24
|
-
// translate vscode builtins, as they are published with a prefix. See https://github.com/theia-ide/vscode-builtin-extensions/blob/master/src/republish.js#L50
|
|
25
|
-
const built_prefix = '@theia/vscode-builtin-';
|
|
26
|
-
if (manifest && manifest.name && manifest.name.startsWith(built_prefix)) {
|
|
27
|
-
manifest.name = manifest.name.substring(built_prefix.length);
|
|
28
|
-
}
|
|
29
|
-
manifest.publisher ??= PluginIdentifiers.UNPUBLISHED;
|
|
30
|
-
updateActivationEvents(manifest);
|
|
31
|
-
return manifest;
|
|
32
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2018 Red Hat, Inc. 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 path from 'path';
|
|
18
|
+
import * as fs from '@theia/core/shared/fs-extra';
|
|
19
|
+
import { PluginIdentifiers, PluginPackage } from '../../common';
|
|
20
|
+
import { updateActivationEvents } from './plugin-activation-events';
|
|
21
|
+
|
|
22
|
+
export async function loadManifest(pluginPath: string): Promise<PluginPackage> {
|
|
23
|
+
const manifest = await fs.readJson(path.join(pluginPath, 'package.json'));
|
|
24
|
+
// translate vscode builtins, as they are published with a prefix. See https://github.com/theia-ide/vscode-builtin-extensions/blob/master/src/republish.js#L50
|
|
25
|
+
const built_prefix = '@theia/vscode-builtin-';
|
|
26
|
+
if (manifest && manifest.name && manifest.name.startsWith(built_prefix)) {
|
|
27
|
+
manifest.name = manifest.name.substring(built_prefix.length);
|
|
28
|
+
}
|
|
29
|
+
manifest.publisher ??= PluginIdentifiers.UNPUBLISHED;
|
|
30
|
+
updateActivationEvents(manifest);
|
|
31
|
+
return manifest;
|
|
32
|
+
}
|
|
@@ -1,136 +1,136 @@
|
|
|
1
|
-
// *****************************************************************************
|
|
2
|
-
// Copyright (C) 2018 Red Hat, Inc. 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 path from 'path';
|
|
18
|
-
import * as express from '@theia/core/shared/express';
|
|
19
|
-
import * as escape_html from 'escape-html';
|
|
20
|
-
import { realpath } from 'fs/promises';
|
|
21
|
-
import { ILogger } from '@theia/core';
|
|
22
|
-
import { inject, injectable, optional, multiInject } from '@theia/core/shared/inversify';
|
|
23
|
-
import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application';
|
|
24
|
-
import { PluginMetadata, getPluginId, MetadataProcessor, PluginPackage, PluginContribution } from '../../common/plugin-protocol';
|
|
25
|
-
import { MetadataScanner } from './metadata-scanner';
|
|
26
|
-
import { loadManifest } from './plugin-manifest-loader';
|
|
27
|
-
|
|
28
|
-
@injectable()
|
|
29
|
-
export class HostedPluginReader implements BackendApplicationContribution {
|
|
30
|
-
|
|
31
|
-
@inject(ILogger)
|
|
32
|
-
protected readonly logger: ILogger;
|
|
33
|
-
|
|
34
|
-
@inject(MetadataScanner)
|
|
35
|
-
protected readonly scanner: MetadataScanner;
|
|
36
|
-
|
|
37
|
-
@optional()
|
|
38
|
-
@multiInject(MetadataProcessor) private readonly metadataProcessors: MetadataProcessor[];
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Map between a plugin id and its local storage
|
|
42
|
-
*/
|
|
43
|
-
protected pluginsIdsFiles: Map<string, string> = new Map();
|
|
44
|
-
|
|
45
|
-
configure(app: express.Application): void {
|
|
46
|
-
app.get('/hostedPlugin/:pluginId/:path(*)', async (req, res) => {
|
|
47
|
-
const pluginId = req.params.pluginId;
|
|
48
|
-
const filePath = req.params.path;
|
|
49
|
-
|
|
50
|
-
const localPath = this.pluginsIdsFiles.get(pluginId);
|
|
51
|
-
if (localPath) {
|
|
52
|
-
res.sendFile(filePath, { root: localPath }, e => {
|
|
53
|
-
if (!e) {
|
|
54
|
-
// the file was found and successfully transferred
|
|
55
|
-
return;
|
|
56
|
-
}
|
|
57
|
-
console.error(`Could not transfer '${filePath}' file from '${pluginId}'`, e);
|
|
58
|
-
if (res.headersSent) {
|
|
59
|
-
// the request was already closed
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
-
if ((e as any)['code'] === 'ENOENT') {
|
|
64
|
-
res.status(404).send(`No such file found in '${escape_html(pluginId)}' plugin.`);
|
|
65
|
-
} else {
|
|
66
|
-
res.status(500).send(`Failed to transfer a file from '${escape_html(pluginId)}' plugin.`);
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
} else {
|
|
70
|
-
await this.handleMissingResource(req, res);
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
protected async handleMissingResource(req: express.Request, res: express.Response): Promise<void> {
|
|
76
|
-
const pluginId = req.params.pluginId;
|
|
77
|
-
res.status(404).send(`The plugin with id '${escape_html(pluginId)}' does not exist.`);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
/**
|
|
81
|
-
* @throws never
|
|
82
|
-
*/
|
|
83
|
-
async getPluginMetadata(pluginPath: string | undefined): Promise<PluginMetadata | undefined> {
|
|
84
|
-
try {
|
|
85
|
-
const manifest = await this.readPackage(pluginPath);
|
|
86
|
-
return manifest && this.readMetadata(manifest);
|
|
87
|
-
} catch (e) {
|
|
88
|
-
this.logger.error(`Failed to load plugin metadata from "${pluginPath}"`, e);
|
|
89
|
-
return undefined;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async readPackage(pluginPath: string | undefined): Promise<PluginPackage | undefined> {
|
|
94
|
-
if (!pluginPath) {
|
|
95
|
-
return undefined;
|
|
96
|
-
}
|
|
97
|
-
const resolvedPluginPath = await realpath(pluginPath);
|
|
98
|
-
const manifest = await loadManifest(resolvedPluginPath);
|
|
99
|
-
if (!manifest) {
|
|
100
|
-
return undefined;
|
|
101
|
-
}
|
|
102
|
-
manifest.packagePath = resolvedPluginPath;
|
|
103
|
-
return manifest;
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
readMetadata(plugin: PluginPackage): PluginMetadata {
|
|
107
|
-
const pluginMetadata = this.scanner.getPluginMetadata(plugin);
|
|
108
|
-
if (pluginMetadata.model.entryPoint.backend) {
|
|
109
|
-
pluginMetadata.model.entryPoint.backend = path.resolve(plugin.packagePath, pluginMetadata.model.entryPoint.backend);
|
|
110
|
-
}
|
|
111
|
-
if (pluginMetadata.model.entryPoint.headless) {
|
|
112
|
-
pluginMetadata.model.entryPoint.headless = path.resolve(plugin.packagePath, pluginMetadata.model.entryPoint.headless);
|
|
113
|
-
}
|
|
114
|
-
if (pluginMetadata) {
|
|
115
|
-
// Add post processor
|
|
116
|
-
if (this.metadataProcessors) {
|
|
117
|
-
this.metadataProcessors.forEach(metadataProcessor => {
|
|
118
|
-
metadataProcessor.process(pluginMetadata);
|
|
119
|
-
});
|
|
120
|
-
}
|
|
121
|
-
this.pluginsIdsFiles.set(getPluginId(pluginMetadata.model), plugin.packagePath);
|
|
122
|
-
}
|
|
123
|
-
return pluginMetadata;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
async readContribution(plugin: PluginPackage): Promise<PluginContribution | undefined> {
|
|
127
|
-
const scanner = this.scanner.getScanner(plugin);
|
|
128
|
-
return scanner.getContribution(plugin);
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
readDependencies(plugin: PluginPackage): Map<string, string> | undefined {
|
|
132
|
-
const scanner = this.scanner.getScanner(plugin);
|
|
133
|
-
return scanner.getDependencies(plugin);
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
}
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2018 Red Hat, Inc. 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 path from 'path';
|
|
18
|
+
import * as express from '@theia/core/shared/express';
|
|
19
|
+
import * as escape_html from 'escape-html';
|
|
20
|
+
import { realpath } from 'fs/promises';
|
|
21
|
+
import { ILogger } from '@theia/core';
|
|
22
|
+
import { inject, injectable, optional, multiInject } from '@theia/core/shared/inversify';
|
|
23
|
+
import { BackendApplicationContribution } from '@theia/core/lib/node/backend-application';
|
|
24
|
+
import { PluginMetadata, getPluginId, MetadataProcessor, PluginPackage, PluginContribution } from '../../common/plugin-protocol';
|
|
25
|
+
import { MetadataScanner } from './metadata-scanner';
|
|
26
|
+
import { loadManifest } from './plugin-manifest-loader';
|
|
27
|
+
|
|
28
|
+
@injectable()
|
|
29
|
+
export class HostedPluginReader implements BackendApplicationContribution {
|
|
30
|
+
|
|
31
|
+
@inject(ILogger)
|
|
32
|
+
protected readonly logger: ILogger;
|
|
33
|
+
|
|
34
|
+
@inject(MetadataScanner)
|
|
35
|
+
protected readonly scanner: MetadataScanner;
|
|
36
|
+
|
|
37
|
+
@optional()
|
|
38
|
+
@multiInject(MetadataProcessor) private readonly metadataProcessors: MetadataProcessor[];
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Map between a plugin id and its local storage
|
|
42
|
+
*/
|
|
43
|
+
protected pluginsIdsFiles: Map<string, string> = new Map();
|
|
44
|
+
|
|
45
|
+
configure(app: express.Application): void {
|
|
46
|
+
app.get('/hostedPlugin/:pluginId/:path(*)', async (req, res) => {
|
|
47
|
+
const pluginId = req.params.pluginId;
|
|
48
|
+
const filePath = req.params.path;
|
|
49
|
+
|
|
50
|
+
const localPath = this.pluginsIdsFiles.get(pluginId);
|
|
51
|
+
if (localPath) {
|
|
52
|
+
res.sendFile(filePath, { root: localPath }, e => {
|
|
53
|
+
if (!e) {
|
|
54
|
+
// the file was found and successfully transferred
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
console.error(`Could not transfer '${filePath}' file from '${pluginId}'`, e);
|
|
58
|
+
if (res.headersSent) {
|
|
59
|
+
// the request was already closed
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
63
|
+
if ((e as any)['code'] === 'ENOENT') {
|
|
64
|
+
res.status(404).send(`No such file found in '${escape_html(pluginId)}' plugin.`);
|
|
65
|
+
} else {
|
|
66
|
+
res.status(500).send(`Failed to transfer a file from '${escape_html(pluginId)}' plugin.`);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
} else {
|
|
70
|
+
await this.handleMissingResource(req, res);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
protected async handleMissingResource(req: express.Request, res: express.Response): Promise<void> {
|
|
76
|
+
const pluginId = req.params.pluginId;
|
|
77
|
+
res.status(404).send(`The plugin with id '${escape_html(pluginId)}' does not exist.`);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @throws never
|
|
82
|
+
*/
|
|
83
|
+
async getPluginMetadata(pluginPath: string | undefined): Promise<PluginMetadata | undefined> {
|
|
84
|
+
try {
|
|
85
|
+
const manifest = await this.readPackage(pluginPath);
|
|
86
|
+
return manifest && this.readMetadata(manifest);
|
|
87
|
+
} catch (e) {
|
|
88
|
+
this.logger.error(`Failed to load plugin metadata from "${pluginPath}"`, e);
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
async readPackage(pluginPath: string | undefined): Promise<PluginPackage | undefined> {
|
|
94
|
+
if (!pluginPath) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
const resolvedPluginPath = await realpath(pluginPath);
|
|
98
|
+
const manifest = await loadManifest(resolvedPluginPath);
|
|
99
|
+
if (!manifest) {
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
manifest.packagePath = resolvedPluginPath;
|
|
103
|
+
return manifest;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
readMetadata(plugin: PluginPackage): PluginMetadata {
|
|
107
|
+
const pluginMetadata = this.scanner.getPluginMetadata(plugin);
|
|
108
|
+
if (pluginMetadata.model.entryPoint.backend) {
|
|
109
|
+
pluginMetadata.model.entryPoint.backend = path.resolve(plugin.packagePath, pluginMetadata.model.entryPoint.backend);
|
|
110
|
+
}
|
|
111
|
+
if (pluginMetadata.model.entryPoint.headless) {
|
|
112
|
+
pluginMetadata.model.entryPoint.headless = path.resolve(plugin.packagePath, pluginMetadata.model.entryPoint.headless);
|
|
113
|
+
}
|
|
114
|
+
if (pluginMetadata) {
|
|
115
|
+
// Add post processor
|
|
116
|
+
if (this.metadataProcessors) {
|
|
117
|
+
this.metadataProcessors.forEach(metadataProcessor => {
|
|
118
|
+
metadataProcessor.process(pluginMetadata);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
this.pluginsIdsFiles.set(getPluginId(pluginMetadata.model), plugin.packagePath);
|
|
122
|
+
}
|
|
123
|
+
return pluginMetadata;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
async readContribution(plugin: PluginPackage): Promise<PluginContribution | undefined> {
|
|
127
|
+
const scanner = this.scanner.getScanner(plugin);
|
|
128
|
+
return scanner.getContribution(plugin);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
readDependencies(plugin: PluginPackage): Map<string, string> | undefined {
|
|
132
|
+
const scanner = this.scanner.getScanner(plugin);
|
|
133
|
+
return scanner.getDependencies(plugin);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
}
|