revert changes to gulp files
Revert "oops" This reverts commit2be0f1d8cd
. Revert "cleanup top level gulpfile" This reverts commit849311713d
. Revert "use strict" This reverts commitb6b7e82041
. Revert "forgot top level" This reverts commit1552828709
. Revert "remove VSCODE_BUILD_QUIET" This reverts commit8df5e70d12
.
This commit is contained in:
parent
31bfeb24e8
commit
23afe96996
|
@ -1,10 +1,9 @@
|
|||
{
|
||||
"env": {
|
||||
"node": true,
|
||||
"es6": true
|
||||
"node": true
|
||||
},
|
||||
"rules": {
|
||||
"no-console": 0
|
||||
},
|
||||
"extends": "eslint:recommended"
|
||||
"no-undef": 2,
|
||||
"no-unused-vars": 1
|
||||
}
|
||||
}
|
6
.vscode/tasks.json
vendored
6
.vscode/tasks.json
vendored
|
@ -25,14 +25,14 @@
|
|||
"absolute"
|
||||
],
|
||||
"pattern": {
|
||||
"regexp": "Error: ([^(]+)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\): (.*)$",
|
||||
"regexp": "^\\*\\*\\* Error: ([^(]+)\\((\\d+|\\d+,\\d+|\\d+,\\d+,\\d+,\\d+)\\): (.*)$",
|
||||
"file": 1,
|
||||
"location": 2,
|
||||
"message": 3
|
||||
},
|
||||
"watching": {
|
||||
"beginsPattern": "Starting compilation",
|
||||
"endsPattern": "Finished compilation"
|
||||
"beginsPattern": "^\\*\\*\\* Starting\\.\\.\\.$",
|
||||
"endsPattern": "^\\*\\*\\* Finished"
|
||||
}
|
||||
}
|
||||
},
|
||||
|
|
|
@ -17,6 +17,8 @@ var util = require('./lib/util');
|
|||
var i18n = require('./lib/i18n');
|
||||
var gulpUtil = require('gulp-util');
|
||||
|
||||
var quiet = !!process.env['VSCODE_BUILD_QUIET'];
|
||||
|
||||
function log(prefix, message) {
|
||||
gulpUtil.log(gulpUtil.colors.cyan('[' + prefix + ']'), message);
|
||||
}
|
||||
|
@ -24,6 +26,16 @@ function log(prefix, message) {
|
|||
var root = path.dirname(__dirname);
|
||||
var commit = util.getVersion(root);
|
||||
|
||||
var tsOptions = {
|
||||
target: 'ES5',
|
||||
module: 'amd',
|
||||
verbose: !quiet,
|
||||
preserveConstEnums: true,
|
||||
experimentalDecorators: true,
|
||||
sourceMap: true,
|
||||
rootDir: path.join(path.dirname(__dirname), 'src')
|
||||
};
|
||||
|
||||
exports.loaderConfig = function (emptyPaths) {
|
||||
var result = {
|
||||
paths: {
|
||||
|
@ -63,7 +75,7 @@ function loader(bundledFileHeader) {
|
|||
.pipe(util.loadSourcemaps())
|
||||
.pipe(concat('vs/loader.js'))
|
||||
.pipe(es.mapSync(function (f) {
|
||||
f.sourceMap.sourceRoot = util.toFileUri(path.join(path.dirname(__dirname), 'src'));
|
||||
f.sourceMap.sourceRoot = util.toFileUri(tsOptions.rootDir);
|
||||
return f;
|
||||
}));
|
||||
}
|
||||
|
|
|
@ -19,6 +19,7 @@ var glob = require('glob');
|
|||
var sourcemaps = require('gulp-sourcemaps');
|
||||
var nlsDev = require('vscode-nls-dev');
|
||||
|
||||
var quiet = !!process.env['VSCODE_BUILD_QUIET'];
|
||||
var extensionsPath = path.join(path.dirname(__dirname), 'extensions');
|
||||
|
||||
var compilations = glob.sync('**/tsconfig.json', {
|
||||
|
@ -33,7 +34,7 @@ var tasks = compilations.map(function(tsconfigFile) {
|
|||
var relativeDirname = path.dirname(tsconfigFile);
|
||||
|
||||
var tsOptions = require(absolutePath).compilerOptions;
|
||||
tsOptions.verbose = false;
|
||||
tsOptions.verbose = !quiet;
|
||||
tsOptions.sourceMap = true;
|
||||
|
||||
var name = relativeDirname.replace(/\//g, '-');
|
||||
|
@ -55,15 +56,15 @@ var tasks = compilations.map(function(tsconfigFile) {
|
|||
var i18n = path.join(__dirname, '..', 'i18n');
|
||||
|
||||
function createPipeline(build) {
|
||||
var reporter = createReporter();
|
||||
var reporter = quiet ? null : createReporter();
|
||||
|
||||
tsOptions.inlineSources = !!build;
|
||||
var compilation = tsb.create(tsOptions, null, null, err => reporter(err.toString()));
|
||||
var compilation = tsb.create(tsOptions, null, null, quiet ? null : function (err) { reporter(err.toString()); });
|
||||
|
||||
return function () {
|
||||
const input = es.through();
|
||||
const tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true });
|
||||
const output = input
|
||||
var input = es.through();
|
||||
var tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true });
|
||||
var output = input
|
||||
.pipe(tsFilter)
|
||||
.pipe(util.loadSourcemaps())
|
||||
.pipe(compilation())
|
||||
|
@ -72,27 +73,27 @@ var tasks = compilations.map(function(tsconfigFile) {
|
|||
addComment: false,
|
||||
includeContent: !!build,
|
||||
sourceRoot: function(file) {
|
||||
const levels = file.relative.split(path.sep).length;
|
||||
var levels = file.relative.split(path.sep).length;
|
||||
return '../'.repeat(levels) + 'src';
|
||||
}
|
||||
}))
|
||||
.pipe(tsFilter.restore)
|
||||
.pipe(build ? nlsDev.createAdditionalLanguageFiles(languages, i18n, out) : es.through())
|
||||
.pipe(reporter.end());
|
||||
.pipe(quiet ? es.through() : reporter.end());
|
||||
|
||||
return es.duplex(input, output);
|
||||
};
|
||||
}
|
||||
};
|
||||
|
||||
const srcOpts = { cwd: path.dirname(__dirname), base: srcBase };
|
||||
var srcOpts = { cwd: path.dirname(__dirname), base: srcBase };
|
||||
|
||||
gulp.task(clean, function (cb) {
|
||||
rimraf(out, cb);
|
||||
});
|
||||
|
||||
gulp.task(compile, [clean], function () {
|
||||
const pipeline = createPipeline(false);
|
||||
const input = gulp.src(src, srcOpts);
|
||||
var pipeline = createPipeline(false);
|
||||
var input = gulp.src(src, srcOpts);
|
||||
|
||||
return input
|
||||
.pipe(pipeline())
|
||||
|
@ -100,9 +101,9 @@ var tasks = compilations.map(function(tsconfigFile) {
|
|||
});
|
||||
|
||||
gulp.task(watch, [clean], function () {
|
||||
const pipeline = createPipeline(false);
|
||||
const input = gulp.src(src, srcOpts);
|
||||
const watchInput = watcher(src, srcOpts);
|
||||
var pipeline = createPipeline(false);
|
||||
var input = gulp.src(src, srcOpts);
|
||||
var watchInput = watcher(src, srcOpts);
|
||||
|
||||
return watchInput
|
||||
.pipe(util.incremental(pipeline, input))
|
||||
|
@ -114,8 +115,8 @@ var tasks = compilations.map(function(tsconfigFile) {
|
|||
});
|
||||
|
||||
gulp.task(compileBuild, [clean], function () {
|
||||
const pipeline = createPipeline(true);
|
||||
const input = gulp.src(src, srcOpts);
|
||||
var pipeline = createPipeline(true);
|
||||
var input = gulp.src(src, srcOpts);
|
||||
|
||||
return input
|
||||
.pipe(pipeline())
|
||||
|
@ -123,9 +124,8 @@ var tasks = compilations.map(function(tsconfigFile) {
|
|||
});
|
||||
|
||||
gulp.task(watchBuild, [clean], function () {
|
||||
const pipeline = createPipeline(true);
|
||||
const input = gulp.src(src, srcOpts);
|
||||
const watchInput = watcher(src, srcOpts);
|
||||
var input = gulp.src(src, srcOpts);
|
||||
var watchInput = watcher(src, srcOpts);
|
||||
|
||||
return watchInput
|
||||
.pipe(util.incremental(function () { return pipeline(true); }, input))
|
||||
|
|
|
@ -1,284 +1,288 @@
|
|||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
"use strict";
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
var event_stream_1 = require('event-stream');
|
||||
var File = require('vinyl');
|
||||
var Is = require('is');
|
||||
var util = require('gulp-util');
|
||||
function log(message) {
|
||||
var rest = [];
|
||||
for (var _i = 1; _i < arguments.length; _i++) {
|
||||
rest[_i - 1] = arguments[_i];
|
||||
}
|
||||
util.log.apply(util, [util.colors.cyan('[i18n]'), message].concat(rest));
|
||||
}
|
||||
var LocalizeInfo;
|
||||
(function (LocalizeInfo) {
|
||||
function is(value) {
|
||||
var candidate = value;
|
||||
return Is.defined(candidate) && Is.string(candidate.key) && (Is.undef(candidate.comment) || (Is.array(candidate.comment) && candidate.comment.every(function (element) { return Is.string(element); })));
|
||||
}
|
||||
LocalizeInfo.is = is;
|
||||
})(LocalizeInfo || (LocalizeInfo = {}));
|
||||
var BundledFormat;
|
||||
(function (BundledFormat) {
|
||||
function is(value) {
|
||||
if (Is.undef(value)) {
|
||||
return false;
|
||||
}
|
||||
var candidate = value;
|
||||
var length = Object.keys(value).length;
|
||||
return length === 3 && Is.defined(candidate.keys) && Is.defined(candidate.messages) && Is.defined(candidate.bundles);
|
||||
}
|
||||
BundledFormat.is = is;
|
||||
})(BundledFormat || (BundledFormat = {}));
|
||||
var vscodeLanguages = [
|
||||
'chs',
|
||||
'cht',
|
||||
'jpn',
|
||||
'kor',
|
||||
'deu',
|
||||
'fra',
|
||||
'esn',
|
||||
'rus',
|
||||
'ita'
|
||||
];
|
||||
var iso639_3_to_2 = {
|
||||
'chs': 'zh-cn',
|
||||
'cht': 'zh-tw',
|
||||
'csy': 'cs-cz',
|
||||
'deu': 'de',
|
||||
'enu': 'en',
|
||||
'esn': 'es',
|
||||
'fra': 'fr',
|
||||
'hun': 'hu',
|
||||
'ita': 'it',
|
||||
'jpn': 'ja',
|
||||
'kor': 'ko',
|
||||
'nld': 'nl',
|
||||
'plk': 'pl',
|
||||
'ptb': 'pt-br',
|
||||
'ptg': 'pt',
|
||||
'rus': 'ru',
|
||||
'sve': 'sv-se',
|
||||
'trk': 'tr'
|
||||
};
|
||||
function sortLanguages(directoryNames) {
|
||||
return directoryNames.map(function (dirName) {
|
||||
var lower = dirName.toLowerCase();
|
||||
return {
|
||||
name: lower,
|
||||
iso639_2: iso639_3_to_2[lower]
|
||||
};
|
||||
}).sort(function (a, b) {
|
||||
if (!a.iso639_2 && !b.iso639_2) {
|
||||
return 0;
|
||||
}
|
||||
if (!a.iso639_2) {
|
||||
return -1;
|
||||
}
|
||||
if (!b.iso639_2) {
|
||||
return 1;
|
||||
}
|
||||
return a.iso639_2 < b.iso639_2 ? -1 : (a.iso639_2 > b.iso639_2 ? 1 : 0);
|
||||
});
|
||||
}
|
||||
function stripComments(content) {
|
||||
/**
|
||||
* First capturing group matches double quoted string
|
||||
* Second matches single quotes string
|
||||
* Third matches block comments
|
||||
* Fourth matches line comments
|
||||
*/
|
||||
var regexp = /("(?:[^\\\"]*(?:\\.)?)*")|('(?:[^\\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g;
|
||||
var result = content.replace(regexp, function (match, m1, m2, m3, m4) {
|
||||
// Only one of m1, m2, m3, m4 matches
|
||||
if (m3) {
|
||||
// A block comment. Replace with nothing
|
||||
return '';
|
||||
}
|
||||
else if (m4) {
|
||||
// A line comment. If it ends in \r?\n then keep it.
|
||||
var length_1 = m4.length;
|
||||
if (length_1 > 2 && m4[length_1 - 1] === '\n') {
|
||||
return m4[length_1 - 2] === '\r' ? '\r\n' : '\n';
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
else {
|
||||
// We match a string
|
||||
return match;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
;
|
||||
function escapeCharacters(value) {
|
||||
var result = [];
|
||||
for (var i = 0; i < value.length; i++) {
|
||||
var ch = value.charAt(i);
|
||||
switch (ch) {
|
||||
case '\'':
|
||||
result.push('\\\'');
|
||||
break;
|
||||
case '"':
|
||||
result.push('\\"');
|
||||
break;
|
||||
case '\\':
|
||||
result.push('\\\\');
|
||||
break;
|
||||
case '\n':
|
||||
result.push('\\n');
|
||||
break;
|
||||
case '\r':
|
||||
result.push('\\r');
|
||||
break;
|
||||
case '\t':
|
||||
result.push('\\t');
|
||||
break;
|
||||
case '\b':
|
||||
result.push('\\b');
|
||||
break;
|
||||
case '\f':
|
||||
result.push('\\f');
|
||||
break;
|
||||
default:
|
||||
result.push(ch);
|
||||
}
|
||||
}
|
||||
return result.join('');
|
||||
}
|
||||
function processCoreBundleFormat(fileHeader, json, emitter) {
|
||||
var keysSection = json.keys;
|
||||
var messageSection = json.messages;
|
||||
var bundleSection = json.bundles;
|
||||
var statistics = Object.create(null);
|
||||
var total = 0;
|
||||
var defaultMessages = Object.create(null);
|
||||
var modules = Object.keys(keysSection);
|
||||
modules.forEach(function (module) {
|
||||
var keys = keysSection[module];
|
||||
var messages = messageSection[module];
|
||||
if (!messages || keys.length !== messages.length) {
|
||||
emitter.emit('error', "Message for module " + module + " corrupted. Mismatch in number of keys and messages.");
|
||||
return;
|
||||
}
|
||||
var messageMap = Object.create(null);
|
||||
defaultMessages[module] = messageMap;
|
||||
keys.map(function (key, i) {
|
||||
total++;
|
||||
if (Is.string(key)) {
|
||||
messageMap[key] = messages[i];
|
||||
}
|
||||
else {
|
||||
messageMap[key.key] = messages[i];
|
||||
}
|
||||
});
|
||||
});
|
||||
var languageDirectory = path.join(__dirname, '..', '..', 'i18n');
|
||||
var languages = sortLanguages(fs.readdirSync(languageDirectory).filter(function (item) { return fs.statSync(path.join(languageDirectory, item)).isDirectory(); }));
|
||||
languages.forEach(function (language) {
|
||||
if (!language.iso639_2) {
|
||||
return;
|
||||
}
|
||||
log("Generating nls bundles for: " + language.iso639_2);
|
||||
statistics[language.iso639_2] = 0;
|
||||
var localizedModules = Object.create(null);
|
||||
var cwd = path.join(languageDirectory, language.name, 'src');
|
||||
modules.forEach(function (module) {
|
||||
var order = keysSection[module];
|
||||
var i18nFile = path.join(cwd, module) + '.i18n.json';
|
||||
var messages = null;
|
||||
if (fs.existsSync(i18nFile)) {
|
||||
var content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
|
||||
messages = JSON.parse(content);
|
||||
}
|
||||
else {
|
||||
// log(`No localized messages found for module ${module}. Using default messages.`);
|
||||
messages = defaultMessages[module];
|
||||
statistics[language.iso639_2] = statistics[language.iso639_2] + Object.keys(messages).length;
|
||||
}
|
||||
var localizedMessages = [];
|
||||
order.forEach(function (keyInfo) {
|
||||
var key = null;
|
||||
if (Is.string(keyInfo)) {
|
||||
key = keyInfo;
|
||||
}
|
||||
else {
|
||||
key = keyInfo.key;
|
||||
}
|
||||
var message = messages[key];
|
||||
if (!message) {
|
||||
log("No localized message found for key " + key + " in module " + module + ". Using default message.");
|
||||
message = defaultMessages[module][key];
|
||||
statistics[language.iso639_2] = statistics[language.iso639_2] + 1;
|
||||
}
|
||||
localizedMessages.push(message);
|
||||
});
|
||||
localizedModules[module] = localizedMessages;
|
||||
});
|
||||
Object.keys(bundleSection).forEach(function (bundle) {
|
||||
var modules = bundleSection[bundle];
|
||||
var contents = [
|
||||
fileHeader,
|
||||
("define(\"" + bundle + ".nls." + language.iso639_2 + "\", {")
|
||||
];
|
||||
modules.forEach(function (module, index) {
|
||||
contents.push("\t\"" + module + "\": [");
|
||||
var messages = localizedModules[module];
|
||||
if (!messages) {
|
||||
emitter.emit('error', "Didn't find messages for module " + module + ".");
|
||||
return;
|
||||
}
|
||||
messages.forEach(function (message, index) {
|
||||
contents.push("\t\t\"" + escapeCharacters(message) + (index < messages.length ? '",' : '"'));
|
||||
});
|
||||
contents.push(index < modules.length - 1 ? '\t],' : '\t]');
|
||||
});
|
||||
contents.push('});');
|
||||
emitter.emit('data', new File({ path: bundle + '.nls.' + language.iso639_2 + '.js', contents: new Buffer(contents.join('\n'), 'utf-8') }));
|
||||
});
|
||||
});
|
||||
log("Statistics (total " + total + "):");
|
||||
Object.keys(statistics).forEach(function (key) {
|
||||
var value = statistics[key];
|
||||
log("\t" + value + " untranslated strings for locale " + key + " found.");
|
||||
});
|
||||
vscodeLanguages.forEach(function (language) {
|
||||
var iso639_2 = iso639_3_to_2[language];
|
||||
if (!iso639_2) {
|
||||
log("\tCouldn't find iso639 2 mapping for language " + language + ". Using default language instead.");
|
||||
}
|
||||
else {
|
||||
var stats = statistics[iso639_2];
|
||||
if (Is.undef(stats)) {
|
||||
log("\tNo translations found for language " + language + ". Using default language instead.");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function processNlsFiles(opts) {
|
||||
return event_stream_1.through(function (file) {
|
||||
var fileName = path.basename(file.path);
|
||||
if (fileName === 'nls.metadata.json') {
|
||||
var json = null;
|
||||
if (file.isBuffer()) {
|
||||
json = JSON.parse(file.contents.toString('utf8'));
|
||||
}
|
||||
else {
|
||||
this.emit('error', "Failed to read component file: " + file.relative);
|
||||
}
|
||||
if (BundledFormat.is(json)) {
|
||||
processCoreBundleFormat(opts.fileHeader, json, this);
|
||||
}
|
||||
}
|
||||
this.emit('data', file);
|
||||
});
|
||||
}
|
||||
exports.processNlsFiles = processNlsFiles;
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
"use strict";
|
||||
var path = require('path');
|
||||
var fs = require('fs');
|
||||
var event_stream_1 = require('event-stream');
|
||||
var File = require('vinyl');
|
||||
var Is = require('is');
|
||||
var quiet = !!process.env['VSCODE_BUILD_QUIET'] && false;
|
||||
var util = require('gulp-util');
|
||||
function log(message) {
|
||||
var rest = [];
|
||||
for (var _i = 1; _i < arguments.length; _i++) {
|
||||
rest[_i - 1] = arguments[_i];
|
||||
}
|
||||
if (quiet) {
|
||||
return;
|
||||
}
|
||||
util.log.apply(util, [util.colors.cyan('[i18n]'), message].concat(rest));
|
||||
}
|
||||
var LocalizeInfo;
|
||||
(function (LocalizeInfo) {
|
||||
function is(value) {
|
||||
var candidate = value;
|
||||
return Is.defined(candidate) && Is.string(candidate.key) && (Is.undef(candidate.comment) || (Is.array(candidate.comment) && candidate.comment.every(function (element) { return Is.string(element); })));
|
||||
}
|
||||
LocalizeInfo.is = is;
|
||||
})(LocalizeInfo || (LocalizeInfo = {}));
|
||||
var BundledFormat;
|
||||
(function (BundledFormat) {
|
||||
function is(value) {
|
||||
if (Is.undef(value)) {
|
||||
return false;
|
||||
}
|
||||
var candidate = value;
|
||||
var length = Object.keys(value).length;
|
||||
return length === 3 && Is.defined(candidate.keys) && Is.defined(candidate.messages) && Is.defined(candidate.bundles);
|
||||
}
|
||||
BundledFormat.is = is;
|
||||
})(BundledFormat || (BundledFormat = {}));
|
||||
var vscodeLanguages = [
|
||||
'chs',
|
||||
'cht',
|
||||
'jpn',
|
||||
'kor',
|
||||
'deu',
|
||||
'fra',
|
||||
'esn',
|
||||
'rus',
|
||||
'ita'
|
||||
];
|
||||
var iso639_3_to_2 = {
|
||||
'chs': 'zh-cn',
|
||||
'cht': 'zh-tw',
|
||||
'csy': 'cs-cz',
|
||||
'deu': 'de',
|
||||
'enu': 'en',
|
||||
'esn': 'es',
|
||||
'fra': 'fr',
|
||||
'hun': 'hu',
|
||||
'ita': 'it',
|
||||
'jpn': 'ja',
|
||||
'kor': 'ko',
|
||||
'nld': 'nl',
|
||||
'plk': 'pl',
|
||||
'ptb': 'pt-br',
|
||||
'ptg': 'pt',
|
||||
'rus': 'ru',
|
||||
'sve': 'sv-se',
|
||||
'trk': 'tr'
|
||||
};
|
||||
function sortLanguages(directoryNames) {
|
||||
return directoryNames.map(function (dirName) {
|
||||
var lower = dirName.toLowerCase();
|
||||
return {
|
||||
name: lower,
|
||||
iso639_2: iso639_3_to_2[lower]
|
||||
};
|
||||
}).sort(function (a, b) {
|
||||
if (!a.iso639_2 && !b.iso639_2) {
|
||||
return 0;
|
||||
}
|
||||
if (!a.iso639_2) {
|
||||
return -1;
|
||||
}
|
||||
if (!b.iso639_2) {
|
||||
return 1;
|
||||
}
|
||||
return a.iso639_2 < b.iso639_2 ? -1 : (a.iso639_2 > b.iso639_2 ? 1 : 0);
|
||||
});
|
||||
}
|
||||
function stripComments(content) {
|
||||
/**
|
||||
* First capturing group matches double quoted string
|
||||
* Second matches single quotes string
|
||||
* Third matches block comments
|
||||
* Fourth matches line comments
|
||||
*/
|
||||
var regexp = /("(?:[^\\\"]*(?:\\.)?)*")|('(?:[^\\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g;
|
||||
var result = content.replace(regexp, function (match, m1, m2, m3, m4) {
|
||||
// Only one of m1, m2, m3, m4 matches
|
||||
if (m3) {
|
||||
// A block comment. Replace with nothing
|
||||
return '';
|
||||
}
|
||||
else if (m4) {
|
||||
// A line comment. If it ends in \r?\n then keep it.
|
||||
var length_1 = m4.length;
|
||||
if (length_1 > 2 && m4[length_1 - 1] === '\n') {
|
||||
return m4[length_1 - 2] === '\r' ? '\r\n' : '\n';
|
||||
}
|
||||
else {
|
||||
return '';
|
||||
}
|
||||
}
|
||||
else {
|
||||
// We match a string
|
||||
return match;
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
;
|
||||
function escapeCharacters(value) {
|
||||
var result = [];
|
||||
for (var i = 0; i < value.length; i++) {
|
||||
var ch = value.charAt(i);
|
||||
switch (ch) {
|
||||
case '\'':
|
||||
result.push('\\\'');
|
||||
break;
|
||||
case '"':
|
||||
result.push('\\"');
|
||||
break;
|
||||
case '\\':
|
||||
result.push('\\\\');
|
||||
break;
|
||||
case '\n':
|
||||
result.push('\\n');
|
||||
break;
|
||||
case '\r':
|
||||
result.push('\\r');
|
||||
break;
|
||||
case '\t':
|
||||
result.push('\\t');
|
||||
break;
|
||||
case '\b':
|
||||
result.push('\\b');
|
||||
break;
|
||||
case '\f':
|
||||
result.push('\\f');
|
||||
break;
|
||||
default:
|
||||
result.push(ch);
|
||||
}
|
||||
}
|
||||
return result.join('');
|
||||
}
|
||||
function processCoreBundleFormat(fileHeader, json, emitter) {
|
||||
var keysSection = json.keys;
|
||||
var messageSection = json.messages;
|
||||
var bundleSection = json.bundles;
|
||||
var statistics = Object.create(null);
|
||||
var total = 0;
|
||||
var defaultMessages = Object.create(null);
|
||||
var modules = Object.keys(keysSection);
|
||||
modules.forEach(function (module) {
|
||||
var keys = keysSection[module];
|
||||
var messages = messageSection[module];
|
||||
if (!messages || keys.length !== messages.length) {
|
||||
emitter.emit('error', "Message for module " + module + " corrupted. Mismatch in number of keys and messages.");
|
||||
return;
|
||||
}
|
||||
var messageMap = Object.create(null);
|
||||
defaultMessages[module] = messageMap;
|
||||
keys.map(function (key, i) {
|
||||
total++;
|
||||
if (Is.string(key)) {
|
||||
messageMap[key] = messages[i];
|
||||
}
|
||||
else {
|
||||
messageMap[key.key] = messages[i];
|
||||
}
|
||||
});
|
||||
});
|
||||
var languageDirectory = path.join(__dirname, '..', '..', 'i18n');
|
||||
var languages = sortLanguages(fs.readdirSync(languageDirectory).filter(function (item) { return fs.statSync(path.join(languageDirectory, item)).isDirectory(); }));
|
||||
languages.forEach(function (language) {
|
||||
if (!language.iso639_2) {
|
||||
return;
|
||||
}
|
||||
log("Generating nls bundles for: " + language.iso639_2);
|
||||
statistics[language.iso639_2] = 0;
|
||||
var localizedModules = Object.create(null);
|
||||
var cwd = path.join(languageDirectory, language.name, 'src');
|
||||
modules.forEach(function (module) {
|
||||
var order = keysSection[module];
|
||||
var i18nFile = path.join(cwd, module) + '.i18n.json';
|
||||
var messages = null;
|
||||
if (fs.existsSync(i18nFile)) {
|
||||
var content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
|
||||
messages = JSON.parse(content);
|
||||
}
|
||||
else {
|
||||
// log(`No localized messages found for module ${module}. Using default messages.`);
|
||||
messages = defaultMessages[module];
|
||||
statistics[language.iso639_2] = statistics[language.iso639_2] + Object.keys(messages).length;
|
||||
}
|
||||
var localizedMessages = [];
|
||||
order.forEach(function (keyInfo) {
|
||||
var key = null;
|
||||
if (Is.string(keyInfo)) {
|
||||
key = keyInfo;
|
||||
}
|
||||
else {
|
||||
key = keyInfo.key;
|
||||
}
|
||||
var message = messages[key];
|
||||
if (!message) {
|
||||
log("No localized message found for key " + key + " in module " + module + ". Using default message.");
|
||||
message = defaultMessages[module][key];
|
||||
statistics[language.iso639_2] = statistics[language.iso639_2] + 1;
|
||||
}
|
||||
localizedMessages.push(message);
|
||||
});
|
||||
localizedModules[module] = localizedMessages;
|
||||
});
|
||||
Object.keys(bundleSection).forEach(function (bundle) {
|
||||
var modules = bundleSection[bundle];
|
||||
var contents = [
|
||||
fileHeader,
|
||||
("define(\"" + bundle + ".nls." + language.iso639_2 + "\", {")
|
||||
];
|
||||
modules.forEach(function (module, index) {
|
||||
contents.push("\t\"" + module + "\": [");
|
||||
var messages = localizedModules[module];
|
||||
if (!messages) {
|
||||
emitter.emit('error', "Didn't find messages for module " + module + ".");
|
||||
return;
|
||||
}
|
||||
messages.forEach(function (message, index) {
|
||||
contents.push("\t\t\"" + escapeCharacters(message) + (index < messages.length ? '",' : '"'));
|
||||
});
|
||||
contents.push(index < modules.length - 1 ? '\t],' : '\t]');
|
||||
});
|
||||
contents.push('});');
|
||||
emitter.emit('data', new File({ path: bundle + '.nls.' + language.iso639_2 + '.js', contents: new Buffer(contents.join('\n'), 'utf-8') }));
|
||||
});
|
||||
});
|
||||
log("Statistics (total " + total + "):");
|
||||
Object.keys(statistics).forEach(function (key) {
|
||||
var value = statistics[key];
|
||||
log("\t" + value + " untranslated strings for locale " + key + " found.");
|
||||
});
|
||||
vscodeLanguages.forEach(function (language) {
|
||||
var iso639_2 = iso639_3_to_2[language];
|
||||
if (!iso639_2) {
|
||||
log("\tCouldn't find iso639 2 mapping for language " + language + ". Using default language instead.");
|
||||
}
|
||||
else {
|
||||
var stats = statistics[iso639_2];
|
||||
if (Is.undef(stats)) {
|
||||
log("\tNo translations found for language " + language + ". Using default language instead.");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
function processNlsFiles(opts) {
|
||||
return event_stream_1.through(function (file) {
|
||||
var fileName = path.basename(file.path);
|
||||
if (fileName === 'nls.metadata.json') {
|
||||
var json = null;
|
||||
if (file.isBuffer()) {
|
||||
json = JSON.parse(file.contents.toString('utf8'));
|
||||
}
|
||||
else {
|
||||
this.emit('error', "Failed to read component file: " + file.relative);
|
||||
}
|
||||
if (BundledFormat.is(json)) {
|
||||
processCoreBundleFormat(opts.fileHeader, json, this);
|
||||
}
|
||||
}
|
||||
this.emit('data', file);
|
||||
});
|
||||
}
|
||||
exports.processNlsFiles = processNlsFiles;
|
||||
|
|
|
@ -11,8 +11,13 @@ import { ThroughStream } from 'through';
|
|||
import File = require('vinyl');
|
||||
import * as Is from 'is';
|
||||
|
||||
const quiet = !!process.env['VSCODE_BUILD_QUIET'] && false;
|
||||
|
||||
var util = require('gulp-util');
|
||||
function log(message: any, ...rest: any[]): void {
|
||||
if (quiet) {
|
||||
return;
|
||||
}
|
||||
util.log(util.colors.cyan('[i18n]'), message, ...rest);
|
||||
}
|
||||
|
||||
|
|
700
build/lib/nls.js
700
build/lib/nls.js
|
@ -1,350 +1,350 @@
|
|||
"use strict";
|
||||
var ts = require('./typescript/typescriptServices');
|
||||
var lazy = require('lazy.js');
|
||||
var event_stream_1 = require('event-stream');
|
||||
var File = require('vinyl');
|
||||
var sm = require('source-map');
|
||||
var assign = require('object-assign');
|
||||
var clone = require('clone');
|
||||
var path = require('path');
|
||||
var CollectStepResult;
|
||||
(function (CollectStepResult) {
|
||||
CollectStepResult[CollectStepResult["Yes"] = 0] = "Yes";
|
||||
CollectStepResult[CollectStepResult["YesAndRecurse"] = 1] = "YesAndRecurse";
|
||||
CollectStepResult[CollectStepResult["No"] = 2] = "No";
|
||||
CollectStepResult[CollectStepResult["NoAndRecurse"] = 3] = "NoAndRecurse";
|
||||
})(CollectStepResult || (CollectStepResult = {}));
|
||||
function collect(node, fn) {
|
||||
var result = [];
|
||||
function loop(node) {
|
||||
var stepResult = fn(node);
|
||||
if (stepResult === CollectStepResult.Yes || stepResult === CollectStepResult.YesAndRecurse) {
|
||||
result.push(node);
|
||||
}
|
||||
if (stepResult === CollectStepResult.YesAndRecurse || stepResult === CollectStepResult.NoAndRecurse) {
|
||||
ts.forEachChild(node, loop);
|
||||
}
|
||||
}
|
||||
loop(node);
|
||||
return result;
|
||||
}
|
||||
function template(lines) {
|
||||
var indent = '', wrap = '';
|
||||
if (lines.length > 1) {
|
||||
indent = '\t';
|
||||
wrap = '\n';
|
||||
}
|
||||
return "/*---------------------------------------------------------\n * Copyright (C) Microsoft Corporation. All rights reserved.\n *--------------------------------------------------------*/\ndefine([], [" + (wrap + lines.map(function (l) { return indent + l; }).join(',\n') + wrap) + "]);";
|
||||
}
|
||||
/**
|
||||
* Returns a stream containing the patched JavaScript and source maps.
|
||||
*/
|
||||
function nls() {
|
||||
var input = event_stream_1.through();
|
||||
var output = input.pipe(event_stream_1.through(function (f) {
|
||||
var _this = this;
|
||||
if (!f.sourceMap) {
|
||||
return this.emit('error', new Error("File " + f.relative + " does not have sourcemaps."));
|
||||
}
|
||||
var source = f.sourceMap.sources[0];
|
||||
if (!source) {
|
||||
return this.emit('error', new Error("File " + f.relative + " does not have a source in the source map."));
|
||||
}
|
||||
var root = f.sourceMap.sourceRoot;
|
||||
if (root) {
|
||||
source = path.join(root, source);
|
||||
}
|
||||
var typescript = f.sourceMap.sourcesContent[0];
|
||||
if (!typescript) {
|
||||
return this.emit('error', new Error("File " + f.relative + " does not have the original content in the source map."));
|
||||
}
|
||||
nls.patchFiles(f, typescript).forEach(function (f) { return _this.emit('data', f); });
|
||||
}));
|
||||
return event_stream_1.duplex(input, output);
|
||||
}
|
||||
function isImportNode(node) {
|
||||
return node.kind === 212 /* ImportDeclaration */ || node.kind === 211 /* ImportEqualsDeclaration */;
|
||||
}
|
||||
var nls;
|
||||
(function (nls_1) {
|
||||
function fileFrom(file, contents, path) {
|
||||
if (path === void 0) { path = file.path; }
|
||||
return new File({
|
||||
contents: new Buffer(contents),
|
||||
base: file.base,
|
||||
cwd: file.cwd,
|
||||
path: path
|
||||
});
|
||||
}
|
||||
nls_1.fileFrom = fileFrom;
|
||||
function mappedPositionFrom(source, lc) {
|
||||
return { source: source, line: lc.line + 1, column: lc.character };
|
||||
}
|
||||
nls_1.mappedPositionFrom = mappedPositionFrom;
|
||||
function lcFrom(position) {
|
||||
return { line: position.line - 1, character: position.column };
|
||||
}
|
||||
nls_1.lcFrom = lcFrom;
|
||||
var SingleFileServiceHost = (function () {
|
||||
function SingleFileServiceHost(options, filename, contents) {
|
||||
var _this = this;
|
||||
this.options = options;
|
||||
this.filename = filename;
|
||||
this.getCompilationSettings = function () { return _this.options; };
|
||||
this.getScriptFileNames = function () { return [_this.filename]; };
|
||||
this.getScriptVersion = function () { return '1'; };
|
||||
this.getScriptSnapshot = function (name) { return name === _this.filename ? _this.file : _this.lib; };
|
||||
this.getCurrentDirectory = function () { return ''; };
|
||||
this.getDefaultLibFileName = function () { return 'lib.d.ts'; };
|
||||
this.file = ts.ScriptSnapshot.fromString(contents);
|
||||
this.lib = ts.ScriptSnapshot.fromString('');
|
||||
}
|
||||
return SingleFileServiceHost;
|
||||
}());
|
||||
nls_1.SingleFileServiceHost = SingleFileServiceHost;
|
||||
function isCallExpressionWithinTextSpanCollectStep(textSpan, node) {
|
||||
if (!ts.textSpanContainsTextSpan({ start: node.pos, length: node.end - node.pos }, textSpan)) {
|
||||
return CollectStepResult.No;
|
||||
}
|
||||
return node.kind === 160 /* CallExpression */ ? CollectStepResult.YesAndRecurse : CollectStepResult.NoAndRecurse;
|
||||
}
|
||||
function analyze(contents, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var filename = 'file.ts';
|
||||
var serviceHost = new SingleFileServiceHost(assign(clone(options), { noResolve: true }), filename, contents);
|
||||
var service = ts.createLanguageService(serviceHost);
|
||||
var sourceFile = service.getSourceFile(filename);
|
||||
// all imports
|
||||
var imports = lazy(collect(sourceFile, function (n) { return isImportNode(n) ? CollectStepResult.YesAndRecurse : CollectStepResult.NoAndRecurse; }));
|
||||
// import nls = require('vs/nls');
|
||||
var importEqualsDeclarations = imports
|
||||
.filter(function (n) { return n.kind === 211 /* ImportEqualsDeclaration */; })
|
||||
.map(function (n) { return n; })
|
||||
.filter(function (d) { return d.moduleReference.kind === 222 /* ExternalModuleReference */; })
|
||||
.filter(function (d) { return d.moduleReference.expression.getText() === '\'vs/nls\''; });
|
||||
// import ... from 'vs/nls';
|
||||
var importDeclarations = imports
|
||||
.filter(function (n) { return n.kind === 212 /* ImportDeclaration */; })
|
||||
.map(function (n) { return n; })
|
||||
.filter(function (d) { return d.moduleSpecifier.kind === 8 /* StringLiteral */; })
|
||||
.filter(function (d) { return d.moduleSpecifier.getText() === '\'vs/nls\''; })
|
||||
.filter(function (d) { return !!d.importClause && !!d.importClause.namedBindings; });
|
||||
var nlsExpressions = importEqualsDeclarations
|
||||
.map(function (d) { return d.moduleReference.expression; })
|
||||
.concat(importDeclarations.map(function (d) { return d.moduleSpecifier; }))
|
||||
.map(function (d) { return ({
|
||||
start: ts.getLineAndCharacterOfPosition(sourceFile, d.getStart()),
|
||||
end: ts.getLineAndCharacterOfPosition(sourceFile, d.getEnd())
|
||||
}); });
|
||||
// `nls.localize(...)` calls
|
||||
var nlsLocalizeCallExpressions = importDeclarations
|
||||
.filter(function (d) { return d.importClause.namedBindings.kind === 214 /* NamespaceImport */; })
|
||||
.map(function (d) { return d.importClause.namedBindings.name; })
|
||||
.concat(importEqualsDeclarations.map(function (d) { return d.name; }))
|
||||
.map(function (n) { return service.getReferencesAtPosition(filename, n.pos + 1); })
|
||||
.flatten()
|
||||
.filter(function (r) { return !r.isWriteAccess; })
|
||||
.map(function (r) { return collect(sourceFile, function (n) { return isCallExpressionWithinTextSpanCollectStep(r.textSpan, n); }); })
|
||||
.map(function (a) { return lazy(a).last(); })
|
||||
.filter(function (n) { return !!n; })
|
||||
.map(function (n) { return n; })
|
||||
.filter(function (n) { return n.expression.kind === 158 /* PropertyAccessExpression */ && n.expression.name.getText() === 'localize'; });
|
||||
// `localize` named imports
|
||||
var allLocalizeImportDeclarations = importDeclarations
|
||||
.filter(function (d) { return d.importClause.namedBindings.kind === 215 /* NamedImports */; })
|
||||
.map(function (d) { return d.importClause.namedBindings.elements; })
|
||||
.flatten();
|
||||
// `localize` read-only references
|
||||
var localizeReferences = allLocalizeImportDeclarations
|
||||
.filter(function (d) { return d.name.getText() === 'localize'; })
|
||||
.map(function (n) { return service.getReferencesAtPosition(filename, n.pos + 1); })
|
||||
.flatten()
|
||||
.filter(function (r) { return !r.isWriteAccess; });
|
||||
// custom named `localize` read-only references
|
||||
var namedLocalizeReferences = allLocalizeImportDeclarations
|
||||
.filter(function (d) { return d.propertyName && d.propertyName.getText() === 'localize'; })
|
||||
.map(function (n) { return service.getReferencesAtPosition(filename, n.name.pos + 1); })
|
||||
.flatten()
|
||||
.filter(function (r) { return !r.isWriteAccess; });
|
||||
// find the deepest call expressions AST nodes that contain those references
|
||||
var localizeCallExpressions = localizeReferences
|
||||
.concat(namedLocalizeReferences)
|
||||
.map(function (r) { return collect(sourceFile, function (n) { return isCallExpressionWithinTextSpanCollectStep(r.textSpan, n); }); })
|
||||
.map(function (a) { return lazy(a).last(); })
|
||||
.filter(function (n) { return !!n; })
|
||||
.map(function (n) { return n; });
|
||||
// collect everything
|
||||
var localizeCalls = nlsLocalizeCallExpressions
|
||||
.concat(localizeCallExpressions)
|
||||
.map(function (e) { return e.arguments; })
|
||||
.filter(function (a) { return a.length > 1; })
|
||||
.sort(function (a, b) { return a[0].getStart() - b[0].getStart(); })
|
||||
.map(function (a) { return ({
|
||||
keySpan: { start: ts.getLineAndCharacterOfPosition(sourceFile, a[0].getStart()), end: ts.getLineAndCharacterOfPosition(sourceFile, a[0].getEnd()) },
|
||||
key: a[0].getText(),
|
||||
valueSpan: { start: ts.getLineAndCharacterOfPosition(sourceFile, a[1].getStart()), end: ts.getLineAndCharacterOfPosition(sourceFile, a[1].getEnd()) },
|
||||
value: a[1].getText()
|
||||
}); });
|
||||
return {
|
||||
localizeCalls: localizeCalls.toArray(),
|
||||
nlsExpressions: nlsExpressions.toArray()
|
||||
};
|
||||
}
|
||||
nls_1.analyze = analyze;
|
||||
var TextModel = (function () {
|
||||
function TextModel(contents) {
|
||||
var regex = /\r\n|\r|\n/g;
|
||||
var index = 0;
|
||||
var match;
|
||||
this.lines = [];
|
||||
this.lineEndings = [];
|
||||
while (match = regex.exec(contents)) {
|
||||
this.lines.push(contents.substring(index, match.index));
|
||||
this.lineEndings.push(match[0]);
|
||||
index = regex.lastIndex;
|
||||
}
|
||||
if (contents.length > 0) {
|
||||
this.lines.push(contents.substring(index, contents.length));
|
||||
this.lineEndings.push('');
|
||||
}
|
||||
}
|
||||
TextModel.prototype.get = function (index) {
|
||||
return this.lines[index];
|
||||
};
|
||||
TextModel.prototype.set = function (index, line) {
|
||||
this.lines[index] = line;
|
||||
};
|
||||
Object.defineProperty(TextModel.prototype, "lineCount", {
|
||||
get: function () {
|
||||
return this.lines.length;
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
/**
|
||||
* Applies patch(es) to the model.
|
||||
* Multiple patches must be ordered.
|
||||
* Does not support patches spanning multiple lines.
|
||||
*/
|
||||
TextModel.prototype.apply = function (patch) {
|
||||
var startLineNumber = patch.span.start.line;
|
||||
var endLineNumber = patch.span.end.line;
|
||||
var startLine = this.lines[startLineNumber] || '';
|
||||
var endLine = this.lines[endLineNumber] || '';
|
||||
this.lines[startLineNumber] = [
|
||||
startLine.substring(0, patch.span.start.character),
|
||||
patch.content,
|
||||
endLine.substring(patch.span.end.character)
|
||||
].join('');
|
||||
for (var i = startLineNumber + 1; i <= endLineNumber; i++) {
|
||||
this.lines[i] = '';
|
||||
}
|
||||
};
|
||||
TextModel.prototype.toString = function () {
|
||||
return lazy(this.lines).zip(this.lineEndings)
|
||||
.flatten().toArray().join('');
|
||||
};
|
||||
return TextModel;
|
||||
}());
|
||||
nls_1.TextModel = TextModel;
|
||||
function patchJavascript(patches, contents, moduleId) {
|
||||
var model = new nls.TextModel(contents);
|
||||
// patch the localize calls
|
||||
lazy(patches).reverse().each(function (p) { return model.apply(p); });
|
||||
// patch the 'vs/nls' imports
|
||||
var firstLine = model.get(0);
|
||||
var patchedFirstLine = firstLine.replace(/(['"])vs\/nls\1/g, "$1vs/nls!" + moduleId + "$1");
|
||||
model.set(0, patchedFirstLine);
|
||||
return model.toString();
|
||||
}
|
||||
nls_1.patchJavascript = patchJavascript;
|
||||
function patchSourcemap(patches, rsm, smc) {
|
||||
var smg = new sm.SourceMapGenerator({
|
||||
file: rsm.file,
|
||||
sourceRoot: rsm.sourceRoot
|
||||
});
|
||||
patches = patches.reverse();
|
||||
var currentLine = -1;
|
||||
var currentLineDiff = 0;
|
||||
var source = null;
|
||||
smc.eachMapping(function (m) {
|
||||
var patch = patches[patches.length - 1];
|
||||
var original = { line: m.originalLine, column: m.originalColumn };
|
||||
var generated = { line: m.generatedLine, column: m.generatedColumn };
|
||||
if (currentLine !== generated.line) {
|
||||
currentLineDiff = 0;
|
||||
}
|
||||
currentLine = generated.line;
|
||||
generated.column += currentLineDiff;
|
||||
if (patch && m.generatedLine - 1 === patch.span.end.line && m.generatedColumn === patch.span.end.character) {
|
||||
var originalLength = patch.span.end.character - patch.span.start.character;
|
||||
var modifiedLength = patch.content.length;
|
||||
var lengthDiff = modifiedLength - originalLength;
|
||||
currentLineDiff += lengthDiff;
|
||||
generated.column += lengthDiff;
|
||||
patches.pop();
|
||||
}
|
||||
source = rsm.sourceRoot ? path.relative(rsm.sourceRoot, m.source) : m.source;
|
||||
source = source.replace(/\\/g, '/');
|
||||
smg.addMapping({ source: source, name: m.name, original: original, generated: generated });
|
||||
}, null, sm.SourceMapConsumer.GENERATED_ORDER);
|
||||
if (source) {
|
||||
smg.setSourceContent(source, smc.sourceContentFor(source));
|
||||
}
|
||||
return JSON.parse(smg.toString());
|
||||
}
|
||||
nls_1.patchSourcemap = patchSourcemap;
|
||||
function patch(moduleId, typescript, javascript, sourcemap) {
|
||||
var _a = analyze(typescript), localizeCalls = _a.localizeCalls, nlsExpressions = _a.nlsExpressions;
|
||||
if (localizeCalls.length === 0) {
|
||||
return { javascript: javascript, sourcemap: sourcemap };
|
||||
}
|
||||
var nlsKeys = template(localizeCalls.map(function (lc) { return lc.key; }));
|
||||
var nls = template(localizeCalls.map(function (lc) { return lc.value; }));
|
||||
var smc = new sm.SourceMapConsumer(sourcemap);
|
||||
var positionFrom = mappedPositionFrom.bind(null, sourcemap.sources[0]);
|
||||
var i = 0;
|
||||
// build patches
|
||||
var patches = lazy(localizeCalls)
|
||||
.map(function (lc) { return ([
|
||||
{ range: lc.keySpan, content: '' + (i++) },
|
||||
{ range: lc.valueSpan, content: 'null' }
|
||||
]); })
|
||||
.flatten()
|
||||
.map(function (c) {
|
||||
var start = lcFrom(smc.generatedPositionFor(positionFrom(c.range.start)));
|
||||
var end = lcFrom(smc.generatedPositionFor(positionFrom(c.range.end)));
|
||||
return { span: { start: start, end: end }, content: c.content };
|
||||
})
|
||||
.toArray();
|
||||
javascript = patchJavascript(patches, javascript, moduleId);
|
||||
// since imports are not within the sourcemap information,
|
||||
// we must do this MacGyver style
|
||||
if (nlsExpressions.length) {
|
||||
javascript = javascript.replace(/^define\(.*$/m, function (line) {
|
||||
return line.replace(/(['"])vs\/nls\1/g, "$1vs/nls!" + moduleId + "$1");
|
||||
});
|
||||
}
|
||||
sourcemap = patchSourcemap(patches, sourcemap, smc);
|
||||
return { javascript: javascript, sourcemap: sourcemap, nlsKeys: nlsKeys, nls: nls };
|
||||
}
|
||||
nls_1.patch = patch;
|
||||
function patchFiles(javascriptFile, typescript) {
|
||||
// hack?
|
||||
var moduleId = javascriptFile.relative
|
||||
.replace(/\.js$/, '')
|
||||
.replace(/\\/g, '/');
|
||||
var _a = patch(moduleId, typescript, javascriptFile.contents.toString(), javascriptFile.sourceMap), javascript = _a.javascript, sourcemap = _a.sourcemap, nlsKeys = _a.nlsKeys, nls = _a.nls;
|
||||
var result = [fileFrom(javascriptFile, javascript)];
|
||||
result[0].sourceMap = sourcemap;
|
||||
if (nlsKeys) {
|
||||
result.push(fileFrom(javascriptFile, nlsKeys, javascriptFile.path.replace(/\.js$/, '.nls.keys.js')));
|
||||
}
|
||||
if (nls) {
|
||||
result.push(fileFrom(javascriptFile, nls, javascriptFile.path.replace(/\.js$/, '.nls.js')));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
nls_1.patchFiles = patchFiles;
|
||||
})(nls || (nls = {}));
|
||||
module.exports = nls;
|
||||
"use strict";
|
||||
var ts = require('./typescript/typescriptServices');
|
||||
var lazy = require('lazy.js');
|
||||
var event_stream_1 = require('event-stream');
|
||||
var File = require('vinyl');
|
||||
var sm = require('source-map');
|
||||
var assign = require('object-assign');
|
||||
var clone = require('clone');
|
||||
var path = require('path');
|
||||
var CollectStepResult;
|
||||
(function (CollectStepResult) {
|
||||
CollectStepResult[CollectStepResult["Yes"] = 0] = "Yes";
|
||||
CollectStepResult[CollectStepResult["YesAndRecurse"] = 1] = "YesAndRecurse";
|
||||
CollectStepResult[CollectStepResult["No"] = 2] = "No";
|
||||
CollectStepResult[CollectStepResult["NoAndRecurse"] = 3] = "NoAndRecurse";
|
||||
})(CollectStepResult || (CollectStepResult = {}));
|
||||
function collect(node, fn) {
|
||||
var result = [];
|
||||
function loop(node) {
|
||||
var stepResult = fn(node);
|
||||
if (stepResult === CollectStepResult.Yes || stepResult === CollectStepResult.YesAndRecurse) {
|
||||
result.push(node);
|
||||
}
|
||||
if (stepResult === CollectStepResult.YesAndRecurse || stepResult === CollectStepResult.NoAndRecurse) {
|
||||
ts.forEachChild(node, loop);
|
||||
}
|
||||
}
|
||||
loop(node);
|
||||
return result;
|
||||
}
|
||||
function template(lines) {
|
||||
var indent = '', wrap = '';
|
||||
if (lines.length > 1) {
|
||||
indent = '\t';
|
||||
wrap = '\n';
|
||||
}
|
||||
return "/*---------------------------------------------------------\n * Copyright (C) Microsoft Corporation. All rights reserved.\n *--------------------------------------------------------*/\ndefine([], [" + (wrap + lines.map(function (l) { return indent + l; }).join(',\n') + wrap) + "]);";
|
||||
}
|
||||
/**
|
||||
* Returns a stream containing the patched JavaScript and source maps.
|
||||
*/
|
||||
function nls() {
|
||||
var input = event_stream_1.through();
|
||||
var output = input.pipe(event_stream_1.through(function (f) {
|
||||
var _this = this;
|
||||
if (!f.sourceMap) {
|
||||
return this.emit('error', new Error("File " + f.relative + " does not have sourcemaps."));
|
||||
}
|
||||
var source = f.sourceMap.sources[0];
|
||||
if (!source) {
|
||||
return this.emit('error', new Error("File " + f.relative + " does not have a source in the source map."));
|
||||
}
|
||||
var root = f.sourceMap.sourceRoot;
|
||||
if (root) {
|
||||
source = path.join(root, source);
|
||||
}
|
||||
var typescript = f.sourceMap.sourcesContent[0];
|
||||
if (!typescript) {
|
||||
return this.emit('error', new Error("File " + f.relative + " does not have the original content in the source map."));
|
||||
}
|
||||
nls.patchFiles(f, typescript).forEach(function (f) { return _this.emit('data', f); });
|
||||
}));
|
||||
return event_stream_1.duplex(input, output);
|
||||
}
|
||||
function isImportNode(node) {
|
||||
return node.kind === 212 /* ImportDeclaration */ || node.kind === 211 /* ImportEqualsDeclaration */;
|
||||
}
|
||||
var nls;
|
||||
(function (nls_1) {
|
||||
function fileFrom(file, contents, path) {
|
||||
if (path === void 0) { path = file.path; }
|
||||
return new File({
|
||||
contents: new Buffer(contents),
|
||||
base: file.base,
|
||||
cwd: file.cwd,
|
||||
path: path
|
||||
});
|
||||
}
|
||||
nls_1.fileFrom = fileFrom;
|
||||
function mappedPositionFrom(source, lc) {
|
||||
return { source: source, line: lc.line + 1, column: lc.character };
|
||||
}
|
||||
nls_1.mappedPositionFrom = mappedPositionFrom;
|
||||
function lcFrom(position) {
|
||||
return { line: position.line - 1, character: position.column };
|
||||
}
|
||||
nls_1.lcFrom = lcFrom;
|
||||
var SingleFileServiceHost = (function () {
|
||||
function SingleFileServiceHost(options, filename, contents) {
|
||||
var _this = this;
|
||||
this.options = options;
|
||||
this.filename = filename;
|
||||
this.getCompilationSettings = function () { return _this.options; };
|
||||
this.getScriptFileNames = function () { return [_this.filename]; };
|
||||
this.getScriptVersion = function () { return '1'; };
|
||||
this.getScriptSnapshot = function (name) { return name === _this.filename ? _this.file : _this.lib; };
|
||||
this.getCurrentDirectory = function () { return ''; };
|
||||
this.getDefaultLibFileName = function () { return 'lib.d.ts'; };
|
||||
this.file = ts.ScriptSnapshot.fromString(contents);
|
||||
this.lib = ts.ScriptSnapshot.fromString('');
|
||||
}
|
||||
return SingleFileServiceHost;
|
||||
}());
|
||||
nls_1.SingleFileServiceHost = SingleFileServiceHost;
|
||||
function isCallExpressionWithinTextSpanCollectStep(textSpan, node) {
|
||||
if (!ts.textSpanContainsTextSpan({ start: node.pos, length: node.end - node.pos }, textSpan)) {
|
||||
return CollectStepResult.No;
|
||||
}
|
||||
return node.kind === 160 /* CallExpression */ ? CollectStepResult.YesAndRecurse : CollectStepResult.NoAndRecurse;
|
||||
}
|
||||
function analyze(contents, options) {
|
||||
if (options === void 0) { options = {}; }
|
||||
var filename = 'file.ts';
|
||||
var serviceHost = new SingleFileServiceHost(assign(clone(options), { noResolve: true }), filename, contents);
|
||||
var service = ts.createLanguageService(serviceHost);
|
||||
var sourceFile = service.getSourceFile(filename);
|
||||
// all imports
|
||||
var imports = lazy(collect(sourceFile, function (n) { return isImportNode(n) ? CollectStepResult.YesAndRecurse : CollectStepResult.NoAndRecurse; }));
|
||||
// import nls = require('vs/nls');
|
||||
var importEqualsDeclarations = imports
|
||||
.filter(function (n) { return n.kind === 211 /* ImportEqualsDeclaration */; })
|
||||
.map(function (n) { return n; })
|
||||
.filter(function (d) { return d.moduleReference.kind === 222 /* ExternalModuleReference */; })
|
||||
.filter(function (d) { return d.moduleReference.expression.getText() === '\'vs/nls\''; });
|
||||
// import ... from 'vs/nls';
|
||||
var importDeclarations = imports
|
||||
.filter(function (n) { return n.kind === 212 /* ImportDeclaration */; })
|
||||
.map(function (n) { return n; })
|
||||
.filter(function (d) { return d.moduleSpecifier.kind === 8 /* StringLiteral */; })
|
||||
.filter(function (d) { return d.moduleSpecifier.getText() === '\'vs/nls\''; })
|
||||
.filter(function (d) { return !!d.importClause && !!d.importClause.namedBindings; });
|
||||
var nlsExpressions = importEqualsDeclarations
|
||||
.map(function (d) { return d.moduleReference.expression; })
|
||||
.concat(importDeclarations.map(function (d) { return d.moduleSpecifier; }))
|
||||
.map(function (d) { return ({
|
||||
start: ts.getLineAndCharacterOfPosition(sourceFile, d.getStart()),
|
||||
end: ts.getLineAndCharacterOfPosition(sourceFile, d.getEnd())
|
||||
}); });
|
||||
// `nls.localize(...)` calls
|
||||
var nlsLocalizeCallExpressions = importDeclarations
|
||||
.filter(function (d) { return d.importClause.namedBindings.kind === 214 /* NamespaceImport */; })
|
||||
.map(function (d) { return d.importClause.namedBindings.name; })
|
||||
.concat(importEqualsDeclarations.map(function (d) { return d.name; }))
|
||||
.map(function (n) { return service.getReferencesAtPosition(filename, n.pos + 1); })
|
||||
.flatten()
|
||||
.filter(function (r) { return !r.isWriteAccess; })
|
||||
.map(function (r) { return collect(sourceFile, function (n) { return isCallExpressionWithinTextSpanCollectStep(r.textSpan, n); }); })
|
||||
.map(function (a) { return lazy(a).last(); })
|
||||
.filter(function (n) { return !!n; })
|
||||
.map(function (n) { return n; })
|
||||
.filter(function (n) { return n.expression.kind === 158 /* PropertyAccessExpression */ && n.expression.name.getText() === 'localize'; });
|
||||
// `localize` named imports
|
||||
var allLocalizeImportDeclarations = importDeclarations
|
||||
.filter(function (d) { return d.importClause.namedBindings.kind === 215 /* NamedImports */; })
|
||||
.map(function (d) { return d.importClause.namedBindings.elements; })
|
||||
.flatten();
|
||||
// `localize` read-only references
|
||||
var localizeReferences = allLocalizeImportDeclarations
|
||||
.filter(function (d) { return d.name.getText() === 'localize'; })
|
||||
.map(function (n) { return service.getReferencesAtPosition(filename, n.pos + 1); })
|
||||
.flatten()
|
||||
.filter(function (r) { return !r.isWriteAccess; });
|
||||
// custom named `localize` read-only references
|
||||
var namedLocalizeReferences = allLocalizeImportDeclarations
|
||||
.filter(function (d) { return d.propertyName && d.propertyName.getText() === 'localize'; })
|
||||
.map(function (n) { return service.getReferencesAtPosition(filename, n.name.pos + 1); })
|
||||
.flatten()
|
||||
.filter(function (r) { return !r.isWriteAccess; });
|
||||
// find the deepest call expressions AST nodes that contain those references
|
||||
var localizeCallExpressions = localizeReferences
|
||||
.concat(namedLocalizeReferences)
|
||||
.map(function (r) { return collect(sourceFile, function (n) { return isCallExpressionWithinTextSpanCollectStep(r.textSpan, n); }); })
|
||||
.map(function (a) { return lazy(a).last(); })
|
||||
.filter(function (n) { return !!n; })
|
||||
.map(function (n) { return n; });
|
||||
// collect everything
|
||||
var localizeCalls = nlsLocalizeCallExpressions
|
||||
.concat(localizeCallExpressions)
|
||||
.map(function (e) { return e.arguments; })
|
||||
.filter(function (a) { return a.length > 1; })
|
||||
.sort(function (a, b) { return a[0].getStart() - b[0].getStart(); })
|
||||
.map(function (a) { return ({
|
||||
keySpan: { start: ts.getLineAndCharacterOfPosition(sourceFile, a[0].getStart()), end: ts.getLineAndCharacterOfPosition(sourceFile, a[0].getEnd()) },
|
||||
key: a[0].getText(),
|
||||
valueSpan: { start: ts.getLineAndCharacterOfPosition(sourceFile, a[1].getStart()), end: ts.getLineAndCharacterOfPosition(sourceFile, a[1].getEnd()) },
|
||||
value: a[1].getText()
|
||||
}); });
|
||||
return {
|
||||
localizeCalls: localizeCalls.toArray(),
|
||||
nlsExpressions: nlsExpressions.toArray()
|
||||
};
|
||||
}
|
||||
nls_1.analyze = analyze;
|
||||
var TextModel = (function () {
|
||||
function TextModel(contents) {
|
||||
var regex = /\r\n|\r|\n/g;
|
||||
var index = 0;
|
||||
var match;
|
||||
this.lines = [];
|
||||
this.lineEndings = [];
|
||||
while (match = regex.exec(contents)) {
|
||||
this.lines.push(contents.substring(index, match.index));
|
||||
this.lineEndings.push(match[0]);
|
||||
index = regex.lastIndex;
|
||||
}
|
||||
if (contents.length > 0) {
|
||||
this.lines.push(contents.substring(index, contents.length));
|
||||
this.lineEndings.push('');
|
||||
}
|
||||
}
|
||||
TextModel.prototype.get = function (index) {
|
||||
return this.lines[index];
|
||||
};
|
||||
TextModel.prototype.set = function (index, line) {
|
||||
this.lines[index] = line;
|
||||
};
|
||||
Object.defineProperty(TextModel.prototype, "lineCount", {
|
||||
get: function () {
|
||||
return this.lines.length;
|
||||
},
|
||||
enumerable: true,
|
||||
configurable: true
|
||||
});
|
||||
/**
|
||||
* Applies patch(es) to the model.
|
||||
* Multiple patches must be ordered.
|
||||
* Does not support patches spanning multiple lines.
|
||||
*/
|
||||
TextModel.prototype.apply = function (patch) {
|
||||
var startLineNumber = patch.span.start.line;
|
||||
var endLineNumber = patch.span.end.line;
|
||||
var startLine = this.lines[startLineNumber] || '';
|
||||
var endLine = this.lines[endLineNumber] || '';
|
||||
this.lines[startLineNumber] = [
|
||||
startLine.substring(0, patch.span.start.character),
|
||||
patch.content,
|
||||
endLine.substring(patch.span.end.character)
|
||||
].join('');
|
||||
for (var i = startLineNumber + 1; i <= endLineNumber; i++) {
|
||||
this.lines[i] = '';
|
||||
}
|
||||
};
|
||||
TextModel.prototype.toString = function () {
|
||||
return lazy(this.lines).zip(this.lineEndings)
|
||||
.flatten().toArray().join('');
|
||||
};
|
||||
return TextModel;
|
||||
}());
|
||||
nls_1.TextModel = TextModel;
|
||||
function patchJavascript(patches, contents, moduleId) {
|
||||
var model = new nls.TextModel(contents);
|
||||
// patch the localize calls
|
||||
lazy(patches).reverse().each(function (p) { return model.apply(p); });
|
||||
// patch the 'vs/nls' imports
|
||||
var firstLine = model.get(0);
|
||||
var patchedFirstLine = firstLine.replace(/(['"])vs\/nls\1/g, "$1vs/nls!" + moduleId + "$1");
|
||||
model.set(0, patchedFirstLine);
|
||||
return model.toString();
|
||||
}
|
||||
nls_1.patchJavascript = patchJavascript;
|
||||
function patchSourcemap(patches, rsm, smc) {
|
||||
var smg = new sm.SourceMapGenerator({
|
||||
file: rsm.file,
|
||||
sourceRoot: rsm.sourceRoot
|
||||
});
|
||||
patches = patches.reverse();
|
||||
var currentLine = -1;
|
||||
var currentLineDiff = 0;
|
||||
var source = null;
|
||||
smc.eachMapping(function (m) {
|
||||
var patch = patches[patches.length - 1];
|
||||
var original = { line: m.originalLine, column: m.originalColumn };
|
||||
var generated = { line: m.generatedLine, column: m.generatedColumn };
|
||||
if (currentLine !== generated.line) {
|
||||
currentLineDiff = 0;
|
||||
}
|
||||
currentLine = generated.line;
|
||||
generated.column += currentLineDiff;
|
||||
if (patch && m.generatedLine - 1 === patch.span.end.line && m.generatedColumn === patch.span.end.character) {
|
||||
var originalLength = patch.span.end.character - patch.span.start.character;
|
||||
var modifiedLength = patch.content.length;
|
||||
var lengthDiff = modifiedLength - originalLength;
|
||||
currentLineDiff += lengthDiff;
|
||||
generated.column += lengthDiff;
|
||||
patches.pop();
|
||||
}
|
||||
source = rsm.sourceRoot ? path.relative(rsm.sourceRoot, m.source) : m.source;
|
||||
source = source.replace(/\\/g, '/');
|
||||
smg.addMapping({ source: source, name: m.name, original: original, generated: generated });
|
||||
}, null, sm.SourceMapConsumer.GENERATED_ORDER);
|
||||
if (source) {
|
||||
smg.setSourceContent(source, smc.sourceContentFor(source));
|
||||
}
|
||||
return JSON.parse(smg.toString());
|
||||
}
|
||||
nls_1.patchSourcemap = patchSourcemap;
|
||||
function patch(moduleId, typescript, javascript, sourcemap) {
|
||||
var _a = analyze(typescript), localizeCalls = _a.localizeCalls, nlsExpressions = _a.nlsExpressions;
|
||||
if (localizeCalls.length === 0) {
|
||||
return { javascript: javascript, sourcemap: sourcemap };
|
||||
}
|
||||
var nlsKeys = template(localizeCalls.map(function (lc) { return lc.key; }));
|
||||
var nls = template(localizeCalls.map(function (lc) { return lc.value; }));
|
||||
var smc = new sm.SourceMapConsumer(sourcemap);
|
||||
var positionFrom = mappedPositionFrom.bind(null, sourcemap.sources[0]);
|
||||
var i = 0;
|
||||
// build patches
|
||||
var patches = lazy(localizeCalls)
|
||||
.map(function (lc) { return ([
|
||||
{ range: lc.keySpan, content: '' + (i++) },
|
||||
{ range: lc.valueSpan, content: 'null' }
|
||||
]); })
|
||||
.flatten()
|
||||
.map(function (c) {
|
||||
var start = lcFrom(smc.generatedPositionFor(positionFrom(c.range.start)));
|
||||
var end = lcFrom(smc.generatedPositionFor(positionFrom(c.range.end)));
|
||||
return { span: { start: start, end: end }, content: c.content };
|
||||
})
|
||||
.toArray();
|
||||
javascript = patchJavascript(patches, javascript, moduleId);
|
||||
// since imports are not within the sourcemap information,
|
||||
// we must do this MacGyver style
|
||||
if (nlsExpressions.length) {
|
||||
javascript = javascript.replace(/^define\(.*$/m, function (line) {
|
||||
return line.replace(/(['"])vs\/nls\1/g, "$1vs/nls!" + moduleId + "$1");
|
||||
});
|
||||
}
|
||||
sourcemap = patchSourcemap(patches, sourcemap, smc);
|
||||
return { javascript: javascript, sourcemap: sourcemap, nlsKeys: nlsKeys, nls: nls };
|
||||
}
|
||||
nls_1.patch = patch;
|
||||
function patchFiles(javascriptFile, typescript) {
|
||||
// hack?
|
||||
var moduleId = javascriptFile.relative
|
||||
.replace(/\.js$/, '')
|
||||
.replace(/\\/g, '/');
|
||||
var _a = patch(moduleId, typescript, javascriptFile.contents.toString(), javascriptFile.sourceMap), javascript = _a.javascript, sourcemap = _a.sourcemap, nlsKeys = _a.nlsKeys, nls = _a.nls;
|
||||
var result = [fileFrom(javascriptFile, javascript)];
|
||||
result[0].sourceMap = sourcemap;
|
||||
if (nlsKeys) {
|
||||
result.push(fileFrom(javascriptFile, nlsKeys, javascriptFile.path.replace(/\.js$/, '.nls.keys.js')));
|
||||
}
|
||||
if (nls) {
|
||||
result.push(fileFrom(javascriptFile, nls, javascriptFile.path.replace(/\.js$/, '.nls.js')));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
nls_1.patchFiles = patchFiles;
|
||||
})(nls || (nls = {}));
|
||||
module.exports = nls;
|
||||
|
|
|
@ -3,23 +3,18 @@
|
|||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
var es = require('event-stream');
|
||||
var _ = require('underscore');
|
||||
|
||||
const es = require('event-stream');
|
||||
const _ = require('underscore');
|
||||
const util = require('gulp-util');
|
||||
|
||||
const allErrors = [];
|
||||
let startTime = null;
|
||||
let count = 0;
|
||||
var allErrors = [];
|
||||
var count = 0;
|
||||
|
||||
function onStart() {
|
||||
if (count++ > 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
startTime = new Date().getTime();
|
||||
util.log(util.colors.green('Starting compilation'));
|
||||
console.log('*** Starting...');
|
||||
}
|
||||
|
||||
function onEnd() {
|
||||
|
@ -28,9 +23,8 @@ function onEnd() {
|
|||
}
|
||||
|
||||
var errors = _.flatten(allErrors);
|
||||
errors.map(err => util.log(`${ util.colors.red('Error') }: ${ err }`));
|
||||
|
||||
util.log(`${ util.colors.green('Finished compilation') } with ${ util.colors.red(errors.length + ' errors') } in ${ util.colors.blue((new Date().getTime() - startTime) + 'ms') }.`);
|
||||
errors.map(function (err) { console.error('*** Error:', err); });
|
||||
console.log('*** Finished with', errors.length, 'errors.');
|
||||
}
|
||||
|
||||
module.exports = function () {
|
||||
|
|
|
@ -1,168 +1,168 @@
|
|||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
"use strict";
|
||||
var __extends = (this && this.__extends) || function (d, b) {
|
||||
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
|
||||
function __() { this.constructor = d; }
|
||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||||
};
|
||||
var ts = require('typescript');
|
||||
var Lint = require('tslint/lib/lint');
|
||||
/**
|
||||
* Implementation of the no-unexternalized-strings rule.
|
||||
*/
|
||||
var Rule = (function (_super) {
|
||||
__extends(Rule, _super);
|
||||
function Rule() {
|
||||
_super.apply(this, arguments);
|
||||
}
|
||||
Rule.prototype.apply = function (sourceFile) {
|
||||
return this.applyWithWalker(new NoUnexternalizedStringsRuleWalker(sourceFile, this.getOptions()));
|
||||
};
|
||||
return Rule;
|
||||
}(Lint.Rules.AbstractRule));
|
||||
exports.Rule = Rule;
|
||||
function isStringLiteral(node) {
|
||||
return node && node.kind === ts.SyntaxKind.StringLiteral;
|
||||
}
|
||||
function isObjectLiteral(node) {
|
||||
return node && node.kind === ts.SyntaxKind.ObjectLiteralExpression;
|
||||
}
|
||||
function isPropertyAssignment(node) {
|
||||
return node && node.kind === ts.SyntaxKind.PropertyAssignment;
|
||||
}
|
||||
var NoUnexternalizedStringsRuleWalker = (function (_super) {
|
||||
__extends(NoUnexternalizedStringsRuleWalker, _super);
|
||||
function NoUnexternalizedStringsRuleWalker(file, opts) {
|
||||
var _this = this;
|
||||
_super.call(this, file, opts);
|
||||
this.signatures = Object.create(null);
|
||||
this.ignores = Object.create(null);
|
||||
this.messageIndex = undefined;
|
||||
this.keyIndex = undefined;
|
||||
this.usedKeys = Object.create(null);
|
||||
var options = this.getOptions();
|
||||
var first = options && options.length > 0 ? options[0] : null;
|
||||
if (first) {
|
||||
if (Array.isArray(first.signatures)) {
|
||||
first.signatures.forEach(function (signature) { return _this.signatures[signature] = true; });
|
||||
}
|
||||
if (Array.isArray(first.ignores)) {
|
||||
first.ignores.forEach(function (ignore) { return _this.ignores[ignore] = true; });
|
||||
}
|
||||
if (typeof first.messageIndex !== 'undefined') {
|
||||
this.messageIndex = first.messageIndex;
|
||||
}
|
||||
if (typeof first.keyIndex !== 'undefined') {
|
||||
this.keyIndex = first.keyIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
NoUnexternalizedStringsRuleWalker.prototype.visitSourceFile = function (node) {
|
||||
var _this = this;
|
||||
_super.prototype.visitSourceFile.call(this, node);
|
||||
Object.keys(this.usedKeys).forEach(function (key) {
|
||||
var occurences = _this.usedKeys[key];
|
||||
if (occurences.length > 1) {
|
||||
occurences.forEach(function (occurence) {
|
||||
_this.addFailure((_this.createFailure(occurence.key.getStart(), occurence.key.getWidth(), "Duplicate key " + occurence.key.getText() + " with different message value.")));
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.prototype.visitStringLiteral = function (node) {
|
||||
this.checkStringLiteral(node);
|
||||
_super.prototype.visitStringLiteral.call(this, node);
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.prototype.checkStringLiteral = function (node) {
|
||||
var text = node.getText();
|
||||
var doubleQuoted = text.length >= 2 && text[0] === NoUnexternalizedStringsRuleWalker.DOUBLE_QUOTE && text[text.length - 1] === NoUnexternalizedStringsRuleWalker.DOUBLE_QUOTE;
|
||||
var info = this.findDescribingParent(node);
|
||||
// Ignore strings in import and export nodes.
|
||||
if (info && info.ignoreUsage) {
|
||||
return;
|
||||
}
|
||||
var callInfo = info ? info.callInfo : null;
|
||||
var functionName = callInfo ? callInfo.callExpression.expression.getText() : null;
|
||||
if (functionName && this.ignores[functionName]) {
|
||||
return;
|
||||
}
|
||||
if (doubleQuoted && (!callInfo || callInfo.argIndex === -1 || !this.signatures[functionName])) {
|
||||
this.addFailure(this.createFailure(node.getStart(), node.getWidth(), "Unexternalized string found: " + node.getText()));
|
||||
return;
|
||||
}
|
||||
// We have a single quoted string outside a localize function name.
|
||||
if (!doubleQuoted && !this.signatures[functionName]) {
|
||||
return;
|
||||
}
|
||||
// We have a string that is a direct argument into the localize call.
|
||||
var keyArg = callInfo.argIndex === this.keyIndex
|
||||
? callInfo.callExpression.arguments[this.keyIndex]
|
||||
: null;
|
||||
if (keyArg) {
|
||||
if (isStringLiteral(keyArg)) {
|
||||
this.recordKey(keyArg, this.messageIndex ? callInfo.callExpression.arguments[this.messageIndex] : undefined);
|
||||
}
|
||||
else if (isObjectLiteral(keyArg)) {
|
||||
for (var i = 0; i < keyArg.properties.length; i++) {
|
||||
var property = keyArg.properties[i];
|
||||
if (isPropertyAssignment(property)) {
|
||||
var name_1 = property.name.getText();
|
||||
if (name_1 === 'key') {
|
||||
var initializer = property.initializer;
|
||||
if (isStringLiteral(initializer)) {
|
||||
this.recordKey(initializer, this.messageIndex ? callInfo.callExpression.arguments[this.messageIndex] : undefined);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var messageArg = callInfo.argIndex === this.messageIndex
|
||||
? callInfo.callExpression.arguments[this.messageIndex]
|
||||
: null;
|
||||
if (messageArg && messageArg !== node) {
|
||||
this.addFailure(this.createFailure(messageArg.getStart(), messageArg.getWidth(), "Message argument to '" + callInfo.callExpression.expression.getText() + "' must be a string literal."));
|
||||
return;
|
||||
}
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.prototype.recordKey = function (keyNode, messageNode) {
|
||||
var text = keyNode.getText();
|
||||
var occurences = this.usedKeys[text];
|
||||
if (!occurences) {
|
||||
occurences = [];
|
||||
this.usedKeys[text] = occurences;
|
||||
}
|
||||
if (messageNode) {
|
||||
if (occurences.some(function (pair) { return pair.message ? pair.message.getText() === messageNode.getText() : false; })) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
occurences.push({ key: keyNode, message: messageNode });
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.prototype.findDescribingParent = function (node) {
|
||||
var parent;
|
||||
while ((parent = node.parent)) {
|
||||
var kind = parent.kind;
|
||||
if (kind === ts.SyntaxKind.CallExpression) {
|
||||
var callExpression = parent;
|
||||
return { callInfo: { callExpression: callExpression, argIndex: callExpression.arguments.indexOf(node) } };
|
||||
}
|
||||
else if (kind === ts.SyntaxKind.ImportEqualsDeclaration || kind === ts.SyntaxKind.ImportDeclaration || kind === ts.SyntaxKind.ExportDeclaration) {
|
||||
return { ignoreUsage: true };
|
||||
}
|
||||
else if (kind === ts.SyntaxKind.VariableDeclaration || kind === ts.SyntaxKind.FunctionDeclaration || kind === ts.SyntaxKind.PropertyDeclaration
|
||||
|| kind === ts.SyntaxKind.MethodDeclaration || kind === ts.SyntaxKind.VariableDeclarationList || kind === ts.SyntaxKind.InterfaceDeclaration
|
||||
|| kind === ts.SyntaxKind.ClassDeclaration || kind === ts.SyntaxKind.EnumDeclaration || kind === ts.SyntaxKind.ModuleDeclaration
|
||||
|| kind === ts.SyntaxKind.TypeAliasDeclaration || kind === ts.SyntaxKind.SourceFile) {
|
||||
return null;
|
||||
}
|
||||
node = parent;
|
||||
}
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.DOUBLE_QUOTE = '"';
|
||||
return NoUnexternalizedStringsRuleWalker;
|
||||
}(Lint.RuleWalker));
|
||||
/*---------------------------------------------------------------------------------------------
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
"use strict";
|
||||
var __extends = (this && this.__extends) || function (d, b) {
|
||||
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
|
||||
function __() { this.constructor = d; }
|
||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
||||
};
|
||||
var ts = require('typescript');
|
||||
var Lint = require('tslint/lib/lint');
|
||||
/**
|
||||
* Implementation of the no-unexternalized-strings rule.
|
||||
*/
|
||||
var Rule = (function (_super) {
|
||||
__extends(Rule, _super);
|
||||
function Rule() {
|
||||
_super.apply(this, arguments);
|
||||
}
|
||||
Rule.prototype.apply = function (sourceFile) {
|
||||
return this.applyWithWalker(new NoUnexternalizedStringsRuleWalker(sourceFile, this.getOptions()));
|
||||
};
|
||||
return Rule;
|
||||
}(Lint.Rules.AbstractRule));
|
||||
exports.Rule = Rule;
|
||||
function isStringLiteral(node) {
|
||||
return node && node.kind === ts.SyntaxKind.StringLiteral;
|
||||
}
|
||||
function isObjectLiteral(node) {
|
||||
return node && node.kind === ts.SyntaxKind.ObjectLiteralExpression;
|
||||
}
|
||||
function isPropertyAssignment(node) {
|
||||
return node && node.kind === ts.SyntaxKind.PropertyAssignment;
|
||||
}
|
||||
var NoUnexternalizedStringsRuleWalker = (function (_super) {
|
||||
__extends(NoUnexternalizedStringsRuleWalker, _super);
|
||||
function NoUnexternalizedStringsRuleWalker(file, opts) {
|
||||
var _this = this;
|
||||
_super.call(this, file, opts);
|
||||
this.signatures = Object.create(null);
|
||||
this.ignores = Object.create(null);
|
||||
this.messageIndex = undefined;
|
||||
this.keyIndex = undefined;
|
||||
this.usedKeys = Object.create(null);
|
||||
var options = this.getOptions();
|
||||
var first = options && options.length > 0 ? options[0] : null;
|
||||
if (first) {
|
||||
if (Array.isArray(first.signatures)) {
|
||||
first.signatures.forEach(function (signature) { return _this.signatures[signature] = true; });
|
||||
}
|
||||
if (Array.isArray(first.ignores)) {
|
||||
first.ignores.forEach(function (ignore) { return _this.ignores[ignore] = true; });
|
||||
}
|
||||
if (typeof first.messageIndex !== 'undefined') {
|
||||
this.messageIndex = first.messageIndex;
|
||||
}
|
||||
if (typeof first.keyIndex !== 'undefined') {
|
||||
this.keyIndex = first.keyIndex;
|
||||
}
|
||||
}
|
||||
}
|
||||
NoUnexternalizedStringsRuleWalker.prototype.visitSourceFile = function (node) {
|
||||
var _this = this;
|
||||
_super.prototype.visitSourceFile.call(this, node);
|
||||
Object.keys(this.usedKeys).forEach(function (key) {
|
||||
var occurences = _this.usedKeys[key];
|
||||
if (occurences.length > 1) {
|
||||
occurences.forEach(function (occurence) {
|
||||
_this.addFailure((_this.createFailure(occurence.key.getStart(), occurence.key.getWidth(), "Duplicate key " + occurence.key.getText() + " with different message value.")));
|
||||
});
|
||||
}
|
||||
});
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.prototype.visitStringLiteral = function (node) {
|
||||
this.checkStringLiteral(node);
|
||||
_super.prototype.visitStringLiteral.call(this, node);
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.prototype.checkStringLiteral = function (node) {
|
||||
var text = node.getText();
|
||||
var doubleQuoted = text.length >= 2 && text[0] === NoUnexternalizedStringsRuleWalker.DOUBLE_QUOTE && text[text.length - 1] === NoUnexternalizedStringsRuleWalker.DOUBLE_QUOTE;
|
||||
var info = this.findDescribingParent(node);
|
||||
// Ignore strings in import and export nodes.
|
||||
if (info && info.ignoreUsage) {
|
||||
return;
|
||||
}
|
||||
var callInfo = info ? info.callInfo : null;
|
||||
var functionName = callInfo ? callInfo.callExpression.expression.getText() : null;
|
||||
if (functionName && this.ignores[functionName]) {
|
||||
return;
|
||||
}
|
||||
if (doubleQuoted && (!callInfo || callInfo.argIndex === -1 || !this.signatures[functionName])) {
|
||||
this.addFailure(this.createFailure(node.getStart(), node.getWidth(), "Unexternalized string found: " + node.getText()));
|
||||
return;
|
||||
}
|
||||
// We have a single quoted string outside a localize function name.
|
||||
if (!doubleQuoted && !this.signatures[functionName]) {
|
||||
return;
|
||||
}
|
||||
// We have a string that is a direct argument into the localize call.
|
||||
var keyArg = callInfo.argIndex === this.keyIndex
|
||||
? callInfo.callExpression.arguments[this.keyIndex]
|
||||
: null;
|
||||
if (keyArg) {
|
||||
if (isStringLiteral(keyArg)) {
|
||||
this.recordKey(keyArg, this.messageIndex ? callInfo.callExpression.arguments[this.messageIndex] : undefined);
|
||||
}
|
||||
else if (isObjectLiteral(keyArg)) {
|
||||
for (var i = 0; i < keyArg.properties.length; i++) {
|
||||
var property = keyArg.properties[i];
|
||||
if (isPropertyAssignment(property)) {
|
||||
var name_1 = property.name.getText();
|
||||
if (name_1 === 'key') {
|
||||
var initializer = property.initializer;
|
||||
if (isStringLiteral(initializer)) {
|
||||
this.recordKey(initializer, this.messageIndex ? callInfo.callExpression.arguments[this.messageIndex] : undefined);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
var messageArg = callInfo.argIndex === this.messageIndex
|
||||
? callInfo.callExpression.arguments[this.messageIndex]
|
||||
: null;
|
||||
if (messageArg && messageArg !== node) {
|
||||
this.addFailure(this.createFailure(messageArg.getStart(), messageArg.getWidth(), "Message argument to '" + callInfo.callExpression.expression.getText() + "' must be a string literal."));
|
||||
return;
|
||||
}
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.prototype.recordKey = function (keyNode, messageNode) {
|
||||
var text = keyNode.getText();
|
||||
var occurences = this.usedKeys[text];
|
||||
if (!occurences) {
|
||||
occurences = [];
|
||||
this.usedKeys[text] = occurences;
|
||||
}
|
||||
if (messageNode) {
|
||||
if (occurences.some(function (pair) { return pair.message ? pair.message.getText() === messageNode.getText() : false; })) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
occurences.push({ key: keyNode, message: messageNode });
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.prototype.findDescribingParent = function (node) {
|
||||
var parent;
|
||||
while ((parent = node.parent)) {
|
||||
var kind = parent.kind;
|
||||
if (kind === ts.SyntaxKind.CallExpression) {
|
||||
var callExpression = parent;
|
||||
return { callInfo: { callExpression: callExpression, argIndex: callExpression.arguments.indexOf(node) } };
|
||||
}
|
||||
else if (kind === ts.SyntaxKind.ImportEqualsDeclaration || kind === ts.SyntaxKind.ImportDeclaration || kind === ts.SyntaxKind.ExportDeclaration) {
|
||||
return { ignoreUsage: true };
|
||||
}
|
||||
else if (kind === ts.SyntaxKind.VariableDeclaration || kind === ts.SyntaxKind.FunctionDeclaration || kind === ts.SyntaxKind.PropertyDeclaration
|
||||
|| kind === ts.SyntaxKind.MethodDeclaration || kind === ts.SyntaxKind.VariableDeclarationList || kind === ts.SyntaxKind.InterfaceDeclaration
|
||||
|| kind === ts.SyntaxKind.ClassDeclaration || kind === ts.SyntaxKind.EnumDeclaration || kind === ts.SyntaxKind.ModuleDeclaration
|
||||
|| kind === ts.SyntaxKind.TypeAliasDeclaration || kind === ts.SyntaxKind.SourceFile) {
|
||||
return null;
|
||||
}
|
||||
node = parent;
|
||||
}
|
||||
};
|
||||
NoUnexternalizedStringsRuleWalker.DOUBLE_QUOTE = '"';
|
||||
return NoUnexternalizedStringsRuleWalker;
|
||||
}(Lint.RuleWalker));
|
||||
|
|
|
@ -274,17 +274,4 @@ exports.rebase = function (count) {
|
|||
var parts = f.dirname.split(/[\/\\]/);
|
||||
f.dirname = parts.slice(count).join(path.sep);
|
||||
});
|
||||
};
|
||||
|
||||
exports.filter = fn => {
|
||||
const result = es.through(function(data) {
|
||||
if (fn(data)) {
|
||||
this.emit('data', data);
|
||||
} else {
|
||||
result.restore.push(data);
|
||||
}
|
||||
});
|
||||
|
||||
result.restore = es.through();
|
||||
return result;
|
||||
};
|
|
@ -202,7 +202,7 @@ function format(text) {
|
|||
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: false,
|
||||
InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: true,
|
||||
PlaceOpenBraceOnNewLineForFunctions: false,
|
||||
PlaceOpenBraceOnNewLineForControlBlocks: false,
|
||||
PlaceOpenBraceOnNewLineForControlBlocks: false
|
||||
};
|
||||
}
|
||||
}
|
||||
|
|
142
gulpfile.js
142
gulpfile.js
|
@ -3,53 +3,72 @@
|
|||
* Licensed under the MIT License. See License.txt in the project root for license information.
|
||||
*--------------------------------------------------------------------------------------------*/
|
||||
|
||||
'use strict';
|
||||
|
||||
// Increase max listeners for event emitters
|
||||
require('events').EventEmitter.defaultMaxListeners = 100;
|
||||
|
||||
const gulp = require('gulp');
|
||||
const json = require('gulp-json-editor');
|
||||
const buffer = require('gulp-buffer');
|
||||
const tsb = require('gulp-tsb');
|
||||
const filter = require('gulp-filter');
|
||||
const mocha = require('gulp-mocha');
|
||||
const es = require('event-stream');
|
||||
const watch = require('./build/lib/watch');
|
||||
const nls = require('./build/lib/nls');
|
||||
const util = require('./build/lib/util');
|
||||
const reporter = require('./build/lib/reporter')();
|
||||
const remote = require('gulp-remote-src');
|
||||
const zip = require('gulp-vinyl-zip');
|
||||
const path = require('path');
|
||||
const bom = require('gulp-bom');
|
||||
const sourcemaps = require('gulp-sourcemaps');
|
||||
const _ = require('underscore');
|
||||
const assign = require('object-assign');
|
||||
const monacodts = require('./build/monaco/api');
|
||||
const fs = require('fs');
|
||||
var gulp = require('gulp');
|
||||
var json = require('gulp-json-editor');
|
||||
var buffer = require('gulp-buffer');
|
||||
var tsb = require('gulp-tsb');
|
||||
var filter = require('gulp-filter');
|
||||
var mocha = require('gulp-mocha');
|
||||
var es = require('event-stream');
|
||||
var watch = require('./build/lib/watch');
|
||||
var nls = require('./build/lib/nls');
|
||||
var util = require('./build/lib/util');
|
||||
var reporter = require('./build/lib/reporter')();
|
||||
var remote = require('gulp-remote-src');
|
||||
var zip = require('gulp-vinyl-zip');
|
||||
var path = require('path');
|
||||
var bom = require('gulp-bom');
|
||||
var sourcemaps = require('gulp-sourcemaps');
|
||||
var _ = require('underscore');
|
||||
var assign = require('object-assign');
|
||||
var quiet = !!process.env['VSCODE_BUILD_QUIET'];
|
||||
var monacodts = require('./build/monaco/api');
|
||||
var fs = require('fs');
|
||||
|
||||
const rootDir = path.join(__dirname, 'src');
|
||||
const options = require('./src/tsconfig.json').compilerOptions;
|
||||
options.verbose = false;
|
||||
options.sourceMap = true;
|
||||
options.rootDir = rootDir;
|
||||
options.sourceRoot = util.toFileUri(rootDir);
|
||||
var rootDir = path.join(__dirname, 'src');
|
||||
var tsOptions = {
|
||||
target: 'ES5',
|
||||
declaration: true,
|
||||
module: 'amd',
|
||||
verbose: !quiet,
|
||||
preserveConstEnums: true,
|
||||
experimentalDecorators: true,
|
||||
sourceMap: true,
|
||||
rootDir: rootDir,
|
||||
sourceRoot: util.toFileUri(rootDir)
|
||||
};
|
||||
|
||||
function createFastFilter(filterFn) {
|
||||
var result = es.through(function(data) {
|
||||
if (filterFn(data)) {
|
||||
this.emit('data', data);
|
||||
} else {
|
||||
result.restore.push(data);
|
||||
}
|
||||
});
|
||||
result.restore = es.through();
|
||||
return result;
|
||||
}
|
||||
|
||||
function createCompile(build, emitError) {
|
||||
const opts = _.clone(options);
|
||||
var opts = _.clone(tsOptions);
|
||||
opts.inlineSources = !!build;
|
||||
opts.noFilesystemLookup = true;
|
||||
|
||||
const ts = tsb.create(opts, null, null, err => reporter(err.toString()));
|
||||
var ts = tsb.create(opts, null, null, quiet ? null : function (err) {
|
||||
reporter(err.toString());
|
||||
});
|
||||
|
||||
return function (token) {
|
||||
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
||||
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
||||
const noDeclarationsFilter = util.filter(data => !(/\.d\.ts$/.test(data.path)));
|
||||
var utf8Filter = createFastFilter(function(data) { return /(\/|\\)test(\/|\\).*utf8/.test(data.path); });
|
||||
var tsFilter = createFastFilter(function(data) { return /\.ts$/.test(data.path); });
|
||||
var noDeclarationsFilter = createFastFilter(function(data) { return !(/\.d\.ts$/.test(data.path)); });
|
||||
|
||||
const input = es.through();
|
||||
const output = input
|
||||
var input = es.through();
|
||||
var output = input
|
||||
.pipe(utf8Filter)
|
||||
.pipe(bom())
|
||||
.pipe(utf8Filter.restore)
|
||||
|
@ -62,20 +81,20 @@ function createCompile(build, emitError) {
|
|||
.pipe(sourcemaps.write('.', {
|
||||
addComment: false,
|
||||
includeContent: !!build,
|
||||
sourceRoot: options.sourceRoot
|
||||
sourceRoot: tsOptions.sourceRoot
|
||||
}))
|
||||
.pipe(tsFilter.restore)
|
||||
.pipe(reporter.end(emitError));
|
||||
.pipe(quiet ? es.through() : reporter.end(emitError));
|
||||
|
||||
return es.duplex(input, output);
|
||||
};
|
||||
}
|
||||
|
||||
function compileTask(out, build) {
|
||||
const compile = createCompile(build, true);
|
||||
var compile = createCompile(build, true);
|
||||
|
||||
return function () {
|
||||
const src = es.merge(
|
||||
var src = es.merge(
|
||||
gulp.src('src/**', { base: 'src' }),
|
||||
gulp.src('node_modules/typescript/lib/lib.d.ts')
|
||||
);
|
||||
|
@ -88,14 +107,14 @@ function compileTask(out, build) {
|
|||
}
|
||||
|
||||
function watchTask(out, build) {
|
||||
const compile = createCompile(build);
|
||||
var compile = createCompile(build);
|
||||
|
||||
return function () {
|
||||
const src = es.merge(
|
||||
var src = es.merge(
|
||||
gulp.src('src/**', { base: 'src' }),
|
||||
gulp.src('node_modules/typescript/lib/lib.d.ts')
|
||||
);
|
||||
const watchSrc = watch('src/**', { base: 'src' });
|
||||
var watchSrc = watch('src/**', { base: 'src' });
|
||||
|
||||
return watchSrc
|
||||
.pipe(util.incremental(compile, src, true))
|
||||
|
@ -105,9 +124,10 @@ function watchTask(out, build) {
|
|||
}
|
||||
|
||||
function monacodtsTask(out, isWatch) {
|
||||
let timer = -1;
|
||||
|
||||
const runSoon = function(howSoon) {
|
||||
var timer = -1;
|
||||
|
||||
var runSoon = function(howSoon) {
|
||||
if (timer !== -1) {
|
||||
clearTimeout(timer);
|
||||
timer = -1;
|
||||
|
@ -118,7 +138,7 @@ function monacodtsTask(out, isWatch) {
|
|||
}, howSoon);
|
||||
};
|
||||
|
||||
const runNow = function() {
|
||||
var runNow = function() {
|
||||
if (timer !== -1) {
|
||||
clearTimeout(timer);
|
||||
timer = -1;
|
||||
|
@ -127,7 +147,7 @@ function monacodtsTask(out, isWatch) {
|
|||
// monacodts.complainErrors();
|
||||
// return;
|
||||
// }
|
||||
const result = monacodts.run(out);
|
||||
var result = monacodts.run(out);
|
||||
if (!result.isTheSame) {
|
||||
if (isWatch) {
|
||||
fs.writeFileSync(result.filePath, result.content);
|
||||
|
@ -137,11 +157,11 @@ function monacodtsTask(out, isWatch) {
|
|||
}
|
||||
};
|
||||
|
||||
let resultStream;
|
||||
var resultStream;
|
||||
|
||||
if (isWatch) {
|
||||
|
||||
const filesToWatchMap = {};
|
||||
var filesToWatchMap = {};
|
||||
monacodts.getFilesToWatch(out).forEach(function(filePath) {
|
||||
filesToWatchMap[path.normalize(filePath)] = true;
|
||||
});
|
||||
|
@ -151,7 +171,7 @@ function monacodtsTask(out, isWatch) {
|
|||
}));
|
||||
|
||||
resultStream = es.through(function(data) {
|
||||
const filePath = path.normalize(data.path);
|
||||
var filePath = path.normalize(data.path);
|
||||
if (filesToWatchMap[filePath]) {
|
||||
runSoon(5000);
|
||||
}
|
||||
|
@ -160,7 +180,7 @@ function monacodtsTask(out, isWatch) {
|
|||
|
||||
} else {
|
||||
|
||||
resultStream = es.through(null, function() {
|
||||
resultStream = es.through(null, function(end) {
|
||||
runNow();
|
||||
this.emit('end');
|
||||
});
|
||||
|
@ -200,24 +220,24 @@ gulp.task('test', function () {
|
|||
});
|
||||
|
||||
gulp.task('mixin', function () {
|
||||
const repo = process.env['VSCODE_MIXIN_REPO'];
|
||||
var repo = process.env['VSCODE_MIXIN_REPO'];
|
||||
|
||||
if (!repo) {
|
||||
console.log('Missing VSCODE_MIXIN_REPO, skipping mixin');
|
||||
return;
|
||||
}
|
||||
|
||||
const quality = process.env['VSCODE_QUALITY'];
|
||||
var quality = process.env['VSCODE_QUALITY'];
|
||||
|
||||
if (!quality) {
|
||||
console.log('Missing VSCODE_QUALITY, skipping mixin');
|
||||
return;
|
||||
}
|
||||
|
||||
const url = 'https://github.com/' + repo + '/archive/master.zip';
|
||||
const opts = { base: '' };
|
||||
const username = process.env['VSCODE_MIXIN_USERNAME'];
|
||||
const password = process.env['VSCODE_MIXIN_PASSWORD'];
|
||||
var url = 'https://github.com/' + repo + '/archive/master.zip';
|
||||
var opts = { base: '' };
|
||||
var username = process.env['VSCODE_MIXIN_USERNAME'];
|
||||
var password = process.env['VSCODE_MIXIN_PASSWORD'];
|
||||
|
||||
if (username || password) {
|
||||
opts.auth = { user: username || '', pass: password || '' };
|
||||
|
@ -225,22 +245,22 @@ gulp.task('mixin', function () {
|
|||
|
||||
console.log('Mixing in sources from \'' + url + '\':');
|
||||
|
||||
let all = remote(url, opts)
|
||||
var all = remote(url, opts)
|
||||
.pipe(zip.src())
|
||||
.pipe(filter(function (f) { return !f.isDirectory(); }))
|
||||
.pipe(util.rebase(1));
|
||||
|
||||
if (quality) {
|
||||
const build = all.pipe(filter('build/**'));
|
||||
const productJsonFilter = filter('product.json', { restore: true });
|
||||
var build = all.pipe(filter('build/**'));
|
||||
var productJsonFilter = filter('product.json', { restore: true });
|
||||
|
||||
const mixin = all
|
||||
var mixin = all
|
||||
.pipe(filter('quality/' + quality + '/**'))
|
||||
.pipe(util.rebase(2))
|
||||
.pipe(productJsonFilter)
|
||||
.pipe(buffer())
|
||||
.pipe(json(function (patch) {
|
||||
const original = require('./product.json');
|
||||
var original = require('./product.json');
|
||||
return assign(original, patch);
|
||||
}))
|
||||
.pipe(productJsonFilter.restore);
|
||||
|
|
Loading…
Reference in a new issue