Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
31 changes: 31 additions & 0 deletions .github/workflows/turbofile-update-manifest.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: TurboFile Update Manifest

on:
workflow_dispatch:
inputs:
proxy-prefix:
description: Optional download proxy prefix for update-proxy.json
required: false
type: string
sha256:
description: Optional installer SHA256 override
required: false
type: string

permissions:
contents: write

jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- uses: actions/setup-node@v6
with:
node-version-file: .nvmrc
- name: Publish update manifest
run: npm run turbofile:update-manifest
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
TURBOFILE_UPDATE_PROXY_PREFIX: ${{ inputs.proxy-prefix }}
TURBOFILE_UPDATE_SHA256: ${{ inputs.sha256 }}
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,9 @@ dist
.playwright-cli
.playwright-mcp
.claude/
/.superpowers/
/docs/presentations/
**/__pycache__/
.agents/agents/*.local.md
.github/agents/*.local.md
.agents/agents/*.local.agent.md
Expand Down
14 changes: 1 addition & 13 deletions build/buildfile.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,25 +16,18 @@ export const workerExtensionHost = createModuleDescription('vs/workbench/api/wor
export const workerNotebook = createModuleDescription('vs/workbench/contrib/notebook/common/services/notebookWebWorkerMain');
export const workerLanguageDetection = createModuleDescription('vs/workbench/services/languageDetection/browser/languageDetectionWebWorkerMain');
export const workerLocalFileSearch = createModuleDescription('vs/workbench/services/search/worker/localFileSearchMain');
export const workerProfileAnalysis = createModuleDescription('vs/platform/profiling/electron-browser/profileAnalysisWorkerMain');
export const workerOutputLinks = createModuleDescription('vs/workbench/contrib/output/common/outputLinkComputerMain');
export const workerBackgroundTokenization = createModuleDescription('vs/workbench/services/textMate/browser/backgroundTokenization/worker/textMateTokenizationWorker.workerMain');

export const workbenchDesktop = [
createModuleDescription('vs/workbench/contrib/debug/node/telemetryApp'),
createModuleDescription('vs/platform/files/node/watcher/watcherMain'),
createModuleDescription('vs/platform/terminal/node/ptyHostMain'),
createModuleDescription('vs/platform/agentHost/node/agentHostMain'),
createModuleDescription('vs/platform/agentHost/node/diffWorkerMain'),
createModuleDescription('vs/workbench/api/node/extensionHostProcess'),
createModuleDescription('vs/workbench/workbench.desktop.main'),
createModuleDescription('vs/sessions/sessions.desktop.main')
createModuleDescription('vs/workbench/workbench.desktop.main')
];

export const workbenchWeb = createModuleDescription('vs/workbench/workbench.web.main.internal');

export const sessionsWeb = createModuleDescription('vs/sessions/sessions.web.main.internal');

export const keyboardMaps = [
createModuleDescription('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.linux'),
createModuleDescription('vs/workbench/services/keybinding/browser/keyboardLayouts/layout.contribution.darwin'),
Expand All @@ -47,7 +40,6 @@ export const code = [
createModuleDescription('vs/code/node/cliProcessMain'),
createModuleDescription('vs/code/electron-utility/sharedProcess/sharedProcessMain'),
createModuleDescription('vs/code/electron-browser/workbench/workbench'),
createModuleDescription('vs/sessions/electron-browser/sessions'),
];

export const codeWeb = createModuleDescription('vs/code/browser/workbench/workbench');
Expand All @@ -58,8 +50,6 @@ export const codeServer = [
createModuleDescription('vs/workbench/api/node/extensionHostProcess'),
createModuleDescription('vs/platform/files/node/watcher/watcherMain'),
createModuleDescription('vs/platform/terminal/node/ptyHostMain'),
createModuleDescription('vs/platform/agentHost/node/agentHostMain'),
createModuleDescription('vs/platform/agentHost/node/diffWorkerMain'),
];

export const entrypoint = createModuleDescription;
Expand All @@ -70,12 +60,10 @@ const buildfile = {
workerNotebook,
workerLanguageDetection,
workerLocalFileSearch,
workerProfileAnalysis,
workerOutputLinks,
workerBackgroundTokenization,
workbenchDesktop,
workbenchWeb,
sessionsWeb,
keyboardMaps,
code,
codeWeb,
Expand Down
6 changes: 0 additions & 6 deletions build/checker/layersChecker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -58,12 +58,6 @@ const RULES: IRule[] = [
disallowedTypes: NATIVE_TYPES,
},

// Browser view preload script
{
target: '**/vs/platform/browserView/electron-browser/preload-browserView.ts',
disallowedTypes: NATIVE_TYPES,
},

