@theia/terminal 1.74.0-next.5 → 1.74.0-next.53
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/browser/terminal-file-link-provider.d.ts +3 -8
- package/lib/browser/terminal-file-link-provider.d.ts.map +1 -1
- package/lib/browser/terminal-file-link-provider.js +13 -35
- package/lib/browser/terminal-file-link-provider.js.map +1 -1
- package/lib/browser/terminal-file-link-provider.spec.d.ts +2 -0
- package/lib/browser/terminal-file-link-provider.spec.d.ts.map +1 -0
- package/lib/browser/terminal-file-link-provider.spec.js +79 -0
- package/lib/browser/terminal-file-link-provider.spec.js.map +1 -0
- package/lib/browser/terminal-file-opening-link-provider.d.ts +20 -0
- package/lib/browser/terminal-file-opening-link-provider.d.ts.map +1 -0
- package/lib/browser/terminal-file-opening-link-provider.js +59 -0
- package/lib/browser/terminal-file-opening-link-provider.js.map +1 -0
- package/lib/browser/terminal-file-uri-link-provider.d.ts +29 -0
- package/lib/browser/terminal-file-uri-link-provider.d.ts.map +1 -0
- package/lib/browser/terminal-file-uri-link-provider.js +95 -0
- package/lib/browser/terminal-file-uri-link-provider.js.map +1 -0
- package/lib/browser/terminal-file-uri-link-provider.spec.d.ts +2 -0
- package/lib/browser/terminal-file-uri-link-provider.spec.d.ts.map +1 -0
- package/lib/browser/terminal-file-uri-link-provider.spec.js +180 -0
- package/lib/browser/terminal-file-uri-link-provider.spec.js.map +1 -0
- package/lib/browser/terminal-frontend-module.d.ts.map +1 -1
- package/lib/browser/terminal-frontend-module.js +3 -0
- package/lib/browser/terminal-frontend-module.js.map +1 -1
- package/package.json +9 -9
- package/src/browser/terminal-file-link-provider.spec.ts +95 -0
- package/src/browser/terminal-file-link-provider.ts +11 -28
- package/src/browser/terminal-file-opening-link-provider.ts +57 -0
- package/src/browser/terminal-file-uri-link-provider.spec.ts +203 -0
- package/src/browser/terminal-file-uri-link-provider.ts +91 -0
- package/src/browser/terminal-frontend-module.ts +3 -0
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// *****************************************************************************
|
|
3
|
+
// Copyright (C) 2026 JuliaHub, Inc. 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
|
+
const disableJSDOM = (0, jsdom_1.enableJSDOM)();
|
|
20
|
+
// Importing the provider pulls in xterm, which probes a canvas 2d context on load; JSDOM has no
|
|
21
|
+
// canvas backend, so stub it out to keep this spec runnable without the native `canvas` package.
|
|
22
|
+
HTMLCanvasElement.prototype.getContext = () => undefined;
|
|
23
|
+
const frontend_application_config_provider_1 = require("@theia/core/lib/browser/frontend-application-config-provider");
|
|
24
|
+
frontend_application_config_provider_1.FrontendApplicationConfigProvider.set({});
|
|
25
|
+
const chai = require("chai");
|
|
26
|
+
const uri_1 = require("@theia/core/lib/common/uri");
|
|
27
|
+
const terminal_file_uri_link_provider_1 = require("./terminal-file-uri-link-provider");
|
|
28
|
+
disableJSDOM();
|
|
29
|
+
const expect = chai.expect;
|
|
30
|
+
class TestFileUriLinkProvider extends terminal_file_uri_link_provider_1.FileUriLinkProvider {
|
|
31
|
+
constructor(existingFiles, directories = []) {
|
|
32
|
+
super();
|
|
33
|
+
this.loggedErrors = [];
|
|
34
|
+
this.opened = [];
|
|
35
|
+
this.openedOptions = [];
|
|
36
|
+
const files = new Set(existingFiles);
|
|
37
|
+
const dirs = new Set(directories.map(uri => new uri_1.default(uri).toString()));
|
|
38
|
+
this.logger = {
|
|
39
|
+
error: (message) => { this.loggedErrors.push(String(message)); }
|
|
40
|
+
};
|
|
41
|
+
this.fileService = {
|
|
42
|
+
resolve: async (uri) => {
|
|
43
|
+
if (dirs.has(uri.toString())) {
|
|
44
|
+
return { isDirectory: true };
|
|
45
|
+
}
|
|
46
|
+
if (files.has(uri.toString())) {
|
|
47
|
+
return { isDirectory: false };
|
|
48
|
+
}
|
|
49
|
+
throw new Error('does not exist');
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const opener = {
|
|
53
|
+
id: 'test',
|
|
54
|
+
canHandle: () => 1,
|
|
55
|
+
open: async (uri, options) => {
|
|
56
|
+
this.opened.push(uri.toString());
|
|
57
|
+
this.openedOptions.push(options);
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
this.openerService = {
|
|
62
|
+
getOpener: async () => opener,
|
|
63
|
+
getOpeners: async () => [opener]
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
const terminal = {};
|
|
68
|
+
describe('FileUriLinkProvider', () => {
|
|
69
|
+
it('should linkify and open a POSIX file:// URL that resolves to a file', async () => {
|
|
70
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
71
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
72
|
+
const links = await provider.provideLinks(`open ${uri} now`, terminal);
|
|
73
|
+
expect(links).to.have.lengthOf(1);
|
|
74
|
+
expect(links[0].startIndex).to.equal('open '.length);
|
|
75
|
+
expect(links[0].length).to.equal(uri.length);
|
|
76
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
77
|
+
await links[0].handle();
|
|
78
|
+
expect(provider.opened).to.deep.equal([new uri_1.default(uri).toString()]);
|
|
79
|
+
});
|
|
80
|
+
it('should linkify a Windows drive file:// URL', async () => {
|
|
81
|
+
const uri = 'file:///C:/Users/dev/file.ts';
|
|
82
|
+
const provider = new TestFileUriLinkProvider([new uri_1.default(uri).toString()]);
|
|
83
|
+
const links = await provider.provideLinks(`see ${uri}`, terminal);
|
|
84
|
+
expect(links).to.have.lengthOf(1);
|
|
85
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
86
|
+
});
|
|
87
|
+
it('should linkify a UNC file:// URL with an authority', async () => {
|
|
88
|
+
const uri = 'file://server/share/file.ts';
|
|
89
|
+
const provider = new TestFileUriLinkProvider([new uri_1.default(uri).toString()]);
|
|
90
|
+
const links = await provider.provideLinks(uri, terminal);
|
|
91
|
+
expect(links).to.have.lengthOf(1);
|
|
92
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
93
|
+
});
|
|
94
|
+
it('should not produce a link for a file:// URL that does not resolve, without throwing or logging', async () => {
|
|
95
|
+
const provider = new TestFileUriLinkProvider([]);
|
|
96
|
+
const links = await provider.provideLinks('open file:///home/user/missing.ts now', terminal);
|
|
97
|
+
expect(links).to.deep.equal([]);
|
|
98
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
99
|
+
});
|
|
100
|
+
it('should ignore http(s) URLs', async () => {
|
|
101
|
+
const provider = new TestFileUriLinkProvider([]);
|
|
102
|
+
const links = await provider.provideLinks('see https://example.com/path for details', terminal);
|
|
103
|
+
expect(links).to.deep.equal([]);
|
|
104
|
+
});
|
|
105
|
+
it('should trim trailing sentence punctuation from the matched URL', async () => {
|
|
106
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
107
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
108
|
+
const links = await provider.provideLinks(`the file is ${uri}.`, terminal);
|
|
109
|
+
expect(links).to.have.lengthOf(1);
|
|
110
|
+
expect(links[0].length).to.equal(uri.length);
|
|
111
|
+
});
|
|
112
|
+
it('should open at the given line and column for a file://…:line:column suffix', async () => {
|
|
113
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
114
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
115
|
+
const match = `${uri}:10:5`;
|
|
116
|
+
const links = await provider.provideLinks(`error at ${match}`, terminal);
|
|
117
|
+
expect(links).to.have.lengthOf(1);
|
|
118
|
+
// The whole `file://…:10:5` is clickable, but the URI drops the position suffix.
|
|
119
|
+
expect(links[0].length).to.equal(match.length);
|
|
120
|
+
await links[0].handle();
|
|
121
|
+
expect(provider.opened).to.deep.equal([new uri_1.default(uri).toString()]);
|
|
122
|
+
// one-based `10:5` becomes a zero-based editor position.
|
|
123
|
+
expect(provider.openedOptions).to.deep.equal([{ selection: { start: { line: 9, character: 4 } } }]);
|
|
124
|
+
});
|
|
125
|
+
it('should open at the given line with a file://…:line suffix (no column)', async () => {
|
|
126
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
127
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
128
|
+
const links = await provider.provideLinks(`${uri}:42`, terminal);
|
|
129
|
+
expect(links).to.have.lengthOf(1);
|
|
130
|
+
await links[0].handle();
|
|
131
|
+
expect(provider.opened).to.deep.equal([new uri_1.default(uri).toString()]);
|
|
132
|
+
expect(provider.openedOptions).to.deep.equal([{ selection: { start: { line: 41, character: 0 } } }]);
|
|
133
|
+
});
|
|
134
|
+
it('should keep the Windows drive colon and still apply a trailing position', async () => {
|
|
135
|
+
const uri = 'file:///C:/Users/dev/file.ts';
|
|
136
|
+
const provider = new TestFileUriLinkProvider([new uri_1.default(uri).toString()]);
|
|
137
|
+
const links = await provider.provideLinks(`${uri}:7:3`, terminal);
|
|
138
|
+
expect(links).to.have.lengthOf(1);
|
|
139
|
+
await links[0].handle();
|
|
140
|
+
expect(provider.opened).to.deep.equal([new uri_1.default(uri).toString()]);
|
|
141
|
+
expect(provider.openedOptions).to.deep.equal([{ selection: { start: { line: 6, character: 2 } } }]);
|
|
142
|
+
});
|
|
143
|
+
it('should clamp a zero line/column to the first position', async () => {
|
|
144
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
145
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
146
|
+
const links = await provider.provideLinks(`${uri}:0`, terminal);
|
|
147
|
+
expect(links).to.have.lengthOf(1);
|
|
148
|
+
await links[0].handle();
|
|
149
|
+
expect(provider.openedOptions).to.deep.equal([{ selection: { start: { line: 0, character: 0 } } }]);
|
|
150
|
+
});
|
|
151
|
+
it('should not produce a link for a file:// URL that resolves to a directory', async () => {
|
|
152
|
+
const uri = 'file:///home/user/project';
|
|
153
|
+
const provider = new TestFileUriLinkProvider([], [uri]);
|
|
154
|
+
const links = await provider.provideLinks(`open ${uri} now`, terminal);
|
|
155
|
+
expect(links).to.deep.equal([]);
|
|
156
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
157
|
+
});
|
|
158
|
+
it('should linkify every file:// URL on a line at the correct offsets', async () => {
|
|
159
|
+
const a = 'file:///home/user/a.ts';
|
|
160
|
+
const b = 'file:///home/user/b.ts';
|
|
161
|
+
const provider = new TestFileUriLinkProvider([a, b]);
|
|
162
|
+
const line = `first ${a} then ${b}`;
|
|
163
|
+
const links = await provider.provideLinks(line, terminal);
|
|
164
|
+
expect(links).to.have.lengthOf(2);
|
|
165
|
+
expect(links.map(link => link.startIndex)).to.deep.equal([line.indexOf(a), line.indexOf(b)]);
|
|
166
|
+
expect(links.map(link => line.substr(link.startIndex, link.length))).to.deep.equal([a, b]);
|
|
167
|
+
});
|
|
168
|
+
it('should not leak regex state across concurrent invocations', async () => {
|
|
169
|
+
const a = 'file:///home/user/a.ts';
|
|
170
|
+
const b = 'file:///home/user/b.ts';
|
|
171
|
+
const provider = new TestFileUriLinkProvider([a, b]);
|
|
172
|
+
const [linksA, linksB] = await Promise.all([
|
|
173
|
+
provider.provideLinks(`x ${a}`, terminal),
|
|
174
|
+
provider.provideLinks(b, terminal)
|
|
175
|
+
]);
|
|
176
|
+
expect(linksA.map(link => link.length)).to.deep.equal([a.length]);
|
|
177
|
+
expect(linksB.map(link => link.length)).to.deep.equal([b.length]);
|
|
178
|
+
});
|
|
179
|
+
});
|
|
180
|
+
//# sourceMappingURL=terminal-file-uri-link-provider.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-file-uri-link-provider.spec.js","sourceRoot":"","sources":["../../src/browser/terminal-file-uri-link-provider.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-frontend-module.d.ts","sourceRoot":"","sources":["../../src/browser/terminal-frontend-module.ts"],"names":[],"mappings":"AAgBA,OAAO,sCAAsC,CAAC;AAC9C,OAAO,qBAAqB,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAa,MAAM,8BAA8B,CAAC;;
|
|
1
|
+
{"version":3,"file":"terminal-frontend-module.d.ts","sourceRoot":"","sources":["../../src/browser/terminal-frontend-module.ts"],"names":[],"mappings":"AAgBA,OAAO,sCAAsC,CAAC;AAC9C,OAAO,qBAAqB,CAAC;AAE7B,OAAO,EAAE,eAAe,EAAa,MAAM,8BAA8B,CAAC;;AAiC1E,wBAgGG"}
|
|
@@ -43,6 +43,7 @@ const quick_access_1 = require("@theia/core/lib/browser/quick-input/quick-access
|
|
|
43
43
|
const terminal_link_provider_1 = require("./terminal-link-provider");
|
|
44
44
|
const terminal_url_link_provider_1 = require("./terminal-url-link-provider");
|
|
45
45
|
const terminal_file_link_provider_1 = require("./terminal-file-link-provider");
|
|
46
|
+
const terminal_file_uri_link_provider_1 = require("./terminal-file-uri-link-provider");
|
|
46
47
|
const terminal_profile_service_1 = require("./terminal-profile-service");
|
|
47
48
|
const terminal_command_history_1 = require("./terminal-command-history");
|
|
48
49
|
exports.default = new inversify_1.ContainerModule(bind => {
|
|
@@ -104,6 +105,8 @@ exports.default = new inversify_1.ContainerModule(bind => {
|
|
|
104
105
|
// default terminal link provider
|
|
105
106
|
bind(terminal_url_link_provider_1.UrlLinkProvider).toSelf().inSingletonScope();
|
|
106
107
|
bind(terminal_link_provider_1.TerminalLinkProvider).toService(terminal_url_link_provider_1.UrlLinkProvider);
|
|
108
|
+
bind(terminal_file_uri_link_provider_1.FileUriLinkProvider).toSelf().inSingletonScope();
|
|
109
|
+
bind(terminal_link_provider_1.TerminalLinkProvider).toService(terminal_file_uri_link_provider_1.FileUriLinkProvider);
|
|
107
110
|
bind(terminal_file_link_provider_1.FileLinkProvider).toSelf().inSingletonScope();
|
|
108
111
|
bind(terminal_link_provider_1.TerminalLinkProvider).toService(terminal_file_link_provider_1.FileLinkProvider);
|
|
109
112
|
bind(terminal_file_link_provider_1.FileDiffPreLinkProvider).toSelf().inSingletonScope();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-frontend-module.js","sourceRoot":"","sources":["../../src/browser/terminal-frontend-module.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,yCAAyC;AACzC,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;;AAEhF,gDAA8C;AAC9C,+BAA6B;AAE7B,4DAA0E;AAC1E,mDAAoF;AACpF,sCAA2D;AAC3D,qDAA8I;AAC9I,mFAA0F;AAC1F,qFAAgF;AAChF,iEAAwF;AACxF,4DAA+E;AAC/E,mEAA4E;AAC5E,iEAA6D;AAC7D,+EAAsH;AACtH,8DAA0D;AAC1D,yEAAyE;AACzE,mEAA+D;AAC/D,2EAAsE;AACtE,qEAAgE;AAChE,4EAA8E;AAC9E,+EAAwG;AACxG,kFAAiF;AACjF,6FAAsF;AACtF,2GAA2F;AAC3F,qEAAgE;AAChE,mFAA2F;AAC3F,qEAA4I;AAC5I,6EAA+D;AAC/D,+EAA2I;AAC3I,yEAGoC;AACpC,yEAAiH;AAEjH,kBAAe,IAAI,2BAAe,CAAC,IAAI,CAAC,EAAE;IACtC,IAAA,8CAAuB,EAAC,IAAI,CAAC,CAAC;IAE9B,IAAI,CAAC,gCAAc,CAAC,CAAC,EAAE,CAAC,yCAAkB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC/D,IAAI,CAAC,kCAAe,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAElD,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,CAAC,uBAAa,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACvC,EAAE,EAAE,iDAA0B;QAC9B,YAAY,EAAE,CAAC,OAA8B,EAAE,EAAE;YAC7C,MAAM,KAAK,GAAG,IAAI,qBAAS,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,CAAC,CAAC;YAC3D,KAAK,CAAC,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC;YAC7B,MAAM,OAAO,GAAG,WAAW,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,IAAI,WAAW,GAAG,OAAO,CAAC;YAClD,MAAM,aAAa,GAA0B;gBACzC,KAAK,EAAE,YAAG,CAAC,iBAAiB,CAAC,cAAc,EAAE,OAAO,CAAC;gBACrD,cAAc,EAAE,IAAI;gBACpB,kBAAkB,EAAE,IAAI;gBACxB,GAAG,OAAO;aACb,CAAC;YACF,KAAK,CAAC,IAAI,CAAC,uCAAqB,CAAC,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;YACjE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;YAErD,KAAK,CAAC,IAAI,CAAC,oDAA2B,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC,IAAA,uDAA2B,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC;YAElH,OAAO,KAAK,CAAC,GAAG,CAAC,gCAAc,CAAC,CAAC;QACrC,CAAC;KACJ,CAAC,CAAC,CAAC;IAEJ,IAAI,CAAC,sDAAwB,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC3D,IAAI,CAAC,mEAA8B,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAEjE,IAAI,CAAC,2DAA6B,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAChE,KAAK,MAAM,UAAU,IAAI,CAAC,4BAAmB,EAAE,sCAAuB,CAAC,EAAE,CAAC;QACtE,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,2DAA6B,CAAC,CAAC;IAC9D,CAAC;IAED,IAAI,CAAC,6CAAoB,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACvD,IAAI,CAAC,6DAA4B,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC/D,IAAI,CAAC,kCAAe,CAAC,CAAC,SAAS,CAAC,6DAA4B,CAAC,CAAC;IAC9D,KAAK,MAAM,UAAU,IAAI,CAAC,4BAAmB,EAAE,yBAAgB,EAAE,gCAAsB,EAAE,2CAAyB,EAAE,kDAAiB,CAAC,EAAE,CAAC;QACrI,IAAI,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,6DAA4B,CAAC,CAAC;IAC7D,CAAC;IAED,IAAI,CAAC,mCAAe,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;QACvC,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,qCAA2B,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,kCAAe,CAAC,CAAC;QAC3D,OAAO,UAAU,CAAC,WAAW,CAAkB,gCAAY,EAAE,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtG,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAEtB,IAAI,CAAC,kDAAwB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;QAChD,MAAM,UAAU,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,qCAA2B,CAAC,CAAC;QAClE,MAAM,eAAe,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,kCAAe,CAAC,CAAC;QAC3D,OAAO,UAAU,CAAC,WAAW,CAAuB,2CAAiB,EAAE,eAAe,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAChH,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACtB,IAAI,CAAC,8CAAoB,CAAC,CAAC,SAAS,CAAC,kDAAwB,CAAC,CAAC;IAE/D,IAAA,mCAA4B,EAAC,IAAI,EAAE,4CAAoB,CAAC,CAAC;IACzD,IAAA,mCAA4B,EAAC,IAAI,EAAE,mDAAuB,CAAC,CAAC;IAC5D,IAAI,CAAC,6CAAoB,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACvD,IAAI,CAAC,mDAAuB,CAAC,CAAC,SAAS,CAAC,6CAAoB,CAAC,CAAC;IAE9D,4CAA4C;IAC5C,IAAA,mCAA4B,EAAC,IAAI,EAAE,6CAAoB,CAAC,CAAC;IACzD,IAAI,CAAC,yDAAgC,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACnE,IAAI,CAAC,4CAAoB,CAAC,CAAC,SAAS,CAAC,yDAAgC,CAAC,CAAC;IACvE,IAAI,CAAC,yCAAgB,CAAC,CAAC,SAAS,CAAC,+CAAsB,CAAC,CAAC;IAEzD,iCAAiC;IACjC,IAAI,CAAC,4CAAe,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAClD,IAAI,CAAC,6CAAoB,CAAC,CAAC,SAAS,CAAC,4CAAe,CAAC,CAAC;IACtD,IAAI,CAAC,8CAAgB,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACnD,IAAI,CAAC,6CAAoB,CAAC,CAAC,SAAS,CAAC,8CAAgB,CAAC,CAAC;IACvD,IAAI,CAAC,qDAAuB,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC1D,IAAI,CAAC,6CAAoB,CAAC,CAAC,SAAS,CAAC,qDAAuB,CAAC,CAAC;IAC9D,IAAI,CAAC,sDAAwB,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAC3D,IAAI,CAAC,6CAAoB,CAAC,CAAC,SAAS,CAAC,sDAAwB,CAAC,CAAC;IAC/D,IAAI,CAAC,mDAAqB,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IACxD,IAAI,CAAC,6CAAoB,CAAC,CAAC,SAAS,CAAC,mDAAqB,CAAC,CAAC;IAE5D,IAAI,CAAC,0DAA+B,CAAC,CAAC,EAAE,CAAC,8CAAmB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IACjF,IAAI,CAAC,mDAAwB,CAAC,CAAC,EAAE,CAAC,8CAAmB,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAC1E,IAAI,CAAC,iDAAsB,CAAC,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE;QAC9C,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAuB,mDAAwB,CAAC,CAAC;QACpF,MAAM,gBAAgB,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAuB,0DAA+B,CAAC,CAAC;QAClG,OAAO,IAAI,wDAA6B,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;IAEtB,IAAI,CAAC,yCAA+B,CAAC,CAAC,SAAS,CAAC,6DAA4B,CAAC,CAAC;IAE9E,IAAI,CAAC,0DAA+B,CAAC,CAAC,MAAM,EAAE,CAAC,gBAAgB,EAAE,CAAC;IAClE,IAAI,CAAC,6DAAkC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CACrD,GAAG,EAAE,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,0DAA+B,CAAC,CAC3D,CAAC;AACN,CAAC,CAAC,CAAC"}
|
|
1
|
+
{"version":3,"file":"terminal-frontend-module.js","sourceRoot":"","sources":["../../src/browser/terminal-frontend-module.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@theia/terminal",
|
|
3
|
-
"version": "1.74.0-next.
|
|
3
|
+
"version": "1.74.0-next.53+8e4e53136c6",
|
|
4
4
|
"description": "Theia - Terminal Extension",
|
|
5
5
|
"dependencies": {
|
|
6
|
-
"@theia/core": "1.74.0-next.
|
|
7
|
-
"@theia/editor": "1.74.0-next.
|
|
8
|
-
"@theia/file-search": "1.74.0-next.
|
|
9
|
-
"@theia/filesystem": "1.74.0-next.
|
|
10
|
-
"@theia/process": "1.74.0-next.
|
|
11
|
-
"@theia/variable-resolver": "1.74.0-next.
|
|
12
|
-
"@theia/workspace": "1.74.0-next.
|
|
6
|
+
"@theia/core": "1.74.0-next.53+8e4e53136c6",
|
|
7
|
+
"@theia/editor": "1.74.0-next.53+8e4e53136c6",
|
|
8
|
+
"@theia/file-search": "1.74.0-next.53+8e4e53136c6",
|
|
9
|
+
"@theia/filesystem": "1.74.0-next.53+8e4e53136c6",
|
|
10
|
+
"@theia/process": "1.74.0-next.53+8e4e53136c6",
|
|
11
|
+
"@theia/variable-resolver": "1.74.0-next.53+8e4e53136c6",
|
|
12
|
+
"@theia/workspace": "1.74.0-next.53+8e4e53136c6",
|
|
13
13
|
"tslib": "^2.8.1",
|
|
14
14
|
"xterm": "^5.3.0",
|
|
15
15
|
"xterm-addon-fit": "^0.8.0",
|
|
@@ -56,5 +56,5 @@
|
|
|
56
56
|
"nyc": {
|
|
57
57
|
"extends": "../../configs/nyc.json"
|
|
58
58
|
},
|
|
59
|
-
"gitHead": "
|
|
59
|
+
"gitHead": "8e4e53136c69cec1ef61747c7269f9a935b76574"
|
|
60
60
|
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 JuliaHub, 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 { enableJSDOM } from '@theia/core/lib/browser/test/jsdom';
|
|
18
|
+
const disableJSDOM = enableJSDOM();
|
|
19
|
+
// Importing the provider pulls in xterm, which probes a canvas 2d context on load; JSDOM has no
|
|
20
|
+
// canvas backend, so stub it out to keep this spec runnable without the native `canvas` package.
|
|
21
|
+
(HTMLCanvasElement.prototype as unknown as { getContext: () => unknown }).getContext = () => undefined;
|
|
22
|
+
|
|
23
|
+
import { FrontendApplicationConfigProvider } from '@theia/core/lib/browser/frontend-application-config-provider';
|
|
24
|
+
FrontendApplicationConfigProvider.set({});
|
|
25
|
+
|
|
26
|
+
import * as chai from 'chai';
|
|
27
|
+
import { ILogger } from '@theia/core';
|
|
28
|
+
import URI from '@theia/core/lib/common/uri';
|
|
29
|
+
import { TerminalWidget } from './base/terminal-widget';
|
|
30
|
+
import { FileLinkProvider } from './terminal-file-link-provider';
|
|
31
|
+
|
|
32
|
+
disableJSDOM();
|
|
33
|
+
|
|
34
|
+
const expect = chai.expect;
|
|
35
|
+
|
|
36
|
+
class TestFileLinkProvider extends FileLinkProvider {
|
|
37
|
+
readonly loggedErrors: string[] = [];
|
|
38
|
+
|
|
39
|
+
constructor() {
|
|
40
|
+
super();
|
|
41
|
+
(this as unknown as { logger: ILogger }).logger = {
|
|
42
|
+
error: (message: unknown) => { this.loggedErrors.push(String(message)); }
|
|
43
|
+
} as unknown as ILogger;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
exposeToURI(match: string, cwd: URI): Promise<URI | undefined> {
|
|
47
|
+
return this.toURI(match, cwd);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function terminalWithCwd(cwd: URI): TerminalWidget {
|
|
52
|
+
return { lastCwd: cwd } as unknown as TerminalWidget;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
describe('FileLinkProvider', () => {
|
|
56
|
+
|
|
57
|
+
const cwd = new URI('file:///home/user/project');
|
|
58
|
+
|
|
59
|
+
describe('#toURI', () => {
|
|
60
|
+
|
|
61
|
+
it('should skip a URL authority path beginning with "//" instead of throwing', async () => {
|
|
62
|
+
const provider = new TestFileLinkProvider();
|
|
63
|
+
// The '//host/path' the file-path regex matches from a printed URL (its ':' is excluded).
|
|
64
|
+
expect(await provider.exposeToURI('//juliahub.com/products/dyad', cwd)).to.equal(undefined);
|
|
65
|
+
expect(await provider.exposeToURI('//github.com/DyadLang/DyadIssues', cwd)).to.equal(undefined);
|
|
66
|
+
});
|
|
67
|
+
|
|
68
|
+
it('should still resolve a genuine absolute local path', async () => {
|
|
69
|
+
const provider = new TestFileLinkProvider();
|
|
70
|
+
const uri = await provider.exposeToURI('/home/user/project/file.ts', cwd);
|
|
71
|
+
expect(uri).to.not.equal(undefined);
|
|
72
|
+
expect(uri!.path.toString()).to.equal('/home/user/project/file.ts');
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
describe('#provideLinks', () => {
|
|
77
|
+
|
|
78
|
+
it('should not produce a file link or log an error for a printed URL', async () => {
|
|
79
|
+
const provider = new TestFileLinkProvider();
|
|
80
|
+
const links = await provider.provideLinks('see https://juliahub.com/products/dyad for details', terminalWithCwd(cwd));
|
|
81
|
+
expect(links).to.deep.equal([]);
|
|
82
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
it('should not throw or log for a printed file:// URL', async () => {
|
|
86
|
+
const provider = new TestFileLinkProvider();
|
|
87
|
+
// ':' is excluded, so a file:// URL survives as a '///path' candidate the guard skips;
|
|
88
|
+
// it is not linkified here today. Documents the no-throw behavior — making file:// links
|
|
89
|
+
// clickable would be a separate feature.
|
|
90
|
+
const links = await provider.provideLinks('open file:///home/user/project/file.ts now', terminalWithCwd(cwd));
|
|
91
|
+
expect(links).to.deep.equal([]);
|
|
92
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
});
|
|
@@ -15,22 +15,19 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { OS, Path, QuickInputService, ILogger } from '@theia/core';
|
|
18
|
-
import { OpenerService } from '@theia/core/lib/browser';
|
|
19
18
|
import URI from '@theia/core/lib/common/uri';
|
|
20
19
|
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
|
21
20
|
import { Position } from '@theia/editor/lib/browser';
|
|
22
|
-
import {
|
|
21
|
+
import { AbstractFileOpeningLinkProvider } from './terminal-file-opening-link-provider';
|
|
23
22
|
import { TerminalWidget } from './base/terminal-widget';
|
|
24
|
-
import { TerminalLink
|
|
23
|
+
import { TerminalLink } from './terminal-link-provider';
|
|
25
24
|
import { TerminalWidgetImpl } from './terminal-widget-impl';
|
|
26
25
|
import { FileSearchService } from '@theia/file-search/lib/common/file-search-service';
|
|
27
26
|
import { WorkspaceService } from '@theia/workspace/lib/browser';
|
|
28
27
|
@injectable()
|
|
29
|
-
export class FileLinkProvider
|
|
28
|
+
export class FileLinkProvider extends AbstractFileOpeningLinkProvider {
|
|
30
29
|
|
|
31
|
-
@inject(OpenerService) protected readonly openerService: OpenerService;
|
|
32
30
|
@inject(QuickInputService) protected readonly quickInputService: QuickInputService;
|
|
33
|
-
@inject(FileService) protected fileService: FileService;
|
|
34
31
|
@inject(FileSearchService) protected searchService: FileSearchService;
|
|
35
32
|
@inject(WorkspaceService) protected readonly workspaceService: WorkspaceService;
|
|
36
33
|
@inject(ILogger) @named('terminal:FileLinkProvider')
|
|
@@ -71,19 +68,19 @@ export class FileLinkProvider implements TerminalLinkProvider {
|
|
|
71
68
|
return false;
|
|
72
69
|
}
|
|
73
70
|
|
|
74
|
-
protected async isValidFileURI(uri: URI): Promise<boolean> {
|
|
75
|
-
try {
|
|
76
|
-
const stat = await this.fileService.resolve(uri);
|
|
77
|
-
return !stat.isDirectory;
|
|
78
|
-
} catch { }
|
|
79
|
-
return false;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
71
|
protected async toURI(match: string, cwd: URI): Promise<URI | undefined> {
|
|
83
72
|
const path = await this.extractPath(match);
|
|
84
73
|
if (!path) {
|
|
85
74
|
return;
|
|
86
75
|
}
|
|
76
|
+
// A '//'-leading match is a URL authority, not a local file: the path regex excludes ':'
|
|
77
|
+
// but not '/', so a printed URL matches from its '//host/path' remainder. Such a path
|
|
78
|
+
// cannot form a file URI (no authority component) and is already linkified by the URL link
|
|
79
|
+
// provider, so skip it rather than let `withPath` throw. The Windows path regex splits the
|
|
80
|
+
// leading '//' into a single slash during extraction, so the raw match is checked too.
|
|
81
|
+
if (match.startsWith('//') || path.startsWith('//')) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
87
84
|
const pathObj = new Path(path);
|
|
88
85
|
return pathObj.isAbsolute ? cwd.withPath(path) : cwd.resolve(path);
|
|
89
86
|
}
|
|
@@ -112,20 +109,6 @@ export class FileLinkProvider implements TerminalLinkProvider {
|
|
|
112
109
|
return this.openURI(toOpen, position);
|
|
113
110
|
}
|
|
114
111
|
|
|
115
|
-
async openURI(toOpen: URI, position: Position): Promise<void> {
|
|
116
|
-
let options = {};
|
|
117
|
-
if (position) {
|
|
118
|
-
options = { selection: { start: position } };
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
try {
|
|
122
|
-
const opener = await this.openerService.getOpener(toOpen, options);
|
|
123
|
-
opener.open(toOpen, options);
|
|
124
|
-
} catch (err) {
|
|
125
|
-
this.logger.error('Cannot open link ' + toOpen, err);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
|
|
129
112
|
protected async extractPosition(link: string): Promise<Position> {
|
|
130
113
|
const matches: string[] | null = (await this.createRegExp()).exec(link);
|
|
131
114
|
const info: Position = { line: 1, character: 1 };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
// *****************************************************************************
|
|
2
|
+
// Copyright (C) 2026 JuliaHub, 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 { ILogger } from '@theia/core';
|
|
18
|
+
import { OpenerService } from '@theia/core/lib/browser';
|
|
19
|
+
import URI from '@theia/core/lib/common/uri';
|
|
20
|
+
import { inject, injectable } from '@theia/core/shared/inversify';
|
|
21
|
+
import { Position } from '@theia/editor/lib/browser';
|
|
22
|
+
import { FileService } from '@theia/filesystem/lib/browser/file-service';
|
|
23
|
+
import { TerminalWidget } from './base/terminal-widget';
|
|
24
|
+
import { TerminalLink, TerminalLinkProvider } from './terminal-link-provider';
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Base for terminal link providers that resolve a matched string to a local file URI and open it in
|
|
28
|
+
* the editor. Subclasses contribute their own matching in {@link provideLinks} and a named logger.
|
|
29
|
+
*/
|
|
30
|
+
@injectable()
|
|
31
|
+
export abstract class AbstractFileOpeningLinkProvider implements TerminalLinkProvider {
|
|
32
|
+
|
|
33
|
+
@inject(OpenerService) protected readonly openerService: OpenerService;
|
|
34
|
+
@inject(FileService) protected readonly fileService: FileService;
|
|
35
|
+
|
|
36
|
+
protected abstract readonly logger: ILogger;
|
|
37
|
+
|
|
38
|
+
abstract provideLinks(line: string, terminal: TerminalWidget): Promise<TerminalLink[]>;
|
|
39
|
+
|
|
40
|
+
protected async isValidFileURI(uri: URI): Promise<boolean> {
|
|
41
|
+
try {
|
|
42
|
+
const stat = await this.fileService.resolve(uri);
|
|
43
|
+
return !stat.isDirectory;
|
|
44
|
+
} catch { }
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
async openURI(uri: URI, position?: Position): Promise<void> {
|
|
49
|
+
const options = position ? { selection: { start: position } } : {};
|
|
50
|
+
try {
|
|
51
|
+
const opener = await this.openerService.getOpener(uri, options);
|
|
52
|
+
await opener.open(uri, options);
|
|
53
|
+
} catch (err) {
|
|
54
|
+
this.logger.error('Cannot open link ' + uri, err);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|