@theia/plugin-ext 1.74.0-next.33 → 1.74.0-next.38
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/lib/main/browser/custom-editors/custom-editor-opener.d.ts.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.js +25 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.js.map +1 -1
- package/lib/main/browser/custom-editors/custom-editor-opener.spec.d.ts +2 -0
- package/lib/main/browser/custom-editors/custom-editor-opener.spec.d.ts.map +1 -0
- package/lib/main/browser/custom-editors/custom-editor-opener.spec.js +90 -0
- package/lib/main/browser/custom-editors/custom-editor-opener.spec.js.map +1 -0
- package/package.json +30 -30
- package/src/main/browser/custom-editors/custom-editor-opener.spec.ts +104 -0
- package/src/main/browser/custom-editors/custom-editor-opener.tsx +26 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-editor-opener.d.ts","sourceRoot":"","sources":["../../../../src/main/browser/custom-editors/custom-editor-opener.tsx"],"names":[],"mappings":"AAgBA,OAAO,GAAG,MAAM,4BAA4B,CAAC;AAC7C,OAAO,EACH,gBAAgB,EAAY,WAAW,EAAE,aAAa,EAAe,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAClH,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAwB,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EAAiC,iBAAiB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"custom-editor-opener.d.ts","sourceRoot":"","sources":["../../../../src/main/browser/custom-editors/custom-editor-opener.tsx"],"names":[],"mappings":"AAgBA,OAAO,GAAG,MAAM,4BAA4B,CAAC;AAC7C,OAAO,EACH,gBAAgB,EAAY,WAAW,EAAE,aAAa,EAAe,MAAM,EAAE,aAAa,EAAE,mBAAmB,EAClH,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAE,YAAY,EAAwB,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAE7E,OAAO,EAAiC,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAiB/E,qBAAa,kBAAmB,YAAW,WAAW;IAS9C,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,gBAAgB;IAC1C,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa;IAC/C,SAAS,CAAC,QAAQ,CAAC,cAAc,EAAE,0BAA0B;IAC7D,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB;IAX3D,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,QAAQ,CAAC,4BAA4B,CAA6D;IAC1G,QAAQ,CAAC,qBAAqB,wFAA2C;gBAGpD,MAAM,EAAE,YAAY,EAClB,KAAK,EAAE,gBAAgB,EACvB,aAAa,EAAE,aAAa,EAC5B,cAAc,EAAE,0BAA0B,EAC1C,iBAAiB,EAAE,iBAAiB;IAM3D,MAAM,CAAC,gBAAgB,CAAC,cAAc,EAAE,MAAM,GAAG,MAAM;IAIvD,SAAS,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM;IAsBpD,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM;IAO7B,WAAW,IAAI,MAAM;IAUrB,SAAS,CAAC,QAAQ,CAAC,qBAAqB,2CAAkD;cAC1E,gBAAgB,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,kBAAkB,CAAC;cA2CtF,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAyD9F,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAOhF,OAAO,CAAC,SAAS,EAAE,oBAAoB,EAAE,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;IAIlE,eAAe,CAAC,QAAQ,EAAE,oBAAoB,EAAE,QAAQ,EAAE,GAAG,GAAG,OAAO;CAmB1E"}
|
|
@@ -22,6 +22,19 @@ const custom_editor_widget_1 = require("./custom-editor-widget");
|
|
|
22
22
|
const uuid_1 = require("@theia/core/lib/common/uuid");
|
|
23
23
|
const core_1 = require("@theia/core");
|
|
24
24
|
const glob_1 = require("@theia/core/lib/common/glob");
|
|
25
|
+
const uri_components_1 = require("../../../common/uri-components");
|
|
26
|
+
/**
|
|
27
|
+
* Schemes that never match a custom editor's `filenamePattern`, mirroring the
|
|
28
|
+
* excluded schemes in VS Code's `editorResolverService#globMatchesResource`.
|
|
29
|
+
* Theia has no scheme constants for `extension` and `vscode-workspace-trust`,
|
|
30
|
+
* so those are referenced by their literal values.
|
|
31
|
+
*/
|
|
32
|
+
const nonMatchingSchemes = new Set([
|
|
33
|
+
'extension',
|
|
34
|
+
uri_components_1.Schemes.webviewPanel,
|
|
35
|
+
'vscode-workspace-trust',
|
|
36
|
+
uri_components_1.Schemes.vscodeSettings
|
|
37
|
+
]);
|
|
25
38
|
class CustomEditorOpener {
|
|
26
39
|
constructor(editor, shell, widgetManager, editorRegistry, preferenceService) {
|
|
27
40
|
this.editor = editor;
|
|
@@ -184,8 +197,19 @@ class CustomEditorOpener {
|
|
|
184
197
|
return selectors.some(selector => this.selectorMatches(selector, resource));
|
|
185
198
|
}
|
|
186
199
|
selectorMatches(selector, resource) {
|
|
200
|
+
if (nonMatchingSchemes.has(resource.scheme)) {
|
|
201
|
+
// These schemes match no glob pattern, mirroring VS Code's `globMatchesResource`.
|
|
202
|
+
return false;
|
|
203
|
+
}
|
|
187
204
|
if (selector.filenamePattern) {
|
|
188
|
-
|
|
205
|
+
const filenamePattern = selector.filenamePattern.toLowerCase();
|
|
206
|
+
// Mirror VS Code's editor-association matching (editorResolverService#globMatchesResource):
|
|
207
|
+
// a pattern containing a path separator is matched against the full `scheme:path`,
|
|
208
|
+
// a plain pattern is matched against the basename only.
|
|
209
|
+
const target = filenamePattern.includes('/')
|
|
210
|
+
? `${resource.scheme}:${resource.path.toString()}`.toLowerCase()
|
|
211
|
+
: resource.path.base.toLowerCase();
|
|
212
|
+
if ((0, glob_1.match)(filenamePattern, target)) {
|
|
189
213
|
return true;
|
|
190
214
|
}
|
|
191
215
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"custom-editor-opener.js","sourceRoot":"","sources":["../../../../src/main/browser/custom-editors/custom-editor-opener.tsx"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,oEAAoE;AACpE,EAAE;AACF,2EAA2E;AAC3E,mEAAmE;AACnE,wCAAwC;AACxC,EAAE;AACF,4EAA4E;AAC5E,8EAA8E;AAC9E,6EAA6E;AAC7E,yDAAyD;AACzD,uDAAuD;AACvD,EAAE;AACF,gFAAgF;AAChF,gFAAgF;;;AAGhF,qDAEiC;AACjC,4CAA2F;AAC3F,iEAA4D;AAE5D,sDAA2D;AAC3D,sCAA+E;AAC/E,sDAAoD;
|
|
1
|
+
{"version":3,"file":"custom-editor-opener.js","sourceRoot":"","sources":["../../../../src/main/browser/custom-editors/custom-editor-opener.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-editor-opener.spec.d.ts","sourceRoot":"","sources":["../../../../src/main/browser/custom-editors/custom-editor-opener.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 Safi Seid-Ahmad, K2view and others.
|
|
4
|
+
//
|
|
5
|
+
// This program and the accompanying materials are made available under the
|
|
6
|
+
// terms of the Eclipse Public License v. 2.0 which is available at
|
|
7
|
+
// http://www.eclipse.org/legal/epl-2.0.
|
|
8
|
+
//
|
|
9
|
+
// This Source Code may also be made available under the following Secondary
|
|
10
|
+
// Licenses when the conditions for such availability set forth in the Eclipse
|
|
11
|
+
// Public License v. 2.0 are satisfied: GNU General Public License, version 2
|
|
12
|
+
// with the GNU Classpath Exception which is available at
|
|
13
|
+
// https://www.gnu.org/software/classpath/license.html.
|
|
14
|
+
//
|
|
15
|
+
// SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-only WITH Classpath-exception-2.0
|
|
16
|
+
// *****************************************************************************
|
|
17
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
18
|
+
const jsdom_1 = require("@theia/core/lib/browser/test/jsdom");
|
|
19
|
+
let disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
20
|
+
const chai = require("chai");
|
|
21
|
+
const uri_1 = require("@theia/core/lib/common/uri");
|
|
22
|
+
const custom_editor_opener_1 = require("./custom-editor-opener");
|
|
23
|
+
const common_1 = require("../../../common");
|
|
24
|
+
disableJSDOM();
|
|
25
|
+
const expect = chai.expect;
|
|
26
|
+
describe('CustomEditorOpener#selectorMatches', () => {
|
|
27
|
+
before(() => {
|
|
28
|
+
disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
29
|
+
});
|
|
30
|
+
after(() => {
|
|
31
|
+
disableJSDOM();
|
|
32
|
+
});
|
|
33
|
+
// Only selector matching is exercised — none of the collaborators are touched.
|
|
34
|
+
function createOpener(filenamePattern) {
|
|
35
|
+
const editor = {
|
|
36
|
+
viewType: 'test.editor',
|
|
37
|
+
displayName: 'Test Editor',
|
|
38
|
+
selector: [{ filenamePattern }],
|
|
39
|
+
priority: common_1.CustomEditorPriority.default
|
|
40
|
+
};
|
|
41
|
+
return new custom_editor_opener_1.CustomEditorOpener(editor, undefined, undefined, undefined, undefined);
|
|
42
|
+
}
|
|
43
|
+
function matches(filenamePattern, path) {
|
|
44
|
+
const opener = createOpener(filenamePattern);
|
|
45
|
+
return opener.matches([{ filenamePattern }], new uri_1.default(`file://${path}`));
|
|
46
|
+
}
|
|
47
|
+
function matchesUri(filenamePattern, uri) {
|
|
48
|
+
const opener = createOpener(filenamePattern);
|
|
49
|
+
return opener.matches([{ filenamePattern }], new uri_1.default(uri));
|
|
50
|
+
}
|
|
51
|
+
it('matches a plain extension pattern against the basename', () => {
|
|
52
|
+
expect(matches('*.custom', '/project/src/file.custom')).true;
|
|
53
|
+
expect(matches('*.custom', '/project/src/file.other')).false;
|
|
54
|
+
});
|
|
55
|
+
it('matches a plain filename pattern against the basename anywhere', () => {
|
|
56
|
+
expect(matches('config.json', '/anywhere/at/all/config.json')).true;
|
|
57
|
+
expect(matches('config.json', '/anywhere/at/all/other.json')).false;
|
|
58
|
+
});
|
|
59
|
+
it('matches case-insensitively', () => {
|
|
60
|
+
expect(matches('*.CUSTOM', '/project/file.custom')).true;
|
|
61
|
+
expect(matches('*.custom', '/project/FILE.CUSTOM')).true;
|
|
62
|
+
});
|
|
63
|
+
it('matches a pattern containing a path separator against the full path (VS Code parity)', () => {
|
|
64
|
+
const pattern = '**/components/*/config.json';
|
|
65
|
+
expect(matches(pattern, '/project/src/components/button/config.json')).true;
|
|
66
|
+
expect(matches(pattern, '/project/elsewhere/config.json')).false;
|
|
67
|
+
expect(matches(pattern, '/project/src/components/button/nested/config.json')).false;
|
|
68
|
+
});
|
|
69
|
+
it('matches nested path patterns', () => {
|
|
70
|
+
const pattern = '**/components/*/styles/*.css';
|
|
71
|
+
expect(matches(pattern, '/project/src/components/button/styles/theme.css')).true;
|
|
72
|
+
expect(matches(pattern, '/project/src/components/button/config.json')).false;
|
|
73
|
+
expect(matches(pattern, '/project/src/components/button/styles/dark/theme.css')).false;
|
|
74
|
+
});
|
|
75
|
+
it('does not let a path pattern match a bare basename', () => {
|
|
76
|
+
expect(matches('**/components/*/config.json', '/config.json')).false;
|
|
77
|
+
});
|
|
78
|
+
it('never matches the excluded schemes, mirroring VS Code (globMatchesResource)', () => {
|
|
79
|
+
// Patterns that would match the basename or full path on a `file:` resource...
|
|
80
|
+
expect(matchesUri('*.json', 'file:///project/settings.json')).true;
|
|
81
|
+
expect(matchesUri('**/settings.json', 'file:///project/settings.json')).true;
|
|
82
|
+
// ...must not match on VS Code's internal schemes.
|
|
83
|
+
expect(matchesUri('*.json', 'vscode-settings:/settings.json')).false;
|
|
84
|
+
expect(matchesUri('**/settings.json', 'vscode-settings:/project/settings.json')).false;
|
|
85
|
+
expect(matchesUri('*.json', 'webview-panel:/panel/config.json')).false;
|
|
86
|
+
expect(matchesUri('*', 'extension:/some/resource')).false;
|
|
87
|
+
expect(matchesUri('*', 'vscode-workspace-trust:/trust')).false;
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=custom-editor-opener.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-editor-opener.spec.js","sourceRoot":"","sources":["../../../../src/main/browser/custom-editors/custom-editor-opener.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/plugin-ext",
|
|
3
|
-
"version": "1.74.0-next.
|
|
3
|
+
"version": "1.74.0-next.38+3595b053a",
|
|
4
4
|
"description": "Theia - Plugin Extension",
|
|
5
5
|
"main": "lib/common/index.js",
|
|
6
6
|
"typings": "lib/common/index.d.ts",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@theia/ai-core": "1.74.0-next.
|
|
9
|
-
"@theia/ai-mcp": "1.74.0-next.
|
|
10
|
-
"@theia/bulk-edit": "1.74.0-next.
|
|
11
|
-
"@theia/callhierarchy": "1.74.0-next.
|
|
12
|
-
"@theia/console": "1.74.0-next.
|
|
13
|
-
"@theia/core": "1.74.0-next.
|
|
14
|
-
"@theia/debug": "1.74.0-next.
|
|
15
|
-
"@theia/editor": "1.74.0-next.
|
|
16
|
-
"@theia/editor-preview": "1.74.0-next.
|
|
17
|
-
"@theia/file-search": "1.74.0-next.
|
|
18
|
-
"@theia/filesystem": "1.74.0-next.
|
|
19
|
-
"@theia/markers": "1.74.0-next.
|
|
20
|
-
"@theia/messages": "1.74.0-next.
|
|
21
|
-
"@theia/monaco": "1.74.0-next.
|
|
8
|
+
"@theia/ai-core": "1.74.0-next.38+3595b053a",
|
|
9
|
+
"@theia/ai-mcp": "1.74.0-next.38+3595b053a",
|
|
10
|
+
"@theia/bulk-edit": "1.74.0-next.38+3595b053a",
|
|
11
|
+
"@theia/callhierarchy": "1.74.0-next.38+3595b053a",
|
|
12
|
+
"@theia/console": "1.74.0-next.38+3595b053a",
|
|
13
|
+
"@theia/core": "1.74.0-next.38+3595b053a",
|
|
14
|
+
"@theia/debug": "1.74.0-next.38+3595b053a",
|
|
15
|
+
"@theia/editor": "1.74.0-next.38+3595b053a",
|
|
16
|
+
"@theia/editor-preview": "1.74.0-next.38+3595b053a",
|
|
17
|
+
"@theia/file-search": "1.74.0-next.38+3595b053a",
|
|
18
|
+
"@theia/filesystem": "1.74.0-next.38+3595b053a",
|
|
19
|
+
"@theia/markers": "1.74.0-next.38+3595b053a",
|
|
20
|
+
"@theia/messages": "1.74.0-next.38+3595b053a",
|
|
21
|
+
"@theia/monaco": "1.74.0-next.38+3595b053a",
|
|
22
22
|
"@theia/monaco-editor-core": "1.108.201",
|
|
23
|
-
"@theia/navigator": "1.74.0-next.
|
|
24
|
-
"@theia/notebook": "1.74.0-next.
|
|
25
|
-
"@theia/output": "1.74.0-next.
|
|
26
|
-
"@theia/plugin": "1.74.0-next.
|
|
27
|
-
"@theia/preferences": "1.74.0-next.
|
|
28
|
-
"@theia/scm": "1.74.0-next.
|
|
29
|
-
"@theia/search-in-workspace": "1.74.0-next.
|
|
30
|
-
"@theia/task": "1.74.0-next.
|
|
31
|
-
"@theia/terminal": "1.74.0-next.
|
|
32
|
-
"@theia/test": "1.74.0-next.
|
|
33
|
-
"@theia/timeline": "1.74.0-next.
|
|
34
|
-
"@theia/typehierarchy": "1.74.0-next.
|
|
35
|
-
"@theia/variable-resolver": "1.74.0-next.
|
|
36
|
-
"@theia/workspace": "1.74.0-next.
|
|
23
|
+
"@theia/navigator": "1.74.0-next.38+3595b053a",
|
|
24
|
+
"@theia/notebook": "1.74.0-next.38+3595b053a",
|
|
25
|
+
"@theia/output": "1.74.0-next.38+3595b053a",
|
|
26
|
+
"@theia/plugin": "1.74.0-next.38+3595b053a",
|
|
27
|
+
"@theia/preferences": "1.74.0-next.38+3595b053a",
|
|
28
|
+
"@theia/scm": "1.74.0-next.38+3595b053a",
|
|
29
|
+
"@theia/search-in-workspace": "1.74.0-next.38+3595b053a",
|
|
30
|
+
"@theia/task": "1.74.0-next.38+3595b053a",
|
|
31
|
+
"@theia/terminal": "1.74.0-next.38+3595b053a",
|
|
32
|
+
"@theia/test": "1.74.0-next.38+3595b053a",
|
|
33
|
+
"@theia/timeline": "1.74.0-next.38+3595b053a",
|
|
34
|
+
"@theia/typehierarchy": "1.74.0-next.38+3595b053a",
|
|
35
|
+
"@theia/variable-resolver": "1.74.0-next.38+3595b053a",
|
|
36
|
+
"@theia/workspace": "1.74.0-next.38+3595b053a",
|
|
37
37
|
"@types/mime": "^2.0.3",
|
|
38
38
|
"@vscode/debugprotocol": "^1.68.0",
|
|
39
39
|
"@vscode/proxy-agent": "^0.13.2",
|
|
@@ -98,5 +98,5 @@
|
|
|
98
98
|
"nyc": {
|
|
99
99
|
"extends": "../../configs/nyc.json"
|
|
100
100
|
},
|
|
101
|
-
"gitHead": "
|
|
101
|
+
"gitHead": "3595b053a48a1a4c7171aea0361a25f782140af9"
|
|
102
102
|
}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 Safi Seid-Ahmad, K2view 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 { enableJSDOM } from '@theia/core/lib/browser/test/jsdom';
|
|
18
|
+
let disableJSDOM = enableJSDOM();
|
|
19
|
+
|
|
20
|
+
import * as chai from 'chai';
|
|
21
|
+
import URI from '@theia/core/lib/common/uri';
|
|
22
|
+
import { CustomEditorOpener } from './custom-editor-opener';
|
|
23
|
+
import { CustomEditor, CustomEditorPriority } from '../../../common';
|
|
24
|
+
|
|
25
|
+
disableJSDOM();
|
|
26
|
+
|
|
27
|
+
const expect = chai.expect;
|
|
28
|
+
|
|
29
|
+
describe('CustomEditorOpener#selectorMatches', () => {
|
|
30
|
+
|
|
31
|
+
before(() => {
|
|
32
|
+
disableJSDOM = enableJSDOM();
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
after(() => {
|
|
36
|
+
disableJSDOM();
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
// Only selector matching is exercised — none of the collaborators are touched.
|
|
40
|
+
function createOpener(filenamePattern: string): CustomEditorOpener {
|
|
41
|
+
const editor: CustomEditor = {
|
|
42
|
+
viewType: 'test.editor',
|
|
43
|
+
displayName: 'Test Editor',
|
|
44
|
+
selector: [{ filenamePattern }],
|
|
45
|
+
priority: CustomEditorPriority.default
|
|
46
|
+
};
|
|
47
|
+
return new CustomEditorOpener(editor, undefined!, undefined!, undefined!, undefined!);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function matches(filenamePattern: string, path: string): boolean {
|
|
51
|
+
const opener = createOpener(filenamePattern);
|
|
52
|
+
return opener.matches([{ filenamePattern }], new URI(`file://${path}`));
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function matchesUri(filenamePattern: string, uri: string): boolean {
|
|
56
|
+
const opener = createOpener(filenamePattern);
|
|
57
|
+
return opener.matches([{ filenamePattern }], new URI(uri));
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
it('matches a plain extension pattern against the basename', () => {
|
|
61
|
+
expect(matches('*.custom', '/project/src/file.custom')).true;
|
|
62
|
+
expect(matches('*.custom', '/project/src/file.other')).false;
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
it('matches a plain filename pattern against the basename anywhere', () => {
|
|
66
|
+
expect(matches('config.json', '/anywhere/at/all/config.json')).true;
|
|
67
|
+
expect(matches('config.json', '/anywhere/at/all/other.json')).false;
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('matches case-insensitively', () => {
|
|
71
|
+
expect(matches('*.CUSTOM', '/project/file.custom')).true;
|
|
72
|
+
expect(matches('*.custom', '/project/FILE.CUSTOM')).true;
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
it('matches a pattern containing a path separator against the full path (VS Code parity)', () => {
|
|
76
|
+
const pattern = '**/components/*/config.json';
|
|
77
|
+
expect(matches(pattern, '/project/src/components/button/config.json')).true;
|
|
78
|
+
expect(matches(pattern, '/project/elsewhere/config.json')).false;
|
|
79
|
+
expect(matches(pattern, '/project/src/components/button/nested/config.json')).false;
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it('matches nested path patterns', () => {
|
|
83
|
+
const pattern = '**/components/*/styles/*.css';
|
|
84
|
+
expect(matches(pattern, '/project/src/components/button/styles/theme.css')).true;
|
|
85
|
+
expect(matches(pattern, '/project/src/components/button/config.json')).false;
|
|
86
|
+
expect(matches(pattern, '/project/src/components/button/styles/dark/theme.css')).false;
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it('does not let a path pattern match a bare basename', () => {
|
|
90
|
+
expect(matches('**/components/*/config.json', '/config.json')).false;
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('never matches the excluded schemes, mirroring VS Code (globMatchesResource)', () => {
|
|
94
|
+
// Patterns that would match the basename or full path on a `file:` resource...
|
|
95
|
+
expect(matchesUri('*.json', 'file:///project/settings.json')).true;
|
|
96
|
+
expect(matchesUri('**/settings.json', 'file:///project/settings.json')).true;
|
|
97
|
+
// ...must not match on VS Code's internal schemes.
|
|
98
|
+
expect(matchesUri('*.json', 'vscode-settings:/settings.json')).false;
|
|
99
|
+
expect(matchesUri('**/settings.json', 'vscode-settings:/project/settings.json')).false;
|
|
100
|
+
expect(matchesUri('*.json', 'webview-panel:/panel/config.json')).false;
|
|
101
|
+
expect(matchesUri('*', 'extension:/some/resource')).false;
|
|
102
|
+
expect(matchesUri('*', 'vscode-workspace-trust:/trust')).false;
|
|
103
|
+
});
|
|
104
|
+
});
|
|
@@ -24,6 +24,20 @@ import { PluginCustomEditorRegistry } from './plugin-custom-editor-registry';
|
|
|
24
24
|
import { generateUuid } from '@theia/core/lib/common/uuid';
|
|
25
25
|
import { DisposableCollection, Emitter, PreferenceService } from '@theia/core';
|
|
26
26
|
import { match } from '@theia/core/lib/common/glob';
|
|
27
|
+
import { Schemes } from '../../../common/uri-components';
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Schemes that never match a custom editor's `filenamePattern`, mirroring the
|
|
31
|
+
* excluded schemes in VS Code's `editorResolverService#globMatchesResource`.
|
|
32
|
+
* Theia has no scheme constants for `extension` and `vscode-workspace-trust`,
|
|
33
|
+
* so those are referenced by their literal values.
|
|
34
|
+
*/
|
|
35
|
+
const nonMatchingSchemes = new Set<string>([
|
|
36
|
+
'extension',
|
|
37
|
+
Schemes.webviewPanel,
|
|
38
|
+
'vscode-workspace-trust',
|
|
39
|
+
Schemes.vscodeSettings
|
|
40
|
+
]);
|
|
27
41
|
|
|
28
42
|
export class CustomEditorOpener implements OpenHandler {
|
|
29
43
|
|
|
@@ -200,8 +214,19 @@ export class CustomEditorOpener implements OpenHandler {
|
|
|
200
214
|
}
|
|
201
215
|
|
|
202
216
|
selectorMatches(selector: CustomEditorSelector, resource: URI): boolean {
|
|
217
|
+
if (nonMatchingSchemes.has(resource.scheme)) {
|
|
218
|
+
// These schemes match no glob pattern, mirroring VS Code's `globMatchesResource`.
|
|
219
|
+
return false;
|
|
220
|
+
}
|
|
203
221
|
if (selector.filenamePattern) {
|
|
204
|
-
|
|
222
|
+
const filenamePattern = selector.filenamePattern.toLowerCase();
|
|
223
|
+
// Mirror VS Code's editor-association matching (editorResolverService#globMatchesResource):
|
|
224
|
+
// a pattern containing a path separator is matched against the full `scheme:path`,
|
|
225
|
+
// a plain pattern is matched against the basename only.
|
|
226
|
+
const target = filenamePattern.includes('/')
|
|
227
|
+
? `${resource.scheme}:${resource.path.toString()}`.toLowerCase()
|
|
228
|
+
: resource.path.base.toLowerCase();
|
|
229
|
+
if (match(filenamePattern, target)) {
|
|
205
230
|
return true;
|
|
206
231
|
}
|
|
207
232
|
}
|