Merge pull request #2484 from Microsoft/inlineSourceMaps

Inline source maps
This commit is contained in:
Mohamed Hegazy
2015-04-27 10:47:32 -07:00
29 changed files with 756 additions and 29 deletions

View File

@@ -127,7 +127,8 @@ var harnessSources = [
"services/documentRegistry.ts",
"services/preProcessFile.ts",
"services/patternMatcher.ts",
"versionCache.ts"
"versionCache.ts",
"convertToBase64.ts"
].map(function (f) {
return path.join(unittestsDirectory, f);
})).concat([

View File

@@ -30,6 +30,14 @@ module ts {
type: "boolean",
description: Diagnostics.Print_this_message,
},
{
name: "inlineSourceMap",
type: "boolean",
},
{
name: "inlineSources",
type: "boolean",
},
{
name: "listFiles",
type: "boolean",

View File

@@ -454,6 +454,10 @@ module ts {
Option_noEmitOnError_cannot_be_specified_with_option_separateCompilation: { code: 5045, category: DiagnosticCategory.Error, key: "Option 'noEmitOnError' cannot be specified with option 'separateCompilation'." },
Option_out_cannot_be_specified_with_option_separateCompilation: { code: 5046, category: DiagnosticCategory.Error, key: "Option 'out' cannot be specified with option 'separateCompilation'." },
Option_separateCompilation_can_only_be_used_when_either_option_module_is_provided_or_option_target_is_ES6_or_higher: { code: 5047, category: DiagnosticCategory.Error, key: "Option 'separateCompilation' can only be used when either option'--module' is provided or option 'target' is 'ES6' or higher." },
Option_sourceMap_cannot_be_specified_with_option_inlineSourceMap: { code: 5048, category: DiagnosticCategory.Error, key: "Option 'sourceMap' cannot be specified with option 'inlineSourceMap'." },
Option_sourceRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5049, category: DiagnosticCategory.Error, key: "Option 'sourceRoot' cannot be specified with option 'inlineSourceMap'." },
Option_mapRoot_cannot_be_specified_with_option_inlineSourceMap: { code: 5050, category: DiagnosticCategory.Error, key: "Option 'mapRoot' cannot be specified with option 'inlineSourceMap'." },
Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided: { code: 5051, category: DiagnosticCategory.Error, key: "Option 'inlineSources' can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided." },
Concatenate_and_emit_output_to_single_file: { code: 6001, category: DiagnosticCategory.Message, key: "Concatenate and emit output to single file." },
Generates_corresponding_d_ts_file: { code: 6002, category: DiagnosticCategory.Message, key: "Generates corresponding '.d.ts' file." },
Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: { code: 6003, category: DiagnosticCategory.Message, key: "Specifies the location where debugger should locate map files instead of generated locations." },

View File

@@ -1804,6 +1804,23 @@
"category": "Error",
"code": 5047
},
"Option 'sourceMap' cannot be specified with option 'inlineSourceMap'.": {
"category": "Error",
"code": 5048
},
"Option 'sourceRoot' cannot be specified with option 'inlineSourceMap'.": {
"category": "Error",
"code": 5049
},
"Option 'mapRoot' cannot be specified with option 'inlineSourceMap'.": {
"category": "Error",
"code": 5050
},
"Option 'inlineSources' can only be used when either option '--inlineSourceMap' or option '--sourceMap' is provided.": {
"category": "Error",
"code": 5051
},
"Concatenate and emit output to single file.": {
"category": "Message",
"code": 6001

View File

@@ -57,7 +57,7 @@ if (typeof __param !== "function") __param = function (paramIndex, decorator) {
let compilerOptions = host.getCompilerOptions();
let languageVersion = compilerOptions.target || ScriptTarget.ES3;
let sourceMapDataList: SourceMapData[] = compilerOptions.sourceMap ? [] : undefined;
let sourceMapDataList: SourceMapData[] = compilerOptions.sourceMap || compilerOptions.inlineSourceMap ? [] : undefined;
let diagnostics: Diagnostic[] = [];
let newLine = host.getNewLine();
@@ -181,7 +181,7 @@ if (typeof __param !== "function") __param = function (paramIndex, decorator) {
/** Sourcemap data that will get encoded */
let sourceMapData: SourceMapData;
if (compilerOptions.sourceMap) {
if (compilerOptions.sourceMap || compilerOptions.inlineSourceMap) {
initializeEmitterWithSourceMaps();
}
@@ -506,6 +506,13 @@ if (typeof __param !== "function") __param = function (paramIndex, decorator) {
// The one that can be used from program to get the actual source file
sourceMapData.inputSourceFileNames.push(node.fileName);
if (compilerOptions.inlineSources) {
if (!sourceMapData.sourceMapSourcesContent) {
sourceMapData.sourceMapSourcesContent = [];
}
sourceMapData.sourceMapSourcesContent.push(node.text);
}
}
function recordScopeNameOfNode(node: Node, scopeName?: string) {
@@ -577,19 +584,25 @@ if (typeof __param !== "function") __param = function (paramIndex, decorator) {
recordSourceMapSpan(comment.end);
}
function serializeSourceMapContents(version: number, file: string, sourceRoot: string, sources: string[], names: string[], mappings: string) {
function serializeSourceMapContents(version: number, file: string, sourceRoot: string, sources: string[], names: string[], mappings: string, sourcesContent?: string[]) {
if (typeof JSON !== "undefined") {
return JSON.stringify({
version: version,
file: file,
sourceRoot: sourceRoot,
sources: sources,
names: names,
mappings: mappings
});
let map: any = {
version,
file,
sourceRoot,
sources,
names,
mappings
};
if (sourcesContent !== undefined) {
map.sourcesContent = sourcesContent;
}
return JSON.stringify(map);
}
return "{\"version\":" + version + ",\"file\":\"" + escapeString(file) + "\",\"sourceRoot\":\"" + escapeString(sourceRoot) + "\",\"sources\":[" + serializeStringArray(sources) + "],\"names\":[" + serializeStringArray(names) + "],\"mappings\":\"" + escapeString(mappings) + "\"}";
return "{\"version\":" + version + ",\"file\":\"" + escapeString(file) + "\",\"sourceRoot\":\"" + escapeString(sourceRoot) + "\",\"sources\":[" + serializeStringArray(sources) + "],\"names\":[" + serializeStringArray(names) + "],\"mappings\":\"" + escapeString(mappings) + "\" " + (sourcesContent !== undefined ? ",\"sourcesContent\":[" + serializeStringArray(sourcesContent) + "]" : "") + "}";
function serializeStringArray(list: string[]): string {
let output = "";
@@ -604,19 +617,33 @@ if (typeof __param !== "function") __param = function (paramIndex, decorator) {
}
function writeJavaScriptAndSourceMapFile(emitOutput: string, writeByteOrderMark: boolean) {
// Write source map file
encodeLastRecordedSourceMapSpan();
writeFile(host, diagnostics, sourceMapData.sourceMapFilePath, serializeSourceMapContents(
let sourceMapText = serializeSourceMapContents(
3,
sourceMapData.sourceMapFile,
sourceMapData.sourceMapSourceRoot,
sourceMapData.sourceMapSources,
sourceMapData.sourceMapNames,
sourceMapData.sourceMapMappings), /*writeByteOrderMark*/ false);
sourceMapData.sourceMapMappings,
sourceMapData.sourceMapSourcesContent);
sourceMapDataList.push(sourceMapData);
let sourceMapUrl: string;
if (compilerOptions.inlineSourceMap) {
// Encode the sourceMap into the sourceMap url
let base64SourceMapText = convertToBase64(sourceMapText);
sourceMapUrl = `//# sourceMappingURL=data:application/json;base64,${base64SourceMapText}`;
}
else {
// Write source map file
writeFile(host, diagnostics, sourceMapData.sourceMapFilePath, sourceMapText, /*writeByteOrderMark*/ false);
sourceMapUrl = `//# sourceMappingURL=${sourceMapData.jsSourceMappingURL}`;
}
// Write sourcemap url to the js file and write the js file
writeJavaScriptFile(emitOutput + "//# sourceMappingURL=" + sourceMapData.jsSourceMappingURL, writeByteOrderMark);
writeJavaScriptFile(emitOutput + sourceMapUrl, writeByteOrderMark);
}
// Initialize source map data
@@ -630,6 +657,7 @@ if (typeof __param !== "function") __param = function (paramIndex, decorator) {
inputSourceFileNames: [],
sourceMapNames: [],
sourceMapMappings: "",
sourceMapSourcesContent: undefined,
sourceMapDecodedMappings: []
};
@@ -874,7 +902,7 @@ if (typeof __param !== "function") __param = function (paramIndex, decorator) {
function emitLiteral(node: LiteralExpression) {
let text = getLiteralText(node);
if (compilerOptions.sourceMap && (node.kind === SyntaxKind.StringLiteral || isTemplateLiteralKind(node.kind))) {
if ((compilerOptions.sourceMap || compilerOptions.inlineSourceMap) && (node.kind === SyntaxKind.StringLiteral || isTemplateLiteralKind(node.kind))) {
writer.writeLiteral(text);
}
// For versions below ES6, emit binary & octal literals in their canonical decimal form.

View File

@@ -534,6 +534,25 @@ module ts {
}
}
if (options.inlineSourceMap) {
if (options.sourceMap) {
diagnostics.add(createCompilerDiagnostic(Diagnostics.Option_sourceMap_cannot_be_specified_with_option_inlineSourceMap));
}
if (options.mapRoot) {
diagnostics.add(createCompilerDiagnostic(Diagnostics.Option_mapRoot_cannot_be_specified_with_option_inlineSourceMap));
}
if (options.sourceRoot) {
diagnostics.add(createCompilerDiagnostic(Diagnostics.Option_sourceRoot_cannot_be_specified_with_option_inlineSourceMap));
}
}
if (options.inlineSources) {
if (!options.sourceMap && !options.inlineSourceMap) {
diagnostics.add(createCompilerDiagnostic(Diagnostics.Option_inlineSources_can_only_be_used_when_either_option_inlineSourceMap_or_option_sourceMap_is_provided));
}
}
if (!options.sourceMap && (options.mapRoot || options.sourceRoot)) {
// Error to specify --mapRoot or --sourceRoot without mapSourceFiles
if (options.mapRoot) {

View File

@@ -1096,14 +1096,15 @@ module ts {
}
export interface SourceMapData {
sourceMapFilePath: string; // Where the sourcemap file is written
jsSourceMappingURL: string; // source map URL written in the .js file
sourceMapFile: string; // Source map's file field - .js file name
sourceMapSourceRoot: string; // Source map's sourceRoot field - location where the sources will be present if not ""
sourceMapSources: string[]; // Source map's sources field - list of sources that can be indexed in this source map
inputSourceFileNames: string[]; // Input source file (which one can use on program to get the file), 1:1 mapping with the sourceMapSources list
sourceMapNames?: string[]; // Source map's names field - list of names that can be indexed in this source map
sourceMapMappings: string; // Source map's mapping field - encoded source map spans
sourceMapFilePath: string; // Where the sourcemap file is written
jsSourceMappingURL: string; // source map URL written in the .js file
sourceMapFile: string; // Source map's file field - .js file name
sourceMapSourceRoot: string; // Source map's sourceRoot field - location where the sources will be present if not ""
sourceMapSources: string[]; // Source map's sources field - list of sources that can be indexed in this source map
sourceMapSourcesContent?: string[]; // Source map's sourcesContent field - list of the sources' text to be embedded in the source map
inputSourceFileNames: string[]; // Input source file (which one can use on program to get the file), 1:1 mapping with the sourceMapSources list
sourceMapNames?: string[]; // Source map's names field - list of names that can be indexed in this source map
sourceMapMappings: string; // Source map's mapping field - encoded source map spans
sourceMapDecodedMappings: SourceMapSpan[]; // Raw source map spans that were encoded into the sourceMapMappings
}
@@ -1647,6 +1648,8 @@ module ts {
diagnostics?: boolean;
emitBOM?: boolean;
help?: boolean;
inlineSourceMap?: boolean;
inlineSources?: boolean;
listFiles?: boolean;
locale?: string;
mapRoot?: string;

View File

@@ -1695,6 +1695,83 @@ module ts {
export function getLocalSymbolForExportDefault(symbol: Symbol) {
return symbol && symbol.valueDeclaration && (symbol.valueDeclaration.flags & NodeFlags.Default) ? symbol.valueDeclaration.localSymbol : undefined;
}
/**
* Replace each instance of non-ascii characters by one, two, three, or four escape sequences
* representing the UTF-8 encoding of the character, and return the expanded char code list.
*/
function getExpandedCharCodes(input: string): number[] {
let output: number[] = [];
let length = input.length;
let leadSurrogate: number = undefined;
for (let i = 0; i < length; i++) {
let charCode = input.charCodeAt(i);
// handel utf8
if (charCode < 0x80) {
output.push(charCode);
}
else if (charCode < 0x800) {
output.push((charCode >> 6) | 0B11000000);
output.push((charCode & 0B00111111) | 0B10000000);
}
else if (charCode < 0x10000) {
output.push((charCode >> 12) | 0B11100000);
output.push(((charCode >> 6) & 0B00111111) | 0B10000000);
output.push((charCode & 0B00111111) | 0B10000000);
}
else if (charCode < 0x20000) {
output.push((charCode >> 18) | 0B11110000);
output.push(((charCode >> 12) & 0B00111111) | 0B10000000);
output.push(((charCode >> 6) & 0B00111111) | 0B10000000);
output.push((charCode & 0B00111111) | 0B10000000);
}
else {
Debug.assert(false, "Unexpected code point");
}
}
return output;
}
const base64Digits = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
/**
* Converts a string to a base-64 encoded ASCII string.
*/
export function convertToBase64(input: string): string {
var result = "";
let charCodes = getExpandedCharCodes(input);
let i = 0;
let length = charCodes.length;
let byte1: number, byte2: number, byte3: number, byte4: number;
while (i < length) {
// Convert every 6-bits in the input 3 character points
// into a base64 digit
byte1 = charCodes[i] >> 2;
byte2 = (charCodes[i] & 0B00000011) << 4 | charCodes[i + 1] >> 4;
byte3 = (charCodes[i + 1] & 0B00001111) << 2 | charCodes[i + 2] >> 6;
byte4 = charCodes[i + 2] & 0B00111111;
// We are out of characters in the input, set the extra
// digits to 64 (padding character).
if (i + 1 >= length) {
byte3 = byte4 = 64;
}
else if (i + 2 >= length) {
byte4 = 64;
}
// Write to the ouput
result += base64Digits.charAt(byte1) + base64Digits.charAt(byte2) + base64Digits.charAt(byte3) + base64Digits.charAt(byte4);
i += 3;
}
return result;
}
}
module ts {

View File

@@ -159,7 +159,7 @@ class CompilerBaselineRunner extends RunnerBase {
// Source maps?
it('Correct sourcemap content for ' + fileName, () => {
if (options.sourceMap) {
if (options.sourceMap || options.inlineSourceMap) {
Harness.Baseline.runBaseline('Correct sourcemap content for ' + fileName, justName.replace(/\.ts$/, '.sourcemap.txt'), () => {
var record = result.getSourceMapRecord();
if (options.noEmitOnError && result.errors.length !== 0 && record === undefined) {
@@ -228,7 +228,13 @@ class CompilerBaselineRunner extends RunnerBase {
});
it('Correct Sourcemap output for ' + fileName, () => {
if (options.sourceMap) {
if (options.inlineSourceMap) {
if (result.sourceMaps.length > 0) {
throw new Error('No sourcemap files should be generated if inlineSourceMaps was set.');
}
return null;
}
else if (options.sourceMap) {
if (result.sourceMaps.length !== result.files.length) {
throw new Error('Number of sourcemap files should be same as js files.');
}

View File

@@ -1020,6 +1020,10 @@ module Harness {
options.sourceRoot = setting.value;
break;
case 'maproot':
options.mapRoot = setting.value;
break;
case 'sourcemap':
options.sourceMap = !!setting.value;
break;
@@ -1073,6 +1077,14 @@ module Harness {
includeBuiltFiles.push({ unitName: builtFileName, content: normalizeLineEndings(IO.readFile(builtFileName), newLine) });
break;
case 'inlinesourcemap':
options.inlineSourceMap = setting.value === 'true';
break;
case 'inlinesources':
options.inlineSources = setting.value === 'true';
break;
default:
throw new Error('Unsupported compiler setting ' + setting.flag);
}
@@ -1469,7 +1481,8 @@ module Harness {
"noimplicitany", "noresolve", "newline", "newlines", "emitbom",
"errortruncation", "usecasesensitivefilenames", "preserveconstenums",
"includebuiltfile", "suppressimplicitanyindexerrors", "stripinternal",
"separatecompilation"];
"separatecompilation", "inlinesourcemap", "maproot", "sourceroot",
"inlinesources"];
function extractCompilerSettings(content: string): CompilerSetting[] {

View File

@@ -237,6 +237,9 @@ module Harness.SourceMapRecoder {
sourceMapRecoder.WriteLine("mapUrl: " + sourceMapData.jsSourceMappingURL);
sourceMapRecoder.WriteLine("sourceRoot: " + sourceMapData.sourceMapSourceRoot);
sourceMapRecoder.WriteLine("sources: " + sourceMapData.sourceMapSources);
if (sourceMapData.sourceMapSourcesContent) {
sourceMapRecoder.WriteLine("sourcesContent: " + JSON.stringify(sourceMapData.sourceMapSourcesContent));
}
sourceMapRecoder.WriteLine("===================================================================");
}

View File

@@ -0,0 +1,9 @@
tests/cases/compiler/inlineSourceMap.ts(3,1): error TS2304: Cannot find name 'console'.
==== tests/cases/compiler/inlineSourceMap.ts (1 errors) ====
var x = 0;
console.log(x);
~~~~~~~
!!! error TS2304: Cannot find name 'console'.

View File

@@ -0,0 +1,9 @@
//// [inlineSourceMap.ts]
var x = 0;
console.log(x);
//// [inlineSourceMap.js]
var x = 0;
console.log(x);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lU291cmNlTWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW5saW5lU291cmNlTWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMifQ==

View File

@@ -0,0 +1,61 @@
===================================================================
JsFile: inlineSourceMap.js
mapUrl: inlineSourceMap.js.map
sourceRoot:
sources: inlineSourceMap.ts
===================================================================
-------------------------------------------------------------------
emittedFile:tests/cases/compiler/inlineSourceMap.js
sourceFile:inlineSourceMap.ts
-------------------------------------------------------------------
>>>var x = 0;
1 >
2 >^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^->
1 >
>
2 >var
3 > x
4 > =
5 > 0
6 > ;
1 >Emitted(1, 1) Source(2, 1) + SourceIndex(0)
2 >Emitted(1, 5) Source(2, 5) + SourceIndex(0)
3 >Emitted(1, 6) Source(2, 6) + SourceIndex(0)
4 >Emitted(1, 9) Source(2, 9) + SourceIndex(0)
5 >Emitted(1, 10) Source(2, 10) + SourceIndex(0)
6 >Emitted(1, 11) Source(2, 11) + SourceIndex(0)
---
>>>console.log(x);
1->
2 >^^^^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^
8 > ^
9 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1->
>
2 >console
3 > .
4 > log
5 > (
6 > x
7 > )
8 > ;
1->Emitted(2, 1) Source(3, 1) + SourceIndex(0)
2 >Emitted(2, 8) Source(3, 8) + SourceIndex(0)
3 >Emitted(2, 9) Source(3, 9) + SourceIndex(0)
4 >Emitted(2, 12) Source(3, 12) + SourceIndex(0)
5 >Emitted(2, 13) Source(3, 13) + SourceIndex(0)
6 >Emitted(2, 14) Source(3, 14) + SourceIndex(0)
7 >Emitted(2, 15) Source(3, 15) + SourceIndex(0)
8 >Emitted(2, 16) Source(3, 16) + SourceIndex(0)
---
>>>//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5saW5lU291cmNlTWFwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiaW5saW5lU291cmNlTWFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMifQ==

View File

@@ -0,0 +1,17 @@
error TS5050: Option 'mapRoot' cannot be specified with option 'inlineSourceMap'.
error TS5049: Option 'sourceRoot' cannot be specified with option 'inlineSourceMap'.
error TS5048: Option 'sourceMap' cannot be specified with option 'inlineSourceMap'.
tests/cases/compiler/inlineSourceMap2.ts(5,1): error TS2304: Cannot find name 'console'.
!!! error TS5050: Option 'mapRoot' cannot be specified with option 'inlineSourceMap'.
!!! error TS5049: Option 'sourceRoot' cannot be specified with option 'inlineSourceMap'.
!!! error TS5048: Option 'sourceMap' cannot be specified with option 'inlineSourceMap'.
==== tests/cases/compiler/inlineSourceMap2.ts (1 errors) ====
// configuration errors
var x = 0;
console.log(x);
~~~~~~~
!!! error TS2304: Cannot find name 'console'.

View File

@@ -0,0 +1,12 @@
//// [inlineSourceMap2.ts]
// configuration errors
var x = 0;
console.log(x);
//// [outfile.js]
// configuration errors
var x = 0;
console.log(x);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0ZmlsZS5qcyIsInNvdXJjZVJvb3QiOiJmaWxlOi8vL2ZvbGRlci8iLCJzb3VyY2VzIjpbImlubGluZVNvdXJjZU1hcDIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsdUJBQXVCO0FBRXZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMifQ==

View File

@@ -0,0 +1,71 @@
===================================================================
JsFile: outfile.js
mapUrl: file:///folder/outfile.js.map
sourceRoot: file:///folder/
sources: inlineSourceMap2.ts
===================================================================
-------------------------------------------------------------------
emittedFile:outfile.js
sourceFile:inlineSourceMap2.ts
-------------------------------------------------------------------
>>>// configuration errors
1 >
2 >^^^^^^^^^^^^^^^^^^^^^^^
1 >
>
2 >// configuration errors
1 >Emitted(1, 1) Source(2, 1) + SourceIndex(0)
2 >Emitted(1, 24) Source(2, 24) + SourceIndex(0)
---
>>>var x = 0;
1 >
2 >^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^->
1 >
>
>
2 >var
3 > x
4 > =
5 > 0
6 > ;
1 >Emitted(2, 1) Source(4, 1) + SourceIndex(0)
2 >Emitted(2, 5) Source(4, 5) + SourceIndex(0)
3 >Emitted(2, 6) Source(4, 6) + SourceIndex(0)
4 >Emitted(2, 9) Source(4, 9) + SourceIndex(0)
5 >Emitted(2, 10) Source(4, 10) + SourceIndex(0)
6 >Emitted(2, 11) Source(4, 11) + SourceIndex(0)
---
>>>console.log(x);
1->
2 >^^^^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^
8 > ^
9 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1->
>
2 >console
3 > .
4 > log
5 > (
6 > x
7 > )
8 > ;
1->Emitted(3, 1) Source(5, 1) + SourceIndex(0)
2 >Emitted(3, 8) Source(5, 8) + SourceIndex(0)
3 >Emitted(3, 9) Source(5, 9) + SourceIndex(0)
4 >Emitted(3, 12) Source(5, 12) + SourceIndex(0)
5 >Emitted(3, 13) Source(5, 13) + SourceIndex(0)
6 >Emitted(3, 14) Source(5, 14) + SourceIndex(0)
7 >Emitted(3, 15) Source(5, 15) + SourceIndex(0)
8 >Emitted(3, 16) Source(5, 16) + SourceIndex(0)
---
>>>//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0ZmlsZS5qcyIsInNvdXJjZVJvb3QiOiJmaWxlOi8vL2ZvbGRlci8iLCJzb3VyY2VzIjpbImlubGluZVNvdXJjZU1hcDIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsdUJBQXVCO0FBRXZCLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMifQ==

View File

@@ -0,0 +1,16 @@
tests/cases/compiler/a.ts(3,1): error TS2304: Cannot find name 'console'.
tests/cases/compiler/b.ts(2,1): error TS2304: Cannot find name 'console'.
==== tests/cases/compiler/a.ts (1 errors) ====
var a = 0;
console.log(a);
~~~~~~~
!!! error TS2304: Cannot find name 'console'.
==== tests/cases/compiler/b.ts (1 errors) ====
var b = 0;
console.log(b);
~~~~~~~
!!! error TS2304: Cannot find name 'console'.

View File

@@ -0,0 +1,17 @@
//// [tests/cases/compiler/inlineSources.ts] ////
//// [a.ts]
var a = 0;
console.log(a);
//// [b.ts]
var b = 0;
console.log(b);
//// [out.js]
var a = 0;
console.log(a);
var b = 0;
console.log(b);
//# sourceMappingURL=out.js.map

View File

@@ -0,0 +1,2 @@
//// [out.js.map]
{"version":3,"file":"out.js","sourceRoot":"","sources":["tests/cases/compiler/a.ts","tests/cases/compiler/b.ts"],"names":[],"mappings":"AACA,IAAI,CAAC,GAAG,CAAC,CAAC;AACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;ACFf,IAAI,CAAC,GAAG,CAAC,CAAC;AACV,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC","sourcesContent":["\nvar a = 0;\nconsole.log(a);\n","var b = 0;\nconsole.log(b);"]}

View File

@@ -0,0 +1,114 @@
===================================================================
JsFile: out.js
mapUrl: out.js.map
sourceRoot:
sources: tests/cases/compiler/a.ts,tests/cases/compiler/b.ts
sourcesContent: ["\nvar a = 0;\nconsole.log(a);\n","var b = 0;\nconsole.log(b);"]
===================================================================
-------------------------------------------------------------------
emittedFile:out.js
sourceFile:tests/cases/compiler/a.ts
-------------------------------------------------------------------
>>>var a = 0;
1 >
2 >^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^->
1 >
>
2 >var
3 > a
4 > =
5 > 0
6 > ;
1 >Emitted(1, 1) Source(2, 1) + SourceIndex(0)
2 >Emitted(1, 5) Source(2, 5) + SourceIndex(0)
3 >Emitted(1, 6) Source(2, 6) + SourceIndex(0)
4 >Emitted(1, 9) Source(2, 9) + SourceIndex(0)
5 >Emitted(1, 10) Source(2, 10) + SourceIndex(0)
6 >Emitted(1, 11) Source(2, 11) + SourceIndex(0)
---
>>>console.log(a);
1->
2 >^^^^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^
8 > ^
1->
>
2 >console
3 > .
4 > log
5 > (
6 > a
7 > )
8 > ;
1->Emitted(2, 1) Source(3, 1) + SourceIndex(0)
2 >Emitted(2, 8) Source(3, 8) + SourceIndex(0)
3 >Emitted(2, 9) Source(3, 9) + SourceIndex(0)
4 >Emitted(2, 12) Source(3, 12) + SourceIndex(0)
5 >Emitted(2, 13) Source(3, 13) + SourceIndex(0)
6 >Emitted(2, 14) Source(3, 14) + SourceIndex(0)
7 >Emitted(2, 15) Source(3, 15) + SourceIndex(0)
8 >Emitted(2, 16) Source(3, 16) + SourceIndex(0)
---
-------------------------------------------------------------------
emittedFile:out.js
sourceFile:tests/cases/compiler/b.ts
-------------------------------------------------------------------
>>>var b = 0;
1 >
2 >^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^->
1 >
2 >var
3 > b
4 > =
5 > 0
6 > ;
1 >Emitted(3, 1) Source(1, 1) + SourceIndex(1)
2 >Emitted(3, 5) Source(1, 5) + SourceIndex(1)
3 >Emitted(3, 6) Source(1, 6) + SourceIndex(1)
4 >Emitted(3, 9) Source(1, 9) + SourceIndex(1)
5 >Emitted(3, 10) Source(1, 10) + SourceIndex(1)
6 >Emitted(3, 11) Source(1, 11) + SourceIndex(1)
---
>>>console.log(b);
1->
2 >^^^^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^
8 > ^
9 > ^^^^^^^^^^^^^^^->
1->
>
2 >console
3 > .
4 > log
5 > (
6 > b
7 > )
8 > ;
1->Emitted(4, 1) Source(2, 1) + SourceIndex(1)
2 >Emitted(4, 8) Source(2, 8) + SourceIndex(1)
3 >Emitted(4, 9) Source(2, 9) + SourceIndex(1)
4 >Emitted(4, 12) Source(2, 12) + SourceIndex(1)
5 >Emitted(4, 13) Source(2, 13) + SourceIndex(1)
6 >Emitted(4, 14) Source(2, 14) + SourceIndex(1)
7 >Emitted(4, 15) Source(2, 15) + SourceIndex(1)
8 >Emitted(4, 16) Source(2, 16) + SourceIndex(1)
---
>>>//# sourceMappingURL=out.js.map

View File

@@ -0,0 +1,16 @@
tests/cases/compiler/a.ts(3,1): error TS2304: Cannot find name 'console'.
tests/cases/compiler/b.ts(2,1): error TS2304: Cannot find name 'console'.
==== tests/cases/compiler/a.ts (1 errors) ====
var a = 0;
console.log(a);
~~~~~~~
!!! error TS2304: Cannot find name 'console'.
==== tests/cases/compiler/b.ts (1 errors) ====
var b = 0;
console.log(b);
~~~~~~~
!!! error TS2304: Cannot find name 'console'.

View File

@@ -0,0 +1,17 @@
//// [tests/cases/compiler/inlineSources2.ts] ////
//// [a.ts]
var a = 0;
console.log(a);
//// [b.ts]
var b = 0;
console.log(b);
//// [out.js]
var a = 0;
console.log(a);
var b = 0;
console.log(b);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGVzdHMvY2FzZXMvY29tcGlsZXIvYS50cyIsInRlc3RzL2Nhc2VzL2NvbXBpbGVyL2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQ0ZmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbnZhciBhID0gMDtcbmNvbnNvbGUubG9nKGEpO1xuIiwidmFyIGIgPSAwO1xuY29uc29sZS5sb2coYik7Il19

View File

@@ -0,0 +1,114 @@
===================================================================
JsFile: out.js
mapUrl: out.js.map
sourceRoot:
sources: tests/cases/compiler/a.ts,tests/cases/compiler/b.ts
sourcesContent: ["\nvar a = 0;\nconsole.log(a);\n","var b = 0;\nconsole.log(b);"]
===================================================================
-------------------------------------------------------------------
emittedFile:out.js
sourceFile:tests/cases/compiler/a.ts
-------------------------------------------------------------------
>>>var a = 0;
1 >
2 >^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^->
1 >
>
2 >var
3 > a
4 > =
5 > 0
6 > ;
1 >Emitted(1, 1) Source(2, 1) + SourceIndex(0)
2 >Emitted(1, 5) Source(2, 5) + SourceIndex(0)
3 >Emitted(1, 6) Source(2, 6) + SourceIndex(0)
4 >Emitted(1, 9) Source(2, 9) + SourceIndex(0)
5 >Emitted(1, 10) Source(2, 10) + SourceIndex(0)
6 >Emitted(1, 11) Source(2, 11) + SourceIndex(0)
---
>>>console.log(a);
1->
2 >^^^^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^
8 > ^
1->
>
2 >console
3 > .
4 > log
5 > (
6 > a
7 > )
8 > ;
1->Emitted(2, 1) Source(3, 1) + SourceIndex(0)
2 >Emitted(2, 8) Source(3, 8) + SourceIndex(0)
3 >Emitted(2, 9) Source(3, 9) + SourceIndex(0)
4 >Emitted(2, 12) Source(3, 12) + SourceIndex(0)
5 >Emitted(2, 13) Source(3, 13) + SourceIndex(0)
6 >Emitted(2, 14) Source(3, 14) + SourceIndex(0)
7 >Emitted(2, 15) Source(3, 15) + SourceIndex(0)
8 >Emitted(2, 16) Source(3, 16) + SourceIndex(0)
---
-------------------------------------------------------------------
emittedFile:out.js
sourceFile:tests/cases/compiler/b.ts
-------------------------------------------------------------------
>>>var b = 0;
1 >
2 >^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^^^^^^->
1 >
2 >var
3 > b
4 > =
5 > 0
6 > ;
1 >Emitted(3, 1) Source(1, 1) + SourceIndex(1)
2 >Emitted(3, 5) Source(1, 5) + SourceIndex(1)
3 >Emitted(3, 6) Source(1, 6) + SourceIndex(1)
4 >Emitted(3, 9) Source(1, 9) + SourceIndex(1)
5 >Emitted(3, 10) Source(1, 10) + SourceIndex(1)
6 >Emitted(3, 11) Source(1, 11) + SourceIndex(1)
---
>>>console.log(b);
1->
2 >^^^^^^^
3 > ^
4 > ^^^
5 > ^
6 > ^
7 > ^
8 > ^
9 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^->
1->
>
2 >console
3 > .
4 > log
5 > (
6 > b
7 > )
8 > ;
1->Emitted(4, 1) Source(2, 1) + SourceIndex(1)
2 >Emitted(4, 8) Source(2, 8) + SourceIndex(1)
3 >Emitted(4, 9) Source(2, 9) + SourceIndex(1)
4 >Emitted(4, 12) Source(2, 12) + SourceIndex(1)
5 >Emitted(4, 13) Source(2, 13) + SourceIndex(1)
6 >Emitted(4, 14) Source(2, 14) + SourceIndex(1)
7 >Emitted(4, 15) Source(2, 15) + SourceIndex(1)
8 >Emitted(4, 16) Source(2, 16) + SourceIndex(1)
---
>>>//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsidGVzdHMvY2FzZXMvY29tcGlsZXIvYS50cyIsInRlc3RzL2Nhc2VzL2NvbXBpbGVyL2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQ0ZmLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbnZhciBhID0gMDtcbmNvbnNvbGUubG9nKGEpO1xuIiwidmFyIGIgPSAwO1xuY29uc29sZS5sb2coYik7Il19

View File

@@ -0,0 +1,5 @@
// @target: ES3
// @inlinesourcemap: true
var x = 0;
console.log(x);

View File

@@ -0,0 +1,11 @@
// @target: ES3
// @sourcemap: true
// @maproot: file:///folder
// @sourceroot: file:///folder
// @out: outfile.js
// @inlinesourcemap: true
// configuration errors
var x = 0;
console.log(x);

View File

@@ -0,0 +1,12 @@
// @target: ES3
// @sourcemap: true
// @inlinesources: true
// @out: out.js
// @filename: a.ts
var a = 0;
console.log(a);
// @filename: b.ts
var b = 0;
console.log(b);

View File

@@ -0,0 +1,12 @@
// @target: ES3
// @inlinesourcemap: true
// @inlinesources: true
// @out: out.js
// @filename: a.ts
var a = 0;
console.log(a);
// @filename: b.ts
var b = 0;
console.log(b);

View File

@@ -0,0 +1,33 @@
/// <reference path="..\..\..\src\harness\harness.ts" />
module ts {
describe('convertToBase64', () => {
function runTest(input: string): void {
var actual = ts.convertToBase64(input);
var expected = new Buffer(input).toString("base64");
assert.equal(actual, expected, "Encoded string using convertToBase64 does not match buffer.toString('base64')");
}
it("Converts ASCII charaters correctelly", () => {
runTest(" !\"#$ %&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~");
});
it("Converts escape sequences correctelly", () => {
runTest("\t\n\r\\\"\'\u0062");
});
it("Converts simple unicode characters correctelly", () => {
runTest("ΠΣ ٵپ औठ ⺐⺠");
});
it("Converts simple code snippit correctelly", () => {
runTest(`/// <reference path="file.ts" />
var x: string = "string";
console.log(x);`);
});
it("Converts simple code snippit with unicode characters correctelly", () => {
runTest(`var Π = 3.1415; console.log(Π);`);
});
});
}