Skip to content

Commit 4a70941

Browse files
chore(typings): added tool to generate typings from source
1 parent e4c7b52 commit 4a70941

File tree

3 files changed

+185
-3
lines changed

3 files changed

+185
-3
lines changed

package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,15 +13,16 @@
1313
},
1414
"scripts": {
1515
"build_all": "npm run build_es6 && npm run build_amd && npm run build_cjs && npm run build_global && npm run generate_packages",
16-
"build_amd": "rm -rf dist/amd && tsc typings/es6-shim/es6-shim.d.ts src/Rx.ts -m amd --outDir dist/amd --sourcemap --target ES5 --diagnostics --pretty",
17-
"build_cjs": "rm -rf dist/cjs && tsc typings/es6-shim/es6-shim.d.ts src/Rx.ts src/Rx.KitchenSink.ts -m commonjs --outDir dist/cjs --sourcemap --target ES5 -d --diagnostics --pretty",
18-
"build_es6": "rm -rf dist/es6 && tsc src/Rx.ts src/Rx.KitchenSink.ts --outDir dist/es6 --sourceMap --target ES6 -d --diagnostics --pretty",
16+
"build_amd": "npm run build_operators && rm -rf dist/amd && tsc typings/es6-shim/es6-shim.d.ts src/Rx.ts -m amd --outDir dist/amd --sourcemap --target ES5 --diagnostics --pretty",
17+
"build_cjs": "npm run build_operators && rm -rf dist/cjs && tsc typings/es6-shim/es6-shim.d.ts src/Rx.ts src/Rx.KitchenSink.ts -m commonjs --outDir dist/cjs --sourcemap --target ES5 -d --diagnostics --pretty",
18+
"build_es6": "npm run build_operators && rm -rf dist/es6 && tsc src/Rx.ts src/Rx.KitchenSink.ts --outDir dist/es6 --sourceMap --target ES6 -d --diagnostics --pretty",
1919
"build_closure": "java -jar ./node_modules/google-closure-compiler/compiler.jar ./dist/global/Rx.umd.js --language_in ECMASCRIPT5 --create_source_map ./dist/global/Rx.umd.min.js.map --js_output_file ./dist/global/Rx.umd.min.js",
2020
"build_global": "rm -rf dist/global && mkdir \"dist/global\" && browserify -s Rx dist/cjs/Rx.js --outfile dist/global/Rx.umd.js && npm run build_closure",
2121
"build_perf": "npm run build_cjs && npm run build_global && webdriver-manager update && npm run perf",
2222
"build_test": "rm -rf dist/ && npm run lint && npm run build_cjs && jasmine",
2323
"build_cover": "rm -rf dist/ && npm run lint && npm run build_cjs && npm run cover",
2424
"build_docs": "./docgen.sh",
25+
"build_operators": "node tools/typing-generator.js",
2526
"lint_perf": "eslint perf/",
2627
"lint_spec": "eslint spec/**/*.js",
2728
"lint_src": "tslint -c tslint.json src/*.ts src/**/*.ts src/**/**/*.ts",

src/typings-generated.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import {Observable} from './Observable';
2+
import {Scheduler} from './Scheduler';
3+
4+
/* tslint:disable:class-name *//* tslint:disable:max-line-length */
5+
/* ||| MARKER ||| */
6+
/* ||| MARKER ||| */

tools/typing-generator.js

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
var fs = require('fs');
2+
var regex = /export (interface|class) .*?Operators<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(/(.*?)\: (operator|observable)\.(proto|static|create)\.(.*?)(<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(/(\/\* \|\|\| MARKER \|\|\| \*\/[\s|\S]*?\/\* \|\|\| MARKER \|\|\| \*\/)/, fileResult);
122+
fs.writeFileSync('./src/typings-generated.ts', typingsContent);
123+
124+
125+
function computeTypingsFor(s) {
126+
var captureRegex = /\/\*\-\-([\s|\S]*?)-\-\*\//g;
127+
var computeNumberRegex = /\*compute (\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

Comments
 (0)