spade-packager 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (316) hide show
  1. data/.gitignore +2 -0
  2. data/.gitmodules +6 -0
  3. data/bin/spadepkg +8 -0
  4. data/lib/libgems_ext.rb +8 -0
  5. data/lib/libgems_ext/config_file.rb +33 -0
  6. data/lib/libgems_ext/dependency_installer.rb +150 -0
  7. data/lib/libgems_ext/installer.rb +39 -0
  8. data/lib/libgems_ext/libgems.rb +39 -0
  9. data/lib/libgems_ext/spec_fetcher.rb +11 -0
  10. data/lib/spade-packager.rb +1 -0
  11. data/lib/spade/packager.rb +18 -0
  12. data/lib/spade/packager/cli.rb +9 -0
  13. data/lib/spade/packager/cli/base.rb +196 -0
  14. data/lib/spade/packager/cli/owner.rb +46 -0
  15. data/lib/spade/packager/cli/project_generator.rb +117 -0
  16. data/lib/spade/packager/credentials.rb +38 -0
  17. data/lib/spade/packager/local.rb +50 -0
  18. data/lib/spade/packager/package.rb +160 -0
  19. data/lib/spade/packager/remote.rb +98 -0
  20. data/lib/spade/packager/repository.rb +18 -0
  21. data/lib/spade/packager/version.rb +5 -0
  22. data/packages/coffee-script/.gitignore +8 -0
  23. data/packages/coffee-script/.npmignore +11 -0
  24. data/packages/coffee-script/Cakefile +229 -0
  25. data/packages/coffee-script/LICENSE +22 -0
  26. data/packages/coffee-script/README +47 -0
  27. data/packages/coffee-script/Rakefile +78 -0
  28. data/packages/coffee-script/bin/cake +7 -0
  29. data/packages/coffee-script/bin/coffee +7 -0
  30. data/packages/coffee-script/documentation/coffee/aliases.coffee +11 -0
  31. data/packages/coffee-script/documentation/coffee/array_comprehensions.coffee +2 -0
  32. data/packages/coffee-script/documentation/coffee/block_comment.coffee +6 -0
  33. data/packages/coffee-script/documentation/coffee/cake_tasks.coffee +9 -0
  34. data/packages/coffee-script/documentation/coffee/classes.coffee +25 -0
  35. data/packages/coffee-script/documentation/coffee/comparisons.coffee +5 -0
  36. data/packages/coffee-script/documentation/coffee/conditionals.coffee +13 -0
  37. data/packages/coffee-script/documentation/coffee/default_args.coffee +8 -0
  38. data/packages/coffee-script/documentation/coffee/do.coffee +4 -0
  39. data/packages/coffee-script/documentation/coffee/embedded.coffee +5 -0
  40. data/packages/coffee-script/documentation/coffee/existence.coffee +10 -0
  41. data/packages/coffee-script/documentation/coffee/expressions.coffee +9 -0
  42. data/packages/coffee-script/documentation/coffee/expressions_assignment.coffee +3 -0
  43. data/packages/coffee-script/documentation/coffee/expressions_comprehension.coffee +3 -0
  44. data/packages/coffee-script/documentation/coffee/expressions_try.coffee +7 -0
  45. data/packages/coffee-script/documentation/coffee/fat_arrow.coffee +6 -0
  46. data/packages/coffee-script/documentation/coffee/functions.coffee +2 -0
  47. data/packages/coffee-script/documentation/coffee/heredocs.coffee +7 -0
  48. data/packages/coffee-script/documentation/coffee/heregexes.coffee +11 -0
  49. data/packages/coffee-script/documentation/coffee/interpolation.coffee +6 -0
  50. data/packages/coffee-script/documentation/coffee/multiple_return_values.coffee +7 -0
  51. data/packages/coffee-script/documentation/coffee/object_comprehensions.coffee +4 -0
  52. data/packages/coffee-script/documentation/coffee/object_extraction.coffee +13 -0
  53. data/packages/coffee-script/documentation/coffee/objects_and_arrays.coffee +19 -0
  54. data/packages/coffee-script/documentation/coffee/objects_reserved.coffee +5 -0
  55. data/packages/coffee-script/documentation/coffee/overview.coffee +28 -0
  56. data/packages/coffee-script/documentation/coffee/parallel_assignment.coffee +6 -0
  57. data/packages/coffee-script/documentation/coffee/patterns_and_splats.coffee +7 -0
  58. data/packages/coffee-script/documentation/coffee/prototypes.coffee +3 -0
  59. data/packages/coffee-script/documentation/coffee/range_comprehensions.coffee +2 -0
  60. data/packages/coffee-script/documentation/coffee/scope.coffee +5 -0
  61. data/packages/coffee-script/documentation/coffee/slices.coffee +7 -0
  62. data/packages/coffee-script/documentation/coffee/soaks.coffee +1 -0
  63. data/packages/coffee-script/documentation/coffee/splats.coffee +27 -0
  64. data/packages/coffee-script/documentation/coffee/splices.coffee +5 -0
  65. data/packages/coffee-script/documentation/coffee/strings.coffee +8 -0
  66. data/packages/coffee-script/documentation/coffee/switch.coffee +10 -0
  67. data/packages/coffee-script/documentation/coffee/try.coffee +8 -0
  68. data/packages/coffee-script/documentation/coffee/while.coffee +10 -0
  69. data/packages/coffee-script/documentation/css/docs.css +374 -0
  70. data/packages/coffee-script/documentation/css/idle.css +64 -0
  71. data/packages/coffee-script/documentation/docs/browser.html +25 -0
  72. data/packages/coffee-script/documentation/docs/cake.html +43 -0
  73. data/packages/coffee-script/documentation/docs/coffee-script.html +51 -0
  74. data/packages/coffee-script/documentation/docs/command.html +161 -0
  75. data/packages/coffee-script/documentation/docs/docco.css +186 -0
  76. data/packages/coffee-script/documentation/docs/grammar.html +399 -0
  77. data/packages/coffee-script/documentation/docs/helpers.html +31 -0
  78. data/packages/coffee-script/documentation/docs/index.html +3 -0
  79. data/packages/coffee-script/documentation/docs/lexer.html +490 -0
  80. data/packages/coffee-script/documentation/docs/nodes.html +1338 -0
  81. data/packages/coffee-script/documentation/docs/optparse.html +78 -0
  82. data/packages/coffee-script/documentation/docs/repl.html +24 -0
  83. data/packages/coffee-script/documentation/docs/rewriter.html +251 -0
  84. data/packages/coffee-script/documentation/docs/scope.html +54 -0
  85. data/packages/coffee-script/documentation/docs/underscore.html +295 -0
  86. data/packages/coffee-script/documentation/images/background.png +0 -0
  87. data/packages/coffee-script/documentation/images/banding.png +0 -0
  88. data/packages/coffee-script/documentation/images/button_bg.png +0 -0
  89. data/packages/coffee-script/documentation/images/button_bg_dark.gif +0 -0
  90. data/packages/coffee-script/documentation/images/button_bg_green.gif +0 -0
  91. data/packages/coffee-script/documentation/images/favicon.ico +0 -0
  92. data/packages/coffee-script/documentation/images/logo.png +0 -0
  93. data/packages/coffee-script/documentation/images/screenshadow.png +0 -0
  94. data/packages/coffee-script/documentation/index.html.erb +1607 -0
  95. data/packages/coffee-script/documentation/js/aliases.js +17 -0
  96. data/packages/coffee-script/documentation/js/array_comprehensions.js +6 -0
  97. data/packages/coffee-script/documentation/js/block_comment.js +4 -0
  98. data/packages/coffee-script/documentation/js/cake_tasks.js +10 -0
  99. data/packages/coffee-script/documentation/js/classes.js +44 -0
  100. data/packages/coffee-script/documentation/js/comparisons.js +3 -0
  101. data/packages/coffee-script/documentation/js/conditionals.js +12 -0
  102. data/packages/coffee-script/documentation/js/default_args.js +7 -0
  103. data/packages/coffee-script/documentation/js/do.js +10 -0
  104. data/packages/coffee-script/documentation/js/embedded.js +4 -0
  105. data/packages/coffee-script/documentation/js/existence.js +6 -0
  106. data/packages/coffee-script/documentation/js/expressions.js +15 -0
  107. data/packages/coffee-script/documentation/js/expressions_assignment.js +2 -0
  108. data/packages/coffee-script/documentation/js/expressions_comprehension.js +9 -0
  109. data/packages/coffee-script/documentation/js/expressions_try.js +7 -0
  110. data/packages/coffee-script/documentation/js/fat_arrow.js +9 -0
  111. data/packages/coffee-script/documentation/js/functions.js +7 -0
  112. data/packages/coffee-script/documentation/js/heredocs.js +2 -0
  113. data/packages/coffee-script/documentation/js/heregexes.js +2 -0
  114. data/packages/coffee-script/documentation/js/interpolation.js +4 -0
  115. data/packages/coffee-script/documentation/js/multiple_return_values.js +5 -0
  116. data/packages/coffee-script/documentation/js/object_comprehensions.js +15 -0
  117. data/packages/coffee-script/documentation/js/object_extraction.js +10 -0
  118. data/packages/coffee-script/documentation/js/objects_and_arrays.js +17 -0
  119. data/packages/coffee-script/documentation/js/objects_reserved.js +4 -0
  120. data/packages/coffee-script/documentation/js/overview.js +35 -0
  121. data/packages/coffee-script/documentation/js/parallel_assignment.js +4 -0
  122. data/packages/coffee-script/documentation/js/patterns_and_splats.js +4 -0
  123. data/packages/coffee-script/documentation/js/prototypes.js +3 -0
  124. data/packages/coffee-script/documentation/js/range_comprehensions.js +9 -0
  125. data/packages/coffee-script/documentation/js/scope.js +8 -0
  126. data/packages/coffee-script/documentation/js/slices.js +4 -0
  127. data/packages/coffee-script/documentation/js/soaks.js +2 -0
  128. data/packages/coffee-script/documentation/js/splats.js +15 -0
  129. data/packages/coffee-script/documentation/js/splices.js +3 -0
  130. data/packages/coffee-script/documentation/js/strings.js +2 -0
  131. data/packages/coffee-script/documentation/js/switch.js +23 -0
  132. data/packages/coffee-script/documentation/js/try.js +8 -0
  133. data/packages/coffee-script/documentation/js/while.js +18 -0
  134. data/packages/coffee-script/documentation/vendor/jquery-1.4.2.js +6240 -0
  135. data/packages/coffee-script/examples/beautiful_code/binary_search.coffee +16 -0
  136. data/packages/coffee-script/examples/beautiful_code/quicksort_runtime.coffee +13 -0
  137. data/packages/coffee-script/examples/beautiful_code/regular_expression_matcher.coffee +34 -0
  138. data/packages/coffee-script/examples/blocks.coffee +54 -0
  139. data/packages/coffee-script/examples/code.coffee +167 -0
  140. data/packages/coffee-script/examples/computer_science/README +4 -0
  141. data/packages/coffee-script/examples/computer_science/binary_search.coffee +25 -0
  142. data/packages/coffee-script/examples/computer_science/bubble_sort.coffee +11 -0
  143. data/packages/coffee-script/examples/computer_science/linked_list.coffee +108 -0
  144. data/packages/coffee-script/examples/computer_science/luhn_algorithm.coffee +36 -0
  145. data/packages/coffee-script/examples/computer_science/merge_sort.coffee +19 -0
  146. data/packages/coffee-script/examples/computer_science/selection_sort.coffee +23 -0
  147. data/packages/coffee-script/examples/poignant.coffee +181 -0
  148. data/packages/coffee-script/examples/potion.coffee +206 -0
  149. data/packages/coffee-script/examples/underscore.coffee +682 -0
  150. data/packages/coffee-script/examples/web_server.coffee +12 -0
  151. data/packages/coffee-script/extras/EXTRAS +7 -0
  152. data/packages/coffee-script/extras/coffee-script.js +8 -0
  153. data/packages/coffee-script/extras/jsl.conf +44 -0
  154. data/packages/coffee-script/index.html +2515 -0
  155. data/packages/coffee-script/lib/browser.js +52 -0
  156. data/packages/coffee-script/lib/cake.js +76 -0
  157. data/packages/coffee-script/lib/coffee-script.js +82 -0
  158. data/packages/coffee-script/lib/command.js +263 -0
  159. data/packages/coffee-script/lib/grammar.js +581 -0
  160. data/packages/coffee-script/lib/helpers.js +66 -0
  161. data/packages/coffee-script/lib/index.js +8 -0
  162. data/packages/coffee-script/lib/lexer.js +633 -0
  163. data/packages/coffee-script/lib/nodes.js +2165 -0
  164. data/packages/coffee-script/lib/optparse.js +111 -0
  165. data/packages/coffee-script/lib/parser.js +649 -0
  166. data/packages/coffee-script/lib/repl.js +42 -0
  167. data/packages/coffee-script/lib/rewriter.js +353 -0
  168. data/packages/coffee-script/lib/scope.js +120 -0
  169. data/packages/coffee-script/lib/spade-format.js +45 -0
  170. data/packages/coffee-script/package.json +26 -0
  171. data/packages/coffee-script/src/browser.coffee +43 -0
  172. data/packages/coffee-script/src/cake.coffee +69 -0
  173. data/packages/coffee-script/src/coffee-script.coffee +92 -0
  174. data/packages/coffee-script/src/command.coffee +214 -0
  175. data/packages/coffee-script/src/grammar.coffee +590 -0
  176. data/packages/coffee-script/src/helpers.coffee +56 -0
  177. data/packages/coffee-script/src/index.coffee +2 -0
  178. data/packages/coffee-script/src/lexer.coffee +653 -0
  179. data/packages/coffee-script/src/nodes.coffee +1754 -0
  180. data/packages/coffee-script/src/optparse.coffee +99 -0
  181. data/packages/coffee-script/src/repl.coffee +42 -0
  182. data/packages/coffee-script/src/rewriter.coffee +326 -0
  183. data/packages/coffee-script/src/scope.coffee +94 -0
  184. data/packages/coffee-script/test/arguments.coffee +127 -0
  185. data/packages/coffee-script/test/assignment.coffee +98 -0
  186. data/packages/coffee-script/test/break.coffee +18 -0
  187. data/packages/coffee-script/test/comments.coffee +201 -0
  188. data/packages/coffee-script/test/conditionals.coffee +181 -0
  189. data/packages/coffee-script/test/exception_handling.coffee +90 -0
  190. data/packages/coffee-script/test/helpers.coffee +96 -0
  191. data/packages/coffee-script/test/importing.coffee +18 -0
  192. data/packages/coffee-script/test/operators.coffee +225 -0
  193. data/packages/coffee-script/test/ranges_slices_and_splices.coffee +186 -0
  194. data/packages/coffee-script/test/regular_expressions.coffee +56 -0
  195. data/packages/coffee-script/test/test.html +123 -0
  196. data/packages/coffee-script/test/test_chaining.coffee +77 -0
  197. data/packages/coffee-script/test/test_classes.coffee +372 -0
  198. data/packages/coffee-script/test/test_compilation.coffee +26 -0
  199. data/packages/coffee-script/test/test_comprehensions.coffee +318 -0
  200. data/packages/coffee-script/test/test_existence.coffee +165 -0
  201. data/packages/coffee-script/test/test_functions.coffee +379 -0
  202. data/packages/coffee-script/test/test_heredocs.coffee +111 -0
  203. data/packages/coffee-script/test/test_literals.coffee +270 -0
  204. data/packages/coffee-script/test/test_option_parser.coffee +27 -0
  205. data/packages/coffee-script/test/test_pattern_matching.coffee +162 -0
  206. data/packages/coffee-script/test/test_returns.coffee +63 -0
  207. data/packages/coffee-script/test/test_splats.coffee +102 -0
  208. data/packages/coffee-script/test/test_strings.coffee +118 -0
  209. data/packages/coffee-script/test/test_switch.coffee +103 -0
  210. data/packages/coffee-script/test/test_while.coffee +71 -0
  211. data/packages/ivory/LICENSE.txt +1 -0
  212. data/packages/ivory/README.md +19 -0
  213. data/packages/ivory/lib/buffer.js +111 -0
  214. data/packages/ivory/lib/events.js +137 -0
  215. data/packages/ivory/lib/fs.js +266 -0
  216. data/packages/ivory/lib/main.js +13 -0
  217. data/packages/ivory/lib/path.js +158 -0
  218. data/packages/ivory/lib/ruby/buffer.rb +145 -0
  219. data/packages/ivory/lib/ruby/constants.rb +585 -0
  220. data/packages/ivory/lib/ruby/events.rb +32 -0
  221. data/packages/ivory/lib/ruby/fs.rb +245 -0
  222. data/packages/ivory/lib/ruby/process.rb +28 -0
  223. data/packages/ivory/lib/stream.js +115 -0
  224. data/packages/ivory/lib/util.js +414 -0
  225. data/packages/ivory/package.json +11 -0
  226. data/packages/ivory/spade-boot.js +78 -0
  227. data/packages/jquery/main.js +7179 -0
  228. data/packages/jquery/package.json +10 -0
  229. data/packages/json/lib/main.js +14 -0
  230. data/packages/json/package.json +8 -0
  231. data/packages/lproj/README.md +77 -0
  232. data/packages/lproj/examples/demo-app/en.lproj/localized.strings +2 -0
  233. data/packages/lproj/examples/demo-app/fr.lproj/localized.strings +3 -0
  234. data/packages/lproj/examples/demo-app/index.html +8 -0
  235. data/packages/lproj/examples/demo-app/lib/main.js +7 -0
  236. data/packages/lproj/examples/demo-app/package.json +9 -0
  237. data/packages/lproj/lib/main.js +78 -0
  238. data/packages/lproj/lib/strings-format.js +6 -0
  239. data/packages/lproj/package.json +9 -0
  240. data/packages/optparse/README.md +161 -0
  241. data/packages/optparse/TODO +1 -0
  242. data/packages/optparse/examples/browser-test.html +75 -0
  243. data/packages/optparse/examples/nodejs-test.js +90 -0
  244. data/packages/optparse/lib/optparse.js +309 -0
  245. data/packages/optparse/package.json +13 -0
  246. data/packages/optparse/seed.yml +5 -0
  247. data/packages/text/lib/main.js +8 -0
  248. data/packages/text/package.json +9 -0
  249. data/packages/web-file/README.md +7 -0
  250. data/packages/web-file/lib/errors.js +32 -0
  251. data/packages/web-file/lib/file-reader.js +10 -0
  252. data/packages/web-file/lib/file-system.js +234 -0
  253. data/packages/web-file/lib/file-writer.js +10 -0
  254. data/packages/web-file/lib/file.js +9 -0
  255. data/packages/web-file/lib/main.js +34 -0
  256. data/packages/web-file/lib/platform.js +25 -0
  257. data/packages/web-file/lib/ruby/file.rb +252 -0
  258. data/packages/web-file/lib/ruby/file_reader.rb +69 -0
  259. data/packages/web-file/lib/ruby/file_system.rb +134 -0
  260. data/packages/web-file/lib/ruby/file_writer.rb +78 -0
  261. data/packages/web-file/package.json +12 -0
  262. data/packages/web-typed-array/README.md +7 -0
  263. data/packages/web-typed-array/lib/array-buffer-view.js +9 -0
  264. data/packages/web-typed-array/lib/array-buffer.js +7 -0
  265. data/packages/web-typed-array/lib/main.js +33 -0
  266. data/packages/web-typed-array/lib/platform.js +20 -0
  267. data/packages/web-typed-array/lib/ruby/array_buffer.rb +31 -0
  268. data/packages/web-typed-array/lib/ruby/array_buffer_view.rb +130 -0
  269. data/packages/web-typed-array/lib/ruby/typed_array.rb +133 -0
  270. data/packages/web-typed-array/lib/typed-array.js +26 -0
  271. data/packages/web-typed-array/package.json +9 -0
  272. data/spade-packager.gemspec +39 -0
  273. data/spec/cli/build_spec.rb +57 -0
  274. data/spec/cli/install_spec.rb +119 -0
  275. data/spec/cli/installed_spec.rb +55 -0
  276. data/spec/cli/list_spec.rb +74 -0
  277. data/spec/cli/login_spec.rb +75 -0
  278. data/spec/cli/new_spec.rb +5 -0
  279. data/spec/cli/owner_spec.rb +114 -0
  280. data/spec/cli/push_spec.rb +73 -0
  281. data/spec/cli/uninstall_spec.rb +58 -0
  282. data/spec/cli/unpack_spec.rb +72 -0
  283. data/spec/cli/unyank_spec.rb +73 -0
  284. data/spec/cli/yank_spec.rb +73 -0
  285. data/spec/credentials_spec.rb +23 -0
  286. data/spec/fixtures/badrake-0.8.7.spd +0 -0
  287. data/spec/fixtures/builder-3.0.0.spd +0 -0
  288. data/spec/fixtures/bundler-1.1.pre.spd +0 -0
  289. data/spec/fixtures/coffee-1.0.1.pre.spd +0 -0
  290. data/spec/fixtures/core-test-0.4.3.spd +0 -0
  291. data/spec/fixtures/core-test/bin/cot +3 -0
  292. data/spec/fixtures/core-test/lib/main.js +1 -0
  293. data/spec/fixtures/core-test/resources/runner.css +0 -0
  294. data/spec/fixtures/core-test/tests/test.js +1 -0
  295. data/spec/fixtures/highline-1.6.1.spd +0 -0
  296. data/spec/fixtures/ivory-0.0.1.spd +0 -0
  297. data/spec/fixtures/jquery-1.4.3.spd +0 -0
  298. data/spec/fixtures/optparse-1.0.1.spd +0 -0
  299. data/spec/fixtures/package.json +30 -0
  300. data/spec/fixtures/rake-0.8.6.spd +0 -0
  301. data/spec/fixtures/rake-0.8.7.spd +0 -0
  302. data/spec/gauntlet_spec.rb +27 -0
  303. data/spec/package_spec.rb +267 -0
  304. data/spec/spec_helper.rb +32 -0
  305. data/spec/support/cli.rb +103 -0
  306. data/spec/support/fake.rb +48 -0
  307. data/spec/support/fake_gem_server.rb +67 -0
  308. data/spec/support/fake_gemcutter.rb +50 -0
  309. data/spec/support/matchers.rb +32 -0
  310. data/spec/support/path.rb +61 -0
  311. data/templates/project/LICENSE +19 -0
  312. data/templates/project/README.md +21 -0
  313. data/templates/project/lib/main.js +9 -0
  314. data/templates/project/project.json +31 -0
  315. data/templates/project/tests/main-test.js +8 -0
  316. metadata +484 -0
