traceur-rb 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (255) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +22 -0
  3. data/.rspec +1 -0
  4. data/.ruby-gemset +1 -0
  5. data/.ruby-version +1 -0
  6. data/Gemfile +4 -0
  7. data/Guardfile +8 -0
  8. data/LICENSE.txt +22 -0
  9. data/README.md +87 -0
  10. data/Rakefile +2 -0
  11. data/lib/js/compile.js +31 -0
  12. data/lib/traceur-rb.rb +1 -0
  13. data/lib/traceur.rb +43 -0
  14. data/lib/traceur/compilation_options.rb +65 -0
  15. data/lib/traceur/compiler.rb +33 -0
  16. data/lib/traceur/configuration.rb +47 -0
  17. data/lib/traceur/node.rb +26 -0
  18. data/lib/traceur/node/command_result.rb +28 -0
  19. data/lib/traceur/node/runner.rb +40 -0
  20. data/lib/traceur/version.rb +3 -0
  21. data/spec/examples/classes.js +12 -0
  22. data/spec/integration/examples_spec.rb +28 -0
  23. data/spec/spec_helper.rb +1 -0
  24. data/spec/traceur/compilation_options_spec.rb +31 -0
  25. data/spec/traceur/configuration_spec.rb +54 -0
  26. data/spec/traceur/node_spec.rb +15 -0
  27. data/traceur-rb.gemspec +25 -0
  28. data/vendor/node_modules/.bin/traceur +3 -0
  29. data/vendor/node_modules/traceur/README.md +40 -0
  30. data/vendor/node_modules/traceur/bin/traceur-runtime.js +2101 -0
  31. data/vendor/node_modules/traceur/bin/traceur.js +23034 -0
  32. data/vendor/node_modules/traceur/node_modules/.bin/semver +125 -0
  33. data/vendor/node_modules/traceur/node_modules/commander/Readme.md +208 -0
  34. data/vendor/node_modules/traceur/node_modules/commander/index.js +852 -0
  35. data/vendor/node_modules/traceur/node_modules/commander/package.json +40 -0
  36. data/vendor/node_modules/traceur/node_modules/q-io/.npmignore +1 -0
  37. data/vendor/node_modules/traceur/node_modules/q-io/.travis.yml +3 -0
  38. data/vendor/node_modules/traceur/node_modules/q-io/CHANGES.md +122 -0
  39. data/vendor/node_modules/traceur/node_modules/q-io/LICENSE +19 -0
  40. data/vendor/node_modules/traceur/node_modules/q-io/README.md +928 -0
  41. data/vendor/node_modules/traceur/node_modules/q-io/buffer-stream.js +59 -0
  42. data/vendor/node_modules/traceur/node_modules/q-io/coverage-report.js +44 -0
  43. data/vendor/node_modules/traceur/node_modules/q-io/deprecate.js +51 -0
  44. data/vendor/node_modules/traceur/node_modules/q-io/fs-boot.js +307 -0
  45. data/vendor/node_modules/traceur/node_modules/q-io/fs-common.js +499 -0
  46. data/vendor/node_modules/traceur/node_modules/q-io/fs-mock.js +547 -0
  47. data/vendor/node_modules/traceur/node_modules/q-io/fs-root.js +105 -0
  48. data/vendor/node_modules/traceur/node_modules/q-io/fs.js +355 -0
  49. data/vendor/node_modules/traceur/node_modules/q-io/fs2http.js +65 -0
  50. data/vendor/node_modules/traceur/node_modules/q-io/http-apps.js +152 -0
  51. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/chain.js +24 -0
  52. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/content.js +93 -0
  53. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/cookie.js +154 -0
  54. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/decorators.js +178 -0
  55. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/fs.js +417 -0
  56. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/html.js +58 -0
  57. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/json.js +78 -0
  58. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/negotiate.js +120 -0
  59. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/proxy.js +27 -0
  60. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/redirect.js +209 -0
  61. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/route.js +125 -0
  62. data/vendor/node_modules/traceur/node_modules/q-io/http-apps/status.js +175 -0
  63. data/vendor/node_modules/traceur/node_modules/q-io/http-cookie.js +75 -0
  64. data/vendor/node_modules/traceur/node_modules/q-io/http.js +378 -0
  65. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/.npmignore +11 -0
  66. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/.travis.yml +4 -0
  67. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/CHANGES.md +78 -0
  68. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/LICENSE.md +21 -0
  69. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/README.md +1285 -0
  70. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/collections.js +22 -0
  71. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/dict.js +142 -0
  72. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/fast-map.js +57 -0
  73. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/fast-set.js +183 -0
  74. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/generic-collection.js +261 -0
  75. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/generic-map.js +186 -0
  76. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/generic-order.js +55 -0
  77. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/generic-set.js +59 -0
  78. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/heap.js +236 -0
  79. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/iterator.js +371 -0
  80. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/list.js +435 -0
  81. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/listen/array-changes.js +247 -0
  82. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/listen/map-changes.js +147 -0
  83. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/listen/property-changes.js +448 -0
  84. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/listen/range-changes.js +139 -0
  85. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/lru-map.js +79 -0
  86. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/lru-set.js +142 -0
  87. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/map.js +60 -0
  88. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/multi-map.js +41 -0
  89. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/node_modules/weak-map/package.json +12 -0
  90. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/node_modules/weak-map/sync +7 -0
  91. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/node_modules/weak-map/sync.patch +48 -0
  92. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/node_modules/weak-map/weak-map.js +590 -0
  93. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/package.json +49 -0
  94. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/set.js +173 -0
  95. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/shim-array.js +274 -0
  96. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/shim-function.js +59 -0
  97. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/shim-object.js +538 -0
  98. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/shim-regexp.js +14 -0
  99. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/shim.js +6 -0
  100. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/sorted-array-map.js +49 -0
  101. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/sorted-array-set.js +51 -0
  102. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/sorted-array.js +269 -0
  103. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/sorted-map.js +61 -0
  104. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/sorted-set.js +736 -0
  105. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/tree-log.js +40 -0
  106. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/collections/weak-map.js +1 -0
  107. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mime/LICENSE +19 -0
  108. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mime/README.md +66 -0
  109. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mime/mime.js +114 -0
  110. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mime/package.json +35 -0
  111. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mime/test.js +84 -0
  112. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mime/types/mime.types +1588 -0
  113. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mime/types/node.types +77 -0
  114. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mimeparse/CHANGES +15 -0
  115. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mimeparse/LICENSE +19 -0
  116. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mimeparse/README +96 -0
  117. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mimeparse/lib/mimeparse.js +166 -0
  118. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/mimeparse/package.json +43 -0
  119. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/q/CONTRIBUTING.md +40 -0
  120. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/q/LICENSE +19 -0
  121. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/q/README.md +813 -0
  122. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/q/benchmark/compare-with-callbacks.js +71 -0
  123. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/q/benchmark/scenarios.js +36 -0
  124. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/q/package.json +93 -0
  125. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/q/q.js +1937 -0
  126. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/q/queue.js +35 -0
  127. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/.gitmodules +6 -0
  128. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/History.md +36 -0
  129. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/Makefile +7 -0
  130. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/Readme.md +38 -0
  131. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/benchmark.js +32 -0
  132. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/examples.js +39 -0
  133. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/index.js +2 -0
  134. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/lib/querystring.js +123 -0
  135. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/package.json +19 -0
  136. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/.gitmodules +3 -0
  137. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/.npmignore +3 -0
  138. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/History.md +128 -0
  139. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/Makefile +53 -0
  140. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/Readme.md +61 -0
  141. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/bin/expresso +856 -0
  142. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/docs/api.html +1080 -0
  143. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/docs/index.html +377 -0
  144. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/docs/index.md +290 -0
  145. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/docs/layout/foot.html +3 -0
  146. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/docs/layout/head.html +42 -0
  147. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/lib/bar.js +4 -0
  148. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/lib/foo.js +16 -0
  149. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/package.json +12 -0
  150. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/test/assert.test.js +91 -0
  151. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/test/async.test.js +12 -0
  152. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/test/bar.test.js +13 -0
  153. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/test/foo.test.js +14 -0
  154. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/test/http.test.js +146 -0
  155. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/test/serial/async.test.js +39 -0
  156. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/expresso/test/serial/http.test.js +48 -0
  157. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/.gitmodules +3 -0
  158. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/History.md +22 -0
  159. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/Makefile +6 -0
  160. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/Readme.md +248 -0
  161. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/examples/runner.js +53 -0
  162. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/index.js +2 -0
  163. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/lib/eql.js +91 -0
  164. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/lib/should.js +548 -0
  165. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/package.json +8 -0
  166. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/support/should/test/should.test.js +358 -0
  167. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/qs/test/querystring.test.js +133 -0
  168. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/url2/.npmignore +3 -0
  169. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/url2/.travis.yml +4 -0
  170. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/url2/LICENSE.md +20 -0
  171. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/url2/README.md +33 -0
  172. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/url2/package.json +37 -0
  173. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/url2/test/url2-spec.js +125 -0
  174. data/vendor/node_modules/traceur/node_modules/q-io/node_modules/url2/url2.js +151 -0
  175. data/vendor/node_modules/traceur/node_modules/q-io/package.json +51 -0
  176. data/vendor/node_modules/traceur/node_modules/q-io/reader.js +133 -0
  177. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/boot-directory-spec.js +47 -0
  178. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/contains-spec.js +11 -0
  179. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/fixtures/hello.txt +1 -0
  180. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/issues/1-spec.js +33 -0
  181. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/make-tree-spec.js +92 -0
  182. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/append-spec.js +41 -0
  183. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/copy-tree-spec.js +57 -0
  184. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/fixture/hello.txt +1 -0
  185. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/link-spec.js +70 -0
  186. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/make-tree-spec.js +109 -0
  187. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/merge-spec.js +67 -0
  188. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/move-spec.js +219 -0
  189. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/object-spec.js +20 -0
  190. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/range-spec.js +26 -0
  191. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/read-spec.js +40 -0
  192. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/remove-directory-spec.js +37 -0
  193. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/remove-tree-spec.js +39 -0
  194. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/root-spec.js +32 -0
  195. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/stat-spec.js +26 -0
  196. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/symbolic-link-spec.js +86 -0
  197. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/working-directory-spec.js +31 -0
  198. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/mock/write-spec.js +73 -0
  199. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/range-spec.js +23 -0
  200. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/range-spec.txt +1 -0
  201. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/read-spec.js +22 -0
  202. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/relative-spec.js +25 -0
  203. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/reroot-spec.js +45 -0
  204. data/vendor/node_modules/traceur/node_modules/q-io/spec/fs/write-spec.js +38 -0
  205. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/cookie-spec.js +52 -0
  206. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/directory-list-spec.js +86 -0
  207. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/fixtures/01234.txt +1 -0
  208. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/fixtures/1234.txt +1 -0
  209. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/fixtures/5678.txt +0 -0
  210. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/fixtures/9012/3456.txt +0 -0
  211. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/hosts-spec.js +49 -0
  212. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/interpret-range-spec.js +47 -0
  213. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/partial-range-spec.js +186 -0
  214. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/proxy-spec.js +82 -0
  215. data/vendor/node_modules/traceur/node_modules/q-io/spec/http-apps/symbolic-link-spec.js +110 -0
  216. data/vendor/node_modules/traceur/node_modules/q-io/spec/http/agent-spec.js +96 -0
  217. data/vendor/node_modules/traceur/node_modules/q-io/spec/http/basic-spec.js +96 -0
  218. data/vendor/node_modules/traceur/node_modules/q-io/spec/lib/jasmine-promise.js +42 -0
  219. data/vendor/node_modules/traceur/node_modules/q-io/writer.js +111 -0
  220. data/vendor/node_modules/traceur/node_modules/semver/.npmignore +1 -0
  221. data/vendor/node_modules/traceur/node_modules/semver/LICENSE +27 -0
  222. data/vendor/node_modules/traceur/node_modules/semver/Makefile +24 -0
  223. data/vendor/node_modules/traceur/node_modules/semver/README.md +158 -0
  224. data/vendor/node_modules/traceur/node_modules/semver/bin/semver +125 -0
  225. data/vendor/node_modules/traceur/node_modules/semver/foot.js +6 -0
  226. data/vendor/node_modules/traceur/node_modules/semver/head.js +2 -0
  227. data/vendor/node_modules/traceur/node_modules/semver/package.json +31 -0
  228. data/vendor/node_modules/traceur/node_modules/semver/semver.browser.js +1039 -0
  229. data/vendor/node_modules/traceur/node_modules/semver/semver.browser.js.gz +0 -0
  230. data/vendor/node_modules/traceur/node_modules/semver/semver.js +1043 -0
  231. data/vendor/node_modules/traceur/node_modules/semver/semver.min.js +1 -0
  232. data/vendor/node_modules/traceur/node_modules/semver/semver.min.js.gz +0 -0
  233. data/vendor/node_modules/traceur/node_modules/semver/test/amd.js +15 -0
  234. data/vendor/node_modules/traceur/node_modules/semver/test/gtr.js +173 -0
  235. data/vendor/node_modules/traceur/node_modules/semver/test/index.js +584 -0
  236. data/vendor/node_modules/traceur/node_modules/semver/test/ltr.js +174 -0
  237. data/vendor/node_modules/traceur/node_modules/semver/test/no-module.js +19 -0
  238. data/vendor/node_modules/traceur/package.json +64 -0
  239. data/vendor/node_modules/traceur/src/node/System.js +31 -0
  240. data/vendor/node_modules/traceur/src/node/api.js +124 -0
  241. data/vendor/node_modules/traceur/src/node/command.js +141 -0
  242. data/vendor/node_modules/traceur/src/node/compile-single-file.js +69 -0
  243. data/vendor/node_modules/traceur/src/node/compiler.js +116 -0
  244. data/vendor/node_modules/traceur/src/node/deferred.js +110 -0
  245. data/vendor/node_modules/traceur/src/node/file-util.js +73 -0
  246. data/vendor/node_modules/traceur/src/node/getopt.js +147 -0
  247. data/vendor/node_modules/traceur/src/node/inline-module.js +149 -0
  248. data/vendor/node_modules/traceur/src/node/interpreter.js +33 -0
  249. data/vendor/node_modules/traceur/src/node/nodeLoader.js +41 -0
  250. data/vendor/node_modules/traceur/src/node/require.js +85 -0
  251. data/vendor/node_modules/traceur/src/node/to-amd-compiler.js +33 -0
  252. data/vendor/node_modules/traceur/src/node/to-commonjs-compiler.js +33 -0
  253. data/vendor/node_modules/traceur/src/node/traceur.js +32 -0
  254. data/vendor/node_modules/traceur/traceur +3 -0
  255. metadata +359 -0
