@theia/plugin-ext 1.24.0-next.4 → 1.24.0-next.40
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/common/plugin-api-rpc.d.ts +2 -1
- package/lib/common/plugin-api-rpc.d.ts.map +1 -1
- package/lib/common/plugin-api-rpc.js.map +1 -1
- package/lib/hosted/browser/hosted-plugin.js +1 -1
- package/lib/hosted/browser/hosted-plugin.js.map +1 -1
- package/lib/hosted/node/hosted-plugin-deployer-handler.d.ts.map +1 -1
- package/lib/hosted/node/hosted-plugin-deployer-handler.js +2 -10
- package/lib/hosted/node/hosted-plugin-deployer-handler.js.map +1 -1
- package/lib/main/browser/documents-main.d.ts +1 -3
- package/lib/main/browser/documents-main.d.ts.map +1 -1
- package/lib/main/browser/documents-main.js +2 -3
- package/lib/main/browser/documents-main.js.map +1 -1
- package/lib/main/browser/editor/untitled-resource.d.ts +3 -10
- package/lib/main/browser/editor/untitled-resource.d.ts.map +1 -1
- package/lib/main/browser/editor/untitled-resource.js +8 -44
- package/lib/main/browser/editor/untitled-resource.js.map +1 -1
- package/lib/main/browser/languages-main.d.ts +2 -2
- package/lib/main/browser/languages-main.d.ts.map +1 -1
- package/lib/main/browser/languages-main.js +4 -3
- package/lib/main/browser/languages-main.js.map +1 -1
- package/lib/main/browser/main-context.d.ts.map +1 -1
- package/lib/main/browser/main-context.js +1 -3
- package/lib/main/browser/main-context.js.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.d.ts.map +1 -1
- package/lib/main/browser/menus/menus-contribution-handler.js +14 -17
- package/lib/main/browser/menus/menus-contribution-handler.js.map +1 -1
- package/lib/main/browser/webview/webview-environment.d.ts +1 -1
- package/lib/main/browser/webview/webview-environment.d.ts.map +1 -1
- package/lib/main/browser/webview/webview-environment.js +7 -2
- package/lib/main/browser/webview/webview-environment.js.map +1 -1
- package/lib/main/browser/webview/webview.d.ts.map +1 -1
- package/lib/main/browser/webview/webview.js +4 -0
- package/lib/main/browser/webview/webview.js.map +1 -1
- package/lib/plugin/languages.d.ts +1 -1
- package/lib/plugin/languages.d.ts.map +1 -1
- package/lib/plugin/languages.js +6 -2
- package/lib/plugin/languages.js.map +1 -1
- package/lib/plugin/plugin-context.d.ts.map +1 -1
- package/lib/plugin/plugin-context.js +2 -2
- package/lib/plugin/plugin-context.js.map +1 -1
- package/lib/plugin/type-converters.d.ts.map +1 -1
- package/lib/plugin/type-converters.js +2 -1
- package/lib/plugin/type-converters.js.map +1 -1
- package/lib/plugin/webviews.js +3 -3
- package/lib/plugin/webviews.js.map +1 -1
- package/package.json +23 -23
- package/src/common/plugin-api-rpc.ts +2 -1
- package/src/hosted/browser/hosted-plugin.ts +1 -1
- package/src/hosted/node/hosted-plugin-deployer-handler.ts +2 -10
- package/src/main/browser/documents-main.ts +1 -3
- package/src/main/browser/editor/untitled-resource.ts +10 -45
- package/src/main/browser/languages-main.ts +4 -3
- package/src/main/browser/main-context.ts +1 -3
- package/src/main/browser/menus/menus-contribution-handler.ts +18 -19
- package/src/main/browser/webview/webview-environment.ts +8 -2
- package/src/main/browser/webview/webview.ts +4 -0
- package/src/plugin/languages.ts +8 -2
- package/src/plugin/plugin-context.ts +3 -2
- package/src/plugin/type-converters.ts +2 -1
- package/src/plugin/webviews.ts +3 -3
|
@@ -15,21 +15,16 @@
|
|
|
15
15
|
// *****************************************************************************
|
|
16
16
|
|
|
17
17
|
import { Emitter, Event } from '@theia/core/lib/common/event';
|
|
18
|
-
import { injectable
|
|
19
|
-
import { Resource, ResourceResolver, ResourceVersion
|
|
18
|
+
import { injectable } from '@theia/core/shared/inversify';
|
|
19
|
+
import { Resource, ResourceResolver, ResourceVersion } from '@theia/core/lib/common/resource';
|
|
20
20
|
import URI from '@theia/core/lib/common/uri';
|
|
21
21
|
import { Schemes } from '../../../common/uri-components';
|
|
22
|
-
import { FileResource, FileResourceResolver } from '@theia/filesystem/lib/browser';
|
|
23
|
-
import { TextDocumentContentChangeEvent } from '@theia/core/shared/vscode-languageserver-protocol';
|
|
24
22
|
|
|
25
23
|
let index = 0;
|
|
26
24
|
|
|
27
25
|
@injectable()
|
|
28
26
|
export class UntitledResourceResolver implements ResourceResolver {
|
|
29
27
|
|
|
30
|
-
@inject(FileResourceResolver)
|
|
31
|
-
protected readonly fileResourceResolver: FileResourceResolver;
|
|
32
|
-
|
|
33
28
|
protected readonly resources = new Map<string, UntitledResource>();
|
|
34
29
|
|
|
35
30
|
async resolve(uri: URI): Promise<UntitledResource> {
|
|
@@ -38,14 +33,14 @@ export class UntitledResourceResolver implements ResourceResolver {
|
|
|
38
33
|
} else {
|
|
39
34
|
const untitledResource = this.resources.get(uri.toString());
|
|
40
35
|
if (!untitledResource) {
|
|
41
|
-
return this.createUntitledResource(
|
|
36
|
+
return this.createUntitledResource('', '', uri);
|
|
42
37
|
} else {
|
|
43
38
|
return untitledResource;
|
|
44
39
|
}
|
|
45
40
|
}
|
|
46
41
|
}
|
|
47
42
|
|
|
48
|
-
async createUntitledResource(
|
|
43
|
+
async createUntitledResource(content?: string, language?: string, uri?: URI): Promise<UntitledResource> {
|
|
49
44
|
let extension;
|
|
50
45
|
if (language) {
|
|
51
46
|
for (const lang of monaco.languages.getLanguages()) {
|
|
@@ -58,33 +53,26 @@ export class UntitledResourceResolver implements ResourceResolver {
|
|
|
58
53
|
}
|
|
59
54
|
}
|
|
60
55
|
return new UntitledResource(this.resources, uri ? uri : new URI().withScheme(Schemes.untitled).withPath(`/Untitled-${index++}${extension ? extension : ''}`),
|
|
61
|
-
|
|
56
|
+
content);
|
|
62
57
|
}
|
|
63
58
|
}
|
|
64
59
|
|
|
65
60
|
export class UntitledResource implements Resource {
|
|
66
61
|
|
|
67
|
-
private fileResource?: FileResource;
|
|
68
|
-
|
|
69
62
|
protected readonly onDidChangeContentsEmitter = new Emitter<void>();
|
|
70
63
|
readonly onDidChangeContents: Event<void> = this.onDidChangeContentsEmitter.event;
|
|
71
64
|
|
|
72
|
-
constructor(private resources: Map<string, UntitledResource>, public uri: URI, private
|
|
65
|
+
constructor(private resources: Map<string, UntitledResource>, public uri: URI, private content?: string) {
|
|
73
66
|
this.resources.set(this.uri.toString(), this);
|
|
74
67
|
}
|
|
75
68
|
|
|
76
69
|
dispose(): void {
|
|
77
70
|
this.resources.delete(this.uri.toString());
|
|
78
71
|
this.onDidChangeContentsEmitter.dispose();
|
|
79
|
-
if (this.fileResource) {
|
|
80
|
-
this.fileResource.dispose();
|
|
81
|
-
}
|
|
82
72
|
}
|
|
83
73
|
|
|
84
74
|
async readContents(options?: { encoding?: string | undefined; } | undefined): Promise<string> {
|
|
85
|
-
if (this.
|
|
86
|
-
return this.fileResource.readContents(options);
|
|
87
|
-
} else if (this.content) {
|
|
75
|
+
if (this.content) {
|
|
88
76
|
return this.content;
|
|
89
77
|
} else {
|
|
90
78
|
return '';
|
|
@@ -92,26 +80,9 @@ export class UntitledResource implements Resource {
|
|
|
92
80
|
}
|
|
93
81
|
|
|
94
82
|
async saveContents(content: string, options?: { encoding?: string, overwriteEncoding?: boolean }): Promise<void> {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
this.fileResource.onDidChangeContents(() => this.fireDidChangeContents());
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
await this.fileResource.saveContents(content, options);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
async saveContentChanges(changes: TextDocumentContentChangeEvent[], options?: ResourceSaveOptions): Promise<void> {
|
|
105
|
-
if (!this.fileResource || !this.fileResource.saveContentChanges) {
|
|
106
|
-
throw new Error('FileResource is not available for: ' + this.uri.path.toString());
|
|
107
|
-
}
|
|
108
|
-
await this.fileResource.saveContentChanges(changes, options);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
async guessEncoding(): Promise<string | undefined> {
|
|
112
|
-
if (this.fileResource) {
|
|
113
|
-
return this.fileResource.guessEncoding();
|
|
114
|
-
}
|
|
83
|
+
// This function must exist to ensure readOnly is false for the Monaco editor.
|
|
84
|
+
// However it should not be called because saving 'untitled' is always processed as 'Save As'.
|
|
85
|
+
throw Error('never');
|
|
115
86
|
}
|
|
116
87
|
|
|
117
88
|
protected fireDidChangeContents(): void {
|
|
@@ -119,16 +90,10 @@ export class UntitledResource implements Resource {
|
|
|
119
90
|
}
|
|
120
91
|
|
|
121
92
|
get version(): ResourceVersion | undefined {
|
|
122
|
-
if (this.fileResource) {
|
|
123
|
-
return this.fileResource.version;
|
|
124
|
-
}
|
|
125
93
|
return undefined;
|
|
126
94
|
}
|
|
127
95
|
|
|
128
96
|
get encoding(): string | undefined {
|
|
129
|
-
if (this.fileResource) {
|
|
130
|
-
return this.fileResource.encoding;
|
|
131
|
-
}
|
|
132
97
|
return undefined;
|
|
133
98
|
}
|
|
134
99
|
}
|
|
@@ -459,14 +459,15 @@ export class LanguagesMainImpl implements LanguagesMain, Disposable {
|
|
|
459
459
|
}
|
|
460
460
|
}
|
|
461
461
|
|
|
462
|
-
$registerOutlineSupport(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[]): void {
|
|
462
|
+
$registerOutlineSupport(handle: number, pluginInfo: PluginInfo, selector: SerializedDocumentFilter[], displayName?: string): void {
|
|
463
463
|
const languageSelector = this.toLanguageSelector(selector);
|
|
464
|
-
const symbolProvider = this.createDocumentSymbolProvider(handle);
|
|
464
|
+
const symbolProvider = this.createDocumentSymbolProvider(handle, displayName);
|
|
465
465
|
this.register(handle, monaco.modes.DocumentSymbolProviderRegistry.register(languageSelector, symbolProvider));
|
|
466
466
|
}
|
|
467
467
|
|
|
468
|
-
protected createDocumentSymbolProvider(handle: number): monaco.languages.DocumentSymbolProvider {
|
|
468
|
+
protected createDocumentSymbolProvider(handle: number, displayName?: string): monaco.languages.DocumentSymbolProvider {
|
|
469
469
|
return {
|
|
470
|
+
displayName,
|
|
470
471
|
provideDocumentSymbols: (model, token) => this.provideDocumentSymbols(handle, model, token)
|
|
471
472
|
};
|
|
472
473
|
}
|
|
@@ -47,7 +47,6 @@ import { ApplicationShell } from '@theia/core/lib/browser/shell/application-shel
|
|
|
47
47
|
import { MonacoBulkEditService } from '@theia/monaco/lib/browser/monaco-bulk-edit-service';
|
|
48
48
|
import { MonacoEditorService } from '@theia/monaco/lib/browser/monaco-editor-service';
|
|
49
49
|
import { UntitledResourceResolver } from './editor/untitled-resource';
|
|
50
|
-
import { FileResourceResolver } from '@theia/filesystem/lib/browser';
|
|
51
50
|
import { MainFileSystemEventService } from './main-file-system-event-service';
|
|
52
51
|
import { LabelServiceMainImpl } from './label-service-main';
|
|
53
52
|
import { TimelineMainImpl } from './timeline-main';
|
|
@@ -87,8 +86,7 @@ export function setUpPluginApi(rpc: RPCProtocol, container: interfaces.Container
|
|
|
87
86
|
const openerService = container.get<OpenerService>(OpenerService);
|
|
88
87
|
const shell = container.get(ApplicationShell);
|
|
89
88
|
const untitledResourceResolver = container.get(UntitledResourceResolver);
|
|
90
|
-
const
|
|
91
|
-
const documentsMain = new DocumentsMainImpl(editorsAndDocuments, modelService, rpc, editorManager, openerService, shell, untitledResourceResolver, fileResourceResolver);
|
|
89
|
+
const documentsMain = new DocumentsMainImpl(editorsAndDocuments, modelService, rpc, editorManager, openerService, shell, untitledResourceResolver);
|
|
92
90
|
rpc.set(PLUGIN_RPC_CONTEXT.DOCUMENTS_MAIN, documentsMain);
|
|
93
91
|
|
|
94
92
|
const bulkEditService = container.get(MonacoBulkEditService);
|
|
@@ -518,13 +518,26 @@ export class MenusContributionPointHandler {
|
|
|
518
518
|
}
|
|
519
519
|
const toDispose = new DisposableCollection();
|
|
520
520
|
const commandId = this.createSyntheticCommandId(menu.command, { prefix: '__plugin.menu.action.' });
|
|
521
|
+
const altId = menu.alt && this.createSyntheticCommandId(menu.alt, { prefix: '__plugin.menu.action.' });
|
|
522
|
+
|
|
523
|
+
const inline = Boolean(menu.group && /^inline/.test(menu.group));
|
|
524
|
+
const [group, order = undefined] = (menu.group || '_').split('@');
|
|
525
|
+
|
|
521
526
|
const command: Command = { id: commandId };
|
|
527
|
+
const action: MenuAction = { commandId, alt: altId, order, when: menu.when };
|
|
528
|
+
|
|
522
529
|
toDispose.push(this.commands.registerCommand(command, handler(menu.command)));
|
|
523
530
|
toDispose.push(this.quickCommandService?.pushCommandContext(commandId, 'false'));
|
|
531
|
+
toDispose.push(this.menuRegistry.registerMenuAction(inline ? menuPath : [...menuPath, ...group.split('/')], action));
|
|
532
|
+
toDispose.push(this.onDidRegisterCommand(menu.command, pluginCommand => {
|
|
533
|
+
command.category = pluginCommand.category;
|
|
534
|
+
command.label = pluginCommand.label;
|
|
535
|
+
if (inline) {
|
|
536
|
+
command.iconClass = pluginCommand.iconClass;
|
|
537
|
+
}
|
|
538
|
+
}));
|
|
524
539
|
|
|
525
|
-
|
|
526
|
-
if (menu.alt) {
|
|
527
|
-
altId = this.createSyntheticCommandId(menu.alt, { prefix: '__plugin.menu.action.' });
|
|
540
|
+
if (menu.alt && altId) {
|
|
528
541
|
const alt: Command = { id: altId };
|
|
529
542
|
toDispose.push(this.commands.registerCommand(alt, handler(menu.alt)));
|
|
530
543
|
toDispose.push(this.quickCommandService?.pushCommandContext(altId, 'false'));
|
|
@@ -537,13 +550,9 @@ export class MenusContributionPointHandler {
|
|
|
537
550
|
}));
|
|
538
551
|
}
|
|
539
552
|
|
|
540
|
-
const { when } = menu;
|
|
541
|
-
const [group, order = undefined] = (menu.group || '_').split('@');
|
|
542
|
-
const action: MenuAction = { commandId, alt: altId, order, when };
|
|
543
|
-
|
|
544
553
|
// Register a submenu if the group is in format `<submenu group>/<submenu name>/<submenu order>.../<menu group>`
|
|
545
|
-
if (group
|
|
546
|
-
const groupSplit = group
|
|
554
|
+
if (group.includes('/')) {
|
|
555
|
+
const groupSplit = group.split('/');
|
|
547
556
|
const orderSplit = (menu.submenusOrder || '').split('/');
|
|
548
557
|
const paths: string[] = [];
|
|
549
558
|
for (let i = 0, j = 0; i < groupSplit.length - 1; i += 2, j += 1) {
|
|
@@ -554,17 +563,7 @@ export class MenusContributionPointHandler {
|
|
|
554
563
|
toDispose.push(this.menuRegistry.registerSubmenu([...menuPath, ...paths], submenuLabel, { order: submenuOrder }));
|
|
555
564
|
}
|
|
556
565
|
}
|
|
557
|
-
const inline = /^inline/.test(group);
|
|
558
|
-
menuPath = inline ? menuPath : [...menuPath, ...group.split('/')];
|
|
559
|
-
toDispose.push(this.menuRegistry.registerMenuAction(menuPath, action));
|
|
560
566
|
|
|
561
|
-
toDispose.push(this.onDidRegisterCommand(menu.command, pluginCommand => {
|
|
562
|
-
command.category = pluginCommand.category;
|
|
563
|
-
command.label = pluginCommand.label;
|
|
564
|
-
if (inline) {
|
|
565
|
-
command.iconClass = pluginCommand.iconClass;
|
|
566
|
-
}
|
|
567
|
-
}));
|
|
568
567
|
return toDispose;
|
|
569
568
|
}
|
|
570
569
|
|
|
@@ -60,8 +60,14 @@ export class WebviewEnvironment {
|
|
|
60
60
|
return (await this.externalEndpointUrl()).toString(true);
|
|
61
61
|
}
|
|
62
62
|
|
|
63
|
-
async resourceRoot(): Promise<string> {
|
|
64
|
-
|
|
63
|
+
async resourceRoot(host: string): Promise<string> {
|
|
64
|
+
if (host === 'frontend') {
|
|
65
|
+
return (await this.externalEndpointUrl()).withPath('{{path}}').toString(true);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Make sure we preserve the scheme of the resource but convert it into a normal path segment
|
|
69
|
+
// The scheme is important as we need to know if we are requesting a local or a remote resource.
|
|
70
|
+
return (await this.externalEndpointUrl()).resolve('theia-resource/{{scheme}}//{{authority}}/{{path}}').toString(true);
|
|
65
71
|
}
|
|
66
72
|
|
|
67
73
|
async cspSource(): Promise<string> {
|
|
@@ -44,6 +44,7 @@ import { OutputChannelManager } from '@theia/output/lib/browser/output-channel';
|
|
|
44
44
|
import { WebviewPreferences } from './webview-preferences';
|
|
45
45
|
import { WebviewResourceCache } from './webview-resource-cache';
|
|
46
46
|
import { Endpoint } from '@theia/core/lib/browser/endpoint';
|
|
47
|
+
import { isFirefox } from '@theia/core/lib/browser/browser';
|
|
47
48
|
import { FileService } from '@theia/filesystem/lib/browser/file-service';
|
|
48
49
|
import { FileOperationError, FileOperationResult } from '@theia/filesystem/lib/common/files';
|
|
49
50
|
import { BinaryBufferReadableStream } from '@theia/core/lib/common/buffer';
|
|
@@ -250,6 +251,9 @@ export class WebviewWidget extends BaseWidget implements StatefulWidget {
|
|
|
250
251
|
const element = document.createElement('iframe');
|
|
251
252
|
element.className = 'webview';
|
|
252
253
|
element.sandbox.add('allow-scripts', 'allow-forms', 'allow-same-origin', 'allow-downloads');
|
|
254
|
+
if (!isFirefox) {
|
|
255
|
+
element.setAttribute('allow', 'clipboard-read; clipboard-write; usb; serial; hid;');
|
|
256
|
+
}
|
|
253
257
|
element.setAttribute('src', `${this.externalEndpoint}/index.html?id=${this.identifier.id}`);
|
|
254
258
|
element.style.border = 'none';
|
|
255
259
|
element.style.width = '100%';
|
package/src/plugin/languages.ts
CHANGED
|
@@ -531,9 +531,11 @@ export class LanguagesExtImpl implements LanguagesExt {
|
|
|
531
531
|
// ### Code Reference Provider end
|
|
532
532
|
|
|
533
533
|
// ### Document Symbol Provider begin
|
|
534
|
-
registerDocumentSymbolProvider(selector: theia.DocumentSelector, provider: theia.DocumentSymbolProvider, pluginInfo: PluginInfo
|
|
534
|
+
registerDocumentSymbolProvider(selector: theia.DocumentSelector, provider: theia.DocumentSymbolProvider, pluginInfo: PluginInfo,
|
|
535
|
+
metadata?: theia.DocumentSymbolProviderMetadata): theia.Disposable {
|
|
535
536
|
const callId = this.addNewAdapter(new OutlineAdapter(this.documents, provider));
|
|
536
|
-
|
|
537
|
+
const displayName = (metadata && metadata.label) || getPluginLabel(pluginInfo);
|
|
538
|
+
this.proxy.$registerOutlineSupport(callId, pluginInfo, this.transformDocumentSelector(selector), displayName);
|
|
537
539
|
return this.createDisposable(callId);
|
|
538
540
|
}
|
|
539
541
|
|
|
@@ -700,3 +702,7 @@ function serializeIndentation(indentationRules?: theia.IndentationRule): Seriali
|
|
|
700
702
|
unIndentedLinePattern: serializeRegExp(indentationRules.unIndentedLinePattern)
|
|
701
703
|
};
|
|
702
704
|
}
|
|
705
|
+
|
|
706
|
+
function getPluginLabel(pluginInfo: PluginInfo): string {
|
|
707
|
+
return pluginInfo.displayName || pluginInfo.name;
|
|
708
|
+
}
|
|
@@ -752,8 +752,9 @@ export function createAPIFactory(
|
|
|
752
752
|
registerReferenceProvider(selector: theia.DocumentSelector, provider: theia.ReferenceProvider): theia.Disposable {
|
|
753
753
|
return languagesExt.registerReferenceProvider(selector, provider, pluginToPluginInfo(plugin));
|
|
754
754
|
},
|
|
755
|
-
registerDocumentSymbolProvider(selector: theia.DocumentSelector, provider: theia.DocumentSymbolProvider
|
|
756
|
-
|
|
755
|
+
registerDocumentSymbolProvider(selector: theia.DocumentSelector, provider: theia.DocumentSymbolProvider,
|
|
756
|
+
metadata?: theia.DocumentSymbolProviderMetadata): theia.Disposable {
|
|
757
|
+
return languagesExt.registerDocumentSymbolProvider(selector, provider, pluginToPluginInfo(plugin), metadata);
|
|
757
758
|
},
|
|
758
759
|
registerColorProvider(selector: theia.DocumentSelector, provider: theia.DocumentColorProvider): theia.Disposable {
|
|
759
760
|
return languagesExt.registerColorProvider(selector, provider, pluginToPluginInfo(plugin));
|
|
@@ -1217,6 +1217,7 @@ export function pathOrURIToURI(value: string | URI): URI {
|
|
|
1217
1217
|
export function pluginToPluginInfo(plugin: Plugin): rpc.PluginInfo {
|
|
1218
1218
|
return {
|
|
1219
1219
|
id: plugin.model.id,
|
|
1220
|
-
name: plugin.model.name
|
|
1220
|
+
name: plugin.model.name,
|
|
1221
|
+
displayName: plugin.model.displayName
|
|
1221
1222
|
};
|
|
1222
1223
|
}
|
package/src/plugin/webviews.ts
CHANGED
|
@@ -216,9 +216,9 @@ export class WebviewImpl implements theia.Webview {
|
|
|
216
216
|
|
|
217
217
|
asWebviewUri(resource: theia.Uri): theia.Uri {
|
|
218
218
|
const uri = this.initData.webviewResourceRoot
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
.replace('{{
|
|
219
|
+
.replace('{{scheme}}', resource.scheme)
|
|
220
|
+
.replace('{{authority}}', resource.authority)
|
|
221
|
+
.replace('{{path}}', resource.path.replace(/^\//, ''))
|
|
222
222
|
.replace('{{uuid}}', this.viewId);
|
|
223
223
|
return URI.parse(uri);
|
|
224
224
|
}
|