Skip to content

Commit b815284

Browse files
committed
When module is none, generate bare files source code.
Move unit tests to Jasmine. Urigo/angular2-meteor#102
1 parent 9899b1d commit b815284

File tree

6 files changed

+172
-147
lines changed

6 files changed

+172
-147
lines changed

compiler-tests.js

Lines changed: 0 additions & 123 deletions
This file was deleted.

package.js

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,15 @@ Package.onUse(function(api) {
2929
});
3030

3131
Package.onTest(function(api) {
32-
api.use(['tinytest', 'underscore']);
33-
api.use('ecmascript');
32+
api.use([
33+
'tinytest',
34+
'ecmascript',
35+
'underscore',
36+
'sanjo:[email protected]']);
3437
api.use('barbatus:typescript-compiler');
3538

36-
api.addFiles('compiler-tests.js', 'server');
39+
api.addFiles([
40+
'tests/server/unit/input-file.js',
41+
'tests/server/unit/compiler-tests_spec.js'
42+
], 'server');
3743
});

run_tests.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
#!/bin/sh
2+
VELOCITY_TEST_PACKAGES=1 meteor test-packages --driver-package=velocity:html-reporter ./
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
describe('typescript-compiler', () => {
2+
let testCodeLine = 'export const foo = "foo"';
3+
4+
describe('testing options', () => {
5+
it('should have commonjs by default', () => {
6+
let compiler = new TypeScriptCompiler();
7+
8+
let inputFile = new InputFile(testCodeLine, 'foo1.ts');
9+
compiler.processFilesForTarget([inputFile]);
10+
11+
expect(inputFile.result).not.toBeNull();
12+
expect(inputFile.result.data).toContain('exports.foo');
13+
});
14+
15+
it('should apply extra compiler options', () => {
16+
let compiler = new TypeScriptCompiler({
17+
module: 'system'
18+
});
19+
20+
let inputFile = new InputFile(testCodeLine, 'foo2.ts');
21+
compiler.processFilesForTarget([inputFile]);
22+
23+
expect(inputFile.result.data).toContain('System.register(\"foo2\"');
24+
});
25+
});
26+
27+
describe('testing tsconfig.json', () => {
28+
it('config should be recognized and watched', () => {
29+
let compiler = new TypeScriptCompiler();
30+
31+
let configFile = new ConfigFile({
32+
compilerOptions: {
33+
module: 'system'
34+
}
35+
});
36+
let inputFile = new InputFile(testCodeLine, 'foo3.ts');
37+
compiler.processFilesForTarget([inputFile, configFile]);
38+
39+
expect(inputFile.result.data).toContain('System.register(\"foo3\"');
40+
41+
// Change config and test.
42+
configFile.compilerOptions.module = 'commonjs';
43+
compiler.processFilesForTarget([inputFile, configFile]);
44+
expect(inputFile.result.data).toContain('exports.foo');
45+
});
46+
});
47+
48+
describe('testing diagnostics', () => {
49+
it('should log out diagnostics by default', () => {
50+
let logger = jasmine.createSpy();
51+
let compiler = new TypeScriptCompiler(null, null, logger);
52+
53+
let configFile = new ConfigFile({
54+
compilerOptions: {
55+
module: 'system'
56+
}
57+
});
58+
let wrongImport = 'import {api} from "lib";';
59+
let inputFile = new InputFile(wrongImport, 'foo4.ts');
60+
compiler.processFilesForTarget([inputFile, configFile]);
61+
62+
expect(logger).toHaveBeenCalled();
63+
expect(logger.calls.first().args[0]).toBeDefined();
64+
});
65+
});
66+
67+
describe('testing modules', () => {
68+
it('should render bare source code if module is none', () => {
69+
let compiler = new TypeScriptCompiler({
70+
module: 'none'
71+
});
72+
let moduleFoo = 'module foo {}';
73+
let inputFile = new InputFile(moduleFoo, 'foo5.ts');
74+
let compiler = new TypeScriptCompiler();
75+
compiler.processFilesForTarget([inputFile, configFile]);
76+
77+
expect(inputFile.result.bare).toBe(true);
78+
});
79+
});
80+
});

