diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js
index 1323931216a..609b0d60b0a 100644
--- a/build/gulpfile.vscode.js
+++ b/build/gulpfile.vscode.js
@@ -56,6 +56,7 @@ const vscodeResources = [
'out-build/vs/**/*.{svg,png,html,jpg,mp3}',
'!out-build/vs/code/browser/**/*.html',
'!out-build/vs/code/**/*-dev.html',
+ '!out-build/vs/code/**/*-dev.esm.html',
'!out-build/vs/editor/standalone/**/*.svg',
'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh,ps.sh}',
'out-build/vs/base/browser/ui/codicons/codicon/**',
@@ -70,8 +71,8 @@ const vscodeResources = [
'out-build/vs/workbench/contrib/terminal/browser/media/*.sh',
'out-build/vs/workbench/contrib/terminal/browser/media/*.zsh',
'out-build/vs/workbench/contrib/webview/browser/pre/*.js',
- '!out-build/vs/workbench/contrib/issue/browser/*.html',
'!out-build/vs/workbench/contrib/issue/**/*-dev.html',
+ '!out-build/vs/workbench/contrib/issue/**/*-dev.esm.html',
'out-build/vs/**/markdown.css',
'out-build/vs/workbench/contrib/tasks/**/*.json',
'!**/test/**'
diff --git a/build/gulpfile.vscode.web.js b/build/gulpfile.vscode.web.js
index 0424b12fa45..190dac79372 100644
--- a/build/gulpfile.vscode.web.js
+++ b/build/gulpfile.vscode.web.js
@@ -47,6 +47,7 @@ const vscodeWebResourceIncludes = [
// Extension Worker
'out-build/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html',
+ 'out-build/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html',
// Web node paths (needed for integration tests)
'out-build/vs/webPackagePaths.js',
@@ -62,6 +63,8 @@ const vscodeWebResources = [
'!out-build/vs/**/{node,electron-sandbox,electron-main}/**',
'!out-build/vs/editor/standalone/**',
'!out-build/vs/workbench/**/*-tb.png',
+ '!out-build/vs/code/**/*-dev.html',
+ '!out-build/vs/code/**/*-dev.esm.html',
'!**/test/**'
];
diff --git a/src/vs/code/browser/workbench/workbench-dev.esm.html b/src/vs/code/browser/workbench/workbench-dev.esm.html
new file mode 100644
index 00000000000..140030d8abe
--- /dev/null
+++ b/src/vs/code/browser/workbench/workbench-dev.esm.html
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vs/code/browser/workbench/workbench.esm.html b/src/vs/code/browser/workbench/workbench.esm.html
new file mode 100644
index 00000000000..38c03e6a321
--- /dev/null
+++ b/src/vs/code/browser/workbench/workbench.esm.html
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.esm.html b/src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.esm.html
new file mode 100644
index 00000000000..74d159c3ddd
--- /dev/null
+++ b/src/vs/code/electron-sandbox/processExplorer/processExplorer-dev.esm.html
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vs/code/electron-sandbox/processExplorer/processExplorer.esm.html b/src/vs/code/electron-sandbox/processExplorer/processExplorer.esm.html
new file mode 100644
index 00000000000..d2747202950
--- /dev/null
+++ b/src/vs/code/electron-sandbox/processExplorer/processExplorer.esm.html
@@ -0,0 +1,42 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vs/code/electron-sandbox/workbench/workbench-dev.esm.html b/src/vs/code/electron-sandbox/workbench/workbench-dev.esm.html
new file mode 100644
index 00000000000..2d8161be6a9
--- /dev/null
+++ b/src/vs/code/electron-sandbox/workbench/workbench-dev.esm.html
@@ -0,0 +1,76 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vs/code/electron-sandbox/workbench/workbench.esm.html b/src/vs/code/electron-sandbox/workbench/workbench.esm.html
new file mode 100644
index 00000000000..1e89448e605
--- /dev/null
+++ b/src/vs/code/electron-sandbox/workbench/workbench.esm.html
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vs/code/node/cli.ts b/src/vs/code/node/cli.ts
index 9acf37f930f..db947d6c029 100644
--- a/src/vs/code/node/cli.ts
+++ b/src/vs/code/node/cli.ts
@@ -398,7 +398,10 @@ export async function main(argv: string[]): Promise {
return false;
}
if (target.type === 'page') {
- return target.url.indexOf('workbench/workbench.html') > 0 || target.url.indexOf('workbench/workbench-dev.html') > 0;
+ return target.url.indexOf('workbench/workbench.html') > 0 ||
+ target.url.indexOf('workbench/workbench-dev.html') > 0 ||
+ target.url.indexOf('workbench/workbench.esm.html') > 0 ||
+ target.url.indexOf('workbench/workbench-dev.esm.html') > 0;
} else {
return true;
}
diff --git a/src/vs/platform/issue/electron-main/issueMainService.ts b/src/vs/platform/issue/electron-main/issueMainService.ts
index 1aea4ead9b9..cb7255ef5bd 100644
--- a/src/vs/platform/issue/electron-main/issueMainService.ts
+++ b/src/vs/platform/issue/electron-main/issueMainService.ts
@@ -22,6 +22,7 @@ import { IIPCObjectUrl, IProtocolMainService } from 'vs/platform/protocol/electr
import { zoomLevelToZoomFactor } from 'vs/platform/window/common/window';
import { ICodeWindow, IWindowState } from 'vs/platform/window/electron-main/window';
import { IWindowsMainService } from 'vs/platform/windows/electron-main/windows';
+import { isESM } from 'vs/base/common/amd';
interface IBrowserWindowOptions {
backgroundColor: string | undefined;
@@ -89,7 +90,7 @@ export class IssueMainService implements IIssueMainService {
});
this.issueReporterWindow.loadURL(
- FileAccess.asBrowserUri(`vs/workbench/contrib/issue/electron-sandbox/issueReporter${this.environmentMainService.isBuilt ? '' : '-dev'}.html`).toString(true)
+ FileAccess.asBrowserUri(`vs/workbench/contrib/issue/electron-sandbox/issueReporter${this.environmentMainService.isBuilt ? '' : '-dev'}.${isESM ? 'esm.' : ''}html`).toString(true)
);
this.issueReporterWindow.on('close', () => {
diff --git a/src/vs/platform/issue/electron-main/processMainService.ts b/src/vs/platform/issue/electron-main/processMainService.ts
index e6002ae0192..2fdbcf1369c 100644
--- a/src/vs/platform/issue/electron-main/processMainService.ts
+++ b/src/vs/platform/issue/electron-main/processMainService.ts
@@ -25,6 +25,7 @@ import { IStateService } from 'vs/platform/state/node/state';
import { UtilityProcess } from 'vs/platform/utilityProcess/electron-main/utilityProcess';
import { zoomLevelToZoomFactor } from 'vs/platform/window/common/window';
import { IWindowState } from 'vs/platform/window/electron-main/window';
+import { isESM } from 'vs/base/common/amd';
const processExplorerWindowState = 'issue.processExplorerWindowState';
@@ -161,7 +162,7 @@ export class ProcessMainService implements IProcessMainService {
});
this.processExplorerWindow.loadURL(
- FileAccess.asBrowserUri(`vs/code/electron-sandbox/processExplorer/processExplorer${this.environmentMainService.isBuilt ? '' : '-dev'}.html`).toString(true)
+ FileAccess.asBrowserUri(`vs/code/electron-sandbox/processExplorer/processExplorer${this.environmentMainService.isBuilt ? '' : '-dev'}.${isESM ? 'esm.' : ''}html`).toString(true)
);
this.processExplorerWindow.on('close', () => {
diff --git a/src/vs/platform/protocol/electron-main/protocolMainService.ts b/src/vs/platform/protocol/electron-main/protocolMainService.ts
index 8b6fd7b5868..4dcb1bcaf7f 100644
--- a/src/vs/platform/protocol/electron-main/protocolMainService.ts
+++ b/src/vs/platform/protocol/electron-main/protocolMainService.ts
@@ -96,7 +96,8 @@ export class ProtocolMainService extends Disposable implements IProtocolMainServ
let headers: Record | undefined;
if (this.environmentService.crossOriginIsolated) {
- if (basename(path) === 'workbench.html' || basename(path) === 'workbench-dev.html') {
+ const pathBasename = basename(path);
+ if (pathBasename === 'workbench.html' || pathBasename === 'workbench-dev.html' || pathBasename === 'workbench.esm.html' || pathBasename === 'workbench-dev.esm.html') {
headers = COI.CoopAndCoep;
} else {
headers = COI.getHeadersFromQuery(request.url);
diff --git a/src/vs/platform/windows/electron-main/windowImpl.ts b/src/vs/platform/windows/electron-main/windowImpl.ts
index 3e905e3ba66..5d3b1c579e8 100644
--- a/src/vs/platform/windows/electron-main/windowImpl.ts
+++ b/src/vs/platform/windows/electron-main/windowImpl.ts
@@ -44,6 +44,7 @@ import { IUserDataProfilesMainService } from 'vs/platform/userDataProfile/electr
import { ILoggerMainService } from 'vs/platform/log/electron-main/loggerService';
import { firstOrDefault } from 'vs/base/common/arrays';
import { IInstantiationService } from 'vs/platform/instantiation/common/instantiation';
+import { isESM } from 'vs/base/common/amd';
export interface IWindowCreationOptions {
readonly state: IWindowState;
@@ -1036,7 +1037,7 @@ export class CodeWindow extends BaseWindow implements ICodeWindow {
this.readyState = ReadyState.NAVIGATING;
// Load URL
- this._win.loadURL(FileAccess.asBrowserUri(`vs/code/electron-sandbox/workbench/workbench${this.environmentMainService.isBuilt ? '' : '-dev'}.html`).toString(true));
+ this._win.loadURL(FileAccess.asBrowserUri(`vs/code/electron-sandbox/workbench/workbench${this.environmentMainService.isBuilt ? '' : '-dev'}.${isESM ? 'esm.' : ''}html`).toString(true));
// Remember that we did load
const wasLoaded = this.wasLoaded;
diff --git a/src/vs/server/node/remoteExtensionHostAgentServer.ts b/src/vs/server/node/remoteExtensionHostAgentServer.ts
index d9bb0122f64..c076b5c1150 100644
--- a/src/vs/server/node/remoteExtensionHostAgentServer.ts
+++ b/src/vs/server/node/remoteExtensionHostAgentServer.ts
@@ -9,7 +9,7 @@ import * as http from 'http';
import * as net from 'net';
import { performance } from 'perf_hooks';
import * as url from 'url';
-import { LoaderStats } from 'vs/base/common/amd';
+import { LoaderStats, isESM } from 'vs/base/common/amd';
import { VSBuffer } from 'vs/base/common/buffer';
import { CharCode } from 'vs/base/common/charCode';
import { isSigPipeError, onUnexpectedError, setUnexpectedErrorHandler } from 'vs/base/common/errors';
@@ -781,7 +781,7 @@ export async function createServer(address: string | net.AddressInfo | null, arg
serverBasePath = `/${serverBasePath}`;
}
- const hasWebClient = fs.existsSync(FileAccess.asFileUri('vs/code/browser/workbench/workbench.html').fsPath);
+ const hasWebClient = fs.existsSync(FileAccess.asFileUri(`vs/code/browser/workbench/workbench.${isESM ? 'esm.' : ''}html`).fsPath);
if (hasWebClient && address && typeof address !== 'string') {
// ships the web ui!
diff --git a/src/vs/server/node/webClientServer.ts b/src/vs/server/node/webClientServer.ts
index 2abd1e1366c..c75c9858d0b 100644
--- a/src/vs/server/node/webClientServer.ts
+++ b/src/vs/server/node/webClientServer.ts
@@ -28,6 +28,7 @@ import { IProductConfiguration } from 'vs/base/common/product';
import { isString } from 'vs/base/common/types';
import { CharCode } from 'vs/base/common/charCode';
import { IExtensionManifest } from 'vs/platform/extensions/common/extensions';
+import { isESM } from 'vs/base/common/amd';
const textMimeType: { [ext: string]: string | undefined } = {
'.html': 'text/html',
@@ -297,7 +298,7 @@ export class WebClientServer {
const resolveWorkspaceURI = (defaultLocation?: string) => defaultLocation && URI.file(path.resolve(defaultLocation)).with({ scheme: Schemas.vscodeRemote, authority: remoteAuthority });
- const filePath = FileAccess.asFileUri(this._environmentService.isBuilt ? 'vs/code/browser/workbench/workbench.html' : 'vs/code/browser/workbench/workbench-dev.html').fsPath;
+ const filePath = FileAccess.asFileUri(`vs/code/browser/workbench/workbench${this._environmentService.isBuilt ? '' : '-dev'}.${isESM ? 'esm.' : ''}html`).fsPath;
const authSessionInfo = !this._environmentService.isBuilt && this._environmentService.args['github-auth'] ? {
id: generateUuid(),
providerId: 'github',
@@ -374,13 +375,15 @@ export class WebClientServer {
return void res.end('Not found');
}
- const webWorkerExtensionHostIframeScriptSHA = 'sha256-V28GQnL3aYxbwgpV3yW1oJ+VKKe/PBSzWntNyH8zVXA=';
+ const webWorkerExtensionHostIframeScriptSHA = isESM ? 'sha256-2Q+j4hfT09+1+imS46J2YlkCtHWQt0/BE79PXjJ0ZJ8=' : 'sha256-V28GQnL3aYxbwgpV3yW1oJ+VKKe/PBSzWntNyH8zVXA=';
const cspDirectives = [
'default-src \'self\';',
'img-src \'self\' https: data: blob:;',
'media-src \'self\';',
- `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' ${useTestResolver ? '' : `http://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html
+ isESM ?
+ `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} blob: 'nonce-1nline-m4p' ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' 'sha256-/r7rqQ+yrxt57sxLuQ6AMYcy/lUpvAIzHjIJt/OeLWU=' ${useTestResolver ? '' : `http://${remoteAuthority}`};` : // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html
+ `script-src 'self' 'unsafe-eval' ${WORKBENCH_NLS_BASE_URL ?? ''} ${this._getScriptCspHashes(data).join(' ')} '${webWorkerExtensionHostIframeScriptSHA}' ${useTestResolver ? '' : `http://${remoteAuthority}`};`, // the sha is the same as in src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html
'child-src \'self\';',
`frame-src 'self' https://*.vscode-cdn.net data:;`,
'worker-src \'self\' data: blob:;',
diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter-dev.esm.html b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter-dev.esm.html
new file mode 100644
index 00000000000..5276ed507ba
--- /dev/null
+++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter-dev.esm.html
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.esm.html b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.esm.html
new file mode 100644
index 00000000000..2f87d2489ce
--- /dev/null
+++ b/src/vs/workbench/contrib/issue/electron-sandbox/issueReporter.esm.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts
index ca86cea6dbc..95e972cd752 100644
--- a/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts
+++ b/src/vs/workbench/services/extensions/browser/webWorkerExtensionHost.ts
@@ -12,7 +12,7 @@ import { VSBuffer } from 'vs/base/common/buffer';
import { canceled, onUnexpectedError } from 'vs/base/common/errors';
import { Emitter, Event } from 'vs/base/common/event';
import { Disposable, toDisposable } from 'vs/base/common/lifecycle';
-import { COI, FileAccess } from 'vs/base/common/network';
+import { AppResourcePath, COI, FileAccess } from 'vs/base/common/network';
import * as platform from 'vs/base/common/platform';
import { joinPath } from 'vs/base/common/resources';
import { URI } from 'vs/base/common/uri';
@@ -86,7 +86,7 @@ export class WebWorkerExtensionHost extends Disposable implements IExtensionHost
const suffix = `?${suffixSearchParams.toString()}`;
- const iframeModulePath = 'vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.html';
+ const iframeModulePath: AppResourcePath = `vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.${isESM ? 'esm.' : ''}html`;
if (platform.isWeb) {
const webEndpointUrlTemplate = this._productService.webEndpointUrlTemplate;
const commit = this._productService.commit;
diff --git a/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html
new file mode 100644
index 00000000000..bd4ea195337
--- /dev/null
+++ b/src/vs/workbench/services/extensions/worker/webWorkerExtensionHostIframe.esm.html
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+