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.
Files changed (67) hide show
  1. checksums.yaml +7 -0
  2. data/.coveralls.yml +1 -0
  3. data/.editorconfig +27 -0
  4. data/.gitignore +52 -0
  5. data/.ruby-gemset +1 -0
  6. data/.ruby-version +1 -0
  7. data/.travis.yml +27 -0
  8. data/.vscode/tasks.json +40 -0
  9. data/CHANGES.md +48 -0
  10. data/Gemfile +16 -0
  11. data/LICENSE.txt +22 -0
  12. data/README.md +351 -0
  13. data/Rakefile +13 -0
  14. data/contrib/example_package.json +10 -0
  15. data/contrib/example_typescript.rb +14 -0
  16. data/gulpfile.js +67 -0
  17. data/lib/assets/javascripts/transpiler.ts.erb +1 -0
  18. data/lib/assets/javascripts/transpiler_pkg.js.erb +2 -0
  19. data/lib/assets/javascripts/typescript.js.erb +1 -0
  20. data/lib/assets/typescripts/transpile_once.ts +13 -0
  21. data/lib/assets/typescripts/transpiler.ts +203 -0
  22. data/lib/rails/generators/typescript/assets/assets_generator.rb +13 -0
  23. data/lib/rails/generators/typescript/assets/templates/javascript.ts +3 -0
  24. data/lib/typescript-monkey.rb +8 -0
  25. data/lib/typescript/monkey.rb +9 -0
  26. data/lib/typescript/monkey/cli.rb +22 -0
  27. data/lib/typescript/monkey/compiler.rb +177 -0
  28. data/lib/typescript/monkey/configuration.rb +49 -0
  29. data/lib/typescript/monkey/engine.rb +18 -0
  30. data/lib/typescript/monkey/js_hook.rb +15 -0
  31. data/lib/typescript/monkey/package.rb +239 -0
  32. data/lib/typescript/monkey/railtie.rb +20 -0
  33. data/lib/typescript/monkey/template.rb +32 -0
  34. data/lib/typescript/monkey/template_handler.rb +24 -0
  35. data/lib/typescript/monkey/transformer.rb +20 -0
  36. data/lib/typescript/monkey/transpiler.rb +256 -0
  37. data/lib/typescript/monkey/version.rb +3 -0
  38. data/package.json +32 -0
  39. data/test/assets_generator_test.rb +15 -0
  40. data/test/assets_test.rb +41 -0
  41. data/test/controller_generator_test.rb +19 -0
  42. data/test/fixtures/assets/javascripts/hello.js.ts +3 -0
  43. data/test/fixtures/assets/javascripts/included.ts +4 -0
  44. data/test/fixtures/assets/javascripts/reference.ts +2 -0
  45. data/test/fixtures/references/ref1_1.js.ts +3 -0
  46. data/test/fixtures/references/ref1_2.js.ts +3 -0
  47. data/test/fixtures/references/ref2_1.d.ts +1 -0
  48. data/test/fixtures/references/ref2_2.js.ts +3 -0
  49. data/test/fixtures/references/ref3_1.js.ts +5 -0
  50. data/test/fixtures/references/ref3_2.ts +3 -0
  51. data/test/fixtures/references/ref3_3.ts +3 -0
  52. data/test/fixtures/routes.rb +0 -0
  53. data/test/fixtures/site/es5.js.ts +7 -0
  54. data/test/fixtures/site/index.js.ts +1 -0
  55. data/test/fixtures/site/script_tags.html.erb +23 -0
  56. data/test/fixtures/sprockets/ref1_1.js.ts +3 -0
  57. data/test/fixtures/sprockets/ref1_2.js.ts +3 -0
  58. data/test/fixtures/sprockets/ref1_manifest.js.ts +2 -0
  59. data/test/references_test.rb +48 -0
  60. data/test/scaffold_generator_test.rb +19 -0
  61. data/test/sprockets_test.rb +36 -0
  62. data/test/support/routes.rb +1 -0
  63. data/test/template_handler_test.rb +35 -0
  64. data/test/test_helper.rb +111 -0
  65. data/tsconfig.json +23 -0
  66. data/typescript-monkey.gemspec +34 -0
  67. metadata +175 -0
