Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/microsoft/vscode.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.eslintrc9
-rw-r--r--.vscode/tasks.json6
-rw-r--r--build/gulpfile.common.js14
-rw-r--r--build/gulpfile.extensions.js40
-rw-r--r--build/lib/i18n.js572
-rw-r--r--build/lib/i18n.ts5
-rw-r--r--build/lib/nls.js700
-rw-r--r--build/lib/reporter.js20
-rw-r--r--build/lib/tslint/noUnexternalizedStringsRule.js336
-rw-r--r--build/lib/util.js13
-rw-r--r--build/monaco/api.js2
-rw-r--r--gulpfile.js144
12 files changed, 941 insertions, 920 deletions
diff --git a/.eslintrc b/.eslintrc
index e2ca242393d..99ba790bd07 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -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
+ }
} \ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
index 79885f1dda9..2ae43c332fa 100644
--- a/.vscode/tasks.json
+++ b/.vscode/tasks.json
@@ -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"
}
}
},
diff --git a/build/gulpfile.common.js b/build/gulpfile.common.js
index 8939fa31b17..63b2b0b1773 100644
--- a/build/gulpfile.common.js
+++ b/build/gulpfile.common.js
@@ -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;
}));
}
diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js
index dad634b7e70..f7553fbff2c 100644
--- a/build/gulpfile.extensions.js
+++ b/build/gulpfile.extensions.js
@@ -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))
diff --git a/build/lib/i18n.js b/build/lib/i18n.js
index b3be39a2c51..5669ae38a05 100644
--- a/build/lib/i18n.js
+++ b/build/lib/i18n.js
@@ -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;
diff --git a/build/lib/i18n.ts b/build/lib/i18n.ts
index fdc65def6e1..e8cd6ec771a 100644
--- a/build/lib/i18n.ts
+++ b/build/lib/i18n.ts
@@ -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);
}
diff --git a/build/lib/nls.js b/build/lib/nls.js
index b3c881d9e99..60407c708fb 100644
--- a/build/lib/nls.js
+++ b/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;
diff --git a/build/lib/reporter.js b/build/lib/reporter.js
index d9a7de331f4..e02bf359558 100644
--- a/build/lib/reporter.js
+++ b/build/lib/reporter.js
@@ -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 () {
diff --git a/build/lib/tslint/noUnexternalizedStringsRule.js b/build/lib/tslint/noUnexternalizedStringsRule.js
index 5440bff536a..b6691ae182d 100644
--- a/build/lib/tslint/noUnexternalizedStringsRule.js
+++ b/build/lib/tslint/noUnexternalizedStringsRule.js
@@ -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));
diff --git a/build/lib/util.js b/build/lib/util.js
index 07ee3676ec3..b3e98dc2baf 100644
--- a/build/lib/util.js
+++ b/build/lib/util.js
@@ -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;
}; \ No newline at end of file
diff --git a/build/monaco/api.js b/build/monaco/api.js
index 4cab80a45a9..97877c63803 100644
--- a/build/monaco/api.js
+++ b/build/monaco/api.js
@@ -202,7 +202,7 @@ function format(text) {
InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: false,
InsertSpaceAfterOpeningAndBeforeClosingTemplateStringBraces: true,
PlaceOpenBraceOnNewLineForFunctions: false,
- PlaceOpenBraceOnNewLineForControlBlocks: false,
+ PlaceOpenBraceOnNewLineForControlBlocks: false
};
}
}
diff --git a/gulpfile.js b/gulpfile.js
index 6966b225307..92a511a531d 100644
--- a/gulpfile.js
+++ b/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');
-
-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 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');
+
+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);