@theia/terminal 1.74.0-next.35 → 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/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 +5 -35
- package/lib/browser/terminal-file-link-provider.js.map +1 -1
- 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.ts +3 -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
|
@@ -1,28 +1,23 @@
|
|
|
1
1
|
import { QuickInputService, ILogger } from '@theia/core';
|
|
2
|
-
import { OpenerService } from '@theia/core/lib/browser';
|
|
3
2
|
import URI from '@theia/core/lib/common/uri';
|
|
4
3
|
import { Position } from '@theia/editor/lib/browser';
|
|
5
|
-
import {
|
|
4
|
+
import { AbstractFileOpeningLinkProvider } from './terminal-file-opening-link-provider';
|
|
6
5
|
import { TerminalWidget } from './base/terminal-widget';
|
|
7
|
-
import { TerminalLink
|
|
6
|
+
import { TerminalLink } from './terminal-link-provider';
|
|
8
7
|
import { FileSearchService } from '@theia/file-search/lib/common/file-search-service';
|
|
9
8
|
import { WorkspaceService } from '@theia/workspace/lib/browser';
|
|
10
|
-
export declare class FileLinkProvider
|
|
11
|
-
protected readonly openerService: OpenerService;
|
|
9
|
+
export declare class FileLinkProvider extends AbstractFileOpeningLinkProvider {
|
|
12
10
|
protected readonly quickInputService: QuickInputService;
|
|
13
|
-
protected fileService: FileService;
|
|
14
11
|
protected searchService: FileSearchService;
|
|
15
12
|
protected readonly workspaceService: WorkspaceService;
|
|
16
13
|
protected readonly logger: ILogger;
|
|
17
14
|
provideLinks(line: string, terminal: TerminalWidget): Promise<TerminalLink[]>;
|
|
18
15
|
protected createRegExp(): Promise<RegExp>;
|
|
19
16
|
protected isValidFile(match: string, terminal: TerminalWidget): Promise<boolean>;
|
|
20
|
-
protected isValidFileURI(uri: URI): Promise<boolean>;
|
|
21
17
|
protected toURI(match: string, cwd: URI): Promise<URI | undefined>;
|
|
22
18
|
protected getCwd(terminal: TerminalWidget): Promise<URI>;
|
|
23
19
|
protected extractPath(link: string): Promise<string | undefined>;
|
|
24
20
|
open(match: string, terminal: TerminalWidget): Promise<void>;
|
|
25
|
-
openURI(toOpen: URI, position: Position): Promise<void>;
|
|
26
21
|
protected extractPosition(link: string): Promise<Position>;
|
|
27
22
|
protected getLineAndColumnMatchIndex(): number;
|
|
28
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-file-link-provider.d.ts","sourceRoot":"","sources":["../../src/browser/terminal-file-link-provider.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAY,iBAAiB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,
|
|
1
|
+
{"version":3,"file":"terminal-file-link-provider.d.ts","sourceRoot":"","sources":["../../src/browser/terminal-file-link-provider.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAY,iBAAiB,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACnE,OAAO,GAAG,MAAM,4BAA4B,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mDAAmD,CAAC;AACtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAChE,qBACa,gBAAiB,SAAQ,+BAA+B;IAEtC,SAAS,CAAC,QAAQ,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;IACxD,SAAS,CAAC,aAAa,EAAE,iBAAiB,CAAC;IAC5C,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAEhF,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAE7B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;cAiBnE,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;cAK/B,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;cAatE,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;cAiBxD,MAAM,CAAC,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC;cAO9C,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAQhE,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;cASlD,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAyBhE,SAAS,CAAC,0BAA0B,IAAI,MAAM;CAGjD;AAED,qBACa,uBAAwB,SAAQ,gBAAgB;IAC1C,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAGjD;AAED,qBACa,wBAAyB,SAAQ,gBAAgB;IAC3C,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;CAGjD;AAED,qBACa,qBAAsB,SAAQ,gBAAgB;IACxC,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAgB/B,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;cA0BzE,0BAA0B,IAAI,MAAM;cAIvC,oBAAoB,CAAC,UAAU,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC;CAwB3H"}
|
|
@@ -18,14 +18,13 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
18
18
|
exports.LocalFileLinkProvider = exports.FileDiffPostLinkProvider = exports.FileDiffPreLinkProvider = exports.FileLinkProvider = void 0;
|
|
19
19
|
const tslib_1 = require("tslib");
|
|
20
20
|
const core_1 = require("@theia/core");
|
|
21
|
-
const browser_1 = require("@theia/core/lib/browser");
|
|
22
21
|
const uri_1 = require("@theia/core/lib/common/uri");
|
|
23
22
|
const inversify_1 = require("@theia/core/shared/inversify");
|
|
24
|
-
const
|
|
23
|
+
const terminal_file_opening_link_provider_1 = require("./terminal-file-opening-link-provider");
|
|
25
24
|
const terminal_widget_impl_1 = require("./terminal-widget-impl");
|
|
26
25
|
const file_search_service_1 = require("@theia/file-search/lib/common/file-search-service");
|
|
27
|
-
const
|
|
28
|
-
let FileLinkProvider = class FileLinkProvider {
|
|
26
|
+
const browser_1 = require("@theia/workspace/lib/browser");
|
|
27
|
+
let FileLinkProvider = class FileLinkProvider extends terminal_file_opening_link_provider_1.AbstractFileOpeningLinkProvider {
|
|
29
28
|
async provideLinks(line, terminal) {
|
|
30
29
|
const links = [];
|
|
31
30
|
const regExp = await this.createRegExp();
|
|
@@ -59,14 +58,6 @@ let FileLinkProvider = class FileLinkProvider {
|
|
|
59
58
|
}
|
|
60
59
|
return false;
|
|
61
60
|
}
|
|
62
|
-
async isValidFileURI(uri) {
|
|
63
|
-
try {
|
|
64
|
-
const stat = await this.fileService.resolve(uri);
|
|
65
|
-
return !stat.isDirectory;
|
|
66
|
-
}
|
|
67
|
-
catch { }
|
|
68
|
-
return false;
|
|
69
|
-
}
|
|
70
61
|
async toURI(match, cwd) {
|
|
71
62
|
const path = await this.extractPath(match);
|
|
72
63
|
if (!path) {
|
|
@@ -104,19 +95,6 @@ let FileLinkProvider = class FileLinkProvider {
|
|
|
104
95
|
const position = await this.extractPosition(match);
|
|
105
96
|
return this.openURI(toOpen, position);
|
|
106
97
|
}
|
|
107
|
-
async openURI(toOpen, position) {
|
|
108
|
-
let options = {};
|
|
109
|
-
if (position) {
|
|
110
|
-
options = { selection: { start: position } };
|
|
111
|
-
}
|
|
112
|
-
try {
|
|
113
|
-
const opener = await this.openerService.getOpener(toOpen, options);
|
|
114
|
-
opener.open(toOpen, options);
|
|
115
|
-
}
|
|
116
|
-
catch (err) {
|
|
117
|
-
this.logger.error('Cannot open link ' + toOpen, err);
|
|
118
|
-
}
|
|
119
|
-
}
|
|
120
98
|
async extractPosition(link) {
|
|
121
99
|
const matches = (await this.createRegExp()).exec(link);
|
|
122
100
|
const info = { line: 1, character: 1 };
|
|
@@ -143,25 +121,17 @@ let FileLinkProvider = class FileLinkProvider {
|
|
|
143
121
|
}
|
|
144
122
|
};
|
|
145
123
|
exports.FileLinkProvider = FileLinkProvider;
|
|
146
|
-
tslib_1.__decorate([
|
|
147
|
-
(0, inversify_1.inject)(browser_1.OpenerService),
|
|
148
|
-
tslib_1.__metadata("design:type", Object)
|
|
149
|
-
], FileLinkProvider.prototype, "openerService", void 0);
|
|
150
124
|
tslib_1.__decorate([
|
|
151
125
|
(0, inversify_1.inject)(core_1.QuickInputService),
|
|
152
126
|
tslib_1.__metadata("design:type", Object)
|
|
153
127
|
], FileLinkProvider.prototype, "quickInputService", void 0);
|
|
154
|
-
tslib_1.__decorate([
|
|
155
|
-
(0, inversify_1.inject)(file_service_1.FileService),
|
|
156
|
-
tslib_1.__metadata("design:type", file_service_1.FileService)
|
|
157
|
-
], FileLinkProvider.prototype, "fileService", void 0);
|
|
158
128
|
tslib_1.__decorate([
|
|
159
129
|
(0, inversify_1.inject)(file_search_service_1.FileSearchService),
|
|
160
130
|
tslib_1.__metadata("design:type", Object)
|
|
161
131
|
], FileLinkProvider.prototype, "searchService", void 0);
|
|
162
132
|
tslib_1.__decorate([
|
|
163
|
-
(0, inversify_1.inject)(
|
|
164
|
-
tslib_1.__metadata("design:type",
|
|
133
|
+
(0, inversify_1.inject)(browser_1.WorkspaceService),
|
|
134
|
+
tslib_1.__metadata("design:type", browser_1.WorkspaceService)
|
|
165
135
|
], FileLinkProvider.prototype, "workspaceService", void 0);
|
|
166
136
|
tslib_1.__decorate([
|
|
167
137
|
(0, inversify_1.inject)(core_1.ILogger),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terminal-file-link-provider.js","sourceRoot":"","sources":["../../src/browser/terminal-file-link-provider.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,sCAAmE;AACnE,
|
|
1
|
+
{"version":3,"file":"terminal-file-link-provider.js","sourceRoot":"","sources":["../../src/browser/terminal-file-link-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { ILogger } from '@theia/core';
|
|
2
|
+
import { OpenerService } from '@theia/core/lib/browser';
|
|
3
|
+
import URI from '@theia/core/lib/common/uri';
|
|
4
|
+
import { Position } from '@theia/editor/lib/browser';
|
|
5
|
+
import { FileService } from '@theia/filesystem/lib/browser/file-service';
|
|
6
|
+
import { TerminalWidget } from './base/terminal-widget';
|
|
7
|
+
import { TerminalLink, TerminalLinkProvider } from './terminal-link-provider';
|
|
8
|
+
/**
|
|
9
|
+
* Base for terminal link providers that resolve a matched string to a local file URI and open it in
|
|
10
|
+
* the editor. Subclasses contribute their own matching in {@link provideLinks} and a named logger.
|
|
11
|
+
*/
|
|
12
|
+
export declare abstract class AbstractFileOpeningLinkProvider implements TerminalLinkProvider {
|
|
13
|
+
protected readonly openerService: OpenerService;
|
|
14
|
+
protected readonly fileService: FileService;
|
|
15
|
+
protected abstract readonly logger: ILogger;
|
|
16
|
+
abstract provideLinks(line: string, terminal: TerminalWidget): Promise<TerminalLink[]>;
|
|
17
|
+
protected isValidFileURI(uri: URI): Promise<boolean>;
|
|
18
|
+
openURI(uri: URI, position?: Position): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=terminal-file-opening-link-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-file-opening-link-provider.d.ts","sourceRoot":"","sources":["../../src/browser/terminal-file-opening-link-provider.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,GAAG,MAAM,4BAA4B,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,4CAA4C,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAE9E;;;GAGG;AACH,8BACsB,+BAAgC,YAAW,oBAAoB;IAE1D,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,aAAa,CAAC;IAClD,SAAS,CAAC,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAEjE,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAE5C,QAAQ,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;cAEtE,cAAc,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC;IAQpD,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;CAS9D"}
|
|
@@ -0,0 +1,59 @@
|
|
|
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
|
+
exports.AbstractFileOpeningLinkProvider = void 0;
|
|
19
|
+
const tslib_1 = require("tslib");
|
|
20
|
+
const browser_1 = require("@theia/core/lib/browser");
|
|
21
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
22
|
+
const file_service_1 = require("@theia/filesystem/lib/browser/file-service");
|
|
23
|
+
/**
|
|
24
|
+
* Base for terminal link providers that resolve a matched string to a local file URI and open it in
|
|
25
|
+
* the editor. Subclasses contribute their own matching in {@link provideLinks} and a named logger.
|
|
26
|
+
*/
|
|
27
|
+
let AbstractFileOpeningLinkProvider = class AbstractFileOpeningLinkProvider {
|
|
28
|
+
async isValidFileURI(uri) {
|
|
29
|
+
try {
|
|
30
|
+
const stat = await this.fileService.resolve(uri);
|
|
31
|
+
return !stat.isDirectory;
|
|
32
|
+
}
|
|
33
|
+
catch { }
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
async openURI(uri, position) {
|
|
37
|
+
const options = position ? { selection: { start: position } } : {};
|
|
38
|
+
try {
|
|
39
|
+
const opener = await this.openerService.getOpener(uri, options);
|
|
40
|
+
await opener.open(uri, options);
|
|
41
|
+
}
|
|
42
|
+
catch (err) {
|
|
43
|
+
this.logger.error('Cannot open link ' + uri, err);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
exports.AbstractFileOpeningLinkProvider = AbstractFileOpeningLinkProvider;
|
|
48
|
+
tslib_1.__decorate([
|
|
49
|
+
(0, inversify_1.inject)(browser_1.OpenerService),
|
|
50
|
+
tslib_1.__metadata("design:type", Object)
|
|
51
|
+
], AbstractFileOpeningLinkProvider.prototype, "openerService", void 0);
|
|
52
|
+
tslib_1.__decorate([
|
|
53
|
+
(0, inversify_1.inject)(file_service_1.FileService),
|
|
54
|
+
tslib_1.__metadata("design:type", file_service_1.FileService)
|
|
55
|
+
], AbstractFileOpeningLinkProvider.prototype, "fileService", void 0);
|
|
56
|
+
exports.AbstractFileOpeningLinkProvider = AbstractFileOpeningLinkProvider = tslib_1.__decorate([
|
|
57
|
+
(0, inversify_1.injectable)()
|
|
58
|
+
], AbstractFileOpeningLinkProvider);
|
|
59
|
+
//# sourceMappingURL=terminal-file-opening-link-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-file-opening-link-provider.js","sourceRoot":"","sources":["../../src/browser/terminal-file-opening-link-provider.ts"],"names":[],"mappings":";AAAA,gFAAgF;AAChF,gDAAgD;AAChD,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,qDAAwD;AAExD,4DAAkE;AAElE,6EAAyE;AAIzE;;;GAGG;AAEI,IAAe,+BAA+B,GAA9C,MAAe,+BAA+B;IASvC,KAAK,CAAC,cAAc,CAAC,GAAQ;QACnC,IAAI,CAAC;YACD,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACjD,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;QAC7B,CAAC;QAAC,MAAM,CAAC,CAAC,CAAC;QACX,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,GAAQ,EAAE,QAAmB;QACvC,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnE,IAAI,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChE,MAAM,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC;QACtD,CAAC;IACL,CAAC;CACJ,CAAA;AA1BqB,0EAA+B;AAEP;IAAzC,IAAA,kBAAM,EAAC,uBAAa,CAAC;;sEAAiD;AAC/B;IAAvC,IAAA,kBAAM,EAAC,0BAAW,CAAC;sCAAiC,0BAAW;oEAAC;0CAH/C,+BAA+B;IADpD,IAAA,sBAAU,GAAE;GACS,+BAA+B,CA0BpD"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ILogger } from '@theia/core';
|
|
2
|
+
import URI from '@theia/core/lib/common/uri';
|
|
3
|
+
import { Position } from '@theia/editor/lib/browser';
|
|
4
|
+
import { AbstractFileOpeningLinkProvider } from './terminal-file-opening-link-provider';
|
|
5
|
+
import { TerminalWidget } from './base/terminal-widget';
|
|
6
|
+
import { TerminalLink } from './terminal-link-provider';
|
|
7
|
+
/**
|
|
8
|
+
* Linkifies `file://` URLs printed in the terminal and opens the referenced local file in the editor.
|
|
9
|
+
*
|
|
10
|
+
* A dedicated provider is needed because `UrlLinkProvider` only matches `http(s)` and
|
|
11
|
+
* `FileLinkProvider`'s path regex excludes `:`, so neither recognizes the `file:` scheme.
|
|
12
|
+
*/
|
|
13
|
+
export declare class FileUriLinkProvider extends AbstractFileOpeningLinkProvider {
|
|
14
|
+
protected readonly logger: ILogger;
|
|
15
|
+
protected readonly fileUriRegExp: RegExp;
|
|
16
|
+
provideLinks(line: string, terminal: TerminalWidget): Promise<TerminalLink[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Splits a trailing `:line` or `:line:column` suffix (as in `file:///x.ts:10:5`) off the matched
|
|
19
|
+
* URL into a one-based editor position. The drive colon of `file:///C:/x.ts` is not affected, as
|
|
20
|
+
* it is not followed by digits at the end of the string.
|
|
21
|
+
*/
|
|
22
|
+
protected splitPosition(match: string): {
|
|
23
|
+
fileUri: string;
|
|
24
|
+
position?: Position;
|
|
25
|
+
};
|
|
26
|
+
protected toURI(match: string): URI | undefined;
|
|
27
|
+
protected trimTrailingPunctuation(match: string): string;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=terminal-file-uri-link-provider.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-file-uri-link-provider.d.ts","sourceRoot":"","sources":["../../src/browser/terminal-file-uri-link-provider.ts"],"names":[],"mappings":"AAgBA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,GAAG,MAAM,4BAA4B,CAAC;AAE7C,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,+BAA+B,EAAE,MAAM,uCAAuC,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;;;GAKG;AACH,qBACa,mBAAoB,SAAQ,+BAA+B;IAGpE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IAInC,SAAS,CAAC,QAAQ,CAAC,aAAa,SAAmC;IAE7D,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAoBnF;;;;OAIG;IACH,SAAS,CAAC,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,EAAE,QAAQ,CAAA;KAAE;IAahF,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,GAAG,SAAS;IAS/C,SAAS,CAAC,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM;CAG3D"}
|
|
@@ -0,0 +1,95 @@
|
|
|
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
|
+
exports.FileUriLinkProvider = void 0;
|
|
19
|
+
const tslib_1 = require("tslib");
|
|
20
|
+
const core_1 = require("@theia/core");
|
|
21
|
+
const uri_1 = require("@theia/core/lib/common/uri");
|
|
22
|
+
const inversify_1 = require("@theia/core/shared/inversify");
|
|
23
|
+
const terminal_file_opening_link_provider_1 = require("./terminal-file-opening-link-provider");
|
|
24
|
+
/**
|
|
25
|
+
* Linkifies `file://` URLs printed in the terminal and opens the referenced local file in the editor.
|
|
26
|
+
*
|
|
27
|
+
* A dedicated provider is needed because `UrlLinkProvider` only matches `http(s)` and
|
|
28
|
+
* `FileLinkProvider`'s path regex excludes `:`, so neither recognizes the `file:` scheme.
|
|
29
|
+
*/
|
|
30
|
+
let FileUriLinkProvider = class FileUriLinkProvider extends terminal_file_opening_link_provider_1.AbstractFileOpeningLinkProvider {
|
|
31
|
+
constructor() {
|
|
32
|
+
super(...arguments);
|
|
33
|
+
// The optional third slash denotes an empty authority (`file:///path`); the match runs to the first
|
|
34
|
+
// whitespace or character that commonly delimits a URL in prose.
|
|
35
|
+
this.fileUriRegExp = /file:\/\/\/?[^\s'"`<>()[\]]+/g;
|
|
36
|
+
}
|
|
37
|
+
async provideLinks(line, terminal) {
|
|
38
|
+
// Collect all matches synchronously before awaiting: the `g`-flag regex is instance-shared, so
|
|
39
|
+
// yielding mid-iteration would let a concurrent call corrupt its `lastIndex`.
|
|
40
|
+
const candidates = [];
|
|
41
|
+
this.fileUriRegExp.lastIndex = 0;
|
|
42
|
+
let regExpResult;
|
|
43
|
+
while (regExpResult = this.fileUriRegExp.exec(line)) {
|
|
44
|
+
candidates.push({ match: this.trimTrailingPunctuation(regExpResult[0]), startIndex: regExpResult.index });
|
|
45
|
+
}
|
|
46
|
+
const links = await Promise.all(candidates.map(async ({ match, startIndex }) => {
|
|
47
|
+
const { fileUri, position } = this.splitPosition(match);
|
|
48
|
+
const uri = this.toURI(fileUri);
|
|
49
|
+
if (uri && await this.isValidFileURI(uri)) {
|
|
50
|
+
return { startIndex, length: match.length, handle: () => this.openURI(uri, position) };
|
|
51
|
+
}
|
|
52
|
+
return undefined;
|
|
53
|
+
}));
|
|
54
|
+
return links.filter((link) => link !== undefined);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Splits a trailing `:line` or `:line:column` suffix (as in `file:///x.ts:10:5`) off the matched
|
|
58
|
+
* URL into a one-based editor position. The drive colon of `file:///C:/x.ts` is not affected, as
|
|
59
|
+
* it is not followed by digits at the end of the string.
|
|
60
|
+
*/
|
|
61
|
+
splitPosition(match) {
|
|
62
|
+
const positionMatch = /:(\d+)(?::(\d+))?$/.exec(match);
|
|
63
|
+
if (!positionMatch) {
|
|
64
|
+
return { fileUri: match };
|
|
65
|
+
}
|
|
66
|
+
const line = Math.max(0, parseInt(positionMatch[1], 10) - 1);
|
|
67
|
+
const character = positionMatch[2] !== undefined ? Math.max(0, parseInt(positionMatch[2], 10) - 1) : 0;
|
|
68
|
+
return {
|
|
69
|
+
fileUri: match.slice(0, positionMatch.index),
|
|
70
|
+
position: { line, character }
|
|
71
|
+
};
|
|
72
|
+
}
|
|
73
|
+
toURI(match) {
|
|
74
|
+
try {
|
|
75
|
+
const uri = new uri_1.default(match);
|
|
76
|
+
return uri.scheme === 'file' ? uri : undefined;
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
trimTrailingPunctuation(match) {
|
|
83
|
+
return match.replace(/[.,;:]+$/, '');
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
exports.FileUriLinkProvider = FileUriLinkProvider;
|
|
87
|
+
tslib_1.__decorate([
|
|
88
|
+
(0, inversify_1.inject)(core_1.ILogger),
|
|
89
|
+
(0, inversify_1.named)('terminal:FileUriLinkProvider'),
|
|
90
|
+
tslib_1.__metadata("design:type", Object)
|
|
91
|
+
], FileUriLinkProvider.prototype, "logger", void 0);
|
|
92
|
+
exports.FileUriLinkProvider = FileUriLinkProvider = tslib_1.__decorate([
|
|
93
|
+
(0, inversify_1.injectable)()
|
|
94
|
+
], FileUriLinkProvider);
|
|
95
|
+
//# sourceMappingURL=terminal-file-uri-link-provider.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-file-uri-link-provider.js","sourceRoot":"","sources":["../../src/browser/terminal-file-uri-link-provider.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal-file-uri-link-provider.spec.d.ts","sourceRoot":"","sources":["../../src/browser/terminal-file-uri-link-provider.spec.ts"],"names":[],"mappings":""}
|
|
@@ -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":"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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.
|
|
3
|
+
"version": "1.74.0-next.38+3595b053a",
|
|
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.38+3595b053a",
|
|
7
|
+
"@theia/editor": "1.74.0-next.38+3595b053a",
|
|
8
|
+
"@theia/file-search": "1.74.0-next.38+3595b053a",
|
|
9
|
+
"@theia/filesystem": "1.74.0-next.38+3595b053a",
|
|
10
|
+
"@theia/process": "1.74.0-next.38+3595b053a",
|
|
11
|
+
"@theia/variable-resolver": "1.74.0-next.38+3595b053a",
|
|
12
|
+
"@theia/workspace": "1.74.0-next.38+3595b053a",
|
|
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": "3595b053a48a1a4c7171aea0361a25f782140af9"
|
|
60
60
|
}
|
|
@@ -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,14 +68,6 @@ 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) {
|
|
@@ -120,20 +109,6 @@ export class FileLinkProvider implements TerminalLinkProvider {
|
|
|
120
109
|
return this.openURI(toOpen, position);
|
|
121
110
|
}
|
|
122
111
|
|
|
123
|
-
async openURI(toOpen: URI, position: Position): Promise<void> {
|
|
124
|
-
let options = {};
|
|
125
|
-
if (position) {
|
|
126
|
-
options = { selection: { start: position } };
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
try {
|
|
130
|
-
const opener = await this.openerService.getOpener(toOpen, options);
|
|
131
|
-
opener.open(toOpen, options);
|
|
132
|
-
} catch (err) {
|
|
133
|
-
this.logger.error('Cannot open link ' + toOpen, err);
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
112
|
protected async extractPosition(link: string): Promise<Position> {
|
|
138
113
|
const matches: string[] | null = (await this.createRegExp()).exec(link);
|
|
139
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
|
+
}
|
|
@@ -0,0 +1,203 @@
|
|
|
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 { OpenerService, OpenHandler } from '@theia/core/lib/browser';
|
|
29
|
+
import URI from '@theia/core/lib/common/uri';
|
|
30
|
+
import { FileService } from '@theia/filesystem/lib/browser/file-service';
|
|
31
|
+
import { TerminalWidget } from './base/terminal-widget';
|
|
32
|
+
import { FileUriLinkProvider } from './terminal-file-uri-link-provider';
|
|
33
|
+
|
|
34
|
+
disableJSDOM();
|
|
35
|
+
|
|
36
|
+
const expect = chai.expect;
|
|
37
|
+
|
|
38
|
+
class TestFileUriLinkProvider extends FileUriLinkProvider {
|
|
39
|
+
readonly loggedErrors: string[] = [];
|
|
40
|
+
readonly opened: string[] = [];
|
|
41
|
+
readonly openedOptions: unknown[] = [];
|
|
42
|
+
|
|
43
|
+
constructor(existingFiles: string[], directories: string[] = []) {
|
|
44
|
+
super();
|
|
45
|
+
const files = new Set(existingFiles);
|
|
46
|
+
const dirs = new Set(directories.map(uri => new URI(uri).toString()));
|
|
47
|
+
(this as unknown as { logger: ILogger }).logger = {
|
|
48
|
+
error: (message: unknown) => { this.loggedErrors.push(String(message)); }
|
|
49
|
+
} as unknown as ILogger;
|
|
50
|
+
(this as unknown as { fileService: FileService }).fileService = {
|
|
51
|
+
resolve: async (uri: URI) => {
|
|
52
|
+
if (dirs.has(uri.toString())) {
|
|
53
|
+
return { isDirectory: true };
|
|
54
|
+
}
|
|
55
|
+
if (files.has(uri.toString())) {
|
|
56
|
+
return { isDirectory: false };
|
|
57
|
+
}
|
|
58
|
+
throw new Error('does not exist');
|
|
59
|
+
}
|
|
60
|
+
} as unknown as FileService;
|
|
61
|
+
const opener: OpenHandler = {
|
|
62
|
+
id: 'test',
|
|
63
|
+
canHandle: () => 1,
|
|
64
|
+
open: async (uri: URI, options?: unknown) => {
|
|
65
|
+
this.opened.push(uri.toString());
|
|
66
|
+
this.openedOptions.push(options);
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
(this as unknown as { openerService: OpenerService }).openerService = {
|
|
71
|
+
getOpener: async () => opener,
|
|
72
|
+
getOpeners: async () => [opener]
|
|
73
|
+
} as unknown as OpenerService;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
const terminal = {} as unknown as TerminalWidget;
|
|
78
|
+
|
|
79
|
+
describe('FileUriLinkProvider', () => {
|
|
80
|
+
|
|
81
|
+
it('should linkify and open a POSIX file:// URL that resolves to a file', async () => {
|
|
82
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
83
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
84
|
+
const links = await provider.provideLinks(`open ${uri} now`, terminal);
|
|
85
|
+
expect(links).to.have.lengthOf(1);
|
|
86
|
+
expect(links[0].startIndex).to.equal('open '.length);
|
|
87
|
+
expect(links[0].length).to.equal(uri.length);
|
|
88
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
89
|
+
await links[0].handle();
|
|
90
|
+
expect(provider.opened).to.deep.equal([new URI(uri).toString()]);
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
it('should linkify a Windows drive file:// URL', async () => {
|
|
94
|
+
const uri = 'file:///C:/Users/dev/file.ts';
|
|
95
|
+
const provider = new TestFileUriLinkProvider([new URI(uri).toString()]);
|
|
96
|
+
const links = await provider.provideLinks(`see ${uri}`, terminal);
|
|
97
|
+
expect(links).to.have.lengthOf(1);
|
|
98
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it('should linkify a UNC file:// URL with an authority', async () => {
|
|
102
|
+
const uri = 'file://server/share/file.ts';
|
|
103
|
+
const provider = new TestFileUriLinkProvider([new URI(uri).toString()]);
|
|
104
|
+
const links = await provider.provideLinks(uri, terminal);
|
|
105
|
+
expect(links).to.have.lengthOf(1);
|
|
106
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it('should not produce a link for a file:// URL that does not resolve, without throwing or logging', async () => {
|
|
110
|
+
const provider = new TestFileUriLinkProvider([]);
|
|
111
|
+
const links = await provider.provideLinks('open file:///home/user/missing.ts now', terminal);
|
|
112
|
+
expect(links).to.deep.equal([]);
|
|
113
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
114
|
+
});
|
|
115
|
+
|
|
116
|
+
it('should ignore http(s) URLs', async () => {
|
|
117
|
+
const provider = new TestFileUriLinkProvider([]);
|
|
118
|
+
const links = await provider.provideLinks('see https://example.com/path for details', terminal);
|
|
119
|
+
expect(links).to.deep.equal([]);
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it('should trim trailing sentence punctuation from the matched URL', async () => {
|
|
123
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
124
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
125
|
+
const links = await provider.provideLinks(`the file is ${uri}.`, terminal);
|
|
126
|
+
expect(links).to.have.lengthOf(1);
|
|
127
|
+
expect(links[0].length).to.equal(uri.length);
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
it('should open at the given line and column for a file://…:line:column suffix', async () => {
|
|
131
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
132
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
133
|
+
const match = `${uri}:10:5`;
|
|
134
|
+
const links = await provider.provideLinks(`error at ${match}`, terminal);
|
|
135
|
+
expect(links).to.have.lengthOf(1);
|
|
136
|
+
// The whole `file://…:10:5` is clickable, but the URI drops the position suffix.
|
|
137
|
+
expect(links[0].length).to.equal(match.length);
|
|
138
|
+
await links[0].handle();
|
|
139
|
+
expect(provider.opened).to.deep.equal([new URI(uri).toString()]);
|
|
140
|
+
// one-based `10:5` becomes a zero-based editor position.
|
|
141
|
+
expect(provider.openedOptions).to.deep.equal([{ selection: { start: { line: 9, character: 4 } } }]);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it('should open at the given line with a file://…:line suffix (no column)', async () => {
|
|
145
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
146
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
147
|
+
const links = await provider.provideLinks(`${uri}:42`, terminal);
|
|
148
|
+
expect(links).to.have.lengthOf(1);
|
|
149
|
+
await links[0].handle();
|
|
150
|
+
expect(provider.opened).to.deep.equal([new URI(uri).toString()]);
|
|
151
|
+
expect(provider.openedOptions).to.deep.equal([{ selection: { start: { line: 41, character: 0 } } }]);
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
it('should keep the Windows drive colon and still apply a trailing position', async () => {
|
|
155
|
+
const uri = 'file:///C:/Users/dev/file.ts';
|
|
156
|
+
const provider = new TestFileUriLinkProvider([new URI(uri).toString()]);
|
|
157
|
+
const links = await provider.provideLinks(`${uri}:7:3`, terminal);
|
|
158
|
+
expect(links).to.have.lengthOf(1);
|
|
159
|
+
await links[0].handle();
|
|
160
|
+
expect(provider.opened).to.deep.equal([new URI(uri).toString()]);
|
|
161
|
+
expect(provider.openedOptions).to.deep.equal([{ selection: { start: { line: 6, character: 2 } } }]);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
it('should clamp a zero line/column to the first position', async () => {
|
|
165
|
+
const uri = 'file:///home/user/project/file.ts';
|
|
166
|
+
const provider = new TestFileUriLinkProvider([uri]);
|
|
167
|
+
const links = await provider.provideLinks(`${uri}:0`, terminal);
|
|
168
|
+
expect(links).to.have.lengthOf(1);
|
|
169
|
+
await links[0].handle();
|
|
170
|
+
expect(provider.openedOptions).to.deep.equal([{ selection: { start: { line: 0, character: 0 } } }]);
|
|
171
|
+
});
|
|
172
|
+
|
|
173
|
+
it('should not produce a link for a file:// URL that resolves to a directory', async () => {
|
|
174
|
+
const uri = 'file:///home/user/project';
|
|
175
|
+
const provider = new TestFileUriLinkProvider([], [uri]);
|
|
176
|
+
const links = await provider.provideLinks(`open ${uri} now`, terminal);
|
|
177
|
+
expect(links).to.deep.equal([]);
|
|
178
|
+
expect(provider.loggedErrors).to.deep.equal([]);
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it('should linkify every file:// URL on a line at the correct offsets', async () => {
|
|
182
|
+
const a = 'file:///home/user/a.ts';
|
|
183
|
+
const b = 'file:///home/user/b.ts';
|
|
184
|
+
const provider = new TestFileUriLinkProvider([a, b]);
|
|
185
|
+
const line = `first ${a} then ${b}`;
|
|
186
|
+
const links = await provider.provideLinks(line, terminal);
|
|
187
|
+
expect(links).to.have.lengthOf(2);
|
|
188
|
+
expect(links.map(link => link.startIndex)).to.deep.equal([line.indexOf(a), line.indexOf(b)]);
|
|
189
|
+
expect(links.map(link => line.substr(link.startIndex, link.length))).to.deep.equal([a, b]);
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it('should not leak regex state across concurrent invocations', async () => {
|
|
193
|
+
const a = 'file:///home/user/a.ts';
|
|
194
|
+
const b = 'file:///home/user/b.ts';
|
|
195
|
+
const provider = new TestFileUriLinkProvider([a, b]);
|
|
196
|
+
const [linksA, linksB] = await Promise.all([
|
|
197
|
+
provider.provideLinks(`x ${a}`, terminal),
|
|
198
|
+
provider.provideLinks(b, terminal)
|
|
199
|
+
]);
|
|
200
|
+
expect(linksA.map(link => link.length)).to.deep.equal([a.length]);
|
|
201
|
+
expect(linksB.map(link => link.length)).to.deep.equal([b.length]);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
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 URI from '@theia/core/lib/common/uri';
|
|
19
|
+
import { inject, injectable, named } from '@theia/core/shared/inversify';
|
|
20
|
+
import { Position } from '@theia/editor/lib/browser';
|
|
21
|
+
import { AbstractFileOpeningLinkProvider } from './terminal-file-opening-link-provider';
|
|
22
|
+
import { TerminalWidget } from './base/terminal-widget';
|
|
23
|
+
import { TerminalLink } from './terminal-link-provider';
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Linkifies `file://` URLs printed in the terminal and opens the referenced local file in the editor.
|
|
27
|
+
*
|
|
28
|
+
* A dedicated provider is needed because `UrlLinkProvider` only matches `http(s)` and
|
|
29
|
+
* `FileLinkProvider`'s path regex excludes `:`, so neither recognizes the `file:` scheme.
|
|
30
|
+
*/
|
|
31
|
+
@injectable()
|
|
32
|
+
export class FileUriLinkProvider extends AbstractFileOpeningLinkProvider {
|
|
33
|
+
|
|
34
|
+
@inject(ILogger) @named('terminal:FileUriLinkProvider')
|
|
35
|
+
protected readonly logger: ILogger;
|
|
36
|
+
|
|
37
|
+
// The optional third slash denotes an empty authority (`file:///path`); the match runs to the first
|
|
38
|
+
// whitespace or character that commonly delimits a URL in prose.
|
|
39
|
+
protected readonly fileUriRegExp = /file:\/\/\/?[^\s'"`<>()[\]]+/g;
|
|
40
|
+
|
|
41
|
+
async provideLinks(line: string, terminal: TerminalWidget): Promise<TerminalLink[]> {
|
|
42
|
+
// Collect all matches synchronously before awaiting: the `g`-flag regex is instance-shared, so
|
|
43
|
+
// yielding mid-iteration would let a concurrent call corrupt its `lastIndex`.
|
|
44
|
+
const candidates: Array<{ match: string, startIndex: number }> = [];
|
|
45
|
+
this.fileUriRegExp.lastIndex = 0;
|
|
46
|
+
let regExpResult: RegExpExecArray | null;
|
|
47
|
+
while (regExpResult = this.fileUriRegExp.exec(line)) {
|
|
48
|
+
candidates.push({ match: this.trimTrailingPunctuation(regExpResult[0]), startIndex: regExpResult.index });
|
|
49
|
+
}
|
|
50
|
+
const links = await Promise.all(candidates.map(async ({ match, startIndex }) => {
|
|
51
|
+
const { fileUri, position } = this.splitPosition(match);
|
|
52
|
+
const uri = this.toURI(fileUri);
|
|
53
|
+
if (uri && await this.isValidFileURI(uri)) {
|
|
54
|
+
return { startIndex, length: match.length, handle: () => this.openURI(uri, position) };
|
|
55
|
+
}
|
|
56
|
+
return undefined;
|
|
57
|
+
}));
|
|
58
|
+
return links.filter((link): link is TerminalLink => link !== undefined);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Splits a trailing `:line` or `:line:column` suffix (as in `file:///x.ts:10:5`) off the matched
|
|
63
|
+
* URL into a one-based editor position. The drive colon of `file:///C:/x.ts` is not affected, as
|
|
64
|
+
* it is not followed by digits at the end of the string.
|
|
65
|
+
*/
|
|
66
|
+
protected splitPosition(match: string): { fileUri: string, position?: Position } {
|
|
67
|
+
const positionMatch = /:(\d+)(?::(\d+))?$/.exec(match);
|
|
68
|
+
if (!positionMatch) {
|
|
69
|
+
return { fileUri: match };
|
|
70
|
+
}
|
|
71
|
+
const line = Math.max(0, parseInt(positionMatch[1], 10) - 1);
|
|
72
|
+
const character = positionMatch[2] !== undefined ? Math.max(0, parseInt(positionMatch[2], 10) - 1) : 0;
|
|
73
|
+
return {
|
|
74
|
+
fileUri: match.slice(0, positionMatch.index),
|
|
75
|
+
position: { line, character }
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
protected toURI(match: string): URI | undefined {
|
|
80
|
+
try {
|
|
81
|
+
const uri = new URI(match);
|
|
82
|
+
return uri.scheme === 'file' ? uri : undefined;
|
|
83
|
+
} catch {
|
|
84
|
+
return undefined;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
protected trimTrailingPunctuation(match: string): string {
|
|
89
|
+
return match.replace(/[.,;:]+$/, '');
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -43,6 +43,7 @@ import { QuickAccessContribution } from '@theia/core/lib/browser/quick-input/qui
|
|
|
43
43
|
import { createXtermLinkFactory, TerminalLinkProvider, TerminalLinkProviderContribution, XtermLinkFactory } from './terminal-link-provider';
|
|
44
44
|
import { UrlLinkProvider } from './terminal-url-link-provider';
|
|
45
45
|
import { FileDiffPostLinkProvider, FileDiffPreLinkProvider, FileLinkProvider, LocalFileLinkProvider } from './terminal-file-link-provider';
|
|
46
|
+
import { FileUriLinkProvider } from './terminal-file-uri-link-provider';
|
|
46
47
|
import {
|
|
47
48
|
ContributedTerminalProfileStore, DefaultProfileStore, DefaultTerminalProfileService,
|
|
48
49
|
TerminalProfileService, TerminalProfileStore, UserTerminalProfileStore
|
|
@@ -120,6 +121,8 @@ export default new ContainerModule(bind => {
|
|
|
120
121
|
// default terminal link provider
|
|
121
122
|
bind(UrlLinkProvider).toSelf().inSingletonScope();
|
|
122
123
|
bind(TerminalLinkProvider).toService(UrlLinkProvider);
|
|
124
|
+
bind(FileUriLinkProvider).toSelf().inSingletonScope();
|
|
125
|
+
bind(TerminalLinkProvider).toService(FileUriLinkProvider);
|
|
123
126
|
bind(FileLinkProvider).toSelf().inSingletonScope();
|
|
124
127
|
bind(TerminalLinkProvider).toService(FileLinkProvider);
|
|
125
128
|
bind(FileDiffPreLinkProvider).toSelf().inSingletonScope();
|