@@ -0,0 +1,49 @@
1
+ require 'typescript/monkey/package'
2
+
3
+ module Typescript::Monkey
4
+ class << self
5
+ attr_accessor :configuration
6
+ end
7
+
8
+ def self.configure(&block)
9
+ self.configuration ||= Configuration.new
10
+ block.call(configuration) if block_given?
11
+ end
12
+
13
+ class Configuration
14
+
15
+ attr_accessor :options
16
+ attr_accessor :logger
17
+
18
+ def initialize
19
+ @_default_options = [
20
+ "--target es5",
21
+ "--outFile /dev/stdout",
22
+ "--noResolve",
23
+ "--removeComments",
24
+ "--typeRoots ['#{File.expand_path("../lib", Typescript::Monkey::Package.metadata_path())}']"
25
+ ]
26
+ @options = @_default_options.to_set
27
+ @compile = false;
28
+ @logger = nil;
29
+ end
30
+
31
+ def default_options
32
+ @_default_options.to_enum
33
+ end
34
+
35
+ def compile=(value)
36
+ unless (!!value == value)
37
+ raise TypeError, "#{method(__method__).owner}.#{__method__}: value parameter must be type Bool"
38
+ end
39
+
40
+ if value == true
41
+ @options.delete("--noResolve")
42
+ @compile = true
43
+ else
44
+ @options.add("--noResolve")
45
+ @compile = false
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,18 @@
1
+ require 'rails/engine'
2
+ require 'rails/generators'
3
+ require 'typescript/monkey/js_hook'
4
+
5
+ class Typescript::Monkey::Engine < Rails::Engine
6
+ # To become the default generator...
7
+ # config.app_generators.javascript_engine :typescript
8
+
9
+ if config.respond_to?(:annotations)
10
+ config.annotations.register_extensions(".ts") { |annotation| /#\s*(#{annotation}):?\s*(.*)$/ }
11
+ end
12
+
13
+ initializer 'override js_template hook' do |app|
14
+ if app.config.generators.rails[:javascript_engine] == :typescript
15
+ ::Rails::Generators::NamedBase.send :include, Typescript::Monkey::JsHook
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ module Typescript
2
+ module Monkey
3
+ module JsHook
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ no_tasks do
8
+ redefine_method :js_template do |source, destination|
9
+ template(source + '.ts', destination + '.ts')
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,239 @@
1
+ module Typescript::Monkey
2
+ require 'pathname'
3
+ require_relative 'cli'
4
+
5
+ #
6
+ # The Package class.
7
+ #
8
+ # A class that implements an interface to the Typescript node installation.
9
+ #
10
+ class Package
11
+ # Returns path to Typescript compiler executable
12
+ #
13
+ # The executable compiler can be used to transform Typescript to Javascript
14
+ # and is used during the asset pipeline compilation stage.
15
+ #
16
+ # @return [Pathname] path to Typescript compiler executable
17
+ #
18
+ def self.compiler_bin_path
19
+ compiler_bin_path = npm_bin_path()
20
+
21
+ if compiler_bin_path
22
+ compiler_bin_path = compiler_bin_path.join("tsc")
23
+ unless (compiler_bin_path && compiler_bin_path.file? && compiler_bin_path.executable?)
24
+ compiler_bin_path = nil
25
+ end
26
+ end
27
+
28
+ compiler_bin_path
29
+ end
30
+
31
+ # @TODO: REMOVE compiler_js_path()
32
+ # Returns path to Typescript compiler source
33
+ #
34
+ # The compiler can be included with web content to transform embedded
35
+ # Typescript wrapped in <script type="text/typescript"></script> tags.
36
+ #
37
+ # @return [Pathname] path to Typescript javascript compiler source
38
+ #
39
+ def self.compiler_js_path
40
+ compiler_js_path = npm_root_path()
41
+
42
+ if compiler_js_path
43
+ compiler_js_path = compiler_js_path.join("typescript/lib/typescriptServices.js")
44
+ unless compiler_js_path.file? && compiler_js_path.readable?
45
+ compiler_js_path = nil
46
+ end
47
+ end
48
+
49
+ compiler_js_path
50
+ end
51
+
52
+ # @TODO: REMOVE compiler_js()
53
+ # Returns content for Typescript compiler source
54
+ #
55
+ # The compiler can be included with web content to transform embedded
56
+ # Typescript wrapped in <script type="text/typescript"></script> tags.
57
+ #
58
+ # @return [String] javascript Typescript compiler source
59
+ #
60
+ def self.compiler_js
61
+ compiler_js = ""
62
+ compiler_js_path = self.compiler_js_path()
63
+
64
+ unless compiler_js_path.nil?
65
+ compiler_js = compiler_js_path.read()
66
+ end
67
+
68
+ compiler_js
69
+ end
70
+
71
+ # Returns package version for Typescript installation
72
+ #
73
+ # @return [String] version information
74
+ #
75
+ def self.compiler_version
76
+ compiler_version = "unknown"
77
+ metadata = self.metadata()
78
+
79
+ unless metadata.empty? || !metadata.has_key?('version')
80
+ compiler_version = metadata['version']
81
+ end
82
+
83
+ compiler_version
84
+ end
85
+
86
+ # Returns path to package metadata file for Typescript installation
87
+ #
88
+ # The package metadata file is the package.json file.
89
+ #
90
+ # @return [Pathname] path to Typepackage information file
91
+ #
92
+ def self.metadata_path
93
+ metadata_path = npm_root_path()
94
+
95
+ if metadata_path
96
+ metadata_path = metadata_path.join("typescript/package.json")
97
+ unless metadata_path.file? && metadata_path.readable?
98
+ metadata_path = nil
99
+ end
100
+ end
101
+
102
+ metadata_path
103
+ end
104
+
105
+
106
+ # Returns package metadata contents for Typescript installation
107
+ #
108
+ # @return [Hash] hash representation of package metadata contents
109
+ #
110
+ def self.metadata
111
+ metadata = {}
112
+ metadata_path = self.metadata_path()
113
+
114
+ unless metadata_path.nil?
115
+ metadata = JSON.parse(metadata_path.read())
116
+ metadata ||= {}
117
+ end
118
+
119
+ metadata
120
+ end
121
+
122
+ # Returns path to Typescript services javascript source
123
+ #
124
+ # The Typescript services can be included with web content to provide
125
+ # embedded Typescript functionality. This Typescript::Monkey::Transpiler
126
+ # leverages services to transpile <script type="text/typescript"> tags
127
+ # at runtime.
128
+ #
129
+ # @return [Pathname] path to Typescript service javascript source
130
+ #
131
+ def self.services_js_path
132
+ services_js_path = npm_root_path()
133
+
134
+ if services_js_path
135
+ services_js_path = services_js_path.join("typescript/lib/typescriptServices.js")
136
+ unless services_js_path.file? && services_js_path.readable?
137
+ services_js_path = nil
138
+ end
139
+ end
140
+
141
+ services_js_path
142
+ end
143
+
144
+ # Returns content for Typescript services javascript source
145
+ #
146
+ # The Typescript services can be included with web content to provide
147
+ # embedded Typescript functionality. This Typescript::Monkey::Transpiler
148
+ # leverages services to transpile <script type="text/typescript"> tags
149
+ # at runtime.
150
+ #
151
+ # @return [String] Typescript services javascript source
152
+ #
153
+ def self.services_js
154
+ services_js = ""
155
+ services_js_path = self.services_js_path()
156
+
157
+ unless services_js_path.nil?
158
+ services_js = services_js_path.read()
159
+ end
160
+
161
+ services_js
162
+ end
163
+
164
+ class << self
165
+ # Returns path to Typescript compiler executable
166
+ #
167
+ alias compiler_bin compiler_bin_path
168
+
169
+ private
170
+
171
+ # Returns closest path for npm directory
172
+ #
173
+ # The directory is the npm directory to resolve. Must be a value of:
174
+ # + root - effective node_modules root directory
175
+ # + bin - effective node_modules bin directory
176
+ #
177
+ # The resolution process favors a local node_modules directory over a
178
+ # global installation.
179
+ #
180
+ # @param directory [String] directory to discover
181
+ #
182
+ # @return [Pathname] path to directory on success, otherwise nil
183
+ #
184
+ # @raise [ArgumentError] raises this exception if directory has not been
185
+ # supplied or is invalid.
186
+ #
187
+ def npm_path_for(directory)
188
+ if directory.empty? || directory.nil?
189
+ raise ArgumentError, "directory parameter required but not supplied"
190
+ end
191
+ if !["bin", "root"].include?(directory)
192
+ raise ArgumentError, "invalid directory specified: #{directory}"
193
+ end
194
+
195
+ npm_path, stderr, status = Typescript::Monkey::CLI.run_command("npm", [directory])
196
+ unless status.success? && File.directory?(npm_path.chomp!)
197
+ # try again with global resolution
198
+ npm_path, stderr, status = Typescript::Monkey::CLI.run_command("npm", ["--global", directory])
199
+ unless status.success? && File.directory?(npm_path.chomp!)
200
+ npm_path = ""
201
+ end
202
+ end
203
+
204
+ ((npm_path_obj = Pathname.new(npm_path)).to_s.empty?) ? nil : npm_path_obj
205
+ end
206
+
207
+ # Returns closest path for npm root directory
208
+ #
209
+ # The resolution process favors a local node_modules directory over a
210
+ # global installation.
211
+ #
212
+ # Results are memoized.
213
+ #
214
+ # @return [Pathname] path to directory on success, otherwise nil
215
+ #
216
+ # @see Typescript::Monkey::Package.npm_path_for
217
+ #
218
+ def npm_root_path
219
+ @npm_root_path ||= npm_path_for("root")
220
+ end
221
+
222
+ # Returns closest path for npm bin directory
223
+ #
224
+ # The resolution process favors a local node_modules directory over a
225
+ # global installation.
226
+ #
227
+ # Results are memoized.
228
+ #
229
+ # @return [Pathname] path to directory on success, otherwise nil
230
+ #
231
+ # @see Typescript::Monkey::Packags.npm_path_for
232
+ #
233
+ def npm_bin_path
234
+ @npm_bin_path ||= npm_path_for("bin")
235
+ end
236
+ end
237
+
238
+ end
239
+ end
@@ -0,0 +1,20 @@
1
+ require 'typescript/monkey'
2
+
3
+ class Typescript::Monkey::Railtie < ::Rails::Railtie
4
+ config.before_initialize do |app|
5
+ if ::Rails::VERSION::MAJOR >= 4 || app.config.assets.enabled
6
+ require 'typescript/monkey/template'
7
+ require 'typescript/monkey/transformer'
8
+ require 'sprockets'
9
+
10
+ if Sprockets.respond_to?(:register_engine)
11
+ Sprockets.register_engine '.ts', Typescript::Monkey::Template, silence_deprecation: true
12
+ end
13
+
14
+ if Sprockets.respond_to?(:register_transformer)
15
+ Sprockets.register_mime_type 'text/typescript', extensions: ['.ts']
16
+ Sprockets.register_transformer 'text/typescript', 'application/javascript', Typescript::Monkey::Transformer
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ require 'typescript/monkey'
2
+ require 'tilt/template'
3
+
4
+ class Typescript::Monkey::Template < ::Tilt::Template
5
+ self.default_mime_type = 'application/javascript'
6
+
7
+ # @!scope class
8
+ class_attribute :default_bare
9
+
10
+ def self.engine_initialized?
11
+ defined? ::Typescript::Monkey::Compiler
12
+ end
13
+
14
+ def initialize_engine
15
+ require_template_library 'typescript/monkey/compiler'
16
+ end
17
+
18
+ def prepare
19
+ if !options.key?(:bare) and !options.key?(:no_wrap)
20
+ options[:bare] = self.class.default_bare
21
+ end
22
+ end
23
+
24
+ def evaluate(context, locals, &block)
25
+ @output ||= ::Typescript::Monkey::Compiler.compile(file, data, context)
26
+ end
27
+
28
+ # @override
29
+ def allows_script?
30
+ false
31
+ end
32
+ end
@@ -0,0 +1,24 @@
1
+ require 'typescript/monkey/compiler'
2
+
3
+ class Typescript::Monkey::TemplateHandler
4
+ class << self
5
+ def erb_handler
6
+ @erb_handler ||= ActionView::Template.registered_template_handler(:erb)
7
+ end
8
+
9
+ def call(template)
10
+ compiled_source = erb_handler.call(template)
11
+ path = template.identifier.gsub(/['\\]/, '\\\\\&') # "'" => "\\'", '\\' => '\\\\'
12
+ <<-EOS
13
+ ::Typescript::Monkey::Compiler.compile('#{path}', (begin;#{compiled_source};end))
14
+ EOS
15
+ end
16
+ end
17
+ end
18
+
19
+ # Register template handler for .ts files, enable digest for .ts files
20
+ ActiveSupport.on_load(:action_view) do
21
+ ActionView::Template.register_template_handler :ts, Typescript::Monkey::TemplateHandler
22
+ require 'action_view/dependency_tracker'
23
+ ActionView::DependencyTracker.register_tracker :ts, ActionView::DependencyTracker::ERBTracker
24
+ end
@@ -0,0 +1,20 @@
1
+ require 'typescript/monkey'
2
+
3
+ class Typescript::Monkey::Transformer
4
+ def self.instance
5
+ @instance ||= new
6
+ end
7
+
8
+ def self.call(input)
9
+ instance.call(input)
10
+ end
11
+
12
+ def call(input)
13
+ filename = input[:filename]
14
+ source = input[:data]
15
+ context = input[:environment].context_class.new(input)
16
+
17
+ result = ::Typescript::Monkey::Compiler.compile(filename, source, context)
18
+ { data: result }
19
+ end
20
+ end
@@ -0,0 +1,256 @@
1
+ module Typescript::Monkey
2
+ require 'pathname'
3
+
4
+ #
5
+ # The Transpiler class.
6
+ #
7
+ # A class that implements an interface to a dynamic runtime Typescript to
8
+ # javascript transpiler.
9
+ #
10
+ # The scripts that are returned by this class are dependent upon Typescript
11
+ # Services to be available.
12
+ #
13
+ # @see Typescript::Monkey::Package.services_js
14
+ #
15
+ class Transpiler
16
+
17
+ # Returns path to dynamic runtime transpiler
18
+ #
19
+ # The transpiler can be included with web content to transform embedded
20
+ # Typescript wrapped in <script type="text/typescript"></script> tags.
21
+ #
22
+ # @return [Pathname] path to dyrt source
23
+ #
24
+ def self.dyrt_js_path
25
+ transpiler_js_path = gem_javascripts_path()
26
+
27
+ if transpiler_js_path
28
+ transpiler_js_path = transpiler_js_path.join("dyrt.js")
29
+ unless transpiler_js_path.file? && transpiler_js_path.readable?
30
+ transpiler_js_path = nil
31
+ end
32
+ end
33
+
34
+ transpiler_js_path
35
+ end
36
+
37
+ # Returns content for dynamic runtime transpiler
38
+ #
39
+ # The transpiler can be included with web content to transform embedded
40
+ # Typescript wrapped in <script type="text/typescript"></script> tags.
41
+ #
42
+ # @return [String] dyrt source
43
+ #
44
+ def self.dyrt_js
45
+ transpiler_js = ""
46
+ transpiler_js_path = self.dyrt_js_path()
47
+
48
+ unless transpiler_js_path.nil?
49
+ transpiler_js = transpiler_js_path.read()
50
+ end
51
+
52
+ transpiler_js
53
+ end
54
+
55
+ # Returns path to dynamic runtime transpiler
56
+ #
57
+ # The transpiler can be included with web content to transform embedded
58
+ # Typescript wrapped in <script type="text/typescript"></script> tags.
59
+ #
60
+ # The "once" compilers include an immediately invoked function expression
61
+ # (IIFE) that triggers transpile exactly once. Add this script to the
62
+ # bottom of the body in an HTML page; ideally, this should run last. The
63
+ # script does not, and probably should not, be run after DOM ready; however
64
+ # the Typescript objects in your page can wait for DOM ready.
65
+ #
66
+ # @return [Pathname] path to dyrt source
67
+ #
68
+ def self.dyrt_once_js_path
69
+ transpiler_js_path = gem_javascripts_path()
70
+
71
+ if transpiler_js_path
72
+ transpiler_js_path = transpiler_js_path.join("dyrt_once.js")
73
+ unless transpiler_js_path.file? && transpiler_js_path.readable?
74
+ transpiler_js_path = nil
75
+ end
76
+ end
77
+
78
+ transpiler_js_path
79
+ end
80
+
81
+ # Returns content for dynamic runtime transpiler
82
+ #
83
+ # The transpiler can be included with web content to transform embedded
84
+ # Typescript wrapped in <script type="text/typescript"></script> tags.
85
+ #
86
+ # The "once" compilers include an immediately invoked function expression
87
+ # (IIFE) that triggers transpile exactly once. Add this script to the
88
+ # bottom of the body in an HTML page; ideally, this should run last. The
89
+ # script does not, and probably should not, be run after DOM ready; however
90
+ # the Typescript objects in your page can wait for DOM ready.
91
+ #
92
+ # @return [String] dyrt source
93
+ #
94
+ def self.dyrt_once_js
95
+ transpiler_js = ""
96
+ transpiler_js_path = self.dyrt_once_js_path()
97
+
98
+ unless transpiler_js_path.nil?
99
+ transpiler_js = transpiler_js_path.read()
100
+ end
101
+
102
+ transpiler_js
103
+ end
104
+
105
+ # Returns path to dynamic runtime transpiler (pre-transpiled version)
106
+ #
107
+ # The transpiler can be included with web content to transform embedded
108
+ # Typescript wrapped in <script type="text/typescript"></script> tags.
109
+ #
110
+ # @return [Pathname] path to dyrt source (pre-transpiled version)
111
+ #
112
+ def self.dyrt_ts_path
113
+ transpiler_ts_path = gem_typescripts_path()
114
+
115
+ if transpiler_ts_path
116
+ transpiler_ts_path = transpiler_ts_path.join("transpiler.ts")
117
+ unless transpiler_ts_path.file? && transpiler_ts_path.readable?
118
+ transpiler_ts_path = nil
119
+ end
120
+ end
121
+
122
+ transpiler_ts_path
123
+ end
124
+
125
+ # Returns content for dynamic runtime transpiler (pre-transpiled version)
126
+ #
127
+ # The transpiler can be included with web content to transform embedded
128
+ # Typescript wrapped in <script type="text/typescript"></script> tags.
129
+ #
130
+ # @return [String] typescript transpiler source (pre-transpiled version)
131
+ #
132
+ def self.dyrt_ts
133
+ transpiler_ts = ""
134
+ transpiler_ts_path = self.dyrt_ts_path()
135
+
136
+ unless transpiler_ts_path.nil?
137
+ transpiler_ts = transpiler_ts_path.read()
138
+ end
139
+
140
+ transpiler_ts
141
+ end
142
+
143
+ class << self
144
+
145
+ # Returns path to transpiler source
146
+ #
147
+ alias runner_js dyrt_js
148
+ alias runner_ts dyrt_ts
149
+
150
+ # private
151
+
152
+ # Returns path for gem directory
153
+ #
154
+ # The directory is the gem directory to resolve. Must be a value of:
155
+ # + root - gem root directory
156
+ # + lib - gem lib directory
157
+ # + assets - gem lib/assets directory
158
+ # + javascripts - gem lib/assets/javascripts directory
159
+ # + typescripts - gem lib/assets/typescripts directory
160
+ #
161
+ # Results are memoized.
162
+ #
163
+ # @param directory [String] directory to discover
164
+ #
165
+ # @return [Pathname] path to directory on success, otherwise nil
166
+ #
167
+ # @raise [ArgumentError] raises this exception if directory has not been
168
+ # supplied or is invalid.
169
+ #
170
+ def gem_path_for(directory)
171
+ if directory.empty? || directory.nil?
172
+ raise ArgumentError, "directory parameter required but not supplied"
173
+ end
174
+ if !["root", "lib", "assets", "javascripts", "typescripts"].include?(directory)
175
+ raise ArgumentError, "invalid directory specified: #{directory}"
176
+ end
177
+
178
+ directory_sym = directory.downcase.to_sym
179
+ @gem_paths ||= {}
180
+ return @gem_paths[directory_sym] if @gem_paths.has_key?(directory_sym)
181
+
182
+ # resolve gem root (top directory of this gem)
183
+ gem_root = Pathname.new(File.expand_path("../../../../", __FILE__))
184
+
185
+ # process shortcuts
186
+ case directory_sym
187
+ when :lib
188
+ gem_path = gem_root.join("lib")
189
+ when :assets
190
+ gem_path = gem_root.join("lib/assets")
191
+ when :javascripts
192
+ gem_path = gem_root.join("lib/assets/javascripts")
193
+ when :typescripts
194
+ gem_path = gem_root.join("lib/assets/typescripts")
195
+ when :root
196
+ gem_path = gem_root
197
+ else
198
+ gem_path = Pathname.new("")
199
+ end
200
+
201
+ @gem_paths[directory_sym] = ((gem_path.directory?) ? gem_path : nil)
202
+ end
203
+
204
+ # Returns top directory for this gem
205
+ #
206
+ # @return [Pathname] path to directory on success, otherwise nil
207
+ #
208
+ # @see Typescript::Monkey::Transpiler.gem_path_for
209
+ #
210
+ def gem_root_path
211
+ gem_path_for("root")
212
+ end
213
+
214
+ # Returns lib directory for this gem
215
+ #
216
+ # @return [Pathname] path to directory on success, otherwise nil
217
+ #
218
+ # @see Typescript::Monkey::Transpiler.gem_path_for
219
+ #
220
+ def gem_lib_path
221
+ gem_path_for("lib")
222
+ end
223
+
224
+ # Returns assets directory for this gem
225
+ #
226
+ # @return [Pathname] path to directory on success, otherwise nil
227
+ #
228
+ # @see Typescript::Monkey::Transpiler.gem_path_for
229
+ #
230
+ def gem_assets_path
231
+ gem_path_for("assets")
232
+ end
233
+
234
+ # Returns javascripts directory for this gem
235
+ #
236
+ # @return [Pathname] path to directory on success, otherwise nil
237
+ #
238
+ # @see Typescript::Monkey::Transpiler.gem_path_for
239
+ #
240
+ def gem_javascripts_path
241
+ gem_path_for("javascripts")
242
+ end
243
+
244
+ # Returns typescripts directory for this gem
245
+ #
246
+ # @return [Pathname] path to directory on success, otherwise nil
247
+ #
248
+ # @see Typescript::Monkey::Transpiler.gem_path_for
249
+ #
250
+ def gem_typescripts_path
251
+ gem_path_for("typescripts")
252
+ end
253
+ end
254
+
255
+ end
256
+ end