// Common
{
target: '**/vs/**/common/**',
Expand Down
3 changes: 1 addition & 2 deletions build/checker/tsconfig.electron-browser.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
"../../src/**/test/**",
"../../src/**/fixtures/**",
"../../src/vs/base/parts/sandbox/electron-browser/preload.ts", // Preload scripts for Electron sandbox
"../../src/vs/base/parts/sandbox/electron-browser/preload-aux.ts", // have limited access to node.js APIs
"../../src/vs/platform/browserView/electron-browser/preload-browserView.ts" // Browser view preload script
"../../src/vs/base/parts/sandbox/electron-browser/preload-aux.ts" // have limited access to node.js APIs
]
}
61 changes: 34 additions & 27 deletions build/gulpfile.vscode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ const glob = promisify(globCallback);
const rcedit = promisify(rceditCallback);
const root = path.dirname(import.meta.dirname);
const commit = getVersion(root);
interface TurboFileProductPolicy {
readonly excludedProductionDependencies: readonly string[];
readonly electronLocales: readonly string[];
}
const turboFileProductPolicy = JSON.parse(fs.readFileSync(path.join(root, 'build', 'turbofile-product.json'), 'utf8')) as TurboFileProductPolicy;
const electronLocales = new Set(turboFileProductPolicy.electronLocales.map(locale => locale.toLowerCase()));

