Skip to content
This repository was archived by the owner on Apr 20, 2018. It is now read-only.

Commit 7d4fc91

Browse files
Merge pull request #848 from david-driscoll/master
Rewrite typescript declarations
2 parents 412b50d + ca0f50b commit 7d4fc91

270 files changed

Lines changed: 43293 additions & 1828 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Gruntfile.js

Lines changed: 153 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2541,6 +2541,156 @@ module.exports = function (grunt) {
25412541
'nuget-time',
25422542
'nuget-virtualtime'
25432543
]);
2544+
2545+
2546+
2547+
grunt.registerTask('rebuild-ts', 'Rebuild typescript declarations', function() {
2548+
var path = require('path');
2549+
var fs = require('fs');
2550+
2551+
var cache = {};
2552+
var dependencies = {};
2553+
var concatItems = grunt.config.get('concat');
2554+
2555+
function loadFile(tsFile) {
2556+
if (cache[tsFile]) {
2557+
return;
2558+
}
2559+
var dependencyRegex = /\/\/\/ <reference path\=\"(.*?)\" \/>/g;
2560+
var c; //, count = 0;
2561+
var source = grunt.file.read(tsFile);
2562+
2563+
// source with tests
2564+
var s = source.match(/module Rx \{([\s\S]*)\}[\s\S]*\(function/);
2565+
if (s && s[1]) {
2566+
c = cache[tsFile] = s[1];
2567+
}
2568+
if (!s) {
2569+
// source without tests
2570+
s = source.match(/module Rx \{([\s\S]*)\}/);
2571+
if (s && s[1]) {
2572+
c = cache[tsFile] = s[1];
2573+
}
2574+
}
2575+
2576+
var deps = dependencies[tsFile] = [];
2577+
var result;
2578+
while (result = dependencyRegex.exec(source)) {
2579+
var dep = path.resolve(__dirname, path.dirname(tsFile), result[1])
2580+
.substr(__dirname.length + 1)
2581+
.replace(/\\/g, '/');
2582+
2583+
deps.push(dep);
2584+
loadFile(dep);
2585+
}
2586+
2587+
return c;
2588+
}
2589+
2590+
function addLoadedFile(tsFile) {
2591+
if (loadedFiles[tsFile]) {
2592+
return;
2593+
}
2594+
2595+
if (!(tsFile.match(/\/toset\.ts$/) || tsFile.match(/\/tomap\.ts$/))) {
2596+
output.push(cache[tsFile]);
2597+
}
2598+
es6Output.push(cache[tsFile]);
2599+
loadedFiles[tsFile] = true;
2600+
}
2601+
2602+
function addFileContent(tsFile) {
2603+
if (loadedFiles[tsFile]) {
2604+
return;
2605+
}
2606+
2607+
var deps = dependencies[tsFile];
2608+
for (var k = 0; k < deps.length; k++) {
2609+
addLoadedFile(deps[k]);
2610+
addFileContent(deps[k]);
2611+
}
2612+
2613+
addLoadedFile(tsFile);
2614+
}
2615+
2616+
loadFile('ts/core/es5.ts');
2617+
loadFile('ts/core/es6.ts');
2618+
2619+
for (var key in concatItems) {
2620+
var loadedFiles = {};
2621+
var output = [];
2622+
var es6Output = [];
2623+
var value = concatItems[key];
2624+
var src = value.src;
2625+
var dest = value.dest;
2626+
2627+
var dist = false;
2628+
2629+
if (key.indexOf('-compat') > -1) {
2630+
continue;
2631+
}
2632+
2633+
if (dest.indexOf('dist/') === 0) {
2634+
dist = dest.match(/dist\/(.*?)\.js/)[1];
2635+
dest = dest.replace(/dist\/(.*?)\.js/, 'ts/$1.d.ts');
2636+
} else if (dest.indexOf('modules/') === 0) {
2637+
continue;
2638+
} else {
2639+
throw new Error("not sure how to handle " + dest);
2640+
}
2641+
2642+
for (var i = 0; i < src.length; i++) {
2643+
var file = src[i];
2644+
var tsFile = file
2645+
.replace(/src\/(.*?).js/, 'ts/$1.ts')
2646+
// Is this right 100% of the time?
2647+
.replace('perf/operators', 'linq/observable');
2648+
2649+
if (cache[tsFile] || fs.existsSync(tsFile)) {
2650+
if (!cache[tsFile]) {
2651+
loadFile(tsFile);
2652+
}
2653+
2654+
if (tsFile.indexOf('/es5') === -1 || tsFile.indexOf('/es6') === -1) {
2655+
addFileContent(tsFile);
2656+
}
2657+
} else {
2658+
var valid = ['/headers/', '/longstacktraces/', '/internal/', '/autodetachobserver', '/subjects/innersubscription', '/perf/observablebase', 'linq/enumerable/while', '.compat.', 'linq/observable/_', '/linq/observable/fromarrayobservable', '/joins/', '/linq/observable/flatmapbase', '/disposables/scheduleddisposable', '/concurrency/catchscheduler', '/core/observeonobserver', '/testing/mockpromise', '/testing/hotobservable', '/testing/coldobservable'];
2659+
var validResult = false;
2660+
for (var z = 0; z < valid.length; z++) {
2661+
if (tsFile.indexOf(valid[z]) !== -1) {
2662+
validResult = true;
2663+
break;
2664+
}
2665+
}
2666+
2667+
if (!validResult) {
2668+
console.log('missing file: ' + tsFile);
2669+
}
2670+
}
2671+
}
2672+
2673+
output.unshift(cache['ts/core/es5.ts']);
2674+
es6Output.unshift(cache['ts/core/es6.ts']);
2675+
2676+
var outputString = 'declare module Rx {\n' + output.join('') + '\n}\n';
2677+
outputString += '\ndeclare module "rx" { export = Rx; }\n';
2678+
if (dist) {
2679+
outputString += 'declare module "'+dist+'" { export = Rx; }';
2680+
}
2681+
grunt.file.write(dest, outputString);
2682+
2683+
outputString = 'declare module Rx {\n' + es6Output.join('') + '\n}\n';
2684+
outputString += '\ndeclare module "rx" { export = Rx; }\n';
2685+
if (dist) {
2686+
outputString += '\ndeclare module "'+dist+'" { export = Rx; }\n';
2687+
}
2688+
grunt.file.write(dest.replace(/^ts\//, 'ts/es6/'), outputString);
2689+
}
2690+
2691+
grunt.file.write('ts/es6/es6-iterable.d.ts', grunt.file.read('ts/core/es6-iterable.d.ts'));
2692+
grunt.file.write('ts/es6/es6-promise.d.ts', grunt.file.read('ts/core/es6-promise.d.ts'));
2693+
});
25442694

25452695
grunt.registerTask('concat-min', [
25462696
'concat:core',
@@ -2633,7 +2783,7 @@ module.exports = function (grunt) {
26332783
'copy:lite-extras-compat',
26342784
'copy:core',
26352785
'copy:core-binding',
2636-
'copy:core-testing',
2786+
'copy:core-testing'
26372787
]);
26382788

26392789
// Default task
@@ -2730,6 +2880,7 @@ module.exports = function (grunt) {
27302880
'copy:core-binding',
27312881
'copy:core-testing',
27322882

2733-
'qunit'
2883+
'qunit',
2884+
'rebuild-ts'
27342885
]);
27352886
};

ts/core/abstractobserver.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/// <reference path="./disposables/disposable.ts" />
2+
/// <reference path="./observer-lite.ts" />
3+
module Rx {
4+
export module internals {
5+
/**
6+
* Abstract base class for implementations of the Observer class.
7+
* This base class enforces the grammar of observers where OnError and OnCompleted are terminal messages.
8+
*/
9+
export interface AbstractObserver<T> extends Rx.IObserver<T>, Rx.IDisposable {
10+
/**
11+
* Notifies the observer of a new element in the sequence.
12+
* @param {Any} value Next element in the sequence.
13+
*/
14+
onNext(value: T): void;
15+
/**
16+
* Notifies the observer that an exception has occurred.
17+
* @param {Any} error The error that has occurred.
18+
*/
19+
onError(exception: any): void;
20+
/**
21+
* Notifies the observer of the end of the sequence.
22+
*/
23+
onCompleted(): void;
24+
25+
isStopped: boolean;
26+
27+
/**
28+
* Disposes the observer, causing it to transition to the stopped state.
29+
*/
30+
dispose(): void;
31+
32+
fail(e: any): boolean;
33+
34+
// Must be implemented by other observers
35+
next(value: T): void;
36+
error(error: any): void;
37+
completed(): void;
38+
}
39+
40+
interface AbstractObserverStatic {
41+
new <T>(): AbstractObserver<T>;
42+
}
43+
44+
export var AbstractObserver: AbstractObserverStatic
45+
}
46+
}
47+
48+
(function() {
49+
var iObserver: Rx.IObserver<number>;
50+
var abstractObserver: Rx.internals.AbstractObserver<number>;
51+
52+
iObserver = abstractObserver;
53+
});

ts/core/anonymousobservable.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
/// <reference path="./observable.ts" />
2+
module Rx {
3+
export interface AnonymousObservable<T> extends Observable<T> { }
4+
}
5+
6+
(function() {
7+
var observable: Rx.Observable<number>;
8+
var anonymousObservable: Rx.AnonymousObservable<number>;
9+
10+
observable = anonymousObservable;
11+
});

ts/core/anonymousobserver.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
/// <reference path="./observer-lite.ts" />
2+
module Rx {
3+
/**
4+
* Class to create an Observer instance from delegate-based implementations of the on* methods.
5+
*/
6+
export interface AnonymousObserver<T> extends Observer<T> {
7+
/**
8+
* Notifies the observer of a new element in the sequence.
9+
* @param {Any} value Next element in the sequence.
10+
*/
11+
onNext(value: T): void;
12+
/**
13+
* Notifies the observer that an exception has occurred.
14+
* @param {Any} error The error that has occurred.
15+
*/
16+
onError(exception: any): void;
17+
/**
18+
* Notifies the observer of the end of the sequence.
19+
*/
20+
onCompleted(): void;
21+
}
22+
23+
interface AnonymousObserverStatic {
24+
/**
25+
* Creates an observer from the specified OnNext, OnError, and OnCompleted actions.
26+
* @param {Any} onNext Observer's OnNext action implementation.
27+
* @param {Any} onError Observer's OnError action implementation.
28+
* @param {Any} onCompleted Observer's OnCompleted action implementation.
29+
*/
30+
new <T>(onNext?: (value: T) => void, onError?: (exception: any) => void, onCompleted?: () => void): AnonymousObserver<T>;
31+
}
32+
33+
export var AnonymousObserver : AnonymousObserverStatic;
34+
}
35+
36+
37+
(function() {
38+
var iObserver: Rx.IObserver<number>;
39+
var anonymousObserver: Rx.AnonymousObserver<number>;
40+
41+
iObserver = anonymousObserver;
42+
});

ts/core/backpressure/controlled.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/// <reference path="../disposables/disposable.ts" />
2+
/// <reference path="../concurrency/scheduler.ts" />
3+
module Rx {
4+
export interface Observable<T> {
5+
/**
6+
* Attaches a controller to the observable sequence with the ability to queue.
7+
* @example
8+
* var source = Rx.Observable.interval(100).controlled();
9+
* source.request(3); // Reads 3 values
10+
* @param {bool} enableQueue truthy value to determine if values should be queued pending the next request
11+
* @param {Scheduler} scheduler determines how the requests will be scheduled
12+
* @returns {Observable} The observable sequence which only propagates values on request.
13+
*/
14+
controlled(enableQueue?: boolean, scheduler?: IScheduler): ControlledObservable<T>;
15+
}
16+
17+
export interface ControlledObservable<T> extends Observable<T> {
18+
request(numberOfItems?: number): IDisposable;
19+
}
20+
}
21+
22+
(function() {
23+
var o: Rx.Observable<string>;
24+
var c = o.controlled();
25+
26+
var d: Rx.IDisposable = c.request();
27+
d = c.request();
28+
d = c.request(5);
29+
});

ts/core/backpressure/pausable.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/// <reference path="../concurrency/scheduler.ts" />
2+
module Rx {
3+
export interface Observable<T> {
4+
/**
5+
* Pauses the underlying observable sequence based upon the observable sequence which yields true/false.
6+
* @example
7+
* var pauser = new Rx.Subject();
8+
* var source = Rx.Observable.interval(100).pausable(pauser);
9+
* @param {Observable} pauser The observable sequence used to pause the underlying sequence.
10+
* @returns {Observable} The observable sequence which is paused based upon the pauser.
11+
*/
12+
pausable(pauser?: Observable<boolean>): PausableObservable<T>;
13+
}
14+
15+
export interface PausableObservable<T> extends Observable<T> {
16+
pause(): void;
17+
resume(): void;
18+
}
19+
}
20+
21+
(function() {
22+
var o: Rx.Observable<string>;
23+
var b: Rx.Observable<boolean>;
24+
var c = o.pausable();
25+
var c = o.pausable(b);
26+
27+
c.pause();
28+
c.resume();
29+
})
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/// <reference path="./pausable.ts" />
2+
module Rx {
3+
export interface Observable<T> {
4+
/**
5+
* Pauses the underlying observable sequence based upon the observable sequence which yields true/false,
6+
* and yields the values that were buffered while paused.
7+
* @example
8+
* var pauser = new Rx.Subject();
9+
* var source = Rx.Observable.interval(100).pausableBuffered(pauser);
10+
* @param {Observable} pauser The observable sequence used to pause the underlying sequence.
11+
* @returns {Observable} The observable sequence which is paused based upon the pauser.
12+
*/
13+
pausableBuffered(pauser?: Observable<boolean>): PausableObservable<T>;
14+
}
15+
}
16+
17+
(function() {
18+
var o: Rx.Observable<string>;
19+
var b: Rx.Observable<boolean>;
20+
var c = o.pausableBuffered();
21+
var c = o.pausableBuffered(b);
22+
})

ts/core/backpressure/pauser.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
module Rx {
2+
/**
3+
* Used to pause and resume streams.
4+
*/
5+
export interface Pauser {
6+
/**
7+
* Pauses the underlying sequence.
8+
*/
9+
pause(): void;
10+
11+
/**
12+
* Resumes the underlying sequence.
13+
*/
14+
resume(): void;
15+
}
16+
}
17+
18+
(function() {
19+
var p: Rx.Pauser;
20+
21+
p.pause;
22+
p.resume;
23+
})

0 commit comments

Comments
 (0)