[Pkg-javascript-commits] [node-co] 01/02: Imported Upstream version 4.6.0
Thorsten Alteholz
alteholz at moszumanska.debian.org
Sun Mar 27 15:28:53 UTC 2016
This is an automated email from the git hooks/post-receive script.
alteholz pushed a commit to branch master
in repository node-co.
commit 63012cd9322dd4da2c0a2592843f936ca91f117f
Author: Thorsten Alteholz <debian at alteholz.de>
Date: Sun Mar 27 17:28:50 2016 +0200
Imported Upstream version 4.6.0
---
History.md | 172 +++++++++++++++++++++++++++++++++++++++++++
LICENSE | 22 ++++++
Readme.md | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++
index.js | 237 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
package.json | 34 +++++++++
5 files changed, 677 insertions(+)
diff --git a/History.md b/History.md
new file mode 100644
index 0000000..68fbb15
--- /dev/null
+++ b/History.md
@@ -0,0 +1,172 @@
+4.6.0 / 2015-07-09
+==================
+
+ * support passing the rest of the arguments to co into the generator
+
+ ```js
+ function *gen(...args) { }
+ co(gen, ...args);
+ ```
+
+4.5.0 / 2015-03-17
+==================
+
+ * support regular functions (that return promises)
+
+4.4.0 / 2015-02-14
+==================
+
+ * refactor `isGeneratorFunction`
+ * expose generator function from `co.wrap()`
+ * drop support for node < 0.12
+
+4.3.0 / 2015-02-05
+==================
+
+ * check for generator functions in a ES5-transpiler-friendly way
+
+4.2.0 / 2015-01-20
+==================
+
+ * support comparing generator functions with ES6 transpilers
+
+4.1.0 / 2014-12-26
+==================
+
+ * fix memory leak #180
+
+4.0.2 / 2014-12-18
+==================
+
+ * always return a global promise implementation
+
+4.0.1 / 2014-11-30
+==================
+
+ * friendlier ES6 module exports
+
+4.0.0 / 2014-11-15
+==================
+
+ * co now returns a promise and uses promises underneath
+ * `co.wrap()` for wrapping generator functions
+
+3.1.0 / 2014-06-30
+==================
+
+ * remove `setImmediate()` shim for node 0.8. semi-backwards breaking.
+ Users are expected to shim themselves. Also returns CommonJS browser support.
+ * added key order preservation for objects. thanks @greim
+ * replace `q` with `bluebird` in benchmarks and tests
+
+3.0.6 / 2014-05-03
+==================
+
+ * add `setImmediate()` fallback to `process.nextTick`
+ * remove duplicate code in toThunk
+ * update thunkify
+
+3.0.5 / 2014-03-17
+==================
+
+ * fix object/array test failure which tries to enumerate dates. Closes #98
+ * fix final callback error propagation. Closes #92
+
+3.0.4 / 2014-02-17
+==================
+
+ * fix toThunk object check regression. Closes #89
+
+3.0.3 / 2014-02-08
+==================
+
+ * refactor: arrayToThunk @AutoSponge #88
+
+3.0.2 / 2014-01-01
+==================
+
+ * fixed: nil arguments replaced with error fn
+
+3.0.1 / 2013-12-19
+==================
+
+ * fixed: callback passed as an argument to generators
+
+3.0.0 / 2013-12-19
+==================
+
+ * fixed: callback passed as an argument to generators
+ * change: `co(function *(){})` now returns a reusable thunk
+ * change: `this` must now be passed through the returned thunk, ex. `co(function *(){}).call(this)`
+ * fix "generator already finished" errors
+
+2.3.0 / 2013-11-12
+==================
+
+ * add `yield object` support
+
+2.2.0 / 2013-11-05
+==================
+
+ * change: make the `isGenerator()` function more generic
+
+2.1.0 / 2013-10-21
+==================
+
+ * add passing of arguments into the generator. closes #33.
+
+2.0.0 / 2013-10-14
+==================
+
+ * remove callback in favour of thunk-only co(). Closes #30 [breaking change]
+ * remove `co.wrap()` [breaking change]
+
+1.5.2 / 2013-09-02
+==================
+
+ * fix: preserve receiver with co.wrap()
+
+1.5.1 / 2013-08-11
+==================
+
+ * remove setImmediate() usage - ~110% perf increase. Closes #14
+
+0.5.0 / 2013-08-10
+==================
+
+ * add receiver propagation support
+ * examples: update streams.js example to use `http.get()` and streams2 API
+
+1.4.1 / 2013-07-01
+==================
+
+ * fix gen.next(val) for latest v8. Closes #8
+
+1.4.0 / 2013-06-21
+==================
+
+ * add promise support to joins
+ * add `yield generatorFunction` support
+ * add `yield generator` support
+ * add nested join support
+
+1.3.0 / 2013-06-10
+==================
+
+ * add passing of arguments
+
+1.2.1 / 2013-06-08
+==================
+
+ * fix join() of zero thunks
+
+1.2.0 / 2013-06-08
+==================
+
+ * add array yielding support. great suggestion by @domenic
+
+1.1.0 / 2013-06-06
+==================
+
+ * add promise support
+ * change nextTick to setImmediate
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..92faba5
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,22 @@
+(The MIT License)
+
+Copyright (c) 2014 TJ Holowaychuk <tj at vision-media.ca>
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/Readme.md b/Readme.md
new file mode 100644
index 0000000..c1d4882
--- /dev/null
+++ b/Readme.md
@@ -0,0 +1,212 @@
+# co
+
+[![Gitter][gitter-image]][gitter-url]
+[![NPM version][npm-image]][npm-url]
+[![Build status][travis-image]][travis-url]
+[![Test coverage][coveralls-image]][coveralls-url]
+[![Downloads][downloads-image]][downloads-url]
+
+ Generator based control flow goodness for nodejs and the browser,
+ using promises, letting you write non-blocking code in a nice-ish way.
+
+## Co v4
+
+ `co at 4.0.0` has been released, which now relies on promises.
+ It is a stepping stone towards [ES7 async/await](https://github.com/lukehoban/ecmascript-asyncawait).
+ The primary API change is how `co()` is invoked.
+ Before, `co` returned a "thunk", which you then called with a callback and optional arguments.
+ Now, `co()` returns a promise.
+
+```js
+co(function* () {
+ var result = yield Promise.resolve(true);
+ return result;
+}).then(function (value) {
+ console.log(value);
+}, function (err) {
+ console.error(err.stack);
+});
+```
+
+ If you want to convert a `co`-generator-function into a regular function that returns a promise,
+ you now use `co.wrap(fn*)`.
+
+```js
+var fn = co.wrap(function* (val) {
+ return yield Promise.resolve(val);
+});
+
+fn(true).then(function (val) {
+
+});
+```
+
+## Platform Compatibility
+
+ `co at 4+` requires a `Promise` implementation.
+ For versions of node `< 0.11` and for many older browsers,
+ you should/must include your own `Promise` polyfill.
+
+ When using node 0.11.x or greater, you must use the `--harmony-generators`
+ flag or just `--harmony` to get access to generators.
+
+ When using node 0.10.x and lower or browsers without generator support,
+ you must use [gnode](https://github.com/TooTallNate/gnode) and/or [regenerator](http://facebook.github.io/regenerator/).
+
+ io.js is supported out of the box, you can use `co` without flags or polyfills.
+
+## Installation
+
+```
+$ npm install co
+```
+
+## Associated libraries
+
+Any library that returns promises work well with `co`.
+
+- [mz](https://github.com/normalize/mz) - wrap all of node's code libraries as promises.
+
+View the [wiki](https://github.com/visionmedia/co/wiki) for more libraries.
+
+## Examples
+
+```js
+var co = require('co');
+
+co(function *(){
+ // yield any promise
+ var result = yield Promise.resolve(true);
+}).catch(onerror);
+
+co(function *(){
+ // resolve multiple promises in parallel
+ var a = Promise.resolve(1);
+ var b = Promise.resolve(2);
+ var c = Promise.resolve(3);
+ var res = yield [a, b, c];
+ console.log(res);
+ // => [1, 2, 3]
+}).catch(onerror);
+
+// errors can be try/catched
+co(function *(){
+ try {
+ yield Promise.reject(new Error('boom'));
+ } catch (err) {
+ console.error(err.message); // "boom"
+ }
+}).catch(onerror);
+
+function onerror(err) {
+ // log any uncaught errors
+ // co will not throw any errors you do not handle!!!
+ // HANDLE ALL YOUR ERRORS!!!
+ console.error(err.stack);
+}
+```
+
+## Yieldables
+
+ The `yieldable` objects currently supported are:
+
+ - promises
+ - thunks (functions)
+ - array (parallel execution)
+ - objects (parallel execution)
+ - generators (delegation)
+ - generator functions (delegation)
+
+Nested `yieldable` objects are supported, meaning you can nest
+promises within objects within arrays, and so on!
+
+### Promises
+
+[Read more on promises!](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)
+
+### Thunks
+
+Thunks are functions that only have a single argument, a callback.
+Thunk support only remains for backwards compatibility and may
+be removed in future versions of `co`.
+
+### Arrays
+
+`yield`ing an array will resolve all the `yieldables` in parallel.
+
+```js
+co(function* () {
+ var res = yield [
+ Promise.resolve(1),
+ Promise.resolve(2),
+ Promise.resolve(3),
+ ];
+ console.log(res); // => [1, 2, 3]
+}).catch(onerror);
+```
+
+### Objects
+
+Just like arrays, objects resolve all `yieldable`s in parallel.
+
+```js
+co(function* () {
+ var res = yield {
+ 1: Promise.resolve(1),
+ 2: Promise.resolve(2),
+ };
+ console.log(res); // => { 1: 1, 2: 2 }
+}).catch(onerror);
+```
+
+### Generators and Generator Functions
+
+Any generator or generator function you can pass into `co`
+can be yielded as well. This should generally be avoided
+as we should be moving towards spec-compliant `Promise`s instead.
+
+## API
+
+### co(fn*).then( val => )
+
+Returns a promise that resolves a generator, generator function,
+or any function that returns a generator.
+
+```js
+co(function* () {
+ return yield Promise.resolve(true);
+}).then(function (val) {
+ console.log(val);
+}, function (err) {
+ console.error(err.stack);
+});
+```
+
+### var fn = co.wrap(fn*)
+
+Convert a generator into a regular function that returns a `Promise`.
+
+```js
+var fn = co.wrap(function* (val) {
+ return yield Promise.resolve(val);
+});
+
+fn(true).then(function (val) {
+
+});
+```
+
+## License
+
+ MIT
+
+[npm-image]: https://img.shields.io/npm/v/co.svg?style=flat-square
+[npm-url]: https://npmjs.org/package/co
+[travis-image]: https://img.shields.io/travis/tj/co.svg?style=flat-square
+[travis-url]: https://travis-ci.org/tj/co
+[coveralls-image]: https://img.shields.io/coveralls/tj/co.svg?style=flat-square
+[coveralls-url]: https://coveralls.io/r/tj/co
+[downloads-image]: http://img.shields.io/npm/dm/co.svg?style=flat-square
+[downloads-url]: https://npmjs.org/package/co
+[gitter-image]: https://badges.gitter.im/Join%20Chat.svg
+[gitter-url]: https://gitter.im/tj/co?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge
diff --git a/index.js b/index.js
new file mode 100644
index 0000000..87ba8ba
--- /dev/null
+++ b/index.js
@@ -0,0 +1,237 @@
+
+/**
+ * slice() reference.
+ */
+
+var slice = Array.prototype.slice;
+
+/**
+ * Expose `co`.
+ */
+
+module.exports = co['default'] = co.co = co;
+
+/**
+ * Wrap the given generator `fn` into a
+ * function that returns a promise.
+ * This is a separate function so that
+ * every `co()` call doesn't create a new,
+ * unnecessary closure.
+ *
+ * @param {GeneratorFunction} fn
+ * @return {Function}
+ * @api public
+ */
+
+co.wrap = function (fn) {
+ createPromise.__generatorFunction__ = fn;
+ return createPromise;
+ function createPromise() {
+ return co.call(this, fn.apply(this, arguments));
+ }
+};
+
+/**
+ * Execute the generator function or a generator
+ * and return a promise.
+ *
+ * @param {Function} fn
+ * @return {Promise}
+ * @api public
+ */
+
+function co(gen) {
+ var ctx = this;
+ var args = slice.call(arguments, 1)
+
+ // we wrap everything in a promise to avoid promise chaining,
+ // which leads to memory leak errors.
+ // see https://github.com/tj/co/issues/180
+ return new Promise(function(resolve, reject) {
+ if (typeof gen === 'function') gen = gen.apply(ctx, args);
+ if (!gen || typeof gen.next !== 'function') return resolve(gen);
+
+ onFulfilled();
+
+ /**
+ * @param {Mixed} res
+ * @return {Promise}
+ * @api private
+ */
+
+ function onFulfilled(res) {
+ var ret;
+ try {
+ ret = gen.next(res);
+ } catch (e) {
+ return reject(e);
+ }
+ next(ret);
+ }
+
+ /**
+ * @param {Error} err
+ * @return {Promise}
+ * @api private
+ */
+
+ function onRejected(err) {
+ var ret;
+ try {
+ ret = gen.throw(err);
+ } catch (e) {
+ return reject(e);
+ }
+ next(ret);
+ }
+
+ /**
+ * Get the next value in the generator,
+ * return a promise.
+ *
+ * @param {Object} ret
+ * @return {Promise}
+ * @api private
+ */
+
+ function next(ret) {
+ if (ret.done) return resolve(ret.value);
+ var value = toPromise.call(ctx, ret.value);
+ if (value && isPromise(value)) return value.then(onFulfilled, onRejected);
+ return onRejected(new TypeError('You may only yield a function, promise, generator, array, or object, '
+ + 'but the following object was passed: "' + String(ret.value) + '"'));
+ }
+ });
+}
+
+/**
+ * Convert a `yield`ed value into a promise.
+ *
+ * @param {Mixed} obj
+ * @return {Promise}
+ * @api private
+ */
+
+function toPromise(obj) {
+ if (!obj) return obj;
+ if (isPromise(obj)) return obj;
+ if (isGeneratorFunction(obj) || isGenerator(obj)) return co.call(this, obj);
+ if ('function' == typeof obj) return thunkToPromise.call(this, obj);
+ if (Array.isArray(obj)) return arrayToPromise.call(this, obj);
+ if (isObject(obj)) return objectToPromise.call(this, obj);
+ return obj;
+}
+
+/**
+ * Convert a thunk to a promise.
+ *
+ * @param {Function}
+ * @return {Promise}
+ * @api private
+ */
+
+function thunkToPromise(fn) {
+ var ctx = this;
+ return new Promise(function (resolve, reject) {
+ fn.call(ctx, function (err, res) {
+ if (err) return reject(err);
+ if (arguments.length > 2) res = slice.call(arguments, 1);
+ resolve(res);
+ });
+ });
+}
+
+/**
+ * Convert an array of "yieldables" to a promise.
+ * Uses `Promise.all()` internally.
+ *
+ * @param {Array} obj
+ * @return {Promise}
+ * @api private
+ */
+
+function arrayToPromise(obj) {
+ return Promise.all(obj.map(toPromise, this));
+}
+
+/**
+ * Convert an object of "yieldables" to a promise.
+ * Uses `Promise.all()` internally.
+ *
+ * @param {Object} obj
+ * @return {Promise}
+ * @api private
+ */
+
+function objectToPromise(obj){
+ var results = new obj.constructor();
+ var keys = Object.keys(obj);
+ var promises = [];
+ for (var i = 0; i < keys.length; i++) {
+ var key = keys[i];
+ var promise = toPromise.call(this, obj[key]);
+ if (promise && isPromise(promise)) defer(promise, key);
+ else results[key] = obj[key];
+ }
+ return Promise.all(promises).then(function () {
+ return results;
+ });
+
+ function defer(promise, key) {
+ // predefine the key in the result
+ results[key] = undefined;
+ promises.push(promise.then(function (res) {
+ results[key] = res;
+ }));
+ }
+}
+
+/**
+ * Check if `obj` is a promise.
+ *
+ * @param {Object} obj
+ * @return {Boolean}
+ * @api private
+ */
+
+function isPromise(obj) {
+ return 'function' == typeof obj.then;
+}
+
+/**
+ * Check if `obj` is a generator.
+ *
+ * @param {Mixed} obj
+ * @return {Boolean}
+ * @api private
+ */
+
+function isGenerator(obj) {
+ return 'function' == typeof obj.next && 'function' == typeof obj.throw;
+}
+
+/**
+ * Check if `obj` is a generator function.
+ *
+ * @param {Mixed} obj
+ * @return {Boolean}
+ * @api private
+ */
+function isGeneratorFunction(obj) {
+ var constructor = obj.constructor;
+ if (!constructor) return false;
+ if ('GeneratorFunction' === constructor.name || 'GeneratorFunction' === constructor.displayName) return true;
+ return isGenerator(constructor.prototype);
+}
+
+/**
+ * Check for plain object.
+ *
+ * @param {Mixed} val
+ * @return {Boolean}
+ * @api private
+ */
+
+function isObject(val) {
+ return Object == val.constructor;
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..083d594
--- /dev/null
+++ b/package.json
@@ -0,0 +1,34 @@
+{
+ "name": "co",
+ "version": "4.6.0",
+ "description": "generator async control flow goodness",
+ "keywords": [
+ "async",
+ "flow",
+ "generator",
+ "coro",
+ "coroutine"
+ ],
+ "devDependencies": {
+ "browserify": "^10.0.0",
+ "istanbul-harmony": "0",
+ "mocha": "^2.0.0",
+ "mz": "^1.0.2"
+ },
+ "scripts": {
+ "test": "mocha --harmony",
+ "test-cov": "node --harmony node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha -- --reporter dot",
+ "test-travis": "node --harmony node_modules/.bin/istanbul cover ./node_modules/.bin/_mocha --report lcovonly -- --reporter dot",
+ "prepublish": "npm run browserify",
+ "browserify": "browserify index.js -o ./co-browser.js -s co"
+ },
+ "files": [
+ "index.js"
+ ],
+ "license": "MIT",
+ "repository": "tj/co",
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+}
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/node-co.git
More information about the Pkg-javascript-commits
mailing list