traceur-rb 0.0.1

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 (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
+