// Build
const vscodeEntryPoints = [
Expand All @@ -53,7 +59,6 @@ const vscodeEntryPoints = [
buildfile.workerNotebook,
buildfile.workerLanguageDetection,
buildfile.workerLocalFileSearch,
buildfile.workerProfileAnalysis,
buildfile.workerOutputLinks,
buildfile.workerBackgroundTokenization,
buildfile.workbenchDesktop,
Expand All @@ -68,19 +73,16 @@ const vscodeResourceIncludes = [

// Workbench
'out-build/vs/code/electron-browser/workbench/workbench.html',
'out-build/vs/sessions/electron-browser/sessions.html',

// Electron Preload
'out-build/vs/base/parts/sandbox/electron-browser/preload.js',
'out-build/vs/base/parts/sandbox/electron-browser/preload-aux.js',
'out-build/vs/platform/browserView/electron-browser/preload-browserView.js',

// Node Scripts
'out-build/vs/base/node/{terminateProcess.sh,cpuUsage.sh,ps.sh}',

// Touchbar
'out-build/vs/workbench/browser/parts/editor/media/*.png',
'out-build/vs/workbench/contrib/debug/browser/media/*.png',

// External Terminal
'out-build/vs/workbench/contrib/externalTerminal/**/*.scpt',
Expand All @@ -96,17 +98,6 @@ const vscodeResourceIncludes = [
// Accessibility Signals
'out-build/vs/platform/accessibilitySignal/browser/media/*.mp3',

// Welcome
'out-build/vs/workbench/contrib/welcomeGettingStarted/common/media/**/*.{svg,png}',
'out-build/vs/workbench/contrib/welcomeOnboarding/browser/media/*.svg',

// Sessions
'out-build/vs/sessions/contrib/chat/browser/media/*.svg',
'out-build/vs/sessions/contrib/welcome/browser/media/*.svg',
'out-build/vs/sessions/contrib/welcome/browser/media/themePreviews/*.svg',
'out-build/vs/sessions/prompts/*.prompt.md',
'out-build/vs/sessions/skills/**/SKILL.md',

// Extensions
'out-build/vs/workbench/contrib/extensions/browser/media/{theme-icon.png,language-icon.svg}',
'out-build/vs/workbench/services/extensionManagement/common/media/*.{svg,png}',
Expand Down Expand Up @@ -159,7 +150,7 @@ const bundleVSCodeTask = task.define('bundle-vscode', task.series(
...bootstrapEntryPoints
],
resources: vscodeResources,
skipTSBoilerplateRemoval: entryPoint => entryPoint === 'vs/code/electron-browser/workbench/workbench' || entryPoint === 'vs/sessions/electron-browser/sessions'
skipTSBoilerplateRemoval: entryPoint => entryPoint === 'vs/code/electron-browser/workbench/workbench'
}
}
)
Expand Down Expand Up @@ -226,7 +217,7 @@ function runEsbuildBundle(outDir: string, minify: boolean, nls: boolean, target:
const sourceMappingURLBase = `https://main.vscode-cdn.net/sourcemaps/${commit}`;
const isCI = !!process.env['CI'] || !!process.env['BUILD_ARTIFACTSTAGINGDIRECTORY'] || !!process.env['GITHUB_WORKSPACE'];
const useCdnSourceMapsForPackagingTasks = isCI;
const stripSourceMapsInPackagingTasks = isCI;
const stripSourceMapsInPackagingTasks = true;
const minifyVSCodeTask = task.define('minify-vscode', task.series(
bundleVSCodeTask,
util.rimraf('out-vscode-min'),
Expand Down Expand Up @@ -319,10 +310,6 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
'vs/workbench/api/node/extensionHostProcess.js',
'vs/code/electron-browser/workbench/workbench.html',
'vs/code/electron-browser/workbench/workbench.js',
'vs/sessions/sessions.desktop.main.js',
'vs/sessions/sessions.desktop.main.css',
'vs/sessions/electron-browser/sessions.html',
'vs/sessions/electron-browser/sessions.js'
]);

const src = gulp.src(out + '/**', { base: '.' })
Expand All @@ -342,7 +329,7 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
const extensions = gulp.src(['.build/extensions/**', ...platformSpecificBuiltInExtensionsExclusions], { base: '.build', dot: true });

const sourceFilterPattern = stripSourceMapsInPackagingTasks
? ['**', '!**/*.{js,css}.map']
? ['**', '!**/*.map']
: ['**'];
const sources = es.merge(src, extensions)
.pipe(filter(sourceFilterPattern, { dot: true }));
Expand Down Expand Up @@ -430,9 +417,16 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
const productionDependencies = getProductionDependencies(root);
const dependenciesSrc = productionDependencies.map(d => path.relative(root, d)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`]).flat().concat('!**/*.mk');

const depFilterPattern = ['**', `!**/${config.version}/**`, '!**/bin/darwin-arm64-87/**', '!**/package-lock.json', '!**/yarn.lock'];
const depFilterPattern = [
'**',
`!**/${config.version}/**`,
'!**/bin/darwin-arm64-87/**',
'!**/package-lock.json',
'!**/yarn.lock',
...turboFileProductPolicy.excludedProductionDependencies.map(dependency => `!node_modules/${dependency}/**`)
];
if (stripSourceMapsInPackagingTasks) {
depFilterPattern.push('!**/*.{js,css}.map');
depFilterPattern.push('!**/*.map');
}

const deps = gulp.src(dependenciesSrc, { base: '.', dot: true })
Expand Down Expand Up @@ -562,7 +556,19 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
'!version',
...(platform === 'darwin' && !isInsiderOrExploration ? ['!**/Contents/Applications', '!**/Contents/Applications/**'] : []),
...(platform === 'win32' && !isInsiderOrExploration ? ['!**/electron_proxy.exe'] : []),
], { dot: true }));
], { dot: true }))
.pipe(util.filter(file => {
if (platform !== 'win32') {
return true;
}

const relativePath = file.relative.replace(/\\/g, '/');
if (!relativePath.startsWith('locales/')) {
return true;
}

return electronLocales.has(path.posix.basename(relativePath).toLowerCase());
}));