tests/server/unit/input-file.js

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
const crypto = Npm.require('crypto');
2+
3+
function sha1(content) {
4+
let hash = crypto.createHash('sha1');
5+
hash.update(content);
6+
return hash.digest('hex');
7+
}
8+
9+
InputFile = class InputFile {
10+
constructor(source, fileName, options) {
11+
this.source = source;
12+
this.fileName = fileName;
13+
this.options = options || {};
14+
}
15+
16+
getContentsAsString() {
17+
return this.source;
18+
}
19+
20+
getPackageName() {
21+
return null;
22+
}
23+
24+
getPathInPackage() {
25+
return this.fileName;
26+
}
27+
28+
getBasename() {
29+
return this.fileName;
30+
}
31+
32+
getFileOptions() {
33+
return this.options;
34+
}
35+
36+
getSourceHash() {
37+
return sha1(this.getContentsAsString());
38+
}
39+
40+
addJavaScript(result) {
41+
this.result = result;
42+
}
43+
}
44+
45+
ConfigFile = class ConfigFile extends InputFile {
46+
constructor(config) {
47+
super(JSON.stringify(config), 'tsconfig.json');
48+
for (let key in config) {
49+
this[key] = config[key];
50+
}
51+
}
52+
53+
getContentsAsString() {
54+
return JSON.stringify(this);
55+
}
56+
}

typescript-compiler.js

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -37,40 +37,37 @@ TypeScriptCompiler = class TypeScriptCompiler {
3737

3838
const future = new Future;
3939
async.eachLimit(tsFiles, this.maxParallelism, (inputFile, cb) => {
40+
let compilerOptions = this.tsconfig ?
41+
this.tsconfig.compilerOptions : null;
42+
43+
compilerOptions = TypeScript.getCompilerOptions(
44+
compilerOptions, this.extraOptions);
45+
4046
let source = inputFile.getContentsAsString();
41-
let packageName = inputFile.getPackageName();
4247
let inputFilePath = inputFile.getPathInPackage();
4348
let outputFilePath = removeTsExt(inputFilePath) + '.js';
44-
let fileOptions = inputFile.getFileOptions();
4549
let toBeAdded = {
4650
sourcePath: inputFilePath,
4751
path: outputFilePath,
4852
data: source,
4953
hash: inputFile.getSourceHash(),
5054
sourceMap: null,
51-
bare: !! fileOptions.bare
55+
bare: this.isBareFile(inputFile, compilerOptions)
56+
};
57+
58+
let filePath = this.getExtendedPath(inputFile);
59+
let typings = this.tsconfig ? this.tsconfig.typings : [];
60+
let moduleName = this.getFileModuleName(inputFile, compilerOptions);
61+
let tsOptions = {
62+
compilerOptions,
63+
moduleName,
64+
filePath,
65+
typings
5266
};
5367

5468
let error = null;
5569
try {
56-
let compilerOptions = this.tsconfig ?
57-
this.tsconfig.compilerOptions : null;
58-
59-
compilerOptions = TypeScript.getCompilerOptions(
60-
compilerOptions, this.extraOptions);
61-
62-
let filePath = this.getExtendedPath(inputFile);
63-
let typings = this.tsconfig ? this.tsconfig.typings : [];
64-
let moduleName = this.getFileModuleName(inputFile, compilerOptions);
65-
66-
let options = {
67-
compilerOptions,
68-
moduleName,
69-
filePath,
70-
typings
71-
};
72-
73-
let result = TypeScript.compile(getFileContent, options);
70+
let result = TypeScript.compile(getFileContent, tsOptions);
7471
this.processDiagnostics(inputFile,
7572
result.diagnostics, compilerOptions);
7673

@@ -126,6 +123,13 @@ TypeScriptCompiler = class TypeScriptCompiler {
126123
return noExt ? removeTsExt(filePath) : filePath;
127124
}
128125

126+
isBareFile(inputFile, compilerOptions) {
127+
let fileOptions = inputFile.getFileOptions();
128+
let packageName = inputFile.getPackageName();
129+
return (fileOptions.bare ||
130+
(! packageName && compilerOptions.module === 'none'));
131+
}
132+
129133
getFileModuleName(inputFile, options) {
130134
return options.module !== 'none' ?
131135
this.getExtendedPath(inputFile, true): null;

0 commit comments

Comments
 (0)