@@ -0,0 +1,19 @@
1
+
2
+ Copyright 2009–2012 Kristopher Michael Kowal. All rights reserved.
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy
4
+ of this software and associated documentation files (the "Software"), to
5
+ deal in the Software without restriction, including without limitation the
6
+ rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
7
+ sell copies of the Software, and to permit persons to whom the Software is
8
+ furnished to do so, subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in
11
+ all copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
18
+ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
19
+ IN THE SOFTWARE.
@@ -0,0 +1,813 @@
1
+ [![Build Status](https://secure.travis-ci.org/kriskowal/q.png?branch=master)](http://travis-ci.org/kriskowal/q)
2
+
3
+ <a href="http://promises-aplus.github.com/promises-spec">
4
+ <img src="http://promises-aplus.github.com/promises-spec/assets/logo-small.png"
5
+ align="right" alt="Promises/A+ logo" />
6
+ </a>
7
+
8
+ If a function cannot return a value or throw an exception without
9
+ blocking, it can return a promise instead. A promise is an object
10
+ that represents the return value or the thrown exception that the
11
+ function may eventually provide. A promise can also be used as a
12
+ proxy for a [remote object][Q-Connection] to overcome latency.
13
+
14
+ [Q-Connection]: https://github.com/kriskowal/q-connection
15
+
16
+ On the first pass, promises can mitigate the “[Pyramid of
17
+ Doom][POD]”: the situation where code marches to the right faster
18
+ than it marches forward.
19
+
20
+ [POD]: http://calculist.org/blog/2011/12/14/why-coroutines-wont-work-on-the-web/
21
+
22
+ ```javascript
23
+ step1(function (value1) {
24
+ step2(value1, function(value2) {
25
+ step3(value2, function(value3) {
26
+ step4(value3, function(value4) {
27
+ // Do something with value4
28
+ });
29
+ });
30
+ });
31
+ });
32
+ ```
33
+
34
+ With a promise library, you can flatten the pyramid.
35
+
36
+ ```javascript
37
+ Q.fcall(promisedStep1)
38
+ .then(promisedStep2)
39
+ .then(promisedStep3)
40
+ .then(promisedStep4)
41
+ .then(function (value4) {
42
+ // Do something with value4
43
+ })
44
+ .catch(function (error) {
45
+ // Handle any error from all above steps
46
+ })
47
+ .done();
48
+ ```
49
+
50
+ With this approach, you also get implicit error propagation, just like `try`,
51
+ `catch`, and `finally`. An error in `promisedStep1` will flow all the way to
52
+ the `catch` function, where it’s caught and handled. (Here `promisedStepN` is
53
+ a version of `stepN` that returns a promise.)
54
+
55
+ The callback approach is called an “inversion of control”.
56
+ A function that accepts a callback instead of a return value
57
+ is saying, “Don’t call me, I’ll call you.”. Promises
58
+ [un-invert][IOC] the inversion, cleanly separating the input
59
+ arguments from control flow arguments. This simplifies the
60
+ use and creation of API’s, particularly variadic,
61
+ rest and spread arguments.
62
+
63
+ [IOC]: http://www.slideshare.net/domenicdenicola/callbacks-promises-and-coroutines-oh-my-the-evolution-of-asynchronicity-in-javascript
64
+
65
+
66
+ ## Getting Started
67
+
68
+ The Q module can be loaded as:
69
+
70
+ - A ``<script>`` tag (creating a ``Q`` global variable): ~2.5 KB minified and
71
+ gzipped.
72
+ - A Node.js and CommonJS module, available in [npm](https://npmjs.org/) as
73
+ the [q](https://npmjs.org/package/q) package
74
+ - An AMD module
75
+ - A [component](https://github.com/component/component) as ``microjs/q``
76
+ - Using [bower](http://bower.io/) as ``q``
77
+ - Using [NuGet](http://nuget.org/) as [Q](https://nuget.org/packages/q)
78
+
79
+ Q can exchange promises with jQuery, Dojo, When.js, WinJS, and more.
80
+
81
+ ## Resources
82
+
83
+ Our [wiki][] contains a number of useful resources, including:
84
+
85
+ - A method-by-method [Q API reference][reference].
86
+ - A growing [examples gallery][examples], showing how Q can be used to make
87
+ everything better. From XHR to database access to accessing the Flickr API,
88
+ Q is there for you.
89
+ - There are many libraries that produce and consume Q promises for everything
90
+ from file system/database access or RPC to templating. For a list of some of
91
+ the more popular ones, see [Libraries][].
92
+ - If you want materials that introduce the promise concept generally, and the
93
+ below tutorial isn't doing it for you, check out our collection of
94
+ [presentations, blog posts, and podcasts][resources].
95
+ - A guide for those [coming from jQuery's `$.Deferred`][jquery].
96
+
97
+ We'd also love to have you join the Q-Continuum [mailing list][].
98
+
99
+ [wiki]: https://github.com/kriskowal/q/wiki
100
+ [reference]: https://github.com/kriskowal/q/wiki/API-Reference
101
+ [examples]: https://github.com/kriskowal/q/wiki/Examples-Gallery
102
+ [Libraries]: https://github.com/kriskowal/q/wiki/Libraries
103
+ [resources]: https://github.com/kriskowal/q/wiki/General-Promise-Resources
104
+ [jquery]: https://github.com/kriskowal/q/wiki/Coming-from-jQuery
105
+ [mailing list]: https://groups.google.com/forum/#!forum/q-continuum
106
+
107
+
108
+ ## Tutorial
109
+
110
+ Promises have a ``then`` method, which you can use to get the eventual
111
+ return value (fulfillment) or thrown exception (rejection).
112
+
113
+ ```javascript
114
+ promiseMeSomething()
115
+ .then(function (value) {
116
+ }, function (reason) {
117
+ });
118
+ ```
119
+
120
+ If ``promiseMeSomething`` returns a promise that gets fulfilled later
121
+ with a return value, the first function (the fulfillment handler) will be
122
+ called with the value. However, if the ``promiseMeSomething`` function
123
+ gets rejected later by a thrown exception, the second function (the
124
+ rejection handler) will be called with the exception.
125
+
126
+ Note that resolution of a promise is always asynchronous: that is, the
127
+ fulfillment or rejection handler will always be called in the next turn of the
128
+ event loop (i.e. `process.nextTick` in Node). This gives you a nice
129
+ guarantee when mentally tracing the flow of your code, namely that
130
+ ``then`` will always return before either handler is executed.
131
+
132
+ In this tutorial, we begin with how to consume and work with promises. We'll
133
+ talk about how to create them, and thus create functions like
134
+ `promiseMeSomething` that return promises, [below](#the-beginning).
135
+
136
+
137
+ ### Propagation
138
+
139
+ The ``then`` method returns a promise, which in this example, I’m
140
+ assigning to ``outputPromise``.
141
+
142
+ ```javascript
143
+ var outputPromise = getInputPromise()
144
+ .then(function (input) {
145
+ }, function (reason) {
146
+ });
147
+ ```
148
+
149
+ The ``outputPromise`` variable becomes a new promise for the return
150
+ value of either handler. Since a function can only either return a
151
+ value or throw an exception, only one handler will ever be called and it
152
+ will be responsible for resolving ``outputPromise``.
153
+
154
+ - If you return a value in a handler, ``outputPromise`` will get
155
+ fulfilled.
156
+
157
+ - If you throw an exception in a handler, ``outputPromise`` will get
158
+ rejected.
159
+
160
+ - If you return a **promise** in a handler, ``outputPromise`` will
161
+ “become” that promise. Being able to become a new promise is useful
162
+ for managing delays, combining results, or recovering from errors.
163
+
164
+ If the ``getInputPromise()`` promise gets rejected and you omit the
165
+ rejection handler, the **error** will go to ``outputPromise``:
166
+
167
+ ```javascript
168
+ var outputPromise = getInputPromise()
169
+ .then(function (value) {
170
+ });
171
+ ```
172
+
173
+ If the input promise gets fulfilled and you omit the fulfillment handler, the
174
+ **value** will go to ``outputPromise``:
175
+
176
+ ```javascript
177
+ var outputPromise = getInputPromise()
178
+ .then(null, function (error) {
179
+ });
180
+ ```
181
+
182
+ Q promises provide a ``fail`` shorthand for ``then`` when you are only
183
+ interested in handling the error:
184
+
185
+ ```javascript
186
+ var outputPromise = getInputPromise()
187
+ .fail(function (error) {
188
+ });
189
+ ```
190
+
191
+ If you are writing JavaScript for modern engines only or using
192
+ CoffeeScript, you may use `catch` instead of `fail`.
193
+
194
+ Promises also have a ``fin`` function that is like a ``finally`` clause.
195
+ The final handler gets called, with no arguments, when the promise
196
+ returned by ``getInputPromise()`` either returns a value or throws an
197
+ error. The value returned or error thrown by ``getInputPromise()``
198
+ passes directly to ``outputPromise`` unless the final handler fails, and
199
+ may be delayed if the final handler returns a promise.
200
+
201
+ ```javascript
202
+ var outputPromise = getInputPromise()
203
+ .fin(function () {
204
+ // close files, database connections, stop servers, conclude tests
205
+ });
206
+ ```
207
+
208
+ - If the handler returns a value, the value is ignored
209
+ - If the handler throws an error, the error passes to ``outputPromise``
210
+ - If the handler returns a promise, ``outputPromise`` gets postponed. The
211
+ eventual value or error has the same effect as an immediate return
212
+ value or thrown error: a value would be ignored, an error would be
213
+ forwarded.
214
+
215
+ If you are writing JavaScript for modern engines only or using
216
+ CoffeeScript, you may use `finally` instead of `fin`.
217
+
218
+ ### Chaining
219
+
220
+ There are two ways to chain promises. You can chain promises either
221
+ inside or outside handlers. The next two examples are equivalent.
222
+
223
+ ```javascript
224
+ return getUsername()
225
+ .then(function (username) {
226
+ return getUser(username)
227
+ .then(function (user) {
228
+ // if we get here without an error,
229
+ // the value returned here
230
+ // or the exception thrown here
231
+ // resolves the promise returned
232
+ // by the first line
233
+ })
234
+ });
235
+ ```
236
+
237
+ ```javascript
238
+ return getUsername()
239
+ .then(function (username) {
240
+ return getUser(username);
241
+ })
242
+ .then(function (user) {
243
+ // if we get here without an error,
244
+ // the value returned here
245
+ // or the exception thrown here
246
+ // resolves the promise returned
247
+ // by the first line
248
+ });
249
+ ```
250
+
251
+ The only difference is nesting. It’s useful to nest handlers if you
252
+ need to capture multiple input values in your closure.
253
+
254
+ ```javascript
255
+ function authenticate() {
256
+ return getUsername()
257
+ .then(function (username) {
258
+ return getUser(username);
259
+ })
260
+ // chained because we will not need the user name in the next event
261
+ .then(function (user) {
262
+ return getPassword()
263
+ // nested because we need both user and password next
264
+ .then(function (password) {
265
+ if (user.passwordHash !== hash(password)) {
266
+ throw new Error("Can't authenticate");
267
+ }
268
+ });
269
+ });
270
+ }
271
+ ```
272
+
273
+
274
+ ### Combination
275
+
276
+ You can turn an array of promises into a promise for the whole,
277
+ fulfilled array using ``all``.
278
+
279
+ ```javascript
280
+ return Q.all([
281
+ eventualAdd(2, 2),
282
+ eventualAdd(10, 20)
283
+ ]);
284
+ ```
285
+
286
+ If you have a promise for an array, you can use ``spread`` as a
287
+ replacement for ``then``. The ``spread`` function “spreads” the
288
+ values over the arguments of the fulfillment handler. The rejection handler
289
+ will get called at the first sign of failure. That is, whichever of
290
+ the recived promises fails first gets handled by the rejection handler.
291
+
292
+ ```javascript
293
+ function eventualAdd(a, b) {
294
+ return Q.spread([a, b], function (a, b) {
295
+ return a + b;
296
+ })
297
+ }
298
+ ```
299
+
300
+ But ``spread`` calls ``all`` initially, so you can skip it in chains.
301
+
302
+ ```javascript
303
+ return getUsername()
304
+ .then(function (username) {
305
+ return [username, getUser(username)];
306
+ })
307
+ .spread(function (username, user) {
308
+ });
309
+ ```
310
+
311
+ The ``all`` function returns a promise for an array of values. When this
312
+ promise is fulfilled, the array contains the fulfillment values of the original
313
+ promises, in the same order as those promises. If one of the given promises
314
+ is rejected, the returned promise is immediately rejected, not waiting for the
315
+ rest of the batch. If you want to wait for all of the promises to either be
316
+ fulfilled or rejected, you can use ``allSettled``.
317
+
318
+ ```javascript
319
+ Q.allSettled(promises)
320
+ .then(function (results) {
321
+ results.forEach(function (result) {
322
+ if (result.state === "fulfilled") {
323
+ var value = result.value;
324
+ } else {
325
+ var reason = result.reason;
326
+ }
327
+ });
328
+ });
329
+ ```
330
+
331
+
332
+ ### Sequences
333
+
334
+ If you have a number of promise-producing functions that need
335
+ to be run sequentially, you can of course do so manually:
336
+
337
+ ```javascript
338
+ return foo(initialVal).then(bar).then(baz).then(qux);
339
+ ```
340
+
341
+ However, if you want to run a dynamically constructed sequence of
342
+ functions, you'll want something like this:
343
+
344
+ ```javascript
345
+ var funcs = [foo, bar, baz, qux];
346
+
347
+ var result = Q(initialVal);
348
+ funcs.forEach(function (f) {
349
+ result = result.then(f);
350
+ });
351
+ return result;
352
+ ```
353
+
354
+ You can make this slightly more compact using `reduce`:
355
+
356
+ ```javascript
357
+ return funcs.reduce(function (soFar, f) {
358
+ return soFar.then(f);
359
+ }, Q(initialVal));
360
+ ```
361
+
362
+ Or, you could use th ultra-compact version:
363
+
364
+ ```javascript
365
+ return funcs.reduce(Q.when, Q());
366
+ ```
367
+
368
+ ### Handling Errors
369
+
370
+ One sometimes-unintuive aspect of promises is that if you throw an
371
+ exception in the fulfillment handler, it will not be be caught by the error
372
+ handler.
373
+
374
+ ```javascript
375
+ return foo()
376
+ .then(function (value) {
377
+ throw new Error("Can't bar.");
378
+ }, function (error) {
379
+ // We only get here if "foo" fails
380
+ });
381
+ ```
382
+
383
+ To see why this is, consider the parallel between promises and
384
+ ``try``/``catch``. We are ``try``-ing to execute ``foo()``: the error
385
+ handler represents a ``catch`` for ``foo()``, while the fulfillment handler
386
+ represents code that happens *after* the ``try``/``catch`` block.
387
+ That code then needs its own ``try``/``catch`` block.
388
+
389
+ In terms of promises, this means chaining your rejection handler:
390
+
391
+ ```javascript
392
+ return foo()
393
+ .then(function (value) {
394
+ throw new Error("Can't bar.");
395
+ })
396
+ .fail(function (error) {
397
+ // We get here with either foo's error or bar's error
398
+ });
399
+ ```
400
+
401
+ ### Progress Notification
402
+
403
+ It's possible for promises to report their progress, e.g. for tasks that take a
404
+ long time like a file upload. Not all promises will implement progress
405
+ notifications, but for those that do, you can consume the progress values using
406
+ a third parameter to ``then``:
407
+
408
+ ```javascript
409
+ return uploadFile()
410
+ .then(function () {
411
+ // Success uploading the file
412
+ }, function (err) {
413
+ // There was an error, and we get the reason for error
414
+ }, function (progress) {
415
+ // We get notified of the upload's progress as it is executed
416
+ });
417
+ ```
418
+
419
+ Like `fail`, Q also provides a shorthand for progress callbacks
420
+ called `progress`:
421
+
422
+ ```javascript
423
+ return uploadFile().progress(function (progress) {
424
+ // We get notified of the upload's progress
425
+ });
426
+ ```
427
+
428
+ ### The End
429
+
430
+ When you get to the end of a chain of promises, you should either
431
+ return the last promise or end the chain. Since handlers catch
432
+ errors, it’s an unfortunate pattern that the exceptions can go
433
+ unobserved.
434
+
435
+ So, either return it,
436
+
437
+ ```javascript
438
+ return foo()
439
+ .then(function () {
440
+ return "bar";
441
+ });
442
+ ```
443
+
444
+ Or, end it.
445
+
446
+ ```javascript
447
+ foo()
448
+ .then(function () {
449
+ return "bar";
450
+ })
451
+ .done();
452
+ ```
453
+
454
+ Ending a promise chain makes sure that, if an error doesn’t get
455
+ handled before the end, it will get rethrown and reported.
456
+
457
+ This is a stopgap. We are exploring ways to make unhandled errors
458
+ visible without any explicit handling.
459
+
460
+
461
+ ### The Beginning
462
+
463
+ Everything above assumes you get a promise from somewhere else. This
464
+ is the common case. Every once in a while, you will need to create a
465
+ promise from scratch.
466
+
467
+ #### Using ``Q.fcall``
468
+
469
+ You can create a promise from a value using ``Q.fcall``. This returns a
470
+ promise for 10.
471
+
472
+ ```javascript
473
+ return Q.fcall(function () {
474
+ return 10;
475
+ });
476
+ ```
477
+
478
+ You can also use ``fcall`` to get a promise for an exception.
479
+
480
+ ```javascript
481
+ return Q.fcall(function () {
482
+ throw new Error("Can't do it");
483
+ });
484
+ ```
485
+
486
+ As the name implies, ``fcall`` can call functions, or even promised
487
+ functions. This uses the ``eventualAdd`` function above to add two
488
+ numbers.
489
+
490
+ ```javascript
491
+ return Q.fcall(eventualAdd, 2, 2);
492
+ ```
493
+
494
+
495
+ #### Using Deferreds
496
+
497
+ If you have to interface with asynchronous functions that are callback-based
498
+ instead of promise-based, Q provides a few shortcuts (like ``Q.nfcall`` and
499
+ friends). But much of the time, the solution will be to use *deferreds*.
500
+
501
+ ```javascript
502
+ var deferred = Q.defer();
503
+ FS.readFile("foo.txt", "utf-8", function (error, text) {
504
+ if (error) {
505
+ deferred.reject(new Error(error));
506
+ } else {
507
+ deferred.resolve(text);
508
+ }
509
+ });
510
+ return deferred.promise;
511
+ ```
512
+
513
+ Note that a deferred can be resolved with a value or a promise. The
514
+ ``reject`` function is a shorthand for resolving with a rejected
515
+ promise.
516
+
517
+ ```javascript
518
+ // this:
519
+ deferred.reject(new Error("Can't do it"));
520
+
521
+ // is shorthand for:
522
+ var rejection = Q.fcall(function () {
523
+ throw new Error("Can't do it");
524
+ });
525
+ deferred.resolve(rejection);
526
+ ```
527
+
528
+ This is a simplified implementation of ``Q.delay``.
529
+
530
+ ```javascript
531
+ function delay(ms) {
532
+ var deferred = Q.defer();
533
+ setTimeout(deferred.resolve, ms);
534
+ return deferred.promise;
535
+ }
536
+ ```
537
+
538
+ This is a simplified implementation of ``Q.timeout``
539
+
540
+ ```javascript
541
+ function timeout(promise, ms) {
542
+ var deferred = Q.defer();
543
+ Q.when(promise, deferred.resolve);
544
+ delay(ms).then(function () {
545
+ deferred.reject(new Error("Timed out"));
546
+ });
547
+ return deferred.promise;
548
+ }
549
+ ```
550
+
551
+ Finally, you can send a progress notification to the promise with
552
+ ``deferred.notify``.
553
+
554
+ For illustration, this is a wrapper for XML HTTP requests in the browser. Note
555
+ that a more [thorough][XHR] implementation would be in order in practice.
556
+
557
+ [XHR]: https://github.com/montagejs/mr/blob/71e8df99bb4f0584985accd6f2801ef3015b9763/browser.js#L29-L73
558
+
559
+ ```javascript
560
+ function requestOkText(url) {
561
+ var request = new XMLHttpRequest();
562
+ var deferred = Q.defer();
563
+
564
+ request.open("GET", url, true);
565
+ request.onload = onload;
566
+ request.onerror = onerror;
567
+ request.onprogress = onprogress;
568
+ request.send();
569
+
570
+ function onload() {
571
+ if (request.status === 200) {
572
+ deferred.resolve(request.responseText);
573
+ } else {
574
+ deferred.reject(new Error("Status code was " + request.status));
575
+ }
576
+ }
577
+
578
+ function onerror() {
579
+ deferred.reject(new Error("Can't XHR " + JSON.stringify(url)));
580
+ }
581
+
582
+ function onprogress(event) {
583
+ deferred.notify(event.loaded / event.total);
584
+ }
585
+
586
+ return deferred.promise;
587
+ }
588
+ ```
589
+
590
+ Below is an example of how to use this ``requestOkText`` function:
591
+
592
+ ```javascript
593
+ requestOkText("http://localhost:3000")
594
+ .then(function (responseText) {
595
+ // If the HTTP response returns 200 OK, log the response text.
596
+ console.log(responseText);
597
+ }, function (error) {
598
+ // If there's an error or a non-200 status code, log the error.
599
+ console.error(error);
600
+ }, function (progress) {
601
+ // Log the progress as it comes in.
602
+ console.log("Request progress: " + Math.round(progress * 100) + "%");
603
+ });
604
+ ```
605
+
606
+ ### The Middle
607
+
608
+ If you are using a function that may return a promise, but just might
609
+ return a value if it doesn’t need to defer, you can use the “static”
610
+ methods of the Q library.
611
+
612
+ The ``when`` function is the static equivalent for ``then``.
613
+
614
+ ```javascript
615
+ return Q.when(valueOrPromise, function (value) {
616
+ }, function (error) {
617
+ });
618
+ ```
619
+
620
+ All of the other methods on a promise have static analogs with the
621
+ same name.
622
+
623
+ The following are equivalent:
624
+
625
+ ```javascript
626
+ return Q.all([a, b]);
627
+ ```
628
+
629
+ ```javascript
630
+ return Q.fcall(function () {
631
+ return [a, b];
632
+ })
633
+ .all();
634
+ ```
635
+
636
+ When working with promises provided by other libraries, you should
637
+ convert it to a Q promise. Not all promise libraries make the same
638
+ guarantees as Q and certainly don’t provide all of the same methods.
639
+ Most libraries only provide a partially functional ``then`` method.
640
+ This thankfully is all we need to turn them into vibrant Q promises.
641
+
642
+ ```javascript
643
+ return Q($.ajax(...))
644
+ .then(function () {
645
+ });
646
+ ```
647
+
648
+ If there is any chance that the promise you receive is not a Q promise
649
+ as provided by your library, you should wrap it using a Q function.
650
+ You can even use ``Q.invoke`` as a shorthand.
651
+
652
+ ```javascript
653
+ return Q.invoke($, 'ajax', ...)
654
+ .then(function () {
655
+ });
656
+ ```
657
+
658
+
659
+ ### Over the Wire
660
+
661
+ A promise can serve as a proxy for another object, even a remote
662
+ object. There are methods that allow you to optimistically manipulate
663
+ properties or call functions. All of these interactions return
664
+ promises, so they can be chained.
665
+
666
+ ```
667
+ direct manipulation using a promise as a proxy
668
+ -------------------------- -------------------------------
669
+ value.foo promise.get("foo")
670
+ value.foo = value promise.put("foo", value)
671
+ delete value.foo promise.del("foo")
672
+ value.foo(...args) promise.post("foo", [args])
673
+ value.foo(...args) promise.invoke("foo", ...args)
674
+ value(...args) promise.fapply([args])
675
+ value(...args) promise.fcall(...args)
676
+ ```
677
+
678
+ If the promise is a proxy for a remote object, you can shave
679
+ round-trips by using these functions instead of ``then``. To take
680
+ advantage of promises for remote objects, check out [Q-Connection][].
681
+
682
+ [Q-Connection]: https://github.com/kriskowal/q-connection
683
+
684
+ Even in the case of non-remote objects, these methods can be used as
685
+ shorthand for particularly-simple fulfillment handlers. For example, you
686
+ can replace
687
+
688
+ ```javascript
689
+ return Q.fcall(function () {
690
+ return [{ foo: "bar" }, { foo: "baz" }];
691
+ })
692
+ .then(function (value) {
693
+ return value[0].foo;
694
+ });
695
+ ```
696
+
697
+ with
698
+
699
+ ```javascript
700
+ return Q.fcall(function () {
701
+ return [{ foo: "bar" }, { foo: "baz" }];
702
+ })
703
+ .get(0)
704
+ .get("foo");
705
+ ```
706
+
707
+
708
+ ### Adapting Node
709
+
710
+ If you're working with functions that make use of the Node.js callback pattern,
711
+ where callbacks are in the form of `function(err, result)`, Q provides a few
712
+ useful utility functions for converting between them. The most straightforward
713
+ are probably `Q.nfcall` and `Q.nfapply` ("Node function call/apply") for calling
714
+ Node.js-style functions and getting back a promise:
715
+
716
+ ```javascript
717
+ return Q.nfcall(FS.readFile, "foo.txt", "utf-8");
718
+ return Q.nfapply(FS.readFile, ["foo.txt", "utf-8"]);
719
+ ```
720
+
721
+ If you are working with methods, instead of simple functions, you can easily
722
+ run in to the usual problems where passing a method to another function—like
723
+ `Q.nfcall`—"un-binds" the method from its owner. To avoid this, you can either
724
+ use `Function.prototype.bind` or some nice shortcut methods we provide:
725
+
726
+ ```javascript
727
+ return Q.ninvoke(redisClient, "get", "user:1:id");
728
+ return Q.npost(redisClient, "get", ["user:1:id"]);
729
+ ```
730
+
731
+ You can also create reusable wrappers with `Q.denodeify` or `Q.nbind`:
732
+
733
+ ```javascript
734
+ var readFile = Q.denodeify(FS.readFile);
735
+ return readFile("foo.txt", "utf-8");
736
+
737
+ var redisClientGet = Q.nbind(redisClient.get, redisClient);
738
+ return redisClientGet("user:1:id");
739
+ ```
740
+
741
+ Finally, if you're working with raw deferred objects, there is a
742
+ `makeNodeResolver` method on deferreds that can be handy:
743
+
744
+ ```javascript
745
+ var deferred = Q.defer();
746
+ FS.readFile("foo.txt", "utf-8", deferred.makeNodeResolver());
747
+ return deferred.promise;
748
+ ```
749
+
750
+ ### Long Stack Traces
751
+
752
+ Q comes with optional support for “long stack traces,” wherein the `stack`
753
+ property of `Error` rejection reasons is rewritten to be traced along
754
+ asynchronous jumps instead of stopping at the most recent one. As an example:
755
+
756
+ ```js
757
+ function theDepthsOfMyProgram() {
758
+ Q.delay(100).done(function explode() {
759
+ throw new Error("boo!");
760
+ });
761
+ }
762
+
763
+ theDepthsOfMyProgram();
764
+ ```
765
+
766
+ usually would give a rather unhelpful stack trace looking something like
767
+
768
+ ```
769
+ Error: boo!
770
+ at explode (/path/to/test.js:3:11)
771
+ at _fulfilled (/path/to/test.js:q:54)
772
+ at resolvedValue.promiseDispatch.done (/path/to/q.js:823:30)
773
+ at makePromise.promise.promiseDispatch (/path/to/q.js:496:13)
774
+ at pending (/path/to/q.js:397:39)
775
+ at process.startup.processNextTick.process._tickCallback (node.js:244:9)
776
+ ```
777
+
778
+ But, if you turn this feature on by setting
779
+
780
+ ```js
781
+ Q.longStackSupport = true;
782
+ ```
783
+
784
+ then the above code gives a nice stack trace to the tune of
785
+
786
+ ```
787
+ Error: boo!
788
+ at explode (/path/to/test.js:3:11)
789
+ From previous event:
790
+ at theDepthsOfMyProgram (/path/to/test.js:2:16)
791
+ at Object.<anonymous> (/path/to/test.js:7:1)
792
+ ```
793
+
794
+ Note how you can see the the function that triggered the async operation in the
795
+ stack trace! This is very helpful for debugging, as otherwise you end up getting
796
+ only the first line, plus a bunch of Q internals, with no sign of where the
797
+ operation started.
798
+
799
+ This feature does come with somewhat-serious performance and memory overhead,
800
+ however. If you're working with lots of promises, or trying to scale a server
801
+ to many users, you should probably keep it off. But in development, go for it!
802
+
803
+ ## Tests
804
+
805
+ You can view the results of the Q test suite [in your browser][tests]!
806
+
807
+ [tests]: https://rawgithub.com/kriskowal/q/master/spec/q-spec.html
808
+
809
+ ## License
810
+
811
+ Copyright 2009–2013 Kristopher Michael Kowal
812
+ MIT License (enclosed)
813
+