diff --git a/.gitignore b/.gitignore index 1dbe527cb8a..3d97a65e027 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,7 @@ node_modules/ .build/ .vscode/extensions/**/out/ extensions/**/dist/ +src/vs/base/browser/ui/codicons/codicon/codicon.ttf /out*/ /extensions/**/out/ build/node_modules diff --git a/build/gulpfile.compile.ts b/build/gulpfile.compile.ts index fcfdf2dca57..76f04ae179f 100644 --- a/build/gulpfile.compile.ts +++ b/build/gulpfile.compile.ts @@ -19,9 +19,9 @@ function makeCompileBuildTask(disableMangle: boolean) { } // Local/PR compile, including nls and inline sources in sourcemaps, minification, no mangling -export const compileBuildWithoutManglingTask = task.define('compile-build-without-mangling', makeCompileBuildTask(true)); +export const compileBuildWithoutManglingTask = task.define('compile-build-without-mangling', task.series(compilation.copyCodiconsTask, makeCompileBuildTask(true))); gulp.task(compileBuildWithoutManglingTask); // CI compile, including nls and inline sources in sourcemaps, mangling, minification, for build -export const compileBuildWithManglingTask = task.define('compile-build-with-mangling', makeCompileBuildTask(false)); +export const compileBuildWithManglingTask = task.define('compile-build-with-mangling', task.series(compilation.copyCodiconsTask, makeCompileBuildTask(false))); gulp.task(compileBuildWithManglingTask); diff --git a/build/gulpfile.editor.ts b/build/gulpfile.editor.ts index 5096f8caa1e..338c678b7de 100644 --- a/build/gulpfile.editor.ts +++ b/build/gulpfile.editor.ts @@ -36,6 +36,14 @@ const BUNDLED_FILE_HEADER = [ ].join('\n'); const extractEditorSrcTask = task.define('extract-editor-src', () => { + // Ensure codicon.ttf is copied from node_modules (needed when node_modules is cached and postinstall doesn't run) + const codiconSource = path.join(root, 'node_modules', '@vscode', 'codicons', 'dist', 'codicon.ttf'); + const codiconDest = path.join(root, 'src', 'vs', 'base', 'browser', 'ui', 'codicons', 'codicon', 'codicon.ttf'); + if (fs.existsSync(codiconSource)) { + fs.mkdirSync(path.dirname(codiconDest), { recursive: true }); + fs.copyFileSync(codiconSource, codiconDest); + } + const apiusages = monacoapi.execute().usageContent; const extrausages = fs.readFileSync(path.join(root, 'build', 'monaco', 'monaco.usage.recipe')).toString(); standalone.extractEditor({ diff --git a/build/gulpfile.ts b/build/gulpfile.ts index e83b9a08d28..a8e2917035e 100644 --- a/build/gulpfile.ts +++ b/build/gulpfile.ts @@ -31,10 +31,10 @@ const transpileClientTask = task.define('transpile-client', task.series(util.rim gulp.task(transpileClientTask); // Fast compile for development time -const compileClientTask = task.define('compile-client', task.series(util.rimraf('out'), compileApiProposalNamesTask, compileTask('src', 'out', false))); +const compileClientTask = task.define('compile-client', task.series(util.rimraf('out'), compilation.copyCodiconsTask, compileApiProposalNamesTask, compileTask('src', 'out', false))); gulp.task(compileClientTask); -const watchClientTask = task.define('watch-client', task.series(util.rimraf('out'), task.parallel(watchTask('out', false), watchApiProposalNamesTask))); +const watchClientTask = task.define('watch-client', task.series(util.rimraf('out'), task.parallel(watchTask('out', false), watchApiProposalNamesTask, compilation.watchCodiconsTask))); gulp.task(watchClientTask); // All diff --git a/build/lib/compilation.ts b/build/lib/compilation.ts index 948c6b4ef4f..f440dc28dd0 100644 --- a/build/lib/compilation.ts +++ b/build/lib/compilation.ts @@ -356,3 +356,34 @@ export const watchApiProposalNamesTask = task.define('watch-api-proposal-names', .pipe(util.debounce(task)) .pipe(gulp.dest('src')); }); + +// Codicons +const root = path.dirname(path.dirname(import.meta.dirname)); +const codiconSource = path.join(root, 'node_modules', '@vscode', 'codicons', 'dist', 'codicon.ttf'); +const codiconDest = path.join(root, 'src', 'vs', 'base', 'browser', 'ui', 'codicons', 'codicon', 'codicon.ttf'); + +function copyCodiconsImpl() { + try { + if (fs.existsSync(codiconSource)) { + fs.mkdirSync(path.dirname(codiconDest), { recursive: true }); + fs.copyFileSync(codiconSource, codiconDest); + } else { + fancyLog(ansiColors.red('[codicons]'), `codicon.ttf not found in node_modules. Please run 'npm install' to install dependencies.`); + } + } catch (e) { + fancyLog(ansiColors.red('[codicons]'), `Error copying codicon.ttf: ${e}`); + } +} + +export const copyCodiconsTask = task.define('copy-codicons', () => { + copyCodiconsImpl(); + return Promise.resolve(); +}); +gulp.task(copyCodiconsTask); + +export const watchCodiconsTask = task.define('watch-codicons', () => { + copyCodiconsImpl(); + return watch('node_modules/@vscode/codicons/dist/**', { readDelay: 200 }) + .on('data', () => copyCodiconsImpl()); +}); +gulp.task(watchCodiconsTask); diff --git a/package-lock.json b/package-lock.json index 8b8afda541f..15a48303a2a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,6 +15,7 @@ "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "^2.5.6", "@types/semver": "^7.5.8", + "@vscode/codicons": "^0.0.44", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/native-watchdog": "^1.4.6", @@ -2945,6 +2946,12 @@ "win32" ] }, + "node_modules/@vscode/codicons": { + "version": "0.0.44", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.44.tgz", + "integrity": "sha512-F7qPRumUK3EHjNdopfICLGRf3iNPoZQt+McTHAn4AlOWPB3W2kL4H0S7uqEqbyZ6rCxaeDjpAn3MCUnwTu/VJQ==", + "license": "CC-BY-4.0" + }, "node_modules/@vscode/deviceid": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/@vscode/deviceid/-/deviceid-0.1.4.tgz", diff --git a/package.json b/package.json index 4f4e30d6263..7afb445134c 100644 --- a/package.json +++ b/package.json @@ -77,6 +77,7 @@ "@microsoft/1ds-post-js": "^3.2.13", "@parcel/watcher": "^2.5.6", "@types/semver": "^7.5.8", + "@vscode/codicons": "^0.0.44", "@vscode/deviceid": "^0.1.1", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/native-watchdog": "^1.4.6", diff --git a/remote/web/package-lock.json b/remote/web/package-lock.json index d964f64fe1a..813696ecc97 100644 --- a/remote/web/package-lock.json +++ b/remote/web/package-lock.json @@ -10,6 +10,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", + "@vscode/codicons": "^0.0.44", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/tree-sitter-wasm": "^0.3.0", "@vscode/vscode-languagedetection": "1.0.21", @@ -71,6 +72,12 @@ "resolved": "https://registry.npmjs.org/@microsoft/dynamicproto-js/-/dynamicproto-js-1.1.9.tgz", "integrity": "sha512-n1VPsljTSkthsAFYdiWfC+DKzK2WwcRp83Y1YAqdX552BstvsDjft9YXppjUzp11BPsapDoO1LDgrDB0XVsfNQ==" }, + "node_modules/@vscode/codicons": { + "version": "0.0.44", + "resolved": "https://registry.npmjs.org/@vscode/codicons/-/codicons-0.0.44.tgz", + "integrity": "sha512-F7qPRumUK3EHjNdopfICLGRf3iNPoZQt+McTHAn4AlOWPB3W2kL4H0S7uqEqbyZ6rCxaeDjpAn3MCUnwTu/VJQ==", + "license": "CC-BY-4.0" + }, "node_modules/@vscode/iconv-lite-umd": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/@vscode/iconv-lite-umd/-/iconv-lite-umd-0.7.1.tgz", diff --git a/remote/web/package.json b/remote/web/package.json index 5043903a437..3ef9372d0ec 100644 --- a/remote/web/package.json +++ b/remote/web/package.json @@ -5,6 +5,7 @@ "dependencies": { "@microsoft/1ds-core-js": "^3.2.13", "@microsoft/1ds-post-js": "^3.2.13", + "@vscode/codicons": "^0.0.44", "@vscode/iconv-lite-umd": "0.7.1", "@vscode/tree-sitter-wasm": "^0.3.0", "@vscode/vscode-languagedetection": "1.0.21", diff --git a/src/vs/base/browser/ui/codicons/codicon/README.md b/src/vs/base/browser/ui/codicons/codicon/README.md new file mode 100644 index 00000000000..34e498f7d55 --- /dev/null +++ b/src/vs/base/browser/ui/codicons/codicon/README.md @@ -0,0 +1,5 @@ +# Codicons + +## Where does the codicon.ttf come from? + +It is added via the `@vscode/codicons` npm package, then copied to this directory during compile time. diff --git a/src/vs/base/browser/ui/codicons/codicon/codicon.ttf b/src/vs/base/browser/ui/codicons/codicon/codicon.ttf deleted file mode 100644 index 0c9d65f81c2..00000000000 Binary files a/src/vs/base/browser/ui/codicons/codicon/codicon.ttf and /dev/null differ