typescript-monkey 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.coveralls.yml +1 -0
- data/.editorconfig +27 -0
- data/.gitignore +52 -0
- data/.ruby-gemset +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +27 -0
- data/.vscode/tasks.json +40 -0
- data/CHANGES.md +48 -0
- data/Gemfile +16 -0
- data/LICENSE.txt +22 -0
- data/README.md +351 -0
- data/Rakefile +13 -0
- data/contrib/example_package.json +10 -0
- data/contrib/example_typescript.rb +14 -0
- data/gulpfile.js +67 -0
- data/lib/assets/javascripts/transpiler.ts.erb +1 -0
- data/lib/assets/javascripts/transpiler_pkg.js.erb +2 -0
- data/lib/assets/javascripts/typescript.js.erb +1 -0
- data/lib/assets/typescripts/transpile_once.ts +13 -0
- data/lib/assets/typescripts/transpiler.ts +203 -0
- data/lib/rails/generators/typescript/assets/assets_generator.rb +13 -0
- data/lib/rails/generators/typescript/assets/templates/javascript.ts +3 -0
- data/lib/typescript-monkey.rb +8 -0
- data/lib/typescript/monkey.rb +9 -0
- data/lib/typescript/monkey/cli.rb +22 -0
- data/lib/typescript/monkey/compiler.rb +177 -0
- data/lib/typescript/monkey/configuration.rb +49 -0
- data/lib/typescript/monkey/engine.rb +18 -0
- data/lib/typescript/monkey/js_hook.rb +15 -0
- data/lib/typescript/monkey/package.rb +239 -0
- data/lib/typescript/monkey/railtie.rb +20 -0
- data/lib/typescript/monkey/template.rb +32 -0
- data/lib/typescript/monkey/template_handler.rb +24 -0
- data/lib/typescript/monkey/transformer.rb +20 -0
- data/lib/typescript/monkey/transpiler.rb +256 -0
- data/lib/typescript/monkey/version.rb +3 -0
- data/package.json +32 -0
- data/test/assets_generator_test.rb +15 -0
- data/test/assets_test.rb +41 -0
- data/test/controller_generator_test.rb +19 -0
- data/test/fixtures/assets/javascripts/hello.js.ts +3 -0
- data/test/fixtures/assets/javascripts/included.ts +4 -0
- data/test/fixtures/assets/javascripts/reference.ts +2 -0
- data/test/fixtures/references/ref1_1.js.ts +3 -0
- data/test/fixtures/references/ref1_2.js.ts +3 -0
- data/test/fixtures/references/ref2_1.d.ts +1 -0
- data/test/fixtures/references/ref2_2.js.ts +3 -0
- data/test/fixtures/references/ref3_1.js.ts +5 -0
- data/test/fixtures/references/ref3_2.ts +3 -0
- data/test/fixtures/references/ref3_3.ts +3 -0
- data/test/fixtures/routes.rb +0 -0
- data/test/fixtures/site/es5.js.ts +7 -0
- data/test/fixtures/site/index.js.ts +1 -0
- data/test/fixtures/site/script_tags.html.erb +23 -0
- data/test/fixtures/sprockets/ref1_1.js.ts +3 -0
- data/test/fixtures/sprockets/ref1_2.js.ts +3 -0
- data/test/fixtures/sprockets/ref1_manifest.js.ts +2 -0
- data/test/references_test.rb +48 -0
- data/test/scaffold_generator_test.rb +19 -0
- data/test/sprockets_test.rb +36 -0
- data/test/support/routes.rb +1 -0
- data/test/template_handler_test.rb +35 -0
- data/test/test_helper.rb +111 -0
- data/tsconfig.json +23 -0
- data/typescript-monkey.gemspec +34 -0
- metadata +175 -0
data/Rakefile
ADDED
@@ -0,0 +1,14 @@
|
|
1
|
+
#
|
2
|
+
# initializers/typescript.rb
|
3
|
+
#
|
4
|
+
# Configure typescript-monkey gem, notably which typescript path to use.
|
5
|
+
# See: https://github.com/markeissler/typescript-monkey
|
6
|
+
#
|
7
|
+
|
8
|
+
Typescript::Monkey.configure do |config|
|
9
|
+
# Configure Typescript::Monkey concatenated compilation
|
10
|
+
# config.compile = false
|
11
|
+
|
12
|
+
# Configure Typescript::Monkey logging (for debugging your app build)
|
13
|
+
# config.logger = Rails.logger
|
14
|
+
end
|
data/gulpfile.js
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
//
|
2
|
+
// gulpfile.js
|
3
|
+
// typescript-monkey
|
4
|
+
//
|
5
|
+
var gulp = require("gulp");
|
6
|
+
var ts = require("gulp-typescript");
|
7
|
+
var uglify = require("gulp-uglify");
|
8
|
+
var rename = require("gulp-rename");
|
9
|
+
var concat = require("gulp-concat");
|
10
|
+
var ignore = require("gulp-ignore");
|
11
|
+
var debug = require('gulp-debug');
|
12
|
+
var runSequence = require('run-sequence');
|
13
|
+
|
14
|
+
var tsProject = ts.createProject("tsconfig.json");
|
15
|
+
var jsOutputDir = "lib/assets/javascripts";
|
16
|
+
|
17
|
+
gulp.task("transpile", function() {
|
18
|
+
var tsResult = tsProject.src()
|
19
|
+
.pipe(ignore.include(/transpiler.ts$/))
|
20
|
+
.pipe(tsProject());
|
21
|
+
|
22
|
+
return tsResult.js
|
23
|
+
.pipe(rename({ basename: "dyrt" }))
|
24
|
+
.pipe(gulp.dest(jsOutputDir));
|
25
|
+
});
|
26
|
+
|
27
|
+
gulp.task("transpile-min", function() {
|
28
|
+
var tsResult = tsProject.src()
|
29
|
+
.pipe(ignore.include(/transpiler.ts$/))
|
30
|
+
.pipe(tsProject());
|
31
|
+
|
32
|
+
return tsResult.js
|
33
|
+
.pipe(rename({ basename: "dyrt" }))
|
34
|
+
.pipe(gulp.dest(jsOutputDir))
|
35
|
+
.pipe(uglify())
|
36
|
+
.pipe(rename({ suffix: ".min" }))
|
37
|
+
.pipe(gulp.dest(jsOutputDir));
|
38
|
+
});
|
39
|
+
|
40
|
+
gulp.task("transpile-once", function() {
|
41
|
+
var tsResult = tsProject.src()
|
42
|
+
.pipe(tsProject());
|
43
|
+
|
44
|
+
return tsResult.js
|
45
|
+
.pipe(concat('dyrt_once.js'))
|
46
|
+
.pipe(gulp.dest(jsOutputDir));
|
47
|
+
});
|
48
|
+
|
49
|
+
gulp.task("transpile-once-min", function() {
|
50
|
+
var tsResult = tsProject.src()
|
51
|
+
.pipe(tsProject());
|
52
|
+
|
53
|
+
return tsResult.js
|
54
|
+
.pipe(concat('dyrt_once.js'))
|
55
|
+
.pipe(gulp.dest(jsOutputDir))
|
56
|
+
.pipe(uglify())
|
57
|
+
.pipe(rename({ suffix: ".min" }))
|
58
|
+
.pipe(gulp.dest(jsOutputDir));
|
59
|
+
});
|
60
|
+
|
61
|
+
gulp.task("all", function() {
|
62
|
+
runSequence("transpile-min", "transpile-once-min");
|
63
|
+
});
|
64
|
+
|
65
|
+
gulp.task("watch", ["transpile"], function() {
|
66
|
+
gulp.watch("lib/assets/typescripts/*.ts", ["transpile"]);
|
67
|
+
});
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= Typescript::Monkey::Transpiler.dyrt_ts %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= Typescript::Monkey::Package.services_js %>
|
@@ -0,0 +1,13 @@
|
|
1
|
+
//
|
2
|
+
// transpile_once.ts
|
3
|
+
// typescript-monkey
|
4
|
+
//
|
5
|
+
// Run the transpiler once against the DOM.
|
6
|
+
//
|
7
|
+
|
8
|
+
/// <reference path="./transpiler.ts" />
|
9
|
+
|
10
|
+
(() => {
|
11
|
+
const transpiler = new TypescriptRails.Transpiler();
|
12
|
+
transpiler.transpile();
|
13
|
+
})();
|
@@ -0,0 +1,203 @@
|
|
1
|
+
//
|
2
|
+
// transpiler.ts
|
3
|
+
// typescript-monkey
|
4
|
+
//
|
5
|
+
|
6
|
+
/// <reference types="typescript/lib/typescriptServices" />
|
7
|
+
|
8
|
+
namespace TypescriptRails {
|
9
|
+
export enum ScriptType {
|
10
|
+
Any,
|
11
|
+
Javascript,
|
12
|
+
Typescript,
|
13
|
+
};
|
14
|
+
|
15
|
+
/**
|
16
|
+
* A class to transpile typescript into javascript in the browser, at
|
17
|
+
* runtime.
|
18
|
+
*
|
19
|
+
* @export
|
20
|
+
* @class Transpiler
|
21
|
+
*/
|
22
|
+
export class Transpiler {
|
23
|
+
public domBody: HTMLElement;
|
24
|
+
|
25
|
+
constructor() {
|
26
|
+
this._loadDOM();
|
27
|
+
}
|
28
|
+
|
29
|
+
/**
|
30
|
+
* Set internal DOM properties.
|
31
|
+
*
|
32
|
+
* @private
|
33
|
+
* @returns {void}
|
34
|
+
*
|
35
|
+
* @memberOf TypescriptRails
|
36
|
+
*/
|
37
|
+
private _loadDOM(): void {
|
38
|
+
this.domBody = document.getElementsByTagName("body")[0];
|
39
|
+
|
40
|
+
return;
|
41
|
+
}
|
42
|
+
|
43
|
+
/**
|
44
|
+
* Transpile all typescript scripts in DOM.
|
45
|
+
*
|
46
|
+
* All previous transpiled scripts will be removed before their source
|
47
|
+
* is re-transpiled and re-appended to the DOM.
|
48
|
+
*
|
49
|
+
* @returns {void}
|
50
|
+
*
|
51
|
+
* @memberof Transpiler
|
52
|
+
*/
|
53
|
+
public transpile(): void {
|
54
|
+
let typescripts: HTMLScriptElement[] = this.domScripts(ScriptType.Typescript);
|
55
|
+
let javascripts: HTMLScriptElement[] = [];
|
56
|
+
|
57
|
+
// remove all transpiled scripts from DOM
|
58
|
+
this.purgeTranspiledScripts();
|
59
|
+
|
60
|
+
// transpile all typescripts
|
61
|
+
for (const script of typescripts) {
|
62
|
+
javascripts.push(this.transpileScript(script));
|
63
|
+
}
|
64
|
+
|
65
|
+
// append transpiled scripts to DOM
|
66
|
+
this.appendScripts(javascripts);
|
67
|
+
|
68
|
+
return;
|
69
|
+
}
|
70
|
+
|
71
|
+
/**
|
72
|
+
* Transpile typescript script to javascript.
|
73
|
+
*
|
74
|
+
* @param {HTMLScriptElement} script The script object to transpile
|
75
|
+
* @returns {HTMLScriptElement} The transpiled script object
|
76
|
+
*
|
77
|
+
* @memberof Transpiler
|
78
|
+
*/
|
79
|
+
public transpileScript(script: HTMLScriptElement): HTMLScriptElement {
|
80
|
+
if (script.type !== "text/typescript") return;
|
81
|
+
|
82
|
+
const compilerOptions: ts.TranspileOptions = {
|
83
|
+
compilerOptions: {
|
84
|
+
module: ts.ModuleKind.CommonJS,
|
85
|
+
},
|
86
|
+
fileName: undefined,
|
87
|
+
reportDiagnostics: false,
|
88
|
+
moduleName: undefined,
|
89
|
+
renamedDependencies: undefined,
|
90
|
+
} as ts.TranspileOptions;
|
91
|
+
|
92
|
+
// transpile script content
|
93
|
+
const jsContent = ts.transpileModule(script.text, compilerOptions);
|
94
|
+
|
95
|
+
// create a new script node, insert transpiled content
|
96
|
+
const element = document.createElement("script");
|
97
|
+
element.type = "text/javascript";
|
98
|
+
element.innerHTML = "// Transpiled TypeScript\n\n" + jsContent.outputText;
|
99
|
+
|
100
|
+
return element;
|
101
|
+
}
|
102
|
+
|
103
|
+
/**
|
104
|
+
* Append scripts to DOM.
|
105
|
+
*
|
106
|
+
* Script objects will be assigned an id that is a combination of the
|
107
|
+
* prefix plus an incremented value.
|
108
|
+
*
|
109
|
+
* @param {HTMLScriptElement[]} scripts
|
110
|
+
* @param {string} [prefix="drty-"] Object id prefix to filter targets
|
111
|
+
* @returns {number} Number of scripts appended
|
112
|
+
*
|
113
|
+
* @memberof Transpiler
|
114
|
+
*/
|
115
|
+
public appendScripts(scripts: HTMLScriptElement[], prefix: string = "drty-"): number {
|
116
|
+
let counter: number = 0;
|
117
|
+
|
118
|
+
for (const script of scripts) {
|
119
|
+
script.id = `${prefix + counter}`
|
120
|
+
this.domBody.appendChild(script);
|
121
|
+
counter++;
|
122
|
+
}
|
123
|
+
|
124
|
+
return counter;
|
125
|
+
}
|
126
|
+
|
127
|
+
/**
|
128
|
+
* Remove transpiled scripts from DOM.
|
129
|
+
*
|
130
|
+
* @param {string} [prefix="drty-"] Object id prefix to filter targets
|
131
|
+
* @returns {number} Number of scripts removed
|
132
|
+
*
|
133
|
+
* @memberof Transpiler
|
134
|
+
*/
|
135
|
+
public purgeTranspiledScripts(prefix: string = "drty-"): number {
|
136
|
+
let counter: number = this.purgeScripts(ScriptType.Javascript, prefix);
|
137
|
+
|
138
|
+
return counter;
|
139
|
+
}
|
140
|
+
|
141
|
+
/**
|
142
|
+
* Remove scripts from DOM.
|
143
|
+
*
|
144
|
+
* @param {ScriptType} type Object script type
|
145
|
+
* @param {string} prefix Object id prefix to filter targets
|
146
|
+
* @returns {number} Number of scripts removed
|
147
|
+
*
|
148
|
+
* @memberof Transpiler
|
149
|
+
*/
|
150
|
+
public purgeScripts(type: ScriptType, prefix: string): number {
|
151
|
+
let scripts: HTMLScriptElement[] = this.domScripts(type, prefix);
|
152
|
+
let counter: number = 0;
|
153
|
+
|
154
|
+
for (const script of scripts) {
|
155
|
+
this.domBody.removeChild(script);
|
156
|
+
counter++;
|
157
|
+
}
|
158
|
+
|
159
|
+
return counter;
|
160
|
+
}
|
161
|
+
|
162
|
+
/**
|
163
|
+
* Returns an array of script objects from DOM.
|
164
|
+
*
|
165
|
+
* This method returns all scripts if no idPrefix is provided.
|
166
|
+
*
|
167
|
+
* @private
|
168
|
+
* @param {ScriptType} [type=ScriptType.Typescript] Object script type
|
169
|
+
* @param {string} [prefix=""] Object id prefix to filter results
|
170
|
+
* @returns {HTMLScriptElement[]} Array of script objects
|
171
|
+
*
|
172
|
+
* @memberof Transpiler
|
173
|
+
*/
|
174
|
+
private domScripts(type: ScriptType = ScriptType.Typescript, prefix: string = ""): HTMLScriptElement[] {
|
175
|
+
let nodes: NodeList = document.getElementsByTagName("script");
|
176
|
+
let scripts: HTMLScriptElement[] = [];
|
177
|
+
|
178
|
+
Array.prototype.forEach.call(nodes, (node, key, listObj, argument) => {
|
179
|
+
const script = node as HTMLScriptElement;
|
180
|
+
|
181
|
+
switch(type) {
|
182
|
+
case ScriptType.Javascript:
|
183
|
+
if (script.type !== "text/javascript" && script.type.length > 0) return;
|
184
|
+
break;
|
185
|
+
|
186
|
+
case ScriptType.Typescript:
|
187
|
+
if (script.type !== "text/typescript") return;
|
188
|
+
break;
|
189
|
+
|
190
|
+
default:
|
191
|
+
break;
|
192
|
+
}
|
193
|
+
|
194
|
+
const regex = new RegExp("^" + `${prefix}`);
|
195
|
+
if (prefix.length === 0 || (script.id.length > 0 && regex.test(script.id))) {
|
196
|
+
scripts.push(script);
|
197
|
+
}
|
198
|
+
});
|
199
|
+
|
200
|
+
return scripts;
|
201
|
+
}
|
202
|
+
} // class Transpiler
|
203
|
+
} // namespace TypescriptRails
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require "rails/generators/named_base"
|
2
|
+
|
3
|
+
module Typescript
|
4
|
+
module Generators
|
5
|
+
class AssetsGenerator < ::Rails::Generators::NamedBase
|
6
|
+
source_root File.expand_path("../templates", __FILE__)
|
7
|
+
|
8
|
+
def copy_typescript
|
9
|
+
template "javascript.ts", File.join('app/assets/javascripts', class_path, "#{file_name}.ts")
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,8 @@
|
|
1
|
+
require 'typescript/monkey'
|
2
|
+
require 'typescript/monkey/configuration'
|
3
|
+
require 'typescript/monkey/railtie'
|
4
|
+
require 'typescript/monkey/engine'
|
5
|
+
require 'typescript/monkey/template'
|
6
|
+
require 'typescript/monkey/template_handler'
|
7
|
+
require 'typescript/monkey/transformer'
|
8
|
+
require 'typescript/monkey/transpiler'
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Typescript::Monkey
|
2
|
+
require 'open3'
|
3
|
+
|
4
|
+
#
|
5
|
+
# The CLI class.
|
6
|
+
#
|
7
|
+
# A class that implements a basic interface to command line programs.
|
8
|
+
#
|
9
|
+
class CLI
|
10
|
+
# Run a command with arguments
|
11
|
+
#
|
12
|
+
# @return [String, String, Process::Status] stdout, stderr, and the status
|
13
|
+
# of the command results.
|
14
|
+
#
|
15
|
+
# @see Process::Status
|
16
|
+
#
|
17
|
+
def self.run_command(command, args=[])
|
18
|
+
args_string = args.join(" ")
|
19
|
+
_stdout, _stderr, _status = Open3.capture3("\"#{command}\" #{args_string}")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,177 @@
|
|
1
|
+
require 'typescript/monkey'
|
2
|
+
require 'typescript/monkey/package'
|
3
|
+
|
4
|
+
module Typescript::Monkey::Compiler
|
5
|
+
class TypescriptCompileError < RuntimeError; end
|
6
|
+
|
7
|
+
class << self
|
8
|
+
# Replace relative paths specified in /// <reference path="..." /> with absolute paths.
|
9
|
+
#
|
10
|
+
# @param [String] ts_path Source .ts path
|
11
|
+
# @param [String] source. It might be pre-processed by erb.
|
12
|
+
# @return [String] replaces source
|
13
|
+
#
|
14
|
+
def replace_relative_references(ts_path, source)
|
15
|
+
ts_dir = File.dirname(File.expand_path(ts_path))
|
16
|
+
escaped_dir = ts_dir.gsub(/["\\]/, '\\\\\&') # "\"" => "\\\"", '\\' => '\\\\'
|
17
|
+
|
18
|
+
# Why don't we just use gsub? Because it display odd behavior with File.join on Ruby 2.0
|
19
|
+
# So we go the long way around.
|
20
|
+
(source.each_line.map do |l|
|
21
|
+
if l.starts_with?('///') && !(m = %r!^///\s*<reference\s+path=(?:"([^"]+)"|'([^']+)')\s*/>\s*!.match(l)).nil?
|
22
|
+
matched_path = m.captures.compact[0]
|
23
|
+
l = l.sub(matched_path, File.join(escaped_dir, matched_path))
|
24
|
+
end
|
25
|
+
next l
|
26
|
+
end).join
|
27
|
+
end
|
28
|
+
|
29
|
+
# Get all references
|
30
|
+
#
|
31
|
+
# @param [String] path Source .ts path
|
32
|
+
# @param [String] source. It might be pre-processed by erb.
|
33
|
+
# @yieldreturn [String] matched ref abs_path
|
34
|
+
#
|
35
|
+
def get_all_reference_paths(path, source, visited_paths=Set.new, &block)
|
36
|
+
visited_paths << path
|
37
|
+
source ||= File.read(path)
|
38
|
+
source.each_line do |l|
|
39
|
+
if l.starts_with?('///') && !(m = %r!^///\s*<reference\s+path=(?:"([^"]+)"|'([^']+)')\s*/>\s*!.match(l)).nil?
|
40
|
+
matched_path = m.captures.compact[0]
|
41
|
+
abs_matched_path = File.expand_path(matched_path, File.dirname(path))
|
42
|
+
unless visited_paths.include? abs_matched_path
|
43
|
+
block.call abs_matched_path
|
44
|
+
get_all_reference_paths(abs_matched_path, nil, visited_paths, &block)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
# Compile source
|
51
|
+
#
|
52
|
+
# @param [String] ts_path
|
53
|
+
# @param [String] source TypeScript source code
|
54
|
+
# @param [Sprockets::Context] sprockets context object
|
55
|
+
# @return [String] compiled JavaScript source code
|
56
|
+
#
|
57
|
+
def compile(ts_path, source, context=nil, *options)
|
58
|
+
if context
|
59
|
+
get_all_reference_paths(File.expand_path(ts_path), source) do |abs_path|
|
60
|
+
context.depend_on abs_path
|
61
|
+
end
|
62
|
+
end
|
63
|
+
begin
|
64
|
+
command_path = Typescript::Monkey::Package.compiler_bin()
|
65
|
+
if command_path.nil?
|
66
|
+
raise RuntimeError, "Failed to find typescript compiler in local or global node environment."
|
67
|
+
end
|
68
|
+
|
69
|
+
log("#{module_name} processing: #{ts_path}")
|
70
|
+
|
71
|
+
# compile file
|
72
|
+
s = replace_relative_references(ts_path, source)
|
73
|
+
source_file = Tempfile.new(["typescript-monkey", ".ts"])
|
74
|
+
source_file.write(s)
|
75
|
+
source_file.close
|
76
|
+
args = Typescript::Monkey.configuration.options.map(&:dup)
|
77
|
+
# _args = [ "--out /dev/stdout", "--noResolve" ]
|
78
|
+
# if self.tsconfig && File.exist?(self.tsconfig)
|
79
|
+
# _args.push("--project #{self.tsconfig}")
|
80
|
+
# end
|
81
|
+
args.push(source_file.path)
|
82
|
+
compiled_source, _, status = Typescript::Monkey::CLI.run_command(command_path, args)
|
83
|
+
|
84
|
+
filtered_output = nil
|
85
|
+
|
86
|
+
# Parse errors from output: there is no way (currently) to suppress the
|
87
|
+
# errors emitted when passing --noResolve argument to tsc.
|
88
|
+
#
|
89
|
+
# Status values:
|
90
|
+
# Success = 0
|
91
|
+
# DiagnosticsPresent_OutputsSkipped = 1
|
92
|
+
# DiagnosticsPresent_OutputsGenerated = 2
|
93
|
+
#
|
94
|
+
# See: https://github.com/Microsoft/TypeScript/blob/master/src/compiler/types.ts
|
95
|
+
#
|
96
|
+
# Ignore the following error codes:
|
97
|
+
# TS2304: Cannot find name ...
|
98
|
+
# TS2307: Cannot find module ...
|
99
|
+
# TS2318: Cannot find global type ...
|
100
|
+
# TS2339: Property ... does not exist on type ... **
|
101
|
+
# TS2468: Cannot find global value ...
|
102
|
+
# TS2503: Cannot find namespace ...
|
103
|
+
# TS2662: Cannot find name ... Did you mean the static member ...
|
104
|
+
# TS2663: Cannot find name ... Did you mean the instance member ...
|
105
|
+
# TS2688: Cannot find type definition file for ...
|
106
|
+
# TS2694: Namespace ... has no exported member ... **
|
107
|
+
#
|
108
|
+
# See: https://github.com/Microsoft/TypeScript/blob/master/src/compiler/diagnosticMessages.json
|
109
|
+
#
|
110
|
+
unless status.success?
|
111
|
+
filtered_output = ""
|
112
|
+
ignore_errors = [
|
113
|
+
"TS2304",
|
114
|
+
"TS2307",
|
115
|
+
"TS2318",
|
116
|
+
"TS2339",
|
117
|
+
"TS2468",
|
118
|
+
"TS2503",
|
119
|
+
"TS2662",
|
120
|
+
"TS2663",
|
121
|
+
"TS2688",
|
122
|
+
"TS2694"
|
123
|
+
]
|
124
|
+
regex = /#{Regexp.escape(File.basename(source_file))}\(([\d]+,[\d]+)\):[\s]+error[\s]+(TS[\d]+):[\s]+(.*)$/
|
125
|
+
errors = []
|
126
|
+
compiled_source.split("\n").each do |line|
|
127
|
+
if (matches = line.match(regex))
|
128
|
+
errors << {
|
129
|
+
code: matches[2],
|
130
|
+
message: matches[3],
|
131
|
+
line: line,
|
132
|
+
line_position: matches[1]
|
133
|
+
}
|
134
|
+
next
|
135
|
+
end
|
136
|
+
filtered_output << line << "\n"
|
137
|
+
end
|
138
|
+
# iterate over errors and log ignored, raise exception for all others
|
139
|
+
errors.each do |error|
|
140
|
+
log("#{module_name} parsing error for file: #{ts_path}, #{error[:code]}@(#{error[:line_position]}): #{error[:message]}")
|
141
|
+
unless ignore_errors.include?(error[:code])
|
142
|
+
raise TypescriptCompileError, "#{error[:code]}@(#{error[:line_position]}): #{error[:message]}"
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
146
|
+
filtered_output ||= compiled_source
|
147
|
+
rescue StandardError => e
|
148
|
+
raise "Typescript error in file '#{ts_path}':\n#{e.message}"
|
149
|
+
ensure
|
150
|
+
source_file.unlink
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
private
|
155
|
+
|
156
|
+
# Log a message
|
157
|
+
#
|
158
|
+
# Checks if a logger has been configured before attempting to log.
|
159
|
+
#
|
160
|
+
# @param [String] message to be logged
|
161
|
+
#
|
162
|
+
def log(message)
|
163
|
+
if Typescript::Monkey.configuration.logger
|
164
|
+
Typescript::Monkey.configuration.logger.debug(message)
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# Returns module name
|
169
|
+
#
|
170
|
+
# @return [String] module name
|
171
|
+
#
|
172
|
+
def module_name
|
173
|
+
Module.nesting.last
|
174
|
+
end
|
175
|
+
end
|
176
|
+
|
177
|
+
end
|