1
+ var fs = require ( 'fs' ) ;
2
+ var regex = / e x p o r t ( i n t e r f a c e | c l a s s ) .* ?O p e r a t o r s < T > \s * \{ ( [ \S | \s ] * ) \} / ;
3
+
4
+ var core = fs . readFileSync ( './src/Observable.ts' ) . toString ( ) ;
5
+ var kitchenSink = fs . readFileSync ( './src/Rx.KitchenSink.ts' ) . toString ( ) ;
6
+ var combinedMethods = core . match ( regex ) [ 2 ] . trim ( ) + '\n' + kitchenSink . match ( regex ) [ 2 ] . trim ( ) ;
7
+ var contents = combinedMethods . split ( '\n' ) ;
8
+
9
+ var hasOperators = { } ;
10
+ var observables = { } ;
11
+ var operators = { } ;
12
+ var fileResult = '' ;
13
+
14
+ for ( var i = 0 ; i < contents . length ; i ++ ) {
15
+ var item = contents [ i ] . trim ( ) ;
16
+ if ( item ) {
17
+ var file = item . match ( / ( .* ?) \: ( o p e r a t o r | o b s e r v a b l e ) \. ( p r o t o | s t a t i c | c r e a t e ) \. ( .* ?) ( < T > ) ? ; / ) ;
18
+ if ( ! file ) {
19
+ continue ;
20
+ }
21
+
22
+ var _observable = file [ 2 ] === "observable" ;
23
+ var _static = file [ 3 ] === "static" || _observable ;
24
+ var name = file [ 4 ] . trim ( ) ;
25
+ var filename = file [ 4 ] . trim ( ) + ( ! _observable && _static ? '-static' : '' ) ;
26
+ var fileContent ;
27
+
28
+ if ( _observable ) {
29
+ fileContent = fs . readFileSync ( './src/observable/' + filename + '.ts' ) . toString ( 'utf8' ) ;
30
+ } else {
31
+ if ( fs . existsSync ( './src/operator/' + filename + '.ts' ) ) {
32
+ fileContent = fs . readFileSync ( './src/operator/' + filename + '.ts' ) . toString ( 'utf8' ) ;
33
+ } else {
34
+ fileContent = fs . readFileSync ( './src/operator/extended/' + filename + '.ts' ) . toString ( 'utf8' ) ;
35
+ }
36
+ }
37
+
38
+ fileContent = computeTypingsFor ( fileContent ) ;
39
+
40
+ var methods = [ ] ;
41
+
42
+ var r ;
43
+ if ( _observable ) {
44
+ r = new RegExp ( 'static [_]?' + file [ 3 ] + '([\\s|\\S]*?[\\;\\{])' , 'g' ) ;
45
+ } else {
46
+ r = new RegExp ( 'export function [_]?' + name + '([\\s|\\S]*?[\\;\\{])' , 'g' ) ;
47
+ }
48
+
49
+ do {
50
+ var result = r . exec ( fileContent ) ;
51
+ if ( result ) {
52
+ var method = result [ 1 ] . trim ( ) ;
53
+ if ( methods . length > 0 && method . indexOf ( '{' ) > - 1 ) {
54
+ continue ;
55
+ }
56
+
57
+ method = method . split ( / \n / g)
58
+ . filter ( function ( x ) {
59
+ return ! ! x ;
60
+ } )
61
+ . map ( function ( x ) {
62
+ return ( '' + x ) . trim ( ) ;
63
+ } )
64
+ . join ( ' ' )
65
+ . replace ( / ( [ \w | \d ] * ?) \: ( \w * ) = [ \w | \d | \. | \- ] * / g, '$1?: $2' ) ;
66
+
67
+ if ( method [ method . length - 1 ] === ';' || method [ method . length - 1 ] === '{' ) {
68
+ method = method . substr ( 0 , method . length - 1 ) . trim ( ) ;
69
+ }
70
+
71
+ if ( ! _static ) {
72
+ method = method . replace ( / ^ < T > / , '' ) . replace ( / ^ < T , / , '<' ) ;
73
+ }
74
+ methods . push ( method ) ;
75
+ }
76
+ } while ( result ) ;
77
+
78
+ if ( ! hasOperators [ filename ] ) {
79
+ hasOperators [ filename ] = true ;
80
+ if ( _observable ) {
81
+ observables [ file [ 2 ] ] = {
82
+ name : name ,
83
+ type : file [ 3 ] ,
84
+ methods : methods
85
+ } ;
86
+ } else {
87
+ operators [ file [ 2 ] ] = {
88
+ name : name ,
89
+ type : file [ 3 ] ,
90
+ methods : methods
91
+ } ;
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ fileResult += 'export module observable {\n' ;
98
+ for ( var i in observables ) {
99
+ var value = observables [ i ] ;
100
+ fileResult += ' export module ' + value . type + ' {\n' ;
101
+ fileResult += ' export interface ' + value . name + ' {\n' ;
102
+ fileResult += ' ' + value . methods . join ( ';\n ' ) + ';\n' ;
103
+ fileResult += ' }\n' ;
104
+ fileResult += ' }\n' ;
105
+ }
106
+ fileResult += '}\n' ;
107
+
108
+ fileResult += 'export module operator {\n' ;
109
+ for ( var i in operators ) {
110
+ var value = operators [ i ] ;
111
+ fileResult += ' export module ' + value . type + ' {\n' ;
112
+ fileResult += ' export interface ' + value . name + ' {\n' ;
113
+ fileResult += ' ' + value . methods . join ( ';\n ' ) + ';\n' ;
114
+ fileResult += ' }\n' ;
115
+ fileResult += ' }\n' ;
116
+ }
117
+ fileResult += '}\n' ;
118
+
119
+ var typingsContent = fs . readFileSync ( './src/typings-generated.ts' ) . toString ( ) ;
120
+ fileResult = '/* ||| MARKER ||| */\n' + fileResult + '/* ||| MARKER ||| */' ;
121
+ typingsContent = typingsContent . replace ( / ( \/ \* \| \| \| M A R K E R \| \| \| \* \/ [ \s | \S ] * ?\/ \* \| \| \| M A R K E R \| \| \| \* \/ ) / , fileResult ) ;
122
+ fs . writeFileSync ( './src/typings-generated.ts' , typingsContent ) ;
123
+
124
+
125
+ function computeTypingsFor ( s ) {
126
+ var captureRegex = / \/ \* \- \- ( [ \s | \S ] * ?) - \- \* \/ / g;
127
+ var computeNumberRegex = / \* c o m p u t e ( \d .* ?) ? \* / ;
128
+ var tokenRegex = / \{ .* ?\} / g;
129
+
130
+ s = s . replace ( captureRegex , function ( capture ) {
131
+ capture = capture . trim ( ) ;
132
+ capture = capture . substr ( 3 , capture . length - 3 * 2 ) ;
133
+ var compute = computeNumberRegex . exec ( capture ) ;
134
+ if ( compute ) {
135
+ compute = compute [ 1 ] || '6' ;
136
+ } else {
137
+ compute = '6' ;
138
+ }
139
+ var range = compute . split ( '-' ) ;
140
+ if ( range . length === 1 ) {
141
+ var start = 1 ;
142
+ var end = range [ 0 ] ;
143
+ } else {
144
+ var start = range [ 0 ] ;
145
+ var end = range [ 1 ] ;
146
+ }
147
+
148
+ capture = capture . replace ( computeNumberRegex , '' ) . trim ( ) ;
149
+
150
+ var tokenResult ;
151
+ var results = [ ] ;
152
+ for ( var number = start ; number <= end ; number ++ ) {
153
+ var res = capture . replace ( tokenRegex , function ( capture , index , str ) {
154
+ var items = [ ] ;
155
+ capture = capture . substr ( 1 , capture . length - 2 ) ;
156
+ var union = capture . indexOf ( '|U|' ) > - 1 ;
157
+ for ( var i = start ; i <= number ; i ++ ) {
158
+ var typeName = 'T' + ( i === 1 ? '' : i ) ;
159
+ items . push ( capture
160
+ . replace ( / \| U \| / g, typeName )
161
+ . replace ( / \| X \| / g, typeName )
162
+ . replace ( / \| v \| / g, 'v' + i )
163
+ ) ;
164
+ }
165
+
166
+ return items . join ( union ? ' | ' : ', ' ) ;
167
+ } ) ;
168
+ results . push ( res ) ;
169
+ }
170
+
171
+ return results . join ( '\n' ) ;
172
+ } ) ;
173
+
174
+ return s ;
175
+ }
0 commit comments