Skip to content

Commit 750baf0

Browse files
committed
Minify extension resources
1 parent a8b2444 commit 750baf0

File tree

4 files changed

+71
-33
lines changed

4 files changed

+71
-33
lines changed

build/lib/extensions.js

Lines changed: 25 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,28 @@ const fancyLog = require("fancy-log");
2222
const ansiColors = require("ansi-colors");
2323
const buffer = require('gulp-buffer');
2424
const json = require("gulp-json-editor");
25+
const jsoncParser = require("jsonc-parser");
2526
const webpack = require('webpack');
2627
const webpackGulp = require('webpack-stream');
2728
const util = require('./util');
2829
const root = path.dirname(path.dirname(__dirname));
2930
const commit = util.getVersion(root);
3031
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
31-
function minimizeLanguageJSON(input) {
32-
const tmLanguageJsonFilter = filter('**/*.tmLanguage.json', { restore: true });
32+
function minifyExtensionResources(input) {
33+
const jsonFilter = filter(['**/*.json', '**/*.code-snippets'], { restore: true });
3334
return input
34-
.pipe(tmLanguageJsonFilter)
35+
.pipe(jsonFilter)
3536
.pipe(buffer())
3637
.pipe(es.mapSync((f) => {
37-
f.contents = Buffer.from(JSON.stringify(JSON.parse(f.contents.toString('utf8'))));
38+
const errors = [];
39+
const value = jsoncParser.parse(f.contents.toString('utf8'), errors);
40+
if (errors.length === 0) {
41+
// file parsed OK => just stringify to drop whitespace and comments
42+
f.contents = Buffer.from(JSON.stringify(value));
43+
}
3844
return f;
3945
}))
40-
.pipe(tmLanguageJsonFilter.restore);
46+
.pipe(jsonFilter.restore);
4147
}
4248
function updateExtensionPackageJSON(input, update) {
4349
const packageJsonFilter = filter('extensions/*/package.json', { restore: true });
@@ -59,6 +65,9 @@ function fromLocal(extensionPath, forWeb) {
5965
: fromLocalNormal(extensionPath);
6066
if (forWeb) {
6167
input = updateExtensionPackageJSON(input, (data) => {
68+
delete data.scripts;
69+
delete data.dependencies;
70+
delete data.devDependencies;
6271
if (data.browser) {
6372
data.main = data.browser;
6473
}
@@ -68,13 +77,16 @@ function fromLocal(extensionPath, forWeb) {
6877
}
6978
else if (isWebPacked) {
7079
input = updateExtensionPackageJSON(input, (data) => {
80+
delete data.scripts;
81+
delete data.dependencies;
82+
delete data.devDependencies;
7183
if (data.main) {
7284
data.main = data.main.replace('/out/', /dist/);
7385
}
7486
return data;
7587
});
7688
}
77-
return minimizeLanguageJSON(input);
89+
return input;
7890
}
7991
function fromLocalWebpack(extensionPath, webpackConfigFileName) {
8092
const result = es.through();
@@ -215,8 +227,8 @@ function packageLocalExtensionsStream() {
215227
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
216228
});
217229
const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' });
218-
return es.merge(nodeModules, ...localExtensions)
219-
.pipe(util2.setExecutableBit(['**/*.sh']));
230+
return minifyExtensionResources(es.merge(nodeModules, ...localExtensions)
231+
.pipe(util2.setExecutableBit(['**/*.sh'])));
220232
}
221233
exports.packageLocalExtensionsStream = packageLocalExtensionsStream;
222234
function packageLocalWebExtensionsStream() {
@@ -230,19 +242,19 @@ function packageLocalWebExtensionsStream() {
230242
const extensionName = path.basename(extensionPath);
231243
return { name: extensionName, path: extensionPath };
232244
});
233-
return es.merge(...localExtensionDescriptions.map(extension => {
245+
return minifyExtensionResources(es.merge(...localExtensionDescriptions.map(extension => {
234246
return fromLocal(extension.path, true)
235247
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
236-
}));
248+
})));
237249
}
238250
exports.packageLocalWebExtensionsStream = packageLocalWebExtensionsStream;
239251
function packageMarketplaceExtensionsStream() {
240252
const extensions = builtInExtensions.map(extension => {
241253
return fromMarketplace(extension.name, extension.version, extension.metadata)
242254
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
243255
});
244-
return es.merge(extensions)
245-
.pipe(util2.setExecutableBit(['**/*.sh']));
256+
return minifyExtensionResources(es.merge(extensions)
257+
.pipe(util2.setExecutableBit(['**/*.sh'])));
246258
}
247259
exports.packageMarketplaceExtensionsStream = packageMarketplaceExtensionsStream;
248260
function packageMarketplaceWebExtensionsStream(builtInExtensions) {
@@ -258,7 +270,7 @@ function packageMarketplaceWebExtensionsStream(builtInExtensions) {
258270
return data;
259271
});
260272
});
261-
return es.merge(extensions);
273+
return minifyExtensionResources(es.merge(extensions));
262274
}
263275
exports.packageMarketplaceWebExtensionsStream = packageMarketplaceWebExtensionsStream;
264276
function scanBuiltinExtensions(extensionsRoot, forWeb) {

build/lib/extensions.ts

Lines changed: 40 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -21,23 +21,29 @@ import * as fancyLog from 'fancy-log';
2121
import * as ansiColors from 'ansi-colors';
2222
const buffer = require('gulp-buffer');
2323
import json = require('gulp-json-editor');
24+
import * as jsoncParser from 'jsonc-parser';
2425
const webpack = require('webpack');
2526
const webpackGulp = require('webpack-stream');
2627
const util = require('./util');
2728
const root = path.dirname(path.dirname(__dirname));
2829
const commit = util.getVersion(root);
2930
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
3031

31-
function minimizeLanguageJSON(input: Stream): Stream {
32-
const tmLanguageJsonFilter = filter('**/*.tmLanguage.json', { restore: true });
32+
function minifyExtensionResources(input: Stream): Stream {
33+
const jsonFilter = filter(['**/*.json', '**/*.code-snippets'], { restore: true });
3334
return input
34-
.pipe(tmLanguageJsonFilter)
35+
.pipe(jsonFilter)
3536
.pipe(buffer())
3637
.pipe(es.mapSync((f: File) => {
37-
f.contents = Buffer.from(JSON.stringify(JSON.parse(f.contents.toString('utf8'))));
38+
const errors: jsoncParser.ParseError[] = [];
39+
const value = jsoncParser.parse(f.contents.toString('utf8'), errors);
40+
if (errors.length === 0) {
41+
// file parsed OK => just stringify to drop whitespace and comments
42+
f.contents = Buffer.from(JSON.stringify(value));
43+
}
3844
return f;
3945
}))
40-
.pipe(tmLanguageJsonFilter.restore);
46+
.pipe(jsonFilter.restore);
4147
}
4248

4349
function updateExtensionPackageJSON(input: Stream, update: (data: any) => any): Stream {
@@ -63,6 +69,9 @@ function fromLocal(extensionPath: string, forWeb: boolean): Stream {
6369

6470
if (forWeb) {
6571
input = updateExtensionPackageJSON(input, (data: any) => {
72+
delete data.scripts;
73+
delete data.dependencies;
74+
delete data.devDependencies;
6675
if (data.browser) {
6776
data.main = data.browser;
6877
}
@@ -71,14 +80,17 @@ function fromLocal(extensionPath: string, forWeb: boolean): Stream {
7180
});
7281
} else if (isWebPacked) {
7382
input = updateExtensionPackageJSON(input, (data: any) => {
83+
delete data.scripts;
84+
delete data.dependencies;
85+
delete data.devDependencies;
7486
if (data.main) {
7587
data.main = data.main.replace('/out/', /dist/);
7688
}
7789
return data;
7890
});
7991
}
8092

81-
return minimizeLanguageJSON(input);
93+
return input;
8294
}
8395

8496

@@ -243,7 +255,7 @@ interface IBuiltInExtension {
243255

244256
const builtInExtensions: IBuiltInExtension[] = JSON.parse(fs.readFileSync(path.join(__dirname, '../../product.json'), 'utf8')).builtInExtensions;
245257

246-
export function packageLocalExtensionsStream(): NodeJS.ReadWriteStream {
258+
export function packageLocalExtensionsStream(): Stream {
247259
const localExtensionDescriptions = (<string[]>glob.sync('extensions/*/package.json'))
248260
.map(manifestPath => {
249261
const extensionPath = path.dirname(path.join(root, manifestPath));
@@ -260,11 +272,13 @@ export function packageLocalExtensionsStream(): NodeJS.ReadWriteStream {
260272
});
261273

262274
const nodeModules = gulp.src('extensions/node_modules/**', { base: '.' });
263-
return es.merge(nodeModules, ...localExtensions)
264-
.pipe(util2.setExecutableBit(['**/*.sh']));
275+
return minifyExtensionResources(
276+
es.merge(nodeModules, ...localExtensions)
277+
.pipe(util2.setExecutableBit(['**/*.sh']))
278+
);
265279
}
266280

267-
export function packageLocalWebExtensionsStream(): NodeJS.ReadWriteStream {
281+
export function packageLocalWebExtensionsStream(): Stream {
268282
const localExtensionDescriptions = (<string[]>glob.sync('extensions/*/package.json'))
269283
.filter(manifestPath => {
270284
const packageJsonConfig = require(path.join(root, manifestPath));
@@ -276,23 +290,27 @@ export function packageLocalWebExtensionsStream(): NodeJS.ReadWriteStream {
276290
return { name: extensionName, path: extensionPath };
277291
});
278292

279-
return es.merge(...localExtensionDescriptions.map(extension => {
280-
return fromLocal(extension.path, true)
281-
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
282-
}));
293+
return minifyExtensionResources(
294+
es.merge(...localExtensionDescriptions.map(extension => {
295+
return fromLocal(extension.path, true)
296+
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
297+
}))
298+
);
283299
}
284300

285-
export function packageMarketplaceExtensionsStream(): NodeJS.ReadWriteStream {
301+
export function packageMarketplaceExtensionsStream(): Stream {
286302
const extensions = builtInExtensions.map(extension => {
287303
return fromMarketplace(extension.name, extension.version, extension.metadata)
288304
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
289305
});
290306

291-
return es.merge(extensions)
292-
.pipe(util2.setExecutableBit(['**/*.sh']));
307+
return minifyExtensionResources(
308+
es.merge(extensions)
309+
.pipe(util2.setExecutableBit(['**/*.sh']))
310+
);
293311
}
294312

295-
export function packageMarketplaceWebExtensionsStream(builtInExtensions: IBuiltInExtension[]): NodeJS.ReadWriteStream {
313+
export function packageMarketplaceWebExtensionsStream(builtInExtensions: IBuiltInExtension[]): Stream {
296314
const extensions = builtInExtensions
297315
.map(extension => {
298316
const input = fromMarketplace(extension.name, extension.version, extension.metadata)
@@ -305,7 +323,9 @@ export function packageMarketplaceWebExtensionsStream(builtInExtensions: IBuiltI
305323
return data;
306324
});
307325
});
308-
return es.merge(extensions);
326+
return minifyExtensionResources(
327+
es.merge(extensions)
328+
);
309329
}
310330

311331
export interface IScannedBuiltinExtension {
@@ -336,7 +356,7 @@ export function scanBuiltinExtensions(extensionsRoot: string, forWeb: boolean):
336356

337357
if (packageNLS) {
338358
// temporary
339-
packageJSON = translatePackageJSON(packageJSON, path.join(extensionsRoot, extensionFolder, packageNLS))
359+
packageJSON = translatePackageJSON(packageJSON, path.join(extensionsRoot, extensionFolder, packageNLS));
340360
}
341361
scannedExtensions.push({
342362
extensionPath: extensionFolder,

build/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@
3939
"gulp-sourcemaps": "^1.11.0",
4040
"gulp-uglify": "^3.0.0",
4141
"iconv-lite-umd": "0.6.8",
42+
"jsonc-parser": "^2.3.0",
4243
"mime": "^1.3.4",
4344
"minimatch": "3.0.4",
4445
"minimist": "^1.2.3",

build/yarn.lock

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1600,6 +1600,11 @@ json-stringify-safe@~5.0.1:
16001600
resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb"
16011601
integrity sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=
16021602

1603+
jsonc-parser@^2.3.0:
1604+
version "2.3.0"
1605+
resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-2.3.0.tgz#7c7fc988ee1486d35734faaaa866fadb00fa91ee"
1606+
integrity sha512-b0EBt8SWFNnixVdvoR2ZtEGa9ZqLhbJnOjezn+WP+8kspFm+PFYDN8Z4Bc7pRlDjvuVcADSUkroIuTWWn/YiIA==
1607+
16031608
jsonfile@^4.0.0:
16041609
version "4.0.0"
16051610
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz#8771aae0799b64076b76640fca058f9c10e33ecb"

0 commit comments

Comments
 (0)