From f94ca33b9eb7bd4604e42c1ef1cc10318f41651f Mon Sep 17 00:00:00 2001
From: Dobie Wollert
Date: Wed, 16 Dec 2015 09:12:35 -0800
Subject: [PATCH] Changes
---
app/controllers/clock.js | 42 -
app/controllers/db.js | 64 +
app/controllers/pms.js | 9 +-
app/controllers/timeclock.js | 819 +-
app/controllers/timesheet.js | 370 +
app/controllers/users.js | 353 +-
app/controllers/workorders.js | 967 +-
app/model/timeClockException.js | 30 +
app/model/timeClockSpan.js | 140 +-
app/model/user.js | 20 +-
app/model/workorder.js | 95 +-
app/routes/exceptions.js | 60 +
app/routes/index.js | 9 +
app/routes/misc.js | 53 +
app/routes/spans.js | 97 +
app/routes/users.js | 184 +
app/routes/workorders.js | 67 +
app/templates/exception.html.tmpl | 74 +
app/templates/exception.text.tmpl | 3 +
app/templates/partsRequest.html.tmpl | 146 +
app/templates/partsRequest.text.tmpl | 58 +
app/util/email.js | 100 +
config/auth.js | 377 +-
config/config.js | 32 +-
config/db.js | 30 +
config/express.js | 11 +-
config/promise.js | 36 +
config/routes.js | 308 +-
config/validators.js | 25 +
node_modules/bluebird/LICENSE | 4 +-
node_modules/bluebird/README.md | 644 +-
node_modules/bluebird/changelog.md | 1 +
node_modules/bluebird/js/browser/bluebird.js | 5277 +++----
.../bluebird/js/browser/bluebird.min.js | 14 +-
.../bluebird/js/{main => release}/any.js | 0
node_modules/bluebird/js/release/assert.js | 55 +
node_modules/bluebird/js/release/async.js | 157 +
node_modules/bluebird/js/release/bind.js | 67 +
node_modules/bluebird/js/release/bluebird.js | 11 +
node_modules/bluebird/js/release/call_get.js | 123 +
node_modules/bluebird/js/release/cancel.js | 125 +
.../bluebird/js/release/catch_filter.js | 42 +
node_modules/bluebird/js/release/context.js | 69 +
.../bluebird/js/release/debuggability.js | 812 +
.../bluebird/js/release/direct_resolve.js | 46 +
node_modules/bluebird/js/release/each.js | 29 +
node_modules/bluebird/js/release/errors.js | 111 +
.../bluebird/js/{main => release}/es5.js | 0
.../bluebird/js/{main => release}/filter.js | 0
node_modules/bluebird/js/release/finally.js | 100 +
.../bluebird/js/release/generators.js | 204 +
node_modules/bluebird/js/release/join.js | 149 +
node_modules/bluebird/js/release/map.js | 151 +
node_modules/bluebird/js/release/method.js | 55 +
node_modules/bluebird/js/release/nodeback.js | 51 +
node_modules/bluebird/js/release/nodeify.js | 58 +
node_modules/bluebird/js/release/promise.js | 755 +
.../bluebird/js/release/promise_array.js | 184 +
node_modules/bluebird/js/release/promisify.js | 314 +
node_modules/bluebird/js/release/props.js | 118 +
.../bluebird/js/{main => release}/queue.js | 0
node_modules/bluebird/js/release/race.js | 49 +
node_modules/bluebird/js/release/reduce.js | 162 +
node_modules/bluebird/js/release/schedule.js | 35 +
node_modules/bluebird/js/release/settle.js | 43 +
node_modules/bluebird/js/release/some.js | 148 +
.../js/release/synchronous_inspection.js | 96 +
node_modules/bluebird/js/release/thenables.js | 82 +
node_modules/bluebird/js/release/timers.js | 66 +
node_modules/bluebird/js/release/using.js | 225 +
node_modules/bluebird/js/release/util.js | 344 +
node_modules/bluebird/package.json | 135 +-
node_modules/colors/.travis.yml | 6 +
node_modules/colors/MIT-LICENSE.txt | 23 +
node_modules/colors/ReadMe.md | 167 +
node_modules/colors/examples/normal-usage.js | 74 +
node_modules/colors/examples/safe-string.js | 76 +
node_modules/colors/lib/colors.js | 176 +
node_modules/colors/lib/custom/trap.js | 45 +
node_modules/colors/lib/custom/zalgo.js | 104 +
.../colors/lib/extendStringPrototype.js | 118 +
node_modules/colors/lib/index.js | 12 +
node_modules/colors/lib/maps/america.js | 12 +
node_modules/colors/lib/maps/rainbow.js | 13 +
node_modules/colors/lib/maps/random.js | 8 +
node_modules/colors/lib/maps/zebra.js | 5 +
node_modules/colors/lib/styles.js | 77 +
.../colors/lib/system/supports-colors.js | 61 +
node_modules/colors/package.json | 79 +
node_modules/colors/safe.js | 9 +
node_modules/colors/screenshots/colors.png | Bin 0 -> 79787 bytes
node_modules/colors/tests/basic-test.js | 50 +
node_modules/colors/tests/safe-test.js | 45 +
node_modules/colors/themes/generic-logging.js | 12 +
node_modules/cycle/README.md | 49 +
node_modules/cycle/cycle.js | 170 +
node_modules/cycle/package.json | 73 +
node_modules/express-validator/.editorconfig | 11 +
node_modules/express-validator/.jscsrc | 56 +
node_modules/express-validator/.jshintrc | 18 +
node_modules/express-validator/.npmignore | 3 +
node_modules/express-validator/.travis.yml | 11 +
node_modules/express-validator/CHANGELOG.md | 227 +
node_modules/express-validator/LICENSE | 21 +
node_modules/express-validator/README.md | 380 +
node_modules/express-validator/index.js | 1 +
.../lib/express_validator.js | 408 +
.../node_modules/bluebird/LICENSE | 21 +
.../node_modules/bluebird/README.md | 679 +
.../node_modules/bluebird/changelog.md | 1723 +++
.../bluebird/js/browser/bluebird.js | 4887 ++++++
.../bluebird/js/browser/bluebird.min.js | 31 +
.../node_modules/bluebird/js/main/any.js | 21 +
.../node_modules}/bluebird/js/main/assert.js | 0
.../node_modules}/bluebird/js/main/async.js | 78 +-
.../node_modules}/bluebird/js/main/bind.js | 9 +-
.../bluebird/js/main/bluebird.js | 0
.../bluebird/js/main/call_get.js | 0
.../node_modules}/bluebird/js/main/cancel.js | 0
.../bluebird/js/main/captured_trace.js | 3 +-
.../bluebird/js/main/catch_filter.js | 2 +-
.../node_modules}/bluebird/js/main/context.js | 0
.../bluebird/js/main/debuggability.js | 19 +-
.../bluebird/js/main/direct_resolve.js | 15 +-
.../node_modules}/bluebird/js/main/each.js | 0
.../node_modules}/bluebird/js/main/errors.js | 0
.../node_modules/bluebird/js/main/es5.js | 80 +
.../node_modules/bluebird/js/main/filter.js | 12 +
.../node_modules}/bluebird/js/main/finally.js | 7 +-
.../bluebird/js/main/generators.js | 0
.../node_modules}/bluebird/js/main/join.js | 0
.../node_modules}/bluebird/js/main/map.js | 6 +-
.../node_modules}/bluebird/js/main/method.js | 0
.../node_modules}/bluebird/js/main/nodeify.js | 9 +-
.../bluebird/js/main/progress.js | 0
.../node_modules}/bluebird/js/main/promise.js | 94 +-
.../bluebird/js/main/promise_array.js | 2 +-
.../bluebird/js/main/promise_resolver.js | 0
.../bluebird/js/main/promisify.js | 38 +-
.../node_modules}/bluebird/js/main/props.js | 0
.../node_modules/bluebird/js/main/queue.js | 90 +
.../node_modules}/bluebird/js/main/race.js | 0
.../node_modules}/bluebird/js/main/reduce.js | 6 +-
.../bluebird/js/main/schedule.js | 26 +-
.../node_modules}/bluebird/js/main/settle.js | 0
.../node_modules}/bluebird/js/main/some.js | 0
.../js/main/synchronous_inspection.js | 0
.../bluebird/js/main/thenables.js | 7 +-
.../node_modules}/bluebird/js/main/timers.js | 12 +-
.../node_modules}/bluebird/js/main/using.js | 17 +-
.../node_modules}/bluebird/js/main/util.js | 71 +-
.../node_modules/bluebird/package.json | 127 +
.../node_modules/lodash/LICENSE | 22 +
.../node_modules/lodash/README.md | 121 +
.../node_modules/lodash/array.js | 44 +
.../node_modules/lodash/array/chunk.js | 46 +
.../node_modules/lodash/array/compact.js | 30 +
.../node_modules/lodash/array/difference.js | 29 +
.../node_modules/lodash/array/drop.js | 39 +
.../node_modules/lodash/array/dropRight.js | 40 +
.../lodash/array/dropRightWhile.js | 59 +
.../node_modules/lodash/array/dropWhile.js | 59 +
.../node_modules/lodash/array/fill.js | 44 +
.../node_modules/lodash/array/findIndex.js | 53 +
.../lodash/array/findLastIndex.js | 53 +
.../node_modules/lodash/array/first.js | 22 +
.../node_modules/lodash/array/flatten.js | 32 +
.../node_modules/lodash/array/flattenDeep.js | 21 +
.../node_modules/lodash/array/head.js | 1 +
.../node_modules/lodash/array/indexOf.js | 53 +
.../node_modules/lodash/array/initial.js | 20 +
.../node_modules/lodash/array/intersection.js | 58 +
.../node_modules/lodash/array/last.js | 19 +
.../node_modules/lodash/array/lastIndexOf.js | 60 +
.../node_modules/lodash/array/object.js | 1 +
.../node_modules/lodash/array/pull.js | 52 +
.../node_modules/lodash/array/pullAt.js | 40 +
.../node_modules/lodash/array/remove.js | 64 +
.../node_modules/lodash/array/rest.js | 21 +
.../node_modules/lodash/array/slice.js | 30 +
.../node_modules/lodash/array/sortedIndex.js | 53 +
.../lodash/array/sortedLastIndex.js | 25 +
.../node_modules/lodash/array/tail.js | 1 +
.../node_modules/lodash/array/take.js | 39 +
.../node_modules/lodash/array/takeRight.js | 40 +
.../lodash/array/takeRightWhile.js | 59 +
.../node_modules/lodash/array/takeWhile.js | 59 +
.../node_modules/lodash/array/union.js | 24 +
.../node_modules/lodash/array/uniq.js | 71 +
.../node_modules/lodash/array/unique.js | 1 +
.../node_modules/lodash/array/unzip.js | 47 +
.../node_modules/lodash/array/unzipWith.js | 41 +
.../node_modules/lodash/array/without.js | 27 +
.../node_modules/lodash/array/xor.js | 35 +
.../node_modules/lodash/array/zip.js | 21 +
.../node_modules/lodash/array/zipObject.js | 43 +
.../node_modules/lodash/array/zipWith.js | 36 +
.../node_modules/lodash/chain.js | 16 +
.../node_modules/lodash/chain/chain.js | 35 +
.../node_modules/lodash/chain/commit.js | 1 +
.../node_modules/lodash/chain/concat.js | 1 +
.../node_modules/lodash/chain/lodash.js | 125 +
.../node_modules/lodash/chain/plant.js | 1 +
.../node_modules/lodash/chain/reverse.js | 1 +
.../node_modules/lodash/chain/run.js | 1 +
.../node_modules/lodash/chain/tap.js | 29 +
.../node_modules/lodash/chain/thru.js | 26 +
.../node_modules/lodash/chain/toJSON.js | 1 +
.../node_modules/lodash/chain/toString.js | 1 +
.../node_modules/lodash/chain/value.js | 1 +
.../node_modules/lodash/chain/valueOf.js | 1 +
.../node_modules/lodash/chain/wrapperChain.js | 32 +
.../lodash/chain/wrapperCommit.js | 32 +
.../lodash/chain/wrapperConcat.js | 34 +
.../node_modules/lodash/chain/wrapperPlant.js | 45 +
.../lodash/chain/wrapperReverse.js | 43 +
.../lodash/chain/wrapperToString.js | 17 +
.../node_modules/lodash/chain/wrapperValue.js | 20 +
.../node_modules/lodash/collection.js | 44 +
.../node_modules/lodash/collection/all.js | 1 +
.../node_modules/lodash/collection/any.js | 1 +
.../node_modules/lodash/collection/at.js | 29 +
.../node_modules/lodash/collection/collect.js | 1 +
.../lodash/collection/contains.js | 1 +
.../node_modules/lodash/collection/countBy.js | 54 +
.../node_modules/lodash/collection/detect.js | 1 +
.../node_modules/lodash/collection/each.js | 1 +
.../lodash/collection/eachRight.js | 1 +
.../node_modules/lodash/collection/every.js | 66 +
.../node_modules/lodash/collection/filter.js | 61 +
.../node_modules/lodash/collection/find.js | 56 +
.../lodash/collection/findLast.js | 25 +
.../lodash/collection/findWhere.js | 37 +
.../node_modules/lodash/collection/foldl.js | 1 +
.../node_modules/lodash/collection/foldr.js | 1 +
.../node_modules/lodash/collection/forEach.js | 37 +
.../lodash/collection/forEachRight.js | 26 +
.../node_modules/lodash/collection/groupBy.js | 59 +
.../node_modules/lodash/collection/include.js | 1 +
.../lodash/collection/includes.js | 57 +
.../node_modules/lodash/collection/indexBy.js | 53 +
.../node_modules/lodash/collection/inject.js | 1 +
.../node_modules/lodash/collection/invoke.js | 42 +
.../node_modules/lodash/collection/map.js | 68 +
.../node_modules/lodash/collection/max.js | 1 +
.../node_modules/lodash/collection/min.js | 1 +
.../lodash/collection/partition.js | 66 +
.../node_modules/lodash/collection/pluck.js | 31 +
.../node_modules/lodash/collection/reduce.js | 44 +
.../lodash/collection/reduceRight.js | 29 +
.../node_modules/lodash/collection/reject.js | 50 +
.../node_modules/lodash/collection/sample.js | 50 +
.../node_modules/lodash/collection/select.js | 1 +
.../node_modules/lodash/collection/shuffle.js | 24 +
.../node_modules/lodash/collection/size.js | 30 +
.../node_modules/lodash/collection/some.js | 67 +
.../node_modules/lodash/collection/sortBy.js | 71 +
.../lodash/collection/sortByAll.js | 52 +
.../lodash/collection/sortByOrder.js | 55 +
.../node_modules/lodash/collection/sum.js | 1 +
.../node_modules/lodash/collection/where.js | 37 +
.../node_modules/lodash/date.js | 3 +
.../node_modules/lodash/date/now.js | 24 +
.../node_modules/lodash/function.js | 28 +
.../node_modules/lodash/function/after.js | 48 +
.../node_modules/lodash/function/ary.js | 34 +
.../node_modules/lodash/function/backflow.js | 1 +
.../node_modules/lodash/function/before.js | 42 +
.../node_modules/lodash/function/bind.js | 56 +
.../node_modules/lodash/function/bindAll.js | 50 +
.../node_modules/lodash/function/bindKey.js | 66 +
.../node_modules/lodash/function/compose.js | 1 +
.../node_modules/lodash/function/curry.js | 51 +
.../lodash/function/curryRight.js | 48 +
.../node_modules/lodash/function/debounce.js | 181 +
.../node_modules/lodash/function/defer.js | 25 +
.../node_modules/lodash/function/delay.js | 26 +
.../node_modules/lodash/function/flow.js | 25 +
.../node_modules/lodash/function/flowRight.js | 25 +
.../node_modules/lodash/function/memoize.js | 80 +
.../node_modules/lodash/function/modArgs.js | 58 +
.../node_modules/lodash/function/negate.js | 32 +
.../node_modules/lodash/function/once.js | 24 +
.../node_modules/lodash/function/partial.js | 43 +
.../lodash/function/partialRight.js | 42 +
.../node_modules/lodash/function/rearg.js | 40 +
.../node_modules/lodash/function/restParam.js | 58 +
.../node_modules/lodash/function/spread.js | 44 +
.../node_modules/lodash/function/throttle.js | 62 +
.../node_modules/lodash/function/wrap.js | 33 +
.../node_modules/lodash/index.js | 12351 ++++++++++++++++
.../lodash/internal/LazyWrapper.js | 26 +
.../lodash/internal/LodashWrapper.js | 21 +
.../node_modules/lodash/internal/MapCache.js | 24 +
.../node_modules/lodash/internal/SetCache.js | 29 +
.../lodash/internal/arrayConcat.js | 25 +
.../node_modules/lodash/internal/arrayCopy.js | 20 +
.../node_modules/lodash/internal/arrayEach.js | 22 +
.../lodash/internal/arrayEachRight.js | 21 +
.../lodash/internal/arrayEvery.js | 23 +
.../lodash/internal/arrayExtremum.js | 30 +
.../lodash/internal/arrayFilter.js | 25 +
.../node_modules/lodash/internal/arrayMap.js | 21 +
.../node_modules/lodash/internal/arrayPush.js | 20 +
.../lodash/internal/arrayReduce.js | 26 +
.../lodash/internal/arrayReduceRight.js | 24 +
.../node_modules/lodash/internal/arraySome.js | 23 +
.../node_modules/lodash/internal/arraySum.js | 20 +
.../lodash/internal/assignDefaults.js | 13 +
.../lodash/internal/assignOwnDefaults.js | 26 +
.../lodash/internal/assignWith.js | 32 +
.../lodash/internal/baseAssign.js | 19 +
.../node_modules/lodash/internal/baseAt.js | 32 +
.../lodash/internal/baseCallback.js | 35 +
.../node_modules/lodash/internal/baseClone.js | 128 +
.../lodash/internal/baseCompareAscending.js | 34 +
.../node_modules/lodash/internal/baseCopy.js | 23 +
.../lodash/internal/baseCreate.js | 23 +
.../node_modules/lodash/internal/baseDelay.js | 21 +
.../lodash/internal/baseDifference.js | 55 +
.../node_modules/lodash/internal/baseEach.js | 15 +
.../lodash/internal/baseEachRight.js | 15 +
.../node_modules/lodash/internal/baseEvery.js | 22 +
.../lodash/internal/baseExtremum.js | 29 +
.../node_modules/lodash/internal/baseFill.js | 31 +
.../lodash/internal/baseFilter.js | 22 +
.../node_modules/lodash/internal/baseFind.js | 25 +
.../lodash/internal/baseFindIndex.js | 23 +
.../lodash/internal/baseFlatten.js | 41 +
.../node_modules/lodash/internal/baseFor.js | 17 +
.../node_modules/lodash/internal/baseForIn.js | 17 +
.../lodash/internal/baseForOwn.js | 17 +
.../lodash/internal/baseForOwnRight.js | 17 +
.../lodash/internal/baseForRight.js | 15 +
.../lodash/internal/baseFunctions.js | 27 +
.../node_modules/lodash/internal/baseGet.js | 29 +
.../lodash/internal/baseIndexOf.js | 27 +
.../lodash/internal/baseIsEqual.js | 28 +
.../lodash/internal/baseIsEqualDeep.js | 102 +
.../lodash/internal/baseIsFunction.js | 15 +
.../lodash/internal/baseIsMatch.js | 52 +
.../lodash/internal/baseLodash.js | 10 +
.../node_modules/lodash/internal/baseMap.js | 23 +
.../lodash/internal/baseMatches.js | 30 +
.../lodash/internal/baseMatchesProperty.js | 45 +
.../node_modules/lodash/internal/baseMerge.js | 56 +
.../lodash/internal/baseMergeDeep.js | 67 +
.../lodash/internal/baseProperty.js | 14 +
.../lodash/internal/basePropertyDeep.js | 19 +
.../lodash/internal/basePullAt.js | 30 +
.../lodash/internal/baseRandom.js | 18 +
.../lodash/internal/baseReduce.js | 24 +
.../lodash/internal/baseSetData.js | 17 +
.../node_modules/lodash/internal/baseSlice.js | 32 +
.../node_modules/lodash/internal/baseSome.js | 23 +
.../lodash/internal/baseSortBy.js | 21 +
.../lodash/internal/baseSortByOrder.js | 31 +
.../node_modules/lodash/internal/baseSum.js | 20 +
.../lodash/internal/baseToString.js | 13 +
.../node_modules/lodash/internal/baseUniq.js | 60 +
.../lodash/internal/baseValues.js | 22 +
.../node_modules/lodash/internal/baseWhile.js | 24 +
.../lodash/internal/baseWrapperValue.js | 29 +
.../lodash/internal/binaryIndex.js | 39 +
.../lodash/internal/binaryIndexBy.js | 57 +
.../lodash/internal/bindCallback.js | 39 +
.../lodash/internal/bufferClone.js | 20 +
.../lodash/internal/cacheIndexOf.js | 19 +
.../node_modules/lodash/internal/cachePush.js | 20 +
.../lodash/internal/charsLeftIndex.js | 18 +
.../lodash/internal/charsRightIndex.js | 17 +
.../lodash/internal/compareAscending.js | 16 +
.../lodash/internal/compareMultiple.js | 44 +
.../lodash/internal/composeArgs.js | 34 +
.../lodash/internal/composeArgsRight.js | 36 +
.../lodash/internal/createAggregator.js | 35 +
.../lodash/internal/createAssigner.js | 41 +
.../lodash/internal/createBaseEach.js | 31 +
.../lodash/internal/createBaseFor.js | 27 +
.../lodash/internal/createBindWrapper.js | 22 +
.../lodash/internal/createCache.js | 21 +
.../lodash/internal/createCompounder.js | 26 +
.../lodash/internal/createCtorWrapper.js | 37 +
.../lodash/internal/createCurry.js | 23 +
.../lodash/internal/createDefaults.js | 22 +
.../lodash/internal/createExtremum.js | 33 +
.../lodash/internal/createFind.js | 25 +
.../lodash/internal/createFindIndex.js | 21 +
.../lodash/internal/createFindKey.js | 18 +
.../lodash/internal/createFlow.js | 74 +
.../lodash/internal/createForEach.js | 20 +
.../lodash/internal/createForIn.js | 20 +
.../lodash/internal/createForOwn.js | 19 +
.../lodash/internal/createHybridWrapper.js | 111 +
.../lodash/internal/createObjectMapper.js | 26 +
.../lodash/internal/createPadDir.js | 18 +
.../lodash/internal/createPadding.js | 29 +
.../lodash/internal/createPartial.js | 20 +
.../lodash/internal/createPartialWrapper.js | 43 +
.../lodash/internal/createReduce.js | 22 +
.../lodash/internal/createRound.js | 23 +
.../lodash/internal/createSortedIndex.js | 20 +
.../lodash/internal/createWrapper.js | 86 +
.../lodash/internal/deburrLetter.js | 33 +
.../lodash/internal/equalArrays.js | 51 +
.../lodash/internal/equalByTag.js | 48 +
.../lodash/internal/equalObjects.js | 67 +
.../lodash/internal/escapeHtmlChar.js | 22 +
.../lodash/internal/escapeRegExpChar.js | 38 +
.../lodash/internal/escapeStringChar.js | 22 +
.../node_modules/lodash/internal/getData.js | 15 +
.../lodash/internal/getFuncName.js | 25 +
.../node_modules/lodash/internal/getLength.js | 15 +
.../lodash/internal/getMatchData.js | 21 +
.../node_modules/lodash/internal/getNative.js | 16 +
.../node_modules/lodash/internal/getView.js | 33 +
.../lodash/internal/indexOfNaN.js | 23 +
.../lodash/internal/initCloneArray.js | 26 +
.../lodash/internal/initCloneByTag.js | 63 +
.../lodash/internal/initCloneObject.js | 16 +
.../lodash/internal/invokePath.js | 26 +
.../lodash/internal/isArrayLike.js | 15 +
.../node_modules/lodash/internal/isIndex.js | 24 +
.../lodash/internal/isIterateeCall.js | 28 +
.../node_modules/lodash/internal/isKey.js | 28 +
.../lodash/internal/isLaziable.js | 27 +
.../node_modules/lodash/internal/isLength.js | 20 +
.../lodash/internal/isObjectLike.js | 12 +
.../node_modules/lodash/internal/isSpace.js | 14 +
.../lodash/internal/isStrictComparable.js | 15 +
.../node_modules/lodash/internal/lazyClone.js | 23 +
.../lodash/internal/lazyReverse.js | 23 +
.../node_modules/lodash/internal/lazyValue.js | 72 +
.../node_modules/lodash/internal/mapDelete.js | 14 +
.../node_modules/lodash/internal/mapGet.js | 14 +
.../node_modules/lodash/internal/mapHas.js | 20 +
.../node_modules/lodash/internal/mapSet.js | 18 +
.../node_modules/lodash/internal/mergeData.js | 89 +
.../lodash/internal/mergeDefaults.js | 15 +
.../node_modules/lodash/internal/metaMap.js | 9 +
.../lodash/internal/pickByArray.js | 28 +
.../lodash/internal/pickByCallback.js | 22 +
.../node_modules/lodash/internal/reEscape.js | 4 +
.../lodash/internal/reEvaluate.js | 4 +
.../lodash/internal/reInterpolate.js | 4 +
.../node_modules/lodash/internal/realNames.js | 4 +
.../node_modules/lodash/internal/reorder.js | 29 +
.../lodash/internal/replaceHolders.js | 28 +
.../node_modules/lodash/internal/setData.js | 41 +
.../node_modules/lodash/internal/shimKeys.js | 41 +
.../lodash/internal/sortedUniq.js | 29 +
.../lodash/internal/toIterable.js | 22 +
.../node_modules/lodash/internal/toObject.js | 14 +
.../node_modules/lodash/internal/toPath.js | 28 +
.../lodash/internal/trimmedLeftIndex.js | 19 +
.../lodash/internal/trimmedRightIndex.js | 18 +
.../lodash/internal/unescapeHtmlChar.js | 22 +
.../lodash/internal/wrapperClone.js | 18 +
.../node_modules/lodash/lang.js | 32 +
.../node_modules/lodash/lang/clone.js | 70 +
.../node_modules/lodash/lang/cloneDeep.js | 55 +
.../node_modules/lodash/lang/eq.js | 1 +
.../node_modules/lodash/lang/gt.js | 25 +
.../node_modules/lodash/lang/gte.js | 25 +
.../node_modules/lodash/lang/isArguments.js | 34 +
.../node_modules/lodash/lang/isArray.js | 40 +
.../node_modules/lodash/lang/isBoolean.js | 35 +
.../node_modules/lodash/lang/isDate.js | 35 +
.../node_modules/lodash/lang/isElement.js | 24 +
.../node_modules/lodash/lang/isEmpty.js | 47 +
.../node_modules/lodash/lang/isEqual.js | 54 +
.../node_modules/lodash/lang/isError.js | 36 +
.../node_modules/lodash/lang/isFinite.js | 35 +
.../node_modules/lodash/lang/isFunction.js | 38 +
.../node_modules/lodash/lang/isMatch.js | 49 +
.../node_modules/lodash/lang/isNaN.js | 34 +
.../node_modules/lodash/lang/isNative.js | 48 +
.../node_modules/lodash/lang/isNull.js | 21 +
.../node_modules/lodash/lang/isNumber.js | 41 +
.../node_modules/lodash/lang/isObject.js | 28 +
.../node_modules/lodash/lang/isPlainObject.js | 71 +
.../node_modules/lodash/lang/isRegExp.js | 35 +
.../node_modules/lodash/lang/isString.js | 35 +
.../node_modules/lodash/lang/isTypedArray.js | 74 +
.../node_modules/lodash/lang/isUndefined.js | 21 +
.../node_modules/lodash/lang/lt.js | 25 +
.../node_modules/lodash/lang/lte.js | 25 +
.../node_modules/lodash/lang/toArray.js | 32 +
.../node_modules/lodash/lang/toPlainObject.js | 31 +
.../node_modules/lodash/math.js | 9 +
.../node_modules/lodash/math/add.js | 19 +
.../node_modules/lodash/math/ceil.js | 25 +
.../node_modules/lodash/math/floor.js | 25 +
.../node_modules/lodash/math/max.js | 56 +
.../node_modules/lodash/math/min.js | 56 +
.../node_modules/lodash/math/round.js | 25 +
.../node_modules/lodash/math/sum.js | 50 +
.../node_modules/lodash/number.js | 4 +
.../node_modules/lodash/number/inRange.js | 47 +
.../node_modules/lodash/number/random.js | 70 +
.../node_modules/lodash/object.js | 31 +
.../node_modules/lodash/object/assign.js | 43 +
.../node_modules/lodash/object/create.js | 47 +
.../node_modules/lodash/object/defaults.js | 25 +
.../lodash/object/defaultsDeep.js | 25 +
.../node_modules/lodash/object/extend.js | 1 +
.../node_modules/lodash/object/findKey.js | 54 +
.../node_modules/lodash/object/findLastKey.js | 54 +
.../node_modules/lodash/object/forIn.js | 33 +
.../node_modules/lodash/object/forInRight.js | 31 +
.../node_modules/lodash/object/forOwn.js | 33 +
.../node_modules/lodash/object/forOwnRight.js | 31 +
.../node_modules/lodash/object/functions.js | 23 +
.../node_modules/lodash/object/get.js | 33 +
.../node_modules/lodash/object/has.js | 57 +
.../node_modules/lodash/object/invert.js | 60 +
.../node_modules/lodash/object/keys.js | 45 +
.../node_modules/lodash/object/keysIn.js | 64 +
.../node_modules/lodash/object/mapKeys.js | 25 +
.../node_modules/lodash/object/mapValues.js | 46 +
.../node_modules/lodash/object/merge.js | 54 +
.../node_modules/lodash/object/methods.js | 1 +
.../node_modules/lodash/object/omit.js | 47 +
.../node_modules/lodash/object/pairs.js | 33 +
.../node_modules/lodash/object/pick.js | 42 +
.../node_modules/lodash/object/result.js | 49 +
.../node_modules/lodash/object/set.js | 55 +
.../node_modules/lodash/object/transform.js | 61 +
.../node_modules/lodash/object/values.js | 33 +
.../node_modules/lodash/object/valuesIn.js | 31 +
.../node_modules/lodash/package.json | 121 +
.../node_modules/lodash/string.js | 25 +
.../node_modules/lodash/string/camelCase.js | 27 +
.../node_modules/lodash/string/capitalize.js | 21 +
.../node_modules/lodash/string/deburr.js | 29 +
.../node_modules/lodash/string/endsWith.js | 40 +
.../node_modules/lodash/string/escape.js | 48 +
.../lodash/string/escapeRegExp.js | 32 +
.../node_modules/lodash/string/kebabCase.js | 26 +
.../node_modules/lodash/string/pad.js | 47 +
.../node_modules/lodash/string/padLeft.js | 27 +
.../node_modules/lodash/string/padRight.js | 27 +
.../node_modules/lodash/string/parseInt.js | 46 +
.../node_modules/lodash/string/repeat.js | 47 +
.../node_modules/lodash/string/snakeCase.js | 26 +
.../node_modules/lodash/string/startCase.js | 26 +
.../node_modules/lodash/string/startsWith.js | 36 +
.../node_modules/lodash/string/template.js | 226 +
.../lodash/string/templateSettings.js | 67 +
.../node_modules/lodash/string/trim.js | 42 +
.../node_modules/lodash/string/trimLeft.js | 36 +
.../node_modules/lodash/string/trimRight.js | 36 +
.../node_modules/lodash/string/trunc.js | 105 +
.../node_modules/lodash/string/unescape.js | 33 +
.../node_modules/lodash/string/words.js | 38 +
.../node_modules/lodash/support.js | 10 +
.../node_modules/lodash/utility.js | 18 +
.../node_modules/lodash/utility/attempt.js | 32 +
.../node_modules/lodash/utility/callback.js | 53 +
.../node_modules/lodash/utility/constant.js | 23 +
.../node_modules/lodash/utility/identity.js | 20 +
.../node_modules/lodash/utility/iteratee.js | 1 +
.../node_modules/lodash/utility/matches.js | 33 +
.../lodash/utility/matchesProperty.js | 32 +
.../node_modules/lodash/utility/method.js | 33 +
.../node_modules/lodash/utility/methodOf.js | 32 +
.../node_modules/lodash/utility/mixin.js | 82 +
.../node_modules/lodash/utility/noop.js | 19 +
.../node_modules/lodash/utility/property.js | 31 +
.../node_modules/lodash/utility/propertyOf.js | 30 +
.../node_modules/lodash/utility/range.js | 66 +
.../node_modules/lodash/utility/times.js | 60 +
.../node_modules/lodash/utility/uniqueId.js | 27 +
node_modules/express-validator/package.json | 125 +
.../express-validator/test/asyncTest.js | 111 +
.../test/checkBodySchemaTest.js | 117 +
.../express-validator/test/checkBodyTest.js | 116 +
.../test/checkParamsSchemaTest.js | 132 +
.../express-validator/test/checkParamsTest.js | 119 +
.../test/checkQuerySchemaTest.js | 123 +
.../express-validator/test/checkQueryTest.js | 111 +
.../express-validator/test/checkTest.js | 125 +
.../test/customSanitizersTest.js | 73 +
.../test/formatParamOutputTest.js | 25 +
.../express-validator/test/helpers/app.js | 40 +
.../express-validator/test/helpers/example.js | 29 +
.../test/mappedOutputTest.js | 52 +
.../test/nestedInputSanitizeTest.js | 40 +
.../express-validator/test/nestedInputTest.js | 61 +
.../test/optionalSchemaTest.js | 98 +
.../express-validator/test/optionalTest.js | 81 +
.../express-validator/test/regexRouteTest.js | 51 +
.../test/sanitizeBodyTest.js | 46 +
.../test/sanitizeHeadersTest.js | 45 +
.../test/sanitizeParamsTest.js | 65 +
.../test/sanitizeQueryTest.js | 65 +
.../test/sanitizerResultTest.js | 87 +
.../express-validator/test/sanitizerTest.js | 104 +
.../express-validator/test/withMessageTest.js | 93 +
node_modules/eyes/LICENSE | 20 +
node_modules/eyes/Makefile | 4 +
node_modules/eyes/README.md | 73 +
node_modules/eyes/lib/eyes.js | 236 +
node_modules/eyes/package.json | 87 +
node_modules/eyes/test/eyes-test.js | 56 +
node_modules/isstream/.jshintrc | 59 +
node_modules/isstream/.npmignore | 1 +
node_modules/isstream/.travis.yml | 12 +
.../node_modules/nan => isstream}/LICENSE.md | 6 +-
node_modules/isstream/README.md | 66 +
node_modules/isstream/isstream.js | 27 +
node_modules/isstream/package.json | 85 +
node_modules/isstream/test.js | 168 +
.../mongodb/node_modules/kerberos/.travis.yml | 20 -
.../mongodb/node_modules/kerberos/HISTORY.md | 7 -
.../mongodb/node_modules/kerberos/LICENSE | 201 -
.../mongodb/node_modules/kerberos/README.md | 70 -
.../mongodb/node_modules/kerberos/binding.gyp | 46 -
.../node_modules/kerberos/build/Makefile | 350 -
.../Release/.deps/Release/kerberos.node.d | 1 -
.../obj.target/kerberos/lib/base64.o.d | 4 -
.../obj.target/kerberos/lib/kerberos.o.d | 57 -
.../kerberos/lib/kerberos_context.o.d | 56 -
.../obj.target/kerberos/lib/kerberosgss.o.d | 6 -
.../obj.target/kerberos/lib/worker.o.d | 53 -
.../kerberos/build/Release/kerberos.node | Bin 78976 -> 0 bytes
.../kerberos/build/Release/linker.lock | 0
.../Release/obj.target/kerberos/lib/base64.o | Bin 5680 -> 0 bytes
.../obj.target/kerberos/lib/kerberos.o | Bin 377020 -> 0 bytes
.../kerberos/lib/kerberos_context.o | Bin 187476 -> 0 bytes
.../obj.target/kerberos/lib/kerberosgss.o | Bin 27436 -> 0 bytes
.../Release/obj.target/kerberos/lib/worker.o | Bin 85728 -> 0 bytes
.../kerberos/build/binding.Makefile | 6 -
.../node_modules/kerberos/build/config.gypi | 128 -
.../node_modules/kerberos/build/gyp-mac-tool | 512 -
.../kerberos/build/kerberos.target.mk | 172 -
.../mongodb/node_modules/kerberos/index.js | 6 -
.../kerberos/lib/auth_processes/mongodb.js | 281 -
.../node_modules/kerberos/lib/base64.c | 134 -
.../node_modules/kerberos/lib/base64.h | 22 -
.../node_modules/kerberos/lib/kerberos.cc | 893 --
.../node_modules/kerberos/lib/kerberos.h | 50 -
.../node_modules/kerberos/lib/kerberos.js | 164 -
.../kerberos/lib/kerberos_context.cc | 134 -
.../kerberos/lib/kerberos_context.h | 64 -
.../node_modules/kerberos/lib/kerberosgss.c | 931 --
.../node_modules/kerberos/lib/kerberosgss.h | 73 -
.../mongodb/node_modules/kerberos/lib/sspi.js | 15 -
.../node_modules/kerberos/lib/win32/base64.c | 121 -
.../node_modules/kerberos/lib/win32/base64.h | 18 -
.../kerberos/lib/win32/kerberos.cc | 51 -
.../kerberos/lib/win32/kerberos.h | 60 -
.../kerberos/lib/win32/kerberos_sspi.c | 244 -
.../kerberos/lib/win32/kerberos_sspi.h | 106 -
.../node_modules/kerberos/lib/win32/worker.cc | 7 -
.../node_modules/kerberos/lib/win32/worker.h | 38 -
.../lib/win32/wrappers/security_buffer.cc | 101 -
.../lib/win32/wrappers/security_buffer.h | 48 -
.../lib/win32/wrappers/security_buffer.js | 12 -
.../wrappers/security_buffer_descriptor.cc | 182 -
.../wrappers/security_buffer_descriptor.h | 46 -
.../wrappers/security_buffer_descriptor.js | 3 -
.../lib/win32/wrappers/security_context.cc | 856 --
.../lib/win32/wrappers/security_context.h | 74 -
.../lib/win32/wrappers/security_context.js | 3 -
.../win32/wrappers/security_credentials.cc | 348 -
.../lib/win32/wrappers/security_credentials.h | 68 -
.../win32/wrappers/security_credentials.js | 22 -
.../node_modules/kerberos/lib/worker.cc | 7 -
.../node_modules/kerberos/lib/worker.h | 38 -
.../kerberos/node_modules/nan/.dntrc | 30 -
.../kerberos/node_modules/nan/CHANGELOG.md | 374 -
.../kerberos/node_modules/nan/README.md | 367 -
.../kerberos/node_modules/nan/appveyor.yml | 38 -
.../kerberos/node_modules/nan/doc/.build.sh | 38 -
.../node_modules/nan/doc/asyncworker.md | 97 -
.../kerberos/node_modules/nan/doc/buffers.md | 54 -
.../kerberos/node_modules/nan/doc/callback.md | 52 -
.../node_modules/nan/doc/converters.md | 41 -
.../kerberos/node_modules/nan/doc/errors.md | 226 -
.../node_modules/nan/doc/maybe_types.md | 480 -
.../kerberos/node_modules/nan/doc/methods.md | 624 -
.../kerberos/node_modules/nan/doc/new.md | 141 -
.../node_modules/nan/doc/node_misc.md | 114 -
.../node_modules/nan/doc/persistent.md | 292 -
.../kerberos/node_modules/nan/doc/scopes.md | 73 -
.../kerberos/node_modules/nan/doc/script.md | 38 -
.../node_modules/nan/doc/string_bytes.md | 62 -
.../node_modules/nan/doc/v8_internals.md | 199 -
.../kerberos/node_modules/nan/doc/v8_misc.md | 63 -
.../kerberos/node_modules/nan/include_dirs.js | 1 -
.../kerberos/node_modules/nan/nan.h | 2136 ---
.../kerberos/node_modules/nan/nan_callbacks.h | 88 -
.../node_modules/nan/nan_callbacks_12_inl.h | 512 -
.../nan/nan_callbacks_pre_12_inl.h | 506 -
.../node_modules/nan/nan_converters.h | 64 -
.../node_modules/nan/nan_converters_43_inl.h | 42 -
.../nan/nan_converters_pre_43_inl.h | 42 -
.../nan/nan_implementation_12_inl.h | 399 -
.../nan/nan_implementation_pre_12_inl.h | 259 -
.../node_modules/nan/nan_maybe_43_inl.h | 224 -
.../node_modules/nan/nan_maybe_pre_43_inl.h | 295 -
.../kerberos/node_modules/nan/nan_new.h | 332 -
.../node_modules/nan/nan_object_wrap.h | 155 -
.../node_modules/nan/nan_persistent_12_inl.h | 129 -
.../nan/nan_persistent_pre_12_inl.h | 238 -
.../node_modules/nan/nan_string_bytes.h | 305 -
.../kerberos/node_modules/nan/nan_weak.h | 422 -
.../kerberos/node_modules/nan/package.json | 91 -
.../kerberos/node_modules/nan/tools/1to2.js | 412 -
.../kerberos/node_modules/nan/tools/README.md | 14 -
.../node_modules/nan/tools/package.json | 19 -
.../node_modules/kerberos/package.json | 55 -
.../kerberos/test/kerberos_tests.js | 34 -
.../kerberos/test/kerberos_win32_test.js | 15 -
.../win32/security_buffer_descriptor_tests.js | 41 -
.../test/win32/security_buffer_tests.js | 22 -
.../test/win32/security_credentials_tests.js | 55 -
node_modules/pkginfo/.npmignore | 2 +
node_modules/pkginfo/LICENSE | 19 +
node_modules/pkginfo/README.md | 86 +
node_modules/pkginfo/docs/docco.css | 194 +
node_modules/pkginfo/docs/pkginfo.html | 101 +
.../pkginfo/examples/all-properties.js | 19 +
.../pkginfo/examples/array-argument.js | 20 +
.../pkginfo/examples/multiple-properties.js | 19 +
.../pkginfo/examples/object-argument.js | 22 +
node_modules/pkginfo/examples/package.json | 10 +
.../pkginfo/examples/single-property.js | 19 +
.../pkginfo/examples/subdir/package.json | 11 +
node_modules/pkginfo/examples/target-dir.js | 20 +
node_modules/pkginfo/lib/pkginfo.js | 136 +
node_modules/pkginfo/package.json | 82 +
node_modules/pkginfo/test/pkginfo-test.js | 83 +
node_modules/stack-trace/.npmignore | 1 +
node_modules/stack-trace/License | 19 +
node_modules/stack-trace/Makefile | 11 +
node_modules/stack-trace/Readme.md | 98 +
node_modules/stack-trace/lib/stack-trace.js | 111 +
node_modules/stack-trace/package.json | 81 +
node_modules/validator/.jshintrc | 3 +
node_modules/validator/.npmignore | 3 +
node_modules/validator/.travis.yml | 7 +
node_modules/validator/CHANGELOG.md | 61 +
node_modules/validator/LICENSE | 20 +
node_modules/validator/Makefile | 34 +
node_modules/validator/README.md | 179 +
node_modules/validator/bower.json | 19 +
node_modules/validator/package.json | 92 +
node_modules/validator/test/client-side.js | 26 +
node_modules/validator/test/exports.js | 21 +
node_modules/validator/test/sanitizers.js | 223 +
node_modules/validator/test/validators.js | 2342 +++
node_modules/validator/validator.js | 863 ++
node_modules/validator/validator.min.js | 23 +
node_modules/winston/CHANGELOG.md | 188 +
node_modules/winston/LICENSE | 19 +
node_modules/winston/README.md | 833 ++
node_modules/winston/lib/winston.js | 165 +
node_modules/winston/lib/winston/common.js | 483 +
node_modules/winston/lib/winston/config.js | 68 +
.../winston/lib/winston/config/cli-config.js | 35 +
.../winston/lib/winston/config/npm-config.js | 27 +
.../lib/winston/config/syslog-config.js | 31 +
node_modules/winston/lib/winston/container.js | 127 +
node_modules/winston/lib/winston/exception.js | 56 +
node_modules/winston/lib/winston/logger.js | 723 +
.../winston/lib/winston/transports.js | 29 +
.../winston/lib/winston/transports/console.js | 130 +
.../winston/lib/winston/transports/file.js | 678 +
.../winston/lib/winston/transports/http.js | 232 +
.../winston/lib/winston/transports/memory.js | 89 +
.../lib/winston/transports/transport.js | 135 +
.../winston/node_modules/async/.jshintrc | 24 +
.../winston/node_modules/async/.travis.yml | 5 +
.../winston/node_modules/async/CHANGELOG.md | 16 +
.../winston/node_modules/async/LICENSE | 19 +
.../winston/node_modules/async/README.md | 1720 +++
.../winston/node_modules/async/bower.json | 40 +
.../winston/node_modules/async/component.json | 17 +
.../winston/node_modules/async/lib/async.js | 1283 ++
.../winston/node_modules/async/package.json | 117 +
.../async/support/sync-package-managers.js | 53 +
node_modules/winston/package.json | 114 +
node_modules/winston/test/helpers.js | 256 +
.../winston/test/transports/console-test.js | 202 +
.../test/transports/file-archive-test.js | 83 +
.../test/transports/file-maxfiles-test.js | 102 +
.../test/transports/file-maxsize-test.js | 82 +
.../winston/test/transports/file-open-test.js | 57 +
.../test/transports/file-stress-test.js | 72 +
.../test/transports/file-tailrolling-test.js | 92 +
.../winston/test/transports/file-test.js | 134 +
.../winston/test/transports/http-test.js | 70 +
.../winston/test/transports/memory-test.js | 31 +
.../winston/test/transports/transport.js | 212 +
package.json | 6 +-
public/js/app.js | 290 +-
public/js/controllers.js | 2550 ++--
public/js/controllers/checkLists.js | 36 +-
public/js/controllers/deviceTypes.js | 500 +-
public/js/controllers/devices.js | 50 +-
public/js/controllers/testRuns.js | 18 +-
public/js/directives.js | 1561 +-
server.js | 2 +-
805 files changed, 67409 insertions(+), 24609 deletions(-)
delete mode 100644 app/controllers/clock.js
create mode 100644 app/controllers/db.js
create mode 100644 app/controllers/timesheet.js
create mode 100644 app/model/timeClockException.js
create mode 100644 app/routes/exceptions.js
create mode 100644 app/routes/index.js
create mode 100644 app/routes/misc.js
create mode 100644 app/routes/spans.js
create mode 100644 app/routes/users.js
create mode 100644 app/routes/workorders.js
create mode 100644 app/templates/exception.html.tmpl
create mode 100644 app/templates/exception.text.tmpl
create mode 100644 app/templates/partsRequest.html.tmpl
create mode 100644 app/templates/partsRequest.text.tmpl
create mode 100644 app/util/email.js
create mode 100644 config/db.js
create mode 100644 config/promise.js
create mode 100644 config/validators.js
create mode 100644 node_modules/bluebird/changelog.md
rename node_modules/bluebird/js/{main => release}/any.js (100%)
create mode 100644 node_modules/bluebird/js/release/assert.js
create mode 100644 node_modules/bluebird/js/release/async.js
create mode 100644 node_modules/bluebird/js/release/bind.js
create mode 100644 node_modules/bluebird/js/release/bluebird.js
create mode 100644 node_modules/bluebird/js/release/call_get.js
create mode 100644 node_modules/bluebird/js/release/cancel.js
create mode 100644 node_modules/bluebird/js/release/catch_filter.js
create mode 100644 node_modules/bluebird/js/release/context.js
create mode 100644 node_modules/bluebird/js/release/debuggability.js
create mode 100644 node_modules/bluebird/js/release/direct_resolve.js
create mode 100644 node_modules/bluebird/js/release/each.js
create mode 100644 node_modules/bluebird/js/release/errors.js
rename node_modules/bluebird/js/{main => release}/es5.js (100%)
rename node_modules/bluebird/js/{main => release}/filter.js (100%)
create mode 100644 node_modules/bluebird/js/release/finally.js
create mode 100644 node_modules/bluebird/js/release/generators.js
create mode 100644 node_modules/bluebird/js/release/join.js
create mode 100644 node_modules/bluebird/js/release/map.js
create mode 100644 node_modules/bluebird/js/release/method.js
create mode 100644 node_modules/bluebird/js/release/nodeback.js
create mode 100644 node_modules/bluebird/js/release/nodeify.js
create mode 100644 node_modules/bluebird/js/release/promise.js
create mode 100644 node_modules/bluebird/js/release/promise_array.js
create mode 100644 node_modules/bluebird/js/release/promisify.js
create mode 100644 node_modules/bluebird/js/release/props.js
rename node_modules/bluebird/js/{main => release}/queue.js (100%)
create mode 100644 node_modules/bluebird/js/release/race.js
create mode 100644 node_modules/bluebird/js/release/reduce.js
create mode 100644 node_modules/bluebird/js/release/schedule.js
create mode 100644 node_modules/bluebird/js/release/settle.js
create mode 100644 node_modules/bluebird/js/release/some.js
create mode 100644 node_modules/bluebird/js/release/synchronous_inspection.js
create mode 100644 node_modules/bluebird/js/release/thenables.js
create mode 100644 node_modules/bluebird/js/release/timers.js
create mode 100644 node_modules/bluebird/js/release/using.js
create mode 100644 node_modules/bluebird/js/release/util.js
create mode 100644 node_modules/colors/.travis.yml
create mode 100644 node_modules/colors/MIT-LICENSE.txt
create mode 100644 node_modules/colors/ReadMe.md
create mode 100644 node_modules/colors/examples/normal-usage.js
create mode 100644 node_modules/colors/examples/safe-string.js
create mode 100644 node_modules/colors/lib/colors.js
create mode 100644 node_modules/colors/lib/custom/trap.js
create mode 100644 node_modules/colors/lib/custom/zalgo.js
create mode 100644 node_modules/colors/lib/extendStringPrototype.js
create mode 100644 node_modules/colors/lib/index.js
create mode 100644 node_modules/colors/lib/maps/america.js
create mode 100644 node_modules/colors/lib/maps/rainbow.js
create mode 100644 node_modules/colors/lib/maps/random.js
create mode 100644 node_modules/colors/lib/maps/zebra.js
create mode 100644 node_modules/colors/lib/styles.js
create mode 100644 node_modules/colors/lib/system/supports-colors.js
create mode 100644 node_modules/colors/package.json
create mode 100644 node_modules/colors/safe.js
create mode 100644 node_modules/colors/screenshots/colors.png
create mode 100644 node_modules/colors/tests/basic-test.js
create mode 100644 node_modules/colors/tests/safe-test.js
create mode 100644 node_modules/colors/themes/generic-logging.js
create mode 100644 node_modules/cycle/README.md
create mode 100644 node_modules/cycle/cycle.js
create mode 100644 node_modules/cycle/package.json
create mode 100644 node_modules/express-validator/.editorconfig
create mode 100644 node_modules/express-validator/.jscsrc
create mode 100644 node_modules/express-validator/.jshintrc
create mode 100644 node_modules/express-validator/.npmignore
create mode 100644 node_modules/express-validator/.travis.yml
create mode 100644 node_modules/express-validator/CHANGELOG.md
create mode 100644 node_modules/express-validator/LICENSE
create mode 100644 node_modules/express-validator/README.md
create mode 100644 node_modules/express-validator/index.js
create mode 100644 node_modules/express-validator/lib/express_validator.js
create mode 100644 node_modules/express-validator/node_modules/bluebird/LICENSE
create mode 100644 node_modules/express-validator/node_modules/bluebird/README.md
create mode 100644 node_modules/express-validator/node_modules/bluebird/changelog.md
create mode 100644 node_modules/express-validator/node_modules/bluebird/js/browser/bluebird.js
create mode 100644 node_modules/express-validator/node_modules/bluebird/js/browser/bluebird.min.js
create mode 100644 node_modules/express-validator/node_modules/bluebird/js/main/any.js
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/assert.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/async.js (63%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/bind.js (91%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/bluebird.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/call_get.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/cancel.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/captured_trace.js (99%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/catch_filter.js (98%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/context.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/debuggability.js (86%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/direct_resolve.js (75%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/each.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/errors.js (100%)
create mode 100644 node_modules/express-validator/node_modules/bluebird/js/main/es5.js
create mode 100644 node_modules/express-validator/node_modules/bluebird/js/main/filter.js
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/finally.js (91%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/generators.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/join.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/map.js (95%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/method.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/nodeify.js (85%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/progress.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/promise.js (90%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/promise_array.js (98%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/promise_resolver.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/promisify.js (91%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/props.js (100%)
create mode 100644 node_modules/express-validator/node_modules/bluebird/js/main/queue.js
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/race.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/reduce.js (96%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/schedule.js (57%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/settle.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/some.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/synchronous_inspection.js (100%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/thenables.js (91%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/timers.js (85%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/using.js (93%)
rename node_modules/{ => express-validator/node_modules}/bluebird/js/main/util.js (77%)
create mode 100644 node_modules/express-validator/node_modules/bluebird/package.json
create mode 100644 node_modules/express-validator/node_modules/lodash/LICENSE
create mode 100644 node_modules/express-validator/node_modules/lodash/README.md
create mode 100644 node_modules/express-validator/node_modules/lodash/array.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/chunk.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/compact.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/difference.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/drop.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/dropRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/dropRightWhile.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/dropWhile.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/fill.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/findIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/findLastIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/first.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/flatten.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/flattenDeep.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/head.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/indexOf.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/initial.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/intersection.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/last.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/lastIndexOf.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/object.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/pull.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/pullAt.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/remove.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/rest.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/slice.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/sortedIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/sortedLastIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/tail.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/take.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/takeRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/takeRightWhile.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/takeWhile.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/union.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/uniq.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/unique.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/unzip.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/unzipWith.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/without.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/xor.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/zip.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/zipObject.js
create mode 100644 node_modules/express-validator/node_modules/lodash/array/zipWith.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/chain.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/commit.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/concat.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/lodash.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/plant.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/reverse.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/run.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/tap.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/thru.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/toJSON.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/toString.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/value.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/valueOf.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/wrapperChain.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/wrapperCommit.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/wrapperConcat.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/wrapperPlant.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/wrapperReverse.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/wrapperToString.js
create mode 100644 node_modules/express-validator/node_modules/lodash/chain/wrapperValue.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/all.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/any.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/at.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/collect.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/contains.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/countBy.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/detect.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/each.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/eachRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/every.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/filter.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/find.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/findLast.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/findWhere.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/foldl.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/foldr.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/forEach.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/forEachRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/groupBy.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/include.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/includes.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/indexBy.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/inject.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/invoke.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/map.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/max.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/min.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/partition.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/pluck.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/reduce.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/reduceRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/reject.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/sample.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/select.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/shuffle.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/size.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/some.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/sortBy.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/sortByAll.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/sortByOrder.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/sum.js
create mode 100644 node_modules/express-validator/node_modules/lodash/collection/where.js
create mode 100644 node_modules/express-validator/node_modules/lodash/date.js
create mode 100644 node_modules/express-validator/node_modules/lodash/date/now.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/after.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/ary.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/backflow.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/before.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/bind.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/bindAll.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/bindKey.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/compose.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/curry.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/curryRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/debounce.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/defer.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/delay.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/flow.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/flowRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/memoize.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/modArgs.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/negate.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/once.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/partial.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/partialRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/rearg.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/restParam.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/spread.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/throttle.js
create mode 100644 node_modules/express-validator/node_modules/lodash/function/wrap.js
create mode 100644 node_modules/express-validator/node_modules/lodash/index.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/LazyWrapper.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/LodashWrapper.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/MapCache.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/SetCache.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayConcat.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayCopy.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayEach.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayEachRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayEvery.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayExtremum.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayFilter.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayMap.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayPush.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayReduce.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arrayReduceRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arraySome.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/arraySum.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/assignDefaults.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/assignOwnDefaults.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/assignWith.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseAssign.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseAt.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseCallback.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseClone.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseCompareAscending.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseCopy.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseCreate.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseDelay.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseDifference.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseEach.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseEachRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseEvery.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseExtremum.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseFill.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseFilter.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseFind.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseFindIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseFlatten.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseFor.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseForIn.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseForOwn.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseForOwnRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseForRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseFunctions.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseGet.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseIndexOf.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseIsEqual.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseIsEqualDeep.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseIsFunction.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseIsMatch.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseLodash.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseMap.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseMatches.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseMatchesProperty.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseMerge.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseMergeDeep.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseProperty.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/basePropertyDeep.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/basePullAt.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseRandom.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseReduce.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseSetData.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseSlice.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseSome.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseSortBy.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseSortByOrder.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseSum.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseToString.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseUniq.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseValues.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseWhile.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/baseWrapperValue.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/binaryIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/binaryIndexBy.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/bindCallback.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/bufferClone.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/cacheIndexOf.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/cachePush.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/charsLeftIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/charsRightIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/compareAscending.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/compareMultiple.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/composeArgs.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/composeArgsRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createAggregator.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createAssigner.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createBaseEach.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createBaseFor.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createBindWrapper.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createCache.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createCompounder.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createCtorWrapper.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createCurry.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createDefaults.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createExtremum.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createFind.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createFindIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createFindKey.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createFlow.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createForEach.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createForIn.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createForOwn.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createHybridWrapper.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createObjectMapper.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createPadDir.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createPadding.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createPartial.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createPartialWrapper.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createReduce.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createRound.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createSortedIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/createWrapper.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/deburrLetter.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/equalArrays.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/equalByTag.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/equalObjects.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/escapeHtmlChar.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/escapeRegExpChar.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/escapeStringChar.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/getData.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/getFuncName.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/getLength.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/getMatchData.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/getNative.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/getView.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/indexOfNaN.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/initCloneArray.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/initCloneByTag.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/initCloneObject.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/invokePath.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/isArrayLike.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/isIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/isIterateeCall.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/isKey.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/isLaziable.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/isLength.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/isObjectLike.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/isSpace.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/isStrictComparable.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/lazyClone.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/lazyReverse.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/lazyValue.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/mapDelete.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/mapGet.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/mapHas.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/mapSet.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/mergeData.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/mergeDefaults.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/metaMap.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/pickByArray.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/pickByCallback.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/reEscape.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/reEvaluate.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/reInterpolate.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/realNames.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/reorder.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/replaceHolders.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/setData.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/shimKeys.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/sortedUniq.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/toIterable.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/toObject.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/toPath.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/trimmedLeftIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/trimmedRightIndex.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/unescapeHtmlChar.js
create mode 100644 node_modules/express-validator/node_modules/lodash/internal/wrapperClone.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/clone.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/cloneDeep.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/eq.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/gt.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/gte.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isArguments.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isArray.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isBoolean.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isDate.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isElement.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isEmpty.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isEqual.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isError.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isFinite.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isFunction.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isMatch.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isNaN.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isNative.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isNull.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isNumber.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isObject.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isPlainObject.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isRegExp.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isString.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isTypedArray.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/isUndefined.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/lt.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/lte.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/toArray.js
create mode 100644 node_modules/express-validator/node_modules/lodash/lang/toPlainObject.js
create mode 100644 node_modules/express-validator/node_modules/lodash/math.js
create mode 100644 node_modules/express-validator/node_modules/lodash/math/add.js
create mode 100644 node_modules/express-validator/node_modules/lodash/math/ceil.js
create mode 100644 node_modules/express-validator/node_modules/lodash/math/floor.js
create mode 100644 node_modules/express-validator/node_modules/lodash/math/max.js
create mode 100644 node_modules/express-validator/node_modules/lodash/math/min.js
create mode 100644 node_modules/express-validator/node_modules/lodash/math/round.js
create mode 100644 node_modules/express-validator/node_modules/lodash/math/sum.js
create mode 100644 node_modules/express-validator/node_modules/lodash/number.js
create mode 100644 node_modules/express-validator/node_modules/lodash/number/inRange.js
create mode 100644 node_modules/express-validator/node_modules/lodash/number/random.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/assign.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/create.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/defaults.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/defaultsDeep.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/extend.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/findKey.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/findLastKey.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/forIn.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/forInRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/forOwn.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/forOwnRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/functions.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/get.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/has.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/invert.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/keys.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/keysIn.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/mapKeys.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/mapValues.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/merge.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/methods.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/omit.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/pairs.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/pick.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/result.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/set.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/transform.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/values.js
create mode 100644 node_modules/express-validator/node_modules/lodash/object/valuesIn.js
create mode 100644 node_modules/express-validator/node_modules/lodash/package.json
create mode 100644 node_modules/express-validator/node_modules/lodash/string.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/camelCase.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/capitalize.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/deburr.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/endsWith.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/escape.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/escapeRegExp.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/kebabCase.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/pad.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/padLeft.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/padRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/parseInt.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/repeat.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/snakeCase.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/startCase.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/startsWith.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/template.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/templateSettings.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/trim.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/trimLeft.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/trimRight.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/trunc.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/unescape.js
create mode 100644 node_modules/express-validator/node_modules/lodash/string/words.js
create mode 100644 node_modules/express-validator/node_modules/lodash/support.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/attempt.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/callback.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/constant.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/identity.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/iteratee.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/matches.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/matchesProperty.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/method.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/methodOf.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/mixin.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/noop.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/property.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/propertyOf.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/range.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/times.js
create mode 100644 node_modules/express-validator/node_modules/lodash/utility/uniqueId.js
create mode 100644 node_modules/express-validator/package.json
create mode 100644 node_modules/express-validator/test/asyncTest.js
create mode 100644 node_modules/express-validator/test/checkBodySchemaTest.js
create mode 100644 node_modules/express-validator/test/checkBodyTest.js
create mode 100644 node_modules/express-validator/test/checkParamsSchemaTest.js
create mode 100644 node_modules/express-validator/test/checkParamsTest.js
create mode 100644 node_modules/express-validator/test/checkQuerySchemaTest.js
create mode 100644 node_modules/express-validator/test/checkQueryTest.js
create mode 100644 node_modules/express-validator/test/checkTest.js
create mode 100644 node_modules/express-validator/test/customSanitizersTest.js
create mode 100644 node_modules/express-validator/test/formatParamOutputTest.js
create mode 100644 node_modules/express-validator/test/helpers/app.js
create mode 100644 node_modules/express-validator/test/helpers/example.js
create mode 100644 node_modules/express-validator/test/mappedOutputTest.js
create mode 100644 node_modules/express-validator/test/nestedInputSanitizeTest.js
create mode 100644 node_modules/express-validator/test/nestedInputTest.js
create mode 100644 node_modules/express-validator/test/optionalSchemaTest.js
create mode 100644 node_modules/express-validator/test/optionalTest.js
create mode 100644 node_modules/express-validator/test/regexRouteTest.js
create mode 100644 node_modules/express-validator/test/sanitizeBodyTest.js
create mode 100644 node_modules/express-validator/test/sanitizeHeadersTest.js
create mode 100644 node_modules/express-validator/test/sanitizeParamsTest.js
create mode 100644 node_modules/express-validator/test/sanitizeQueryTest.js
create mode 100644 node_modules/express-validator/test/sanitizerResultTest.js
create mode 100644 node_modules/express-validator/test/sanitizerTest.js
create mode 100644 node_modules/express-validator/test/withMessageTest.js
create mode 100644 node_modules/eyes/LICENSE
create mode 100644 node_modules/eyes/Makefile
create mode 100644 node_modules/eyes/README.md
create mode 100644 node_modules/eyes/lib/eyes.js
create mode 100644 node_modules/eyes/package.json
create mode 100644 node_modules/eyes/test/eyes-test.js
create mode 100644 node_modules/isstream/.jshintrc
create mode 100644 node_modules/isstream/.npmignore
create mode 100644 node_modules/isstream/.travis.yml
rename node_modules/{mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan => isstream}/LICENSE.md (87%)
create mode 100644 node_modules/isstream/README.md
create mode 100644 node_modules/isstream/isstream.js
create mode 100644 node_modules/isstream/package.json
create mode 100644 node_modules/isstream/test.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/.travis.yml
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/HISTORY.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/LICENSE
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/README.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/binding.gyp
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Makefile
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/.deps/Release/kerberos.node.d
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/.deps/Release/obj.target/kerberos/lib/base64.o.d
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/.deps/Release/obj.target/kerberos/lib/kerberos.o.d
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/.deps/Release/obj.target/kerberos/lib/kerberos_context.o.d
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/.deps/Release/obj.target/kerberos/lib/kerberosgss.o.d
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/.deps/Release/obj.target/kerberos/lib/worker.o.d
delete mode 100755 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/kerberos.node
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/linker.lock
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/obj.target/kerberos/lib/base64.o
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/obj.target/kerberos/lib/kerberos.o
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/obj.target/kerberos/lib/kerberos_context.o
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/obj.target/kerberos/lib/kerberosgss.o
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/Release/obj.target/kerberos/lib/worker.o
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/binding.Makefile
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/config.gypi
delete mode 100755 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/gyp-mac-tool
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/build/kerberos.target.mk
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/index.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/auth_processes/mongodb.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/base64.c
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/base64.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/kerberos.cc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/kerberos.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/kerberos.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/kerberos_context.cc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/kerberos_context.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/kerberosgss.c
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/kerberosgss.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/sspi.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/base64.c
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/base64.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/kerberos.cc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/kerberos.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/kerberos_sspi.c
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/kerberos_sspi.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/worker.cc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/worker.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_buffer.cc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_buffer.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_buffer.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_buffer_descriptor.cc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_buffer_descriptor.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_buffer_descriptor.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_context.cc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_context.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_context.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_credentials.cc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_credentials.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/win32/wrappers/security_credentials.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/worker.cc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/lib/worker.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/.dntrc
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/CHANGELOG.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/README.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/appveyor.yml
delete mode 100755 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/.build.sh
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/asyncworker.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/buffers.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/callback.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/converters.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/errors.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/maybe_types.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/methods.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/new.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/node_misc.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/persistent.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/scopes.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/script.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/string_bytes.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/v8_internals.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/doc/v8_misc.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/include_dirs.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_callbacks.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_callbacks_12_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_callbacks_pre_12_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_converters.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_converters_43_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_converters_pre_43_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_implementation_12_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_implementation_pre_12_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_maybe_43_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_maybe_pre_43_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_new.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_object_wrap.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_persistent_12_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_persistent_pre_12_inl.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_string_bytes.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/nan_weak.h
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/package.json
delete mode 100755 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/tools/1to2.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/tools/README.md
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/node_modules/nan/tools/package.json
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/package.json
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/test/kerberos_tests.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/test/kerberos_win32_test.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/test/win32/security_buffer_descriptor_tests.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/test/win32/security_buffer_tests.js
delete mode 100644 node_modules/mongoose/node_modules/mongodb/node_modules/kerberos/test/win32/security_credentials_tests.js
create mode 100644 node_modules/pkginfo/.npmignore
create mode 100644 node_modules/pkginfo/LICENSE
create mode 100644 node_modules/pkginfo/README.md
create mode 100644 node_modules/pkginfo/docs/docco.css
create mode 100644 node_modules/pkginfo/docs/pkginfo.html
create mode 100644 node_modules/pkginfo/examples/all-properties.js
create mode 100644 node_modules/pkginfo/examples/array-argument.js
create mode 100644 node_modules/pkginfo/examples/multiple-properties.js
create mode 100644 node_modules/pkginfo/examples/object-argument.js
create mode 100644 node_modules/pkginfo/examples/package.json
create mode 100644 node_modules/pkginfo/examples/single-property.js
create mode 100644 node_modules/pkginfo/examples/subdir/package.json
create mode 100644 node_modules/pkginfo/examples/target-dir.js
create mode 100644 node_modules/pkginfo/lib/pkginfo.js
create mode 100644 node_modules/pkginfo/package.json
create mode 100644 node_modules/pkginfo/test/pkginfo-test.js
create mode 100644 node_modules/stack-trace/.npmignore
create mode 100644 node_modules/stack-trace/License
create mode 100644 node_modules/stack-trace/Makefile
create mode 100644 node_modules/stack-trace/Readme.md
create mode 100644 node_modules/stack-trace/lib/stack-trace.js
create mode 100644 node_modules/stack-trace/package.json
create mode 100644 node_modules/validator/.jshintrc
create mode 100644 node_modules/validator/.npmignore
create mode 100644 node_modules/validator/.travis.yml
create mode 100644 node_modules/validator/CHANGELOG.md
create mode 100644 node_modules/validator/LICENSE
create mode 100644 node_modules/validator/Makefile
create mode 100644 node_modules/validator/README.md
create mode 100644 node_modules/validator/bower.json
create mode 100644 node_modules/validator/package.json
create mode 100644 node_modules/validator/test/client-side.js
create mode 100644 node_modules/validator/test/exports.js
create mode 100644 node_modules/validator/test/sanitizers.js
create mode 100644 node_modules/validator/test/validators.js
create mode 100644 node_modules/validator/validator.js
create mode 100644 node_modules/validator/validator.min.js
create mode 100644 node_modules/winston/CHANGELOG.md
create mode 100644 node_modules/winston/LICENSE
create mode 100644 node_modules/winston/README.md
create mode 100644 node_modules/winston/lib/winston.js
create mode 100644 node_modules/winston/lib/winston/common.js
create mode 100644 node_modules/winston/lib/winston/config.js
create mode 100644 node_modules/winston/lib/winston/config/cli-config.js
create mode 100644 node_modules/winston/lib/winston/config/npm-config.js
create mode 100644 node_modules/winston/lib/winston/config/syslog-config.js
create mode 100644 node_modules/winston/lib/winston/container.js
create mode 100644 node_modules/winston/lib/winston/exception.js
create mode 100755 node_modules/winston/lib/winston/logger.js
create mode 100644 node_modules/winston/lib/winston/transports.js
create mode 100644 node_modules/winston/lib/winston/transports/console.js
create mode 100644 node_modules/winston/lib/winston/transports/file.js
create mode 100644 node_modules/winston/lib/winston/transports/http.js
create mode 100644 node_modules/winston/lib/winston/transports/memory.js
create mode 100644 node_modules/winston/lib/winston/transports/transport.js
create mode 100644 node_modules/winston/node_modules/async/.jshintrc
create mode 100644 node_modules/winston/node_modules/async/.travis.yml
create mode 100644 node_modules/winston/node_modules/async/CHANGELOG.md
create mode 100644 node_modules/winston/node_modules/async/LICENSE
create mode 100644 node_modules/winston/node_modules/async/README.md
create mode 100644 node_modules/winston/node_modules/async/bower.json
create mode 100644 node_modules/winston/node_modules/async/component.json
create mode 100644 node_modules/winston/node_modules/async/lib/async.js
create mode 100644 node_modules/winston/node_modules/async/package.json
create mode 100755 node_modules/winston/node_modules/async/support/sync-package-managers.js
create mode 100644 node_modules/winston/package.json
create mode 100644 node_modules/winston/test/helpers.js
create mode 100644 node_modules/winston/test/transports/console-test.js
create mode 100644 node_modules/winston/test/transports/file-archive-test.js
create mode 100644 node_modules/winston/test/transports/file-maxfiles-test.js
create mode 100644 node_modules/winston/test/transports/file-maxsize-test.js
create mode 100644 node_modules/winston/test/transports/file-open-test.js
create mode 100644 node_modules/winston/test/transports/file-stress-test.js
create mode 100644 node_modules/winston/test/transports/file-tailrolling-test.js
create mode 100644 node_modules/winston/test/transports/file-test.js
create mode 100644 node_modules/winston/test/transports/http-test.js
create mode 100644 node_modules/winston/test/transports/memory-test.js
create mode 100644 node_modules/winston/test/transports/transport.js
diff --git a/app/controllers/clock.js b/app/controllers/clock.js
deleted file mode 100644
index c6a8f14..0000000
--- a/app/controllers/clock.js
+++ /dev/null
@@ -1,42 +0,0 @@
-var mongoose = require('mongoose'),
- Clock = mongoose.model('Clock');
-
-module.exports = function(piler) {
- return {
- index: function(req, res, next) {
- host = String(req.headers['x-forwarded-host']);
- host = host.split(':')[0];
-
- if (host != 'clock.atlb.co') {
- return next();
- }
-
- if (!req.user) {
- req.session.redirectUrl = req.url
- }
-
- var path = req.path.slice(1);
-
- res.render('clock.jade', {
- css: piler.css.renderTags()
- });
- },
- post: function(req, res) {
- var clock = new Clock({
- tech: req.user,
- action: req.body.action,
- lat: req.body.lat,
- long: req.body.long,
- dt: new Date()
- });
-
- clock.save(function(err, result) {
- if (err) {
- return res.json(500, err);
- } else {
- res.json(result);
- }
- });
- }
- }
-}
diff --git a/app/controllers/db.js b/app/controllers/db.js
new file mode 100644
index 0000000..b530bf6
--- /dev/null
+++ b/app/controllers/db.js
@@ -0,0 +1,64 @@
+var mongoose = require('mongoose');
+
+var TimeClockSpan = mongoose.model('TimeClockSpan');
+var Workorder = mongoose.model('Workorder');
+
+var db = {};
+
+db.spans = {
+ forWeek: function(week) {
+ const startOfWeek = week.clone();
+ const endOfWeek = week.clone().endOf('week');
+
+ const query = {
+ start: {
+ $gte: startOfWeek,
+ $lte: endOfWeek
+ }
+ };
+
+ return TimeClockSpan.find(query);
+ },
+ forWeekByUser: function(week, user) {
+ const startOfWeek = week.clone();
+ const endOfWeek = week.clone().endOf('week');
+
+ const query = {
+ start: {
+ $gte: startOfWeek,
+ $lte: endOfWeek
+ },
+ user: user
+ };
+
+ return TimeClockSpan.find(query);
+ }
+};
+
+db.workorders = {
+ findByIds: function(ids) {
+ const query = {
+ _id: {
+ $in: ids
+ }
+ };
+
+ return Workorder.find(query);
+ }
+};
+
+module.exports = db;
+
+
+function findWorkordersById(ids) {
+ const query = {
+ _id: {
+ $in: ids
+ }
+ };
+
+ return Workorder
+ .find(query)
+ .populate('client', 'name identifier')
+ .exec();
+}
\ No newline at end of file
diff --git a/app/controllers/pms.js b/app/controllers/pms.js
index 6585bf7..e1e9027 100644
--- a/app/controllers/pms.js
+++ b/app/controllers/pms.js
@@ -155,9 +155,9 @@ function getPmsByDate(year, month) {
];
}
- return Workorder.aggregateAsync(pipeline)
+ return Workorder.aggregate(pipeline)
+ .exec()
.then(function(pmsData) {
-
var data = {};
if (month !== undefined) {
@@ -183,12 +183,13 @@ function getPmsByDate(year, month) {
}
function getClients() {
- return Client.find({ deleted: false })
+ return Client
+ .find({ deleted: false })
.lean()
.select('name identifier frequencies')
.slice('contacts', 1)
.sort('name')
- .execAsync();
+ .exec();
}
function filterClientsByFrequency(month, frequency) {
diff --git a/app/controllers/timeclock.js b/app/controllers/timeclock.js
index 1f0ac1b..9e4bd5b 100644
--- a/app/controllers/timeclock.js
+++ b/app/controllers/timeclock.js
@@ -5,516 +5,597 @@ var moment = require('moment-timezone');
var _ = require('lodash');
var Promise = require('bluebird');
var TimeClockSpan = mongoose.model('TimeClockSpan');
+var TimeClockException = mongoose.model('TimeClockException');
var Workorder = mongoose.model('Workorder');
+var email = require('../util/email');
+var config = require('../../config/config')['prod'];
var NON_BILLABLES = ['shop', 'break', 'pto', 'meeting', 'event', 'weather', 'holiday'];
var TASK_TYPES = ['workday', 'workorder', 'nonBillable'];
-function MultipleSpansError(spans) {
- Error.captureStackTrace(this, MultipleSpansError);
+var exceptionTemplate = email.template(
+ 'exception.html.tmpl',
+ 'exception.text.tmpl',
+ 'Exception',
+ [
+ 'techName',
+ 'date',
+ 'message'
+ ]
+);
- this.name = 'MultipleSpansError';
- this.message = 'Encountered multiple spans when one was expected';
- this.spans = spans;
+function MultipleSpansError(spans) {
+ Error.captureStackTrace(this, MultipleSpansError);
+
+ this.name = 'MultipleSpansError';
+ this.message = 'Encountered multiple spans when one was expected';
+ this.spans = spans;
}
MultipleSpansError.prototype = Object.create(Error.prototype);
function findUserSpans(user, day) {
- var startOfDay = day.clone().startOf('day').utc().toDate();
- var endOfDay = day.clone().endOf('day').utc().toDate();
+ var startOfDay = day.clone().startOf('day').toDate();
+ var endOfDay = day.clone().endOf('day').toDate();
- var query = {
- start: {
- '$gte': startOfDay,
- '$lte': endOfDay
- },
- user: user.id
- };
+ var query = {
+ start: {
+ '$gte': startOfDay,
+ '$lte': endOfDay
+ },
+ user: user
+ };
- return TimeClockSpan
- .find(query)
- .exec();
+ return TimeClockSpan
+ .find(query)
+ .exec();
}
function findUserWorkorders(user, day) {
- var startOfDay = day.clone().startOf('day').toDate();
- var endOfDay = day.clone().endOf('day').toDate();
+ var startOfDay = day.clone().startOf('day').toDate();
+ var endOfDay = day.clone().endOf('day').toDate();
- var query = {
- deleted: false,
- techs: user.id,
- 'scheduling.start': {
- '$lte': endOfDay
- },
- 'scheduling.end': {
- '$gte': startOfDay
- }
- };
+ var query = {
+ deleted: false,
+ techs: user.id,
+ 'scheduling.start': {
+ '$lte': endOfDay
+ },
+ 'scheduling.end': {
+ '$gte': startOfDay
+ }
+ };
- return Workorder
- .find(query)
- .populate('client', 'name identifier')
- .exec();
+ return Workorder
+ .find(query)
+ .populate('client', 'name identifier')
+ .exec();
}
function findUserWorkorder(id, user) {
- var query = {
- _id: id,
- techs: user.id,
- deleted: false
- };
+ var query = {
+ _id: id,
+ techs: user.id,
+ deleted: false
+ };
- return Workorder
- .findOne(query)
- .populate('client', 'name identifier contacts address')
- .exec();
+ return Workorder
+ .findOne(query)
+ .populate('client', 'name identifier contacts address')
+ .exec();
}
function filterSpans(spans, filter) {
- filter = {
- type: filter.type ? [].concat(filter.type) : undefined,
- status: filter.status ? String(filter.status) : undefined,
- workorder: filter.workorder ? String(filter.workorder) : undefined,
- reason: filter.reason ? String(filter.reason) : undefined
- };
+ filter = {
+ type: filter.type ? [].concat(filter.type) : undefined,
+ status: filter.status ? String(filter.status) : undefined,
+ workorder: filter.workorder ? String(filter.workorder) : undefined,
+ reason: filter.reason ? String(filter.reason) : undefined
+ };
- return _.chain(spans)
- .filter(function(span) {
+ return _.chain(spans)
+ .filter(function (span) {
- if (filter.type && filter.type.indexOf(span.type) === -1) {
- return false;
- }
+ if (filter.type && filter.type.indexOf(span.type) === -1) {
+ return false;
+ }
- if (filter.status && String(span.status) !== filter.status) {
- return false;
- }
+ if (filter.status && String(span.status) !== filter.status) {
+ return false;
+ }
- if (filter.workorder && String(span.workorder) !== filter.workorder) {
- return false;
- }
+ if (filter.workorder && String(span.workorder) !== filter.workorder) {
+ return false;
+ }
- if (filter.reason && span.reason !== filter.reason) {
- return false;
- }
+ if (filter.reason && span.reason !== filter.reason) {
+ return false;
+ }
- return true;
- })
- .sortBy('start')
- .value();
+ return true;
+ })
+ .sortBy('start')
+ .value();
}
function spansStatus(spans, filter) {
- if (filter) {
- spans = filterSpans(spans, filter);
+ if (filter) {
+ spans = filterSpans(spans, filter);
+ }
+
+ var result = 'pending';
+ _.forEach(spans, function (span) {
+ if (span.status === 'open') {
+ result = 'clockedIn';
+ return false;
+ } else {
+ result = 'clockedOut';
}
+ });
- var result = 'pending';
- _.forEach(spans, function(span) {
- if (span.status === 'open') {
- result = 'clockedIn';
- return false;
- } else {
- result = 'clockedOut';
- }
- });
-
- return result;
+ return result;
}
function validateClockRequest(req) {
- return new Promise(function (resolve, reject) {
+ return new Promise(function (resolve, reject) {
- var params = {};
+ var params = {};
- var type = req.body.type;
- if (!type) {
- return reject("Missing required parameter 'type'");
- }
+ var type = req.body.type;
+ if (!type) {
+ return reject("Missing required parameter 'type'");
+ }
- if (TASK_TYPES.indexOf(type) === -1) {
- return reject("Invalid type: '" + type + "'");
- }
+ if (TASK_TYPES.indexOf(type) === -1) {
+ return reject("Invalid type: '" + type + "'");
+ }
- params.type = type;
+ params.type = type;
- if (type === 'workorder') {
- var id = req.body.id;
- if (!id) {
- return reject("Missing required parameter 'id'");
- }
+ if (type === 'workorder') {
+ var id = req.body.id;
+ if (!id) {
+ return reject("Missing required parameter 'id'");
+ }
- params.id = id;
- }
+ params.id = id;
+ }
- if (type === 'nonBillable') {
- var reason = req.body.reason;
- if (!reason) {
- return reject("Missing required parameter 'reason'");
- }
+ if (type === 'nonBillable') {
+ var reason = req.body.reason;
+ if (!reason) {
+ return reject("Missing required parameter 'reason'");
+ }
- if (NON_BILLABLES.indexOf(reason) === -1) {
- return reject("Invalid reason: '" + reason + "'");
- }
+ if (NON_BILLABLES.indexOf(reason) === -1) {
+ return reject("Invalid reason: '" + reason + "'");
+ }
- params.reason = reason;
- }
+ params.reason = reason;
+ }
- resolve(params);
- });
+ resolve(params);
+ });
}
function validateWorkorderDetailsRequest(req) {
- var params = {};
+ var params = {};
- var id = req.param('id');
- if (!id) {
- return Promise.reject("Missing required parameter 'id'");
- }
+ var id = req.param('id');
+ if (!id) {
+ return Promise.reject("Missing required parameter 'id'");
+ }
- params.id = id;
+ params.id = id;
- return Promise.resolve(params);
+ return Promise.resolve(params);
}
function handleStatusRequest(spans, workorders) {
- var results = {};
+ var results = {};
- var workdaySpans = _.filter(spans, { type: 'workday' });
+ var workdaySpans = _.filter(spans, {type: 'workday'});
- results.tasks = [];
+ results.tasks = [];
- results.tasks = results.tasks.concat({
- type: 'workday',
- status: spansStatus(workdaySpans),
- spans: _.map(workdaySpans, spanToResponse)
- });
+ results.tasks = results.tasks.concat({
+ type: 'workday',
+ status: spansStatus(workdaySpans),
+ spans: _.map(workdaySpans, spanToResponse)
+ });
- results.tasks = results.tasks.concat(_.chain(workorders)
- .sortBy('scheduling.start')
- .map(function(workorder) {
- var workorderSpans = filterSpans(spans, { type: 'workorder', workorder: workorder.id });
+ results.tasks = results.tasks.concat(_.chain(workorders)
+ .sortBy('scheduling.start')
+ .map(function (workorder) {
+ var workorderSpans = filterSpans(spans, {type: 'workorder', workorder: workorder.id});
- return {
- type: 'workorder',
- id: workorder.id,
- title: workorder.client.name,
- start: moment(workorder.scheduling.start).utc().toISOString(),
- end: moment(workorder.scheduling.end).utc().toISOString(),
- status: spansStatus(workorderSpans),
- spans: _.map(workorderSpans, spanToResponse)
- };
- })
- .value()
- );
+ return {
+ type: 'workorder',
+ id: workorder.id,
+ title: workorder.client.name,
+ start: moment(workorder.scheduling.start).utc().toISOString(),
+ end: moment(workorder.scheduling.end).utc().toISOString(),
+ status: spansStatus(workorderSpans),
+ spans: _.map(workorderSpans, spanToResponse)
+ };
+ })
+ .value()
+ );
- results.tasks = results.tasks.concat(_.chain(NON_BILLABLES)
- .map(function(nonBillable) {
- var nonBillableSpans = filterSpans(spans, { reason: nonBillable });
+ results.tasks = results.tasks.concat(_.chain(NON_BILLABLES)
+ .map(function (nonBillable) {
+ var nonBillableSpans = filterSpans(spans, {reason: nonBillable});
- return {
- type: 'nonBillable',
- reason: nonBillable,
- status: spansStatus(nonBillableSpans),
- spans: _.map(nonBillableSpans, spanToResponse)
- };
- })
- .value()
- );
+ return {
+ type: 'nonBillable',
+ reason: nonBillable,
+ status: spansStatus(nonBillableSpans),
+ spans: _.map(nonBillableSpans, spanToResponse)
+ };
+ })
+ .value()
+ );
- return results;
+ return results;
}
function handleClockInRequest(params, user, spans, workorders, now) {
- var workdayStatus = spansStatus(spans, { type: 'workday' });
+ var workdayStatus = spansStatus(spans, {type: 'workday'});
- if (params.type === 'workday') {
- if (workdayStatus === 'clockedIn') {
- return Promise.reject('Already clocked in');
- }
-
- var span = new TimeClockSpan({
- user: user.id,
- type: 'workday',
- status: 'open',
- start: now.clone().utc().toDate()
- });
-
- } else {
- if (workdayStatus !== 'clockedIn') {
- return Promise.reject('Not clocked into day');
- }
-
- var allTasksStatus = spansStatus(spans, {type: ['workorder', 'nonBillable']});
- if (allTasksStatus === 'clockedIn') {
- return Promise.reject('Already clocked in');
- }
-
- if (params.type === 'workorder') {
- var workorder = _.find(workorders, {id: params.id});
- if (!workorder) {
- return Promise.reject('Invalid workorder');
- }
-
- handleClockInExceptions(user, workorder, spans, now);
-
- var span = new TimeClockSpan({
- user: user.id,
- type: 'workorder',
- status: 'open',
- start: now.clone().utc().toDate(),
- workorder: workorder.id,
- client: workorder.client.id
- });
- }
-
- if (params.type === 'nonBillable') {
- var span = new TimeClockSpan({
- user: user.id,
- type: 'nonBillable',
- status: 'open',
- start: now.clone().utc().toDate(),
- reason: params.reason
- });
- }
+ if (params.type === 'workday') {
+ if (workdayStatus === 'clockedIn') {
+ return Promise.reject('Already clocked in');
}
- return span.save().then(spanToResponse);
+ var span = new TimeClockSpan({
+ user: user.id,
+ type: 'workday',
+ status: 'open',
+ start: now.clone().utc().toDate()
+ });
+
+ } else {
+ if (workdayStatus !== 'clockedIn') {
+ return Promise.reject('Not clocked into day');
+ }
+
+ var allTasksStatus = spansStatus(spans, {type: ['workorder', 'nonBillable']});
+ if (allTasksStatus === 'clockedIn') {
+ return Promise.reject('Already clocked in');
+ }
+
+ if (params.type === 'workorder') {
+ var workorder = _.find(workorders, {id: params.id});
+ if (!workorder) {
+ return Promise.reject('Invalid workorder');
+ }
+
+ handleClockInExceptions(user, workorder, spans, now);
+
+ var span = new TimeClockSpan({
+ user: user.id,
+ type: 'workorder',
+ status: 'open',
+ start: now.clone().utc().toDate(),
+ workorder: workorder.id,
+ client: workorder.client.id
+ });
+ }
+
+ if (params.type === 'nonBillable') {
+ var span = new TimeClockSpan({
+ user: user.id,
+ type: 'nonBillable',
+ status: 'open',
+ start: now.clone().utc().toDate(),
+ reason: params.reason
+ });
+ }
+ }
+
+ return span.save().then(spanToResponse);
}
function handleClockInExceptions(user, workorder, spans, now) {
- var closedWorkordersSpans = filterSpans(spans, { type: 'workorder', status: 'closed' });
- var isFirstWorkorder = closedWorkordersSpans.length == 0;
+ var closedWorkordersSpans = filterSpans(spans, {type: 'workorder', status: 'closed'});
+ var isFirstWorkorder = closedWorkordersSpans.length == 0;
- if (isFirstWorkorder) {
- var start = moment(workorder.scheduling.start);
- var minutes = now.diff(start, 'minutes');
+ if (isFirstWorkorder) {
+ var start = moment(workorder.scheduling.start);
+ var minutes = now.diff(start, 'minutes');
- if (minutes > 15) {
- reportException({
- user: user,
- workorder: workorder,
- reason: 'User is late to first workorder.'
- });
- }
- } else {
- var previousWorkorderSpan = _.last(closedWorkordersSpans);
+ if (minutes > 15) {
- if (previousWorkorderSpan.workorder != workorder.id) {
- console.log(previousWorkorderSpan);
+ new TimeClockException({
+ user: user._id,
+ date: new Date(),
+ reason: 'late_to_first_workorder'
+ }).save();
- var end = moment(previousWorkorderSpan.end);
- var minutes = now.diff(end, 'minutes');
- console.log("Time between tasks: ", minutes);
-
- if (minutes < 5) {
- reportException({
- user: user,
- workorder: workorder,
- reason: 'User clocked in to next workorder too quickly.'
- });
- }
-
- if (minutes > 75) {
- reportException({
- user: user,
- workorder: workorder,
- reason: 'Too much travel time detected between jobs.'
- });
- }
- }
+ reportException({
+ user: user,
+ workorder: workorder,
+ reason: 'User is late to first workorder.'
+ });
}
+ } else {
+ var previousWorkorderSpan = _.last(closedWorkordersSpans);
+
+ if (previousWorkorderSpan.workorder != workorder.id) {
+ console.log(previousWorkorderSpan);
+
+ var end = moment(previousWorkorderSpan.end);
+ var minutes = now.diff(end, 'minutes');
+ console.log("Time between tasks: ", minutes);
+
+ if (minutes < 5) {
+ new TimeClockException({
+ user: user._id,
+ date: new Date(),
+ reason: 'too_little_travel'
+ }).save();
+
+ reportException({
+ user: user,
+ workorder: workorder,
+ reason: 'User clocked in to next workorder too quickly.'
+ });
+ }
+
+ if (minutes > 75) {
+ new TimeClockException({
+ user: user._id,
+ date: new Date(),
+ reason: 'too_much_travel'
+ }).save();
+
+ reportException({
+ user: user,
+ workorder: workorder,
+ reason: 'Too much travel time detected between jobs.'
+ });
+ }
+ }
+ }
}
function reportException(exception) {
- // TODO: Actually send emails for exceptions.
- console.log('--- EXCEPTION ---', exception.reason);
+ const message = {
+ to: config.email.exception
+ };
+
+ const values = {
+ techName: `${exception.user.name.first} ${exception.user.name.last}`,
+ date: moment().format('LLLL'),
+ message: exception.reason
+ };
+
+ email.send(message, exceptionTemplate, values);
+
+ console.log('--- EXCEPTION ---', new Date(), exception.reason);
}
function handleClockOutRequest(params, user, spans, workorders, now) {
- var workdaySpans = filterSpans(spans, { type: 'workday' });
- var workdayStatus = spansStatus(workdaySpans);
+ var workdaySpans = filterSpans(spans, {type: 'workday'});
+ var workdayStatus = spansStatus(workdaySpans);
- if (workdayStatus !== 'clockedIn') {
- return Promise.reject('Not clocked in');
+ if (workdayStatus !== 'clockedIn') {
+ return Promise.reject('Not clocked in');
+ }
+
+ if (params.type === 'workday') {
+ var allTasksStatus = spansStatus(spans, {type: ['workorder', 'nonBillable']});
+ if (allTasksStatus === 'clockedIn') {
+ return Promise.reject('Cannot clock out while tasks are still open.');
}
- if (params.type === 'workday') {
- var allTasksStatus = spansStatus(spans, {type: ['workorder', 'nonBillable']});
- if (allTasksStatus === 'clockedIn') {
- return Promise.reject('Cannot clock out while tasks are still open.');
- }
+ var span = ensureSingularSpan(filterSpans(workdaySpans, {status: 'open'}));
+ }
- var span = ensureSingularSpan(filterSpans(workdaySpans, {status: 'open'}));
+ if (params.type === 'workorder') {
+ var workorder = _.find(workorders, {id: params.id});
+ if (!workorder) {
+ return Promise.reject('Invalid workorder');
}
- if (params.type === 'workorder') {
- var workorder = _.find(workorders, {id: params.id});
- if (!workorder) {
- return Promise.reject('Invalid workorder');
- }
+ var workorderSpans = filterSpans(spans, {type: 'workorder', workorder: workorder.id});
+ var workorderStatus = spansStatus(workorderSpans);
- var workorderSpans = filterSpans(spans, { type: 'workorder', workorder: workorder.id });
- var workorderStatus = spansStatus(workorderSpans);
-
- if (workorderStatus !== 'clockedIn') {
- return Promise.reject('Not clocked in');
- }
-
- var span = ensureSingularSpan(filterSpans(workorderSpans, {status: 'open'}));
+ if (workorderStatus !== 'clockedIn') {
+ return Promise.reject('Not clocked in');
}
- if (params.type === 'nonBillable') {
- var nonBillableSpans = filterSpans(spans, { type: 'nonBillable', reason: params.reason });
- var nonBillableStatus = spansStatus(nonBillableSpans);
+ var span = ensureSingularSpan(filterSpans(workorderSpans, {status: 'open'}));
+ }
- if (nonBillableStatus !== 'clockedIn') {
- return Promise.reject('Not clocked in');
- }
+ if (params.type === 'nonBillable') {
+ var nonBillableSpans = filterSpans(spans, {type: 'nonBillable', reason: params.reason});
+ var nonBillableStatus = spansStatus(nonBillableSpans);
- var span = ensureSingularSpan(filterSpans(nonBillableSpans, {status: 'open'}));
+ if (nonBillableStatus !== 'clockedIn') {
+ return Promise.reject('Not clocked in');
}
- span.status = 'closed';
- span.end = now.clone().utc().toDate();
- span.duration = moment(span.end).diff(span.start, 'seconds');
+ var span = ensureSingularSpan(filterSpans(nonBillableSpans, {status: 'open'}));
+ }
- return span.save().then(spanToResponse);
+ span.status = 'closed';
+ span.end = now.clone().utc().toDate();
+ span.duration = moment(span.end).diff(span.start, 'seconds');
+
+ return span.save().then(spanToResponse);
}
function handleWorkorderDetailsRequest(params, user, spans, workorder, today) {
- if (!workorder) {
- return Promise.reject('Invalid workorder');
+ if (!workorder) {
+ return Promise.reject('Invalid workorder');
+ }
+
+ var workorderSpans = filterSpans(spans, {type: 'workorder', workorder: workorder.id});
+ var workorderStatus = spansStatus(workorderSpans);
+
+ workorder = workorder.toObject();
+ workorder.timeclock = {
+ type: 'workorder',
+ id: workorder._id,
+ title: workorder.client.name,
+ start: moment(workorder.scheduling.start).utc().toISOString(),
+ end: moment(workorder.scheduling.end).utc().toISOString(),
+ status: workorderStatus,
+ spans: _.map(workorderSpans, spanToResponse),
+ blocked: false
+ };
+
+ if (workorderStatus != 'clockedIn') {
+ var workdayStatus = spansStatus(spans, {type: 'workday'});
+ var otherSpansStatus = spansStatus(spans, {type: ['workorder', 'nonBillable']});
+
+ if (workdayStatus != 'clockedIn' || otherSpansStatus == 'clockedIn') {
+ workorder.timeclock.blocked = true;
}
+ }
- var workorderSpans = filterSpans(spans, { type: 'workorder', workorder: workorder.id });
- var workorderStatus = spansStatus(workorderSpans);
-
- workorder = workorder.toObject();
- workorder.timeclock = {
- type: 'workorder',
- id: workorder._id,
- title: workorder.client.name,
- start: moment(workorder.scheduling.start).utc().toISOString(),
- end: moment(workorder.scheduling.end).utc().toISOString(),
- status: workorderStatus,
- spans: _.map(workorderSpans, spanToResponse),
- blocked: false
- };
-
- if (workorderStatus != 'clockedIn') {
- var workdayStatus = spansStatus(spans, { type: 'workday' });
- var otherSpansStatus = spansStatus(spans, {type: ['workorder', 'nonBillable']});
-
- if (workdayStatus != 'clockedIn' || otherSpansStatus == 'clockedIn') {
- workorder.timeclock.blocked = true;
- }
- }
-
- return workorder;
+ return workorder;
}
function spanToResponse(span) {
- return {
- start: span.start,
- end: span.end,
- duration: span.duration
- };
+ return {
+ start: span.start,
+ end: span.end,
+ duration: span.duration
+ };
}
function ensureSingularSpan(spans) {
- if (spans.length != 1) {
- throw new MultipleSpansError(spans);
- }
+ if (spans.length != 1) {
+ throw new MultipleSpansError(spans);
+ }
- return spans[0];
+ return spans[0];
}
function responseHandler(res) {
- return function(data) {
- res.json(data);
- };
+ return function (data) {
+ res.json(data);
+ };
}
function errorHandler(res) {
- return function(error) {
- if (typeof error === 'string') {
- res.json(400, {
- error: {
- message: error
- }
- });
- } else {
- console.error(error.stack);
- res.json(500, 'Internal error');
+ return function (error) {
+ if (typeof error === 'string') {
+ res.json(400, {
+ error: {
+ message: error
}
- };
+ });
+ } else {
+ console.error(error.stack);
+ res.json(500, 'Internal error');
+ }
+ };
}
-module.exports = function() {
- return {
- index: function(req, res) {
+function validateUserId(req) {
+ const id = req.param('user_id');
+ if (!id) {
+ return Promise.reject("Parameter missing 'user_id'");
+ }
- //TODO: Check to make sure user has a valid timesheet.
+ return Promise.resolve(id);
+}
- var today = moment();
+function validateDate(req, field) {
+ let date = req.param(field);
- var spans = findUserSpans(req.user, today);
- var workorders = findUserWorkorders(req.user, today);
+ if (!date) {
+ return Promise.reject(`Parameter '${field}' is required.`);
+ }
- Promise.join(spans, workorders, handleStatusRequest)
- .then(responseHandler(res))
- .catch(errorHandler(res));
- },
+ date = moment(date, 'YYYY-MM-DD');
+ if (!date.isValid()) {
+ return Promise.reject(`Parameter '${field}' is not a valid date.`)
+ }
- clockIn: function(req, res) {
+ return Promise.resolve(date);
+}
- //TODO: Check to make sure user has a valid timesheet.
+module.exports = function () {
+ return {
+ index: function (req, res) {
- var today = moment();
+ //TODO: Check to make sure user has a valid timesheet.
- var params = validateClockRequest(req);
- var spans = findUserSpans(req.user, today);
- var workorders = findUserWorkorders(req.user, today);
+ var today = moment();
- Promise.join(params, req.user, spans, workorders, today, handleClockInRequest)
- .then(responseHandler(res))
- .catch(errorHandler(res));
- },
+ var spans = findUserSpans(req.user.id, today);
+ var workorders = findUserWorkorders(req.user, today);
- clockOut: function(req, res) {
+ Promise.join(spans, workorders, handleStatusRequest)
+ .then(responseHandler(res))
+ .catch(errorHandler(res));
+ },
- //TODO: Check to make sure user has a valid timesheet.
+ clockIn: function (req, res) {
- var today = moment();
+ //TODO: Check to make sure user has a valid timesheet.
- var params = validateClockRequest(req);
- var spans = findUserSpans(req.user, today);
- var workorders = findUserWorkorders(req.user, today);
+ var today = moment();
- Promise.join(params, req.user, spans, workorders, today, handleClockOutRequest)
- .then(responseHandler(res))
- .catch(errorHandler(res));
- },
+ var params = validateClockRequest(req);
+ var spans = findUserSpans(req.user.id, today);
+ var workorders = findUserWorkorders(req.user, today);
- workorderDetails: function(req, res) {
+ Promise.join(params, req.user, spans, workorders, today, handleClockInRequest)
+ .then(responseHandler(res))
+ .catch(errorHandler(res));
+ },
- var today = moment();
+ clockOut: function (req, res) {
- validateWorkorderDetailsRequest(req)
- .then(function(params) {
- var spans = findUserSpans(req.user, today);
- var workorder = findUserWorkorder(params.id, req.user);
+ //TODO: Check to make sure user has a valid timesheet.
- return Promise.join(params, req.user, spans, workorder, today, handleWorkorderDetailsRequest)
- })
- .then(responseHandler(res))
- .catch(errorHandler(res));
+ Promise
+ .props({
+ id: req.user.id,
+ date: moment(),
+ notes: req.body.notes
+ })
+ .then((params) => {
+ var spans = findUserSpans(req.user.id, params.date);
+ var workorders = findUserWorkorders(req.user, params.date);
+ return Promise.join(params, req.user, spans, workorders, params.date, handleClockOutRequest);
+ })
+ .then(responseHandler(res))
+ .catch(errorHandler(res));
+ },
+ spansForUser: function (req, res) {
+ Promise
+ .props({
+ id: validateUserId(req),
+ date: validateDate(req, 'date')
+ })
+ .then((params) => findUserSpans(params.id, params.date))
+ .then(responseHandler(res))
+ .catch(errorHandler(res));
+ },
- Promise.join
- }
- }
+ workorderDetails: function (req, res) {
+
+ var today = moment();
+
+ validateWorkorderDetailsRequest(req)
+ .then(function (params) {
+ var spans = findUserSpans(req.user, today);
+ var workorder = findUserWorkorder(params.id, req.user);
+
+ return Promise.join(params, req.user, spans, workorder, today, handleWorkorderDetailsRequest)
+ })
+ .then(responseHandler(res))
+ .catch(errorHandler(res));
+ },
+
+ }
};
diff --git a/app/controllers/timesheet.js b/app/controllers/timesheet.js
new file mode 100644
index 0000000..350994c
--- /dev/null
+++ b/app/controllers/timesheet.js
@@ -0,0 +1,370 @@
+"use strict";
+
+var mongoose = require('mongoose');
+var moment = require('moment-timezone');
+var _ = require('lodash');
+var Promise = require('bluebird');
+var TimeClockSpan = mongoose.model('TimeClockSpan');
+var Workorder = mongoose.model('Workorder');
+var User = mongoose.model('User');
+var db = require('./db');
+
+const NON_BILLABLE_WORKORDER_TYPES = [
+ 'shop', 'break', 'pto', 'meeting', 'event', 'weather'
+];
+
+const PAYROLL_WORKORDER_TYPE_MAP = {
+ 'office': 'office',
+ 'anesthesia': 'anesthesia',
+ 'biomed': 'biomed',
+ 'bsp': 'bsp',
+ 'ice': 'ice',
+ 'imaging': 'other',
+ 'sales': 'sales',
+ 'sterile-processing': 'sterilizer',
+ 'depot': 'depot',
+ 'trace-gas': 'other',
+ 'room-air-exchange': 'other',
+ 'isolation-panels': 'electric',
+ 'ups-systems': 'electric',
+ 'relocation': 'other',
+ 'ice-maker': 'other',
+ 'waste-management-system': 'other',
+ 'medgas': 'other',
+ 'staffing': 'other',
+ 'ert': 'electric',
+ 'shop': 'non-billable',
+ 'break': 'non-billable',
+ 'pto': 'non-billable',
+ 'meeting': 'non-billable',
+ 'event': 'non-billable',
+ 'weather': 'non-billable',
+ 'legacy': 'legacy'
+};
+
+
+function findUserDaysWorked(id) {
+ var query = {
+ user: id,
+ type: 'workday',
+ status: 'closed'
+ };
+
+ return TimeClockSpan
+ .find(query).exec()
+ .then((records) => _.chain(records).reduce(accumulateDaysWorked, {}).values())
+}
+
+function accumulateDaysWorked(result, record) {
+ const date = moment(record.start).local().startOf('day').format('YYYY-MM-DD');
+
+ if (!result[date]) {
+ result[date] = {
+ date: date,
+ duration: 0
+ };
+ }
+
+ if (record.duration) {
+ result[date].duration += record.duration;
+ }
+
+ return result;
+}
+
+function responseHandler(res) {
+ return function (data) {
+ res.json(data);
+ };
+}
+
+function errorHandler(res) {
+ return function (error) {
+ if (typeof error === 'string') {
+ res.json(400, {
+ error: {
+ message: error
+ }
+ });
+ } else {
+ console.error(error.stack);
+ res.json(500, 'Internal error');
+ }
+ };
+}
+
+function validateUserId(req) {
+ const id = req.param('user_id');
+ if (!id) {
+ return Promise.reject("Parameter missing 'user_id'");
+ }
+
+ return Promise.resolve(id);
+}
+
+function validateWeek(req) {
+ let week = req.param('week');
+
+ if (!week) {
+ return Promise.reject("Parameter 'week' is required.");
+ }
+
+ week = moment(week, 'YYYY-MM-DD');
+ if (!week.isValid()) {
+ return Promise.reject("Parameter 'week' is not a valid date.")
+ }
+
+ if (week.weekday() !== 0) {
+ return Promise.reject("Parameter 'week' does not start at the beginning of the week (Sunday).");
+ }
+
+ // Return as string.
+ return Promise.resolve(week);
+}
+
+function summaryHandler(params) {
+ const spans = findAllSpansForWeek(params.week);
+
+ return buildReport(spans);
+}
+
+function userSummaryHandler(params) {
+ const spans = findUserSpansForWeek(params.id, params.week);
+
+ return buildReport(spans);
+}
+
+function buildReport(spans) {
+ const workordersById = spans
+ .then(extractIds('workorder'))
+ .then(findWorkordersById)
+ .then(indexById);
+
+ const usersById = spans
+ .then(extractIds('user'))
+ .then(findUsersById)
+ .then(indexById);
+
+ return Promise.join(spans, workordersById, usersById, generateSummary);
+}
+
+function generateSummary(spans, workordersById, usersById) {
+ var results = {};
+
+ function fetchOrCreateUserRecord(userId) {
+ var record = results[userId];
+ if (!record) {
+ var user = usersById[userId];
+
+ record = results[userId] = {
+ user: {
+ _id: user._id,
+ name: user.name
+ },
+ hasOpenSpans: false,
+ workorders: {},
+ spans: {},
+ clockedTime: 0,
+ workedTime: 0,
+ accountingByWorkorder: {},
+ accountingByWorkorderType: {},
+ accountingByPayroll: {},
+ accountingByNonBillable: {},
+ };
+ }
+ return record;
+ }
+
+ function addWorkorder(user, workorder) {
+ if (!user.workorders[workorder.id]) {
+ user.workorders[workorder.id] = {
+ _id: workorder._id,
+ client: workorder.client,
+ biomedId: workorder.biomedId,
+ reason: workorder.reason
+ }
+ }
+ }
+
+ function logTime(collection, key, duration) {
+ if (!collection[key]) {
+ collection[key] = {
+ type: key,
+ duration: duration
+ }
+ } else {
+ collection[key].duration += duration;
+ }
+ }
+
+ _.forEach(spans, (span) => {
+ var user = fetchOrCreateUserRecord(span.user);
+
+ user.spans[span._id] = span.toObject();
+ delete user.spans[span._id].__v;
+ delete user.spans[span._id].user;
+
+ if (span.status !== 'closed') {
+ user.hasOpenSpans = true;
+ return;
+ }
+
+ if (span.type === 'workday') {
+ user.clockedTime += span.duration;
+ }
+
+ if (span.type === 'workorder') {
+ user.workedTime += span.duration;
+
+ var workorder = workordersById[span.workorder];
+ var workorderType = workorder.workorderType;
+
+ // If workorder is actually a non-billable (Stupid), treat it as such...
+ if (NON_BILLABLE_WORKORDER_TYPES.indexOf(workorderType) > -1) {
+ logTime(user.accountingByNonBillable, workorderType, span.duration);
+ } else {
+ addWorkorder(user, workorder);
+
+ logTime(user.accountingByWorkorderType, workorderType, span.duration);
+ logTime(user.accountingByPayroll, PAYROLL_WORKORDER_TYPE_MAP[workorderType], span.duration);
+ logTime(user.accountingByWorkorder, span.workorder, span.duration);
+ }
+ }
+
+ if (span.type === 'nonBillable') {
+ user.workedTime += span.duration;
+
+ logTime(user.accountingByNonBillable, span.reason, span.duration);
+ }
+ });
+
+ _.forEach(results, (user) => {
+ user.travelTime = Math.max(0, user.clockedTime - user.workedTime);
+
+ user.spans = _.values(user.spans);
+
+ user.accountingByWorkorder = _.values(user.accountingByWorkorder);
+ user.accountingByWorkorderType = _.values(user.accountingByWorkorderType);
+ user.accountingByPayroll = _.values(user.accountingByPayroll);
+ user.accountingByNonBillable = _.values(user.accountingByNonBillable);
+ });
+
+ return _.values(results);
+}
+
+function extractIds(field) {
+ return (data) => _(data)
+ .pluck(field)
+ .reject(_.isUndefined)
+ .uniq((id) => id.toString())
+ .value();
+}
+
+function indexById(data) {
+ return _.indexBy(data, 'id')
+}
+
+function findWorkordersById(ids) {
+ const query = {
+ _id: {
+ $in: ids
+ }
+ };
+
+ return Workorder
+ .find(query)
+ .populate('client', 'name identifier')
+ .exec();
+}
+
+function findUsersById(ids) {
+ const query = {
+ _id: {
+ $in: ids
+ }
+ };
+
+ return User.find(query).exec();
+}
+
+function findAllSpansForWeek(week) {
+ var startOfWeek = week.clone().startOf('week');
+ var endOfWeek = week.clone().endOf('week');
+
+ console.log(`Finding spans between ${startOfWeek.format()} and ${endOfWeek.format()}`);
+
+ var query = {
+ start: {
+ '$gte': startOfWeek.toDate(),
+ '$lte': endOfWeek.toDate()
+ }
+ };
+
+ return TimeClockSpan.find(query).exec();
+}
+
+function findUserSpansForWeek(id, week) {
+ var startOfWeek = week.clone().startOf('week');
+ var endOfWeek = week.clone().endOf('week');
+
+ console.log(`Finding spans between ${startOfWeek.format()} and ${endOfWeek.format()}`);
+
+ var query = {
+ start: {
+ '$gte': startOfWeek.toDate(),
+ '$lte': endOfWeek.toDate()
+ },
+ user: id
+ };
+
+ return TimeClockSpan.find(query).exec();
+}
+
+module.exports = function () {
+ return {
+ daysWorked: function (req, res) {
+ req.check('user_id').notEmpty().isMongoId();
+
+ var errors = req.validationErrors();
+ if (errors) {
+ return res.json(400, errors);
+ }
+
+ var params = {
+ id: req.param('user_id')
+ };
+
+ findUserDaysWorked(params.id)
+ .then(responseHandler(res))
+ .catch(errorHandler(res));
+ },
+
+ summary: function (req, res) {
+ req.check('week').notEmpty().isWeek();
+
+ var errors = req.validationErrors();
+ if (errors) {
+ return res.json(400, errors);
+ }
+
+ var params = {
+ week: moment(req.sanitize('week'))
+ };
+
+ summaryHandler(params)
+ .then(responseHandler(res))
+ .catch(errorHandler(res));
+ },
+
+ userSummary: function (req, res) {
+ Promise
+ .props({
+ id: validateUserId(req),
+ week: validateWeek(req)
+ })
+ .then(userSummaryHandler)
+ .then(responseHandler(res))
+ .catch(errorHandler(res));
+ }
+ }
+};
diff --git a/app/controllers/users.js b/app/controllers/users.js
index 052e4dc..0def465 100644
--- a/app/controllers/users.js
+++ b/app/controllers/users.js
@@ -1,209 +1,226 @@
-
var mongoose = require('mongoose'),
- async = require('async'),
- User = mongoose.model('User'),
- Clock = mongoose.model('Clock');
+ async = require('async'),
+ User = mongoose.model('User'),
+ Clock = mongoose.model('Clock');
var log = require('log4node');
-module.exports = function(config, directory) {
+module.exports = function (config, directory) {
- function fetch_all_users(callback) {
- async.parallel({
- gapps: directory.listUsers,
- local: function(callback) {
- User.find({ deleted: false }).select('name email groups perms deleted').exec(callback);
- }
- }, callback);
- }
+ function fetch_all_users(callback) {
+ async.parallel({
+ gapps: directory.listUsers,
+ local: function (callback) {
+ User.find({deleted: false}).select('name email groups perms deleted').exec(callback);
+ }
+ }, callback);
+ }
- function map_local_users(data, results) {
- return function(callback) {
- async.each(data, function(item, callback) {
- var key = item.email.toLowerCase();
+ function map_local_users(data, results) {
+ return function (callback) {
+ async.each(data, function (item, callback) {
+ var key = item.email.toLowerCase();
- if (blacklist.indexOf(key) == -1)
- results[key] = item;
+ if (blacklist.indexOf(key) == -1)
+ results[key] = item;
- callback();
- },
- callback);
- };
- }
+ callback();
+ },
+ callback);
+ };
+ }
- function map_gapps_users(data, results) {
- return function(callback) {
- async.each(data, function(item, callback) {
- var key = item.primaryEmail.toLowerCase();
+ function map_gapps_users(data, results) {
+ return function (callback) {
+ async.each(data, function (item, callback) {
+ var key = item.primaryEmail.toLowerCase();
- // Ignore if blacklisted
- if (blacklist.indexOf(key) != -1) return callback();
+ // Ignore if blacklisted
+ if (blacklist.indexOf(key) != -1) return callback();
- if (!(key in results))
- results[key] = {
- email: item.primaryEmail,
- deleted: false,
- perms: [ ],
- groups: [ ],
- name: {
- first: item.name.givenName,
- last: item.name.familyName
- },
- };
+ if (!(key in results))
+ results[key] = {
+ email: item.primaryEmail,
+ deleted: false,
+ perms: [],
+ groups: [],
+ name: {
+ first: item.name.givenName,
+ last: item.name.familyName
+ },
+ };
- callback();
- },
- callback);
- };
- }
+ callback();
+ },
+ callback);
+ };
+ }
- function reduce_array(data, results) {
- return function(callback) {
- for (var item in data) {
- results.push(data[item]);
- }
+ function reduce_array(data, results) {
+ return function (callback) {
+ for (var item in data) {
+ results.push(data[item]);
+ }
- results.sort(function(a, b) {
- var result = a.name.first.toLowerCase().localeCompare(b.name.first.toLowerCase());
- if (result == 0)
- result = a.name.last.toLowerCase().localeCompare(b.name.last.toLowerCase());
+ results.sort(function (a, b) {
+ var result = a.name.first.toLowerCase().localeCompare(b.name.first.toLowerCase());
+ if (result == 0)
+ result = a.name.last.toLowerCase().localeCompare(b.name.last.toLowerCase());
- return result;
- });
+ return result;
+ });
- callback();
- };
- }
+ callback();
+ };
+ }
- function merge_sources(data, callback) {
- var map = {};
- var reduce = [];
+ function merge_sources(data, callback) {
+ var map = {};
+ var reduce = [];
- async.series([
- map_local_users(data.local, map),
- map_gapps_users(data.gapps.users, map),
- reduce_array(map, reduce),
- ],
- function(err) {
- callback(err, reduce);
- });
- }
+ async.series([
+ map_local_users(data.local, map),
+ map_gapps_users(data.gapps.users, map),
+ reduce_array(map, reduce),
+ ],
+ function (err) {
+ callback(err, reduce);
+ });
+ }
- return {
- index: function(req, res) {
- var criteria = { deleted: false };
+ return {
+ index: function (req, res) {
+ var criteria = {deleted: false};
- if (req.query.group) {
- criteria.groups = req.query.group;
- }
+ if (req.query.group) {
+ criteria.groups = req.query.group;
+ }
- if (req.query.perms) {
- criteria.perms = req.query.perms;
- }
+ if (req.query.perms) {
+ criteria.perms = req.query.perms;
+ }
- if (req.query.userid) {
- criteria._id = req.query.userid;
- }
+ if (req.query.userid) {
+ criteria._id = req.query.userid;
+ }
- var query = User.find(criteria)
- .select('name groups')
- .exec(function(err, results) {
- if (err) {
- res.json(500, err);
- } else {
- res.json(results);
- }
- });
- },
+ var query = User.find(criteria)
+ .select('name groups')
+ .exec(function (err, results) {
+ if (err) {
+ res.json(500, err);
+ } else {
+ res.json(results);
+ }
+ });
+ },
- details: function(req, res) {
+ details: function (req, res) {
- async.waterfall([
- fetch_all_users,
- merge_sources,
- ],
- function(err, results) {
- if (err) return res.json(500, err);
- res.json(results);
- });
- },
+ async.waterfall([
+ fetch_all_users,
+ merge_sources,
+ ],
+ function (err, results) {
+ if (err) return res.json(500, err);
+ res.json(results);
+ });
+ },
- create: function(req, res) {
- log.info("users.create %j", req.body);
+ create: function (req, res) {
+ log.info("users.create %j", req.body);
- var user = new User({
- email: req.body.email,
- name: req.body.name,
- groups: req.body.groups,
- perms: req.body.perms,
- deleted: false
- });
+ var user = new User({
+ email: req.body.email,
+ name: req.body.name,
+ groups: req.body.groups,
+ perms: req.body.perms,
+ deleted: false
+ });
- return user.save(function(err) {
- if (err)
- log.error("Error: %s", err);
+ return user.save(function (err) {
+ if (err)
+ log.error("Error: %s", err);
- return res.json(user);
- });
- },
+ return res.json(user);
+ });
+ },
- update: function(req, res) {
- var id = req.param('user_id');
- log.info("users.update %s %j", id, req.body);
+ get: function(req, res, next) {
+ var id = req.param('user_id');
+ log.info("users.get %s", id);
- return User.findById(id, function(err, user) {
- user.email = req.body.email;
- user.name = req.body.name;
- user.groups = req.body.groups;
- user.perms = req.body.perms;
+ User.findById(id)
+ .select('email picture perms groups name')
+ .exec()
+ .then((user) => {
+ if (!user) {
+ return next(new Error('Failed to load user ' + id));
+ }
+ res.json(user);
+ })
+ .catch((err) => {
+ next(err);
+ });
+ },
- return user.save(function(err) {
- if (err)
- log.err("Error: %s", err);
+ update: function (req, res) {
+ var id = req.param('user_id');
+ log.info("users.update %s %j", id, req.body);
- return res.json(user);
- });
- });
- },
+ return User.findById(id, function (err, user) {
+ user.email = req.body.email;
+ user.name = req.body.name;
+ user.groups = req.body.groups;
+ user.perms = req.body.perms;
- clocks: function(req, res) {
- var id = req.param('user_id');
+ return user.save(function (err) {
+ if (err)
+ log.err("Error: %s", err);
- var criteria = {
- tech: id
- };
+ return res.json(user);
+ });
+ });
+ },
- var query = Clock.find(criteria)
- .sort('-dt')
- .exec(function(err, results) {
- if (err) {
- res.json(500, err);
- } else {
- res.json(results);
- }
- });
- }
- };
+ clocks: function (req, res) {
+ var id = req.param('user_id');
+
+ var criteria = {
+ tech: id
+ };
+
+ var query = Clock.find(criteria)
+ .sort('-dt')
+ .exec(function (err, results) {
+ if (err) {
+ res.json(500, err);
+ } else {
+ res.json(results);
+ }
+ });
+ }
+ };
};
var blacklist = [
- "system@atlanticbiomedical.com",
- "admin@atlanticbiomedical.com",
- "amazons3@atlanticbiomedical.com",
- "api@atlanticbiomedical.com",
- "biodexservice@atlanticbiomedical.com",
- "cerberusapp@atlanticbiomedical.com",
- "chattservice@atlanticbiomedical.com",
- "dropbox@atlanticbiomedical.com",
- "inquiries@atlanticbiomedical.com",
- "office@atlanticbiomedical.com",
- "parts@atlanticbiomedical.com",
- "schedule@atlanticbiomedical.com",
- "webapp@atlanticbiomedical.com",
- "banfieldservice@atlanticbiomedical.com",
- "chris.sewell@atlanticbiomedical.com",
- "devel@atlanticbiomedical.com",
- "dobie@atlanticbiomedical.com",
+ "system@atlanticbiomedical.com",
+ "admin@atlanticbiomedical.com",
+ "amazons3@atlanticbiomedical.com",
+ "api@atlanticbiomedical.com",
+ "biodexservice@atlanticbiomedical.com",
+ "cerberusapp@atlanticbiomedical.com",
+ "chattservice@atlanticbiomedical.com",
+ "dropbox@atlanticbiomedical.com",
+ "inquiries@atlanticbiomedical.com",
+ "office@atlanticbiomedical.com",
+ "parts@atlanticbiomedical.com",
+ "schedule@atlanticbiomedical.com",
+ "webapp@atlanticbiomedical.com",
+ "banfieldservice@atlanticbiomedical.com",
+ "chris.sewell@atlanticbiomedical.com",
+ "devel@atlanticbiomedical.com",
+ "dobie@atlanticbiomedical.com",
// "akirayasha@gmail.com",
- "receipts@atlanticbiomedical.com",
+ "receipts@atlanticbiomedical.com",
];
diff --git a/app/controllers/workorders.js b/app/controllers/workorders.js
index c31373c..b18dc44 100644
--- a/app/controllers/workorders.js
+++ b/app/controllers/workorders.js
@@ -1,547 +1,570 @@
var log = require('log4node');
var mongoose = require('mongoose'),
- email = require('emailjs'),
- moment = require('moment'),
- async = require('async'),
- sprintf = require('sprintf').sprintf,
- Client = mongoose.model('Client'),
- Workorder = mongoose.model('Workorder'),
- Counter = mongoose.model('Counter'),
- Device = mongoose.model('Device'),
- User = mongoose.model('User');
+ email = require('emailjs'),
+ moment = require('moment'),
+ async = require('async'),
+ sprintf = require('sprintf').sprintf,
+ Client = mongoose.model('Client'),
+ Workorder = mongoose.model('Workorder'),
+ Counter = mongoose.model('Counter'),
+ Device = mongoose.model('Device'),
+ User = mongoose.model('User');
-module.exports = function(config, calendar) {
- return {
- index: function(req, res) {
+module.exports = function (config, calendar) {
+ return {
+ index: function (req, res) {
- log.info("workorders.index %j", req.query);
-
- var start = moment(req.query.start).toDate();
- var end = moment(req.query.end).add('days', 1).toDate();
+ log.info("workorders.index %j", req.query);
- Workorder
- .find({
- deleted: false,
- 'scheduling.start': { '$gte': start, '$lt': end }
- })
- .populate('client', 'name identifier address')
- .populate('techs', 'name')
- .sort('-scheduling.start client.name')
- .exec(function(err, results) {
- if (err) {
- res.json(500, err);
- } else {
- res.json(results);
- }
- });
- },
+ var start = moment(req.query.start).toDate();
+ var end = moment(req.query.end).add('days', 1).toDate();
- get: function(req, res, next) {
- var id = req.param('workorder_id');
- log.info("workorders.get %s", id);
+ Workorder
+ .find({
+ deleted: false,
+ 'scheduling.start': {'$gte': start, '$lt': end}
+ })
+ .populate('client', 'name identifier address')
+ .populate('techs', 'name')
+ .sort('-scheduling.start client.name')
+ .exec(function (err, results) {
+ if (err) {
+ res.json(500, err);
+ } else {
+ res.json(results);
+ }
+ });
+ },
- Workorder.findById(id)
- .populate('client', 'name identifier')
- .populate('techs', 'name')
- .populate('createdBy', 'name')
- .populate('modifiedBy', 'name')
- .exec(function(err, workorder) {
- if (err) return next(err);
- if (!workorder) return next(new Error('Failed to load workorder ' + id));
+ get: function (req, res, next) {
+ var id = req.param('workorder_id');
+ log.info("workorders.get %s", id);
- res.json(workorder);
- });
- },
+ Workorder.findById(id)
+ .populate('client', 'name identifier')
+ .populate('techs', 'name')
+ .populate('createdBy', 'name')
+ .populate('modifiedBy', 'name')
+ .exec(function (err, workorder) {
+ if (err) return next(err);
+ if (!workorder) return next(new Error('Failed to load workorder ' + id));
- create: function(req, res, next) {
- log.info("workoreders.create %j", req.body);
+ res.json(workorder);
+ });
+ },
- var server = email.server.connect({
- user: config.email.user,
- password: config.email.password,
- host: 'smtp.gmail.com',
- ssl: true
- });
+ create: function (req, res, next) {
+ log.info("workoreders.create %j", req.body);
- var date = new Date();
+ var server = email.server.connect({
+ user: config.email.user,
+ password: config.email.password,
+ host: 'smtp.gmail.com',
+ ssl: true
+ });
- var workorder = new Workorder({
- client: req.body.client,
- emails: req.body.emails,
- createdOn: date,
- createdBy: req.user,
- reason: req.body.reason,
- maintenanceType: req.body.maintenanceType || "",
- remarks: req.body.remarks || "",
- status: req.body.status,
- scheduling: req.body.scheduling,
- techs: req.body.techs,
- alternativeContact: req.body.alternativeContact,
- trackingNumber: req.body.trackingNumber,
- devices: req.body.devices
- });
+ var date = new Date();
- var notify = req.body._notify || "";
+ var workorder = new Workorder({
+ client: req.body.client,
+ emails: req.body.emails,
+ createdOn: date,
+ createdBy: req.user,
+ reason: req.body.reason,
+ maintenanceType: req.body.maintenanceType || "",
+ remarks: req.body.remarks || "",
+ status: req.body.status,
+ scheduling: req.body.scheduling,
+ techs: req.body.techs,
+ alternativeContact: req.body.alternativeContact,
+ trackingNumber: req.body.trackingNumber,
+ devices: req.body.devices,
+ workorderType: req.body.workorderType
+ });
- var client;
- var techs;
- var devices;
- var jsonResult;
+ var notify = req.body._notify || "";
- async.waterfall([
- function(callback) {
- Counter.collection.findAndModify(
- { name: 'workorder' },
- [],
- { $inc: { seq: 1 } },
- { 'new': true, upsert: true },
- function(err, result) {
- workorder.biomedId = result.seq - 1;
- callback(err);
- });
- },
- function(callback) {
- Client.findById(req.body.client, function(err, result) {
- client = result;
- callback(err);
- });
- },
- function(callback) {
- Device.find({'_id': { $in: req.body.devices }})
- .populate({path: 'deviceType'})
- .exec(function(err, results) {
- devices = results;
- callback(err);
- });
- },
- function(callback) {
- User.find({
- '_id': { $in: workorder.techs }
- },
- function(err, result) {
- techs = result;
- callback(err);
- });
- },
- function(callback) {
- calendar.scheduleEvent({
- summary: generateSummary(client),
- description: generateDescription(client, workorder, req.user, null, null, devices),
- location: generateLocation(client),
- start: workorder.scheduling.start,
- end: workorder.scheduling.end,
- attendees: generateAttendees(techs, workorder)
- }, function(err, result) {
- if (result) {
- workorder.calendarId = result.id;
- }
- callback(err);
- });
- },
- function(callback) {
- if (!notify)
- return callback(null);
+ var client;
+ var techs;
+ var devices;
+ var jsonResult;
- var description = generateDescription(client, workorder, req.user, null, techs, devices);
- var techDescription = appendNotes(description, client, workorder);
+ async.waterfall([
+ function (callback) {
+ Counter.collection.findAndModify(
+ {name: 'workorder'},
+ [],
+ {$inc: {seq: 1}},
+ {'new': true, upsert: true},
+ function (err, result) {
+ workorder.biomedId = result.value.seq - 1;
+ callback(err);
+ });
+ },
+ function (callback) {
+ Client.findById(req.body.client, function (err, result) {
+ client = result;
+ callback(err);
+ });
+ },
+ function (callback) {
+ Device.find({'_id': {$in: req.body.devices}})
+ .populate({path: 'deviceType'})
+ .exec(function (err, results) {
+ devices = results;
+ callback(err);
+ });
+ },
+ function (callback) {
+ User.find({
+ '_id': {$in: workorder.techs}
+ },
+ function (err, result) {
+ techs = result;
+ callback(err);
+ });
+ },
+ function (callback) {
+ calendar.scheduleEvent({
+ summary: generateSummary(client),
+ description: generateDescription(client, workorder, req.user, null, null, devices),
+ location: generateLocation(client),
+ start: workorder.scheduling.start,
+ end: workorder.scheduling.end,
+ attendees: generateAttendees(techs, workorder)
+ }, function (err, result) {
+ if (result) {
+ workorder.calendarId = result.id;
+ }
+ callback(err);
+ });
+ },
+ function (callback) {
+ if (!notify)
+ return callback(null);
- var to = req.body.emails;
- var techTo = generateToLine(techs);
+ var description = generateDescription(client, workorder, req.user, null, techs, devices);
+ var techDescription = appendNotes(description, client, workorder);
- var subject = 'Workorder created: ' + workorder.biomedId;
+ var to = req.body.emails;
+ var techTo = generateToLine(techs);
- async.waterfall([
- function(cb) {
- if (to && to.length > 0) {
- var msg = {
- text: description,
- from: config.email.user,
- to: to,
- subject: subject
- };
- server.send(msg, function(err, message) { cb(err); });
- } else {
- cb();
- }
- },
- function(cb) {
- if (techTo) {
- var msg = {
- text: techDescription,
- from: config.email.user,
- to: techTo,
- subject: subject
- };
- server.send(msg, function(err, message) { cb(err); });
- } else {
- cb();
- }
- }
- ], callback);
- },
- function(callback) {
- workorder.save(function(err, result) { callback(err, result); });
- },
- function(result, callback) {
- jsonResult = result;
+ var subject = 'Workorder created: ' + workorder.biomedId;
- Client.findByIdAndUpdate(req.body.client, { $push: { 'workorders': result.id } },
- function(err, ignored) { callback(err, result) });
- },
- function(result, callback) {
- if (workorder.maintenanceType) {
- var key = 'pms.' + date.getFullYear() + '-' + date.getMonth() + '.' + workorder.maintenanceType;
- var cmd = { $inc: {} };
- cmd.$inc[key] = 1;
- Client.findByIdAndUpdate(req.body.client, cmd, function(err, ignored) { callback(err, result) });
- } else {
- callback(null, result);
- }
- },
- ],
- function(err, result) {
- if (!err) {
- res.json(jsonResult);
- } else {
- throw err;
- }
- });
- },
+ async.waterfall([
+ function (cb) {
+ if (to && to.length > 0) {
+ var msg = {
+ text: description,
+ from: config.email.user,
+ to: to,
+ subject: subject
+ };
+ server.send(msg, function (err, message) {
+ cb(err);
+ });
+ } else {
+ cb();
+ }
+ },
+ function (cb) {
+ if (techTo) {
+ var msg = {
+ text: techDescription,
+ from: config.email.user,
+ to: techTo,
+ subject: subject
+ };
+ server.send(msg, function (err, message) {
+ cb(err);
+ });
+ } else {
+ cb();
+ }
+ }
+ ], callback);
+ },
+ function (callback) {
+ workorder.save(function (err, result) {
+ callback(err, result);
+ });
+ },
+ function (result, callback) {
+ jsonResult = result;
- update: function(req, res, next) {
- var server = email.server.connect({
- user: config.email.user,
- password: config.email.password,
- host: 'smtp.gmail.com',
- ssl: true
- });
+ Client.findByIdAndUpdate(req.body.client, {$push: {'workorders': result.id}},
+ function (err, ignored) {
+ callback(err, result)
+ });
+ },
+ function (result, callback) {
+ if (workorder.maintenanceType) {
+ var key = 'pms.' + date.getFullYear() + '-' + date.getMonth() + '.' + workorder.maintenanceType;
+ var cmd = {$inc: {}};
+ cmd.$inc[key] = 1;
+ Client.findByIdAndUpdate(req.body.client, cmd, function (err, ignored) {
+ callback(err, result)
+ });
+ } else {
+ callback(null, result);
+ }
+ },
+ ],
+ function (err, result) {
+ if (!err) {
+ res.json(jsonResult);
+ } else {
+ throw err;
+ }
+ });
+ },
- var modifiedOn = new Date();
- var id = req.param('workorder_id');
+ update: function (req, res, next) {
+ var server = email.server.connect({
+ user: config.email.user,
+ password: config.email.password,
+ host: 'smtp.gmail.com',
+ ssl: true
+ });
- log.info("workorders.update %s %j", id, req.body);
+ var modifiedOn = new Date();
+ var id = req.param('workorder_id');
- var workorder;
- var client;
- var techs;
- var devices;
- var createdBy;
- var modifiedBy;
+ log.info("workorders.update %s %j", id, req.body);
- var notify = req.body._notify || "";
+ var workorder;
+ var client;
+ var techs;
+ var devices;
+ var createdBy;
+ var modifiedBy;
- async.waterfall([
- function(callback) {
- Workorder.findById(id, function(err, result) {
- workorder = result;
+ var notify = req.body._notify || "";
- workorder.emails = req.body.emails;
- workorder.modifiedBy = req.user;
- workorder.modifiedOn = modifiedOn;
- workorder.reason = req.body.reason;
- workorder.maintenanceType = req.body.maintenanceType || "";
- workorder.remarks = req.body.remarks;
- workorder.scheduling = req.body.scheduling;
- workorder.status = req.body.status;
- workorder.techs = req.body.techs
- .filter(function(e) { return e; })
- .map(function(t) { return t._id; });
- workorder.invoiceNumber = req.body.invoiceNumber;
- workorder.invoicedOn = req.body.invoicedOn;
- workorder.checkNumber = req.body.checkNumber;
- workorder.paidOn = req.body.paidOn;
- workorder.alternativeContact = req.body.alternativeContact;
- workorder.trackingNumber = req.body.trackingNumber;
- workorder.devices = req.body.devices;
- callback(err);
- });
- },
- function(callback) {
- Client.findById(workorder.client, function(err, result) {
- client = result;
- callback(err);
- });
- },
- function(callback) {
- Device.find({'_id': { $in: workorder.devices }})
- .populate({path: 'deviceType'})
- .exec(function(err, results) {
- devices = results;
- callback(err);
- });
- },
- function(callback) {
- if (workorder.createdBy) {
- User.findById(workorder.createdBy, function(err, result) {
- createdBy = result;
- callback(err);
- });
- } else {
- callback(null);
- }
- },
- function(callback) {
- if (workorder.modifiedBy) {
- User.findById(workorder.modifiedBy, function(err, result) {
- modifiedBy = result;
- callback(err);
- });
- } else {
- callback(null);
- }
- },
- function(callback) {
- User.find({
- '_id': { $in: workorder.techs }
- },
- function(err, result) {
- techs = result;
- callback(err);
- });
- },
- function(callback) {
- calendar.updateEvent({
- summary: generateSummary(client),
- description: generateDescription(client, workorder, null, null, null, devices),
- location: generateLocation(client),
- start: workorder.scheduling.start,
- end: workorder.scheduling.end,
- attendees: generateAttendees(techs, workorder),
- eventId: workorder.calendarId
- }, function(err, result) {
- callback(err);
- });
- },
- function(callback) {
- if (!notify)
- return callback(null);
+ async.waterfall([
+ function (callback) {
+ Workorder.findById(id, function (err, result) {
+ workorder = result;
+
+ workorder.emails = req.body.emails;
+ workorder.modifiedBy = req.user;
+ workorder.modifiedOn = modifiedOn;
+ workorder.reason = req.body.reason;
+ workorder.maintenanceType = req.body.maintenanceType || "";
+ workorder.remarks = req.body.remarks;
+ workorder.scheduling = req.body.scheduling;
+ workorder.status = req.body.status;
+ workorder.techs = req.body.techs
+ .filter(function (e) {
+ return e;
+ })
+ .map(function (t) {
+ return t._id;
+ });
+ workorder.invoiceNumber = req.body.invoiceNumber;
+ workorder.invoicedTime = req.body.invoicedTime;
+ workorder.invoicedOn = req.body.invoicedOn;
+ workorder.checkNumber = req.body.checkNumber;
+ workorder.paidOn = req.body.paidOn;
+ workorder.alternativeContact = req.body.alternativeContact;
+ workorder.trackingNumber = req.body.trackingNumber;
+ workorder.devices = req.body.devices;
+ workorder.workorderType = req.body.workorderType;
+ callback(err);
+ });
+ },
+ function (callback) {
+ Client.findById(workorder.client, function (err, result) {
+ client = result;
+ callback(err);
+ });
+ },
+ function (callback) {
+ Device.find({'_id': {$in: workorder.devices}})
+ .populate({path: 'deviceType'})
+ .exec(function (err, results) {
+ devices = results;
+ callback(err);
+ });
+ },
+ function (callback) {
+ if (workorder.createdBy) {
+ User.findById(workorder.createdBy, function (err, result) {
+ createdBy = result;
+ callback(err);
+ });
+ } else {
+ callback(null);
+ }
+ },
+ function (callback) {
+ if (workorder.modifiedBy) {
+ User.findById(workorder.modifiedBy, function (err, result) {
+ modifiedBy = result;
+ callback(err);
+ });
+ } else {
+ callback(null);
+ }
+ },
+ function (callback) {
+ User.find({
+ '_id': {$in: workorder.techs}
+ },
+ function (err, result) {
+ techs = result;
+ callback(err);
+ });
+ },
+ function (callback) {
+ calendar.updateEvent({
+ summary: generateSummary(client),
+ description: generateDescription(client, workorder, null, null, null, devices),
+ location: generateLocation(client),
+ start: workorder.scheduling.start,
+ end: workorder.scheduling.end,
+ attendees: generateAttendees(techs, workorder),
+ eventId: workorder.calendarId
+ }, function (err, result) {
+ callback(err);
+ });
+ },
+ function (callback) {
+ if (!notify)
+ return callback(null);
- var description = generateDescription(client, workorder, createdBy, modifiedBy, techs, devices);
- var techDescription = appendNotes(description, client, workorder);
+ var description = generateDescription(client, workorder, createdBy, modifiedBy, techs, devices);
+ var techDescription = appendNotes(description, client, workorder);
- var to = req.body.emails;
- var techTo = generateToLine(techs);
+ var to = req.body.emails;
+ var techTo = generateToLine(techs);
- var subject = 'Workorder updated: ' + workorder.biomedId;
+ var subject = 'Workorder updated: ' + workorder.biomedId;
- async.waterfall([
- function(cb) {
- if (to && to.length > 0) {
- var msg = {
- text: description,
- from: config.email.user,
- to: to,
- subject: subject
- };
- server.send(msg, function(err, message) { cb(err); });
- } else {
- cb();
- }
- },
- function(cb) {
- if (techTo) {
- var msg = {
- text: techDescription,
- from: config.email.user,
- to: techTo,
- subject: subject
- };
- server.send(msg, function(err, message) { cb(err); });
- } else {
- cb();
- }
- }
- ], callback);
- },
- function(callback) {
- workorder.save(function(err) {
- callback(err);
- })
- }
- ],
- function(err) {
- if (err)
- log.error("Error: %s", err);
+ async.waterfall([
+ function (cb) {
+ if (to && to.length > 0) {
+ var msg = {
+ text: description,
+ from: config.email.user,
+ to: to,
+ subject: subject
+ };
+ server.send(msg, function (err, message) {
+ cb(err);
+ });
+ } else {
+ cb();
+ }
+ },
+ function (cb) {
+ if (techTo) {
+ var msg = {
+ text: techDescription,
+ from: config.email.user,
+ to: techTo,
+ subject: subject
+ };
+ server.send(msg, function (err, message) {
+ cb(err);
+ });
+ } else {
+ cb();
+ }
+ }
+ ], callback);
+ },
+ function (callback) {
+ workorder.save(function (err) {
+ callback(err);
+ })
+ }
+ ],
+ function (err) {
+ if (err)
+ log.error("Error: %s", err);
- res.json(workorder);
- });
- },
+ res.json(workorder);
+ });
+ },
- destroy: function(req, res, next) {
- var id = req.param('workorder_id');
+ destroy: function (req, res, next) {
+ var id = req.param('workorder_id');
- log.info("workorders.destroy %s", id);
+ log.info("workorders.destroy %s", id);
- return Workorder.findById(id, function(err, workorder) {
- workorder.deleted = true;
+ return Workorder.findById(id, function (err, workorder) {
+ workorder.deleted = true;
- return workorder.save(function(err) {
- if (!err) {
- calendar.deleteEvent(workorder.calendarId, function(err) {
- return res.json(workorder);
- });
- } else {
- log.warn("Error: %s", err);
- return res.json(workorder);
- }
- })
- });
- }
- };
+ return workorder.save(function (err) {
+ if (!err) {
+ calendar.deleteEvent(workorder.calendarId, function (err) {
+ return res.json(workorder);
+ });
+ } else {
+ log.warn("Error: %s", err);
+ return res.json(workorder);
+ }
+ })
+ });
+ }
+ };
};
function generateSummary(client) {
- return client.name + ' (' + client.identifier + ')';
+ return client.name + ' (' + client.identifier + ')';
}
function generateLocation(client) {
- var data = {
- street1: client.address.street1 || '',
- street2: client.address.street2 || '',
- city: client.address.city || '',
- state: client.address.state || '',
- zip: client.address.zip || ''
- };
+ var data = {
+ street1: client.address.street1 || '',
+ street2: client.address.street2 || '',
+ city: client.address.city || '',
+ state: client.address.state || '',
+ zip: client.address.zip || ''
+ };
- return sprintf("%(street1)s %(street2)s %(city)s, %(state)s. %(zip)s", data);
+ return sprintf("%(street1)s %(street2)s %(city)s, %(state)s. %(zip)s", data);
}
function appendNotes(message, client, workorder) {
- var template =
- "%(message)s\n" +
- "Tech Notes:\n" +
- " %(notes)s\n" +
- "\n" +
- "Alternative Contact:\n" +
- " %(alternativeContact)s\n" +
- "\n";
+ var template =
+ "%(message)s\n" +
+ "Tech Notes:\n" +
+ " %(notes)s\n" +
+ "\n" +
+ "Alternative Contact:\n" +
+ " %(alternativeContact)s\n" +
+ "\n";
- if (client.notes && client.notes['tech']) {
- var resources = {
- message: message || '',
- notes: client.notes['tech'] || '',
- alternativeContact: workorder.alternativeContact || ''
- };
+ if (client.notes && client.notes['tech']) {
+ var resources = {
+ message: message || '',
+ notes: client.notes['tech'] || '',
+ alternativeContact: workorder.alternativeContact || ''
+ };
- return sprintf(template, resources);
- } else {
- return message;
- }
+ return sprintf(template, resources);
+ } else {
+ return message;
+ }
}
function generateDescription(client, workorder, createdBy, modifiedBy, techs, devices) {
- var template =
- "Workorder ID:\n" +
- " %(biomedId)s\n" +
- "\n" +
- "Scheduled Time:\n" +
- " %(scheduleStart)s - %(scheduleEnd)s\n" +
- "\n" +
- "Created By:\n" +
- " %(createdBy)s\n" +
- "\n" +
- "Last Edited By:\n" +
- " %(modifiedBy)s\n" +
- "\n" +
- "Customer:\n" +
- " %(name)s (%(identifier)s)\n" +
- "\n" +
- "Contact:\n" +
- " %(contact)s\n" +
- " %(phone)s\n" +
- "\n" +
- "Address:\n" +
- " %(street1)s\n" +
- " %(street2)s\n" +
- " %(city)s, %(state)s. %(zip)s\n" +
- "\n" +
- "Reason:\n" +
- " %(reason)s\n" +
- "\n" +
- "Status:\n" +
- " %(status)s\n" +
- "\n" +
- "Remarks:\n" +
- " %(remarks)s\n" +
- "\n" +
- "Devices:\n" +
- "%(devices)s\n";
+ var template =
+ "Workorder ID:\n" +
+ " %(biomedId)s\n" +
+ "\n" +
+ "Scheduled Time:\n" +
+ " %(scheduleStart)s - %(scheduleEnd)s\n" +
+ "\n" +
+ "Created By:\n" +
+ " %(createdBy)s\n" +
+ "\n" +
+ "Last Edited By:\n" +
+ " %(modifiedBy)s\n" +
+ "\n" +
+ "Customer:\n" +
+ " %(name)s (%(identifier)s)\n" +
+ "\n" +
+ "Contact:\n" +
+ " %(contact)s\n" +
+ " %(phone)s\n" +
+ "\n" +
+ "Address:\n" +
+ " %(street1)s\n" +
+ " %(street2)s\n" +
+ " %(city)s, %(state)s. %(zip)s\n" +
+ "\n" +
+ "Reason:\n" +
+ " %(reason)s\n" +
+ "\n" +
+ "Status:\n" +
+ " %(status)s\n" +
+ "\n" +
+ "Remarks:\n" +
+ " %(remarks)s\n" +
+ "\n" +
+ "Devices:\n" +
+ "%(devices)s\n";
- var format = "MMMM Do YYYY, h:mm a"
+ var format = "MMMM Do YYYY, h:mm a"
- var scheduleStart = moment(workorder.scheduling.start).format(format);
- var scheduleEnd = moment(workorder.scheduling.end).format(format);
+ var scheduleStart = moment(workorder.scheduling.start).format(format);
+ var scheduleEnd = moment(workorder.scheduling.end).format(format);
- var resources = {
- biomedId: workorder.biomedId || '',
- name: client.name || '',
- identifier: client.identifier || '',
- street1: client.address.street1 || '',
- street2: client.address.street2 || '',
- city: client.address.city || '',
- state: client.address.state || '',
- zip: client.address.zip || '',
- reason: workorder.reason || '',
- status: workorder.status || '',
- remarks: workorder.remarks || '',
- scheduleStart: scheduleStart,
- scheduleEnd: scheduleEnd,
- phone: '',
- contact: '',
- createdBy: '',
- modifiedBy: '',
- devices: ''
- };
+ var resources = {
+ biomedId: workorder.biomedId || '',
+ name: client.name || '',
+ identifier: client.identifier || '',
+ street1: client.address.street1 || '',
+ street2: client.address.street2 || '',
+ city: client.address.city || '',
+ state: client.address.state || '',
+ zip: client.address.zip || '',
+ reason: workorder.reason || '',
+ status: workorder.status || '',
+ remarks: workorder.remarks || '',
+ scheduleStart: scheduleStart,
+ scheduleEnd: scheduleEnd,
+ phone: '',
+ contact: '',
+ createdBy: '',
+ modifiedBy: '',
+ devices: ''
+ };
- if (client.contacts[0]) {
- resources.phone = client.contacts[0].phone || '';
- resources.contact = client.contacts[0].name || '';
- }
+ if (client.contacts[0]) {
+ resources.phone = client.contacts[0].phone || '';
+ resources.contact = client.contacts[0].name || '';
+ }
- if (createdBy) {
- resources.createdBy = createdBy.name.first + " " + createdBy.name.last;
- }
+ if (createdBy) {
+ resources.createdBy = createdBy.name.first + " " + createdBy.name.last;
+ }
- if (modifiedBy) {
- resources.modifiedBy = modifiedBy.name.first + " " + modifiedBy.name.last;
- }
+ if (modifiedBy) {
+ resources.modifiedBy = modifiedBy.name.first + " " + modifiedBy.name.last;
+ }
- if (devices) {
- for (var i = 0; i < devices.length; i++) {
- var device = devices[i];
+ if (devices) {
+ for (var i = 0; i < devices.length; i++) {
+ var device = devices[i];
- resources.devices += "\t(" + device.biomedId + ") " + device.deviceType.make + " " + device.deviceType.model + "\n";
- }
- }
+ resources.devices += "\t(" + device.biomedId + ") " + device.deviceType.make + " " + device.deviceType.model + "\n";
+ }
+ }
- var result = sprintf(template, resources);
- console.log(result);
+ var result = sprintf(template, resources);
+ console.log(result);
- return result;
+ return result;
}
function generateAttendees(techs, workorder) {
- return techs.map(function(t) { return t.email; }).concat(workorder.emails);
+ return techs.map(function (t) {
+ return t.email;
+ }).concat(workorder.emails);
}
function generateToLine(techs) {
- if (!techs) {
- return null;
- }
+ if (!techs) {
+ return null;
+ }
- var result = '';
- for (var i in techs) {
- var tech = techs[i]
+ var result = '';
+ for (var i in techs) {
+ var tech = techs[i]
- if (i > 0) {
- result += ", ";
- }
+ if (i > 0) {
+ result += ", ";
+ }
- result += tech.name.first + " " + tech.name.last + " <" + tech.email + ">"
- }
- return result;
+ result += tech.name.first + " " + tech.name.last + " <" + tech.email + ">"
+ }
+ return result;
}
diff --git a/app/model/timeClockException.js b/app/model/timeClockException.js
new file mode 100644
index 0000000..914ac9e
--- /dev/null
+++ b/app/model/timeClockException.js
@@ -0,0 +1,30 @@
+"use strict";
+
+var mongoose = require('mongoose');
+var Schema = mongoose.Schema;
+var ObjectId = Schema.ObjectId;
+
+const EXCEPTION_REASONS = [
+ 'late_to_first_workorder',
+ 'too_little_travel',
+ 'too_much_travel'
+];
+
+var schema = new Schema({
+ user: {
+ type: ObjectId,
+ ref: 'User',
+ required: true
+ },
+ date: {
+ type: Date,
+ required: true
+ },
+ reason: {
+ type: String,
+ enum: EXCEPTION_REASONS,
+ required: true
+ }
+});
+
+module.exports = mongoose.model('TimeClockException', schema);
diff --git a/app/model/timeClockSpan.js b/app/model/timeClockSpan.js
index 1a392b0..4035a42 100644
--- a/app/model/timeClockSpan.js
+++ b/app/model/timeClockSpan.js
@@ -1,58 +1,106 @@
"use strict";
+var moment = require('moment');
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var ObjectId = Schema.ObjectId;
var schema = new Schema({
+ user: {
+ type: ObjectId,
+ ref: 'User',
+ required: true
+ },
- user: {
- type: ObjectId,
- ref: 'User'
- },
-
- client: {
- type: ObjectId,
- ref: 'Client'
- },
-
- workorder: {
- type: ObjectId,
- ref: 'Workorder'
- },
-
- status: {
- type: String,
- enum: ['open', 'closed']
- },
-
- start: {
- type: Date
- },
-
- end: {
- type: Date
- },
-
- duration: {
- type: Number,
- min: 0
- },
-
- type: {
- type: String,
- enum: [ 'workorder', 'workday', 'nonBillable' ]
- },
-
- reason: {
- type: String,
- enum: ['shop', 'break', 'pto', 'meeting', 'event', 'weather', 'holiday']
- },
-
- notes: {
- type: String,
- trim: true
+ client: {
+ type: ObjectId,
+ ref: 'Client',
+ required: function() {
+ return this.type === 'workorder';
}
+ },
+
+ workorder: {
+ type: ObjectId,
+ ref: 'Workorder',
+ required: function() {
+ return this.type === 'workorder';
+ }
+ },
+
+ status: {
+ type: String,
+ enum: ['open', 'closed'],
+ required: true
+ },
+
+ start: {
+ type: Date,
+ required: true
+ },
+
+ end: {
+ type: Date,
+ required: function() {
+ return this.status === 'closed';
+ }
+ },
+
+ duration: {
+ type: Number,
+ min: 0
+ },
+
+ type: {
+ type: String,
+ enum: ['workorder', 'workday', 'nonBillable'],
+ required: true
+ },
+
+ reason: {
+ type: String,
+ enum: ['shop', 'break', 'pto', 'meeting', 'event', 'weather', 'holiday'],
+ required: function() {
+ return this.type === 'nonBillable';
+ }
+ },
+
+ notes: {
+ type: String,
+ trim: true,
+ required: function() {
+ return this.type === 'workorder' && this.status === 'closed';
+ }
+ }
+});
+
+schema.pre('save', function (next) {
+ if (this.status === 'open') {
+ this.end = undefined;
+ }
+
+ if (this.type === 'workorder') {
+ this.reason = undefined;
+ }
+
+ if (this.type !== 'workorder') {
+ this.workorder = undefined;
+ this.client = undefined;
+ }
+
+ if (this.start && this.end) {
+ this.duration = moment(this.end).diff(this.start, 'seconds');
+ }
+
+ next();
+});
+
+schema.pre('validate', function (next) {
+ if (this.start > this.end) {
+ return next(new Error('End date must be greater than start date.'));
+ }
+
+ next();
});
module.exports = mongoose.model('TimeClockSpan', schema);
diff --git a/app/model/user.js b/app/model/user.js
index de373c1..cc8fda6 100644
--- a/app/model/user.js
+++ b/app/model/user.js
@@ -11,10 +11,26 @@ var userSchema = new Schema({
picture: String,
refreshToken: String,
accessToken: String,
-
groups: [String],
perms: [String],
- deleted: { type: Boolean, default: false }
+
+ employmentType: {
+ type: String,
+ enum: ['hourly', 'salary'],
+ default: 'hourly',
+ required: true
+ },
+
+ unpaidTravel: {
+ type: Number,
+ default: 0,
+ required: true
+ },
+
+ deleted: {
+ type: Boolean,
+ default: false
+ }
});
userSchema.methods.hasPermission = function(perm) {
diff --git a/app/model/workorder.js b/app/model/workorder.js
index dbc0d3e..4d6788f 100644
--- a/app/model/workorder.js
+++ b/app/model/workorder.js
@@ -1,37 +1,70 @@
var mongoose = require('mongoose')
- Schema = mongoose.Schema,
- ObjectId = Schema.ObjectId;
+Schema = mongoose.Schema,
+ ObjectId = Schema.ObjectId;
var workorderSchema = new Schema({
- biomedId: Number,
- client: { type: ObjectId, ref: 'Client' },
- emails: [String],
- createdOn: Date,
- createdBy: { type: ObjectId, ref: 'User' },
- modifiedBy: { type: ObjectId, ref: 'User' },
- reason: String,
- maintenanceType: String,
- remarks: String,
- status: String,
- scheduling: {
- start: Date,
- end: Date
- },
- calendarId: String,
- techs: [{ type: ObjectId, ref: 'User' }],
- history: [{
- oldValues: {},
- newValues: {},
- modifiedBy: { type: ObjectId, ref: 'User' }
- }],
- deleted: { type: Boolean, default: false },
- invoiceNumber: String,
- invoicedOn: Date,
- checkNumber: String,
- paidOn: Date,
- alternativeContact: String,
- trackingNumber: String,
- devices: [{ type: ObjectId, ref: 'Device' }]
+ biomedId: Number,
+ client: {type: ObjectId, ref: 'Client'},
+ emails: [String],
+ createdOn: Date,
+ createdBy: {type: ObjectId, ref: 'User'},
+ modifiedBy: {type: ObjectId, ref: 'User'},
+ reason: String,
+ maintenanceType: String,
+ remarks: String,
+ status: String,
+ scheduling: {
+ start: Date,
+ end: Date
+ },
+ calendarId: String,
+ techs: [{type: ObjectId, ref: 'User'}],
+ history: [{
+ oldValues: {},
+ newValues: {},
+ modifiedBy: {type: ObjectId, ref: 'User'}
+ }],
+ deleted: {type: Boolean, default: false},
+ invoiceNumber: String,
+ invoicedTime: String,
+ invoicedOn: Date,
+ checkNumber: String,
+ paidOn: Date,
+ alternativeContact: String,
+ trackingNumber: String,
+ devices: [{type: ObjectId, ref: 'Device'}],
+ workorderType: {
+ type: String,
+ enum: [
+ 'office',
+ 'anesthesia',
+ 'biomed',
+ 'bsp',
+ 'ice',
+ 'imaging',
+ 'sales',
+ 'sterile-processing',
+ 'depot',
+ 'trace-gas',
+ 'room-air-exchange',
+ 'isolation-panels',
+ 'ups-systems',
+ 'relocation',
+ 'ice-maker',
+ 'waste-management-system',
+ 'medgas',
+ 'staffing',
+ 'ert',
+ 'shop',
+ 'break',
+ 'pto',
+ 'meeting',
+ 'event',
+ 'weather',
+ 'legacy'
+ ],
+ default: 'legacy'
+ },
});
module.exports = mongoose.model('Workorder', workorderSchema);
diff --git a/app/routes/exceptions.js b/app/routes/exceptions.js
new file mode 100644
index 0000000..f8e13e0
--- /dev/null
+++ b/app/routes/exceptions.js
@@ -0,0 +1,60 @@
+"use strict";
+
+const moment = require('moment-timezone');
+const _ = require('lodash');
+
+/**
+ * GET /api/exceptions
+ */
+function index(req, res) {
+ req.check('user').isMongoId();
+ req.check('date').optional().isISO8601();
+ req.check('week').optional().isISO8601();
+
+ if (!req.query.date && !req.query.week) {
+ return res.json({
+ error: {
+ message: 'Must specify a date filter.'
+ }
+ });
+ }
+
+ const query = {
+ user: req.query.user
+ };
+
+ if (req.query.date) {
+ const date = moment(req.query.date);
+
+ const startOfDay = date.clone().startOf('day');
+ const endOfDay = date.clone().endOf('day');
+
+ query.date = {
+ $gte: startOfDay,
+ $lte: endOfDay
+ };
+ }
+
+ if (req.query.week) {
+ const week = moment(req.query.week);
+
+ const startOfWeek = week.clone().startOf('week');
+ const endOfWeek = week.clone().endOf('week');
+
+ query.date = {
+ $gte: startOfWeek,
+ $lte: endOfWeek
+ };
+ }
+
+ var results = req.db.TimeClockException
+ .find(query)
+ .sort('date')
+ .exec();
+
+ res.promise(results);
+}
+
+module.exports = {
+ index
+};
diff --git a/app/routes/index.js b/app/routes/index.js
new file mode 100644
index 0000000..7b7bb70
--- /dev/null
+++ b/app/routes/index.js
@@ -0,0 +1,9 @@
+'use strict';
+
+module.exports = {
+ exceptions: require('./exceptions'),
+ misc: require('./misc'),
+ spans: require('./spans'),
+ users: require('./users'),
+ workorders: require('./workorders')
+};
diff --git a/app/routes/misc.js b/app/routes/misc.js
new file mode 100644
index 0000000..b421eed
--- /dev/null
+++ b/app/routes/misc.js
@@ -0,0 +1,53 @@
+"use strict";
+
+
+const email = require('../util/email');
+const moment = require('moment-timezone');
+const _ = require('lodash');
+var config = require('../../config/config')['prod'];
+
+var partsRequestTemplate = email.template(
+ 'partsRequest.html.tmpl',
+ 'partsRequest.text.tmpl',
+ 'Parts Request',
+ [
+ 'techName',
+ 'requestDate',
+ 'customerId',
+ 'customerName',
+ 'customerContact',
+ 'customerPhone',
+ 'biomedId',
+ 'manufacture',
+ 'model',
+ 'serialNumber',
+ 'vendor',
+ 'vendorPhone',
+ 'partNumber',
+ 'description',
+ 'specialNotes'
+ ]
+);
+
+
+/**
+ * POST /api/misc/partsRequest
+ */
+function partsRequest(req, res) {
+ const message = {
+ to: config.email.partsRequest
+ };
+
+ const defaultValues = {
+ techName: `${req.user.name.first} ${req.user.name.last}`,
+ requestDate: moment().format('LLLL')
+ };
+
+ const values = _.assign({}, req.body, defaultValues);
+
+ res.promise(email.send(message, partsRequestTemplate, values));
+}
+
+module.exports = {
+ partsRequest
+};
diff --git a/app/routes/spans.js b/app/routes/spans.js
new file mode 100644
index 0000000..019000e
--- /dev/null
+++ b/app/routes/spans.js
@@ -0,0 +1,97 @@
+"use strict";
+
+const moment = require('moment-timezone');
+const _ = require('lodash');
+
+/**
+ * GET /api/spans
+ */
+function index(req, res) {
+ req.check('user').optional().isMongoId();
+ req.check('workorder').optional().isMongoId();
+ req.check('date').optional().isISO8601();
+ req.check('week').optional().isISO8601();
+
+ if (!req.query.user && !req.query.workorder) {
+ return res.json({
+ error: {
+ message: 'Must specify a type filter.'
+ }
+ });
+ }
+
+ if (req.query.user && !req.query.date && !req.query.week) {
+ return res.json({
+ error: {
+ message: 'Must specify a date filter.'
+ }
+ });
+ }
+
+ const query = {};
+
+ if (req.query.user) {
+ query.user = req.query.user;
+ }
+
+ if (req.query.workorder) {
+ query.workorder = req.query.workorder;
+ }
+
+ if (req.query.date) {
+ const date = moment(req.query.date);
+
+ const startOfDay = date.clone().startOf('day');
+ const endOfDay = date.clone().endOf('day');
+
+ query.start = {
+ $gte: startOfDay,
+ $lte: endOfDay
+ };
+ }
+
+ if (req.query.week) {
+ const week = moment(req.query.week);
+
+ const startOfWeek = week.clone().startOf('week');
+ const endOfWeek = week.clone().endOf('week');
+
+ query.start = {
+ $gte: startOfWeek,
+ $lte: endOfWeek
+ };
+ }
+
+ var results = req.db.TimeClockSpan
+ .find(query)
+ .sort('start')
+ .exec();
+
+ res.promise(results);
+}
+
+/**
+ * POST /api/spans/:user_id
+ */
+function update(req, res) {
+ req.check('id').isMongoId();
+
+ var data = req.body;
+ delete data._id;
+ delete data.__v;
+
+ const result = req.db.TimeClockSpan
+ .findById(req.params.id)
+ .exec()
+ .then((entity) => {
+ _.assign(entity, data);
+ return entity.save();
+ });
+
+ res.promise(result);
+}
+
+module.exports = {
+ index,
+ update
+};
diff --git a/app/routes/users.js b/app/routes/users.js
new file mode 100644
index 0000000..b6ca491
--- /dev/null
+++ b/app/routes/users.js
@@ -0,0 +1,184 @@
+"use strict";
+
+const Promise = require('bluebird');
+const moment = require('moment-timezone');
+const _ = require('lodash');
+
+function filterFields(user) {
+ const obj = user.toObject();
+ delete obj.accessToken;
+ delete obj.refreshToken;
+ return obj
+}
+
+
+/**
+ * GET /api/users/:id
+ */
+function fetch(req, res) {
+ let result;
+
+ if (req.params.id === 'me') {
+ result = Promise.resolve(req.user);
+ } else {
+ result = req.db.User.findById(req.params.id);
+ }
+
+ res.promise(result.then(filterFields));
+}
+
+/**
+ * POST /api/users/:id
+ */
+function update(req, res) {
+ req.check('id').isMongoId();
+
+ var data = req.body;
+ delete data._id;
+ delete data.__v;
+ delete data.name;
+ delete data.email;
+ delete data.accessToken;
+ delete data.refreshToken;
+ delete data.deleted;
+
+ const result = req.db.User
+ .findById(req.params.id)
+ .exec()
+ .then((entity) => {
+ _.assign(entity, data);
+ return entity.save();
+ })
+ .then(filterFields);
+
+ res.promise(result);
+}
+
+/**
+ * GET /api/users/:id/daysWorked
+ */
+function daysWorked(req, res) {
+ const id = req.params.id === 'me' ? req.user.id : req.params.id;
+
+ const query = {
+ user: id,
+ type: 'workday'
+ };
+
+ const result = req.db.TimeClockSpan
+ .find(query)
+ .exec()
+ .then((records) => _.chain(records).reduce(accumulateDaysWorked, []).values());
+
+ res.promise(result);
+}
+
+/**
+ * GET /api/users/:id/weeksWorked
+ */
+function weeksWorked(req, res) {
+ const id = req.params.id === 'me' ? req.user.id : req.params.id;
+
+ const query = {
+ user: id,
+ type: 'workday'
+ };
+
+ const result = req.db.TimeClockSpan
+ .find(query)
+ .exec()
+ .then((records) => _.chain(records).reduce(accumulateWeeksWorked, []).values());
+
+ res.promise(result);
+}
+
+/**
+ * GET /api/users/:id/timeClock
+ */
+function timeClock(req, res) {
+ const id = req.params.id === 'me' ? req.user.id : req.params.id;
+ const date = moment(req.query.date);
+ const startOfDay = date.clone().startOf('day');
+ const endOfDay = date.clone().endOf('day');
+
+ var spans = req.db.TimeClockSpan
+ .find({
+ user: id,
+ start: {
+ $gte: startOfDay,
+ $lte: endOfDay
+ }
+ })
+ .sort({ start: 1 })
+ .exec();
+
+ var exceptions = req.db.TimeClockException
+ .find({
+ user: id,
+ date: {
+ $gte: startOfDay,
+ $lte: endOfDay
+ }
+ })
+ .exec();
+
+ var workorders = spans
+ .then(extractIds('workorder'))
+ .then((ids) => {
+ return req.db.Workorder
+ .find({
+ _id: {
+ $in: ids
+ }
+ })
+ .populate('client', 'name identifier')
+ .exec();
+ })
+ .then(indexById);
+
+ res.promise(Promise.props({
+ spans,
+ exceptions,
+ workorders
+ }));
+}
+
+function accumulateDaysWorked(result, record) {
+ const date = moment(record.start).local().startOf('day').format('YYYY-MM-DD');
+
+ if (result.indexOf(date) === -1) {
+ result.push(date);
+ }
+
+ return result;
+}
+
+function accumulateWeeksWorked(result, record) {
+ const date = moment(record.start).local().startOf('week').format('YYYY-MM-DD');
+
+ if (result.indexOf(date) === -1) {
+ result.push(date);
+ }
+
+ return result;
+}
+
+function extractIds(field) {
+ return (data) => _(data)
+ .pluck(field)
+ .reject(_.isUndefined)
+ .uniq((id) => id.toString())
+ .value();
+}
+
+function indexById(data) {
+ return _.indexBy(data, 'id')
+}
+
+module.exports = {
+ fetch,
+ update,
+ daysWorked,
+ weeksWorked,
+ timeClock
+};
diff --git a/app/routes/workorders.js b/app/routes/workorders.js
new file mode 100644
index 0000000..eb77bf5
--- /dev/null
+++ b/app/routes/workorders.js
@@ -0,0 +1,67 @@
+"use strict";
+
+const Promise = require('bluebird');
+const moment = require('moment-timezone');
+const _ = require('lodash');
+
+/**
+ * GET /api/workorders/:id/timeClock
+ */
+function timeClock(req, res) {
+ req.check('id').isMongoId();
+
+ const id = req.params.id;
+
+ const spans = req.db.TimeClockSpan
+ .find({
+ workorder: id
+ })
+ .exec();
+
+ const users = spans
+ .then(extractIds('user'))
+ .then((ids) => {
+ return req.db.User
+ .find({
+ _id: {
+ $in: ids
+ }
+ })
+ .select('name picture')
+ .exec();
+ })
+ .then(indexById);
+
+ const duration = spans
+ .then((spans) => {
+ let result = 0;
+ spans.forEach((span) => {
+ if (span.duration) {
+ result += span.duration;
+ }
+ });
+ return result;
+ });
+
+ res.promise(Promise.props({
+ duration,
+ spans,
+ users
+ }));
+}
+
+function extractIds(field) {
+ return (data) => _(data)
+ .pluck(field)
+ .reject(_.isUndefined)
+ .uniq((id) => id.toString())
+ .value();
+}
+
+function indexById(data) {
+ return _.indexBy(data, 'id')
+}
+
+module.exports = {
+ timeClock
+};
diff --git a/app/templates/exception.html.tmpl b/app/templates/exception.html.tmpl
new file mode 100644
index 0000000..ca8100b
--- /dev/null
+++ b/app/templates/exception.html.tmpl
@@ -0,0 +1,74 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Atlantic Biomedical
+ |
+
+
+ |
+
+
+
+
+
+
+ Tech Exception
+ |
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ The following exception was made by <%- techName %> at <%- date %> |
+
+
+ <%- message %> |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+
diff --git a/app/templates/exception.text.tmpl b/app/templates/exception.text.tmpl
new file mode 100644
index 0000000..0ca2de9
--- /dev/null
+++ b/app/templates/exception.text.tmpl
@@ -0,0 +1,3 @@
+The following exception was made by <%- techName %> on <%- date %>
+
+<%- message %>
diff --git a/app/templates/partsRequest.html.tmpl b/app/templates/partsRequest.html.tmpl
new file mode 100644
index 0000000..6b29596
--- /dev/null
+++ b/app/templates/partsRequest.html.tmpl
@@ -0,0 +1,146 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Atlantic Biomedical
+ |
+
+
+ |
+
+
+
+
+
+
+ Parts Request
+ |
+
+
+ |
+
+
+
+
+ |
+
+
+
+
+
+
+
+
+ The following request for parts was made by <%- techName %> on <%- requestDate %> |
+
+
+ Customer |
+
+
+ ID |
+ <%- customerId %> |
+
+
+ Name |
+ <%- customerName %> |
+
+ <% if (customerContact) { %>
+
+ Contact |
+ <%- customerContact %> |
+
+ <% } %>
+ <% if (customerPhone) { %>
+
+ Phone Number |
+ <%- customerPhone %> |
+
+ <% } %>
+ <% if (biomedId) { %>
+
+ Atlantic Biomedical ID |
+ <%- biomedId %> |
+
+ <% } %>
+
+ Part Details |
+
+
+ Manufacture |
+ <%- manufacture %> |
+
+
+ Model |
+ <%- model %> |
+
+
+ Serial Number |
+ <%- serialNumber %> |
+
+
+ Vendor |
+ <%- vendor %> |
+
+ <% if (vendorPhone) { %>
+
+ Vendor Phone Number |
+ <%- vendorPhone %> |
+
+ <% } %>
+
+ Part Number |
+ <%- partNumber %> |
+
+
+ Other Details |
+
+
+ Brief Description |
+
+
+ <%- description %> |
+
+ <% if (specialNotes) { %>
+
+ Special Notes |
+
+
+ <%- specialNotes %> |
+
+ <% } %>
+
+ |
+
+
+ |
+
+
+ |
+
+
+ |
+
+
+
+
diff --git a/app/templates/partsRequest.text.tmpl b/app/templates/partsRequest.text.tmpl
new file mode 100644
index 0000000..ca59bc1
--- /dev/null
+++ b/app/templates/partsRequest.text.tmpl
@@ -0,0 +1,58 @@
+The following request for parts was made by <%- techName %> on <%- requestDate %>
+
+Customer
+ID:
+ <%- customerId %>
+
+Name:
+ <%- customerName %>
+
+<% if (customerContact) { %>
+Contact:
+ <%- customerContact %>
+
+<% } %>
+<% if (customerPhone) { %>
+Phone Number:
+ <%- customerPhone %>
+
+<% } %>
+<% if (biomedId) { %>
+Atlantic Biomedical ID:
+ <%- biomedId %>
+
+<% } %>
+
+
+Part Details
+Manufacture:
+ <%- manufacture %>
+
+Model:
+ <%- model %>
+
+
+Serial Number:
+ <%- serialNumber %>
+
+Vendor:
+ <%- vendor %>
+
+<% if (vendorPhone) { %>
+Vendor Phone Number:
+ <%- vendorPhone %>
+
+<% } %>
+
+Part Number:
+ <%- partNumber %>
+
+
+Other Details
+Brief Description:
+<%- description %>
+<% if (specialNotes) { %>
+
+Special Notes:
+<%- specialNotes %>
+<% } %>
diff --git a/app/util/email.js b/app/util/email.js
new file mode 100644
index 0000000..66fe4ae
--- /dev/null
+++ b/app/util/email.js
@@ -0,0 +1,100 @@
+'use strict';
+
+const email = require('emailjs');
+const _ = require('lodash');
+const path = require('path');
+const Promise = require('bluebird');
+
+const fs = Promise.promisifyAll(require('fs'));
+var config = require('../../config/config')['prod'];
+
+const DEFAULT_HEADERS = {
+ from: 'api@atlanticbiomedical.com'
+};
+
+function template(htmlFile, textFile, subjectTemplate, defaultValues) {
+ if (_.isArray(defaultValues)) {
+ defaultValues = _.reduce(defaultValues, (result, key) => {
+ result[key] = '';
+ return result;
+ }, {});
+ }
+
+ const builder = template => {
+ template = _.template(template);
+ return (values) => {
+ values = _.assign({}, defaultValues, values);
+ return template(values);
+ };
+ };
+
+ var htmlTemplate = fs.readFileAsync(path.join(__dirname, '../templates', htmlFile));
+ var textTemplate = fs.readFileAsync(path.join(__dirname, '../templates', textFile));
+
+ return Promise
+ .props({
+ html: htmlTemplate,
+ text: textTemplate,
+ subject: subjectTemplate
+ })
+ .then(templates => {
+ return {
+ html: builder(templates.html),
+ text: builder(templates.text),
+ subject: builder(templates.subject)
+ }
+ });
+}
+
+function send(headers, template, values) {
+ var message = _.assign({}, DEFAULT_HEADERS, headers);
+ message = prepairHeaders(message);
+
+ return template.then(tmpl => {
+ message.text = tmpl.text(values);
+ message.subject = tmpl.subject(values);
+ message.attachment = [
+ {data: tmpl.html(values), alternative: true}
+ ];
+
+ const server = email.server.connect({
+ user: config.email.user,
+ password: config.email.password,
+ host: 'smtp.gmail.com',
+ ssl: true
+ });
+
+ return Promise.fromCallback(callback => {
+ server.send(message, callback);
+ });
+ })
+}
+
+function prepairHeaders(headers) {
+ return _.reduce(headers, (result, header, key) => {
+ if (!_.isArray(header)) {
+ header = [header];
+ }
+
+ if (key === 'subject') {
+ result[key] = header;
+ } else {
+ result[key] = _
+ .map(header, entry => {
+ if (_.isPlainObject(entry)) {
+ return `${entry.name} <${entry.email}>`;
+ } else {
+ return `<${entry}>`;
+ }
+ })
+ .join(', ');
+ }
+
+ return result;
+ }, {});
+}
+
+module.exports = {
+ send,
+ template
+};
diff --git a/config/auth.js b/config/auth.js
index cd59319..de863ed 100644
--- a/config/auth.js
+++ b/config/auth.js
@@ -8,203 +8,214 @@ var moment = require('moment');
var ACCESS_TOKEN_URL = 'https://accounts.google.com/o/oauth2/token';
var PEOPLE_API_URL = 'https://www.googleapis.com/plus/v1/people/me/openIdConnect';
-module.exports = function(app, passport, config) {
+module.exports = function (app, passport, config) {
- function createJWT(user) {
- var payload = {
- sub: user._id,
- iat: moment().unix(),
- exp: moment().add(14, 'days').unix()
- };
+ function createJWT(user) {
+ var payload = {
+ sub: user._id,
+ iat: moment().unix(),
+ exp: moment().add(14, 'days').unix()
+ };
- return jwt.encode(payload, config.auth.jwtSecret);
- }
+ return jwt.encode(payload, config.auth.jwtSecret);
+ }
- app.post('/auth2', function(req, res) {
- var params = {
- code: req.body.code,
- client_id: req.body.clientId,
- client_secret: config.auth.clientSecret,
- redirect_uri: req.body.redirectUri,
- grant_type: 'authorization_code'
- };
+ app.post('/auth2', function (req, res) {
+ var params = {
+ code: req.body.code,
+ client_id: req.body.clientId,
+ client_secret: config.auth.clientSecret,
+ redirect_uri: req.body.redirectUri,
+ grant_type: 'authorization_code'
+ };
- request.post(ACCESS_TOKEN_URL, { json: true, form: params }, function(err, response, token) {
- console.log(token);
+ request.post(ACCESS_TOKEN_URL, {json: true, form: params}, function (err, response, token) {
+ console.log(token);
- var accessToken = token.access_token;
- var headers = {
- Authorization: 'Bearer ' + accessToken
- };
+ var accessToken = token.access_token;
+ var headers = {
+ Authorization: 'Bearer ' + accessToken
+ };
- request.get({ url: PEOPLE_API_URL, headers: headers, json: true }, function(err, response, profile) {
- if (profile.error) {
- return res.status(500).send({ message: profile.error.message });
- }
+ request.get({url: PEOPLE_API_URL, headers: headers, json: true}, function (err, response, profile) {
+ if (profile.error) {
+ return res.status(500).send({message: profile.error.message});
+ }
- User.findOne({ email: profile.email.toLowerCase() }, function(err, user) {
- if (err) {
- return res.status(500).send(err);
- }
+ User.findOne({email: profile.email.toLowerCase()}, function (err, user) {
+ if (err) {
+ return res.status(500).send(err);
+ }
- if (!user || !user.hasPermission('system.login')) {
- return res.status(403).send({ message: "You are not authorized to access this portal."});
- }
+// if (!user || !user.hasPermission('system.login')) {
+// return res.status(403).send({message: "You are not authorized to access this portal."});
+// }
- user.accessToken = token.access_token;
+ user.accessToken = token.access_token;
- if (token.refresh_token) {
- user.refreshToken = token.refresh_token;
- }
+ if (token.refresh_token) {
+ user.refreshToken = token.refresh_token;
+ }
- if (profile.given_name) {
- user.name.first = profile.given_name;
- }
+ if (profile.given_name) {
+ user.name.first = profile.given_name;
+ }
- if (profile.family_name) {
- user.name.last = profile.family_name;
- }
+ if (profile.family_name) {
+ user.name.last = profile.family_name;
+ }
- if (profile.picture) {
- user.picture = profile.picture.replace('sz=50', 'sz=200');
- }
+ if (profile.picture) {
+ user.picture = profile.picture.replace('?sz=50', '');
+ }
- user.save()
- .then(function() {
- res.send({ token: createJWT(user) });
- });
- });
- });
- })
- });
-
-
-
- app.get('/auth', function(req, res, next) {
- console.dir(req.headers);
- req.session.redirectUrl = req.headers['referer'];
-
- passport.authenticate('google', {
- accessType: 'offline',
- scope: [
- 'https://www.googleapis.com/auth/userinfo.profile',
- 'https://www.googleapis.com/auth/userinfo.email',
- 'https://www.googleapis.com/auth/calendar'
- ]})(req, res, next);
- });
-
- app.get('/auth/callback', function(req, res, next) {
-
- var callbackHost = req.headers['x-forwarded-host'];
- if (!callbackHost) {
- callbackHost = "localhost:9000";
- }
-
- var options = {
- callbackURL: 'http://' + callbackHost + '/auth/callback'
- };
- passport.authenticate('google', options, function(err, user, info) {
- var redirectUrl = '/';
-
- if (err) { return next(err); }
- if (!user) { return res.redirect('/login/error'); }
-
- log.setPrefix("[%d] %l ");
- log.info("User Logged In: %s %s", user.name.first, user.name.last);
-
- res.cookie('atlbid', JSON.stringify(user._id), {signed:true});
-
- if (req.session.redirectUrl) {
- redirectUrl = req.session.redirectUrl;
- req.session.redirectUrl = null;
- }
-
- if (redirectUrl.indexOf('/login') != -1) {
- redirectUrl = '/';
- }
-
- req.logIn(user, function(err) {
- if (err) { return next(err); }
- });
-
- res.redirect(redirectUrl);
- })(req, res, next);
- });
-
- function createAuthenticator(error) {
- return function(req, res, next) {
- var onError = function() {
- error(req, res, next);
- };
-
- var onSuccess = function(user) {
- log.setPrefix(function(level) {
- return '[' + new Date().toUTCString() + '] ' + level.toUpperCase() + ' ' + user.name.first + ' ' + user.name.last + ' | ';
- });
- next();
- }
-
- if (!req.isAuthenticated()) {
- if (!req.headers.authorization) {
- return onError();
- }
-
- var token = req.headers.authorization.split(' ')[1];
- var payload = null;
- try {
- payload = jwt.decode(token, config.auth.jwtSecret);
- } catch (err) {
- return onError();
- }
-
- if (payload.exp <= moment().unix()) {
- return onError();
- }
-
- User.findById(payload.sub, function(err, user) {
- console.log('Loaded User');
- req.user = user;
-
- onSuccess(user);
- });
- } else {
- onSuccess(req.user);
- }
- }
- }
-
- return {
- requiresUiLogin: createAuthenticator(function(req, res, next) {
- res.redirect('/login');
- }),
-
- requiresApiAccess: createAuthenticator(function(req, res, next) {
- res.send(403);
- })
- };
-
-/*
- return {
- requiresUiLogin: function(req, res, next) {
- if (!req.isAuthenticated()) {
- return res.redirect('/login');
- }
-
- log.setPrefix(function(level) {
- return '[' + new Date().toUTCString() + '] ' + level.toUpperCase() + ' ' + req.user.name.first + ' ' + req.user.name.last + ' | ';
+ user.save()
+ .then(function () {
+ res.send({token: createJWT(user)});
});
- next();
- },
- requiresApiAccess: function(req, res, next) {
- if (!req.isAuthenticated()) {
- return res.send(403);
- }
+ });
+ });
+ })
+ });
- log.setPrefix(function(level) {
- return '[' + new Date().toUTCString() + '] ' + level.toUpperCase() + ' ' + req.user.name.first + ' ' + req.user.name.last + ' | ';
- });
- next();
- }
- };
-*/
+
+ app.get('/auth', function (req, res, next) {
+ console.dir(req.headers);
+ req.session.redirectUrl = req.headers['referer'];
+
+ passport.authenticate('google', {
+ accessType: 'offline',
+ scope: [
+ 'https://www.googleapis.com/auth/userinfo.profile',
+ 'https://www.googleapis.com/auth/userinfo.email',
+ 'https://www.googleapis.com/auth/calendar'
+ ]
+ })(req, res, next);
+ });
+
+ app.get('/auth/callback', function (req, res, next) {
+
+ var callbackHost = req.headers['x-forwarded-host'];
+ if (!callbackHost) {
+ callbackHost = "localhost:9000";
+ }
+
+ var options = {
+ callbackURL: 'http://' + callbackHost + '/auth/callback'
+ };
+ passport.authenticate('google', options, function (err, user, info) {
+ var redirectUrl = '/';
+
+ if (err) {
+ return next(err);
+ }
+ if (!user) {
+ return res.redirect('/login/error');
+ }
+
+ log.setPrefix("[%d] %l ");
+ log.info("User Logged In: %s %s", user.name.first, user.name.last);
+
+ res.cookie('atlbid', JSON.stringify(user._id), {signed: true});
+
+ if (req.session.redirectUrl) {
+ redirectUrl = req.session.redirectUrl;
+ req.session.redirectUrl = null;
+ }
+
+ if (redirectUrl.indexOf('/login') != -1) {
+ redirectUrl = '/';
+ }
+
+ req.logIn(user, function (err) {
+ if (err) {
+ return next(err);
+ }
+ });
+
+ res.redirect(redirectUrl);
+ })(req, res, next);
+ });
+
+ function createAuthenticator(error) {
+ return function (req, res, next) {
+ var onError = function () {
+ error(req, res, next);
+ };
+
+ var onSuccess = function (user) {
+ log.setPrefix(function (level) {
+ return '[' + new Date().toUTCString() + '] ' + level.toUpperCase() + ' ' + user.name.first + ' ' + user.name.last + ' | ';
+ });
+ next();
+ }
+
+ if (!req.isAuthenticated()) {
+ if (!req.headers.authorization) {
+ return onError();
+ }
+
+ var token = req.headers.authorization.split(' ')[1];
+ var payload = null;
+ try {
+ payload = jwt.decode(token, config.auth.jwtSecret);
+ } catch (err) {
+ return onError();
+ }
+
+ console.log(payload);
+
+ if (payload.exp <= moment().unix()) {
+ return onError();
+ }
+
+ User.findById(payload.sub, function (err, user) {
+ if (user) {
+ console.log('Loaded User');
+ req.user = user;
+ onSuccess(user);
+ } else {
+ onError();
+ }
+ });
+ } else {
+ onSuccess(req.user);
+ }
+ }
+ }
+
+ return {
+ requiresUiLogin: createAuthenticator(function (req, res, next) {
+ res.redirect('/login');
+ }),
+
+ requiresApiAccess: createAuthenticator(function (req, res, next) {
+ res.send(403);
+ })
+ };
+
+ /*
+ return {
+ requiresUiLogin: function(req, res, next) {
+ if (!req.isAuthenticated()) {
+ return res.redirect('/login');
+ }
+
+ log.setPrefix(function(level) {
+ return '[' + new Date().toUTCString() + '] ' + level.toUpperCase() + ' ' + req.user.name.first + ' ' + req.user.name.last + ' | ';
+ });
+ next();
+ },
+ requiresApiAccess: function(req, res, next) {
+ if (!req.isAuthenticated()) {
+ return res.send(403);
+ }
+
+ log.setPrefix(function(level) {
+ return '[' + new Date().toUTCString() + '] ' + level.toUpperCase() + ' ' + req.user.name.first + ' ' + req.user.name.last + ' | ';
+ });
+ next();
+ }
+ };
+ */
};
diff --git a/config/config.js b/config/config.js
index 698bfee..5e05563 100644
--- a/config/config.js
+++ b/config/config.js
@@ -1,44 +1,22 @@
module.exports = {
- development: {
- root: require('path').normalize(__dirname + '/..'),
- debug: true,
- database: 'mongodb://wootbox.wootroot.me/biomed_prod',
- auth: {
- clientId: '223145213165.apps.googleusercontent.com',
- clientSecret: '8MRNar9E_pRTOGTQonPzYOW_',
- callback: 'http://devel.portal.atlanticbiomedical.com/auth/callback',
- accessToken: 'ya29.AHES6ZR-vUVEh7CZzsEeGFSHqFfXtU1-LHyEAidi0CKhDGQ',
- refreshToken: '1/exRXjTaGNlWEo-HZZWyn4NTwJ4TY3wKb-_npce21c50'
- },
- email: {
- user: 'api@atlanticbiomedical.com',
- password: 'success4'
- },
- mysql: {
- host: 'biomed.akira.gs',
- user: 'biomed_prod',
- password: 'wUw3RB8rrXX4HwKj',
- database: 'biomed_prod'
- }
- },
prod: {
root: require('path').normalize(__dirname + '/..'),
debug: true,
- database: 'mongodb://localhost/biomed_prod',
+ database: 'mongodb://localhost/biomed',
auth: {
clientId: '333768673996-8epedo3je5h59n4l97v4dv8nofs7qnee.apps.googleusercontent.com',
clientSecret: 'afu9KhKxckWJ3Tk6uxzp9Pg6',
callback: 'http://localhost:9000/auth/callback',
-// accessToken: 'ya29.AHES6ZT1Sj1vpgidR2I_ksLdlV_VeZUjkitnZ01cP6VRrknjUEVbuw',
-// refreshToken: '1/XQW9P9FNYm6jikTsV8HOIuPAo1APYhwTH5CLhq9263g'
-
accessToken: 'ya29.1.AADtN_Xjt0PK6YVs8q5csiQFXQg2ZDtrVhsH6P4a5zm0mHqhGx0Nnjx4Jk68Gw',
refreshToken: '1/_5SkDLYmsi4XNaQyAzld-W5-GEqEqt5byH6VkI-j5QI',
jwtSecret: '97v4dvcsiQFXQg28nofedo3jemsi4XNaQy5h59n4l97m0mHqhGx0Nnjxv4dv8n'
},
email: {
user: 'api@atlanticbiomedical.com',
- password: 'success4'
+ password: 'success4',
+
+ partsRequest: 'akirayasha@gmail.com',
+ exception: 'akirayasha@gmail.com'
},
mysql: {
host: 'localhost',
diff --git a/config/db.js b/config/db.js
new file mode 100644
index 0000000..08e1e00
--- /dev/null
+++ b/config/db.js
@@ -0,0 +1,30 @@
+'use strict';
+
+const mongoose = require('mongoose');
+const models = [
+ 'CheckList',
+ 'Client',
+ 'Counter',
+ 'Device',
+ 'DeviceType',
+ 'Pm',
+ 'Post',
+ 'Tag',
+ 'TestRun',
+ 'TimeClockException',
+ 'TimeClockSpan',
+ 'User',
+ 'Workorder'
+];
+
+module.exports = function() {
+ return function(req, res, next) {
+ req.db = {};
+
+ models.forEach((model) => {
+ req.db[model] = mongoose.model(model);
+ });
+
+ next();
+ }
+};
diff --git a/config/express.js b/config/express.js
index e0d2e20..10160f5 100644
--- a/config/express.js
+++ b/config/express.js
@@ -1,6 +1,9 @@
var express = require('express');
var cors = require('cors');
var ClusterStore = require('strong-cluster-connect-store')(express.session);
+var validators = require('./validators');
+var db = require('./db');
+var promise = require('./promise');
module.exports = function(app, config, passport, piler) {
app.set('showStackError', true);
@@ -16,6 +19,9 @@ module.exports = function(app, config, passport, piler) {
// bodyParser should be above methodOverride
app.use(express.bodyParser());
+ app.use(validators());
+ app.use(db());
+ app.use(promise());
app.use(express.methodOverride());
app.use(express.session({ store: new ClusterStore(), secret: 'atlantic_biomed_server_secret' }));
@@ -40,9 +46,4 @@ module.exports = function(app, config, passport, piler) {
// routes should be last
app.use(app.router);
});
-
-// app.configure('development', function() {
-// // enable live update in development mode.
-// piler.liveUpdate();
-// });
}
diff --git a/config/promise.js b/config/promise.js
new file mode 100644
index 0000000..2dbe2ad
--- /dev/null
+++ b/config/promise.js
@@ -0,0 +1,36 @@
+'use strict';
+
+const mongoose = require('mongoose');
+
+module.exports = function() {
+ return function(req, res, next) {
+ res.promise = (promise) => {
+ promise
+ .then((data) => {
+ res.json({
+ data
+ });
+ })
+ .catch((error) => {
+ if (typeof error === 'string') {
+ return res.json(400, {
+ error: {
+ message: error
+ }
+ });
+ }
+
+ if (error.name === 'ValidationError') {
+ return res.json(400, {
+ error: error
+ });
+ }
+
+ console.log(error.stack);
+ res.json(500, 'Internal error');
+ });
+ };
+
+ next();
+ };
+};
diff --git a/config/routes.js b/config/routes.js
index 2291676..33e5f77 100644
--- a/config/routes.js
+++ b/config/routes.js
@@ -1,140 +1,168 @@
-var log = require('log4node');
-
-module.exports = function(app, auth, piler, calendar, directory, config) {
-
- piler.addCssUrl("//fonts.googleapis.com/css?family=Open+Sans:400,300");
- piler.addCssFile("/css/biomed.less");
-
- piler.addJsUrl("//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js");
- piler.addJsUrl("//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js");
- piler.addJsUrl("//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-route.js");
- piler.addJsUrl("//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-resource.js");
- piler.addJsUrl("http://d3js.org/d3.v2.js");
- piler.addJsUrl("https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js")
-
- piler.addJsFile("/js/lib/moment.js");
- piler.addJsFile("/js/lib/bootstrap-datepicker.js");
- piler.addJsFile("/js/lib/dialog.js");
- piler.addJsFile("/js/lib/select2.js");
- piler.addJsFile("/js/lib/dropzone.js");
- piler.addJsFile("/js/lib/hashids.js");
- piler.addJsFile("/js/app.js");
- piler.addJsFile("/js/controllers.js");
- piler.addJsFile("/js/controllers/checkLists.js");
- piler.addJsFile("/js/controllers/devices.js");
- piler.addJsFile("/js/controllers/deviceTypes.js");
- piler.addJsFile("/js/controllers/testRuns.js");
- piler.addJsFile("/js/directives.js");
- piler.addJsFile("/js/filters.js");
- piler.addJsFile("/js/services.js");
-
- app.get('/crash', function(req, res) {
- console.log('Commiting Suicide for Science!');
- process.nextTick(function() {
- throw new Error("Ermergerd!");
- });
- });
-
- app.all('/api/*', auth.requiresApiAccess);
-
- var posts = require('../app/controllers/posts');
- app.get('/api/posts', posts.index);
- app.get('/api/posts/:post_id', posts.get);
- app.post('/api/posts', posts.create);
- app.post('/api/posts/upload', posts.upload);
- app.post('/api/posts/:post_id', posts.update);
- app.del('/api/posts/:post_id', posts.destroy);
-
- var clients = require('../app/controllers/clients');
- app.get('/api/clients', clients.index);
- app.get('/api/clients/isUnique', clients.isUnique);
- app.get('/api/clients/frequencies', clients.frequencies);
- app.get('/api/clients/:client_id', clients.get);
- app.get('/api/clients/:client_id/workorders', clients.workorders);
- app.get('/api/clients/:client_id/tags', clients.tags);
- app.get('/api/clients/:client_id/devices', clients.devices);
- app.post('/api/clients', clients.create);
- app.post('/api/clients/:client_id', clients.update);
- app.del('/api/clients/:client_id', clients.destroy);
-
- var workorders = require('../app/controllers/workorders')(config, calendar);
- app.get('/api/workorders', workorders.index);
- app.get('/api/workorders/:workorder_id', workorders.get);
- app.post('/api/workorders', workorders.create);
- app.post('/api/workorders/:workorder_id', workorders.update);
- app.del('/api/workorders/:workorder_id', workorders.destroy);
-
- var devices = require('../app/controllers/devices');
- app.get('/api/devices', devices.index);
- app.get('/api/devices/isUnique', devices.isUnique);
- app.get('/api/devices/:device_id', devices.get);
- app.get('/api/devices/:device_id/test_runs', devices.testRuns);
- app.post('/api/devices', devices.create);
- app.post('/api/devices/:device_id', devices.update);
-
- var deviceTypes = require('../app/controllers/deviceTypes');
- app.get('/api/device_types', deviceTypes.index);
- app.get('/api/device_types/categories', deviceTypes.categories);
- app.get('/api/device_types/makes', deviceTypes.makes);
- app.get('/api/device_types/models', deviceTypes.models);
- app.post('/api/device_types/images', deviceTypes.upload);
- app.get('/api/device_types/:device_type_id', deviceTypes.get);
- app.post('/api/device_types', deviceTypes.create);
- app.post('/api/device_types/:device_type_id', deviceTypes.update);
-
- var checkLists = require('../app/controllers/checkLists');
- app.get('/api/check_lists', checkLists.index);
- app.get('/api/check_lists/:check_list_id', checkLists.get);
- app.post('/api/check_lists', checkLists.create);
- app.post('/api/check_lists/:check_list_id', checkLists.update);
-
- var testRuns = require('../app/controllers/testRuns')(config);
- app.get('/api/test_runs', testRuns.index);
- app.get('/api/test_runs/:test_run_id', testRuns.get);
- app.post('/api/test_runs', testRuns.create);
- app.post('/api/test_runs/:test_run_id', testRuns.update);
-
- var timeclock = require('../app/controllers/timeclock')();
- app.get('/api/timeclock', timeclock.index);
- app.post('/api/timeclock/clock_in', timeclock.clockIn);
- app.post('/api/timeclock/clock_out', timeclock.clockOut);
- app.get('/api/timeclock/workorder/:id', timeclock.workorderDetails);
-
- var pms = require('../app/controllers/pms');
- app.get('/api/pms', pms.index);
-
- var schedule = require('../app/controllers/schedule');
- app.get('/api/schedule', schedule.index);
-
- var users = require('../app/controllers/users')(config, directory);
- app.get('/api/users', users.index);
- app.get('/api/users/details', users.details);
- app.post('/api/users', users.create);
- app.post('/api/users/:user_id', users.update);
- app.get('/api/users/:user_id/clocks', users.clocks);
-
- var account = require('../app/controllers/account')(config);
- app.get('/api/account', account.profile);
- app.post('/api/account/impersonate', account.impersonate);
-
- var messages = require('../app/controllers/messages')(config);
- app.post('/api/messages/send', messages.send);
-
- var tags = require('../app/controllers/tags')(piler);
- app.post('/api/tags', tags.post);
-
- var clock = require('../app/controllers/clock')(piler);
- app.post('/api/clock', clock.post);
-
- var site = require('../app/controllers/site')(piler);
-
- var login = require('../app/controllers/login')(piler);
- app.get('/login', login.login);
- app.get('/login/error', login.error);
- app.get('/logout', login.logout);
-
- var home = require('../app/controllers/home')(piler);
-
- app.get('/', tags.index, auth.requiresUiLogin, clock.index, site.index, home.index);
- app.get('*', tags.index, auth.requiresUiLogin, clock.index, site.index, home.index);
-};
+var log = require('log4node');
+
+var routes = require('../app/routes');
+
+module.exports = function (app, auth, piler, calendar, directory, config) {
+
+ piler.addCssUrl("//fonts.googleapis.com/css?family=Open+Sans:400,300");
+ piler.addCssFile("/css/biomed.less");
+
+ piler.addJsUrl("//ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js");
+ piler.addJsUrl("//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular.js");
+ piler.addJsUrl("//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-route.js");
+ piler.addJsUrl("//ajax.googleapis.com/ajax/libs/angularjs/1.3.15/angular-resource.js");
+ piler.addJsUrl("http://d3js.org/d3.v2.js");
+ piler.addJsUrl("https://cdnjs.cloudflare.com/ajax/libs/lodash.js/3.10.1/lodash.js")
+
+ piler.addJsFile("/js/lib/moment.js");
+ piler.addJsFile("/js/lib/bootstrap-datepicker.js");
+ piler.addJsFile("/js/lib/dialog.js");
+ piler.addJsFile("/js/lib/select2.js");
+ piler.addJsFile("/js/lib/dropzone.js");
+ piler.addJsFile("/js/lib/hashids.js");
+ piler.addJsFile("/js/app.js");
+ piler.addJsFile("/js/controllers.js");
+ piler.addJsFile("/js/controllers/checkLists.js");
+ piler.addJsFile("/js/controllers/devices.js");
+ piler.addJsFile("/js/controllers/deviceTypes.js");
+ piler.addJsFile("/js/controllers/testRuns.js");
+ piler.addJsFile("/js/directives.js");
+ piler.addJsFile("/js/filters.js");
+ piler.addJsFile("/js/services.js");
+
+ app.get('/crash', function (req, res) {
+ console.log('Commiting Suicide for Science!');
+ process.nextTick(function () {
+ throw new Error("Ermergerd!");
+ });
+ });
+
+ app.all('/api/*', auth.requiresApiAccess);
+
+ var posts = require('../app/controllers/posts');
+ app.get('/api/posts', posts.index);
+ app.get('/api/posts/:post_id', posts.get);
+ app.post('/api/posts', posts.create);
+ app.post('/api/posts/upload', posts.upload);
+ app.post('/api/posts/:post_id', posts.update);
+ app.del('/api/posts/:post_id', posts.destroy);
+
+ var clients = require('../app/controllers/clients');
+ app.get('/api/clients', clients.index);
+ app.get('/api/clients/isUnique', clients.isUnique);
+ app.get('/api/clients/frequencies', clients.frequencies);
+ app.get('/api/clients/:client_id', clients.get);
+ app.get('/api/clients/:client_id/workorders', clients.workorders);
+ app.get('/api/clients/:client_id/tags', clients.tags);
+ app.get('/api/clients/:client_id/devices', clients.devices);
+ app.post('/api/clients', clients.create);
+ app.post('/api/clients/:client_id', clients.update);
+ app.del('/api/clients/:client_id', clients.destroy);
+
+ var workorders = require('../app/controllers/workorders')(config, calendar);
+ app.get('/api/workorders', workorders.index);
+ app.get('/api/workorders/:workorder_id', workorders.get);
+ app.post('/api/workorders', workorders.create);
+ app.post('/api/workorders/:workorder_id', workorders.update);
+ app.del('/api/workorders/:workorder_id', workorders.destroy);
+
+ var devices = require('../app/controllers/devices');
+ app.get('/api/devices', devices.index);
+ app.get('/api/devices/isUnique', devices.isUnique);
+ app.get('/api/devices/:device_id', devices.get);
+ app.get('/api/devices/:device_id/test_runs', devices.testRuns);
+ app.post('/api/devices', devices.create);
+ app.post('/api/devices/:device_id', devices.update);
+
+ var deviceTypes = require('../app/controllers/deviceTypes');
+ app.get('/api/device_types', deviceTypes.index);
+ app.get('/api/device_types/categories', deviceTypes.categories);
+ app.get('/api/device_types/makes', deviceTypes.makes);
+ app.get('/api/device_types/models', deviceTypes.models);
+ app.post('/api/device_types/images', deviceTypes.upload);
+ app.get('/api/device_types/:device_type_id', deviceTypes.get);
+ app.post('/api/device_types', deviceTypes.create);
+ app.post('/api/device_types/:device_type_id', deviceTypes.update);
+
+ var checkLists = require('../app/controllers/checkLists');
+ app.get('/api/check_lists', checkLists.index);
+ app.get('/api/check_lists/:check_list_id', checkLists.get);
+ app.post('/api/check_lists', checkLists.create);
+ app.post('/api/check_lists/:check_list_id', checkLists.update);
+
+ var testRuns = require('../app/controllers/testRuns')(config);
+ app.get('/api/test_runs', testRuns.index);
+ app.get('/api/test_runs/:test_run_id', testRuns.get);
+ app.post('/api/test_runs', testRuns.create);
+ app.post('/api/test_runs/:test_run_id', testRuns.update);
+
+ var timeclock = require('../app/controllers/timeclock')();
+ app.get('/api/timeclock', timeclock.index);
+ app.post('/api/timeclock/clock_in', timeclock.clockIn);
+ app.post('/api/timeclock/clock_out', timeclock.clockOut);
+ app.get('/api/timeclock/users/:user_id', timeclock.spansForUser);
+ app.get('/api/timeclock/workorder/:id', timeclock.workorderDetails);
+
+ var timesheet = require('../app/controllers/timesheet')();
+ app.get('/api/timesheet/summary', timesheet.summary);
+ app.get('/api/timesheet/:user_id/daysWorked', timesheet.daysWorked);
+ app.get('/api/timesheet/:user_id/summary', timesheet.userSummary);
+
+ var pms = require('../app/controllers/pms');
+ app.get('/api/pms', pms.index);
+
+ var schedule = require('../app/controllers/schedule');
+ app.get('/api/schedule', schedule.index);
+
+ var users = require('../app/controllers/users')(config, directory);
+ app.get('/api/users', users.index);
+ app.get('/api/users/details', users.details);
+ app.get('/api/users/:user_id', users.get);
+ app.post('/api/users', users.create);
+ app.post('/api/users/:user_id', users.update);
+ app.get('/api/users/:user_id/clocks', users.clocks);
+
+ var account = require('../app/controllers/account')(config);
+ app.get('/api/account', account.profile);
+ app.post('/api/account/impersonate', account.impersonate);
+
+ var messages = require('../app/controllers/messages')(config);
+ app.post('/api/messages/send', messages.send);
+
+ var tags = require('../app/controllers/tags')(piler);
+ app.post('/api/tags', tags.post);
+
+ var site = require('../app/controllers/site')(piler);
+
+ var login = require('../app/controllers/login')(piler);
+ app.get('/login', login.login);
+ app.get('/login/error', login.error);
+ app.get('/logout', login.logout);
+
+ var home = require('../app/controllers/home')(piler);
+
+
+
+ // Exceptions
+ app.get('/api/v2/exceptions', routes.exceptions.index);
+
+ // Spans
+ app.get('/api/v2/spans', routes.spans.index);
+ app.post('/api/v2/spans/:id', routes.spans.update);
+
+ // Users
+ app.get('/api/v2/users/:id/daysWorked', routes.users.daysWorked);
+ app.get('/api/v2/users/:id/weeksWorked', routes.users.weeksWorked);
+ app.get('/api/v2/users/:id/timeClock', routes.users.timeClock);
+ app.get('/api/v2/users/:id', routes.users.fetch);
+ app.post('/api/v2/users/:id', routes.users.update);
+
+ // Workorders
+ app.get('/api/v2/workorders/:id/timeClock', routes.workorders.timeClock);
+
+ // Misc
+ app.post('/api/v2/misc/partsRequest', routes.misc.partsRequest);
+
+ app.get('/', tags.index, auth.requiresUiLogin, site.index, home.index);
+ app.get('*', tags.index, auth.requiresUiLogin, site.index, home.index);
+};
diff --git a/config/validators.js b/config/validators.js
new file mode 100644
index 0000000..9266acb
--- /dev/null
+++ b/config/validators.js
@@ -0,0 +1,25 @@
+
+'use strict';
+
+var moment = require('moment');
+var expressValidator = require('express-validator');
+
+module.exports = function() {
+ return expressValidator({
+ customValidators: {
+ isWeek
+ },
+ customSanitizers: {
+ toMoment
+ }
+ });
+};
+
+function isWeek(str) {
+ let week = moment(str, 'YYYY-MM-DD');
+ return week.isValid() && week.weekday() === 0;
+}
+
+function toMoment(str) {
+ return moment(str);
+}
\ No newline at end of file
diff --git a/node_modules/bluebird/LICENSE b/node_modules/bluebird/LICENSE
index a3966cf..4182a1e 100644
--- a/node_modules/bluebird/LICENSE
+++ b/node_modules/bluebird/LICENSE
@@ -1,13 +1,13 @@
The MIT License (MIT)
-Copyright (c) 2014 Petka Antonov
+Copyright (c) 2013-2015 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:
+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.
diff --git a/node_modules/bluebird/README.md b/node_modules/bluebird/README.md
index 5e92095..2ffd5d0 100644
--- a/node_modules/bluebird/README.md
+++ b/node_modules/bluebird/README.md
@@ -5,657 +5,25 @@
[](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](#what-are-promises-and-why-should-i-use-them) library with focus on innovative features and performance
+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.
-
-# Topics
-
-- [Features](#features)
-- [Quick start](#quick-start)
-- [API Reference and examples](API.md)
-- [Support](#support)
-- [What are promises and why should I use them?](#what-are-promises-and-why-should-i-use-them)
-- [Questions and issues](#questions-and-issues)
-- [Error handling](#error-handling)
-- [Development](#development)
- - [Testing](#testing)
- - [Benchmarking](#benchmarks)
- - [Custom builds](#custom-builds)
- - [For library authors](#for-library-authors)
-- [What is the sync build?](#what-is-the-sync-build)
-- [License](#license)
-- [Snippets for common problems](https://github.com/petkaantonov/bluebird/wiki/Snippets)
-- [Promise anti-patterns](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns)
-- [Changelog](changelog.md)
-- [Optimization guide](#optimization-guide)
-
-# Features
-
-
-- [Promises A+](http://promisesaplus.com)
-- [Synchronous inspection](API.md#synchronous-inspection)
-- [Concurrency coordination](API.md#collections)
-- [Promisification on steroids](API.md#promisification)
-- [Resource management through a parallel of python `with`/C# `using`](API.md#resource-management)
-- [Cancellation and timeouts](API.md#cancellation)
-- [Parallel for C# `async` and `await`](API.md#generators)
-- Mind blowing utilities such as
- - [`.bind()`](API.md#binddynamic-thisarg---promise)
- - [`.call()`](API.md#callstring-propertyname--dynamic-arg---promise)
- - [`Promise.join()`](API.md#promisejoinpromisethenablevalue-promises-function-handler---promise)
- - [And](API.md#core) [much](API.md#timers) [more](API.md#utility)!
-- [Practical debugging solutions and sane defaults](#error-handling)
-- [Sick performance](benchmark/)
-
-
-
-# Quick start
-
-## Node.js
-
- npm install bluebird
-
-Then:
-
-```js
-var Promise = require("bluebird");
-```
-
-## Browsers
-
-There are many ways to use bluebird in browsers:
-
-- Direct downloads
- - Full build [bluebird.js](https://cdn.jsdelivr.net/bluebird/latest/bluebird.js)
- - Full build minified [bluebird.min.js](https://cdn.jsdelivr.net/bluebird/latest/bluebird.min.js)
-- You may use browserify on the main export
-- You may use the [bower](http://bower.io) package.
-
-When using script tags the global variables `Promise` and `P` (alias for `Promise`) become available.
-
-A [minimal bluebird browser build](#custom-builds) is ≈38.92KB minified*, 11.65KB gzipped and has no external dependencies.
-
-*Google Closure Compiler using Simple.
-
-#### Browser support
-
-Browsers that [implement ECMA-262, edition 3](http://en.wikipedia.org/wiki/Ecmascript#Implementations) and later are supported.
-
-[](https://saucelabs.com/u/petka_antonov)
-
-**Note** that in ECMA-262, edition 3 (IE7, IE8 etc.) it is not possible to use methods that have keyword names like `.catch` and `.finally`. The [API documentation](API.md) always lists a compatible alternative name that you can use if you need to support these browsers. For example `.catch` is replaced with `.caught` and `.finally` with `.lastly`.
-
-Also, [long stack trace](API.md#promiselongstacktraces---void) support is only available in Chrome, Firefox and Internet Explorer 10+.
-
-After quick start, see [API Reference and examples](API.md)
-
-
-
-# Support
-
-- Mailing list: [bluebird-js@googlegroups.com](https://groups.google.com/forum/#!forum/bluebird-js)
-- IRC: #promises @freenode
-- StackOverflow: [bluebird tag](http://stackoverflow.com/questions/tagged/bluebird)
-- Bugs and feature requests: [github issue tracker](https://github.com/petkaantonov/bluebird/issues?state=open)
-
-
-
-# What are promises and why should I use them?
-
-You should use promises to turn this:
-
-```js
-fs.readFile("file.json", function(err, val) {
- if( err ) {
- console.error("unable to read file");
- }
- else {
- try {
- val = JSON.parse(val);
- console.log(val.success);
- }
- catch( e ) {
- console.error("invalid json in file");
- }
- }
-});
-```
-
-Into this:
-
-```js
-fs.readFileAsync("file.json").then(JSON.parse).then(function(val) {
- console.log(val.success);
-})
-.catch(SyntaxError, function(e) {
- console.error("invalid json in file");
-})
-.catch(function(e) {
- console.error("unable to read file")
-});
-```
-
-*If you are wondering "there is no `readFileAsync` method on `fs` that returns a promise", see [promisification](API.md#promisification)*
-
-Actually you might notice the latter has a lot in common with code that would do the same using synchronous I/O:
-
-```js
-try {
- var val = JSON.parse(fs.readFileSync("file.json"));
- console.log(val.success);
-}
-//Syntax actually not supported in JS but drives the point
-catch(SyntaxError e) {
- console.error("invalid json in file");
-}
-catch(Error e) {
- console.error("unable to read file")
-}
-```
-
-And that is the point - being able to have something that is a lot like `return` and `throw` in synchronous code.
-
-You can also use promises to improve code that was written with callback helpers:
-
-
-```js
-//Copyright Plato http://stackoverflow.com/a/19385911/995876
-//CC BY-SA 2.5
-mapSeries(URLs, function (URL, done) {
- var options = {};
- needle.get(URL, options, function (error, response, body) {
- if (error) {
- return done(error)
- }
- try {
- var ret = JSON.parse(body);
- return done(null, ret);
- }
- catch (e) {
- done(e);
- }
- });
-}, function (err, results) {
- if (err) {
- console.log(err)
- } else {
- console.log('All Needle requests successful');
- // results is a 1 to 1 mapping in order of URLs > needle.body
- processAndSaveAllInDB(results, function (err) {
- if (err) {
- return done(err)
- }
- console.log('All Needle requests saved');
- done(null);
- });
- }
-});
-```
-
-Is more pleasing to the eye when done with promises:
-
-```js
-Promise.promisifyAll(needle);
-var options = {};
-
-var current = Promise.resolve();
-Promise.map(URLs, function(URL) {
- current = current.then(function () {
- return needle.getAsync(URL, options);
- });
- return current;
-}).map(function(responseAndBody){
- return JSON.parse(responseAndBody[1]);
-}).then(function (results) {
- return processAndSaveAllInDB(results);
-}).then(function(){
- console.log('All Needle requests saved');
-}).catch(function (e) {
- console.log(e);
-});
-```
-
-Also promises don't just give you correspondences for synchronous features but can also be used as limited event emitters or callback aggregators.
-
-More reading:
-
- - [Promise nuggets](https://promise-nuggets.github.io/)
- - [Why I am switching to promises](http://spion.github.io/posts/why-i-am-switching-to-promises.html)
- - [What is the the point of promises](http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/#toc_1)
- - [Snippets for common problems](https://github.com/petkaantonov/bluebird/wiki/Snippets)
- - [Promise anti-patterns](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns)
+For bluebird 2.x documentation and files, see the [2.x tree](https://github.com/petkaantonov/bluebird/tree/2.x).
# Questions and issues
-If you find a bug in bluebird or have a feature request, file an issue in the [github issue tracker](https://github.com/petkaantonov/bluebird/issues). 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`.
-
-# Error handling
-
-This is a problem every promise library needs to handle in some way. Unhandled rejections/exceptions don't really have a good agreed-on asynchronous correspondence. The problem is that it is impossible to predict the future and know if a rejected promise will eventually be handled.
-
-There are two common pragmatic attempts at solving the problem that promise libraries do.
-
-The more popular one is to have the user explicitly communicate that they are done and any unhandled rejections should be thrown, like so:
-
-```js
-download().then(...).then(...).done();
-```
-
-For handling this problem, in my opinion, this is completely unacceptable and pointless. The user must remember to explicitly call `.done` and that cannot be justified when the problem is forgetting to create an error handler in the first place.
-
-The second approach, which is what bluebird by default takes, is to call a registered handler if a rejection is unhandled by the start of a second turn. The default handler is to write the stack trace to `stderr` or `console.error` in browsers. This is close to what happens with synchronous code - your code doesn't work as expected and you open console and see a stack trace. Nice.
-
-Of course this is not perfect, if your code for some reason needs to swoop in and attach error handler to some promise after the promise has been hanging around a while then you will see annoying messages. In that case you can use the `.done()` method to signal that any hanging exceptions should be thrown.
-
-If you want to override the default handler for these possibly unhandled rejections, you can pass yours like so:
-
-```js
-Promise.onPossiblyUnhandledRejection(function(error){
- throw error;
-});
-```
-
-If you want to also enable long stack traces, call:
-
-```js
-Promise.longStackTraces();
-```
-
-right after the library is loaded.
-
-In node.js use the environment flag `BLUEBIRD_DEBUG`:
-
-```
-BLUEBIRD_DEBUG=1 node server.js
-```
-
-to enable long stack traces in all instances of bluebird.
-
-Long stack traces cannot be disabled after being enabled, and cannot be enabled after promises have already been created. Long stack traces imply a substantial performance penalty, even after using every trick to optimize them.
-
-Long stack traces are enabled by default in the debug build.
-
-#### Expected and unexpected errors
-
-A practical problem with Promises/A+ is that it models Javascript `try-catch` too closely for its own good. Therefore by default promises inherit `try-catch` warts such as the inability to specify the error types that the catch block is eligible for. It is an anti-pattern in every other language to use catch-all handlers because they swallow exceptions that you might not know about.
-
-Now, Javascript does have a perfectly fine and working way of creating error type hierarchies. It is still quite awkward to use them with the built-in `try-catch` however:
-
-```js
-try {
- //code
-}
-catch(e) {
- if( e instanceof WhatIWantError) {
- //handle
- }
- else {
- throw e;
- }
-}
-```
-
-Without such checking, unexpected errors would be silently swallowed. However, with promises, bluebird brings the future (hopefully) here now and extends the `.catch` to [accept potential error type eligibility](API.md#catchfunction-errorclass-function-handler---promise).
-
-For instance here it is expected that some evil or incompetent entity will try to crash our server from `SyntaxError` by providing syntactically invalid JSON:
-
-```js
-getJSONFromSomewhere().then(function(jsonString) {
- return JSON.parse(jsonString);
-}).then(function(object) {
- console.log("it was valid json: ", object);
-}).catch(SyntaxError, function(e){
- console.log("don't be evil");
-});
-```
-
-Here any kind of unexpected error will automatically reported on `stderr` along with a stack trace because we only register a handler for the expected `SyntaxError`.
-
-Ok, so, that's pretty neat. But actually not many libraries define error types and it is in fact a complete ghetto out there with ad hoc strings being attached as some arbitrary property name like `.name`, `.type`, `.code`, not having any property at all or even throwing strings as errors and so on. So how can we still listen for expected errors?
-
-Bluebird defines a special error type `OperationalError` (you can get a reference from `Promise.OperationalError`). This type of error is given as rejection reason by promisified methods when
-their underlying library gives an untyped, but expected error. Primitives such as strings, and error objects that are directly created like `new Error("database didn't respond")` are considered untyped.
-
-Example of such library is the node core library `fs`. So if we promisify it, we can catch just the errors we want pretty easily and have programmer errors be redirected to unhandled rejection handler so that we notice them:
-
-```js
-//Read more about promisification in the API Reference:
-//API.md
-var fs = Promise.promisifyAll(require("fs"));
-
-fs.readFileAsync("myfile.json").then(JSON.parse).then(function (json) {
- console.log("Successful json")
-}).catch(SyntaxError, function (e) {
- console.error("file contains invalid json");
-}).catch(Promise.OperationalError, function (e) {
- console.error("unable to read file, because: ", e.message);
-});
-```
-
-The last `catch` handler is only invoked when the `fs` module explicitly used the `err` argument convention of async callbacks to inform of an expected error. The `OperationalError` instance will contain the original error in its `.cause` property but it does have a direct copy of the `.message` and `.stack` too. In this code any unexpected error - be it in our code or the `fs` module - would not be caught by these handlers and therefore not swallowed.
-
-Since a `catch` handler typed to `Promise.OperationalError` is expected to be used very often, it has a neat shorthand:
-
-```js
-.error(function (e) {
- console.error("unable to read file, because: ", e.message);
-});
-```
-
-See [API documentation for `.error()`](API.md#error-rejectedhandler----promise)
-
-Finally, Bluebird also supports predicate-based filters. If you pass a
-predicate function instead of an error type, the predicate will receive
-the error as an argument. The return result will be used to determine whether
-the error handler should be called.
-
-Predicates should allow for very fine grained control over caught errors:
-pattern matching, error typesets with set operations and many other techniques
-can be implemented on top of them.
-
-Example of using a predicate-based filter:
-
-```js
-var Promise = require("bluebird");
-var request = Promise.promisify(require("request"));
-
-function clientError(e) {
- return e.code >= 400 && e.code < 500;
-}
-
-request("http://www.google.com").then(function(contents){
- console.log(contents);
-}).catch(clientError, function(e){
- //A client error like 400 Bad Request happened
-});
-```
-
-**Danger:** The JavaScript language allows throwing primitive values like strings. Throwing primitives can lead to worse or no stack traces. Primitives [are not exceptions](http://www.devthought.com/2011/12/22/a-string-is-not-an-error/). You should consider always throwing Error objects when handling exceptions.
-
-
-
-#### How do long stack traces differ from e.g. Q?
-
-Bluebird attempts to have more elaborate traces. Consider:
-
-```js
-Error.stackTraceLimit = 25;
-Q.longStackSupport = true;
-Q().then(function outer() {
- return Q().then(function inner() {
- return Q().then(function evenMoreInner() {
- a.b.c.d();
- }).catch(function catcher(e){
- console.error(e.stack);
- });
- })
-});
-```
-
-You will see
-
- ReferenceError: a is not defined
- at evenMoreInner (:7:13)
- From previous event:
- at inner (:6:20)
-
-Compare to:
-
-```js
-Error.stackTraceLimit = 25;
-Promise.longStackTraces();
-Promise.resolve().then(function outer() {
- return Promise.resolve().then(function inner() {
- return Promise.resolve().then(function evenMoreInner() {
- a.b.c.d()
- }).catch(function catcher(e){
- console.error(e.stack);
- });
- });
-});
-```
-
- ReferenceError: a is not defined
- at evenMoreInner (:7:13)
- From previous event:
- at inner (:6:36)
- From previous event:
- at outer (:5:32)
- From previous event:
- at :4:21
- at Object.InjectedScript._evaluateOn (:572:39)
- at Object.InjectedScript._evaluateAndWrap (:531:52)
- at Object.InjectedScript.evaluate (:450:21)
-
-
-A better and more practical example of the differences can be seen in gorgikosev's [debuggability competition](https://github.com/spion/async-compare#debuggability).
-
-
-
-# Development
-
-For development tasks such as running benchmarks or testing, you need to clone the repository and install dev-dependencies.
-
-Install [node](http://nodejs.org/) and [npm](https://npmjs.org/)
-
- git clone git@github.com:petkaantonov/bluebird.git
- cd bluebird
- npm install
-
-## Testing
-
-To run all tests, run
-
- node tools/test
-
-If you need to run generator tests run the `tool/test.js` script with `--harmony` argument and node 0.11+:
-
- node-dev --harmony tools/test
-
-You may specify an individual test file to run with the `--run` script flag:
-
- node tools/test --run=cancel.js
-
-
-This enables output from the test and may give a better idea where the test is failing. The paramter to `--run` can be any file name located in `test/mocha` folder.
-
-#### Testing in browsers
-
-To run the test in a browser instead of node, pass the flag `--browser` to the test tool
-
- node tools/test --run=cancel.js --browser
-
-This will automatically create a server (default port 9999) and open it in your default browser once the tests have been compiled.
-
-Keep the test tab active because some tests are timing-sensitive and will fail if the browser is throttling timeouts. Chrome will do this for example when the tab is not active.
-
-#### Supported options by the test tool
-
-The value of boolean flags is determined by presence, if you want to pass false value for a boolean flag, use the `no-`-prefix e.g. `--no-browser`.
-
- - `--run=String`. Which tests to run (or compile when testing in browser). Default `"all"`. Can also be a glob string (relative to ./test/mocha folder)
- - `--cover=String`. Create code coverage using the String as istanbul reporter. Coverage is created in the ./coverage folder. No coverage is created by default, default reporter is `"html"` (use `--cover` to use default reporter).
- - `--browser` - Whether to compile tests for browsers. Default `false`.
- - `--port=Number` - Whe port where local server is hosted when testing in browser. Default `9999`
- - `--execute-browser-tests` - Whether to execute the compiled tests for browser when using `--browser`. Default `true`.
- - `--open-browser` - Whether to open the default browser when executing browser tests. Default `true`.
- - `--fake-timers` - Whether to use fake timers (`setTimeout` etc) when running tests in node. Default `true`.
- - `--js-hint` - Whether to run JSHint on source files. Default `true`.
- - `--saucelabs` Wheter to create a tunnel to sauce labs and run tests in their VMs instead of your browser when compiling tests for browser.Default `false`.
-
-## Benchmarks
-
-To run a benchmark, run the given command for a benchmark while on the project root. Requires bash (on windows the mingw32 that comes with git works fine too).
-
-Node 0.11.2+ is required to run the generator examples.
-
-### 1\. DoxBee sequential
-
-Currently the most relevant benchmark is @gorkikosev's benchmark in the article [Analysis of generators and other async patterns in node](http://spion.github.io/posts/analysis-generators-and-other-async-patterns-node.html). The benchmark emulates a situation where n amount of users are making a request in parallel to execute some mixed async/sync action. The benchmark has been modified to include a warm-up phase to minimize any JITing during timed sections.
-
-Command: `bench doxbee`
-
-### 2\. Made-up parallel
-
-This made-up scenario runs 15 shimmed queries in parallel.
-
-Command: `bench parallel`
-
-## Custom builds
-
-Custom builds for browsers are supported through a command-line utility.
-
-
-
-
-
-Make sure you have cloned the repo somewhere and did `npm install` successfully.
-
-After that you can run:
-
- node tools/build --features="core"
-
-
-The above builds the most minimal build you can get. You can add more features separated by spaces from the above list:
-
- node tools/build --features="core filter map reduce"
-
-The custom build file will be found from `/js/browser/bluebird.js`. It will have a comment that lists the disabled and enabled features.
-
-Note that the build leaves the `/js/main` etc folders with same features so if you use the folder for node.js at the same time, don't forget to build
-a full version afterwards (after having taken a copy of the bluebird.js somewhere):
-
- node tools/build --debug --main --zalgo --browser --minify
-
-#### Supported options by the build tool
-
-The value of boolean flags is determined by presence, if you want to pass false value for a boolean flag, use the `no-`-prefix e.g. `--no-debug`.
-
- - `--main` - Whether to build the main build. The main build is placed at `js/main` directory. Default `false`.
- - `--debug` - Whether to build the debug build. The debug build is placed at `js/debug` directory. Default `false`.
- - `--zalgo` - Whether to build the zalgo build. The zalgo build is placed at `js/zalgo` directory. Default `false`.
- - `--browser` - Whether to compile the browser build. The browser build file is placed at `js/browser/bluebird.js` Default `false`.
- - `--minify` - Whether to minify the compiled browser build. The minified browser build file is placed at `js/browser/bluebird.min.js` Default `true`.
- - `--features=String` - See [custom builds](#custom-builds)
-
-
-
-## For library authors
-
-Building a library that depends on bluebird? You should know about a few features.
-
-If your library needs to do something obtrusive like adding or modifying methods on the `Promise` prototype, uses long stack traces or uses a custom unhandled rejection handler then... that's totally ok as long as you don't use `require("bluebird")`. Instead you should create a file
-that creates an isolated copy. For example, creating a file called `bluebird-extended.js` that contains:
-
-```js
- //NOTE the function call right after
-module.exports = require("bluebird/js/main/promise")();
-```
-
-Your library can then use `var Promise = require("bluebird-extended");` and do whatever it wants with it. Then if the application or other library uses their own bluebird promises they will all play well together because of Promises/A+ thenable assimilation magic.
-
-You should also know about [`.nodeify()`](API.md#nodeifyfunction-callback---promise) which makes it easy to provide a dual callback/promise API.
-
-
-
-## What is the sync build?
-
-You may now use sync build by:
-
- var Promise = require("bluebird/zalgo");
-
-The sync build is provided to see how forced asynchronity affects benchmarks. It should not be used in real code due to the implied hazards.
-
-The normal async build gives Promises/A+ guarantees about asynchronous resolution of promises. Some people think this affects performance or just plain love their code having a possibility
-of stack overflow errors and non-deterministic behavior.
-
-The sync build skips the async call trampoline completely, e.g code like:
-
- async.invoke( this.fn, this, val );
-
-Appears as this in the sync build:
-
- this.fn(val);
-
-This should pressure the CPU slightly less and thus the sync build should perform better. Indeed it does, but only marginally. The biggest performance boosts are from writing efficient Javascript, not from compromising determinism.
-
-Note that while some benchmarks are waiting for the next event tick, the CPU is actually not in use during that time. So the resulting benchmark result is not completely accurate because on node.js you only care about how much the CPU is taxed. Any time spent on CPU is time the whole process (or server) is paralyzed. And it is not graceful like it would be with threads.
-
-
-```js
-var cache = new Map(); //ES6 Map or DataStructures/Map or whatever...
-function getResult(url) {
- var resolver = Promise.pending();
- if (cache.has(url)) {
- resolver.resolve(cache.get(url));
- }
- else {
- http.get(url, function(err, content) {
- if (err) resolver.reject(err);
- else {
- cache.set(url, content);
- resolver.resolve(content);
- }
- });
- }
- return resolver.promise;
-}
-
-
-
-//The result of console.log is truly random without async guarantees
-function guessWhatItPrints( url ) {
- var i = 3;
- getResult(url).then(function(){
- i = 4;
- });
- console.log(i);
-}
-```
-
-# Optimization guide
-
-Articles about optimization will be periodically posted in [the wiki section](https://github.com/petkaantonov/bluebird/wiki), polishing edits are welcome.
-
-A single cohesive guide compiled from the articles will probably be done eventually.
+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`.
# License
The MIT License (MIT)
-Copyright (c) 2014 Petka Antonov
+Copyright (c) 2013-2015 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
diff --git a/node_modules/bluebird/changelog.md b/node_modules/bluebird/changelog.md
new file mode 100644
index 0000000..73b2eb6
--- /dev/null
+++ b/node_modules/bluebird/changelog.md
@@ -0,0 +1 @@
+[http://bluebirdjs.com/docs/changelog.html](http://bluebirdjs.com/docs/changelog.html)
diff --git a/node_modules/bluebird/js/browser/bluebird.js b/node_modules/bluebird/js/browser/bluebird.js
index c42fe29..8c742cd 100644
--- a/node_modules/bluebird/js/browser/bluebird.js
+++ b/node_modules/bluebird/js/browser/bluebird.js
@@ -1,14 +1,14 @@
/* @preserve
* The MIT License (MIT)
*
- * Copyright (c) 2014 Petka Antonov
+ * Copyright (c) 2013-2015 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:
+ * 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.
@@ -23,8 +23,8 @@
*
*/
/**
- * bluebird build version 2.9.24
- * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, cancel, using, filter, any, each, timers
+ * bluebird build version 3.0.6
+ * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, using, timers, filter, any, each
*/
!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var f;"undefined"!=typeof window?f=window:"undefined"!=typeof global?f=global:"undefined"!=typeof self&&(f=self),f.Promise=e()}}(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof _dereq_=="function"&&_dereq_;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof _dereq_=="function"&&_dereq_;for(var o=0;o 0;
+
+Async.prototype.fatalError = function(e, isNode) {
+ if (isNode) {
+ process.stderr.write("Fatal " + (e instanceof Error ? e.stack : e));
+ process.exit(2);
+ } else {
+ this.throwLater(e);
+ }
};
Async.prototype.throwLater = function(fn, arg) {
@@ -94,8 +100,6 @@ Async.prototype.throwLater = function(fn, arg) {
arg = fn;
fn = function () { throw arg; };
}
- var domain = this._getDomain();
- if (domain !== undefined) fn = domain.bind(fn);
if (typeof setTimeout !== "undefined") {
setTimeout(function() {
fn(arg);
@@ -105,75 +109,22 @@ Async.prototype.throwLater = function(fn, arg) {
fn(arg);
});
} catch (e) {
- throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/m3OTXk\u000a");
+ throw new Error("No async scheduler available\u000a\u000a See http://goo.gl/MqrFmX\u000a");
}
};
-Async.prototype._getDomain = function() {};
-
-if (util.isNode) {
- var EventsModule = _dereq_("events");
-
- var domainGetter = function() {
- var domain = process.domain;
- if (domain === null) return undefined;
- return domain;
- };
-
- if (EventsModule.usingDomains) {
- Async.prototype._getDomain = domainGetter;
- } else {
- var descriptor =
- Object.getOwnPropertyDescriptor(EventsModule, "usingDomains");
-
- if (!descriptor.configurable) {
- process.on("domainsActivated", function() {
- Async.prototype._getDomain = domainGetter;
- });
- } else {
- var usingDomains = false;
- Object.defineProperty(EventsModule, "usingDomains", {
- configurable: false,
- enumerable: true,
- get: function() {
- return usingDomains;
- },
- set: function(value) {
- if (usingDomains || !value) return;
- usingDomains = true;
- Async.prototype._getDomain = domainGetter;
- util.toFastProperties(process);
- process.emit("domainsActivated");
- }
- });
- }
-
-
- }
-}
-
function AsyncInvokeLater(fn, receiver, arg) {
- var domain = this._getDomain();
- if (domain !== undefined) fn = domain.bind(fn);
this._lateQueue.push(fn, receiver, arg);
this._queueTick();
}
function AsyncInvoke(fn, receiver, arg) {
- var domain = this._getDomain();
- if (domain !== undefined) fn = domain.bind(fn);
this._normalQueue.push(fn, receiver, arg);
this._queueTick();
}
function AsyncSettlePromises(promise) {
- var domain = this._getDomain();
- if (domain !== undefined) {
- var fn = domain.bind(promise._settlePromises);
- this._normalQueue.push(fn, promise, undefined);
- } else {
- this._normalQueue._pushOne(promise);
- }
+ this._normalQueue._pushOne(promise);
this._queueTick();
}
@@ -182,13 +133,18 @@ if (!util.hasDevTools) {
Async.prototype.invoke = AsyncInvoke;
Async.prototype.settlePromises = AsyncSettlePromises;
} else {
+ if (schedule.isStatic) {
+ schedule = function(fn) { setTimeout(fn, 0); };
+ }
Async.prototype.invokeLater = function (fn, receiver, arg) {
if (this._trampolineEnabled) {
AsyncInvokeLater.call(this, fn, receiver, arg);
} else {
- setTimeout(function() {
- fn.call(receiver, arg);
- }, 100);
+ this._schedule(function() {
+ setTimeout(function() {
+ fn.call(receiver, arg);
+ }, 100);
+ });
}
};
@@ -196,9 +152,9 @@ if (!util.hasDevTools) {
if (this._trampolineEnabled) {
AsyncInvoke.call(this, fn, receiver, arg);
} else {
- setTimeout(function() {
+ this._schedule(function() {
fn.call(receiver, arg);
- }, 0);
+ });
}
};
@@ -206,16 +162,14 @@ if (!util.hasDevTools) {
if (this._trampolineEnabled) {
AsyncSettlePromises.call(this, promise);
} else {
- setTimeout(function() {
+ this._schedule(function() {
promise._settlePromises();
- }, 0);
+ });
}
};
}
Async.prototype.invokeFirst = function (fn, receiver, arg) {
- var domain = this._getDomain();
- if (domain !== undefined) fn = domain.bind(fn);
this._normalQueue.unshift(fn, receiver, arg);
this._queueTick();
};
@@ -236,6 +190,7 @@ Async.prototype._drainQueue = function(queue) {
Async.prototype._drainQueues = function () {
this._drainQueue(this._normalQueue);
this._reset();
+ this._haveDrainedQueues = true;
this._drainQueue(this._lateQueue);
};
@@ -250,12 +205,13 @@ Async.prototype._reset = function () {
this._isTickUsed = false;
};
-module.exports = new Async();
+module.exports = Async;
module.exports.firstLineError = firstLineError;
-},{"./queue.js":28,"./schedule.js":31,"./util.js":38,"events":39}],3:[function(_dereq_,module,exports){
+},{"./queue":26,"./schedule":29,"./util":36}],3:[function(_dereq_,module,exports){
"use strict";
-module.exports = function(Promise, INTERNAL, tryConvertToPromise) {
+module.exports = function(Promise, INTERNAL, tryConvertToPromise, debug) {
+var calledBind = false;
var rejectThis = function(_, e) {
this._reject(e);
};
@@ -266,8 +222,7 @@ var targetRejected = function(e, context) {
};
var bindingResolved = function(thisArg, context) {
- this._setBoundTo(thisArg);
- if (this._isPending()) {
+ if (((this._bitField & 50397184) === 0)) {
this._resolveCallback(context.target);
}
};
@@ -277,10 +232,16 @@ var bindingRejected = function(e, context) {
};
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,
@@ -288,11 +249,11 @@ Promise.prototype.bind = function (thisArg) {
target: target,
bindingPromise: maybePromise
};
- target._then(INTERNAL, targetRejected, ret._progress, ret, context);
+ target._then(INTERNAL, targetRejected, undefined, ret, context);
maybePromise._then(
- bindingResolved, bindingRejected, ret._progress, ret, context);
+ bindingResolved, bindingRejected, undefined, ret, context);
+ ret._setOnCancel(maybePromise);
} else {
- ret._setBoundTo(thisArg);
ret._resolveCallback(target);
}
return ret;
@@ -300,31 +261,19 @@ Promise.prototype.bind = function (thisArg) {
Promise.prototype._setBoundTo = function (obj) {
if (obj !== undefined) {
- this._bitField = this._bitField | 131072;
+ this._bitField = this._bitField | 2097152;
this._boundTo = obj;
} else {
- this._bitField = this._bitField & (~131072);
+ this._bitField = this._bitField & (~2097152);
}
};
Promise.prototype._isBound = function () {
- return (this._bitField & 131072) === 131072;
+ return (this._bitField & 2097152) === 2097152;
};
Promise.bind = function (thisArg, value) {
- var maybePromise = tryConvertToPromise(thisArg);
- var ret = new Promise(INTERNAL);
-
- if (maybePromise instanceof Promise) {
- maybePromise._then(function(thisArg) {
- ret._setBoundTo(thisArg);
- ret._resolveCallback(value);
- }, ret._reject, ret._progress, ret, null);
- } else {
- ret._setBoundTo(thisArg);
- ret._resolveCallback(value);
- }
- return ret;
+ return Promise.resolve(value).bind(thisArg);
};
};
@@ -337,11 +286,11 @@ function noConflict() {
catch (e) {}
return bluebird;
}
-var bluebird = _dereq_("./promise.js")();
+var bluebird = _dereq_("./promise")();
bluebird.noConflict = noConflict;
module.exports = bluebird;
-},{"./promise.js":23}],5:[function(_dereq_,module,exports){
+},{"./promise":22}],5:[function(_dereq_,module,exports){
"use strict";
var cr = Object.create;
if (cr) {
@@ -351,7 +300,7 @@ if (cr) {
}
module.exports = function(Promise) {
-var util = _dereq_("./util.js");
+var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var isIdentifier = util.isIdentifier;
@@ -427,7 +376,7 @@ function caller(obj) {
return fn.apply(obj, this);
}
Promise.prototype.call = function (methodName) {
- var $_len = arguments.length;var args = new Array($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}
+ var args = [].slice.call(arguments, 1);;
if (!true) {
if (canEvaluate) {
var maybeCaller = getMethodCaller(methodName);
@@ -466,149 +415,556 @@ Promise.prototype.get = function (propertyName) {
};
};
-},{"./util.js":38}],6:[function(_dereq_,module,exports){
+},{"./util":36}],6:[function(_dereq_,module,exports){
+"use strict";
+module.exports = function(Promise, PromiseArray, apiRejection, debug) {
+var util = _dereq_("./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();
+ 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._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();
+};
+
+};
+
+},{"./util":36}],7:[function(_dereq_,module,exports){
+"use strict";
+module.exports = function(NEXT_FILTER) {
+var util = _dereq_("./util");
+var getKeys = _dereq_("./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;
+};
+
+},{"./es5":13,"./util":36}],8:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
-var errors = _dereq_("./errors.js");
-var async = _dereq_("./async.js");
-var CancellationError = errors.CancellationError;
+var longStackTraces = false;
+var contextStack = [];
-Promise.prototype._cancel = function (reason) {
- if (!this.isCancellable()) return this;
- var parent;
- var promiseToReject = this;
- while ((parent = promiseToReject._cancellationParent) !== undefined &&
- parent.isCancellable()) {
- promiseToReject = parent;
+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);
}
- this._unsetCancellable();
- promiseToReject._target()._rejectCallback(reason, false, true);
};
-Promise.prototype.cancel = function (reason) {
- if (!this.isCancellable()) return this;
- if (reason === undefined) reason = new CancellationError();
- async.invokeLater(this._cancel, this, reason);
- return this;
+Context.prototype._popContext = function () {
+ if (this._trace !== undefined) {
+ var trace = contextStack.pop();
+ var ret = trace._promiseCreated;
+ trace._promiseCreated = null;
+ return ret;
+ }
+ return null;
};
-Promise.prototype.cancellable = function () {
- if (this._cancellable()) return this;
- async.enableTrampoline();
- this._setCancellable();
- this._cancellationParent = undefined;
- return this;
+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;
};
-Promise.prototype.uncancellable = function () {
- var ret = this.then();
- ret._unsetCancellable();
- return ret;
-};
-
-Promise.prototype.fork = function (didFulfill, didReject, didProgress) {
- var ret = this._then(didFulfill, didReject, didProgress,
- undefined, undefined);
-
- ret._setCancellable();
- ret._cancellationParent = undefined;
- return ret;
-};
-};
-
-},{"./async.js":2,"./errors.js":13}],7:[function(_dereq_,module,exports){
+},{}],9:[function(_dereq_,module,exports){
"use strict";
-module.exports = function() {
-var async = _dereq_("./async.js");
-var util = _dereq_("./util.js");
+module.exports = function(Promise, Context) {
+var getDomain = Promise._getDomain;
+var async = Promise._async;
+var Warning = _dereq_("./errors").Warning;
+var util = _dereq_("./util");
+var canAttachTrace = util.canAttachTrace;
+var unhandledRejectionHandled;
+var possiblyUnhandledRejection;
var bluebirdFramePattern =
- /[\\\/]bluebird[\\\/]js[\\\/](main|debug|zalgo|instrumented)/;
+ /[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/;
var stackFramePattern = null;
var formatStack = null;
var indentStackFrames = false;
-var warn;
+var printWarning;
+var debugging = !!(util.env("BLUEBIRD_DEBUG") != 0 &&
+ (true ||
+ 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")));
-function CapturedTrace(parent) {
- this._parent = parent;
- var length = this._length = 1 + (parent === undefined ? 0 : parent._length);
- captureStackTrace(this, CapturedTrace);
- if (length > 32) this.uncycle();
+Promise.prototype.suppressUnhandledRejections = function() {
+ var target = this._target();
+ target._bitField = ((target._bitField & (~1048576)) |
+ 2097152);
+};
+
+Promise.prototype._ensurePossibleRejectionHandled = function () {
+ if ((this._bitField & 2097152) !== 0) return;
+ this._setRejectionIsUnhandled();
+ async.invokeLater(this._notifyUnhandledRejection, this, undefined);
+};
+
+Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
+ fireRejectionEvent("rejectionHandled",
+ unhandledRejectionHandled, undefined, this);
+};
+
+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 : domain.bind(fn))
+ : undefined;
+};
+
+Promise.onUnhandledRejectionHandled = function (fn) {
+ var domain = getDomain();
+ unhandledRejectionHandled =
+ typeof fn === "function" ? (domain === null ? fn : domain.bind(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();
+};
+
+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) {
+ config.warnings = !!opts.warnings;
+ }
+ 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;
+ }
+};
+
+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;
+ }
}
-util.inherits(CapturedTrace, Error);
-CapturedTrace.prototype.uncycle = function() {
- var length = this._length;
- if (length < 2) return;
- var nodes = [];
- var stackToIndex = {};
+function cancellationAttachCancellationCallback(onCancel) {
+ if (!this.isCancellable()) return this;
- 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;
+ var previousOnCancel = this._onCancel();
+ if (previousOnCancel !== undefined) {
+ if (util.isArray(previousOnCancel)) {
+ previousOnCancel.push(onCancel);
+ } else {
+ this._setOnCancel([previousOnCancel, onCancel]);
}
+ } else {
+ this._setOnCancel(onCancel);
}
- 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;
+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 {
- cycleEdgeNode._parent = undefined;
- cycleEdgeNode._length = 1;
+ return undefined;
}
- var currentChildLength = cycleEdgeNode._length + 1;
- for (var j = i - 2; j >= 0; --j) {
- nodes[j]._length = currentChildLength;
- currentChildLength++;
- }
- return;
}
}
-};
+ return ret;
+}
-CapturedTrace.prototype.parent = function() {
- return this._parent;
-};
+function longStackTracesCaptureStackTrace() {
+ this._trace = new CapturedTrace(this._peekContext());
+}
-CapturedTrace.prototype.hasParent = function() {
- return this._parent !== undefined;
-};
-
-CapturedTrace.prototype.attachExtraTrace = function(error) {
- if (error.__stackCleaned__) return;
- this.uncycle();
- var parsed = CapturedTrace.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;
+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);
+ }
}
- removeCommonRoots(stacks);
- removeDuplicateOrEmptyJumps(stacks);
- util.notEnumerableProp(error, "stack", reconstructStack(message, stacks));
- util.notEnumerableProp(error, "__stackCleaned__", true);
-};
+}
+
+function checkForgottenReturns(returnValue, promiseCreated, name, promise) {
+ if (returnValue === undefined &&
+ promiseCreated !== null &&
+ config.longStackTraces &&
+ config.warnings) {
+ var msg = "a promise was created in a " + name +
+ " handler but was not returned from it";
+ 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");
+ }
+ formatAndLogError(warning, "", true);
+}
function reconstructStack(message, stacks) {
for (var i = 0; i < stacks.length - 1; ++i) {
@@ -663,8 +1019,8 @@ function cleanStack(stack) {
var ret = [];
for (var i = 0; i < stack.length; ++i) {
var line = stack[i];
- var isTraceLine = stackFramePattern.test(line) ||
- " (No stack trace)" === line;
+ var isTraceLine = " (No stack trace)" === line ||
+ stackFramePattern.test(line);
var isInternalFrame = isTraceLine && shouldIgnore(line);
if (isTraceLine && !isInternalFrame) {
if (indentStackFrames && line.charAt(0) !== " ") {
@@ -690,7 +1046,7 @@ function stackFramesAsArray(error) {
return stack;
}
-CapturedTrace.parseStackAndMessage = function(error) {
+function parseStackAndMessage(error) {
var stack = error.stack;
var message = error.toString();
stack = typeof stack === "string" && stack.length > 0
@@ -699,36 +1055,27 @@ CapturedTrace.parseStackAndMessage = function(error) {
message: message,
stack: cleanStack(stack)
};
-};
+}
-CapturedTrace.formatAndLogError = function(error, title) {
+function formatAndLogError(error, title, isSoft) {
if (typeof console !== "undefined") {
var message;
- if (typeof error === "object" || typeof error === "function") {
+ if (util.isObject(error)) {
var stack = error.stack;
message = title + formatStack(stack, error);
} else {
message = title + String(error);
}
- if (typeof warn === "function") {
- warn(message);
+ if (typeof printWarning === "function") {
+ printWarning(message, isSoft);
} else if (typeof console.log === "function" ||
typeof console.log === "object") {
console.log(message);
}
}
-};
+}
-CapturedTrace.unhandledRejection = function (reason) {
- CapturedTrace.formatAndLogError(reason, "^--- With additional stack trace: ");
-};
-
-CapturedTrace.isSupported = function () {
- return typeof captureStackTrace === "function";
-};
-
-CapturedTrace.fireRejectionEvent =
-function(name, localHandler, reason, promise) {
+function fireRejectionEvent(name, localHandler, reason, promise) {
var localEventFired = false;
try {
if (typeof localHandler === "function") {
@@ -766,9 +1113,9 @@ function(name, localHandler, reason, promise) {
if (!globalEventFired && !localEventFired && !domEventFired &&
name === "unhandledRejection") {
- CapturedTrace.formatAndLogError(reason, "Unhandled rejection ");
+ formatAndLogError(reason, "Unhandled rejection ");
}
-};
+}
function formatNonError(obj) {
var str;
@@ -777,7 +1124,8 @@ function formatNonError(obj) {
(obj.name || "anonymous") +
"]";
} else {
- str = obj.toString();
+ str = obj && typeof obj.toString === "function"
+ ? obj.toString() : util.toString(obj);
var ruselessToString = /\[object [a-zA-Z0-9$_]+\]/;
if (ruselessToString.test(str)) {
try {
@@ -803,6 +1151,10 @@ function snip(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) {
@@ -814,8 +1166,9 @@ function parseLineInfo(line) {
};
}
}
-CapturedTrace.setBounds = function(firstLineError, lastLineError) {
- if (!CapturedTrace.isSupported()) return;
+
+function setBounds(firstLineError, lastLineError) {
+ if (!longStackTracesIsSupported()) return;
var firstStackLines = firstLineError.stack.split("\n");
var lastStackLines = lastLineError.stack.split("\n");
var firstIndex = -1;
@@ -854,6 +1207,82 @@ CapturedTrace.setBounds = function(firstLineError, lastLineError) {
}
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() {
@@ -870,7 +1299,7 @@ var captureStackTrace = (function stackDetection() {
if (typeof Error.stackTraceLimit === "number" &&
typeof Error.captureStackTrace === "function") {
- Error.stackTraceLimit = Error.stackTraceLimit + 6;
+ Error.stackTraceLimit += 6;
stackFramePattern = v8stackFramePattern;
formatStack = v8stackFormatter;
var captureStackTrace = Error.captureStackTrace;
@@ -879,9 +1308,9 @@ var captureStackTrace = (function stackDetection() {
return bluebirdFramePattern.test(line);
};
return function(receiver, ignoreUntil) {
- Error.stackTraceLimit = Error.stackTraceLimit + 6;
+ Error.stackTraceLimit += 6;
captureStackTrace(receiver, ignoreUntil);
- Error.stackTraceLimit = Error.stackTraceLimit - 6;
+ Error.stackTraceLimit -= 6;
};
}
var err = new Error();
@@ -901,14 +1330,15 @@ var captureStackTrace = (function stackDetection() {
catch(e) {
hasStackAfterThrow = ("stack" in e);
}
- if (!("stack" in err) && hasStackAfterThrow) {
+ if (!("stack" in err) && hasStackAfterThrow &&
+ typeof Error.stackTraceLimit === "number") {
stackFramePattern = v8stackFramePattern;
formatStack = v8stackFormatter;
return function captureStackTrace(o) {
- Error.stackTraceLimit = Error.stackTraceLimit + 6;
+ Error.stackTraceLimit += 6;
try { throw new Error(); }
catch(e) { o.stack = e.stack; }
- Error.stackTraceLimit = Error.stackTraceLimit - 6;
+ Error.stackTraceLimit -= 6;
};
}
@@ -993,355 +1423,138 @@ var fireGlobalEvent = (function() {
})();
if (typeof console !== "undefined" && typeof console.warn !== "undefined") {
- warn = function (message) {
+ printWarning = function (message) {
console.warn(message);
};
if (util.isNode && process.stderr.isTTY) {
- warn = function(message) {
- process.stderr.write("\u001b[31m" + message + "\u001b[39m\n");
+ 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") {
- warn = function(message) {
- console.warn("%c" + message, "color: red");
+ printWarning = function(message, isSoft) {
+ console.warn("%c" + message,
+ isSoft ? "color: darkorange" : "color: red");
};
}
}
-return CapturedTrace;
+var config = {
+ warnings: warnings,
+ longStackTraces: false,
+ cancellation: false
};
-},{"./async.js":2,"./util.js":38}],8:[function(_dereq_,module,exports){
+if (longStackTraces) Promise.longStackTraces();
+
+return {
+ longStackTraces: function() {
+ return config.longStackTraces;
+ },
+ warnings: function() {
+ return config.warnings;
+ },
+ cancellation: function() {
+ return config.cancellation;
+ },
+ propagateFromFunction: function() {
+ return propagateFromFunction;
+ },
+ boundValueFunction: function() {
+ return boundValueFunction;
+ },
+ checkForgottenReturns: checkForgottenReturns,
+ setBounds: setBounds,
+ warn: warn,
+ deprecated: deprecated,
+ CapturedTrace: CapturedTrace
+};
+};
+
+},{"./errors":12,"./util":36}],10:[function(_dereq_,module,exports){
"use strict";
-module.exports = function(NEXT_FILTER) {
-var util = _dereq_("./util.js");
-var errors = _dereq_("./errors.js");
-var tryCatch = util.tryCatch;
-var errorObj = util.errorObj;
-var keys = _dereq_("./es5.js").keys;
-var TypeError = errors.TypeError;
-
-function CatchFilter(instances, callback, promise) {
- this._instances = instances;
- this._callback = callback;
- this._promise = promise;
-}
-
-function safePredicate(predicate, e) {
- var safeObject = {};
- var retfilter = tryCatch(predicate).call(safeObject, e);
-
- if (retfilter === errorObj) return retfilter;
-
- var safeKeys = keys(safeObject);
- if (safeKeys.length) {
- errorObj.e = new TypeError("Catch filter must inherit from Error or be a simple predicate function\u000a\u000a See http://goo.gl/o84o68\u000a");
- return errorObj;
- }
- return retfilter;
-}
-
-CatchFilter.prototype.doFilter = function (e) {
- var cb = this._callback;
- var promise = this._promise;
- var boundTo = promise._boundTo;
- for (var i = 0, len = this._instances.length; i < len; ++i) {
- var item = this._instances[i];
- var itemIsErrorType = item === Error ||
- (item != null && item.prototype instanceof Error);
-
- if (itemIsErrorType && e instanceof item) {
- var ret = tryCatch(cb).call(boundTo, e);
- if (ret === errorObj) {
- NEXT_FILTER.e = ret.e;
- return NEXT_FILTER;
- }
- return ret;
- } else if (typeof item === "function" && !itemIsErrorType) {
- var shouldHandle = safePredicate(item, e);
- if (shouldHandle === errorObj) {
- e = errorObj.e;
- break;
- } else if (shouldHandle) {
- var ret = tryCatch(cb).call(boundTo, e);
- if (ret === errorObj) {
- NEXT_FILTER.e = ret.e;
- return NEXT_FILTER;
- }
- return ret;
- }
- }
- }
- NEXT_FILTER.e = e;
- return NEXT_FILTER;
-};
-
-return CatchFilter;
-};
-
-},{"./errors.js":13,"./es5.js":14,"./util.js":38}],9:[function(_dereq_,module,exports){
-"use strict";
-module.exports = function(Promise, CapturedTrace, isDebugging) {
-var contextStack = [];
-function Context() {
- this._trace = new CapturedTrace(peekContext());
-}
-Context.prototype._pushContext = function () {
- if (!isDebugging()) return;
- if (this._trace !== undefined) {
- contextStack.push(this._trace);
- }
-};
-
-Context.prototype._popContext = function () {
- if (!isDebugging()) return;
- if (this._trace !== undefined) {
- contextStack.pop();
- }
-};
-
-function createContext() {
- if (isDebugging()) return new Context();
-}
-
-function peekContext() {
- var lastIndex = contextStack.length - 1;
- if (lastIndex >= 0) {
- return contextStack[lastIndex];
- }
- return undefined;
-}
-
-Promise.prototype._peekContext = peekContext;
-Promise.prototype._pushContext = Context.prototype._pushContext;
-Promise.prototype._popContext = Context.prototype._popContext;
-
-return createContext;
-};
-
-},{}],10:[function(_dereq_,module,exports){
-"use strict";
-module.exports = function(Promise, CapturedTrace) {
-var async = _dereq_("./async.js");
-var Warning = _dereq_("./errors.js").Warning;
-var util = _dereq_("./util.js");
-var canAttachTrace = util.canAttachTrace;
-var unhandledRejectionHandled;
-var possiblyUnhandledRejection;
-var debugging = false || (util.isNode &&
- (!!process.env["BLUEBIRD_DEBUG"] ||
- process.env["NODE_ENV"] === "development"));
-
-if (debugging) {
- async.disableTrampolineIfNecessary();
-}
-
-Promise.prototype._ensurePossibleRejectionHandled = function () {
- this._setRejectionIsUnhandled();
- async.invokeLater(this._notifyUnhandledRejection, this, undefined);
-};
-
-Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
- CapturedTrace.fireRejectionEvent("rejectionHandled",
- unhandledRejectionHandled, undefined, this);
-};
-
-Promise.prototype._notifyUnhandledRejection = function () {
- if (this._isRejectionUnhandled()) {
- var reason = this._getCarriedStackTrace() || this._settledValue;
- this._setUnhandledRejectionIsNotified();
- CapturedTrace.fireRejectionEvent("unhandledRejection",
- possiblyUnhandledRejection, reason, this);
- }
-};
-
-Promise.prototype._setUnhandledRejectionIsNotified = function () {
- this._bitField = this._bitField | 524288;
-};
-
-Promise.prototype._unsetUnhandledRejectionIsNotified = function () {
- this._bitField = this._bitField & (~524288);
-};
-
-Promise.prototype._isUnhandledRejectionNotified = function () {
- return (this._bitField & 524288) > 0;
-};
-
-Promise.prototype._setRejectionIsUnhandled = function () {
- this._bitField = this._bitField | 2097152;
-};
-
-Promise.prototype._unsetRejectionIsUnhandled = function () {
- this._bitField = this._bitField & (~2097152);
- if (this._isUnhandledRejectionNotified()) {
- this._unsetUnhandledRejectionIsNotified();
- this._notifyUnhandledRejectionIsHandled();
- }
-};
-
-Promise.prototype._isRejectionUnhandled = function () {
- return (this._bitField & 2097152) > 0;
-};
-
-Promise.prototype._setCarriedStackTrace = function (capturedTrace) {
- this._bitField = this._bitField | 1048576;
- this._fulfillmentHandler0 = capturedTrace;
-};
-
-Promise.prototype._isCarryingStackTrace = function () {
- return (this._bitField & 1048576) > 0;
-};
-
-Promise.prototype._getCarriedStackTrace = function () {
- return this._isCarryingStackTrace()
- ? this._fulfillmentHandler0
- : undefined;
-};
-
-Promise.prototype._captureStackTrace = function () {
- if (debugging) {
- this._trace = new CapturedTrace(this._peekContext());
- }
- return this;
-};
-
-Promise.prototype._attachExtraTrace = function (error, ignoreSelf) {
- if (debugging && 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 = CapturedTrace.parseStackAndMessage(error);
- util.notEnumerableProp(error, "stack",
- parsed.message + "\n" + parsed.stack.join("\n"));
- util.notEnumerableProp(error, "__stackCleaned__", true);
- }
- }
-};
-
-Promise.prototype._warn = function(message) {
- var warning = new Warning(message);
- var ctx = this._peekContext();
- if (ctx) {
- ctx.attachExtraTrace(warning);
- } else {
- var parsed = CapturedTrace.parseStackAndMessage(warning);
- warning.stack = parsed.message + "\n" + parsed.stack.join("\n");
- }
- CapturedTrace.formatAndLogError(warning, "");
-};
-
-Promise.onPossiblyUnhandledRejection = function (fn) {
- possiblyUnhandledRejection = typeof fn === "function" ? fn : undefined;
-};
-
-Promise.onUnhandledRejectionHandled = function (fn) {
- unhandledRejectionHandled = typeof fn === "function" ? fn : undefined;
-};
-
-Promise.longStackTraces = function () {
- if (async.haveItemsQueued() &&
- debugging === false
- ) {
- throw new Error("cannot enable long stack traces after promises have been created\u000a\u000a See http://goo.gl/DT1qyG\u000a");
- }
- debugging = CapturedTrace.isSupported();
- if (debugging) {
- async.disableTrampolineIfNecessary();
- }
-};
-
-Promise.hasLongStackTraces = function () {
- return debugging && CapturedTrace.isSupported();
-};
-
-if (!CapturedTrace.isSupported()) {
- Promise.longStackTraces = function(){};
- debugging = false;
-}
-
-return function() {
- return debugging;
-};
-};
-
-},{"./async.js":2,"./errors.js":13,"./util.js":38}],11:[function(_dereq_,module,exports){
-"use strict";
-var util = _dereq_("./util.js");
-var isPrimitive = util.isPrimitive;
-var wrapsPrimitiveReceiver = util.wrapsPrimitiveReceiver;
-
module.exports = function(Promise) {
-var returner = function () {
- return this;
-};
-var thrower = function () {
- throw this;
-};
-
-var wrapper = function (value, action) {
- if (action === 1) {
- return function () {
- throw value;
- };
- } else if (action === 2) {
- return function () {
- return value;
- };
- }
-};
-
+function returner() {
+ return this.value;
+}
+function thrower() {
+ throw this.reason;
+}
Promise.prototype["return"] =
Promise.prototype.thenReturn = function (value) {
- if (wrapsPrimitiveReceiver && isPrimitive(value)) {
- return this._then(
- wrapper(value, 2),
- undefined,
- undefined,
- undefined,
- undefined
- );
- }
- return this._then(returner, undefined, undefined, value, undefined);
+ if (value instanceof Promise) value.suppressUnhandledRejections();
+ return this._then(
+ returner, undefined, undefined, {value: value}, undefined);
};
Promise.prototype["throw"] =
Promise.prototype.thenThrow = function (reason) {
- if (wrapsPrimitiveReceiver && isPrimitive(reason)) {
+ return this._then(
+ thrower, undefined, undefined, {reason: reason}, undefined);
+};
+
+Promise.prototype.catchThrow = function (reason) {
+ if (arguments.length <= 1) {
return this._then(
- wrapper(reason, 1),
- undefined,
- undefined,
- undefined,
- undefined
- );
+ 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);
}
- return this._then(thrower, undefined, undefined, reason, undefined);
};
};
-},{"./util.js":38}],12:[function(_dereq_,module,exports){
+},{}],11:[function(_dereq_,module,exports){
"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, null, INTERNAL);
+ return this.mapSeries(fn)
+ ._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, null, INTERNAL);
-};
+ return PromiseMapSeries(promises, fn)
+ ._then(promiseAllThis, undefined, undefined, promises, undefined);
};
-},{}],13:[function(_dereq_,module,exports){
+Promise.mapSeries = PromiseMapSeries;
+};
+
+},{}],12:[function(_dereq_,module,exports){
"use strict";
-var es5 = _dereq_("./es5.js");
+var es5 = _dereq_("./es5");
var Objectfreeze = es5.freeze;
-var util = _dereq_("./util.js");
+var util = _dereq_("./util");
var inherits = util.inherits;
var notEnumerableProp = util.notEnumerableProp;
@@ -1450,7 +1663,7 @@ module.exports = {
Warning: Warning
};
-},{"./es5.js":14,"./util.js":38}],14:[function(_dereq_,module,exports){
+},{"./es5":13,"./util":36}],13:[function(_dereq_,module,exports){
var isES5 = (function(){
"use strict";
return this === undefined;
@@ -1532,7 +1745,7 @@ if (isES5) {
};
}
-},{}],15:[function(_dereq_,module,exports){
+},{}],14:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var PromiseMap = Promise.map;
@@ -1546,116 +1759,119 @@ Promise.filter = function (promises, fn, options) {
};
};
-},{}],16:[function(_dereq_,module,exports){
+},{}],15:[function(_dereq_,module,exports){
"use strict";
-module.exports = function(Promise, NEXT_FILTER, tryConvertToPromise) {
-var util = _dereq_("./util.js");
-var wrapsPrimitiveReceiver = util.wrapsPrimitiveReceiver;
-var isPrimitive = util.isPrimitive;
-var thrower = util.thrower;
+module.exports = function(Promise, tryConvertToPromise) {
+var util = _dereq_("./util");
+var CancellationError = Promise.CancellationError;
+var errorObj = util.errorObj;
-function returnThis() {
- return this;
+function FinallyHandlerCancelReaction(finallyHandler) {
+ this.finallyHandler = finallyHandler;
}
-function throwThis() {
- throw this;
-}
-function return$(r) {
- return function() {
- return r;
- };
-}
-function throw$(r) {
- return function() {
- throw r;
- };
-}
-function promisedFinally(ret, reasonOrValue, isFulfilled) {
- var then;
- if (wrapsPrimitiveReceiver && isPrimitive(reasonOrValue)) {
- then = isFulfilled ? return$(reasonOrValue) : throw$(reasonOrValue);
- } else {
- then = isFulfilled ? returnThis : throwThis;
+
+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 ret._then(then, thrower, undefined, reasonOrValue, undefined);
+ 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;
- var ret = promise._isBound()
- ? handler.call(promise._boundTo)
- : handler();
-
- if (ret !== undefined) {
- var maybePromise = tryConvertToPromise(ret, promise);
- if (maybePromise instanceof Promise) {
- maybePromise = maybePromise._target();
- return promisedFinally(maybePromise, reasonOrValue,
- promise.isFulfilled());
+ if (!this.called) {
+ this.called = true;
+ var ret = this.type === 0
+ ? handler.call(promise._boundValue())
+ : handler.call(promise._boundValue(), reasonOrValue);
+ if (ret !== undefined) {
+ 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()) {
- NEXT_FILTER.e = reasonOrValue;
- return NEXT_FILTER;
+ checkCancel(this);
+ errorObj.e = reasonOrValue;
+ return errorObj;
} else {
+ checkCancel(this);
return reasonOrValue;
}
}
-function tapHandler(value) {
- var promise = this.promise;
- var handler = this.handler;
-
- var ret = promise._isBound()
- ? handler.call(promise._boundTo, value)
- : handler(value);
-
- if (ret !== undefined) {
- var maybePromise = tryConvertToPromise(ret, promise);
- if (maybePromise instanceof Promise) {
- maybePromise = maybePromise._target();
- return promisedFinally(maybePromise, value, true);
- }
- }
- return value;
-}
-
-Promise.prototype._passThroughHandler = function (handler, isFinally) {
+Promise.prototype._passThrough = function(handler, type, success, fail) {
if (typeof handler !== "function") return this.then();
-
- var promiseAndHandler = {
+ return this._then(success, fail, undefined, {
promise: this,
- handler: handler
- };
-
- return this._then(
- isFinally ? finallyHandler : tapHandler,
- isFinally ? finallyHandler : undefined, undefined,
- promiseAndHandler, undefined);
+ handler: handler,
+ called: false,
+ cancelPromise: null,
+ type: type
+ }, undefined);
};
Promise.prototype.lastly =
Promise.prototype["finally"] = function (handler) {
- return this._passThroughHandler(handler, true);
+ return this._passThrough(handler,
+ 0,
+ finallyHandler,
+ finallyHandler);
};
Promise.prototype.tap = function (handler) {
- return this._passThroughHandler(handler, false);
-};
+ return this._passThrough(handler, 1, finallyHandler);
};
-},{"./util.js":38}],17:[function(_dereq_,module,exports){
+return finallyHandler;
+};
+
+},{"./util":36}],16:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
apiRejection,
INTERNAL,
- tryConvertToPromise) {
-var errors = _dereq_("./errors.js");
+ tryConvertToPromise,
+ Proxyable,
+ debug) {
+var errors = _dereq_("./errors");
var TypeError = errors.TypeError;
-var util = _dereq_("./util.js");
+var util = _dereq_("./util");
var errorObj = util.errorObj;
var tryCatch = util.tryCatch;
var yieldHandlers = [];
@@ -1680,6 +1896,7 @@ function promiseFromYieldHandler(value, yieldHandlers, traceParent) {
function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
var promise = this._promise = new Promise(INTERNAL);
promise._captureStackTrace();
+ promise._setOnCancel(this);
this._stack = stack;
this._generatorFunction = generatorFunction;
this._receiver = receiver;
@@ -1687,7 +1904,75 @@ function PromiseSpawn(generatorFunction, receiver, yieldHandler, stack) {
this._yieldHandlers = typeof yieldHandler === "function"
? [yieldHandler].concat(yieldHandlers)
: yieldHandlers;
+ this._yieldedPromise = null;
}
+util.inherits(PromiseSpawn, Proxyable);
+
+PromiseSpawn.prototype._isResolved = function() {
+ return this.promise === null;
+};
+
+PromiseSpawn.prototype._cleanup = function() {
+ this._promise = this._generator = 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();
+ if (result === errorObj && result.e === reason) {
+ result = null;
+ }
+ } else {
+ this._promise._pushContext();
+ result = tryCatch(this._generator["return"]).call(this._generator,
+ undefined);
+ this._promise._popContext();
+ }
+ var promise = this._promise;
+ this._cleanup();
+ if (result === errorObj) {
+ promise._rejectCallback(result.e, false);
+ } else {
+ promise.cancel();
+ }
+};
+
+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;
@@ -1697,17 +1982,20 @@ PromiseSpawn.prototype._run = function () {
this._generator = this._generatorFunction.call(this._receiver);
this._receiver =
this._generatorFunction = undefined;
- this._next(undefined);
+ this._promiseFulfilled(undefined);
};
PromiseSpawn.prototype._continue = function (result) {
+ var promise = this._promise;
if (result === errorObj) {
- return this._promise._rejectCallback(result.e, false, true);
+ this._cleanup();
+ return promise._rejectCallback(result.e, false);
}
var value = result.value;
if (result.done === true) {
- this._promise._resolveCallback(value);
+ this._cleanup();
+ return promise._resolveCallback(value);
} else {
var maybePromise = tryConvertToPromise(value, this._promise);
if (!(maybePromise instanceof Promise)) {
@@ -1716,9 +2004,9 @@ PromiseSpawn.prototype._continue = function (result) {
this._yieldHandlers,
this._promise);
if (maybePromise === null) {
- this._throw(
+ this._promiseRejected(
new TypeError(
- "A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/4Y4pDk\u000a\u000a".replace("%s", value) +
+ "A value %s was yielded that could not be treated as a promise\u000a\u000a See http://goo.gl/MqrFmX\u000a\u000a".replace("%s", value) +
"From coroutine:\u000a" +
this._stack.split("\n").slice(1, -7).join("\n")
)
@@ -1726,35 +2014,25 @@ PromiseSpawn.prototype._continue = function (result) {
return;
}
}
- maybePromise._then(
- this._next,
- this._throw,
- undefined,
- this,
- null
- );
+ maybePromise = maybePromise._target();
+ var bitField = maybePromise._bitField;
+ ;
+ if (((bitField & 50397184) === 0)) {
+ this._yieldedPromise = maybePromise;
+ maybePromise._proxy(this, null);
+ } else if (((bitField & 33554432) !== 0)) {
+ this._promiseFulfilled(maybePromise._value());
+ } else if (((bitField & 16777216) !== 0)) {
+ this._promiseRejected(maybePromise._reason());
+ } else {
+ this._promiseCancelled();
+ }
}
};
-PromiseSpawn.prototype._throw = function (reason) {
- 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._next = function (value) {
- this._promise._pushContext();
- var result = tryCatch(this._generator.next).call(this._generator, value);
- this._promise._popContext();
- this._continue(result);
-};
-
Promise.coroutine = function (generatorFunction, options) {
if (typeof generatorFunction !== "function") {
- throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/6Vqhm0\u000a");
+ throw new TypeError("generatorFunction must be a function\u000a\u000a See http://goo.gl/MqrFmX\u000a");
}
var yieldHandler = Object(options).yieldHandler;
var PromiseSpawn$ = PromiseSpawn;
@@ -1763,20 +2041,24 @@ Promise.coroutine = function (generatorFunction, options) {
var generator = generatorFunction.apply(this, arguments);
var spawn = new PromiseSpawn$(undefined, undefined, yieldHandler,
stack);
+ var ret = spawn.promise();
spawn._generator = generator;
- spawn._next(undefined);
- return spawn.promise();
+ spawn._promiseFulfilled(undefined);
+ return ret;
};
};
Promise.coroutine.addYieldHandler = function(fn) {
- if (typeof fn !== "function") throw new TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
+ 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/6Vqhm0\u000a");
+ 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();
@@ -1785,11 +2067,11 @@ Promise.spawn = function (generatorFunction) {
};
};
-},{"./errors.js":13,"./util.js":38}],18:[function(_dereq_,module,exports){
+},{"./errors":12,"./util":36}],17:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, tryConvertToPromise, INTERNAL) {
-var util = _dereq_("./util.js");
+var util = _dereq_("./util");
var canEvaluate = util.canEvaluate;
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
@@ -1805,54 +2087,85 @@ if (canEvaluate) {
".replace(/Index/g, i));
};
- var caller = function(count) {
- var values = [];
- for (var i = 1; i <= count; ++i) values.push("holder.p" + i);
- return new Function("holder", " \n\
+ var promiseSetter = function(i) {
+ return new Function("promise", "holder", " \n\
'use strict'; \n\
- var callback = holder.fn; \n\
- return callback(values); \n\
- ".replace(/values/g, values.join(", ")));
+ 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) { \n\
+ 'use strict'; \n\
+ function [TheName](fn) { \n\
+ [TheProperties] \n\
+ this.fn = fn; \n\
+ this.now = 0; \n\
+ } \n\
+ [TheName].prototype.checkFulfillment = function(promise) { \n\
+ var now = ++this.now; \n\
+ if (now === [TheTotal]) { \n\
+ promise._pushContext(); \n\
+ var callback = this.fn; \n\
+ var ret = tryCatch(callback)([ThePassedArguments]); \n\
+ promise._popContext(); \n\
+ if (ret === errorObj) { \n\
+ promise._rejectCallback(ret.e, false); \n\
+ } else { \n\
+ promise._resolveCallback(ret); \n\
+ } \n\
+ } \n\
+ }; \n\
+ \n\
+ [TheName].prototype._resultCancelled = function() { \n\
+ [CancellationCode] \n\
+ }; \n\
+ \n\
+ return [TheName]; \n\
+ }(tryCatch, errorObj, Promise); \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", code)
+ (tryCatch, errorObj, Promise);
+ };
+
+ var holderClasses = [];
var thenCallbacks = [];
- var callers = [undefined];
- for (var i = 1; i <= 5; ++i) {
- thenCallbacks.push(thenCallback(i));
- callers.push(caller(i));
+ var promiseSetters = [];
+
+ for (var i = 0; i < 8; ++i) {
+ holderClasses.push(generateHolderClass(i + 1));
+ thenCallbacks.push(thenCallback(i + 1));
+ promiseSetters.push(promiseSetter(i + 1));
}
- var Holder = function(total, fn) {
- this.p1 = this.p2 = this.p3 = this.p4 = this.p5 = null;
- this.fn = fn;
- this.total = total;
- this.now = 0;
- };
-
- Holder.prototype.callers = callers;
- Holder.prototype.checkFulfillment = function(promise) {
- var now = this.now;
- now++;
- var total = this.total;
- if (now >= total) {
- var handler = this.callers[total];
- promise._pushContext();
- var ret = tryCatch(handler)(this);
- promise._popContext();
- if (ret === errorObj) {
- promise._rejectCallback(ret.e, false, true);
- } else {
- promise._resolveCallback(ret);
- }
- } else {
- this.now = now;
- }
- };
-
- var reject = function (reason) {
+ reject = function (reason) {
this._reject(reason);
};
-}
-}
+}}
Promise.join = function () {
var last = arguments.length - 1;
@@ -1860,33 +2173,44 @@ Promise.join = function () {
if (last > 0 && typeof arguments[last] === "function") {
fn = arguments[last];
if (!true) {
- if (last < 6 && canEvaluate) {
+ if (last <= 8 && canEvaluate) {
var ret = new Promise(INTERNAL);
ret._captureStackTrace();
- var holder = new Holder(last, fn);
+ 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();
- if (maybePromise._isPending()) {
+ var bitField = maybePromise._bitField;
+ ;
+ if (((bitField & 50397184) === 0)) {
maybePromise._then(callbacks[i], reject,
undefined, ret, holder);
- } else if (maybePromise._isFulfilled()) {
+ promiseSetters[i](maybePromise, holder);
+ } else if (((bitField & 33554432) !== 0)) {
callbacks[i].call(ret,
maybePromise._value(), holder);
- } else {
+ } else if (((bitField & 16777216) !== 0)) {
ret._reject(maybePromise._reason());
+ } else {
+ ret._cancel();
}
} else {
callbacks[i].call(ret, maybePromise, holder);
}
}
+ if (!ret._isFateSealed()) {
+ 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];}
+ var args = [].slice.call(arguments);;
if (fn) args.pop();
var ret = new PromiseArray(args).promise();
return fn !== undefined ? ret.spread(fn) : ret;
@@ -1894,34 +2218,34 @@ Promise.join = function () {
};
-},{"./util.js":38}],19:[function(_dereq_,module,exports){
+},{"./util":36}],18:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
PromiseArray,
apiRejection,
tryConvertToPromise,
- INTERNAL) {
-var async = _dereq_("./async.js");
-var util = _dereq_("./util.js");
+ INTERNAL,
+ debug) {
+var getDomain = Promise._getDomain;
+var util = _dereq_("./util");
var tryCatch = util.tryCatch;
var errorObj = util.errorObj;
-var PENDING = {};
var EMPTY_ARRAY = [];
function MappingPromiseArray(promises, fn, limit, _filter) {
this.constructor$(promises);
this._promise._captureStackTrace();
- this._callback = fn;
+ var domain = getDomain();
+ this._callback = domain === null ? fn : domain.bind(fn);
this._preservedValues = _filter === INTERNAL
? new Array(this.length())
: null;
this._limit = limit;
this._inFlight = 0;
this._queue = limit >= 1 ? [] : EMPTY_ARRAY;
- async.invoke(init, this, undefined);
+ this._init$(undefined, -2);
}
util.inherits(MappingPromiseArray, PromiseArray);
-function init() {this._init$(undefined, -2);}
MappingPromiseArray.prototype._init = function () {};
@@ -1930,39 +2254,58 @@ MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
var length = this.length();
var preservedValues = this._preservedValues;
var limit = this._limit;
- if (values[index] === PENDING) {
+
+ if (index < 0) {
+ index = (index * -1) - 1;
values[index] = value;
if (limit >= 1) {
this._inFlight--;
this._drainQueue();
- if (this._isResolved()) return;
+ if (this._isResolved()) return true;
}
} else {
if (limit >= 1 && this._inFlight >= limit) {
values[index] = value;
this._queue.push(index);
- return;
+ return false;
}
if (preservedValues !== null) preservedValues[index] = value;
+ var promise = this._promise;
var callback = this._callback;
- var receiver = this._promise._boundTo;
- this._promise._pushContext();
+ var receiver = promise._boundValue();
+ promise._pushContext();
var ret = tryCatch(callback).call(receiver, value, index, length);
- this._promise._popContext();
- if (ret === errorObj) return this._reject(ret.e);
+ 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();
- if (maybePromise._isPending()) {
+ var bitField = maybePromise._bitField;
+ ;
+ if (((bitField & 50397184) === 0)) {
if (limit >= 1) this._inFlight++;
- values[index] = PENDING;
- return maybePromise._proxyPromiseArray(this, index);
- } else if (maybePromise._isFulfilled()) {
+ 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 {
- return this._reject(maybePromise._reason());
+ this._cancel();
+ return true;
}
}
values[index] = ret;
@@ -1974,8 +2317,9 @@ MappingPromiseArray.prototype._promiseFulfilled = function (value, index) {
} else {
this._resolve(values);
}
-
+ return true;
}
+ return false;
};
MappingPromiseArray.prototype._drainQueue = function () {
@@ -2005,1067 +2349,92 @@ MappingPromiseArray.prototype.preservedValues = function () {
};
function map(promises, fn, options, _filter) {
+ if (typeof fn !== "function") {
+ return apiRejection("expecting a function but got " + util.classString(fn));
+ }
var limit = typeof options === "object" && options !== null
? options.concurrency
: 0;
limit = typeof limit === "number" &&
isFinite(limit) && limit >= 1 ? limit : 0;
- return new MappingPromiseArray(promises, fn, limit, _filter);
+ return new MappingPromiseArray(promises, fn, limit, _filter).promise();
}
Promise.prototype.map = function (fn, options) {
- if (typeof fn !== "function") return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
-
- return map(this, fn, options, null).promise();
+ return map(this, fn, options, null);
};
Promise.map = function (promises, fn, options, _filter) {
- if (typeof fn !== "function") return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
- return map(promises, fn, options, _filter).promise();
+ return map(promises, fn, options, _filter);
};
};
-},{"./async.js":2,"./util.js":38}],20:[function(_dereq_,module,exports){
+},{"./util":36}],19:[function(_dereq_,module,exports){
"use strict";
module.exports =
-function(Promise, INTERNAL, tryConvertToPromise, apiRejection) {
-var util = _dereq_("./util.js");
+function(Promise, INTERNAL, tryConvertToPromise, apiRejection, debug) {
+var util = _dereq_("./util");
var tryCatch = util.tryCatch;
Promise.method = function (fn) {
if (typeof fn !== "function") {
- throw new Promise.TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
+ 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);
- ret._popContext();
+ var promiseCreated = ret._popContext();
+ debug.checkForgottenReturns(
+ value, promiseCreated, "Promise.method", ret);
ret._resolveFromSyncValue(value);
return ret;
};
};
-Promise.attempt = Promise["try"] = function (fn, args, ctx) {
+Promise.attempt = Promise["try"] = function (fn) {
if (typeof fn !== "function") {
- return apiRejection("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
+ return apiRejection("expecting a function but got " + util.classString(fn));
}
var ret = new Promise(INTERNAL);
ret._captureStackTrace();
ret._pushContext();
- var value = util.isArray(args)
- ? tryCatch(fn).apply(ctx, args)
- : tryCatch(fn).call(ctx, args);
- ret._popContext();
+ 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, true);
+ this._rejectCallback(value.e, false);
} else {
this._resolveCallback(value, true);
}
};
};
-},{"./util.js":38}],21:[function(_dereq_,module,exports){
+},{"./util":36}],20:[function(_dereq_,module,exports){
"use strict";
-module.exports = function(Promise) {
-var util = _dereq_("./util.js");
-var async = _dereq_("./async.js");
-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._boundTo, [null].concat(val));
- if (ret === errorObj) {
- async.throwLater(ret.e);
- }
-}
-
-function successAdapter(val, nodeback) {
- var promise = this;
- var receiver = promise._boundTo;
- 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 target = promise._target();
- var newReason = target._getCarriedStackTrace();
- newReason.cause = reason;
- reason = newReason;
- }
- var ret = tryCatch(nodeback).call(promise._boundTo, 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;
-};
-};
-
-},{"./async.js":2,"./util.js":38}],22:[function(_dereq_,module,exports){
-"use strict";
-module.exports = function(Promise, PromiseArray) {
-var util = _dereq_("./util.js");
-var async = _dereq_("./async.js");
-var tryCatch = util.tryCatch;
-var errorObj = util.errorObj;
-
-Promise.prototype.progressed = function (handler) {
- return this._then(undefined, undefined, handler, undefined, undefined);
-};
-
-Promise.prototype._progress = function (progressValue) {
- if (this._isFollowingOrFulfilledOrRejected()) return;
- this._target()._progressUnchecked(progressValue);
-
-};
-
-Promise.prototype._progressHandlerAt = function (index) {
- return index === 0
- ? this._progressHandler0
- : this[(index << 2) + index - 5 + 2];
-};
-
-Promise.prototype._doProgressWith = function (progression) {
- var progressValue = progression.value;
- var handler = progression.handler;
- var promise = progression.promise;
- var receiver = progression.receiver;
-
- var ret = tryCatch(handler).call(receiver, progressValue);
- if (ret === errorObj) {
- if (ret.e != null &&
- ret.e.name !== "StopProgressPropagation") {
- var trace = util.canAttachTrace(ret.e)
- ? ret.e : new Error(util.toString(ret.e));
- promise._attachExtraTrace(trace);
- promise._progress(ret.e);
- }
- } else if (ret instanceof Promise) {
- ret._then(promise._progress, null, null, promise, undefined);
- } else {
- promise._progress(ret);
- }
-};
-
-
-Promise.prototype._progressUnchecked = function (progressValue) {
- var len = this._length();
- var progress = this._progress;
- for (var i = 0; i < len; i++) {
- var handler = this._progressHandlerAt(i);
- var promise = this._promiseAt(i);
- if (!(promise instanceof Promise)) {
- var receiver = this._receiverAt(i);
- if (typeof handler === "function") {
- handler.call(receiver, progressValue, promise);
- } else if (receiver instanceof PromiseArray &&
- !receiver._isResolved()) {
- receiver._promiseProgressed(progressValue, promise);
- }
- continue;
- }
-
- if (typeof handler === "function") {
- async.invoke(this._doProgressWith, this, {
- handler: handler,
- promise: promise,
- receiver: this._receiverAt(i),
- value: progressValue
- });
- } else {
- async.invoke(progress, promise, progressValue);
- }
- }
-};
-};
-
-},{"./async.js":2,"./util.js":38}],23:[function(_dereq_,module,exports){
-"use strict";
-module.exports = function() {
-var makeSelfResolutionError = function () {
- return new TypeError("circular promise resolution chain\u000a\u000a See http://goo.gl/LhFpo0\u000a");
-};
-var reflect = function() {
- return new Promise.PromiseInspection(this._target());
-};
-var apiRejection = function(msg) {
- return Promise.reject(new TypeError(msg));
-};
-var util = _dereq_("./util.js");
-var async = _dereq_("./async.js");
-var errors = _dereq_("./errors.js");
-var TypeError = Promise.TypeError = errors.TypeError;
-Promise.RangeError = errors.RangeError;
-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 = {e: null};
-var tryConvertToPromise = _dereq_("./thenables.js")(Promise, INTERNAL);
-var PromiseArray =
- _dereq_("./promise_array.js")(Promise, INTERNAL,
- tryConvertToPromise, apiRejection);
-var CapturedTrace = _dereq_("./captured_trace.js")();
-var isDebugging = _dereq_("./debuggability.js")(Promise, CapturedTrace);
- /*jshint unused:false*/
-var createContext =
- _dereq_("./context.js")(Promise, CapturedTrace, isDebugging);
-var CatchFilter = _dereq_("./catch_filter.js")(NEXT_FILTER);
-var PromiseResolver = _dereq_("./promise_resolver.js");
-var nodebackForPromise = PromiseResolver._nodebackForPromise;
-var errorObj = util.errorObj;
-var tryCatch = util.tryCatch;
-function Promise(resolver) {
- if (typeof resolver !== "function") {
- throw new TypeError("the promise constructor requires a resolver function\u000a\u000a See http://goo.gl/EC22Yn\u000a");
- }
- if (this.constructor !== Promise) {
- throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/KsIlge\u000a");
- }
- this._bitField = 0;
- this._fulfillmentHandler0 = undefined;
- this._rejectionHandler0 = undefined;
- this._progressHandler0 = undefined;
- this._promise0 = undefined;
- this._receiver0 = undefined;
- this._settledValue = undefined;
- if (resolver !== INTERNAL) this._resolveFromResolver(resolver);
-}
-
-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 (typeof item === "function") {
- catchInstances[j++] = item;
- } else {
- return Promise.reject(
- new TypeError("Catch filter must inherit from Error or be a simple predicate function\u000a\u000a See http://goo.gl/o84o68\u000a"));
- }
- }
- catchInstances.length = j;
- fn = arguments[i];
- var catchFilter = new CatchFilter(catchInstances, fn, this);
- return this._then(undefined, catchFilter.doFilter, undefined,
- catchFilter, undefined);
- }
- return this._then(undefined, fn, undefined, undefined, undefined);
-};
-
-Promise.prototype.reflect = function () {
- return this._then(reflect, reflect, undefined, this, undefined);
-};
-
-Promise.prototype.then = function (didFulfill, didReject, didProgress) {
- if (isDebugging() && 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, didProgress,
- undefined, undefined);
-};
-
-Promise.prototype.done = function (didFulfill, didReject, didProgress) {
- var promise = this._then(didFulfill, didReject, didProgress,
- undefined, undefined);
- promise._setIsFinal();
-};
-
-Promise.prototype.spread = function (didFulfill, didReject) {
- return this.all()._then(didFulfill, didReject, undefined, APPLY, undefined);
-};
-
-Promise.prototype.isCancellable = function () {
- return !this.isResolved() &&
- this._cancellable();
-};
-
-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 () {
- return new PromiseArray(this).promise();
-};
-
-Promise.prototype.error = function (fn) {
- return this.caught(util.originatesFromRejection, fn);
-};
-
-Promise.is = function (val) {
- return val instanceof Promise;
-};
-
-Promise.fromNode = function(fn) {
- var ret = new Promise(INTERNAL);
- var result = tryCatch(fn)(nodebackForPromise(ret));
- if (result === errorObj) {
- ret._rejectCallback(result.e, true, true);
- }
- return ret;
-};
-
-Promise.all = function (promises) {
- return new PromiseArray(promises).promise();
-};
-
-Promise.defer = Promise.pending = function () {
- var promise = new Promise(INTERNAL);
- return new PromiseResolver(promise);
-};
-
-Promise.cast = function (obj) {
- var ret = tryConvertToPromise(obj);
- if (!(ret instanceof Promise)) {
- var val = ret;
- ret = new Promise(INTERNAL);
- ret._fulfillUnchecked(val);
- }
- 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("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
- var prev = async._schedule;
- async._schedule = fn;
- return prev;
-};
-
-Promise.prototype._then = function (
- didFulfill,
- didReject,
- didProgress,
- receiver,
- internalData
-) {
- var haveInternalData = internalData !== undefined;
- var ret = haveInternalData ? internalData : new Promise(INTERNAL);
-
- if (!haveInternalData) {
- ret._propagateFrom(this, 4 | 1);
- ret._captureStackTrace();
- }
-
- var target = this._target();
- if (target !== this) {
- if (receiver === undefined) receiver = this._boundTo;
- if (!haveInternalData) ret._setIsMigrated();
- }
-
- var callbackIndex =
- target._addCallbacks(didFulfill, didReject, didProgress, ret, receiver);
-
- if (target._isResolved() && !target._isSettlePromisesQueued()) {
- async.invoke(
- target._settlePromiseAtPostResolution, target, callbackIndex);
- }
-
- return ret;
-};
-
-Promise.prototype._settlePromiseAtPostResolution = function (index) {
- if (this._isRejectionUnhandled()) this._unsetRejectionIsUnhandled();
- this._settlePromiseAt(index);
-};
-
-Promise.prototype._length = function () {
- return this._bitField & 131071;
-};
-
-Promise.prototype._isFollowingOrFulfilledOrRejected = function () {
- return (this._bitField & 939524096) > 0;
-};
-
-Promise.prototype._isFollowing = function () {
- return (this._bitField & 536870912) === 536870912;
-};
-
-Promise.prototype._setLength = function (len) {
- this._bitField = (this._bitField & -131072) |
- (len & 131071);
-};
-
-Promise.prototype._setFulfilled = function () {
- this._bitField = this._bitField | 268435456;
-};
-
-Promise.prototype._setRejected = function () {
- this._bitField = this._bitField | 134217728;
-};
-
-Promise.prototype._setFollowing = function () {
- this._bitField = this._bitField | 536870912;
-};
-
-Promise.prototype._setIsFinal = function () {
- this._bitField = this._bitField | 33554432;
-};
-
-Promise.prototype._isFinal = function () {
- return (this._bitField & 33554432) > 0;
-};
-
-Promise.prototype._cancellable = function () {
- return (this._bitField & 67108864) > 0;
-};
-
-Promise.prototype._setCancellable = function () {
- this._bitField = this._bitField | 67108864;
-};
-
-Promise.prototype._unsetCancellable = function () {
- this._bitField = this._bitField & (~67108864);
-};
-
-Promise.prototype._setIsMigrated = function () {
- this._bitField = this._bitField | 4194304;
-};
-
-Promise.prototype._unsetIsMigrated = function () {
- this._bitField = this._bitField & (~4194304);
-};
-
-Promise.prototype._isMigrated = function () {
- return (this._bitField & 4194304) > 0;
-};
-
-Promise.prototype._receiverAt = function (index) {
- var ret = index === 0
- ? this._receiver0
- : this[
- index * 5 - 5 + 4];
- if (ret === undefined && this._isBound()) {
- return this._boundTo;
- }
- return ret;
-};
-
-Promise.prototype._promiseAt = function (index) {
- return index === 0
- ? this._promise0
- : this[index * 5 - 5 + 3];
-};
-
-Promise.prototype._fulfillmentHandlerAt = function (index) {
- return index === 0
- ? this._fulfillmentHandler0
- : this[index * 5 - 5 + 0];
-};
-
-Promise.prototype._rejectionHandlerAt = function (index) {
- return index === 0
- ? this._rejectionHandler0
- : this[index * 5 - 5 + 1];
-};
-
-Promise.prototype._migrateCallbacks = function (follower, index) {
- var fulfill = follower._fulfillmentHandlerAt(index);
- var reject = follower._rejectionHandlerAt(index);
- var progress = follower._progressHandlerAt(index);
- var promise = follower._promiseAt(index);
- var receiver = follower._receiverAt(index);
- if (promise instanceof Promise) promise._setIsMigrated();
- this._addCallbacks(fulfill, reject, progress, promise, receiver);
-};
-
-Promise.prototype._addCallbacks = function (
- fulfill,
- reject,
- progress,
- promise,
- receiver
-) {
- var index = this._length();
-
- if (index >= 131071 - 5) {
- index = 0;
- this._setLength(0);
- }
-
- if (index === 0) {
- this._promise0 = promise;
- if (receiver !== undefined) this._receiver0 = receiver;
- if (typeof fulfill === "function" && !this._isCarryingStackTrace())
- this._fulfillmentHandler0 = fulfill;
- if (typeof reject === "function") this._rejectionHandler0 = reject;
- if (typeof progress === "function") this._progressHandler0 = progress;
- } else {
- var base = index * 5 - 5;
- this[base + 3] = promise;
- this[base + 4] = receiver;
- if (typeof fulfill === "function")
- this[base + 0] = fulfill;
- if (typeof reject === "function")
- this[base + 1] = reject;
- if (typeof progress === "function")
- this[base + 2] = progress;
- }
- this._setLength(index + 1);
- return index;
-};
-
-Promise.prototype._setProxyHandlers = function (receiver, promiseSlotValue) {
- var index = this._length();
-
- if (index >= 131071 - 5) {
- index = 0;
- this._setLength(0);
- }
- if (index === 0) {
- this._promise0 = promiseSlotValue;
- this._receiver0 = receiver;
- } else {
- var base = index * 5 - 5;
- this[base + 3] = promiseSlotValue;
- this[base + 4] = receiver;
- }
- this._setLength(index + 1);
-};
-
-Promise.prototype._proxyPromiseArray = function (promiseArray, index) {
- this._setProxyHandlers(promiseArray, index);
-};
-
-Promise.prototype._resolveCallback = function(value, shouldBind) {
- if (this._isFollowingOrFulfilledOrRejected()) return;
- if (value === this)
- return this._rejectCallback(makeSelfResolutionError(), false, true);
- var maybePromise = tryConvertToPromise(value, this);
- if (!(maybePromise instanceof Promise)) return this._fulfill(value);
-
- var propagationFlags = 1 | (shouldBind ? 4 : 0);
- this._propagateFrom(maybePromise, propagationFlags);
- var promise = maybePromise._target();
- if (promise._isPending()) {
- var len = this._length();
- for (var i = 0; i < len; ++i) {
- promise._migrateCallbacks(this, i);
- }
- this._setFollowing();
- this._setLength(0);
- this._setFollowee(promise);
- } else if (promise._isFulfilled()) {
- this._fulfillUnchecked(promise._value());
- } else {
- this._rejectUnchecked(promise._reason(),
- promise._getCarriedStackTrace());
- }
-};
-
-Promise.prototype._rejectCallback =
-function(reason, synchronous, shouldNotMarkOriginatingFromRejection) {
- if (!shouldNotMarkOriginatingFromRejection) {
- util.markAsOriginatingFromRejection(reason);
- }
- var trace = util.ensureErrorObject(reason);
- var hasStack = trace === reason;
- this._attachExtraTrace(trace, synchronous ? hasStack : false);
- this._reject(reason, hasStack ? undefined : trace);
-};
-
-Promise.prototype._resolveFromResolver = function (resolver) {
- var promise = this;
- this._captureStackTrace();
- this._pushContext();
- var synchronous = true;
- var r = tryCatch(resolver)(function(value) {
- if (promise === null) return;
- promise._resolveCallback(value);
- promise = null;
- }, function (reason) {
- if (promise === null) return;
- promise._rejectCallback(reason, synchronous);
- promise = null;
- });
- synchronous = false;
- this._popContext();
-
- if (r !== undefined && r === errorObj && promise !== null) {
- promise._rejectCallback(r.e, true, true);
- promise = null;
- }
-};
-
-Promise.prototype._settlePromiseFromHandler = function (
- handler, receiver, value, promise
-) {
- if (promise._isRejected()) return;
- promise._pushContext();
- var x;
- if (receiver === APPLY && !this._isRejected()) {
- x = tryCatch(handler).apply(this._boundTo, value);
- } else {
- x = tryCatch(handler).call(receiver, value);
- }
- promise._popContext();
-
- if (x === errorObj || x === promise || x === NEXT_FILTER) {
- var err = x === promise ? makeSelfResolutionError() : x.e;
- promise._rejectCallback(err, false, true);
- } else {
- 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._cleanValues = function () {
- if (this._cancellable()) {
- this._cancellationParent = undefined;
- }
-};
-
-Promise.prototype._propagateFrom = function (parent, flags) {
- if ((flags & 1) > 0 && parent._cancellable()) {
- this._setCancellable();
- this._cancellationParent = parent;
- }
- if ((flags & 4) > 0 && parent._isBound()) {
- this._setBoundTo(parent._boundTo);
- }
-};
-
-Promise.prototype._fulfill = function (value) {
- if (this._isFollowingOrFulfilledOrRejected()) return;
- this._fulfillUnchecked(value);
-};
-
-Promise.prototype._reject = function (reason, carriedStackTrace) {
- if (this._isFollowingOrFulfilledOrRejected()) return;
- this._rejectUnchecked(reason, carriedStackTrace);
-};
-
-Promise.prototype._settlePromiseAt = function (index) {
- var promise = this._promiseAt(index);
- var isPromise = promise instanceof Promise;
-
- if (isPromise && promise._isMigrated()) {
- promise._unsetIsMigrated();
- return async.invoke(this._settlePromiseAt, this, index);
- }
- var handler = this._isFulfilled()
- ? this._fulfillmentHandlerAt(index)
- : this._rejectionHandlerAt(index);
-
- var carriedStackTrace =
- this._isCarryingStackTrace() ? this._getCarriedStackTrace() : undefined;
- var value = this._settledValue;
- var receiver = this._receiverAt(index);
-
-
- this._clearCallbackDataAtIndex(index);
-
- if (typeof handler === "function") {
- if (!isPromise) {
- handler.call(receiver, value, promise);
- } else {
- this._settlePromiseFromHandler(handler, receiver, value, promise);
- }
- } else if (receiver instanceof PromiseArray) {
- if (!receiver._isResolved()) {
- if (this._isFulfilled()) {
- receiver._promiseFulfilled(value, promise);
- }
- else {
- receiver._promiseRejected(value, promise);
- }
- }
- } else if (isPromise) {
- if (this._isFulfilled()) {
- promise._fulfill(value);
- } else {
- promise._reject(value, carriedStackTrace);
- }
- }
-
- if (index >= 4 && (index & 31) === 4)
- async.invokeLater(this._setLength, this, 0);
-};
-
-Promise.prototype._clearCallbackDataAtIndex = function(index) {
- if (index === 0) {
- if (!this._isCarryingStackTrace()) {
- this._fulfillmentHandler0 = undefined;
- }
- this._rejectionHandler0 =
- this._progressHandler0 =
- this._receiver0 =
- this._promise0 = undefined;
- } else {
- var base = index * 5 - 5;
- this[base + 3] =
- this[base + 4] =
- this[base + 0] =
- this[base + 1] =
- this[base + 2] = undefined;
- }
-};
-
-Promise.prototype._isSettlePromisesQueued = function () {
- return (this._bitField &
- -1073741824) === -1073741824;
-};
-
-Promise.prototype._setSettlePromisesQueued = function () {
- this._bitField = this._bitField | -1073741824;
-};
-
-Promise.prototype._unsetSettlePromisesQueued = function () {
- this._bitField = this._bitField & (~-1073741824);
-};
-
-Promise.prototype._queueSettlePromises = function() {
- async.settlePromises(this);
- this._setSettlePromisesQueued();
-};
-
-Promise.prototype._fulfillUnchecked = function (value) {
- if (value === this) {
- var err = makeSelfResolutionError();
- this._attachExtraTrace(err);
- return this._rejectUnchecked(err, undefined);
- }
- this._setFulfilled();
- this._settledValue = value;
- this._cleanValues();
-
- if (this._length() > 0) {
- this._queueSettlePromises();
- }
-};
-
-Promise.prototype._rejectUncheckedCheckError = function (reason) {
- var trace = util.ensureErrorObject(reason);
- this._rejectUnchecked(reason, trace === reason ? undefined : trace);
-};
-
-Promise.prototype._rejectUnchecked = function (reason, trace) {
- if (reason === this) {
- var err = makeSelfResolutionError();
- this._attachExtraTrace(err);
- return this._rejectUnchecked(err);
- }
- this._setRejected();
- this._settledValue = reason;
- this._cleanValues();
-
- if (this._isFinal()) {
- async.throwLater(function(e) {
- if ("stack" in e) {
- async.invokeFirst(
- CapturedTrace.unhandledRejection, undefined, e);
- }
- throw e;
- }, trace === undefined ? reason : trace);
- return;
- }
-
- if (trace !== undefined && trace !== reason) {
- this._setCarriedStackTrace(trace);
- }
-
- if (this._length() > 0) {
- this._queueSettlePromises();
- } else {
- this._ensurePossibleRejectionHandled();
- }
-};
-
-Promise.prototype._settlePromises = function () {
- this._unsetSettlePromisesQueued();
- var len = this._length();
- for (var i = 0; i < len; i++) {
- this._settlePromiseAt(i);
- }
-};
-
-Promise._makeSelfResolutionError = makeSelfResolutionError;
-_dereq_("./progress.js")(Promise, PromiseArray);
-_dereq_("./method.js")(Promise, INTERNAL, tryConvertToPromise, apiRejection);
-_dereq_("./bind.js")(Promise, INTERNAL, tryConvertToPromise);
-_dereq_("./finally.js")(Promise, NEXT_FILTER, tryConvertToPromise);
-_dereq_("./direct_resolve.js")(Promise);
-_dereq_("./synchronous_inspection.js")(Promise);
-_dereq_("./join.js")(Promise, PromiseArray, tryConvertToPromise, INTERNAL);
-Promise.Promise = Promise;
-_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);
-_dereq_('./cancel.js')(Promise);
-_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext);
-_dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise);
-_dereq_('./nodeify.js')(Promise);
-_dereq_('./call_get.js')(Promise);
-_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
-_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
-_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL);
-_dereq_('./settle.js')(Promise, PromiseArray);
-_dereq_('./some.js')(Promise, PromiseArray, apiRejection);
-_dereq_('./promisify.js')(Promise, INTERNAL);
-_dereq_('./any.js')(Promise);
-_dereq_('./each.js')(Promise, INTERNAL);
-_dereq_('./timers.js')(Promise, INTERNAL);
-_dereq_('./filter.js')(Promise, INTERNAL);
-
- util.toFastProperties(Promise);
- util.toFastProperties(Promise.prototype);
- function fillTypes(value) {
- var p = new Promise(INTERNAL);
- p._fulfillmentHandler0 = value;
- p._rejectionHandler0 = value;
- p._progressHandler0 = value;
- p._promise0 = value;
- p._receiver0 = value;
- p._settledValue = 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));
- CapturedTrace.setBounds(async.firstLineError, util.lastLineError);
- return Promise;
-
-};
-
-},{"./any.js":1,"./async.js":2,"./bind.js":3,"./call_get.js":5,"./cancel.js":6,"./captured_trace.js":7,"./catch_filter.js":8,"./context.js":9,"./debuggability.js":10,"./direct_resolve.js":11,"./each.js":12,"./errors.js":13,"./filter.js":15,"./finally.js":16,"./generators.js":17,"./join.js":18,"./map.js":19,"./method.js":20,"./nodeify.js":21,"./progress.js":22,"./promise_array.js":24,"./promise_resolver.js":25,"./promisify.js":26,"./props.js":27,"./race.js":29,"./reduce.js":30,"./settle.js":32,"./some.js":33,"./synchronous_inspection.js":34,"./thenables.js":35,"./timers.js":36,"./using.js":37,"./util.js":38}],24:[function(_dereq_,module,exports){
-"use strict";
-module.exports = function(Promise, INTERNAL, tryConvertToPromise,
- apiRejection) {
-var util = _dereq_("./util.js");
-var isArray = util.isArray;
-
-function toResolutionValue(val) {
- switch(val) {
- case -2: return [];
- case -3: return {};
- }
-}
-
-function PromiseArray(values) {
- var promise = this._promise = new Promise(INTERNAL);
- var parent;
- if (values instanceof Promise) {
- parent = values;
- promise._propagateFrom(parent, 1 | 4);
- }
- this._values = values;
- this._length = 0;
- this._totalResolved = 0;
- this._init(undefined, -2);
-}
-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();
- this._values = values;
- if (values._isFulfilled()) {
- values = values._value();
- if (!isArray(values)) {
- var err = new Promise.TypeError("expecting an array, a promise or a thenable\u000a\u000a See http://goo.gl/s8MMhc\u000a");
- this.__hardReject__(err);
- return;
- }
- } else if (values._isPending()) {
- values._then(
- init,
- this._reject,
- undefined,
- this,
- resolveValueIfEmpty
- );
- return;
- } else {
- this._reject(values._reason());
- return;
- }
- } else if (!isArray(values)) {
- this._promise._reject(apiRejection("expecting an array, a promise or a thenable\u000a\u000a See http://goo.gl/s8MMhc\u000a")._reason());
- return;
- }
-
- if (values.length === 0) {
- if (resolveValueIfEmpty === -5) {
- this._resolveEmptyArray();
- }
- else {
- this._resolve(toResolutionValue(resolveValueIfEmpty));
- }
- return;
- }
- var len = this.getActualLength(values.length);
- this._length = len;
- this._values = this.shouldCopyValues() ? new Array(len) : this._values;
- var promise = this._promise;
- for (var i = 0; i < len; ++i) {
- var isResolved = this._isResolved();
- var maybePromise = tryConvertToPromise(values[i], promise);
- if (maybePromise instanceof Promise) {
- maybePromise = maybePromise._target();
- if (isResolved) {
- maybePromise._unsetRejectionIsUnhandled();
- } else if (maybePromise._isPending()) {
- maybePromise._proxyPromiseArray(this, i);
- } else if (maybePromise._isFulfilled()) {
- this._promiseFulfilled(maybePromise._value(), i);
- } else {
- this._promiseRejected(maybePromise._reason(), i);
- }
- } else if (!isResolved) {
- this._promiseFulfilled(maybePromise, i);
- }
- }
-};
-
-PromiseArray.prototype._isResolved = function () {
- return this._values === null;
-};
-
-PromiseArray.prototype._resolve = function (value) {
- this._values = null;
- this._promise._fulfill(value);
-};
-
-PromiseArray.prototype.__hardReject__ =
-PromiseArray.prototype._reject = function (reason) {
- this._values = null;
- this._promise._rejectCallback(reason, false, true);
-};
-
-PromiseArray.prototype._promiseProgressed = function (progressValue, index) {
- this._promise._progress({
- index: index,
- value: progressValue
- });
-};
-
-
-PromiseArray.prototype._promiseFulfilled = function (value, index) {
- this._values[index] = value;
- var totalResolved = ++this._totalResolved;
- if (totalResolved >= this._length) {
- this._resolve(this._values);
- }
-};
-
-PromiseArray.prototype._promiseRejected = function (reason, index) {
- this._totalResolved++;
- this._reject(reason);
-};
-
-PromiseArray.prototype.shouldCopyValues = function () {
- return true;
-};
-
-PromiseArray.prototype.getActualLength = function (len) {
- return len;
-};
-
-return PromiseArray;
-};
-
-},{"./util.js":38}],25:[function(_dereq_,module,exports){
-"use strict";
-var util = _dereq_("./util.js");
+var util = _dereq_("./util");
var maybeWrapAsError = util.maybeWrapAsError;
-var errors = _dereq_("./errors.js");
-var TimeoutError = errors.TimeoutError;
+var errors = _dereq_("./errors");
var OperationalError = errors.OperationalError;
-var haveGetters = util.haveGetters;
-var es5 = _dereq_("./es5.js");
+var es5 = _dereq_("./es5");
function isUntypedError(obj) {
return obj instanceof Error &&
@@ -3093,114 +2462,1055 @@ function wrapAsOperationalError(obj) {
return obj;
}
-function nodebackForPromise(promise) {
+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 (arguments.length > 2) {
- var $_len = arguments.length;var args = new Array($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];}
- promise._fulfill(args);
- } else {
+ } else if (!multiArgs) {
promise._fulfill(value);
+ } else {
+ var args = [].slice.call(arguments, 1);;
+ promise._fulfill(args);
}
-
promise = null;
};
}
+module.exports = nodebackForPromise;
-var PromiseResolver;
-if (!haveGetters) {
- PromiseResolver = function (promise) {
- this.promise = promise;
- this.asCallback = nodebackForPromise(promise);
- this.callback = this.asCallback;
- };
+},{"./errors":12,"./es5":13,"./util":36}],21:[function(_dereq_,module,exports){
+"use strict";
+module.exports = function(Promise) {
+var util = _dereq_("./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);
+ }
}
-else {
- PromiseResolver = function (promise) {
- this.promise = promise;
- };
+
+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);
+ }
}
-if (haveGetters) {
- var prop = {
- get: function() {
- return nodebackForPromise(this.promise);
+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;
+};
+};
+
+},{"./util":36}],22:[function(_dereq_,module,exports){
+"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 = _dereq_("./util");
+
+var getDomain;
+if (util.isNode) {
+ getDomain = function() {
+ var ret = process.domain;
+ if (ret === undefined) ret = null;
+ return ret;
};
- es5.defineProperty(PromiseResolver.prototype, "asCallback", prop);
- es5.defineProperty(PromiseResolver.prototype, "callback", prop);
+} else {
+ getDomain = function() {
+ return null;
+ };
+}
+util.notEnumerableProp(Promise, "_getDomain", getDomain);
+
+var es5 = _dereq_("./es5");
+var Async = _dereq_("./async");
+var async = new Async();
+es5.defineProperty(Promise, "_async", {value: async});
+var errors = _dereq_("./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 = _dereq_("./thenables")(Promise, INTERNAL);
+var PromiseArray =
+ _dereq_("./promise_array")(Promise, INTERNAL,
+ tryConvertToPromise, apiRejection, Proxyable);
+var Context = _dereq_("./context")(Promise);
+ /*jshint unused:false*/
+var createContext = Context.create;
+var debug = _dereq_("./debuggability")(Promise, Context);
+var CapturedTrace = debug.CapturedTrace;
+var finallyHandler = _dereq_("./finally")(Promise, tryConvertToPromise);
+var catchFilter = _dereq_("./catch_filter")(NEXT_FILTER);
+var nodebackForPromise = _dereq_("./nodeback");
+var errorObj = util.errorObj;
+var tryCatch = util.tryCatch;
+function check(self, executor) {
+ if (typeof executor !== "function") {
+ throw new TypeError("expecting a function but got " + util.classString(executor));
+ }
+ if (self.constructor !== Promise) {
+ throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a");
+ }
}
-PromiseResolver._nodebackForPromise = nodebackForPromise;
-
-PromiseResolver.prototype.toString = function () {
- return "[object PromiseResolver]";
-};
-
-PromiseResolver.prototype.resolve =
-PromiseResolver.prototype.fulfill = function (value) {
- if (!(this instanceof PromiseResolver)) {
- throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\u000a\u000a See http://goo.gl/sdkXL9\u000a");
+function Promise(executor) {
+ this._bitField = 0;
+ this._fulfillmentHandler0 = undefined;
+ this._rejectionHandler0 = undefined;
+ this._promise0 = undefined;
+ this._receiver0 = undefined;
+ if (executor !== INTERNAL) {
+ check(this, executor);
+ this._resolveFromExecutor(executor);
}
- this.promise._resolveCallback(value);
+ this._promiseCreated();
+}
+
+Promise.prototype.toString = function () {
+ return "[object Promise]";
};
-PromiseResolver.prototype.reject = function (reason) {
- if (!(this instanceof PromiseResolver)) {
- throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\u000a\u000a See http://goo.gl/sdkXL9\u000a");
+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("expecting an object but got " + util.classString(item));
+ }
+ }
+ catchInstances.length = j;
+ fn = arguments[i];
+ return this.then(undefined, catchFilter(catchInstances, fn, this));
}
- this.promise._rejectCallback(reason);
+ return this.then(undefined, fn);
};
-PromiseResolver.prototype.progress = function (value) {
- if (!(this instanceof PromiseResolver)) {
- throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\u000a\u000a See http://goo.gl/sdkXL9\u000a");
+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);
}
- this.promise._progress(value);
+ return this._then(didFulfill, didReject, undefined, undefined, undefined);
};
-PromiseResolver.prototype.cancel = function (err) {
- this.promise.cancel(err);
+Promise.prototype.done = function (didFulfill, didReject) {
+ var promise =
+ this._then(didFulfill, didReject, undefined, undefined, undefined);
+ promise._setIsFinal();
};
-PromiseResolver.prototype.timeout = function () {
- this.reject(new TimeoutError("timeout"));
+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);
};
-PromiseResolver.prototype.isResolved = function () {
- return this.promise.isResolved();
+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;
};
-PromiseResolver.prototype.toJSON = function () {
- return this.promise.toJSON();
+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();
};
-module.exports = PromiseResolver;
+Promise.prototype.error = function (fn) {
+ return this.caught(util.originatesFromRejection, fn);
+};
-},{"./errors.js":13,"./es5.js":14,"./util.js":38}],26:[function(_dereq_,module,exports){
+Promise.is = function (val) {
+ return val instanceof Promise;
+};
+
+Promise.fromNode = Promise.fromCallback = function(fn) {
+ var ret = new Promise(INTERNAL);
+ 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));
+ }
+ var prev = async._schedule;
+ async._schedule = fn;
+ return prev;
+};
+
+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;
+ }
+ }
+ }
+
+ 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" && domain.bind(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;
+};
+
+Promise.prototype._setRejected = function () {
+ this._bitField = this._bitField | 16777216;
+};
+
+Promise.prototype._setFollowing = function () {
+ this._bitField = this._bitField | 67108864;
+};
+
+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;
+};
+
+Promise.prototype._setAsyncGuaranteed = function() {
+ 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 : domain.bind(fulfill);
+ }
+ if (typeof reject === "function") {
+ this._rejectionHandler0 =
+ domain === null ? reject : domain.bind(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 : domain.bind(fulfill);
+ }
+ if (typeof reject === "function") {
+ this[base + 1] =
+ domain === null ? reject : domain.bind(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();
+ 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) {
+ 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 || x === promise) {
+ var err = x === promise ? makeSelfResolutionError() : x.e;
+ promise._rejectCallback(err, false);
+ } else {
+ debug.checkForgottenReturns(x, promiseCreated, "", promise);
+ 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 (handler === finallyHandler) {
+ 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) {
+ if (((bitField & 134217728) !== 0)) {
+ this._settlePromises();
+ } else {
+ 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);
+
+_dereq_("./method")(Promise, INTERNAL, tryConvertToPromise, apiRejection,
+ debug);
+_dereq_("./bind")(Promise, INTERNAL, tryConvertToPromise, debug);
+_dereq_("./cancel")(Promise, PromiseArray, apiRejection, debug);
+_dereq_("./direct_resolve")(Promise);
+_dereq_("./synchronous_inspection")(Promise);
+_dereq_("./join")(
+ Promise, PromiseArray, tryConvertToPromise, INTERNAL, debug);
+Promise.Promise = Promise;
+_dereq_('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
+_dereq_('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
+_dereq_('./timers.js')(Promise, INTERNAL);
+_dereq_('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
+_dereq_('./nodeify.js')(Promise);
+_dereq_('./call_get.js')(Promise);
+_dereq_('./props.js')(Promise, PromiseArray, tryConvertToPromise, apiRejection);
+_dereq_('./race.js')(Promise, INTERNAL, tryConvertToPromise, apiRejection);
+_dereq_('./reduce.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
+_dereq_('./settle.js')(Promise, PromiseArray, debug);
+_dereq_('./some.js')(Promise, PromiseArray, apiRejection);
+_dereq_('./promisify.js')(Promise, INTERNAL);
+_dereq_('./any.js')(Promise);
+_dereq_('./each.js')(Promise, INTERNAL);
+_dereq_('./filter.js')(Promise, INTERNAL);
+
+ 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;
+
+};
+
+},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36}],23:[function(_dereq_,module,exports){
+"use strict";
+module.exports = function(Promise, INTERNAL, tryConvertToPromise,
+ apiRejection, Proxyable) {
+var util = _dereq_("./util");
+var isArray = util.isArray;
+
+function toResolutionValue(val) {
+ switch(val) {
+ case -2: return [];
+ case -3: return {};
+ }
+}
+
+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;
+};
+
+},{"./util":36}],24:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
var THIS = {};
-var util = _dereq_("./util.js");
-var nodebackForPromise = _dereq_("./promise_resolver.js")
- ._nodebackForPromise;
+var util = _dereq_("./util");
+var nodebackForPromise = _dereq_("./nodeback");
var withAppended = util.withAppended;
var maybeWrapAsError = util.maybeWrapAsError;
var canEvaluate = util.canEvaluate;
var TypeError = _dereq_("./errors").TypeError;
var defaultSuffix = "Async";
var defaultPromisified = {__isPromisified__: true};
-var noCopyPropsPattern =
- /^(?:length|name|arguments|caller|callee|prototype|__isPromisified__)$/;
-var defaultFilter = function(name, func) {
+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) !== "_" &&
- !util.isClass(func);
+ name !== "constructor";
};
function propsFilter(key) {
@@ -3228,7 +3538,7 @@ function checkValid(ret, suffix, suffixRegexp) {
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/iWrZbw\u000a"
+ 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));
}
}
@@ -3290,7 +3600,7 @@ var parameterCount = function(fn) {
};
makeNodePromisifiedEval =
-function(callback, receiver, originalName, fn) {
+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;
@@ -3335,22 +3645,13 @@ function(callback, receiver, originalName, fn) {
var getFunctionCode = typeof callback === "string"
? ("this != null ? this['"+callback+"'] : fn")
: "fn";
-
- return new Function("Promise",
- "fn",
- "receiver",
- "withAppended",
- "maybeWrapAsError",
- "nodebackForPromise",
- "tryCatch",
- "errorObj",
- "INTERNAL","'use strict'; \n\
+ 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); \n\
+ var nodeback = nodebackForPromise(promise, " + multiArgs + "); \n\
var ret; \n\
var callback = tryCatch([GetFunctionCode]); \n\
switch(len) { \n\
@@ -3359,28 +3660,39 @@ function(callback, receiver, originalName, fn) {
if (ret === errorObj) { \n\
promise._rejectCallback(maybeWrapAsError(ret.e), true, true);\n\
} \n\
+ if (!promise._isFateSealed()) promise._setAsyncGuaranteed(); \n\
return promise; \n\
}; \n\
- ret.__isPromisified__ = true; \n\
+ notEnumerableProp(ret, '__isPromisified__', true); \n\
return ret; \n\
- "
- .replace("Parameters", parameterDeclaration(newParameterCount))
- .replace("[CodeForSwitchCase]", generateArgumentSwitchCase())
- .replace("[GetFunctionCode]", getFunctionCode))(
- Promise,
- fn,
- receiver,
- withAppended,
- maybeWrapAsError,
- nodebackForPromise,
- util.tryCatch,
- util.errorObj,
- INTERNAL
- );
+ ".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) {
+function makeNodePromisifiedClosure(callback, receiver, _, fn, __, multiArgs) {
var defaultThis = (function() {return this;})();
var method = callback;
if (typeof method === "string") {
@@ -3393,15 +3705,16 @@ function makeNodePromisifiedClosure(callback, receiver, _, fn) {
promise._captureStackTrace();
var cb = typeof method === "string" && this !== defaultThis
? this[method] : callback;
- var fn = nodebackForPromise(promise);
+ 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;
}
- promisified.__isPromisified__ = true;
+ util.notEnumerableProp(promisified, "__isPromisified__", true);
return promisified;
}
@@ -3409,7 +3722,7 @@ var makeNodePromisified = canEvaluate
? makeNodePromisifiedEval
: makeNodePromisifiedClosure;
-function promisifyAll(obj, suffix, filter, promisifier) {
+function promisifyAll(obj, suffix, filter, promisifier, multiArgs) {
var suffixRegexp = new RegExp(escapeIdentRegex(suffix) + "$");
var methods =
promisifiableMethods(obj, suffix, suffixRegexp, filter);
@@ -3418,37 +3731,48 @@ function promisifyAll(obj, suffix, filter, promisifier) {
var key = methods[i];
var fn = methods[i+1];
var promisifiedKey = key + suffix;
- obj[promisifiedKey] = promisifier === makeNodePromisified
- ? makeNodePromisified(key, THIS, key, fn, suffix)
- : promisifier(fn, function() {
- return makeNodePromisified(key, THIS, key, fn, 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) {
- return makeNodePromisified(callback, receiver, undefined, callback);
+function promisify(callback, receiver, multiArgs) {
+ return makeNodePromisified(callback, receiver, undefined,
+ callback, null, multiArgs);
}
-Promise.promisify = function (fn, receiver) {
+Promise.promisify = function (fn, options) {
if (typeof fn !== "function") {
- throw new TypeError("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
+ throw new TypeError("expecting a function but got " + util.classString(fn));
}
if (isPromisified(fn)) {
return fn;
}
- var ret = promisify(fn, arguments.length < 2 ? THIS : receiver);
+ 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/9ITlV0\u000a");
+ 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;
@@ -3457,7 +3781,7 @@ Promise.promisifyAll = function (target, options) {
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/8FZo5V\u000a");
+ throw new RangeError("suffix must be a valid identifier\u000a\u000a See http://goo.gl/MqrFmX\u000a");
}
var keys = util.inheritedDataKeys(target);
@@ -3465,59 +3789,99 @@ Promise.promisifyAll = function (target, options) {
var value = target[keys[i]];
if (keys[i] !== "constructor" &&
util.isClass(value)) {
- promisifyAll(value.prototype, suffix, filter, promisifier);
- promisifyAll(value, suffix, filter, promisifier);
+ promisifyAll(value.prototype, suffix, filter, promisifier,
+ multiArgs);
+ promisifyAll(value, suffix, filter, promisifier, multiArgs);
}
}
- return promisifyAll(target, suffix, filter, promisifier);
+ return promisifyAll(target, suffix, filter, promisifier, multiArgs);
};
};
-},{"./errors":13,"./promise_resolver.js":25,"./util.js":38}],27:[function(_dereq_,module,exports){
+},{"./errors":12,"./nodeback":20,"./util":36}],25:[function(_dereq_,module,exports){
"use strict";
module.exports = function(
Promise, PromiseArray, tryConvertToPromise, apiRejection) {
-var util = _dereq_("./util.js");
+var util = _dereq_("./util");
var isObject = util.isObject;
-var es5 = _dereq_("./es5.js");
+var es5 = _dereq_("./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 keys = es5.keys(obj);
- var len = keys.length;
- var values = new Array(len * 2);
- for (var i = 0; i < len; ++i) {
- var key = keys[i];
- values[i] = obj[key];
- values[i + len] = key;
+ 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$(values);
+ this.constructor$(entries);
+ this._isMap = isMap;
+ this._init$(undefined, -3);
}
util.inherits(PropertiesPromiseArray, PromiseArray);
-PropertiesPromiseArray.prototype._init = function () {
- this._init$(undefined, -3) ;
-};
+PropertiesPromiseArray.prototype._init = function () {};
PropertiesPromiseArray.prototype._promiseFulfilled = function (value, index) {
this._values[index] = value;
var totalResolved = ++this._totalResolved;
if (totalResolved >= this._length) {
- var val = {};
- var keyOffset = this.length();
- for (var i = 0, len = this.length(); i < len; ++i) {
- val[this._values[i + keyOffset]] = this._values[i];
+ 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;
}
-};
-
-PropertiesPromiseArray.prototype._promiseProgressed = function (value, index) {
- this._promise._progress({
- key: this._values[index + this.length()],
- value: value
- });
+ return false;
};
PropertiesPromiseArray.prototype.shouldCopyValues = function () {
@@ -3533,7 +3897,7 @@ function props(promises) {
var castValue = tryConvertToPromise(promises);
if (!isObject(castValue)) {
- return apiRejection("cannot await properties of a non-object\u000a\u000a See http://goo.gl/OsFKC8\u000a");
+ 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);
@@ -3542,7 +3906,7 @@ function props(promises) {
}
if (castValue instanceof Promise) {
- ret._propagateFrom(castValue, 4);
+ ret._propagateFrom(castValue, 2);
}
return ret;
}
@@ -3556,7 +3920,7 @@ Promise.props = function (promises) {
};
};
-},{"./es5.js":14,"./util.js":38}],28:[function(_dereq_,module,exports){
+},{"./es5":13,"./util":36}],26:[function(_dereq_,module,exports){
"use strict";
function arrayMove(src, srcIndex, dst, dstIndex, len) {
for (var j = 0; j < len; ++j) {
@@ -3648,11 +4012,11 @@ Queue.prototype._resizeTo = function (capacity) {
module.exports = Queue;
-},{}],29:[function(_dereq_,module,exports){
+},{}],27:[function(_dereq_,module,exports){
"use strict";
module.exports = function(
Promise, INTERNAL, tryConvertToPromise, apiRejection) {
-var isArray = _dereq_("./util.js").isArray;
+var util = _dereq_("./util");
var raceLater = function (promise) {
return promise.then(function(array) {
@@ -3665,13 +4029,15 @@ function race(promises, parent) {
if (maybePromise instanceof Promise) {
return raceLater(maybePromise);
- } else if (!isArray(promises)) {
- return apiRejection("expecting an array, a promise or a thenable\u000a\u000a See http://goo.gl/s8MMhc\u000a");
+ } 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, 4 | 1);
+ ret._propagateFrom(parent, 3);
}
var fulfill = ret._fulfill;
var reject = ret._reject;
@@ -3697,145 +4063,108 @@ Promise.prototype.race = function () {
};
-},{"./util.js":38}],30:[function(_dereq_,module,exports){
+},{"./util":36}],28:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise,
PromiseArray,
apiRejection,
tryConvertToPromise,
- INTERNAL) {
-var async = _dereq_("./async.js");
-var util = _dereq_("./util.js");
+ INTERNAL,
+ debug) {
+var getDomain = Promise._getDomain;
+var util = _dereq_("./util");
var tryCatch = util.tryCatch;
-var errorObj = util.errorObj;
-function ReductionPromiseArray(promises, fn, accum, _each) {
+
+function ReductionPromiseArray(promises, fn, initialValue, _each) {
this.constructor$(promises);
- this._promise._captureStackTrace();
- this._preservedValues = _each === INTERNAL ? [] : null;
- this._zerothIsAccum = (accum === undefined);
- this._gotAccum = false;
- this._reducingIndex = (this._zerothIsAccum ? 1 : 0);
- this._valuesPhase = undefined;
- var maybePromise = tryConvertToPromise(accum, this._promise);
- var rejected = false;
- var isPromise = maybePromise instanceof Promise;
- if (isPromise) {
- maybePromise = maybePromise._target();
- if (maybePromise._isPending()) {
- maybePromise._proxyPromiseArray(this, -1);
- } else if (maybePromise._isFulfilled()) {
- accum = maybePromise._value();
- this._gotAccum = true;
- } else {
- this._reject(maybePromise._reason());
- rejected = true;
- }
+ var domain = getDomain();
+ this._fn = domain === null ? fn : domain.bind(fn);
+ if (initialValue !== undefined) {
+ initialValue = Promise.resolve(initialValue);
+ initialValue._attachCancellationCallback(this);
}
- if (!(isPromise || this._zerothIsAccum)) this._gotAccum = true;
- this._callback = fn;
- this._accum = accum;
- if (!rejected) async.invoke(init, this, undefined);
-}
-function init() {
+ this._initialValue = initialValue;
+ this._currentCancellable = null;
+ this._eachValues = _each === INTERNAL ? [] : undefined;
+ this._promise._captureStackTrace();
this._init$(undefined, -5);
}
util.inherits(ReductionPromiseArray, PromiseArray);
-ReductionPromiseArray.prototype._init = function () {};
-
-ReductionPromiseArray.prototype._resolveEmptyArray = function () {
- if (this._gotAccum || this._zerothIsAccum) {
- this._resolve(this._preservedValues !== null
- ? [] : this._accum);
+ReductionPromiseArray.prototype._gotAccum = function(accum) {
+ if (this._eachValues !== undefined && accum !== INTERNAL) {
+ this._eachValues.push(accum);
}
};
-ReductionPromiseArray.prototype._promiseFulfilled = function (value, index) {
- var values = this._values;
- values[index] = value;
- var length = this.length();
- var preservedValues = this._preservedValues;
- var isEach = preservedValues !== null;
- var gotAccum = this._gotAccum;
- var valuesPhase = this._valuesPhase;
- var valuesPhaseIndex;
- if (!valuesPhase) {
- valuesPhase = this._valuesPhase = new Array(length);
- for (valuesPhaseIndex=0; valuesPhaseIndex 10) || (version[0] > 0)
- ? global.setImmediate : process.nextTick;
-
- if (!schedule) {
- if (typeof setImmediate !== "undefined") {
- schedule = setImmediate;
- } else if (typeof setTimeout !== "undefined") {
- schedule = setTimeout;
- } else {
- schedule = noAsyncScheduler;
- }
- }
-} else if (typeof MutationObserver !== "undefined") {
+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 MutationObserver !== "undefined") &&
+ !(typeof window !== "undefined" &&
+ window.navigator &&
+ window.navigator.standalone)) {
schedule = function(fn) {
var div = document.createElement("div");
var observer = new MutationObserver(fn);
@@ -3886,12 +4264,12 @@ if (_dereq_("./util.js").isNode) {
}
module.exports = schedule;
-},{"./util.js":38}],32:[function(_dereq_,module,exports){
+},{"./util":36}],30:[function(_dereq_,module,exports){
"use strict";
module.exports =
- function(Promise, PromiseArray) {
+ function(Promise, PromiseArray, debug) {
var PromiseInspection = Promise.PromiseInspection;
-var util = _dereq_("./util.js");
+var util = _dereq_("./util");
function SettledPromiseArray(values) {
this.constructor$(values);
@@ -3903,39 +4281,43 @@ SettledPromiseArray.prototype._promiseResolved = function (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 = 268435456;
- ret._settledValue = value;
- this._promiseResolved(index, ret);
+ ret._bitField = 33554432;
+ ret._settledValueField = value;
+ return this._promiseResolved(index, ret);
};
SettledPromiseArray.prototype._promiseRejected = function (reason, index) {
var ret = new PromiseInspection();
- ret._bitField = 134217728;
- ret._settledValue = reason;
- this._promiseResolved(index, ret);
+ 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 new SettledPromiseArray(this).promise();
+ return Promise.settle(this);
};
};
-},{"./util.js":38}],33:[function(_dereq_,module,exports){
+},{"./util":36}],31:[function(_dereq_,module,exports){
"use strict";
module.exports =
function(Promise, PromiseArray, apiRejection) {
-var util = _dereq_("./util.js");
-var RangeError = _dereq_("./errors.js").RangeError;
-var AggregateError = _dereq_("./errors.js").AggregateError;
+var util = _dereq_("./util");
+var RangeError = _dereq_("./errors").RangeError;
+var AggregateError = _dereq_("./errors").AggregateError;
var isArray = util.isArray;
+var CANCELLATION = {};
function SomePromiseArray(values) {
@@ -3989,18 +4371,40 @@ SomePromiseArray.prototype._promiseFulfilled = function (value) {
} 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) {
- e.push(this._values[i]);
+ if (this._values[i] !== CANCELLATION) {
+ e.push(this._values[i]);
+ }
}
- this._reject(e);
+ if (e.length > 0) {
+ this._reject(e);
+ } else {
+ this._cancel();
+ }
+ return true;
}
+ return false;
};
SomePromiseArray.prototype._fulfilled = function () {
@@ -4035,7 +4439,7 @@ SomePromiseArray.prototype._resolveEmptyArray = function () {
function some(promises, howMany) {
if ((howMany | 0) !== howMany || howMany < 0) {
- return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/1wAmHx\u000a");
+ return apiRejection("expecting a positive integer\u000a\u000a See http://goo.gl/MqrFmX\u000a");
}
var ret = new SomePromiseArray(promises);
var promise = ret.promise();
@@ -4055,142 +4459,151 @@ Promise.prototype.some = function (howMany) {
Promise._SomePromiseArray = SomePromiseArray;
};
-},{"./errors.js":13,"./util.js":38}],34:[function(_dereq_,module,exports){
+},{"./errors":12,"./util":36}],32:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise) {
function PromiseInspection(promise) {
if (promise !== undefined) {
promise = promise._target();
this._bitField = promise._bitField;
- this._settledValue = promise._settledValue;
+ this._settledValueField = promise._isFateSealed()
+ ? promise._settledValue() : undefined;
}
else {
this._bitField = 0;
- this._settledValue = undefined;
+ this._settledValueField = undefined;
}
}
-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/hc1DLj\u000a");
- }
- return this._settledValue;
+PromiseInspection.prototype._settledValue = function() {
+ return this._settledValueField;
};
-PromiseInspection.prototype.error =
+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/hPuiwB\u000a");
+ throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/MqrFmX\u000a");
}
- return this._settledValue;
+ return this._settledValue();
};
-PromiseInspection.prototype.isFulfilled =
-Promise.prototype._isFulfilled = function () {
- return (this._bitField & 268435456) > 0;
+var isFulfilled = PromiseInspection.prototype.isFulfilled = function() {
+ return (this._bitField & 33554432) !== 0;
};
-PromiseInspection.prototype.isRejected =
-Promise.prototype._isRejected = function () {
- return (this._bitField & 134217728) > 0;
+var isRejected = PromiseInspection.prototype.isRejected = function () {
+ return (this._bitField & 16777216) !== 0;
};
-PromiseInspection.prototype.isPending =
-Promise.prototype._isPending = function () {
- return (this._bitField & 402653184) === 0;
+var isPending = PromiseInspection.prototype.isPending = function () {
+ return (this._bitField & 50397184) === 0;
};
-PromiseInspection.prototype.isResolved =
-Promise.prototype._isResolved = function () {
- return (this._bitField & 402653184) > 0;
+var isResolved = PromiseInspection.prototype.isResolved = function () {
+ return (this._bitField & 50331648) !== 0;
+};
+
+PromiseInspection.prototype.isCancelled =
+Promise.prototype._isCancelled = function() {
+ return (this._bitField & 65536) === 65536;
+};
+
+Promise.prototype.isCancelled = function() {
+ return this._target()._isCancelled();
};
Promise.prototype.isPending = function() {
- return this._target()._isPending();
+ return isPending.call(this._target());
};
Promise.prototype.isRejected = function() {
- return this._target()._isRejected();
+ return isRejected.call(this._target());
};
Promise.prototype.isFulfilled = function() {
- return this._target()._isFulfilled();
+ return isFulfilled.call(this._target());
};
Promise.prototype.isResolved = function() {
- return this._target()._isResolved();
-};
-
-Promise.prototype._value = function() {
- return this._settledValue;
-};
-
-Promise.prototype._reason = function() {
- this._unsetRejectionIsUnhandled();
- return this._settledValue;
+ return isResolved.call(this._target());
};
Promise.prototype.value = function() {
- var target = this._target();
- if (!target.isFulfilled()) {
- throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\u000a\u000a See http://goo.gl/hc1DLj\u000a");
- }
- return target._settledValue;
+ return value.call(this._target());
};
Promise.prototype.reason = function() {
var target = this._target();
- if (!target.isRejected()) {
- throw new TypeError("cannot get rejection reason of a non-rejected promise\u000a\u000a See http://goo.gl/hPuiwB\u000a");
- }
target._unsetRejectionIsUnhandled();
- return target._settledValue;
+ return reason.call(target);
};
+Promise.prototype._value = function() {
+ return this._settledValue();
+};
+
+Promise.prototype._reason = function() {
+ this._unsetRejectionIsUnhandled();
+ return this._settledValue();
+};
Promise.PromiseInspection = PromiseInspection;
};
-},{}],35:[function(_dereq_,module,exports){
+},{}],33:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
-var util = _dereq_("./util.js");
+var util = _dereq_("./util");
var errorObj = util.errorObj;
var isObject = util.isObject;
function tryConvertToPromise(obj, context) {
if (isObject(obj)) {
- if (obj instanceof Promise) {
- return obj;
- }
- else if (isAnyBluebirdPromise(obj)) {
- var ret = new Promise(INTERNAL);
- obj._then(
- ret._fulfillUnchecked,
- ret._rejectUncheckedCheckError,
- ret._progressUnchecked,
- ret,
- null
- );
- return ret;
- }
- var then = util.tryCatch(getThen)(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 getThen(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) {
return hasProp.call(obj, "_promise0");
@@ -4203,77 +4616,71 @@ function doThenable(x, then, context) {
promise._captureStackTrace();
if (context) context._popContext();
var synchronous = true;
- var result = util.tryCatch(then).call(x,
- resolveFromThenable,
- rejectFromThenable,
- progressFromThenable);
+ var result = util.tryCatch(then).call(x, resolve, reject);
synchronous = false;
+
if (promise && result === errorObj) {
promise._rejectCallback(result.e, true, true);
promise = null;
}
- function resolveFromThenable(value) {
+ function resolve(value) {
if (!promise) return;
- if (x === value) {
- promise._rejectCallback(
- Promise._makeSelfResolutionError(), false, true);
- } else {
- promise._resolveCallback(value);
- }
+ promise._resolveCallback(value);
promise = null;
}
- function rejectFromThenable(reason) {
+ function reject(reason) {
if (!promise) return;
promise._rejectCallback(reason, synchronous, true);
promise = null;
}
-
- function progressFromThenable(value) {
- if (!promise) return;
- if (typeof promise._progress === "function") {
- promise._progress(value);
- }
- }
return ret;
}
return tryConvertToPromise;
};
-},{"./util.js":38}],36:[function(_dereq_,module,exports){
+},{"./util":36}],34:[function(_dereq_,module,exports){
"use strict";
module.exports = function(Promise, INTERNAL) {
-var util = _dereq_("./util.js");
+var util = _dereq_("./util");
var TimeoutError = Promise.TimeoutError;
-var afterTimeout = function (promise, message) {
+var afterTimeout = function (promise, message, parent) {
if (!promise.isPending()) return;
+ var err;
if (typeof message !== "string") {
- message = "operation timed out";
+ if (message instanceof Error) {
+ err = message;
+ } else {
+ err = new TimeoutError("operation timed out");
+ }
+ } else {
+ err = new TimeoutError(message);
}
- var err = new TimeoutError(message);
util.markAsOriginatingFromRejection(err);
promise._attachExtraTrace(err);
- promise._cancel(err);
+ promise._reject(err);
+ parent.cancel();
};
var afterValue = function(value) { return delay(+this).thenReturn(value); };
-var delay = Promise.delay = function (value, ms) {
- if (ms === undefined) {
- ms = value;
- value = undefined;
- var ret = new Promise(INTERNAL);
- setTimeout(function() { ret._fulfill(); }, ms);
- return ret;
+var delay = Promise.delay = function (ms, value) {
+ var ret;
+ if (value !== undefined) {
+ ret = Promise.resolve(value)
+ ._then(afterValue, null, null, ms, undefined);
+ } else {
+ ret = new Promise(INTERNAL);
+ setTimeout(function() { ret._fulfill(); }, +ms);
}
- ms = +ms;
- return Promise.resolve(value)._then(afterValue, null, null, ms, undefined);
+ ret._setAsyncGuaranteed();
+ return ret;
};
Promise.prototype.delay = function (ms) {
- return delay(this, ms);
+ return delay(ms, this);
};
function successClear(value) {
@@ -4292,35 +4699,25 @@ function failureClear(reason) {
Promise.prototype.timeout = function (ms, message) {
ms = +ms;
- var ret = this.then().cancellable();
- ret._cancellationParent = this;
+ var parent = this.then();
+ var ret = parent.then();
var handle = setTimeout(function timeoutTimeout() {
- afterTimeout(ret, message);
+ afterTimeout(ret, message, parent);
}, ms);
return ret._then(successClear, failureClear, undefined, handle, undefined);
};
};
-},{"./util.js":38}],37:[function(_dereq_,module,exports){
+},{"./util":36}],35:[function(_dereq_,module,exports){
"use strict";
module.exports = function (Promise, apiRejection, tryConvertToPromise,
- createContext) {
- var TypeError = _dereq_("./errors.js").TypeError;
- var inherits = _dereq_("./util.js").inherits;
- var PromiseInspection = Promise.PromiseInspection;
-
- function inspectionMapper(inspections) {
- var len = inspections.length;
- for (var i = 0; i < len; ++i) {
- var inspection = inspections[i];
- if (inspection.isRejected()) {
- return Promise.reject(inspection.error());
- }
- inspections[i] = inspection._settledValue;
- }
- return inspections;
- }
+ createContext, INTERNAL, debug) {
+ var util = _dereq_("./util");
+ var TypeError = _dereq_("./errors").TypeError;
+ var inherits = _dereq_("./util").inherits;
+ var errorObj = util.errorObj;
+ var tryCatch = util.tryCatch;
function thrower(e) {
setTimeout(function(){throw e;}, 0);
@@ -4339,9 +4736,9 @@ module.exports = function (Promise, apiRejection, tryConvertToPromise,
function dispose(resources, inspection) {
var i = 0;
var len = resources.length;
- var ret = Promise.defer();
+ var ret = new Promise(INTERNAL);
function iterator() {
- if (i >= len) return ret.resolve();
+ if (i >= len) return ret._fulfill();
var maybePromise = castPreservingDisposable(resources[i++]);
if (maybePromise instanceof Promise &&
maybePromise._isDisposable()) {
@@ -4360,21 +4757,7 @@ module.exports = function (Promise, apiRejection, tryConvertToPromise,
iterator();
}
iterator();
- return ret.promise;
- }
-
- function disposerSuccess(value) {
- var inspection = new PromiseInspection();
- inspection._settledValue = value;
- inspection._bitField = 268435456;
- return dispose(this, inspection).thenReturn(value);
- }
-
- function disposerFail(reason) {
- var inspection = new PromiseInspection();
- inspection._settledValue = reason;
- inspection._bitField = 134217728;
- return dispose(this, inspection).thenThrow(reason);
+ return ret;
}
function Disposer(data, promise, context) {
@@ -4434,16 +4817,43 @@ module.exports = function (Promise, apiRejection, tryConvertToPromise,
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("fn must be a function\u000a\u000a See http://goo.gl/916lJJ\u000a");
- len--;
- var resources = new Array(len);
+ 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 = arguments[i];
+ var resource = input[i];
if (Disposer.isDisposer(resource)) {
var disposer = resource;
resource = resource.promise();
@@ -4461,31 +4871,51 @@ module.exports = function (Promise, apiRejection, tryConvertToPromise,
resources[i] = resource;
}
- var promise = Promise.settle(resources)
- .then(inspectionMapper)
- .then(function(vals) {
- promise._pushContext();
- var ret;
- try {
- ret = fn.apply(undefined, vals);
- } finally {
- promise._popContext();
+ 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;
- })
- ._then(
- disposerSuccess, disposerFail, undefined, resources, undefined);
+ });
+
+ 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 | 262144;
+ this._bitField = this._bitField | 131072;
this._disposer = disposer;
};
Promise.prototype._isDisposable = function () {
- return (this._bitField & 262144) > 0;
+ return (this._bitField & 131072) > 0;
};
Promise.prototype._getDisposer = function () {
@@ -4493,7 +4923,7 @@ module.exports = function (Promise, apiRejection, tryConvertToPromise,
};
Promise.prototype._unsetDisposable = function () {
- this._bitField = this._bitField & (~262144);
+ this._bitField = this._bitField & (~131072);
this._disposer = undefined;
};
@@ -4506,31 +4936,18 @@ module.exports = function (Promise, apiRejection, tryConvertToPromise,
};
-},{"./errors.js":13,"./util.js":38}],38:[function(_dereq_,module,exports){
+},{"./errors":12,"./util":36}],36:[function(_dereq_,module,exports){
"use strict";
-var es5 = _dereq_("./es5.js");
+var es5 = _dereq_("./es5");
var canEvaluate = typeof navigator == "undefined";
-var haveGetters = (function(){
- try {
- var o = {};
- es5.defineProperty(o, "f", {
- get: function () {
- return 3;
- }
- });
- return o.f === 3;
- }
- catch (e) {
- return false;
- }
-
-})();
var errorObj = {e: {}};
var tryCatchTarget;
function tryCatcher() {
try {
- return tryCatchTarget.apply(this, arguments);
+ var target = tryCatchTarget;
+ tryCatchTarget = null;
+ return target.apply(this, arguments);
} catch (e) {
errorObj.e = e;
return errorObj;
@@ -4568,7 +4985,8 @@ function isPrimitive(val) {
}
function isObject(value) {
- return !isPrimitive(value);
+ return typeof value === "function" ||
+ typeof value === "object" && value !== null;
}
function maybeWrapAsError(maybeError) {
@@ -4591,6 +5009,7 @@ function withAppended(target, appendee) {
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
@@ -4613,23 +5032,32 @@ function notEnumerableProp(obj, name, value) {
return obj;
}
-
-var wrapsPrimitiveReceiver = (function() {
- return this !== "string";
-}).call("string");
-
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 oProto = Object.prototype;
var getKeys = Object.getOwnPropertyNames;
return function(obj) {
var ret = [];
var visitedKeys = Object.create(null);
- while (obj != null && obj !== oProto) {
+ while (obj != null && !isExcludedProto(obj)) {
var keys;
try {
keys = getKeys(obj);
@@ -4650,11 +5078,23 @@ var inheritedDataKeys = (function() {
return ret;
};
} else {
+ var hasProp = {}.hasOwnProperty;
return function(obj) {
+ if (isExcludedProto(obj)) return [];
var ret = [];
+
/*jshint forin:false */
- for (var key in obj) {
- ret.push(key);
+ 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;
};
@@ -4662,13 +5102,22 @@ var inheritedDataKeys = (function() {
})();
+var thisAssignmentPattern = /this\s*\.\s*\S+\s*=/;
function isClass(fn) {
try {
if (typeof fn === "function") {
var keys = es5.names(fn.prototype);
- if (es5.isES5) return keys.length > 1;
- return keys.length > 0 &&
- !(keys.length === 1 && keys[0] === "constructor");
+
+ 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) {
@@ -4678,10 +5127,10 @@ function isClass(fn) {
function toFastProperties(obj) {
/*jshint -W027,-W055,-W031*/
- function f() {}
- f.prototype = obj;
+ function FakeConstructor() {}
+ FakeConstructor.prototype = obj;
var l = 8;
- while (l--) new f();
+ while (l--) new FakeConstructor();
return obj;
eval(obj);
}
@@ -4748,11 +5197,50 @@ function copyDescriptors(from, to, filter) {
for (var i = 0; i < keys.length; ++i) {
var key = keys[i];
if (filter(key)) {
- es5.defineProperty(to, key, es5.getDescriptor(from, 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]";
+
+function env(key, def) {
+ return isNode ? process.env[key] : def;
+}
+
var ret = {
isClass: isClass,
isIdentifier: isIdentifier,
@@ -4760,7 +5248,7 @@ var ret = {
getDataPropertyOrDefault: getDataPropertyOrDefault,
thrower: thrower,
isArray: es5.isArray,
- haveGetters: haveGetters,
+ asArray: asArray,
notEnumerableProp: notEnumerableProp,
isPrimitive: isPrimitive,
isObject: isObject,
@@ -4770,7 +5258,6 @@ var ret = {
inherits: inherits,
withAppended: withAppended,
maybeWrapAsError: maybeWrapAsError,
- wrapsPrimitiveReceiver: wrapsPrimitiveReceiver,
toFastProperties: toFastProperties,
filledRange: filledRange,
toString: safeToString,
@@ -4782,314 +5269,18 @@ var ret = {
copyDescriptors: copyDescriptors,
hasDevTools: typeof chrome !== "undefined" && chrome &&
typeof chrome.loadTimes === "function",
- isNode: typeof process !== "undefined" &&
- classString(process).toLowerCase() === "[object process]"
+ isNode: isNode,
+ env: env
};
+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;
-},{"./es5.js":14}],39:[function(_dereq_,module,exports){
-// Copyright Joyent, Inc. and other Node contributors.
-//
-// 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.
-
-function EventEmitter() {
- this._events = this._events || {};
- this._maxListeners = this._maxListeners || undefined;
-}
-module.exports = EventEmitter;
-
-// Backwards-compat with node 0.10.x
-EventEmitter.EventEmitter = EventEmitter;
-
-EventEmitter.prototype._events = undefined;
-EventEmitter.prototype._maxListeners = undefined;
-
-// By default EventEmitters will print a warning if more than 10 listeners are
-// added to it. This is a useful default which helps finding memory leaks.
-EventEmitter.defaultMaxListeners = 10;
-
-// Obviously not all Emitters should be limited to 10. This function allows
-// that to be increased. Set to zero for unlimited.
-EventEmitter.prototype.setMaxListeners = function(n) {
- if (!isNumber(n) || n < 0 || isNaN(n))
- throw TypeError('n must be a positive number');
- this._maxListeners = n;
- return this;
-};
-
-EventEmitter.prototype.emit = function(type) {
- var er, handler, len, args, i, listeners;
-
- if (!this._events)
- this._events = {};
-
- // If there is no 'error' event listener then throw.
- if (type === 'error') {
- if (!this._events.error ||
- (isObject(this._events.error) && !this._events.error.length)) {
- er = arguments[1];
- if (er instanceof Error) {
- throw er; // Unhandled 'error' event
- }
- throw TypeError('Uncaught, unspecified "error" event.');
- }
- }
-
- handler = this._events[type];
-
- if (isUndefined(handler))
- return false;
-
- if (isFunction(handler)) {
- switch (arguments.length) {
- // fast cases
- case 1:
- handler.call(this);
- break;
- case 2:
- handler.call(this, arguments[1]);
- break;
- case 3:
- handler.call(this, arguments[1], arguments[2]);
- break;
- // slower
- default:
- len = arguments.length;
- args = new Array(len - 1);
- for (i = 1; i < len; i++)
- args[i - 1] = arguments[i];
- handler.apply(this, args);
- }
- } else if (isObject(handler)) {
- len = arguments.length;
- args = new Array(len - 1);
- for (i = 1; i < len; i++)
- args[i - 1] = arguments[i];
-
- listeners = handler.slice();
- len = listeners.length;
- for (i = 0; i < len; i++)
- listeners[i].apply(this, args);
- }
-
- return true;
-};
-
-EventEmitter.prototype.addListener = function(type, listener) {
- var m;
-
- if (!isFunction(listener))
- throw TypeError('listener must be a function');
-
- if (!this._events)
- this._events = {};
-
- // To avoid recursion in the case that type === "newListener"! Before
- // adding it to the listeners, first emit "newListener".
- if (this._events.newListener)
- this.emit('newListener', type,
- isFunction(listener.listener) ?
- listener.listener : listener);
-
- if (!this._events[type])
- // Optimize the case of one listener. Don't need the extra array object.
- this._events[type] = listener;
- else if (isObject(this._events[type]))
- // If we've already got an array, just append.
- this._events[type].push(listener);
- else
- // Adding the second element, need to change to array.
- this._events[type] = [this._events[type], listener];
-
- // Check for listener leak
- if (isObject(this._events[type]) && !this._events[type].warned) {
- var m;
- if (!isUndefined(this._maxListeners)) {
- m = this._maxListeners;
- } else {
- m = EventEmitter.defaultMaxListeners;
- }
-
- if (m && m > 0 && this._events[type].length > m) {
- this._events[type].warned = true;
- console.error('(node) warning: possible EventEmitter memory ' +
- 'leak detected. %d listeners added. ' +
- 'Use emitter.setMaxListeners() to increase limit.',
- this._events[type].length);
- if (typeof console.trace === 'function') {
- // not supported in IE 10
- console.trace();
- }
- }
- }
-
- return this;
-};
-
-EventEmitter.prototype.on = EventEmitter.prototype.addListener;
-
-EventEmitter.prototype.once = function(type, listener) {
- if (!isFunction(listener))
- throw TypeError('listener must be a function');
-
- var fired = false;
-
- function g() {
- this.removeListener(type, g);
-
- if (!fired) {
- fired = true;
- listener.apply(this, arguments);
- }
- }
-
- g.listener = listener;
- this.on(type, g);
-
- return this;
-};
-
-// emits a 'removeListener' event iff the listener was removed
-EventEmitter.prototype.removeListener = function(type, listener) {
- var list, position, length, i;
-
- if (!isFunction(listener))
- throw TypeError('listener must be a function');
-
- if (!this._events || !this._events[type])
- return this;
-
- list = this._events[type];
- length = list.length;
- position = -1;
-
- if (list === listener ||
- (isFunction(list.listener) && list.listener === listener)) {
- delete this._events[type];
- if (this._events.removeListener)
- this.emit('removeListener', type, listener);
-
- } else if (isObject(list)) {
- for (i = length; i-- > 0;) {
- if (list[i] === listener ||
- (list[i].listener && list[i].listener === listener)) {
- position = i;
- break;
- }
- }
-
- if (position < 0)
- return this;
-
- if (list.length === 1) {
- list.length = 0;
- delete this._events[type];
- } else {
- list.splice(position, 1);
- }
-
- if (this._events.removeListener)
- this.emit('removeListener', type, listener);
- }
-
- return this;
-};
-
-EventEmitter.prototype.removeAllListeners = function(type) {
- var key, listeners;
-
- if (!this._events)
- return this;
-
- // not listening for removeListener, no need to emit
- if (!this._events.removeListener) {
- if (arguments.length === 0)
- this._events = {};
- else if (this._events[type])
- delete this._events[type];
- return this;
- }
-
- // emit removeListener for all listeners on all events
- if (arguments.length === 0) {
- for (key in this._events) {
- if (key === 'removeListener') continue;
- this.removeAllListeners(key);
- }
- this.removeAllListeners('removeListener');
- this._events = {};
- return this;
- }
-
- listeners = this._events[type];
-
- if (isFunction(listeners)) {
- this.removeListener(type, listeners);
- } else {
- // LIFO order
- while (listeners.length)
- this.removeListener(type, listeners[listeners.length - 1]);
- }
- delete this._events[type];
-
- return this;
-};
-
-EventEmitter.prototype.listeners = function(type) {
- var ret;
- if (!this._events || !this._events[type])
- ret = [];
- else if (isFunction(this._events[type]))
- ret = [this._events[type]];
- else
- ret = this._events[type].slice();
- return ret;
-};
-
-EventEmitter.listenerCount = function(emitter, type) {
- var ret;
- if (!emitter._events || !emitter._events[type])
- ret = 0;
- else if (isFunction(emitter._events[type]))
- ret = 1;
- else
- ret = emitter._events[type].length;
- return ret;
-};
-
-function isFunction(arg) {
- return typeof arg === 'function';
-}
-
-function isNumber(arg) {
- return typeof arg === 'number';
-}
-
-function isObject(arg) {
- return typeof arg === 'object' && arg !== null;
-}
-
-function isUndefined(arg) {
- return arg === void 0;
-}
-
-},{}]},{},[4])(4)
+},{"./es5":13}]},{},[4])(4)
}); ;if (typeof window !== 'undefined' && window !== null) { window.P = window.Promise; } else if (typeof self !== 'undefined' && self !== null) { self.P = self.Promise; }
\ No newline at end of file
diff --git a/node_modules/bluebird/js/browser/bluebird.min.js b/node_modules/bluebird/js/browser/bluebird.min.js
index bee550c..7f99a65 100644
--- a/node_modules/bluebird/js/browser/bluebird.min.js
+++ b/node_modules/bluebird/js/browser/bluebird.min.js
@@ -1,14 +1,14 @@
/* @preserve
* The MIT License (MIT)
*
- * Copyright (c) 2014 Petka Antonov
+ * Copyright (c) 2013-2015 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:
+ * 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.
@@ -23,9 +23,9 @@
*
*/
/**
- * bluebird build version 2.9.24
- * Features enabled: core, race, call_get, generators, map, nodeify, promisify, props, reduce, settle, some, cancel, using, filter, any, each, timers
+ * bluebird build version 3.0.6
+ * 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,r;return function n(t,e,r){function i(s,a){if(!e[s]){if(!t[s]){var u="function"==typeof _dereq_&&_dereq_;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var c=new Error("Cannot find module '"+s+"'");throw c.code="MODULE_NOT_FOUND",c}var l=e[s]={exports:{}};t[s][0].call(l.exports,function(e){var r=t[s][1][e];return i(r?r:e)},l,l.exports,n,t,e,r)}return e[s].exports}for(var o="function"==typeof _dereq_&&_dereq_,s=0;s0},r.prototype.throwLater=function(t,e){1===arguments.length&&(e=t,t=function(){throw e});var r=this._getDomain();if(void 0!==r&&(t=r.bind(t)),"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/m3OTXk\n")}},r.prototype._getDomain=function(){},l.isNode){var h=t("events"),p=function(){var t=process.domain;return null===t?void 0:t};if(h.usingDomains)r.prototype._getDomain=p;else{var f=Object.getOwnPropertyDescriptor(h,"usingDomains");if(f.configurable){var _=!1;Object.defineProperty(h,"usingDomains",{configurable:!1,enumerable:!0,get:function(){return _},set:function(t){!_&&t&&(_=!0,r.prototype._getDomain=p,l.toFastProperties(process),process.emit("domainsActivated"))}})}else process.on("domainsActivated",function(){r.prototype._getDomain=p})}}l.hasDevTools?(r.prototype.invokeLater=function(t,e,r){this._trampolineEnabled?n.call(this,t,e,r):setTimeout(function(){t.call(e,r)},100)},r.prototype.invoke=function(t,e,r){this._trampolineEnabled?i.call(this,t,e,r):setTimeout(function(){t.call(e,r)},0)},r.prototype.settlePromises=function(t){this._trampolineEnabled?o.call(this,t):setTimeout(function(){t._settlePromises()},0)}):(r.prototype.invokeLater=n,r.prototype.invoke=i,r.prototype.settlePromises=o),r.prototype.invokeFirst=function(t,e,r){var n=this._getDomain();void 0!==n&&(t=n.bind(t)),this._normalQueue.unshift(t,e,r),this._queueTick()},r.prototype._drainQueue=function(t){for(;t.length()>0;){var e=t.shift();if("function"==typeof e){var r=t.shift(),n=t.shift();e.call(r,n)}else e._settlePromises()}},r.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),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=new r,e.exports.firstLineError=s},{"./queue.js":28,"./schedule.js":31,"./util.js":38,events:39}],3:[function(t,e){"use strict";e.exports=function(t,e,r){var n=function(t,e){this._reject(e)},i=function(t,e){e.promiseRejectionQueued=!0,e.bindingPromise._then(n,n,null,this,t)},o=function(t,e){this._setBoundTo(t),this._isPending()&&this._resolveCallback(e.target)},s=function(t,e){e.promiseRejectionQueued||this._reject(t)};t.prototype.bind=function(n){var a=r(n),u=new t(e);u._propagateFrom(this,1);var c=this._target();if(a instanceof t){var l={promiseRejectionQueued:!1,promise:u,target:c,bindingPromise:a};c._then(e,i,u._progress,u,l),a._then(o,s,u._progress,u,l)}else u._setBoundTo(n),u._resolveCallback(c);return u},t.prototype._setBoundTo=function(t){void 0!==t?(this._bitField=131072|this._bitField,this._boundTo=t):this._bitField=-131073&this._bitField},t.prototype._isBound=function(){return 131072===(131072&this._bitField)},t.bind=function(n,i){var o=r(n),s=new t(e);return o instanceof t?o._then(function(t){s._setBoundTo(t),s._resolveCallback(i)},s._reject,s._progress,s,null):(s._setBoundTo(n),s._resolveCallback(i)),s}}},{}],4:[function(t,e){"use strict";function r(){try{Promise===i&&(Promise=n)}catch(t){}return i}var n;"undefined"!=typeof Promise&&(n=Promise);var i=t("./promise.js")();i.noConflict=r,e.exports=i},{"./promise.js":23}],5:[function(t,e){"use strict";var r=Object.create;if(r){var n=r(null),i=r(null);n[" size"]=i[" size"]=0}e.exports=function(e){function r(t,r){var n;if(null!=t&&(n=t[r]),"function"!=typeof n){var i="Object "+a.classString(t)+" has no method '"+a.toString(r)+"'";throw new e.TypeError(i)}return n}function n(t){var e=this.pop(),n=r(t,e);return n.apply(t,this)}function i(t){return t[this]}function o(t){var e=+this;return 0>e&&(e=Math.max(0,e+t.length)),t[e]}{var s,a=t("./util.js"),u=a.canEvaluate;a.isIdentifier}e.prototype.call=function(t){for(var e=arguments.length,r=new Array(e-1),i=1;e>i;++i)r[i-1]=arguments[i];return r.push(t),this._then(n,void 0,void 0,r,void 0)},e.prototype.get=function(t){var e,r="number"==typeof t;if(r)e=o;else if(u){var n=s(t);e=null!==n?n:i}else e=i;return this._then(e,void 0,void 0,t,void 0)}}},{"./util.js":38}],6:[function(t,e){"use strict";e.exports=function(e){var r=t("./errors.js"),n=t("./async.js"),i=r.CancellationError;e.prototype._cancel=function(t){if(!this.isCancellable())return this;for(var e,r=this;void 0!==(e=r._cancellationParent)&&e.isCancellable();)r=e;this._unsetCancellable(),r._target()._rejectCallback(t,!1,!0)},e.prototype.cancel=function(t){return this.isCancellable()?(void 0===t&&(t=new i),n.invokeLater(this._cancel,this,t),this):this},e.prototype.cancellable=function(){return this._cancellable()?this:(n.enableTrampoline(),this._setCancellable(),this._cancellationParent=void 0,this)},e.prototype.uncancellable=function(){var t=this.then();return t._unsetCancellable(),t},e.prototype.fork=function(t,e,r){var n=this._then(t,e,r,void 0,void 0);return n._setCancellable(),n._cancellationParent=void 0,n}}},{"./async.js":2,"./errors.js":13}],7:[function(t,e){"use strict";e.exports=function(){function e(t){this._parent=t;var r=this._length=1+(void 0===t?0:t._length);j(this,e),r>32&&this.uncycle()}function r(t,e){for(var r=0;r=0;--a)if(n[a]===o){s=a;break}for(var a=s;a>=0;--a){var u=n[a];if(e[i]!==u)break;e.pop(),i--}e=n}}function o(t){for(var e=[],r=0;r0&&(e=e.slice(r)),e}function a(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t.toString();var r=/\[object [a-zA-Z0-9$_]+\]/;if(r.test(e))try{var n=JSON.stringify(t);e=n}catch(i){}0===e.length&&(e="(empty array)")}return"(<"+u(e)+">, no stack trace)"}function u(t){var e=41;return t.lengtht)){for(var e=[],r={},n=0,i=this;void 0!==i;++n)e.push(i),i=i._parent;t=this._length=n;for(var n=t-1;n>=0;--n){var o=e[n].stack;void 0===r[o]&&(r[o]=n)}for(var n=0;t>n;++n){var s=e[n].stack,a=r[s];if(void 0!==a&&a!==n){a>0&&(e[a-1]._parent=void 0,e[a-1]._length=1),e[n]._parent=void 0,e[n]._length=1;var u=n>0?e[n-1]:this;t-1>a?(u._parent=e[a+1],u._parent.uncycle(),u._length=u._parent._length+1):(u._parent=void 0,u._length=1);for(var c=u._length+1,l=n-2;l>=0;--l)e[l]._length=c,c++;return}}}},e.prototype.parent=function(){return this._parent},e.prototype.hasParent=function(){return void 0!==this._parent},e.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var s=e.parseStackAndMessage(t),a=s.message,u=[s.stack],c=this;void 0!==c;)u.push(o(c.stack.split("\n"))),c=c._parent;i(u),n(u),p.notEnumerableProp(t,"stack",r(a,u)),p.notEnumerableProp(t,"__stackCleaned__",!0)}},e.parseStackAndMessage=function(t){var e=t.stack,r=t.toString();return e="string"==typeof e&&e.length>0?s(t):[" (No stack trace)"],{message:r,stack:o(e)}},e.formatAndLogError=function(t,e){if("undefined"!=typeof console){var r;if("object"==typeof t||"function"==typeof t){var n=t.stack;r=e+d(n,t)}else r=e+String(t);"function"==typeof l?l(r):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}},e.unhandledRejection=function(t){e.formatAndLogError(t,"^--- With additional stack trace: ")},e.isSupported=function(){return"function"==typeof j},e.fireRejectionEvent=function(t,r,n,i){var o=!1;try{"function"==typeof r&&(o=!0,"rejectionHandled"===t?r(i):r(n,i))}catch(s){h.throwLater(s)}var a=!1;try{a=b(t,n,i)}catch(s){a=!0,h.throwLater(s)}var u=!1;if(m)try{u=m(t.toLowerCase(),{reason:n,promise:i})}catch(s){u=!0,h.throwLater(s)}a||o||u||"unhandledRejection"!==t||e.formatAndLogError(n,"Unhandled rejection ")};var y=function(){return!1},g=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;e.setBounds=function(t,r){if(e.isSupported()){for(var n,i,o=t.stack.split("\n"),s=r.stack.split("\n"),a=-1,u=-1,l=0;la||0>u||!n||!i||n!==i||a>=u||(y=function(t){if(f.test(t))return!0;var e=c(t);return e&&e.fileName===n&&a<=e.line&&e.line<=u?!0:!1})}};var m,j=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():a(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit=Error.stackTraceLimit+6,_=t,d=e;var r=Error.captureStackTrace;return y=function(t){return f.test(t)},function(t,e){Error.stackTraceLimit=Error.stackTraceLimit+6,r(t,e),Error.stackTraceLimit=Error.stackTraceLimit-6}}var n=new Error;if("string"==typeof n.stack&&n.stack.split("\n")[0].indexOf("stackDetection@")>=0)return _=/@/,d=e,v=!0,function(t){t.stack=(new Error).stack};var i;try{throw new Error}catch(o){i="stack"in o}return"stack"in n||!i?(d=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?a(e):e.toString()},null):(_=t,d=e,function(t){Error.stackTraceLimit=Error.stackTraceLimit+6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit=Error.stackTraceLimit-6})}([]),b=function(){if(p.isNode)return function(t,e,r){return"rejectionHandled"===t?process.emit(t,r):process.emit(t,e,r)};var t=!1,e=!0;try{var r=new self.CustomEvent("test");t=r instanceof CustomEvent}catch(n){}if(!t)try{var i=document.createEvent("CustomEvent");i.initCustomEvent("testingtheevent",!1,!0,{}),self.dispatchEvent(i)}catch(n){e=!1}e&&(m=function(e,r){var n;return t?n=new self.CustomEvent(e,{detail:r,bubbles:!1,cancelable:!0}):self.dispatchEvent&&(n=document.createEvent("CustomEvent"),n.initCustomEvent(e,!1,!0,r)),n?!self.dispatchEvent(n):!1});var o={};return o.unhandledRejection="onunhandledRejection".toLowerCase(),o.rejectionHandled="onrejectionHandled".toLowerCase(),function(t,e,r){var n=o[t],i=self[n];return i?("rejectionHandled"===t?i.call(self,r):i.call(self,e,r),!0):!1}}();return"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(l=function(t){console.warn(t)},p.isNode&&process.stderr.isTTY?l=function(t){process.stderr.write("[31m"+t+"[39m\n")}:p.isNode||"string"!=typeof(new Error).stack||(l=function(t){console.warn("%c"+t,"color: red")})),e}},{"./async.js":2,"./util.js":38}],8:[function(t,e){"use strict";e.exports=function(e){function r(t,e,r){this._instances=t,this._callback=e,this._promise=r}function n(t,e){var r={},n=s(t).call(r,e);if(n===a)return n;var i=u(r);return i.length?(a.e=new c("Catch filter must inherit from Error or be a simple predicate function\n\n See http://goo.gl/o84o68\n"),a):n}var i=t("./util.js"),o=t("./errors.js"),s=i.tryCatch,a=i.errorObj,u=t("./es5.js").keys,c=o.TypeError;return r.prototype.doFilter=function(t){for(var r=this._callback,i=this._promise,o=i._boundTo,u=0,c=this._instances.length;c>u;++u){var l=this._instances[u],h=l===Error||null!=l&&l.prototype instanceof Error;if(h&&t instanceof l){var p=s(r).call(o,t);return p===a?(e.e=p.e,e):p}if("function"==typeof l&&!h){var f=n(l,t);if(f===a){t=a.e;break}if(f){var p=s(r).call(o,t);return p===a?(e.e=p.e,e):p}}}return e.e=t,e},r}},{"./errors.js":13,"./es5.js":14,"./util.js":38}],9:[function(t,e){"use strict";e.exports=function(t,e,r){function n(){this._trace=new e(o())}function i(){return r()?new n:void 0}function o(){var t=s.length-1;return t>=0?s[t]:void 0}var s=[];return n.prototype._pushContext=function(){r()&&void 0!==this._trace&&s.push(this._trace)},n.prototype._popContext=function(){r()&&void 0!==this._trace&&s.pop()},t.prototype._peekContext=o,t.prototype._pushContext=n.prototype._pushContext,t.prototype._popContext=n.prototype._popContext,i}},{}],10:[function(t,e){"use strict";e.exports=function(e,r){var n,i,o=t("./async.js"),s=t("./errors.js").Warning,a=t("./util.js"),u=a.canAttachTrace,c=!1||a.isNode&&(!!process.env.BLUEBIRD_DEBUG||"development"===process.env.NODE_ENV);return c&&o.disableTrampolineIfNecessary(),e.prototype._ensurePossibleRejectionHandled=function(){this._setRejectionIsUnhandled(),o.invokeLater(this._notifyUnhandledRejection,this,void 0)},e.prototype._notifyUnhandledRejectionIsHandled=function(){r.fireRejectionEvent("rejectionHandled",n,void 0,this)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._getCarriedStackTrace()||this._settledValue;this._setUnhandledRejectionIsNotified(),r.fireRejectionEvent("unhandledRejection",i,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=524288|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-524289&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(524288&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=2097152|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-2097153&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(2097152&this._bitField)>0},e.prototype._setCarriedStackTrace=function(t){this._bitField=1048576|this._bitField,this._fulfillmentHandler0=t},e.prototype._isCarryingStackTrace=function(){return(1048576&this._bitField)>0},e.prototype._getCarriedStackTrace=function(){return this._isCarryingStackTrace()?this._fulfillmentHandler0:void 0},e.prototype._captureStackTrace=function(){return c&&(this._trace=new r(this._peekContext())),this},e.prototype._attachExtraTrace=function(t,e){if(c&&u(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var i=r.parseStackAndMessage(t);a.notEnumerableProp(t,"stack",i.message+"\n"+i.stack.join("\n")),a.notEnumerableProp(t,"__stackCleaned__",!0)}}},e.prototype._warn=function(t){var e=new s(t),n=this._peekContext();if(n)n.attachExtraTrace(e);else{var i=r.parseStackAndMessage(e);e.stack=i.message+"\n"+i.stack.join("\n")}r.formatAndLogError(e,"")},e.onPossiblyUnhandledRejection=function(t){i="function"==typeof t?t:void 0},e.onUnhandledRejectionHandled=function(t){n="function"==typeof t?t:void 0},e.longStackTraces=function(){if(o.haveItemsQueued()&&c===!1)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/DT1qyG\n");c=r.isSupported(),c&&o.disableTrampolineIfNecessary()},e.hasLongStackTraces=function(){return c&&r.isSupported()},r.isSupported()||(e.longStackTraces=function(){},c=!1),function(){return c}}},{"./async.js":2,"./errors.js":13,"./util.js":38}],11:[function(t,e){"use strict";var r=t("./util.js"),n=r.isPrimitive,i=r.wrapsPrimitiveReceiver;e.exports=function(t){var e=function(){return this},r=function(){throw this},o=function(t,e){return 1===e?function(){throw t}:2===e?function(){return t}:void 0};t.prototype["return"]=t.prototype.thenReturn=function(t){return i&&n(t)?this._then(o(t,2),void 0,void 0,void 0,void 0):this._then(e,void 0,void 0,t,void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return i&&n(t)?this._then(o(t,1),void 0,void 0,void 0,void 0):this._then(r,void 0,void 0,t,void 0)}}},{"./util.js":38}],12:[function(t,e){"use strict";e.exports=function(t,e){var r=t.reduce;t.prototype.each=function(t){return r(this,t,null,e)},t.each=function(t,n){return r(t,n,null,e)}}},{}],13:[function(t,e){"use strict";function r(t,e){function r(n){return this instanceof r?(l(this,"message","string"==typeof n?n:e),l(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new r(n)}return c(r,Error),r}function n(t){return this instanceof n?(l(this,"name","OperationalError"),l(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(l(this,"message",t.message),l(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new n(t)}var i,o,s=t("./es5.js"),a=s.freeze,u=t("./util.js"),c=u.inherits,l=u.notEnumerableProp,h=r("Warning","warning"),p=r("CancellationError","cancellation error"),f=r("TimeoutError","timeout error"),_=r("AggregateError","aggregate error");try{i=TypeError,o=RangeError}catch(d){i=r("TypeError","type error"),o=r("RangeError","range error")}for(var v="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),y=0;y0&&"function"==typeof arguments[e]){t=arguments[e];var n}for(var i=arguments.length,o=new Array(i),s=0;i>s;++s)o[s]=arguments[s];t&&o.pop();var n=new r(o).promise();return void 0!==t?n.spread(t):n}}},{"./util.js":38}],19:[function(t,e){"use strict";e.exports=function(e,r,n,i,o){function s(t,e,r,n){this.constructor$(t),this._promise._captureStackTrace(),this._callback=e,this._preservedValues=n===o?new Array(this.length()):null,this._limit=r,this._inFlight=0,this._queue=r>=1?[]:_,c.invoke(a,this,void 0)}function a(){this._init$(void 0,-2)}function u(t,e,r,n){var i="object"==typeof r&&null!==r?r.concurrency:0;return i="number"==typeof i&&isFinite(i)&&i>=1?i:0,new s(t,e,i,n)}var c=t("./async.js"),l=t("./util.js"),h=l.tryCatch,p=l.errorObj,f={},_=[];l.inherits(s,r),s.prototype._init=function(){},s.prototype._promiseFulfilled=function(t,r){var n=this._values,o=this.length(),s=this._preservedValues,a=this._limit;if(n[r]===f){if(n[r]=t,a>=1&&(this._inFlight--,this._drainQueue(),this._isResolved()))return}else{if(a>=1&&this._inFlight>=a)return n[r]=t,void this._queue.push(r);null!==s&&(s[r]=t);var u=this._callback,c=this._promise._boundTo;this._promise._pushContext();var l=h(u).call(c,t,r,o);if(this._promise._popContext(),l===p)return this._reject(l.e);var _=i(l,this._promise);if(_ instanceof e){if(_=_._target(),_._isPending())return a>=1&&this._inFlight++,n[r]=f,_._proxyPromiseArray(this,r);if(!_._isFulfilled())return this._reject(_._reason());l=_._value()}n[r]=l}var d=++this._totalResolved;d>=o&&(null!==s?this._filter(n,s):this._resolve(n))},s.prototype._drainQueue=function(){for(var t=this._queue,e=this._limit,r=this._values;t.length>0&&this._inFlighto;++o)t[o]&&(n[i++]=e[o]);n.length=i,this._resolve(n)},s.prototype.preservedValues=function(){return this._preservedValues},e.prototype.map=function(t,e){return"function"!=typeof t?n("fn must be a function\n\n See http://goo.gl/916lJJ\n"):u(this,t,e,null).promise()},e.map=function(t,e,r,i){return"function"!=typeof e?n("fn must be a function\n\n See http://goo.gl/916lJJ\n"):u(t,e,r,i).promise()}}},{"./async.js":2,"./util.js":38}],20:[function(t,e){"use strict";e.exports=function(e,r,n,i){var o=t("./util.js"),s=o.tryCatch;e.method=function(t){if("function"!=typeof t)throw new e.TypeError("fn must be a function\n\n See http://goo.gl/916lJJ\n");return function(){var n=new e(r);n._captureStackTrace(),n._pushContext();var i=s(t).apply(this,arguments);return n._popContext(),n._resolveFromSyncValue(i),n}},e.attempt=e["try"]=function(t,n,a){if("function"!=typeof t)return i("fn must be a function\n\n See http://goo.gl/916lJJ\n");var u=new e(r);u._captureStackTrace(),u._pushContext();var c=o.isArray(n)?s(t).apply(a,n):s(t).call(a,n);return u._popContext(),u._resolveFromSyncValue(c),u},e.prototype._resolveFromSyncValue=function(t){t===o.errorObj?this._rejectCallback(t.e,!1,!0):this._resolveCallback(t,!0)}}},{"./util.js":38}],21:[function(t,e){"use strict";e.exports=function(e){function r(t,e){var r=this;if(!o.isArray(t))return n.call(r,t,e);var i=a(e).apply(r._boundTo,[null].concat(t));i===u&&s.throwLater(i.e)}function n(t,e){var r=this,n=r._boundTo,i=void 0===t?a(e).call(n,null):a(e).call(n,null,t);i===u&&s.throwLater(i.e)}function i(t,e){var r=this;if(!t){var n=r._target(),i=n._getCarriedStackTrace();i.cause=t,t=i}var o=a(e).call(r._boundTo,t);o===u&&s.throwLater(o.e)}var o=t("./util.js"),s=t("./async.js"),a=o.tryCatch,u=o.errorObj;e.prototype.asCallback=e.prototype.nodeify=function(t,e){if("function"==typeof t){var o=n;void 0!==e&&Object(e).spread&&(o=r),this._then(o,i,void 0,this,t)}return this}}},{"./async.js":2,"./util.js":38}],22:[function(t,e){"use strict";e.exports=function(e,r){var n=t("./util.js"),i=t("./async.js"),o=n.tryCatch,s=n.errorObj;e.prototype.progressed=function(t){return this._then(void 0,void 0,t,void 0,void 0)},e.prototype._progress=function(t){this._isFollowingOrFulfilledOrRejected()||this._target()._progressUnchecked(t)},e.prototype._progressHandlerAt=function(t){return 0===t?this._progressHandler0:this[(t<<2)+t-5+2]},e.prototype._doProgressWith=function(t){var r=t.value,i=t.handler,a=t.promise,u=t.receiver,c=o(i).call(u,r);if(c===s){if(null!=c.e&&"StopProgressPropagation"!==c.e.name){var l=n.canAttachTrace(c.e)?c.e:new Error(n.toString(c.e));a._attachExtraTrace(l),a._progress(c.e)}}else c instanceof e?c._then(a._progress,null,null,a,void 0):a._progress(c)},e.prototype._progressUnchecked=function(t){for(var n=this._length(),o=this._progress,s=0;n>s;s++){var a=this._progressHandlerAt(s),u=this._promiseAt(s);if(u instanceof e)"function"==typeof a?i.invoke(this._doProgressWith,this,{handler:a,promise:u,receiver:this._receiverAt(s),value:t}):i.invoke(o,u,t);else{var c=this._receiverAt(s);"function"==typeof a?a.call(c,t,u):c instanceof r&&!c._isResolved()&&c._promiseProgressed(t,u)}}}}},{"./async.js":2,"./util.js":38}],23:[function(t,e){"use strict";e.exports=function(){function e(t){if("function"!=typeof t)throw new c("the promise constructor requires a resolver function\n\n See http://goo.gl/EC22Yn\n");if(this.constructor!==e)throw new c("the promise constructor cannot be invoked directly\n\n See http://goo.gl/KsIlge\n");this._bitField=0,this._fulfillmentHandler0=void 0,this._rejectionHandler0=void 0,this._progressHandler0=void 0,this._promise0=void 0,this._receiver0=void 0,this._settledValue=void 0,t!==l&&this._resolveFromResolver(t)}function r(t){var r=new e(l);r._fulfillmentHandler0=t,r._rejectionHandler0=t,r._progressHandler0=t,r._promise0=t,r._receiver0=t,r._settledValue=t}var n=function(){return new c("circular promise resolution chain\n\n See http://goo.gl/LhFpo0\n")},i=function(){return new e.PromiseInspection(this._target())},o=function(t){return e.reject(new c(t))},s=t("./util.js"),a=t("./async.js"),u=t("./errors.js"),c=e.TypeError=u.TypeError;e.RangeError=u.RangeError,e.CancellationError=u.CancellationError,e.TimeoutError=u.TimeoutError,e.OperationalError=u.OperationalError,e.RejectionError=u.OperationalError,e.AggregateError=u.AggregateError;var l=function(){},h={},p={e:null},f=t("./thenables.js")(e,l),_=t("./promise_array.js")(e,l,f,o),d=t("./captured_trace.js")(),v=t("./debuggability.js")(e,d),y=t("./context.js")(e,d,v),g=t("./catch_filter.js")(p),m=t("./promise_resolver.js"),j=m._nodebackForPromise,b=s.errorObj,w=s.tryCatch;return e.prototype.toString=function(){return"[object Promise]"},e.prototype.caught=e.prototype["catch"]=function(t){var r=arguments.length;if(r>1){var n,i=new Array(r-1),o=0;for(n=0;r-1>n;++n){var s=arguments[n];if("function"!=typeof s)return e.reject(new c("Catch filter must inherit from Error or be a simple predicate function\n\n See http://goo.gl/o84o68\n"));i[o++]=s}i.length=o,t=arguments[n];var a=new g(i,t,this);return this._then(void 0,a.doFilter,void 0,a,void 0)}return this._then(void 0,t,void 0,void 0,void 0)},e.prototype.reflect=function(){return this._then(i,i,void 0,this,void 0)},e.prototype.then=function(t,e,r){if(v()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+s.classString(t);
-arguments.length>1&&(n+=", "+s.classString(e)),this._warn(n)}return this._then(t,e,r,void 0,void 0)},e.prototype.done=function(t,e,r){var n=this._then(t,e,r,void 0,void 0);n._setIsFinal()},e.prototype.spread=function(t,e){return this.all()._then(t,e,void 0,h,void 0)},e.prototype.isCancellable=function(){return!this.isResolved()&&this._cancellable()},e.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},e.prototype.all=function(){return new _(this).promise()},e.prototype.error=function(t){return this.caught(s.originatesFromRejection,t)},e.is=function(t){return t instanceof e},e.fromNode=function(t){var r=new e(l),n=w(t)(j(r));return n===b&&r._rejectCallback(n.e,!0,!0),r},e.all=function(t){return new _(t).promise()},e.defer=e.pending=function(){var t=new e(l);return new m(t)},e.cast=function(t){var r=f(t);if(!(r instanceof e)){var n=r;r=new e(l),r._fulfillUnchecked(n)}return r},e.resolve=e.fulfilled=e.cast,e.reject=e.rejected=function(t){var r=new e(l);return r._captureStackTrace(),r._rejectCallback(t,!0),r},e.setScheduler=function(t){if("function"!=typeof t)throw new c("fn must be a function\n\n See http://goo.gl/916lJJ\n");var e=a._schedule;return a._schedule=t,e},e.prototype._then=function(t,r,n,i,o){var s=void 0!==o,u=s?o:new e(l);s||(u._propagateFrom(this,5),u._captureStackTrace());var c=this._target();c!==this&&(void 0===i&&(i=this._boundTo),s||u._setIsMigrated());var h=c._addCallbacks(t,r,n,u,i);return c._isResolved()&&!c._isSettlePromisesQueued()&&a.invoke(c._settlePromiseAtPostResolution,c,h),u},e.prototype._settlePromiseAtPostResolution=function(t){this._isRejectionUnhandled()&&this._unsetRejectionIsUnhandled(),this._settlePromiseAt(t)},e.prototype._length=function(){return 131071&this._bitField},e.prototype._isFollowingOrFulfilledOrRejected=function(){return(939524096&this._bitField)>0},e.prototype._isFollowing=function(){return 536870912===(536870912&this._bitField)},e.prototype._setLength=function(t){this._bitField=-131072&this._bitField|131071&t},e.prototype._setFulfilled=function(){this._bitField=268435456|this._bitField},e.prototype._setRejected=function(){this._bitField=134217728|this._bitField},e.prototype._setFollowing=function(){this._bitField=536870912|this._bitField},e.prototype._setIsFinal=function(){this._bitField=33554432|this._bitField},e.prototype._isFinal=function(){return(33554432&this._bitField)>0},e.prototype._cancellable=function(){return(67108864&this._bitField)>0},e.prototype._setCancellable=function(){this._bitField=67108864|this._bitField},e.prototype._unsetCancellable=function(){this._bitField=-67108865&this._bitField},e.prototype._setIsMigrated=function(){this._bitField=4194304|this._bitField},e.prototype._unsetIsMigrated=function(){this._bitField=-4194305&this._bitField},e.prototype._isMigrated=function(){return(4194304&this._bitField)>0},e.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[5*t-5+4];return void 0===e&&this._isBound()?this._boundTo:e},e.prototype._promiseAt=function(t){return 0===t?this._promise0:this[5*t-5+3]},e.prototype._fulfillmentHandlerAt=function(t){return 0===t?this._fulfillmentHandler0:this[5*t-5+0]},e.prototype._rejectionHandlerAt=function(t){return 0===t?this._rejectionHandler0:this[5*t-5+1]},e.prototype._migrateCallbacks=function(t,r){var n=t._fulfillmentHandlerAt(r),i=t._rejectionHandlerAt(r),o=t._progressHandlerAt(r),s=t._promiseAt(r),a=t._receiverAt(r);s instanceof e&&s._setIsMigrated(),this._addCallbacks(n,i,o,s,a)},e.prototype._addCallbacks=function(t,e,r,n,i){var o=this._length();if(o>=131066&&(o=0,this._setLength(0)),0===o)this._promise0=n,void 0!==i&&(this._receiver0=i),"function"!=typeof t||this._isCarryingStackTrace()||(this._fulfillmentHandler0=t),"function"==typeof e&&(this._rejectionHandler0=e),"function"==typeof r&&(this._progressHandler0=r);else{var s=5*o-5;this[s+3]=n,this[s+4]=i,"function"==typeof t&&(this[s+0]=t),"function"==typeof e&&(this[s+1]=e),"function"==typeof r&&(this[s+2]=r)}return this._setLength(o+1),o},e.prototype._setProxyHandlers=function(t,e){var r=this._length();if(r>=131066&&(r=0,this._setLength(0)),0===r)this._promise0=e,this._receiver0=t;else{var n=5*r-5;this[n+3]=e,this[n+4]=t}this._setLength(r+1)},e.prototype._proxyPromiseArray=function(t,e){this._setProxyHandlers(t,e)},e.prototype._resolveCallback=function(t,r){if(!this._isFollowingOrFulfilledOrRejected()){if(t===this)return this._rejectCallback(n(),!1,!0);var i=f(t,this);if(!(i instanceof e))return this._fulfill(t);var o=1|(r?4:0);this._propagateFrom(i,o);var s=i._target();if(s._isPending()){for(var a=this._length(),u=0;a>u;++u)s._migrateCallbacks(this,u);this._setFollowing(),this._setLength(0),this._setFollowee(s)}else s._isFulfilled()?this._fulfillUnchecked(s._value()):this._rejectUnchecked(s._reason(),s._getCarriedStackTrace())}},e.prototype._rejectCallback=function(t,e,r){r||s.markAsOriginatingFromRejection(t);var n=s.ensureErrorObject(t),i=n===t;this._attachExtraTrace(n,e?i:!1),this._reject(t,i?void 0:n)},e.prototype._resolveFromResolver=function(t){var e=this;this._captureStackTrace(),this._pushContext();var r=!0,n=w(t)(function(t){null!==e&&(e._resolveCallback(t),e=null)},function(t){null!==e&&(e._rejectCallback(t,r),e=null)});r=!1,this._popContext(),void 0!==n&&n===b&&null!==e&&(e._rejectCallback(n.e,!0,!0),e=null)},e.prototype._settlePromiseFromHandler=function(t,e,r,i){if(!i._isRejected()){i._pushContext();var o;if(o=e!==h||this._isRejected()?w(t).call(e,r):w(t).apply(this._boundTo,r),i._popContext(),o===b||o===i||o===p){var s=o===i?n():o.e;i._rejectCallback(s,!1,!0)}else i._resolveCallback(o)}},e.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},e.prototype._followee=function(){return this._rejectionHandler0},e.prototype._setFollowee=function(t){this._rejectionHandler0=t},e.prototype._cleanValues=function(){this._cancellable()&&(this._cancellationParent=void 0)},e.prototype._propagateFrom=function(t,e){(1&e)>0&&t._cancellable()&&(this._setCancellable(),this._cancellationParent=t),(4&e)>0&&t._isBound()&&this._setBoundTo(t._boundTo)},e.prototype._fulfill=function(t){this._isFollowingOrFulfilledOrRejected()||this._fulfillUnchecked(t)},e.prototype._reject=function(t,e){this._isFollowingOrFulfilledOrRejected()||this._rejectUnchecked(t,e)},e.prototype._settlePromiseAt=function(t){var r=this._promiseAt(t),n=r instanceof e;if(n&&r._isMigrated())return r._unsetIsMigrated(),a.invoke(this._settlePromiseAt,this,t);var i=this._isFulfilled()?this._fulfillmentHandlerAt(t):this._rejectionHandlerAt(t),o=this._isCarryingStackTrace()?this._getCarriedStackTrace():void 0,s=this._settledValue,u=this._receiverAt(t);this._clearCallbackDataAtIndex(t),"function"==typeof i?n?this._settlePromiseFromHandler(i,u,s,r):i.call(u,s,r):u instanceof _?u._isResolved()||(this._isFulfilled()?u._promiseFulfilled(s,r):u._promiseRejected(s,r)):n&&(this._isFulfilled()?r._fulfill(s):r._reject(s,o)),t>=4&&4===(31&t)&&a.invokeLater(this._setLength,this,0)},e.prototype._clearCallbackDataAtIndex=function(t){if(0===t)this._isCarryingStackTrace()||(this._fulfillmentHandler0=void 0),this._rejectionHandler0=this._progressHandler0=this._receiver0=this._promise0=void 0;else{var e=5*t-5;this[e+3]=this[e+4]=this[e+0]=this[e+1]=this[e+2]=void 0}},e.prototype._isSettlePromisesQueued=function(){return-1073741824===(-1073741824&this._bitField)},e.prototype._setSettlePromisesQueued=function(){this._bitField=-1073741824|this._bitField},e.prototype._unsetSettlePromisesQueued=function(){this._bitField=1073741823&this._bitField},e.prototype._queueSettlePromises=function(){a.settlePromises(this),this._setSettlePromisesQueued()},e.prototype._fulfillUnchecked=function(t){if(t===this){var e=n();return this._attachExtraTrace(e),this._rejectUnchecked(e,void 0)}this._setFulfilled(),this._settledValue=t,this._cleanValues(),this._length()>0&&this._queueSettlePromises()},e.prototype._rejectUncheckedCheckError=function(t){var e=s.ensureErrorObject(t);this._rejectUnchecked(t,e===t?void 0:e)},e.prototype._rejectUnchecked=function(t,e){if(t===this){var r=n();return this._attachExtraTrace(r),this._rejectUnchecked(r)}return this._setRejected(),this._settledValue=t,this._cleanValues(),this._isFinal()?void a.throwLater(function(t){throw"stack"in t&&a.invokeFirst(d.unhandledRejection,void 0,t),t},void 0===e?t:e):(void 0!==e&&e!==t&&this._setCarriedStackTrace(e),void(this._length()>0?this._queueSettlePromises():this._ensurePossibleRejectionHandled()))},e.prototype._settlePromises=function(){this._unsetSettlePromisesQueued();for(var t=this._length(),e=0;t>e;e++)this._settlePromiseAt(e)},e._makeSelfResolutionError=n,t("./progress.js")(e,_),t("./method.js")(e,l,f,o),t("./bind.js")(e,l,f),t("./finally.js")(e,p,f),t("./direct_resolve.js")(e),t("./synchronous_inspection.js")(e),t("./join.js")(e,_,f,l),e.Promise=e,t("./map.js")(e,_,o,f,l),t("./cancel.js")(e),t("./using.js")(e,o,f,y),t("./generators.js")(e,o,l,f),t("./nodeify.js")(e),t("./call_get.js")(e),t("./props.js")(e,_,f,o),t("./race.js")(e,l,f,o),t("./reduce.js")(e,_,o,f,l),t("./settle.js")(e,_),t("./some.js")(e,_,o),t("./promisify.js")(e,l),t("./any.js")(e),t("./each.js")(e,l),t("./timers.js")(e,l),t("./filter.js")(e,l),s.toFastProperties(e),s.toFastProperties(e.prototype),r({a:1}),r({b:2}),r({c:3}),r(1),r(function(){}),r(void 0),r(!1),r(new e(l)),d.setBounds(a.firstLineError,s.lastLineError),e}},{"./any.js":1,"./async.js":2,"./bind.js":3,"./call_get.js":5,"./cancel.js":6,"./captured_trace.js":7,"./catch_filter.js":8,"./context.js":9,"./debuggability.js":10,"./direct_resolve.js":11,"./each.js":12,"./errors.js":13,"./filter.js":15,"./finally.js":16,"./generators.js":17,"./join.js":18,"./map.js":19,"./method.js":20,"./nodeify.js":21,"./progress.js":22,"./promise_array.js":24,"./promise_resolver.js":25,"./promisify.js":26,"./props.js":27,"./race.js":29,"./reduce.js":30,"./settle.js":32,"./some.js":33,"./synchronous_inspection.js":34,"./thenables.js":35,"./timers.js":36,"./using.js":37,"./util.js":38}],24:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t){switch(t){case-2:return[];case-3:return{}}}function s(t){var n,i=this._promise=new e(r);t instanceof e&&(n=t,i._propagateFrom(n,5)),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}var a=t("./util.js"),u=a.isArray;return s.prototype.length=function(){return this._length},s.prototype.promise=function(){return this._promise},s.prototype._init=function c(t,r){var s=n(this._values,this._promise);if(s instanceof e){if(s=s._target(),this._values=s,!s._isFulfilled())return s._isPending()?void s._then(c,this._reject,void 0,this,r):void this._reject(s._reason());if(s=s._value(),!u(s)){var a=new e.TypeError("expecting an array, a promise or a thenable\n\n See http://goo.gl/s8MMhc\n");return void this.__hardReject__(a)}}else if(!u(s))return void this._promise._reject(i("expecting an array, a promise or a thenable\n\n See http://goo.gl/s8MMhc\n")._reason());if(0===s.length)return void(-5===r?this._resolveEmptyArray():this._resolve(o(r)));var l=this.getActualLength(s.length);this._length=l,this._values=this.shouldCopyValues()?new Array(l):this._values;for(var h=this._promise,p=0;l>p;++p){var f=this._isResolved(),_=n(s[p],h);_ instanceof e?(_=_._target(),f?_._unsetRejectionIsUnhandled():_._isPending()?_._proxyPromiseArray(this,p):_._isFulfilled()?this._promiseFulfilled(_._value(),p):this._promiseRejected(_._reason(),p)):f||this._promiseFulfilled(_,p)}},s.prototype._isResolved=function(){return null===this._values},s.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},s.prototype.__hardReject__=s.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1,!0)},s.prototype._promiseProgressed=function(t,e){this._promise._progress({index:e,value:t})},s.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var r=++this._totalResolved;r>=this._length&&this._resolve(this._values)},s.prototype._promiseRejected=function(t){this._totalResolved++,this._reject(t)},s.prototype.shouldCopyValues=function(){return!0},s.prototype.getActualLength=function(t){return t},s}},{"./util.js":38}],25:[function(t,e){"use strict";function r(t){return t instanceof Error&&p.getPrototypeOf(t)===Error.prototype}function n(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=p.keys(t),i=0;i2){for(var o=arguments.length,s=new Array(o-1),u=1;o>u;++u)s[u-1]=arguments[u];t._fulfill(s)}else t._fulfill(r);t=null}}}var o,s=t("./util.js"),a=s.maybeWrapAsError,u=t("./errors.js"),c=u.TimeoutError,l=u.OperationalError,h=s.haveGetters,p=t("./es5.js"),f=/^(?:name|message|stack|cause)$/;if(o=h?function(t){this.promise=t}:function(t){this.promise=t,this.asCallback=i(t),this.callback=this.asCallback},h){var _={get:function(){return i(this.promise)}};p.defineProperty(o.prototype,"asCallback",_),p.defineProperty(o.prototype,"callback",_)}o._nodebackForPromise=i,o.prototype.toString=function(){return"[object PromiseResolver]"},o.prototype.resolve=o.prototype.fulfill=function(t){if(!(this instanceof o))throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\n\n See http://goo.gl/sdkXL9\n");this.promise._resolveCallback(t)},o.prototype.reject=function(t){if(!(this instanceof o))throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\n\n See http://goo.gl/sdkXL9\n");this.promise._rejectCallback(t)},o.prototype.progress=function(t){if(!(this instanceof o))throw new TypeError("Illegal invocation, resolver resolve/reject must be called within a resolver context. Consider using the promise constructor instead.\n\n See http://goo.gl/sdkXL9\n");this.promise._progress(t)},o.prototype.cancel=function(t){this.promise.cancel(t)},o.prototype.timeout=function(){this.reject(new c("timeout"))},o.prototype.isResolved=function(){return this.promise.isResolved()},o.prototype.toJSON=function(){return this.promise.toJSON()},e.exports=o},{"./errors.js":13,"./es5.js":14,"./util.js":38}],26:[function(t,e){"use strict";e.exports=function(e,r){function n(t){return!b.test(t)}function i(t){try{return t.__isPromisified__===!0}catch(e){return!1}}function o(t,e,r){var n=f.getDataPropertyOrDefault(t,e+r,j);return n?i(n):!1}function s(t,e,r){for(var n=0;ns;s+=2){var c=o[s],l=o[s+1],h=c+e;t[h]=n===E?E(c,p,c,l,e):n(l,function(){return E(c,p,c,l,e)})}return f.toFastProperties(t),t}function l(t,e){return E(t,e,void 0,t)}var h,p={},f=t("./util.js"),_=t("./promise_resolver.js")._nodebackForPromise,d=f.withAppended,v=f.maybeWrapAsError,y=f.canEvaluate,g=t("./errors").TypeError,m="Async",j={__isPromisified__:!0},b=/^(?:length|name|arguments|caller|callee|prototype|__isPromisified__)$/,w=function(t,e){return f.isIdentifier(t)&&"_"!==t.charAt(0)&&!f.isClass(e)},k=function(t){return t.replace(/([$])/,"\\$")},E=y?h:u;e.promisify=function(t,e){if("function"!=typeof t)throw new g("fn must be a function\n\n See http://goo.gl/916lJJ\n");if(i(t))return t;var r=l(t,arguments.length<2?p:e);return f.copyDescriptors(t,r,n),r},e.promisifyAll=function(t,e){if("function"!=typeof t&&"object"!=typeof t)throw new g("the target of promisifyAll must be an object or a function\n\n See http://goo.gl/9ITlV0\n");e=Object(e);var r=e.suffix;"string"!=typeof r&&(r=m);var n=e.filter;"function"!=typeof n&&(n=w);var i=e.promisifier;if("function"!=typeof i&&(i=E),!f.isIdentifier(r))throw new RangeError("suffix must be a valid identifier\n\n See http://goo.gl/8FZo5V\n");for(var o=f.inheritedDataKeys(t),s=0;si;++i){var o=e[i];n[i]=t[o],n[i+r]=o}this.constructor$(n)}function s(t){var r,s=n(t);return u(s)?(r=s instanceof e?s._then(e.props,void 0,void 0,void 0,void 0):new o(s).promise(),s instanceof e&&r._propagateFrom(s,4),r):i("cannot await properties of a non-object\n\n See http://goo.gl/OsFKC8\n")}var a=t("./util.js"),u=a.isObject,c=t("./es5.js");a.inherits(o,r),o.prototype._init=function(){this._init$(void 0,-3)},o.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var r=++this._totalResolved;if(r>=this._length){for(var n={},i=this.length(),o=0,s=this.length();s>o;++o)n[this._values[o+i]]=this._values[o];this._resolve(n)}},o.prototype._promiseProgressed=function(t,e){this._promise._progress({key:this._values[e+this.length()],value:t})},o.prototype.shouldCopyValues=function(){return!1},o.prototype.getActualLength=function(t){return t>>1},e.prototype.props=function(){return s(this)},e.props=function(t){return s(t)}}},{"./es5.js":14,"./util.js":38}],28:[function(t,e){"use strict";function r(t,e,r,n,i){for(var o=0;i>o;++o)r[o+n]=t[o+e],t[o+e]=void 0}function n(t){this._capacity=t,this._length=0,this._front=0}n.prototype._willBeOverCapacity=function(t){return this._capacityp;++p){var _=t[p];(void 0!==_||p in t)&&e.cast(_)._then(l,h,void 0,c,null)}return c}var s=t("./util.js").isArray,a=function(t){return t.then(function(e){return o(e,t)})};e.race=function(t){return o(t,void 0)},e.prototype.race=function(){return o(this,void 0)}}},{"./util.js":38}],30:[function(t,e){"use strict";e.exports=function(e,r,n,i,o){function s(t,r,n,s){this.constructor$(t),this._promise._captureStackTrace(),this._preservedValues=s===o?[]:null,this._zerothIsAccum=void 0===n,this._gotAccum=!1,this._reducingIndex=this._zerothIsAccum?1:0,this._valuesPhase=void 0;var u=i(n,this._promise),l=!1,h=u instanceof e;h&&(u=u._target(),u._isPending()?u._proxyPromiseArray(this,-1):u._isFulfilled()?(n=u._value(),this._gotAccum=!0):(this._reject(u._reason()),l=!0)),h||this._zerothIsAccum||(this._gotAccum=!0),this._callback=r,this._accum=n,l||c.invoke(a,this,void 0)}function a(){this._init$(void 0,-5)}function u(t,e,r,i){if("function"!=typeof e)return n("fn must be a function\n\n See http://goo.gl/916lJJ\n");var o=new s(t,e,r,i);return o.promise()}var c=t("./async.js"),l=t("./util.js"),h=l.tryCatch,p=l.errorObj;l.inherits(s,r),s.prototype._init=function(){},s.prototype._resolveEmptyArray=function(){(this._gotAccum||this._zerothIsAccum)&&this._resolve(null!==this._preservedValues?[]:this._accum)},s.prototype._promiseFulfilled=function(t,r){var n=this._values;n[r]=t;var o,s=this.length(),a=this._preservedValues,u=null!==a,c=this._gotAccum,l=this._valuesPhase;if(!l)for(l=this._valuesPhase=new Array(s),o=0;s>o;++o)l[o]=0;if(o=l[r],0===r&&this._zerothIsAccum?(this._accum=t,this._gotAccum=c=!0,l[r]=0===o?1:2):-1===r?(this._accum=t,this._gotAccum=c=!0):0===o?l[r]=1:(l[r]=2,this._accum=t),c){for(var f,_=this._callback,d=this._promise._boundTo,v=this._reducingIndex;s>v;++v)if(o=l[v],2!==o){if(1!==o)return;if(t=n[v],this._promise._pushContext(),u?(a.push(t),f=h(_).call(d,t,v,s)):f=h(_).call(d,this._accum,t,v,s),this._promise._popContext(),f===p)return this._reject(f.e);var y=i(f,this._promise);if(y instanceof e){if(y=y._target(),y._isPending())return l[v]=4,y._proxyPromiseArray(this,v);if(!y._isFulfilled())return this._reject(y._reason());f=y._value()}this._reducingIndex=v+1,this._accum=f}else this._reducingIndex=v+1;this._resolve(u?a:this._accum)}},e.prototype.reduce=function(t,e){return u(this,t,e,null)},e.reduce=function(t,e,r,n){return u(t,e,r,n)}}},{"./async.js":2,"./util.js":38}],31:[function(t,e){"use strict";var r,n=function(){throw new Error("No async scheduler available\n\n See http://goo.gl/m3OTXk\n")};if(t("./util.js").isNode){var i=process.versions.node.split(".").map(Number);r=0===i[0]&&i[1]>10||i[0]>0?global.setImmediate:process.nextTick,r||(r="undefined"!=typeof setImmediate?setImmediate:"undefined"!=typeof setTimeout?setTimeout:n)}else"undefined"!=typeof MutationObserver?(r=function(t){var e=document.createElement("div"),r=new MutationObserver(t);return r.observe(e,{attributes:!0}),function(){e.classList.toggle("foo")}},r.isStatic=!0):r="undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:n;e.exports=r},{"./util.js":38}],32:[function(t,e){"use strict";e.exports=function(e,r){function n(t){this.constructor$(t)}var i=e.PromiseInspection,o=t("./util.js");o.inherits(n,r),n.prototype._promiseResolved=function(t,e){this._values[t]=e;var r=++this._totalResolved;r>=this._length&&this._resolve(this._values)},n.prototype._promiseFulfilled=function(t,e){var r=new i;r._bitField=268435456,r._settledValue=t,this._promiseResolved(e,r)},n.prototype._promiseRejected=function(t,e){var r=new i;r._bitField=134217728,r._settledValue=t,this._promiseResolved(e,r)},e.settle=function(t){return new n(t).promise()},e.prototype.settle=function(){return new n(this).promise()}}},{"./util.js":38}],33:[function(t,e){"use strict";e.exports=function(e,r,n){function i(t){this.constructor$(t),this._howMany=0,this._unwrap=!1,this._initialized=!1}function o(t,e){if((0|e)!==e||0>e)return n("expecting a positive integer\n\n See http://goo.gl/1wAmHx\n");var r=new i(t),o=r.promise();return r.setHowMany(e),r.init(),o}var s=t("./util.js"),a=t("./errors.js").RangeError,u=t("./errors.js").AggregateError,c=s.isArray;s.inherits(i,r),i.prototype._init=function(){if(this._initialized){if(0===this._howMany)return void this._resolve([]);this._init$(void 0,-5);var t=c(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){this._addFulfilled(t),this._fulfilled()===this.howMany()&&(this._values.length=this.howMany(),this._resolve(1===this.howMany()&&this._unwrap?this._values[0]:this._values))},i.prototype._promiseRejected=function(t){if(this._addRejected(t),this.howMany()>this._canPossiblyFulfill()){for(var e=new u,r=this.length();r0},e.prototype.isRejected=t.prototype._isRejected=function(){return(134217728&this._bitField)>0},e.prototype.isPending=t.prototype._isPending=function(){return 0===(402653184&this._bitField)},e.prototype.isResolved=t.prototype._isResolved=function(){return(402653184&this._bitField)>0},t.prototype.isPending=function(){return this._target()._isPending()},t.prototype.isRejected=function(){return this._target()._isRejected()},t.prototype.isFulfilled=function(){return this._target()._isFulfilled()},t.prototype.isResolved=function(){return this._target()._isResolved()},t.prototype._value=function(){return this._settledValue},t.prototype._reason=function(){return this._unsetRejectionIsUnhandled(),this._settledValue},t.prototype.value=function(){var t=this._target();if(!t.isFulfilled())throw new TypeError("cannot get fulfillment value of a non-fulfilled promise\n\n See http://goo.gl/hc1DLj\n");return t._settledValue},t.prototype.reason=function(){var t=this._target();if(!t.isRejected())throw new TypeError("cannot get rejection reason of a non-rejected promise\n\n See http://goo.gl/hPuiwB\n");return t._unsetRejectionIsUnhandled(),t._settledValue},t.PromiseInspection=e}},{}],35:[function(t,e){"use strict";e.exports=function(e,r){function n(t,n){if(c(t)){if(t instanceof e)return t;if(o(t)){var l=new e(r);return t._then(l._fulfillUnchecked,l._rejectUncheckedCheckError,l._progressUnchecked,l,null),l}var h=a.tryCatch(i)(t);if(h===u){n&&n._pushContext();var l=e.reject(h.e);return n&&n._popContext(),l}if("function"==typeof h)return s(t,h,n)}return t}function i(t){return t.then}function o(t){return l.call(t,"_promise0")}function s(t,n,i){function o(r){l&&(t===r?l._rejectCallback(e._makeSelfResolutionError(),!1,!0):l._resolveCallback(r),l=null)}function s(t){l&&(l._rejectCallback(t,p,!0),l=null)}function c(t){l&&"function"==typeof l._progress&&l._progress(t)}var l=new e(r),h=l;i&&i._pushContext(),l._captureStackTrace(),i&&i._popContext();var p=!0,f=a.tryCatch(n).call(t,o,s,c);return p=!1,l&&f===u&&(l._rejectCallback(f.e,!0,!0),l=null),h}var a=t("./util.js"),u=a.errorObj,c=a.isObject,l={}.hasOwnProperty;return n}},{"./util.js":38}],36:[function(t,e){"use strict";e.exports=function(e,r){function n(t){var e=this;return e instanceof Number&&(e=+e),clearTimeout(e),t}function i(t){var e=this;throw e instanceof Number&&(e=+e),clearTimeout(e),t}var o=t("./util.js"),s=e.TimeoutError,a=function(t,e){if(t.isPending()){"string"!=typeof e&&(e="operation timed out");var r=new s(e);o.markAsOriginatingFromRejection(r),t._attachExtraTrace(r),t._cancel(r)}},u=function(t){return c(+this).thenReturn(t)},c=e.delay=function(t,n){if(void 0===n){n=t,t=void 0;var i=new e(r);return setTimeout(function(){i._fulfill()},n),i}return n=+n,e.resolve(t)._then(u,null,null,n,void 0)};e.prototype.delay=function(t){return c(this,t)},e.prototype.timeout=function(t,e){t=+t;var r=this.then().cancellable();r._cancellationParent=this;var o=setTimeout(function(){a(r,e)},t);return r._then(n,i,void 0,o,void 0)}}},{"./util.js":38}],37:[function(t,e){"use strict";e.exports=function(e,r,n,i){function o(t){for(var r=t.length,n=0;r>n;++n){var i=t[n];if(i.isRejected())return e.reject(i.error());t[n]=i._settledValue}return t}function s(t){setTimeout(function(){throw t},0)}function a(t){var e=n(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}function u(t,r){function i(){if(o>=u)return c.resolve();var l=a(t[o++]);if(l instanceof e&&l._isDisposable()){try{l=n(l._getDisposer().tryDispose(r),t.promise)}catch(h){return s(h)}if(l instanceof e)return l._then(i,s,null,null,null)}i()}var o=0,u=t.length,c=e.defer();return i(),c.promise}function c(t){var e=new v;return e._settledValue=t,e._bitField=268435456,u(this,e).thenReturn(t)}function l(t){var e=new v;return e._settledValue=t,e._bitField=134217728,u(this,e).thenThrow(t)}function h(t,e,r){this._data=t,this._promise=e,this._context=r}function p(t,e,r){this.constructor$(t,e,r)}function f(t){return h.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}var _=t("./errors.js").TypeError,d=t("./util.js").inherits,v=e.PromiseInspection;h.prototype.data=function(){return this._data},h.prototype.promise=function(){return this._promise},h.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():null},h.prototype.tryDispose=function(t){var e=this.resource(),r=this._context;void 0!==r&&r._pushContext();var n=null!==e?this.doDispose(e,t):null;return void 0!==r&&r._popContext(),this._promise._unsetDisposable(),this._data=null,n},h.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},d(p,h),p.prototype.doDispose=function(t,e){var r=this.data();return r.call(t,t,e)},e.using=function(){var t=arguments.length;if(2>t)return r("you must pass at least 2 arguments to Promise.using");var i=arguments[t-1];if("function"!=typeof i)return r("fn must be a function\n\n See http://goo.gl/916lJJ\n");t--;for(var s=new Array(t),a=0;t>a;++a){var u=arguments[a];if(h.isDisposer(u)){var p=u;u=u.promise(),u._setDisposable(p)}else{var _=n(u);_ instanceof e&&(u=_._then(f,null,null,{resources:s,index:a},void 0))}s[a]=u}var d=e.settle(s).then(o).then(function(t){d._pushContext();var e;try{e=i.apply(void 0,t)}finally{d._popContext()}return e})._then(c,l,void 0,s,void 0);return s.promise=d,d},e.prototype._setDisposable=function(t){this._bitField=262144|this._bitField,this._disposer=t},e.prototype._isDisposable=function(){return(262144&this._bitField)>0
-},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-262145&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new p(t,this,i());throw new _}}},{"./errors.js":13,"./util.js":38}],38:[function(t,e,r){"use strict";function n(){try{return T.apply(this,arguments)}catch(t){return F.e=t,F}}function i(t){return T=t,n}function o(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function s(t){return!o(t)}function a(t){return o(t)?new Error(v(t)):t}function u(t,e){var r,n=t.length,i=new Array(n+1);for(r=0;n>r;++r)i[r]=t[r];return i[r]=e,i}function c(t,e,r){if(!w.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var n=Object.getOwnPropertyDescriptor(t,e);return null!=n?null==n.get&&null==n.set?n.value:r:void 0}function l(t,e,r){if(o(t))return t;var n={value:r,configurable:!0,enumerable:!1,writable:!0};return w.defineProperty(t,e,n),t}function h(t){throw t}function p(t){try{if("function"==typeof t){var e=w.names(t.prototype);return w.isES5?e.length>1:e.length>0&&!(1===e.length&&"constructor"===e[0])}return!1}catch(r){return!1}}function f(t){function e(){}e.prototype=t;for(var r=8;r--;)new e;return t}function _(t){return R.test(t)}function d(t,e,r){for(var n=new Array(t),i=0;t>i;++i)n[i]=e+i+r;return n}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){try{l(t,"isOperational",!0)}catch(e){}}function g(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function m(t){return t instanceof Error&&w.propertyIsWritable(t,"stack")}function j(t){return{}.toString.call(t)}function b(t,e,r){for(var n=w.names(t),i=0;it||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},r.prototype.emit=function(t){var e,r,i,a,u,c;if(this._events||(this._events={}),"error"===t&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(e=arguments[1],e instanceof Error)throw e;throw TypeError('Uncaught, unspecified "error" event.')}if(r=this._events[t],s(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:for(i=arguments.length,a=new Array(i-1),u=1;i>u;u++)a[u-1]=arguments[u];r.apply(this,a)}else if(o(r)){for(i=arguments.length,a=new Array(i-1),u=1;i>u;u++)a[u-1]=arguments[u];for(c=r.slice(),i=c.length,u=0;i>u;u++)c[u].apply(this,a)}return!0},r.prototype.addListener=function(t,e){var i;if(!n(e))throw TypeError("listener must be a function");if(this._events||(this._events={}),this._events.newListener&&this.emit("newListener",t,n(e.listener)?e.listener:e),this._events[t]?o(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,o(this._events[t])&&!this._events[t].warned){var i;i=s(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[t].length>i&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace())}return this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(t,e){function r(){this.removeListener(t,r),i||(i=!0,e.apply(this,arguments))}if(!n(e))throw TypeError("listener must be a function");var i=!1;return r.listener=e,this.on(t,r),this},r.prototype.removeListener=function(t,e){var r,i,s,a;if(!n(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(r=this._events[t],s=r.length,i=-1,r===e||n(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(o(r)){for(a=s;a-->0;)if(r[a]===e||r[a].listener&&r[a].listener===e){i=a;break}if(0>i)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},r.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[t],n(r))this.removeListener(t,r);else for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},r.prototype.listeners=function(t){var e;return e=this._events&&this._events[t]?n(this._events[t])?[this._events[t]]:this._events[t].slice():[]},r.listenerCount=function(t,e){var r;return r=t._events&&t._events[e]?n(t._events[e])?1:t._events[e].length:0}},{}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise);
\ No newline at end of file
+!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;s0;){var e=t.shift();if("function"==typeof e){var n=t.shift(),r=t.shift();e.call(n,r)}else e._settlePromises()}},n.prototype._drainQueues=function(){this._drainQueue(this._normalQueue),this._reset(),this._haveDrainedQueues=!0,this._drainQueue(this._lateQueue)},n.prototype._queueTick=function(){this._isTickUsed||(this._isTickUsed=!0,this._schedule(this.drainQueues))},n.prototype._reset=function(){this._isTickUsed=!1},e.exports=n,e.exports.firstLineError=s},{"./queue":26,"./schedule":29,"./util":36}],3:[function(t,e){"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){"use strict";function n(){try{Promise===i&&(Promise=r)}catch(t){}return i}var r;"undefined"!=typeof Promise&&(r=Promise);var i=t("./promise")();i.noConflict=n,e.exports=i},{"./promise":22}],5:[function(t,e){"use strict";var n=Object.create;if(n){var r=n(null),i=n(null);r[" size"]=i[" 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(t){var e=this.pop(),r=n(t,e);return r.apply(t,this)}function i(t){return t[this]}function o(t){var e=+this;return 0>e&&(e=Math.max(0,e+t.length)),t[e]}{var s,a=t("./util"),c=a.canEvaluate;a.isIdentifier}e.prototype.call=function(t){var e=[].slice.call(arguments,1);return e.push(t),this._then(r,void 0,void 0,e,void 0)},e.prototype.get=function(t){var e,n="number"==typeof t;if(n)e=o;else if(c){var r=s(t);e=null!==r?r:i}else e=i;return this._then(e,void 0,void 0,t,void 0)}}},{"./util":36}],6:[function(t,e){"use strict";e.exports=function(e,n,r,i){var o=t("./util"),s=o.tryCatch,a=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(),e=t,t=n}},e.prototype._branchHasCancelled=function(){this._branchesRemainingToCancel--},e.prototype._enoughBranchesHaveCancelled=function(){return void 0===this._branchesRemainingToCancel||this._branchesRemainingToCancel<=0},e.prototype._cancelBy=function(t){return t===this?(this._branchesRemainingToCancel=0,this._invokeOnCancel(),!0):(this._branchHasCancelled(),this._enoughBranchesHaveCancelled()?(this._invokeOnCancel(),!0):!1)},e.prototype._cancelBranched=function(){this._enoughBranchesHaveCancelled()&&this._cancel()},e.prototype._cancel=function(){this.isCancellable()&&(this._setCancelled(),c.invoke(this._cancelPromises,this,void 0))},e.prototype._cancelPromises=function(){this._length()>0&&this._settlePromises()},e.prototype._unsetOnCancel=function(){this._onCancelField=void 0},e.prototype.isCancellable=function(){return this.isPending()&&!this.isCancelled()},e.prototype._doInvokeOnCancel=function(t,e){if(o.isArray(t))for(var n=0;n=0?o[t]:void 0}var i=!1,o=[];return t.prototype._promiseCreated=function(){},t.prototype._pushContext=function(){},t.prototype._popContext=function(){return null},t._peekContext=t.prototype._peekContext=function(){},e.prototype._pushContext=function(){void 0!==this._trace&&(this._trace._promiseCreated=null,o.push(this._trace))},e.prototype._popContext=function(){if(void 0!==this._trace){var t=o.pop(),e=t._promiseCreated;return t._promiseCreated=null,e}return null},e.CapturedTrace=null,e.create=n,e.deactivateLongStackTraces=function(){},e.activateLongStackTraces=function(){var n=t.prototype._pushContext,o=t.prototype._popContext,s=t._peekContext,a=t.prototype._peekContext,c=t.prototype._promiseCreated;e.deactivateLongStackTraces=function(){t.prototype._pushContext=n,t.prototype._popContext=o,t._peekContext=s,t.prototype._peekContext=a,t.prototype._promiseCreated=c,i=!1},i=!0,t.prototype._pushContext=e.prototype._pushContext,t.prototype._popContext=e.prototype._popContext,t._peekContext=t.prototype._peekContext=r,t.prototype._promiseCreated=function(){var t=this._peekContext();t&&null==t._promiseCreated&&(t._promiseCreated=this)}},e}},{}],9:[function(t,e){"use strict";e.exports=function(e,n){function r(t,e,n){var r=this;try{t(e,n,function(t){if("function"!=typeof t)throw new TypeError("onCancel must be a function, got: "+H.toString(t));r._attachCancellationCallback(t)})}catch(i){return i}}function i(t){if(!this.isCancellable())return this;var e=this._onCancel();void 0!==e?H.isArray(e)?e.push(t):this._setOnCancel([e,t]):this._setOnCancel(t)}function o(){return this._onCancelField}function s(t){this._onCancelField=t}function a(){this._cancellationParent=void 0,this._onCancelField=void 0}function c(t,e){if(0!==(1&e)){this._cancellationParent=t;var n=t._branchesRemainingToCancel;void 0===n&&(n=0),t._branchesRemainingToCancel=n+1}0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function l(t,e){0!==(2&e)&&t._isBound()&&this._setBoundTo(t._boundTo)}function u(){var t=this._boundTo;return void 0!==t&&t instanceof e?t.isFulfilled()?t.value():void 0:t}function p(){this._trace=new P(this._peekContext())}function h(t,e){if(I(t)){var n=this._trace;if(void 0!==n&&e&&(n=n._parent),void 0!==n)n.attachExtraTrace(t);else if(!t.__stackCleaned__){var r=w(t);H.notEnumerableProp(t,"stack",r.message+"\n"+r.stack.join("\n")),H.notEnumerableProp(t,"__stackCleaned__",!0)}}}function f(t,e,n,r){if(void 0===t&&null!==e&&Y.longStackTraces&&Y.warnings){var i="a promise was created in a "+n+" handler but was not returned from it";r._warn(i,!0,e)}}function _(t,e){var n=t+" is deprecated and will be removed in a future version.";return e&&(n+=" Use "+e+" instead."),d(n)}function d(t,n,r){if(Y.warnings){var i,o=new V(t);if(n)r._attachExtraTrace(o);else if(Y.longStackTraces&&(i=e._peekContext()))i.attachExtraTrace(o);else{var s=w(o);o.stack=s.message+"\n"+s.stack.join("\n")}C(o,"",!0)}}function v(t,e){for(var n=0;n=0;--a)if(r[a]===o){s=a;break}for(var a=s;a>=0;--a){var c=r[a];if(e[i]!==c)break;e.pop(),i--}e=r}}function m(t){for(var e=[],n=0;n0&&(e=e.slice(n)),e}function w(t){var e=t.stack,n=t.toString();return e="string"==typeof e&&e.length>0?b(t):[" (No stack trace)"],{message:n,stack:m(e)}}function C(t,e,n){if("undefined"!=typeof console){var r;if(H.isObject(t)){var i=t.stack;r=e+U(i,t)}else r=e+String(t);"function"==typeof O?O(r,n):("function"==typeof console.log||"object"==typeof console.log)&&console.log(r)}}function j(t,e,n,r){var i=!1;try{"function"==typeof e&&(i=!0,"rejectionHandled"===t?e(r):e(n,r))}catch(o){D.throwLater(o)}var s=!1;try{s=J(t,n,r)}catch(o){s=!0,D.throwLater(o)}var a=!1;if(W)try{a=W(t.toLowerCase(),{reason:n,promise:r})}catch(o){a=!0,D.throwLater(o)}s||i||a||"unhandledRejection"!==t||C(n,"Unhandled rejection ")}function k(t){var e;if("function"==typeof t)e="[function "+(t.name||"anonymous")+"]";else{e=t&&"function"==typeof t.toString?t.toString():H.toString(t);var n=/\[object [a-zA-Z0-9$_]+\]/;if(n.test(e))try{var r=JSON.stringify(t);e=r}catch(i){}0===e.length&&(e="(empty array)")}return"(<"+F(e)+">, no stack trace)"}function F(t){var e=41;return t.lengths||0>a||!n||!r||n!==r||s>=a||(X=function(t){if(L.test(t))return!0;var e=x(t);return e&&e.fileName===n&&s<=e.line&&e.line<=a?!0:!1})}}function P(t){this._parent=t,this._promisesCreated=0;var e=this._length=1+(void 0===t?0:t._length);K(this,P),e>32&&this.uncycle()}var R,S,O,A=e._getDomain,D=e._async,V=t("./errors").Warning,H=t("./util"),I=H.canAttachTrace,L=/[\\\/]bluebird[\\\/]js[\\\/](release|debug|instrumented)/,N=null,U=null,M=!1,B=!(0==H.env("BLUEBIRD_DEBUG")||!H.env("BLUEBIRD_DEBUG")&&"development"!==H.env("NODE_ENV")),q=!(0==H.env("BLUEBIRD_WARNINGS")||!B&&!H.env("BLUEBIRD_WARNINGS")),Q=!(0==H.env("BLUEBIRD_LONG_STACK_TRACES")||!B&&!H.env("BLUEBIRD_LONG_STACK_TRACES"));e.prototype.suppressUnhandledRejections=function(){var t=this._target();t._bitField=-1048577&t._bitField|2097152},e.prototype._ensurePossibleRejectionHandled=function(){0===(2097152&this._bitField)&&(this._setRejectionIsUnhandled(),D.invokeLater(this._notifyUnhandledRejection,this,void 0))},e.prototype._notifyUnhandledRejectionIsHandled=function(){j("rejectionHandled",R,void 0,this)},e.prototype._notifyUnhandledRejection=function(){if(this._isRejectionUnhandled()){var t=this._settledValue();this._setUnhandledRejectionIsNotified(),j("unhandledRejection",S,t,this)}},e.prototype._setUnhandledRejectionIsNotified=function(){this._bitField=262144|this._bitField},e.prototype._unsetUnhandledRejectionIsNotified=function(){this._bitField=-262145&this._bitField},e.prototype._isUnhandledRejectionNotified=function(){return(262144&this._bitField)>0},e.prototype._setRejectionIsUnhandled=function(){this._bitField=1048576|this._bitField},e.prototype._unsetRejectionIsUnhandled=function(){this._bitField=-1048577&this._bitField,this._isUnhandledRejectionNotified()&&(this._unsetUnhandledRejectionIsNotified(),this._notifyUnhandledRejectionIsHandled())},e.prototype._isRejectionUnhandled=function(){return(1048576&this._bitField)>0},e.prototype._warn=function(t,e,n){return d(t,e,n||this)},e.onPossiblyUnhandledRejection=function(t){var e=A();S="function"==typeof t?null===e?t:e.bind(t):void 0},e.onUnhandledRejectionHandled=function(t){var e=A();R="function"==typeof t?null===e?t:e.bind(t):void 0};var $=function(){};e.longStackTraces=function(){if(D.haveItemsQueued()&&!Y.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");if(!Y.longStackTraces&&E()){var t=e.prototype._captureStackTrace,r=e.prototype._attachExtraTrace;Y.longStackTraces=!0,$=function(){if(D.haveItemsQueued()&&!Y.longStackTraces)throw new Error("cannot enable long stack traces after promises have been created\n\n See http://goo.gl/MqrFmX\n");e.prototype._captureStackTrace=t,e.prototype._attachExtraTrace=r,n.deactivateLongStackTraces(),D.enableTrampoline(),Y.longStackTraces=!1},e.prototype._captureStackTrace=p,e.prototype._attachExtraTrace=h,n.activateLongStackTraces(),D.disableTrampolineIfNecessary()}},e.hasLongStackTraces=function(){return Y.longStackTraces&&E()},e.config=function(t){if(t=Object(t),"longStackTraces"in t&&(t.longStackTraces?e.longStackTraces():!t.longStackTraces&&e.hasLongStackTraces()&&$()),"warnings"in t&&(Y.warnings=!!t.warnings),"cancellation"in t&&t.cancellation&&!Y.cancellation){if(D.haveItemsQueued())throw new Error("cannot enable cancellation after promises are in use");e.prototype._clearCancellationData=a,e.prototype._propagateFrom=c,e.prototype._onCancel=o,e.prototype._setOnCancel=s,e.prototype._attachCancellationCallback=i,e.prototype._execute=r,z=c,Y.cancellation=!0}},e.prototype._execute=function(t,e,n){try{t(e,n)}catch(r){return r}},e.prototype._onCancel=function(){},e.prototype._setOnCancel=function(){},e.prototype._attachCancellationCallback=function(){},e.prototype._captureStackTrace=function(){},e.prototype._attachExtraTrace=function(){},e.prototype._clearCancellationData=function(){},e.prototype._propagateFrom=function(){};var z=l,X=function(){return!1},G=/[\/<\(]([^:\/]+):(\d+):(?:\d+)\)?\s*$/;H.inherits(P,Error),n.CapturedTrace=P,P.prototype.uncycle=function(){var t=this._length;if(!(2>t)){for(var e=[],n={},r=0,i=this;void 0!==i;++r)e.push(i),i=i._parent;t=this._length=r;for(var r=t-1;r>=0;--r){var o=e[r].stack;void 0===n[o]&&(n[o]=r)}for(var r=0;t>r;++r){var s=e[r].stack,a=n[s];if(void 0!==a&&a!==r){a>0&&(e[a-1]._parent=void 0,e[a-1]._length=1),e[r]._parent=void 0,e[r]._length=1;var c=r>0?e[r-1]:this;t-1>a?(c._parent=e[a+1],c._parent.uncycle(),c._length=c._parent._length+1):(c._parent=void 0,c._length=1);for(var l=c._length+1,u=r-2;u>=0;--u)e[u]._length=l,l++;return}}}},P.prototype.attachExtraTrace=function(t){if(!t.__stackCleaned__){this.uncycle();for(var e=w(t),n=e.message,r=[e.stack],i=this;void 0!==i;)r.push(m(i.stack.split("\n"))),i=i._parent;g(r),y(r),H.notEnumerableProp(t,"stack",v(n,r)),H.notEnumerableProp(t,"__stackCleaned__",!0)}};var W,K=function(){var t=/^\s*at\s*/,e=function(t,e){return"string"==typeof t?t:void 0!==e.name&&void 0!==e.message?e.toString():k(e)};if("number"==typeof Error.stackTraceLimit&&"function"==typeof Error.captureStackTrace){Error.stackTraceLimit+=6,N=t,U=e;var n=Error.captureStackTrace;return X=function(t){return L.test(t)},function(t,e){Error.stackTraceLimit+=6,n(t,e),Error.stackTraceLimit-=6}}var r=new Error;if("string"==typeof r.stack&&r.stack.split("\n")[0].indexOf("stackDetection@")>=0)return N=/@/,U=e,M=!0,function(t){t.stack=(new Error).stack};var i;try{throw new Error}catch(o){i="stack"in o}return"stack"in r||!i||"number"!=typeof Error.stackTraceLimit?(U=function(t,e){return"string"==typeof t?t:"object"!=typeof e&&"function"!=typeof e||void 0===e.name||void 0===e.message?k(e):e.toString()},null):(N=t,U=e,function(t){Error.stackTraceLimit+=6;try{throw new Error}catch(e){t.stack=e.stack}Error.stackTraceLimit-=6})}([]),J=function(){if(H.isNode)return function(t,e,n){return"rejectionHandled"===t?process.emit(t,n):process.emit(t,e,n)};var t=!1,e=!0;try{var n=new self.CustomEvent("test");t=n instanceof CustomEvent}catch(r){}if(!t)try{var i=document.createEvent("CustomEvent");i.initCustomEvent("testingtheevent",!1,!0,{}),self.dispatchEvent(i)}catch(r){e=!1}e&&(W=function(e,n){var r;return t?r=new self.CustomEvent(e,{detail:n,bubbles:!1,cancelable:!0}):self.dispatchEvent&&(r=document.createEvent("CustomEvent"),r.initCustomEvent(e,!1,!0,n)),r?!self.dispatchEvent(r):!1});var o={};return o.unhandledRejection="onunhandledRejection".toLowerCase(),o.rejectionHandled="onrejectionHandled".toLowerCase(),function(t,e,n){var r=o[t],i=self[r];return i?("rejectionHandled"===t?i.call(self,n):i.call(self,e,n),!0):!1}}();"undefined"!=typeof console&&"undefined"!=typeof console.warn&&(O=function(t){console.warn(t)},H.isNode&&process.stderr.isTTY?O=function(t,e){var n=e?"[33m":"[31m";console.warn(n+t+"[0m\n")}:H.isNode||"string"!=typeof(new Error).stack||(O=function(t,e){console.warn("%c"+t,e?"color: darkorange":"color: red")}));var Y={warnings:q,longStackTraces:!1,cancellation:!1};return Q&&e.longStackTraces(),{longStackTraces:function(){return Y.longStackTraces},warnings:function(){return Y.warnings},cancellation:function(){return Y.cancellation},propagateFromFunction:function(){return z},boundValueFunction:function(){return u},checkForgottenReturns:f,setBounds:T,warn:d,deprecated:_,CapturedTrace:P}}},{"./errors":12,"./util":36}],10:[function(t,e){"use strict";e.exports=function(t){function e(){return this.value}function n(){throw this.reason}t.prototype["return"]=t.prototype.thenReturn=function(n){return n instanceof t&&n.suppressUnhandledRejections(),this._then(e,void 0,void 0,{value:n},void 0)},t.prototype["throw"]=t.prototype.thenThrow=function(t){return this._then(n,void 0,void 0,{reason:t},void 0)},t.prototype.catchThrow=function(t){if(arguments.length<=1)return this._then(void 0,n,void 0,{reason:t},void 0);var e=arguments[1],r=function(){throw e};return this.caught(t,r)},t.prototype.catchReturn=function(n){if(arguments.length<=1)return n instanceof t&&n.suppressUnhandledRejections(),this._then(void 0,e,void 0,{value:n},void 0);var r=arguments[1];r instanceof t&&r.suppressUnhandledRejections();var i=function(){return r};return this.caught(n,i)}}},{}],11:[function(t,e){"use strict";e.exports=function(t,e){function n(){return o(this)}function r(t,n){return i(t,n,e,e)}var i=t.reduce,o=t.all;t.prototype.each=function(t){return this.mapSeries(t)._then(n,void 0,void 0,this,void 0)},t.prototype.mapSeries=function(t){return i(this,t,e,e)},t.each=function(t,e){return r(t,e)._then(n,void 0,void 0,t,void 0)},t.mapSeries=r}},{}],12:[function(t,e){"use strict";function n(t,e){function n(r){return this instanceof n?(u(this,"message","string"==typeof r?r:e),u(this,"name",t),void(Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):Error.call(this))):new n(r)}return l(n,Error),n}function r(t){return this instanceof r?(u(this,"name","OperationalError"),u(this,"message",t),this.cause=t,this.isOperational=!0,void(t instanceof Error?(u(this,"message",t.message),u(this,"stack",t.stack)):Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor))):new r(t)}var i,o,s=t("./es5"),a=s.freeze,c=t("./util"),l=c.inherits,u=c.notEnumerableProp,p=n("Warning","warning"),h=n("CancellationError","cancellation error"),f=n("TimeoutError","timeout error"),_=n("AggregateError","aggregate error");try{i=TypeError,o=RangeError}catch(d){i=n("TypeError","type error"),o=n("RangeError","range error")}for(var v="join pop push shift unshift slice filter forEach some every map indexOf lastIndexOf reduce reduceRight sort reverse".split(" "),y=0;y1?t.cancelPromise._reject(e):t.cancelPromise._cancel(),t.cancelPromise=null,!0):!1}function o(){return a.call(this,this.promise._target()._settledValue())}function s(t){return i(this,t)?void 0:(u.e=t,u)}function a(t){var a=this.promise,c=this.handler;if(!this.called){this.called=!0;var p=0===this.type?c.call(a._boundValue()):c.call(a._boundValue(),t);if(void 0!==p){var h=n(p,a);if(h instanceof e){if(null!=this.cancelPromise){if(h.isCancelled()){var f=new l("late cancellation observer");return a._attachExtraTrace(f),u.e=f,u}h.isPending()&&h._attachCancellationCallback(new r(this))}return h._then(o,s,void 0,this,void 0)}}}return a.isRejected()?(i(this),u.e=t,u):(i(this),t)}var c=t("./util"),l=e.CancellationError,u=c.errorObj;return r.prototype._resultCancelled=function(){i(this.finallyHandler)},e.prototype._passThrough=function(t,e,n,r){return"function"!=typeof t?this.then():this._then(n,r,void 0,{promise:this,handler:t,called:!1,cancelPromise:null,type:e},void 0)},e.prototype.lastly=e.prototype["finally"]=function(t){return this._passThrough(t,0,a,a)},e.prototype.tap=function(t){return this._passThrough(t,1,a)},a}},{"./util":36}],16:[function(t,e){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r){for(var o=0;o0&&"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){"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:i.bind(e),this._preservedValues=r===o?new Array(this.length()):null,this._limit=n,this._inFlight=0,this._queue=n>=1?[]:f,this._init$(void 0,-2)}function c(t,e,n,i){if("function"!=typeof e)return r("expecting a function but got "+u.classString(e));var o="object"==typeof n&&null!==n?n.concurrency:0;return o="number"==typeof o&&isFinite(o)&&o>=1?o:0,new a(t,e,o,i).promise()}var l=e._getDomain,u=t("./util"),p=u.tryCatch,h=u.errorObj,f=[];u.inherits(a,n),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 g=++this._totalResolved;return g>=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._inFlighto;++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){"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){"use strict";function n(t){return t instanceof Error&&l.getPrototypeOf(t)===Error.prototype}function r(t){var e;if(n(t)){e=new c(t),e.name=t.name,e.message=t.message,e.stack=t.stack;for(var r=l.keys(t),i=0;i1){var n,r=new Array(e-1),i=0;for(n=0;e-1>n;++n){var o=arguments[n];if(!h.isObject(o))return u("expecting an object but got "+h.classString(o));r[i++]=o}return r.length=i,t=arguments[n],this.then(void 0,T(r,t,this))}return this.then(void 0,t)},r.prototype.reflect=function(){return this._then(l,l,void 0,this,void 0)},r.prototype.then=function(t,e){if(E.warnings()&&arguments.length>0&&"function"!=typeof t&&"function"!=typeof e){var n=".then() only accepts functions but was passed: "+h.classString(t);arguments.length>1&&(n+=", "+h.classString(e)),this._warn(n)}return this._then(t,e,void 0,void 0,void 0)},r.prototype.done=function(t,e){var n=this._then(t,e,void 0,void 0,void 0);n._setIsFinal()},r.prototype.spread=function(t){return"function"!=typeof t?u("expecting a function but got "+h.classString(t)):this.all()._then(t,void 0,void 0,b,void 0)},r.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},r.prototype.all=function(){return arguments.length>0&&this._warn(".all() was passed arguments but it does not take any"),new j(this).promise()},r.prototype.error=function(t){return this.caught(h.originatesFromRejection,t)},r.is=function(t){return t instanceof r},r.fromNode=r.fromCallback=function(t){var e=new r(m),n=arguments.length>1?!!Object(arguments[1]).multiArgs:!1,i=S(t)(P(e,n));return i===R&&e._rejectCallback(i.e,!0),e._isFateSealed()||e._setAsyncGuaranteed(),e},r.all=function(t){return new j(t).promise()},r.cast=function(t){var e=C(t);return e instanceof r||(e=new r(m),e._captureStackTrace(),e._setFulfilled(),e._rejectionHandler0=t),e},r.resolve=r.fulfilled=r.cast,r.reject=r.rejected=function(t){var e=new r(m);return e._captureStackTrace(),e._rejectCallback(t,!0),e},r.setScheduler=function(t){if("function"!=typeof t)throw new y("expecting a function but got "+h.classString(t));var e=d._schedule;return d._schedule=t,e},r.prototype._then=function(t,e,n,i,o){var s=void 0!==o,c=s?o:new r(m),l=this._target(),u=l._bitField;s||(c._propagateFrom(this,3),c._captureStackTrace(),void 0===i&&0!==(2097152&this._bitField)&&(i=0!==(50397184&u)?this._boundValue():l===this?void 0:this._boundTo));var p=a();if(0!==(50397184&u)){var h,f,_=l._settlePromiseCtx;0!==(33554432&u)?(f=l._rejectionHandler0,h=t):0!==(16777216&u)?(f=l._fulfillmentHandler0,h=e,l._unsetRejectionIsUnhandled()):(_=l._settlePromiseLateCancellationObserver,f=new g("late cancellation observer"),l._attachExtraTrace(f),h=e),d.invoke(_,l,{handler:null===p?h:"function"==typeof h&&p.bind(h),promise:c,receiver:i,value:f})}else l._addCallbacks(t,e,c,i,p);return c},r.prototype._length=function(){return 65535&this._bitField},r.prototype._isFateSealed=function(){return 0!==(117506048&this._bitField)},r.prototype._isFollowing=function(){return 67108864===(67108864&this._bitField)},r.prototype._setLength=function(t){this._bitField=-65536&this._bitField|65535&t},r.prototype._setFulfilled=function(){this._bitField=33554432|this._bitField},r.prototype._setRejected=function(){this._bitField=16777216|this._bitField},r.prototype._setFollowing=function(){this._bitField=67108864|this._bitField},r.prototype._setIsFinal=function(){this._bitField=4194304|this._bitField},r.prototype._isFinal=function(){return(4194304&this._bitField)>0},r.prototype._unsetCancelled=function(){this._bitField=-65537&this._bitField},r.prototype._setCancelled=function(){this._bitField=65536|this._bitField},r.prototype._setAsyncGuaranteed=function(){this._bitField=134217728|this._bitField},r.prototype._receiverAt=function(t){var e=0===t?this._receiver0:this[4*t-4+3];return e===p?void 0:void 0===e&&this._isBound()?this._boundValue():e},r.prototype._promiseAt=function(t){return this[4*t-4+2]},r.prototype._fulfillmentHandlerAt=function(t){return this[4*t-4+0]},r.prototype._rejectionHandlerAt=function(t){return this[4*t-4+1]},r.prototype._boundValue=function(){},r.prototype._migrateCallback0=function(t){var e=(t._bitField,t._fulfillmentHandler0),n=t._rejectionHandler0,r=t._promise0,i=t._receiverAt(0);void 0===i&&(i=p),this._addCallbacks(e,n,r,i,null)},r.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=p),this._addCallbacks(n,r,i,o,null)},r.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:i.bind(t)),"function"==typeof e&&(this._rejectionHandler0=null===i?e:i.bind(e));else{var s=4*o-4;this[s+2]=n,this[s+3]=r,"function"==typeof t&&(this[s+0]=null===i?t:i.bind(t)),"function"==typeof e&&(this[s+1]=null===i?e:i.bind(e))}return this._setLength(o+1),o},r.prototype._proxy=function(t,e){this._addCallbacks(void 0,void 0,e,t,null)},r.prototype._resolveCallback=function(t,e){if(0===(117506048&this._bitField)){if(t===this)return this._rejectCallback(c(),!1);var n=C(t,this);if(!(n instanceof r))return this._fulfill(t);e&&this._propagateFrom(n,2);var i=n._target(),o=i._bitField;if(0===(50397184&o)){var s=this._length();s>0&&i._migrateCallback0(this);for(var a=1;s>a;++a)i._migrateCallbackAt(this,a);this._setFollowing(),this._setLength(0),this._setFollowee(i)}else if(0!==(33554432&o))this._fulfill(i._value());else if(0!==(16777216&o))this._reject(i._reason());else{var l=new g("late cancellation observer");i._attachExtraTrace(l),this._reject(l)}}},r.prototype._rejectCallback=function(t,e,n){var r=h.ensureErrorObject(t),i=r===t;if(!i&&!n&&E.warnings()){var o="a promise was rejected with a non-error: "+h.classString(t);this._warn(o,!0)}this._attachExtraTrace(r,e?i:!1),this._reject(t)},r.prototype._resolveFromExecutor=function(t){var e=this;this._captureStackTrace(),this._pushContext();var n=!0,r=this._execute(t,function(t){e._resolveCallback(t)},function(t){e._rejectCallback(t,n)});n=!1,this._popContext(),void 0!==r&&e._rejectCallback(r,!0)},r.prototype._settlePromiseFromHandler=function(t,e,n,r){var i=r._bitField;if(0===(65536&i)){r._pushContext();var o;e===b?n&&"number"==typeof n.length?o=S(t).apply(this._boundValue(),n):(o=R,o.e=new y("cannot .spread() a non-array: "+h.classString(n))):o=S(t).call(e,n);var s=r._popContext();if(i=r._bitField,0===(65536&i))if(o===w)r._reject(n);else if(o===R||o===r){var a=o===r?c():o.e;r._rejectCallback(a,!1)}else E.checkForgottenReturns(o,s,"",r),r._resolveCallback(o)}},r.prototype._target=function(){for(var t=this;t._isFollowing();)t=t._followee();return t},r.prototype._followee=function(){return this._rejectionHandler0},r.prototype._setFollowee=function(t){this._rejectionHandler0=t},r.prototype._settlePromise=function(t,n,i,o){var s=t instanceof r,a=this._bitField,c=0!==(134217728&a);0!==(65536&a)?(s&&t._invokeInternalOnCancel(),n===x?(i.cancelPromise=t,S(n).call(i,o)===R&&t._reject(R.e)):n===l?t._fulfill(l.call(i)):i instanceof e?i._promiseCancelled(t):s||t instanceof j?t._cancel():i.cancel()):"function"==typeof n?s?(c&&t._setAsyncGuaranteed(),this._settlePromiseFromHandler(n,i,o,t)):n.call(i,o,t):i instanceof e?i._isResolved()||(0!==(33554432&a)?i._promiseFulfilled(o,t):i._promiseRejected(o,t)):s&&(c&&t._setAsyncGuaranteed(),0!==(33554432&a)?t._fulfill(o):t._reject(o))},r.prototype._settlePromiseLateCancellationObserver=function(t){var e=t.handler,n=t.promise,i=t.receiver,o=t.value;"function"==typeof e?n instanceof r?this._settlePromiseFromHandler(e,i,o,n):e.call(i,o,n):n instanceof r&&n._reject(o)},r.prototype._settlePromiseCtx=function(t){this._settlePromise(t.promise,t.handler,t.receiver,t.value)},r.prototype._settlePromise0=function(t,e){var n=this._promise0,r=this._receiverAt(0);this._promise0=void 0,this._receiver0=void 0,this._settlePromise(n,t,r,e)},r.prototype._clearCallbackDataAtIndex=function(t){var e=4*t-4;this[e+2]=this[e+3]=this[e+0]=this[e+1]=void 0},r.prototype._fulfill=function(t){var e=this._bitField;if(!((117506048&e)>>>16)){if(t===this){var n=c();return this._attachExtraTrace(n),this._reject(n)}this._setFulfilled(),this._rejectionHandler0=t,(65535&e)>0&&(0!==(134217728&e)?this._settlePromises():d.settlePromises(this))}},r.prototype._reject=function(t){var e=this._bitField;if(!((117506048&e)>>>16))return this._setRejected(),this._fulfillmentHandler0=t,this._isFinal()?d.fatalError(t,h.isNode):void((65535&e)>0?0!==(134217728&e)?this._settlePromises():d.settlePromises(this):this._ensurePossibleRejectionHandled())},r.prototype._fulfillPromises=function(t,e){for(var n=1;t>n;n++){var r=this._fulfillmentHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},r.prototype._rejectPromises=function(t,e){for(var n=1;t>n;n++){var r=this._rejectionHandlerAt(n),i=this._promiseAt(n),o=this._receiverAt(n);this._clearCallbackDataAtIndex(n),this._settlePromise(i,r,o,e)}},r.prototype._settlePromises=function(){var t=this._bitField,e=65535&t;if(e>0){if(0!==(16842752&t)){var n=this._fulfillmentHandler0;this._settlePromise0(this._rejectionHandler0,n,t),this._rejectPromises(e,n)}else{var r=this._rejectionHandler0;this._settlePromise0(this._fulfillmentHandler0,r,t),this._fulfillPromises(e,r)}this._setLength(0)}this._clearCancellationData()},r.prototype._settledValue=function(){var t=this._bitField;return 0!==(33554432&t)?this._rejectionHandler0:0!==(16777216&t)?this._fulfillmentHandler0:void 0},r.defer=r.pending=function(){E.deprecated("Promise.defer","new Promise");var t=new r(m);return{promise:t,resolve:i,reject:o}},h.notEnumerableProp(r,"_makeSelfResolutionError",c),t("./method")(r,m,C,u,E),t("./bind")(r,m,C,E),t("./cancel")(r,j,u,E),t("./direct_resolve")(r),t("./synchronous_inspection")(r),t("./join")(r,j,C,m,E),r.Promise=r,t("./map.js")(r,j,u,C,m,E),t("./using.js")(r,u,C,F,m,E),t("./timers.js")(r,m),t("./generators.js")(r,u,m,C,e,E),t("./nodeify.js")(r),t("./call_get.js")(r),t("./props.js")(r,j,C,u),t("./race.js")(r,m,C,u),t("./reduce.js")(r,j,u,C,m,E),t("./settle.js")(r,j,E),t("./some.js")(r,j,u),t("./promisify.js")(r,m),t("./any.js")(r),t("./each.js")(r,m),t("./filter.js")(r,m),h.toFastProperties(r),h.toFastProperties(r.prototype),s({a:1}),s({b:2}),s({c:3}),s(1),s(function(){}),s(void 0),s(!1),s(new r(m)),E.setBounds(_.firstLineError,h.lastLineError),r}},{"./any.js":1,"./async":2,"./bind":3,"./call_get.js":5,"./cancel":6,"./catch_filter":7,"./context":8,"./debuggability":9,"./direct_resolve":10,"./each.js":11,"./errors":12,"./es5":13,"./filter.js":14,"./finally":15,"./generators.js":16,"./join":17,"./map.js":18,"./method":19,"./nodeback":20,"./nodeify.js":21,"./promise_array":23,"./promisify.js":24,"./props.js":25,"./race.js":27,"./reduce.js":28,"./settle.js":30,"./some.js":31,"./synchronous_inspection":32,"./thenables":33,"./timers.js":34,"./using.js":35,"./util":36}],23:[function(t,e){"use strict";e.exports=function(e,n,r,i,o){function s(t){switch(t){case-2:return[];case-3:return{}}}function a(t){var r=this._promise=new e(n);t instanceof e&&r._propagateFrom(t,3),r._setOnCancel(this),this._values=t,this._length=0,this._totalResolved=0,this._init(void 0,-2)}{var c=t("./util");c.isArray}return c.inherits(a,o),a.prototype.length=function(){return this._length},a.prototype.promise=function(){return this._promise},a.prototype._init=function l(t,n){var o=r(this._values,this._promise);if(o instanceof e){o=o._target();var a=o._bitField;if(this._values=o,0===(50397184&a))return this._promise._setAsyncGuaranteed(),o._then(l,this._reject,void 0,this,n);if(0===(33554432&a))return 0!==(16777216&a)?this._reject(o._reason()):this._cancel();o=o._value()}if(o=c.asArray(o),null===o){var u=i("expecting an array or an iterable object but got "+c.classString(o)).reason();return void this._promise._rejectCallback(u,!1)}return 0===o.length?void(-5===n?this._resolveEmptyArray():this._resolve(s(n))):void this._iterate(o)},a.prototype._iterate=function(t){var n=this.getActualLength(t.length);this._length=n,this._values=this.shouldCopyValues()?new Array(n):this._values;for(var i=this._promise,o=!1,s=null,a=0;n>a;++a){var c=r(t[a],i);c instanceof e?(c=c._target(),s=c._bitField):s=null,o?null!==s&&c.suppressUnhandledRejections():null!==s?0===(50397184&s)?(c._proxy(this,a),this._values[a]=c):o=0!==(33554432&s)?this._promiseFulfilled(c._value(),a):0!==(16777216&s)?this._promiseRejected(c._reason(),a):this._promiseCancelled(a):o=this._promiseFulfilled(c,a)}o||i._setAsyncGuaranteed()},a.prototype._isResolved=function(){return null===this._values},a.prototype._resolve=function(t){this._values=null,this._promise._fulfill(t)},a.prototype._cancel=function(){!this._isResolved()&&this._promise.isCancellable()&&(this._values=null,this._promise._cancel())},a.prototype._reject=function(t){this._values=null,this._promise._rejectCallback(t,!1)},a.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},a.prototype._promiseCancelled=function(){return this._cancel(),!0},a.prototype._promiseRejected=function(t){return this._totalResolved++,this._reject(t),!0},a.prototype._resultCancelled=function(){if(!this._isResolved()){var t=this._values;if(this._cancel(),t instanceof e)t.cancel();else for(var n=0;nc;c+=2){var u=s[c],p=s[c+1],_=u+e;if(r===F)t[_]=F(u,h,u,p,e,i);else{var d=r(p,function(){return F(u,h,u,p,e,i)});f.notEnumerableProp(d,"__isPromisified__",!0),t[_]=d}}return f.toFastProperties(t),t}function u(t,e,n){return F(t,e,void 0,t,null,n)}var p,h={},f=t("./util"),_=t("./nodeback"),d=f.withAppended,v=f.maybeWrapAsError,y=f.canEvaluate,g=t("./errors").TypeError,m="Async",b={__isPromisified__:!0},w=["arity","length","name","arguments","caller","callee","prototype","__isPromisified__"],C=new RegExp("^(?:"+w.join("|")+")$"),j=function(t){return f.isIdentifier(t)&&"_"!==t.charAt(0)&&"constructor"!==t},k=function(t){return t.replace(/([$])/,"\\$")},F=y?p:c;e.promisify=function(t,e){if("function"!=typeof t)throw new g("expecting a function but got "+f.classString(t));if(i(t))return t;e=Object(e);var n=void 0===e.context?h:e.context,o=!!e.multiArgs,s=u(t,n,o);return f.copyDescriptors(t,s,r),s},e.promisifyAll=function(t,e){if("function"!=typeof t&&"object"!=typeof t)throw new g("the target of promisifyAll must be an object or a function\n\n See http://goo.gl/MqrFmX\n");e=Object(e);var n=!!e.multiArgs,r=e.suffix;"string"!=typeof r&&(r=m);var i=e.filter;"function"!=typeof i&&(i=j);var o=e.promisifier;if("function"!=typeof o&&(o=F),!f.isIdentifier(r))throw new RangeError("suffix must be a valid identifier\n\n See http://goo.gl/MqrFmX\n");for(var s=f.inheritedDataKeys(t),a=0;ao;++o){var s=r[o];e[o]=t[s],e[o+i]=s}}this.constructor$(e),this._isMap=n,this._init$(void 0,-3)}function s(t){var n,s=r(t);return l(s)?(n=s instanceof e?s._then(e.props,void 0,void 0,void 0,void 0):new o(s).promise(),s instanceof e&&n._propagateFrom(s,2),n):i("cannot await properties of a non-object\n\n See http://goo.gl/MqrFmX\n")}var a,c=t("./util"),l=c.isObject,u=t("./es5");"function"==typeof Map&&(a=Map);var p=function(){function t(t,r){this[e]=t,this[e+n]=r,e++}var e=0,n=0;return function(r){n=r.size,e=0;var i=new Array(2*r.size);return r.forEach(t,i),i}}(),h=function(t){for(var e=new a,n=t.length/2|0,r=0;n>r;++r){var i=t[n+r],o=t[r];e.set(i,o)}return e};c.inherits(o,n),o.prototype._init=function(){},o.prototype._promiseFulfilled=function(t,e){this._values[e]=t;var n=++this._totalResolved;if(n>=this._length){var r;if(this._isMap)r=h(this._values);else{r={};for(var i=this.length(),o=0,s=this.length();s>o;++o)r[this._values[o+i]]=this._values[o]}return this._resolve(r),!0}return!1},o.prototype.shouldCopyValues=function(){return!1},o.prototype.getActualLength=function(t){return t>>1},e.prototype.props=function(){return s(this)},e.props=function(t){return s(t)}}},{"./es5":13,"./util":36}],26:[function(t,e){"use strict";function n(t,e,n,r,i){for(var o=0;i>o;++o)n[o+r]=t[o+e],t[o+e]=void 0}function r(t){this._capacity=t,this._length=0,this._front=0}r.prototype._willBeOverCapacity=function(t){return this._capacityh;++h){var _=t[h];(void 0!==_||h in t)&&e.cast(_)._then(u,p,void 0,l,null)}return l}var s=t("./util"),a=function(t){return t.then(function(e){return o(e,t)})};e.race=function(t){return o(t,void 0)},e.prototype.race=function(){return o(this,void 0)}}},{"./util":36}],28:[function(t,e){"use strict";e.exports=function(e,n,r,i,o,s){function a(t,n,r,i){this.constructor$(t);var s=h();this._fn=null===s?n:s.bind(n),void 0!==r&&(r=e.resolve(r),r._attachCancellationCallback(this)),this._initialValue=r,this._currentCancellable=null,this._eachValues=i===o?[]:void 0,this._promise._captureStackTrace(),this._init$(void 0,-5)}function c(t,e){this.isFulfilled()?e._resolve(t):e._reject(t)}function l(t,e,n,i){if("function"!=typeof e)return r("expecting a function but got "+f.classString(e));var o=new a(t,e,n,i);return o.promise()}function u(t){this.accum=t,this.array._gotAccum(t);var n=i(this.value,this.array._promise);return n instanceof e?(this.array._currentCancellable=n,n._then(p,void 0,void 0,this,void 0)):p.call(this,n)}function p(t){var n=this.array,r=n._promise,i=_(n._fn);r._pushContext();var o;o=void 0!==n._eachValues?i.call(r._boundValue(),t,this.index,this.length):i.call(r._boundValue(),this.accum,t,this.index,this.length),o instanceof e&&(n._currentCancellable=o);var a=r._popContext();return s.checkForgottenReturns(o,a,void 0!==n._eachValues?"Promise.each":"Promise.reduce",r),o}var h=e._getDomain,f=t("./util"),_=f.tryCatch;f.inherits(a,n),a.prototype._gotAccum=function(t){void 0!==this._eachValues&&t!==o&&this._eachValues.push(t)},a.prototype._eachComplete=function(t){return this._eachValues.push(t),this._eachValues},a.prototype._init=function(){},a.prototype._resolveEmptyArray=function(){this._resolve(void 0!==this._eachValues?this._eachValues:this._initialValue)},a.prototype.shouldCopyValues=function(){return!1},a.prototype._resolve=function(t){this._promise._resolveCallback(t),this._values=null},a.prototype._resultCancelled=function(t){return t===this._initialValue?this._cancel():void(this._isResolved()||(this._resultCancelled$(),this._currentCancellable instanceof e&&this._currentCancellable.cancel(),this._initialValue instanceof e&&this._initialValue.cancel()))},a.prototype._iterate=function(t){this._values=t;var n,r,i=t.length;if(void 0!==this._initialValue?(n=this._initialValue,r=0):(n=e.resolve(t[0]),r=1),this._currentCancellable=n,!n.isRejected())for(;i>r;++r){var o={accum:null,value:t[r],index:r,length:i,array:this};n=n._then(u,void 0,void 0,o,void 0)}void 0!==this._eachValues&&(n=n._then(this._eachComplete,void 0,void 0,this,void 0)),n._then(c,c,void 0,n,this)},e.prototype.reduce=function(t,e){return l(this,t,e,null)},e.reduce=function(t,e,n,r){return l(t,e,n,r)}}},{"./util":36}],29:[function(t,e){"use strict";var n,r=t("./util"),i=function(){throw new Error("No async scheduler available\n\n See http://goo.gl/MqrFmX\n")};if(r.isNode&&"undefined"==typeof MutationObserver){var o=global.setImmediate,s=process.nextTick;n=r.isRecentNode?function(t){o.call(global,t)}:function(t){s.call(process,t)}}else"undefined"==typeof MutationObserver||"undefined"!=typeof window&&window.navigator&&window.navigator.standalone?n="undefined"!=typeof setImmediate?function(t){setImmediate(t)}:"undefined"!=typeof setTimeout?function(t){setTimeout(t,0)}:i:(n=function(t){var e=document.createElement("div"),n=new MutationObserver(t);return n.observe(e,{attributes:!0}),function(){e.classList.toggle("foo")}},n.isStatic=!0);e.exports=n},{"./util":36}],30:[function(t,e){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t)}var o=e.PromiseInspection,s=t("./util");s.inherits(i,n),i.prototype._promiseResolved=function(t,e){this._values[t]=e;var n=++this._totalResolved;return n>=this._length?(this._resolve(this._values),!0):!1},i.prototype._promiseFulfilled=function(t,e){var n=new o;return n._bitField=33554432,n._settledValueField=t,this._promiseResolved(e,n)},i.prototype._promiseRejected=function(t,e){var n=new o;return n._bitField=16777216,n._settledValueField=t,this._promiseResolved(e,n)},e.settle=function(t){return r.deprecated(".settle()",".reflect()"),new i(t).promise()},e.prototype.settle=function(){return e.settle(this)}}},{"./util":36}],31:[function(t,e){"use strict";e.exports=function(e,n,r){function i(t){this.constructor$(t),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(),this._resolve(1===this.howMany()&&this._unwrap?this._values[0]: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();e0?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){"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=t.prototype._isCancelled=function(){return 65536===(65536&this._bitField)},t.prototype.isCancelled=function(){return this._target()._isCancelled()},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){"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){return p.call(t,"_promise0")}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.errorObj,u=c.isObject,p={}.hasOwnProperty;return r}},{"./util":36}],34:[function(t,e){"use strict";e.exports=function(e,n){function r(t){var e=this;return e instanceof Number&&(e=+e),clearTimeout(e),t}function i(t){var e=this;throw e instanceof Number&&(e=+e),clearTimeout(e),t}var o=t("./util"),s=e.TimeoutError,a=function(t,e,n){if(t.isPending()){var r;r="string"!=typeof e?e instanceof Error?e:new s("operation timed out"):new s(e),o.markAsOriginatingFromRejection(r),t._attachExtraTrace(r),t._reject(r),n.cancel()}},c=function(t){return l(+this).thenReturn(t)},l=e.delay=function(t,r){var i;return void 0!==r?i=e.resolve(r)._then(c,null,null,t,void 0):(i=new e(n),setTimeout(function(){i._fulfill()},+t)),i._setAsyncGuaranteed(),i};e.prototype.delay=function(t){return l(t,this)},e.prototype.timeout=function(t,e){t=+t;var n=this.then(),o=n.then(),s=setTimeout(function(){a(o,e,n)},t);return o._then(r,i,void 0,s,void 0)}}},{"./util":36}],35:[function(t,e){"use strict";e.exports=function(e,n,r,i,o,s){function a(t){setTimeout(function(){throw t},0)}function c(t){var e=r(t);return e!==t&&"function"==typeof t._isDisposable&&"function"==typeof t._getDisposer&&t._isDisposable()&&e._setDisposable(t._getDisposer()),e}function l(t,n){function i(){if(s>=l)return u._fulfill();var o=c(t[s++]);if(o instanceof e&&o._isDisposable()){try{o=r(o._getDisposer().tryDispose(n),t.promise)}catch(p){return a(p)}if(o instanceof e)return o._then(i,a,null,null,null)}i()}var s=0,l=t.length,u=new e(o);return i(),u}function u(t,e,n){this._data=t,this._promise=e,this._context=n}function p(t,e,n){this.constructor$(t,e,n)}function h(t){return u.isDisposer(t)?(this.resources[this.index]._setDisposable(t),t.promise()):t}function f(t){this.length=t,this.promise=null,this[t-1]=null}var _=t("./util"),d=t("./errors").TypeError,v=t("./util").inherits,y=_.errorObj,g=_.tryCatch;u.prototype.data=function(){return this._data},u.prototype.promise=function(){return this._promise},u.prototype.resource=function(){return this.promise().isFulfilled()?this.promise().value():null},u.prototype.tryDispose=function(t){var e=this.resource(),n=this._context;void 0!==n&&n._pushContext();var r=null!==e?this.doDispose(e,t):null;return void 0!==n&&n._popContext(),this._promise._unsetDisposable(),this._data=null,r},u.isDisposer=function(t){return null!=t&&"function"==typeof t.resource&&"function"==typeof t.tryDispose},v(p,u),p.prototype.doDispose=function(t,e){var n=this.data();return n.call(t,t,e)},f.prototype._resultCancelled=function(){for(var t=this.length,n=0;t>n;++n){var r=this[n];r instanceof e&&r.cancel()}},e.using=function(){var t=arguments.length;if(2>t)return n("you must pass at least 2 arguments to Promise.using");var i=arguments[t-1];if("function"!=typeof i)return n("expecting a function but got "+_.classString(i));var o,a=!0;2===t&&Array.isArray(arguments[0])?(o=arguments[0],t=o.length,a=!1):(o=arguments,t--);for(var c=new f(t),p=0;t>p;++p){var d=o[p];if(u.isDisposer(d)){var v=d;d=d.promise(),d._setDisposable(v)}else{var m=r(d);m instanceof e&&(d=m._then(h,null,null,{resources:c,index:p},void 0))}c[p]=d}for(var b=new Array(c.length),p=0;p0},e.prototype._getDisposer=function(){return this._disposer},e.prototype._unsetDisposable=function(){this._bitField=-131073&this._bitField,this._disposer=void 0},e.prototype.disposer=function(t){if("function"==typeof t)return new p(t,this,i());throw new d}}},{"./errors":12,"./util":36}],36:[function(t,e,n){"use strict";function r(){try{var t=E;return E=null,t.apply(this,arguments)}catch(e){return F.e=e,F}}function i(t){return E=t,r}function o(t){return null==t||t===!0||t===!1||"string"==typeof t||"number"==typeof t}function s(t){return"function"==typeof t||"object"==typeof t&&null!==t}function a(t){return o(t)?new Error(v(t)):t}function c(t,e){var n,r=t.length,i=new Array(r+1);for(n=0;r>n;++n)i[n]=t[n];return i[n]=e,i}function l(t,e,n){if(!j.isES5)return{}.hasOwnProperty.call(t,e)?t[e]:void 0;var r=Object.getOwnPropertyDescriptor(t,e);return null!=r?null==r.get&&null==r.set?r.value:n:void 0}function u(t,e,n){if(o(t))return t;var r={value:n,configurable:!0,enumerable:!1,writable:!0};return j.defineProperty(t,e,r),t}function p(t){throw t}function h(t){try{if("function"==typeof t){var e=j.names(t.prototype),n=j.isES5&&e.length>1,r=e.length>0&&!(1===e.length&&"constructor"===e[0]),i=P.test(t+"")&&j.names(t).length>0;if(n||r||i)return!0}return!1}catch(o){return!1}}function f(t){function e(){}e.prototype=t;for(var n=8;n--;)new e;return t}function _(t){return R.test(t)}function d(t,e,n){for(var r=new Array(t),i=0;t>i;++i)r[i]=e+i+n;return r}function v(t){try{return t+""}catch(e){return"[no string representation]"}}function y(t){try{u(t,"isOperational",!0)}catch(e){}}function g(t){return null==t?!1:t instanceof Error.__BluebirdErrorTypes__.OperationalError||t.isOperational===!0}function m(t){return t instanceof Error&&j.propertyIsWritable(t,"stack")}function b(t){return{}.toString.call(t)}function w(t,e,n){for(var r=j.names(t),i=0;i10||t[0]>0}(),V.isNode&&V.toFastProperties(process);try{throw new Error}catch(H){V.lastLineError=H}e.exports=V},{"./es5":13}]},{},[4])(4)}),"undefined"!=typeof window&&null!==window?window.P=window.Promise:"undefined"!=typeof self&&null!==self&&(self.P=self.Promise);
\ No newline at end of file
diff --git a/node_modules/bluebird/js/main/any.js b/node_modules/bluebird/js/release/any.js
similarity index 100%
rename from node_modules/bluebird/js/main/any.js
rename to node_modules/bluebird/js/release/any.js
diff --git a/node_modules/bluebird/js/release/assert.js b/node_modules/bluebird/js/release/assert.js
new file mode 100644
index 0000000..d2e535b
--- /dev/null
+++ b/node_modules/bluebird/js/release/assert.js
@@ -0,0 +1,55 @@
+"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($_len - 2); 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;
+};
+})();
diff --git a/node_modules/bluebird/js/release/async.js b/node_modules/bluebird/js/release/async.js
new file mode 100644
index 0000000..edfb3ba
--- /dev/null
+++ b/node_modules/bluebird/js/release/async.js
@@ -0,0 +1,157 @@
+"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._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.isStatic ? schedule(this.drainQueues) : schedule;
+}
+
+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));
+ 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 {
+ if (schedule.isStatic) {
+ schedule = function(fn) { setTimeout(fn, 0); };
+ }
+ 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.invokeFirst = function (fn, receiver, arg) {
+ this._normalQueue.unshift(fn, receiver, arg);
+ this._queueTick();
+};
+
+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;
diff --git a/node_modules/bluebird/js/release/bind.js b/node_modules/bluebird/js/release/bind.js
new file mode 100644
index 0000000..fc3379d
--- /dev/null
+++ b/node_modules/bluebird/js/release/bind.js
@@ -0,0 +1,67 @@
+"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);
+};
+};
diff --git a/node_modules/bluebird/js/release/bluebird.js b/node_modules/bluebird/js/release/bluebird.js
new file mode 100644
index 0000000..1c36cf3
--- /dev/null
+++ b/node_modules/bluebird/js/release/bluebird.js
@@ -0,0 +1,11 @@
+"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;
diff --git a/node_modules/bluebird/js/release/call_get.js b/node_modules/bluebird/js/release/call_get.js
new file mode 100644
index 0000000..e643aaa
--- /dev/null
+++ b/node_modules/bluebird/js/release/call_get.js
@@ -0,0 +1,123 @@
+"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($_len - 1); 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);
+};
+};
diff --git a/node_modules/bluebird/js/release/cancel.js b/node_modules/bluebird/js/release/cancel.js
new file mode 100644
index 0000000..5ed6bc9
--- /dev/null
+++ b/node_modules/bluebird/js/release/cancel.js
@@ -0,0 +1,125 @@
+"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();
+ 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._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();
+};
+
+};
diff --git a/node_modules/bluebird/js/release/catch_filter.js b/node_modules/bluebird/js/release/catch_filter.js
new file mode 100644
index 0000000..0f24ce2
--- /dev/null
+++ b/node_modules/bluebird/js/release/catch_filter.js
@@ -0,0 +1,42 @@
+"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;
+};
diff --git a/node_modules/bluebird/js/release/context.js b/node_modules/bluebird/js/release/context.js
new file mode 100644
index 0000000..c307414
--- /dev/null
+++ b/node_modules/bluebird/js/release/context.js
@@ -0,0 +1,69 @@
+"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;
+};
diff --git a/node_modules/bluebird/js/release/debuggability.js b/node_modules/bluebird/js/release/debuggability.js
new file mode 100644
index 0000000..9f142f0
--- /dev/null
+++ b/node_modules/bluebird/js/release/debuggability.js
@@ -0,0 +1,812 @@
+"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 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")));
+
+Promise.prototype.suppressUnhandledRejections = function() {
+ var target = this._target();
+ target._bitField = ((target._bitField & (~1048576)) |
+ 2097152);
+};
+
+Promise.prototype._ensurePossibleRejectionHandled = function () {
+ if ((this._bitField & 2097152) !== 0) return;
+ this._setRejectionIsUnhandled();
+ async.invokeLater(this._notifyUnhandledRejection, this, undefined);
+};
+
+Promise.prototype._notifyUnhandledRejectionIsHandled = function () {
+ fireRejectionEvent("rejectionHandled",
+ unhandledRejectionHandled, undefined, this);
+};
+
+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 : domain.bind(fn))
+ : undefined;
+};
+
+Promise.onUnhandledRejectionHandled = function (fn) {
+ var domain = getDomain();
+ unhandledRejectionHandled =
+ typeof fn === "function" ? (domain === null ? fn : domain.bind(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();
+};
+
+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) {
+ config.warnings = !!opts.warnings;
+ }
+ 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;
+ }
+};
+
+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) {
+ if (returnValue === undefined &&
+ promiseCreated !== null &&
+ config.longStackTraces &&
+ config.warnings) {
+ var msg = "a promise was created in a " + name +
+ " handler but was not returned from it";
+ 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");
+ }
+ 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) {
+ 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: 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);
+ }
+
+ var globalEventFired = false;
+ try {
+ globalEventFired = fireGlobalEvent(name, reason, promise);
+ } catch (e) {
+ globalEventFired = true;
+ async.throwLater(e);
+ }
+
+ var domEventFired = false;
+ if (fireDomEvent) {
+ try {
+ domEventFired = fireDomEvent(name.toLowerCase(), {
+ reason: reason,
+ promise: promise
+ });
+ } catch (e) {
+ domEventFired = true;
+ async.throwLater(e);
+ }
+ }
+
+ if (!globalEventFired && !localEventFired && !domEventFired &&
+ name === "unhandledRejection") {
+ formatAndLogError(reason, "Unhandled rejection ");
+ }
+}
+
+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;
+
+})([]);
+
+var fireDomEvent;
+var fireGlobalEvent = (function() {
+ if (util.isNode) {
+ return function(name, reason, promise) {
+ if (name === "rejectionHandled") {
+ return process.emit(name, promise);
+ } else {
+ return process.emit(name, reason, promise);
+ }
+ };
+ } else {
+ var customEventWorks = false;
+ var anyEventWorks = true;
+ try {
+ var ev = new self.CustomEvent("test");
+ customEventWorks = ev instanceof CustomEvent;
+ } catch (e) {}
+ if (!customEventWorks) {
+ try {
+ var event = document.createEvent("CustomEvent");
+ event.initCustomEvent("testingtheevent", false, true, {});
+ self.dispatchEvent(event);
+ } catch (e) {
+ anyEventWorks = false;
+ }
+ }
+ if (anyEventWorks) {
+ fireDomEvent = function(type, detail) {
+ var event;
+ if (customEventWorks) {
+ event = new self.CustomEvent(type, {
+ detail: detail,
+ bubbles: false,
+ cancelable: true
+ });
+ } else if (self.dispatchEvent) {
+ event = document.createEvent("CustomEvent");
+ event.initCustomEvent(type, false, true, detail);
+ }
+
+ return event ? !self.dispatchEvent(event) : false;
+ };
+ }
+
+ var toWindowMethodNameMap = {};
+ toWindowMethodNameMap["unhandledRejection"] = ("on" +
+ "unhandledRejection").toLowerCase();
+ toWindowMethodNameMap["rejectionHandled"] = ("on" +
+ "rejectionHandled").toLowerCase();
+
+ return function(name, reason, promise) {
+ var methodName = toWindowMethodNameMap[name];
+ var method = self[methodName];
+ if (!method) return false;
+ if (name === "rejectionHandled") {
+ method.call(self, promise);
+ } else {
+ method.call(self, reason, promise);
+ }
+ return true;
+ };
+ }
+})();
+
+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
+};
+
+if (longStackTraces) Promise.longStackTraces();
+
+return {
+ longStackTraces: function() {
+ return config.longStackTraces;
+ },
+ warnings: function() {
+ return config.warnings;
+ },
+ cancellation: function() {
+ return config.cancellation;
+ },
+ propagateFromFunction: function() {
+ return propagateFromFunction;
+ },
+ boundValueFunction: function() {
+ return boundValueFunction;
+ },
+ checkForgottenReturns: checkForgottenReturns,
+ setBounds: setBounds,
+ warn: warn,
+ deprecated: deprecated,
+ CapturedTrace: CapturedTrace
+};
+};
diff --git a/node_modules/bluebird/js/release/direct_resolve.js b/node_modules/bluebird/js/release/direct_resolve.js
new file mode 100644
index 0000000..a890298
--- /dev/null
+++ b/node_modules/bluebird/js/release/direct_resolve.js
@@ -0,0 +1,46 @@
+"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);
+ }
+};
+};
diff --git a/node_modules/bluebird/js/release/each.js b/node_modules/bluebird/js/release/each.js
new file mode 100644
index 0000000..ac8ead7
--- /dev/null
+++ b/node_modules/bluebird/js/release/each.js
@@ -0,0 +1,29 @@
+"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 this.mapSeries(fn)
+ ._then(promiseAllThis, undefined, undefined, this, undefined);
+};
+
+Promise.prototype.mapSeries = function (fn) {
+ return PromiseReduce(this, fn, INTERNAL, INTERNAL);
+};
+
+Promise.each = function (promises, fn) {
+ return PromiseMapSeries(promises, fn)
+ ._then(promiseAllThis, undefined, undefined, promises, undefined);
+};
+
+Promise.mapSeries = PromiseMapSeries;
+};
diff --git a/node_modules/bluebird/js/release/errors.js b/node_modules/bluebird/js/release/errors.js
new file mode 100644
index 0000000..ddd0525
--- /dev/null
+++ b/node_modules/bluebird/js/release/errors.js
@@ -0,0 +1,111 @@
+"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
+ });
+ notEnumerableProp(Error, "__BluebirdErrorTypes__", errorTypes);
+}
+
+module.exports = {
+ Error: Error,
+ TypeError: _TypeError,
+ RangeError: _RangeError,
+ CancellationError: errorTypes.CancellationError,
+ OperationalError: errorTypes.OperationalError,
+ TimeoutError: errorTypes.TimeoutError,
+ AggregateError: errorTypes.AggregateError,
+ Warning: Warning
+};
diff --git a/node_modules/bluebird/js/main/es5.js b/node_modules/bluebird/js/release/es5.js
similarity index 100%
rename from node_modules/bluebird/js/main/es5.js
rename to node_modules/bluebird/js/release/es5.js
diff --git a/node_modules/bluebird/js/main/filter.js b/node_modules/bluebird/js/release/filter.js
similarity index 100%
rename from node_modules/bluebird/js/main/filter.js
rename to node_modules/bluebird/js/release/filter.js
diff --git a/node_modules/bluebird/js/release/finally.js b/node_modules/bluebird/js/release/finally.js
new file mode 100644
index 0000000..0ee8b99
--- /dev/null
+++ b/node_modules/bluebird/js/release/finally.js
@@ -0,0 +1,100 @@
+"use strict";
+module.exports = function(Promise, tryConvertToPromise) {
+var util = require("./util");
+var CancellationError = Promise.CancellationError;
+var errorObj = util.errorObj;
+
+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.type === 0
+ ? handler.call(promise._boundValue())
+ : handler.call(promise._boundValue(), reasonOrValue);
+ if (ret !== undefined) {
+ 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, {
+ promise: this,
+ handler: handler,
+ called: false,
+ cancelPromise: null,
+ type: type
+ }, 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);
+};
+
+return finallyHandler;
+};
diff --git a/node_modules/bluebird/js/release/generators.js b/node_modules/bluebird/js/release/generators.js
new file mode 100644
index 0000000..d04c228
--- /dev/null
+++ b/node_modules/bluebird/js/release/generators.js
@@ -0,0 +1,204 @@
+"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) {
+ var promise = this._promise = new Promise(INTERNAL);
+ promise._captureStackTrace();
+ promise._setOnCancel(this);
+ this._stack = stack;
+ this._generatorFunction = generatorFunction;
+ this._receiver = receiver;
+ this._generator = undefined;
+ this._yieldHandlers = typeof yieldHandler === "function"
+ ? [yieldHandler].concat(yieldHandlers)
+ : yieldHandlers;
+ this._yieldedPromise = null;
+}
+util.inherits(PromiseSpawn, Proxyable);
+
+PromiseSpawn.prototype._isResolved = function() {
+ return this.promise === null;
+};
+
+PromiseSpawn.prototype._cleanup = function() {
+ this._promise = this._generator = 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();
+ if (result === errorObj && result.e === reason) {
+ result = null;
+ }
+ } else {
+ this._promise._pushContext();
+ result = tryCatch(this._generator["return"]).call(this._generator,
+ undefined);
+ this._promise._popContext();
+ }
+ var promise = this._promise;
+ this._cleanup();
+ if (result === errorObj) {
+ promise._rejectCallback(result.e, false);
+ } else {
+ promise.cancel();
+ }
+};
+
+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();
+ return promise._rejectCallback(result.e, false);
+ }
+
+ var value = result.value;
+ if (result.done === true) {
+ this._cleanup();
+ 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", 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)) {
+ this._promiseFulfilled(maybePromise._value());
+ } else if (((bitField & 16777216) !== 0)) {
+ this._promiseRejected(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;
+};
+};
diff --git a/node_modules/bluebird/js/release/join.js b/node_modules/bluebird/js/release/join.js
new file mode 100644
index 0000000..b3ec246
--- /dev/null
+++ b/node_modules/bluebird/js/release/join.js
@@ -0,0 +1,149 @@
+"use strict";
+module.exports =
+function(Promise, PromiseArray, tryConvertToPromise, INTERNAL) {
+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) { \n\
+ 'use strict'; \n\
+ function [TheName](fn) { \n\
+ [TheProperties] \n\
+ this.fn = fn; \n\
+ this.now = 0; \n\
+ } \n\
+ [TheName].prototype.checkFulfillment = function(promise) { \n\
+ var now = ++this.now; \n\
+ if (now === [TheTotal]) { \n\
+ promise._pushContext(); \n\
+ var callback = this.fn; \n\
+ var ret = tryCatch(callback)([ThePassedArguments]); \n\
+ promise._popContext(); \n\
+ if (ret === errorObj) { \n\
+ promise._rejectCallback(ret.e, false); \n\
+ } else { \n\
+ promise._resolveCallback(ret); \n\
+ } \n\
+ } \n\
+ }; \n\
+ \n\
+ [TheName].prototype._resultCancelled = function() { \n\
+ [CancellationCode] \n\
+ }; \n\
+ \n\
+ return [TheName]; \n\
+ }(tryCatch, errorObj, Promise); \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", code)
+ (tryCatch, errorObj, Promise);
+ };
+
+ 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);
+ } 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()) {
+ 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;
+};
+
+};
diff --git a/node_modules/bluebird/js/release/map.js b/node_modules/bluebird/js/release/map.js
new file mode 100644
index 0000000..24690dc
--- /dev/null
+++ b/node_modules/bluebird/js/release/map.js
@@ -0,0 +1,151 @@
+"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 EMPTY_ARRAY = [];
+
+function MappingPromiseArray(promises, fn, limit, _filter) {
+ this.constructor$(promises);
+ this._promise._captureStackTrace();
+ var domain = getDomain();
+ this._callback = domain === null ? fn : domain.bind(fn);
+ this._preservedValues = _filter === INTERNAL
+ ? new Array(this.length())
+ : null;
+ this._limit = limit;
+ this._inFlight = 0;
+ this._queue = limit >= 1 ? [] : EMPTY_ARRAY;
+ this._init$(undefined, -2);
+}
+util.inherits(MappingPromiseArray, PromiseArray);
+
+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 = typeof options === "object" && options !== null
+ ? options.concurrency
+ : 0;
+ 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);
+};
+
+
+};
diff --git a/node_modules/bluebird/js/release/method.js b/node_modules/bluebird/js/release/method.js
new file mode 100644
index 0000000..ce9e4db
--- /dev/null
+++ b/node_modules/bluebird/js/release/method.js
@@ -0,0 +1,55 @@
+"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);
+ }
+};
+};
diff --git a/node_modules/bluebird/js/release/nodeback.js b/node_modules/bluebird/js/release/nodeback.js
new file mode 100644
index 0000000..07b9f11
--- /dev/null
+++ b/node_modules/bluebird/js/release/nodeback.js
@@ -0,0 +1,51 @@
+"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($_len - 1); for(var $_i = 1; $_i < $_len; ++$_i) {args[$_i - 1] = arguments[$_i];};
+ promise._fulfill(args);
+ }
+ promise = null;
+ };
+}
+
+module.exports = nodebackForPromise;
diff --git a/node_modules/bluebird/js/release/nodeify.js b/node_modules/bluebird/js/release/nodeify.js
new file mode 100644
index 0000000..ce2b190
--- /dev/null
+++ b/node_modules/bluebird/js/release/nodeify.js
@@ -0,0 +1,58 @@
+"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;
+};
+};
diff --git a/node_modules/bluebird/js/release/promise.js b/node_modules/bluebird/js/release/promise.js
new file mode 100644
index 0000000..9fe8f54
--- /dev/null
+++ b/node_modules/bluebird/js/release/promise.js
@@ -0,0 +1,755 @@
+"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 finallyHandler = require("./finally")(Promise, tryConvertToPromise);
+var catchFilter = require("./catch_filter")(NEXT_FILTER);
+var nodebackForPromise = require("./nodeback");
+var errorObj = util.errorObj;
+var tryCatch = util.tryCatch;
+function check(self, executor) {
+ if (typeof executor !== "function") {
+ throw new TypeError("expecting a function but got " + util.classString(executor));
+ }
+ if (self.constructor !== Promise) {
+ throw new TypeError("the promise constructor cannot be invoked directly\u000a\u000a See http://goo.gl/MqrFmX\u000a");
+ }
+}
+
+function Promise(executor) {
+ this._bitField = 0;
+ this._fulfillmentHandler0 = undefined;
+ this._rejectionHandler0 = undefined;
+ this._promise0 = undefined;
+ this._receiver0 = undefined;
+ if (executor !== INTERNAL) {
+ check(this, executor);
+ this._resolveFromExecutor(executor);
+ }
+ this._promiseCreated();
+}
+
+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("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.is = function (val) {
+ return val instanceof Promise;
+};
+
+Promise.fromNode = Promise.fromCallback = function(fn) {
+ var ret = new Promise(INTERNAL);
+ 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));
+ }
+ var prev = async._schedule;
+ async._schedule = fn;
+ return prev;
+};
+
+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;
+ }
+ }
+ }
+
+ 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" && domain.bind(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;
+};
+
+Promise.prototype._setRejected = function () {
+ this._bitField = this._bitField | 16777216;
+};
+
+Promise.prototype._setFollowing = function () {
+ this._bitField = this._bitField | 67108864;
+};
+
+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;
+};
+
+Promise.prototype._setAsyncGuaranteed = function() {
+ 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 : domain.bind(fulfill);
+ }
+ if (typeof reject === "function") {
+ this._rejectionHandler0 =
+ domain === null ? reject : domain.bind(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 : domain.bind(fulfill);
+ }
+ if (typeof reject === "function") {
+ this[base + 1] =
+ domain === null ? reject : domain.bind(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();
+ 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) {
+ 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 || x === promise) {
+ var err = x === promise ? makeSelfResolutionError() : x.e;
+ promise._rejectCallback(err, false);
+ } else {
+ debug.checkForgottenReturns(x, promiseCreated, "", promise);
+ 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 (handler === finallyHandler) {
+ 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) {
+ if (((bitField & 134217728) !== 0)) {
+ this._settlePromises();
+ } else {
+ 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, debug);
+Promise.Promise = Promise;
+require('./map.js')(Promise, PromiseArray, apiRejection, tryConvertToPromise, INTERNAL, debug);
+require('./using.js')(Promise, apiRejection, tryConvertToPromise, createContext, INTERNAL, debug);
+require('./timers.js')(Promise, INTERNAL);
+require('./generators.js')(Promise, apiRejection, INTERNAL, tryConvertToPromise, Proxyable, debug);
+require('./nodeify.js')(Promise);
+require('./call_get.js')(Promise);
+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('./promisify.js')(Promise, INTERNAL);
+require('./any.js')(Promise);
+require('./each.js')(Promise, INTERNAL);
+require('./filter.js')(Promise, INTERNAL);
+
+ 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;
+
+};
diff --git a/node_modules/bluebird/js/release/promise_array.js b/node_modules/bluebird/js/release/promise_array.js
new file mode 100644
index 0000000..6400723
--- /dev/null
+++ b/node_modules/bluebird/js/release/promise_array.js
@@ -0,0 +1,184 @@
+"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 {};
+ }
+}
+
+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;
+};
diff --git a/node_modules/bluebird/js/release/promisify.js b/node_modules/bluebird/js/release/promisify.js
new file mode 100644
index 0000000..aa98e5b
--- /dev/null
+++ b/node_modules/bluebird/js/release/promisify.js
@@ -0,0 +1,314 @@
+"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);
+};
+};
+
diff --git a/node_modules/bluebird/js/release/props.js b/node_modules/bluebird/js/release/props.js
new file mode 100644
index 0000000..fc981ce
--- /dev/null
+++ b/node_modules/bluebird/js/release/props.js
@@ -0,0 +1,118 @@
+"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, -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);
+};
+};
diff --git a/node_modules/bluebird/js/main/queue.js b/node_modules/bluebird/js/release/queue.js
similarity index 100%
rename from node_modules/bluebird/js/main/queue.js
rename to node_modules/bluebird/js/release/queue.js
diff --git a/node_modules/bluebird/js/release/race.js b/node_modules/bluebird/js/release/race.js
new file mode 100644
index 0000000..b862f46
--- /dev/null
+++ b/node_modules/bluebird/js/release/race.js
@@ -0,0 +1,49 @@
+"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);
+};
+
+};
diff --git a/node_modules/bluebird/js/release/reduce.js b/node_modules/bluebird/js/release/reduce.js
new file mode 100644
index 0000000..8f73500
--- /dev/null
+++ b/node_modules/bluebird/js/release/reduce.js
@@ -0,0 +1,162 @@
+"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 : domain.bind(fn);
+ if (initialValue !== undefined) {
+ initialValue = Promise.resolve(initialValue);
+ initialValue._attachCancellationCallback(this);
+ }
+ this._initialValue = initialValue;
+ this._currentCancellable = null;
+ this._eachValues = _each === INTERNAL ? [] : undefined;
+ this._promise._captureStackTrace();
+ this._init$(undefined, -5);
+}
+util.inherits(ReductionPromiseArray, PromiseArray);
+
+ReductionPromiseArray.prototype._gotAccum = function(accum) {
+ if (this._eachValues !== undefined && accum !== INTERNAL) {
+ this._eachValues.push(accum);
+ }
+};
+
+ReductionPromiseArray.prototype._eachComplete = function(value) {
+ 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;
+}
+};
diff --git a/node_modules/bluebird/js/release/schedule.js b/node_modules/bluebird/js/release/schedule.js
new file mode 100644
index 0000000..0e3e0f5
--- /dev/null
+++ b/node_modules/bluebird/js/release/schedule.js
@@ -0,0 +1,35 @@
+"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");
+};
+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 MutationObserver !== "undefined") &&
+ !(typeof window !== "undefined" &&
+ window.navigator &&
+ window.navigator.standalone)) {
+ schedule = function(fn) {
+ var div = document.createElement("div");
+ var observer = new MutationObserver(fn);
+ observer.observe(div, {attributes: true});
+ return function() { div.classList.toggle("foo"); };
+ };
+ schedule.isStatic = true;
+} 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;
diff --git a/node_modules/bluebird/js/release/settle.js b/node_modules/bluebird/js/release/settle.js
new file mode 100644
index 0000000..fade3a1
--- /dev/null
+++ b/node_modules/bluebird/js/release/settle.js
@@ -0,0 +1,43 @@
+"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);
+};
+};
diff --git a/node_modules/bluebird/js/release/some.js b/node_modules/bluebird/js/release/some.js
new file mode 100644
index 0000000..400d852
--- /dev/null
+++ b/node_modules/bluebird/js/release/some.js
@@ -0,0 +1,148 @@
+"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;
+};
diff --git a/node_modules/bluebird/js/release/synchronous_inspection.js b/node_modules/bluebird/js/release/synchronous_inspection.js
new file mode 100644
index 0000000..fb0c1a6
--- /dev/null
+++ b/node_modules/bluebird/js/release/synchronous_inspection.js
@@ -0,0 +1,96 @@
+"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 =
+Promise.prototype._isCancelled = function() {
+ return (this._bitField & 65536) === 65536;
+};
+
+Promise.prototype.isCancelled = function() {
+ return this._target()._isCancelled();
+};
+
+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;
+};
diff --git a/node_modules/bluebird/js/release/thenables.js b/node_modules/bluebird/js/release/thenables.js
new file mode 100644
index 0000000..a04fdde
--- /dev/null
+++ b/node_modules/bluebird/js/release/thenables.js
@@ -0,0 +1,82 @@
+"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) {
+ return hasProp.call(obj, "_promise0");
+}
+
+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;
+};
diff --git a/node_modules/bluebird/js/release/timers.js b/node_modules/bluebird/js/release/timers.js
new file mode 100644
index 0000000..1e56acd
--- /dev/null
+++ b/node_modules/bluebird/js/release/timers.js
@@ -0,0 +1,66 @@
+"use strict";
+module.exports = function(Promise, INTERNAL) {
+var util = require("./util");
+var TimeoutError = Promise.TimeoutError;
+
+var afterTimeout = function (promise, message, parent) {
+ if (!promise.isPending()) return;
+ 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);
+ parent.cancel();
+};
+
+var afterValue = function(value) { return delay(+this).thenReturn(value); };
+var delay = Promise.delay = function (ms, value) {
+ var ret;
+ if (value !== undefined) {
+ ret = Promise.resolve(value)
+ ._then(afterValue, null, null, ms, undefined);
+ } else {
+ ret = new Promise(INTERNAL);
+ setTimeout(function() { ret._fulfill(); }, +ms);
+ }
+ ret._setAsyncGuaranteed();
+ return ret;
+};
+
+Promise.prototype.delay = function (ms) {
+ return delay(ms, this);
+};
+
+function successClear(value) {
+ var handle = this;
+ if (handle instanceof Number) handle = +handle;
+ clearTimeout(handle);
+ return value;
+}
+
+function failureClear(reason) {
+ var handle = this;
+ if (handle instanceof Number) handle = +handle;
+ clearTimeout(handle);
+ throw reason;
+}
+
+Promise.prototype.timeout = function (ms, message) {
+ ms = +ms;
+ var parent = this.then();
+ var ret = parent.then();
+ var handle = setTimeout(function timeoutTimeout() {
+ afterTimeout(ret, message, parent);
+ }, ms);
+ return ret._then(successClear, failureClear, undefined, handle, undefined);
+};
+
+};
diff --git a/node_modules/bluebird/js/release/using.js b/node_modules/bluebird/js/release/using.js
new file mode 100644
index 0000000..6616794
--- /dev/null
+++ b/node_modules/bluebird/js/release/using.js
@@ -0,0 +1,225 @@
+"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;
+
+ 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();
+ };
+
+};
diff --git a/node_modules/bluebird/js/release/util.js b/node_modules/bluebird/js/release/util.js
new file mode 100644
index 0000000..2f001c0
--- /dev/null
+++ b/node_modules/bluebird/js/release/util.js
@@ -0,0 +1,344 @@
+"use strict";
+var es5 = require("./es5");
+var canEvaluate = typeof navigator == "undefined";
+
+var errorObj = {e: {}};
+var tryCatchTarget;
+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 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 obj instanceof Error && 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]";
+
+function env(key, def) {
+ return isNode ? process.env[key] : def;
+}
+
+var ret = {
+ isClass: isClass,
+ isIdentifier: isIdentifier,
+ inheritedDataKeys: inheritedDataKeys,
+ getDataPropertyOrDefault: getDataPropertyOrDefault,
+ thrower: thrower,
+ isArray: es5.isArray,
+ asArray: asArray,
+ notEnumerableProp: notEnumerableProp,
+ isPrimitive: isPrimitive,
+ isObject: isObject,
+ 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,
+ env: env
+};
+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;
diff --git a/node_modules/bluebird/package.json b/node_modules/bluebird/package.json
index a7409f3..d9e1b01 100644
--- a/node_modules/bluebird/package.json
+++ b/node_modules/bluebird/package.json
@@ -1,42 +1,49 @@
{
- "name": "bluebird",
- "description": "Full featured Promises/A+ implementation with exceptionally good performance",
- "version": "2.9.24",
- "keywords": [
- "promise",
- "performance",
- "promises",
- "promises-a",
- "promises-aplus",
- "async",
- "await",
- "deferred",
- "deferreds",
- "future",
- "flow control",
- "dsl",
- "fluent interface"
+ "_args": [
+ [
+ "bluebird",
+ "/Users/akira/src/biomedjs"
+ ]
],
- "scripts": {
- "lint": "node scripts/jshint.js",
- "test": "node tools/test.js",
- "istanbul": "istanbul",
- "prepublish": "node tools/build.js --no-debug --main --zalgo --browser --minify"
+ "_from": "bluebird@*",
+ "_id": "bluebird@3.0.6",
+ "_inCache": true,
+ "_installable": true,
+ "_location": "/bluebird",
+ "_nodeVersion": "2.3.0",
+ "_npmUser": {
+ "email": "petka_antonov@hotmail.com",
+ "name": "esailija"
},
- "homepage": "https://github.com/petkaantonov/bluebird",
- "repository": {
- "type": "git",
- "url": "git://github.com/petkaantonov/bluebird.git"
+ "_npmVersion": "2.11.1",
+ "_phantomChildren": {},
+ "_requested": {
+ "name": "bluebird",
+ "raw": "bluebird",
+ "rawSpec": "",
+ "scope": null,
+ "spec": "*",
+ "type": "range"
},
+ "_requiredBy": [
+ "/"
+ ],
+ "_resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.0.6.tgz",
+ "_shasum": "f2488f325782f66d174842f481992e2faba56f38",
+ "_shrinkwrap": null,
+ "_spec": "bluebird",
+ "_where": "/Users/akira/src/biomedjs",
+ "author": {
+ "email": "petka_antonov@hotmail.com",
+ "name": "Petka Antonov",
+ "url": "http://github.com/petkaantonov/"
+ },
+ "browser": "./js/browser/bluebird.js",
"bugs": {
"url": "http://github.com/petkaantonov/bluebird/issues"
},
- "license": "MIT",
- "author": {
- "name": "Petka Antonov",
- "email": "petka_antonov@hotmail.com",
- "url": "http://github.com/petkaantonov/"
- },
+ "dependencies": {},
+ "description": "Full featured Promises/A+ implementation with exceptionally good performance",
"devDependencies": {
"acorn": "~0.6.0",
"baconjs": "^0.7.43",
@@ -52,6 +59,7 @@
"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",
@@ -62,21 +70,54 @@
"sinon": "~1.7.3",
"uglify-js": "~2.4.16"
},
- "readmeFilename": "README.md",
- "main": "./js/main/bluebird.js",
- "browser": "./js/browser/bluebird.js",
- "files": [
- "js/browser",
- "js/main",
- "js/zalgo",
- "LICENSE",
- "zalgo.js"
- ],
- "readme": "\n
\n\n[](https://travis-ci.org/petkaantonov/bluebird)\n[](http://petkaantonov.github.io/bluebird/coverage/debug/index.html)\n\n\n# Introduction\n\nBluebird is a fully featured [promise](#what-are-promises-and-why-should-i-use-them) library with focus on innovative features and performance\n\n\n\n# Topics\n\n- [Features](#features)\n- [Quick start](#quick-start)\n- [API Reference and examples](API.md)\n- [Support](#support)\n- [What are promises and why should I use them?](#what-are-promises-and-why-should-i-use-them)\n- [Questions and issues](#questions-and-issues)\n- [Error handling](#error-handling)\n- [Development](#development)\n - [Testing](#testing)\n - [Benchmarking](#benchmarks)\n - [Custom builds](#custom-builds)\n - [For library authors](#for-library-authors)\n- [What is the sync build?](#what-is-the-sync-build)\n- [License](#license)\n- [Snippets for common problems](https://github.com/petkaantonov/bluebird/wiki/Snippets)\n- [Promise anti-patterns](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns)\n- [Changelog](changelog.md)\n- [Optimization guide](#optimization-guide)\n\n# Features\n
\n\n- [Promises A+](http://promisesaplus.com)\n- [Synchronous inspection](API.md#synchronous-inspection)\n- [Concurrency coordination](API.md#collections)\n- [Promisification on steroids](API.md#promisification)\n- [Resource management through a parallel of python `with`/C# `using`](API.md#resource-management)\n- [Cancellation and timeouts](API.md#cancellation)\n- [Parallel for C# `async` and `await`](API.md#generators)\n- Mind blowing utilities such as\n - [`.bind()`](API.md#binddynamic-thisarg---promise)\n - [`.call()`](API.md#callstring-propertyname--dynamic-arg---promise)\n - [`Promise.join()`](API.md#promisejoinpromisethenablevalue-promises-function-handler---promise)\n - [And](API.md#core) [much](API.md#timers) [more](API.md#utility)!\n- [Practical debugging solutions and sane defaults](#error-handling)\n- [Sick performance](benchmark/)\n\n
\n\n# Quick start\n\n## Node.js\n\n npm install bluebird\n\nThen:\n\n```js\nvar Promise = require(\"bluebird\");\n```\n\n## Browsers\n\nThere are many ways to use bluebird in browsers:\n\n- Direct downloads\n - Full build [bluebird.js](https://cdn.jsdelivr.net/bluebird/latest/bluebird.js)\n - Full build minified [bluebird.min.js](https://cdn.jsdelivr.net/bluebird/latest/bluebird.min.js)\n- You may use browserify on the main export\n- You may use the [bower](http://bower.io) package.\n\nWhen using script tags the global variables `Promise` and `P` (alias for `Promise`) become available.\n\nA [minimal bluebird browser build](#custom-builds) is ≈38.92KB minified*, 11.65KB gzipped and has no external dependencies.\n\n*Google Closure Compiler using Simple.\n\n#### Browser support\n\nBrowsers that [implement ECMA-262, edition 3](http://en.wikipedia.org/wiki/Ecmascript#Implementations) and later are supported.\n\n[](https://saucelabs.com/u/petka_antonov)\n\n**Note** that in ECMA-262, edition 3 (IE7, IE8 etc.) it is not possible to use methods that have keyword names like `.catch` and `.finally`. The [API documentation](API.md) always lists a compatible alternative name that you can use if you need to support these browsers. For example `.catch` is replaced with `.caught` and `.finally` with `.lastly`.\n\nAlso, [long stack trace](API.md#promiselongstacktraces---void) support is only available in Chrome, Firefox and Internet Explorer 10+.\n\nAfter quick start, see [API Reference and examples](API.md)\n\n
\n\n# Support\n\n- Mailing list: [bluebird-js@googlegroups.com](https://groups.google.com/forum/#!forum/bluebird-js)\n- IRC: #promises @freenode\n- StackOverflow: [bluebird tag](http://stackoverflow.com/questions/tagged/bluebird)\n- Bugs and feature requests: [github issue tracker](https://github.com/petkaantonov/bluebird/issues?state=open)\n\n
\n\n# What are promises and why should I use them?\n\nYou should use promises to turn this:\n\n```js\nfs.readFile(\"file.json\", function(err, val) {\n if( err ) {\n console.error(\"unable to read file\");\n }\n else {\n try {\n val = JSON.parse(val);\n console.log(val.success);\n }\n catch( e ) {\n console.error(\"invalid json in file\");\n }\n }\n});\n```\n\nInto this:\n\n```js\nfs.readFileAsync(\"file.json\").then(JSON.parse).then(function(val) {\n console.log(val.success);\n})\n.catch(SyntaxError, function(e) {\n console.error(\"invalid json in file\");\n})\n.catch(function(e) {\n console.error(\"unable to read file\")\n});\n```\n\n*If you are wondering \"there is no `readFileAsync` method on `fs` that returns a promise\", see [promisification](API.md#promisification)*\n\nActually you might notice the latter has a lot in common with code that would do the same using synchronous I/O:\n\n```js\ntry {\n var val = JSON.parse(fs.readFileSync(\"file.json\"));\n console.log(val.success);\n}\n//Syntax actually not supported in JS but drives the point\ncatch(SyntaxError e) {\n console.error(\"invalid json in file\");\n}\ncatch(Error e) {\n console.error(\"unable to read file\")\n}\n```\n\nAnd that is the point - being able to have something that is a lot like `return` and `throw` in synchronous code.\n\nYou can also use promises to improve code that was written with callback helpers:\n\n\n```js\n//Copyright Plato http://stackoverflow.com/a/19385911/995876\n//CC BY-SA 2.5\nmapSeries(URLs, function (URL, done) {\n var options = {};\n needle.get(URL, options, function (error, response, body) {\n if (error) {\n return done(error)\n }\n try {\n var ret = JSON.parse(body);\n return done(null, ret);\n }\n catch (e) {\n done(e);\n }\n });\n}, function (err, results) {\n if (err) {\n console.log(err)\n } else {\n console.log('All Needle requests successful');\n // results is a 1 to 1 mapping in order of URLs > needle.body\n processAndSaveAllInDB(results, function (err) {\n if (err) {\n return done(err)\n }\n console.log('All Needle requests saved');\n done(null);\n });\n }\n});\n```\n\nIs more pleasing to the eye when done with promises:\n\n```js\nPromise.promisifyAll(needle);\nvar options = {};\n\nvar current = Promise.resolve();\nPromise.map(URLs, function(URL) {\n current = current.then(function () {\n return needle.getAsync(URL, options);\n });\n return current;\n}).map(function(responseAndBody){\n return JSON.parse(responseAndBody[1]);\n}).then(function (results) {\n return processAndSaveAllInDB(results);\n}).then(function(){\n console.log('All Needle requests saved');\n}).catch(function (e) {\n console.log(e);\n});\n```\n\nAlso promises don't just give you correspondences for synchronous features but can also be used as limited event emitters or callback aggregators.\n\nMore reading:\n\n - [Promise nuggets](https://promise-nuggets.github.io/)\n - [Why I am switching to promises](http://spion.github.io/posts/why-i-am-switching-to-promises.html)\n - [What is the the point of promises](http://domenic.me/2012/10/14/youre-missing-the-point-of-promises/#toc_1)\n - [Snippets for common problems](https://github.com/petkaantonov/bluebird/wiki/Snippets)\n - [Promise anti-patterns](https://github.com/petkaantonov/bluebird/wiki/Promise-anti-patterns)\n\n# Questions and issues\n\nIf you find a bug in bluebird or have a feature request, file an issue in the [github issue tracker](https://github.com/petkaantonov/bluebird/issues). 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`.\n\n# Error handling\n\nThis is a problem every promise library needs to handle in some way. Unhandled rejections/exceptions don't really have a good agreed-on asynchronous correspondence. The problem is that it is impossible to predict the future and know if a rejected promise will eventually be handled.\n\nThere are two common pragmatic attempts at solving the problem that promise libraries do.\n\nThe more popular one is to have the user explicitly communicate that they are done and any unhandled rejections should be thrown, like so:\n\n```js\ndownload().then(...).then(...).done();\n```\n\nFor handling this problem, in my opinion, this is completely unacceptable and pointless. The user must remember to explicitly call `.done` and that cannot be justified when the problem is forgetting to create an error handler in the first place.\n\nThe second approach, which is what bluebird by default takes, is to call a registered handler if a rejection is unhandled by the start of a second turn. The default handler is to write the stack trace to `stderr` or `console.error` in browsers. This is close to what happens with synchronous code - your code doesn't work as expected and you open console and see a stack trace. Nice.\n\nOf course this is not perfect, if your code for some reason needs to swoop in and attach error handler to some promise after the promise has been hanging around a while then you will see annoying messages. In that case you can use the `.done()` method to signal that any hanging exceptions should be thrown.\n\nIf you want to override the default handler for these possibly unhandled rejections, you can pass yours like so:\n\n```js\nPromise.onPossiblyUnhandledRejection(function(error){\n throw error;\n});\n```\n\nIf you want to also enable long stack traces, call:\n\n```js\nPromise.longStackTraces();\n```\n\nright after the library is loaded.\n\nIn node.js use the environment flag `BLUEBIRD_DEBUG`:\n\n```\nBLUEBIRD_DEBUG=1 node server.js\n```\n\nto enable long stack traces in all instances of bluebird.\n\nLong stack traces cannot be disabled after being enabled, and cannot be enabled after promises have already been created. Long stack traces imply a substantial performance penalty, even after using every trick to optimize them.\n\nLong stack traces are enabled by default in the debug build.\n\n#### Expected and unexpected errors\n\nA practical problem with Promises/A+ is that it models Javascript `try-catch` too closely for its own good. Therefore by default promises inherit `try-catch` warts such as the inability to specify the error types that the catch block is eligible for. It is an anti-pattern in every other language to use catch-all handlers because they swallow exceptions that you might not know about.\n\nNow, Javascript does have a perfectly fine and working way of creating error type hierarchies. It is still quite awkward to use them with the built-in `try-catch` however:\n\n```js\ntry {\n //code\n}\ncatch(e) {\n if( e instanceof WhatIWantError) {\n //handle\n }\n else {\n throw e;\n }\n}\n```\n\nWithout such checking, unexpected errors would be silently swallowed. However, with promises, bluebird brings the future (hopefully) here now and extends the `.catch` to [accept potential error type eligibility](API.md#catchfunction-errorclass-function-handler---promise).\n\nFor instance here it is expected that some evil or incompetent entity will try to crash our server from `SyntaxError` by providing syntactically invalid JSON:\n\n```js\ngetJSONFromSomewhere().then(function(jsonString) {\n return JSON.parse(jsonString);\n}).then(function(object) {\n console.log(\"it was valid json: \", object);\n}).catch(SyntaxError, function(e){\n console.log(\"don't be evil\");\n});\n```\n\nHere any kind of unexpected error will automatically reported on `stderr` along with a stack trace because we only register a handler for the expected `SyntaxError`.\n\nOk, so, that's pretty neat. But actually not many libraries define error types and it is in fact a complete ghetto out there with ad hoc strings being attached as some arbitrary property name like `.name`, `.type`, `.code`, not having any property at all or even throwing strings as errors and so on. So how can we still listen for expected errors?\n\nBluebird defines a special error type `OperationalError` (you can get a reference from `Promise.OperationalError`). This type of error is given as rejection reason by promisified methods when\ntheir underlying library gives an untyped, but expected error. Primitives such as strings, and error objects that are directly created like `new Error(\"database didn't respond\")` are considered untyped.\n\nExample of such library is the node core library `fs`. So if we promisify it, we can catch just the errors we want pretty easily and have programmer errors be redirected to unhandled rejection handler so that we notice them:\n\n```js\n//Read more about promisification in the API Reference:\n//API.md\nvar fs = Promise.promisifyAll(require(\"fs\"));\n\nfs.readFileAsync(\"myfile.json\").then(JSON.parse).then(function (json) {\n console.log(\"Successful json\")\n}).catch(SyntaxError, function (e) {\n console.error(\"file contains invalid json\");\n}).catch(Promise.OperationalError, function (e) {\n console.error(\"unable to read file, because: \", e.message);\n});\n```\n\nThe last `catch` handler is only invoked when the `fs` module explicitly used the `err` argument convention of async callbacks to inform of an expected error. The `OperationalError` instance will contain the original error in its `.cause` property but it does have a direct copy of the `.message` and `.stack` too. In this code any unexpected error - be it in our code or the `fs` module - would not be caught by these handlers and therefore not swallowed.\n\nSince a `catch` handler typed to `Promise.OperationalError` is expected to be used very often, it has a neat shorthand:\n\n```js\n.error(function (e) {\n console.error(\"unable to read file, because: \", e.message);\n});\n```\n\nSee [API documentation for `.error()`](API.md#error-rejectedhandler----promise)\n\nFinally, Bluebird also supports predicate-based filters. If you pass a\npredicate function instead of an error type, the predicate will receive\nthe error as an argument. The return result will be used to determine whether\nthe error handler should be called.\n\nPredicates should allow for very fine grained control over caught errors:\npattern matching, error typesets with set operations and many other techniques\ncan be implemented on top of them.\n\nExample of using a predicate-based filter:\n\n```js\nvar Promise = require(\"bluebird\");\nvar request = Promise.promisify(require(\"request\"));\n\nfunction clientError(e) {\n return e.code >= 400 && e.code < 500;\n}\n\nrequest(\"http://www.google.com\").then(function(contents){\n console.log(contents);\n}).catch(clientError, function(e){\n //A client error like 400 Bad Request happened\n});\n```\n\n**Danger:** The JavaScript language allows throwing primitive values like strings. Throwing primitives can lead to worse or no stack traces. Primitives [are not exceptions](http://www.devthought.com/2011/12/22/a-string-is-not-an-error/). You should consider always throwing Error objects when handling exceptions.\n\n
\n\n#### How do long stack traces differ from e.g. Q?\n\nBluebird attempts to have more elaborate traces. Consider:\n\n```js\nError.stackTraceLimit = 25;\nQ.longStackSupport = true;\nQ().then(function outer() {\n return Q().then(function inner() {\n return Q().then(function evenMoreInner() {\n a.b.c.d();\n }).catch(function catcher(e){\n console.error(e.stack);\n });\n })\n});\n```\n\nYou will see\n\n ReferenceError: a is not defined\n at evenMoreInner (:7:13)\n From previous event:\n at inner (:6:20)\n\nCompare to:\n\n```js\nError.stackTraceLimit = 25;\nPromise.longStackTraces();\nPromise.resolve().then(function outer() {\n return Promise.resolve().then(function inner() {\n return Promise.resolve().then(function evenMoreInner() {\n a.b.c.d()\n }).catch(function catcher(e){\n console.error(e.stack);\n });\n });\n});\n```\n\n ReferenceError: a is not defined\n at evenMoreInner (:7:13)\n From previous event:\n at inner (:6:36)\n From previous event:\n at outer (:5:32)\n From previous event:\n at :4:21\n at Object.InjectedScript._evaluateOn (:572:39)\n at Object.InjectedScript._evaluateAndWrap (:531:52)\n at Object.InjectedScript.evaluate (:450:21)\n\n\nA better and more practical example of the differences can be seen in gorgikosev's [debuggability competition](https://github.com/spion/async-compare#debuggability).\n\n
\n\n# Development\n\nFor development tasks such as running benchmarks or testing, you need to clone the repository and install dev-dependencies.\n\nInstall [node](http://nodejs.org/) and [npm](https://npmjs.org/)\n\n git clone git@github.com:petkaantonov/bluebird.git\n cd bluebird\n npm install\n\n## Testing\n\nTo run all tests, run\n\n node tools/test\n\nIf you need to run generator tests run the `tool/test.js` script with `--harmony` argument and node 0.11+:\n\n node-dev --harmony tools/test\n\nYou may specify an individual test file to run with the `--run` script flag:\n\n node tools/test --run=cancel.js\n\n\nThis enables output from the test and may give a better idea where the test is failing. The paramter to `--run` can be any file name located in `test/mocha` folder.\n\n#### Testing in browsers\n\nTo run the test in a browser instead of node, pass the flag `--browser` to the test tool\n\n node tools/test --run=cancel.js --browser\n\nThis will automatically create a server (default port 9999) and open it in your default browser once the tests have been compiled.\n\nKeep the test tab active because some tests are timing-sensitive and will fail if the browser is throttling timeouts. Chrome will do this for example when the tab is not active.\n\n#### Supported options by the test tool\n\nThe value of boolean flags is determined by presence, if you want to pass false value for a boolean flag, use the `no-`-prefix e.g. `--no-browser`.\n\n - `--run=String`. Which tests to run (or compile when testing in browser). Default `\"all\"`. Can also be a glob string (relative to ./test/mocha folder)\n - `--cover=String`. Create code coverage using the String as istanbul reporter. Coverage is created in the ./coverage folder. No coverage is created by default, default reporter is `\"html\"` (use `--cover` to use default reporter).\n - `--browser` - Whether to compile tests for browsers. Default `false`.\n - `--port=Number` - Whe port where local server is hosted when testing in browser. Default `9999`\n - `--execute-browser-tests` - Whether to execute the compiled tests for browser when using `--browser`. Default `true`.\n - `--open-browser` - Whether to open the default browser when executing browser tests. Default `true`.\n - `--fake-timers` - Whether to use fake timers (`setTimeout` etc) when running tests in node. Default `true`.\n - `--js-hint` - Whether to run JSHint on source files. Default `true`.\n - `--saucelabs` Wheter to create a tunnel to sauce labs and run tests in their VMs instead of your browser when compiling tests for browser.Default `false`.\n\n## Benchmarks\n\nTo run a benchmark, run the given command for a benchmark while on the project root. Requires bash (on windows the mingw32 that comes with git works fine too).\n\nNode 0.11.2+ is required to run the generator examples.\n\n### 1\\. DoxBee sequential\n\nCurrently the most relevant benchmark is @gorkikosev's benchmark in the article [Analysis of generators and other async patterns in node](http://spion.github.io/posts/analysis-generators-and-other-async-patterns-node.html). The benchmark emulates a situation where n amount of users are making a request in parallel to execute some mixed async/sync action. The benchmark has been modified to include a warm-up phase to minimize any JITing during timed sections.\n\nCommand: `bench doxbee`\n\n### 2\\. Made-up parallel\n\nThis made-up scenario runs 15 shimmed queries in parallel.\n\nCommand: `bench parallel`\n\n## Custom builds\n\nCustom builds for browsers are supported through a command-line utility.\n\n\n\n\n\nMake sure you have cloned the repo somewhere and did `npm install` successfully.\n\nAfter that you can run:\n\n node tools/build --features=\"core\"\n\n\nThe above builds the most minimal build you can get. You can add more features separated by spaces from the above list:\n\n node tools/build --features=\"core filter map reduce\"\n\nThe custom build file will be found from `/js/browser/bluebird.js`. It will have a comment that lists the disabled and enabled features.\n\nNote that the build leaves the `/js/main` etc folders with same features so if you use the folder for node.js at the same time, don't forget to build\na full version afterwards (after having taken a copy of the bluebird.js somewhere):\n\n node tools/build --debug --main --zalgo --browser --minify\n\n#### Supported options by the build tool\n\nThe value of boolean flags is determined by presence, if you want to pass false value for a boolean flag, use the `no-`-prefix e.g. `--no-debug`.\n\n - `--main` - Whether to build the main build. The main build is placed at `js/main` directory. Default `false`.\n - `--debug` - Whether to build the debug build. The debug build is placed at `js/debug` directory. Default `false`.\n - `--zalgo` - Whether to build the zalgo build. The zalgo build is placed at `js/zalgo` directory. Default `false`.\n - `--browser` - Whether to compile the browser build. The browser build file is placed at `js/browser/bluebird.js` Default `false`.\n - `--minify` - Whether to minify the compiled browser build. The minified browser build file is placed at `js/browser/bluebird.min.js` Default `true`.\n - `--features=String` - See [custom builds](#custom-builds)\n\n
\n\n## For library authors\n\nBuilding a library that depends on bluebird? You should know about a few features.\n\nIf your library needs to do something obtrusive like adding or modifying methods on the `Promise` prototype, uses long stack traces or uses a custom unhandled rejection handler then... that's totally ok as long as you don't use `require(\"bluebird\")`. Instead you should create a file\nthat creates an isolated copy. For example, creating a file called `bluebird-extended.js` that contains:\n\n```js\n //NOTE the function call right after\nmodule.exports = require(\"bluebird/js/main/promise\")();\n```\n\nYour library can then use `var Promise = require(\"bluebird-extended\");` and do whatever it wants with it. Then if the application or other library uses their own bluebird promises they will all play well together because of Promises/A+ thenable assimilation magic.\n\nYou should also know about [`.nodeify()`](API.md#nodeifyfunction-callback---promise) which makes it easy to provide a dual callback/promise API.\n\n
\n\n## What is the sync build?\n\nYou may now use sync build by:\n\n var Promise = require(\"bluebird/zalgo\");\n\nThe sync build is provided to see how forced asynchronity affects benchmarks. It should not be used in real code due to the implied hazards.\n\nThe normal async build gives Promises/A+ guarantees about asynchronous resolution of promises. Some people think this affects performance or just plain love their code having a possibility\nof stack overflow errors and non-deterministic behavior.\n\nThe sync build skips the async call trampoline completely, e.g code like:\n\n async.invoke( this.fn, this, val );\n\nAppears as this in the sync build:\n\n this.fn(val);\n\nThis should pressure the CPU slightly less and thus the sync build should perform better. Indeed it does, but only marginally. The biggest performance boosts are from writing efficient Javascript, not from compromising determinism.\n\nNote that while some benchmarks are waiting for the next event tick, the CPU is actually not in use during that time. So the resulting benchmark result is not completely accurate because on node.js you only care about how much the CPU is taxed. Any time spent on CPU is time the whole process (or server) is paralyzed. And it is not graceful like it would be with threads.\n\n\n```js\nvar cache = new Map(); //ES6 Map or DataStructures/Map or whatever...\nfunction getResult(url) {\n var resolver = Promise.pending();\n if (cache.has(url)) {\n resolver.resolve(cache.get(url));\n }\n else {\n http.get(url, function(err, content) {\n if (err) resolver.reject(err);\n else {\n cache.set(url, content);\n resolver.resolve(content);\n }\n });\n }\n return resolver.promise;\n}\n\n\n\n//The result of console.log is truly random without async guarantees\nfunction guessWhatItPrints( url ) {\n var i = 3;\n getResult(url).then(function(){\n i = 4;\n });\n console.log(i);\n}\n```\n\n# Optimization guide\n\nArticles about optimization will be periodically posted in [the wiki section](https://github.com/petkaantonov/bluebird/wiki), polishing edits are welcome.\n\nA single cohesive guide compiled from the articles will probably be done eventually.\n\n# License\n\nThe MIT License (MIT)\n\nCopyright (c) 2014 Petka Antonov\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n",
- "_id": "bluebird@2.9.24",
+ "directories": {},
"dist": {
- "shasum": "ab3f30a7a40c383d14779a63b53aad667cc98ffb"
+ "shasum": "f2488f325782f66d174842f481992e2faba56f38",
+ "tarball": "http://registry.npmjs.org/bluebird/-/bluebird-3.0.6.tgz"
},
- "_from": "bluebird@",
- "_resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.24.tgz"
+ "files": [
+ "LICENSE",
+ "js/browser",
+ "js/release"
+ ],
+ "gitHead": "37393eae4b6c8a48d16b357768e624ce2b347cac",
+ "homepage": "https://github.com/petkaantonov/bluebird",
+ "keywords": [
+ "async",
+ "await",
+ "deferred",
+ "deferreds",
+ "dsl",
+ "flow control",
+ "fluent interface",
+ "future",
+ "performance",
+ "promise",
+ "promises",
+ "promises-a",
+ "promises-aplus"
+ ],
+ "license": "MIT",
+ "main": "./js/release/bluebird.js",
+ "maintainers": [
+ {
+ "name": "esailija",
+ "email": "petka_antonov@hotmail.com"
+ }
+ ],
+ "name": "bluebird",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "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",
+ "istanbul": "istanbul",
+ "lint": "node scripts/jshint.js",
+ "prepublish": "node tools/build.js --no-debug --release --browser --minify",
+ "test": "node tools/test.js"
+ },
+ "version": "3.0.6"
}
diff --git a/node_modules/colors/.travis.yml b/node_modules/colors/.travis.yml
new file mode 100644
index 0000000..ec43125
--- /dev/null
+++ b/node_modules/colors/.travis.yml
@@ -0,0 +1,6 @@
+language: node_js
+node_js:
+ - "0.11"
+ - "0.10"
+ - "0.8"
+ - "0.6"
\ No newline at end of file
diff --git a/node_modules/colors/MIT-LICENSE.txt b/node_modules/colors/MIT-LICENSE.txt
new file mode 100644
index 0000000..3de4e33
--- /dev/null
+++ b/node_modules/colors/MIT-LICENSE.txt
@@ -0,0 +1,23 @@
+Original Library
+ - Copyright (c) Marak Squires
+
+Additional Functionality
+ - Copyright (c) Sindre Sorhus (sindresorhus.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.
\ No newline at end of file
diff --git a/node_modules/colors/ReadMe.md b/node_modules/colors/ReadMe.md
new file mode 100644
index 0000000..beb5b14
--- /dev/null
+++ b/node_modules/colors/ReadMe.md
@@ -0,0 +1,167 @@
+# colors.js
+
+## get color and style in your node.js console
+
+
+
+## Installation
+
+ npm install colors
+
+## colors and styles!
+
+### text colors
+
+ - black
+ - red
+ - green
+ - yellow
+ - blue
+ - magenta
+ - cyan
+ - white
+ - gray
+ - grey
+
+### background colors
+
+
+
+ - bgBlack
+ - bgRed
+ - bgGreen
+ - bgYellow
+ - bgBlue
+ - bgMagenta
+ - bgCyan
+ - bgWhite
+
+### styles
+
+ - reset
+ - bold
+ - dim
+ - italic
+ - underline
+ - inverse
+ - hidden
+ - strikethrough
+
+### extras
+
+ - rainbow
+ - zebra
+ - america
+ - trap
+ - random
+
+
+## Usage
+
+By popular demand, `colors` now ships with two types of usages!
+
+The super nifty way
+
+```js
+var colors = require('colors');
+
+console.log('hello'.green); // outputs green text
+console.log('i like cake and pies'.underline.red) // outputs red underlined text
+console.log('inverse the color'.inverse); // inverses the color
+console.log('OMG Rainbows!'.rainbow); // rainbow
+console.log('Run the trap'.trap); // Drops the bass
+
+```
+
+or a slightly less nifty way which doesn't extend `String.prototype`
+
+```js
+var colors = require('colors/safe');
+
+console.log(colors.green('hello')); // outputs green text
+console.log(colors.red.underline('i like cake and pies')) // outputs red underlined text
+console.log(colors.inverse('inverse the color')); // inverses the color
+console.log(colors.rainbow('OMG Rainbows!')); // rainbow
+console.log(colors.trap('Run the trap')); // Drops the bass
+
+```
+
+I prefer the first way. Some people seem to be afraid of extending `String.prototype` and prefer the second way.
+
+If you are writing good code you will never have an issue with the first approach. If you really don't want to touch `String.prototype`, the second usage will not touch `String` native object.
+
+## Disabling Colors
+
+To disable colors you can pass the following arguments in the command line to your application:
+
+```bash
+node myapp.js --no-color
+```
+
+## Console.log [string substitution](http://nodejs.org/docs/latest/api/console.html#console_console_log_data)
+
+```js
+var name = 'Marak';
+console.log(colors.green('Hello %s'), name);
+// outputs -> 'Hello Marak'
+```
+
+## Custom themes
+
+### Using standard API
+
+```js
+
+var colors = require('colors');
+
+colors.setTheme({
+ silly: 'rainbow',
+ input: 'grey',
+ verbose: 'cyan',
+ prompt: 'grey',
+ info: 'green',
+ data: 'grey',
+ help: 'cyan',
+ warn: 'yellow',
+ debug: 'blue',
+ error: 'red'
+});
+
+// outputs red text
+console.log("this is an error".error);
+
+// outputs yellow text
+console.log("this is a warning".warn);
+```
+
+### Using string safe API
+
+```js
+var colors = require('colors/safe');
+
+// set single property
+var error = colors.red;
+error('this is red');
+
+// set theme
+colors.setTheme({
+ silly: 'rainbow',
+ input: 'grey',
+ verbose: 'cyan',
+ prompt: 'grey',
+ info: 'green',
+ data: 'grey',
+ help: 'cyan',
+ warn: 'yellow',
+ debug: 'blue',
+ error: 'red'
+});
+
+// outputs red text
+console.log(colors.error("this is an error"));
+
+// outputs yellow text
+console.log(colors.warn("this is a warning"));
+```
+
+*Protip: There is a secret undocumented style in `colors`. If you find the style you can summon him.*
\ No newline at end of file
diff --git a/node_modules/colors/examples/normal-usage.js b/node_modules/colors/examples/normal-usage.js
new file mode 100644
index 0000000..2818741
--- /dev/null
+++ b/node_modules/colors/examples/normal-usage.js
@@ -0,0 +1,74 @@
+var colors = require('../lib/index');
+
+console.log("First some yellow text".yellow);
+
+console.log("Underline that text".yellow.underline);
+
+console.log("Make it bold and red".red.bold);
+
+console.log(("Double Raindows All Day Long").rainbow)
+
+console.log("Drop the bass".trap)
+
+console.log("DROP THE RAINBOW BASS".trap.rainbow)
+
+
+console.log('Chains are also cool.'.bold.italic.underline.red); // styles not widely supported
+
+console.log('So '.green + 'are'.underline + ' ' + 'inverse'.inverse + ' styles! '.yellow.bold); // styles not widely supported
+console.log("Zebras are so fun!".zebra);
+
+//
+// Remark: .strikethrough may not work with Mac OS Terminal App
+//
+console.log("This is " + "not".strikethrough + " fun.");
+
+console.log('Background color attack!'.black.bgWhite)
+console.log('Use random styles on everything!'.random)
+console.log('America, Heck Yeah!'.america)
+
+
+console.log('Setting themes is useful')
+
+//
+// Custom themes
+//
+console.log('Generic logging theme as JSON'.green.bold.underline);
+// Load theme with JSON literal
+colors.setTheme({
+ silly: 'rainbow',
+ input: 'grey',
+ verbose: 'cyan',
+ prompt: 'grey',
+ info: 'green',
+ data: 'grey',
+ help: 'cyan',
+ warn: 'yellow',
+ debug: 'blue',
+ error: 'red'
+});
+
+// outputs red text
+console.log("this is an error".error);
+
+// outputs yellow text
+console.log("this is a warning".warn);
+
+// outputs grey text
+console.log("this is an input".input);
+
+console.log('Generic logging theme as file'.green.bold.underline);
+
+// Load a theme from file
+colors.setTheme(__dirname + '/../themes/generic-logging.js');
+
+// outputs red text
+console.log("this is an error".error);
+
+// outputs yellow text
+console.log("this is a warning".warn);
+
+// outputs grey text
+console.log("this is an input".input);
+
+//console.log("Don't summon".zalgo)
\ No newline at end of file
diff --git a/node_modules/colors/examples/safe-string.js b/node_modules/colors/examples/safe-string.js
new file mode 100644
index 0000000..111b363
--- /dev/null
+++ b/node_modules/colors/examples/safe-string.js
@@ -0,0 +1,76 @@
+var colors = require('../safe');
+
+console.log(colors.yellow("First some yellow text"));
+
+console.log(colors.yellow.underline("Underline that text"));
+
+console.log(colors.red.bold("Make it bold and red"));
+
+console.log(colors.rainbow("Double Raindows All Day Long"))
+
+console.log(colors.trap("Drop the bass"))
+
+console.log(colors.rainbow(colors.trap("DROP THE RAINBOW BASS")));
+
+console.log(colors.bold.italic.underline.red('Chains are also cool.')); // styles not widely supported
+
+
+console.log(colors.green('So ') + colors.underline('are') + ' ' + colors.inverse('inverse') + colors.yellow.bold(' styles! ')); // styles not widely supported
+
+console.log(colors.zebra("Zebras are so fun!"));
+
+console.log("This is " + colors.strikethrough("not") + " fun.");
+
+
+console.log(colors.black.bgWhite('Background color attack!'));
+console.log(colors.random('Use random styles on everything!'))
+console.log(colors.america('America, Heck Yeah!'));
+
+console.log('Setting themes is useful')
+
+//
+// Custom themes
+//
+//console.log('Generic logging theme as JSON'.green.bold.underline);
+// Load theme with JSON literal
+colors.setTheme({
+ silly: 'rainbow',
+ input: 'grey',
+ verbose: 'cyan',
+ prompt: 'grey',
+ info: 'green',
+ data: 'grey',
+ help: 'cyan',
+ warn: 'yellow',
+ debug: 'blue',
+ error: 'red'
+});
+
+// outputs red text
+console.log(colors.error("this is an error"));
+
+// outputs yellow text
+console.log(colors.warn("this is a warning"));
+
+// outputs grey text
+console.log(colors.input("this is an input"));
+
+
+// console.log('Generic logging theme as file'.green.bold.underline);
+
+// Load a theme from file
+colors.setTheme(__dirname + '/../themes/generic-logging.js');
+
+// outputs red text
+console.log(colors.error("this is an error"));
+
+// outputs yellow text
+console.log(colors.warn("this is a warning"));
+
+// outputs grey text
+console.log(colors.input("this is an input"));
+
+// console.log(colors.zalgo("Don't summon him"))
+
+
+
diff --git a/node_modules/colors/lib/colors.js b/node_modules/colors/lib/colors.js
new file mode 100644
index 0000000..59898de
--- /dev/null
+++ b/node_modules/colors/lib/colors.js
@@ -0,0 +1,176 @@
+/*
+
+The MIT License (MIT)
+
+Original Library
+ - Copyright (c) Marak Squires
+
+Additional functionality
+ - Copyright (c) Sindre Sorhus (sindresorhus.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.
+
+*/
+
+var colors = {};
+module['exports'] = colors;
+
+colors.themes = {};
+
+var ansiStyles = colors.styles = require('./styles');
+var defineProps = Object.defineProperties;
+
+colors.supportsColor = require('./system/supports-colors');
+
+if (typeof colors.enabled === "undefined") {
+ colors.enabled = colors.supportsColor;
+}
+
+colors.stripColors = colors.strip = function(str){
+ return ("" + str).replace(/\x1B\[\d+m/g, '');
+};
+
+
+var stylize = colors.stylize = function stylize (str, style) {
+ return ansiStyles[style].open + str + ansiStyles[style].close;
+}
+
+var matchOperatorsRe = /[|\\{}()[\]^$+*?.]/g;
+var escapeStringRegexp = function (str) {
+ if (typeof str !== 'string') {
+ throw new TypeError('Expected a string');
+ }
+ return str.replace(matchOperatorsRe, '\\$&');
+}
+
+function build(_styles) {
+ var builder = function builder() {
+ return applyStyle.apply(builder, arguments);
+ };
+ builder._styles = _styles;
+ // __proto__ is used because we must return a function, but there is
+ // no way to create a function with a different prototype.
+ builder.__proto__ = proto;
+ return builder;
+}
+
+var styles = (function () {
+ var ret = {};
+ ansiStyles.grey = ansiStyles.gray;
+ Object.keys(ansiStyles).forEach(function (key) {
+ ansiStyles[key].closeRe = new RegExp(escapeStringRegexp(ansiStyles[key].close), 'g');
+ ret[key] = {
+ get: function () {
+ return build(this._styles.concat(key));
+ }
+ };
+ });
+ return ret;
+})();
+
+var proto = defineProps(function colors() {}, styles);
+
+function applyStyle() {
+ var args = arguments;
+ var argsLen = args.length;
+ var str = argsLen !== 0 && String(arguments[0]);
+ if (argsLen > 1) {
+ for (var a = 1; a < argsLen; a++) {
+ str += ' ' + args[a];
+ }
+ }
+
+ if (!colors.enabled || !str) {
+ return str;
+ }
+
+ var nestedStyles = this._styles;
+
+ var i = nestedStyles.length;
+ while (i--) {
+ var code = ansiStyles[nestedStyles[i]];
+ str = code.open + str.replace(code.closeRe, code.open) + code.close;
+ }
+
+ return str;
+}
+
+function applyTheme (theme) {
+ for (var style in theme) {
+ (function(style){
+ colors[style] = function(str){
+ return colors[theme[style]](str);
+ };
+ })(style)
+ }
+}
+
+colors.setTheme = function (theme) {
+ if (typeof theme === 'string') {
+ try {
+ colors.themes[theme] = require(theme);
+ applyTheme(colors.themes[theme]);
+ return colors.themes[theme];
+ } catch (err) {
+ console.log(err);
+ return err;
+ }
+ } else {
+ applyTheme(theme);
+ }
+};
+
+function init() {
+ var ret = {};
+ Object.keys(styles).forEach(function (name) {
+ ret[name] = {
+ get: function () {
+ return build([name]);
+ }
+ };
+ });
+ return ret;
+}
+
+var sequencer = function sequencer (map, str) {
+ var exploded = str.split(""), i = 0;
+ exploded = exploded.map(map);
+ return exploded.join("");
+};
+
+// custom formatter methods
+colors.trap = require('./custom/trap');
+colors.zalgo = require('./custom/zalgo');
+
+// maps
+colors.maps = {};
+colors.maps.america = require('./maps/america');
+colors.maps.zebra = require('./maps/zebra');
+colors.maps.rainbow = require('./maps/rainbow');
+colors.maps.random = require('./maps/random')
+
+for (var map in colors.maps) {
+ (function(map){
+ colors[map] = function (str) {
+ return sequencer(colors.maps[map], str);
+ }
+ })(map)
+}
+
+defineProps(colors, init());
\ No newline at end of file
diff --git a/node_modules/colors/lib/custom/trap.js b/node_modules/colors/lib/custom/trap.js
new file mode 100644
index 0000000..3f09143
--- /dev/null
+++ b/node_modules/colors/lib/custom/trap.js
@@ -0,0 +1,45 @@
+module['exports'] = function runTheTrap (text, options) {
+ var result = "";
+ text = text || "Run the trap, drop the bass";
+ text = text.split('');
+ var trap = {
+ a: ["\u0040", "\u0104", "\u023a", "\u0245", "\u0394", "\u039b", "\u0414"],
+ b: ["\u00df", "\u0181", "\u0243", "\u026e", "\u03b2", "\u0e3f"],
+ c: ["\u00a9", "\u023b", "\u03fe"],
+ d: ["\u00d0", "\u018a", "\u0500" , "\u0501" ,"\u0502", "\u0503"],
+ e: ["\u00cb", "\u0115", "\u018e", "\u0258", "\u03a3", "\u03be", "\u04bc", "\u0a6c"],
+ f: ["\u04fa"],
+ g: ["\u0262"],
+ h: ["\u0126", "\u0195", "\u04a2", "\u04ba", "\u04c7", "\u050a"],
+ i: ["\u0f0f"],
+ j: ["\u0134"],
+ k: ["\u0138", "\u04a0", "\u04c3", "\u051e"],
+ l: ["\u0139"],
+ m: ["\u028d", "\u04cd", "\u04ce", "\u0520", "\u0521", "\u0d69"],
+ n: ["\u00d1", "\u014b", "\u019d", "\u0376", "\u03a0", "\u048a"],
+ o: ["\u00d8", "\u00f5", "\u00f8", "\u01fe", "\u0298", "\u047a", "\u05dd", "\u06dd", "\u0e4f"],
+ p: ["\u01f7", "\u048e"],
+ q: ["\u09cd"],
+ r: ["\u00ae", "\u01a6", "\u0210", "\u024c", "\u0280", "\u042f"],
+ s: ["\u00a7", "\u03de", "\u03df", "\u03e8"],
+ t: ["\u0141", "\u0166", "\u0373"],
+ u: ["\u01b1", "\u054d"],
+ v: ["\u05d8"],
+ w: ["\u0428", "\u0460", "\u047c", "\u0d70"],
+ x: ["\u04b2", "\u04fe", "\u04fc", "\u04fd"],
+ y: ["\u00a5", "\u04b0", "\u04cb"],
+ z: ["\u01b5", "\u0240"]
+ }
+ text.forEach(function(c){
+ c = c.toLowerCase();
+ var chars = trap[c] || [" "];
+ var rand = Math.floor(Math.random() * chars.length);
+ if (typeof trap[c] !== "undefined") {
+ result += trap[c][rand];
+ } else {
+ result += c;
+ }
+ });
+ return result;
+
+}
diff --git a/node_modules/colors/lib/custom/zalgo.js b/node_modules/colors/lib/custom/zalgo.js
new file mode 100644
index 0000000..4dc20c8
--- /dev/null
+++ b/node_modules/colors/lib/custom/zalgo.js
@@ -0,0 +1,104 @@
+// please no
+module['exports'] = function zalgo(text, options) {
+ text = text || " he is here ";
+ var soul = {
+ "up" : [
+ '̍', '̎', '̄', '̅',
+ '̿', '̑', '̆', '̐',
+ '͒', '͗', '͑', '̇',
+ '̈', '̊', '͂', '̓',
+ '̈', '͊', '͋', '͌',
+ '̃', '̂', '̌', '͐',
+ '̀', '́', '̋', '̏',
+ '̒', '̓', '̔', '̽',
+ '̉', 'ͣ', 'ͤ', 'ͥ',
+ 'ͦ', 'ͧ', 'ͨ', 'ͩ',
+ 'ͪ', 'ͫ', 'ͬ', 'ͭ',
+ 'ͮ', 'ͯ', '̾', '͛',
+ '͆', '̚'
+ ],
+ "down" : [
+ '̖', '̗', '̘', '̙',
+ '̜', '̝', '̞', '̟',
+ '̠', '̤', '̥', '̦',
+ '̩', '̪', '̫', '̬',
+ '̭', '̮', '̯', '̰',
+ '̱', '̲', '̳', '̹',
+ '̺', '̻', '̼', 'ͅ',
+ '͇', '͈', '͉', '͍',
+ '͎', '͓', '͔', '͕',
+ '͖', '͙', '͚', '̣'
+ ],
+ "mid" : [
+ '̕', '̛', '̀', '́',
+ '͘', '̡', '̢', '̧',
+ '̨', '̴', '̵', '̶',
+ '͜', '͝', '͞',
+ '͟', '͠', '͢', '̸',
+ '̷', '͡', ' ҉'
+ ]
+ },
+ all = [].concat(soul.up, soul.down, soul.mid),
+ zalgo = {};
+
+ function randomNumber(range) {
+ var r = Math.floor(Math.random() * range);
+ return r;
+ }
+
+ function is_char(character) {
+ var bool = false;
+ all.filter(function (i) {
+ bool = (i === character);
+ });
+ return bool;
+ }
+
+
+ function heComes(text, options) {
+ var result = '', counts, l;
+ options = options || {};
+ options["up"] = options["up"] || true;
+ options["mid"] = options["mid"] || true;
+ options["down"] = options["down"] || true;
+ options["size"] = options["size"] || "maxi";
+ text = text.split('');
+ for (l in text) {
+ if (is_char(l)) {
+ continue;
+ }
+ result = result + text[l];
+ counts = {"up" : 0, "down" : 0, "mid" : 0};
+ switch (options.size) {
+ case 'mini':
+ counts.up = randomNumber(8);
+ counts.min = randomNumber(2);
+ counts.down = randomNumber(8);
+ break;
+ case 'maxi':
+ counts.up = randomNumber(16) + 3;
+ counts.min = randomNumber(4) + 1;
+ counts.down = randomNumber(64) + 3;
+ break;
+ default:
+ counts.up = randomNumber(8) + 1;
+ counts.mid = randomNumber(6) / 2;
+ counts.down = randomNumber(8) + 1;
+ break;
+ }
+
+ var arr = ["up", "mid", "down"];
+ for (var d in arr) {
+ var index = arr[d];
+ for (var i = 0 ; i <= counts[index]; i++) {
+ if (options[index]) {
+ result = result + soul[index][randomNumber(soul[index].length)];
+ }
+ }
+ }
+ }
+ return result;
+ }
+ // don't summon him
+ return heComes(text);
+}
diff --git a/node_modules/colors/lib/extendStringPrototype.js b/node_modules/colors/lib/extendStringPrototype.js
new file mode 100644
index 0000000..b6b5b03
--- /dev/null
+++ b/node_modules/colors/lib/extendStringPrototype.js
@@ -0,0 +1,118 @@
+var colors = require('./colors'),
+ styles = require('./styles');
+
+module['exports'] = function () {
+
+ //
+ // Extends prototype of native string object to allow for "foo".red syntax
+ //
+ var addProperty = function (color, func) {
+ String.prototype.__defineGetter__(color, func);
+ };
+
+ var sequencer = function sequencer (map, str) {
+ return function () {
+ var exploded = this.split(""), i = 0;
+ exploded = exploded.map(map);
+ return exploded.join("");
+ }
+ };
+
+ var stylize = function stylize (str, style) {
+ return styles[style].open + str + styles[style].close;
+ }
+
+ addProperty('strip', function () {
+ return colors.strip(this);
+ });
+
+ addProperty('stripColors', function () {
+ return colors.strip(this);
+ });
+
+ addProperty("trap", function(){
+ return colors.trap(this);
+ });
+
+ addProperty("zalgo", function(){
+ return colors.zalgo(this);
+ });
+
+ addProperty("zebra", function(){
+ return colors.zebra(this);
+ });
+
+ addProperty("rainbow", function(){
+ return colors.rainbow(this);
+ });
+
+ addProperty("random", function(){
+ return colors.random(this);
+ });
+
+ addProperty("america", function(){
+ return colors.america(this);
+ });
+
+ //
+ // Iterate through all default styles and colors
+ //
+ var x = Object.keys(colors.styles);
+ x.forEach(function (style) {
+ addProperty(style, function () {
+ return stylize(this, style);
+ });
+ });
+
+ function applyTheme(theme) {
+ //
+ // Remark: This is a list of methods that exist
+ // on String that you should not overwrite.
+ //
+ var stringPrototypeBlacklist = [
+ '__defineGetter__', '__defineSetter__', '__lookupGetter__', '__lookupSetter__', 'charAt', 'constructor',
+ 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf', 'charCodeAt',
+ 'indexOf', 'lastIndexof', 'length', 'localeCompare', 'match', 'replace', 'search', 'slice', 'split', 'substring',
+ 'toLocaleLowerCase', 'toLocaleUpperCase', 'toLowerCase', 'toUpperCase', 'trim', 'trimLeft', 'trimRight'
+ ];
+
+ Object.keys(theme).forEach(function (prop) {
+ if (stringPrototypeBlacklist.indexOf(prop) !== -1) {
+ console.log('warn: '.red + ('String.prototype' + prop).magenta + ' is probably something you don\'t want to override. Ignoring style name');
+ }
+ else {
+ if (typeof(theme[prop]) === 'string') {
+ colors[prop] = colors[theme[prop]];
+ addProperty(prop, function () {
+ return colors[theme[prop]](this);
+ });
+ }
+ else {
+ addProperty(prop, function () {
+ var ret = this;
+ for (var t = 0; t < theme[prop].length; t++) {
+ ret = exports[theme[prop][t]](ret);
+ }
+ return ret;
+ });
+ }
+ }
+ });
+ }
+
+ colors.setTheme = function (theme) {
+ if (typeof theme === 'string') {
+ try {
+ colors.themes[theme] = require(theme);
+ applyTheme(colors.themes[theme]);
+ return colors.themes[theme];
+ } catch (err) {
+ console.log(err);
+ return err;
+ }
+ } else {
+ applyTheme(theme);
+ }
+ };
+
+};
\ No newline at end of file
diff --git a/node_modules/colors/lib/index.js b/node_modules/colors/lib/index.js
new file mode 100644
index 0000000..96d2b84
--- /dev/null
+++ b/node_modules/colors/lib/index.js
@@ -0,0 +1,12 @@
+var colors = require('./colors');
+module['exports'] = colors;
+
+// Remark: By default, colors will add style properties to String.prototype
+//
+// If you don't wish to extend String.prototype you can do this instead and native String will not be touched
+//
+// var colors = require('colors/safe);
+// colors.red("foo")
+//
+//
+var extendStringPrototype = require('./extendStringPrototype')();
\ No newline at end of file
diff --git a/node_modules/colors/lib/maps/america.js b/node_modules/colors/lib/maps/america.js
new file mode 100644
index 0000000..a07d832
--- /dev/null
+++ b/node_modules/colors/lib/maps/america.js
@@ -0,0 +1,12 @@
+var colors = require('../colors');
+
+module['exports'] = (function() {
+ return function (letter, i, exploded) {
+ if(letter === " ") return letter;
+ switch(i%3) {
+ case 0: return colors.red(letter);
+ case 1: return colors.white(letter)
+ case 2: return colors.blue(letter)
+ }
+ }
+})();
\ No newline at end of file
diff --git a/node_modules/colors/lib/maps/rainbow.js b/node_modules/colors/lib/maps/rainbow.js
new file mode 100644
index 0000000..a7ce24e
--- /dev/null
+++ b/node_modules/colors/lib/maps/rainbow.js
@@ -0,0 +1,13 @@
+var colors = require('../colors');
+
+module['exports'] = (function () {
+ var rainbowColors = ['red', 'yellow', 'green', 'blue', 'magenta']; //RoY G BiV
+ return function (letter, i, exploded) {
+ if (letter === " ") {
+ return letter;
+ } else {
+ return colors[rainbowColors[i++ % rainbowColors.length]](letter);
+ }
+ };
+})();
+
diff --git a/node_modules/colors/lib/maps/random.js b/node_modules/colors/lib/maps/random.js
new file mode 100644
index 0000000..5cd101f
--- /dev/null
+++ b/node_modules/colors/lib/maps/random.js
@@ -0,0 +1,8 @@
+var colors = require('../colors');
+
+module['exports'] = (function () {
+ var available = ['underline', 'inverse', 'grey', 'yellow', 'red', 'green', 'blue', 'white', 'cyan', 'magenta'];
+ return function(letter, i, exploded) {
+ return letter === " " ? letter : colors[available[Math.round(Math.random() * (available.length - 1))]](letter);
+ };
+})();
\ No newline at end of file
diff --git a/node_modules/colors/lib/maps/zebra.js b/node_modules/colors/lib/maps/zebra.js
new file mode 100644
index 0000000..bf7dcde
--- /dev/null
+++ b/node_modules/colors/lib/maps/zebra.js
@@ -0,0 +1,5 @@
+var colors = require('../colors');
+
+module['exports'] = function (letter, i, exploded) {
+ return i % 2 === 0 ? letter : colors.inverse(letter);
+};
\ No newline at end of file
diff --git a/node_modules/colors/lib/styles.js b/node_modules/colors/lib/styles.js
new file mode 100644
index 0000000..067d590
--- /dev/null
+++ b/node_modules/colors/lib/styles.js
@@ -0,0 +1,77 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.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.
+
+*/
+
+var styles = {};
+module['exports'] = styles;
+
+var codes = {
+ reset: [0, 0],
+
+ bold: [1, 22],
+ dim: [2, 22],
+ italic: [3, 23],
+ underline: [4, 24],
+ inverse: [7, 27],
+ hidden: [8, 28],
+ strikethrough: [9, 29],
+
+ 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],
+ grey: [90, 39],
+
+ bgBlack: [40, 49],
+ bgRed: [41, 49],
+ bgGreen: [42, 49],
+ bgYellow: [43, 49],
+ bgBlue: [44, 49],
+ bgMagenta: [45, 49],
+ bgCyan: [46, 49],
+ bgWhite: [47, 49],
+
+ // legacy styles for colors pre v1.0.0
+ blackBG: [40, 49],
+ redBG: [41, 49],
+ greenBG: [42, 49],
+ yellowBG: [43, 49],
+ blueBG: [44, 49],
+ magentaBG: [45, 49],
+ cyanBG: [46, 49],
+ whiteBG: [47, 49]
+
+};
+
+Object.keys(codes).forEach(function (key) {
+ var val = codes[key];
+ var style = styles[key] = [];
+ style.open = '\u001b[' + val[0] + 'm';
+ style.close = '\u001b[' + val[1] + 'm';
+});
\ No newline at end of file
diff --git a/node_modules/colors/lib/system/supports-colors.js b/node_modules/colors/lib/system/supports-colors.js
new file mode 100644
index 0000000..3e008aa
--- /dev/null
+++ b/node_modules/colors/lib/system/supports-colors.js
@@ -0,0 +1,61 @@
+/*
+The MIT License (MIT)
+
+Copyright (c) Sindre Sorhus (sindresorhus.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.
+
+*/
+
+var argv = process.argv;
+
+module.exports = (function () {
+ if (argv.indexOf('--no-color') !== -1 ||
+ argv.indexOf('--color=false') !== -1) {
+ return false;
+ }
+
+ if (argv.indexOf('--color') !== -1 ||
+ argv.indexOf('--color=true') !== -1 ||
+ argv.indexOf('--color=always') !== -1) {
+ return true;
+ }
+
+ if (process.stdout && !process.stdout.isTTY) {
+ return false;
+ }
+
+ if (process.platform === 'win32') {
+ return true;
+ }
+
+ if ('COLORTERM' in process.env) {
+ return true;
+ }
+
+ if (process.env.TERM === 'dumb') {
+ return false;
+ }
+
+ if (/^screen|^xterm|^vt100|color|ansi|cygwin|linux/i.test(process.env.TERM)) {
+ return true;
+ }
+
+ return false;
+})();
\ No newline at end of file
diff --git a/node_modules/colors/package.json b/node_modules/colors/package.json
new file mode 100644
index 0000000..f626e56
--- /dev/null
+++ b/node_modules/colors/package.json
@@ -0,0 +1,79 @@
+{
+ "_args": [
+ [
+ "colors@1.0.x",
+ "/Users/akira/src/biomedjs/node_modules/winston"
+ ]
+ ],
+ "_from": "colors@>=1.0.0 <1.1.0",
+ "_id": "colors@1.0.3",
+ "_inCache": true,
+ "_installable": true,
+ "_location": "/colors",
+ "_nodeVersion": "0.11.13",
+ "_npmUser": {
+ "email": "marak.squires@gmail.com",
+ "name": "marak"
+ },
+ "_npmVersion": "2.0.2",
+ "_phantomChildren": {},
+ "_requested": {
+ "name": "colors",
+ "raw": "colors@1.0.x",
+ "rawSpec": "1.0.x",
+ "scope": null,
+ "spec": ">=1.0.0 <1.1.0",
+ "type": "range"
+ },
+ "_requiredBy": [
+ "/winston"
+ ],
+ "_resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
+ "_shasum": "0433f44d809680fdeb60ed260f1b0c262e82a40b",
+ "_shrinkwrap": null,
+ "_spec": "colors@1.0.x",
+ "_where": "/Users/akira/src/biomedjs/node_modules/winston",
+ "author": {
+ "name": "Marak Squires"
+ },
+ "bugs": {
+ "url": "https://github.com/Marak/colors.js/issues"
+ },
+ "dependencies": {},
+ "description": "get colors in your node.js console",
+ "devDependencies": {},
+ "directories": {},
+ "dist": {
+ "shasum": "0433f44d809680fdeb60ed260f1b0c262e82a40b",
+ "tarball": "http://registry.npmjs.org/colors/-/colors-1.0.3.tgz"
+ },
+ "engines": {
+ "node": ">=0.1.90"
+ },
+ "gitHead": "e9e6557cc0fa26dba1a20b0d45e92de982f4047c",
+ "homepage": "https://github.com/Marak/colors.js",
+ "keywords": [
+ "ansi",
+ "colors",
+ "terminal"
+ ],
+ "license": "MIT",
+ "main": "./lib/index",
+ "maintainers": [
+ {
+ "name": "marak",
+ "email": "marak.squires@gmail.com"
+ }
+ ],
+ "name": "colors",
+ "optionalDependencies": {},
+ "readme": "ERROR: No README data found!",
+ "repository": {
+ "type": "git",
+ "url": "git+ssh://git@github.com/Marak/colors.js.git"
+ },
+ "scripts": {
+ "test": "node tests/basic-test.js && node tests/safe-test.js"
+ },
+ "version": "1.0.3"
+}
diff --git a/node_modules/colors/safe.js b/node_modules/colors/safe.js
new file mode 100644
index 0000000..a6a1f3a
--- /dev/null
+++ b/node_modules/colors/safe.js
@@ -0,0 +1,9 @@
+//
+// Remark: Requiring this file will use the "safe" colors API which will not touch String.prototype
+//
+// var colors = require('colors/safe);
+// colors.red("foo")
+//
+//
+var colors = require('./lib/colors');
+module['exports'] = colors;
\ No newline at end of file
diff --git a/node_modules/colors/screenshots/colors.png b/node_modules/colors/screenshots/colors.png
new file mode 100644
index 0000000000000000000000000000000000000000..7200a623590c35e8b4a8e74a8df49a42998ca9c5
GIT binary patch
literal 79787
zcmZ^~V{~RgurB<@wrx#p+nFS9oJ?%nwylXKnAo;$+qP|ebMT#e*1GHNU)@#pRPCx>
ztM}^aXGbW=OCrGH!U6yQ1ZgQTB>(`F0{{Rih6ep7p@odZ0RXV6EJQ^Wq(w!E6&&qM
zEv!ud01cQ*4>!J)?eFi_D~s#S=PfV0x@T*L_4^^4WJQ?}Y8aec5fqtzXle7m#uVf*
zh2b(JIJf+6`=4LlgxlNC-P@1u8_SO!y2l>6$1b|Z+Q%JJ=aBy8*~lm;k%j=`Xlyyh
z4HNR6t6D99APkc~7%>3C99lpTCG_cOY3IA6D^7^ABYQm2ice5@O$K1VQy>6b575#J|Ra2{p#(02es-8l?%)x6@hW+*8TF^>Ju^g+wH64eIt*Cv1bgCV?ARB-QR9Ga
zz3{pqc7=Qg=Xkqfiwuxr%!0X9D
zl>p0sZLYApo!Zm;7+wNss6WNo<_j(ji^K?i-|+<{O8edB@N9iAyliu%2e{3Ef%xIT
zvculPYWbaiuN!63Oo5xlvi3{o&Cj@;FgQcCL2X8Mfq~CF&&r+XKJc@A87*(CK`V$n
z!LIfz_P~11A`N_al6~1+cXy!QBkjjQ^3d?8?m%0i2t(7sy%j?&>#0F~GSV~0?;>cy
zhiaGm4eiJ2U^AcSs79kmV7=kIVfTmbg4SVUoH&R^3*dvPQh&Okf46hi^?au`8~Hs_
zfOmv_LPtIEVj~=*G9ku=lR-d$OTc0GEzSWYdIC?#sL1{n{4D_;v0_XI>#5tXX2&o%
z|5nHJ#RF7&axL3@|9;&8F-L~H)h5bK*h{7LG#l7qdq%@Q06wm;<@k=myX*!D05Gz94d-fcKI$K(qEm+>qskv*iVw6MKf!7{+js5{6@;`XeV`
zlcR8l8WXRMcod+QirA7&N!(#-4diR64Km~4Nnu9K59t_FaL6;efG;7^^J*#
zAS;YPbU9CJN839#TZA!hnVAcoRRTZ;Cpm||A9&j|$^_M7dJjnN{-!op(E9Kqae
zUSi&KPHk4;Z&tyl@USeEq?z#X&r~sWv1KVvvFG&cMBU`Acwa#uJ|99K0w2LoQZR}j
z>>y^afL$h06j9cG>i!>Otofw*1V-5VG((m{ghSkvd`Z|zG)au}4n>YdP_lOEvlD$2
zLlXiM!)c7Hf`-{9y|v->8a3ec#x>ezr$)aFO$=2HTuk^!GzUE6Tp|%BDThpZF~?j(
zFFDqs*CBZs+ezAq-ld;3pGcnA5p5B{5CvnMWAX4Axj48Wxa7D+xuzYrcD*MQ!P;aP+=&EE@dfSD=8{-E&EbYRwpZ6ESoHkD)B1CDvz_Q
zF<-IDoI6<>u*9{Xv}m%dvMRL@x7u8K%cCzR$kVChFD9$nFLwHMTv-**Al$6tCIb|j
z{&}6amE84LK)74hZ%AmRXZdg6PEc-vLCr3E|Fi_G1bIGWKD!b9zUa^;rFoJLIiB_&;2vz3L)WgGI<;Od
zai`f%UZ&4wS8}VobwKa!ULXGV)~B$m?qlg|>6?oCKF?MURWBQq3uu#IRXezA!)pp6
zqa5!X2tBZE?QIW1oo?%Hq_4KG)h{QIHV|%*`+&CqkANuQA>reoF33Mndhoh%wQ!~I
zt1vEbohTA0M;J@8#-yRhM4|T~MDRq>@v%}7X^{(&d|0hwb)>3dB#Q5O8F|0-23WS@^JkG7`)e-kAMs_N^^s8B1VskXQX+
z+V#rD_)Mzau+cE59zlAKd_lLVdlu&?>#rw?yU7@u#!|0&%K1)KdDiN!w+D(pU(CNB#Ce;la~hm*4NK)m%9Qel+4{t~z>LnO&qBtc&E&~s8S0)Bvzl(WLZU*_ddOPxGW0Ts
z7oHoD8-X{jwZqltxM`>BqP8>4k#S#O=o3C0UKbvm(hiddQIAlN#4iF6B2-EIXXhk7
zaVE@wsQ;8qg;YnXR*`#_)6mn<4AFY1c3_-5jlz>Kk~cHS`Ez7H-!9P)-;9ssw_);G
zf&`BTPbX#m^Fp(1HtW)_u<0c;#-qrb`-$;UKb0C+-MW!{uF8X{kky~Eg>NP#hsBI~
zt#fM3ny;0SO`2sxADTUn3u|R~Ks(>oN!?<->+Sei4X@&Ai`tOAD*f^y{&kM!_t;Ag
z0?aH*BzVFzzB%`b4T^30&HnZJN8^Ljn5|?pueXCY*SB}bDWo?f8h)th;V?YCgJ`kn
zwHTTXWA9czfx9x3y}9$`(HhPv<+b@h)|d3bX0YosGq^1(-xbbc)@lCkF9+jX+uMoa
z_-Ru;@a_vb8$UF?Ck^gqp4y@ZGBY1DR#PjF_ns+4d_Ow<5av88YEY-}AC9QM#9H%1
zXWsQcoI%e0jfOh=xAR*>eu@2-)RDdScMZ}FBZ;^rVa*WFVGpQG`9z?C!`k@mq2xjP
z+V)}wE&$hsg^Srm+Bz$IMHU^t{vGC1KQn}Vc4w{;usj&
z_#^dvK@tpk>3y&P6O&*Y`{UfQ8^X0@{7{q+yyYSpx8J$yUp#*0@mMBB*PX)skNS*u-u;KO7}Yr|~Z^4)eYdmDUg
zfg%R3iSUVRhwzFcMvX*
z)E?(TaLqIOd+zre*JbbM)B_ZbPH}b?;bx8}cV3XV!i-FX4x^rpsMd{rrRWl6V)NOJ=KnCdi!VZy$$n?Fn1V
z@2S;PFI4BnL=%ZeP=bOwv%j_}$?xWss#~@n*^`tk+1eyy{J%MKiZi@`CE3$yhOAeh4%1BHT8az{W?x_y}2*%X^v{ftw4dPE(>3qFWLYl;jP|d(a`>raLipAlxMQ#
z{Dpj^fen6t0dpdC-0qYU`x7d~bM0RZ+d9+ha7@$>hYoqs%P^*C2>vbL
zOG#VFuM#|SbMqgTqn1BUrOsr|q|e9kN^s9`({Xq+E;td`f3EyC&^1;xTD5$f@SHm;
zCm70}7ap4J8C~R_pcrgixXga1jhp1>^Ll)Ky#hX4-)i2a+}u9VKj9(iBRRv3ArT@S
z!rfD