Compare commits
1
Commits
master
..
f6a8c83586
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f6a8c83586 |
No files matched your search
+1
-4
@@ -18,7 +18,4 @@ latex-files/*.run.xml
|
|||||||
latex-files/*.toc
|
latex-files/*.toc
|
||||||
|
|
||||||
# config
|
# config
|
||||||
mongodb.config.js
|
mongodb.config.js
|
||||||
|
|
||||||
# exclude Mac-File .DS_Store
|
|
||||||
*.DS_Store
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
// Terminal call: node server/ldap_test.js - needs VPN or eduroam
|
|
||||||
const inquirer = require('inquirer'),
|
|
||||||
ldap = require('./server/ldap_ohm.js');
|
|
||||||
|
|
||||||
inquirer.prompt([
|
|
||||||
{
|
|
||||||
name: 'username',
|
|
||||||
type: 'input',
|
|
||||||
message: 'Enter your VirtuOhm username:',
|
|
||||||
validate: function( value ) {
|
|
||||||
if (value.length) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return 'Please enter your username.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name: 'password',
|
|
||||||
type: 'password',
|
|
||||||
message: 'Enter your password:',
|
|
||||||
validate: function(value) {
|
|
||||||
if (value.length) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return 'Please enter your password.';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}])
|
|
||||||
.then(answers => {
|
|
||||||
ldap.init(null);
|
|
||||||
ldap.authorize(answers.username,answers.password,function(user) {
|
|
||||||
console.log(JSON.stringify(user));
|
|
||||||
process.exit();
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
const mongoose = require('mongoose');
|
||||||
|
|
||||||
|
//const Schema = mongoose.Schema,
|
||||||
|
//ObjectId = Schema.ObjectId;
|
||||||
|
|
||||||
|
const MessageSchema = mongoose.Schema({
|
||||||
|
subject: { type: String, required: true },
|
||||||
|
message: { type: String, required: true },
|
||||||
|
user: { type: String, required: true },
|
||||||
|
tag: [{type: String }],
|
||||||
|
//createtime: { type: Date, default: Date.now },
|
||||||
|
});
|
||||||
|
MessageSchema.index({tag:'text'});
|
||||||
|
|
||||||
|
module.exports = mongoose.model('Message', MessageSchema);
|
||||||
@@ -1,22 +1,3 @@
|
|||||||
var db = db.getSiblingDB('omdb');
|
db = db.getSiblingDB('test')
|
||||||
|
|
||||||
// Delete all collections + all records
|
print(db.getCollectionNames())
|
||||||
db.messages.deleteMany({});
|
|
||||||
db.tags.deleteMany({});
|
|
||||||
db.users.deleteMany({});
|
|
||||||
db.sessions.deleteMany({});
|
|
||||||
|
|
||||||
// Insert data in collections
|
|
||||||
load('mong_msg.js');
|
|
||||||
load('mong_tag.js');
|
|
||||||
load('mong_usr.js');
|
|
||||||
|
|
||||||
// Print all collections + records count
|
|
||||||
var collections = db.getCollectionNames();
|
|
||||||
print('Collections inside the db:');
|
|
||||||
for(var i = 0; i < collections.length; i++){
|
|
||||||
var name = collections[i];
|
|
||||||
|
|
||||||
if(name.substr(0, 6) != 'system')
|
|
||||||
print(name + ' - ' + db[name].count() + ' records');
|
|
||||||
}
|
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
db.messages.insert([
|
|
||||||
{"subject":"DOLORE LABORIS AUTE","message":"Ex sunt elit elit in ex ad labore minim. Elit amet irure sit aliquip excepteur sit qui et aute qui mollit cillum.","user":"Jaime Potter","tag":["sit","in","dolore","ullamco"]},
|
|
||||||
{"subject":"NON IPSUM MOLLIT","message":"Ut laborum proident magna magna qui non in voluptate reprehenderit labore. Qui consectetur dolor nisi culpa cillum quis.","user":"Goff Durham","tag":["aliqua","sunt","labore","minim"]},
|
|
||||||
{"subject": "ESSE IPSUM INCIDIDUNT","message":"Esse enim amet laboris proident do do ut cupidatat laborum ex. Sit esse id laborum aliqua id.","user":"Helena Mercado","tag":["fugiat","nisi","incididunt","ullamco"]},
|
|
||||||
{"subject":"PARIATUR DOLOR SUNT","message":"Exercitation officia ad consequat est voluptate est incididunt ut culpa consectetur. Consectetur irure veniam ipsum sint sit anim minim aute exercitation ullamco nostrud reprehenderit consequat.","user":"Christi Walker","tag":["consectetur","sint","qui","ipsum"]},
|
|
||||||
{"subject":"TEMPOR ID VOLUPTATE","message":"Anim ex commodo officia consequat in magna esse sunt mollit sunt commodo. Ex sit aute reprehenderit elit magna sunt irure pariatur cupidatat labore.","user":"Kent Schroeder","tag":["adipisicing","nulla","tempor","veniam"]},
|
|
||||||
{"subject":"LOREM EST AUTE","message":"Irure excepteur laborum quis tempor officia cillum officia est ea adipisicing duis enim aliqua. Est dolor laborum officia elit ullamco.","user":"Dominguez Stevens","tag":["mollit","amet","consectetur","dolore"]},
|
|
||||||
{"subject":"ESSE MOLLIT CILLUM","message":"Eu culpa laborum consequat sunt aliqua excepteur. Voluptate pariatur deserunt consequat id nostrud do magna occaecat sint nulla non nostrud.","user":"Terrell Padilla","tag":["Lorem","consequat","fugiat","aliqua"]}
|
|
||||||
])
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
db.tags.insert([
|
|
||||||
{"name":"efi"},{"name":"wichtig"},{"name":"Wintersemester19/20"},{"name":"Rückmeldung"},{"name":"bme6"},{"name":"Mkz"},{"name":"Freizeit"},{"name":"Prüfungsanmeldung"},{"name":"THNürnberg"},{"name":"Prüfung"},{"name":"Stundenplan"}
|
|
||||||
])
|
|
||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
db.users.insert([
|
|
||||||
// User: author, Pwd: author
|
|
||||||
{"_id":"author","name":"Author","type":"MA@EFI;","roles":'{"user":true,"author":true}',"hash":"sha256","salt":"SIzKNsNKsCRVr8a9U90q6A==","pwd":"HZly68TSAKHioz6Kz0QCbXVTHpT6hMmabUbFYVlCMeE=","abos":["nulla","tempor","veniam","ipsum"],"bookmarks":[],},
|
|
||||||
// User: admin, Pwd: SwenMho
|
|
||||||
{"_id":"admin","name":"Test Admin","type":"MA@AMP;","roles":'{"user":true,"author":true,"admin":true}',"hash":"sha256","salt":"z3PNXGmQaWvaT7m2ZlT+0w==","pwd":"nfUfNv032J745xj3Hzya3Mkk43Dz/H0BmNTZhtx8UM0=","abos":["veniam","ipsum"],"bookmarks":[],},
|
|
||||||
])
|
|
||||||
|
|
||||||
//var c = require('./server/crypto.js'),
|
|
||||||
// e = {"_id":"writer","hash":"sha256"};
|
|
||||||
//c.fillLocalAuth(e,"pwd");
|
|
||||||
//console.info(JSON.stringify(e));
|
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
module.exports = {
|
||||||
|
url: 'mongodb://localhost:27017/mydb'
|
||||||
|
}
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
../mime/cli.js
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
../mkdirp/bin/cmd.js
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
../semver/bin/semver
|
|
||||||
-236
@@ -1,236 +0,0 @@
|
|||||||
1.3.7 / 2019-04-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.6.2
|
|
||||||
- Fix sorting charset, encoding, and language with extra parameters
|
|
||||||
|
|
||||||
1.3.6 / 2019-04-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.24
|
|
||||||
- deps: mime-db@~1.40.0
|
|
||||||
|
|
||||||
1.3.5 / 2018-02-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.18
|
|
||||||
- deps: mime-db@~1.33.0
|
|
||||||
|
|
||||||
1.3.4 / 2017-08-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.16
|
|
||||||
- deps: mime-db@~1.29.0
|
|
||||||
|
|
||||||
1.3.3 / 2016-05-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.11
|
|
||||||
- deps: mime-db@~1.23.0
|
|
||||||
* deps: negotiator@0.6.1
|
|
||||||
- perf: improve `Accept` parsing speed
|
|
||||||
- perf: improve `Accept-Charset` parsing speed
|
|
||||||
- perf: improve `Accept-Encoding` parsing speed
|
|
||||||
- perf: improve `Accept-Language` parsing speed
|
|
||||||
|
|
||||||
1.3.2 / 2016-03-08
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.10
|
|
||||||
- Fix extension of `application/dash+xml`
|
|
||||||
- Update primary extension for `audio/mp4`
|
|
||||||
- deps: mime-db@~1.22.0
|
|
||||||
|
|
||||||
1.3.1 / 2016-01-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.9
|
|
||||||
- deps: mime-db@~1.21.0
|
|
||||||
|
|
||||||
1.3.0 / 2015-09-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.7
|
|
||||||
- deps: mime-db@~1.19.0
|
|
||||||
* deps: negotiator@0.6.0
|
|
||||||
- Fix including type extensions in parameters in `Accept` parsing
|
|
||||||
- Fix parsing `Accept` parameters with quoted equals
|
|
||||||
- Fix parsing `Accept` parameters with quoted semicolons
|
|
||||||
- Lazy-load modules from main entry point
|
|
||||||
- perf: delay type concatenation until needed
|
|
||||||
- perf: enable strict mode
|
|
||||||
- perf: hoist regular expressions
|
|
||||||
- perf: remove closures getting spec properties
|
|
||||||
- perf: remove a closure from media type parsing
|
|
||||||
- perf: remove property delete from media type parsing
|
|
||||||
|
|
||||||
1.2.13 / 2015-09-06
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.6
|
|
||||||
- deps: mime-db@~1.18.0
|
|
||||||
|
|
||||||
1.2.12 / 2015-07-30
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.4
|
|
||||||
- deps: mime-db@~1.16.0
|
|
||||||
|
|
||||||
1.2.11 / 2015-07-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.3
|
|
||||||
- deps: mime-db@~1.15.0
|
|
||||||
|
|
||||||
1.2.10 / 2015-07-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.2
|
|
||||||
- deps: mime-db@~1.14.0
|
|
||||||
|
|
||||||
1.2.9 / 2015-06-08
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.1
|
|
||||||
- perf: fix deopt during mapping
|
|
||||||
|
|
||||||
1.2.8 / 2015-06-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.1.0
|
|
||||||
- deps: mime-db@~1.13.0
|
|
||||||
* perf: avoid argument reassignment & argument slice
|
|
||||||
* perf: avoid negotiator recursive construction
|
|
||||||
* perf: enable strict mode
|
|
||||||
* perf: remove unnecessary bitwise operator
|
|
||||||
|
|
||||||
1.2.7 / 2015-05-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.5.3
|
|
||||||
- Fix media type parameter matching to be case-insensitive
|
|
||||||
|
|
||||||
1.2.6 / 2015-05-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.11
|
|
||||||
- deps: mime-db@~1.9.1
|
|
||||||
* deps: negotiator@0.5.2
|
|
||||||
- Fix comparing media types with quoted values
|
|
||||||
- Fix splitting media types with quoted commas
|
|
||||||
|
|
||||||
1.2.5 / 2015-03-13
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.10
|
|
||||||
- deps: mime-db@~1.8.0
|
|
||||||
|
|
||||||
1.2.4 / 2015-02-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Support Node.js 0.6
|
|
||||||
* deps: mime-types@~2.0.9
|
|
||||||
- deps: mime-db@~1.7.0
|
|
||||||
* deps: negotiator@0.5.1
|
|
||||||
- Fix preference sorting to be stable for long acceptable lists
|
|
||||||
|
|
||||||
1.2.3 / 2015-01-31
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.8
|
|
||||||
- deps: mime-db@~1.6.0
|
|
||||||
|
|
||||||
1.2.2 / 2014-12-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.7
|
|
||||||
- deps: mime-db@~1.5.0
|
|
||||||
|
|
||||||
1.2.1 / 2014-12-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.5
|
|
||||||
- deps: mime-db@~1.3.1
|
|
||||||
|
|
||||||
1.2.0 / 2014-12-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.5.0
|
|
||||||
- Fix list return order when large accepted list
|
|
||||||
- Fix missing identity encoding when q=0 exists
|
|
||||||
- Remove dynamic building of Negotiator class
|
|
||||||
|
|
||||||
1.1.4 / 2014-12-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.4
|
|
||||||
- deps: mime-db@~1.3.0
|
|
||||||
|
|
||||||
1.1.3 / 2014-11-09
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.3
|
|
||||||
- deps: mime-db@~1.2.0
|
|
||||||
|
|
||||||
1.1.2 / 2014-10-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.4.9
|
|
||||||
- Fix error when media type has invalid parameter
|
|
||||||
|
|
||||||
1.1.1 / 2014-09-28
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: mime-types@~2.0.2
|
|
||||||
- deps: mime-db@~1.1.0
|
|
||||||
* deps: negotiator@0.4.8
|
|
||||||
- Fix all negotiations to be case-insensitive
|
|
||||||
- Stable sort preferences of same quality according to client order
|
|
||||||
|
|
||||||
1.1.0 / 2014-09-02
|
|
||||||
==================
|
|
||||||
|
|
||||||
* update `mime-types`
|
|
||||||
|
|
||||||
1.0.7 / 2014-07-04
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix wrong type returned from `type` when match after unknown extension
|
|
||||||
|
|
||||||
1.0.6 / 2014-06-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.4.7
|
|
||||||
|
|
||||||
1.0.5 / 2014-06-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix crash when unknown extension given
|
|
||||||
|
|
||||||
1.0.4 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* use `mime-types`
|
|
||||||
|
|
||||||
1.0.3 / 2014-06-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: negotiator@0.4.6
|
|
||||||
- Order by specificity when quality is the same
|
|
||||||
|
|
||||||
1.0.2 / 2014-05-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix interpretation when header not in request
|
|
||||||
* deps: pin negotiator@0.4.5
|
|
||||||
|
|
||||||
1.0.1 / 2014-01-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Identity encoding isn't always acceptable
|
|
||||||
* deps: negotiator@~0.4.0
|
|
||||||
|
|
||||||
1.0.0 / 2013-12-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Genesis
|
|
||||||
-23
@@ -1,23 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
|
|
||||||
Copyright (c) 2015 Douglas Christopher Wilson <doug@somethingdoug.com>
|
|
||||||
|
|
||||||
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.
|
|
||||||
-142
@@ -1,142 +0,0 @@
|
|||||||
# accepts
|
|
||||||
|
|
||||||
[![NPM Version][npm-version-image]][npm-url]
|
|
||||||
[![NPM Downloads][npm-downloads-image]][npm-url]
|
|
||||||
[![Node.js Version][node-version-image]][node-version-url]
|
|
||||||
[![Build Status][travis-image]][travis-url]
|
|
||||||
[![Test Coverage][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
Higher level content negotiation based on [negotiator](https://www.npmjs.com/package/negotiator).
|
|
||||||
Extracted from [koa](https://www.npmjs.com/package/koa) for general use.
|
|
||||||
|
|
||||||
In addition to negotiator, it allows:
|
|
||||||
|
|
||||||
- Allows types as an array or arguments list, ie `(['text/html', 'application/json'])`
|
|
||||||
as well as `('text/html', 'application/json')`.
|
|
||||||
- Allows type shorthands such as `json`.
|
|
||||||
- Returns `false` when no types match
|
|
||||||
- Treats non-existent headers as `*`
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
This is a [Node.js](https://nodejs.org/en/) module available through the
|
|
||||||
[npm registry](https://www.npmjs.com/). Installation is done using the
|
|
||||||
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ npm install accepts
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
<!-- eslint-disable no-unused-vars -->
|
|
||||||
|
|
||||||
```js
|
|
||||||
var accepts = require('accepts')
|
|
||||||
```
|
|
||||||
|
|
||||||
### accepts(req)
|
|
||||||
|
|
||||||
Create a new `Accepts` object for the given `req`.
|
|
||||||
|
|
||||||
#### .charset(charsets)
|
|
||||||
|
|
||||||
Return the first accepted charset. If nothing in `charsets` is accepted,
|
|
||||||
then `false` is returned.
|
|
||||||
|
|
||||||
#### .charsets()
|
|
||||||
|
|
||||||
Return the charsets that the request accepts, in the order of the client's
|
|
||||||
preference (most preferred first).
|
|
||||||
|
|
||||||
#### .encoding(encodings)
|
|
||||||
|
|
||||||
Return the first accepted encoding. If nothing in `encodings` is accepted,
|
|
||||||
then `false` is returned.
|
|
||||||
|
|
||||||
#### .encodings()
|
|
||||||
|
|
||||||
Return the encodings that the request accepts, in the order of the client's
|
|
||||||
preference (most preferred first).
|
|
||||||
|
|
||||||
#### .language(languages)
|
|
||||||
|
|
||||||
Return the first accepted language. If nothing in `languages` is accepted,
|
|
||||||
then `false` is returned.
|
|
||||||
|
|
||||||
#### .languages()
|
|
||||||
|
|
||||||
Return the languages that the request accepts, in the order of the client's
|
|
||||||
preference (most preferred first).
|
|
||||||
|
|
||||||
#### .type(types)
|
|
||||||
|
|
||||||
Return the first accepted type (and it is returned as the same text as what
|
|
||||||
appears in the `types` array). If nothing in `types` is accepted, then `false`
|
|
||||||
is returned.
|
|
||||||
|
|
||||||
The `types` array can contain full MIME types or file extensions. Any value
|
|
||||||
that is not a full MIME types is passed to `require('mime-types').lookup`.
|
|
||||||
|
|
||||||
#### .types()
|
|
||||||
|
|
||||||
Return the types that the request accepts, in the order of the client's
|
|
||||||
preference (most preferred first).
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Simple type negotiation
|
|
||||||
|
|
||||||
This simple example shows how to use `accepts` to return a different typed
|
|
||||||
respond body based on what the client wants to accept. The server lists it's
|
|
||||||
preferences in order and will get back the best match between the client and
|
|
||||||
server.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var accepts = require('accepts')
|
|
||||||
var http = require('http')
|
|
||||||
|
|
||||||
function app (req, res) {
|
|
||||||
var accept = accepts(req)
|
|
||||||
|
|
||||||
// the order of this list is significant; should be server preferred order
|
|
||||||
switch (accept.type(['json', 'html'])) {
|
|
||||||
case 'json':
|
|
||||||
res.setHeader('Content-Type', 'application/json')
|
|
||||||
res.write('{"hello":"world!"}')
|
|
||||||
break
|
|
||||||
case 'html':
|
|
||||||
res.setHeader('Content-Type', 'text/html')
|
|
||||||
res.write('<b>hello, world!</b>')
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
// the fallback is text/plain, so no need to specify it above
|
|
||||||
res.setHeader('Content-Type', 'text/plain')
|
|
||||||
res.write('hello, world!')
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
res.end()
|
|
||||||
}
|
|
||||||
|
|
||||||
http.createServer(app).listen(3000)
|
|
||||||
```
|
|
||||||
|
|
||||||
You can test this out with the cURL program:
|
|
||||||
```sh
|
|
||||||
curl -I -H'Accept: text/html' http://localhost:3000/
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/accepts/master
|
|
||||||
[coveralls-url]: https://coveralls.io/r/jshttp/accepts?branch=master
|
|
||||||
[node-version-image]: https://badgen.net/npm/node/accepts
|
|
||||||
[node-version-url]: https://nodejs.org/en/download
|
|
||||||
[npm-downloads-image]: https://badgen.net/npm/dm/accepts
|
|
||||||
[npm-url]: https://npmjs.org/package/accepts
|
|
||||||
[npm-version-image]: https://badgen.net/npm/v/accepts
|
|
||||||
[travis-image]: https://badgen.net/travis/jshttp/accepts/master
|
|
||||||
[travis-url]: https://travis-ci.org/jshttp/accepts
|
|
||||||
-238
@@ -1,238 +0,0 @@
|
|||||||
/*!
|
|
||||||
* accepts
|
|
||||||
* Copyright(c) 2014 Jonathan Ong
|
|
||||||
* Copyright(c) 2015 Douglas Christopher Wilson
|
|
||||||
* MIT Licensed
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Negotiator = require('negotiator')
|
|
||||||
var mime = require('mime-types')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module exports.
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = Accepts
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new Accepts object for the given req.
|
|
||||||
*
|
|
||||||
* @param {object} req
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
function Accepts (req) {
|
|
||||||
if (!(this instanceof Accepts)) {
|
|
||||||
return new Accepts(req)
|
|
||||||
}
|
|
||||||
|
|
||||||
this.headers = req.headers
|
|
||||||
this.negotiator = new Negotiator(req)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if the given `type(s)` is acceptable, returning
|
|
||||||
* the best match when true, otherwise `undefined`, in which
|
|
||||||
* case you should respond with 406 "Not Acceptable".
|
|
||||||
*
|
|
||||||
* The `type` value may be a single mime type string
|
|
||||||
* such as "application/json", the extension name
|
|
||||||
* such as "json" or an array `["json", "html", "text/plain"]`. When a list
|
|
||||||
* or array is given the _best_ match, if any is returned.
|
|
||||||
*
|
|
||||||
* Examples:
|
|
||||||
*
|
|
||||||
* // Accept: text/html
|
|
||||||
* this.types('html');
|
|
||||||
* // => "html"
|
|
||||||
*
|
|
||||||
* // Accept: text/*, application/json
|
|
||||||
* this.types('html');
|
|
||||||
* // => "html"
|
|
||||||
* this.types('text/html');
|
|
||||||
* // => "text/html"
|
|
||||||
* this.types('json', 'text');
|
|
||||||
* // => "json"
|
|
||||||
* this.types('application/json');
|
|
||||||
* // => "application/json"
|
|
||||||
*
|
|
||||||
* // Accept: text/*, application/json
|
|
||||||
* this.types('image/png');
|
|
||||||
* this.types('png');
|
|
||||||
* // => undefined
|
|
||||||
*
|
|
||||||
* // Accept: text/*;q=.5, application/json
|
|
||||||
* this.types(['html', 'json']);
|
|
||||||
* this.types('html', 'json');
|
|
||||||
* // => "json"
|
|
||||||
*
|
|
||||||
* @param {String|Array} types...
|
|
||||||
* @return {String|Array|Boolean}
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
Accepts.prototype.type =
|
|
||||||
Accepts.prototype.types = function (types_) {
|
|
||||||
var types = types_
|
|
||||||
|
|
||||||
// support flattened arguments
|
|
||||||
if (types && !Array.isArray(types)) {
|
|
||||||
types = new Array(arguments.length)
|
|
||||||
for (var i = 0; i < types.length; i++) {
|
|
||||||
types[i] = arguments[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// no types, return all requested types
|
|
||||||
if (!types || types.length === 0) {
|
|
||||||
return this.negotiator.mediaTypes()
|
|
||||||
}
|
|
||||||
|
|
||||||
// no accept header, return first given type
|
|
||||||
if (!this.headers.accept) {
|
|
||||||
return types[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
var mimes = types.map(extToMime)
|
|
||||||
var accepts = this.negotiator.mediaTypes(mimes.filter(validMime))
|
|
||||||
var first = accepts[0]
|
|
||||||
|
|
||||||
return first
|
|
||||||
? types[mimes.indexOf(first)]
|
|
||||||
: false
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return accepted encodings or best fit based on `encodings`.
|
|
||||||
*
|
|
||||||
* Given `Accept-Encoding: gzip, deflate`
|
|
||||||
* an array sorted by quality is returned:
|
|
||||||
*
|
|
||||||
* ['gzip', 'deflate']
|
|
||||||
*
|
|
||||||
* @param {String|Array} encodings...
|
|
||||||
* @return {String|Array}
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
Accepts.prototype.encoding =
|
|
||||||
Accepts.prototype.encodings = function (encodings_) {
|
|
||||||
var encodings = encodings_
|
|
||||||
|
|
||||||
// support flattened arguments
|
|
||||||
if (encodings && !Array.isArray(encodings)) {
|
|
||||||
encodings = new Array(arguments.length)
|
|
||||||
for (var i = 0; i < encodings.length; i++) {
|
|
||||||
encodings[i] = arguments[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// no encodings, return all requested encodings
|
|
||||||
if (!encodings || encodings.length === 0) {
|
|
||||||
return this.negotiator.encodings()
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.negotiator.encodings(encodings)[0] || false
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return accepted charsets or best fit based on `charsets`.
|
|
||||||
*
|
|
||||||
* Given `Accept-Charset: utf-8, iso-8859-1;q=0.2, utf-7;q=0.5`
|
|
||||||
* an array sorted by quality is returned:
|
|
||||||
*
|
|
||||||
* ['utf-8', 'utf-7', 'iso-8859-1']
|
|
||||||
*
|
|
||||||
* @param {String|Array} charsets...
|
|
||||||
* @return {String|Array}
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
Accepts.prototype.charset =
|
|
||||||
Accepts.prototype.charsets = function (charsets_) {
|
|
||||||
var charsets = charsets_
|
|
||||||
|
|
||||||
// support flattened arguments
|
|
||||||
if (charsets && !Array.isArray(charsets)) {
|
|
||||||
charsets = new Array(arguments.length)
|
|
||||||
for (var i = 0; i < charsets.length; i++) {
|
|
||||||
charsets[i] = arguments[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// no charsets, return all requested charsets
|
|
||||||
if (!charsets || charsets.length === 0) {
|
|
||||||
return this.negotiator.charsets()
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.negotiator.charsets(charsets)[0] || false
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return accepted languages or best fit based on `langs`.
|
|
||||||
*
|
|
||||||
* Given `Accept-Language: en;q=0.8, es, pt`
|
|
||||||
* an array sorted by quality is returned:
|
|
||||||
*
|
|
||||||
* ['es', 'pt', 'en']
|
|
||||||
*
|
|
||||||
* @param {String|Array} langs...
|
|
||||||
* @return {Array|String}
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
Accepts.prototype.lang =
|
|
||||||
Accepts.prototype.langs =
|
|
||||||
Accepts.prototype.language =
|
|
||||||
Accepts.prototype.languages = function (languages_) {
|
|
||||||
var languages = languages_
|
|
||||||
|
|
||||||
// support flattened arguments
|
|
||||||
if (languages && !Array.isArray(languages)) {
|
|
||||||
languages = new Array(arguments.length)
|
|
||||||
for (var i = 0; i < languages.length; i++) {
|
|
||||||
languages[i] = arguments[i]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// no languages, return all requested languages
|
|
||||||
if (!languages || languages.length === 0) {
|
|
||||||
return this.negotiator.languages()
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.negotiator.languages(languages)[0] || false
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert extnames to mime.
|
|
||||||
*
|
|
||||||
* @param {String} type
|
|
||||||
* @return {String}
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function extToMime (type) {
|
|
||||||
return type.indexOf('/') === -1
|
|
||||||
? mime.lookup(type)
|
|
||||||
: type
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check if mime is valid.
|
|
||||||
*
|
|
||||||
* @param {String} type
|
|
||||||
* @return {String}
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function validMime (type) {
|
|
||||||
return typeof type === 'string'
|
|
||||||
}
|
|
||||||
-86
@@ -1,86 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "accepts@~1.3.7",
|
|
||||||
"_id": "accepts@1.3.7",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==",
|
|
||||||
"_location": "/accepts",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "accepts@~1.3.7",
|
|
||||||
"name": "accepts",
|
|
||||||
"escapedName": "accepts",
|
|
||||||
"rawSpec": "~1.3.7",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "~1.3.7"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/express"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz",
|
|
||||||
"_shasum": "531bc726517a3b2b41f850021c6cc15eaab507cd",
|
|
||||||
"_spec": "accepts@~1.3.7",
|
|
||||||
"_where": "/home/erik/Documents/workspace_brackets/a1_BME_Project_Ohm/om/node_modules/express",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/jshttp/accepts/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Douglas Christopher Wilson",
|
|
||||||
"email": "doug@somethingdoug.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jonathan Ong",
|
|
||||||
"email": "me@jongleberry.com",
|
|
||||||
"url": "http://jongleberry.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"mime-types": "~2.1.24",
|
|
||||||
"negotiator": "0.6.2"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Higher-level content negotiation",
|
|
||||||
"devDependencies": {
|
|
||||||
"deep-equal": "1.0.1",
|
|
||||||
"eslint": "5.16.0",
|
|
||||||
"eslint-config-standard": "12.0.0",
|
|
||||||
"eslint-plugin-import": "2.17.2",
|
|
||||||
"eslint-plugin-markdown": "1.0.0",
|
|
||||||
"eslint-plugin-node": "8.0.1",
|
|
||||||
"eslint-plugin-promise": "4.1.1",
|
|
||||||
"eslint-plugin-standard": "4.0.0",
|
|
||||||
"mocha": "6.1.4",
|
|
||||||
"nyc": "14.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.6"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"LICENSE",
|
|
||||||
"HISTORY.md",
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/jshttp/accepts#readme",
|
|
||||||
"keywords": [
|
|
||||||
"content",
|
|
||||||
"negotiation",
|
|
||||||
"accept",
|
|
||||||
"accepts"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "accepts",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/jshttp/accepts.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint --plugin markdown --ext js,md .",
|
|
||||||
"test": "mocha --reporter spec --check-leaks --bail test/",
|
|
||||||
"test-cov": "nyc --reporter=html --reporter=text npm test",
|
|
||||||
"test-travis": "nyc --reporter=text npm test"
|
|
||||||
},
|
|
||||||
"version": "1.3.7"
|
|
||||||
}
|
|
||||||
-10
@@ -1,10 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
module.exports = () => {
|
|
||||||
const pattern = [
|
|
||||||
'[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[a-zA-Z\\d]*)*)?\\u0007)',
|
|
||||||
'(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PRZcf-ntqry=><~]))'
|
|
||||||
].join('|');
|
|
||||||
|
|
||||||
return new RegExp(pattern, 'g');
|
|
||||||
};
|
|
||||||
-85
@@ -1,85 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "ansi-regex@^3.0.0",
|
|
||||||
"_id": "ansi-regex@3.0.0",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
|
|
||||||
"_location": "/ansi-regex",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "ansi-regex@^3.0.0",
|
|
||||||
"name": "ansi-regex",
|
|
||||||
"escapedName": "ansi-regex",
|
|
||||||
"rawSpec": "^3.0.0",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "^3.0.0"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/strip-ansi"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
|
|
||||||
"_shasum": "ed0317c322064f79466c02966bddb605ab37d998",
|
|
||||||
"_spec": "ansi-regex@^3.0.0",
|
|
||||||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/strip-ansi",
|
|
||||||
"author": {
|
|
||||||
"name": "Sindre Sorhus",
|
|
||||||
"email": "sindresorhus@gmail.com",
|
|
||||||
"url": "sindresorhus.com"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/chalk/ansi-regex/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Regular expression for matching ANSI escape codes",
|
|
||||||
"devDependencies": {
|
|
||||||
"ava": "*",
|
|
||||||
"xo": "*"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/chalk/ansi-regex#readme",
|
|
||||||
"keywords": [
|
|
||||||
"ansi",
|
|
||||||
"styles",
|
|
||||||
"color",
|
|
||||||
"colour",
|
|
||||||
"colors",
|
|
||||||
"terminal",
|
|
||||||
"console",
|
|
||||||
"cli",
|
|
||||||
"string",
|
|
||||||
"tty",
|
|
||||||
"escape",
|
|
||||||
"formatting",
|
|
||||||
"rgb",
|
|
||||||
"256",
|
|
||||||
"shell",
|
|
||||||
"xterm",
|
|
||||||
"command-line",
|
|
||||||
"text",
|
|
||||||
"regex",
|
|
||||||
"regexp",
|
|
||||||
"re",
|
|
||||||
"match",
|
|
||||||
"test",
|
|
||||||
"find",
|
|
||||||
"pattern"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "ansi-regex",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/chalk/ansi-regex.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "xo && ava",
|
|
||||||
"view-supported": "node fixtures/view-codes.js"
|
|
||||||
},
|
|
||||||
"version": "3.0.0"
|
|
||||||
}
|
|
||||||
-46
@@ -1,46 +0,0 @@
|
|||||||
# ansi-regex [](https://travis-ci.org/chalk/ansi-regex)
|
|
||||||
|
|
||||||
> Regular expression for matching [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code)
|
|
||||||
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```
|
|
||||||
$ npm install ansi-regex
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```js
|
|
||||||
const ansiRegex = require('ansi-regex');
|
|
||||||
|
|
||||||
ansiRegex().test('\u001B[4mcake\u001B[0m');
|
|
||||||
//=> true
|
|
||||||
|
|
||||||
ansiRegex().test('cake');
|
|
||||||
//=> false
|
|
||||||
|
|
||||||
'\u001B[4mcake\u001B[0m'.match(ansiRegex());
|
|
||||||
//=> ['\u001B[4m', '\u001B[0m']
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## FAQ
|
|
||||||
|
|
||||||
### Why do you test for codes not in the ECMA 48 standard?
|
|
||||||
|
|
||||||
Some of the codes we run as a test are codes that we acquired finding various lists of non-standard or manufacturer specific codes. We test for both standard and non-standard codes, as most of them follow the same or similar format and can be safely matched in strings without the risk of removing actual string content. There are a few non-standard control codes that do not follow the traditional format (i.e. they end in numbers) thus forcing us to exclude them from the test because we cannot reliably match them.
|
|
||||||
|
|
||||||
On the historical side, those ECMA standards were established in the early 90's whereas the VT100, for example, was designed in the mid/late 70's. At that point in time, control codes were still pretty ungoverned and engineers used them for a multitude of things, namely to activate hardware ports that may have been proprietary. Somewhere else you see a similar 'anarchy' of codes is in the x86 architecture for processors; there are a ton of "interrupts" that can mean different things on certain brands of processors, most of which have been phased out.
|
|
||||||
|
|
||||||
|
|
||||||
## Maintainers
|
|
||||||
|
|
||||||
- [Sindre Sorhus](https://github.com/sindresorhus)
|
|
||||||
- [Josh Junon](https://github.com/qix-)
|
|
||||||
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT
|
|
||||||
-165
@@ -1,165 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
const colorConvert = require('color-convert');
|
|
||||||
|
|
||||||
const wrapAnsi16 = (fn, offset) => function () {
|
|
||||||
const code = fn.apply(colorConvert, arguments);
|
|
||||||
return `\u001B[${code + offset}m`;
|
|
||||||
};
|
|
||||||
|
|
||||||
const wrapAnsi256 = (fn, offset) => function () {
|
|
||||||
const code = fn.apply(colorConvert, arguments);
|
|
||||||
return `\u001B[${38 + offset};5;${code}m`;
|
|
||||||
};
|
|
||||||
|
|
||||||
const wrapAnsi16m = (fn, offset) => function () {
|
|
||||||
const rgb = fn.apply(colorConvert, arguments);
|
|
||||||
return `\u001B[${38 + offset};2;${rgb[0]};${rgb[1]};${rgb[2]}m`;
|
|
||||||
};
|
|
||||||
|
|
||||||
function assembleStyles() {
|
|
||||||
const codes = new Map();
|
|
||||||
const styles = {
|
|
||||||
modifier: {
|
|
||||||
reset: [0, 0],
|
|
||||||
// 21 isn't widely supported and 22 does the same thing
|
|
||||||
bold: [1, 22],
|
|
||||||
dim: [2, 22],
|
|
||||||
italic: [3, 23],
|
|
||||||
underline: [4, 24],
|
|
||||||
inverse: [7, 27],
|
|
||||||
hidden: [8, 28],
|
|
||||||
strikethrough: [9, 29]
|
|
||||||
},
|
|
||||||
color: {
|
|
||||||
black: [30, 39],
|
|
||||||
red: [31, 39],
|
|
||||||
green: [32, 39],
|
|
||||||
yellow: [33, 39],
|
|
||||||
blue: [34, 39],
|
|
||||||
magenta: [35, 39],
|
|
||||||
cyan: [36, 39],
|
|
||||||
white: [37, 39],
|
|
||||||
gray: [90, 39],
|
|
||||||
|
|
||||||
// Bright color
|
|
||||||
redBright: [91, 39],
|
|
||||||
greenBright: [92, 39],
|
|
||||||
yellowBright: [93, 39],
|
|
||||||
blueBright: [94, 39],
|
|
||||||
magentaBright: [95, 39],
|
|
||||||
cyanBright: [96, 39],
|
|
||||||
whiteBright: [97, 39]
|
|
||||||
},
|
|
||||||
bgColor: {
|
|
||||||
bgBlack: [40, 49],
|
|
||||||
bgRed: [41, 49],
|
|
||||||
bgGreen: [42, 49],
|
|
||||||
bgYellow: [43, 49],
|
|
||||||
bgBlue: [44, 49],
|
|
||||||
bgMagenta: [45, 49],
|
|
||||||
bgCyan: [46, 49],
|
|
||||||
bgWhite: [47, 49],
|
|
||||||
|
|
||||||
// Bright color
|
|
||||||
bgBlackBright: [100, 49],
|
|
||||||
bgRedBright: [101, 49],
|
|
||||||
bgGreenBright: [102, 49],
|
|
||||||
bgYellowBright: [103, 49],
|
|
||||||
bgBlueBright: [104, 49],
|
|
||||||
bgMagentaBright: [105, 49],
|
|
||||||
bgCyanBright: [106, 49],
|
|
||||||
bgWhiteBright: [107, 49]
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Fix humans
|
|
||||||
styles.color.grey = styles.color.gray;
|
|
||||||
|
|
||||||
for (const groupName of Object.keys(styles)) {
|
|
||||||
const group = styles[groupName];
|
|
||||||
|
|
||||||
for (const styleName of Object.keys(group)) {
|
|
||||||
const style = group[styleName];
|
|
||||||
|
|
||||||
styles[styleName] = {
|
|
||||||
open: `\u001B[${style[0]}m`,
|
|
||||||
close: `\u001B[${style[1]}m`
|
|
||||||
};
|
|
||||||
|
|
||||||
group[styleName] = styles[styleName];
|
|
||||||
|
|
||||||
codes.set(style[0], style[1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
Object.defineProperty(styles, groupName, {
|
|
||||||
value: group,
|
|
||||||
enumerable: false
|
|
||||||
});
|
|
||||||
|
|
||||||
Object.defineProperty(styles, 'codes', {
|
|
||||||
value: codes,
|
|
||||||
enumerable: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const ansi2ansi = n => n;
|
|
||||||
const rgb2rgb = (r, g, b) => [r, g, b];
|
|
||||||
|
|
||||||
styles.color.close = '\u001B[39m';
|
|
||||||
styles.bgColor.close = '\u001B[49m';
|
|
||||||
|
|
||||||
styles.color.ansi = {
|
|
||||||
ansi: wrapAnsi16(ansi2ansi, 0)
|
|
||||||
};
|
|
||||||
styles.color.ansi256 = {
|
|
||||||
ansi256: wrapAnsi256(ansi2ansi, 0)
|
|
||||||
};
|
|
||||||
styles.color.ansi16m = {
|
|
||||||
rgb: wrapAnsi16m(rgb2rgb, 0)
|
|
||||||
};
|
|
||||||
|
|
||||||
styles.bgColor.ansi = {
|
|
||||||
ansi: wrapAnsi16(ansi2ansi, 10)
|
|
||||||
};
|
|
||||||
styles.bgColor.ansi256 = {
|
|
||||||
ansi256: wrapAnsi256(ansi2ansi, 10)
|
|
||||||
};
|
|
||||||
styles.bgColor.ansi16m = {
|
|
||||||
rgb: wrapAnsi16m(rgb2rgb, 10)
|
|
||||||
};
|
|
||||||
|
|
||||||
for (let key of Object.keys(colorConvert)) {
|
|
||||||
if (typeof colorConvert[key] !== 'object') {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
const suite = colorConvert[key];
|
|
||||||
|
|
||||||
if (key === 'ansi16') {
|
|
||||||
key = 'ansi';
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('ansi16' in suite) {
|
|
||||||
styles.color.ansi[key] = wrapAnsi16(suite.ansi16, 0);
|
|
||||||
styles.bgColor.ansi[key] = wrapAnsi16(suite.ansi16, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('ansi256' in suite) {
|
|
||||||
styles.color.ansi256[key] = wrapAnsi256(suite.ansi256, 0);
|
|
||||||
styles.bgColor.ansi256[key] = wrapAnsi256(suite.ansi256, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('rgb' in suite) {
|
|
||||||
styles.color.ansi16m[key] = wrapAnsi16m(suite.rgb, 0);
|
|
||||||
styles.bgColor.ansi16m[key] = wrapAnsi16m(suite.rgb, 10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return styles;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Make the export immutable
|
|
||||||
Object.defineProperty(module, 'exports', {
|
|
||||||
enumerable: true,
|
|
||||||
get: assembleStyles
|
|
||||||
});
|
|
||||||
-88
@@ -1,88 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "ansi-styles@^3.2.1",
|
|
||||||
"_id": "ansi-styles@3.2.1",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
|
|
||||||
"_location": "/ansi-styles",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "ansi-styles@^3.2.1",
|
|
||||||
"name": "ansi-styles",
|
|
||||||
"escapedName": "ansi-styles",
|
|
||||||
"rawSpec": "^3.2.1",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "^3.2.1"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/chalk"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
|
|
||||||
"_shasum": "41fbb20243e50b12be0f04b8dedbf07520ce841d",
|
|
||||||
"_spec": "ansi-styles@^3.2.1",
|
|
||||||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/chalk",
|
|
||||||
"author": {
|
|
||||||
"name": "Sindre Sorhus",
|
|
||||||
"email": "sindresorhus@gmail.com",
|
|
||||||
"url": "sindresorhus.com"
|
|
||||||
},
|
|
||||||
"ava": {
|
|
||||||
"require": "babel-polyfill"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/chalk/ansi-styles/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
|
||||||
"color-convert": "^1.9.0"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "ANSI escape codes for styling strings in the terminal",
|
|
||||||
"devDependencies": {
|
|
||||||
"ava": "*",
|
|
||||||
"babel-polyfill": "^6.23.0",
|
|
||||||
"svg-term-cli": "^2.1.1",
|
|
||||||
"xo": "*"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">=4"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/chalk/ansi-styles#readme",
|
|
||||||
"keywords": [
|
|
||||||
"ansi",
|
|
||||||
"styles",
|
|
||||||
"color",
|
|
||||||
"colour",
|
|
||||||
"colors",
|
|
||||||
"terminal",
|
|
||||||
"console",
|
|
||||||
"cli",
|
|
||||||
"string",
|
|
||||||
"tty",
|
|
||||||
"escape",
|
|
||||||
"formatting",
|
|
||||||
"rgb",
|
|
||||||
"256",
|
|
||||||
"shell",
|
|
||||||
"xterm",
|
|
||||||
"log",
|
|
||||||
"logging",
|
|
||||||
"command-line",
|
|
||||||
"text"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "ansi-styles",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/chalk/ansi-styles.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor",
|
|
||||||
"test": "xo && ava"
|
|
||||||
},
|
|
||||||
"version": "3.2.1"
|
|
||||||
}
|
|
||||||
-147
@@ -1,147 +0,0 @@
|
|||||||
# ansi-styles [](https://travis-ci.org/chalk/ansi-styles)
|
|
||||||
|
|
||||||
> [ANSI escape codes](http://en.wikipedia.org/wiki/ANSI_escape_code#Colors_and_Styles) for styling strings in the terminal
|
|
||||||
|
|
||||||
You probably want the higher-level [chalk](https://github.com/chalk/chalk) module for styling your strings.
|
|
||||||
|
|
||||||
<img src="https://cdn.rawgit.com/chalk/ansi-styles/8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" width="900">
|
|
||||||
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```
|
|
||||||
$ npm install ansi-styles
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```js
|
|
||||||
const style = require('ansi-styles');
|
|
||||||
|
|
||||||
console.log(`${style.green.open}Hello world!${style.green.close}`);
|
|
||||||
|
|
||||||
|
|
||||||
// Color conversion between 16/256/truecolor
|
|
||||||
// NOTE: If conversion goes to 16 colors or 256 colors, the original color
|
|
||||||
// may be degraded to fit that color palette. This means terminals
|
|
||||||
// that do not support 16 million colors will best-match the
|
|
||||||
// original color.
|
|
||||||
console.log(style.bgColor.ansi.hsl(120, 80, 72) + 'Hello world!' + style.bgColor.close);
|
|
||||||
console.log(style.color.ansi256.rgb(199, 20, 250) + 'Hello world!' + style.color.close);
|
|
||||||
console.log(style.color.ansi16m.hex('#ABCDEF') + 'Hello world!' + style.color.close);
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
Each style has an `open` and `close` property.
|
|
||||||
|
|
||||||
|
|
||||||
## Styles
|
|
||||||
|
|
||||||
### Modifiers
|
|
||||||
|
|
||||||
- `reset`
|
|
||||||
- `bold`
|
|
||||||
- `dim`
|
|
||||||
- `italic` *(Not widely supported)*
|
|
||||||
- `underline`
|
|
||||||
- `inverse`
|
|
||||||
- `hidden`
|
|
||||||
- `strikethrough` *(Not widely supported)*
|
|
||||||
|
|
||||||
### Colors
|
|
||||||
|
|
||||||
- `black`
|
|
||||||
- `red`
|
|
||||||
- `green`
|
|
||||||
- `yellow`
|
|
||||||
- `blue`
|
|
||||||
- `magenta`
|
|
||||||
- `cyan`
|
|
||||||
- `white`
|
|
||||||
- `gray` ("bright black")
|
|
||||||
- `redBright`
|
|
||||||
- `greenBright`
|
|
||||||
- `yellowBright`
|
|
||||||
- `blueBright`
|
|
||||||
- `magentaBright`
|
|
||||||
- `cyanBright`
|
|
||||||
- `whiteBright`
|
|
||||||
|
|
||||||
### Background colors
|
|
||||||
|
|
||||||
- `bgBlack`
|
|
||||||
- `bgRed`
|
|
||||||
- `bgGreen`
|
|
||||||
- `bgYellow`
|
|
||||||
- `bgBlue`
|
|
||||||
- `bgMagenta`
|
|
||||||
- `bgCyan`
|
|
||||||
- `bgWhite`
|
|
||||||
- `bgBlackBright`
|
|
||||||
- `bgRedBright`
|
|
||||||
- `bgGreenBright`
|
|
||||||
- `bgYellowBright`
|
|
||||||
- `bgBlueBright`
|
|
||||||
- `bgMagentaBright`
|
|
||||||
- `bgCyanBright`
|
|
||||||
- `bgWhiteBright`
|
|
||||||
|
|
||||||
|
|
||||||
## Advanced usage
|
|
||||||
|
|
||||||
By default, you get a map of styles, but the styles are also available as groups. They are non-enumerable so they don't show up unless you access them explicitly. This makes it easier to expose only a subset in a higher-level module.
|
|
||||||
|
|
||||||
- `style.modifier`
|
|
||||||
- `style.color`
|
|
||||||
- `style.bgColor`
|
|
||||||
|
|
||||||
###### Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
console.log(style.color.green.open);
|
|
||||||
```
|
|
||||||
|
|
||||||
Raw escape codes (i.e. without the CSI escape prefix `\u001B[` and render mode postfix `m`) are available under `style.codes`, which returns a `Map` with the open codes as keys and close codes as values.
|
|
||||||
|
|
||||||
###### Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
console.log(style.codes.get(36));
|
|
||||||
//=> 39
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## [256 / 16 million (TrueColor) support](https://gist.github.com/XVilka/8346728)
|
|
||||||
|
|
||||||
`ansi-styles` uses the [`color-convert`](https://github.com/Qix-/color-convert) package to allow for converting between various colors and ANSI escapes, with support for 256 and 16 million colors.
|
|
||||||
|
|
||||||
To use these, call the associated conversion function with the intended output, for example:
|
|
||||||
|
|
||||||
```js
|
|
||||||
style.color.ansi.rgb(100, 200, 15); // RGB to 16 color ansi foreground code
|
|
||||||
style.bgColor.ansi.rgb(100, 200, 15); // RGB to 16 color ansi background code
|
|
||||||
|
|
||||||
style.color.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
|
|
||||||
style.bgColor.ansi256.hsl(120, 100, 60); // HSL to 256 color ansi foreground code
|
|
||||||
|
|
||||||
style.color.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color foreground code
|
|
||||||
style.bgColor.ansi16m.hex('#C0FFEE'); // Hex (RGB) to 16 million color background code
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Related
|
|
||||||
|
|
||||||
- [ansi-escapes](https://github.com/sindresorhus/ansi-escapes) - ANSI escape codes for manipulating the terminal
|
|
||||||
|
|
||||||
|
|
||||||
## Maintainers
|
|
||||||
|
|
||||||
- [Sindre Sorhus](https://github.com/sindresorhus)
|
|
||||||
- [Josh Junon](https://github.com/qix-)
|
|
||||||
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT
|
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Blake Embrey (hello@blakeembrey.com)
|
|
||||||
|
|
||||||
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.
|
|
||||||
-43
@@ -1,43 +0,0 @@
|
|||||||
# Array Flatten
|
|
||||||
|
|
||||||
[![NPM version][npm-image]][npm-url]
|
|
||||||
[![NPM downloads][downloads-image]][downloads-url]
|
|
||||||
[![Build status][travis-image]][travis-url]
|
|
||||||
[![Test coverage][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
> Flatten an array of nested arrays into a single flat array. Accepts an optional depth.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```
|
|
||||||
npm install array-flatten --save
|
|
||||||
```
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var flatten = require('array-flatten')
|
|
||||||
|
|
||||||
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9])
|
|
||||||
//=> [1, 2, 3, 4, 5, 6, 7, 8, 9]
|
|
||||||
|
|
||||||
flatten([1, [2, [3, [4, [5], 6], 7], 8], 9], 2)
|
|
||||||
//=> [1, 2, 3, [4, [5], 6], 7, 8, 9]
|
|
||||||
|
|
||||||
(function () {
|
|
||||||
flatten(arguments) //=> [1, 2, 3]
|
|
||||||
})(1, [2, 3])
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
MIT
|
|
||||||
|
|
||||||
[npm-image]: https://img.shields.io/npm/v/array-flatten.svg?style=flat
|
|
||||||
[npm-url]: https://npmjs.org/package/array-flatten
|
|
||||||
[downloads-image]: https://img.shields.io/npm/dm/array-flatten.svg?style=flat
|
|
||||||
[downloads-url]: https://npmjs.org/package/array-flatten
|
|
||||||
[travis-image]: https://img.shields.io/travis/blakeembrey/array-flatten.svg?style=flat
|
|
||||||
[travis-url]: https://travis-ci.org/blakeembrey/array-flatten
|
|
||||||
[coveralls-image]: https://img.shields.io/coveralls/blakeembrey/array-flatten.svg?style=flat
|
|
||||||
[coveralls-url]: https://coveralls.io/r/blakeembrey/array-flatten?branch=master
|
|
||||||
-64
@@ -1,64 +0,0 @@
|
|||||||
'use strict'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Expose `arrayFlatten`.
|
|
||||||
*/
|
|
||||||
module.exports = arrayFlatten
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursive flatten function with depth.
|
|
||||||
*
|
|
||||||
* @param {Array} array
|
|
||||||
* @param {Array} result
|
|
||||||
* @param {Number} depth
|
|
||||||
* @return {Array}
|
|
||||||
*/
|
|
||||||
function flattenWithDepth (array, result, depth) {
|
|
||||||
for (var i = 0; i < array.length; i++) {
|
|
||||||
var value = array[i]
|
|
||||||
|
|
||||||
if (depth > 0 && Array.isArray(value)) {
|
|
||||||
flattenWithDepth(value, result, depth - 1)
|
|
||||||
} else {
|
|
||||||
result.push(value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Recursive flatten function. Omitting depth is slightly faster.
|
|
||||||
*
|
|
||||||
* @param {Array} array
|
|
||||||
* @param {Array} result
|
|
||||||
* @return {Array}
|
|
||||||
*/
|
|
||||||
function flattenForever (array, result) {
|
|
||||||
for (var i = 0; i < array.length; i++) {
|
|
||||||
var value = array[i]
|
|
||||||
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
flattenForever(value, result)
|
|
||||||
} else {
|
|
||||||
result.push(value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Flatten an array, with the ability to define a depth.
|
|
||||||
*
|
|
||||||
* @param {Array} array
|
|
||||||
* @param {Number} depth
|
|
||||||
* @return {Array}
|
|
||||||
*/
|
|
||||||
function arrayFlatten (array, depth) {
|
|
||||||
if (depth == null) {
|
|
||||||
return flattenForever(array, [])
|
|
||||||
}
|
|
||||||
|
|
||||||
return flattenWithDepth(array, [], depth)
|
|
||||||
}
|
|
||||||
-64
@@ -1,64 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "array-flatten@1.1.1",
|
|
||||||
"_id": "array-flatten@1.1.1",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=",
|
|
||||||
"_location": "/array-flatten",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "version",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "array-flatten@1.1.1",
|
|
||||||
"name": "array-flatten",
|
|
||||||
"escapedName": "array-flatten",
|
|
||||||
"rawSpec": "1.1.1",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "1.1.1"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/express"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
|
||||||
"_shasum": "9a5f699051b1e7073328f2a008968b64ea2955d2",
|
|
||||||
"_spec": "array-flatten@1.1.1",
|
|
||||||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/express",
|
|
||||||
"author": {
|
|
||||||
"name": "Blake Embrey",
|
|
||||||
"email": "hello@blakeembrey.com",
|
|
||||||
"url": "http://blakeembrey.me"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/blakeembrey/array-flatten/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Flatten an array of nested arrays into a single flat array",
|
|
||||||
"devDependencies": {
|
|
||||||
"istanbul": "^0.3.13",
|
|
||||||
"mocha": "^2.2.4",
|
|
||||||
"pre-commit": "^1.0.7",
|
|
||||||
"standard": "^3.7.3"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"array-flatten.js",
|
|
||||||
"LICENSE"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/blakeembrey/array-flatten",
|
|
||||||
"keywords": [
|
|
||||||
"array",
|
|
||||||
"flatten",
|
|
||||||
"arguments",
|
|
||||||
"depth"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "array-flatten.js",
|
|
||||||
"name": "array-flatten",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/blakeembrey/array-flatten.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"test": "istanbul cover _mocha -- -R spec"
|
|
||||||
},
|
|
||||||
"version": "1.1.1"
|
|
||||||
}
|
|
||||||
-19
@@ -1,19 +0,0 @@
|
|||||||
Copyright (c) 2010-2018 Caolan McMahon
|
|
||||||
|
|
||||||
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.
|
|
||||||
-56
@@ -1,56 +0,0 @@
|
|||||||

|
|
||||||
|
|
||||||
[](https://travis-ci.org/caolan/async)
|
|
||||||
[](https://www.npmjs.com/package/async)
|
|
||||||
[](https://coveralls.io/r/caolan/async?branch=master)
|
|
||||||
[](https://gitter.im/caolan/async?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
||||||
[](https://www.libhive.com/providers/npm/packages/async)
|
|
||||||
[](https://www.jsdelivr.com/package/npm/async)
|
|
||||||
|
|
||||||
|
|
||||||
Async is a utility module which provides straight-forward, powerful functions for working with [asynchronous JavaScript](http://caolan.github.io/async/global.html). Although originally designed for use with [Node.js](https://nodejs.org/) and installable via `npm install --save async`, it can also be used directly in the browser.
|
|
||||||
|
|
||||||
This version of the package is optimized for the Node.js environment. If you use Async with webpack, install [`async-es`](https://www.npmjs.com/package/async-es) instead.
|
|
||||||
|
|
||||||
For Documentation, visit <https://caolan.github.io/async/>
|
|
||||||
|
|
||||||
*For Async v1.5.x documentation, go [HERE](https://github.com/caolan/async/blob/v1.5.2/README.md)*
|
|
||||||
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// for use with Node-style callbacks...
|
|
||||||
var async = require("async");
|
|
||||||
|
|
||||||
var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};
|
|
||||||
var configs = {};
|
|
||||||
|
|
||||||
async.forEachOf(obj, (value, key, callback) => {
|
|
||||||
fs.readFile(__dirname + value, "utf8", (err, data) => {
|
|
||||||
if (err) return callback(err);
|
|
||||||
try {
|
|
||||||
configs[key] = JSON.parse(data);
|
|
||||||
} catch (e) {
|
|
||||||
return callback(e);
|
|
||||||
}
|
|
||||||
callback();
|
|
||||||
});
|
|
||||||
}, err => {
|
|
||||||
if (err) console.error(err.message);
|
|
||||||
// configs is now a map of JSON data
|
|
||||||
doSomethingWith(configs);
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
var async = require("async");
|
|
||||||
|
|
||||||
// ...or ES2017 async functions
|
|
||||||
async.mapLimit(urls, 5, async function(url) {
|
|
||||||
const response = await fetch(url)
|
|
||||||
return response.body
|
|
||||||
}, (err, results) => {
|
|
||||||
if (err) throw err
|
|
||||||
// results is now an array of the response bodies
|
|
||||||
console.log(results)
|
|
||||||
})
|
|
||||||
```
|
|
||||||
-17
@@ -1,17 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "async",
|
|
||||||
"main": "dist/async.js",
|
|
||||||
"ignore": [
|
|
||||||
"bower_components",
|
|
||||||
"lib",
|
|
||||||
"mocha_test",
|
|
||||||
"node_modules",
|
|
||||||
"perf",
|
|
||||||
"support",
|
|
||||||
"**/.*",
|
|
||||||
"*.config.js",
|
|
||||||
"*.json",
|
|
||||||
"index.js",
|
|
||||||
"Makefile"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
-5609
File diff suppressed because it is too large.
Load diff
-1
@@ -1 +0,0 @@
|
|||||||
{"version":3,"sources":["build/dist/async.js"],"names":["global","factory","exports","module","define","amd","async","this","slice","arrayLike","start","newLen","Math","max","length","newArr","Array","idx","isObject","value","type","fallback","fn","setTimeout","wrap","defer","args","arguments","apply","asyncify","func","initialParams","callback","result","e","then","invokeCallback","err","message","Error","error","setImmediate$1","rethrow","isAsync","supportsSymbol","Symbol","toStringTag","wrapAsync","asyncFn","applyEach$1","eachfn","fns","go","that","cb","concat","getRawTag","isOwn","hasOwnProperty","call","symToStringTag$1","tag","undefined","unmasked","nativeObjectToString","objectToString","nativeObjectToString$1","baseGetTag","undefinedTag","nullTag","symToStringTag","Object","isFunction","funcTag","genTag","asyncTag","proxyTag","isLength","MAX_SAFE_INTEGER","isArrayLike","noop","once","callFn","baseTimes","n","iteratee","index","isObjectLike","baseIsArguments","argsTag","stubFalse","isIndex","MAX_SAFE_INTEGER$1","reIsUint","test","baseIsTypedArray","typedArrayTags","baseUnary","arrayLikeKeys","inherited","isArr","isArray","isArg","isArguments","isBuff","isBuffer","isType","isTypedArray","skipIndexes","String","key","hasOwnProperty$1","push","isPrototype","Ctor","constructor","proto","prototype","objectProto$5","overArg","transform","arg","baseKeys","object","nativeKeys","hasOwnProperty$3","keys","createArrayIterator","coll","i","len","createES2015Iterator","iterator","item","next","done","createObjectIterator","obj","okeys","getIterator","onlyOnce","_eachOfLimit","limit","iterateeCallback","running","breakLoop","looping","replenish","elem","nextElem","eachOfLimit","doLimit","iterable","eachOfArrayLike","iteratorCallback","completed","doParallel","eachOf","_asyncMap","arr","results","counter","_iteratee","_","v","doParallelLimit","arrayEach","array","createBaseFor","fromRight","keysFunc","props","baseForOwn","baseFor","baseFindIndex","predicate","fromIndex","baseIsNaN","strictIndexOf","baseIndexOf","arrayMap","isSymbol","symbolTag","baseToString","symbolToString","INFINITY","baseSlice","end","castSlice","charsEndIndex","strSymbols","chrSymbols","charsStartIndex","asciiToArray","string","split","hasUnicode","reHasUnicode","unicodeToArray","match","reUnicode","stringToArray","toString","trim","chars","guard","replace","reTrim","join","parseParams","STRIP_COMMENTS","FN_ARGS","FN_ARG_SPLIT","map","FN_ARG","autoInject","tasks","newTasks","taskFn","newTask","taskCb","newArgs","params","name","fnIsAsync","hasNoDeps","pop","auto","DLL","head","tail","setInitial","dll","node","queue","worker","concurrency","payload","_insert","data","insertAtFront","q","started","idle","drain","l","_tasks","unshift","processingScheduled","process","_next","numRunning","task","workersList","shift","splice","buffer","unsaturated","_worker","isProcessing","saturated","empty","paused","kill","remove","testFn","min","pause","resume","cargo","reduce","memo","eachOfSeries","x","seq","_functions","newargs","nextargs","identity","_createTester","check","getResult","testResult","testPassed","_findGetResult","consoleFunc","console","doDuring","_test","truth","_fn","doWhilst","doUntil","during","_withoutIndex","eachLimit","eachLimit$1","ensureAsync","sync","innerArgs","notId","baseProperty","filterArray","truthValues","filterGeneric","sort","a","b","_filter","filter","forever","errback","mapValuesLimit","newObj","val","has","memoize","hasher","create","queues","memoized","unmemoized","_parallel","parallelLimit","parallelLimit$1","race","TypeError","reduceRight","reversed","reverse","reflect","reflectCallback","cbArg","reflectAll","reject$1","constant$1","retry","opts","parseTimes","acc","t","times","DEFAULT_TIMES","intervalFunc","interval","DEFAULT_INTERVAL","errorFilter","retryAttempt","_task","attempt","options","series","sortBy","comparator","left","right","criteria","timeout","milliseconds","info","timeoutCallback","code","timedOut","timer","clearTimeout","baseRange","step","nativeMax","nativeCeil","timeLimit","count","mapLimit","accumulator","k","tryEach","eachSeries","res","unmemoize","whilst","until","_defer","callArgs","hasSetImmediate","setImmediate","hasNextTick","nextTick","freeGlobal","freeSelf","self","root","Function","Symbol$1","objectProto","objectProto$1","iteratorSymbol","objectProto$3","hasOwnProperty$2","propertyIsEnumerable","freeExports","nodeType","freeModule","moduleExports","Buffer","nativeIsBuffer","argsTag$1","arrayTag","boolTag","dateTag","errorTag","funcTag$1","mapTag","numberTag","objectTag","regexpTag","setTag","stringTag","weakMapTag","arrayBufferTag","dataViewTag","float32Tag","float64Tag","int8Tag","int16Tag","int32Tag","uint8Tag","uint8ClampedTag","uint16Tag","uint32Tag","freeExports$1","freeModule$1","moduleExports$1","freeProcess","nodeUtil","types","require","binding","nodeIsTypedArray","objectProto$2","objectProto$4","eachOfGeneric","Infinity","eachOfImplementation","applyEach","mapSeries","applyEachLine truncated
|
|
||||||
-5
@@ -1,5 +0,0 @@
|
|||||||
test
|
|
||||||
.gitignore
|
|
||||||
.travis.yml
|
|
||||||
Makefile
|
|
||||||
example.js
|
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
(MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
|
||||||
|
|
||||||
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.
|
|
||||||
-91
@@ -1,91 +0,0 @@
|
|||||||
# balanced-match
|
|
||||||
|
|
||||||
Match balanced string pairs, like `{` and `}` or `<b>` and `</b>`. Supports regular expressions as well!
|
|
||||||
|
|
||||||
[](http://travis-ci.org/juliangruber/balanced-match)
|
|
||||||
[](https://www.npmjs.org/package/balanced-match)
|
|
||||||
|
|
||||||
[](https://ci.testling.com/juliangruber/balanced-match)
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
Get the first matching pair of braces:
|
|
||||||
|
|
||||||
```js
|
|
||||||
var balanced = require('balanced-match');
|
|
||||||
|
|
||||||
console.log(balanced('{', '}', 'pre{in{nested}}post'));
|
|
||||||
console.log(balanced('{', '}', 'pre{first}between{second}post'));
|
|
||||||
console.log(balanced(/\s+\{\s+/, /\s+\}\s+/, 'pre { in{nest} } post'));
|
|
||||||
```
|
|
||||||
|
|
||||||
The matches are:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ node example.js
|
|
||||||
{ start: 3, end: 14, pre: 'pre', body: 'in{nested}', post: 'post' }
|
|
||||||
{ start: 3,
|
|
||||||
end: 9,
|
|
||||||
pre: 'pre',
|
|
||||||
body: 'first',
|
|
||||||
post: 'between{second}post' }
|
|
||||||
{ start: 3, end: 17, pre: 'pre', body: 'in{nest}', post: 'post' }
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
### var m = balanced(a, b, str)
|
|
||||||
|
|
||||||
For the first non-nested matching pair of `a` and `b` in `str`, return an
|
|
||||||
object with those keys:
|
|
||||||
|
|
||||||
* **start** the index of the first match of `a`
|
|
||||||
* **end** the index of the matching `b`
|
|
||||||
* **pre** the preamble, `a` and `b` not included
|
|
||||||
* **body** the match, `a` and `b` not included
|
|
||||||
* **post** the postscript, `a` and `b` not included
|
|
||||||
|
|
||||||
If there's no match, `undefined` will be returned.
|
|
||||||
|
|
||||||
If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `['{', 'a', '']` and `{a}}` will match `['', 'a', '}']`.
|
|
||||||
|
|
||||||
### var r = balanced.range(a, b, str)
|
|
||||||
|
|
||||||
For the first non-nested matching pair of `a` and `b` in `str`, return an
|
|
||||||
array with indexes: `[ <a index>, <b index> ]`.
|
|
||||||
|
|
||||||
If there's no match, `undefined` will be returned.
|
|
||||||
|
|
||||||
If the `str` contains more `a` than `b` / there are unmatched pairs, the first match that was closed will be used. For example, `{{a}` will match `[ 1, 3 ]` and `{a}}` will match `[0, 2]`.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
With [npm](https://npmjs.org) do:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install balanced-match
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
(MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
|
||||||
|
|
||||||
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.
|
|
||||||
-59
@@ -1,59 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
module.exports = balanced;
|
|
||||||
function balanced(a, b, str) {
|
|
||||||
if (a instanceof RegExp) a = maybeMatch(a, str);
|
|
||||||
if (b instanceof RegExp) b = maybeMatch(b, str);
|
|
||||||
|
|
||||||
var r = range(a, b, str);
|
|
||||||
|
|
||||||
return r && {
|
|
||||||
start: r[0],
|
|
||||||
end: r[1],
|
|
||||||
pre: str.slice(0, r[0]),
|
|
||||||
body: str.slice(r[0] + a.length, r[1]),
|
|
||||||
post: str.slice(r[1] + b.length)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function maybeMatch(reg, str) {
|
|
||||||
var m = str.match(reg);
|
|
||||||
return m ? m[0] : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
balanced.range = range;
|
|
||||||
function range(a, b, str) {
|
|
||||||
var begs, beg, left, right, result;
|
|
||||||
var ai = str.indexOf(a);
|
|
||||||
var bi = str.indexOf(b, ai + 1);
|
|
||||||
var i = ai;
|
|
||||||
|
|
||||||
if (ai >= 0 && bi > 0) {
|
|
||||||
begs = [];
|
|
||||||
left = str.length;
|
|
||||||
|
|
||||||
while (i >= 0 && !result) {
|
|
||||||
if (i == ai) {
|
|
||||||
begs.push(i);
|
|
||||||
ai = str.indexOf(a, i + 1);
|
|
||||||
} else if (begs.length == 1) {
|
|
||||||
result = [ begs.pop(), bi ];
|
|
||||||
} else {
|
|
||||||
beg = begs.pop();
|
|
||||||
if (beg < left) {
|
|
||||||
left = beg;
|
|
||||||
right = bi;
|
|
||||||
}
|
|
||||||
|
|
||||||
bi = str.indexOf(b, i + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
i = ai < bi && ai >= 0 ? ai : bi;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (begs.length) {
|
|
||||||
result = [ left, right ];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
-77
@@ -1,77 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "balanced-match@^1.0.0",
|
|
||||||
"_id": "balanced-match@1.0.0",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
|
|
||||||
"_location": "/balanced-match",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "balanced-match@^1.0.0",
|
|
||||||
"name": "balanced-match",
|
|
||||||
"escapedName": "balanced-match",
|
|
||||||
"rawSpec": "^1.0.0",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "^1.0.0"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/brace-expansion"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
|
|
||||||
"_shasum": "89b4d199ab2bee49de164ea02b89ce462d71b767",
|
|
||||||
"_spec": "balanced-match@^1.0.0",
|
|
||||||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/brace-expansion",
|
|
||||||
"author": {
|
|
||||||
"name": "Julian Gruber",
|
|
||||||
"email": "mail@juliangruber.com",
|
|
||||||
"url": "http://juliangruber.com"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/juliangruber/balanced-match/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Match balanced character pairs, like \"{\" and \"}\"",
|
|
||||||
"devDependencies": {
|
|
||||||
"matcha": "^0.7.0",
|
|
||||||
"tape": "^4.6.0"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/juliangruber/balanced-match",
|
|
||||||
"keywords": [
|
|
||||||
"match",
|
|
||||||
"regexp",
|
|
||||||
"test",
|
|
||||||
"balanced",
|
|
||||||
"parse"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "index.js",
|
|
||||||
"name": "balanced-match",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/juliangruber/balanced-match.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"bench": "make bench",
|
|
||||||
"test": "make test"
|
|
||||||
},
|
|
||||||
"testling": {
|
|
||||||
"files": "test/*.js",
|
|
||||||
"browsers": [
|
|
||||||
"ie/8..latest",
|
|
||||||
"firefox/20..latest",
|
|
||||||
"firefox/nightly",
|
|
||||||
"chrome/25..latest",
|
|
||||||
"chrome/canary",
|
|
||||||
"opera/12..latest",
|
|
||||||
"opera/next",
|
|
||||||
"safari/5.1..latest",
|
|
||||||
"ipad/6.0..latest",
|
|
||||||
"iphone/6.0..latest",
|
|
||||||
"android-browser/4.2..latest"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"version": "1.0.0"
|
|
||||||
}
|
|
||||||
-52
@@ -1,52 +0,0 @@
|
|||||||
2.0.1 / 2018-09-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: safe-buffer@5.1.2
|
|
||||||
|
|
||||||
2.0.0 / 2017-09-12
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Drop support for Node.js below 0.8
|
|
||||||
* Remove `auth(ctx)` signature -- pass in header or `auth(ctx.req)`
|
|
||||||
* Use `safe-buffer` for improved Buffer API
|
|
||||||
|
|
||||||
1.1.0 / 2016-11-18
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Add `auth.parse` for low-level string parsing
|
|
||||||
|
|
||||||
1.0.4 / 2016-05-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Improve error message when `req` argument is not an object
|
|
||||||
* Improve error message when `req` missing `headers` property
|
|
||||||
|
|
||||||
1.0.3 / 2015-07-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Fix regression accepting a Koa context
|
|
||||||
|
|
||||||
1.0.2 / 2015-06-12
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Improve error message when `req` argument missing
|
|
||||||
* perf: enable strict mode
|
|
||||||
* perf: hoist regular expression
|
|
||||||
* perf: parse with regular expressions
|
|
||||||
* perf: remove argument reassignment
|
|
||||||
|
|
||||||
1.0.1 / 2015-05-04
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Update readme
|
|
||||||
|
|
||||||
1.0.0 / 2014-07-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Support empty password
|
|
||||||
* Support empty username
|
|
||||||
|
|
||||||
0.0.1 / 2013-11-30
|
|
||||||
==================
|
|
||||||
|
|
||||||
* Initial release
|
|
||||||
-24
@@ -1,24 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2013 TJ Holowaychuk
|
|
||||||
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
|
|
||||||
Copyright (c) 2015-2016 Douglas Christopher Wilson <doug@somethingdoug.com>
|
|
||||||
|
|
||||||
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.
|
|
||||||
-113
@@ -1,113 +0,0 @@
|
|||||||
# basic-auth
|
|
||||||
|
|
||||||
[![NPM Version][npm-image]][npm-url]
|
|
||||||
[![NPM Downloads][downloads-image]][downloads-url]
|
|
||||||
[![Node.js Version][node-version-image]][node-version-url]
|
|
||||||
[![Build Status][travis-image]][travis-url]
|
|
||||||
[![Test Coverage][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
Generic basic auth Authorization header field parser for whatever.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
This is a [Node.js](https://nodejs.org/en/) module available through the
|
|
||||||
[npm registry](https://www.npmjs.com/). Installation is done using the
|
|
||||||
[`npm install` command](https://docs.npmjs.com/getting-started/installing-npm-packages-locally):
|
|
||||||
|
|
||||||
```
|
|
||||||
$ npm install basic-auth
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
<!-- eslint-disable no-unused-vars -->
|
|
||||||
|
|
||||||
```js
|
|
||||||
var auth = require('basic-auth')
|
|
||||||
```
|
|
||||||
|
|
||||||
### auth(req)
|
|
||||||
|
|
||||||
Get the basic auth credentials from the given request. The `Authorization`
|
|
||||||
header is parsed and if the header is invalid, `undefined` is returned,
|
|
||||||
otherwise an object with `name` and `pass` properties.
|
|
||||||
|
|
||||||
### auth.parse(string)
|
|
||||||
|
|
||||||
Parse a basic auth authorization header string. This will return an object
|
|
||||||
with `name` and `pass` properties, or `undefined` if the string is invalid.
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
Pass a Node.js request object to the module export. If parsing fails
|
|
||||||
`undefined` is returned, otherwise an object with `.name` and `.pass`.
|
|
||||||
|
|
||||||
<!-- eslint-disable no-unused-vars, no-undef -->
|
|
||||||
|
|
||||||
```js
|
|
||||||
var auth = require('basic-auth')
|
|
||||||
var user = auth(req)
|
|
||||||
// => { name: 'something', pass: 'whatever' }
|
|
||||||
```
|
|
||||||
|
|
||||||
A header string from any other location can also be parsed with
|
|
||||||
`auth.parse`, for example a `Proxy-Authorization` header:
|
|
||||||
|
|
||||||
<!-- eslint-disable no-unused-vars, no-undef -->
|
|
||||||
|
|
||||||
```js
|
|
||||||
var auth = require('basic-auth')
|
|
||||||
var user = auth.parse(req.getHeader('Proxy-Authorization'))
|
|
||||||
```
|
|
||||||
|
|
||||||
### With vanilla node.js http server
|
|
||||||
|
|
||||||
```js
|
|
||||||
var http = require('http')
|
|
||||||
var auth = require('basic-auth')
|
|
||||||
var compare = require('tsscmp')
|
|
||||||
|
|
||||||
// Create server
|
|
||||||
var server = http.createServer(function (req, res) {
|
|
||||||
var credentials = auth(req)
|
|
||||||
|
|
||||||
// Check credentials
|
|
||||||
// The "check" function will typically be against your user store
|
|
||||||
if (!credentials || !check(credentials.name, credentials.pass)) {
|
|
||||||
res.statusCode = 401
|
|
||||||
res.setHeader('WWW-Authenticate', 'Basic realm="example"')
|
|
||||||
res.end('Access denied')
|
|
||||||
} else {
|
|
||||||
res.end('Access granted')
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
// Basic function to validate credentials for example
|
|
||||||
function check (name, pass) {
|
|
||||||
var valid = true
|
|
||||||
|
|
||||||
// Simple method to prevent short-circut and use timing-safe compare
|
|
||||||
valid = compare(name, 'john') && valid
|
|
||||||
valid = compare(pass, 'secret') && valid
|
|
||||||
|
|
||||||
return valid
|
|
||||||
}
|
|
||||||
|
|
||||||
// Listen
|
|
||||||
server.listen(3000)
|
|
||||||
```
|
|
||||||
|
|
||||||
# License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[coveralls-image]: https://badgen.net/coveralls/c/github/jshttp/basic-auth/master
|
|
||||||
[coveralls-url]: https://coveralls.io/r/jshttp/basic-auth?branch=master
|
|
||||||
[downloads-image]: https://badgen.net/npm/dm/basic-auth
|
|
||||||
[downloads-url]: https://npmjs.org/package/basic-auth
|
|
||||||
[node-version-image]: https://badgen.net/npm/node/basic-auth
|
|
||||||
[node-version-url]: https://nodejs.org/en/download
|
|
||||||
[npm-image]: https://badgen.net/npm/v/basic-auth
|
|
||||||
[npm-url]: https://npmjs.org/package/basic-auth
|
|
||||||
[travis-image]: https://badgen.net/travis/jshttp/basic-auth/master
|
|
||||||
[travis-url]: https://travis-ci.org/jshttp/basic-auth
|
|
||||||
-133
@@ -1,133 +0,0 @@
|
|||||||
/*!
|
|
||||||
* basic-auth
|
|
||||||
* Copyright(c) 2013 TJ Holowaychuk
|
|
||||||
* Copyright(c) 2014 Jonathan Ong
|
|
||||||
* Copyright(c) 2015-2016 Douglas Christopher Wilson
|
|
||||||
* MIT Licensed
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Buffer = require('safe-buffer').Buffer
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module exports.
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = auth
|
|
||||||
module.exports.parse = parse
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RegExp for basic auth credentials
|
|
||||||
*
|
|
||||||
* credentials = auth-scheme 1*SP token68
|
|
||||||
* auth-scheme = "Basic" ; case insensitive
|
|
||||||
* token68 = 1*( ALPHA / DIGIT / "-" / "." / "_" / "~" / "+" / "/" ) *"="
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
var CREDENTIALS_REGEXP = /^ *(?:[Bb][Aa][Ss][Ii][Cc]) +([A-Za-z0-9._~+/-]+=*) *$/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RegExp for basic auth user/pass
|
|
||||||
*
|
|
||||||
* user-pass = userid ":" password
|
|
||||||
* userid = *<TEXT excluding ":">
|
|
||||||
* password = *TEXT
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
var USER_PASS_REGEXP = /^([^:]*):(.*)$/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse the Authorization header field of a request.
|
|
||||||
*
|
|
||||||
* @param {object} req
|
|
||||||
* @return {object} with .name and .pass
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
function auth (req) {
|
|
||||||
if (!req) {
|
|
||||||
throw new TypeError('argument req is required')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof req !== 'object') {
|
|
||||||
throw new TypeError('argument req is required to be an object')
|
|
||||||
}
|
|
||||||
|
|
||||||
// get header
|
|
||||||
var header = getAuthorization(req)
|
|
||||||
|
|
||||||
// parse header
|
|
||||||
return parse(header)
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode base64 string.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function decodeBase64 (str) {
|
|
||||||
return Buffer.from(str, 'base64').toString()
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the Authorization header from request object.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function getAuthorization (req) {
|
|
||||||
if (!req.headers || typeof req.headers !== 'object') {
|
|
||||||
throw new TypeError('argument req is required to have headers property')
|
|
||||||
}
|
|
||||||
|
|
||||||
return req.headers.authorization
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Parse basic auth to object.
|
|
||||||
*
|
|
||||||
* @param {string} string
|
|
||||||
* @return {object}
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
function parse (string) {
|
|
||||||
if (typeof string !== 'string') {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse header
|
|
||||||
var match = CREDENTIALS_REGEXP.exec(string)
|
|
||||||
|
|
||||||
if (!match) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
// decode user pass
|
|
||||||
var userPass = USER_PASS_REGEXP.exec(decodeBase64(match[1]))
|
|
||||||
|
|
||||||
if (!userPass) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
|
|
||||||
// return credentials object
|
|
||||||
return new Credentials(userPass[1], userPass[2])
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Object to represent user credentials.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function Credentials (name, pass) {
|
|
||||||
this.name = name
|
|
||||||
this.pass = pass
|
|
||||||
}
|
|
||||||
-73
@@ -1,73 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "basic-auth@~2.0.0",
|
|
||||||
"_id": "basic-auth@2.0.1",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
|
|
||||||
"_location": "/basic-auth",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "basic-auth@~2.0.0",
|
|
||||||
"name": "basic-auth",
|
|
||||||
"escapedName": "basic-auth",
|
|
||||||
"rawSpec": "~2.0.0",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "~2.0.0"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/morgan"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
|
|
||||||
"_shasum": "b998279bf47ce38344b4f3cf916d4679bbf51e3a",
|
|
||||||
"_spec": "basic-auth@~2.0.0",
|
|
||||||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/morgan",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/jshttp/basic-auth/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
|
||||||
"safe-buffer": "5.1.2"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "node.js basic auth parser",
|
|
||||||
"devDependencies": {
|
|
||||||
"eslint": "5.6.0",
|
|
||||||
"eslint-config-standard": "12.0.0",
|
|
||||||
"eslint-plugin-import": "2.14.0",
|
|
||||||
"eslint-plugin-markdown": "1.0.0-beta.6",
|
|
||||||
"eslint-plugin-node": "7.0.1",
|
|
||||||
"eslint-plugin-promise": "4.0.1",
|
|
||||||
"eslint-plugin-standard": "4.0.0",
|
|
||||||
"istanbul": "0.4.5",
|
|
||||||
"mocha": "5.2.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"HISTORY.md",
|
|
||||||
"LICENSE",
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/jshttp/basic-auth#readme",
|
|
||||||
"keywords": [
|
|
||||||
"basic",
|
|
||||||
"auth",
|
|
||||||
"authorization",
|
|
||||||
"basicauth"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "basic-auth",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/jshttp/basic-auth.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint --plugin markdown --ext js,md .",
|
|
||||||
"test": "mocha --check-leaks --reporter spec --bail",
|
|
||||||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --reporter dot --check-leaks test/",
|
|
||||||
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --reporter spec --check-leaks test/"
|
|
||||||
},
|
|
||||||
"version": "2.0.1"
|
|
||||||
}
|
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2013-2017 Petka Antonov
|
|
||||||
|
|
||||||
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.
|
|
||||||
-52
@@ -1,52 +0,0 @@
|
|||||||
<a href="http://promisesaplus.com/">
|
|
||||||
<img src="http://promisesaplus.com/assets/logo-small.png" alt="Promises/A+ logo"
|
|
||||||
title="Promises/A+ 1.1 compliant" align="right" />
|
|
||||||
</a>
|
|
||||||
|
|
||||||
[](https://travis-ci.org/petkaantonov/bluebird)
|
|
||||||
[](http://petkaantonov.github.io/bluebird/coverage/debug/index.html)
|
|
||||||
|
|
||||||
**Got a question?** Join us on [stackoverflow](http://stackoverflow.com/questions/tagged/bluebird), the [mailing list](https://groups.google.com/forum/#!forum/bluebird-js) or chat on [IRC](https://webchat.freenode.net/?channels=#promises)
|
|
||||||
|
|
||||||
# Introduction
|
|
||||||
|
|
||||||
Bluebird is a fully featured promise library with focus on innovative features and performance
|
|
||||||
|
|
||||||
See the [**bluebird website**](http://bluebirdjs.com/docs/getting-started.html) for further documentation, references and instructions. See the [**API reference**](http://bluebirdjs.com/docs/api-reference.html) here.
|
|
||||||
|
|
||||||
For bluebird 2.x documentation and files, see the [2.x tree](https://github.com/petkaantonov/bluebird/tree/2.x).
|
|
||||||
|
|
||||||
# Questions and issues
|
|
||||||
|
|
||||||
The [github issue tracker](https://github.com/petkaantonov/bluebird/issues) is **_only_** for bug reports and feature requests. Anything else, such as questions for help in using the library, should be posted in [StackOverflow](http://stackoverflow.com/questions/tagged/bluebird) under tags `promise` and `bluebird`.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Thanks
|
|
||||||
|
|
||||||
Thanks to BrowserStack for providing us with a free account which lets us support old browsers like IE8.
|
|
||||||
|
|
||||||
# License
|
|
||||||
|
|
||||||
The MIT License (MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2013-2017 Petka Antonov
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
-1
@@ -1 +0,0 @@
|
|||||||
[http://bluebirdjs.com/docs/changelog.html](http://bluebirdjs.com/docs/changelog.html)
|
|
||||||
-3781
File diff suppressed because it is too large.
Load diff
-31
@@ -1,31 +0,0 @@
|
|||||||
/* @preserve
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2013-2017 Petka Antonov
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* bluebird build version 3.5.1
|
|
||||||
* Features enabled: core
|
|
||||||
* Features disabled: race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
|
|
||||||
*/
|
|
||||||
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function i(a,s){if(!e[a]){if(!t[a]){var c="function"==typeof _dereq_&&_dereq_;if(!s&&c)return c(a,!0);if(o)return o(a,!0);var l=new Error("Cannot find module '"+a+"'");throw l.code="MODULE_NOT_FOUND",l}var u=e[a]={exports:{}};t[a][0].call(u.exports,function(e){var n=t[a][1][e];return i(n?n:e)},u,u.exports,r,t,e,n)}return e[a].exports}for(var o="function"==typeof _dereq_&&_dereq_,a=0;a<n.length;a++)i(n[a]);return i}({1:[function(t,e,n){"use strict";function r(){this._customScheduler=!1,this._isTickUsed=!1,this._lateQueue=new u(16),this._normalQueue=new u(16),this._haveDrainedQueues=!1,this._trampolineEnabled=!0;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=l}function i(t,e,n){this._lateQueue.push(t,e,n),this._queueTick()}function o(t,e,n){this._normalQueue.push(t,e,n),this._queueTick()}function a(t){this._normalQueue._pushOne(t),this._queueTick()}var s;try{throw new Error}catch(c){s=c}var l=t("./schedule"),u=t("./queue"),p=t("./util");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.enableTrampoline=function(){this._trampolineEnabled=!0},r.prototype.disableTrampolineIfNecessary=function(){p.hasDevTools&&(this._trampolineEnabled=!1)},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")}},p.hasDevTools?(r.prototype.invokeLater=function(t,e,n){this._trampolineEnabled?i.call(this,t,e,n):this._schedule(function(){setTimeout(function(){t.call(e,n)},100)})},r.prototype.invoke=function(t,e,n){this._trampolineEnabled?o.call(this,t,e,n):this._schedule(function(){t.call(e,n)})},r.prototype.settlePromises=function(t){this._trampolineEnabled?a.call(this,t):this._schedule(function(){t._settlePromises()})}):(r.prototype.invokeLater=i,r.prototype.invoke=o,r.prototype.settlePromises=a),r.prototype._drainQueue=function(t){for(;t.length()>0;){var e=t.shift();if("function"==typeof e){var n=t.shift(),r=t.shift();e.call(n,r)}else e._settlePromises()}},r.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,this._drainQueue(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=s},{"./queue":17,"./schedule":18,"./util":21}],2:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var i=!1,o=function(t,e){this._reject(e)},a=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},s=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var l=n(o),u=new t(e);u._propagateFrom(this,1);var p=this._target();if(u._setBoundTo(l),l instanceof t){var f={promiseRejectionQueued:!1,promise:u,target:p,bindingPromise:l};p._then(e,a,void 0,u,f),l._then(s,c,void 0,u,f),u._setOnCancel(l)}else u._resolveCallback(p);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],3:[function(t,e,n){"use strict";function r(){try{Promise===o&&(Promise=i)}catch(t){}return o}var i;"undefined"!=typeof Promise&&(i=Promise);var o=t("./promise")();o.noConflict=r,e.exports=o},{"./promise":15}],4:[function(t,e,n){"use strict";e.exports=function(e,n,r,i){var o=t("./util"),a=o.tryCatch,s=o.errorObj,c=e._async;e.prototype["break"]=e.prototype.cancel=function(){if(!i.cancellation())return this._warn("cancellation is disabled");for(var t=this,e=t;t._isCancellable();){if(!t._cancelBy(e)){e._isFollowing()?e._followee().cancel():e._cancelBranched();break}var n=t._cancellationParent;if(null==n||!n._isCancellable()){t._isFollowing()?t._followee().cancel():t._cancelBranched();break}t._isFollowing()&&t._followee().cancel(),t._setWillBeCancelled(),e=t,t=n}Line truncated
|
|
||||||
},i.prototype.toJSON=function(){var t={isFulfilled:!1,isRejected:!1,fulfillmentValue:void 0,rejectionReason:void 0};return this.isFulfilled()?(t.fulfillmentValue=this.value(),t.isFulfilled=!0):this.isRejected()&&(t.rejectionReason=this.reason(),t.isRejected=!0),t},i.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new k(this).promise()},i.prototype.error=function(t){return this.caught(h.originatesFromRejection,t)},i.getNewLibraryCopy=e.exports,i.is=function(t){return t instanceof i},i.fromNode=i.fromCallback=function(t){var e=new i(b);e._captureStackTrace();var n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,r=x(t)(R(e,n));return r===S&&e._rejectCallback(r.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},i.all=function(t){return new k(t).promise()},i.cast=function(t){var e=E(t);return e instanceof i||(e=new i(b),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},i.resolve=i.fulfilled=i.cast,i.reject=i.rejected=function(t){var e=new i(b);return e._captureStackTrace(),e._rejectCallback(t,!0),e},i.setScheduler=function(t){if("function"!=typeof t)throw new g("expecting a function but got "+h.classString(t));return v.setScheduler(t)},i.prototype._then=function(t,e,n,r,o){var a=void 0!==o,s=a?o:new i(b),l=this._target(),u=l._bitField;a||(s._propagateFrom(this,3),s._captureStackTrace(),void 0===r&&0!==(2097152&this._bitField)&&(r=0!==(50397184&u)?this._boundValue():l===this?void 0:this._boundTo),this._fireEvent("promiseChained",this,s));var p=c();if(0!==(50397184&u)){var f,_,d=l._settlePromiseCtx;0!==(33554432&u)?(_=l._rejectionHandler0,f=t):0!==(16777216&u)?(_=l._fulfillmentHandler0,f=e,l._unsetRejectionIsUnhandled()):(d=l._settlePromiseLateCancellationObserver,_=new m("late cancellation observer"),l._attachExtraTrace(_),f=e),v.invoke(d,l,{handler:null===p?f:"function"==typeof f&&h.domainBind(p,f),promise:s,receiver:r,value:_})}else l._addCallbacks(t,e,s,r,p);return s},i.prototype._length=function(){return 65535&this._bitField},i.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},i.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},i.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},i.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField,this._fireEvent("promiseFulfilled",this)},i.prototype._setRejected=function(){this._bitField=16777216|this._bitField,this._fireEvent("promiseRejected",this)},i.prototype._setFollowing=function(){this._bitField=67108864|this._bitField,this._fireEvent("promiseResolved",this)},i.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},i.prototype._isFinal=function(){return(4194304&this._bitField)>0},i.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},i.prototype._setCancelled=function(){this._bitField=65536|this._bitField,this._fireEvent("promiseCancelled",this)},i.prototype._setWillBeCancelled=function(){this._bitField=8388608|this._bitField},i.prototype._setAsyncGuaranteed=function(){v.hasCustomScheduler()||(this._bitField=134217728|this._bitField)},i.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===f?void 0:void 0===e&&this._isBound()?this._boundValue():e},i.prototype._promiseAt=function(t){return this[4*t-4+2]},i.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},i.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},i.prototype._boundValue=function(){},i.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,i=t._receiverAt(0);void 0===i&&(i=f),this._addCallbacks(e,n,r,i,null)},i.prototype._migrateCallbackAt=function(t,e){var n=t._fulfillmentHandlerAt(e),r=t._rejectionHandlerAt(e),i=t._promiseAt(e),o=t._receiverAt(e);void 0===o&&(o=f),this._addCallbacks(n,r,i,o,null)},i.prototype._addCallbacks=function(t,e,n,r,i){var o=this._length();if(o>=65531&&(o=0,this._setLength(0)),0===o)this._promise0=n,this._receiver0=r,"function"==typeof t&&(this._fulfillmentHandler0=null===i?t:h.domainBind(i,t)),"function"==typeof e&&(this._rejectionHandler0=null===i?e:h.domainBind(i,e));else{var a=4*o-4;this[a+2]=n,this[a+3]=r,"function"==typeof t&&(this[a+0]=null===i?t:h.domainBind(i,t)),"function"==typeof e&&(this[a+1]=null===i?e:h.domainBind(i,e))}return this._setLength(o+1),o},i.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},i.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(l(),!1);var n=E(t,this);if(!(n instanceof i))return this._fulfill(t);e&&this._propagateFrom(n,2);var r=n._target();if(r===this)return void this._reject(l());var o=r._bitField;if(0===(50397184&o)){var a=this._length();a>0&&r._migrateCallback0(this);for(var s=1;a>s;++s)r._migrateCallbackAt(this,s);this._setFollowing(),this._setLength(0),this._setFollowee(r)}else if(0!==(33Line truncated
|
|
||||||
-5623
File diff suppressed because it is too large.
Load diff
-31
@@ -1,31 +0,0 @@
|
|||||||
/* @preserve
|
|
||||||
* The MIT License (MIT)
|
|
||||||
*
|
|
||||||
* Copyright (c) 2013-2017 Petka Antonov
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
/**
|
|
||||||
* bluebird build version 3.5.1
|
|
||||||
* Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
|
|
||||||
*/
|
|
||||||
!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{var e;"undefined"!=typeof window?e=window:"undefined"!=typeof global?e=global:"undefined"!=typeof self&&(e=self),e.Promise=t()}}(function(){var t,e,n;return function r(t,e,n){function i(s,a){if(!e[s]){if(!t[s]){var c="function"==typeof _dereq_&&_dereq_;if(!a&&c)return c(s,!0);if(o)return o(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var u=e[s]={exports:{}};t[s][0].call(u.exports,function(e){var n=t[s][1][e];return i(n?n:e)},u,u.exports,r,t,e,n)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s<n.length;s++)i(n[s]);return i}({1:[function(t,e,n){"use strict";e.exports=function(t){function e(t){var e=new n(t),r=e.promise();return e.setHowMany(1),e.setUnwrap(),e.init(),r}var n=t._SomePromiseArray;t.any=function(t){return e(t)},t.prototype.any=function(){return e(this)}}},{}],2:[function(t,e,n){"use strict";function r(){this._customScheduler=!1,this._isTickUsed=!1,this._lateQueue=new u(16),this._normalQueue=new u(16),this._haveDrainedQueues=!1,this._trampolineEnabled=!0;var t=this;this.drainQueues=function(){t._drainQueues()},this._schedule=l}function i(t,e,n){this._lateQueue.push(t,e,n),this._queueTick()}function o(t,e,n){this._normalQueue.push(t,e,n),this._queueTick()}function s(t){this._normalQueue._pushOne(t),this._queueTick()}var a;try{throw new Error}catch(c){a=c}var l=t("./schedule"),u=t("./queue"),p=t("./util");r.prototype.setScheduler=function(t){var e=this._schedule;return this._schedule=t,this._customScheduler=!0,e},r.prototype.hasCustomScheduler=function(){return this._customScheduler},r.prototype.enableTrampoline=function(){this._trampolineEnabled=!0},r.prototype.disableTrampolineIfNecessary=function(){p.hasDevTools&&(this._trampolineEnabled=!1)},r.prototype.haveItemsQueued=function(){return this._isTickUsed||this._haveDrainedQueues},r.prototype.fatalError=function(t,e){e?(process.stderr.write("Fatal "+(t instanceof Error?t.stack:t)+"\n"),process.exit(2)):this.throwLater(t)},r.prototype.throwLater=function(t,e){if(1===arguments.length&&(e=t,t=function(){throw e}),"undefined"!=typeof setTimeout)setTimeout(function(){t(e)},0);else try{this._schedule(function(){t(e)})}catch(n){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")}},p.hasDevTools?(r.prototype.invokeLater=function(t,e,n){this._trampolineEnabled?i.call(this,t,e,n):this._schedule(function(){setTimeout(function(){t.call(e,n)},100)})},r.prototype.invoke=function(t,e,n){this._trampolineEnabled?o.call(this,t,e,n):this._schedule(function(){t.call(e,n)})},r.prototype.settlePromises=function(t){this._trampolineEnabled?s.call(this,t):this._schedule(function(){t._settlePromises()})}):(r.prototype.invokeLater=i,r.prototype.invoke=o,r.prototype.settlePromises=s),r.prototype._drainQueue=function(t){for(;t.length()>0;){var e=t.shift();if("function"==typeof e){var n=t.shift(),r=t.shift();e.call(n,r)}else e._settlePromises()}},r.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,this._drainQueue(this._lateQueue)},r.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},r.prototype._reset=function(){this._isTickUsed=!1},e.exports=r,e.exports.firstLineError=a},{"./queue":26,"./schedule":29,"./util":36}],3:[function(t,e,n){"use strict";e.exports=function(t,e,n,r){var i=!1,o=function(t,e){this._reject(e)},s=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(o,o,null,this,t)},a=function(t,e){0===(50397184&this._bitField)&&this._resolveCallback(e.target)},c=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(o){i||(i=!0,t.prototype._propagateFrom=r.propagateFromFunction(),t.prototype._boundValue=r.boundValueFunction());var l=n(o),u=new t(e);u._propagateFrom(this,1);var p=this._target();if(u._setBoundTo(l),l instanceof t){var h={promiseRejectionQueued:!1,promise:u,target:p,bindingPromise:l};p._then(e,s,void 0,u,h),l._then(a,c,void 0,u,h),u._setOnCancel(l)}else u._resolveCallback(p);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=2097152|this._bitField,this._boundTo=t):this._bitField=-2097153&this._bitField},t.prototype._isBound=function(){return 2097152===(2097152&this._bitField)},t.bind=function(e,n){return t.resolve(n).bind(e)}}},{}],4:[function(t,e,n){"use strict";function r(){try{Promise===o&&(Promise=i)}catch(t){}return o}var i;"undefined"!=typeof Promise&&(i=Promise);var o=t("./promise")();o.noConflict=r,e.exports=o},{"./promise":22}],5:[function(t,e,n){"use strict";var r=Object.create;if(r){var i=r(null),o=r(null);i[" size"]=o[" size"]=0}e.exports=function(e){function n(t,n){var r;if(null!=t&&(r=t[n]),"function"!=typeof r){var i="Object "+a.classString(t)+" has no method '"+a.toString(n)+"'";throw new e.TypeError(i)}return r}function r(Line truncated
|
|
||||||
},e.coroutine=function(t,e){if("function"!=typeof t)throw new u("generatorFunction must be a function\n\n See http://goo.gl/MqrFmX\n");var n=Object(e).yieldHandler,r=c,i=(new Error).stack;return function(){var e=t.apply(this,arguments),o=new r(void 0,void 0,n,i),s=o.promise();return o._generator=e,o._promiseFulfilled(void 0),s}},e.coroutine.addYieldHandler=function(t){if("function"!=typeof t)throw new u("expecting a function but got "+p.classString(t));_.push(t)},e.spawn=function(t){if(s.deprecated("Promise.spawn()","Promise.coroutine()"),"function"!=typeof t)return n("generatorFunction must be a function\n\n See http://goo.gl/MqrFmX\n");var r=new c(t,this),i=r.promise();return r._run(e.spawn),i}}},{"./errors":12,"./util":36}],17:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){var a=t("./util");a.canEvaluate,a.tryCatch,a.errorObj;e.join=function(){var t,e=arguments.length-1;if(e>0&&"function"==typeof arguments[e]){t=arguments[e];var r}var i=[].slice.call(arguments);t&&i.pop();var r=new n(i).promise();return void 0!==t?r.spread(t):r}}},{"./util":36}],18:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,e,n,r){this.constructor$(t),this._promise._captureStackTrace();var i=l();this._callback=null===i?e:u.domainBind(i,e),this._preservedValues=r===o?new Array(this.length()):null,this._limit=n,this._inFlight=0,this._queue=[],f.invoke(this._asyncInit,this,void 0)}function c(t,n,i,o){if("function"!=typeof n)return r("expecting a function but got "+u.classString(n));var s=0;if(void 0!==i){if("object"!=typeof i||null===i)return e.reject(new TypeError("options argument must be an object but it is "+u.classString(i)));if("number"!=typeof i.concurrency)return e.reject(new TypeError("'concurrency' must be a number but it is "+u.classString(i.concurrency)));s=i.concurrency}return s="number"==typeof s&&isFinite(s)&&s>=1?s:0,new a(t,n,s,o).promise()}var l=e._getDomain,u=t("./util"),p=u.tryCatch,h=u.errorObj,f=e._async;u.inherits(a,n),a.prototype._asyncInit=function(){this._init$(void 0,-2)},a.prototype._init=function(){},a.prototype._promiseFulfilled=function(t,n){var r=this._values,o=this.length(),a=this._preservedValues,c=this._limit;if(0>n){if(n=-1*n-1,r[n]=t,c>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return!0}else{if(c>=1&&this._inFlight>=c)return r[n]=t,this._queue.push(n),!1;null!==a&&(a[n]=t);var l=this._promise,u=this._callback,f=l._boundValue();l._pushContext();var _=p(u).call(f,t,n,o),d=l._popContext();if(s.checkForgottenReturns(_,d,null!==a?"Promise.filter":"Promise.map",l),_===h)return this._reject(_.e),!0;var v=i(_,this._promise);if(v instanceof e){v=v._target();var y=v._bitField;if(0===(50397184&y))return c>=1&&this._inFlight++,r[n]=v,v._proxy(this,-1*(n+1)),!1;if(0===(33554432&y))return 0!==(16777216&y)?(this._reject(v._reason()),!0):(this._cancel(),!0);_=v._value()}r[n]=_}var m=++this._totalResolved;return m>=o?(null!==a?this._filter(r,a):this._resolve(r),!0):!1},a.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,n=this._values;t.length>0&&this._inFlight<e;){if(this._isResolved())return;var r=t.pop();this._promiseFulfilled(n[r],r)}},a.prototype._filter=function(t,e){for(var n=e.length,r=new Array(n),i=0,o=0;n>o;++o)t[o]&&(r[i++]=e[o]);r.length=i,this._resolve(r)},a.prototype.preservedValues=function(){return this._preservedValues},e.prototype.map=function(t,e){return c(this,t,e,null)},e.map=function(t,e,n,r){return c(t,e,n,r)}}},{"./util":36}],19:[function(t,e,n){"use strict";e.exports=function(e,n,r,i,o){var s=t("./util"),a=s.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("expecting a function but got "+s.classString(t));return function(){var r=new e(n);r._captureStackTrace(),r._pushContext();var i=a(t).apply(this,arguments),s=r._popContext();return o.checkForgottenReturns(i,s,"Promise.method",r),r._resolveFromSyncValue(i),r}},e.attempt=e["try"]=function(t){if("function"!=typeof t)return i("expecting a function but got "+s.classString(t));var r=new e(n);r._captureStackTrace(),r._pushContext();var c;if(arguments.length>1){o.deprecated("calling Promise.try with more than 1 argument");var l=arguments[1],u=arguments[2];c=s.isArray(l)?a(t).apply(u,l):a(t).call(u,l)}else c=a(t)();var p=r._popContext();return o.checkForgottenReturns(c,p,"Promise.try",r),r._resolveFromSyncValue(c),r},e.prototype._resolveFromSyncValue=function(t){t===s.errorObj?this._rejectCallback(t.e,!1):this._resolveCallback(t,!0)}}},{"./util":36}],20:[function(t,e,n){"use strict";function r(t){return t instanceof Error&&u.getPrototypeOf(t)===Error.prototype}function i(t){var e;if(r(t)){e=new l(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var n=u.keys(t),i=0;i<n.length;++i){var o=n[i];p.test(o)||(e[o]=t[o])}return e}return s.markAsOriginatingFromRejection(t),t}function o(t,e){return function(n,r){if(null!==t){if(n){var o=i(a(n));t._attachExtraTrace(o),t._reject(o)}else if(e){var s=[].slice.call(arguments,1);t._fulfill(s)}eLine truncated
|
|
||||||
this._howMany=0,this._unwrap=!1,this._initialized=!1}function o(t,e){if((0|e)!==e||0>e)return r("expecting a positive integer\n\n See http://goo.gl/MqrFmX\n");var n=new i(t),o=n.promise();return n.setHowMany(e),n.init(),o}var s=t("./util"),a=t("./errors").RangeError,c=t("./errors").AggregateError,l=s.isArray,u={};s.inherits(i,n),i.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var t=l(this._values);!this._isResolved()&&t&&this._howMany>this._canPossiblyFulfill()&&this._reject(this._getRangeError(this.length()))}},i.prototype.init=function(){this._initialized=!0,this._init()},i.prototype.setUnwrap=function(){this._unwrap=!0},i.prototype.howMany=function(){return this._howMany},i.prototype.setHowMany=function(t){this._howMany=t},i.prototype._promiseFulfilled=function(t){return this._addFulfilled(t),this._fulfilled()===this.howMany()?(this._values.length=this.howMany(),1===this.howMany()&&this._unwrap?this._resolve(this._values[0]):this._resolve(this._values),!0):!1},i.prototype._promiseRejected=function(t){return this._addRejected(t),this._checkOutcome()},i.prototype._promiseCancelled=function(){return this._values instanceof e||null==this._values?this._cancel():(this._addRejected(u),this._checkOutcome())},i.prototype._checkOutcome=function(){if(this.howMany()>this._canPossiblyFulfill()){for(var t=new c,e=this.length();e<this._values.length;++e)this._values[e]!==u&&t.push(this._values[e]);return t.length>0?this._reject(t):this._cancel(),!0}return!1},i.prototype._fulfilled=function(){return this._totalResolved},i.prototype._rejected=function(){return this._values.length-this.length()},i.prototype._addRejected=function(t){this._values.push(t)},i.prototype._addFulfilled=function(t){this._values[this._totalResolved++]=t},i.prototype._canPossiblyFulfill=function(){return this.length()-this._rejected()},i.prototype._getRangeError=function(t){var e="Input array must contain at least "+this._howMany+" items but contains only "+t+" items";return new a(e)},i.prototype._resolveEmptyArray=function(){this._reject(this._getRangeError(0))},e.some=function(t,e){return o(t,e)},e.prototype.some=function(t){return o(this,t)},e._SomePromiseArray=i}},{"./errors":12,"./util":36}],32:[function(t,e,n){"use strict";e.exports=function(t){function e(t){void 0!==t?(t=t._target(),this._bitField=t._bitField,this._settledValueField=t._isFateSealed()?t._settledValue():void 0):(this._bitField=0,this._settledValueField=void 0)}e.prototype._settledValue=function(){return this._settledValueField};var n=e.prototype.value=function(){if(!this.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},r=e.prototype.error=e.prototype.reason=function(){if(!this.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/MqrFmX\n");return this._settledValue()},i=e.prototype.isFulfilled=function(){return 0!==(33554432&this._bitField)},o=e.prototype.isRejected=function(){return 0!==(16777216&this._bitField)},s=e.prototype.isPending=function(){return 0===(50397184&this._bitField)},a=e.prototype.isResolved=function(){return 0!==(50331648&this._bitField)};e.prototype.isCancelled=function(){return 0!==(8454144&this._bitField)},t.prototype.__isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype._isCancelled=function(){return this._target().__isCancelled()},t.prototype.isCancelled=function(){return 0!==(8454144&this._target()._bitField)},t.prototype.isPending=function(){return s.call(this._target())},t.prototype.isRejected=function(){return o.call(this._target())},t.prototype.isFulfilled=function(){return i.call(this._target())},t.prototype.isResolved=function(){return a.call(this._target())},t.prototype.value=function(){return n.call(this._target())},t.prototype.reason=function(){var t=this._target();return t._unsetRejectionIsUnhandled(),r.call(t)},t.prototype._value=function(){return this._settledValue()},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue()},t.PromiseInspection=e}},{}],33:[function(t,e,n){"use strict";e.exports=function(e,n){function r(t,r){if(u(t)){if(t instanceof e)return t;var i=o(t);if(i===l){r&&r._pushContext();var c=e.reject(i.e);return r&&r._popContext(),c}if("function"==typeof i){if(s(t)){var c=new e(n);return t._then(c._fulfill,c._reject,void 0,c,null),c}return a(t,i,r)}}return t}function i(t){return t.then}function o(t){try{return i(t)}catch(e){return l.e=e,l}}function s(t){try{return p.call(t,"_promise0")}catch(e){return!1}}function a(t,r,i){function o(t){a&&(a._resolveCallback(t),a=null)}function s(t){a&&(a._rejectCallback(t,p,!0),a=null)}var a=new e(n),u=a;i&&i._pushContext(),a._captureStackTrace(),i&&i._popContext();var p=!0,h=c.tryCatch(r).call(t,o,s);return p=!1,a&&h===l&&(a._rejectCallback(h.e,!0,!0),a=null),u}var c=t("./util"),l=c.errorObLine truncated
|
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise) {
|
|
||||||
var SomePromiseArray = Promise._SomePromiseArray;
|
|
||||||
function any(promises) {
|
|
||||||
var ret = new SomePromiseArray(promises);
|
|
||||||
var promise = ret.promise();
|
|
||||||
ret.setHowMany(1);
|
|
||||||
ret.setUnwrap();
|
|
||||||
ret.init();
|
|
||||||
return promise;
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.any = function (promises) {
|
|
||||||
return any(promises);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.any = function () {
|
|
||||||
return any(this);
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
-55
@@ -1,55 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = (function(){
|
|
||||||
var AssertionError = (function() {
|
|
||||||
function AssertionError(a) {
|
|
||||||
this.constructor$(a);
|
|
||||||
this.message = a;
|
|
||||||
this.name = "AssertionError";
|
|
||||||
}
|
|
||||||
AssertionError.prototype = new Error();
|
|
||||||
AssertionError.prototype.constructor = AssertionError;
|
|
||||||
AssertionError.prototype.constructor$ = Error;
|
|
||||||
return AssertionError;
|
|
||||||
})();
|
|
||||||
|
|
||||||
function getParams(args) {
|
|
||||||
var params = [];
|
|
||||||
for (var i = 0; i < args.length; ++i) params.push("arg" + i);
|
|
||||||
return params;
|
|
||||||
}
|
|
||||||
|
|
||||||
function nativeAssert(callName, args, expect) {
|
|
||||||
try {
|
|
||||||
var params = getParams(args);
|
|
||||||
var constructorArgs = params;
|
|
||||||
constructorArgs.push("return " +
|
|
||||||
callName + "("+ params.join(",") + ");");
|
|
||||||
var fn = Function.apply(null, constructorArgs);
|
|
||||||
return fn.apply(null, args);
|
|
||||||
} catch (e) {
|
|
||||||
if (!(e instanceof SyntaxError)) {
|
|
||||||
throw e;
|
|
||||||
} else {
|
|
||||||
return expect;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return function assert(boolExpr, message) {
|
|
||||||
if (boolExpr === true) return;
|
|
||||||
|
|
||||||
if (typeof boolExpr === "string" &&
|
|
||||||
boolExpr.charAt(0) === "%") {
|
|
||||||
var nativeCallName = boolExpr;
|
|
||||||
var $_len = arguments.length;var args = new Array(Math.max($_len - 2, 0)); for(var $_i = 2; $_i < $_len; ++$_i) {args[$_i - 2] = arguments[$_i];};
|
|
||||||
if (nativeAssert(nativeCallName, args, message) === message) return;
|
|
||||||
message = (nativeCallName + " !== " + message);
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret = new AssertionError(message);
|
|
||||||
if (Error.captureStackTrace) {
|
|
||||||
Error.captureStackTrace(ret, assert);
|
|
||||||
}
|
|
||||||
throw ret;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
-161
@@ -1,161 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var firstLineError;
|
|
||||||
try {throw new Error(); } catch (e) {firstLineError = e;}
|
|
||||||
var schedule = require("./schedule");
|
|
||||||
var Queue = require("./queue");
|
|
||||||
var util = require("./util");
|
|
||||||
|
|
||||||
function Async() {
|
|
||||||
this._customScheduler = false;
|
|
||||||
this._isTickUsed = false;
|
|
||||||
this._lateQueue = new Queue(16);
|
|
||||||
this._normalQueue = new Queue(16);
|
|
||||||
this._haveDrainedQueues = false;
|
|
||||||
this._trampolineEnabled = true;
|
|
||||||
var self = this;
|
|
||||||
this.drainQueues = function () {
|
|
||||||
self._drainQueues();
|
|
||||||
};
|
|
||||||
this._schedule = schedule;
|
|
||||||
}
|
|
||||||
|
|
||||||
Async.prototype.setScheduler = function(fn) {
|
|
||||||
var prev = this._schedule;
|
|
||||||
this._schedule = fn;
|
|
||||||
this._customScheduler = true;
|
|
||||||
return prev;
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype.hasCustomScheduler = function() {
|
|
||||||
return this._customScheduler;
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype.enableTrampoline = function() {
|
|
||||||
this._trampolineEnabled = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype.disableTrampolineIfNecessary = function() {
|
|
||||||
if (util.hasDevTools) {
|
|
||||||
this._trampolineEnabled = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype.haveItemsQueued = function () {
|
|
||||||
return this._isTickUsed || this._haveDrainedQueues;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Async.prototype.fatalError = function(e, isNode) {
|
|
||||||
if (isNode) {
|
|
||||||
process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e) +
|
|
||||||
"\n");
|
|
||||||
process.exit(2);
|
|
||||||
} else {
|
|
||||||
this.throwLater(e);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype.throwLater = function(fn, arg) {
|
|
||||||
if (arguments.length === 1) {
|
|
||||||
arg = fn;
|
|
||||||
fn = function () { throw arg; };
|
|
||||||
}
|
|
||||||
if (typeof setTimeout !== "undefined") {
|
|
||||||
setTimeout(function() {
|
|
||||||
fn(arg);
|
|
||||||
}, 0);
|
|
||||||
} else try {
|
|
||||||
this._schedule(function() {
|
|
||||||
fn(arg);
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function AsyncInvokeLater(fn, receiver, arg) {
|
|
||||||
this._lateQueue.push(fn, receiver, arg);
|
|
||||||
this._queueTick();
|
|
||||||
}
|
|
||||||
|
|
||||||
function AsyncInvoke(fn, receiver, arg) {
|
|
||||||
this._normalQueue.push(fn, receiver, arg);
|
|
||||||
this._queueTick();
|
|
||||||
}
|
|
||||||
|
|
||||||
function AsyncSettlePromises(promise) {
|
|
||||||
this._normalQueue._pushOne(promise);
|
|
||||||
this._queueTick();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!util.hasDevTools) {
|
|
||||||
Async.prototype.invokeLater = AsyncInvokeLater;
|
|
||||||
Async.prototype.invoke = AsyncInvoke;
|
|
||||||
Async.prototype.settlePromises = AsyncSettlePromises;
|
|
||||||
} else {
|
|
||||||
Async.prototype.invokeLater = function (fn, receiver, arg) {
|
|
||||||
if (this._trampolineEnabled) {
|
|
||||||
AsyncInvokeLater.call(this, fn, receiver, arg);
|
|
||||||
} else {
|
|
||||||
this._schedule(function() {
|
|
||||||
setTimeout(function() {
|
|
||||||
fn.call(receiver, arg);
|
|
||||||
}, 100);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype.invoke = function (fn, receiver, arg) {
|
|
||||||
if (this._trampolineEnabled) {
|
|
||||||
AsyncInvoke.call(this, fn, receiver, arg);
|
|
||||||
} else {
|
|
||||||
this._schedule(function() {
|
|
||||||
fn.call(receiver, arg);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype.settlePromises = function(promise) {
|
|
||||||
if (this._trampolineEnabled) {
|
|
||||||
AsyncSettlePromises.call(this, promise);
|
|
||||||
} else {
|
|
||||||
this._schedule(function() {
|
|
||||||
promise._settlePromises();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
Async.prototype._drainQueue = function(queue) {
|
|
||||||
while (queue.length() > 0) {
|
|
||||||
var fn = queue.shift();
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
fn._settlePromises();
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
var receiver = queue.shift();
|
|
||||||
var arg = queue.shift();
|
|
||||||
fn.call(receiver, arg);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype._drainQueues = function () {
|
|
||||||
this._drainQueue(this._normalQueue);
|
|
||||||
this._reset();
|
|
||||||
this._haveDrainedQueues = true;
|
|
||||||
this._drainQueue(this._lateQueue);
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype._queueTick = function () {
|
|
||||||
if (!this._isTickUsed) {
|
|
||||||
this._isTickUsed = true;
|
|
||||||
this._schedule(this.drainQueues);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Async.prototype._reset = function () {
|
|
||||||
this._isTickUsed = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = Async;
|
|
||||||
module.exports.firstLineError = firstLineError;
|
|
||||||
-67
@@ -1,67 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
|
|
||||||
var calledBind = false;
|
|
||||||
var rejectThis = function(_, e) {
|
|
||||||
this._reject(e);
|
|
||||||
};
|
|
||||||
|
|
||||||
var targetRejected = function(e, context) {
|
|
||||||
context.promiseRejectionQueued = true;
|
|
||||||
context.bindingPromise._then(rejectThis, rejectThis, null, this, e);
|
|
||||||
};
|
|
||||||
|
|
||||||
var bindingResolved = function(thisArg, context) {
|
|
||||||
if (((this._bitField & 50397184) === 0)) {
|
|
||||||
this._resolveCallback(context.target);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var bindingRejected = function(e, context) {
|
|
||||||
if (!context.promiseRejectionQueued) this._reject(e);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.bind = function (thisArg) {
|
|
||||||
if (!calledBind) {
|
|
||||||
calledBind = true;
|
|
||||||
Promise.prototype._propagateFrom = debug.propagateFromFunction();
|
|
||||||
Promise.prototype._boundValue = debug.boundValueFunction();
|
|
||||||
}
|
|
||||||
var maybePromise = tryConvertToPromise(thisArg);
|
|
||||||
var ret = new Promise(INTERNAL);
|
|
||||||
ret._propagateFrom(this, 1);
|
|
||||||
var target = this._target();
|
|
||||||
ret._setBoundTo(maybePromise);
|
|
||||||
if (maybePromise instanceof Promise) {
|
|
||||||
var context = {
|
|
||||||
promiseRejectionQueued: false,
|
|
||||||
promise: ret,
|
|
||||||
target: target,
|
|
||||||
bindingPromise: maybePromise
|
|
||||||
};
|
|
||||||
target._then(INTERNAL, targetRejected, undefined, ret, context);
|
|
||||||
maybePromise._then(
|
|
||||||
bindingResolved, bindingRejected, undefined, ret, context);
|
|
||||||
ret._setOnCancel(maybePromise);
|
|
||||||
} else {
|
|
||||||
ret._resolveCallback(target);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setBoundTo = function (obj) {
|
|
||||||
if (obj !== undefined) {
|
|
||||||
this._bitField = this._bitField | 2097152;
|
|
||||||
this._boundTo = obj;
|
|
||||||
} else {
|
|
||||||
this._bitField = this._bitField & (~2097152);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._isBound = function () {
|
|
||||||
return (this._bitField & 2097152) === 2097152;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.bind = function (thisArg, value) {
|
|
||||||
return Promise.resolve(value).bind(thisArg);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var old;
|
|
||||||
if (typeof Promise !== "undefined") old = Promise;
|
|
||||||
function noConflict() {
|
|
||||||
try { if (Promise === bluebird) Promise = old; }
|
|
||||||
catch (e) {}
|
|
||||||
return bluebird;
|
|
||||||
}
|
|
||||||
var bluebird = require("./promise")();
|
|
||||||
bluebird.noConflict = noConflict;
|
|
||||||
module.exports = bluebird;
|
|
||||||
-123
@@ -1,123 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var cr = Object.create;
|
|
||||||
if (cr) {
|
|
||||||
var callerCache = cr(null);
|
|
||||||
var getterCache = cr(null);
|
|
||||||
callerCache[" size"] = getterCache[" size"] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = function(Promise) {
|
|
||||||
var util = require("./util");
|
|
||||||
var canEvaluate = util.canEvaluate;
|
|
||||||
var isIdentifier = util.isIdentifier;
|
|
||||||
|
|
||||||
var getMethodCaller;
|
|
||||||
var getGetter;
|
|
||||||
if (!false) {
|
|
||||||
var makeMethodCaller = function (methodName) {
|
|
||||||
return new Function("ensureMethod", " \n\
|
|
||||||
return function(obj) { \n\
|
|
||||||
'use strict' \n\
|
|
||||||
var len = this.length; \n\
|
|
||||||
ensureMethod(obj, 'methodName'); \n\
|
|
||||||
switch(len) { \n\
|
|
||||||
case 1: return obj.methodName(this[0]); \n\
|
|
||||||
case 2: return obj.methodName(this[0], this[1]); \n\
|
|
||||||
case 3: return obj.methodName(this[0], this[1], this[2]); \n\
|
|
||||||
case 0: return obj.methodName(); \n\
|
|
||||||
default: \n\
|
|
||||||
return obj.methodName.apply(obj, this); \n\
|
|
||||||
} \n\
|
|
||||||
}; \n\
|
|
||||||
".replace(/methodName/g, methodName))(ensureMethod);
|
|
||||||
};
|
|
||||||
|
|
||||||
var makeGetter = function (propertyName) {
|
|
||||||
return new Function("obj", " \n\
|
|
||||||
'use strict'; \n\
|
|
||||||
return obj.propertyName; \n\
|
|
||||||
".replace("propertyName", propertyName));
|
|
||||||
};
|
|
||||||
|
|
||||||
var getCompiled = function(name, compiler, cache) {
|
|
||||||
var ret = cache[name];
|
|
||||||
if (typeof ret !== "function") {
|
|
||||||
if (!isIdentifier(name)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
ret = compiler(name);
|
|
||||||
cache[name] = ret;
|
|
||||||
cache[" size"]++;
|
|
||||||
if (cache[" size"] > 512) {
|
|
||||||
var keys = Object.keys(cache);
|
|
||||||
for (var i = 0; i < 256; ++i) delete cache[keys[i]];
|
|
||||||
cache[" size"] = keys.length - 256;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
getMethodCaller = function(name) {
|
|
||||||
return getCompiled(name, makeMethodCaller, callerCache);
|
|
||||||
};
|
|
||||||
|
|
||||||
getGetter = function(name) {
|
|
||||||
return getCompiled(name, makeGetter, getterCache);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function ensureMethod(obj, methodName) {
|
|
||||||
var fn;
|
|
||||||
if (obj != null) fn = obj[methodName];
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
var message = "Object " + util.classString(obj) + " has no method '" +
|
|
||||||
util.toString(methodName) + "'";
|
|
||||||
throw new Promise.TypeError(message);
|
|
||||||
}
|
|
||||||
return fn;
|
|
||||||
}
|
|
||||||
|
|
||||||
function caller(obj) {
|
|
||||||
var methodName = this.pop();
|
|
||||||
var fn = ensureMethod(obj, methodName);
|
|
||||||
return fn.apply(obj, this);
|
|
||||||
}
|
|
||||||
Promise.prototype.call = function (methodName) {
|
|
||||||
var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
|
|
||||||
if (!false) {
|
|
||||||
if (canEvaluate) {
|
|
||||||
var maybeCaller = getMethodCaller(methodName);
|
|
||||||
if (maybeCaller !== null) {
|
|
||||||
return this._then(
|
|
||||||
maybeCaller, undefined, undefined, args, undefined);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
args.push(methodName);
|
|
||||||
return this._then(caller, undefined, undefined, args, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
function namedGetter(obj) {
|
|
||||||
return obj[this];
|
|
||||||
}
|
|
||||||
function indexedGetter(obj) {
|
|
||||||
var index = +this;
|
|
||||||
if (index < 0) index = Math.max(0, index + obj.length);
|
|
||||||
return obj[index];
|
|
||||||
}
|
|
||||||
Promise.prototype.get = function (propertyName) {
|
|
||||||
var isIndex = (typeof propertyName === "number");
|
|
||||||
var getter;
|
|
||||||
if (!isIndex) {
|
|
||||||
if (canEvaluate) {
|
|
||||||
var maybeGetter = getGetter(propertyName);
|
|
||||||
getter = maybeGetter !== null ? maybeGetter : namedGetter;
|
|
||||||
} else {
|
|
||||||
getter = namedGetter;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
getter = indexedGetter;
|
|
||||||
}
|
|
||||||
return this._then(getter, undefined, undefined, propertyName, undefined);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-129
@@ -1,129 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, PromiseArray, apiRejection, debug) {
|
|
||||||
var util = require("./util");
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
var async = Promise._async;
|
|
||||||
|
|
||||||
Promise.prototype["break"] = Promise.prototype.cancel = function() {
|
|
||||||
if (!debug.cancellation()) return this._warn("cancellation is disabled");
|
|
||||||
|
|
||||||
var promise = this;
|
|
||||||
var child = promise;
|
|
||||||
while (promise._isCancellable()) {
|
|
||||||
if (!promise._cancelBy(child)) {
|
|
||||||
if (child._isFollowing()) {
|
|
||||||
child._followee().cancel();
|
|
||||||
} else {
|
|
||||||
child._cancelBranched();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
var parent = promise._cancellationParent;
|
|
||||||
if (parent == null || !parent._isCancellable()) {
|
|
||||||
if (promise._isFollowing()) {
|
|
||||||
promise._followee().cancel();
|
|
||||||
} else {
|
|
||||||
promise._cancelBranched();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
if (promise._isFollowing()) promise._followee().cancel();
|
|
||||||
promise._setWillBeCancelled();
|
|
||||||
child = promise;
|
|
||||||
promise = parent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._branchHasCancelled = function() {
|
|
||||||
this._branchesRemainingToCancel--;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._enoughBranchesHaveCancelled = function() {
|
|
||||||
return this._branchesRemainingToCancel === undefined ||
|
|
||||||
this._branchesRemainingToCancel <= 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._cancelBy = function(canceller) {
|
|
||||||
if (canceller === this) {
|
|
||||||
this._branchesRemainingToCancel = 0;
|
|
||||||
this._invokeOnCancel();
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
this._branchHasCancelled();
|
|
||||||
if (this._enoughBranchesHaveCancelled()) {
|
|
||||||
this._invokeOnCancel();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._cancelBranched = function() {
|
|
||||||
if (this._enoughBranchesHaveCancelled()) {
|
|
||||||
this._cancel();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._cancel = function() {
|
|
||||||
if (!this._isCancellable()) return;
|
|
||||||
this._setCancelled();
|
|
||||||
async.invoke(this._cancelPromises, this, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._cancelPromises = function() {
|
|
||||||
if (this._length() > 0) this._settlePromises();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._unsetOnCancel = function() {
|
|
||||||
this._onCancelField = undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._isCancellable = function() {
|
|
||||||
return this.isPending() && !this._isCancelled();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.isCancellable = function() {
|
|
||||||
return this.isPending() && !this.isCancelled();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._doInvokeOnCancel = function(onCancelCallback, internalOnly) {
|
|
||||||
if (util.isArray(onCancelCallback)) {
|
|
||||||
for (var i = 0; i < onCancelCallback.length; ++i) {
|
|
||||||
this._doInvokeOnCancel(onCancelCallback[i], internalOnly);
|
|
||||||
}
|
|
||||||
} else if (onCancelCallback !== undefined) {
|
|
||||||
if (typeof onCancelCallback === "function") {
|
|
||||||
if (!internalOnly) {
|
|
||||||
var e = tryCatch(onCancelCallback).call(this._boundValue());
|
|
||||||
if (e === errorObj) {
|
|
||||||
this._attachExtraTrace(e.e);
|
|
||||||
async.throwLater(e.e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
onCancelCallback._resultCancelled(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._invokeOnCancel = function() {
|
|
||||||
var onCancelCallback = this._onCancel();
|
|
||||||
this._unsetOnCancel();
|
|
||||||
async.invoke(this._doInvokeOnCancel, this, onCancelCallback);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._invokeInternalOnCancel = function() {
|
|
||||||
if (this._isCancellable()) {
|
|
||||||
this._doInvokeOnCancel(this._onCancel(), true);
|
|
||||||
this._unsetOnCancel();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._resultCancelled = function() {
|
|
||||||
this.cancel();
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
-42
@@ -1,42 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(NEXT_FILTER) {
|
|
||||||
var util = require("./util");
|
|
||||||
var getKeys = require("./es5").keys;
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
|
|
||||||
function catchFilter(instances, cb, promise) {
|
|
||||||
return function(e) {
|
|
||||||
var boundTo = promise._boundValue();
|
|
||||||
predicateLoop: for (var i = 0; i < instances.length; ++i) {
|
|
||||||
var item = instances[i];
|
|
||||||
|
|
||||||
if (item === Error ||
|
|
||||||
(item != null && item.prototype instanceof Error)) {
|
|
||||||
if (e instanceof item) {
|
|
||||||
return tryCatch(cb).call(boundTo, e);
|
|
||||||
}
|
|
||||||
} else if (typeof item === "function") {
|
|
||||||
var matchesPredicate = tryCatch(item).call(boundTo, e);
|
|
||||||
if (matchesPredicate === errorObj) {
|
|
||||||
return matchesPredicate;
|
|
||||||
} else if (matchesPredicate) {
|
|
||||||
return tryCatch(cb).call(boundTo, e);
|
|
||||||
}
|
|
||||||
} else if (util.isObject(e)) {
|
|
||||||
var keys = getKeys(item);
|
|
||||||
for (var j = 0; j < keys.length; ++j) {
|
|
||||||
var key = keys[j];
|
|
||||||
if (item[key] != e[key]) {
|
|
||||||
continue predicateLoop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return tryCatch(cb).call(boundTo, e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NEXT_FILTER;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return catchFilter;
|
|
||||||
};
|
|
||||||
-69
@@ -1,69 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise) {
|
|
||||||
var longStackTraces = false;
|
|
||||||
var contextStack = [];
|
|
||||||
|
|
||||||
Promise.prototype._promiseCreated = function() {};
|
|
||||||
Promise.prototype._pushContext = function() {};
|
|
||||||
Promise.prototype._popContext = function() {return null;};
|
|
||||||
Promise._peekContext = Promise.prototype._peekContext = function() {};
|
|
||||||
|
|
||||||
function Context() {
|
|
||||||
this._trace = new Context.CapturedTrace(peekContext());
|
|
||||||
}
|
|
||||||
Context.prototype._pushContext = function () {
|
|
||||||
if (this._trace !== undefined) {
|
|
||||||
this._trace._promiseCreated = null;
|
|
||||||
contextStack.push(this._trace);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Context.prototype._popContext = function () {
|
|
||||||
if (this._trace !== undefined) {
|
|
||||||
var trace = contextStack.pop();
|
|
||||||
var ret = trace._promiseCreated;
|
|
||||||
trace._promiseCreated = null;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
function createContext() {
|
|
||||||
if (longStackTraces) return new Context();
|
|
||||||
}
|
|
||||||
|
|
||||||
function peekContext() {
|
|
||||||
var lastIndex = contextStack.length - 1;
|
|
||||||
if (lastIndex >= 0) {
|
|
||||||
return contextStack[lastIndex];
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
Context.CapturedTrace = null;
|
|
||||||
Context.create = createContext;
|
|
||||||
Context.deactivateLongStackTraces = function() {};
|
|
||||||
Context.activateLongStackTraces = function() {
|
|
||||||
var Promise_pushContext = Promise.prototype._pushContext;
|
|
||||||
var Promise_popContext = Promise.prototype._popContext;
|
|
||||||
var Promise_PeekContext = Promise._peekContext;
|
|
||||||
var Promise_peekContext = Promise.prototype._peekContext;
|
|
||||||
var Promise_promiseCreated = Promise.prototype._promiseCreated;
|
|
||||||
Context.deactivateLongStackTraces = function() {
|
|
||||||
Promise.prototype._pushContext = Promise_pushContext;
|
|
||||||
Promise.prototype._popContext = Promise_popContext;
|
|
||||||
Promise._peekContext = Promise_PeekContext;
|
|
||||||
Promise.prototype._peekContext = Promise_peekContext;
|
|
||||||
Promise.prototype._promiseCreated = Promise_promiseCreated;
|
|
||||||
longStackTraces = false;
|
|
||||||
};
|
|
||||||
longStackTraces = true;
|
|
||||||
Promise.prototype._pushContext = Context.prototype._pushContext;
|
|
||||||
Promise.prototype._popContext = Context.prototype._popContext;
|
|
||||||
Promise._peekContext = Promise.prototype._peekContext = peekContext;
|
|
||||||
Promise.prototype._promiseCreated = function() {
|
|
||||||
var ctx = this._peekContext();
|
|
||||||
if (ctx && ctx._promiseCreated == null) ctx._promiseCreated = this;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
return Context;
|
|
||||||
};
|
|
||||||
-919
@@ -1,919 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, Context) {
|
|
||||||
var getDomain = Promise._getDomain;
|
|
||||||
var async = Promise._async;
|
|
||||||
var Warning = require("./errors").Warning;
|
|
||||||
var util = require("./util");
|
|
||||||
var canAttachTrace = util.canAttachTrace;
|
|
||||||
var unhandledRejectionHandled;
|
|
||||||
var possiblyUnhandledRejection;
|
|
||||||
var bluebirdFramePattern =
|
|
||||||
/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
|
|
||||||
var nodeFramePattern = /\((?:timers\.js):\d+:\d+\)/;
|
|
||||||
var parseLinePattern = /[\/<\(](.+?):(\d+):(\d+)\)?\s*$/;
|
|
||||||
var stackFramePattern = null;
|
|
||||||
var formatStack = null;
|
|
||||||
var indentStackFrames = false;
|
|
||||||
var printWarning;
|
|
||||||
var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
|
|
||||||
(false ||
|
|
||||||
util.env("BLUEBIRD_DEBUG") ||
|
|
||||||
util.env("NODE_ENV") === "development"));
|
|
||||||
|
|
||||||
var warnings = !!(util.env("BLUEBIRD_WARNINGS") != 0 &&
|
|
||||||
(debugging || util.env("BLUEBIRD_WARNINGS")));
|
|
||||||
|
|
||||||
var longStackTraces = !!(util.env("BLUEBIRD_LONG_STACK_TRACES") != 0 &&
|
|
||||||
(debugging || util.env("BLUEBIRD_LONG_STACK_TRACES")));
|
|
||||||
|
|
||||||
var wForgottenReturn = util.env("BLUEBIRD_W_FORGOTTEN_RETURN") != 0 &&
|
|
||||||
(warnings || !!util.env("BLUEBIRD_W_FORGOTTEN_RETURN"));
|
|
||||||
|
|
||||||
Promise.prototype.suppressUnhandledRejections = function() {
|
|
||||||
var target = this._target();
|
|
||||||
target._bitField = ((target._bitField & (~1048576)) |
|
|
||||||
524288);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._ensurePossibleRejectionHandled = function () {
|
|
||||||
if ((this._bitField & 524288) !== 0) return;
|
|
||||||
this._setRejectionIsUnhandled();
|
|
||||||
var self = this;
|
|
||||||
setTimeout(function() {
|
|
||||||
self._notifyUnhandledRejection();
|
|
||||||
}, 1);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
|
|
||||||
fireRejectionEvent("rejectionHandled",
|
|
||||||
unhandledRejectionHandled, undefined, this);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setReturnedNonUndefined = function() {
|
|
||||||
this._bitField = this._bitField | 268435456;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._returnedNonUndefined = function() {
|
|
||||||
return (this._bitField & 268435456) !== 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._notifyUnhandledRejection = function () {
|
|
||||||
if (this._isRejectionUnhandled()) {
|
|
||||||
var reason = this._settledValue();
|
|
||||||
this._setUnhandledRejectionIsNotified();
|
|
||||||
fireRejectionEvent("unhandledRejection",
|
|
||||||
possiblyUnhandledRejection, reason, this);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setUnhandledRejectionIsNotified = function () {
|
|
||||||
this._bitField = this._bitField | 262144;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
|
|
||||||
this._bitField = this._bitField & (~262144);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._isUnhandledRejectionNotified = function () {
|
|
||||||
return (this._bitField & 262144) > 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setRejectionIsUnhandled = function () {
|
|
||||||
this._bitField = this._bitField | 1048576;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._unsetRejectionIsUnhandled = function () {
|
|
||||||
this._bitField = this._bitField & (~1048576);
|
|
||||||
if (this._isUnhandledRejectionNotified()) {
|
|
||||||
this._unsetUnhandledRejectionIsNotified();
|
|
||||||
this._notifyUnhandledRejectionIsHandled();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._isRejectionUnhandled = function () {
|
|
||||||
return (this._bitField & 1048576) > 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._warn = function(message, shouldUseOwnTrace, promise) {
|
|
||||||
return warn(message, shouldUseOwnTrace, promise || this);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.onPossiblyUnhandledRejection = function (fn) {
|
|
||||||
var domain = getDomain();
|
|
||||||
possiblyUnhandledRejection =
|
|
||||||
typeof fn === "function" ? (domain === null ?
|
|
||||||
fn : util.domainBind(domain, fn))
|
|
||||||
: undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.onUnhandledRejectionHandled = function (fn) {
|
|
||||||
var domain = getDomain();
|
|
||||||
unhandledRejectionHandled =
|
|
||||||
typeof fn === "function" ? (domain === null ?
|
|
||||||
fn : util.domainBind(domain, fn))
|
|
||||||
: undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
var disableLongStackTraces = function() {};
|
|
||||||
Promise.longStackTraces = function () {
|
|
||||||
if (async.haveItemsQueued() && !config.longStackTraces) {
|
|
||||||
throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
if (!config.longStackTraces && longStackTracesIsSupported()) {
|
|
||||||
var Promise_captureStackTrace = Promise.prototype._captureStackTrace;
|
|
||||||
var Promise_attachExtraTrace = Promise.prototype._attachExtraTrace;
|
|
||||||
config.longStackTraces = true;
|
|
||||||
disableLongStackTraces = function() {
|
|
||||||
if (async.haveItemsQueued() && !config.longStackTraces) {
|
|
||||||
throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
Promise.prototype._captureStackTrace = Promise_captureStackTrace;
|
|
||||||
Promise.prototype._attachExtraTrace = Promise_attachExtraTrace;
|
|
||||||
Context.deactivateLongStackTraces();
|
|
||||||
async.enableTrampoline();
|
|
||||||
config.longStackTraces = false;
|
|
||||||
};
|
|
||||||
Promise.prototype._captureStackTrace = longStackTracesCaptureStackTrace;
|
|
||||||
Promise.prototype._attachExtraTrace = longStackTracesAttachExtraTrace;
|
|
||||||
Context.activateLongStackTraces();
|
|
||||||
async.disableTrampolineIfNecessary();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.hasLongStackTraces = function () {
|
|
||||||
return config.longStackTraces && longStackTracesIsSupported();
|
|
||||||
};
|
|
||||||
|
|
||||||
var fireDomEvent = (function() {
|
|
||||||
try {
|
|
||||||
if (typeof CustomEvent === "function") {
|
|
||||||
var event = new CustomEvent("CustomEvent");
|
|
||||||
util.global.dispatchEvent(event);
|
|
||||||
return function(name, event) {
|
|
||||||
var domEvent = new CustomEvent(name.toLowerCase(), {
|
|
||||||
detail: event,
|
|
||||||
cancelable: true
|
|
||||||
});
|
|
||||||
return !util.global.dispatchEvent(domEvent);
|
|
||||||
};
|
|
||||||
} else if (typeof Event === "function") {
|
|
||||||
var event = new Event("CustomEvent");
|
|
||||||
util.global.dispatchEvent(event);
|
|
||||||
return function(name, event) {
|
|
||||||
var domEvent = new Event(name.toLowerCase(), {
|
|
||||||
cancelable: true
|
|
||||||
});
|
|
||||||
domEvent.detail = event;
|
|
||||||
return !util.global.dispatchEvent(domEvent);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
var event = document.createEvent("CustomEvent");
|
|
||||||
event.initCustomEvent("testingtheevent", false, true, {});
|
|
||||||
util.global.dispatchEvent(event);
|
|
||||||
return function(name, event) {
|
|
||||||
var domEvent = document.createEvent("CustomEvent");
|
|
||||||
domEvent.initCustomEvent(name.toLowerCase(), false, true,
|
|
||||||
event);
|
|
||||||
return !util.global.dispatchEvent(domEvent);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
} catch (e) {}
|
|
||||||
return function() {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
var fireGlobalEvent = (function() {
|
|
||||||
if (util.isNode) {
|
|
||||||
return function() {
|
|
||||||
return process.emit.apply(process, arguments);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
if (!util.global) {
|
|
||||||
return function() {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
return function(name) {
|
|
||||||
var methodName = "on" + name.toLowerCase();
|
|
||||||
var method = util.global[methodName];
|
|
||||||
if (!method) return false;
|
|
||||||
method.apply(util.global, [].slice.call(arguments, 1));
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
|
|
||||||
function generatePromiseLifecycleEventObject(name, promise) {
|
|
||||||
return {promise: promise};
|
|
||||||
}
|
|
||||||
|
|
||||||
var eventToObjectGenerator = {
|
|
||||||
promiseCreated: generatePromiseLifecycleEventObject,
|
|
||||||
promiseFulfilled: generatePromiseLifecycleEventObject,
|
|
||||||
promiseRejected: generatePromiseLifecycleEventObject,
|
|
||||||
promiseResolved: generatePromiseLifecycleEventObject,
|
|
||||||
promiseCancelled: generatePromiseLifecycleEventObject,
|
|
||||||
promiseChained: function(name, promise, child) {
|
|
||||||
return {promise: promise, child: child};
|
|
||||||
},
|
|
||||||
warning: function(name, warning) {
|
|
||||||
return {warning: warning};
|
|
||||||
},
|
|
||||||
unhandledRejection: function (name, reason, promise) {
|
|
||||||
return {reason: reason, promise: promise};
|
|
||||||
},
|
|
||||||
rejectionHandled: generatePromiseLifecycleEventObject
|
|
||||||
};
|
|
||||||
|
|
||||||
var activeFireEvent = function (name) {
|
|
||||||
var globalEventFired = false;
|
|
||||||
try {
|
|
||||||
globalEventFired = fireGlobalEvent.apply(null, arguments);
|
|
||||||
} catch (e) {
|
|
||||||
async.throwLater(e);
|
|
||||||
globalEventFired = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var domEventFired = false;
|
|
||||||
try {
|
|
||||||
domEventFired = fireDomEvent(name,
|
|
||||||
eventToObjectGenerator[name].apply(null, arguments));
|
|
||||||
} catch (e) {
|
|
||||||
async.throwLater(e);
|
|
||||||
domEventFired = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return domEventFired || globalEventFired;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.config = function(opts) {
|
|
||||||
opts = Object(opts);
|
|
||||||
if ("longStackTraces" in opts) {
|
|
||||||
if (opts.longStackTraces) {
|
|
||||||
Promise.longStackTraces();
|
|
||||||
} else if (!opts.longStackTraces && Promise.hasLongStackTraces()) {
|
|
||||||
disableLongStackTraces();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ("warnings" in opts) {
|
|
||||||
var warningsOption = opts.warnings;
|
|
||||||
config.warnings = !!warningsOption;
|
|
||||||
wForgottenReturn = config.warnings;
|
|
||||||
|
|
||||||
if (util.isObject(warningsOption)) {
|
|
||||||
if ("wForgottenReturn" in warningsOption) {
|
|
||||||
wForgottenReturn = !!warningsOption.wForgottenReturn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if ("cancellation" in opts && opts.cancellation && !config.cancellation) {
|
|
||||||
if (async.haveItemsQueued()) {
|
|
||||||
throw new Error(
|
|
||||||
"cannot enable cancellation after promises are in use");
|
|
||||||
}
|
|
||||||
Promise.prototype._clearCancellationData =
|
|
||||||
cancellationClearCancellationData;
|
|
||||||
Promise.prototype._propagateFrom = cancellationPropagateFrom;
|
|
||||||
Promise.prototype._onCancel = cancellationOnCancel;
|
|
||||||
Promise.prototype._setOnCancel = cancellationSetOnCancel;
|
|
||||||
Promise.prototype._attachCancellationCallback =
|
|
||||||
cancellationAttachCancellationCallback;
|
|
||||||
Promise.prototype._execute = cancellationExecute;
|
|
||||||
propagateFromFunction = cancellationPropagateFrom;
|
|
||||||
config.cancellation = true;
|
|
||||||
}
|
|
||||||
if ("monitoring" in opts) {
|
|
||||||
if (opts.monitoring && !config.monitoring) {
|
|
||||||
config.monitoring = true;
|
|
||||||
Promise.prototype._fireEvent = activeFireEvent;
|
|
||||||
} else if (!opts.monitoring && config.monitoring) {
|
|
||||||
config.monitoring = false;
|
|
||||||
Promise.prototype._fireEvent = defaultFireEvent;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
function defaultFireEvent() { return false; }
|
|
||||||
|
|
||||||
Promise.prototype._fireEvent = defaultFireEvent;
|
|
||||||
Promise.prototype._execute = function(executor, resolve, reject) {
|
|
||||||
try {
|
|
||||||
executor(resolve, reject);
|
|
||||||
} catch (e) {
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
Promise.prototype._onCancel = function () {};
|
|
||||||
Promise.prototype._setOnCancel = function (handler) { ; };
|
|
||||||
Promise.prototype._attachCancellationCallback = function(onCancel) {
|
|
||||||
;
|
|
||||||
};
|
|
||||||
Promise.prototype._captureStackTrace = function () {};
|
|
||||||
Promise.prototype._attachExtraTrace = function () {};
|
|
||||||
Promise.prototype._clearCancellationData = function() {};
|
|
||||||
Promise.prototype._propagateFrom = function (parent, flags) {
|
|
||||||
;
|
|
||||||
;
|
|
||||||
};
|
|
||||||
|
|
||||||
function cancellationExecute(executor, resolve, reject) {
|
|
||||||
var promise = this;
|
|
||||||
try {
|
|
||||||
executor(resolve, reject, function(onCancel) {
|
|
||||||
if (typeof onCancel !== "function") {
|
|
||||||
throw new TypeError("onCancel must be a function, got: " +
|
|
||||||
util.toString(onCancel));
|
|
||||||
}
|
|
||||||
promise._attachCancellationCallback(onCancel);
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancellationAttachCancellationCallback(onCancel) {
|
|
||||||
if (!this._isCancellable()) return this;
|
|
||||||
|
|
||||||
var previousOnCancel = this._onCancel();
|
|
||||||
if (previousOnCancel !== undefined) {
|
|
||||||
if (util.isArray(previousOnCancel)) {
|
|
||||||
previousOnCancel.push(onCancel);
|
|
||||||
} else {
|
|
||||||
this._setOnCancel([previousOnCancel, onCancel]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this._setOnCancel(onCancel);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancellationOnCancel() {
|
|
||||||
return this._onCancelField;
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancellationSetOnCancel(onCancel) {
|
|
||||||
this._onCancelField = onCancel;
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancellationClearCancellationData() {
|
|
||||||
this._cancellationParent = undefined;
|
|
||||||
this._onCancelField = undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
function cancellationPropagateFrom(parent, flags) {
|
|
||||||
if ((flags & 1) !== 0) {
|
|
||||||
this._cancellationParent = parent;
|
|
||||||
var branchesRemainingToCancel = parent._branchesRemainingToCancel;
|
|
||||||
if (branchesRemainingToCancel === undefined) {
|
|
||||||
branchesRemainingToCancel = 0;
|
|
||||||
}
|
|
||||||
parent._branchesRemainingToCancel = branchesRemainingToCancel + 1;
|
|
||||||
}
|
|
||||||
if ((flags & 2) !== 0 && parent._isBound()) {
|
|
||||||
this._setBoundTo(parent._boundTo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function bindingPropagateFrom(parent, flags) {
|
|
||||||
if ((flags & 2) !== 0 && parent._isBound()) {
|
|
||||||
this._setBoundTo(parent._boundTo);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var propagateFromFunction = bindingPropagateFrom;
|
|
||||||
|
|
||||||
function boundValueFunction() {
|
|
||||||
var ret = this._boundTo;
|
|
||||||
if (ret !== undefined) {
|
|
||||||
if (ret instanceof Promise) {
|
|
||||||
if (ret.isFulfilled()) {
|
|
||||||
return ret.value();
|
|
||||||
} else {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function longStackTracesCaptureStackTrace() {
|
|
||||||
this._trace = new CapturedTrace(this._peekContext());
|
|
||||||
}
|
|
||||||
|
|
||||||
function longStackTracesAttachExtraTrace(error, ignoreSelf) {
|
|
||||||
if (canAttachTrace(error)) {
|
|
||||||
var trace = this._trace;
|
|
||||||
if (trace !== undefined) {
|
|
||||||
if (ignoreSelf) trace = trace._parent;
|
|
||||||
}
|
|
||||||
if (trace !== undefined) {
|
|
||||||
trace.attachExtraTrace(error);
|
|
||||||
} else if (!error.__stackCleaned__) {
|
|
||||||
var parsed = parseStackAndMessage(error);
|
|
||||||
util.notEnumerableProp(error, "stack",
|
|
||||||
parsed.message + "\n" + parsed.stack.join("\n"));
|
|
||||||
util.notEnumerableProp(error, "__stackCleaned__", true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function checkForgottenReturns(returnValue, promiseCreated, name, promise,
|
|
||||||
parent) {
|
|
||||||
if (returnValue === undefined && promiseCreated !== null &&
|
|
||||||
wForgottenReturn) {
|
|
||||||
if (parent !== undefined && parent._returnedNonUndefined()) return;
|
|
||||||
if ((promise._bitField & 65535) === 0) return;
|
|
||||||
|
|
||||||
if (name) name = name + " ";
|
|
||||||
var handlerLine = "";
|
|
||||||
var creatorLine = "";
|
|
||||||
if (promiseCreated._trace) {
|
|
||||||
var traceLines = promiseCreated._trace.stack.split("\n");
|
|
||||||
var stack = cleanStack(traceLines);
|
|
||||||
for (var i = stack.length - 1; i >= 0; --i) {
|
|
||||||
var line = stack[i];
|
|
||||||
if (!nodeFramePattern.test(line)) {
|
|
||||||
var lineMatches = line.match(parseLinePattern);
|
|
||||||
if (lineMatches) {
|
|
||||||
handlerLine = "at " + lineMatches[1] +
|
|
||||||
":" + lineMatches[2] + ":" + lineMatches[3] + " ";
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (stack.length > 0) {
|
|
||||||
var firstUserLine = stack[0];
|
|
||||||
for (var i = 0; i < traceLines.length; ++i) {
|
|
||||||
|
|
||||||
if (traceLines[i] === firstUserLine) {
|
|
||||||
if (i > 0) {
|
|
||||||
creatorLine = "\n" + traceLines[i - 1];
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var msg = "a promise was created in a " + name +
|
|
||||||
"handler " + handlerLine + "but was not returned from it, " +
|
|
||||||
"see http://goo.gl/rRqMUw" +
|
|
||||||
creatorLine;
|
|
||||||
promise._warn(msg, true, promiseCreated);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function deprecated(name, replacement) {
|
|
||||||
var message = name +
|
|
||||||
" is deprecated and will be removed in a future version.";
|
|
||||||
if (replacement) message += " Use " + replacement + " instead.";
|
|
||||||
return warn(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
function warn(message, shouldUseOwnTrace, promise) {
|
|
||||||
if (!config.warnings) return;
|
|
||||||
var warning = new Warning(message);
|
|
||||||
var ctx;
|
|
||||||
if (shouldUseOwnTrace) {
|
|
||||||
promise._attachExtraTrace(warning);
|
|
||||||
} else if (config.longStackTraces && (ctx = Promise._peekContext())) {
|
|
||||||
ctx.attachExtraTrace(warning);
|
|
||||||
} else {
|
|
||||||
var parsed = parseStackAndMessage(warning);
|
|
||||||
warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!activeFireEvent("warning", warning)) {
|
|
||||||
formatAndLogError(warning, "", true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function reconstructStack(message, stacks) {
|
|
||||||
for (var i = 0; i < stacks.length - 1; ++i) {
|
|
||||||
stacks[i].push("From previous event:");
|
|
||||||
stacks[i] = stacks[i].join("\n");
|
|
||||||
}
|
|
||||||
if (i < stacks.length) {
|
|
||||||
stacks[i] = stacks[i].join("\n");
|
|
||||||
}
|
|
||||||
return message + "\n" + stacks.join("\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeDuplicateOrEmptyJumps(stacks) {
|
|
||||||
for (var i = 0; i < stacks.length; ++i) {
|
|
||||||
if (stacks[i].length === 0 ||
|
|
||||||
((i + 1 < stacks.length) && stacks[i][0] === stacks[i+1][0])) {
|
|
||||||
stacks.splice(i, 1);
|
|
||||||
i--;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeCommonRoots(stacks) {
|
|
||||||
var current = stacks[0];
|
|
||||||
for (var i = 1; i < stacks.length; ++i) {
|
|
||||||
var prev = stacks[i];
|
|
||||||
var currentLastIndex = current.length - 1;
|
|
||||||
var currentLastLine = current[currentLastIndex];
|
|
||||||
var commonRootMeetPoint = -1;
|
|
||||||
|
|
||||||
for (var j = prev.length - 1; j >= 0; --j) {
|
|
||||||
if (prev[j] === currentLastLine) {
|
|
||||||
commonRootMeetPoint = j;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var j = commonRootMeetPoint; j >= 0; --j) {
|
|
||||||
var line = prev[j];
|
|
||||||
if (current[currentLastIndex] === line) {
|
|
||||||
current.pop();
|
|
||||||
currentLastIndex--;
|
|
||||||
} else {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
current = prev;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function cleanStack(stack) {
|
|
||||||
var ret = [];
|
|
||||||
for (var i = 0; i < stack.length; ++i) {
|
|
||||||
var line = stack[i];
|
|
||||||
var isTraceLine = " (No stack trace)" === line ||
|
|
||||||
stackFramePattern.test(line);
|
|
||||||
var isInternalFrame = isTraceLine && shouldIgnore(line);
|
|
||||||
if (isTraceLine && !isInternalFrame) {
|
|
||||||
if (indentStackFrames && line.charAt(0) !== " ") {
|
|
||||||
line = " " + line;
|
|
||||||
}
|
|
||||||
ret.push(line);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function stackFramesAsArray(error) {
|
|
||||||
var stack = error.stack.replace(/\s+$/g, "").split("\n");
|
|
||||||
for (var i = 0; i < stack.length; ++i) {
|
|
||||||
var line = stack[i];
|
|
||||||
if (" (No stack trace)" === line || stackFramePattern.test(line)) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (i > 0 && error.name != "SyntaxError") {
|
|
||||||
stack = stack.slice(i);
|
|
||||||
}
|
|
||||||
return stack;
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseStackAndMessage(error) {
|
|
||||||
var stack = error.stack;
|
|
||||||
var message = error.toString();
|
|
||||||
stack = typeof stack === "string" && stack.length > 0
|
|
||||||
? stackFramesAsArray(error) : [" (No stack trace)"];
|
|
||||||
return {
|
|
||||||
message: message,
|
|
||||||
stack: error.name == "SyntaxError" ? stack : cleanStack(stack)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatAndLogError(error, title, isSoft) {
|
|
||||||
if (typeof console !== "undefined") {
|
|
||||||
var message;
|
|
||||||
if (util.isObject(error)) {
|
|
||||||
var stack = error.stack;
|
|
||||||
message = title + formatStack(stack, error);
|
|
||||||
} else {
|
|
||||||
message = title + String(error);
|
|
||||||
}
|
|
||||||
if (typeof printWarning === "function") {
|
|
||||||
printWarning(message, isSoft);
|
|
||||||
} else if (typeof console.log === "function" ||
|
|
||||||
typeof console.log === "object") {
|
|
||||||
console.log(message);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function fireRejectionEvent(name, localHandler, reason, promise) {
|
|
||||||
var localEventFired = false;
|
|
||||||
try {
|
|
||||||
if (typeof localHandler === "function") {
|
|
||||||
localEventFired = true;
|
|
||||||
if (name === "rejectionHandled") {
|
|
||||||
localHandler(promise);
|
|
||||||
} else {
|
|
||||||
localHandler(reason, promise);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
async.throwLater(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (name === "unhandledRejection") {
|
|
||||||
if (!activeFireEvent(name, reason, promise) && !localEventFired) {
|
|
||||||
formatAndLogError(reason, "Unhandled rejection ");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
activeFireEvent(name, promise);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function formatNonError(obj) {
|
|
||||||
var str;
|
|
||||||
if (typeof obj === "function") {
|
|
||||||
str = "[function " +
|
|
||||||
(obj.name || "anonymous") +
|
|
||||||
"]";
|
|
||||||
} else {
|
|
||||||
str = obj && typeof obj.toString === "function"
|
|
||||||
? obj.toString() : util.toString(obj);
|
|
||||||
var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
|
|
||||||
if (ruselessToString.test(str)) {
|
|
||||||
try {
|
|
||||||
var newStr = JSON.stringify(obj);
|
|
||||||
str = newStr;
|
|
||||||
}
|
|
||||||
catch(e) {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (str.length === 0) {
|
|
||||||
str = "(empty array)";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ("(<" + snip(str) + ">, no stack trace)");
|
|
||||||
}
|
|
||||||
|
|
||||||
function snip(str) {
|
|
||||||
var maxChars = 41;
|
|
||||||
if (str.length < maxChars) {
|
|
||||||
return str;
|
|
||||||
}
|
|
||||||
return str.substr(0, maxChars - 3) + "...";
|
|
||||||
}
|
|
||||||
|
|
||||||
function longStackTracesIsSupported() {
|
|
||||||
return typeof captureStackTrace === "function";
|
|
||||||
}
|
|
||||||
|
|
||||||
var shouldIgnore = function() { return false; };
|
|
||||||
var parseLineInfoRegex = /[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;
|
|
||||||
function parseLineInfo(line) {
|
|
||||||
var matches = line.match(parseLineInfoRegex);
|
|
||||||
if (matches) {
|
|
||||||
return {
|
|
||||||
fileName: matches[1],
|
|
||||||
line: parseInt(matches[2], 10)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function setBounds(firstLineError, lastLineError) {
|
|
||||||
if (!longStackTracesIsSupported()) return;
|
|
||||||
var firstStackLines = firstLineError.stack.split("\n");
|
|
||||||
var lastStackLines = lastLineError.stack.split("\n");
|
|
||||||
var firstIndex = -1;
|
|
||||||
var lastIndex = -1;
|
|
||||||
var firstFileName;
|
|
||||||
var lastFileName;
|
|
||||||
for (var i = 0; i < firstStackLines.length; ++i) {
|
|
||||||
var result = parseLineInfo(firstStackLines[i]);
|
|
||||||
if (result) {
|
|
||||||
firstFileName = result.fileName;
|
|
||||||
firstIndex = result.line;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (var i = 0; i < lastStackLines.length; ++i) {
|
|
||||||
var result = parseLineInfo(lastStackLines[i]);
|
|
||||||
if (result) {
|
|
||||||
lastFileName = result.fileName;
|
|
||||||
lastIndex = result.line;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (firstIndex < 0 || lastIndex < 0 || !firstFileName || !lastFileName ||
|
|
||||||
firstFileName !== lastFileName || firstIndex >= lastIndex) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
shouldIgnore = function(line) {
|
|
||||||
if (bluebirdFramePattern.test(line)) return true;
|
|
||||||
var info = parseLineInfo(line);
|
|
||||||
if (info) {
|
|
||||||
if (info.fileName === firstFileName &&
|
|
||||||
(firstIndex <= info.line && info.line <= lastIndex)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function CapturedTrace(parent) {
|
|
||||||
this._parent = parent;
|
|
||||||
this._promisesCreated = 0;
|
|
||||||
var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
|
|
||||||
captureStackTrace(this, CapturedTrace);
|
|
||||||
if (length > 32) this.uncycle();
|
|
||||||
}
|
|
||||||
util.inherits(CapturedTrace, Error);
|
|
||||||
Context.CapturedTrace = CapturedTrace;
|
|
||||||
|
|
||||||
CapturedTrace.prototype.uncycle = function() {
|
|
||||||
var length = this._length;
|
|
||||||
if (length < 2) return;
|
|
||||||
var nodes = [];
|
|
||||||
var stackToIndex = {};
|
|
||||||
|
|
||||||
for (var i = 0, node = this; node !== undefined; ++i) {
|
|
||||||
nodes.push(node);
|
|
||||||
node = node._parent;
|
|
||||||
}
|
|
||||||
length = this._length = i;
|
|
||||||
for (var i = length - 1; i >= 0; --i) {
|
|
||||||
var stack = nodes[i].stack;
|
|
||||||
if (stackToIndex[stack] === undefined) {
|
|
||||||
stackToIndex[stack] = i;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
for (var i = 0; i < length; ++i) {
|
|
||||||
var currentStack = nodes[i].stack;
|
|
||||||
var index = stackToIndex[currentStack];
|
|
||||||
if (index !== undefined && index !== i) {
|
|
||||||
if (index > 0) {
|
|
||||||
nodes[index - 1]._parent = undefined;
|
|
||||||
nodes[index - 1]._length = 1;
|
|
||||||
}
|
|
||||||
nodes[i]._parent = undefined;
|
|
||||||
nodes[i]._length = 1;
|
|
||||||
var cycleEdgeNode = i > 0 ? nodes[i - 1] : this;
|
|
||||||
|
|
||||||
if (index < length - 1) {
|
|
||||||
cycleEdgeNode._parent = nodes[index + 1];
|
|
||||||
cycleEdgeNode._parent.uncycle();
|
|
||||||
cycleEdgeNode._length =
|
|
||||||
cycleEdgeNode._parent._length + 1;
|
|
||||||
} else {
|
|
||||||
cycleEdgeNode._parent = undefined;
|
|
||||||
cycleEdgeNode._length = 1;
|
|
||||||
}
|
|
||||||
var currentChildLength = cycleEdgeNode._length + 1;
|
|
||||||
for (var j = i - 2; j >= 0; --j) {
|
|
||||||
nodes[j]._length = currentChildLength;
|
|
||||||
currentChildLength++;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
CapturedTrace.prototype.attachExtraTrace = function(error) {
|
|
||||||
if (error.__stackCleaned__) return;
|
|
||||||
this.uncycle();
|
|
||||||
var parsed = parseStackAndMessage(error);
|
|
||||||
var message = parsed.message;
|
|
||||||
var stacks = [parsed.stack];
|
|
||||||
|
|
||||||
var trace = this;
|
|
||||||
while (trace !== undefined) {
|
|
||||||
stacks.push(cleanStack(trace.stack.split("\n")));
|
|
||||||
trace = trace._parent;
|
|
||||||
}
|
|
||||||
removeCommonRoots(stacks);
|
|
||||||
removeDuplicateOrEmptyJumps(stacks);
|
|
||||||
util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
|
|
||||||
util.notEnumerableProp(error, "__stackCleaned__", true);
|
|
||||||
};
|
|
||||||
|
|
||||||
var captureStackTrace = (function stackDetection() {
|
|
||||||
var v8stackFramePattern = /^\s*at\s*/;
|
|
||||||
var v8stackFormatter = function(stack, error) {
|
|
||||||
if (typeof stack === "string") return stack;
|
|
||||||
|
|
||||||
if (error.name !== undefined &&
|
|
||||||
error.message !== undefined) {
|
|
||||||
return error.toString();
|
|
||||||
}
|
|
||||||
return formatNonError(error);
|
|
||||||
};
|
|
||||||
|
|
||||||
if (typeof Error.stackTraceLimit === "number" &&
|
|
||||||
typeof Error.captureStackTrace === "function") {
|
|
||||||
Error.stackTraceLimit += 6;
|
|
||||||
stackFramePattern = v8stackFramePattern;
|
|
||||||
formatStack = v8stackFormatter;
|
|
||||||
var captureStackTrace = Error.captureStackTrace;
|
|
||||||
|
|
||||||
shouldIgnore = function(line) {
|
|
||||||
return bluebirdFramePattern.test(line);
|
|
||||||
};
|
|
||||||
return function(receiver, ignoreUntil) {
|
|
||||||
Error.stackTraceLimit += 6;
|
|
||||||
captureStackTrace(receiver, ignoreUntil);
|
|
||||||
Error.stackTraceLimit -= 6;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
var err = new Error();
|
|
||||||
|
|
||||||
if (typeof err.stack === "string" &&
|
|
||||||
err.stack.split("\n")[0].indexOf("stackDetection@") >= 0) {
|
|
||||||
stackFramePattern = /@/;
|
|
||||||
formatStack = v8stackFormatter;
|
|
||||||
indentStackFrames = true;
|
|
||||||
return function captureStackTrace(o) {
|
|
||||||
o.stack = new Error().stack;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var hasStackAfterThrow;
|
|
||||||
try { throw new Error(); }
|
|
||||||
catch(e) {
|
|
||||||
hasStackAfterThrow = ("stack" in e);
|
|
||||||
}
|
|
||||||
if (!("stack" in err) && hasStackAfterThrow &&
|
|
||||||
typeof Error.stackTraceLimit === "number") {
|
|
||||||
stackFramePattern = v8stackFramePattern;
|
|
||||||
formatStack = v8stackFormatter;
|
|
||||||
return function captureStackTrace(o) {
|
|
||||||
Error.stackTraceLimit += 6;
|
|
||||||
try { throw new Error(); }
|
|
||||||
catch(e) { o.stack = e.stack; }
|
|
||||||
Error.stackTraceLimit -= 6;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
formatStack = function(stack, error) {
|
|
||||||
if (typeof stack === "string") return stack;
|
|
||||||
|
|
||||||
if ((typeof error === "object" ||
|
|
||||||
typeof error === "function") &&
|
|
||||||
error.name !== undefined &&
|
|
||||||
error.message !== undefined) {
|
|
||||||
return error.toString();
|
|
||||||
}
|
|
||||||
return formatNonError(error);
|
|
||||||
};
|
|
||||||
|
|
||||||
return null;
|
|
||||||
|
|
||||||
})([]);
|
|
||||||
|
|
||||||
if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
|
|
||||||
printWarning = function (message) {
|
|
||||||
console.warn(message);
|
|
||||||
};
|
|
||||||
if (util.isNode && process.stderr.isTTY) {
|
|
||||||
printWarning = function(message, isSoft) {
|
|
||||||
var color = isSoft ? "\u001b[33m" : "\u001b[31m";
|
|
||||||
console.warn(color + message + "\u001b[0m\n");
|
|
||||||
};
|
|
||||||
} else if (!util.isNode && typeof (new Error().stack) === "string") {
|
|
||||||
printWarning = function(message, isSoft) {
|
|
||||||
console.warn("%c" + message,
|
|
||||||
isSoft ? "color: darkorange" : "color: red");
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var config = {
|
|
||||||
warnings: warnings,
|
|
||||||
longStackTraces: false,
|
|
||||||
cancellation: false,
|
|
||||||
monitoring: false
|
|
||||||
};
|
|
||||||
|
|
||||||
if (longStackTraces) Promise.longStackTraces();
|
|
||||||
|
|
||||||
return {
|
|
||||||
longStackTraces: function() {
|
|
||||||
return config.longStackTraces;
|
|
||||||
},
|
|
||||||
warnings: function() {
|
|
||||||
return config.warnings;
|
|
||||||
},
|
|
||||||
cancellation: function() {
|
|
||||||
return config.cancellation;
|
|
||||||
},
|
|
||||||
monitoring: function() {
|
|
||||||
return config.monitoring;
|
|
||||||
},
|
|
||||||
propagateFromFunction: function() {
|
|
||||||
return propagateFromFunction;
|
|
||||||
},
|
|
||||||
boundValueFunction: function() {
|
|
||||||
return boundValueFunction;
|
|
||||||
},
|
|
||||||
checkForgottenReturns: checkForgottenReturns,
|
|
||||||
setBounds: setBounds,
|
|
||||||
warn: warn,
|
|
||||||
deprecated: deprecated,
|
|
||||||
CapturedTrace: CapturedTrace,
|
|
||||||
fireDomEvent: fireDomEvent,
|
|
||||||
fireGlobalEvent: fireGlobalEvent
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-46
@@ -1,46 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise) {
|
|
||||||
function returner() {
|
|
||||||
return this.value;
|
|
||||||
}
|
|
||||||
function thrower() {
|
|
||||||
throw this.reason;
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.prototype["return"] =
|
|
||||||
Promise.prototype.thenReturn = function (value) {
|
|
||||||
if (value instanceof Promise) value.suppressUnhandledRejections();
|
|
||||||
return this._then(
|
|
||||||
returner, undefined, undefined, {value: value}, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype["throw"] =
|
|
||||||
Promise.prototype.thenThrow = function (reason) {
|
|
||||||
return this._then(
|
|
||||||
thrower, undefined, undefined, {reason: reason}, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.catchThrow = function (reason) {
|
|
||||||
if (arguments.length <= 1) {
|
|
||||||
return this._then(
|
|
||||||
undefined, thrower, undefined, {reason: reason}, undefined);
|
|
||||||
} else {
|
|
||||||
var _reason = arguments[1];
|
|
||||||
var handler = function() {throw _reason;};
|
|
||||||
return this.caught(reason, handler);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.catchReturn = function (value) {
|
|
||||||
if (arguments.length <= 1) {
|
|
||||||
if (value instanceof Promise) value.suppressUnhandledRejections();
|
|
||||||
return this._then(
|
|
||||||
undefined, returner, undefined, {value: value}, undefined);
|
|
||||||
} else {
|
|
||||||
var _value = arguments[1];
|
|
||||||
if (_value instanceof Promise) _value.suppressUnhandledRejections();
|
|
||||||
var handler = function() {return _value;};
|
|
||||||
return this.caught(value, handler);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-30
@@ -1,30 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, INTERNAL) {
|
|
||||||
var PromiseReduce = Promise.reduce;
|
|
||||||
var PromiseAll = Promise.all;
|
|
||||||
|
|
||||||
function promiseAllThis() {
|
|
||||||
return PromiseAll(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
function PromiseMapSeries(promises, fn) {
|
|
||||||
return PromiseReduce(promises, fn, INTERNAL, INTERNAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.prototype.each = function (fn) {
|
|
||||||
return PromiseReduce(this, fn, INTERNAL, 0)
|
|
||||||
._then(promiseAllThis, undefined, undefined, this, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.mapSeries = function (fn) {
|
|
||||||
return PromiseReduce(this, fn, INTERNAL, INTERNAL);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.each = function (promises, fn) {
|
|
||||||
return PromiseReduce(promises, fn, INTERNAL, 0)
|
|
||||||
._then(promiseAllThis, undefined, undefined, promises, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.mapSeries = PromiseMapSeries;
|
|
||||||
};
|
|
||||||
|
|
||||||
-116
@@ -1,116 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var es5 = require("./es5");
|
|
||||||
var Objectfreeze = es5.freeze;
|
|
||||||
var util = require("./util");
|
|
||||||
var inherits = util.inherits;
|
|
||||||
var notEnumerableProp = util.notEnumerableProp;
|
|
||||||
|
|
||||||
function subError(nameProperty, defaultMessage) {
|
|
||||||
function SubError(message) {
|
|
||||||
if (!(this instanceof SubError)) return new SubError(message);
|
|
||||||
notEnumerableProp(this, "message",
|
|
||||||
typeof message === "string" ? message : defaultMessage);
|
|
||||||
notEnumerableProp(this, "name", nameProperty);
|
|
||||||
if (Error.captureStackTrace) {
|
|
||||||
Error.captureStackTrace(this, this.constructor);
|
|
||||||
} else {
|
|
||||||
Error.call(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
inherits(SubError, Error);
|
|
||||||
return SubError;
|
|
||||||
}
|
|
||||||
|
|
||||||
var _TypeError, _RangeError;
|
|
||||||
var Warning = subError("Warning", "warning");
|
|
||||||
var CancellationError = subError("CancellationError", "cancellation error");
|
|
||||||
var TimeoutError = subError("TimeoutError", "timeout error");
|
|
||||||
var AggregateError = subError("AggregateError", "aggregate error");
|
|
||||||
try {
|
|
||||||
_TypeError = TypeError;
|
|
||||||
_RangeError = RangeError;
|
|
||||||
} catch(e) {
|
|
||||||
_TypeError = subError("TypeError", "type error");
|
|
||||||
_RangeError = subError("RangeError", "range error");
|
|
||||||
}
|
|
||||||
|
|
||||||
var methods = ("join pop push shift unshift slice filter forEach some " +
|
|
||||||
"every map indexOf lastIndexOf reduce reduceRight sort reverse").split(" ");
|
|
||||||
|
|
||||||
for (var i = 0; i < methods.length; ++i) {
|
|
||||||
if (typeof Array.prototype[methods[i]] === "function") {
|
|
||||||
AggregateError.prototype[methods[i]] = Array.prototype[methods[i]];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
es5.defineProperty(AggregateError.prototype, "length", {
|
|
||||||
value: 0,
|
|
||||||
configurable: false,
|
|
||||||
writable: true,
|
|
||||||
enumerable: true
|
|
||||||
});
|
|
||||||
AggregateError.prototype["isOperational"] = true;
|
|
||||||
var level = 0;
|
|
||||||
AggregateError.prototype.toString = function() {
|
|
||||||
var indent = Array(level * 4 + 1).join(" ");
|
|
||||||
var ret = "\n" + indent + "AggregateError of:" + "\n";
|
|
||||||
level++;
|
|
||||||
indent = Array(level * 4 + 1).join(" ");
|
|
||||||
for (var i = 0; i < this.length; ++i) {
|
|
||||||
var str = this[i] === this ? "[Circular AggregateError]" : this[i] + "";
|
|
||||||
var lines = str.split("\n");
|
|
||||||
for (var j = 0; j < lines.length; ++j) {
|
|
||||||
lines[j] = indent + lines[j];
|
|
||||||
}
|
|
||||||
str = lines.join("\n");
|
|
||||||
ret += str + "\n";
|
|
||||||
}
|
|
||||||
level--;
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
function OperationalError(message) {
|
|
||||||
if (!(this instanceof OperationalError))
|
|
||||||
return new OperationalError(message);
|
|
||||||
notEnumerableProp(this, "name", "OperationalError");
|
|
||||||
notEnumerableProp(this, "message", message);
|
|
||||||
this.cause = message;
|
|
||||||
this["isOperational"] = true;
|
|
||||||
|
|
||||||
if (message instanceof Error) {
|
|
||||||
notEnumerableProp(this, "message", message.message);
|
|
||||||
notEnumerableProp(this, "stack", message.stack);
|
|
||||||
} else if (Error.captureStackTrace) {
|
|
||||||
Error.captureStackTrace(this, this.constructor);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
inherits(OperationalError, Error);
|
|
||||||
|
|
||||||
var errorTypes = Error["__BluebirdErrorTypes__"];
|
|
||||||
if (!errorTypes) {
|
|
||||||
errorTypes = Objectfreeze({
|
|
||||||
CancellationError: CancellationError,
|
|
||||||
TimeoutError: TimeoutError,
|
|
||||||
OperationalError: OperationalError,
|
|
||||||
RejectionError: OperationalError,
|
|
||||||
AggregateError: AggregateError
|
|
||||||
});
|
|
||||||
es5.defineProperty(Error, "__BluebirdErrorTypes__", {
|
|
||||||
value: errorTypes,
|
|
||||||
writable: false,
|
|
||||||
enumerable: false,
|
|
||||||
configurable: false
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
Error: Error,
|
|
||||||
TypeError: _TypeError,
|
|
||||||
RangeError: _RangeError,
|
|
||||||
CancellationError: errorTypes.CancellationError,
|
|
||||||
OperationalError: errorTypes.OperationalError,
|
|
||||||
TimeoutError: errorTypes.TimeoutError,
|
|
||||||
AggregateError: errorTypes.AggregateError,
|
|
||||||
Warning: Warning
|
|
||||||
};
|
|
||||||
-80
@@ -1,80 +0,0 @@
|
|||||||
var isES5 = (function(){
|
|
||||||
"use strict";
|
|
||||||
return this === undefined;
|
|
||||||
})();
|
|
||||||
|
|
||||||
if (isES5) {
|
|
||||||
module.exports = {
|
|
||||||
freeze: Object.freeze,
|
|
||||||
defineProperty: Object.defineProperty,
|
|
||||||
getDescriptor: Object.getOwnPropertyDescriptor,
|
|
||||||
keys: Object.keys,
|
|
||||||
names: Object.getOwnPropertyNames,
|
|
||||||
getPrototypeOf: Object.getPrototypeOf,
|
|
||||||
isArray: Array.isArray,
|
|
||||||
isES5: isES5,
|
|
||||||
propertyIsWritable: function(obj, prop) {
|
|
||||||
var descriptor = Object.getOwnPropertyDescriptor(obj, prop);
|
|
||||||
return !!(!descriptor || descriptor.writable || descriptor.set);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
var has = {}.hasOwnProperty;
|
|
||||||
var str = {}.toString;
|
|
||||||
var proto = {}.constructor.prototype;
|
|
||||||
|
|
||||||
var ObjectKeys = function (o) {
|
|
||||||
var ret = [];
|
|
||||||
for (var key in o) {
|
|
||||||
if (has.call(o, key)) {
|
|
||||||
ret.push(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
var ObjectGetDescriptor = function(o, key) {
|
|
||||||
return {value: o[key]};
|
|
||||||
};
|
|
||||||
|
|
||||||
var ObjectDefineProperty = function (o, key, desc) {
|
|
||||||
o[key] = desc.value;
|
|
||||||
return o;
|
|
||||||
};
|
|
||||||
|
|
||||||
var ObjectFreeze = function (obj) {
|
|
||||||
return obj;
|
|
||||||
};
|
|
||||||
|
|
||||||
var ObjectGetPrototypeOf = function (obj) {
|
|
||||||
try {
|
|
||||||
return Object(obj).constructor.prototype;
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
return proto;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
var ArrayIsArray = function (obj) {
|
|
||||||
try {
|
|
||||||
return str.call(obj) === "[object Array]";
|
|
||||||
}
|
|
||||||
catch(e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
isArray: ArrayIsArray,
|
|
||||||
keys: ObjectKeys,
|
|
||||||
names: ObjectKeys,
|
|
||||||
defineProperty: ObjectDefineProperty,
|
|
||||||
getDescriptor: ObjectGetDescriptor,
|
|
||||||
freeze: ObjectFreeze,
|
|
||||||
getPrototypeOf: ObjectGetPrototypeOf,
|
|
||||||
isES5: isES5,
|
|
||||||
propertyIsWritable: function() {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
-12
@@ -1,12 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, INTERNAL) {
|
|
||||||
var PromiseMap = Promise.map;
|
|
||||||
|
|
||||||
Promise.prototype.filter = function (fn, options) {
|
|
||||||
return PromiseMap(this, fn, options, INTERNAL);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.filter = function (promises, fn, options) {
|
|
||||||
return PromiseMap(promises, fn, options, INTERNAL);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-146
@@ -1,146 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, tryConvertToPromise, NEXT_FILTER) {
|
|
||||||
var util = require("./util");
|
|
||||||
var CancellationError = Promise.CancellationError;
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
var catchFilter = require("./catch_filter")(NEXT_FILTER);
|
|
||||||
|
|
||||||
function PassThroughHandlerContext(promise, type, handler) {
|
|
||||||
this.promise = promise;
|
|
||||||
this.type = type;
|
|
||||||
this.handler = handler;
|
|
||||||
this.called = false;
|
|
||||||
this.cancelPromise = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
PassThroughHandlerContext.prototype.isFinallyHandler = function() {
|
|
||||||
return this.type === 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
function FinallyHandlerCancelReaction(finallyHandler) {
|
|
||||||
this.finallyHandler = finallyHandler;
|
|
||||||
}
|
|
||||||
|
|
||||||
FinallyHandlerCancelReaction.prototype._resultCancelled = function() {
|
|
||||||
checkCancel(this.finallyHandler);
|
|
||||||
};
|
|
||||||
|
|
||||||
function checkCancel(ctx, reason) {
|
|
||||||
if (ctx.cancelPromise != null) {
|
|
||||||
if (arguments.length > 1) {
|
|
||||||
ctx.cancelPromise._reject(reason);
|
|
||||||
} else {
|
|
||||||
ctx.cancelPromise._cancel();
|
|
||||||
}
|
|
||||||
ctx.cancelPromise = null;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
function succeed() {
|
|
||||||
return finallyHandler.call(this, this.promise._target()._settledValue());
|
|
||||||
}
|
|
||||||
function fail(reason) {
|
|
||||||
if (checkCancel(this, reason)) return;
|
|
||||||
errorObj.e = reason;
|
|
||||||
return errorObj;
|
|
||||||
}
|
|
||||||
function finallyHandler(reasonOrValue) {
|
|
||||||
var promise = this.promise;
|
|
||||||
var handler = this.handler;
|
|
||||||
|
|
||||||
if (!this.called) {
|
|
||||||
this.called = true;
|
|
||||||
var ret = this.isFinallyHandler()
|
|
||||||
? handler.call(promise._boundValue())
|
|
||||||
: handler.call(promise._boundValue(), reasonOrValue);
|
|
||||||
if (ret === NEXT_FILTER) {
|
|
||||||
return ret;
|
|
||||||
} else if (ret !== undefined) {
|
|
||||||
promise._setReturnedNonUndefined();
|
|
||||||
var maybePromise = tryConvertToPromise(ret, promise);
|
|
||||||
if (maybePromise instanceof Promise) {
|
|
||||||
if (this.cancelPromise != null) {
|
|
||||||
if (maybePromise._isCancelled()) {
|
|
||||||
var reason =
|
|
||||||
new CancellationError("late cancellation observer");
|
|
||||||
promise._attachExtraTrace(reason);
|
|
||||||
errorObj.e = reason;
|
|
||||||
return errorObj;
|
|
||||||
} else if (maybePromise.isPending()) {
|
|
||||||
maybePromise._attachCancellationCallback(
|
|
||||||
new FinallyHandlerCancelReaction(this));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return maybePromise._then(
|
|
||||||
succeed, fail, undefined, this, undefined);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (promise.isRejected()) {
|
|
||||||
checkCancel(this);
|
|
||||||
errorObj.e = reasonOrValue;
|
|
||||||
return errorObj;
|
|
||||||
} else {
|
|
||||||
checkCancel(this);
|
|
||||||
return reasonOrValue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.prototype._passThrough = function(handler, type, success, fail) {
|
|
||||||
if (typeof handler !== "function") return this.then();
|
|
||||||
return this._then(success,
|
|
||||||
fail,
|
|
||||||
undefined,
|
|
||||||
new PassThroughHandlerContext(this, type, handler),
|
|
||||||
undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.lastly =
|
|
||||||
Promise.prototype["finally"] = function (handler) {
|
|
||||||
return this._passThrough(handler,
|
|
||||||
0,
|
|
||||||
finallyHandler,
|
|
||||||
finallyHandler);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
Promise.prototype.tap = function (handler) {
|
|
||||||
return this._passThrough(handler, 1, finallyHandler);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.tapCatch = function (handlerOrPredicate) {
|
|
||||||
var len = arguments.length;
|
|
||||||
if(len === 1) {
|
|
||||||
return this._passThrough(handlerOrPredicate,
|
|
||||||
1,
|
|
||||||
undefined,
|
|
||||||
finallyHandler);
|
|
||||||
} else {
|
|
||||||
var catchInstances = new Array(len - 1),
|
|
||||||
j = 0, i;
|
|
||||||
for (i = 0; i < len - 1; ++i) {
|
|
||||||
var item = arguments[i];
|
|
||||||
if (util.isObject(item)) {
|
|
||||||
catchInstances[j++] = item;
|
|
||||||
} else {
|
|
||||||
return Promise.reject(new TypeError(
|
|
||||||
"tapCatch statement predicate: "
|
|
||||||
+ "expecting an object but got " + util.classString(item)
|
|
||||||
));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catchInstances.length = j;
|
|
||||||
var handler = arguments[i];
|
|
||||||
return this._passThrough(catchFilter(catchInstances, handler, this),
|
|
||||||
1,
|
|
||||||
undefined,
|
|
||||||
finallyHandler);
|
|
||||||
}
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
return PassThroughHandlerContext;
|
|
||||||
};
|
|
||||||
-223
@@ -1,223 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise,
|
|
||||||
apiRejection,
|
|
||||||
INTERNAL,
|
|
||||||
tryConvertToPromise,
|
|
||||||
Proxyable,
|
|
||||||
debug) {
|
|
||||||
var errors = require("./errors");
|
|
||||||
var TypeError = errors.TypeError;
|
|
||||||
var util = require("./util");
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
var yieldHandlers = [];
|
|
||||||
|
|
||||||
function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
|
|
||||||
for (var i = 0; i < yieldHandlers.length; ++i) {
|
|
||||||
traceParent._pushContext();
|
|
||||||
var result = tryCatch(yieldHandlers[i])(value);
|
|
||||||
traceParent._popContext();
|
|
||||||
if (result === errorObj) {
|
|
||||||
traceParent._pushContext();
|
|
||||||
var ret = Promise.reject(errorObj.e);
|
|
||||||
traceParent._popContext();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
var maybePromise = tryConvertToPromise(result, traceParent);
|
|
||||||
if (maybePromise instanceof Promise) return maybePromise;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
|
|
||||||
if (debug.cancellation()) {
|
|
||||||
var internal = new Promise(INTERNAL);
|
|
||||||
var _finallyPromise = this._finallyPromise = new Promise(INTERNAL);
|
|
||||||
this._promise = internal.lastly(function() {
|
|
||||||
return _finallyPromise;
|
|
||||||
});
|
|
||||||
internal._captureStackTrace();
|
|
||||||
internal._setOnCancel(this);
|
|
||||||
} else {
|
|
||||||
var promise = this._promise = new Promise(INTERNAL);
|
|
||||||
promise._captureStackTrace();
|
|
||||||
}
|
|
||||||
this._stack = stack;
|
|
||||||
this._generatorFunction = generatorFunction;
|
|
||||||
this._receiver = receiver;
|
|
||||||
this._generator = undefined;
|
|
||||||
this._yieldHandlers = typeof yieldHandler === "function"
|
|
||||||
? [yieldHandler].concat(yieldHandlers)
|
|
||||||
: yieldHandlers;
|
|
||||||
this._yieldedPromise = null;
|
|
||||||
this._cancellationPhase = false;
|
|
||||||
}
|
|
||||||
util.inherits(PromiseSpawn, Proxyable);
|
|
||||||
|
|
||||||
PromiseSpawn.prototype._isResolved = function() {
|
|
||||||
return this._promise === null;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseSpawn.prototype._cleanup = function() {
|
|
||||||
this._promise = this._generator = null;
|
|
||||||
if (debug.cancellation() && this._finallyPromise !== null) {
|
|
||||||
this._finallyPromise._fulfill();
|
|
||||||
this._finallyPromise = null;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseSpawn.prototype._promiseCancelled = function() {
|
|
||||||
if (this._isResolved()) return;
|
|
||||||
var implementsReturn = typeof this._generator["return"] !== "undefined";
|
|
||||||
|
|
||||||
var result;
|
|
||||||
if (!implementsReturn) {
|
|
||||||
var reason = new Promise.CancellationError(
|
|
||||||
"generator .return() sentinel");
|
|
||||||
Promise.coroutine.returnSentinel = reason;
|
|
||||||
this._promise._attachExtraTrace(reason);
|
|
||||||
this._promise._pushContext();
|
|
||||||
result = tryCatch(this._generator["throw"]).call(this._generator,
|
|
||||||
reason);
|
|
||||||
this._promise._popContext();
|
|
||||||
} else {
|
|
||||||
this._promise._pushContext();
|
|
||||||
result = tryCatch(this._generator["return"]).call(this._generator,
|
|
||||||
undefined);
|
|
||||||
this._promise._popContext();
|
|
||||||
}
|
|
||||||
this._cancellationPhase = true;
|
|
||||||
this._yieldedPromise = null;
|
|
||||||
this._continue(result);
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseSpawn.prototype._promiseFulfilled = function(value) {
|
|
||||||
this._yieldedPromise = null;
|
|
||||||
this._promise._pushContext();
|
|
||||||
var result = tryCatch(this._generator.next).call(this._generator, value);
|
|
||||||
this._promise._popContext();
|
|
||||||
this._continue(result);
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseSpawn.prototype._promiseRejected = function(reason) {
|
|
||||||
this._yieldedPromise = null;
|
|
||||||
this._promise._attachExtraTrace(reason);
|
|
||||||
this._promise._pushContext();
|
|
||||||
var result = tryCatch(this._generator["throw"])
|
|
||||||
.call(this._generator, reason);
|
|
||||||
this._promise._popContext();
|
|
||||||
this._continue(result);
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseSpawn.prototype._resultCancelled = function() {
|
|
||||||
if (this._yieldedPromise instanceof Promise) {
|
|
||||||
var promise = this._yieldedPromise;
|
|
||||||
this._yieldedPromise = null;
|
|
||||||
promise.cancel();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseSpawn.prototype.promise = function () {
|
|
||||||
return this._promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseSpawn.prototype._run = function () {
|
|
||||||
this._generator = this._generatorFunction.call(this._receiver);
|
|
||||||
this._receiver =
|
|
||||||
this._generatorFunction = undefined;
|
|
||||||
this._promiseFulfilled(undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseSpawn.prototype._continue = function (result) {
|
|
||||||
var promise = this._promise;
|
|
||||||
if (result === errorObj) {
|
|
||||||
this._cleanup();
|
|
||||||
if (this._cancellationPhase) {
|
|
||||||
return promise.cancel();
|
|
||||||
} else {
|
|
||||||
return promise._rejectCallback(result.e, false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var value = result.value;
|
|
||||||
if (result.done === true) {
|
|
||||||
this._cleanup();
|
|
||||||
if (this._cancellationPhase) {
|
|
||||||
return promise.cancel();
|
|
||||||
} else {
|
|
||||||
return promise._resolveCallback(value);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var maybePromise = tryConvertToPromise(value, this._promise);
|
|
||||||
if (!(maybePromise instanceof Promise)) {
|
|
||||||
maybePromise =
|
|
||||||
promiseFromYieldHandler(maybePromise,
|
|
||||||
this._yieldHandlers,
|
|
||||||
this._promise);
|
|
||||||
if (maybePromise === null) {
|
|
||||||
this._promiseRejected(
|
|
||||||
new TypeError(
|
|
||||||
"A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", String(value)) +
|
|
||||||
"From coroutine:\u000a" +
|
|
||||||
this._stack.split("\n").slice(1, -7).join("\n")
|
|
||||||
)
|
|
||||||
);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
maybePromise = maybePromise._target();
|
|
||||||
var bitField = maybePromise._bitField;
|
|
||||||
;
|
|
||||||
if (((bitField & 50397184) === 0)) {
|
|
||||||
this._yieldedPromise = maybePromise;
|
|
||||||
maybePromise._proxy(this, null);
|
|
||||||
} else if (((bitField & 33554432) !== 0)) {
|
|
||||||
Promise._async.invoke(
|
|
||||||
this._promiseFulfilled, this, maybePromise._value()
|
|
||||||
);
|
|
||||||
} else if (((bitField & 16777216) !== 0)) {
|
|
||||||
Promise._async.invoke(
|
|
||||||
this._promiseRejected, this, maybePromise._reason()
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
this._promiseCancelled();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.coroutine = function (generatorFunction, options) {
|
|
||||||
if (typeof generatorFunction !== "function") {
|
|
||||||
throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
var yieldHandler = Object(options).yieldHandler;
|
|
||||||
var PromiseSpawn$ = PromiseSpawn;
|
|
||||||
var stack = new Error().stack;
|
|
||||||
return function () {
|
|
||||||
var generator = generatorFunction.apply(this, arguments);
|
|
||||||
var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
|
|
||||||
stack);
|
|
||||||
var ret = spawn.promise();
|
|
||||||
spawn._generator = generator;
|
|
||||||
spawn._promiseFulfilled(undefined);
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.coroutine.addYieldHandler = function(fn) {
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
throw new TypeError("expecting a function but got " + util.classString(fn));
|
|
||||||
}
|
|
||||||
yieldHandlers.push(fn);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.spawn = function (generatorFunction) {
|
|
||||||
debug.deprecated("Promise.spawn()", "Promise.coroutine()");
|
|
||||||
if (typeof generatorFunction !== "function") {
|
|
||||||
return apiRejection("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
var spawn = new PromiseSpawn(generatorFunction, this);
|
|
||||||
var ret = spawn.promise();
|
|
||||||
spawn._run(Promise.spawn);
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-168
@@ -1,168 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports =
|
|
||||||
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL, async,
|
|
||||||
getDomain) {
|
|
||||||
var util = require("./util");
|
|
||||||
var canEvaluate = util.canEvaluate;
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
var reject;
|
|
||||||
|
|
||||||
if (!false) {
|
|
||||||
if (canEvaluate) {
|
|
||||||
var thenCallback = function(i) {
|
|
||||||
return new Function("value", "holder", " \n\
|
|
||||||
'use strict'; \n\
|
|
||||||
holder.pIndex = value; \n\
|
|
||||||
holder.checkFulfillment(this); \n\
|
|
||||||
".replace(/Index/g, i));
|
|
||||||
};
|
|
||||||
|
|
||||||
var promiseSetter = function(i) {
|
|
||||||
return new Function("promise", "holder", " \n\
|
|
||||||
'use strict'; \n\
|
|
||||||
holder.pIndex = promise; \n\
|
|
||||||
".replace(/Index/g, i));
|
|
||||||
};
|
|
||||||
|
|
||||||
var generateHolderClass = function(total) {
|
|
||||||
var props = new Array(total);
|
|
||||||
for (var i = 0; i < props.length; ++i) {
|
|
||||||
props[i] = "this.p" + (i+1);
|
|
||||||
}
|
|
||||||
var assignment = props.join(" = ") + " = null;";
|
|
||||||
var cancellationCode= "var promise;\n" + props.map(function(prop) {
|
|
||||||
return " \n\
|
|
||||||
promise = " + prop + "; \n\
|
|
||||||
if (promise instanceof Promise) { \n\
|
|
||||||
promise.cancel(); \n\
|
|
||||||
} \n\
|
|
||||||
";
|
|
||||||
}).join("\n");
|
|
||||||
var passedArguments = props.join(", ");
|
|
||||||
var name = "Holder$" + total;
|
|
||||||
|
|
||||||
|
|
||||||
var code = "return function(tryCatch, errorObj, Promise, async) { \n\
|
|
||||||
'use strict'; \n\
|
|
||||||
function [TheName](fn) { \n\
|
|
||||||
[TheProperties] \n\
|
|
||||||
this.fn = fn; \n\
|
|
||||||
this.asyncNeeded = true; \n\
|
|
||||||
this.now = 0; \n\
|
|
||||||
} \n\
|
|
||||||
\n\
|
|
||||||
[TheName].prototype._callFunction = function(promise) { \n\
|
|
||||||
promise._pushContext(); \n\
|
|
||||||
var ret = tryCatch(this.fn)([ThePassedArguments]); \n\
|
|
||||||
promise._popContext(); \n\
|
|
||||||
if (ret === errorObj) { \n\
|
|
||||||
promise._rejectCallback(ret.e, false); \n\
|
|
||||||
} else { \n\
|
|
||||||
promise._resolveCallback(ret); \n\
|
|
||||||
} \n\
|
|
||||||
}; \n\
|
|
||||||
\n\
|
|
||||||
[TheName].prototype.checkFulfillment = function(promise) { \n\
|
|
||||||
var now = ++this.now; \n\
|
|
||||||
if (now === [TheTotal]) { \n\
|
|
||||||
if (this.asyncNeeded) { \n\
|
|
||||||
async.invoke(this._callFunction, this, promise); \n\
|
|
||||||
} else { \n\
|
|
||||||
this._callFunction(promise); \n\
|
|
||||||
} \n\
|
|
||||||
\n\
|
|
||||||
} \n\
|
|
||||||
}; \n\
|
|
||||||
\n\
|
|
||||||
[TheName].prototype._resultCancelled = function() { \n\
|
|
||||||
[CancellationCode] \n\
|
|
||||||
}; \n\
|
|
||||||
\n\
|
|
||||||
return [TheName]; \n\
|
|
||||||
}(tryCatch, errorObj, Promise, async); \n\
|
|
||||||
";
|
|
||||||
|
|
||||||
code = code.replace(/\[TheName\]/g, name)
|
|
||||||
.replace(/\[TheTotal\]/g, total)
|
|
||||||
.replace(/\[ThePassedArguments\]/g, passedArguments)
|
|
||||||
.replace(/\[TheProperties\]/g, assignment)
|
|
||||||
.replace(/\[CancellationCode\]/g, cancellationCode);
|
|
||||||
|
|
||||||
return new Function("tryCatch", "errorObj", "Promise", "async", code)
|
|
||||||
(tryCatch, errorObj, Promise, async);
|
|
||||||
};
|
|
||||||
|
|
||||||
var holderClasses = [];
|
|
||||||
var thenCallbacks = [];
|
|
||||||
var promiseSetters = [];
|
|
||||||
|
|
||||||
for (var i = 0; i < 8; ++i) {
|
|
||||||
holderClasses.push(generateHolderClass(i + 1));
|
|
||||||
thenCallbacks.push(thenCallback(i + 1));
|
|
||||||
promiseSetters.push(promiseSetter(i + 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
reject = function (reason) {
|
|
||||||
this._reject(reason);
|
|
||||||
};
|
|
||||||
}}
|
|
||||||
|
|
||||||
Promise.join = function () {
|
|
||||||
var last = arguments.length - 1;
|
|
||||||
var fn;
|
|
||||||
if (last > 0 && typeof arguments[last] === "function") {
|
|
||||||
fn = arguments[last];
|
|
||||||
if (!false) {
|
|
||||||
if (last <= 8 && canEvaluate) {
|
|
||||||
var ret = new Promise(INTERNAL);
|
|
||||||
ret._captureStackTrace();
|
|
||||||
var HolderClass = holderClasses[last - 1];
|
|
||||||
var holder = new HolderClass(fn);
|
|
||||||
var callbacks = thenCallbacks;
|
|
||||||
|
|
||||||
for (var i = 0; i < last; ++i) {
|
|
||||||
var maybePromise = tryConvertToPromise(arguments[i], ret);
|
|
||||||
if (maybePromise instanceof Promise) {
|
|
||||||
maybePromise = maybePromise._target();
|
|
||||||
var bitField = maybePromise._bitField;
|
|
||||||
;
|
|
||||||
if (((bitField & 50397184) === 0)) {
|
|
||||||
maybePromise._then(callbacks[i], reject,
|
|
||||||
undefined, ret, holder);
|
|
||||||
promiseSetters[i](maybePromise, holder);
|
|
||||||
holder.asyncNeeded = false;
|
|
||||||
} else if (((bitField & 33554432) !== 0)) {
|
|
||||||
callbacks[i].call(ret,
|
|
||||||
maybePromise._value(), holder);
|
|
||||||
} else if (((bitField & 16777216) !== 0)) {
|
|
||||||
ret._reject(maybePromise._reason());
|
|
||||||
} else {
|
|
||||||
ret._cancel();
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
callbacks[i].call(ret, maybePromise, holder);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!ret._isFateSealed()) {
|
|
||||||
if (holder.asyncNeeded) {
|
|
||||||
var domain = getDomain();
|
|
||||||
if (domain !== null) {
|
|
||||||
holder.fn = util.domainBind(domain, holder.fn);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret._setAsyncGuaranteed();
|
|
||||||
ret._setOnCancel(holder);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var $_len = arguments.length;var args = new Array($_len); for(var $_i = 0; $_i < $_len; ++$_i) {args[$_i] = arguments[$_i];};
|
|
||||||
if (fn) args.pop();
|
|
||||||
var ret = new PromiseArray(args).promise();
|
|
||||||
return fn !== undefined ? ret.spread(fn) : ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
-168
@@ -1,168 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise,
|
|
||||||
PromiseArray,
|
|
||||||
apiRejection,
|
|
||||||
tryConvertToPromise,
|
|
||||||
INTERNAL,
|
|
||||||
debug) {
|
|
||||||
var getDomain = Promise._getDomain;
|
|
||||||
var util = require("./util");
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
var async = Promise._async;
|
|
||||||
|
|
||||||
function MappingPromiseArray(promises, fn, limit, _filter) {
|
|
||||||
this.constructor$(promises);
|
|
||||||
this._promise._captureStackTrace();
|
|
||||||
var domain = getDomain();
|
|
||||||
this._callback = domain === null ? fn : util.domainBind(domain, fn);
|
|
||||||
this._preservedValues = _filter === INTERNAL
|
|
||||||
? new Array(this.length())
|
|
||||||
: null;
|
|
||||||
this._limit = limit;
|
|
||||||
this._inFlight = 0;
|
|
||||||
this._queue = [];
|
|
||||||
async.invoke(this._asyncInit, this, undefined);
|
|
||||||
}
|
|
||||||
util.inherits(MappingPromiseArray, PromiseArray);
|
|
||||||
|
|
||||||
MappingPromiseArray.prototype._asyncInit = function() {
|
|
||||||
this._init$(undefined, -2);
|
|
||||||
};
|
|
||||||
|
|
||||||
MappingPromiseArray.prototype._init = function () {};
|
|
||||||
|
|
||||||
MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
|
|
||||||
var values = this._values;
|
|
||||||
var length = this.length();
|
|
||||||
var preservedValues = this._preservedValues;
|
|
||||||
var limit = this._limit;
|
|
||||||
|
|
||||||
if (index < 0) {
|
|
||||||
index = (index * -1) - 1;
|
|
||||||
values[index] = value;
|
|
||||||
if (limit >= 1) {
|
|
||||||
this._inFlight--;
|
|
||||||
this._drainQueue();
|
|
||||||
if (this._isResolved()) return true;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (limit >= 1 && this._inFlight >= limit) {
|
|
||||||
values[index] = value;
|
|
||||||
this._queue.push(index);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (preservedValues !== null) preservedValues[index] = value;
|
|
||||||
|
|
||||||
var promise = this._promise;
|
|
||||||
var callback = this._callback;
|
|
||||||
var receiver = promise._boundValue();
|
|
||||||
promise._pushContext();
|
|
||||||
var ret = tryCatch(callback).call(receiver, value, index, length);
|
|
||||||
var promiseCreated = promise._popContext();
|
|
||||||
debug.checkForgottenReturns(
|
|
||||||
ret,
|
|
||||||
promiseCreated,
|
|
||||||
preservedValues !== null ? "Promise.filter" : "Promise.map",
|
|
||||||
promise
|
|
||||||
);
|
|
||||||
if (ret === errorObj) {
|
|
||||||
this._reject(ret.e);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
var maybePromise = tryConvertToPromise(ret, this._promise);
|
|
||||||
if (maybePromise instanceof Promise) {
|
|
||||||
maybePromise = maybePromise._target();
|
|
||||||
var bitField = maybePromise._bitField;
|
|
||||||
;
|
|
||||||
if (((bitField & 50397184) === 0)) {
|
|
||||||
if (limit >= 1) this._inFlight++;
|
|
||||||
values[index] = maybePromise;
|
|
||||||
maybePromise._proxy(this, (index + 1) * -1);
|
|
||||||
return false;
|
|
||||||
} else if (((bitField & 33554432) !== 0)) {
|
|
||||||
ret = maybePromise._value();
|
|
||||||
} else if (((bitField & 16777216) !== 0)) {
|
|
||||||
this._reject(maybePromise._reason());
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
this._cancel();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
values[index] = ret;
|
|
||||||
}
|
|
||||||
var totalResolved = ++this._totalResolved;
|
|
||||||
if (totalResolved >= length) {
|
|
||||||
if (preservedValues !== null) {
|
|
||||||
this._filter(values, preservedValues);
|
|
||||||
} else {
|
|
||||||
this._resolve(values);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
MappingPromiseArray.prototype._drainQueue = function () {
|
|
||||||
var queue = this._queue;
|
|
||||||
var limit = this._limit;
|
|
||||||
var values = this._values;
|
|
||||||
while (queue.length > 0 && this._inFlight < limit) {
|
|
||||||
if (this._isResolved()) return;
|
|
||||||
var index = queue.pop();
|
|
||||||
this._promiseFulfilled(values[index], index);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
MappingPromiseArray.prototype._filter = function (booleans, values) {
|
|
||||||
var len = values.length;
|
|
||||||
var ret = new Array(len);
|
|
||||||
var j = 0;
|
|
||||||
for (var i = 0; i < len; ++i) {
|
|
||||||
if (booleans[i]) ret[j++] = values[i];
|
|
||||||
}
|
|
||||||
ret.length = j;
|
|
||||||
this._resolve(ret);
|
|
||||||
};
|
|
||||||
|
|
||||||
MappingPromiseArray.prototype.preservedValues = function () {
|
|
||||||
return this._preservedValues;
|
|
||||||
};
|
|
||||||
|
|
||||||
function map(promises, fn, options, _filter) {
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
return apiRejection("expecting a function but got " + util.classString(fn));
|
|
||||||
}
|
|
||||||
|
|
||||||
var limit = 0;
|
|
||||||
if (options !== undefined) {
|
|
||||||
if (typeof options === "object" && options !== null) {
|
|
||||||
if (typeof options.concurrency !== "number") {
|
|
||||||
return Promise.reject(
|
|
||||||
new TypeError("'concurrency' must be a number but it is " +
|
|
||||||
util.classString(options.concurrency)));
|
|
||||||
}
|
|
||||||
limit = options.concurrency;
|
|
||||||
} else {
|
|
||||||
return Promise.reject(new TypeError(
|
|
||||||
"options argument must be an object but it is " +
|
|
||||||
util.classString(options)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
limit = typeof limit === "number" &&
|
|
||||||
isFinite(limit) && limit >= 1 ? limit : 0;
|
|
||||||
return new MappingPromiseArray(promises, fn, limit, _filter).promise();
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.prototype.map = function (fn, options) {
|
|
||||||
return map(this, fn, options, null);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.map = function (promises, fn, options, _filter) {
|
|
||||||
return map(promises, fn, options, _filter);
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
};
|
|
||||||
-55
@@ -1,55 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports =
|
|
||||||
function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
|
|
||||||
var util = require("./util");
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
|
|
||||||
Promise.method = function (fn) {
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
throw new Promise.TypeError("expecting a function but got " + util.classString(fn));
|
|
||||||
}
|
|
||||||
return function () {
|
|
||||||
var ret = new Promise(INTERNAL);
|
|
||||||
ret._captureStackTrace();
|
|
||||||
ret._pushContext();
|
|
||||||
var value = tryCatch(fn).apply(this, arguments);
|
|
||||||
var promiseCreated = ret._popContext();
|
|
||||||
debug.checkForgottenReturns(
|
|
||||||
value, promiseCreated, "Promise.method", ret);
|
|
||||||
ret._resolveFromSyncValue(value);
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.attempt = Promise["try"] = function (fn) {
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
return apiRejection("expecting a function but got " + util.classString(fn));
|
|
||||||
}
|
|
||||||
var ret = new Promise(INTERNAL);
|
|
||||||
ret._captureStackTrace();
|
|
||||||
ret._pushContext();
|
|
||||||
var value;
|
|
||||||
if (arguments.length > 1) {
|
|
||||||
debug.deprecated("calling Promise.try with more than 1 argument");
|
|
||||||
var arg = arguments[1];
|
|
||||||
var ctx = arguments[2];
|
|
||||||
value = util.isArray(arg) ? tryCatch(fn).apply(ctx, arg)
|
|
||||||
: tryCatch(fn).call(ctx, arg);
|
|
||||||
} else {
|
|
||||||
value = tryCatch(fn)();
|
|
||||||
}
|
|
||||||
var promiseCreated = ret._popContext();
|
|
||||||
debug.checkForgottenReturns(
|
|
||||||
value, promiseCreated, "Promise.try", ret);
|
|
||||||
ret._resolveFromSyncValue(value);
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._resolveFromSyncValue = function (value) {
|
|
||||||
if (value === util.errorObj) {
|
|
||||||
this._rejectCallback(value.e, false);
|
|
||||||
} else {
|
|
||||||
this._resolveCallback(value, true);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-51
@@ -1,51 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var util = require("./util");
|
|
||||||
var maybeWrapAsError = util.maybeWrapAsError;
|
|
||||||
var errors = require("./errors");
|
|
||||||
var OperationalError = errors.OperationalError;
|
|
||||||
var es5 = require("./es5");
|
|
||||||
|
|
||||||
function isUntypedError(obj) {
|
|
||||||
return obj instanceof Error &&
|
|
||||||
es5.getPrototypeOf(obj) === Error.prototype;
|
|
||||||
}
|
|
||||||
|
|
||||||
var rErrorKey = /^(?:name|message|stack|cause)$/;
|
|
||||||
function wrapAsOperationalError(obj) {
|
|
||||||
var ret;
|
|
||||||
if (isUntypedError(obj)) {
|
|
||||||
ret = new OperationalError(obj);
|
|
||||||
ret.name = obj.name;
|
|
||||||
ret.message = obj.message;
|
|
||||||
ret.stack = obj.stack;
|
|
||||||
var keys = es5.keys(obj);
|
|
||||||
for (var i = 0; i < keys.length; ++i) {
|
|
||||||
var key = keys[i];
|
|
||||||
if (!rErrorKey.test(key)) {
|
|
||||||
ret[key] = obj[key];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
util.markAsOriginatingFromRejection(obj);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
function nodebackForPromise(promise, multiArgs) {
|
|
||||||
return function(err, value) {
|
|
||||||
if (promise === null) return;
|
|
||||||
if (err) {
|
|
||||||
var wrapped = wrapAsOperationalError(maybeWrapAsError(err));
|
|
||||||
promise._attachExtraTrace(wrapped);
|
|
||||||
promise._reject(wrapped);
|
|
||||||
} else if (!multiArgs) {
|
|
||||||
promise._fulfill(value);
|
|
||||||
} else {
|
|
||||||
var $_len = arguments.length;var args = new Array(Math.max($_len - 1, 0)); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
|
|
||||||
promise._fulfill(args);
|
|
||||||
}
|
|
||||||
promise = null;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = nodebackForPromise;
|
|
||||||
-58
@@ -1,58 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise) {
|
|
||||||
var util = require("./util");
|
|
||||||
var async = Promise._async;
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
|
|
||||||
function spreadAdapter(val, nodeback) {
|
|
||||||
var promise = this;
|
|
||||||
if (!util.isArray(val)) return successAdapter.call(promise, val, nodeback);
|
|
||||||
var ret =
|
|
||||||
tryCatch(nodeback).apply(promise._boundValue(), [null].concat(val));
|
|
||||||
if (ret === errorObj) {
|
|
||||||
async.throwLater(ret.e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function successAdapter(val, nodeback) {
|
|
||||||
var promise = this;
|
|
||||||
var receiver = promise._boundValue();
|
|
||||||
var ret = val === undefined
|
|
||||||
? tryCatch(nodeback).call(receiver, null)
|
|
||||||
: tryCatch(nodeback).call(receiver, null, val);
|
|
||||||
if (ret === errorObj) {
|
|
||||||
async.throwLater(ret.e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function errorAdapter(reason, nodeback) {
|
|
||||||
var promise = this;
|
|
||||||
if (!reason) {
|
|
||||||
var newReason = new Error(reason + "");
|
|
||||||
newReason.cause = reason;
|
|
||||||
reason = newReason;
|
|
||||||
}
|
|
||||||
var ret = tryCatch(nodeback).call(promise._boundValue(), reason);
|
|
||||||
if (ret === errorObj) {
|
|
||||||
async.throwLater(ret.e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.prototype.asCallback = Promise.prototype.nodeify = function (nodeback,
|
|
||||||
options) {
|
|
||||||
if (typeof nodeback == "function") {
|
|
||||||
var adapter = successAdapter;
|
|
||||||
if (options !== undefined && Object(options).spread) {
|
|
||||||
adapter = spreadAdapter;
|
|
||||||
}
|
|
||||||
this._then(
|
|
||||||
adapter,
|
|
||||||
errorAdapter,
|
|
||||||
undefined,
|
|
||||||
this,
|
|
||||||
nodeback
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return this;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-775
@@ -1,775 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function() {
|
|
||||||
var makeSelfResolutionError = function () {
|
|
||||||
return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
};
|
|
||||||
var reflectHandler = function() {
|
|
||||||
return new Promise.PromiseInspection(this._target());
|
|
||||||
};
|
|
||||||
var apiRejection = function(msg) {
|
|
||||||
return Promise.reject(new TypeError(msg));
|
|
||||||
};
|
|
||||||
function Proxyable() {}
|
|
||||||
var UNDEFINED_BINDING = {};
|
|
||||||
var util = require("./util");
|
|
||||||
|
|
||||||
var getDomain;
|
|
||||||
if (util.isNode) {
|
|
||||||
getDomain = function() {
|
|
||||||
var ret = process.domain;
|
|
||||||
if (ret === undefined) ret = null;
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
getDomain = function() {
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
util.notEnumerableProp(Promise, "_getDomain", getDomain);
|
|
||||||
|
|
||||||
var es5 = require("./es5");
|
|
||||||
var Async = require("./async");
|
|
||||||
var async = new Async();
|
|
||||||
es5.defineProperty(Promise, "_async", {value: async});
|
|
||||||
var errors = require("./errors");
|
|
||||||
var TypeError = Promise.TypeError = errors.TypeError;
|
|
||||||
Promise.RangeError = errors.RangeError;
|
|
||||||
var CancellationError = Promise.CancellationError = errors.CancellationError;
|
|
||||||
Promise.TimeoutError = errors.TimeoutError;
|
|
||||||
Promise.OperationalError = errors.OperationalError;
|
|
||||||
Promise.RejectionError = errors.OperationalError;
|
|
||||||
Promise.AggregateError = errors.AggregateError;
|
|
||||||
var INTERNAL = function(){};
|
|
||||||
var APPLY = {};
|
|
||||||
var NEXT_FILTER = {};
|
|
||||||
var tryConvertToPromise = require("./thenables")(Promise, INTERNAL);
|
|
||||||
var PromiseArray =
|
|
||||||
require("./promise_array")(Promise, INTERNAL,
|
|
||||||
tryConvertToPromise, apiRejection, Proxyable);
|
|
||||||
var Context = require("./context")(Promise);
|
|
||||||
/*jshint unused:false*/
|
|
||||||
var createContext = Context.create;
|
|
||||||
var debug = require("./debuggability")(Promise, Context);
|
|
||||||
var CapturedTrace = debug.CapturedTrace;
|
|
||||||
var PassThroughHandlerContext =
|
|
||||||
require("./finally")(Promise, tryConvertToPromise, NEXT_FILTER);
|
|
||||||
var catchFilter = require("./catch_filter")(NEXT_FILTER);
|
|
||||||
var nodebackForPromise = require("./nodeback");
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
function check(self, executor) {
|
|
||||||
if (self == null || self.constructor !== Promise) {
|
|
||||||
throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
if (typeof executor !== "function") {
|
|
||||||
throw new TypeError("expecting a function but got " + util.classString(executor));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function Promise(executor) {
|
|
||||||
if (executor !== INTERNAL) {
|
|
||||||
check(this, executor);
|
|
||||||
}
|
|
||||||
this._bitField = 0;
|
|
||||||
this._fulfillmentHandler0 = undefined;
|
|
||||||
this._rejectionHandler0 = undefined;
|
|
||||||
this._promise0 = undefined;
|
|
||||||
this._receiver0 = undefined;
|
|
||||||
this._resolveFromExecutor(executor);
|
|
||||||
this._promiseCreated();
|
|
||||||
this._fireEvent("promiseCreated", this);
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.prototype.toString = function () {
|
|
||||||
return "[object Promise]";
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.caught = Promise.prototype["catch"] = function (fn) {
|
|
||||||
var len = arguments.length;
|
|
||||||
if (len > 1) {
|
|
||||||
var catchInstances = new Array(len - 1),
|
|
||||||
j = 0, i;
|
|
||||||
for (i = 0; i < len - 1; ++i) {
|
|
||||||
var item = arguments[i];
|
|
||||||
if (util.isObject(item)) {
|
|
||||||
catchInstances[j++] = item;
|
|
||||||
} else {
|
|
||||||
return apiRejection("Catch statement predicate: " +
|
|
||||||
"expecting an object but got " + util.classString(item));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catchInstances.length = j;
|
|
||||||
fn = arguments[i];
|
|
||||||
return this.then(undefined, catchFilter(catchInstances, fn, this));
|
|
||||||
}
|
|
||||||
return this.then(undefined, fn);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.reflect = function () {
|
|
||||||
return this._then(reflectHandler,
|
|
||||||
reflectHandler, undefined, this, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.then = function (didFulfill, didReject) {
|
|
||||||
if (debug.warnings() && arguments.length > 0 &&
|
|
||||||
typeof didFulfill !== "function" &&
|
|
||||||
typeof didReject !== "function") {
|
|
||||||
var msg = ".then() only accepts functions but was passed: " +
|
|
||||||
util.classString(didFulfill);
|
|
||||||
if (arguments.length > 1) {
|
|
||||||
msg += ", " + util.classString(didReject);
|
|
||||||
}
|
|
||||||
this._warn(msg);
|
|
||||||
}
|
|
||||||
return this._then(didFulfill, didReject, undefined, undefined, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.done = function (didFulfill, didReject) {
|
|
||||||
var promise =
|
|
||||||
this._then(didFulfill, didReject, undefined, undefined, undefined);
|
|
||||||
promise._setIsFinal();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.spread = function (fn) {
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
return apiRejection("expecting a function but got " + util.classString(fn));
|
|
||||||
}
|
|
||||||
return this.all()._then(fn, undefined, undefined, APPLY, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.toJSON = function () {
|
|
||||||
var ret = {
|
|
||||||
isFulfilled: false,
|
|
||||||
isRejected: false,
|
|
||||||
fulfillmentValue: undefined,
|
|
||||||
rejectionReason: undefined
|
|
||||||
};
|
|
||||||
if (this.isFulfilled()) {
|
|
||||||
ret.fulfillmentValue = this.value();
|
|
||||||
ret.isFulfilled = true;
|
|
||||||
} else if (this.isRejected()) {
|
|
||||||
ret.rejectionReason = this.reason();
|
|
||||||
ret.isRejected = true;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.all = function () {
|
|
||||||
if (arguments.length > 0) {
|
|
||||||
this._warn(".all() was passed arguments but it does not take any");
|
|
||||||
}
|
|
||||||
return new PromiseArray(this).promise();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.error = function (fn) {
|
|
||||||
return this.caught(util.originatesFromRejection, fn);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.getNewLibraryCopy = module.exports;
|
|
||||||
|
|
||||||
Promise.is = function (val) {
|
|
||||||
return val instanceof Promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.fromNode = Promise.fromCallback = function(fn) {
|
|
||||||
var ret = new Promise(INTERNAL);
|
|
||||||
ret._captureStackTrace();
|
|
||||||
var multiArgs = arguments.length > 1 ? !!Object(arguments[1]).multiArgs
|
|
||||||
: false;
|
|
||||||
var result = tryCatch(fn)(nodebackForPromise(ret, multiArgs));
|
|
||||||
if (result === errorObj) {
|
|
||||||
ret._rejectCallback(result.e, true);
|
|
||||||
}
|
|
||||||
if (!ret._isFateSealed()) ret._setAsyncGuaranteed();
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.all = function (promises) {
|
|
||||||
return new PromiseArray(promises).promise();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.cast = function (obj) {
|
|
||||||
var ret = tryConvertToPromise(obj);
|
|
||||||
if (!(ret instanceof Promise)) {
|
|
||||||
ret = new Promise(INTERNAL);
|
|
||||||
ret._captureStackTrace();
|
|
||||||
ret._setFulfilled();
|
|
||||||
ret._rejectionHandler0 = obj;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.resolve = Promise.fulfilled = Promise.cast;
|
|
||||||
|
|
||||||
Promise.reject = Promise.rejected = function (reason) {
|
|
||||||
var ret = new Promise(INTERNAL);
|
|
||||||
ret._captureStackTrace();
|
|
||||||
ret._rejectCallback(reason, true);
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.setScheduler = function(fn) {
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
throw new TypeError("expecting a function but got " + util.classString(fn));
|
|
||||||
}
|
|
||||||
return async.setScheduler(fn);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._then = function (
|
|
||||||
didFulfill,
|
|
||||||
didReject,
|
|
||||||
_, receiver,
|
|
||||||
internalData
|
|
||||||
) {
|
|
||||||
var haveInternalData = internalData !== undefined;
|
|
||||||
var promise = haveInternalData ? internalData : new Promise(INTERNAL);
|
|
||||||
var target = this._target();
|
|
||||||
var bitField = target._bitField;
|
|
||||||
|
|
||||||
if (!haveInternalData) {
|
|
||||||
promise._propagateFrom(this, 3);
|
|
||||||
promise._captureStackTrace();
|
|
||||||
if (receiver === undefined &&
|
|
||||||
((this._bitField & 2097152) !== 0)) {
|
|
||||||
if (!((bitField & 50397184) === 0)) {
|
|
||||||
receiver = this._boundValue();
|
|
||||||
} else {
|
|
||||||
receiver = target === this ? undefined : this._boundTo;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._fireEvent("promiseChained", this, promise);
|
|
||||||
}
|
|
||||||
|
|
||||||
var domain = getDomain();
|
|
||||||
if (!((bitField & 50397184) === 0)) {
|
|
||||||
var handler, value, settler = target._settlePromiseCtx;
|
|
||||||
if (((bitField & 33554432) !== 0)) {
|
|
||||||
value = target._rejectionHandler0;
|
|
||||||
handler = didFulfill;
|
|
||||||
} else if (((bitField & 16777216) !== 0)) {
|
|
||||||
value = target._fulfillmentHandler0;
|
|
||||||
handler = didReject;
|
|
||||||
target._unsetRejectionIsUnhandled();
|
|
||||||
} else {
|
|
||||||
settler = target._settlePromiseLateCancellationObserver;
|
|
||||||
value = new CancellationError("late cancellation observer");
|
|
||||||
target._attachExtraTrace(value);
|
|
||||||
handler = didReject;
|
|
||||||
}
|
|
||||||
|
|
||||||
async.invoke(settler, target, {
|
|
||||||
handler: domain === null ? handler
|
|
||||||
: (typeof handler === "function" &&
|
|
||||||
util.domainBind(domain, handler)),
|
|
||||||
promise: promise,
|
|
||||||
receiver: receiver,
|
|
||||||
value: value
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
target._addCallbacks(didFulfill, didReject, promise, receiver, domain);
|
|
||||||
}
|
|
||||||
|
|
||||||
return promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._length = function () {
|
|
||||||
return this._bitField & 65535;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._isFateSealed = function () {
|
|
||||||
return (this._bitField & 117506048) !== 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._isFollowing = function () {
|
|
||||||
return (this._bitField & 67108864) === 67108864;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setLength = function (len) {
|
|
||||||
this._bitField = (this._bitField & -65536) |
|
|
||||||
(len & 65535);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setFulfilled = function () {
|
|
||||||
this._bitField = this._bitField | 33554432;
|
|
||||||
this._fireEvent("promiseFulfilled", this);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setRejected = function () {
|
|
||||||
this._bitField = this._bitField | 16777216;
|
|
||||||
this._fireEvent("promiseRejected", this);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setFollowing = function () {
|
|
||||||
this._bitField = this._bitField | 67108864;
|
|
||||||
this._fireEvent("promiseResolved", this);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setIsFinal = function () {
|
|
||||||
this._bitField = this._bitField | 4194304;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._isFinal = function () {
|
|
||||||
return (this._bitField & 4194304) > 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._unsetCancelled = function() {
|
|
||||||
this._bitField = this._bitField & (~65536);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setCancelled = function() {
|
|
||||||
this._bitField = this._bitField | 65536;
|
|
||||||
this._fireEvent("promiseCancelled", this);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setWillBeCancelled = function() {
|
|
||||||
this._bitField = this._bitField | 8388608;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setAsyncGuaranteed = function() {
|
|
||||||
if (async.hasCustomScheduler()) return;
|
|
||||||
this._bitField = this._bitField | 134217728;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._receiverAt = function (index) {
|
|
||||||
var ret = index === 0 ? this._receiver0 : this[
|
|
||||||
index * 4 - 4 + 3];
|
|
||||||
if (ret === UNDEFINED_BINDING) {
|
|
||||||
return undefined;
|
|
||||||
} else if (ret === undefined && this._isBound()) {
|
|
||||||
return this._boundValue();
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._promiseAt = function (index) {
|
|
||||||
return this[
|
|
||||||
index * 4 - 4 + 2];
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._fulfillmentHandlerAt = function (index) {
|
|
||||||
return this[
|
|
||||||
index * 4 - 4 + 0];
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._rejectionHandlerAt = function (index) {
|
|
||||||
return this[
|
|
||||||
index * 4 - 4 + 1];
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._boundValue = function() {};
|
|
||||||
|
|
||||||
Promise.prototype._migrateCallback0 = function (follower) {
|
|
||||||
var bitField = follower._bitField;
|
|
||||||
var fulfill = follower._fulfillmentHandler0;
|
|
||||||
var reject = follower._rejectionHandler0;
|
|
||||||
var promise = follower._promise0;
|
|
||||||
var receiver = follower._receiverAt(0);
|
|
||||||
if (receiver === undefined) receiver = UNDEFINED_BINDING;
|
|
||||||
this._addCallbacks(fulfill, reject, promise, receiver, null);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._migrateCallbackAt = function (follower, index) {
|
|
||||||
var fulfill = follower._fulfillmentHandlerAt(index);
|
|
||||||
var reject = follower._rejectionHandlerAt(index);
|
|
||||||
var promise = follower._promiseAt(index);
|
|
||||||
var receiver = follower._receiverAt(index);
|
|
||||||
if (receiver === undefined) receiver = UNDEFINED_BINDING;
|
|
||||||
this._addCallbacks(fulfill, reject, promise, receiver, null);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._addCallbacks = function (
|
|
||||||
fulfill,
|
|
||||||
reject,
|
|
||||||
promise,
|
|
||||||
receiver,
|
|
||||||
domain
|
|
||||||
) {
|
|
||||||
var index = this._length();
|
|
||||||
|
|
||||||
if (index >= 65535 - 4) {
|
|
||||||
index = 0;
|
|
||||||
this._setLength(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (index === 0) {
|
|
||||||
this._promise0 = promise;
|
|
||||||
this._receiver0 = receiver;
|
|
||||||
if (typeof fulfill === "function") {
|
|
||||||
this._fulfillmentHandler0 =
|
|
||||||
domain === null ? fulfill : util.domainBind(domain, fulfill);
|
|
||||||
}
|
|
||||||
if (typeof reject === "function") {
|
|
||||||
this._rejectionHandler0 =
|
|
||||||
domain === null ? reject : util.domainBind(domain, reject);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
var base = index * 4 - 4;
|
|
||||||
this[base + 2] = promise;
|
|
||||||
this[base + 3] = receiver;
|
|
||||||
if (typeof fulfill === "function") {
|
|
||||||
this[base + 0] =
|
|
||||||
domain === null ? fulfill : util.domainBind(domain, fulfill);
|
|
||||||
}
|
|
||||||
if (typeof reject === "function") {
|
|
||||||
this[base + 1] =
|
|
||||||
domain === null ? reject : util.domainBind(domain, reject);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._setLength(index + 1);
|
|
||||||
return index;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._proxy = function (proxyable, arg) {
|
|
||||||
this._addCallbacks(undefined, undefined, arg, proxyable, null);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._resolveCallback = function(value, shouldBind) {
|
|
||||||
if (((this._bitField & 117506048) !== 0)) return;
|
|
||||||
if (value === this)
|
|
||||||
return this._rejectCallback(makeSelfResolutionError(), false);
|
|
||||||
var maybePromise = tryConvertToPromise(value, this);
|
|
||||||
if (!(maybePromise instanceof Promise)) return this._fulfill(value);
|
|
||||||
|
|
||||||
if (shouldBind) this._propagateFrom(maybePromise, 2);
|
|
||||||
|
|
||||||
var promise = maybePromise._target();
|
|
||||||
|
|
||||||
if (promise === this) {
|
|
||||||
this._reject(makeSelfResolutionError());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var bitField = promise._bitField;
|
|
||||||
if (((bitField & 50397184) === 0)) {
|
|
||||||
var len = this._length();
|
|
||||||
if (len > 0) promise._migrateCallback0(this);
|
|
||||||
for (var i = 1; i < len; ++i) {
|
|
||||||
promise._migrateCallbackAt(this, i);
|
|
||||||
}
|
|
||||||
this._setFollowing();
|
|
||||||
this._setLength(0);
|
|
||||||
this._setFollowee(promise);
|
|
||||||
} else if (((bitField & 33554432) !== 0)) {
|
|
||||||
this._fulfill(promise._value());
|
|
||||||
} else if (((bitField & 16777216) !== 0)) {
|
|
||||||
this._reject(promise._reason());
|
|
||||||
} else {
|
|
||||||
var reason = new CancellationError("late cancellation observer");
|
|
||||||
promise._attachExtraTrace(reason);
|
|
||||||
this._reject(reason);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._rejectCallback =
|
|
||||||
function(reason, synchronous, ignoreNonErrorWarnings) {
|
|
||||||
var trace = util.ensureErrorObject(reason);
|
|
||||||
var hasStack = trace === reason;
|
|
||||||
if (!hasStack && !ignoreNonErrorWarnings && debug.warnings()) {
|
|
||||||
var message = "a promise was rejected with a non-error: " +
|
|
||||||
util.classString(reason);
|
|
||||||
this._warn(message, true);
|
|
||||||
}
|
|
||||||
this._attachExtraTrace(trace, synchronous ? hasStack : false);
|
|
||||||
this._reject(reason);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._resolveFromExecutor = function (executor) {
|
|
||||||
if (executor === INTERNAL) return;
|
|
||||||
var promise = this;
|
|
||||||
this._captureStackTrace();
|
|
||||||
this._pushContext();
|
|
||||||
var synchronous = true;
|
|
||||||
var r = this._execute(executor, function(value) {
|
|
||||||
promise._resolveCallback(value);
|
|
||||||
}, function (reason) {
|
|
||||||
promise._rejectCallback(reason, synchronous);
|
|
||||||
});
|
|
||||||
synchronous = false;
|
|
||||||
this._popContext();
|
|
||||||
|
|
||||||
if (r !== undefined) {
|
|
||||||
promise._rejectCallback(r, true);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._settlePromiseFromHandler = function (
|
|
||||||
handler, receiver, value, promise
|
|
||||||
) {
|
|
||||||
var bitField = promise._bitField;
|
|
||||||
if (((bitField & 65536) !== 0)) return;
|
|
||||||
promise._pushContext();
|
|
||||||
var x;
|
|
||||||
if (receiver === APPLY) {
|
|
||||||
if (!value || typeof value.length !== "number") {
|
|
||||||
x = errorObj;
|
|
||||||
x.e = new TypeError("cannot .spread() a non-array: " +
|
|
||||||
util.classString(value));
|
|
||||||
} else {
|
|
||||||
x = tryCatch(handler).apply(this._boundValue(), value);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
x = tryCatch(handler).call(receiver, value);
|
|
||||||
}
|
|
||||||
var promiseCreated = promise._popContext();
|
|
||||||
bitField = promise._bitField;
|
|
||||||
if (((bitField & 65536) !== 0)) return;
|
|
||||||
|
|
||||||
if (x === NEXT_FILTER) {
|
|
||||||
promise._reject(value);
|
|
||||||
} else if (x === errorObj) {
|
|
||||||
promise._rejectCallback(x.e, false);
|
|
||||||
} else {
|
|
||||||
debug.checkForgottenReturns(x, promiseCreated, "", promise, this);
|
|
||||||
promise._resolveCallback(x);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._target = function() {
|
|
||||||
var ret = this;
|
|
||||||
while (ret._isFollowing()) ret = ret._followee();
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._followee = function() {
|
|
||||||
return this._rejectionHandler0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setFollowee = function(promise) {
|
|
||||||
this._rejectionHandler0 = promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._settlePromise = function(promise, handler, receiver, value) {
|
|
||||||
var isPromise = promise instanceof Promise;
|
|
||||||
var bitField = this._bitField;
|
|
||||||
var asyncGuaranteed = ((bitField & 134217728) !== 0);
|
|
||||||
if (((bitField & 65536) !== 0)) {
|
|
||||||
if (isPromise) promise._invokeInternalOnCancel();
|
|
||||||
|
|
||||||
if (receiver instanceof PassThroughHandlerContext &&
|
|
||||||
receiver.isFinallyHandler()) {
|
|
||||||
receiver.cancelPromise = promise;
|
|
||||||
if (tryCatch(handler).call(receiver, value) === errorObj) {
|
|
||||||
promise._reject(errorObj.e);
|
|
||||||
}
|
|
||||||
} else if (handler === reflectHandler) {
|
|
||||||
promise._fulfill(reflectHandler.call(receiver));
|
|
||||||
} else if (receiver instanceof Proxyable) {
|
|
||||||
receiver._promiseCancelled(promise);
|
|
||||||
} else if (isPromise || promise instanceof PromiseArray) {
|
|
||||||
promise._cancel();
|
|
||||||
} else {
|
|
||||||
receiver.cancel();
|
|
||||||
}
|
|
||||||
} else if (typeof handler === "function") {
|
|
||||||
if (!isPromise) {
|
|
||||||
handler.call(receiver, value, promise);
|
|
||||||
} else {
|
|
||||||
if (asyncGuaranteed) promise._setAsyncGuaranteed();
|
|
||||||
this._settlePromiseFromHandler(handler, receiver, value, promise);
|
|
||||||
}
|
|
||||||
} else if (receiver instanceof Proxyable) {
|
|
||||||
if (!receiver._isResolved()) {
|
|
||||||
if (((bitField & 33554432) !== 0)) {
|
|
||||||
receiver._promiseFulfilled(value, promise);
|
|
||||||
} else {
|
|
||||||
receiver._promiseRejected(value, promise);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else if (isPromise) {
|
|
||||||
if (asyncGuaranteed) promise._setAsyncGuaranteed();
|
|
||||||
if (((bitField & 33554432) !== 0)) {
|
|
||||||
promise._fulfill(value);
|
|
||||||
} else {
|
|
||||||
promise._reject(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._settlePromiseLateCancellationObserver = function(ctx) {
|
|
||||||
var handler = ctx.handler;
|
|
||||||
var promise = ctx.promise;
|
|
||||||
var receiver = ctx.receiver;
|
|
||||||
var value = ctx.value;
|
|
||||||
if (typeof handler === "function") {
|
|
||||||
if (!(promise instanceof Promise)) {
|
|
||||||
handler.call(receiver, value, promise);
|
|
||||||
} else {
|
|
||||||
this._settlePromiseFromHandler(handler, receiver, value, promise);
|
|
||||||
}
|
|
||||||
} else if (promise instanceof Promise) {
|
|
||||||
promise._reject(value);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._settlePromiseCtx = function(ctx) {
|
|
||||||
this._settlePromise(ctx.promise, ctx.handler, ctx.receiver, ctx.value);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._settlePromise0 = function(handler, value, bitField) {
|
|
||||||
var promise = this._promise0;
|
|
||||||
var receiver = this._receiverAt(0);
|
|
||||||
this._promise0 = undefined;
|
|
||||||
this._receiver0 = undefined;
|
|
||||||
this._settlePromise(promise, handler, receiver, value);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._clearCallbackDataAtIndex = function(index) {
|
|
||||||
var base = index * 4 - 4;
|
|
||||||
this[base + 2] =
|
|
||||||
this[base + 3] =
|
|
||||||
this[base + 0] =
|
|
||||||
this[base + 1] = undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._fulfill = function (value) {
|
|
||||||
var bitField = this._bitField;
|
|
||||||
if (((bitField & 117506048) >>> 16)) return;
|
|
||||||
if (value === this) {
|
|
||||||
var err = makeSelfResolutionError();
|
|
||||||
this._attachExtraTrace(err);
|
|
||||||
return this._reject(err);
|
|
||||||
}
|
|
||||||
this._setFulfilled();
|
|
||||||
this._rejectionHandler0 = value;
|
|
||||||
|
|
||||||
if ((bitField & 65535) > 0) {
|
|
||||||
if (((bitField & 134217728) !== 0)) {
|
|
||||||
this._settlePromises();
|
|
||||||
} else {
|
|
||||||
async.settlePromises(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._reject = function (reason) {
|
|
||||||
var bitField = this._bitField;
|
|
||||||
if (((bitField & 117506048) >>> 16)) return;
|
|
||||||
this._setRejected();
|
|
||||||
this._fulfillmentHandler0 = reason;
|
|
||||||
|
|
||||||
if (this._isFinal()) {
|
|
||||||
return async.fatalError(reason, util.isNode);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((bitField & 65535) > 0) {
|
|
||||||
async.settlePromises(this);
|
|
||||||
} else {
|
|
||||||
this._ensurePossibleRejectionHandled();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._fulfillPromises = function (len, value) {
|
|
||||||
for (var i = 1; i < len; i++) {
|
|
||||||
var handler = this._fulfillmentHandlerAt(i);
|
|
||||||
var promise = this._promiseAt(i);
|
|
||||||
var receiver = this._receiverAt(i);
|
|
||||||
this._clearCallbackDataAtIndex(i);
|
|
||||||
this._settlePromise(promise, handler, receiver, value);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._rejectPromises = function (len, reason) {
|
|
||||||
for (var i = 1; i < len; i++) {
|
|
||||||
var handler = this._rejectionHandlerAt(i);
|
|
||||||
var promise = this._promiseAt(i);
|
|
||||||
var receiver = this._receiverAt(i);
|
|
||||||
this._clearCallbackDataAtIndex(i);
|
|
||||||
this._settlePromise(promise, handler, receiver, reason);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._settlePromises = function () {
|
|
||||||
var bitField = this._bitField;
|
|
||||||
var len = (bitField & 65535);
|
|
||||||
|
|
||||||
if (len > 0) {
|
|
||||||
if (((bitField & 16842752) !== 0)) {
|
|
||||||
var reason = this._fulfillmentHandler0;
|
|
||||||
this._settlePromise0(this._rejectionHandler0, reason, bitField);
|
|
||||||
this._rejectPromises(len, reason);
|
|
||||||
} else {
|
|
||||||
var value = this._rejectionHandler0;
|
|
||||||
this._settlePromise0(this._fulfillmentHandler0, value, bitField);
|
|
||||||
this._fulfillPromises(len, value);
|
|
||||||
}
|
|
||||||
this._setLength(0);
|
|
||||||
}
|
|
||||||
this._clearCancellationData();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._settledValue = function() {
|
|
||||||
var bitField = this._bitField;
|
|
||||||
if (((bitField & 33554432) !== 0)) {
|
|
||||||
return this._rejectionHandler0;
|
|
||||||
} else if (((bitField & 16777216) !== 0)) {
|
|
||||||
return this._fulfillmentHandler0;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function deferResolve(v) {this.promise._resolveCallback(v);}
|
|
||||||
function deferReject(v) {this.promise._rejectCallback(v, false);}
|
|
||||||
|
|
||||||
Promise.defer = Promise.pending = function() {
|
|
||||||
debug.deprecated("Promise.defer", "new Promise");
|
|
||||||
var promise = new Promise(INTERNAL);
|
|
||||||
return {
|
|
||||||
promise: promise,
|
|
||||||
resolve: deferResolve,
|
|
||||||
reject: deferReject
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
util.notEnumerableProp(Promise,
|
|
||||||
"_makeSelfResolutionError",
|
|
||||||
makeSelfResolutionError);
|
|
||||||
|
|
||||||
require("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
|
|
||||||
debug);
|
|
||||||
require("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
|
|
||||||
require("./cancel")(Promise, PromiseArray, apiRejection, debug);
|
|
||||||
require("./direct_resolve")(Promise);
|
|
||||||
require("./synchronous_inspection")(Promise);
|
|
||||||
require("./join")(
|
|
||||||
Promise, PromiseArray, tryConvertToPromise, INTERNAL, async, getDomain);
|
|
||||||
Promise.Promise = Promise;
|
|
||||||
Promise.version = "3.5.1";
|
|
||||||
require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
|
|
||||||
require('./call_get.js')(Promise);
|
|
||||||
require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
|
|
||||||
require('./timers.js')(Promise, INTERNAL, debug);
|
|
||||||
require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
|
|
||||||
require('./nodeify.js')(Promise);
|
|
||||||
require('./promisify.js')(Promise, INTERNAL);
|
|
||||||
require('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
|
|
||||||
require('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
|
|
||||||
require('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
|
|
||||||
require('./settle.js')(Promise, PromiseArray, debug);
|
|
||||||
require('./some.js')(Promise, PromiseArray, apiRejection);
|
|
||||||
require('./filter.js')(Promise, INTERNAL);
|
|
||||||
require('./each.js')(Promise, INTERNAL);
|
|
||||||
require('./any.js')(Promise);
|
|
||||||
|
|
||||||
util.toFastProperties(Promise);
|
|
||||||
util.toFastProperties(Promise.prototype);
|
|
||||||
function fillTypes(value) {
|
|
||||||
var p = new Promise(INTERNAL);
|
|
||||||
p._fulfillmentHandler0 = value;
|
|
||||||
p._rejectionHandler0 = value;
|
|
||||||
p._promise0 = value;
|
|
||||||
p._receiver0 = value;
|
|
||||||
}
|
|
||||||
// Complete slack tracking, opt out of field-type tracking and
|
|
||||||
// stabilize map
|
|
||||||
fillTypes({a: 1});
|
|
||||||
fillTypes({b: 2});
|
|
||||||
fillTypes({c: 3});
|
|
||||||
fillTypes(1);
|
|
||||||
fillTypes(function(){});
|
|
||||||
fillTypes(undefined);
|
|
||||||
fillTypes(false);
|
|
||||||
fillTypes(new Promise(INTERNAL));
|
|
||||||
debug.setBounds(Async.firstLineError, util.lastLineError);
|
|
||||||
return Promise;
|
|
||||||
|
|
||||||
};
|
|
||||||
-185
@@ -1,185 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, INTERNAL, tryConvertToPromise,
|
|
||||||
apiRejection, Proxyable) {
|
|
||||||
var util = require("./util");
|
|
||||||
var isArray = util.isArray;
|
|
||||||
|
|
||||||
function toResolutionValue(val) {
|
|
||||||
switch(val) {
|
|
||||||
case -2: return [];
|
|
||||||
case -3: return {};
|
|
||||||
case -6: return new Map();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function PromiseArray(values) {
|
|
||||||
var promise = this._promise = new Promise(INTERNAL);
|
|
||||||
if (values instanceof Promise) {
|
|
||||||
promise._propagateFrom(values, 3);
|
|
||||||
}
|
|
||||||
promise._setOnCancel(this);
|
|
||||||
this._values = values;
|
|
||||||
this._length = 0;
|
|
||||||
this._totalResolved = 0;
|
|
||||||
this._init(undefined, -2);
|
|
||||||
}
|
|
||||||
util.inherits(PromiseArray, Proxyable);
|
|
||||||
|
|
||||||
PromiseArray.prototype.length = function () {
|
|
||||||
return this._length;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype.promise = function () {
|
|
||||||
return this._promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._init = function init(_, resolveValueIfEmpty) {
|
|
||||||
var values = tryConvertToPromise(this._values, this._promise);
|
|
||||||
if (values instanceof Promise) {
|
|
||||||
values = values._target();
|
|
||||||
var bitField = values._bitField;
|
|
||||||
;
|
|
||||||
this._values = values;
|
|
||||||
|
|
||||||
if (((bitField & 50397184) === 0)) {
|
|
||||||
this._promise._setAsyncGuaranteed();
|
|
||||||
return values._then(
|
|
||||||
init,
|
|
||||||
this._reject,
|
|
||||||
undefined,
|
|
||||||
this,
|
|
||||||
resolveValueIfEmpty
|
|
||||||
);
|
|
||||||
} else if (((bitField & 33554432) !== 0)) {
|
|
||||||
values = values._value();
|
|
||||||
} else if (((bitField & 16777216) !== 0)) {
|
|
||||||
return this._reject(values._reason());
|
|
||||||
} else {
|
|
||||||
return this._cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
values = util.asArray(values);
|
|
||||||
if (values === null) {
|
|
||||||
var err = apiRejection(
|
|
||||||
"expecting an array or an iterable object but got " + util.classString(values)).reason();
|
|
||||||
this._promise._rejectCallback(err, false);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (values.length === 0) {
|
|
||||||
if (resolveValueIfEmpty === -5) {
|
|
||||||
this._resolveEmptyArray();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this._resolve(toResolutionValue(resolveValueIfEmpty));
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._iterate(values);
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._iterate = function(values) {
|
|
||||||
var len = this.getActualLength(values.length);
|
|
||||||
this._length = len;
|
|
||||||
this._values = this.shouldCopyValues() ? new Array(len) : this._values;
|
|
||||||
var result = this._promise;
|
|
||||||
var isResolved = false;
|
|
||||||
var bitField = null;
|
|
||||||
for (var i = 0; i < len; ++i) {
|
|
||||||
var maybePromise = tryConvertToPromise(values[i], result);
|
|
||||||
|
|
||||||
if (maybePromise instanceof Promise) {
|
|
||||||
maybePromise = maybePromise._target();
|
|
||||||
bitField = maybePromise._bitField;
|
|
||||||
} else {
|
|
||||||
bitField = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isResolved) {
|
|
||||||
if (bitField !== null) {
|
|
||||||
maybePromise.suppressUnhandledRejections();
|
|
||||||
}
|
|
||||||
} else if (bitField !== null) {
|
|
||||||
if (((bitField & 50397184) === 0)) {
|
|
||||||
maybePromise._proxy(this, i);
|
|
||||||
this._values[i] = maybePromise;
|
|
||||||
} else if (((bitField & 33554432) !== 0)) {
|
|
||||||
isResolved = this._promiseFulfilled(maybePromise._value(), i);
|
|
||||||
} else if (((bitField & 16777216) !== 0)) {
|
|
||||||
isResolved = this._promiseRejected(maybePromise._reason(), i);
|
|
||||||
} else {
|
|
||||||
isResolved = this._promiseCancelled(i);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
isResolved = this._promiseFulfilled(maybePromise, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!isResolved) result._setAsyncGuaranteed();
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._isResolved = function () {
|
|
||||||
return this._values === null;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._resolve = function (value) {
|
|
||||||
this._values = null;
|
|
||||||
this._promise._fulfill(value);
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._cancel = function() {
|
|
||||||
if (this._isResolved() || !this._promise._isCancellable()) return;
|
|
||||||
this._values = null;
|
|
||||||
this._promise._cancel();
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._reject = function (reason) {
|
|
||||||
this._values = null;
|
|
||||||
this._promise._rejectCallback(reason, false);
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._promiseFulfilled = function (value, index) {
|
|
||||||
this._values[index] = value;
|
|
||||||
var totalResolved = ++this._totalResolved;
|
|
||||||
if (totalResolved >= this._length) {
|
|
||||||
this._resolve(this._values);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._promiseCancelled = function() {
|
|
||||||
this._cancel();
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._promiseRejected = function (reason) {
|
|
||||||
this._totalResolved++;
|
|
||||||
this._reject(reason);
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype._resultCancelled = function() {
|
|
||||||
if (this._isResolved()) return;
|
|
||||||
var values = this._values;
|
|
||||||
this._cancel();
|
|
||||||
if (values instanceof Promise) {
|
|
||||||
values.cancel();
|
|
||||||
} else {
|
|
||||||
for (var i = 0; i < values.length; ++i) {
|
|
||||||
if (values[i] instanceof Promise) {
|
|
||||||
values[i].cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype.shouldCopyValues = function () {
|
|
||||||
return true;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseArray.prototype.getActualLength = function (len) {
|
|
||||||
return len;
|
|
||||||
};
|
|
||||||
|
|
||||||
return PromiseArray;
|
|
||||||
};
|
|
||||||
-314
@@ -1,314 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, INTERNAL) {
|
|
||||||
var THIS = {};
|
|
||||||
var util = require("./util");
|
|
||||||
var nodebackForPromise = require("./nodeback");
|
|
||||||
var withAppended = util.withAppended;
|
|
||||||
var maybeWrapAsError = util.maybeWrapAsError;
|
|
||||||
var canEvaluate = util.canEvaluate;
|
|
||||||
var TypeError = require("./errors").TypeError;
|
|
||||||
var defaultSuffix = "Async";
|
|
||||||
var defaultPromisified = {__isPromisified__: true};
|
|
||||||
var noCopyProps = [
|
|
||||||
"arity", "length",
|
|
||||||
"name",
|
|
||||||
"arguments",
|
|
||||||
"caller",
|
|
||||||
"callee",
|
|
||||||
"prototype",
|
|
||||||
"__isPromisified__"
|
|
||||||
];
|
|
||||||
var noCopyPropsPattern = new RegExp("^(?:" + noCopyProps.join("|") + ")$");
|
|
||||||
|
|
||||||
var defaultFilter = function(name) {
|
|
||||||
return util.isIdentifier(name) &&
|
|
||||||
name.charAt(0) !== "_" &&
|
|
||||||
name !== "constructor";
|
|
||||||
};
|
|
||||||
|
|
||||||
function propsFilter(key) {
|
|
||||||
return !noCopyPropsPattern.test(key);
|
|
||||||
}
|
|
||||||
|
|
||||||
function isPromisified(fn) {
|
|
||||||
try {
|
|
||||||
return fn.__isPromisified__ === true;
|
|
||||||
}
|
|
||||||
catch (e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function hasPromisified(obj, key, suffix) {
|
|
||||||
var val = util.getDataPropertyOrDefault(obj, key + suffix,
|
|
||||||
defaultPromisified);
|
|
||||||
return val ? isPromisified(val) : false;
|
|
||||||
}
|
|
||||||
function checkValid(ret, suffix, suffixRegexp) {
|
|
||||||
for (var i = 0; i < ret.length; i += 2) {
|
|
||||||
var key = ret[i];
|
|
||||||
if (suffixRegexp.test(key)) {
|
|
||||||
var keyWithoutAsyncSuffix = key.replace(suffixRegexp, "");
|
|
||||||
for (var j = 0; j < ret.length; j += 2) {
|
|
||||||
if (ret[j] === keyWithoutAsyncSuffix) {
|
|
||||||
throw new TypeError("Cannot promisify an API that has normal methods with '%s'-suffix\u000a\u000a See http://goo.gl/MqrFmX\u000a"
|
|
||||||
.replace("%s", suffix));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function promisifiableMethods(obj, suffix, suffixRegexp, filter) {
|
|
||||||
var keys = util.inheritedDataKeys(obj);
|
|
||||||
var ret = [];
|
|
||||||
for (var i = 0; i < keys.length; ++i) {
|
|
||||||
var key = keys[i];
|
|
||||||
var value = obj[key];
|
|
||||||
var passesDefaultFilter = filter === defaultFilter
|
|
||||||
? true : defaultFilter(key, value, obj);
|
|
||||||
if (typeof value === "function" &&
|
|
||||||
!isPromisified(value) &&
|
|
||||||
!hasPromisified(obj, key, suffix) &&
|
|
||||||
filter(key, value, obj, passesDefaultFilter)) {
|
|
||||||
ret.push(key, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
checkValid(ret, suffix, suffixRegexp);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
var escapeIdentRegex = function(str) {
|
|
||||||
return str.replace(/([$])/, "\\$");
|
|
||||||
};
|
|
||||||
|
|
||||||
var makeNodePromisifiedEval;
|
|
||||||
if (!false) {
|
|
||||||
var switchCaseArgumentOrder = function(likelyArgumentCount) {
|
|
||||||
var ret = [likelyArgumentCount];
|
|
||||||
var min = Math.max(0, likelyArgumentCount - 1 - 3);
|
|
||||||
for(var i = likelyArgumentCount - 1; i >= min; --i) {
|
|
||||||
ret.push(i);
|
|
||||||
}
|
|
||||||
for(var i = likelyArgumentCount + 1; i <= 3; ++i) {
|
|
||||||
ret.push(i);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
var argumentSequence = function(argumentCount) {
|
|
||||||
return util.filledRange(argumentCount, "_arg", "");
|
|
||||||
};
|
|
||||||
|
|
||||||
var parameterDeclaration = function(parameterCount) {
|
|
||||||
return util.filledRange(
|
|
||||||
Math.max(parameterCount, 3), "_arg", "");
|
|
||||||
};
|
|
||||||
|
|
||||||
var parameterCount = function(fn) {
|
|
||||||
if (typeof fn.length === "number") {
|
|
||||||
return Math.max(Math.min(fn.length, 1023 + 1), 0);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
makeNodePromisifiedEval =
|
|
||||||
function(callback, receiver, originalName, fn, _, multiArgs) {
|
|
||||||
var newParameterCount = Math.max(0, parameterCount(fn) - 1);
|
|
||||||
var argumentOrder = switchCaseArgumentOrder(newParameterCount);
|
|
||||||
var shouldProxyThis = typeof callback === "string" || receiver === THIS;
|
|
||||||
|
|
||||||
function generateCallForArgumentCount(count) {
|
|
||||||
var args = argumentSequence(count).join(", ");
|
|
||||||
var comma = count > 0 ? ", " : "";
|
|
||||||
var ret;
|
|
||||||
if (shouldProxyThis) {
|
|
||||||
ret = "ret = callback.call(this, {{args}}, nodeback); break;\n";
|
|
||||||
} else {
|
|
||||||
ret = receiver === undefined
|
|
||||||
? "ret = callback({{args}}, nodeback); break;\n"
|
|
||||||
: "ret = callback.call(receiver, {{args}}, nodeback); break;\n";
|
|
||||||
}
|
|
||||||
return ret.replace("{{args}}", args).replace(", ", comma);
|
|
||||||
}
|
|
||||||
|
|
||||||
function generateArgumentSwitchCase() {
|
|
||||||
var ret = "";
|
|
||||||
for (var i = 0; i < argumentOrder.length; ++i) {
|
|
||||||
ret += "case " + argumentOrder[i] +":" +
|
|
||||||
generateCallForArgumentCount(argumentOrder[i]);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret += " \n\
|
|
||||||
default: \n\
|
|
||||||
var args = new Array(len + 1); \n\
|
|
||||||
var i = 0; \n\
|
|
||||||
for (var i = 0; i < len; ++i) { \n\
|
|
||||||
args[i] = arguments[i]; \n\
|
|
||||||
} \n\
|
|
||||||
args[i] = nodeback; \n\
|
|
||||||
[CodeForCall] \n\
|
|
||||||
break; \n\
|
|
||||||
".replace("[CodeForCall]", (shouldProxyThis
|
|
||||||
? "ret = callback.apply(this, args);\n"
|
|
||||||
: "ret = callback.apply(receiver, args);\n"));
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
var getFunctionCode = typeof callback === "string"
|
|
||||||
? ("this != null ? this['"+callback+"'] : fn")
|
|
||||||
: "fn";
|
|
||||||
var body = "'use strict'; \n\
|
|
||||||
var ret = function (Parameters) { \n\
|
|
||||||
'use strict'; \n\
|
|
||||||
var len = arguments.length; \n\
|
|
||||||
var promise = new Promise(INTERNAL); \n\
|
|
||||||
promise._captureStackTrace(); \n\
|
|
||||||
var nodeback = nodebackForPromise(promise, " + multiArgs + "); \n\
|
|
||||||
var ret; \n\
|
|
||||||
var callback = tryCatch([GetFunctionCode]); \n\
|
|
||||||
switch(len) { \n\
|
|
||||||
[CodeForSwitchCase] \n\
|
|
||||||
} \n\
|
|
||||||
if (ret === errorObj) { \n\
|
|
||||||
promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\
|
|
||||||
} \n\
|
|
||||||
if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n\
|
|
||||||
return promise; \n\
|
|
||||||
}; \n\
|
|
||||||
notEnumerableProp(ret, '__isPromisified__', true); \n\
|
|
||||||
return ret; \n\
|
|
||||||
".replace("[CodeForSwitchCase]", generateArgumentSwitchCase())
|
|
||||||
.replace("[GetFunctionCode]", getFunctionCode);
|
|
||||||
body = body.replace("Parameters", parameterDeclaration(newParameterCount));
|
|
||||||
return new Function("Promise",
|
|
||||||
"fn",
|
|
||||||
"receiver",
|
|
||||||
"withAppended",
|
|
||||||
"maybeWrapAsError",
|
|
||||||
"nodebackForPromise",
|
|
||||||
"tryCatch",
|
|
||||||
"errorObj",
|
|
||||||
"notEnumerableProp",
|
|
||||||
"INTERNAL",
|
|
||||||
body)(
|
|
||||||
Promise,
|
|
||||||
fn,
|
|
||||||
receiver,
|
|
||||||
withAppended,
|
|
||||||
maybeWrapAsError,
|
|
||||||
nodebackForPromise,
|
|
||||||
util.tryCatch,
|
|
||||||
util.errorObj,
|
|
||||||
util.notEnumerableProp,
|
|
||||||
INTERNAL);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {
|
|
||||||
var defaultThis = (function() {return this;})();
|
|
||||||
var method = callback;
|
|
||||||
if (typeof method === "string") {
|
|
||||||
callback = fn;
|
|
||||||
}
|
|
||||||
function promisified() {
|
|
||||||
var _receiver = receiver;
|
|
||||||
if (receiver === THIS) _receiver = this;
|
|
||||||
var promise = new Promise(INTERNAL);
|
|
||||||
promise._captureStackTrace();
|
|
||||||
var cb = typeof method === "string" && this !== defaultThis
|
|
||||||
? this[method] : callback;
|
|
||||||
var fn = nodebackForPromise(promise, multiArgs);
|
|
||||||
try {
|
|
||||||
cb.apply(_receiver, withAppended(arguments, fn));
|
|
||||||
} catch(e) {
|
|
||||||
promise._rejectCallback(maybeWrapAsError(e), true, true);
|
|
||||||
}
|
|
||||||
if (!promise._isFateSealed()) promise._setAsyncGuaranteed();
|
|
||||||
return promise;
|
|
||||||
}
|
|
||||||
util.notEnumerableProp(promisified, "__isPromisified__", true);
|
|
||||||
return promisified;
|
|
||||||
}
|
|
||||||
|
|
||||||
var makeNodePromisified = canEvaluate
|
|
||||||
? makeNodePromisifiedEval
|
|
||||||
: makeNodePromisifiedClosure;
|
|
||||||
|
|
||||||
function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {
|
|
||||||
var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
|
|
||||||
var methods =
|
|
||||||
promisifiableMethods(obj, suffix, suffixRegexp, filter);
|
|
||||||
|
|
||||||
for (var i = 0, len = methods.length; i < len; i+= 2) {
|
|
||||||
var key = methods[i];
|
|
||||||
var fn = methods[i+1];
|
|
||||||
var promisifiedKey = key + suffix;
|
|
||||||
if (promisifier === makeNodePromisified) {
|
|
||||||
obj[promisifiedKey] =
|
|
||||||
makeNodePromisified(key, THIS, key, fn, suffix, multiArgs);
|
|
||||||
} else {
|
|
||||||
var promisified = promisifier(fn, function() {
|
|
||||||
return makeNodePromisified(key, THIS, key,
|
|
||||||
fn, suffix, multiArgs);
|
|
||||||
});
|
|
||||||
util.notEnumerableProp(promisified, "__isPromisified__", true);
|
|
||||||
obj[promisifiedKey] = promisified;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
util.toFastProperties(obj);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
function promisify(callback, receiver, multiArgs) {
|
|
||||||
return makeNodePromisified(callback, receiver, undefined,
|
|
||||||
callback, null, multiArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.promisify = function (fn, options) {
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
throw new TypeError("expecting a function but got " + util.classString(fn));
|
|
||||||
}
|
|
||||||
if (isPromisified(fn)) {
|
|
||||||
return fn;
|
|
||||||
}
|
|
||||||
options = Object(options);
|
|
||||||
var receiver = options.context === undefined ? THIS : options.context;
|
|
||||||
var multiArgs = !!options.multiArgs;
|
|
||||||
var ret = promisify(fn, receiver, multiArgs);
|
|
||||||
util.copyDescriptors(fn, ret, propsFilter);
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.promisifyAll = function (target, options) {
|
|
||||||
if (typeof target !== "function" && typeof target !== "object") {
|
|
||||||
throw new TypeError("the target of promisifyAll must be an object or a function\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
options = Object(options);
|
|
||||||
var multiArgs = !!options.multiArgs;
|
|
||||||
var suffix = options.suffix;
|
|
||||||
if (typeof suffix !== "string") suffix = defaultSuffix;
|
|
||||||
var filter = options.filter;
|
|
||||||
if (typeof filter !== "function") filter = defaultFilter;
|
|
||||||
var promisifier = options.promisifier;
|
|
||||||
if (typeof promisifier !== "function") promisifier = makeNodePromisified;
|
|
||||||
|
|
||||||
if (!util.isIdentifier(suffix)) {
|
|
||||||
throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
|
|
||||||
var keys = util.inheritedDataKeys(target);
|
|
||||||
for (var i = 0; i < keys.length; ++i) {
|
|
||||||
var value = target[keys[i]];
|
|
||||||
if (keys[i] !== "constructor" &&
|
|
||||||
util.isClass(value)) {
|
|
||||||
promisifyAll(value.prototype, suffix, filter, promisifier,
|
|
||||||
multiArgs);
|
|
||||||
promisifyAll(value, suffix, filter, promisifier, multiArgs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return promisifyAll(target, suffix, filter, promisifier, multiArgs);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
-118
@@ -1,118 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(
|
|
||||||
Promise, PromiseArray, tryConvertToPromise, apiRejection) {
|
|
||||||
var util = require("./util");
|
|
||||||
var isObject = util.isObject;
|
|
||||||
var es5 = require("./es5");
|
|
||||||
var Es6Map;
|
|
||||||
if (typeof Map === "function") Es6Map = Map;
|
|
||||||
|
|
||||||
var mapToEntries = (function() {
|
|
||||||
var index = 0;
|
|
||||||
var size = 0;
|
|
||||||
|
|
||||||
function extractEntry(value, key) {
|
|
||||||
this[index] = value;
|
|
||||||
this[index + size] = key;
|
|
||||||
index++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return function mapToEntries(map) {
|
|
||||||
size = map.size;
|
|
||||||
index = 0;
|
|
||||||
var ret = new Array(map.size * 2);
|
|
||||||
map.forEach(extractEntry, ret);
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
|
|
||||||
var entriesToMap = function(entries) {
|
|
||||||
var ret = new Es6Map();
|
|
||||||
var length = entries.length / 2 | 0;
|
|
||||||
for (var i = 0; i < length; ++i) {
|
|
||||||
var key = entries[length + i];
|
|
||||||
var value = entries[i];
|
|
||||||
ret.set(key, value);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
function PropertiesPromiseArray(obj) {
|
|
||||||
var isMap = false;
|
|
||||||
var entries;
|
|
||||||
if (Es6Map !== undefined && obj instanceof Es6Map) {
|
|
||||||
entries = mapToEntries(obj);
|
|
||||||
isMap = true;
|
|
||||||
} else {
|
|
||||||
var keys = es5.keys(obj);
|
|
||||||
var len = keys.length;
|
|
||||||
entries = new Array(len * 2);
|
|
||||||
for (var i = 0; i < len; ++i) {
|
|
||||||
var key = keys[i];
|
|
||||||
entries[i] = obj[key];
|
|
||||||
entries[i + len] = key;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.constructor$(entries);
|
|
||||||
this._isMap = isMap;
|
|
||||||
this._init$(undefined, isMap ? -6 : -3);
|
|
||||||
}
|
|
||||||
util.inherits(PropertiesPromiseArray, PromiseArray);
|
|
||||||
|
|
||||||
PropertiesPromiseArray.prototype._init = function () {};
|
|
||||||
|
|
||||||
PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
|
|
||||||
this._values[index] = value;
|
|
||||||
var totalResolved = ++this._totalResolved;
|
|
||||||
if (totalResolved >= this._length) {
|
|
||||||
var val;
|
|
||||||
if (this._isMap) {
|
|
||||||
val = entriesToMap(this._values);
|
|
||||||
} else {
|
|
||||||
val = {};
|
|
||||||
var keyOffset = this.length();
|
|
||||||
for (var i = 0, len = this.length(); i < len; ++i) {
|
|
||||||
val[this._values[i + keyOffset]] = this._values[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._resolve(val);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
PropertiesPromiseArray.prototype.shouldCopyValues = function () {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
PropertiesPromiseArray.prototype.getActualLength = function (len) {
|
|
||||||
return len >> 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
function props(promises) {
|
|
||||||
var ret;
|
|
||||||
var castValue = tryConvertToPromise(promises);
|
|
||||||
|
|
||||||
if (!isObject(castValue)) {
|
|
||||||
return apiRejection("cannot await properties of a non-object\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
} else if (castValue instanceof Promise) {
|
|
||||||
ret = castValue._then(
|
|
||||||
Promise.props, undefined, undefined, undefined, undefined);
|
|
||||||
} else {
|
|
||||||
ret = new PropertiesPromiseArray(castValue).promise();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (castValue instanceof Promise) {
|
|
||||||
ret._propagateFrom(castValue, 2);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.prototype.props = function () {
|
|
||||||
return props(this);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.props = function (promises) {
|
|
||||||
return props(promises);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-73
@@ -1,73 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
function arrayMove(src, srcIndex, dst, dstIndex, len) {
|
|
||||||
for (var j = 0; j < len; ++j) {
|
|
||||||
dst[j + dstIndex] = src[j + srcIndex];
|
|
||||||
src[j + srcIndex] = void 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function Queue(capacity) {
|
|
||||||
this._capacity = capacity;
|
|
||||||
this._length = 0;
|
|
||||||
this._front = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
Queue.prototype._willBeOverCapacity = function (size) {
|
|
||||||
return this._capacity < size;
|
|
||||||
};
|
|
||||||
|
|
||||||
Queue.prototype._pushOne = function (arg) {
|
|
||||||
var length = this.length();
|
|
||||||
this._checkCapacity(length + 1);
|
|
||||||
var i = (this._front + length) & (this._capacity - 1);
|
|
||||||
this[i] = arg;
|
|
||||||
this._length = length + 1;
|
|
||||||
};
|
|
||||||
|
|
||||||
Queue.prototype.push = function (fn, receiver, arg) {
|
|
||||||
var length = this.length() + 3;
|
|
||||||
if (this._willBeOverCapacity(length)) {
|
|
||||||
this._pushOne(fn);
|
|
||||||
this._pushOne(receiver);
|
|
||||||
this._pushOne(arg);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
var j = this._front + length - 3;
|
|
||||||
this._checkCapacity(length);
|
|
||||||
var wrapMask = this._capacity - 1;
|
|
||||||
this[(j + 0) & wrapMask] = fn;
|
|
||||||
this[(j + 1) & wrapMask] = receiver;
|
|
||||||
this[(j + 2) & wrapMask] = arg;
|
|
||||||
this._length = length;
|
|
||||||
};
|
|
||||||
|
|
||||||
Queue.prototype.shift = function () {
|
|
||||||
var front = this._front,
|
|
||||||
ret = this[front];
|
|
||||||
|
|
||||||
this[front] = undefined;
|
|
||||||
this._front = (front + 1) & (this._capacity - 1);
|
|
||||||
this._length--;
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Queue.prototype.length = function () {
|
|
||||||
return this._length;
|
|
||||||
};
|
|
||||||
|
|
||||||
Queue.prototype._checkCapacity = function (size) {
|
|
||||||
if (this._capacity < size) {
|
|
||||||
this._resizeTo(this._capacity << 1);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Queue.prototype._resizeTo = function (capacity) {
|
|
||||||
var oldCapacity = this._capacity;
|
|
||||||
this._capacity = capacity;
|
|
||||||
var front = this._front;
|
|
||||||
var length = this._length;
|
|
||||||
var moveItemsCount = (front + length) & (oldCapacity - 1);
|
|
||||||
arrayMove(this, 0, this, oldCapacity, moveItemsCount);
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = Queue;
|
|
||||||
-49
@@ -1,49 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(
|
|
||||||
Promise, INTERNAL, tryConvertToPromise, apiRejection) {
|
|
||||||
var util = require("./util");
|
|
||||||
|
|
||||||
var raceLater = function (promise) {
|
|
||||||
return promise.then(function(array) {
|
|
||||||
return race(array, promise);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function race(promises, parent) {
|
|
||||||
var maybePromise = tryConvertToPromise(promises);
|
|
||||||
|
|
||||||
if (maybePromise instanceof Promise) {
|
|
||||||
return raceLater(maybePromise);
|
|
||||||
} else {
|
|
||||||
promises = util.asArray(promises);
|
|
||||||
if (promises === null)
|
|
||||||
return apiRejection("expecting an array or an iterable object but got " + util.classString(promises));
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret = new Promise(INTERNAL);
|
|
||||||
if (parent !== undefined) {
|
|
||||||
ret._propagateFrom(parent, 3);
|
|
||||||
}
|
|
||||||
var fulfill = ret._fulfill;
|
|
||||||
var reject = ret._reject;
|
|
||||||
for (var i = 0, len = promises.length; i < len; ++i) {
|
|
||||||
var val = promises[i];
|
|
||||||
|
|
||||||
if (val === undefined && !(i in promises)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.cast(val)._then(fulfill, reject, undefined, ret, null);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.race = function (promises) {
|
|
||||||
return race(promises, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.race = function () {
|
|
||||||
return race(this, undefined);
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
-172
@@ -1,172 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise,
|
|
||||||
PromiseArray,
|
|
||||||
apiRejection,
|
|
||||||
tryConvertToPromise,
|
|
||||||
INTERNAL,
|
|
||||||
debug) {
|
|
||||||
var getDomain = Promise._getDomain;
|
|
||||||
var util = require("./util");
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
|
|
||||||
function ReductionPromiseArray(promises, fn, initialValue, _each) {
|
|
||||||
this.constructor$(promises);
|
|
||||||
var domain = getDomain();
|
|
||||||
this._fn = domain === null ? fn : util.domainBind(domain, fn);
|
|
||||||
if (initialValue !== undefined) {
|
|
||||||
initialValue = Promise.resolve(initialValue);
|
|
||||||
initialValue._attachCancellationCallback(this);
|
|
||||||
}
|
|
||||||
this._initialValue = initialValue;
|
|
||||||
this._currentCancellable = null;
|
|
||||||
if(_each === INTERNAL) {
|
|
||||||
this._eachValues = Array(this._length);
|
|
||||||
} else if (_each === 0) {
|
|
||||||
this._eachValues = null;
|
|
||||||
} else {
|
|
||||||
this._eachValues = undefined;
|
|
||||||
}
|
|
||||||
this._promise._captureStackTrace();
|
|
||||||
this._init$(undefined, -5);
|
|
||||||
}
|
|
||||||
util.inherits(ReductionPromiseArray, PromiseArray);
|
|
||||||
|
|
||||||
ReductionPromiseArray.prototype._gotAccum = function(accum) {
|
|
||||||
if (this._eachValues !== undefined &&
|
|
||||||
this._eachValues !== null &&
|
|
||||||
accum !== INTERNAL) {
|
|
||||||
this._eachValues.push(accum);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
ReductionPromiseArray.prototype._eachComplete = function(value) {
|
|
||||||
if (this._eachValues !== null) {
|
|
||||||
this._eachValues.push(value);
|
|
||||||
}
|
|
||||||
return this._eachValues;
|
|
||||||
};
|
|
||||||
|
|
||||||
ReductionPromiseArray.prototype._init = function() {};
|
|
||||||
|
|
||||||
ReductionPromiseArray.prototype._resolveEmptyArray = function() {
|
|
||||||
this._resolve(this._eachValues !== undefined ? this._eachValues
|
|
||||||
: this._initialValue);
|
|
||||||
};
|
|
||||||
|
|
||||||
ReductionPromiseArray.prototype.shouldCopyValues = function () {
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
ReductionPromiseArray.prototype._resolve = function(value) {
|
|
||||||
this._promise._resolveCallback(value);
|
|
||||||
this._values = null;
|
|
||||||
};
|
|
||||||
|
|
||||||
ReductionPromiseArray.prototype._resultCancelled = function(sender) {
|
|
||||||
if (sender === this._initialValue) return this._cancel();
|
|
||||||
if (this._isResolved()) return;
|
|
||||||
this._resultCancelled$();
|
|
||||||
if (this._currentCancellable instanceof Promise) {
|
|
||||||
this._currentCancellable.cancel();
|
|
||||||
}
|
|
||||||
if (this._initialValue instanceof Promise) {
|
|
||||||
this._initialValue.cancel();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
ReductionPromiseArray.prototype._iterate = function (values) {
|
|
||||||
this._values = values;
|
|
||||||
var value;
|
|
||||||
var i;
|
|
||||||
var length = values.length;
|
|
||||||
if (this._initialValue !== undefined) {
|
|
||||||
value = this._initialValue;
|
|
||||||
i = 0;
|
|
||||||
} else {
|
|
||||||
value = Promise.resolve(values[0]);
|
|
||||||
i = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._currentCancellable = value;
|
|
||||||
|
|
||||||
if (!value.isRejected()) {
|
|
||||||
for (; i < length; ++i) {
|
|
||||||
var ctx = {
|
|
||||||
accum: null,
|
|
||||||
value: values[i],
|
|
||||||
index: i,
|
|
||||||
length: length,
|
|
||||||
array: this
|
|
||||||
};
|
|
||||||
value = value._then(gotAccum, undefined, undefined, ctx, undefined);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this._eachValues !== undefined) {
|
|
||||||
value = value
|
|
||||||
._then(this._eachComplete, undefined, undefined, this, undefined);
|
|
||||||
}
|
|
||||||
value._then(completed, completed, undefined, value, this);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.reduce = function (fn, initialValue) {
|
|
||||||
return reduce(this, fn, initialValue, null);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.reduce = function (promises, fn, initialValue, _each) {
|
|
||||||
return reduce(promises, fn, initialValue, _each);
|
|
||||||
};
|
|
||||||
|
|
||||||
function completed(valueOrReason, array) {
|
|
||||||
if (this.isFulfilled()) {
|
|
||||||
array._resolve(valueOrReason);
|
|
||||||
} else {
|
|
||||||
array._reject(valueOrReason);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function reduce(promises, fn, initialValue, _each) {
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
return apiRejection("expecting a function but got " + util.classString(fn));
|
|
||||||
}
|
|
||||||
var array = new ReductionPromiseArray(promises, fn, initialValue, _each);
|
|
||||||
return array.promise();
|
|
||||||
}
|
|
||||||
|
|
||||||
function gotAccum(accum) {
|
|
||||||
this.accum = accum;
|
|
||||||
this.array._gotAccum(accum);
|
|
||||||
var value = tryConvertToPromise(this.value, this.array._promise);
|
|
||||||
if (value instanceof Promise) {
|
|
||||||
this.array._currentCancellable = value;
|
|
||||||
return value._then(gotValue, undefined, undefined, this, undefined);
|
|
||||||
} else {
|
|
||||||
return gotValue.call(this, value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function gotValue(value) {
|
|
||||||
var array = this.array;
|
|
||||||
var promise = array._promise;
|
|
||||||
var fn = tryCatch(array._fn);
|
|
||||||
promise._pushContext();
|
|
||||||
var ret;
|
|
||||||
if (array._eachValues !== undefined) {
|
|
||||||
ret = fn.call(promise._boundValue(), value, this.index, this.length);
|
|
||||||
} else {
|
|
||||||
ret = fn.call(promise._boundValue(),
|
|
||||||
this.accum, value, this.index, this.length);
|
|
||||||
}
|
|
||||||
if (ret instanceof Promise) {
|
|
||||||
array._currentCancellable = ret;
|
|
||||||
}
|
|
||||||
var promiseCreated = promise._popContext();
|
|
||||||
debug.checkForgottenReturns(
|
|
||||||
ret,
|
|
||||||
promiseCreated,
|
|
||||||
array._eachValues !== undefined ? "Promise.each" : "Promise.reduce",
|
|
||||||
promise
|
|
||||||
);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
-61
@@ -1,61 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var util = require("./util");
|
|
||||||
var schedule;
|
|
||||||
var noAsyncScheduler = function() {
|
|
||||||
throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
};
|
|
||||||
var NativePromise = util.getNativePromise();
|
|
||||||
if (util.isNode && typeof MutationObserver === "undefined") {
|
|
||||||
var GlobalSetImmediate = global.setImmediate;
|
|
||||||
var ProcessNextTick = process.nextTick;
|
|
||||||
schedule = util.isRecentNode
|
|
||||||
? function(fn) { GlobalSetImmediate.call(global, fn); }
|
|
||||||
: function(fn) { ProcessNextTick.call(process, fn); };
|
|
||||||
} else if (typeof NativePromise === "function" &&
|
|
||||||
typeof NativePromise.resolve === "function") {
|
|
||||||
var nativePromise = NativePromise.resolve();
|
|
||||||
schedule = function(fn) {
|
|
||||||
nativePromise.then(fn);
|
|
||||||
};
|
|
||||||
} else if ((typeof MutationObserver !== "undefined") &&
|
|
||||||
!(typeof window !== "undefined" &&
|
|
||||||
window.navigator &&
|
|
||||||
(window.navigator.standalone || window.cordova))) {
|
|
||||||
schedule = (function() {
|
|
||||||
var div = document.createElement("div");
|
|
||||||
var opts = {attributes: true};
|
|
||||||
var toggleScheduled = false;
|
|
||||||
var div2 = document.createElement("div");
|
|
||||||
var o2 = new MutationObserver(function() {
|
|
||||||
div.classList.toggle("foo");
|
|
||||||
toggleScheduled = false;
|
|
||||||
});
|
|
||||||
o2.observe(div2, opts);
|
|
||||||
|
|
||||||
var scheduleToggle = function() {
|
|
||||||
if (toggleScheduled) return;
|
|
||||||
toggleScheduled = true;
|
|
||||||
div2.classList.toggle("foo");
|
|
||||||
};
|
|
||||||
|
|
||||||
return function schedule(fn) {
|
|
||||||
var o = new MutationObserver(function() {
|
|
||||||
o.disconnect();
|
|
||||||
fn();
|
|
||||||
});
|
|
||||||
o.observe(div, opts);
|
|
||||||
scheduleToggle();
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
} else if (typeof setImmediate !== "undefined") {
|
|
||||||
schedule = function (fn) {
|
|
||||||
setImmediate(fn);
|
|
||||||
};
|
|
||||||
} else if (typeof setTimeout !== "undefined") {
|
|
||||||
schedule = function (fn) {
|
|
||||||
setTimeout(fn, 0);
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
schedule = noAsyncScheduler;
|
|
||||||
}
|
|
||||||
module.exports = schedule;
|
|
||||||
-43
@@ -1,43 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports =
|
|
||||||
function(Promise, PromiseArray, debug) {
|
|
||||||
var PromiseInspection = Promise.PromiseInspection;
|
|
||||||
var util = require("./util");
|
|
||||||
|
|
||||||
function SettledPromiseArray(values) {
|
|
||||||
this.constructor$(values);
|
|
||||||
}
|
|
||||||
util.inherits(SettledPromiseArray, PromiseArray);
|
|
||||||
|
|
||||||
SettledPromiseArray.prototype._promiseResolved = function (index, inspection) {
|
|
||||||
this._values[index] = inspection;
|
|
||||||
var totalResolved = ++this._totalResolved;
|
|
||||||
if (totalResolved >= this._length) {
|
|
||||||
this._resolve(this._values);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
SettledPromiseArray.prototype._promiseFulfilled = function (value, index) {
|
|
||||||
var ret = new PromiseInspection();
|
|
||||||
ret._bitField = 33554432;
|
|
||||||
ret._settledValueField = value;
|
|
||||||
return this._promiseResolved(index, ret);
|
|
||||||
};
|
|
||||||
SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
|
|
||||||
var ret = new PromiseInspection();
|
|
||||||
ret._bitField = 16777216;
|
|
||||||
ret._settledValueField = reason;
|
|
||||||
return this._promiseResolved(index, ret);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.settle = function (promises) {
|
|
||||||
debug.deprecated(".settle()", ".reflect()");
|
|
||||||
return new SettledPromiseArray(promises).promise();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.settle = function () {
|
|
||||||
return Promise.settle(this);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
-148
@@ -1,148 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports =
|
|
||||||
function(Promise, PromiseArray, apiRejection) {
|
|
||||||
var util = require("./util");
|
|
||||||
var RangeError = require("./errors").RangeError;
|
|
||||||
var AggregateError = require("./errors").AggregateError;
|
|
||||||
var isArray = util.isArray;
|
|
||||||
var CANCELLATION = {};
|
|
||||||
|
|
||||||
|
|
||||||
function SomePromiseArray(values) {
|
|
||||||
this.constructor$(values);
|
|
||||||
this._howMany = 0;
|
|
||||||
this._unwrap = false;
|
|
||||||
this._initialized = false;
|
|
||||||
}
|
|
||||||
util.inherits(SomePromiseArray, PromiseArray);
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._init = function () {
|
|
||||||
if (!this._initialized) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (this._howMany === 0) {
|
|
||||||
this._resolve([]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this._init$(undefined, -5);
|
|
||||||
var isArrayResolved = isArray(this._values);
|
|
||||||
if (!this._isResolved() &&
|
|
||||||
isArrayResolved &&
|
|
||||||
this._howMany > this._canPossiblyFulfill()) {
|
|
||||||
this._reject(this._getRangeError(this.length()));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype.init = function () {
|
|
||||||
this._initialized = true;
|
|
||||||
this._init();
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype.setUnwrap = function () {
|
|
||||||
this._unwrap = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype.howMany = function () {
|
|
||||||
return this._howMany;
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype.setHowMany = function (count) {
|
|
||||||
this._howMany = count;
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._promiseFulfilled = function (value) {
|
|
||||||
this._addFulfilled(value);
|
|
||||||
if (this._fulfilled() === this.howMany()) {
|
|
||||||
this._values.length = this.howMany();
|
|
||||||
if (this.howMany() === 1 && this._unwrap) {
|
|
||||||
this._resolve(this._values[0]);
|
|
||||||
} else {
|
|
||||||
this._resolve(this._values);
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
|
|
||||||
};
|
|
||||||
SomePromiseArray.prototype._promiseRejected = function (reason) {
|
|
||||||
this._addRejected(reason);
|
|
||||||
return this._checkOutcome();
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._promiseCancelled = function () {
|
|
||||||
if (this._values instanceof Promise || this._values == null) {
|
|
||||||
return this._cancel();
|
|
||||||
}
|
|
||||||
this._addRejected(CANCELLATION);
|
|
||||||
return this._checkOutcome();
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._checkOutcome = function() {
|
|
||||||
if (this.howMany() > this._canPossiblyFulfill()) {
|
|
||||||
var e = new AggregateError();
|
|
||||||
for (var i = this.length(); i < this._values.length; ++i) {
|
|
||||||
if (this._values[i] !== CANCELLATION) {
|
|
||||||
e.push(this._values[i]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (e.length > 0) {
|
|
||||||
this._reject(e);
|
|
||||||
} else {
|
|
||||||
this._cancel();
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._fulfilled = function () {
|
|
||||||
return this._totalResolved;
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._rejected = function () {
|
|
||||||
return this._values.length - this.length();
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._addRejected = function (reason) {
|
|
||||||
this._values.push(reason);
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._addFulfilled = function (value) {
|
|
||||||
this._values[this._totalResolved++] = value;
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._canPossiblyFulfill = function () {
|
|
||||||
return this.length() - this._rejected();
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._getRangeError = function (count) {
|
|
||||||
var message = "Input array must contain at least " +
|
|
||||||
this._howMany + " items but contains only " + count + " items";
|
|
||||||
return new RangeError(message);
|
|
||||||
};
|
|
||||||
|
|
||||||
SomePromiseArray.prototype._resolveEmptyArray = function () {
|
|
||||||
this._reject(this._getRangeError(0));
|
|
||||||
};
|
|
||||||
|
|
||||||
function some(promises, howMany) {
|
|
||||||
if ((howMany | 0) !== howMany || howMany < 0) {
|
|
||||||
return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
var ret = new SomePromiseArray(promises);
|
|
||||||
var promise = ret.promise();
|
|
||||||
ret.setHowMany(howMany);
|
|
||||||
ret.init();
|
|
||||||
return promise;
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.some = function (promises, howMany) {
|
|
||||||
return some(promises, howMany);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.some = function (howMany) {
|
|
||||||
return some(this, howMany);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise._SomePromiseArray = SomePromiseArray;
|
|
||||||
};
|
|
||||||
-103
@@ -1,103 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise) {
|
|
||||||
function PromiseInspection(promise) {
|
|
||||||
if (promise !== undefined) {
|
|
||||||
promise = promise._target();
|
|
||||||
this._bitField = promise._bitField;
|
|
||||||
this._settledValueField = promise._isFateSealed()
|
|
||||||
? promise._settledValue() : undefined;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
this._bitField = 0;
|
|
||||||
this._settledValueField = undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
PromiseInspection.prototype._settledValue = function() {
|
|
||||||
return this._settledValueField;
|
|
||||||
};
|
|
||||||
|
|
||||||
var value = PromiseInspection.prototype.value = function () {
|
|
||||||
if (!this.isFulfilled()) {
|
|
||||||
throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
return this._settledValue();
|
|
||||||
};
|
|
||||||
|
|
||||||
var reason = PromiseInspection.prototype.error =
|
|
||||||
PromiseInspection.prototype.reason = function () {
|
|
||||||
if (!this.isRejected()) {
|
|
||||||
throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/MqrFmX\u000a");
|
|
||||||
}
|
|
||||||
return this._settledValue();
|
|
||||||
};
|
|
||||||
|
|
||||||
var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
|
|
||||||
return (this._bitField & 33554432) !== 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
var isRejected = PromiseInspection.prototype.isRejected = function () {
|
|
||||||
return (this._bitField & 16777216) !== 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
var isPending = PromiseInspection.prototype.isPending = function () {
|
|
||||||
return (this._bitField & 50397184) === 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
var isResolved = PromiseInspection.prototype.isResolved = function () {
|
|
||||||
return (this._bitField & 50331648) !== 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
PromiseInspection.prototype.isCancelled = function() {
|
|
||||||
return (this._bitField & 8454144) !== 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.__isCancelled = function() {
|
|
||||||
return (this._bitField & 65536) === 65536;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._isCancelled = function() {
|
|
||||||
return this._target().__isCancelled();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.isCancelled = function() {
|
|
||||||
return (this._target()._bitField & 8454144) !== 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.isPending = function() {
|
|
||||||
return isPending.call(this._target());
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.isRejected = function() {
|
|
||||||
return isRejected.call(this._target());
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.isFulfilled = function() {
|
|
||||||
return isFulfilled.call(this._target());
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.isResolved = function() {
|
|
||||||
return isResolved.call(this._target());
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.value = function() {
|
|
||||||
return value.call(this._target());
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.reason = function() {
|
|
||||||
var target = this._target();
|
|
||||||
target._unsetRejectionIsUnhandled();
|
|
||||||
return reason.call(target);
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._value = function() {
|
|
||||||
return this._settledValue();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._reason = function() {
|
|
||||||
this._unsetRejectionIsUnhandled();
|
|
||||||
return this._settledValue();
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.PromiseInspection = PromiseInspection;
|
|
||||||
};
|
|
||||||
-86
@@ -1,86 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, INTERNAL) {
|
|
||||||
var util = require("./util");
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
var isObject = util.isObject;
|
|
||||||
|
|
||||||
function tryConvertToPromise(obj, context) {
|
|
||||||
if (isObject(obj)) {
|
|
||||||
if (obj instanceof Promise) return obj;
|
|
||||||
var then = getThen(obj);
|
|
||||||
if (then === errorObj) {
|
|
||||||
if (context) context._pushContext();
|
|
||||||
var ret = Promise.reject(then.e);
|
|
||||||
if (context) context._popContext();
|
|
||||||
return ret;
|
|
||||||
} else if (typeof then === "function") {
|
|
||||||
if (isAnyBluebirdPromise(obj)) {
|
|
||||||
var ret = new Promise(INTERNAL);
|
|
||||||
obj._then(
|
|
||||||
ret._fulfill,
|
|
||||||
ret._reject,
|
|
||||||
undefined,
|
|
||||||
ret,
|
|
||||||
null
|
|
||||||
);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
return doThenable(obj, then, context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
function doGetThen(obj) {
|
|
||||||
return obj.then;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getThen(obj) {
|
|
||||||
try {
|
|
||||||
return doGetThen(obj);
|
|
||||||
} catch (e) {
|
|
||||||
errorObj.e = e;
|
|
||||||
return errorObj;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var hasProp = {}.hasOwnProperty;
|
|
||||||
function isAnyBluebirdPromise(obj) {
|
|
||||||
try {
|
|
||||||
return hasProp.call(obj, "_promise0");
|
|
||||||
} catch (e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function doThenable(x, then, context) {
|
|
||||||
var promise = new Promise(INTERNAL);
|
|
||||||
var ret = promise;
|
|
||||||
if (context) context._pushContext();
|
|
||||||
promise._captureStackTrace();
|
|
||||||
if (context) context._popContext();
|
|
||||||
var synchronous = true;
|
|
||||||
var result = util.tryCatch(then).call(x, resolve, reject);
|
|
||||||
synchronous = false;
|
|
||||||
|
|
||||||
if (promise && result === errorObj) {
|
|
||||||
promise._rejectCallback(result.e, true, true);
|
|
||||||
promise = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolve(value) {
|
|
||||||
if (!promise) return;
|
|
||||||
promise._resolveCallback(value);
|
|
||||||
promise = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function reject(reason) {
|
|
||||||
if (!promise) return;
|
|
||||||
promise._rejectCallback(reason, synchronous, true);
|
|
||||||
promise = null;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
return tryConvertToPromise;
|
|
||||||
};
|
|
||||||
-93
@@ -1,93 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function(Promise, INTERNAL, debug) {
|
|
||||||
var util = require("./util");
|
|
||||||
var TimeoutError = Promise.TimeoutError;
|
|
||||||
|
|
||||||
function HandleWrapper(handle) {
|
|
||||||
this.handle = handle;
|
|
||||||
}
|
|
||||||
|
|
||||||
HandleWrapper.prototype._resultCancelled = function() {
|
|
||||||
clearTimeout(this.handle);
|
|
||||||
};
|
|
||||||
|
|
||||||
var afterValue = function(value) { return delay(+this).thenReturn(value); };
|
|
||||||
var delay = Promise.delay = function (ms, value) {
|
|
||||||
var ret;
|
|
||||||
var handle;
|
|
||||||
if (value !== undefined) {
|
|
||||||
ret = Promise.resolve(value)
|
|
||||||
._then(afterValue, null, null, ms, undefined);
|
|
||||||
if (debug.cancellation() && value instanceof Promise) {
|
|
||||||
ret._setOnCancel(value);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ret = new Promise(INTERNAL);
|
|
||||||
handle = setTimeout(function() { ret._fulfill(); }, +ms);
|
|
||||||
if (debug.cancellation()) {
|
|
||||||
ret._setOnCancel(new HandleWrapper(handle));
|
|
||||||
}
|
|
||||||
ret._captureStackTrace();
|
|
||||||
}
|
|
||||||
ret._setAsyncGuaranteed();
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.delay = function (ms) {
|
|
||||||
return delay(ms, this);
|
|
||||||
};
|
|
||||||
|
|
||||||
var afterTimeout = function (promise, message, parent) {
|
|
||||||
var err;
|
|
||||||
if (typeof message !== "string") {
|
|
||||||
if (message instanceof Error) {
|
|
||||||
err = message;
|
|
||||||
} else {
|
|
||||||
err = new TimeoutError("operation timed out");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
err = new TimeoutError(message);
|
|
||||||
}
|
|
||||||
util.markAsOriginatingFromRejection(err);
|
|
||||||
promise._attachExtraTrace(err);
|
|
||||||
promise._reject(err);
|
|
||||||
|
|
||||||
if (parent != null) {
|
|
||||||
parent.cancel();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function successClear(value) {
|
|
||||||
clearTimeout(this.handle);
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
function failureClear(reason) {
|
|
||||||
clearTimeout(this.handle);
|
|
||||||
throw reason;
|
|
||||||
}
|
|
||||||
|
|
||||||
Promise.prototype.timeout = function (ms, message) {
|
|
||||||
ms = +ms;
|
|
||||||
var ret, parent;
|
|
||||||
|
|
||||||
var handleWrapper = new HandleWrapper(setTimeout(function timeoutTimeout() {
|
|
||||||
if (ret.isPending()) {
|
|
||||||
afterTimeout(ret, message, parent);
|
|
||||||
}
|
|
||||||
}, ms));
|
|
||||||
|
|
||||||
if (debug.cancellation()) {
|
|
||||||
parent = this.then();
|
|
||||||
ret = parent._then(successClear, failureClear,
|
|
||||||
undefined, handleWrapper, undefined);
|
|
||||||
ret._setOnCancel(handleWrapper);
|
|
||||||
} else {
|
|
||||||
ret = this._then(successClear, failureClear,
|
|
||||||
undefined, handleWrapper, undefined);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
-226
@@ -1,226 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
module.exports = function (Promise, apiRejection, tryConvertToPromise,
|
|
||||||
createContext, INTERNAL, debug) {
|
|
||||||
var util = require("./util");
|
|
||||||
var TypeError = require("./errors").TypeError;
|
|
||||||
var inherits = require("./util").inherits;
|
|
||||||
var errorObj = util.errorObj;
|
|
||||||
var tryCatch = util.tryCatch;
|
|
||||||
var NULL = {};
|
|
||||||
|
|
||||||
function thrower(e) {
|
|
||||||
setTimeout(function(){throw e;}, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
function castPreservingDisposable(thenable) {
|
|
||||||
var maybePromise = tryConvertToPromise(thenable);
|
|
||||||
if (maybePromise !== thenable &&
|
|
||||||
typeof thenable._isDisposable === "function" &&
|
|
||||||
typeof thenable._getDisposer === "function" &&
|
|
||||||
thenable._isDisposable()) {
|
|
||||||
maybePromise._setDisposable(thenable._getDisposer());
|
|
||||||
}
|
|
||||||
return maybePromise;
|
|
||||||
}
|
|
||||||
function dispose(resources, inspection) {
|
|
||||||
var i = 0;
|
|
||||||
var len = resources.length;
|
|
||||||
var ret = new Promise(INTERNAL);
|
|
||||||
function iterator() {
|
|
||||||
if (i >= len) return ret._fulfill();
|
|
||||||
var maybePromise = castPreservingDisposable(resources[i++]);
|
|
||||||
if (maybePromise instanceof Promise &&
|
|
||||||
maybePromise._isDisposable()) {
|
|
||||||
try {
|
|
||||||
maybePromise = tryConvertToPromise(
|
|
||||||
maybePromise._getDisposer().tryDispose(inspection),
|
|
||||||
resources.promise);
|
|
||||||
} catch (e) {
|
|
||||||
return thrower(e);
|
|
||||||
}
|
|
||||||
if (maybePromise instanceof Promise) {
|
|
||||||
return maybePromise._then(iterator, thrower,
|
|
||||||
null, null, null);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
iterator();
|
|
||||||
}
|
|
||||||
iterator();
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function Disposer(data, promise, context) {
|
|
||||||
this._data = data;
|
|
||||||
this._promise = promise;
|
|
||||||
this._context = context;
|
|
||||||
}
|
|
||||||
|
|
||||||
Disposer.prototype.data = function () {
|
|
||||||
return this._data;
|
|
||||||
};
|
|
||||||
|
|
||||||
Disposer.prototype.promise = function () {
|
|
||||||
return this._promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
Disposer.prototype.resource = function () {
|
|
||||||
if (this.promise().isFulfilled()) {
|
|
||||||
return this.promise().value();
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
};
|
|
||||||
|
|
||||||
Disposer.prototype.tryDispose = function(inspection) {
|
|
||||||
var resource = this.resource();
|
|
||||||
var context = this._context;
|
|
||||||
if (context !== undefined) context._pushContext();
|
|
||||||
var ret = resource !== NULL
|
|
||||||
? this.doDispose(resource, inspection) : null;
|
|
||||||
if (context !== undefined) context._popContext();
|
|
||||||
this._promise._unsetDisposable();
|
|
||||||
this._data = null;
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
Disposer.isDisposer = function (d) {
|
|
||||||
return (d != null &&
|
|
||||||
typeof d.resource === "function" &&
|
|
||||||
typeof d.tryDispose === "function");
|
|
||||||
};
|
|
||||||
|
|
||||||
function FunctionDisposer(fn, promise, context) {
|
|
||||||
this.constructor$(fn, promise, context);
|
|
||||||
}
|
|
||||||
inherits(FunctionDisposer, Disposer);
|
|
||||||
|
|
||||||
FunctionDisposer.prototype.doDispose = function (resource, inspection) {
|
|
||||||
var fn = this.data();
|
|
||||||
return fn.call(resource, resource, inspection);
|
|
||||||
};
|
|
||||||
|
|
||||||
function maybeUnwrapDisposer(value) {
|
|
||||||
if (Disposer.isDisposer(value)) {
|
|
||||||
this.resources[this.index]._setDisposable(value);
|
|
||||||
return value.promise();
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
|
|
||||||
function ResourceList(length) {
|
|
||||||
this.length = length;
|
|
||||||
this.promise = null;
|
|
||||||
this[length-1] = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
ResourceList.prototype._resultCancelled = function() {
|
|
||||||
var len = this.length;
|
|
||||||
for (var i = 0; i < len; ++i) {
|
|
||||||
var item = this[i];
|
|
||||||
if (item instanceof Promise) {
|
|
||||||
item.cancel();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.using = function () {
|
|
||||||
var len = arguments.length;
|
|
||||||
if (len < 2) return apiRejection(
|
|
||||||
"you must pass at least 2 arguments to Promise.using");
|
|
||||||
var fn = arguments[len - 1];
|
|
||||||
if (typeof fn !== "function") {
|
|
||||||
return apiRejection("expecting a function but got " + util.classString(fn));
|
|
||||||
}
|
|
||||||
var input;
|
|
||||||
var spreadArgs = true;
|
|
||||||
if (len === 2 && Array.isArray(arguments[0])) {
|
|
||||||
input = arguments[0];
|
|
||||||
len = input.length;
|
|
||||||
spreadArgs = false;
|
|
||||||
} else {
|
|
||||||
input = arguments;
|
|
||||||
len--;
|
|
||||||
}
|
|
||||||
var resources = new ResourceList(len);
|
|
||||||
for (var i = 0; i < len; ++i) {
|
|
||||||
var resource = input[i];
|
|
||||||
if (Disposer.isDisposer(resource)) {
|
|
||||||
var disposer = resource;
|
|
||||||
resource = resource.promise();
|
|
||||||
resource._setDisposable(disposer);
|
|
||||||
} else {
|
|
||||||
var maybePromise = tryConvertToPromise(resource);
|
|
||||||
if (maybePromise instanceof Promise) {
|
|
||||||
resource =
|
|
||||||
maybePromise._then(maybeUnwrapDisposer, null, null, {
|
|
||||||
resources: resources,
|
|
||||||
index: i
|
|
||||||
}, undefined);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
resources[i] = resource;
|
|
||||||
}
|
|
||||||
|
|
||||||
var reflectedResources = new Array(resources.length);
|
|
||||||
for (var i = 0; i < reflectedResources.length; ++i) {
|
|
||||||
reflectedResources[i] = Promise.resolve(resources[i]).reflect();
|
|
||||||
}
|
|
||||||
|
|
||||||
var resultPromise = Promise.all(reflectedResources)
|
|
||||||
.then(function(inspections) {
|
|
||||||
for (var i = 0; i < inspections.length; ++i) {
|
|
||||||
var inspection = inspections[i];
|
|
||||||
if (inspection.isRejected()) {
|
|
||||||
errorObj.e = inspection.error();
|
|
||||||
return errorObj;
|
|
||||||
} else if (!inspection.isFulfilled()) {
|
|
||||||
resultPromise.cancel();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
inspections[i] = inspection.value();
|
|
||||||
}
|
|
||||||
promise._pushContext();
|
|
||||||
|
|
||||||
fn = tryCatch(fn);
|
|
||||||
var ret = spreadArgs
|
|
||||||
? fn.apply(undefined, inspections) : fn(inspections);
|
|
||||||
var promiseCreated = promise._popContext();
|
|
||||||
debug.checkForgottenReturns(
|
|
||||||
ret, promiseCreated, "Promise.using", promise);
|
|
||||||
return ret;
|
|
||||||
});
|
|
||||||
|
|
||||||
var promise = resultPromise.lastly(function() {
|
|
||||||
var inspection = new Promise.PromiseInspection(resultPromise);
|
|
||||||
return dispose(resources, inspection);
|
|
||||||
});
|
|
||||||
resources.promise = promise;
|
|
||||||
promise._setOnCancel(resources);
|
|
||||||
return promise;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._setDisposable = function (disposer) {
|
|
||||||
this._bitField = this._bitField | 131072;
|
|
||||||
this._disposer = disposer;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._isDisposable = function () {
|
|
||||||
return (this._bitField & 131072) > 0;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._getDisposer = function () {
|
|
||||||
return this._disposer;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype._unsetDisposable = function () {
|
|
||||||
this._bitField = this._bitField & (~131072);
|
|
||||||
this._disposer = undefined;
|
|
||||||
};
|
|
||||||
|
|
||||||
Promise.prototype.disposer = function (fn) {
|
|
||||||
if (typeof fn === "function") {
|
|
||||||
return new FunctionDisposer(fn, this, createContext());
|
|
||||||
}
|
|
||||||
throw new TypeError();
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
-380
@@ -1,380 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var es5 = require("./es5");
|
|
||||||
var canEvaluate = typeof navigator == "undefined";
|
|
||||||
|
|
||||||
var errorObj = {e: {}};
|
|
||||||
var tryCatchTarget;
|
|
||||||
var globalObject = typeof self !== "undefined" ? self :
|
|
||||||
typeof window !== "undefined" ? window :
|
|
||||||
typeof global !== "undefined" ? global :
|
|
||||||
this !== undefined ? this : null;
|
|
||||||
|
|
||||||
function tryCatcher() {
|
|
||||||
try {
|
|
||||||
var target = tryCatchTarget;
|
|
||||||
tryCatchTarget = null;
|
|
||||||
return target.apply(this, arguments);
|
|
||||||
} catch (e) {
|
|
||||||
errorObj.e = e;
|
|
||||||
return errorObj;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function tryCatch(fn) {
|
|
||||||
tryCatchTarget = fn;
|
|
||||||
return tryCatcher;
|
|
||||||
}
|
|
||||||
|
|
||||||
var inherits = function(Child, Parent) {
|
|
||||||
var hasProp = {}.hasOwnProperty;
|
|
||||||
|
|
||||||
function T() {
|
|
||||||
this.constructor = Child;
|
|
||||||
this.constructor$ = Parent;
|
|
||||||
for (var propertyName in Parent.prototype) {
|
|
||||||
if (hasProp.call(Parent.prototype, propertyName) &&
|
|
||||||
propertyName.charAt(propertyName.length-1) !== "$"
|
|
||||||
) {
|
|
||||||
this[propertyName + "$"] = Parent.prototype[propertyName];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
T.prototype = Parent.prototype;
|
|
||||||
Child.prototype = new T();
|
|
||||||
return Child.prototype;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
function isPrimitive(val) {
|
|
||||||
return val == null || val === true || val === false ||
|
|
||||||
typeof val === "string" || typeof val === "number";
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function isObject(value) {
|
|
||||||
return typeof value === "function" ||
|
|
||||||
typeof value === "object" && value !== null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function maybeWrapAsError(maybeError) {
|
|
||||||
if (!isPrimitive(maybeError)) return maybeError;
|
|
||||||
|
|
||||||
return new Error(safeToString(maybeError));
|
|
||||||
}
|
|
||||||
|
|
||||||
function withAppended(target, appendee) {
|
|
||||||
var len = target.length;
|
|
||||||
var ret = new Array(len + 1);
|
|
||||||
var i;
|
|
||||||
for (i = 0; i < len; ++i) {
|
|
||||||
ret[i] = target[i];
|
|
||||||
}
|
|
||||||
ret[i] = appendee;
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getDataPropertyOrDefault(obj, key, defaultValue) {
|
|
||||||
if (es5.isES5) {
|
|
||||||
var desc = Object.getOwnPropertyDescriptor(obj, key);
|
|
||||||
|
|
||||||
if (desc != null) {
|
|
||||||
return desc.get == null && desc.set == null
|
|
||||||
? desc.value
|
|
||||||
: defaultValue;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return {}.hasOwnProperty.call(obj, key) ? obj[key] : undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function notEnumerableProp(obj, name, value) {
|
|
||||||
if (isPrimitive(obj)) return obj;
|
|
||||||
var descriptor = {
|
|
||||||
value: value,
|
|
||||||
configurable: true,
|
|
||||||
enumerable: false,
|
|
||||||
writable: true
|
|
||||||
};
|
|
||||||
es5.defineProperty(obj, name, descriptor);
|
|
||||||
return obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
function thrower(r) {
|
|
||||||
throw r;
|
|
||||||
}
|
|
||||||
|
|
||||||
var inheritedDataKeys = (function() {
|
|
||||||
var excludedPrototypes = [
|
|
||||||
Array.prototype,
|
|
||||||
Object.prototype,
|
|
||||||
Function.prototype
|
|
||||||
];
|
|
||||||
|
|
||||||
var isExcludedProto = function(val) {
|
|
||||||
for (var i = 0; i < excludedPrototypes.length; ++i) {
|
|
||||||
if (excludedPrototypes[i] === val) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (es5.isES5) {
|
|
||||||
var getKeys = Object.getOwnPropertyNames;
|
|
||||||
return function(obj) {
|
|
||||||
var ret = [];
|
|
||||||
var visitedKeys = Object.create(null);
|
|
||||||
while (obj != null && !isExcludedProto(obj)) {
|
|
||||||
var keys;
|
|
||||||
try {
|
|
||||||
keys = getKeys(obj);
|
|
||||||
} catch (e) {
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
for (var i = 0; i < keys.length; ++i) {
|
|
||||||
var key = keys[i];
|
|
||||||
if (visitedKeys[key]) continue;
|
|
||||||
visitedKeys[key] = true;
|
|
||||||
var desc = Object.getOwnPropertyDescriptor(obj, key);
|
|
||||||
if (desc != null && desc.get == null && desc.set == null) {
|
|
||||||
ret.push(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
obj = es5.getPrototypeOf(obj);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
var hasProp = {}.hasOwnProperty;
|
|
||||||
return function(obj) {
|
|
||||||
if (isExcludedProto(obj)) return [];
|
|
||||||
var ret = [];
|
|
||||||
|
|
||||||
/*jshint forin:false */
|
|
||||||
enumeration: for (var key in obj) {
|
|
||||||
if (hasProp.call(obj, key)) {
|
|
||||||
ret.push(key);
|
|
||||||
} else {
|
|
||||||
for (var i = 0; i < excludedPrototypes.length; ++i) {
|
|
||||||
if (hasProp.call(excludedPrototypes[i], key)) {
|
|
||||||
continue enumeration;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ret.push(key);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
})();
|
|
||||||
|
|
||||||
var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
|
|
||||||
function isClass(fn) {
|
|
||||||
try {
|
|
||||||
if (typeof fn === "function") {
|
|
||||||
var keys = es5.names(fn.prototype);
|
|
||||||
|
|
||||||
var hasMethods = es5.isES5 && keys.length > 1;
|
|
||||||
var hasMethodsOtherThanConstructor = keys.length > 0 &&
|
|
||||||
!(keys.length === 1 && keys[0] === "constructor");
|
|
||||||
var hasThisAssignmentAndStaticMethods =
|
|
||||||
thisAssignmentPattern.test(fn + "") && es5.names(fn).length > 0;
|
|
||||||
|
|
||||||
if (hasMethods || hasMethodsOtherThanConstructor ||
|
|
||||||
hasThisAssignmentAndStaticMethods) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
} catch (e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function toFastProperties(obj) {
|
|
||||||
/*jshint -W027,-W055,-W031*/
|
|
||||||
function FakeConstructor() {}
|
|
||||||
FakeConstructor.prototype = obj;
|
|
||||||
var l = 8;
|
|
||||||
while (l--) new FakeConstructor();
|
|
||||||
return obj;
|
|
||||||
eval(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
var rident = /^[a-z$_][a-z$_0-9]*$/i;
|
|
||||||
function isIdentifier(str) {
|
|
||||||
return rident.test(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
function filledRange(count, prefix, suffix) {
|
|
||||||
var ret = new Array(count);
|
|
||||||
for(var i = 0; i < count; ++i) {
|
|
||||||
ret[i] = prefix + i + suffix;
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
function safeToString(obj) {
|
|
||||||
try {
|
|
||||||
return obj + "";
|
|
||||||
} catch (e) {
|
|
||||||
return "[no string representation]";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function isError(obj) {
|
|
||||||
return obj instanceof Error ||
|
|
||||||
(obj !== null &&
|
|
||||||
typeof obj === "object" &&
|
|
||||||
typeof obj.message === "string" &&
|
|
||||||
typeof obj.name === "string");
|
|
||||||
}
|
|
||||||
|
|
||||||
function markAsOriginatingFromRejection(e) {
|
|
||||||
try {
|
|
||||||
notEnumerableProp(e, "isOperational", true);
|
|
||||||
}
|
|
||||||
catch(ignore) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
function originatesFromRejection(e) {
|
|
||||||
if (e == null) return false;
|
|
||||||
return ((e instanceof Error["__BluebirdErrorTypes__"].OperationalError) ||
|
|
||||||
e["isOperational"] === true);
|
|
||||||
}
|
|
||||||
|
|
||||||
function canAttachTrace(obj) {
|
|
||||||
return isError(obj) && es5.propertyIsWritable(obj, "stack");
|
|
||||||
}
|
|
||||||
|
|
||||||
var ensureErrorObject = (function() {
|
|
||||||
if (!("stack" in new Error())) {
|
|
||||||
return function(value) {
|
|
||||||
if (canAttachTrace(value)) return value;
|
|
||||||
try {throw new Error(safeToString(value));}
|
|
||||||
catch(err) {return err;}
|
|
||||||
};
|
|
||||||
} else {
|
|
||||||
return function(value) {
|
|
||||||
if (canAttachTrace(value)) return value;
|
|
||||||
return new Error(safeToString(value));
|
|
||||||
};
|
|
||||||
}
|
|
||||||
})();
|
|
||||||
|
|
||||||
function classString(obj) {
|
|
||||||
return {}.toString.call(obj);
|
|
||||||
}
|
|
||||||
|
|
||||||
function copyDescriptors(from, to, filter) {
|
|
||||||
var keys = es5.names(from);
|
|
||||||
for (var i = 0; i < keys.length; ++i) {
|
|
||||||
var key = keys[i];
|
|
||||||
if (filter(key)) {
|
|
||||||
try {
|
|
||||||
es5.defineProperty(to, key, es5.getDescriptor(from, key));
|
|
||||||
} catch (ignore) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var asArray = function(v) {
|
|
||||||
if (es5.isArray(v)) {
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
|
|
||||||
if (typeof Symbol !== "undefined" && Symbol.iterator) {
|
|
||||||
var ArrayFrom = typeof Array.from === "function" ? function(v) {
|
|
||||||
return Array.from(v);
|
|
||||||
} : function(v) {
|
|
||||||
var ret = [];
|
|
||||||
var it = v[Symbol.iterator]();
|
|
||||||
var itResult;
|
|
||||||
while (!((itResult = it.next()).done)) {
|
|
||||||
ret.push(itResult.value);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
};
|
|
||||||
|
|
||||||
asArray = function(v) {
|
|
||||||
if (es5.isArray(v)) {
|
|
||||||
return v;
|
|
||||||
} else if (v != null && typeof v[Symbol.iterator] === "function") {
|
|
||||||
return ArrayFrom(v);
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
var isNode = typeof process !== "undefined" &&
|
|
||||||
classString(process).toLowerCase() === "[object process]";
|
|
||||||
|
|
||||||
var hasEnvVariables = typeof process !== "undefined" &&
|
|
||||||
typeof process.env !== "undefined";
|
|
||||||
|
|
||||||
function env(key) {
|
|
||||||
return hasEnvVariables ? process.env[key] : undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getNativePromise() {
|
|
||||||
if (typeof Promise === "function") {
|
|
||||||
try {
|
|
||||||
var promise = new Promise(function(){});
|
|
||||||
if ({}.toString.call(promise) === "[object Promise]") {
|
|
||||||
return Promise;
|
|
||||||
}
|
|
||||||
} catch (e) {}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function domainBind(self, cb) {
|
|
||||||
return self.bind(cb);
|
|
||||||
}
|
|
||||||
|
|
||||||
var ret = {
|
|
||||||
isClass: isClass,
|
|
||||||
isIdentifier: isIdentifier,
|
|
||||||
inheritedDataKeys: inheritedDataKeys,
|
|
||||||
getDataPropertyOrDefault: getDataPropertyOrDefault,
|
|
||||||
thrower: thrower,
|
|
||||||
isArray: es5.isArray,
|
|
||||||
asArray: asArray,
|
|
||||||
notEnumerableProp: notEnumerableProp,
|
|
||||||
isPrimitive: isPrimitive,
|
|
||||||
isObject: isObject,
|
|
||||||
isError: isError,
|
|
||||||
canEvaluate: canEvaluate,
|
|
||||||
errorObj: errorObj,
|
|
||||||
tryCatch: tryCatch,
|
|
||||||
inherits: inherits,
|
|
||||||
withAppended: withAppended,
|
|
||||||
maybeWrapAsError: maybeWrapAsError,
|
|
||||||
toFastProperties: toFastProperties,
|
|
||||||
filledRange: filledRange,
|
|
||||||
toString: safeToString,
|
|
||||||
canAttachTrace: canAttachTrace,
|
|
||||||
ensureErrorObject: ensureErrorObject,
|
|
||||||
originatesFromRejection: originatesFromRejection,
|
|
||||||
markAsOriginatingFromRejection: markAsOriginatingFromRejection,
|
|
||||||
classString: classString,
|
|
||||||
copyDescriptors: copyDescriptors,
|
|
||||||
hasDevTools: typeof chrome !== "undefined" && chrome &&
|
|
||||||
typeof chrome.loadTimes === "function",
|
|
||||||
isNode: isNode,
|
|
||||||
hasEnvVariables: hasEnvVariables,
|
|
||||||
env: env,
|
|
||||||
global: globalObject,
|
|
||||||
getNativePromise: getNativePromise,
|
|
||||||
domainBind: domainBind
|
|
||||||
};
|
|
||||||
ret.isRecentNode = ret.isNode && (function() {
|
|
||||||
var version = process.versions.node.split(".").map(Number);
|
|
||||||
return (version[0] === 0 && version[1] > 10) || (version[0] > 0);
|
|
||||||
})();
|
|
||||||
|
|
||||||
if (ret.isNode) ret.toFastProperties(process);
|
|
||||||
|
|
||||||
try {throw new Error(); } catch (e) {ret.lastLineError = e;}
|
|
||||||
module.exports = ret;
|
|
||||||
-101
@@ -1,101 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "bluebird@3.5.1",
|
|
||||||
"_id": "bluebird@3.5.1",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==",
|
|
||||||
"_location": "/bluebird",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "version",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "bluebird@3.5.1",
|
|
||||||
"name": "bluebird",
|
|
||||||
"escapedName": "bluebird",
|
|
||||||
"rawSpec": "3.5.1",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "3.5.1"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/mquery"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
|
|
||||||
"_shasum": "d9551f9de98f1fcda1e683d17ee91a0602ee2eb9",
|
|
||||||
"_spec": "bluebird@3.5.1",
|
|
||||||
"_where": "D:\\Gitterra\\om\\node_modules\\mquery",
|
|
||||||
"author": {
|
|
||||||
"name": "Petka Antonov",
|
|
||||||
"email": "petka_antonov@hotmail.com",
|
|
||||||
"url": "http://github.com/petkaantonov/"
|
|
||||||
},
|
|
||||||
"browser": "./js/browser/bluebird.js",
|
|
||||||
"bugs": {
|
|
||||||
"url": "http://github.com/petkaantonov/bluebird/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Full featured Promises/A+ implementation with exceptionally good performance",
|
|
||||||
"devDependencies": {
|
|
||||||
"acorn": "~0.6.0",
|
|
||||||
"baconjs": "^0.7.43",
|
|
||||||
"bluebird": "^2.9.2",
|
|
||||||
"body-parser": "^1.10.2",
|
|
||||||
"browserify": "^8.1.1",
|
|
||||||
"cli-table": "~0.3.1",
|
|
||||||
"co": "^4.2.0",
|
|
||||||
"cross-spawn": "^0.2.3",
|
|
||||||
"glob": "^4.3.2",
|
|
||||||
"grunt-saucelabs": "~8.4.1",
|
|
||||||
"highland": "^2.3.0",
|
|
||||||
"istanbul": "^0.3.5",
|
|
||||||
"jshint": "^2.6.0",
|
|
||||||
"jshint-stylish": "~0.2.0",
|
|
||||||
"kefir": "^2.4.1",
|
|
||||||
"mkdirp": "~0.5.0",
|
|
||||||
"mocha": "~2.1",
|
|
||||||
"open": "~0.0.5",
|
|
||||||
"optimist": "~0.6.1",
|
|
||||||
"rimraf": "~2.2.6",
|
|
||||||
"rx": "^2.3.25",
|
|
||||||
"serve-static": "^1.7.1",
|
|
||||||
"sinon": "~1.7.3",
|
|
||||||
"uglify-js": "~2.4.16"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"js/browser",
|
|
||||||
"js/release",
|
|
||||||
"LICENSE"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/petkaantonov/bluebird",
|
|
||||||
"keywords": [
|
|
||||||
"promise",
|
|
||||||
"performance",
|
|
||||||
"promises",
|
|
||||||
"promises-a",
|
|
||||||
"promises-aplus",
|
|
||||||
"async",
|
|
||||||
"await",
|
|
||||||
"deferred",
|
|
||||||
"deferreds",
|
|
||||||
"future",
|
|
||||||
"flow control",
|
|
||||||
"dsl",
|
|
||||||
"fluent interface"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "./js/release/bluebird.js",
|
|
||||||
"name": "bluebird",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/petkaantonov/bluebird.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"generate-browser-core": "node tools/build.js --features=core --no-debug --release --zalgo --browser --minify && mv js/browser/bluebird.js js/browser/bluebird.core.js && mv js/browser/bluebird.min.js js/browser/bluebird.core.min.js",
|
|
||||||
"generate-browser-full": "node tools/build.js --no-clean --no-debug --release --browser --minify",
|
|
||||||
"istanbul": "istanbul",
|
|
||||||
"lint": "node scripts/jshint.js",
|
|
||||||
"prepublish": "npm run generate-browser-core && npm run generate-browser-full",
|
|
||||||
"test": "node tools/test.js"
|
|
||||||
},
|
|
||||||
"version": "3.5.1",
|
|
||||||
"webpack": "./js/release/bluebird.js"
|
|
||||||
}
|
|
||||||
-609
@@ -1,609 +0,0 @@
|
|||||||
1.19.0 / 2019-04-25
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@3.1.0
|
|
||||||
- Add petabyte (`pb`) support
|
|
||||||
* deps: http-errors@1.7.2
|
|
||||||
- Set constructor name when possible
|
|
||||||
- deps: setprototypeof@1.1.1
|
|
||||||
- deps: statuses@'>= 1.5.0 < 2'
|
|
||||||
* deps: iconv-lite@0.4.24
|
|
||||||
- Added encoding MIK
|
|
||||||
* deps: qs@6.7.0
|
|
||||||
- Fix parsing array brackets after index
|
|
||||||
* deps: raw-body@2.4.0
|
|
||||||
- deps: bytes@3.1.0
|
|
||||||
- deps: http-errors@1.7.2
|
|
||||||
- deps: iconv-lite@0.4.24
|
|
||||||
* deps: type-is@~1.6.17
|
|
||||||
- deps: mime-types@~2.1.24
|
|
||||||
- perf: prevent internal `throw` on invalid type
|
|
||||||
|
|
||||||
1.18.3 / 2018-05-14
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix stack trace for strict json parse error
|
|
||||||
* deps: depd@~1.1.2
|
|
||||||
- perf: remove argument reassignment
|
|
||||||
* deps: http-errors@~1.6.3
|
|
||||||
- deps: depd@~1.1.2
|
|
||||||
- deps: setprototypeof@1.1.0
|
|
||||||
- deps: statuses@'>= 1.3.1 < 2'
|
|
||||||
* deps: iconv-lite@0.4.23
|
|
||||||
- Fix loading encoding with year appended
|
|
||||||
- Fix deprecation warnings on Node.js 10+
|
|
||||||
* deps: qs@6.5.2
|
|
||||||
* deps: raw-body@2.3.3
|
|
||||||
- deps: http-errors@1.6.3
|
|
||||||
- deps: iconv-lite@0.4.23
|
|
||||||
* deps: type-is@~1.6.16
|
|
||||||
- deps: mime-types@~2.1.18
|
|
||||||
|
|
||||||
1.18.2 / 2017-09-22
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@2.6.9
|
|
||||||
* perf: remove argument reassignment
|
|
||||||
|
|
||||||
1.18.1 / 2017-09-12
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: content-type@~1.0.4
|
|
||||||
- perf: remove argument reassignment
|
|
||||||
- perf: skip parameter parsing when no parameters
|
|
||||||
* deps: iconv-lite@0.4.19
|
|
||||||
- Fix ISO-8859-1 regression
|
|
||||||
- Update Windows-1255
|
|
||||||
* deps: qs@6.5.1
|
|
||||||
- Fix parsing & compacting very deep objects
|
|
||||||
* deps: raw-body@2.3.2
|
|
||||||
- deps: iconv-lite@0.4.19
|
|
||||||
|
|
||||||
1.18.0 / 2017-09-08
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix JSON strict violation error to match native parse error
|
|
||||||
* Include the `body` property on verify errors
|
|
||||||
* Include the `type` property on all generated errors
|
|
||||||
* Use `http-errors` to set status code on errors
|
|
||||||
* deps: bytes@3.0.0
|
|
||||||
* deps: debug@2.6.8
|
|
||||||
* deps: depd@~1.1.1
|
|
||||||
- Remove unnecessary `Buffer` loading
|
|
||||||
* deps: http-errors@~1.6.2
|
|
||||||
- deps: depd@1.1.1
|
|
||||||
* deps: iconv-lite@0.4.18
|
|
||||||
- Add support for React Native
|
|
||||||
- Add a warning if not loaded as utf-8
|
|
||||||
- Fix CESU-8 decoding in Node.js 8
|
|
||||||
- Improve speed of ISO-8859-1 encoding
|
|
||||||
* deps: qs@6.5.0
|
|
||||||
* deps: raw-body@2.3.1
|
|
||||||
- Use `http-errors` for standard emitted errors
|
|
||||||
- deps: bytes@3.0.0
|
|
||||||
- deps: iconv-lite@0.4.18
|
|
||||||
- perf: skip buffer decoding on overage chunk
|
|
||||||
* perf: prevent internal `throw` when missing charset
|
|
||||||
|
|
||||||
1.17.2 / 2017-05-17
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@2.6.7
|
|
||||||
- Fix `DEBUG_MAX_ARRAY_LENGTH`
|
|
||||||
- deps: ms@2.0.0
|
|
||||||
* deps: type-is@~1.6.15
|
|
||||||
- deps: mime-types@~2.1.15
|
|
||||||
|
|
||||||
1.17.1 / 2017-03-06
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: qs@6.4.0
|
|
||||||
- Fix regression parsing keys starting with `[`
|
|
||||||
|
|
||||||
1.17.0 / 2017-03-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: http-errors@~1.6.1
|
|
||||||
- Make `message` property enumerable for `HttpError`s
|
|
||||||
- deps: setprototypeof@1.0.3
|
|
||||||
* deps: qs@6.3.1
|
|
||||||
- Fix compacting nested arrays
|
|
||||||
|
|
||||||
1.16.1 / 2017-02-10
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@2.6.1
|
|
||||||
- Fix deprecation messages in WebStorm and other editors
|
|
||||||
- Undeprecate `DEBUG_FD` set to `1` or `2`
|
|
||||||
|
|
||||||
1.16.0 / 2017-01-17
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@2.6.0
|
|
||||||
- Allow colors in workers
|
|
||||||
- Deprecated `DEBUG_FD` environment variable
|
|
||||||
- Fix error when running under React Native
|
|
||||||
- Use same color for same namespace
|
|
||||||
- deps: ms@0.7.2
|
|
||||||
* deps: http-errors@~1.5.1
|
|
||||||
- deps: inherits@2.0.3
|
|
||||||
- deps: setprototypeof@1.0.2
|
|
||||||
- deps: statuses@'>= 1.3.1 < 2'
|
|
||||||
* deps: iconv-lite@0.4.15
|
|
||||||
- Added encoding MS-31J
|
|
||||||
- Added encoding MS-932
|
|
||||||
- Added encoding MS-936
|
|
||||||
- Added encoding MS-949
|
|
||||||
- Added encoding MS-950
|
|
||||||
- Fix GBK/GB18030 handling of Euro character
|
|
||||||
* deps: qs@6.2.1
|
|
||||||
- Fix array parsing from skipping empty values
|
|
||||||
* deps: raw-body@~2.2.0
|
|
||||||
- deps: iconv-lite@0.4.15
|
|
||||||
* deps: type-is@~1.6.14
|
|
||||||
- deps: mime-types@~2.1.13
|
|
||||||
|
|
||||||
1.15.2 / 2016-06-19
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@2.4.0
|
|
||||||
* deps: content-type@~1.0.2
|
|
||||||
- perf: enable strict mode
|
|
||||||
* deps: http-errors@~1.5.0
|
|
||||||
- Use `setprototypeof` module to replace `__proto__` setting
|
|
||||||
- deps: statuses@'>= 1.3.0 < 2'
|
|
||||||
- perf: enable strict mode
|
|
||||||
* deps: qs@6.2.0
|
|
||||||
* deps: raw-body@~2.1.7
|
|
||||||
- deps: bytes@2.4.0
|
|
||||||
- perf: remove double-cleanup on happy path
|
|
||||||
* deps: type-is@~1.6.13
|
|
||||||
- deps: mime-types@~2.1.11
|
|
||||||
|
|
||||||
1.15.1 / 2016-05-05
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@2.3.0
|
|
||||||
- Drop partial bytes on all parsed units
|
|
||||||
- Fix parsing byte string that looks like hex
|
|
||||||
* deps: raw-body@~2.1.6
|
|
||||||
- deps: bytes@2.3.0
|
|
||||||
* deps: type-is@~1.6.12
|
|
||||||
- deps: mime-types@~2.1.10
|
|
||||||
|
|
||||||
1.15.0 / 2016-02-10
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: http-errors@~1.4.0
|
|
||||||
- Add `HttpError` export, for `err instanceof createError.HttpError`
|
|
||||||
- deps: inherits@2.0.1
|
|
||||||
- deps: statuses@'>= 1.2.1 < 2'
|
|
||||||
* deps: qs@6.1.0
|
|
||||||
* deps: type-is@~1.6.11
|
|
||||||
- deps: mime-types@~2.1.9
|
|
||||||
|
|
||||||
1.14.2 / 2015-12-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: bytes@2.2.0
|
|
||||||
* deps: iconv-lite@0.4.13
|
|
||||||
* deps: qs@5.2.0
|
|
||||||
* deps: raw-body@~2.1.5
|
|
||||||
- deps: bytes@2.2.0
|
|
||||||
- deps: iconv-lite@0.4.13
|
|
||||||
* deps: type-is@~1.6.10
|
|
||||||
- deps: mime-types@~2.1.8
|
|
||||||
|
|
||||||
1.14.1 / 2015-09-27
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix issue where invalid charset results in 400 when `verify` used
|
|
||||||
* deps: iconv-lite@0.4.12
|
|
||||||
- Fix CESU-8 decoding in Node.js 4.x
|
|
||||||
* deps: raw-body@~2.1.4
|
|
||||||
- Fix masking critical errors from `iconv-lite`
|
|
||||||
- deps: iconv-lite@0.4.12
|
|
||||||
* deps: type-is@~1.6.9
|
|
||||||
- deps: mime-types@~2.1.7
|
|
||||||
|
|
||||||
1.14.0 / 2015-09-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Fix JSON strict parse error to match syntax errors
|
|
||||||
* Provide static `require` analysis in `urlencoded` parser
|
|
||||||
* deps: depd@~1.1.0
|
|
||||||
- Support web browser loading
|
|
||||||
* deps: qs@5.1.0
|
|
||||||
* deps: raw-body@~2.1.3
|
|
||||||
- Fix sync callback when attaching data listener causes sync read
|
|
||||||
* deps: type-is@~1.6.8
|
|
||||||
- Fix type error when given invalid type to match against
|
|
||||||
- deps: mime-types@~2.1.6
|
|
||||||
|
|
||||||
1.13.3 / 2015-07-31
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: type-is@~1.6.6
|
|
||||||
- deps: mime-types@~2.1.4
|
|
||||||
|
|
||||||
1.13.2 / 2015-07-05
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: iconv-lite@0.4.11
|
|
||||||
* deps: qs@4.0.0
|
|
||||||
- Fix dropping parameters like `hasOwnProperty`
|
|
||||||
- Fix user-visible incompatibilities from 3.1.0
|
|
||||||
- Fix various parsing edge cases
|
|
||||||
* deps: raw-body@~2.1.2
|
|
||||||
- Fix error stack traces to skip `makeError`
|
|
||||||
- deps: iconv-lite@0.4.11
|
|
||||||
* deps: type-is@~1.6.4
|
|
||||||
- deps: mime-types@~2.1.2
|
|
||||||
- perf: enable strict mode
|
|
||||||
- perf: remove argument reassignment
|
|
||||||
|
|
||||||
1.13.1 / 2015-06-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: qs@2.4.2
|
|
||||||
- Downgraded from 3.1.0 because of user-visible incompatibilities
|
|
||||||
|
|
||||||
1.13.0 / 2015-06-14
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Add `statusCode` property on `Error`s, in addition to `status`
|
|
||||||
* Change `type` default to `application/json` for JSON parser
|
|
||||||
* Change `type` default to `application/x-www-form-urlencoded` for urlencoded parser
|
|
||||||
* Provide static `require` analysis
|
|
||||||
* Use the `http-errors` module to generate errors
|
|
||||||
* deps: bytes@2.1.0
|
|
||||||
- Slight optimizations
|
|
||||||
* deps: iconv-lite@0.4.10
|
|
||||||
- The encoding UTF-16 without BOM now defaults to UTF-16LE when detection fails
|
|
||||||
- Leading BOM is now removed when decoding
|
|
||||||
* deps: on-finished@~2.3.0
|
|
||||||
- Add defined behavior for HTTP `CONNECT` requests
|
|
||||||
- Add defined behavior for HTTP `Upgrade` requests
|
|
||||||
- deps: ee-first@1.1.1
|
|
||||||
* deps: qs@3.1.0
|
|
||||||
- Fix dropping parameters like `hasOwnProperty`
|
|
||||||
- Fix various parsing edge cases
|
|
||||||
- Parsed object now has `null` prototype
|
|
||||||
* deps: raw-body@~2.1.1
|
|
||||||
- Use `unpipe` module for unpiping requests
|
|
||||||
- deps: iconv-lite@0.4.10
|
|
||||||
* deps: type-is@~1.6.3
|
|
||||||
- deps: mime-types@~2.1.1
|
|
||||||
- perf: reduce try block size
|
|
||||||
- perf: remove bitwise operations
|
|
||||||
* perf: enable strict mode
|
|
||||||
* perf: remove argument reassignment
|
|
||||||
* perf: remove delete call
|
|
||||||
|
|
||||||
1.12.4 / 2015-05-10
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@~2.2.0
|
|
||||||
* deps: qs@2.4.2
|
|
||||||
- Fix allowing parameters like `constructor`
|
|
||||||
* deps: on-finished@~2.2.1
|
|
||||||
* deps: raw-body@~2.0.1
|
|
||||||
- Fix a false-positive when unpiping in Node.js 0.8
|
|
||||||
- deps: bytes@2.0.1
|
|
||||||
* deps: type-is@~1.6.2
|
|
||||||
- deps: mime-types@~2.0.11
|
|
||||||
|
|
||||||
1.12.3 / 2015-04-15
|
|
||||||
===================
|
|
||||||
|
|
||||||
* Slight efficiency improvement when not debugging
|
|
||||||
* deps: depd@~1.0.1
|
|
||||||
* deps: iconv-lite@0.4.8
|
|
||||||
- Add encoding alias UNICODE-1-1-UTF-7
|
|
||||||
* deps: raw-body@1.3.4
|
|
||||||
- Fix hanging callback if request aborts during read
|
|
||||||
- deps: iconv-lite@0.4.8
|
|
||||||
|
|
||||||
1.12.2 / 2015-03-16
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: qs@2.4.1
|
|
||||||
- Fix error when parameter `hasOwnProperty` is present
|
|
||||||
|
|
||||||
1.12.1 / 2015-03-15
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: debug@~2.1.3
|
|
||||||
- Fix high intensity foreground color for bold
|
|
||||||
- deps: ms@0.7.0
|
|
||||||
* deps: type-is@~1.6.1
|
|
||||||
- deps: mime-types@~2.0.10
|
|
||||||
|
|
||||||
1.12.0 / 2015-02-13
|
|
||||||
===================
|
|
||||||
|
|
||||||
* add `debug` messages
|
|
||||||
* accept a function for the `type` option
|
|
||||||
* use `content-type` to parse `Content-Type` headers
|
|
||||||
* deps: iconv-lite@0.4.7
|
|
||||||
- Gracefully support enumerables on `Object.prototype`
|
|
||||||
* deps: raw-body@1.3.3
|
|
||||||
- deps: iconv-lite@0.4.7
|
|
||||||
* deps: type-is@~1.6.0
|
|
||||||
- fix argument reassignment
|
|
||||||
- fix false-positives in `hasBody` `Transfer-Encoding` check
|
|
||||||
- support wildcard for both type and subtype (`*/*`)
|
|
||||||
- deps: mime-types@~2.0.9
|
|
||||||
|
|
||||||
1.11.0 / 2015-01-30
|
|
||||||
===================
|
|
||||||
|
|
||||||
* make internal `extended: true` depth limit infinity
|
|
||||||
* deps: type-is@~1.5.6
|
|
||||||
- deps: mime-types@~2.0.8
|
|
||||||
|
|
||||||
1.10.2 / 2015-01-20
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: iconv-lite@0.4.6
|
|
||||||
- Fix rare aliases of single-byte encodings
|
|
||||||
* deps: raw-body@1.3.2
|
|
||||||
- deps: iconv-lite@0.4.6
|
|
||||||
|
|
||||||
1.10.1 / 2015-01-01
|
|
||||||
===================
|
|
||||||
|
|
||||||
* deps: on-finished@~2.2.0
|
|
||||||
* deps: type-is@~1.5.5
|
|
||||||
- deps: mime-types@~2.0.7
|
|
||||||
|
|
||||||
1.10.0 / 2014-12-02
|
|
||||||
===================
|
|
||||||
|
|
||||||
* make internal `extended: true` array limit dynamic
|
|
||||||
|
|
||||||
1.9.3 / 2014-11-21
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: iconv-lite@0.4.5
|
|
||||||
- Fix Windows-31J and X-SJIS encoding support
|
|
||||||
* deps: qs@2.3.3
|
|
||||||
- Fix `arrayLimit` behavior
|
|
||||||
* deps: raw-body@1.3.1
|
|
||||||
- deps: iconv-lite@0.4.5
|
|
||||||
* deps: type-is@~1.5.3
|
|
||||||
- deps: mime-types@~2.0.3
|
|
||||||
|
|
||||||
1.9.2 / 2014-10-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@2.3.2
|
|
||||||
- Fix parsing of mixed objects and values
|
|
||||||
|
|
||||||
1.9.1 / 2014-10-22
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: on-finished@~2.1.1
|
|
||||||
- Fix handling of pipelined requests
|
|
||||||
* deps: qs@2.3.0
|
|
||||||
- Fix parsing of mixed implicit and explicit arrays
|
|
||||||
* deps: type-is@~1.5.2
|
|
||||||
- deps: mime-types@~2.0.2
|
|
||||||
|
|
||||||
1.9.0 / 2014-09-24
|
|
||||||
==================
|
|
||||||
|
|
||||||
* include the charset in "unsupported charset" error message
|
|
||||||
* include the encoding in "unsupported content encoding" error message
|
|
||||||
* deps: depd@~1.0.0
|
|
||||||
|
|
||||||
1.8.4 / 2014-09-23
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix content encoding to be case-insensitive
|
|
||||||
|
|
||||||
1.8.3 / 2014-09-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@2.2.4
|
|
||||||
- Fix issue with object keys starting with numbers truncated
|
|
||||||
|
|
||||||
1.8.2 / 2014-09-15
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@0.4.5
|
|
||||||
|
|
||||||
1.8.1 / 2014-09-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: media-typer@0.3.0
|
|
||||||
* deps: type-is@~1.5.1
|
|
||||||
|
|
||||||
1.8.0 / 2014-09-05
|
|
||||||
==================
|
|
||||||
|
|
||||||
* make empty-body-handling consistent between chunked requests
|
|
||||||
- empty `json` produces `{}`
|
|
||||||
- empty `raw` produces `new Buffer(0)`
|
|
||||||
- empty `text` produces `''`
|
|
||||||
- empty `urlencoded` produces `{}`
|
|
||||||
* deps: qs@2.2.3
|
|
||||||
- Fix issue where first empty value in array is discarded
|
|
||||||
* deps: type-is@~1.5.0
|
|
||||||
- fix `hasbody` to be true for `content-length: 0`
|
|
||||||
|
|
||||||
1.7.0 / 2014-09-01
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `parameterLimit` option to `urlencoded` parser
|
|
||||||
* change `urlencoded` extended array limit to 100
|
|
||||||
* respond with 413 when over `parameterLimit` in `urlencoded`
|
|
||||||
|
|
||||||
1.6.7 / 2014-08-29
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@2.2.2
|
|
||||||
- Remove unnecessary cloning
|
|
||||||
|
|
||||||
1.6.6 / 2014-08-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@2.2.0
|
|
||||||
- Array parsing fix
|
|
||||||
- Performance improvements
|
|
||||||
|
|
||||||
1.6.5 / 2014-08-16
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: on-finished@2.1.0
|
|
||||||
|
|
||||||
1.6.4 / 2014-08-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.2.2
|
|
||||||
|
|
||||||
1.6.3 / 2014-08-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.2.1
|
|
||||||
|
|
||||||
1.6.2 / 2014-08-07
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.2.0
|
|
||||||
- Fix parsing array of objects
|
|
||||||
|
|
||||||
1.6.1 / 2014-08-06
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.1.0
|
|
||||||
- Accept urlencoded square brackets
|
|
||||||
- Accept empty values in implicit array notation
|
|
||||||
|
|
||||||
1.6.0 / 2014-08-05
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: qs@1.0.2
|
|
||||||
- Complete rewrite
|
|
||||||
- Limits array length to 20
|
|
||||||
- Limits object depth to 5
|
|
||||||
- Limits parameters to 1,000
|
|
||||||
|
|
||||||
1.5.2 / 2014-07-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@0.4.4
|
|
||||||
- Work-around v8 generating empty stack traces
|
|
||||||
|
|
||||||
1.5.1 / 2014-07-26
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@0.4.3
|
|
||||||
- Fix exception when global `Error.stackTraceLimit` is too low
|
|
||||||
|
|
||||||
1.5.0 / 2014-07-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: depd@0.4.2
|
|
||||||
- Add `TRACE_DEPRECATION` environment variable
|
|
||||||
- Remove non-standard grey color from color output
|
|
||||||
- Support `--no-deprecation` argument
|
|
||||||
- Support `--trace-deprecation` argument
|
|
||||||
* deps: iconv-lite@0.4.4
|
|
||||||
- Added encoding UTF-7
|
|
||||||
* deps: raw-body@1.3.0
|
|
||||||
- deps: iconv-lite@0.4.4
|
|
||||||
- Added encoding UTF-7
|
|
||||||
- Fix `Cannot switch to old mode now` error on Node.js 0.10+
|
|
||||||
* deps: type-is@~1.3.2
|
|
||||||
|
|
||||||
1.4.3 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: type-is@1.3.1
|
|
||||||
- fix global variable leak
|
|
||||||
|
|
||||||
1.4.2 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: type-is@1.3.0
|
|
||||||
- improve type parsing
|
|
||||||
|
|
||||||
1.4.1 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix urlencoded extended deprecation message
|
|
||||||
|
|
||||||
1.4.0 / 2014-06-19
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `text` parser
|
|
||||||
* add `raw` parser
|
|
||||||
* check accepted charset in content-type (accepts utf-8)
|
|
||||||
* check accepted encoding in content-encoding (accepts identity)
|
|
||||||
* deprecate `bodyParser()` middleware; use `.json()` and `.urlencoded()` as needed
|
|
||||||
* deprecate `urlencoded()` without provided `extended` option
|
|
||||||
* lazy-load urlencoded parsers
|
|
||||||
* parsers split into files for reduced mem usage
|
|
||||||
* support gzip and deflate bodies
|
|
||||||
- set `inflate: false` to turn off
|
|
||||||
* deps: raw-body@1.2.2
|
|
||||||
- Support all encodings from `iconv-lite`
|
|
||||||
|
|
||||||
1.3.1 / 2014-06-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: type-is@1.2.1
|
|
||||||
- Switch dependency from mime to mime-types@1.0.0
|
|
||||||
|
|
||||||
1.3.0 / 2014-05-31
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `extended` option to urlencoded parser
|
|
||||||
|
|
||||||
1.2.2 / 2014-05-27
|
|
||||||
==================
|
|
||||||
|
|
||||||
* deps: raw-body@1.1.6
|
|
||||||
- assert stream encoding on node.js 0.8
|
|
||||||
- assert stream encoding on node.js < 0.10.6
|
|
||||||
- deps: bytes@1
|
|
||||||
|
|
||||||
1.2.1 / 2014-05-26
|
|
||||||
==================
|
|
||||||
|
|
||||||
* invoke `next(err)` after request fully read
|
|
||||||
- prevents hung responses and socket hang ups
|
|
||||||
|
|
||||||
1.2.0 / 2014-05-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `verify` option
|
|
||||||
* deps: type-is@1.2.0
|
|
||||||
- support suffix matching
|
|
||||||
|
|
||||||
1.1.2 / 2014-05-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* improve json parser speed
|
|
||||||
|
|
||||||
1.1.1 / 2014-05-11
|
|
||||||
==================
|
|
||||||
|
|
||||||
* fix repeated limit parsing with every request
|
|
||||||
|
|
||||||
1.1.0 / 2014-05-10
|
|
||||||
==================
|
|
||||||
|
|
||||||
* add `type` option
|
|
||||||
* deps: pin for safety and consistency
|
|
||||||
|
|
||||||
1.0.2 / 2014-04-14
|
|
||||||
==================
|
|
||||||
|
|
||||||
* use `type-is` module
|
|
||||||
|
|
||||||
1.0.1 / 2014-03-20
|
|
||||||
==================
|
|
||||||
|
|
||||||
* lower default limits to 100kb
|
|
||||||
-23
@@ -1,23 +0,0 @@
|
|||||||
(The MIT License)
|
|
||||||
|
|
||||||
Copyright (c) 2014 Jonathan Ong <me@jongleberry.com>
|
|
||||||
Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com>
|
|
||||||
|
|
||||||
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.
|
|
||||||
-443
@@ -1,443 +0,0 @@
|
|||||||
# body-parser
|
|
||||||
|
|
||||||
[![NPM Version][npm-image]][npm-url]
|
|
||||||
[![NPM Downloads][downloads-image]][downloads-url]
|
|
||||||
[![Build Status][travis-image]][travis-url]
|
|
||||||
[![Test Coverage][coveralls-image]][coveralls-url]
|
|
||||||
|
|
||||||
Node.js body parsing middleware.
|
|
||||||
|
|
||||||
Parse incoming request bodies in a middleware before your handlers, available
|
|
||||||
under the `req.body` property.
|
|
||||||
|
|
||||||
**Note** As `req.body`'s shape is based on user-controlled input, all
|
|
||||||
properties and values in this object are untrusted and should be validated
|
|
||||||
before trusting. For example, `req.body.foo.toString()` may fail in multiple
|
|
||||||
ways, for example the `foo` property may not be there or may not be a string,
|
|
||||||
and `toString` may not be a function and instead a string or other user input.
|
|
||||||
|
|
||||||
[Learn about the anatomy of an HTTP transaction in Node.js](https://nodejs.org/en/docs/guides/anatomy-of-an-http-transaction/).
|
|
||||||
|
|
||||||
_This does not handle multipart bodies_, due to their complex and typically
|
|
||||||
large nature. For multipart bodies, you may be interested in the following
|
|
||||||
modules:
|
|
||||||
|
|
||||||
* [busboy](https://www.npmjs.org/package/busboy#readme) and
|
|
||||||
[connect-busboy](https://www.npmjs.org/package/connect-busboy#readme)
|
|
||||||
* [multiparty](https://www.npmjs.org/package/multiparty#readme) and
|
|
||||||
[connect-multiparty](https://www.npmjs.org/package/connect-multiparty#readme)
|
|
||||||
* [formidable](https://www.npmjs.org/package/formidable#readme)
|
|
||||||
* [multer](https://www.npmjs.org/package/multer#readme)
|
|
||||||
|
|
||||||
This module provides the following parsers:
|
|
||||||
|
|
||||||
* [JSON body parser](#bodyparserjsonoptions)
|
|
||||||
* [Raw body parser](#bodyparserrawoptions)
|
|
||||||
* [Text body parser](#bodyparsertextoptions)
|
|
||||||
* [URL-encoded form body parser](#bodyparserurlencodedoptions)
|
|
||||||
|
|
||||||
Other body parsers you might be interested in:
|
|
||||||
|
|
||||||
- [body](https://www.npmjs.org/package/body#readme)
|
|
||||||
- [co-body](https://www.npmjs.org/package/co-body#readme)
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
```sh
|
|
||||||
$ npm install body-parser
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
<!-- eslint-disable no-unused-vars -->
|
|
||||||
|
|
||||||
```js
|
|
||||||
var bodyParser = require('body-parser')
|
|
||||||
```
|
|
||||||
|
|
||||||
The `bodyParser` object exposes various factories to create middlewares. All
|
|
||||||
middlewares will populate the `req.body` property with the parsed body when
|
|
||||||
the `Content-Type` request header matches the `type` option, or an empty
|
|
||||||
object (`{}`) if there was no body to parse, the `Content-Type` was not matched,
|
|
||||||
or an error occurred.
|
|
||||||
|
|
||||||
The various errors returned by this module are described in the
|
|
||||||
[errors section](#errors).
|
|
||||||
|
|
||||||
### bodyParser.json([options])
|
|
||||||
|
|
||||||
Returns middleware that only parses `json` and only looks at requests where
|
|
||||||
the `Content-Type` header matches the `type` option. This parser accepts any
|
|
||||||
Unicode encoding of the body and supports automatic inflation of `gzip` and
|
|
||||||
`deflate` encodings.
|
|
||||||
|
|
||||||
A new `body` object containing the parsed data is populated on the `request`
|
|
||||||
object after the middleware (i.e. `req.body`).
|
|
||||||
|
|
||||||
#### Options
|
|
||||||
|
|
||||||
The `json` function takes an optional `options` object that may contain any of
|
|
||||||
the following keys:
|
|
||||||
|
|
||||||
##### inflate
|
|
||||||
|
|
||||||
When set to `true`, then deflated (compressed) bodies will be inflated; when
|
|
||||||
`false`, deflated bodies are rejected. Defaults to `true`.
|
|
||||||
|
|
||||||
##### limit
|
|
||||||
|
|
||||||
Controls the maximum request body size. If this is a number, then the value
|
|
||||||
specifies the number of bytes; if it is a string, the value is passed to the
|
|
||||||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
|
|
||||||
to `'100kb'`.
|
|
||||||
|
|
||||||
##### reviver
|
|
||||||
|
|
||||||
The `reviver` option is passed directly to `JSON.parse` as the second
|
|
||||||
argument. You can find more information on this argument
|
|
||||||
[in the MDN documentation about JSON.parse](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter).
|
|
||||||
|
|
||||||
##### strict
|
|
||||||
|
|
||||||
When set to `true`, will only accept arrays and objects; when `false` will
|
|
||||||
accept anything `JSON.parse` accepts. Defaults to `true`.
|
|
||||||
|
|
||||||
##### type
|
|
||||||
|
|
||||||
The `type` option is used to determine what media type the middleware will
|
|
||||||
parse. This option can be a string, array of strings, or a function. If not a
|
|
||||||
function, `type` option is passed directly to the
|
|
||||||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
|
|
||||||
be an extension name (like `json`), a mime type (like `application/json`), or
|
|
||||||
a mime type with a wildcard (like `*/*` or `*/json`). If a function, the `type`
|
|
||||||
option is called as `fn(req)` and the request is parsed if it returns a truthy
|
|
||||||
value. Defaults to `application/json`.
|
|
||||||
|
|
||||||
##### verify
|
|
||||||
|
|
||||||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
|
|
||||||
where `buf` is a `Buffer` of the raw request body and `encoding` is the
|
|
||||||
encoding of the request. The parsing can be aborted by throwing an error.
|
|
||||||
|
|
||||||
### bodyParser.raw([options])
|
|
||||||
|
|
||||||
Returns middleware that parses all bodies as a `Buffer` and only looks at
|
|
||||||
requests where the `Content-Type` header matches the `type` option. This
|
|
||||||
parser supports automatic inflation of `gzip` and `deflate` encodings.
|
|
||||||
|
|
||||||
A new `body` object containing the parsed data is populated on the `request`
|
|
||||||
object after the middleware (i.e. `req.body`). This will be a `Buffer` object
|
|
||||||
of the body.
|
|
||||||
|
|
||||||
#### Options
|
|
||||||
|
|
||||||
The `raw` function takes an optional `options` object that may contain any of
|
|
||||||
the following keys:
|
|
||||||
|
|
||||||
##### inflate
|
|
||||||
|
|
||||||
When set to `true`, then deflated (compressed) bodies will be inflated; when
|
|
||||||
`false`, deflated bodies are rejected. Defaults to `true`.
|
|
||||||
|
|
||||||
##### limit
|
|
||||||
|
|
||||||
Controls the maximum request body size. If this is a number, then the value
|
|
||||||
specifies the number of bytes; if it is a string, the value is passed to the
|
|
||||||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
|
|
||||||
to `'100kb'`.
|
|
||||||
|
|
||||||
##### type
|
|
||||||
|
|
||||||
The `type` option is used to determine what media type the middleware will
|
|
||||||
parse. This option can be a string, array of strings, or a function.
|
|
||||||
If not a function, `type` option is passed directly to the
|
|
||||||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this
|
|
||||||
can be an extension name (like `bin`), a mime type (like
|
|
||||||
`application/octet-stream`), or a mime type with a wildcard (like `*/*` or
|
|
||||||
`application/*`). If a function, the `type` option is called as `fn(req)`
|
|
||||||
and the request is parsed if it returns a truthy value. Defaults to
|
|
||||||
`application/octet-stream`.
|
|
||||||
|
|
||||||
##### verify
|
|
||||||
|
|
||||||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
|
|
||||||
where `buf` is a `Buffer` of the raw request body and `encoding` is the
|
|
||||||
encoding of the request. The parsing can be aborted by throwing an error.
|
|
||||||
|
|
||||||
### bodyParser.text([options])
|
|
||||||
|
|
||||||
Returns middleware that parses all bodies as a string and only looks at
|
|
||||||
requests where the `Content-Type` header matches the `type` option. This
|
|
||||||
parser supports automatic inflation of `gzip` and `deflate` encodings.
|
|
||||||
|
|
||||||
A new `body` string containing the parsed data is populated on the `request`
|
|
||||||
object after the middleware (i.e. `req.body`). This will be a string of the
|
|
||||||
body.
|
|
||||||
|
|
||||||
#### Options
|
|
||||||
|
|
||||||
The `text` function takes an optional `options` object that may contain any of
|
|
||||||
the following keys:
|
|
||||||
|
|
||||||
##### defaultCharset
|
|
||||||
|
|
||||||
Specify the default character set for the text content if the charset is not
|
|
||||||
specified in the `Content-Type` header of the request. Defaults to `utf-8`.
|
|
||||||
|
|
||||||
##### inflate
|
|
||||||
|
|
||||||
When set to `true`, then deflated (compressed) bodies will be inflated; when
|
|
||||||
`false`, deflated bodies are rejected. Defaults to `true`.
|
|
||||||
|
|
||||||
##### limit
|
|
||||||
|
|
||||||
Controls the maximum request body size. If this is a number, then the value
|
|
||||||
specifies the number of bytes; if it is a string, the value is passed to the
|
|
||||||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
|
|
||||||
to `'100kb'`.
|
|
||||||
|
|
||||||
##### type
|
|
||||||
|
|
||||||
The `type` option is used to determine what media type the middleware will
|
|
||||||
parse. This option can be a string, array of strings, or a function. If not
|
|
||||||
a function, `type` option is passed directly to the
|
|
||||||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
|
|
||||||
be an extension name (like `txt`), a mime type (like `text/plain`), or a mime
|
|
||||||
type with a wildcard (like `*/*` or `text/*`). If a function, the `type`
|
|
||||||
option is called as `fn(req)` and the request is parsed if it returns a
|
|
||||||
truthy value. Defaults to `text/plain`.
|
|
||||||
|
|
||||||
##### verify
|
|
||||||
|
|
||||||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
|
|
||||||
where `buf` is a `Buffer` of the raw request body and `encoding` is the
|
|
||||||
encoding of the request. The parsing can be aborted by throwing an error.
|
|
||||||
|
|
||||||
### bodyParser.urlencoded([options])
|
|
||||||
|
|
||||||
Returns middleware that only parses `urlencoded` bodies and only looks at
|
|
||||||
requests where the `Content-Type` header matches the `type` option. This
|
|
||||||
parser accepts only UTF-8 encoding of the body and supports automatic
|
|
||||||
inflation of `gzip` and `deflate` encodings.
|
|
||||||
|
|
||||||
A new `body` object containing the parsed data is populated on the `request`
|
|
||||||
object after the middleware (i.e. `req.body`). This object will contain
|
|
||||||
key-value pairs, where the value can be a string or array (when `extended` is
|
|
||||||
`false`), or any type (when `extended` is `true`).
|
|
||||||
|
|
||||||
#### Options
|
|
||||||
|
|
||||||
The `urlencoded` function takes an optional `options` object that may contain
|
|
||||||
any of the following keys:
|
|
||||||
|
|
||||||
##### extended
|
|
||||||
|
|
||||||
The `extended` option allows to choose between parsing the URL-encoded data
|
|
||||||
with the `querystring` library (when `false`) or the `qs` library (when
|
|
||||||
`true`). The "extended" syntax allows for rich objects and arrays to be
|
|
||||||
encoded into the URL-encoded format, allowing for a JSON-like experience
|
|
||||||
with URL-encoded. For more information, please
|
|
||||||
[see the qs library](https://www.npmjs.org/package/qs#readme).
|
|
||||||
|
|
||||||
Defaults to `true`, but using the default has been deprecated. Please
|
|
||||||
research into the difference between `qs` and `querystring` and choose the
|
|
||||||
appropriate setting.
|
|
||||||
|
|
||||||
##### inflate
|
|
||||||
|
|
||||||
When set to `true`, then deflated (compressed) bodies will be inflated; when
|
|
||||||
`false`, deflated bodies are rejected. Defaults to `true`.
|
|
||||||
|
|
||||||
##### limit
|
|
||||||
|
|
||||||
Controls the maximum request body size. If this is a number, then the value
|
|
||||||
specifies the number of bytes; if it is a string, the value is passed to the
|
|
||||||
[bytes](https://www.npmjs.com/package/bytes) library for parsing. Defaults
|
|
||||||
to `'100kb'`.
|
|
||||||
|
|
||||||
##### parameterLimit
|
|
||||||
|
|
||||||
The `parameterLimit` option controls the maximum number of parameters that
|
|
||||||
are allowed in the URL-encoded data. If a request contains more parameters
|
|
||||||
than this value, a 413 will be returned to the client. Defaults to `1000`.
|
|
||||||
|
|
||||||
##### type
|
|
||||||
|
|
||||||
The `type` option is used to determine what media type the middleware will
|
|
||||||
parse. This option can be a string, array of strings, or a function. If not
|
|
||||||
a function, `type` option is passed directly to the
|
|
||||||
[type-is](https://www.npmjs.org/package/type-is#readme) library and this can
|
|
||||||
be an extension name (like `urlencoded`), a mime type (like
|
|
||||||
`application/x-www-form-urlencoded`), or a mime type with a wildcard (like
|
|
||||||
`*/x-www-form-urlencoded`). If a function, the `type` option is called as
|
|
||||||
`fn(req)` and the request is parsed if it returns a truthy value. Defaults
|
|
||||||
to `application/x-www-form-urlencoded`.
|
|
||||||
|
|
||||||
##### verify
|
|
||||||
|
|
||||||
The `verify` option, if supplied, is called as `verify(req, res, buf, encoding)`,
|
|
||||||
where `buf` is a `Buffer` of the raw request body and `encoding` is the
|
|
||||||
encoding of the request. The parsing can be aborted by throwing an error.
|
|
||||||
|
|
||||||
## Errors
|
|
||||||
|
|
||||||
The middlewares provided by this module create errors depending on the error
|
|
||||||
condition during parsing. The errors will typically have a `status`/`statusCode`
|
|
||||||
property that contains the suggested HTTP response code, an `expose` property
|
|
||||||
to determine if the `message` property should be displayed to the client, a
|
|
||||||
`type` property to determine the type of error without matching against the
|
|
||||||
`message`, and a `body` property containing the read body, if available.
|
|
||||||
|
|
||||||
The following are the common errors emitted, though any error can come through
|
|
||||||
for various reasons.
|
|
||||||
|
|
||||||
### content encoding unsupported
|
|
||||||
|
|
||||||
This error will occur when the request had a `Content-Encoding` header that
|
|
||||||
contained an encoding but the "inflation" option was set to `false`. The
|
|
||||||
`status` property is set to `415`, the `type` property is set to
|
|
||||||
`'encoding.unsupported'`, and the `charset` property will be set to the
|
|
||||||
encoding that is unsupported.
|
|
||||||
|
|
||||||
### request aborted
|
|
||||||
|
|
||||||
This error will occur when the request is aborted by the client before reading
|
|
||||||
the body has finished. The `received` property will be set to the number of
|
|
||||||
bytes received before the request was aborted and the `expected` property is
|
|
||||||
set to the number of expected bytes. The `status` property is set to `400`
|
|
||||||
and `type` property is set to `'request.aborted'`.
|
|
||||||
|
|
||||||
### request entity too large
|
|
||||||
|
|
||||||
This error will occur when the request body's size is larger than the "limit"
|
|
||||||
option. The `limit` property will be set to the byte limit and the `length`
|
|
||||||
property will be set to the request body's length. The `status` property is
|
|
||||||
set to `413` and the `type` property is set to `'entity.too.large'`.
|
|
||||||
|
|
||||||
### request size did not match content length
|
|
||||||
|
|
||||||
This error will occur when the request's length did not match the length from
|
|
||||||
the `Content-Length` header. This typically occurs when the request is malformed,
|
|
||||||
typically when the `Content-Length` header was calculated based on characters
|
|
||||||
instead of bytes. The `status` property is set to `400` and the `type` property
|
|
||||||
is set to `'request.size.invalid'`.
|
|
||||||
|
|
||||||
### stream encoding should not be set
|
|
||||||
|
|
||||||
This error will occur when something called the `req.setEncoding` method prior
|
|
||||||
to this middleware. This module operates directly on bytes only and you cannot
|
|
||||||
call `req.setEncoding` when using this module. The `status` property is set to
|
|
||||||
`500` and the `type` property is set to `'stream.encoding.set'`.
|
|
||||||
|
|
||||||
### too many parameters
|
|
||||||
|
|
||||||
This error will occur when the content of the request exceeds the configured
|
|
||||||
`parameterLimit` for the `urlencoded` parser. The `status` property is set to
|
|
||||||
`413` and the `type` property is set to `'parameters.too.many'`.
|
|
||||||
|
|
||||||
### unsupported charset "BOGUS"
|
|
||||||
|
|
||||||
This error will occur when the request had a charset parameter in the
|
|
||||||
`Content-Type` header, but the `iconv-lite` module does not support it OR the
|
|
||||||
parser does not support it. The charset is contained in the message as well
|
|
||||||
as in the `charset` property. The `status` property is set to `415`, the
|
|
||||||
`type` property is set to `'charset.unsupported'`, and the `charset` property
|
|
||||||
is set to the charset that is unsupported.
|
|
||||||
|
|
||||||
### unsupported content encoding "bogus"
|
|
||||||
|
|
||||||
This error will occur when the request had a `Content-Encoding` header that
|
|
||||||
contained an unsupported encoding. The encoding is contained in the message
|
|
||||||
as well as in the `encoding` property. The `status` property is set to `415`,
|
|
||||||
the `type` property is set to `'encoding.unsupported'`, and the `encoding`
|
|
||||||
property is set to the encoding that is unsupported.
|
|
||||||
|
|
||||||
## Examples
|
|
||||||
|
|
||||||
### Express/Connect top-level generic
|
|
||||||
|
|
||||||
This example demonstrates adding a generic JSON and URL-encoded parser as a
|
|
||||||
top-level middleware, which will parse the bodies of all incoming requests.
|
|
||||||
This is the simplest setup.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var express = require('express')
|
|
||||||
var bodyParser = require('body-parser')
|
|
||||||
|
|
||||||
var app = express()
|
|
||||||
|
|
||||||
// parse application/x-www-form-urlencoded
|
|
||||||
app.use(bodyParser.urlencoded({ extended: false }))
|
|
||||||
|
|
||||||
// parse application/json
|
|
||||||
app.use(bodyParser.json())
|
|
||||||
|
|
||||||
app.use(function (req, res) {
|
|
||||||
res.setHeader('Content-Type', 'text/plain')
|
|
||||||
res.write('you posted:\n')
|
|
||||||
res.end(JSON.stringify(req.body, null, 2))
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Express route-specific
|
|
||||||
|
|
||||||
This example demonstrates adding body parsers specifically to the routes that
|
|
||||||
need them. In general, this is the most recommended way to use body-parser with
|
|
||||||
Express.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var express = require('express')
|
|
||||||
var bodyParser = require('body-parser')
|
|
||||||
|
|
||||||
var app = express()
|
|
||||||
|
|
||||||
// create application/json parser
|
|
||||||
var jsonParser = bodyParser.json()
|
|
||||||
|
|
||||||
// create application/x-www-form-urlencoded parser
|
|
||||||
var urlencodedParser = bodyParser.urlencoded({ extended: false })
|
|
||||||
|
|
||||||
// POST /login gets urlencoded bodies
|
|
||||||
app.post('/login', urlencodedParser, function (req, res) {
|
|
||||||
res.send('welcome, ' + req.body.username)
|
|
||||||
})
|
|
||||||
|
|
||||||
// POST /api/users gets JSON bodies
|
|
||||||
app.post('/api/users', jsonParser, function (req, res) {
|
|
||||||
// create user in req.body
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Change accepted type for parsers
|
|
||||||
|
|
||||||
All the parsers accept a `type` option which allows you to change the
|
|
||||||
`Content-Type` that the middleware will parse.
|
|
||||||
|
|
||||||
```js
|
|
||||||
var express = require('express')
|
|
||||||
var bodyParser = require('body-parser')
|
|
||||||
|
|
||||||
var app = express()
|
|
||||||
|
|
||||||
// parse various different custom JSON types as JSON
|
|
||||||
app.use(bodyParser.json({ type: 'application/*+json' }))
|
|
||||||
|
|
||||||
// parse some custom thing into a Buffer
|
|
||||||
app.use(bodyParser.raw({ type: 'application/vnd.custom-type' }))
|
|
||||||
|
|
||||||
// parse an HTML body into a string
|
|
||||||
app.use(bodyParser.text({ type: 'text/html' }))
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
|
|
||||||
[npm-image]: https://img.shields.io/npm/v/body-parser.svg
|
|
||||||
[npm-url]: https://npmjs.org/package/body-parser
|
|
||||||
[travis-image]: https://img.shields.io/travis/expressjs/body-parser/master.svg
|
|
||||||
[travis-url]: https://travis-ci.org/expressjs/body-parser
|
|
||||||
[coveralls-image]: https://img.shields.io/coveralls/expressjs/body-parser/master.svg
|
|
||||||
[coveralls-url]: https://coveralls.io/r/expressjs/body-parser?branch=master
|
|
||||||
[downloads-image]: https://img.shields.io/npm/dm/body-parser.svg
|
|
||||||
[downloads-url]: https://npmjs.org/package/body-parser
|
|
||||||
-157
@@ -1,157 +0,0 @@
|
|||||||
/*!
|
|
||||||
* body-parser
|
|
||||||
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
|
||||||
* MIT Licensed
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
var deprecate = require('depd')('body-parser')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cache of loaded parsers.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
var parsers = Object.create(null)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @typedef Parsers
|
|
||||||
* @type {function}
|
|
||||||
* @property {function} json
|
|
||||||
* @property {function} raw
|
|
||||||
* @property {function} text
|
|
||||||
* @property {function} urlencoded
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module exports.
|
|
||||||
* @type {Parsers}
|
|
||||||
*/
|
|
||||||
|
|
||||||
exports = module.exports = deprecate.function(bodyParser,
|
|
||||||
'bodyParser: use individual json/urlencoded middlewares')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* JSON parser.
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
Object.defineProperty(exports, 'json', {
|
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
get: createParserGetter('json')
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Raw parser.
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
Object.defineProperty(exports, 'raw', {
|
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
get: createParserGetter('raw')
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Text parser.
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
Object.defineProperty(exports, 'text', {
|
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
get: createParserGetter('text')
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* URL-encoded parser.
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
Object.defineProperty(exports, 'urlencoded', {
|
|
||||||
configurable: true,
|
|
||||||
enumerable: true,
|
|
||||||
get: createParserGetter('urlencoded')
|
|
||||||
})
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a middleware to parse json and urlencoded bodies.
|
|
||||||
*
|
|
||||||
* @param {object} [options]
|
|
||||||
* @return {function}
|
|
||||||
* @deprecated
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
function bodyParser (options) {
|
|
||||||
var opts = {}
|
|
||||||
|
|
||||||
// exclude type option
|
|
||||||
if (options) {
|
|
||||||
for (var prop in options) {
|
|
||||||
if (prop !== 'type') {
|
|
||||||
opts[prop] = options[prop]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var _urlencoded = exports.urlencoded(opts)
|
|
||||||
var _json = exports.json(opts)
|
|
||||||
|
|
||||||
return function bodyParser (req, res, next) {
|
|
||||||
_json(req, res, function (err) {
|
|
||||||
if (err) return next(err)
|
|
||||||
_urlencoded(req, res, next)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a getter for loading a parser.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function createParserGetter (name) {
|
|
||||||
return function get () {
|
|
||||||
return loadParser(name)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load a parser module.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function loadParser (parserName) {
|
|
||||||
var parser = parsers[parserName]
|
|
||||||
|
|
||||||
if (parser !== undefined) {
|
|
||||||
return parser
|
|
||||||
}
|
|
||||||
|
|
||||||
// this uses a switch for static require analysis
|
|
||||||
switch (parserName) {
|
|
||||||
case 'json':
|
|
||||||
parser = require('./lib/types/json')
|
|
||||||
break
|
|
||||||
case 'raw':
|
|
||||||
parser = require('./lib/types/raw')
|
|
||||||
break
|
|
||||||
case 'text':
|
|
||||||
parser = require('./lib/types/text')
|
|
||||||
break
|
|
||||||
case 'urlencoded':
|
|
||||||
parser = require('./lib/types/urlencoded')
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// store to prevent invoking require()
|
|
||||||
return (parsers[parserName] = parser)
|
|
||||||
}
|
|
||||||
-181
@@ -1,181 +0,0 @@
|
|||||||
/*!
|
|
||||||
* body-parser
|
|
||||||
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
|
||||||
* MIT Licensed
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
var createError = require('http-errors')
|
|
||||||
var getBody = require('raw-body')
|
|
||||||
var iconv = require('iconv-lite')
|
|
||||||
var onFinished = require('on-finished')
|
|
||||||
var zlib = require('zlib')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module exports.
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = read
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read a request into a buffer and parse.
|
|
||||||
*
|
|
||||||
* @param {object} req
|
|
||||||
* @param {object} res
|
|
||||||
* @param {function} next
|
|
||||||
* @param {function} parse
|
|
||||||
* @param {function} debug
|
|
||||||
* @param {object} options
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function read (req, res, next, parse, debug, options) {
|
|
||||||
var length
|
|
||||||
var opts = options
|
|
||||||
var stream
|
|
||||||
|
|
||||||
// flag as parsed
|
|
||||||
req._body = true
|
|
||||||
|
|
||||||
// read options
|
|
||||||
var encoding = opts.encoding !== null
|
|
||||||
? opts.encoding
|
|
||||||
: null
|
|
||||||
var verify = opts.verify
|
|
||||||
|
|
||||||
try {
|
|
||||||
// get the content stream
|
|
||||||
stream = contentstream(req, debug, opts.inflate)
|
|
||||||
length = stream.length
|
|
||||||
stream.length = undefined
|
|
||||||
} catch (err) {
|
|
||||||
return next(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
// set raw-body options
|
|
||||||
opts.length = length
|
|
||||||
opts.encoding = verify
|
|
||||||
? null
|
|
||||||
: encoding
|
|
||||||
|
|
||||||
// assert charset is supported
|
|
||||||
if (opts.encoding === null && encoding !== null && !iconv.encodingExists(encoding)) {
|
|
||||||
return next(createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
|
|
||||||
charset: encoding.toLowerCase(),
|
|
||||||
type: 'charset.unsupported'
|
|
||||||
}))
|
|
||||||
}
|
|
||||||
|
|
||||||
// read body
|
|
||||||
debug('read body')
|
|
||||||
getBody(stream, opts, function (error, body) {
|
|
||||||
if (error) {
|
|
||||||
var _error
|
|
||||||
|
|
||||||
if (error.type === 'encoding.unsupported') {
|
|
||||||
// echo back charset
|
|
||||||
_error = createError(415, 'unsupported charset "' + encoding.toUpperCase() + '"', {
|
|
||||||
charset: encoding.toLowerCase(),
|
|
||||||
type: 'charset.unsupported'
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
// set status code on error
|
|
||||||
_error = createError(400, error)
|
|
||||||
}
|
|
||||||
|
|
||||||
// read off entire request
|
|
||||||
stream.resume()
|
|
||||||
onFinished(req, function onfinished () {
|
|
||||||
next(createError(400, _error))
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// verify
|
|
||||||
if (verify) {
|
|
||||||
try {
|
|
||||||
debug('verify body')
|
|
||||||
verify(req, res, body, encoding)
|
|
||||||
} catch (err) {
|
|
||||||
next(createError(403, err, {
|
|
||||||
body: body,
|
|
||||||
type: err.type || 'entity.verify.failed'
|
|
||||||
}))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parse
|
|
||||||
var str = body
|
|
||||||
try {
|
|
||||||
debug('parse body')
|
|
||||||
str = typeof body !== 'string' && encoding !== null
|
|
||||||
? iconv.decode(body, encoding)
|
|
||||||
: body
|
|
||||||
req.body = parse(str)
|
|
||||||
} catch (err) {
|
|
||||||
next(createError(400, err, {
|
|
||||||
body: str,
|
|
||||||
type: err.type || 'entity.parse.failed'
|
|
||||||
}))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
next()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the content stream of the request.
|
|
||||||
*
|
|
||||||
* @param {object} req
|
|
||||||
* @param {function} debug
|
|
||||||
* @param {boolean} [inflate=true]
|
|
||||||
* @return {object}
|
|
||||||
* @api private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function contentstream (req, debug, inflate) {
|
|
||||||
var encoding = (req.headers['content-encoding'] || 'identity').toLowerCase()
|
|
||||||
var length = req.headers['content-length']
|
|
||||||
var stream
|
|
||||||
|
|
||||||
debug('content-encoding "%s"', encoding)
|
|
||||||
|
|
||||||
if (inflate === false && encoding !== 'identity') {
|
|
||||||
throw createError(415, 'content encoding unsupported', {
|
|
||||||
encoding: encoding,
|
|
||||||
type: 'encoding.unsupported'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (encoding) {
|
|
||||||
case 'deflate':
|
|
||||||
stream = zlib.createInflate()
|
|
||||||
debug('inflate body')
|
|
||||||
req.pipe(stream)
|
|
||||||
break
|
|
||||||
case 'gzip':
|
|
||||||
stream = zlib.createGunzip()
|
|
||||||
debug('gunzip body')
|
|
||||||
req.pipe(stream)
|
|
||||||
break
|
|
||||||
case 'identity':
|
|
||||||
stream = req
|
|
||||||
stream.length = length
|
|
||||||
break
|
|
||||||
default:
|
|
||||||
throw createError(415, 'unsupported content encoding "' + encoding + '"', {
|
|
||||||
encoding: encoding,
|
|
||||||
type: 'encoding.unsupported'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return stream
|
|
||||||
}
|
|
||||||
-230
@@ -1,230 +0,0 @@
|
|||||||
/*!
|
|
||||||
* body-parser
|
|
||||||
* Copyright(c) 2014 Jonathan Ong
|
|
||||||
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
|
||||||
* MIT Licensed
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
var bytes = require('bytes')
|
|
||||||
var contentType = require('content-type')
|
|
||||||
var createError = require('http-errors')
|
|
||||||
var debug = require('debug')('body-parser:json')
|
|
||||||
var read = require('../read')
|
|
||||||
var typeis = require('type-is')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module exports.
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = json
|
|
||||||
|
|
||||||
/**
|
|
||||||
* RegExp to match the first non-space in a string.
|
|
||||||
*
|
|
||||||
* Allowed whitespace is defined in RFC 7159:
|
|
||||||
*
|
|
||||||
* ws = *(
|
|
||||||
* %x20 / ; Space
|
|
||||||
* %x09 / ; Horizontal tab
|
|
||||||
* %x0A / ; Line feed or New line
|
|
||||||
* %x0D ) ; Carriage return
|
|
||||||
*/
|
|
||||||
|
|
||||||
var FIRST_CHAR_REGEXP = /^[\x20\x09\x0a\x0d]*(.)/ // eslint-disable-line no-control-regex
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a middleware to parse JSON bodies.
|
|
||||||
*
|
|
||||||
* @param {object} [options]
|
|
||||||
* @return {function}
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
function json (options) {
|
|
||||||
var opts = options || {}
|
|
||||||
|
|
||||||
var limit = typeof opts.limit !== 'number'
|
|
||||||
? bytes.parse(opts.limit || '100kb')
|
|
||||||
: opts.limit
|
|
||||||
var inflate = opts.inflate !== false
|
|
||||||
var reviver = opts.reviver
|
|
||||||
var strict = opts.strict !== false
|
|
||||||
var type = opts.type || 'application/json'
|
|
||||||
var verify = opts.verify || false
|
|
||||||
|
|
||||||
if (verify !== false && typeof verify !== 'function') {
|
|
||||||
throw new TypeError('option verify must be function')
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the appropriate type checking function
|
|
||||||
var shouldParse = typeof type !== 'function'
|
|
||||||
? typeChecker(type)
|
|
||||||
: type
|
|
||||||
|
|
||||||
function parse (body) {
|
|
||||||
if (body.length === 0) {
|
|
||||||
// special-case empty json body, as it's a common client-side mistake
|
|
||||||
// TODO: maybe make this configurable or part of "strict" option
|
|
||||||
return {}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (strict) {
|
|
||||||
var first = firstchar(body)
|
|
||||||
|
|
||||||
if (first !== '{' && first !== '[') {
|
|
||||||
debug('strict violation')
|
|
||||||
throw createStrictSyntaxError(body, first)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try {
|
|
||||||
debug('parse json')
|
|
||||||
return JSON.parse(body, reviver)
|
|
||||||
} catch (e) {
|
|
||||||
throw normalizeJsonSyntaxError(e, {
|
|
||||||
message: e.message,
|
|
||||||
stack: e.stack
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return function jsonParser (req, res, next) {
|
|
||||||
if (req._body) {
|
|
||||||
debug('body already parsed')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
req.body = req.body || {}
|
|
||||||
|
|
||||||
// skip requests without bodies
|
|
||||||
if (!typeis.hasBody(req)) {
|
|
||||||
debug('skip empty body')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('content-type %j', req.headers['content-type'])
|
|
||||||
|
|
||||||
// determine if request should be parsed
|
|
||||||
if (!shouldParse(req)) {
|
|
||||||
debug('skip parsing')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// assert charset per RFC 7159 sec 8.1
|
|
||||||
var charset = getCharset(req) || 'utf-8'
|
|
||||||
if (charset.substr(0, 4) !== 'utf-') {
|
|
||||||
debug('invalid charset')
|
|
||||||
next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
|
|
||||||
charset: charset,
|
|
||||||
type: 'charset.unsupported'
|
|
||||||
}))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// read
|
|
||||||
read(req, res, next, parse, debug, {
|
|
||||||
encoding: charset,
|
|
||||||
inflate: inflate,
|
|
||||||
limit: limit,
|
|
||||||
verify: verify
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create strict violation syntax error matching native error.
|
|
||||||
*
|
|
||||||
* @param {string} str
|
|
||||||
* @param {string} char
|
|
||||||
* @return {Error}
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function createStrictSyntaxError (str, char) {
|
|
||||||
var index = str.indexOf(char)
|
|
||||||
var partial = str.substring(0, index) + '#'
|
|
||||||
|
|
||||||
try {
|
|
||||||
JSON.parse(partial); /* istanbul ignore next */ throw new SyntaxError('strict violation')
|
|
||||||
} catch (e) {
|
|
||||||
return normalizeJsonSyntaxError(e, {
|
|
||||||
message: e.message.replace('#', char),
|
|
||||||
stack: e.stack
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the first non-whitespace character in a string.
|
|
||||||
*
|
|
||||||
* @param {string} str
|
|
||||||
* @return {function}
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function firstchar (str) {
|
|
||||||
return FIRST_CHAR_REGEXP.exec(str)[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the charset of a request.
|
|
||||||
*
|
|
||||||
* @param {object} req
|
|
||||||
* @api private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function getCharset (req) {
|
|
||||||
try {
|
|
||||||
return (contentType.parse(req).parameters.charset || '').toLowerCase()
|
|
||||||
} catch (e) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Normalize a SyntaxError for JSON.parse.
|
|
||||||
*
|
|
||||||
* @param {SyntaxError} error
|
|
||||||
* @param {object} obj
|
|
||||||
* @return {SyntaxError}
|
|
||||||
*/
|
|
||||||
|
|
||||||
function normalizeJsonSyntaxError (error, obj) {
|
|
||||||
var keys = Object.getOwnPropertyNames(error)
|
|
||||||
|
|
||||||
for (var i = 0; i < keys.length; i++) {
|
|
||||||
var key = keys[i]
|
|
||||||
if (key !== 'stack' && key !== 'message') {
|
|
||||||
delete error[key]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// replace stack before message for Node.js 0.10 and below
|
|
||||||
error.stack = obj.stack.replace(error.message, obj.message)
|
|
||||||
error.message = obj.message
|
|
||||||
|
|
||||||
return error
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the simple type checker.
|
|
||||||
*
|
|
||||||
* @param {string} type
|
|
||||||
* @return {function}
|
|
||||||
*/
|
|
||||||
|
|
||||||
function typeChecker (type) {
|
|
||||||
return function checkType (req) {
|
|
||||||
return Boolean(typeis(req, type))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-101
@@ -1,101 +0,0 @@
|
|||||||
/*!
|
|
||||||
* body-parser
|
|
||||||
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
|
||||||
* MIT Licensed
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var bytes = require('bytes')
|
|
||||||
var debug = require('debug')('body-parser:raw')
|
|
||||||
var read = require('../read')
|
|
||||||
var typeis = require('type-is')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module exports.
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = raw
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a middleware to parse raw bodies.
|
|
||||||
*
|
|
||||||
* @param {object} [options]
|
|
||||||
* @return {function}
|
|
||||||
* @api public
|
|
||||||
*/
|
|
||||||
|
|
||||||
function raw (options) {
|
|
||||||
var opts = options || {}
|
|
||||||
|
|
||||||
var inflate = opts.inflate !== false
|
|
||||||
var limit = typeof opts.limit !== 'number'
|
|
||||||
? bytes.parse(opts.limit || '100kb')
|
|
||||||
: opts.limit
|
|
||||||
var type = opts.type || 'application/octet-stream'
|
|
||||||
var verify = opts.verify || false
|
|
||||||
|
|
||||||
if (verify !== false && typeof verify !== 'function') {
|
|
||||||
throw new TypeError('option verify must be function')
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the appropriate type checking function
|
|
||||||
var shouldParse = typeof type !== 'function'
|
|
||||||
? typeChecker(type)
|
|
||||||
: type
|
|
||||||
|
|
||||||
function parse (buf) {
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
return function rawParser (req, res, next) {
|
|
||||||
if (req._body) {
|
|
||||||
debug('body already parsed')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
req.body = req.body || {}
|
|
||||||
|
|
||||||
// skip requests without bodies
|
|
||||||
if (!typeis.hasBody(req)) {
|
|
||||||
debug('skip empty body')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('content-type %j', req.headers['content-type'])
|
|
||||||
|
|
||||||
// determine if request should be parsed
|
|
||||||
if (!shouldParse(req)) {
|
|
||||||
debug('skip parsing')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// read
|
|
||||||
read(req, res, next, parse, debug, {
|
|
||||||
encoding: null,
|
|
||||||
inflate: inflate,
|
|
||||||
limit: limit,
|
|
||||||
verify: verify
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the simple type checker.
|
|
||||||
*
|
|
||||||
* @param {string} type
|
|
||||||
* @return {function}
|
|
||||||
*/
|
|
||||||
|
|
||||||
function typeChecker (type) {
|
|
||||||
return function checkType (req) {
|
|
||||||
return Boolean(typeis(req, type))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-121
@@ -1,121 +0,0 @@
|
|||||||
/*!
|
|
||||||
* body-parser
|
|
||||||
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
|
||||||
* MIT Licensed
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var bytes = require('bytes')
|
|
||||||
var contentType = require('content-type')
|
|
||||||
var debug = require('debug')('body-parser:text')
|
|
||||||
var read = require('../read')
|
|
||||||
var typeis = require('type-is')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module exports.
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = text
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a middleware to parse text bodies.
|
|
||||||
*
|
|
||||||
* @param {object} [options]
|
|
||||||
* @return {function}
|
|
||||||
* @api public
|
|
||||||
*/
|
|
||||||
|
|
||||||
function text (options) {
|
|
||||||
var opts = options || {}
|
|
||||||
|
|
||||||
var defaultCharset = opts.defaultCharset || 'utf-8'
|
|
||||||
var inflate = opts.inflate !== false
|
|
||||||
var limit = typeof opts.limit !== 'number'
|
|
||||||
? bytes.parse(opts.limit || '100kb')
|
|
||||||
: opts.limit
|
|
||||||
var type = opts.type || 'text/plain'
|
|
||||||
var verify = opts.verify || false
|
|
||||||
|
|
||||||
if (verify !== false && typeof verify !== 'function') {
|
|
||||||
throw new TypeError('option verify must be function')
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the appropriate type checking function
|
|
||||||
var shouldParse = typeof type !== 'function'
|
|
||||||
? typeChecker(type)
|
|
||||||
: type
|
|
||||||
|
|
||||||
function parse (buf) {
|
|
||||||
return buf
|
|
||||||
}
|
|
||||||
|
|
||||||
return function textParser (req, res, next) {
|
|
||||||
if (req._body) {
|
|
||||||
debug('body already parsed')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
req.body = req.body || {}
|
|
||||||
|
|
||||||
// skip requests without bodies
|
|
||||||
if (!typeis.hasBody(req)) {
|
|
||||||
debug('skip empty body')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('content-type %j', req.headers['content-type'])
|
|
||||||
|
|
||||||
// determine if request should be parsed
|
|
||||||
if (!shouldParse(req)) {
|
|
||||||
debug('skip parsing')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// get charset
|
|
||||||
var charset = getCharset(req) || defaultCharset
|
|
||||||
|
|
||||||
// read
|
|
||||||
read(req, res, next, parse, debug, {
|
|
||||||
encoding: charset,
|
|
||||||
inflate: inflate,
|
|
||||||
limit: limit,
|
|
||||||
verify: verify
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the charset of a request.
|
|
||||||
*
|
|
||||||
* @param {object} req
|
|
||||||
* @api private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function getCharset (req) {
|
|
||||||
try {
|
|
||||||
return (contentType.parse(req).parameters.charset || '').toLowerCase()
|
|
||||||
} catch (e) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the simple type checker.
|
|
||||||
*
|
|
||||||
* @param {string} type
|
|
||||||
* @return {function}
|
|
||||||
*/
|
|
||||||
|
|
||||||
function typeChecker (type) {
|
|
||||||
return function checkType (req) {
|
|
||||||
return Boolean(typeis(req, type))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-284
@@ -1,284 +0,0 @@
|
|||||||
/*!
|
|
||||||
* body-parser
|
|
||||||
* Copyright(c) 2014 Jonathan Ong
|
|
||||||
* Copyright(c) 2014-2015 Douglas Christopher Wilson
|
|
||||||
* MIT Licensed
|
|
||||||
*/
|
|
||||||
|
|
||||||
'use strict'
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module dependencies.
|
|
||||||
* @private
|
|
||||||
*/
|
|
||||||
|
|
||||||
var bytes = require('bytes')
|
|
||||||
var contentType = require('content-type')
|
|
||||||
var createError = require('http-errors')
|
|
||||||
var debug = require('debug')('body-parser:urlencoded')
|
|
||||||
var deprecate = require('depd')('body-parser')
|
|
||||||
var read = require('../read')
|
|
||||||
var typeis = require('type-is')
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module exports.
|
|
||||||
*/
|
|
||||||
|
|
||||||
module.exports = urlencoded
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cache of parser modules.
|
|
||||||
*/
|
|
||||||
|
|
||||||
var parsers = Object.create(null)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a middleware to parse urlencoded bodies.
|
|
||||||
*
|
|
||||||
* @param {object} [options]
|
|
||||||
* @return {function}
|
|
||||||
* @public
|
|
||||||
*/
|
|
||||||
|
|
||||||
function urlencoded (options) {
|
|
||||||
var opts = options || {}
|
|
||||||
|
|
||||||
// notice because option default will flip in next major
|
|
||||||
if (opts.extended === undefined) {
|
|
||||||
deprecate('undefined extended: provide extended option')
|
|
||||||
}
|
|
||||||
|
|
||||||
var extended = opts.extended !== false
|
|
||||||
var inflate = opts.inflate !== false
|
|
||||||
var limit = typeof opts.limit !== 'number'
|
|
||||||
? bytes.parse(opts.limit || '100kb')
|
|
||||||
: opts.limit
|
|
||||||
var type = opts.type || 'application/x-www-form-urlencoded'
|
|
||||||
var verify = opts.verify || false
|
|
||||||
|
|
||||||
if (verify !== false && typeof verify !== 'function') {
|
|
||||||
throw new TypeError('option verify must be function')
|
|
||||||
}
|
|
||||||
|
|
||||||
// create the appropriate query parser
|
|
||||||
var queryparse = extended
|
|
||||||
? extendedparser(opts)
|
|
||||||
: simpleparser(opts)
|
|
||||||
|
|
||||||
// create the appropriate type checking function
|
|
||||||
var shouldParse = typeof type !== 'function'
|
|
||||||
? typeChecker(type)
|
|
||||||
: type
|
|
||||||
|
|
||||||
function parse (body) {
|
|
||||||
return body.length
|
|
||||||
? queryparse(body)
|
|
||||||
: {}
|
|
||||||
}
|
|
||||||
|
|
||||||
return function urlencodedParser (req, res, next) {
|
|
||||||
if (req._body) {
|
|
||||||
debug('body already parsed')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
req.body = req.body || {}
|
|
||||||
|
|
||||||
// skip requests without bodies
|
|
||||||
if (!typeis.hasBody(req)) {
|
|
||||||
debug('skip empty body')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('content-type %j', req.headers['content-type'])
|
|
||||||
|
|
||||||
// determine if request should be parsed
|
|
||||||
if (!shouldParse(req)) {
|
|
||||||
debug('skip parsing')
|
|
||||||
next()
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// assert charset
|
|
||||||
var charset = getCharset(req) || 'utf-8'
|
|
||||||
if (charset !== 'utf-8') {
|
|
||||||
debug('invalid charset')
|
|
||||||
next(createError(415, 'unsupported charset "' + charset.toUpperCase() + '"', {
|
|
||||||
charset: charset,
|
|
||||||
type: 'charset.unsupported'
|
|
||||||
}))
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
// read
|
|
||||||
read(req, res, next, parse, debug, {
|
|
||||||
debug: debug,
|
|
||||||
encoding: charset,
|
|
||||||
inflate: inflate,
|
|
||||||
limit: limit,
|
|
||||||
verify: verify
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the extended query parser.
|
|
||||||
*
|
|
||||||
* @param {object} options
|
|
||||||
*/
|
|
||||||
|
|
||||||
function extendedparser (options) {
|
|
||||||
var parameterLimit = options.parameterLimit !== undefined
|
|
||||||
? options.parameterLimit
|
|
||||||
: 1000
|
|
||||||
var parse = parser('qs')
|
|
||||||
|
|
||||||
if (isNaN(parameterLimit) || parameterLimit < 1) {
|
|
||||||
throw new TypeError('option parameterLimit must be a positive number')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isFinite(parameterLimit)) {
|
|
||||||
parameterLimit = parameterLimit | 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return function queryparse (body) {
|
|
||||||
var paramCount = parameterCount(body, parameterLimit)
|
|
||||||
|
|
||||||
if (paramCount === undefined) {
|
|
||||||
debug('too many parameters')
|
|
||||||
throw createError(413, 'too many parameters', {
|
|
||||||
type: 'parameters.too.many'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
var arrayLimit = Math.max(100, paramCount)
|
|
||||||
|
|
||||||
debug('parse extended urlencoding')
|
|
||||||
return parse(body, {
|
|
||||||
allowPrototypes: true,
|
|
||||||
arrayLimit: arrayLimit,
|
|
||||||
depth: Infinity,
|
|
||||||
parameterLimit: parameterLimit
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the charset of a request.
|
|
||||||
*
|
|
||||||
* @param {object} req
|
|
||||||
* @api private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function getCharset (req) {
|
|
||||||
try {
|
|
||||||
return (contentType.parse(req).parameters.charset || '').toLowerCase()
|
|
||||||
} catch (e) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Count the number of parameters, stopping once limit reached
|
|
||||||
*
|
|
||||||
* @param {string} body
|
|
||||||
* @param {number} limit
|
|
||||||
* @api private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function parameterCount (body, limit) {
|
|
||||||
var count = 0
|
|
||||||
var index = 0
|
|
||||||
|
|
||||||
while ((index = body.indexOf('&', index)) !== -1) {
|
|
||||||
count++
|
|
||||||
index++
|
|
||||||
|
|
||||||
if (count === limit) {
|
|
||||||
return undefined
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return count
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get parser for module name dynamically.
|
|
||||||
*
|
|
||||||
* @param {string} name
|
|
||||||
* @return {function}
|
|
||||||
* @api private
|
|
||||||
*/
|
|
||||||
|
|
||||||
function parser (name) {
|
|
||||||
var mod = parsers[name]
|
|
||||||
|
|
||||||
if (mod !== undefined) {
|
|
||||||
return mod.parse
|
|
||||||
}
|
|
||||||
|
|
||||||
// this uses a switch for static require analysis
|
|
||||||
switch (name) {
|
|
||||||
case 'qs':
|
|
||||||
mod = require('qs')
|
|
||||||
break
|
|
||||||
case 'querystring':
|
|
||||||
mod = require('querystring')
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
// store to prevent invoking require()
|
|
||||||
parsers[name] = mod
|
|
||||||
|
|
||||||
return mod.parse
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the simple query parser.
|
|
||||||
*
|
|
||||||
* @param {object} options
|
|
||||||
*/
|
|
||||||
|
|
||||||
function simpleparser (options) {
|
|
||||||
var parameterLimit = options.parameterLimit !== undefined
|
|
||||||
? options.parameterLimit
|
|
||||||
: 1000
|
|
||||||
var parse = parser('querystring')
|
|
||||||
|
|
||||||
if (isNaN(parameterLimit) || parameterLimit < 1) {
|
|
||||||
throw new TypeError('option parameterLimit must be a positive number')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isFinite(parameterLimit)) {
|
|
||||||
parameterLimit = parameterLimit | 0
|
|
||||||
}
|
|
||||||
|
|
||||||
return function queryparse (body) {
|
|
||||||
var paramCount = parameterCount(body, parameterLimit)
|
|
||||||
|
|
||||||
if (paramCount === undefined) {
|
|
||||||
debug('too many parameters')
|
|
||||||
throw createError(413, 'too many parameters', {
|
|
||||||
type: 'parameters.too.many'
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
debug('parse urlencoding')
|
|
||||||
return parse(body, undefined, undefined, { maxKeys: parameterLimit })
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the simple type checker.
|
|
||||||
*
|
|
||||||
* @param {string} type
|
|
||||||
* @return {function}
|
|
||||||
*/
|
|
||||||
|
|
||||||
function typeChecker (type) {
|
|
||||||
return function checkType (req) {
|
|
||||||
return Boolean(typeis(req, type))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
-92
@@ -1,92 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "body-parser@^1.19.0",
|
|
||||||
"_id": "body-parser@1.19.0",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==",
|
|
||||||
"_location": "/body-parser",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "body-parser@^1.19.0",
|
|
||||||
"name": "body-parser",
|
|
||||||
"escapedName": "body-parser",
|
|
||||||
"rawSpec": "^1.19.0",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "^1.19.0"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/",
|
|
||||||
"/express"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz",
|
|
||||||
"_shasum": "96b2709e57c9c4e09a6fd66a8fd979844f69f08a",
|
|
||||||
"_spec": "body-parser@^1.19.0",
|
|
||||||
"_where": "/home/erik/Documents/workspace_brackets/a1_BME_Project_Ohm/om",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/expressjs/body-parser/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"contributors": [
|
|
||||||
{
|
|
||||||
"name": "Douglas Christopher Wilson",
|
|
||||||
"email": "doug@somethingdoug.com"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Jonathan Ong",
|
|
||||||
"email": "me@jongleberry.com",
|
|
||||||
"url": "http://jongleberry.com"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"dependencies": {
|
|
||||||
"bytes": "3.1.0",
|
|
||||||
"content-type": "~1.0.4",
|
|
||||||
"debug": "2.6.9",
|
|
||||||
"depd": "~1.1.2",
|
|
||||||
"http-errors": "1.7.2",
|
|
||||||
"iconv-lite": "0.4.24",
|
|
||||||
"on-finished": "~2.3.0",
|
|
||||||
"qs": "6.7.0",
|
|
||||||
"raw-body": "2.4.0",
|
|
||||||
"type-is": "~1.6.17"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Node.js body parsing middleware",
|
|
||||||
"devDependencies": {
|
|
||||||
"eslint": "5.16.0",
|
|
||||||
"eslint-config-standard": "12.0.0",
|
|
||||||
"eslint-plugin-import": "2.17.2",
|
|
||||||
"eslint-plugin-markdown": "1.0.0",
|
|
||||||
"eslint-plugin-node": "8.0.1",
|
|
||||||
"eslint-plugin-promise": "4.1.1",
|
|
||||||
"eslint-plugin-standard": "4.0.0",
|
|
||||||
"istanbul": "0.4.5",
|
|
||||||
"methods": "1.1.2",
|
|
||||||
"mocha": "6.1.4",
|
|
||||||
"safe-buffer": "5.1.2",
|
|
||||||
"supertest": "4.0.2"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 0.8"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"lib/",
|
|
||||||
"LICENSE",
|
|
||||||
"HISTORY.md",
|
|
||||||
"index.js"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/expressjs/body-parser#readme",
|
|
||||||
"license": "MIT",
|
|
||||||
"name": "body-parser",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/expressjs/body-parser.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"lint": "eslint --plugin markdown --ext js,md .",
|
|
||||||
"test": "mocha --require test/support/env --reporter spec --check-leaks --bail test/",
|
|
||||||
"test-cov": "istanbul cover node_modules/mocha/bin/_mocha -- --require test/support/env --reporter dot --check-leaks test/",
|
|
||||||
"test-travis": "istanbul cover node_modules/mocha/bin/_mocha --report lcovonly -- --require test/support/env --reporter spec --check-leaks test/"
|
|
||||||
},
|
|
||||||
"version": "1.19.0"
|
|
||||||
}
|
|
||||||
-21
@@ -1,21 +0,0 @@
|
|||||||
MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
|
||||||
|
|
||||||
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.
|
|
||||||
-129
@@ -1,129 +0,0 @@
|
|||||||
# brace-expansion
|
|
||||||
|
|
||||||
[Brace expansion](https://www.gnu.org/software/bash/manual/html_node/Brace-Expansion.html),
|
|
||||||
as known from sh/bash, in JavaScript.
|
|
||||||
|
|
||||||
[](http://travis-ci.org/juliangruber/brace-expansion)
|
|
||||||
[](https://www.npmjs.org/package/brace-expansion)
|
|
||||||
[](https://greenkeeper.io/)
|
|
||||||
|
|
||||||
[](https://ci.testling.com/juliangruber/brace-expansion)
|
|
||||||
|
|
||||||
## Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
var expand = require('brace-expansion');
|
|
||||||
|
|
||||||
expand('file-{a,b,c}.jpg')
|
|
||||||
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
|
|
||||||
|
|
||||||
expand('-v{,,}')
|
|
||||||
// => ['-v', '-v', '-v']
|
|
||||||
|
|
||||||
expand('file{0..2}.jpg')
|
|
||||||
// => ['file0.jpg', 'file1.jpg', 'file2.jpg']
|
|
||||||
|
|
||||||
expand('file-{a..c}.jpg')
|
|
||||||
// => ['file-a.jpg', 'file-b.jpg', 'file-c.jpg']
|
|
||||||
|
|
||||||
expand('file{2..0}.jpg')
|
|
||||||
// => ['file2.jpg', 'file1.jpg', 'file0.jpg']
|
|
||||||
|
|
||||||
expand('file{0..4..2}.jpg')
|
|
||||||
// => ['file0.jpg', 'file2.jpg', 'file4.jpg']
|
|
||||||
|
|
||||||
expand('file-{a..e..2}.jpg')
|
|
||||||
// => ['file-a.jpg', 'file-c.jpg', 'file-e.jpg']
|
|
||||||
|
|
||||||
expand('file{00..10..5}.jpg')
|
|
||||||
// => ['file00.jpg', 'file05.jpg', 'file10.jpg']
|
|
||||||
|
|
||||||
expand('{{A..C},{a..c}}')
|
|
||||||
// => ['A', 'B', 'C', 'a', 'b', 'c']
|
|
||||||
|
|
||||||
expand('ppp{,config,oe{,conf}}')
|
|
||||||
// => ['ppp', 'pppconfig', 'pppoe', 'pppoeconf']
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
```js
|
|
||||||
var expand = require('brace-expansion');
|
|
||||||
```
|
|
||||||
|
|
||||||
### var expanded = expand(str)
|
|
||||||
|
|
||||||
Return an array of all possible and valid expansions of `str`. If none are
|
|
||||||
found, `[str]` is returned.
|
|
||||||
|
|
||||||
Valid expansions are:
|
|
||||||
|
|
||||||
```js
|
|
||||||
/^(.*,)+(.+)?$/
|
|
||||||
// {a,b,...}
|
|
||||||
```
|
|
||||||
|
|
||||||
A comma separated list of options, like `{a,b}` or `{a,{b,c}}` or `{,a,}`.
|
|
||||||
|
|
||||||
```js
|
|
||||||
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
|
|
||||||
// {x..y[..incr]}
|
|
||||||
```
|
|
||||||
|
|
||||||
A numeric sequence from `x` to `y` inclusive, with optional increment.
|
|
||||||
If `x` or `y` start with a leading `0`, all the numbers will be padded
|
|
||||||
to have equal length. Negative numbers and backwards iteration work too.
|
|
||||||
|
|
||||||
```js
|
|
||||||
/^-?\d+\.\.-?\d+(\.\.-?\d+)?$/
|
|
||||||
// {x..y[..incr]}
|
|
||||||
```
|
|
||||||
|
|
||||||
An alphabetic sequence from `x` to `y` inclusive, with optional increment.
|
|
||||||
`x` and `y` must be exactly one character, and if given, `incr` must be a
|
|
||||||
number.
|
|
||||||
|
|
||||||
For compatibility reasons, the string `${` is not eligible for brace expansion.
|
|
||||||
|
|
||||||
## Installation
|
|
||||||
|
|
||||||
With [npm](https://npmjs.org) do:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
npm install brace-expansion
|
|
||||||
```
|
|
||||||
|
|
||||||
## Contributors
|
|
||||||
|
|
||||||
- [Julian Gruber](https://github.com/juliangruber)
|
|
||||||
- [Isaac Z. Schlueter](https://github.com/isaacs)
|
|
||||||
|
|
||||||
## Sponsors
|
|
||||||
|
|
||||||
This module is proudly supported by my [Sponsors](https://github.com/juliangruber/sponsors)!
|
|
||||||
|
|
||||||
Do you want to support modules like this to improve their quality, stability and weigh in on new features? Then please consider donating to my [Patreon](https://www.patreon.com/juliangruber). Not sure how much of my modules you're using? Try [feross/thanks](https://github.com/feross/thanks)!
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
(MIT)
|
|
||||||
|
|
||||||
Copyright (c) 2013 Julian Gruber <julian@juliangruber.com>
|
|
||||||
|
|
||||||
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.
|
|
||||||
-201
@@ -1,201 +0,0 @@
|
|||||||
var concatMap = require('concat-map');
|
|
||||||
var balanced = require('balanced-match');
|
|
||||||
|
|
||||||
module.exports = expandTop;
|
|
||||||
|
|
||||||
var escSlash = '\0SLASH'+Math.random()+'\0';
|
|
||||||
var escOpen = '\0OPEN'+Math.random()+'\0';
|
|
||||||
var escClose = '\0CLOSE'+Math.random()+'\0';
|
|
||||||
var escComma = '\0COMMA'+Math.random()+'\0';
|
|
||||||
var escPeriod = '\0PERIOD'+Math.random()+'\0';
|
|
||||||
|
|
||||||
function numeric(str) {
|
|
||||||
return parseInt(str, 10) == str
|
|
||||||
? parseInt(str, 10)
|
|
||||||
: str.charCodeAt(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
function escapeBraces(str) {
|
|
||||||
return str.split('\\\\').join(escSlash)
|
|
||||||
.split('\\{').join(escOpen)
|
|
||||||
.split('\\}').join(escClose)
|
|
||||||
.split('\\,').join(escComma)
|
|
||||||
.split('\\.').join(escPeriod);
|
|
||||||
}
|
|
||||||
|
|
||||||
function unescapeBraces(str) {
|
|
||||||
return str.split(escSlash).join('\\')
|
|
||||||
.split(escOpen).join('{')
|
|
||||||
.split(escClose).join('}')
|
|
||||||
.split(escComma).join(',')
|
|
||||||
.split(escPeriod).join('.');
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Basically just str.split(","), but handling cases
|
|
||||||
// where we have nested braced sections, which should be
|
|
||||||
// treated as individual members, like {a,{b,c},d}
|
|
||||||
function parseCommaParts(str) {
|
|
||||||
if (!str)
|
|
||||||
return [''];
|
|
||||||
|
|
||||||
var parts = [];
|
|
||||||
var m = balanced('{', '}', str);
|
|
||||||
|
|
||||||
if (!m)
|
|
||||||
return str.split(',');
|
|
||||||
|
|
||||||
var pre = m.pre;
|
|
||||||
var body = m.body;
|
|
||||||
var post = m.post;
|
|
||||||
var p = pre.split(',');
|
|
||||||
|
|
||||||
p[p.length-1] += '{' + body + '}';
|
|
||||||
var postParts = parseCommaParts(post);
|
|
||||||
if (post.length) {
|
|
||||||
p[p.length-1] += postParts.shift();
|
|
||||||
p.push.apply(p, postParts);
|
|
||||||
}
|
|
||||||
|
|
||||||
parts.push.apply(parts, p);
|
|
||||||
|
|
||||||
return parts;
|
|
||||||
}
|
|
||||||
|
|
||||||
function expandTop(str) {
|
|
||||||
if (!str)
|
|
||||||
return [];
|
|
||||||
|
|
||||||
// I don't know why Bash 4.3 does this, but it does.
|
|
||||||
// Anything starting with {} will have the first two bytes preserved
|
|
||||||
// but *only* at the top level, so {},a}b will not expand to anything,
|
|
||||||
// but a{},b}c will be expanded to [a}c,abc].
|
|
||||||
// One could argue that this is a bug in Bash, but since the goal of
|
|
||||||
// this module is to match Bash's rules, we escape a leading {}
|
|
||||||
if (str.substr(0, 2) === '{}') {
|
|
||||||
str = '\\{\\}' + str.substr(2);
|
|
||||||
}
|
|
||||||
|
|
||||||
return expand(escapeBraces(str), true).map(unescapeBraces);
|
|
||||||
}
|
|
||||||
|
|
||||||
function identity(e) {
|
|
||||||
return e;
|
|
||||||
}
|
|
||||||
|
|
||||||
function embrace(str) {
|
|
||||||
return '{' + str + '}';
|
|
||||||
}
|
|
||||||
function isPadded(el) {
|
|
||||||
return /^-?0\d/.test(el);
|
|
||||||
}
|
|
||||||
|
|
||||||
function lte(i, y) {
|
|
||||||
return i <= y;
|
|
||||||
}
|
|
||||||
function gte(i, y) {
|
|
||||||
return i >= y;
|
|
||||||
}
|
|
||||||
|
|
||||||
function expand(str, isTop) {
|
|
||||||
var expansions = [];
|
|
||||||
|
|
||||||
var m = balanced('{', '}', str);
|
|
||||||
if (!m || /\$$/.test(m.pre)) return [str];
|
|
||||||
|
|
||||||
var isNumericSequence = /^-?\d+\.\.-?\d+(?:\.\.-?\d+)?$/.test(m.body);
|
|
||||||
var isAlphaSequence = /^[a-zA-Z]\.\.[a-zA-Z](?:\.\.-?\d+)?$/.test(m.body);
|
|
||||||
var isSequence = isNumericSequence || isAlphaSequence;
|
|
||||||
var isOptions = m.body.indexOf(',') >= 0;
|
|
||||||
if (!isSequence && !isOptions) {
|
|
||||||
// {a},b}
|
|
||||||
if (m.post.match(/,.*\}/)) {
|
|
||||||
str = m.pre + '{' + m.body + escClose + m.post;
|
|
||||||
return expand(str);
|
|
||||||
}
|
|
||||||
return [str];
|
|
||||||
}
|
|
||||||
|
|
||||||
var n;
|
|
||||||
if (isSequence) {
|
|
||||||
n = m.body.split(/\.\./);
|
|
||||||
} else {
|
|
||||||
n = parseCommaParts(m.body);
|
|
||||||
if (n.length === 1) {
|
|
||||||
// x{{a,b}}y ==> x{a}y x{b}y
|
|
||||||
n = expand(n[0], false).map(embrace);
|
|
||||||
if (n.length === 1) {
|
|
||||||
var post = m.post.length
|
|
||||||
? expand(m.post, false)
|
|
||||||
: [''];
|
|
||||||
return post.map(function(p) {
|
|
||||||
return m.pre + n[0] + p;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// at this point, n is the parts, and we know it's not a comma set
|
|
||||||
// with a single entry.
|
|
||||||
|
|
||||||
// no need to expand pre, since it is guaranteed to be free of brace-sets
|
|
||||||
var pre = m.pre;
|
|
||||||
var post = m.post.length
|
|
||||||
? expand(m.post, false)
|
|
||||||
: [''];
|
|
||||||
|
|
||||||
var N;
|
|
||||||
|
|
||||||
if (isSequence) {
|
|
||||||
var x = numeric(n[0]);
|
|
||||||
var y = numeric(n[1]);
|
|
||||||
var width = Math.max(n[0].length, n[1].length)
|
|
||||||
var incr = n.length == 3
|
|
||||||
? Math.abs(numeric(n[2]))
|
|
||||||
: 1;
|
|
||||||
var test = lte;
|
|
||||||
var reverse = y < x;
|
|
||||||
if (reverse) {
|
|
||||||
incr *= -1;
|
|
||||||
test = gte;
|
|
||||||
}
|
|
||||||
var pad = n.some(isPadded);
|
|
||||||
|
|
||||||
N = [];
|
|
||||||
|
|
||||||
for (var i = x; test(i, y); i += incr) {
|
|
||||||
var c;
|
|
||||||
if (isAlphaSequence) {
|
|
||||||
c = String.fromCharCode(i);
|
|
||||||
if (c === '\\')
|
|
||||||
c = '';
|
|
||||||
} else {
|
|
||||||
c = String(i);
|
|
||||||
if (pad) {
|
|
||||||
var need = width - c.length;
|
|
||||||
if (need > 0) {
|
|
||||||
var z = new Array(need + 1).join('0');
|
|
||||||
if (i < 0)
|
|
||||||
c = '-' + z + c.slice(1);
|
|
||||||
else
|
|
||||||
c = z + c;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
N.push(c);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
N = concatMap(n, function(el) { return expand(el, false) });
|
|
||||||
}
|
|
||||||
|
|
||||||
for (var j = 0; j < N.length; j++) {
|
|
||||||
for (var k = 0; k < post.length; k++) {
|
|
||||||
var expansion = pre + N[j] + post[k];
|
|
||||||
if (!isTop || isSequence || expansion)
|
|
||||||
expansions.push(expansion);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return expansions;
|
|
||||||
}
|
|
||||||
|
|
||||||
-75
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "brace-expansion@^1.1.7",
|
|
||||||
"_id": "brace-expansion@1.1.11",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
|
||||||
"_location": "/brace-expansion",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "brace-expansion@^1.1.7",
|
|
||||||
"name": "brace-expansion",
|
|
||||||
"escapedName": "brace-expansion",
|
|
||||||
"rawSpec": "^1.1.7",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "^1.1.7"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/minimatch"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
|
||||||
"_shasum": "3c7fcbf529d87226f3d2f52b966ff5271eb441dd",
|
|
||||||
"_spec": "brace-expansion@^1.1.7",
|
|
||||||
"_where": "/home/erik/Documents/workspace_brackets/BME_Project_Ohm/om/node_modules/minimatch",
|
|
||||||
"author": {
|
|
||||||
"name": "Julian Gruber",
|
|
||||||
"email": "mail@juliangruber.com",
|
|
||||||
"url": "http://juliangruber.com"
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/juliangruber/brace-expansion/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
|
||||||
"balanced-match": "^1.0.0",
|
|
||||||
"concat-map": "0.0.1"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Brace expansion as known from sh/bash",
|
|
||||||
"devDependencies": {
|
|
||||||
"matcha": "^0.7.0",
|
|
||||||
"tape": "^4.6.0"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/juliangruber/brace-expansion",
|
|
||||||
"keywords": [],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "index.js",
|
|
||||||
"name": "brace-expansion",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git://github.com/juliangruber/brace-expansion.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"bench": "matcha test/perf/bench.js",
|
|
||||||
"gentest": "bash test/generate.sh",
|
|
||||||
"test": "tape test/*.js"
|
|
||||||
},
|
|
||||||
"testling": {
|
|
||||||
"files": "test/*.js",
|
|
||||||
"browsers": [
|
|
||||||
"ie/8..latest",
|
|
||||||
"firefox/20..latest",
|
|
||||||
"firefox/nightly",
|
|
||||||
"chrome/25..latest",
|
|
||||||
"chrome/canary",
|
|
||||||
"opera/12..latest",
|
|
||||||
"opera/next",
|
|
||||||
"safari/5.1..latest",
|
|
||||||
"ipad/6.0..latest",
|
|
||||||
"iphone/6.0..latest",
|
|
||||||
"android-browser/4.2..latest"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"version": "1.1.11"
|
|
||||||
}
|
|
||||||
Loaded 100 of 6131 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user