From 2147cfa36892bbe9ab791110368854773e03928a Mon Sep 17 00:00:00 2001
From: giddyuptiger <65830808+giddyuptiger@users.noreply.github.com>
Date: Sat, 6 Jun 2020 13:44:57 -0700
Subject: [PATCH 1/2] Add proposed API flag to CLI

---
 src/node/cli.ts | 2 ++
 1 file changed, 2 insertions(+)

diff --git a/src/node/cli.ts b/src/node/cli.ts
index 22c65dbf012d..9bc7c723ee42 100644
--- a/src/node/cli.ts
+++ b/src/node/cli.ts
@@ -40,6 +40,7 @@ export interface Args extends VsArgs {
   readonly force?: boolean
   readonly "list-extensions"?: boolean
   readonly "install-extension"?: string[]
+  readonly "enable-proposed-api"?: string[]
   readonly "show-versions"?: boolean
   readonly "uninstall-extension"?: string[]
   readonly "proxy-domain"?: string[]
@@ -130,6 +131,7 @@ const options: Options<Required<Args>> = {
     description:
       "Install or update a VS Code extension by id or vsix. The identifier of an extension is `${publisher}.${name}`. To install a specific version provide `@${version}`. For example: 'vscode.csharp@1.2.3'.",
   },
+  "enable-proposed-api": { type: "string[]", description: "Enable Proposed (beta) API for VS Code extensions by id." },
   "uninstall-extension": { type: "string[]", description: "Uninstall a VS Code extension by id." },
   "show-versions": { type: "boolean", description: "Show VS Code extension versions." },
   "proxy-domain": { type: "string[]", description: "Domain used for proxying ports." },

From 741319d5866d7d3c153296487c8d8df7310dcc0c Mon Sep 17 00:00:00 2001
From: Asher <ash@coder.com>
Date: Tue, 25 Aug 2020 17:58:55 -0500
Subject: [PATCH 2/2] Patch payload with proposed API flag value

---
 ci/dev/vscode.patch | 35 ++++++++++++++++++++++++++++-------
 src/node/cli.ts     |  7 +++++--
 2 files changed, 33 insertions(+), 9 deletions(-)

diff --git a/ci/dev/vscode.patch b/ci/dev/vscode.patch
index 293f68620254..c1ac92c1d4c9 100644
--- a/ci/dev/vscode.patch
+++ b/ci/dev/vscode.patch
@@ -1269,10 +1269,10 @@ index 0000000000..56331ff1fc
 +require('../../bootstrap-amd').load('vs/server/entry');
 diff --git a/src/vs/server/ipc.d.ts b/src/vs/server/ipc.d.ts
 new file mode 100644
-index 0000000000..7e1cd270c8
+index 0000000000..16ed214d94
 --- /dev/null
 +++ b/src/vs/server/ipc.d.ts
-@@ -0,0 +1,115 @@
+@@ -0,0 +1,119 @@
 +/**
 + * External interfaces for integration into code-server over IPC. No vs imports
 + * should be made in this file.
@@ -1321,6 +1321,7 @@ index 0000000000..7e1cd270c8
 +export interface Args {
 +	'user-data-dir'?: string;
 +
++	'enable-proposed-api'?: string[];
 +	'extensions-dir'?: string;
 +	'builtin-extensions-dir'?: string;
 +	'extra-extensions-dir'?: string[];
@@ -1368,7 +1369,10 @@ index 0000000000..7e1cd270c8
 +		readonly workspaceUri?: UriComponents;
 +		readonly logLevel?: number;
 +		readonly workspaceProvider?: {
-+			payload: [["userDataPath", string]];
++			payload: [
++				["userDataPath", string],
++				["enableProposedApi", string],
++			];
 +		};
 +	};
 +	readonly remoteUserDataUri: UriComponents;
@@ -2477,10 +2481,10 @@ index 0000000000..3c74512192
 +}
 diff --git a/src/vs/server/node/server.ts b/src/vs/server/node/server.ts
 new file mode 100644
-index 0000000000..f2c16b9f81
+index 0000000000..4b88fedb2f
 --- /dev/null
 +++ b/src/vs/server/node/server.ts
-@@ -0,0 +1,282 @@
+@@ -0,0 +1,285 @@
 +import * as fs from 'fs';
 +import * as net from 'net';
 +import * as path from 'path';
@@ -2580,7 +2584,10 @@ index 0000000000..f2c16b9f81
 +				remoteAuthority: options.remoteAuthority,
 +				logLevel: getLogLevel(environment),
 +				workspaceProvider: {
-+					payload: [["userDataPath", environment.userDataPath]],
++					payload: [
++						["userDataPath", environment.userDataPath],
++						["enableProposedApi", JSON.stringify(options.args["enable-proposed-api"] || [])]
++					],
 +				},
 +			},
 +			remoteUserDataUri: transformer.transformOutgoing(URI.file(environment.userDataPath)),
@@ -3075,7 +3082,7 @@ index 6e3182a696..7df85da165 100644
  		};
  
 diff --git a/src/vs/workbench/services/environment/browser/environmentService.ts b/src/vs/workbench/services/environment/browser/environmentService.ts
-index ba2701ec54..efea3bd5bc 100644
+index ba2701ec54..4d4aaa6958 100644
 --- a/src/vs/workbench/services/environment/browser/environmentService.ts
 +++ b/src/vs/workbench/services/environment/browser/environmentService.ts
 @@ -121,8 +121,18 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment
@@ -3098,6 +3105,20 @@ index ba2701ec54..efea3bd5bc 100644
  
  	@memoize
  	get settingsResource(): URI { return joinPath(this.userRoamingDataHome, 'settings.json'); }
+@@ -284,7 +294,12 @@ export class BrowserWorkbenchEnvironmentService implements IWorkbenchEnvironment
+ 						extensionHostDebugEnvironment.params.port = parseInt(value);
+ 						break;
+ 					case 'enableProposedApi':
+-						extensionHostDebugEnvironment.extensionEnabledProposedApi = [];
++						try {
++							extensionHostDebugEnvironment.extensionEnabledProposedApi = JSON.parse(value);
++						} catch (error) {
++							console.error(error);
++							extensionHostDebugEnvironment.extensionEnabledProposedApi = [];
++						}
+ 						break;
+ 				}
+ 			}
 diff --git a/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts b/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts
 index c28b147740..6090200d9c 100644
 --- a/src/vs/workbench/services/extensionManagement/common/extensionEnablementService.ts
diff --git a/src/node/cli.ts b/src/node/cli.ts
index 9bc7c723ee42..85dae9eee2d0 100644
--- a/src/node/cli.ts
+++ b/src/node/cli.ts
@@ -40,7 +40,6 @@ export interface Args extends VsArgs {
   readonly force?: boolean
   readonly "list-extensions"?: boolean
   readonly "install-extension"?: string[]
-  readonly "enable-proposed-api"?: string[]
   readonly "show-versions"?: boolean
   readonly "uninstall-extension"?: string[]
   readonly "proxy-domain"?: string[]
@@ -131,7 +130,11 @@ const options: Options<Required<Args>> = {
     description:
       "Install or update a VS Code extension by id or vsix. The identifier of an extension is `${publisher}.${name}`. To install a specific version provide `@${version}`. For example: 'vscode.csharp@1.2.3'.",
   },
-  "enable-proposed-api": { type: "string[]", description: "Enable Proposed (beta) API for VS Code extensions by id." },
+  "enable-proposed-api": {
+    type: "string[]",
+    description:
+      "Enable proposed API features for extensions. Can receive one or more extension IDs to enable individually.",
+  },
   "uninstall-extension": { type: "string[]", description: "Uninstall a VS Code extension by id." },
   "show-versions": { type: "boolean", description: "Show VS Code extension versions." },
   "proxy-domain": { type: "string[]", description: "Domain used for proxying ports." },