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--.eslintrc3
-rw-r--r--build/gulpfile.common.js2
-rw-r--r--build/gulpfile.editor.js19
-rw-r--r--build/gulpfile.extensions.js2
-rw-r--r--build/gulpfile.js (renamed from build/lib/gulpfile.js)0
-rw-r--r--build/gulpfile.vscode.js2
-rw-r--r--build/lib/bundle.js521
-rw-r--r--build/lib/bundle.ts4
-rw-r--r--build/lib/git.js5
-rw-r--r--build/lib/nls.js719
-rw-r--r--build/lib/nls.ts35
-rw-r--r--build/lib/reporter.js5
-rw-r--r--build/lib/util.js2
-rw-r--r--build/tsconfig.json (renamed from build/lib/tsconfig.json)5
-rw-r--r--build/tslintRules/noUnexternalizedStringsRule.js336
-rw-r--r--build/tslintRules/noUnexternalizedStringsRule.ts1
-rw-r--r--build/tslintRules/tsconfig.json8
-rw-r--r--gulpfile.js1
-rw-r--r--src/bootstrap.js2
-rw-r--r--src/tsconfig.json2
-rw-r--r--test/all.js3
-rw-r--r--test/browser.js2
22 files changed, 807 insertions, 872 deletions
diff --git a/.eslintrc b/.eslintrc
index 863063f1989..99ba790bd07 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -1,4 +1,7 @@
{
+ "env": {
+ "node": true
+ },
"rules": {
"no-undef": 2,
"no-unused-vars": 1
diff --git a/build/gulpfile.common.js b/build/gulpfile.common.js
index dfbcc8942c5..72043b74d09 100644
--- a/build/gulpfile.common.js
+++ b/build/gulpfile.common.js
@@ -3,8 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-/*global require,exports,__dirname,Buffer,setTimeout*/
-
var path = require('path');
var gulp = require('gulp');
var sourcemaps = require('gulp-sourcemaps');
diff --git a/build/gulpfile.editor.js b/build/gulpfile.editor.js
index 6b694d17c95..d54507ec3f3 100644
--- a/build/gulpfile.editor.js
+++ b/build/gulpfile.editor.js
@@ -3,13 +3,9 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-/*global require,__dirname*/
-
var gulp = require('gulp');
var path = require('path');
-var filter = require('gulp-filter');
var _ = require('underscore');
-var es = require('event-stream');
var buildfile = require('../src/buildfile');
var util = require('./lib/util');
var common = require('./gulpfile.common');
@@ -80,19 +76,4 @@ gulp.task('optimize-editor', ['clean-optimized-editor', 'compile-build'], common
gulp.task('clean-minified-editor', util.rimraf('out-editor-min'));
gulp.task('minify-editor', ['clean-minified-editor', 'optimize-editor'], common.minifyTask('out-editor', true));
-
-// Package
-
-var root = path.dirname(__dirname);
-
-function copyTask(src, dest, FILTER) {
- return function () {
- return (
- gulp.src(src + '/**', { base: src })
- .pipe(FILTER ? filter(FILTER) : es.through())
- .pipe(gulp.dest(dest))
- );
- };
-}
-
gulp.task('editor-distro', ['minify-editor', 'optimize-editor']);
diff --git a/build/gulpfile.extensions.js b/build/gulpfile.extensions.js
index 300477cbccb..5b014729d8a 100644
--- a/build/gulpfile.extensions.js
+++ b/build/gulpfile.extensions.js
@@ -3,8 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-/*global process,require,__dirname*/
-
// Increase max listeners for event emitters
require('events').EventEmitter.defaultMaxListeners = 100;
diff --git a/build/lib/gulpfile.js b/build/gulpfile.js
index c0a5700ec1f..c0a5700ec1f 100644
--- a/build/lib/gulpfile.js
+++ b/build/gulpfile.js
diff --git a/build/gulpfile.vscode.js b/build/gulpfile.vscode.js
index 9400a7c0793..4aa13839244 100644
--- a/build/gulpfile.vscode.js
+++ b/build/gulpfile.vscode.js
@@ -3,8 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-/*global process,__dirname,Buffer,require*/
-
var gulp = require('gulp');
var fs = require('fs');
var path = require('path');
diff --git a/build/lib/bundle.js b/build/lib/bundle.js
index d680644fd0e..f6b542ca7b7 100644
--- a/build/lib/bundle.js
+++ b/build/lib/bundle.js
@@ -1,260 +1,261 @@
-/*---------------------------------------------------------------------------------------------
- * Copyright (c) Microsoft Corporation. All rights reserved.
- * Licensed under the MIT License. See License.txt in the project root for license information.
- *--------------------------------------------------------------------------------------------*/
-var fs = require('fs');
-var path = require('path');
-var vm = require('vm');
-/**
- * Bundle `entryPoints` given config `config`.
- */
-function bundle(entryPoints, config, callback) {
- var entryPointsMap = {};
- entryPoints.forEach(function (module) {
- entryPointsMap[module.name] = module;
- });
- var code = require('fs').readFileSync(path.join(__dirname, '../../src/vs/loader.js'));
- var r = vm.runInThisContext('(function(require, module, exports) { ' + code + '\n});');
- var loaderModule = { exports: {} };
- r.call({}, require, loaderModule, loaderModule.exports);
- var loader = loaderModule.exports;
- config.isBuild = true;
- loader.config(config);
- loader(Object.keys(entryPointsMap), function () {
- var modules = loader.getBuildInfo();
- callback(null, emitEntryPoints(modules, entryPointsMap));
- }, function (err) { return callback(err, null); });
-}
-exports.bundle = bundle;
-function emitEntryPoints(modules, entryPoints) {
- var modulesMap = {};
- modules.forEach(function (m) {
- modulesMap[m.id] = m;
- });
- var modulesGraph = {};
- modules.forEach(function (m) {
- modulesGraph[m.id] = m.dependencies;
- });
- var sortedModules = topologicalSort(modulesGraph);
- var result = [];
- var usedPlugins = {};
- Object.keys(entryPoints).forEach(function (moduleToBundle) {
- var info = entryPoints[moduleToBundle];
- var rootNodes = [moduleToBundle].concat(info.include || []);
- var allDependencies = visit(rootNodes, modulesGraph);
- var excludes = ['require', 'exports', 'module'].concat(info.exclude || []);
- excludes.forEach(function (excludeRoot) {
- var allExcludes = visit([excludeRoot], modulesGraph);
- Object.keys(allExcludes).forEach(function (exclude) {
- delete allDependencies[exclude];
- });
- });
- var includedModules = sortedModules.filter(function (module) {
- return allDependencies[module];
- });
- var res = emitEntryPoint(modulesMap, modulesGraph, moduleToBundle, includedModules);
- result = result.concat(res.files);
- for (var pluginName in res.usedPlugins) {
- usedPlugins[pluginName] = usedPlugins[pluginName] || res.usedPlugins[pluginName];
- }
- });
- Object.keys(usedPlugins).forEach(function (pluginName) {
- var plugin = usedPlugins[pluginName];
- if (typeof plugin.finishBuild === 'function') {
- var write = function (filename, contents) {
- result.push({
- dest: filename,
- sources: [{
- path: null,
- contents: contents
- }]
- });
- };
- plugin.finishBuild(write);
- }
- });
- return result;
-}
-function emitEntryPoint(modulesMap, deps, entryPoint, includedModules) {
- var mainResult = {
- sources: [],
- dest: entryPoint + '.js'
- }, results = [mainResult];
- var usedPlugins = {};
- var getLoaderPlugin = function (pluginName) {
- if (!usedPlugins[pluginName]) {
- usedPlugins[pluginName] = modulesMap[pluginName].exports;
- }
- return usedPlugins[pluginName];
- };
- includedModules.forEach(function (c) {
- var bangIndex = c.indexOf('!');
- if (bangIndex >= 0) {
- var pluginName = c.substr(0, bangIndex);
- var plugin = getLoaderPlugin(pluginName);
- mainResult.sources.push(emitPlugin(entryPoint, plugin, pluginName, c.substr(bangIndex + 1)));
- return;
- }
- var module = modulesMap[c];
- if (module.path === 'empty:') {
- return;
- }
- var contents = readFileAndRemoveBOM(module.path);
- if (module.shim) {
- mainResult.sources.push(emitShimmedModule(c, deps[c], module.shim, module.path, contents));
- }
- else {
- mainResult.sources.push(emitNamedModule(c, deps[c], module.defineLocation, module.path, contents));
- }
- });
- Object.keys(usedPlugins).forEach(function (pluginName) {
- var plugin = usedPlugins[pluginName];
- if (typeof plugin.writeFile === 'function') {
- var req = (function () {
- throw new Error('no-no!');
- });
- req.toUrl = function (something) { return something; };
- var write = function (filename, contents) {
- results.push({
- dest: filename,
- sources: [{
- path: null,
- contents: contents
- }]
- });
- };
- plugin.writeFile(pluginName, entryPoint, req, write, {});
- }
- });
- return {
- files: results,
- usedPlugins: usedPlugins
- };
-}
-function readFileAndRemoveBOM(path) {
- var BOM_CHAR_CODE = 65279;
- var contents = fs.readFileSync(path, 'utf8');
- // Remove BOM
- if (contents.charCodeAt(0) === BOM_CHAR_CODE) {
- contents = contents.substring(1);
- }
- return contents;
-}
-function emitPlugin(entryPoint, plugin, pluginName, moduleName) {
- var result = '';
- if (typeof plugin.write === 'function') {
- var write = (function (what) {
- result += what;
- });
- write.getEntryPoint = function () {
- return entryPoint;
- };
- write.asModule = function (moduleId, code) {
- code = code.replace(/^define\(/, 'define("' + moduleId + '",');
- result += code;
- };
- plugin.write(pluginName, moduleName, write);
- }
- return {
- path: null,
- contents: result
- };
-}
-function emitNamedModule(moduleId, myDeps, defineCallPosition, path, contents) {
- // `defineCallPosition` is the position in code: |define()
- var defineCallOffset = positionToOffset(contents, defineCallPosition.line, defineCallPosition.col);
- // `parensOffset` is the position in code: define|()
- var parensOffset = contents.indexOf('(', defineCallOffset);
- var insertStr = '"' + moduleId + '", ';
- return {
- path: path,
- contents: contents.substr(0, parensOffset + 1) + insertStr + contents.substr(parensOffset + 1)
- };
-}
-function emitShimmedModule(moduleId, myDeps, factory, path, contents) {
- var strDeps = (myDeps.length > 0 ? '"' + myDeps.join('", "') + '"' : '');
- var strDefine = 'define("' + moduleId + '", [' + strDeps + '], ' + factory + ');';
- return {
- path: path,
- contents: contents + '\n;\n' + strDefine
- };
-}
-/**
- * Convert a position (line:col) to (offset) in string `str`
- */
-function positionToOffset(str, desiredLine, desiredCol) {
- if (desiredLine === 1) {
- return desiredCol - 1;
- }
- var line = 1, lastNewLineOffset = -1;
- do {
- if (desiredLine === line) {
- return lastNewLineOffset + 1 + desiredCol - 1;
- }
- lastNewLineOffset = str.indexOf('\n', lastNewLineOffset + 1);
- line++;
- } while (lastNewLineOffset >= 0);
- return -1;
-}
-/**
- * Return a set of reachable nodes in `graph` starting from `rootNodes`
- */
-function visit(rootNodes, graph) {
- var result = {}, queue = rootNodes;
- rootNodes.forEach(function (node) {
- result[node] = true;
- });
- while (queue.length > 0) {
- var el = queue.shift();
- var myEdges = graph[el] || [];
- myEdges.forEach(function (toNode) {
- if (!result[toNode]) {
- result[toNode] = true;
- queue.push(toNode);
- }
- });
- }
- return result;
-}
-/**
- * Perform a topological sort on `graph`
- */
-function topologicalSort(graph) {
- var allNodes = {}, outgoingEdgeCount = {}, inverseEdges = {};
- Object.keys(graph).forEach(function (fromNode) {
- allNodes[fromNode] = true;
- outgoingEdgeCount[fromNode] = graph[fromNode].length;
- graph[fromNode].forEach(function (toNode) {
- allNodes[toNode] = true;
- outgoingEdgeCount[toNode] = outgoingEdgeCount[toNode] || 0;
- inverseEdges[toNode] = inverseEdges[toNode] || [];
- inverseEdges[toNode].push(fromNode);
- });
- });
- // https://en.wikipedia.org/wiki/Topological_sorting
- var S = [], L = [];
- Object.keys(allNodes).forEach(function (node) {
- if (outgoingEdgeCount[node] === 0) {
- delete outgoingEdgeCount[node];
- S.push(node);
- }
- });
- while (S.length > 0) {
- // Ensure the exact same order all the time with the same inputs
- S.sort();
- var n = S.shift();
- L.push(n);
- var myInverseEdges = inverseEdges[n] || [];
- myInverseEdges.forEach(function (m) {
- outgoingEdgeCount[m]--;
- if (outgoingEdgeCount[m] === 0) {
- delete outgoingEdgeCount[m];
- S.push(m);
- }
- });
- }
- if (Object.keys(outgoingEdgeCount).length > 0) {
- throw new Error('Cannot do topological sort on cyclic graph, remaining nodes: ' + Object.keys(outgoingEdgeCount));
- }
- return L;
-}
+/*---------------------------------------------------------------------------------------------
+ * 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 fs = require('fs');
+var path = require('path');
+var vm = require('vm');
+/**
+ * Bundle `entryPoints` given config `config`.
+ */
+function bundle(entryPoints, config, callback) {
+ var entryPointsMap = {};
+ entryPoints.forEach(function (module) {
+ entryPointsMap[module.name] = module;
+ });
+ var code = require('fs').readFileSync(path.join(__dirname, '../../src/vs/loader.js'));
+ var r = vm.runInThisContext('(function(require, module, exports) { ' + code + '\n});');
+ var loaderModule = { exports: {} };
+ r.call({}, require, loaderModule, loaderModule.exports);
+ var loader = loaderModule.exports;
+ config.isBuild = true;
+ loader.config(config);
+ loader(Object.keys(entryPointsMap), function () {
+ var modules = loader.getBuildInfo();
+ callback(null, emitEntryPoints(modules, entryPointsMap));
+ }, function (err) { return callback(err, null); });
+}
+exports.bundle = bundle;
+function emitEntryPoints(modules, entryPoints) {
+ var modulesMap = {};
+ modules.forEach(function (m) {
+ modulesMap[m.id] = m;
+ });
+ var modulesGraph = {};
+ modules.forEach(function (m) {
+ modulesGraph[m.id] = m.dependencies;
+ });
+ var sortedModules = topologicalSort(modulesGraph);
+ var result = [];
+ var usedPlugins = {};
+ Object.keys(entryPoints).forEach(function (moduleToBundle) {
+ var info = entryPoints[moduleToBundle];
+ var rootNodes = [moduleToBundle].concat(info.include || []);
+ var allDependencies = visit(rootNodes, modulesGraph);
+ var excludes = ['require', 'exports', 'module'].concat(info.exclude || []);
+ excludes.forEach(function (excludeRoot) {
+ var allExcludes = visit([excludeRoot], modulesGraph);
+ Object.keys(allExcludes).forEach(function (exclude) {
+ delete allDependencies[exclude];
+ });
+ });
+ var includedModules = sortedModules.filter(function (module) {
+ return allDependencies[module];
+ });
+ var res = emitEntryPoint(modulesMap, modulesGraph, moduleToBundle, includedModules);
+ result = result.concat(res.files);
+ for (var pluginName in res.usedPlugins) {
+ usedPlugins[pluginName] = usedPlugins[pluginName] || res.usedPlugins[pluginName];
+ }
+ });
+ Object.keys(usedPlugins).forEach(function (pluginName) {
+ var plugin = usedPlugins[pluginName];
+ if (typeof plugin.finishBuild === 'function') {
+ var write = function (filename, contents) {
+ result.push({
+ dest: filename,
+ sources: [{
+ path: null,
+ contents: contents
+ }]
+ });
+ };
+ plugin.finishBuild(write);
+ }
+ });
+ return result;
+}
+function emitEntryPoint(modulesMap, deps, entryPoint, includedModules) {
+ var mainResult = {
+ sources: [],
+ dest: entryPoint + '.js'
+ }, results = [mainResult];
+ var usedPlugins = {};
+ var getLoaderPlugin = function (pluginName) {
+ if (!usedPlugins[pluginName]) {
+ usedPlugins[pluginName] = modulesMap[pluginName].exports;
+ }
+ return usedPlugins[pluginName];
+ };
+ includedModules.forEach(function (c) {
+ var bangIndex = c.indexOf('!');
+ if (bangIndex >= 0) {
+ var pluginName = c.substr(0, bangIndex);
+ var plugin = getLoaderPlugin(pluginName);
+ mainResult.sources.push(emitPlugin(entryPoint, plugin, pluginName, c.substr(bangIndex + 1)));
+ return;
+ }
+ var module = modulesMap[c];
+ if (module.path === 'empty:') {
+ return;
+ }
+ var contents = readFileAndRemoveBOM(module.path);
+ if (module.shim) {
+ mainResult.sources.push(emitShimmedModule(c, deps[c], module.shim, module.path, contents));
+ }
+ else {
+ mainResult.sources.push(emitNamedModule(c, deps[c], module.defineLocation, module.path, contents));
+ }
+ });
+ Object.keys(usedPlugins).forEach(function (pluginName) {
+ var plugin = usedPlugins[pluginName];
+ if (typeof plugin.writeFile === 'function') {
+ var req = (function () {
+ throw new Error('no-no!');
+ });
+ req.toUrl = function (something) { return something; };
+ var write = function (filename, contents) {
+ results.push({
+ dest: filename,
+ sources: [{
+ path: null,
+ contents: contents
+ }]
+ });
+ };
+ plugin.writeFile(pluginName, entryPoint, req, write, {});
+ }
+ });
+ return {
+ files: results,
+ usedPlugins: usedPlugins
+ };
+}
+function readFileAndRemoveBOM(path) {
+ var BOM_CHAR_CODE = 65279;
+ var contents = fs.readFileSync(path, 'utf8');
+ // Remove BOM
+ if (contents.charCodeAt(0) === BOM_CHAR_CODE) {
+ contents = contents.substring(1);
+ }
+ return contents;
+}
+function emitPlugin(entryPoint, plugin, pluginName, moduleName) {
+ var result = '';
+ if (typeof plugin.write === 'function') {
+ var write = (function (what) {
+ result += what;
+ });
+ write.getEntryPoint = function () {
+ return entryPoint;
+ };
+ write.asModule = function (moduleId, code) {
+ code = code.replace(/^define\(/, 'define("' + moduleId + '",');
+ result += code;
+ };
+ plugin.write(pluginName, moduleName, write);
+ }
+ return {
+ path: null,
+ contents: result
+ };
+}
+function emitNamedModule(moduleId, myDeps, defineCallPosition, path, contents) {
+ // `defineCallPosition` is the position in code: |define()
+ var defineCallOffset = positionToOffset(contents, defineCallPosition.line, defineCallPosition.col);
+ // `parensOffset` is the position in code: define|()
+ var parensOffset = contents.indexOf('(', defineCallOffset);
+ var insertStr = '"' + moduleId + '", ';
+ return {
+ path: path,
+ contents: contents.substr(0, parensOffset + 1) + insertStr + contents.substr(parensOffset + 1)
+ };
+}
+function emitShimmedModule(moduleId, myDeps, factory, path, contents) {
+ var strDeps = (myDeps.length > 0 ? '"' + myDeps.join('", "') + '"' : '');
+ var strDefine = 'define("' + moduleId + '", [' + strDeps + '], ' + factory + ');';
+ return {
+ path: path,
+ contents: contents + '\n;\n' + strDefine
+ };
+}
+/**
+ * Convert a position (line:col) to (offset) in string `str`
+ */
+function positionToOffset(str, desiredLine, desiredCol) {
+ if (desiredLine === 1) {
+ return desiredCol - 1;
+ }
+ var line = 1, lastNewLineOffset = -1;
+ do {
+ if (desiredLine === line) {
+ return lastNewLineOffset + 1 + desiredCol - 1;
+ }
+ lastNewLineOffset = str.indexOf('\n', lastNewLineOffset + 1);
+ line++;
+ } while (lastNewLineOffset >= 0);
+ return -1;
+}
+/**
+ * Return a set of reachable nodes in `graph` starting from `rootNodes`
+ */
+function visit(rootNodes, graph) {
+ var result = {}, queue = rootNodes;
+ rootNodes.forEach(function (node) {
+ result[node] = true;
+ });
+ while (queue.length > 0) {
+ var el = queue.shift();
+ var myEdges = graph[el] || [];
+ myEdges.forEach(function (toNode) {
+ if (!result[toNode]) {
+ result[toNode] = true;
+ queue.push(toNode);
+ }
+ });
+ }
+ return result;
+}
+/**
+ * Perform a topological sort on `graph`
+ */
+function topologicalSort(graph) {
+ var allNodes = {}, outgoingEdgeCount = {}, inverseEdges = {};
+ Object.keys(graph).forEach(function (fromNode) {
+ allNodes[fromNode] = true;
+ outgoingEdgeCount[fromNode] = graph[fromNode].length;
+ graph[fromNode].forEach(function (toNode) {
+ allNodes[toNode] = true;
+ outgoingEdgeCount[toNode] = outgoingEdgeCount[toNode] || 0;
+ inverseEdges[toNode] = inverseEdges[toNode] || [];
+ inverseEdges[toNode].push(fromNode);
+ });
+ });
+ // https://en.wikipedia.org/wiki/Topological_sorting
+ var S = [], L = [];
+ Object.keys(allNodes).forEach(function (node) {
+ if (outgoingEdgeCount[node] === 0) {
+ delete outgoingEdgeCount[node];
+ S.push(node);
+ }
+ });
+ while (S.length > 0) {
+ // Ensure the exact same order all the time with the same inputs
+ S.sort();
+ var n = S.shift();
+ L.push(n);
+ var myInverseEdges = inverseEdges[n] || [];
+ myInverseEdges.forEach(function (m) {
+ outgoingEdgeCount[m]--;
+ if (outgoingEdgeCount[m] === 0) {
+ delete outgoingEdgeCount[m];
+ S.push(m);
+ }
+ });
+ }
+ if (Object.keys(outgoingEdgeCount).length > 0) {
+ throw new Error('Cannot do topological sort on cyclic graph, remaining nodes: ' + Object.keys(outgoingEdgeCount));
+ }
+ return L;
+}
diff --git a/build/lib/bundle.ts b/build/lib/bundle.ts
index c31fa18f8b5..ca57748da11 100644
--- a/build/lib/bundle.ts
+++ b/build/lib/bundle.ts
@@ -96,7 +96,7 @@ export function bundle(entryPoints:IEntryPoint[], config:ILoaderConfig, callback
loader(Object.keys(entryPointsMap), () => {
let modules = <IBuildModuleInfo[]>loader.getBuildInfo();
callback(null, emitEntryPoints(modules, entryPointsMap));
- }, (err) => callback(err, null))
+ }, (err) => callback(err, null));
}
function emitEntryPoints(modules:IBuildModuleInfo[], entryPoints:IEntryPointMap): IConcatFile[] {
@@ -181,7 +181,7 @@ function emitEntryPoint(modulesMap:IBuildModuleInfoMap, deps:IGraph, entryPoint:
usedPlugins[pluginName] = modulesMap[pluginName].exports;
}
return usedPlugins[pluginName];
- }
+ };
includedModules.forEach((c:string) => {
let bangIndex = c.indexOf('!');
diff --git a/build/lib/git.js b/build/lib/git.js
index adc4c5cdec3..fc02b0e5467 100644
--- a/build/lib/git.js
+++ b/build/lib/git.js
@@ -1,3 +1,8 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
var path = require('path');
var fs = require('fs');
diff --git a/build/lib/nls.js b/build/lib/nls.js
index 1c055553a04..b3c881d9e99 100644
--- a/build/lib/nls.js
+++ b/build/lib/nls.js
@@ -1,369 +1,350 @@
-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 zip(stream, zipper) {
- if (zipper === void 0) { zipper = function (a, b) { return [a, b]; }; }
- var pass = event_stream_1.through();
- var oneBuffer = [];
- var otherBuffer = [];
- var result = pass.pipe(event_stream_1.through(function (f) {
- oneBuffer.push(f);
- flush();
- }), function () {
- flush();
- result.emit('end');
- });
- function flush() {
- while (oneBuffer.length > 0 && otherBuffer.length > 0) {
- result.emit('data', zipper(oneBuffer.shift(), otherBuffer.shift()));
- }
- }
- stream.pipe(event_stream_1.through(function (f) { return otherBuffer.push(f); }));
- return event_stream_1.duplex(pass, 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/nls.ts b/build/lib/nls.ts
index 7d73fccc288..309926daaca 100644
--- a/build/lib/nls.ts
+++ b/build/lib/nls.ts
@@ -1,15 +1,12 @@
import * as ts from './typescript/typescriptServices';
import * as lazy from 'lazy.js';
-import { duplex, through, mapSync, readArray, merge } from 'event-stream';
+import { duplex, through } from 'event-stream';
import { Stream } from 'stream';
-import { ThroughStream } from 'through';
import File = require('vinyl');
import * as sm from 'source-map';
import assign = require('object-assign');
import clone = require('clone');
-import filter = require('gulp-filter');
import path = require('path');
-import fs = require('fs');
declare class FileSourceMap extends File {
public sourceMap: sm.RawSourceMap;
@@ -41,30 +38,6 @@ function collect(node: ts.Node, fn: (node: ts.Node) => CollectStepResult): ts.No
return result;
}
-function zip<A,B,R>(stream: Stream, zipper: (a: A, b: B) => R = (a,b) => <any> [a, b]): ThroughStream {
- const pass = through();
- const oneBuffer: any[] = [];
- const otherBuffer: any[] = [];
-
- const result = pass.pipe(through(f => {
- oneBuffer.push(f);
- flush();
- }), () => {
- flush();
- result.emit('end');
- });
-
- function flush() {
- while (oneBuffer.length > 0 && otherBuffer.length > 0) {
- result.emit('data', zipper(oneBuffer.shift(), otherBuffer.shift()));
- }
- }
-
- stream.pipe(through(f => otherBuffer.push(f)));
-
- return duplex(pass, result);
-}
-
function template(lines: string[]): string {
let indent = '', wrap = '';
@@ -202,14 +175,14 @@ module nls {
.filter(n => n.kind === ts.SyntaxKind.ImportEqualsDeclaration)
.map(n => <ts.ImportEqualsDeclaration> n)
.filter(d => d.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference)
- .filter(d => (<ts.ExternalModuleReference>d.moduleReference).expression.getText() === "'vs/nls'");
+ .filter(d => (<ts.ExternalModuleReference>d.moduleReference).expression.getText() === '\'vs/nls\'');
// import ... from 'vs/nls';
const importDeclarations = imports
.filter(n => n.kind === ts.SyntaxKind.ImportDeclaration)
.map(n => <ts.ImportDeclaration> n)
.filter(d => d.moduleSpecifier.kind === ts.SyntaxKind.StringLiteral)
- .filter(d => d.moduleSpecifier.getText() === "'vs/nls'")
+ .filter(d => d.moduleSpecifier.getText() === '\'vs/nls\'')
.filter(d => !!d.importClause && !!d.importClause.namedBindings);
const nlsExpressions = importEqualsDeclarations
@@ -244,7 +217,7 @@ module nls {
const allLocalizeImportDeclarations = importDeclarations
.filter(d => d.importClause.namedBindings.kind === ts.SyntaxKind.NamedImports)
.map(d => (<ts.NamedImports> d.importClause.namedBindings).elements)
- .flatten()
+ .flatten();
// `localize` read-only references
const localizeReferences = allLocalizeImportDeclarations
diff --git a/build/lib/reporter.js b/build/lib/reporter.js
index 84c1e9d4805..69077e9b4a3 100644
--- a/build/lib/reporter.js
+++ b/build/lib/reporter.js
@@ -1,3 +1,8 @@
+/*---------------------------------------------------------------------------------------------
+ * Copyright (c) Microsoft Corporation. All rights reserved.
+ * Licensed under the MIT License. See License.txt in the project root for license information.
+ *--------------------------------------------------------------------------------------------*/
+
var es = require('event-stream');
var _ = require('underscore');
diff --git a/build/lib/util.js b/build/lib/util.js
index faa55b03759..43046c8ed9d 100644
--- a/build/lib/util.js
+++ b/build/lib/util.js
@@ -3,8 +3,6 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-/*global require,exports,process,Buffer*/
-
var es = require('event-stream');
var debounce = require('debounce');
var filter = require('gulp-filter');
diff --git a/build/lib/tsconfig.json b/build/tsconfig.json
index 946de0badf1..59a73844e14 100644
--- a/build/lib/tsconfig.json
+++ b/build/tsconfig.json
@@ -4,9 +4,10 @@
"noImplicitAny": false,
"removeComments": false,
"preserveConstEnums": true,
- "target": "ES5",
+ "target": "es5",
"sourceMap": false,
"experimentalDecorators": true,
- "noLib": true
+ "noLib": true,
+ "newLine": "LF"
}
} \ No newline at end of file
diff --git a/build/tslintRules/noUnexternalizedStringsRule.js b/build/tslintRules/noUnexternalizedStringsRule.js
index cb04dc0885a..5440bff536a 100644
--- a/build/tslintRules/noUnexternalizedStringsRule.js
+++ b/build/tslintRules/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/tslintRules/noUnexternalizedStringsRule.ts b/build/tslintRules/noUnexternalizedStringsRule.ts
index 4ae958e0a32..77441fd1ef0 100644
--- a/build/tslintRules/noUnexternalizedStringsRule.ts
+++ b/build/tslintRules/noUnexternalizedStringsRule.ts
@@ -2,6 +2,7 @@
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
+
import * as ts from 'typescript';
import * as Lint from 'tslint/lib/lint';
diff --git a/build/tslintRules/tsconfig.json b/build/tslintRules/tsconfig.json
deleted file mode 100644
index 6b7a334be71..00000000000
--- a/build/tslintRules/tsconfig.json
+++ /dev/null
@@ -1,8 +0,0 @@
-{
- "compilerOptions": {
- "module": "commonjs",
- "target": "es5",
- "moduleResolution": "node",
- "newLine": "LF"
- }
-} \ No newline at end of file
diff --git a/gulpfile.js b/gulpfile.js
index 222f2b2ef4d..e28052e8571 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -18,7 +18,6 @@ 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 rename = require('gulp-rename');
var zip = require('gulp-vinyl-zip');
var path = require('path');
var bom = require('gulp-bom');
diff --git a/src/bootstrap.js b/src/bootstrap.js
index d5ecc2dc3e3..093706562c6 100644
--- a/src/bootstrap.js
+++ b/src/bootstrap.js
@@ -94,7 +94,7 @@ if (!!process.send && process.env.PIPE_LOGGING === 'true') {
// error when we are inside a forked process and this process tries to access those channels.
var stream = require('stream');
var writable = new stream.Writable({
- write: function (chunk, encoding, next) { /* No OP */ }
+ write: function () { /* No OP */ }
});
process.__defineGetter__('stdout', function() { return writable; });
diff --git a/src/tsconfig.json b/src/tsconfig.json
index 2b9d5709ec0..7a144056295 100644
--- a/src/tsconfig.json
+++ b/src/tsconfig.json
@@ -4,7 +4,7 @@
"noImplicitAny": false,
"removeComments": false,
"preserveConstEnums": true,
- "target": "ES5",
+ "target": "es5",
"sourceMap": false,
"experimentalDecorators": true
},
diff --git a/test/all.js b/test/all.js
index 263d7ca424a..af8e0877ffd 100644
--- a/test/all.js
+++ b/test/all.js
@@ -3,7 +3,8 @@
* Licensed under the MIT License. See License.txt in the project root for license information.
*--------------------------------------------------------------------------------------------*/
-/*global process,__dirname,define,run,suite,test*/
+/*eslint-env mocha*/
+/*global define,run*/
var assert = require('assert');
var path = require('path');
diff --git a/test/browser.js b/test/browser.js
index ea199c477ed..184e442de95 100644
--- a/test/browser.js
+++ b/test/browser.js
@@ -42,6 +42,6 @@ app.get('/', function (req, res) {
});
});
-var server = app.listen(port, function () {
+app.listen(port, function () {
console.log('http://localhost:8887/');
}); \ No newline at end of file