@@ -0,0 +1,42 @@
1
+ (function() {
2
+ var CoffeeScript, error, helpers, readline, repl, run, stdio;
3
+ CoffeeScript = require('./coffee-script');
4
+ helpers = require('./helpers');
5
+ readline = require('readline');
6
+ stdio = process.openStdin();
7
+ error = function(err) {
8
+ return stdio.write((err.stack || err.toString()) + '\n\n');
9
+ };
10
+ helpers.extend(global, {
11
+ quit: function() {
12
+ return process.exit(0);
13
+ }
14
+ });
15
+ run = function(buffer) {
16
+ var val;
17
+ try {
18
+ val = CoffeeScript.eval(buffer.toString(), {
19
+ bare: true,
20
+ globals: true,
21
+ fileName: 'repl'
22
+ });
23
+ if (val !== void 0) {
24
+ console.log(val);
25
+ }
26
+ } catch (err) {
27
+ error(err);
28
+ }
29
+ return repl.prompt();
30
+ };
31
+ process.on('uncaughtException', error);
32
+ repl = readline.createInterface(stdio);
33
+ repl.setPrompt('coffee> ');
34
+ stdio.on('data', function(buffer) {
35
+ return repl.write(buffer);
36
+ });
37
+ repl.on('close', function() {
38
+ return stdio.destroy();
39
+ });
40
+ repl.on('line', run);
41
+ repl.prompt();
42
+ }).call(this);
@@ -0,0 +1,353 @@
1
+ (function() {
2
+ var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, IMPLICIT_UNSPACED_CALL, INVERSES, LINEBREAKS, SINGLE_CLOSERS, SINGLE_LINERS, left, rite, _i, _len, _ref;
3
+ var __indexOf = Array.prototype.indexOf || function(item) {
4
+ for (var i = 0, l = this.length; i < l; i++) {
5
+ if (this[i] === item) return i;
6
+ }
7
+ return -1;
8
+ }, __slice = Array.prototype.slice;
9
+ exports.Rewriter = (function() {
10
+ function Rewriter() {}
11
+ Rewriter.prototype.rewrite = function(tokens) {
12
+ this.tokens = tokens;
13
+ this.removeLeadingNewlines();
14
+ this.removeMidExpressionNewlines();
15
+ this.closeOpenCalls();
16
+ this.closeOpenIndexes();
17
+ this.addImplicitIndentation();
18
+ this.tagPostfixConditionals();
19
+ this.addImplicitBraces();
20
+ this.addImplicitParentheses();
21
+ this.ensureBalance(BALANCED_PAIRS);
22
+ this.rewriteClosingParens();
23
+ return this.tokens;
24
+ };
25
+ Rewriter.prototype.scanTokens = function(block) {
26
+ var i, token, tokens;
27
+ tokens = this.tokens;
28
+ i = 0;
29
+ while (token = tokens[i]) {
30
+ i += block.call(this, token, i, tokens);
31
+ }
32
+ return true;
33
+ };
34
+ Rewriter.prototype.detectEnd = function(i, condition, action) {
35
+ var levels, token, tokens, _ref, _ref2;
36
+ tokens = this.tokens;
37
+ levels = 0;
38
+ while (token = tokens[i]) {
39
+ if (levels === 0 && condition.call(this, token, i)) {
40
+ return action.call(this, token, i);
41
+ }
42
+ if (!token || levels < 0) {
43
+ return action.call(this, token, i - 1);
44
+ }
45
+ if (_ref = token[0], __indexOf.call(EXPRESSION_START, _ref) >= 0) {
46
+ levels += 1;
47
+ } else if (_ref2 = token[0], __indexOf.call(EXPRESSION_END, _ref2) >= 0) {
48
+ levels -= 1;
49
+ }
50
+ i += 1;
51
+ }
52
+ return i - 1;
53
+ };
54
+ Rewriter.prototype.removeLeadingNewlines = function() {
55
+ var i, tag, _len, _ref;
56
+ _ref = this.tokens;
57
+ for (i = 0, _len = _ref.length; i < _len; i++) {
58
+ tag = _ref[i][0];
59
+ if (tag !== 'TERMINATOR') {
60
+ break;
61
+ }
62
+ }
63
+ if (i) {
64
+ return this.tokens.splice(0, i);
65
+ }
66
+ };
67
+ Rewriter.prototype.removeMidExpressionNewlines = function() {
68
+ return this.scanTokens(function(token, i, tokens) {
69
+ var _ref;
70
+ if (!(token[0] === 'TERMINATOR' && (_ref = this.tag(i + 1), __indexOf.call(EXPRESSION_CLOSE, _ref) >= 0))) {
71
+ return 1;
72
+ }
73
+ tokens.splice(i, 1);
74
+ return 0;
75
+ });
76
+ };
77
+ Rewriter.prototype.closeOpenCalls = function() {
78
+ var action, condition;
79
+ condition = function(token, i) {
80
+ var _ref;
81
+ return ((_ref = token[0]) === ')' || _ref === 'CALL_END') || token[0] === 'OUTDENT' && this.tag(i - 1) === ')';
82
+ };
83
+ action = function(token, i) {
84
+ return this.tokens[token[0] === 'OUTDENT' ? i - 1 : i][0] = 'CALL_END';
85
+ };
86
+ return this.scanTokens(function(token, i) {
87
+ if (token[0] === 'CALL_START') {
88
+ this.detectEnd(i + 1, condition, action);
89
+ }
90
+ return 1;
91
+ });
92
+ };
93
+ Rewriter.prototype.closeOpenIndexes = function() {
94
+ var action, condition;
95
+ condition = function(token, i) {
96
+ var _ref;
97
+ return (_ref = token[0]) === ']' || _ref === 'INDEX_END';
98
+ };
99
+ action = function(token, i) {
100
+ return token[0] = 'INDEX_END';
101
+ };
102
+ return this.scanTokens(function(token, i) {
103
+ if (token[0] === 'INDEX_START') {
104
+ this.detectEnd(i + 1, condition, action);
105
+ }
106
+ return 1;
107
+ });
108
+ };
109
+ Rewriter.prototype.addImplicitBraces = function() {
110
+ var action, condition, stack, start, startIndent;
111
+ stack = [];
112
+ start = null;
113
+ startIndent = 0;
114
+ condition = function(token, i) {
115
+ var one, tag, three, two, _ref, _ref2;
116
+ _ref = this.tokens.slice(i + 1, (i + 3 + 1) || 9e9), one = _ref[0], two = _ref[1], three = _ref[2];
117
+ if ('HERECOMMENT' === (one != null ? one[0] : void 0)) {
118
+ return false;
119
+ }
120
+ tag = token[0];
121
+ return ((tag === 'TERMINATOR' || tag === 'OUTDENT') && !((two != null ? two[0] : void 0) === ':' || (one != null ? one[0] : void 0) === '@' && (three != null ? three[0] : void 0) === ':')) || (tag === ',' && one && ((_ref2 = one[0]) !== 'IDENTIFIER' && _ref2 !== 'NUMBER' && _ref2 !== 'STRING' && _ref2 !== '@' && _ref2 !== 'TERMINATOR' && _ref2 !== 'OUTDENT'));
122
+ };
123
+ action = function(token, i) {
124
+ return this.tokens.splice(i, 0, ['}', '}', token[2]]);
125
+ };
126
+ return this.scanTokens(function(token, i, tokens) {
127
+ var ago, idx, tag, tok, value, _ref, _ref2;
128
+ if (_ref = (tag = token[0]), __indexOf.call(EXPRESSION_START, _ref) >= 0) {
129
+ stack.push([(tag === 'INDENT' && this.tag(i - 1) === '{' ? '{' : tag), i]);
130
+ return 1;
131
+ }
132
+ if (__indexOf.call(EXPRESSION_END, tag) >= 0) {
133
+ start = stack.pop();
134
+ return 1;
135
+ }
136
+ if (!(tag === ':' && ((ago = this.tag(i - 2)) === ':' || ((_ref2 = stack[stack.length - 1]) != null ? _ref2[0] : void 0) !== '{'))) {
137
+ return 1;
138
+ }
139
+ stack.push(['{']);
140
+ idx = ago === '@' ? i - 2 : i - 1;
141
+ while (this.tag(idx - 2) === 'HERECOMMENT') {
142
+ idx -= 2;
143
+ }
144
+ value = new String('{');
145
+ value.generated = true;
146
+ tok = ['{', value, token[2]];
147
+ tok.generated = true;
148
+ tokens.splice(idx, 0, tok);
149
+ this.detectEnd(i + 2, condition, action);
150
+ return 2;
151
+ });
152
+ };
153
+ Rewriter.prototype.addImplicitParentheses = function() {
154
+ var action, noCall;
155
+ noCall = false;
156
+ action = function(token, i) {
157
+ var idx;
158
+ idx = token[0] === 'OUTDENT' ? i + 1 : i;
159
+ return this.tokens.splice(idx, 0, ['CALL_END', ')', token[2]]);
160
+ };
161
+ return this.scanTokens(function(token, i, tokens) {
162
+ var callObject, current, next, prev, seenSingle, tag, _ref, _ref2, _ref3;
163
+ tag = token[0];
164
+ if (tag === 'CLASS' || tag === 'IF') {
165
+ noCall = true;
166
+ }
167
+ _ref = tokens.slice(i - 1, (i + 1 + 1) || 9e9), prev = _ref[0], current = _ref[1], next = _ref[2];
168
+ callObject = !noCall && tag === 'INDENT' && next && next.generated && next[0] === '{' && prev && (_ref2 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref2) >= 0);
169
+ seenSingle = false;
170
+ if (__indexOf.call(LINEBREAKS, tag) >= 0) {
171
+ noCall = false;
172
+ }
173
+ if (prev && !prev.spaced && tag === '?') {
174
+ token.call = true;
175
+ }
176
+ if (!(callObject || (prev != null ? prev.spaced : void 0) && (prev.call || (_ref3 = prev[0], __indexOf.call(IMPLICIT_FUNC, _ref3) >= 0)) && (__indexOf.call(IMPLICIT_CALL, tag) >= 0 || !(token.spaced || token.newLine) && __indexOf.call(IMPLICIT_UNSPACED_CALL, tag) >= 0))) {
177
+ return 1;
178
+ }
179
+ tokens.splice(i, 0, ['CALL_START', '(', token[2]]);
180
+ this.detectEnd(i + 1, function(token, i) {
181
+ var post, _ref;
182
+ tag = token[0];
183
+ if (!seenSingle && token.fromThen) {
184
+ return true;
185
+ }
186
+ if (tag === 'IF' || tag === 'ELSE' || tag === '->' || tag === '=>') {
187
+ seenSingle = true;
188
+ }
189
+ if ((tag === '.' || tag === '?.' || tag === '::') && this.tag(i - 1) === 'OUTDENT') {
190
+ return true;
191
+ }
192
+ return !token.generated && this.tag(i - 1) !== ',' && __indexOf.call(IMPLICIT_END, tag) >= 0 && (tag !== 'INDENT' || (this.tag(i - 2) !== 'CLASS' && (_ref = this.tag(i - 1), __indexOf.call(IMPLICIT_BLOCK, _ref) < 0) && !((post = this.tokens[i + 1]) && post.generated && post[0] === '{')));
193
+ }, action);
194
+ if (prev[0] === '?') {
195
+ prev[0] = 'FUNC_EXIST';
196
+ }
197
+ return 2;
198
+ });
199
+ };
200
+ Rewriter.prototype.addImplicitIndentation = function() {
201
+ return this.scanTokens(function(token, i, tokens) {
202
+ var action, condition, indent, outdent, starter, tag, _ref, _ref2;
203
+ tag = token[0];
204
+ if (tag === 'TERMINATOR' && this.tag(i + 1) === 'THEN') {
205
+ tokens.splice(i, 1);
206
+ return 0;
207
+ }
208
+ if (tag === 'ELSE' && this.tag(i - 1) !== 'OUTDENT') {
209
+ tokens.splice.apply(tokens, [i, 0].concat(__slice.call(this.indentation(token))));
210
+ return 2;
211
+ }
212
+ if (tag === 'CATCH' && ((_ref = this.tag(i + 2)) === 'OUTDENT' || _ref === 'TERMINATOR' || _ref === 'FINALLY')) {
213
+ tokens.splice.apply(tokens, [i + 2, 0].concat(__slice.call(this.indentation(token))));
214
+ return 4;
215
+ }
216
+ if (__indexOf.call(SINGLE_LINERS, tag) >= 0 && this.tag(i + 1) !== 'INDENT' && !(tag === 'ELSE' && this.tag(i + 1) === 'IF')) {
217
+ starter = tag;
218
+ _ref2 = this.indentation(token), indent = _ref2[0], outdent = _ref2[1];
219
+ if (starter === 'THEN') {
220
+ indent.fromThen = true;
221
+ }
222
+ indent.generated = outdent.generated = true;
223
+ tokens.splice(i + 1, 0, indent);
224
+ condition = function(token, i) {
225
+ var _ref;
226
+ return token[1] !== ';' && (_ref = token[0], __indexOf.call(SINGLE_CLOSERS, _ref) >= 0) && !(token[0] === 'ELSE' && (starter !== 'IF' && starter !== 'THEN'));
227
+ };
228
+ action = function(token, i) {
229
+ return this.tokens.splice((this.tag(i - 1) === ',' ? i - 1 : i), 0, outdent);
230
+ };
231
+ this.detectEnd(i + 2, condition, action);
232
+ if (tag === 'THEN') {
233
+ tokens.splice(i, 1);
234
+ }
235
+ return 1;
236
+ }
237
+ return 1;
238
+ });
239
+ };
240
+ Rewriter.prototype.tagPostfixConditionals = function() {
241
+ var condition;
242
+ condition = function(token, i) {
243
+ var _ref;
244
+ return (_ref = token[0]) === 'TERMINATOR' || _ref === 'INDENT';
245
+ };
246
+ return this.scanTokens(function(token, i) {
247
+ var original;
248
+ if (token[0] !== 'IF') {
249
+ return 1;
250
+ }
251
+ original = token;
252
+ this.detectEnd(i + 1, condition, function(token, i) {
253
+ if (token[0] !== 'INDENT') {
254
+ return original[0] = 'POST_' + original[0];
255
+ }
256
+ });
257
+ return 1;
258
+ });
259
+ };
260
+ Rewriter.prototype.ensureBalance = function(pairs) {
261
+ var close, level, levels, open, openLine, tag, token, _i, _j, _len, _len2, _ref, _ref2;
262
+ levels = {};
263
+ openLine = {};
264
+ _ref = this.tokens;
265
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
266
+ token = _ref[_i];
267
+ tag = token[0];
268
+ for (_j = 0, _len2 = pairs.length; _j < _len2; _j++) {
269
+ _ref2 = pairs[_j], open = _ref2[0], close = _ref2[1];
270
+ levels[open] |= 0;
271
+ if (tag === open) {
272
+ if (levels[open]++ === 0) {
273
+ openLine[open] = token[2];
274
+ }
275
+ } else if (tag === close && --levels[open] < 0) {
276
+ throw Error("too many " + token[1] + " on line " + (token[2] + 1));
277
+ }
278
+ }
279
+ }
280
+ for (open in levels) {
281
+ level = levels[open];
282
+ if (level > 0) {
283
+ throw Error("unclosed " + open + " on line " + (openLine[open] + 1));
284
+ }
285
+ }
286
+ return this;
287
+ };
288
+ Rewriter.prototype.rewriteClosingParens = function() {
289
+ var debt, key, stack;
290
+ stack = [];
291
+ debt = {};
292
+ for (key in INVERSES) {
293
+ debt[key] = 0;
294
+ }
295
+ return this.scanTokens(function(token, i, tokens) {
296
+ var inv, match, mtag, oppos, tag, val, _ref;
297
+ if (_ref = (tag = token[0]), __indexOf.call(EXPRESSION_START, _ref) >= 0) {
298
+ stack.push(token);
299
+ return 1;
300
+ }
301
+ if (__indexOf.call(EXPRESSION_END, tag) < 0) {
302
+ return 1;
303
+ }
304
+ if (debt[inv = INVERSES[tag]] > 0) {
305
+ debt[inv] -= 1;
306
+ tokens.splice(i, 1);
307
+ return 0;
308
+ }
309
+ match = stack.pop();
310
+ mtag = match[0];
311
+ oppos = INVERSES[mtag];
312
+ if (tag === oppos) {
313
+ return 1;
314
+ }
315
+ debt[mtag] += 1;
316
+ val = [oppos, mtag === 'INDENT' ? match[1] : oppos];
317
+ if (this.tag(i + 2) === mtag) {
318
+ tokens.splice(i + 3, 0, val);
319
+ stack.push(match);
320
+ } else {
321
+ tokens.splice(i, 0, val);
322
+ }
323
+ return 1;
324
+ });
325
+ };
326
+ Rewriter.prototype.indentation = function(token) {
327
+ return [['INDENT', 2, token[2]], ['OUTDENT', 2, token[2]]];
328
+ };
329
+ Rewriter.prototype.tag = function(i) {
330
+ var _ref;
331
+ return (_ref = this.tokens[i]) != null ? _ref[0] : void 0;
332
+ };
333
+ return Rewriter;
334
+ })();
335
+ BALANCED_PAIRS = [['(', ')'], ['[', ']'], ['{', '}'], ['INDENT', 'OUTDENT'], ['CALL_START', 'CALL_END'], ['PARAM_START', 'PARAM_END'], ['INDEX_START', 'INDEX_END']];
336
+ INVERSES = {};
337
+ EXPRESSION_START = [];
338
+ EXPRESSION_END = [];
339
+ for (_i = 0, _len = BALANCED_PAIRS.length; _i < _len; _i++) {
340
+ _ref = BALANCED_PAIRS[_i], left = _ref[0], rite = _ref[1];
341
+ EXPRESSION_START.push(INVERSES[rite] = left);
342
+ EXPRESSION_END.push(INVERSES[left] = rite);
343
+ }
344
+ EXPRESSION_CLOSE = ['CATCH', 'WHEN', 'ELSE', 'FINALLY'].concat(EXPRESSION_END);
345
+ IMPLICIT_FUNC = ['IDENTIFIER', 'SUPER', ')', 'CALL_END', ']', 'INDEX_END', '@', 'THIS'];
346
+ IMPLICIT_CALL = ['IDENTIFIER', 'NUMBER', 'STRING', 'JS', 'REGEX', 'NEW', 'PARAM_START', 'CLASS', 'IF', 'TRY', 'SWITCH', 'THIS', 'BOOL', 'UNARY', 'SUPER', '@', '->', '=>', '[', '(', '{', '--', '++'];
347
+ IMPLICIT_UNSPACED_CALL = ['+', '-'];
348
+ IMPLICIT_BLOCK = ['->', '=>', '{', '[', ','];
349
+ IMPLICIT_END = ['POST_IF', 'FOR', 'WHILE', 'UNTIL', 'WHEN', 'BY', 'LOOP', 'TERMINATOR', 'INDENT'];
350
+ SINGLE_LINERS = ['ELSE', '->', '=>', 'TRY', 'FINALLY', 'THEN'];
351
+ SINGLE_CLOSERS = ['TERMINATOR', 'CATCH', 'FINALLY', 'ELSE', 'OUTDENT', 'LEADING_WHEN'];
352
+ LINEBREAKS = ['TERMINATOR', 'INDENT', 'OUTDENT'];
353
+ }).call(this);
@@ -0,0 +1,120 @@
1
+ (function() {
2
+ var Scope, extend, last, _ref;
3
+ _ref = require('./helpers'), extend = _ref.extend, last = _ref.last;
4
+ exports.Scope = Scope = (function() {
5
+ Scope.root = null;
6
+ function Scope(parent, expressions, method) {
7
+ this.parent = parent;
8
+ this.expressions = expressions;
9
+ this.method = method;
10
+ this.variables = [
11
+ {
12
+ name: 'arguments',
13
+ type: 'arguments'
14
+ }
15
+ ];
16
+ this.positions = {};
17
+ if (!this.parent) {
18
+ Scope.root = this;
19
+ }
20
+ }
21
+ Scope.prototype.add = function(name, type, immediate) {
22
+ var pos;
23
+ if (this.shared && !immediate) {
24
+ return this.parent.add(name, type, immediate);
25
+ }
26
+ if (typeof (pos = this.positions[name]) === 'number') {
27
+ return this.variables[pos].type = type;
28
+ } else {
29
+ return this.positions[name] = this.variables.push({
30
+ name: name,
31
+ type: type
32
+ }) - 1;
33
+ }
34
+ };
35
+ Scope.prototype.find = function(name, options) {
36
+ if (this.check(name, options)) {
37
+ return true;
38
+ }
39
+ this.add(name, 'var');
40
+ return false;
41
+ };
42
+ Scope.prototype.parameter = function(name) {
43
+ if (this.shared && this.parent.check(name, true)) {
44
+ return;
45
+ }
46
+ return this.add(name, 'param');
47
+ };
48
+ Scope.prototype.check = function(name, immediate) {
49
+ var found, _ref;
50
+ found = !!this.type(name);
51
+ if (found || immediate) {
52
+ return found;
53
+ }
54
+ return !!((_ref = this.parent) != null ? _ref.check(name) : void 0);
55
+ };
56
+ Scope.prototype.temporary = function(name, index) {
57
+ if (name.length > 1) {
58
+ return '_' + name + (index > 1 ? index : '');
59
+ } else {
60
+ return '_' + (index + parseInt(name, 36)).toString(36).replace(/\d/g, 'a');
61
+ }
62
+ };
63
+ Scope.prototype.type = function(name) {
64
+ var v, _i, _len, _ref;
65
+ _ref = this.variables;
66
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
67
+ v = _ref[_i];
68
+ if (v.name === name) {
69
+ return v.type;
70
+ }
71
+ }
72
+ return null;
73
+ };
74
+ Scope.prototype.freeVariable = function(type) {
75
+ var index, temp;
76
+ index = 0;
77
+ while (this.check((temp = this.temporary(type, index)), true)) {
78
+ index++;
79
+ }
80
+ this.add(temp, 'var', true);
81
+ return temp;
82
+ };
83
+ Scope.prototype.assign = function(name, value) {
84
+ this.add(name, {
85
+ value: value,
86
+ assigned: true
87
+ });
88
+ return this.hasAssignments = true;
89
+ };
90
+ Scope.prototype.hasDeclarations = function() {
91
+ return !!this.declaredVariables().length;
92
+ };
93
+ Scope.prototype.declaredVariables = function() {
94
+ var realVars, tempVars, v, _i, _len, _ref;
95
+ realVars = [];
96
+ tempVars = [];
97
+ _ref = this.variables;
98
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
99
+ v = _ref[_i];
100
+ if (v.type === 'var') {
101
+ (v.name.charAt(0) === '_' ? tempVars : realVars).push(v.name);
102
+ }
103
+ }
104
+ return realVars.sort().concat(tempVars.sort());
105
+ };
106
+ Scope.prototype.assignedVariables = function() {
107
+ var v, _i, _len, _ref, _results;
108
+ _ref = this.variables;
109
+ _results = [];
110
+ for (_i = 0, _len = _ref.length; _i < _len; _i++) {
111
+ v = _ref[_i];
112
+ if (v.type.assigned) {
113
+ _results.push("" + v.name + " = " + v.type.value);
114
+ }
115
+ }
116
+ return _results;
117
+ };
118
+ return Scope;
119
+ })();
120
+ }).call(this);