if (platform === 'linux') {
result = es.merge(result, gulp.src('resources/completions/bash/code', { base: '.' })
Expand Down Expand Up @@ -616,7 +622,8 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
result = es.merge(result, gulp.src('.build/policies/win32/**', { base: '.build/policies/win32' })
.pipe(rename(f => f.dirname = `policies/${f.dirname}`)));

if (quality === 'stable' || quality === 'insider') {
const win32ContextMenu = (product as { win32ContextMenu?: Record<string, { clsid: string }> }).win32ContextMenu;
if ((quality === 'stable' || quality === 'insider') && win32ContextMenu?.[arch]) {
result = es.merge(result, gulp.src('.build/win32/appx/**', { base: '.build/win32' }));
const rawVersion = version.replace(/-\w+$/, '').split('.');
const appxVersion = `${rawVersion[0]}.0.${rawVersion[1]}.${rawVersion[2]}`;
Expand All @@ -628,7 +635,7 @@ function packageTask(platform: string, arch: string, sourceFolderName: string, d
.pipe(replace('@@ApplicationIdShort@@', product.win32RegValueName))
.pipe(replace('@@ApplicationExe@@', product.nameShort + '.exe'))
.pipe(replace('@@FileExplorerContextMenuID@@', quality === 'stable' ? 'OpenWithCode' : 'OpenWithCodeInsiders'))
.pipe(replace('@@FileExplorerContextMenuCLSID@@', (product as { win32ContextMenu?: Record<string, { clsid: string }> }).win32ContextMenu![arch].clsid))
.pipe(replace('@@FileExplorerContextMenuCLSID@@', win32ContextMenu[arch].clsid))
.pipe(replace('@@FileExplorerContextMenuDLL@@', `${quality === 'stable' ? 'code' : 'code_insider'}_explorer_command_${arch}.dll`))
.pipe(rename(f => f.dirname = `appx/manifest`)));
}
Expand Down
1 change: 0 additions & 1 deletion build/gulpfile.vscode.web.ts
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,6 @@ const vscodeWebEntryPoints = [
buildfile.workerBackgroundTokenization,
buildfile.keyboardMaps,
buildfile.workbenchWeb,
buildfile.sessionsWeb,
].flat();

/**
Expand Down
3 changes: 2 additions & 1 deletion build/gulpfile.vscode.win32.ts
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,8 @@ function buildWin32Setup(arch: string, target: string): task.CallbackTask {
definitions['ProxyMutex'] = embedded.win32MutexName;
}

if (quality === 'stable' || quality === 'insider') {
const win32ContextMenu = (product as typeof product & { win32ContextMenu?: Record<string, { clsid: string }> }).win32ContextMenu;
if ((quality === 'stable' || quality === 'insider') && win32ContextMenu?.[arch]) {
definitions['AppxPackage'] = `${quality === 'stable' ? 'code' : 'code_insider'}_${arch}.appx`;
definitions['AppxPackageDll'] = `${quality === 'stable' ? 'code' : 'code_insider'}_explorer_command_${arch}.dll`;
definitions['AppxPackageName'] = `${product.win32AppUserModelId}`;
Expand Down
10 changes: 9 additions & 1 deletion build/lib/extensions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,11 @@ import { createRequire } from 'module';
const require = createRequire(import.meta.url);

const root = path.dirname(path.dirname(import.meta.dirname));
interface TurboFileProductPolicy {
readonly excludedLocalExtensions: readonly string[];
}
const turboFileProductPolicy = JSON.parse(fs.readFileSync(path.join(root, 'build', 'turbofile-product.json'), 'utf8')) as TurboFileProductPolicy;
const excludedLocalExtensions = new Set(turboFileProductPolicy.excludedLocalExtensions);
// const commit = getVersion(root);
// const sourceMappingURLBase = `https://main.vscode-cdn.net/sourcemaps/${commit}`;

Expand Down Expand Up @@ -427,6 +432,7 @@ function doPackageLocalExtensionsStream(forWeb: boolean, disableMangle: boolean,
})
.filter(({ name }) => native ? nativeExtensionsSet.has(name) : !nativeExtensionsSet.has(name))
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
.filter(({ name }) => !excludedLocalExtensions.has(name))
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
.filter(({ manifestPath }) => (forWeb ? isWebExtension(require(manifestPath)) : true))
);
Expand Down Expand Up @@ -633,7 +639,9 @@ const esbuildMediaScripts = [
];

export function buildExtensionMedia(isWatch: boolean, outputRoot?: string): Promise<void> {
return esbuildExtensions('esbuilding extension media', isWatch, esbuildMediaScripts.map(p => ({
return esbuildExtensions('esbuilding extension media', isWatch, esbuildMediaScripts
.filter(script => !excludedLocalExtensions.has(script.split('/')[0]))
.map(p => ({
script: path.join(extensionsPath, p),
outputRoot: outputRoot ? path.join(root, outputRoot, path.dirname(p)) : undefined
})));
Expand Down
Loading
Loading