From c0a5af3e349b11f3f6016ee41705efd82b58ac1a Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 12:11:33 +0100 Subject: [PATCH 01/24] Add typescript lib as an option & use it in Project --- lib/main.ts | 2 ++ lib/project.ts | 14 ++++++++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/main.ts b/lib/main.ts index 4ed4100c..bfd77a8b 100644 --- a/lib/main.ts +++ b/lib/main.ts @@ -189,6 +189,8 @@ module compile { noExternalResolve?: boolean; sortOutput?: boolean; + + typescript?: typeof ts; } export interface FilterSettings { referencedFrom: string[]; diff --git a/lib/project.ts b/lib/project.ts index 50fc07e1..f6907409 100644 --- a/lib/project.ts +++ b/lib/project.ts @@ -35,6 +35,12 @@ export class Project { ts: undefined }; + /** + * The TypeScript library that is used for this project. + * Can also be jsx-typescript for example. + */ + typescript: typeof ts; + filterSettings: main.FilterSettings; /** @@ -88,7 +94,7 @@ export class Project { host: host.Host; program: ts.Program; - constructor(options: ts.CompilerOptions, noExternalResolve: boolean, sortOutput: boolean) { + constructor(options: ts.CompilerOptions, noExternalResolve: boolean, sortOutput: boolean, typescript = ts) { this.options = options; this.noExternalResolve = noExternalResolve; @@ -248,7 +254,7 @@ export class Project { private resolve(session: { tasks: number; callback: () => void; }, file: FileData) { var references = file.ts.referencedFiles.map(item => path.join(path.dirname(file.ts.filename), item.filename)); - ts.forEachChild(file.ts, (node) => { + this.typescript.forEachChild(file.ts, (node) => { if (node.kind === ts.SyntaxKind.ImportDeclaration) { var importNode = node; @@ -352,7 +358,7 @@ export class Project { this.host = new host.Host(this.currentFiles[0] ? this.currentFiles[0].file.cwd : '', files, !this.noExternalResolve); // Creating a program compiles the sources - this.program = ts.createProgram(rootFilenames, this.options, this.host); + this.program = this.typescript.createProgram(rootFilenames, this.options, this.host); var errors = this.program.getDiagnostics(); @@ -495,7 +501,7 @@ export class Project { filename: Project.normalizePath(filename), originalFilename: filename, content: content, - ts: ts.createSourceFile(filename, content, this.options.target, this.version + '') + ts: this.typescript.createSourceFile(filename, content, this.options.target, this.version + '') }; } From 236db59796763fa0a6adfc5297ba3819752ce772 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 12:44:44 +0100 Subject: [PATCH 02/24] Implement custom typescript lib --- lib/host.ts | 31 ++++++++++++++++++++++++------- lib/main.ts | 4 ++-- lib/project.ts | 3 ++- 3 files changed, 28 insertions(+), 10 deletions(-) diff --git a/lib/host.ts b/lib/host.ts index d7177ff4..0fde36c1 100644 --- a/lib/host.ts +++ b/lib/host.ts @@ -7,24 +7,42 @@ import fs = require('fs'); import path = require('path'); export class Host implements ts.CompilerHost { - static libDefault: ts.SourceFile; - static initLibDefault() { - var content = fs.readFileSync(path.resolve(path.dirname(require.resolve('typescript')) + '/lib.d.ts')).toString('utf8'); - this.libDefault = ts.createSourceFile('__lib.d.ts', content, ts.ScriptTarget.ES3, "0"); // Will also work for ES5 & 6 + static libDefault: project.Map = {}; + static getLibDefault(typescript: typeof ts) { + var filename: string; + for (var i in require.cache) { + if (!Object.prototype.hasOwnProperty.call(require.cache, i)) continue; + + if (require.cache[i].exports === typescript) { + filename = i; + } + } + + if (filename === undefined) return undefined; // Not found + if (this.libDefault[filename]) return this.libDefault[filename]; // Already loaded + + var content = fs.readFileSync(path.resolve(path.dirname(filename) + '/lib.d.ts')).toString('utf8'); + return this.libDefault[filename] = ts.createSourceFile('__lib.d.ts', content, ts.ScriptTarget.ES3, "0"); // Will also work for ES5 & 6 } + typescript: typeof ts; + private currentDirectory: string; private files: project.Map; private externalResolve: boolean; output: project.Map; - constructor(currentDirectory: string, files: project.Map, externalResolve: boolean) { + constructor(typescript: typeof ts, currentDirectory: string, files: project.Map, externalResolve: boolean) { + this.typescript = typescript; + this.currentDirectory = currentDirectory; this.files = files; this.externalResolve = externalResolve; this.reset(); + + } private reset() { @@ -64,7 +82,7 @@ export class Host implements ts.CompilerHost { return this.files[normalizedFilename].ts; } } else if (normalizedFilename === '__lib.d.ts') { - return Host.libDefault; + return Host.getLibDefault(this.typescript); } else { if (this.externalResolve) { try { @@ -91,4 +109,3 @@ export class Host implements ts.CompilerHost { return this.files[project.Project.normalizePath(filename)]; } } -Host.initLibDefault(); diff --git a/lib/main.ts b/lib/main.ts index bfd77a8b..59051d1e 100644 --- a/lib/main.ts +++ b/lib/main.ts @@ -99,7 +99,7 @@ function compile(param?: any, filters?: compile.FilterSettings, theReporter?: _r if (param instanceof project.Project) { proj = param; } else { - proj = new project.Project(getCompilerOptions(param || {}), (param && param.noExternalResolve) || false, (param && param.sortOutput) || false); + proj = new project.Project(getCompilerOptions(param || {}), (param && param.noExternalResolve) || false, (param && param.sortOutput) || false, (param && param.typescript) || undefined); } proj.reset(); @@ -198,7 +198,7 @@ module compile { export import Project = project.Project; export import reporter = _reporter; export function createProject(settings: Settings): Project { - return new Project(getCompilerOptions(settings), settings.noExternalResolve ? true : false, settings.sortOutput ? true : false); + return new Project(getCompilerOptions(settings), settings.noExternalResolve ? true : false, settings.sortOutput ? true : false, settings.typescript); } export function filter(project: Project, filters: FilterSettings): NodeJS.ReadWriteStream { diff --git a/lib/project.ts b/lib/project.ts index f6907409..33186006 100644 --- a/lib/project.ts +++ b/lib/project.ts @@ -95,6 +95,7 @@ export class Project { program: ts.Program; constructor(options: ts.CompilerOptions, noExternalResolve: boolean, sortOutput: boolean, typescript = ts) { + this.typescript = typescript; this.options = options; this.noExternalResolve = noExternalResolve; @@ -355,7 +356,7 @@ export class Project { } } - this.host = new host.Host(this.currentFiles[0] ? this.currentFiles[0].file.cwd : '', files, !this.noExternalResolve); + this.host = new host.Host(this.typescript, this.currentFiles[0] ? this.currentFiles[0].file.cwd : '', files, !this.noExternalResolve); // Creating a program compiles the sources this.program = this.typescript.createProgram(rootFilenames, this.options, this.host); From 30c66cc58c8b6aaefee1cf65f62c9a931359d10e Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 18:37:12 +0100 Subject: [PATCH 03/24] Prepare tests for multiple typescript libs --- gulpfile.js | 34 +++++++++++++++++--------- test/basic/gulptask.js | 11 +++++---- test/errorReporting/gulptask.js | 10 ++++---- test/externalResolve/gulptask.js | 11 +++++---- test/filter-referencedFrom/gulptask.js | 9 ++++--- 5 files changed, 45 insertions(+), 30 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 9bc915c7..f8c41fc5 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -49,19 +49,31 @@ gulp.task('scripts', ['clean'], function() { function runTest(name, callback) { var newTS = require('./release-2/main'); + var libs = [ + ['default', undefined], + // ['jsx', require('jsx-typescript')] TODO: Add jsx-typescript here. It currently throws an error when adding it. + ]; var test = require('./test/' + name + '/gulptask.js'); - test(newTS).on('finish', function() { - function onError(error) { - console.error('Test ' + name + ' failed: ' + error.message); - } - gulp.src('test/output/' + name + '/**') - .pipe(diff('test/baselines/' + name)) - .on('error', onError) - .pipe(diff.reporter({ fail: true })) - .on('error', onError) - .on('finish', callback); - }); + for (var i = 0; i < libs.length; i++) { + var lib = libs[i]; + var output = 'test/output/' + name + '/' + lib[0] + '/'; + var errors = []; + test(newTS, lib[1], output).on('error', function(err) { + errors.push(err); + }).on('finish', function() { + fs.writeFileSync(output + 'errors.txt', errors); + function onError(error) { + console.error('Test ' + name + ' failed: ' + error.message); + } + gulp.src('test/output/' + name + '/**') + .pipe(diff('test/baselines/' + name)) + .on('error', onError) + .pipe(diff.reporter({ fail: true })) + .on('error', onError) + .on('finish', callback); + }); + } } gulp.task('test', ['clean-test', 'scripts'], function(cb) { diff --git a/test/basic/gulptask.js b/test/basic/gulptask.js index 8d35e5b9..08aab247 100644 --- a/test/basic/gulptask.js +++ b/test/basic/gulptask.js @@ -1,18 +1,19 @@ var gulp = require('gulp'); var sourcemaps = require('gulp-sourcemaps'); -module.exports = function(newTS) { +module.exports = function(newTS, lib, output) { var tsResult = gulp.src('test/basic/*.ts') .pipe(newTS({ declarationFiles: true, module: 'amd', noExternalResolve: true, - sourceRoot: '' + sourceRoot: '', + typescript: lib })); // tsResult.map.pipe(gulp.dest('test/output/test-3/map')); - tsResult.dts.pipe(gulp.dest('test/output/basic/dts')); + tsResult.dts.pipe(gulp.dest(output + '/dts')); return tsResult.js - .pipe(sourcemaps.write({ includeContent: false, sourceRoot: '../../../basic/' })) - .pipe(gulp.dest('test/output/basic/js')); + .pipe(sourcemaps.write({ includeContent: false, sourceRoot: '../../../../basic/' })) + .pipe(gulp.dest(output + '/js')); } diff --git a/test/errorReporting/gulptask.js b/test/errorReporting/gulptask.js index 45c5b362..7bc8f9f4 100644 --- a/test/errorReporting/gulptask.js +++ b/test/errorReporting/gulptask.js @@ -1,10 +1,10 @@ var gulp = require('gulp'); var sourcemaps = require('gulp-sourcemaps'); -module.exports = function(newTS) { +module.exports = function(newTS, lib, output) { var errors = 0; var tsResult = gulp.src('test/errorReporting/*.ts') - .pipe(newTS(undefined, undefined, newTS.reporter.nullReporter())); + .pipe(newTS({ typescript: lib }, undefined, newTS.reporter.nullReporter())); tsResult.on('error', function(err) { errors++; @@ -17,8 +17,8 @@ module.exports = function(newTS) { } }); - tsResult.dts.pipe(gulp.dest('test/output/errorReporting/dts')); + tsResult.dts.pipe(gulp.dest(output + 'dts')); return tsResult.js - .pipe(sourcemaps.write({ includeContent: false, sourceRoot: '../../../errorReporting/' })) - .pipe(gulp.dest('test/output/errorReporting/js')); + .pipe(sourcemaps.write({ includeContent: false, sourceRoot: '../../../../errorReporting/' })) + .pipe(gulp.dest(output + 'js')); } diff --git a/test/externalResolve/gulptask.js b/test/externalResolve/gulptask.js index 8418ef6e..4ed0a38b 100644 --- a/test/externalResolve/gulptask.js +++ b/test/externalResolve/gulptask.js @@ -1,17 +1,18 @@ var gulp = require('gulp'); var sourcemaps = require('gulp-sourcemaps'); -module.exports = function(newTS) { +module.exports = function(newTS, lib, output) { var tsResult = gulp.src('test/externalResolve/test-2.ts') .pipe(sourcemaps.init()) .pipe(newTS({ declarationFiles: true, module: 'commonjs', - sourceRoot: '' + sourceRoot: '', + typescript: lib })); - tsResult.dts.pipe(gulp.dest('test/output/externalResolve/dts')); + tsResult.dts.pipe(gulp.dest(output + 'dts')); return tsResult.js - .pipe(sourcemaps.write({ includeContent: false, sourceRoot: '../../../externalResolve/' })) - .pipe(gulp.dest('test/output/externalResolve/js')); + .pipe(sourcemaps.write({ includeContent: false, sourceRoot: '../../../../externalResolve/' })) + .pipe(gulp.dest(output + 'js')); } diff --git a/test/filter-referencedFrom/gulptask.js b/test/filter-referencedFrom/gulptask.js index 1e83986c..c30ee5d1 100644 --- a/test/filter-referencedFrom/gulptask.js +++ b/test/filter-referencedFrom/gulptask.js @@ -2,12 +2,13 @@ var gulp = require('gulp'); var sourcemaps = require('gulp-sourcemaps'); var concat = require('gulp-concat'); -module.exports = function(newTS) { +module.exports = function(newTS, lib, output) { var project = newTS.createProject({ declarationFiles: true, noExternalResolve: true, sortOutput: true, - sourceRoot: '' + sourceRoot: '', + typescript: lib }); return gulp.src('test/filter-referencedFrom/**.ts') @@ -15,6 +16,6 @@ module.exports = function(newTS) { .pipe(newTS(project)) .pipe(newTS.filter(project, { referencedFrom: ['test-1.ts'] })) .pipe(concat('concat.js')) - .pipe(sourcemaps.write({ includeContent: false, sourceRoot: '../../../filter-referencedFrom/' })) - .pipe(gulp.dest('test/output/filter-referencedFrom/js')); + .pipe(sourcemaps.write({ includeContent: false, sourceRoot: '../../../../filter-referencedFrom/' })) + .pipe(gulp.dest(output + 'js')); } From afcff78edf066f550e51b3e9168bd214dabc17b6 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 18:47:07 +0100 Subject: [PATCH 04/24] Implement error test with a reporter --- gulpfile.js | 9 ++++++--- test/basic/gulptask.js | 4 ++-- test/errorReporting/gulptask.js | 15 ++------------- test/externalResolve/gulptask.js | 4 ++-- test/filter-referencedFrom/gulptask.js | 4 ++-- 5 files changed, 14 insertions(+), 22 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index f8c41fc5..a3d10f80 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -59,9 +59,12 @@ function runTest(name, callback) { var lib = libs[i]; var output = 'test/output/' + name + '/' + lib[0] + '/'; var errors = []; - test(newTS, lib[1], output).on('error', function(err) { - errors.push(err); - }).on('finish', function() { + var reporter = { + error: function(err) { + errors.push(err); + } + }; + test(newTS, lib[1], output, reporter).on('finish', function() { fs.writeFileSync(output + 'errors.txt', errors); function onError(error) { console.error('Test ' + name + ' failed: ' + error.message); diff --git a/test/basic/gulptask.js b/test/basic/gulptask.js index 08aab247..6319f346 100644 --- a/test/basic/gulptask.js +++ b/test/basic/gulptask.js @@ -1,7 +1,7 @@ var gulp = require('gulp'); var sourcemaps = require('gulp-sourcemaps'); -module.exports = function(newTS, lib, output) { +module.exports = function(newTS, lib, output, reporter) { var tsResult = gulp.src('test/basic/*.ts') .pipe(newTS({ declarationFiles: true, @@ -9,7 +9,7 @@ module.exports = function(newTS, lib, output) { noExternalResolve: true, sourceRoot: '', typescript: lib - })); + }, undefined, reporter)); // tsResult.map.pipe(gulp.dest('test/output/test-3/map')); tsResult.dts.pipe(gulp.dest(output + '/dts')); diff --git a/test/errorReporting/gulptask.js b/test/errorReporting/gulptask.js index 7bc8f9f4..d65b4425 100644 --- a/test/errorReporting/gulptask.js +++ b/test/errorReporting/gulptask.js @@ -1,21 +1,10 @@ var gulp = require('gulp'); var sourcemaps = require('gulp-sourcemaps'); -module.exports = function(newTS, lib, output) { +module.exports = function(newTS, lib, output, reporter) { var errors = 0; var tsResult = gulp.src('test/errorReporting/*.ts') - .pipe(newTS({ typescript: lib }, undefined, newTS.reporter.nullReporter())); - - tsResult.on('error', function(err) { - errors++; - console.log('[test-errorReporting] Caught error:', err.message, 'This error was intentional'); - }); - - tsResult.js.on('end', function() { - if (errors !== 1) { - console.log('[test-errorReporting] ' + gutil.colors.red('Expected 1 error, got ' + errors + '.')); - } - }); + .pipe(newTS({ typescript: lib }, undefined, reporter)); tsResult.dts.pipe(gulp.dest(output + 'dts')); return tsResult.js diff --git a/test/externalResolve/gulptask.js b/test/externalResolve/gulptask.js index 4ed0a38b..2a678396 100644 --- a/test/externalResolve/gulptask.js +++ b/test/externalResolve/gulptask.js @@ -1,7 +1,7 @@ var gulp = require('gulp'); var sourcemaps = require('gulp-sourcemaps'); -module.exports = function(newTS, lib, output) { +module.exports = function(newTS, lib, output, reporter) { var tsResult = gulp.src('test/externalResolve/test-2.ts') .pipe(sourcemaps.init()) .pipe(newTS({ @@ -9,7 +9,7 @@ module.exports = function(newTS, lib, output) { module: 'commonjs', sourceRoot: '', typescript: lib - })); + }, undefined, reporter)); tsResult.dts.pipe(gulp.dest(output + 'dts')); return tsResult.js diff --git a/test/filter-referencedFrom/gulptask.js b/test/filter-referencedFrom/gulptask.js index c30ee5d1..80924015 100644 --- a/test/filter-referencedFrom/gulptask.js +++ b/test/filter-referencedFrom/gulptask.js @@ -2,7 +2,7 @@ var gulp = require('gulp'); var sourcemaps = require('gulp-sourcemaps'); var concat = require('gulp-concat'); -module.exports = function(newTS, lib, output) { +module.exports = function(newTS, lib, output, reporter) { var project = newTS.createProject({ declarationFiles: true, noExternalResolve: true, @@ -13,7 +13,7 @@ module.exports = function(newTS, lib, output) { return gulp.src('test/filter-referencedFrom/**.ts') .pipe(sourcemaps.init()) - .pipe(newTS(project)) + .pipe(newTS(project, undefined, reporter)) .pipe(newTS.filter(project, { referencedFrom: ['test-1.ts'] })) .pipe(concat('concat.js')) .pipe(sourcemaps.write({ includeContent: false, sourceRoot: '../../../../filter-referencedFrom/' })) From 72230d1d2eeff2816fee2125c9759aa3809e1ae5 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 18:47:22 +0100 Subject: [PATCH 05/24] Add jsx-typescript to package.json --- package.json | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 31cc399c..8964b250 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,11 @@ "gulp-concat": "~2.4.3", "gulp-header": "~1.2.2", "gulp-diff": "~0.3.1", - "yargs": "~1.3.3" + "yargs": "~1.3.3", + "jsx-typescript": "^1.5.0-alpha.4" + }, + "peerDependencies": { + "jsx-typescript": "^1.5.0-alpha.4" }, "repository": { "type": "git", From 223f2c40addf427e6470adfdff39adfa5bba88b6 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 18:48:39 +0100 Subject: [PATCH 06/24] Update baselines --- test/baselines/basic/{ => default}/dts/other-3.d.ts | 0 test/baselines/basic/{ => default}/dts/test-3.d.ts | 0 test/baselines/basic/default/errors.txt | 0 test/baselines/basic/default/js/other-3.js | 10 ++++++++++ test/baselines/basic/default/js/test-3.js | 6 ++++++ test/baselines/basic/js/other-3.js | 10 ---------- test/baselines/basic/js/test-3.js | 6 ------ test/baselines/errorReporting/default/errors.txt | 1 + test/baselines/errorReporting/default/js/test-4.js | 3 +++ test/baselines/errorReporting/js/test-4.js | 3 --- .../externalResolve/{ => default}/dts/test-2.d.ts | 0 test/baselines/externalResolve/default/errors.txt | 0 .../externalResolve/{ => default}/js/test-2.js | 2 +- .../baselines/filter-referencedFrom/default/errors.txt | 0 .../filter-referencedFrom/{ => default}/js/concat.js | 2 +- 15 files changed, 22 insertions(+), 21 deletions(-) rename test/baselines/basic/{ => default}/dts/other-3.d.ts (100%) mode change 100755 => 100644 rename test/baselines/basic/{ => default}/dts/test-3.d.ts (100%) mode change 100755 => 100644 create mode 100644 test/baselines/basic/default/errors.txt create mode 100644 test/baselines/basic/default/js/other-3.js create mode 100644 test/baselines/basic/default/js/test-3.js delete mode 100755 test/baselines/basic/js/other-3.js delete mode 100755 test/baselines/basic/js/test-3.js create mode 100644 test/baselines/errorReporting/default/errors.txt create mode 100644 test/baselines/errorReporting/default/js/test-4.js delete mode 100755 test/baselines/errorReporting/js/test-4.js rename test/baselines/externalResolve/{ => default}/dts/test-2.d.ts (100%) mode change 100755 => 100644 create mode 100644 test/baselines/externalResolve/default/errors.txt rename test/baselines/externalResolve/{ => default}/js/test-2.js (89%) mode change 100755 => 100644 create mode 100644 test/baselines/filter-referencedFrom/default/errors.txt rename test/baselines/filter-referencedFrom/{ => default}/js/concat.js (96%) mode change 100755 => 100644 diff --git a/test/baselines/basic/dts/other-3.d.ts b/test/baselines/basic/default/dts/other-3.d.ts old mode 100755 new mode 100644 similarity index 100% rename from test/baselines/basic/dts/other-3.d.ts rename to test/baselines/basic/default/dts/other-3.d.ts diff --git a/test/baselines/basic/dts/test-3.d.ts b/test/baselines/basic/default/dts/test-3.d.ts old mode 100755 new mode 100644 similarity index 100% rename from test/baselines/basic/dts/test-3.d.ts rename to test/baselines/basic/default/dts/test-3.d.ts diff --git a/test/baselines/basic/default/errors.txt b/test/baselines/basic/default/errors.txt new file mode 100644 index 00000000..e69de29b diff --git a/test/baselines/basic/default/js/other-3.js b/test/baselines/basic/default/js/other-3.js new file mode 100644 index 00000000..c1d7b812 --- /dev/null +++ b/test/baselines/basic/default/js/other-3.js @@ -0,0 +1,10 @@ +define(["require", "exports"], function (require, exports) { + var Hello = (function () { + function Hello() { + } + return Hello; + })(); + exports.Hello = Hello; +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RoZXItMy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9iYXNpYy8iLCJzb3VyY2VzIjpbIm90aGVyLTMudHMiXSwibmFtZXMiOlsiSGVsbG8iLCJIZWxsby5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IjtJQUFBLElBQWEsS0FBSztRQUFsQkEsU0FBYUEsS0FBS0E7UUFFbEJDLENBQUNBO1FBQURELFlBQUNBO0lBQURBLENBQUNBLEFBRkQsSUFFQztJQUZZLGFBQUssR0FBTCxLQUVaLENBQUEifQ== \ No newline at end of file diff --git a/test/baselines/basic/default/js/test-3.js b/test/baselines/basic/default/js/test-3.js new file mode 100644 index 00000000..616d4222 --- /dev/null +++ b/test/baselines/basic/default/js/test-3.js @@ -0,0 +1,6 @@ +define(["require", "exports", './other-3'], function (require, exports, other) { + var a = new other.Hello(); + console.log(a.value); +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC0zLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL2Jhc2ljLyIsInNvdXJjZXMiOlsidGVzdC0zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJ3RUFBTyxLQUFLO0lBRVosSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMifQ== \ No newline at end of file diff --git a/test/baselines/basic/js/other-3.js b/test/baselines/basic/js/other-3.js deleted file mode 100755 index ecd1ac7c..00000000 --- a/test/baselines/basic/js/other-3.js +++ /dev/null @@ -1,10 +0,0 @@ -define(["require", "exports"], function (require, exports) { - var Hello = (function () { - function Hello() { - } - return Hello; - })(); - exports.Hello = Hello; -}); - -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RoZXItMy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi9iYXNpYy8iLCJzb3VyY2VzIjpbIm90aGVyLTMudHMiXSwibmFtZXMiOlsiSGVsbG8iLCJIZWxsby5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IjtJQUFBLElBQWEsS0FBSztRQUFsQkEsU0FBYUEsS0FBS0E7UUFFbEJDLENBQUNBO1FBQURELFlBQUNBO0lBQURBLENBQUNBLEFBRkQsSUFFQztJQUZZLGFBQUssR0FBTCxLQUVaLENBQUEifQ== \ No newline at end of file diff --git a/test/baselines/basic/js/test-3.js b/test/baselines/basic/js/test-3.js deleted file mode 100755 index fcadb7e9..00000000 --- a/test/baselines/basic/js/test-3.js +++ /dev/null @@ -1,6 +0,0 @@ -define(["require", "exports", './other-3'], function (require, exports, other) { - var a = new other.Hello(); - console.log(a.value); -}); - -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC0zLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uL2Jhc2ljLyIsInNvdXJjZXMiOlsidGVzdC0zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJ3RUFBTyxLQUFLO0lBRVosSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMifQ== \ No newline at end of file diff --git a/test/baselines/errorReporting/default/errors.txt b/test/baselines/errorReporting/default/errors.txt new file mode 100644 index 00000000..febb75ba --- /dev/null +++ b/test/baselines/errorReporting/default/errors.txt @@ -0,0 +1 @@ +TypeScript error: test/errorReporting/test-4.ts(1,1): 2304 Cannot find name 'asdf'. \ No newline at end of file diff --git a/test/baselines/errorReporting/default/js/test-4.js b/test/baselines/errorReporting/default/js/test-4.js new file mode 100644 index 00000000..287d2b9a --- /dev/null +++ b/test/baselines/errorReporting/default/js/test-4.js @@ -0,0 +1,3 @@ +asdf; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC00LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL2Vycm9yUmVwb3J0aW5nLyIsInNvdXJjZXMiOlsidGVzdC00LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLElBQUksQ0FBQyJ9 \ No newline at end of file diff --git a/test/baselines/errorReporting/js/test-4.js b/test/baselines/errorReporting/js/test-4.js deleted file mode 100755 index 0d0770b9..00000000 --- a/test/baselines/errorReporting/js/test-4.js +++ /dev/null @@ -1,3 +0,0 @@ -asdf; - -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC00LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uL2Vycm9yUmVwb3J0aW5nLyIsInNvdXJjZXMiOlsidGVzdC00LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLElBQUksQ0FBQyJ9 \ No newline at end of file diff --git a/test/baselines/externalResolve/dts/test-2.d.ts b/test/baselines/externalResolve/default/dts/test-2.d.ts old mode 100755 new mode 100644 similarity index 100% rename from test/baselines/externalResolve/dts/test-2.d.ts rename to test/baselines/externalResolve/default/dts/test-2.d.ts diff --git a/test/baselines/externalResolve/default/errors.txt b/test/baselines/externalResolve/default/errors.txt new file mode 100644 index 00000000..e69de29b diff --git a/test/baselines/externalResolve/js/test-2.js b/test/baselines/externalResolve/default/js/test-2.js old mode 100755 new mode 100644 similarity index 89% rename from test/baselines/externalResolve/js/test-2.js rename to test/baselines/externalResolve/default/js/test-2.js index 356797c8..c000f7a9 --- a/test/baselines/externalResolve/js/test-2.js +++ b/test/baselines/externalResolve/default/js/test-2.js @@ -5,4 +5,4 @@ var a = new other.Hello(); console.log(a.value); console.log(someModule); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QtMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxBQUNBLHVDQUR1QztBQUN2QyxJQUFPLEtBQUssV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNwQyxJQUFPLFVBQVUsV0FBVyxZQUFZLENBQUMsQ0FBQztBQUUxQyxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVyQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QtMi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi9leHRlcm5hbFJlc29sdmUvIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QtMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxBQUNBLHVDQUR1QztBQUN2QyxJQUFPLEtBQUssV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNwQyxJQUFPLFVBQVUsV0FBVyxZQUFZLENBQUMsQ0FBQztBQUUxQyxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVyQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QtMi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9leHRlcm5hbFJlc29sdmUvIn0= \ No newline at end of file diff --git a/test/baselines/filter-referencedFrom/default/errors.txt b/test/baselines/filter-referencedFrom/default/errors.txt new file mode 100644 index 00000000..e69de29b diff --git a/test/baselines/filter-referencedFrom/js/concat.js b/test/baselines/filter-referencedFrom/default/js/concat.js old mode 100755 new mode 100644 similarity index 96% rename from test/baselines/filter-referencedFrom/js/concat.js rename to test/baselines/filter-referencedFrom/default/js/concat.js index 5af940f6..dc93a5cd --- a/test/baselines/filter-referencedFrom/js/concat.js +++ b/test/baselines/filter-referencedFrom/default/js/concat.js @@ -54,4 +54,4 @@ var Mod; Mod.bar = bar; })(Mod || (Mod = {})); -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImEudHMiLCJpbXBsaWNpdFJlZmVyZW5jZWQudHMiLCJ6LnRzIiwidGVzdC0xLnRzIl0sIm5hbWVzIjpbIkNsYXNzQSIsIkNsYXNzQS5jb25zdHJ1Y3RvciIsIkNsYXNzQS5mb28iLCJNb2QiLCJNb2QuZm9vIiwiQ2xhc3NaIiwiQ2xhc3NaLmNvbnN0cnVjdG9yIiwiQ2xhc3NaLmJhciIsIk1vZC5sb3JlbSIsIlRlc3RDbGFzcyIsIlRlc3RDbGFzcy5jb25zdHJ1Y3RvciIsIk1vZC5iYXIiXSwibWFwcGluZ3MiOiJBQUFBLElBQU0sTUFBTTtJQUFaQSxTQUFNQSxNQUFNQTtJQUlaQyxDQUFDQTtJQUhBRCxvQkFBR0EsR0FBSEE7SUFFQUUsQ0FBQ0E7SUFDRkYsYUFBQ0E7QUFBREEsQ0FKQSxBQUlDQSxJQUFBO0FBRUQsSUFBTyxHQUFHLENBRVQ7QUFGRCxXQUFPLEdBQUcsRUFBQyxDQUFDO0lBQ1hHLFNBQWdCQSxHQUFHQTtJQUFJQyxDQUFDQTtJQUFSRCxPQUFHQSxHQUFIQSxHQUFRQSxDQUFBQTtBQUN6QkEsQ0FBQ0EsRUFGTSxHQUFHLEtBQUgsR0FBRyxRQUVUOztBQ1JELElBQUksa0JBQWtCLEdBQUcscUJBQXFCLENBQUM7Ozs7Ozs7O0FDQS9DLEFBRUEsNkJBRjZCO0FBQzdCLDhDQUE4QztJQUN4QyxNQUFNO0lBQVNFLFVBQWZBLE1BQU1BLFVBQWVBO0lBQTNCQSxTQUFNQSxNQUFNQTtRQUFTQyw4QkFBTUE7SUFJM0JBLENBQUNBO0lBSEFELG9CQUFHQSxHQUFIQTtJQUVBRSxDQUFDQTtJQUNGRixhQUFDQTtBQUFEQSxDQUpBLEFBSUNBLEVBSm9CLE1BQU0sRUFJMUI7QUFFRCxJQUFPLEdBQUcsQ0FFVDtBQUZELFdBQU8sR0FBRyxFQUFDLENBQUM7SUFDWEYsU0FBZ0JBLEtBQUtBO0lBQUlLLENBQUNBO0lBQVZMLFNBQUtBLEdBQUxBLEtBQVVBLENBQUFBO0FBQzNCQSxDQUFDQSxFQUZNLEdBQUcsS0FBSCxHQUFHLFFBRVQ7O0FDVkQsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUU3QixJQUFNLFNBQVM7SUFBZk0sU0FBTUEsU0FBU0E7SUFFZkMsQ0FBQ0E7SUFBREQsZ0JBQUNBO0FBQURBLENBRkEsQUFFQ0EsSUFBQTtBQUVELElBQUksQ0FBQyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7QUFFeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxNQUFNLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFM0MsSUFBTyxHQUFHLENBRVQ7QUFGRCxXQUFPLEdBQUcsRUFBQyxDQUFDO0lBQ1hOLFNBQWdCQSxHQUFHQTtJQUFJUSxDQUFDQTtJQUFSUixPQUFHQSxHQUFIQSxHQUFRQSxDQUFBQTtBQUN6QkEsQ0FBQ0EsRUFGTSxHQUFHLEtBQUgsR0FBRyxRQUVUIiwiZmlsZSI6ImNvbmNhdC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi9maWx0ZXItcmVmZXJlbmNlZEZyb20vIn0= \ No newline at end of file +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImEudHMiLCJpbXBsaWNpdFJlZmVyZW5jZWQudHMiLCJ6LnRzIiwidGVzdC0xLnRzIl0sIm5hbWVzIjpbIkNsYXNzQSIsIkNsYXNzQS5jb25zdHJ1Y3RvciIsIkNsYXNzQS5mb28iLCJNb2QiLCJNb2QuZm9vIiwiQ2xhc3NaIiwiQ2xhc3NaLmNvbnN0cnVjdG9yIiwiQ2xhc3NaLmJhciIsIk1vZC5sb3JlbSIsIlRlc3RDbGFzcyIsIlRlc3RDbGFzcy5jb25zdHJ1Y3RvciIsIk1vZC5iYXIiXSwibWFwcGluZ3MiOiJBQUFBLElBQU0sTUFBTTtJQUFaQSxTQUFNQSxNQUFNQTtJQUlaQyxDQUFDQTtJQUhBRCxvQkFBR0EsR0FBSEE7SUFFQUUsQ0FBQ0E7SUFDRkYsYUFBQ0E7QUFBREEsQ0FKQSxBQUlDQSxJQUFBO0FBRUQsSUFBTyxHQUFHLENBRVQ7QUFGRCxXQUFPLEdBQUcsRUFBQyxDQUFDO0lBQ1hHLFNBQWdCQSxHQUFHQTtJQUFJQyxDQUFDQTtJQUFSRCxPQUFHQSxHQUFIQSxHQUFRQSxDQUFBQTtBQUN6QkEsQ0FBQ0EsRUFGTSxHQUFHLEtBQUgsR0FBRyxRQUVUOztBQ1JELElBQUksa0JBQWtCLEdBQUcscUJBQXFCLENBQUM7Ozs7Ozs7O0FDQS9DLEFBRUEsNkJBRjZCO0FBQzdCLDhDQUE4QztJQUN4QyxNQUFNO0lBQVNFLFVBQWZBLE1BQU1BLFVBQWVBO0lBQTNCQSxTQUFNQSxNQUFNQTtRQUFTQyw4QkFBTUE7SUFJM0JBLENBQUNBO0lBSEFELG9CQUFHQSxHQUFIQTtJQUVBRSxDQUFDQTtJQUNGRixhQUFDQTtBQUFEQSxDQUpBLEFBSUNBLEVBSm9CLE1BQU0sRUFJMUI7QUFFRCxJQUFPLEdBQUcsQ0FFVDtBQUZELFdBQU8sR0FBRyxFQUFDLENBQUM7SUFDWEYsU0FBZ0JBLEtBQUtBO0lBQUlLLENBQUNBO0lBQVZMLFNBQUtBLEdBQUxBLEtBQVVBLENBQUFBO0FBQzNCQSxDQUFDQSxFQUZNLEdBQUcsS0FBSCxHQUFHLFFBRVQ7O0FDVkQsNkJBQTZCO0FBQzdCLDZCQUE2QjtBQUU3QixJQUFNLFNBQVM7SUFBZk0sU0FBTUEsU0FBU0E7SUFFZkMsQ0FBQ0E7SUFBREQsZ0JBQUNBO0FBQURBLENBRkEsQUFFQ0EsSUFBQTtBQUVELElBQUksQ0FBQyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUM7QUFFeEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxNQUFNLEVBQUUsRUFBRSxJQUFJLE1BQU0sRUFBRSxDQUFDLENBQUM7QUFFM0MsSUFBTyxHQUFHLENBRVQ7QUFGRCxXQUFPLEdBQUcsRUFBQyxDQUFDO0lBQ1hOLFNBQWdCQSxHQUFHQTtJQUFJUSxDQUFDQTtJQUFSUixPQUFHQSxHQUFIQSxHQUFRQSxDQUFBQTtBQUN6QkEsQ0FBQ0EsRUFGTSxHQUFHLEtBQUgsR0FBRyxRQUVUIiwiZmlsZSI6ImNvbmNhdC5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9maWx0ZXItcmVmZXJlbmNlZEZyb20vIn0= \ No newline at end of file From 3af2984f993552f68f84efcc3e61d9639bc3f34b Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 19:38:27 +0100 Subject: [PATCH 07/24] Allow different typescript versions --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8964b250..3e36934a 100644 --- a/package.json +++ b/package.json @@ -49,7 +49,7 @@ "dependencies": { "gulp-util": "~3.0.2", "through2": "^0.6.3", - "typescript": "1.4.1", + "typescript": ">=1.4.1 <2.0.0", "vinyl-sourcemaps-apply": "0.1.4" }, "devDependencies": { From b1c70b1aa286e8bcf299ebf562a5b9ffc0c903a0 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 20:48:23 +0100 Subject: [PATCH 08/24] Add typescript master as git module --- .gitmodules | 3 +++ node_modules/typescript-dev | 1 + 2 files changed, 4 insertions(+) create mode 100644 .gitmodules create mode 160000 node_modules/typescript-dev diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..999036cc --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "node_modules/typescript-dev"] + path = node_modules/typescript-dev + url = https://github.com/Microsoft/TypeScript.git diff --git a/node_modules/typescript-dev b/node_modules/typescript-dev new file mode 160000 index 00000000..d2c992c2 --- /dev/null +++ b/node_modules/typescript-dev @@ -0,0 +1 @@ +Subproject commit d2c992c2de181656b51ed419c785dd1cd2b4af9f From 1dca13d63bef72c02a4d8df4f1c976259b5d0c51 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 20:48:45 +0100 Subject: [PATCH 09/24] Add ts master tests --- gulpfile.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index a3d10f80..da2487cb 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -51,7 +51,8 @@ function runTest(name, callback) { var newTS = require('./release-2/main'); var libs = [ ['default', undefined], - // ['jsx', require('jsx-typescript')] TODO: Add jsx-typescript here. It currently throws an error when adding it. + ['ts-next', require('typescript-dev')], + ['jsx', require('jsx-typescript')] // TODO: Add jsx-typescript here. It currently throws an error when adding it. ]; var test = require('./test/' + name + '/gulptask.js'); From 519a152df40f67bdad7f84fc04f36b81cfc675be Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Thu, 19 Feb 2015 20:53:14 +0100 Subject: [PATCH 10/24] Remove typescript-dev from ignored files --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index e8b7141f..8bde7bf7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ -node_modules +node_modules/* +!node_modules/typescript-dev .DS_Store release-2 test/output \ No newline at end of file From 5059604c18d4c029cd0c8d567bcc2b744e5d90bf Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Fri, 6 Mar 2015 16:09:58 +0100 Subject: [PATCH 11/24] filename & fileName support --- lib/filter.ts | 4 ++-- lib/host.ts | 3 +++ lib/project.ts | 24 ++++++++++++++++++------ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/filter.ts b/lib/filter.ts index b5f0f06a..abe06538 100644 --- a/lib/filter.ts +++ b/lib/filter.ts @@ -19,8 +19,8 @@ export class Filter { this.referencedFromAll.push(file.filename); for (var i = 0; i < file.ts.referencedFiles.length; i++) { - var ref = file.ts.referencedFiles[i].filename; - ref = project.Project.normalizePath(path.join(path.dirname(file.ts.filename), ref)); + var ref = project.Project.getFileName(file.ts.referencedFiles[i]); + ref = project.Project.normalizePath(path.join(path.dirname(project.Project.getFileName(file.ts)), ref)); var refFile = this.project.currentFiles[ref]; if (refFile) addReference(refFile); diff --git a/lib/host.ts b/lib/host.ts index 0fde36c1..a0ca1022 100644 --- a/lib/host.ts +++ b/lib/host.ts @@ -65,6 +65,9 @@ export class Host implements ts.CompilerHost { getDefaultLibFilename() { return '__lib.d.ts'; } + getDefaultLibFileName() { + return '__lib.d.ts'; + } writeFile(filename: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void) { this.output[filename] = data; diff --git a/lib/project.ts b/lib/project.ts index 33186006..f2ce69bb 100644 --- a/lib/project.ts +++ b/lib/project.ts @@ -35,6 +35,11 @@ export class Project { ts: undefined }; + static getFileName(thing: { filename: string} | { fileName: string }): string { + if ( thing.filename) return thing.filename; + return thing.fileName; + } + /** * The TypeScript library that is used for this project. * Can also be jsx-typescript for example. @@ -161,7 +166,7 @@ export class Project { return err; } - var filename = this.getOriginalName(info.file.filename); + var filename = this.getOriginalName(Project.getFileName(info.file)); var file = this.host.getFileData(filename); if (file) { @@ -175,7 +180,7 @@ export class Project { filename = file.originalFilename; } } else { - filename = info.file.filename; + filename = Project.getFileName(info.file); err.fullFilename = filename; } @@ -253,7 +258,7 @@ export class Project { } private resolve(session: { tasks: number; callback: () => void; }, file: FileData) { - var references = file.ts.referencedFiles.map(item => path.join(path.dirname(file.ts.filename), item.filename)); + var references = file.ts.referencedFiles.map(item => path.join(path.dirname(Project.getFileName(file.ts)), Project.getFileName(item))); this.typescript.forEachChild(file.ts, (node) => { if (node.kind === ts.SyntaxKind.ImportDeclaration) { @@ -269,7 +274,7 @@ export class Project { if (typeof ( reference).text !== 'string') { return; } - var ref = path.join(path.dirname(file.ts.filename), ( reference).text); + var ref = path.join(path.dirname(Project.getFileName(file.ts)), ( reference).text); // Don't know if this name is defined with `declare module 'foo'`, but let's load it to be sure. // We guess what file the user wants. This will be right in most cases. @@ -361,7 +366,14 @@ export class Project { // Creating a program compiles the sources this.program = this.typescript.createProgram(rootFilenames, this.options, this.host); - var errors = this.program.getDiagnostics(); + if (this.program.getDiagnostics) { + var errors = this.program.getDiagnostics(); + } else { + // Program#getDiagnostics has been removed in 1.5 + var errors = this.program.getGlobalDiagnostics().concat( + this.program.getSyntacticDiagnostics()); + } + if (!errors.length) { // If there are no syntax errors, check types @@ -459,7 +471,7 @@ export class Project { var inputFile = this.currentFiles[originalName]; var tsFile = this.program.getSourceFile(originalName); - var references = tsFile.referencedFiles.map(file => file.filename); + var references = tsFile.referencedFiles.map(file => Project.getFileName(file)); for (var j = 0; j < outputJS.length; ++j) { var other = outputJS[j]; From 85ba834bbf8facdb8ef3df85c97a175220b7490f Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Fri, 6 Mar 2015 19:26:56 +0100 Subject: [PATCH 12/24] Update submodule --- node_modules/typescript-dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node_modules/typescript-dev b/node_modules/typescript-dev index d2c992c2..b784a421 160000 --- a/node_modules/typescript-dev +++ b/node_modules/typescript-dev @@ -1 +1 @@ -Subproject commit d2c992c2de181656b51ed419c785dd1cd2b4af9f +Subproject commit b784a4212aeb5a4e42a598a8613a0538ac241123 From f34a070bde1bd6d55a2427cc9b73c13545da95ca Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Fri, 6 Mar 2015 19:27:35 +0100 Subject: [PATCH 13/24] Add preserveConstEnums setting --- lib/main.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/main.ts b/lib/main.ts index 59051d1e..1faa1912 100644 --- a/lib/main.ts +++ b/lib/main.ts @@ -124,6 +124,9 @@ var moduleMap: project.Map = { function getCompilerOptions(settings: compile.Settings): ts.CompilerOptions { var tsSettings: ts.CompilerOptions = {}; + if (settings.preserveConstEnums !== undefined) { + tsSettings.preserveConstEnums = settings.preserveConstEnums; + } if (settings.removeComments !== undefined) { tsSettings.removeComments = settings.removeComments; } @@ -172,7 +175,7 @@ function getCompilerOptions(settings: compile.Settings): ts.CompilerOptions { module compile { export interface Settings { - //propagateEnumConstants?: boolean; + preserveConstEnums?: boolean; removeComments?: boolean; //allowAutomaticSemicolonInsertion?: boolean; From 0ef27304de962b62c6228a00543a808120d7aac8 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:17:30 +0100 Subject: [PATCH 14/24] Fix more differences between ts 1.4 & 1.4 --- lib/host.ts | 22 ++++++------ lib/project.ts | 95 ++++++++++++++++++++++++++++++++++++-------------- 2 files changed, 81 insertions(+), 36 deletions(-) diff --git a/lib/host.ts b/lib/host.ts index a0ca1022..df86d7e1 100644 --- a/lib/host.ts +++ b/lib/host.ts @@ -17,12 +17,15 @@ export class Host implements ts.CompilerHost { filename = i; } } - - if (filename === undefined) return undefined; // Not found - if (this.libDefault[filename]) return this.libDefault[filename]; // Already loaded + if (filename === undefined) { + return undefined; // Not found + } + if (this.libDefault[filename]) { + return this.libDefault[filename]; // Already loaded + } var content = fs.readFileSync(path.resolve(path.dirname(filename) + '/lib.d.ts')).toString('utf8'); - return this.libDefault[filename] = ts.createSourceFile('__lib.d.ts', content, ts.ScriptTarget.ES3, "0"); // Will also work for ES5 & 6 + return this.libDefault[filename] = typescript.createSourceFile('__lib.d.ts', content, typescript.ScriptTarget.ES3, "0"); // Will also work for ES5 & 6 } typescript: typeof ts; @@ -41,8 +44,6 @@ export class Host implements ts.CompilerHost { this.externalResolve = externalResolve; this.reset(); - - } private reset() { @@ -56,7 +57,7 @@ export class Host implements ts.CompilerHost { return false; } - getCurrentDirectory() { + getCurrentDirectory = () => { return this.currentDirectory; } getCanonicalFileName(filename: string) { @@ -69,11 +70,11 @@ export class Host implements ts.CompilerHost { return '__lib.d.ts'; } - writeFile(filename: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void) { + writeFile = (filename: string, data: string, writeByteOrderMark: boolean, onError?: (message: string) => void) => { this.output[filename] = data; } - getSourceFile(filename: string, languageVersion: ts.ScriptTarget, onError?: (message: string) => void): ts.SourceFile { + getSourceFile = (filename: string, languageVersion: ts.ScriptTarget, onError?: (message: string) => void): ts.SourceFile => { var text: string; var normalizedFilename = project.Project.normalizePath(filename); @@ -98,7 +99,8 @@ export class Host implements ts.CompilerHost { if (typeof text !== 'string') return undefined; - var file = ts.createSourceFile(filename, text, languageVersion, "0"); + var file = this.typescript.createSourceFile(filename, text, languageVersion, "0"); + this.files[normalizedFilename] = { filename: normalizedFilename, originalFilename: filename, diff --git a/lib/project.ts b/lib/project.ts index f2ce69bb..7dffe7ff 100644 --- a/lib/project.ts +++ b/lib/project.ts @@ -27,6 +27,31 @@ interface OutputFile { sourcemap?: string; } +/* + * TS1.4 had a simple getDiagnostics method, in 1.5 that method doens't exist, + * but instead there are now 4 methods which (combined) return all diagnostics. + */ +interface Program14 { + getDiagnostics(): ts.Diagnostic[]; + getTypeChecker(fullTypeCheckMode: boolean): ts.TypeChecker; +} +interface Program15 { + getSyntacticDiagnostics(): ts.Diagnostic[]; + getGlobalDiagnostics(): ts.Diagnostic[]; + getSemanticDiagnostics(): ts.Diagnostic[]; + getDeclarationDiagnostics(): ts.Diagnostic[]; + emit(): { diagnostics: ts.Diagnostic[]; }; +} +/* + * In TS 14 the method getLineAndCharacterFromPosition has been renamed from ...From... to ...Of... + */ +interface TSFile14 { + getLineAndCharacterFromPosition(pos: number): ts.LineAndCharacter; +} +interface TSFile15 { + getLineAndCharacterOfPosition(pos: number): ts.LineAndCharacter; +} + export class Project { static unresolvedFile: FileData = { filename: undefined, @@ -36,8 +61,44 @@ export class Project { }; static getFileName(thing: { filename: string} | { fileName: string }): string { - if ( thing.filename) return thing.filename; - return thing.fileName; + if (( thing).filename) return ( thing).filename; + return ( thing).fileName; + } + private static getDiagnosticsAndEmit(program: Program14 | Program15): ts.Diagnostic[] { + if (( program).getDiagnostics) { + var errors = ( program).getDiagnostics(); + + if (!errors.length) { + // If there are no syntax errors, check types + var checker = ( program).getTypeChecker(true); + + var semanticErrors = checker.getDiagnostics(); + + var emitErrors = checker.emitFiles().diagnostics; + + errors = semanticErrors.concat(emitErrors); + } + + return errors; + } else { + var errors = ( program).getSyntacticDiagnostics(); + if (errors.length === 0) errors = ( program).getGlobalDiagnostics(); + if (errors.length === 0) errors = ( program).getSemanticDiagnostics(); + + var emitOutput = ( program).emit(); + return errors.concat(emitOutput.diagnostics); + } + } + private static getLineAndCharacterOfPosition(typescript: typeof ts, file: TSFile14 | TSFile15, position: number) { + if (( file).getLineAndCharacterOfPosition) { // TS 1.5 + var lineAndCharacter = ( file).getLineAndCharacterOfPosition(position); + return { + line: lineAndCharacter.line + 1, + character: lineAndCharacter.character + 1 + } + } else { // TS 1.4 + return ( file).getLineAndCharacterFromPosition(position); + } } /** @@ -184,8 +245,8 @@ export class Project { err.fullFilename = filename; } - var startPos = info.file.getLineAndCharacterFromPosition(info.start); - var endPos = info.file.getLineAndCharacterFromPosition(info.start + info.length - 1); + var startPos = Project.getLineAndCharacterOfPosition(this.typescript, info.file, info.start); + var endPos = Project.getLineAndCharacterOfPosition(this.typescript, info.file, info.start + info.length); err.startPosition = { position: info.start, @@ -261,14 +322,14 @@ export class Project { var references = file.ts.referencedFiles.map(item => path.join(path.dirname(Project.getFileName(file.ts)), Project.getFileName(item))); this.typescript.forEachChild(file.ts, (node) => { - if (node.kind === ts.SyntaxKind.ImportDeclaration) { + if (node.kind === this.typescript.SyntaxKind.ImportDeclaration) { var importNode = node; - if (importNode.moduleReference === undefined || importNode.moduleReference.kind !== ts.SyntaxKind.ExternalModuleReference) { + if (importNode.moduleReference === undefined || importNode.moduleReference.kind !== this.typescript.SyntaxKind.ExternalModuleReference) { return; } var reference = importNode.moduleReference; - if (reference.expression === undefined || reference.expression.kind !== ts.SyntaxKind.StringLiteral) { + if (reference.expression === undefined || reference.expression.kind !== this.typescript.SyntaxKind.StringLiteral) { return; } if (typeof ( reference).text !== 'string') { @@ -366,25 +427,7 @@ export class Project { // Creating a program compiles the sources this.program = this.typescript.createProgram(rootFilenames, this.options, this.host); - if (this.program.getDiagnostics) { - var errors = this.program.getDiagnostics(); - } else { - // Program#getDiagnostics has been removed in 1.5 - var errors = this.program.getGlobalDiagnostics().concat( - this.program.getSyntacticDiagnostics()); - } - - - if (!errors.length) { - // If there are no syntax errors, check types - var checker = this.program.getTypeChecker(true); - - var semanticErrors = checker.getDiagnostics(); - - var emitErrors = checker.emitFiles().diagnostics; - - errors = semanticErrors.concat(emitErrors); - } + var errors = Project.getDiagnosticsAndEmit(this.program); for (var i = 0; i < errors.length; i++) { errorCallback(this.getError(errors[i])); From a97c2f6d6032bc935f56e1efa383c670fae792cb Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:18:02 +0100 Subject: [PATCH 15/24] Improve testing & type checking --- gulpfile.js | 67 ++++++++++++++++++++++++++++++++++------------------- 1 file changed, 43 insertions(+), 24 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index da2487cb..0ce8ee55 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -10,11 +10,13 @@ var concat = require('gulp-concat'); var header = require('gulp-header'); var diff = require('gulp-diff'); -var tsProject = ts.createProject({ +var tsOptions = { target: 'es5', module: 'commonjs', - noExternalResolve: true -}); + noExternalResolve: true, + preserveConstEnums: true +}; +var tsProject = ts.createProject(tsOptions); var paths = { scripts: ['lib/**.ts', 'definitions/**.ts'], @@ -47,40 +49,57 @@ gulp.task('scripts', ['clean'], function() { .pipe(gulp.dest(paths.releaseBeta)); }); +// Check against the master of TypeScript +gulp.task('typecheck-dev', function() { + return gulp.src(paths.scripts.concat([ + '!defintions/typescript.d.ts', + path.resolve(require.resolve('typescript-dev'), './typescript.d.ts') + ])).pipe(ts(tsOptions)); +}); + +// Checking against the current release of TypeScript on NPM can be done using `gulp scripts`. +gulp.task('typecheck', ['typecheck-dev']); + function runTest(name, callback) { var newTS = require('./release-2/main'); var libs = [ ['default', undefined], ['ts-next', require('typescript-dev')], - ['jsx', require('jsx-typescript')] // TODO: Add jsx-typescript here. It currently throws an error when adding it. + // ['jsx', require('jsx-typescript')] // TODO: Add jsx-typescript here. It currently throws an error when adding it. ]; var test = require('./test/' + name + '/gulptask.js'); + fs.mkdirSync('test/output/' + name); for (var i = 0; i < libs.length; i++) { - var lib = libs[i]; - var output = 'test/output/' + name + '/' + lib[0] + '/'; - var errors = []; - var reporter = { - error: function(err) { - errors.push(err); - } - }; - test(newTS, lib[1], output, reporter).on('finish', function() { - fs.writeFileSync(output + 'errors.txt', errors); - function onError(error) { - console.error('Test ' + name + ' failed: ' + error.message); - } - gulp.src('test/output/' + name + '/**') - .pipe(diff('test/baselines/' + name)) - .on('error', onError) - .pipe(diff.reporter({ fail: true })) - .on('error', onError) - .on('finish', callback); - }); + (function(i) { + var lib = libs[i]; + var output = 'test/output/' + name + '/' + lib[0] + '/'; + var errors = []; + var reporter = { + error: function(err) { + errors.push(err); + } + }; + fs.mkdirSync(output); + test(newTS, lib[1], output, reporter).on('finish', function() { + fs.writeFileSync(output + 'errors.txt', errors); + function onError(error) { + console.error('Test ' + name + ' failed: ' + error.message); + } + gulp.src('test/output/' + name + '/**') + .pipe(diff('test/baselines/' + name)) + .on('error', onError) + .pipe(diff.reporter({ fail: true })) + .on('error', onError) + .on('finish', callback); + }); + })(i); } } gulp.task('test', ['clean-test', 'scripts'], function(cb) { + fs.mkdirSync('test/output/'); + var currentTests = tests; if (argv.tests !== undefined) { currentTests = argv.tests.split(','); From 1155383a6357be73bc63e8dc1752204402e87dda Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:18:35 +0100 Subject: [PATCH 16/24] Update release --- release/filter.js | 4 +- release/host.js | 110 ++++++++++++++++++++++++++------------------- release/main.js | 7 ++- release/project.js | 74 +++++++++++++++++++++--------- 4 files changed, 125 insertions(+), 70 deletions(-) diff --git a/release/filter.js b/release/filter.js index 9e16f227..ca2f670e 100644 --- a/release/filter.js +++ b/release/filter.js @@ -14,8 +14,8 @@ var Filter = (function () { return; _this.referencedFromAll.push(file.filename); for (var i = 0; i < file.ts.referencedFiles.length; i++) { - var ref = file.ts.referencedFiles[i].filename; - ref = project.Project.normalizePath(path.join(path.dirname(file.ts.filename), ref)); + var ref = project.Project.getFileName(file.ts.referencedFiles[i]); + ref = project.Project.normalizePath(path.join(path.dirname(project.Project.getFileName(file.ts)), ref)); var refFile = _this.project.currentFiles[ref]; if (refFile) addReference(refFile); diff --git a/release/host.js b/release/host.js index fa5173bd..37cf15cc 100644 --- a/release/host.js +++ b/release/host.js @@ -1,18 +1,74 @@ /// -var ts = require('typescript'); var project = require('./project'); var fs = require('fs'); var path = require('path'); var Host = (function () { - function Host(currentDirectory, files, externalResolve) { + function Host(typescript, currentDirectory, files, externalResolve) { + var _this = this; + this.getCurrentDirectory = function () { + return _this.currentDirectory; + }; + this.writeFile = function (filename, data, writeByteOrderMark, onError) { + _this.output[filename] = data; + }; + this.getSourceFile = function (filename, languageVersion, onError) { + var text; + var normalizedFilename = project.Project.normalizePath(filename); + if (_this.files[normalizedFilename]) { + if (_this.files[normalizedFilename] === project.Project.unresolvedFile) { + return undefined; + } + else { + return _this.files[normalizedFilename].ts; + } + } + else if (normalizedFilename === '__lib.d.ts') { + return Host.getLibDefault(_this.typescript); + } + else { + if (_this.externalResolve) { + try { + text = fs.readFileSync(filename).toString('utf8'); + } + catch (ex) { + return undefined; + } + } + } + if (typeof text !== 'string') + return undefined; + var file = _this.typescript.createSourceFile(filename, text, languageVersion, "0"); + _this.files[normalizedFilename] = { + filename: normalizedFilename, + originalFilename: filename, + content: text, + ts: file + }; + return file; + }; + this.typescript = typescript; this.currentDirectory = currentDirectory; this.files = files; this.externalResolve = externalResolve; this.reset(); } - Host.initLibDefault = function () { - var content = fs.readFileSync(path.resolve(path.dirname(require.resolve('typescript')) + '/lib.d.ts')).toString('utf8'); - this.libDefault = ts.createSourceFile('__lib.d.ts', content, 0 /* ES3 */, "0"); // Will also work for ES5 & 6 + Host.getLibDefault = function (typescript) { + var filename; + for (var i in require.cache) { + if (!Object.prototype.hasOwnProperty.call(require.cache, i)) + continue; + if (require.cache[i].exports === typescript) { + filename = i; + } + } + if (filename === undefined) { + return undefined; // Not found + } + if (this.libDefault[filename]) { + return this.libDefault[filename]; // Already loaded + } + var content = fs.readFileSync(path.resolve(path.dirname(filename) + '/lib.d.ts')).toString('utf8'); + return this.libDefault[filename] = typescript.createSourceFile('__lib.d.ts', content, 0 /* ES3 */, "0"); // Will also work for ES5 & 6 }; Host.prototype.reset = function () { this.output = {}; @@ -23,57 +79,19 @@ var Host = (function () { Host.prototype.useCaseSensitiveFileNames = function () { return false; }; - Host.prototype.getCurrentDirectory = function () { - return this.currentDirectory; - }; Host.prototype.getCanonicalFileName = function (filename) { return project.Project.normalizePath(filename); }; Host.prototype.getDefaultLibFilename = function () { return '__lib.d.ts'; }; - Host.prototype.writeFile = function (filename, data, writeByteOrderMark, onError) { - this.output[filename] = data; - }; - Host.prototype.getSourceFile = function (filename, languageVersion, onError) { - var text; - var normalizedFilename = project.Project.normalizePath(filename); - if (this.files[normalizedFilename]) { - if (this.files[normalizedFilename] === project.Project.unresolvedFile) { - return undefined; - } - else { - return this.files[normalizedFilename].ts; - } - } - else if (normalizedFilename === '__lib.d.ts') { - return Host.libDefault; - } - else { - if (this.externalResolve) { - try { - text = fs.readFileSync(filename).toString('utf8'); - } - catch (ex) { - return undefined; - } - } - } - if (typeof text !== 'string') - return undefined; - var file = ts.createSourceFile(filename, text, languageVersion, "0"); - this.files[normalizedFilename] = { - filename: normalizedFilename, - originalFilename: filename, - content: text, - ts: file - }; - return file; + Host.prototype.getDefaultLibFileName = function () { + return '__lib.d.ts'; }; Host.prototype.getFileData = function (filename) { return this.files[project.Project.normalizePath(filename)]; }; + Host.libDefault = {}; return Host; })(); exports.Host = Host; -Host.initLibDefault(); diff --git a/release/main.js b/release/main.js index 3d18db8a..1d74a5e3 100644 --- a/release/main.js +++ b/release/main.js @@ -91,7 +91,7 @@ function compile(param, filters, theReporter) { proj = param; } else { - proj = new project.Project(getCompilerOptions(param || {}), (param && param.noExternalResolve) || false, (param && param.sortOutput) || false); + proj = new project.Project(getCompilerOptions(param || {}), (param && param.noExternalResolve) || false, (param && param.sortOutput) || false, (param && param.typescript) || undefined); } proj.reset(); proj.filterSettings = filters; @@ -110,6 +110,9 @@ var moduleMap = { }; function getCompilerOptions(settings) { var tsSettings = {}; + if (settings.preserveConstEnums !== undefined) { + tsSettings.preserveConstEnums = settings.preserveConstEnums; + } if (settings.removeComments !== undefined) { tsSettings.removeComments = settings.removeComments; } @@ -155,7 +158,7 @@ var compile; compile.Project = project.Project; compile.reporter = _reporter; function createProject(settings) { - return new compile.Project(getCompilerOptions(settings), settings.noExternalResolve ? true : false, settings.sortOutput ? true : false); + return new compile.Project(getCompilerOptions(settings), settings.noExternalResolve ? true : false, settings.sortOutput ? true : false, settings.typescript); } compile.createProject = createProject; function filter(project, filters) { diff --git a/release/project.js b/release/project.js index bcac9a2a..f7311038 100644 --- a/release/project.js +++ b/release/project.js @@ -7,7 +7,8 @@ var sourcemapApply = require('vinyl-sourcemaps-apply'); var host = require('./host'); var filter = require('./filter'); var Project = (function () { - function Project(options, noExternalResolve, sortOutput) { + function Project(options, noExternalResolve, sortOutput, typescript) { + if (typescript === void 0) { typescript = ts; } /** * Files from the previous compilation. * Used to find the differences with the previous compilation, to make the new compilation faster. @@ -32,10 +33,50 @@ var Project = (function () { * Used for incremental builds. */ this.version = 0; + this.typescript = typescript; this.options = options; this.noExternalResolve = noExternalResolve; this.sortOutput = sortOutput; } + Project.getFileName = function (thing) { + if (thing.filename) + return thing.filename; + return thing.fileName; + }; + Project.getDiagnosticsAndEmit = function (program) { + if (program.getDiagnostics) { + var errors = program.getDiagnostics(); + if (!errors.length) { + // If there are no syntax errors, check types + var checker = program.getTypeChecker(true); + var semanticErrors = checker.getDiagnostics(); + var emitErrors = checker.emitFiles().diagnostics; + errors = semanticErrors.concat(emitErrors); + } + return errors; + } + else { + var errors = program.getSyntacticDiagnostics(); + if (errors.length === 0) + errors = program.getGlobalDiagnostics(); + if (errors.length === 0) + errors = program.getSemanticDiagnostics(); + var emitOutput = program.emit(); + return errors.concat(emitOutput.diagnostics); + } + }; + Project.getLineAndCharacterOfPosition = function (typescript, file, position) { + if (file.getLineAndCharacterOfPosition) { + var lineAndCharacter = file.getLineAndCharacterOfPosition(position); + return { + line: lineAndCharacter.line + 1, + character: lineAndCharacter.character + 1 + }; + } + else { + return file.getLineAndCharacterFromPosition(position); + } + }; /** * Resets the compiler. * The compiler needs to be reset for incremental builds. @@ -88,7 +129,7 @@ var Project = (function () { err.message = info.code + ' ' + info.messageText; return err; } - var filename = this.getOriginalName(info.file.filename); + var filename = this.getOriginalName(Project.getFileName(info.file)); var file = this.host.getFileData(filename); if (file) { err.tsFile = file.ts; @@ -103,11 +144,11 @@ var Project = (function () { } } else { - filename = info.file.filename; + filename = Project.getFileName(info.file); err.fullFilename = filename; } - var startPos = info.file.getLineAndCharacterFromPosition(info.start); - var endPos = info.file.getLineAndCharacterFromPosition(info.start + info.length - 1); + var startPos = Project.getLineAndCharacterOfPosition(this.typescript, info.file, info.start); + var endPos = Project.getLineAndCharacterOfPosition(this.typescript, info.file, info.start + info.length); err.startPosition = { position: info.start, line: startPos.line, @@ -160,8 +201,8 @@ var Project = (function () { }; Project.prototype.resolve = function (session, file) { var _this = this; - var references = file.ts.referencedFiles.map(function (item) { return path.join(path.dirname(file.ts.filename), item.filename); }); - ts.forEachChild(file.ts, function (node) { + var references = file.ts.referencedFiles.map(function (item) { return path.join(path.dirname(Project.getFileName(file.ts)), Project.getFileName(item)); }); + this.typescript.forEachChild(file.ts, function (node) { if (node.kind === 191 /* ImportDeclaration */) { var importNode = node; if (importNode.moduleReference === undefined || importNode.moduleReference.kind !== 193 /* ExternalModuleReference */) { @@ -174,7 +215,7 @@ var Project = (function () { if (typeof reference.text !== 'string') { return; } - var ref = path.join(path.dirname(file.ts.filename), reference.text); + var ref = path.join(path.dirname(Project.getFileName(file.ts)), reference.text); // Don't know if this name is defined with `declare module 'foo'`, but let's load it to be sure. // We guess what file the user wants. This will be right in most cases. // The advantage of guessing is that we can now use fs.readFile (async) instead of fs.readFileSync. @@ -250,17 +291,10 @@ var Project = (function () { files[filename] = this.additionalFiles[filename]; } } - this.host = new host.Host(this.currentFiles[0] ? this.currentFiles[0].file.cwd : '', files, !this.noExternalResolve); + this.host = new host.Host(this.typescript, this.currentFiles[0] ? this.currentFiles[0].file.cwd : '', files, !this.noExternalResolve); // Creating a program compiles the sources - this.program = ts.createProgram(rootFilenames, this.options, this.host); - var errors = this.program.getDiagnostics(); - if (!errors.length) { - // If there are no syntax errors, check types - var checker = this.program.getTypeChecker(true); - var semanticErrors = checker.getDiagnostics(); - var emitErrors = checker.emitFiles().diagnostics; - errors = semanticErrors.concat(emitErrors); - } + this.program = this.typescript.createProgram(rootFilenames, this.options, this.host); + var errors = Project.getDiagnosticsAndEmit(this.program); for (var i = 0; i < errors.length; i++) { errorCallback(this.getError(errors[i])); } @@ -335,7 +369,7 @@ var Project = (function () { done[originalName] = true; var inputFile = _this.currentFiles[originalName]; var tsFile = _this.program.getSourceFile(originalName); - var references = tsFile.referencedFiles.map(function (file) { return file.filename; }); + var references = tsFile.referencedFiles.map(function (file) { return Project.getFileName(file); }); for (var j = 0; j < outputJS.length; ++j) { var other = outputJS[j]; var otherName = _this.getOriginalName(other.path); @@ -371,7 +405,7 @@ var Project = (function () { filename: Project.normalizePath(filename), originalFilename: filename, content: content, - ts: ts.createSourceFile(filename, content, this.options.target, this.version + '') + ts: this.typescript.createSourceFile(filename, content, this.options.target, this.version + '') }; }; Project.prototype.removeSourceMapComment = function (content) { From b71e19c7c25871393ffd69283c4184f1967dfbd7 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:18:41 +0100 Subject: [PATCH 17/24] Update baselines --- test/baselines/basic/ts-next/dts/other-3.d.ts | 3 ++ test/baselines/basic/ts-next/dts/test-3.d.ts | 0 test/baselines/basic/ts-next/errors.txt | 0 test/baselines/basic/ts-next/js/other-3.js | 10 ++++ test/baselines/basic/ts-next/js/test-3.js | 6 +++ .../errorReporting/ts-next/errors.txt | 1 + .../errorReporting/ts-next/js/test-4.js | 3 ++ .../externalResolve/ts-next/dts/test-2.d.ts | 1 + .../externalResolve/ts-next/errors.txt | 0 .../externalResolve/ts-next/js/test-2.js | 8 +++ .../filter-referencedFrom/ts-next/errors.txt | 0 .../ts-next/js/concat.js | 54 +++++++++++++++++++ 12 files changed, 86 insertions(+) create mode 100644 test/baselines/basic/ts-next/dts/other-3.d.ts create mode 100644 test/baselines/basic/ts-next/dts/test-3.d.ts create mode 100644 test/baselines/basic/ts-next/errors.txt create mode 100644 test/baselines/basic/ts-next/js/other-3.js create mode 100644 test/baselines/basic/ts-next/js/test-3.js create mode 100644 test/baselines/errorReporting/ts-next/errors.txt create mode 100644 test/baselines/errorReporting/ts-next/js/test-4.js create mode 100644 test/baselines/externalResolve/ts-next/dts/test-2.d.ts create mode 100644 test/baselines/externalResolve/ts-next/errors.txt create mode 100644 test/baselines/externalResolve/ts-next/js/test-2.js create mode 100644 test/baselines/filter-referencedFrom/ts-next/errors.txt create mode 100644 test/baselines/filter-referencedFrom/ts-next/js/concat.js diff --git a/test/baselines/basic/ts-next/dts/other-3.d.ts b/test/baselines/basic/ts-next/dts/other-3.d.ts new file mode 100644 index 00000000..b3a0b19d --- /dev/null +++ b/test/baselines/basic/ts-next/dts/other-3.d.ts @@ -0,0 +1,3 @@ +export declare class Hello { + value: string; +} diff --git a/test/baselines/basic/ts-next/dts/test-3.d.ts b/test/baselines/basic/ts-next/dts/test-3.d.ts new file mode 100644 index 00000000..e69de29b diff --git a/test/baselines/basic/ts-next/errors.txt b/test/baselines/basic/ts-next/errors.txt new file mode 100644 index 00000000..e69de29b diff --git a/test/baselines/basic/ts-next/js/other-3.js b/test/baselines/basic/ts-next/js/other-3.js new file mode 100644 index 00000000..c1d7b812 --- /dev/null +++ b/test/baselines/basic/ts-next/js/other-3.js @@ -0,0 +1,10 @@ +define(["require", "exports"], function (require, exports) { + var Hello = (function () { + function Hello() { + } + return Hello; + })(); + exports.Hello = Hello; +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3RoZXItMy5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9iYXNpYy8iLCJzb3VyY2VzIjpbIm90aGVyLTMudHMiXSwibmFtZXMiOlsiSGVsbG8iLCJIZWxsby5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IjtJQUFBLElBQWEsS0FBSztRQUFsQkEsU0FBYUEsS0FBS0E7UUFFbEJDLENBQUNBO1FBQURELFlBQUNBO0lBQURBLENBQUNBLEFBRkQsSUFFQztJQUZZLGFBQUssR0FBTCxLQUVaLENBQUEifQ== \ No newline at end of file diff --git a/test/baselines/basic/ts-next/js/test-3.js b/test/baselines/basic/ts-next/js/test-3.js new file mode 100644 index 00000000..616d4222 --- /dev/null +++ b/test/baselines/basic/ts-next/js/test-3.js @@ -0,0 +1,6 @@ +define(["require", "exports", './other-3'], function (require, exports, other) { + var a = new other.Hello(); + console.log(a.value); +}); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC0zLmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL2Jhc2ljLyIsInNvdXJjZXMiOlsidGVzdC0zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJ3RUFBTyxLQUFLO0lBRVosSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDMUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMifQ== \ No newline at end of file diff --git a/test/baselines/errorReporting/ts-next/errors.txt b/test/baselines/errorReporting/ts-next/errors.txt new file mode 100644 index 00000000..febb75ba --- /dev/null +++ b/test/baselines/errorReporting/ts-next/errors.txt @@ -0,0 +1 @@ +TypeScript error: test/errorReporting/test-4.ts(1,1): 2304 Cannot find name 'asdf'. \ No newline at end of file diff --git a/test/baselines/errorReporting/ts-next/js/test-4.js b/test/baselines/errorReporting/ts-next/js/test-4.js new file mode 100644 index 00000000..287d2b9a --- /dev/null +++ b/test/baselines/errorReporting/ts-next/js/test-4.js @@ -0,0 +1,3 @@ +asdf; + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC00LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL2Vycm9yUmVwb3J0aW5nLyIsInNvdXJjZXMiOlsidGVzdC00LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLElBQUksQ0FBQyJ9 \ No newline at end of file diff --git a/test/baselines/externalResolve/ts-next/dts/test-2.d.ts b/test/baselines/externalResolve/ts-next/dts/test-2.d.ts new file mode 100644 index 00000000..d3fe4c35 --- /dev/null +++ b/test/baselines/externalResolve/ts-next/dts/test-2.d.ts @@ -0,0 +1 @@ +/// diff --git a/test/baselines/externalResolve/ts-next/errors.txt b/test/baselines/externalResolve/ts-next/errors.txt new file mode 100644 index 00000000..e69de29b diff --git a/test/baselines/externalResolve/ts-next/js/test-2.js b/test/baselines/externalResolve/ts-next/js/test-2.js new file mode 100644 index 00000000..c000f7a9 --- /dev/null +++ b/test/baselines/externalResolve/ts-next/js/test-2.js @@ -0,0 +1,8 @@ +/// +var other = require('./other-2'); +var someModule = require('someModule'); +var a = new other.Hello(); +console.log(a.value); +console.log(someModule); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInRlc3QtMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxBQUNBLHVDQUR1QztBQUN2QyxJQUFPLEtBQUssV0FBVyxXQUFXLENBQUMsQ0FBQztBQUNwQyxJQUFPLFVBQVUsV0FBVyxZQUFZLENBQUMsQ0FBQztBQUUxQyxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUMxQixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUVyQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwiZmlsZSI6InRlc3QtMi5qcyIsInNvdXJjZVJvb3QiOiIuLi8uLi8uLi8uLi9leHRlcm5hbFJlc29sdmUvIn0= \ No newline at end of file diff --git a/test/baselines/filter-referencedFrom/ts-next/errors.txt b/test/baselines/filter-referencedFrom/ts-next/errors.txt new file mode 100644 index 00000000..e69de29b diff --git a/test/baselines/filter-referencedFrom/ts-next/js/concat.js b/test/baselines/filter-referencedFrom/ts-next/js/concat.js new file mode 100644 index 00000000..dcb4379c --- /dev/null +++ b/test/baselines/filter-referencedFrom/ts-next/js/concat.js @@ -0,0 +1,54 @@ +var ClassA = (function () { + function ClassA() { + } + ClassA.prototype.foo = function () { + }; + return ClassA; +})(); +var Mod; +(function (Mod) { + function foo() { } + Mod.foo = foo; +})(Mod || (Mod = {})); + +var implicitReferenced = "Implicit Referenced"; + +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +/// +/// +var ClassZ = (function (_super) { + __extends(ClassZ, _super); + function ClassZ() { + _super.apply(this, arguments); + } + ClassZ.prototype.bar = function () { + }; + return ClassZ; +})(ClassA); +var Mod; +(function (Mod) { + function lorem() { } + Mod.lorem = lorem; +})(Mod || (Mod = {})); + +/// +/// +var TestClass = (function () { + function TestClass() { + } + return TestClass; +})(); +var a = new TestClass(); +console.log(a, new ClassA(), new ClassZ()); +var Mod; +(function (Mod) { + function bar() { } + Mod.bar = bar; +})(Mod || (Mod = {})); + +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImEudHMiLCJpbXBsaWNpdFJlZmVyZW5jZWQudHMiLCJ6LnRzIiwidGVzdC0xLnRzIl0sIm5hbWVzIjpbIkNsYXNzQSIsIkNsYXNzQS5jb25zdHJ1Y3RvciIsIk1vZCIsIkNsYXNzWiIsIkNsYXNzWi5jb25zdHJ1Y3RvciIsIlRlc3RDbGFzcyIsIlRlc3RDbGFzcy5jb25zdHJ1Y3RvciJdLCJtYXBwaW5ncyI6IkFBQUEsSUFBTSxNQUFNO0lBQVpBLFNBQU1BLE1BQU1BO0lBSVpDLENBQUNBO0lBSEFELG9CQUFHQSxHQUFIQTtJQUVBQSxDQUFDQTtJQUNGQSxhQUFDQTtBQUFEQSxDQUpBLEFBSUNBLElBQUE7QUFFRCxJQUFPLEdBQUcsQ0FFVDtBQUZELFdBQU8sR0FBRyxFQUFDLENBQUM7SUFDWEUsU0FBZ0JBLEdBQUdBLEtBQUlBLENBQUNBO0lBQVJBLE9BQUdBLEdBQUhBLEdBQVFBLENBQUFBO0FBQ3pCQSxDQUFDQSxFQUZNLEdBQUcsS0FBSCxHQUFHLFFBRVQ7O0FDUkQsSUFBSSxrQkFBa0IsR0FBRyxxQkFBcUIsQ0FBQzs7Ozs7Ozs7QUNBL0MsQUFFQSw2QkFGNkI7QUFDN0IsOENBQThDO0lBQ3hDLE1BQU07SUFBU0MsVUFBZkEsTUFBTUEsVUFBZUE7SUFBM0JBLFNBQU1BLE1BQU1BO1FBQVNDLDhCQUFNQTtJQUkzQkEsQ0FBQ0E7SUFIQUQsb0JBQUdBLEdBQUhBO0lBRUFBLENBQUNBO0lBQ0ZBLGFBQUNBO0FBQURBLENBSkEsQUFJQ0EsRUFKb0IsTUFBTSxFQUkxQjtBQUVELElBQU8sR0FBRyxDQUVUO0FBRkQsV0FBTyxHQUFHLEVBQUMsQ0FBQztJQUNYRCxTQUFnQkEsS0FBS0EsS0FBSUEsQ0FBQ0E7SUFBVkEsU0FBS0EsR0FBTEEsS0FBVUEsQ0FBQUE7QUFDM0JBLENBQUNBLEVBRk0sR0FBRyxLQUFILEdBQUcsUUFFVDs7QUNWRCw2QkFBNkI7QUFDN0IsNkJBQTZCO0FBRTdCLElBQU0sU0FBUztJQUFmRyxTQUFNQSxTQUFTQTtJQUVmQyxDQUFDQTtJQUFERCxnQkFBQ0E7QUFBREEsQ0FGQSxBQUVDQSxJQUFBO0FBRUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUV4QixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLE1BQU0sRUFBRSxFQUFFLElBQUksTUFBTSxFQUFFLENBQUMsQ0FBQztBQUUzQyxJQUFPLEdBQUcsQ0FFVDtBQUZELFdBQU8sR0FBRyxFQUFDLENBQUM7SUFDWEgsU0FBZ0JBLEdBQUdBLEtBQUlBLENBQUNBO0lBQVJBLE9BQUdBLEdBQUhBLEdBQVFBLENBQUFBO0FBQ3pCQSxDQUFDQSxFQUZNLEdBQUcsS0FBSCxHQUFHLFFBRVQiLCJmaWxlIjoiY29uY2F0LmpzIiwic291cmNlUm9vdCI6Ii4uLy4uLy4uLy4uL2ZpbHRlci1yZWZlcmVuY2VkRnJvbS8ifQ== \ No newline at end of file From e331614f84dadbca7b10257d9c5af01be908999d Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:31:15 +0100 Subject: [PATCH 18/24] Keep enum referenes to ts.SyntaxKind Since different TypeScript versions might have different indices for the syntax kinds. --- definitions/typescript.d.ts | 2 +- lib/project.ts | 6 +++--- release/project.js | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/definitions/typescript.d.ts b/definitions/typescript.d.ts index aa603fe0..b0eb3904 100644 --- a/definitions/typescript.d.ts +++ b/definitions/typescript.d.ts @@ -21,7 +21,7 @@ declare module "typescript" { pos: number; end: number; } - const enum SyntaxKind { + enum SyntaxKind { Unknown = 0, EndOfFileToken = 1, SingleLineCommentTrivia = 2, diff --git a/lib/project.ts b/lib/project.ts index 7dffe7ff..bcaaab1e 100644 --- a/lib/project.ts +++ b/lib/project.ts @@ -322,14 +322,14 @@ export class Project { var references = file.ts.referencedFiles.map(item => path.join(path.dirname(Project.getFileName(file.ts)), Project.getFileName(item))); this.typescript.forEachChild(file.ts, (node) => { - if (node.kind === this.typescript.SyntaxKind.ImportDeclaration) { + if (node.kind === ( this.typescript.SyntaxKind).ImportDeclaration) { var importNode = node; - if (importNode.moduleReference === undefined || importNode.moduleReference.kind !== this.typescript.SyntaxKind.ExternalModuleReference) { + if (importNode.moduleReference === undefined || importNode.moduleReference.kind !== ( this.typescript.SyntaxKind).ExternalModuleReference) { return; } var reference = importNode.moduleReference; - if (reference.expression === undefined || reference.expression.kind !== this.typescript.SyntaxKind.StringLiteral) { + if (reference.expression === undefined || reference.expression.kind !== ( this.typescript.SyntaxKind).StringLiteral) { return; } if (typeof ( reference).text !== 'string') { diff --git a/release/project.js b/release/project.js index f7311038..e1b0c496 100644 --- a/release/project.js +++ b/release/project.js @@ -203,13 +203,13 @@ var Project = (function () { var _this = this; var references = file.ts.referencedFiles.map(function (item) { return path.join(path.dirname(Project.getFileName(file.ts)), Project.getFileName(item)); }); this.typescript.forEachChild(file.ts, function (node) { - if (node.kind === 191 /* ImportDeclaration */) { + if (node.kind === _this.typescript.SyntaxKind.ImportDeclaration) { var importNode = node; - if (importNode.moduleReference === undefined || importNode.moduleReference.kind !== 193 /* ExternalModuleReference */) { + if (importNode.moduleReference === undefined || importNode.moduleReference.kind !== _this.typescript.SyntaxKind.ExternalModuleReference) { return; } var reference = importNode.moduleReference; - if (reference.expression === undefined || reference.expression.kind !== 7 /* StringLiteral */) { + if (reference.expression === undefined || reference.expression.kind !== _this.typescript.SyntaxKind.StringLiteral) { return; } if (typeof reference.text !== 'string') { From 309fd348083c2d54be3e771f690e08052cc8cfb0 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:45:23 +0100 Subject: [PATCH 19/24] Add type checking and tests to default task --- gulpfile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index 0ce8ee55..ce524f92 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -133,4 +133,4 @@ gulp.task('watch', ['scripts'], function() { gulp.watch(paths.scripts, ['scripts']); }); -gulp.task('default', ['scripts']); +gulp.task('default', ['scripts', 'typecheck', 'test']); From 92002b4853cf11131bc5ffe937816777a9e9c320 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:45:52 +0100 Subject: [PATCH 20/24] Added type check jsx-typescript --- gulpfile.js | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/gulpfile.js b/gulpfile.js index ce524f92..f62ab4a4 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -57,8 +57,16 @@ gulp.task('typecheck-dev', function() { ])).pipe(ts(tsOptions)); }); +// Check against jsx-typescript +gulp.task('typecheck-jsx', function() { + return gulp.src(paths.scripts.concat([ + '!defintions/typescript.d.ts', + path.resolve(require.resolve('jsx-typescript'), './typescript.d.ts') + ])).pipe(ts(tsOptions)); +}); + // Checking against the current release of TypeScript on NPM can be done using `gulp scripts`. -gulp.task('typecheck', ['typecheck-dev']); +gulp.task('typecheck', ['typecheck-dev', 'typecheck-jsx']); function runTest(name, callback) { var newTS = require('./release-2/main'); From 64d364899dc4d9098078127e19286abae1647f23 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:46:05 +0100 Subject: [PATCH 21/24] Clean up --- gulpfile.js | 3 --- 1 file changed, 3 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index f62ab4a4..8cccb54c 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -30,15 +30,12 @@ var tests = fs.readdirSync(path.join(__dirname, 'test')).filter(function(dir) { gulp.task('clean', function(cb) { rimraf(paths.releaseBeta, cb); - // gulp.src([paths.releaseBeta + '/*'], { read: false }).pipe(clean()); }); gulp.task('clean-test', function(cb) { rimraf('test/output', cb); - // gulp.src(['test/output/*'], { read: false }).pipe(clean()); }); gulp.task('clean-release', function(cb) { rimraf(paths.release, cb); - // gulp.src([paths.release + '/*'], { read: false }).pipe(clean()); }); gulp.task('scripts', ['clean'], function() { From 705d68c0e90b435e43dbccc4b79bb00c72faeebe Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:52:05 +0100 Subject: [PATCH 22/24] Add comments to gulpfile --- gulpfile.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/gulpfile.js b/gulpfile.js index 8cccb54c..d2d0df75 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -28,6 +28,7 @@ var tests = fs.readdirSync(path.join(__dirname, 'test')).filter(function(dir) { return dir !== 'baselines' && dir !== 'output' && dir.substr(0, 1) !== '.'; }); +// Clean gulp.task('clean', function(cb) { rimraf(paths.releaseBeta, cb); }); @@ -38,6 +39,7 @@ gulp.task('clean-release', function(cb) { rimraf(paths.release, cb); }); +// Compile sources gulp.task('scripts', ['clean'], function() { var tsResult = gulp.src(paths.scripts) .pipe(ts(tsProject)); @@ -46,7 +48,11 @@ gulp.task('scripts', ['clean'], function() { .pipe(gulp.dest(paths.releaseBeta)); }); -// Check against the master of TypeScript +// Type checking against multiple versions of TypeScript: +// - master of TypeScript (typescript-dev) +// - jsx-typescript (a fork of TypeScript with JSX support) +// Checking against the current release of TypeScript on NPM can be done using `gulp scripts`. + gulp.task('typecheck-dev', function() { return gulp.src(paths.scripts.concat([ '!defintions/typescript.d.ts', @@ -54,7 +60,6 @@ gulp.task('typecheck-dev', function() { ])).pipe(ts(tsOptions)); }); -// Check against jsx-typescript gulp.task('typecheck-jsx', function() { return gulp.src(paths.scripts.concat([ '!defintions/typescript.d.ts', @@ -62,11 +67,14 @@ gulp.task('typecheck-jsx', function() { ])).pipe(ts(tsOptions)); }); -// Checking against the current release of TypeScript on NPM can be done using `gulp scripts`. gulp.task('typecheck', ['typecheck-dev', 'typecheck-jsx']); +// Tests + +// helper function for running a test. function runTest(name, callback) { var newTS = require('./release-2/main'); + // We run every test on multiple typescript versions: current release on NPM and the master from GitHub (typescript-dev). var libs = [ ['default', undefined], ['ts-next', require('typescript-dev')], @@ -103,6 +111,9 @@ function runTest(name, callback) { } gulp.task('test', ['clean-test', 'scripts'], function(cb) { + // Use `gulp test --tests [...]` to run specific test(s). + // Example: `gulp test --tests basic,errorReporting` + fs.mkdirSync('test/output/'); var currentTests = tests; @@ -124,6 +135,7 @@ gulp.task('test', ['clean-test', 'scripts'], function(cb) { } }); +// Accept new baselines gulp.task('test-baselines-accept', function(cb) { rimraf(paths.releaseBeta, function() { gulp.src('test/output/**').pipe(gulp.dest('test/baselines')).on('finish', cb); From 2a4586f28326e15a1c2a300a34f73519b5ae04b9 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 11:55:25 +0100 Subject: [PATCH 23/24] Remove jsx-typescript from peerDependencies (temp) --- package.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/package.json b/package.json index 3e36934a..8b368fee 100644 --- a/package.json +++ b/package.json @@ -62,9 +62,6 @@ "yargs": "~1.3.3", "jsx-typescript": "^1.5.0-alpha.4" }, - "peerDependencies": { - "jsx-typescript": "^1.5.0-alpha.4" - }, "repository": { "type": "git", "url": "https://github.com/ivogabe/gulp-typescript.git" From adc8f9dd584df45922ce298b2890a4f4a74ded95 Mon Sep 17 00:00:00 2001 From: Ivo Gabe de Wolff Date: Sat, 7 Mar 2015 13:11:08 +0100 Subject: [PATCH 24/24] Add custom typescript version to readme --- readme.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/readme.md b/readme.md index 3361df74..14416ad9 100644 --- a/readme.md +++ b/readme.md @@ -85,6 +85,27 @@ Options - ```declarationFiles``` (boolean) - Generates corresponding .d.ts files. - ```noExternalResolve``` (boolean) - Do not resolve files that are not in the input. Explanation below. - ```sortOutput``` (boolean) - Sort output files. Usefull if you want to concatenate files (see below). +- ```typescript``` (object) - Use a different version / fork of TypeScript (see below). You probably won't need this option, unless you know what you're doing! + +TypeScript version +------------------ +You can use a custom version of TypeScript. Add the version you want (1.4+) to your package.json file as a devDependency. You can also use the master from GitHub to get the latest features. Make sure the directory `node_modules/gulp-typescript/node_modules/typescript` doesn't exist! If it does, remove it. +You can use this in your `package.json` to get the master from GitHub: +```javascript +{ + "devDependencies": { + "gulp-typescript": "*", + "typescript": "Microsoft/TypeScript" + } +} +``` + +It's also possible to use a fork of TypeScript. Add an extra option to the options object like this: +```javascript +[...].pipe(ts({ + typescript: require('my-fork-of-typescript') +})); +``` Filters -------