@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.
Files changed (30) hide show
  1. package/lib/browser/terminal-file-link-provider.d.ts +3 -8
  2. package/lib/browser/terminal-file-link-provider.d.ts.map +1 -1
  3. package/lib/browser/terminal-file-link-provider.js +13 -35
  4. package/lib/browser/terminal-file-link-provider.js.map +1 -1
  5. package/lib/browser/terminal-file-link-provider.spec.d.ts +2 -0
  6. package/lib/browser/terminal-file-link-provider.spec.d.ts.map +1 -0
  7. package/lib/browser/terminal-file-link-provider.spec.js +79 -0
  8. package/lib/browser/terminal-file-link-provider.spec.js.map +1 -0
  9. package/lib/browser/terminal-file-opening-link-provider.d.ts +20 -0
  10. package/lib/browser/terminal-file-opening-link-provider.d.ts.map +1 -0
  11. package/lib/browser/terminal-file-opening-link-provider.js +59 -0
  12. package/lib/browser/terminal-file-opening-link-provider.js.map +1 -0
  13. package/lib/browser/terminal-file-uri-link-provider.d.ts +29 -0
  14. package/lib/browser/terminal-file-uri-link-provider.d.ts.map +1 -0
  15. package/lib/browser/terminal-file-uri-link-provider.js +95 -0
  16. package/lib/browser/terminal-file-uri-link-provider.js.map +1 -0
  17. package/lib/browser/terminal-file-uri-link-provider.spec.d.ts +2 -0
  18. package/lib/browser/terminal-file-uri-link-provider.spec.d.ts.map +1 -0
  19. package/lib/browser/terminal-file-uri-link-provider.spec.js +180 -0
  20. package/lib/browser/terminal-file-uri-link-provider.spec.js.map +1 -0
  21. package/lib/browser/terminal-frontend-module.d.ts.map +1 -1
  22. package/lib/browser/terminal-frontend-module.js +3 -0
  23. package/lib/browser/terminal-frontend-module.js.map +1 -1
  24. package/package.json +9 -9
  25. package/src/browser/terminal-file-link-provider.spec.ts +95 -0
  26. package/src/browser/terminal-file-link-provider.ts +11 -28
  27. package/src/browser/terminal-file-opening-link-provider.ts +57 -0
  28. package/src/browser/terminal-file-uri-link-provider.spec.ts +203 -0
  29. package/src/browser/terminal-file-uri-link-provider.ts +91 -0
  30. 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;;AAgC1E,wBA8FG"}
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":"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"}
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.5+afc1eefc5",
3
+ "version": "1.74.0-next.53+8e4e53136c6",
4
4
  "description": "Theia - Terminal Extension",
5
5
  "dependencies": {
6
- "@theia/core": "1.74.0-next.5+afc1eefc5",
7
- "@theia/editor": "1.74.0-next.5+afc1eefc5",
8
- "@theia/file-search": "1.74.0-next.5+afc1eefc5",
9
- "@theia/filesystem": "1.74.0-next.5+afc1eefc5",
10
- "@theia/process": "1.74.0-next.5+afc1eefc5",
11
- "@theia/variable-resolver": "1.74.0-next.5+afc1eefc5",
12
- "@theia/workspace": "1.74.0-next.5+afc1eefc5",
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": "afc1eefc56e9b67b67e13f4d71b35162d5f126ea"
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 { FileService } from '@theia/filesystem/lib/browser/file-service';
21
+ import { AbstractFileOpeningLinkProvider } from './terminal-file-opening-link-provider';
23
22
  import { TerminalWidget } from './base/terminal-widget';
24
- import { TerminalLink, TerminalLinkProvider } from './terminal-link-provider';
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 implements TerminalLinkProvider {
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
+ }