From 44bcc5baa24ab42444fa73383d205ce3cc4b33b8 Mon Sep 17 00:00:00 2001 From: Gavin Joyce Date: Tue, 13 Feb 2018 09:36:39 +0000 Subject: [PATCH] upgrade to Ember 2.18.2 --- .jshintrc | 1 + bower.json | 2 +- ember-model.js | 2 +- package-lock.json | 3855 +++++++++++++++++ packages/ember-model/lib/belongs_to.js | 12 +- packages/ember-model/lib/has_many.js | 13 +- packages/ember-model/lib/has_many_array.js | 18 +- packages/ember-model/lib/model.js | 67 +- packages/ember-model/lib/record_array.js | 7 +- packages/ember-model/lib/store.js | 36 +- .../tests/adapter/rest_adapter_test.js | 36 +- packages/ember-model/tests/belongs_to_test.js | 29 +- packages/ember-model/tests/has_many_test.js | 17 +- packages/ember-model/tests/model_test.js | 131 +- .../ember-model/tests/record_array_test.js | 23 +- packages/ember-model/tests/store_test.js | 99 +- tests/runner.html.tmpl | 5 +- ...ct_assertion_helper.js => test_helpers.js} | 14 + 18 files changed, 4138 insertions(+), 229 deletions(-) create mode 100644 package-lock.json rename tests/{expect_assertion_helper.js => test_helpers.js} (82%) diff --git a/.jshintrc b/.jshintrc index a1571fc..1ffcdac 100644 --- a/.jshintrc +++ b/.jshintrc @@ -25,6 +25,7 @@ "expect", "minispade", "expectAssertion", + "createOwner", "QUnit" ], diff --git a/bower.json b/bower.json index e788651..576512f 100644 --- a/bower.json +++ b/bower.json @@ -3,7 +3,7 @@ "version": "0.0.18", "main": "ember-model.js", "dependencies": { - "ember": "2.8.3" + "ember": "2.18.2" }, "devDependencies": { "qunit": "~2.5" diff --git a/ember-model.js b/ember-model.js index 948a03a..0a25002 100644 --- a/ember-model.js +++ b/ember-model.js @@ -2128,4 +2128,4 @@ Ember.onLoad('Ember.Application', function(Application) { }); -})(); \ No newline at end of file +})(); diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..bf3b8e1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3855 @@ +{ + "name": "ember-model", + "version": "0.0.18", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.0.3.tgz", + "integrity": "sha1-krHbDU89tHsFMN9uFa6X21FNwvg=", + "dev": true, + "requires": { + "mime": "1.2.11", + "negotiator": "0.4.6" + } + }, + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.3.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "readable-stream": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=", + "dev": true + }, + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", + "dev": true + }, + "assert-plus": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.2.tgz", + "integrity": "sha1-2T/9u2esVQd3m+MWp9ZRRkF77vg=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "aws-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.3.0.tgz", + "integrity": "sha1-PYHKabR0seFlGHKLUcJP8Lvtxuk=", + "dev": true + }, + "backbone": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz", + "integrity": "sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk=", + "dev": true, + "requires": { + "underscore": "1.8.3" + }, + "dependencies": { + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=", + "dev": true + } + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base64-arraybuffer": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz", + "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=", + "dev": true + }, + "base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=", + "dev": true + }, + "basic-auth-connect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", + "integrity": "sha1-/bC0OWLKe0BFanwrtI/hc9otISI=", + "dev": true + }, + "batch": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.0.tgz", + "integrity": "sha1-/S4Fp6XWlrTbkxQBPihdj/NVfsM=", + "dev": true + }, + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "dev": true, + "requires": { + "callsite": "1.0.0" + } + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=", + "dev": true + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "body-parser": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.14.2.tgz", + "integrity": "sha1-EBXLH+LEQ4WCWVgdtTMy+NDPUPk=", + "dev": true, + "requires": { + "bytes": "2.2.0", + "content-type": "1.0.4", + "debug": "2.2.0", + "depd": "1.1.2", + "http-errors": "1.3.1", + "iconv-lite": "0.4.13", + "on-finished": "2.3.0", + "qs": "5.2.0", + "raw-body": "2.1.7", + "type-is": "1.6.16" + }, + "dependencies": { + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=", + "dev": true + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "dev": true + } + } + }, + "boom": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", + "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", + "dev": true, + "requires": { + "hoek": "0.9.1" + }, + "dependencies": { + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "buffer-crc32": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.1.tgz", + "integrity": "sha1-vj5TgvwCttYySVasGvmKqYsIU0w=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bytes": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-0.2.0.tgz", + "integrity": "sha1-qtM+wU49wsp06OfUUfm6BTrU96A=", + "dev": true + }, + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "charm": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/charm/-/charm-1.0.2.tgz", + "integrity": "sha1-it02cVOm2aWBMxBSxAkJkdqZXjU=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "cli": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", + "integrity": "sha1-ePlIXNFhtWbppsctcXDEJw6B22E=", + "dev": true, + "requires": { + "glob": "3.2.11" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "coffeescript": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/coffeescript/-/coffeescript-1.10.0.tgz", + "integrity": "sha1-56qDAZF+9iGzXYo580jc3R234z4=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", + "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", + "dev": true, + "requires": { + "delayed-stream": "0.0.5" + } + }, + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-1.1.0.tgz", + "integrity": "sha1-Ek2Ke7oYoFpBCi8lutQTsblK/2c=", + "dev": true + }, + "compression": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.0.7.tgz", + "integrity": "sha1-/Ev/Jh3043oTAAby2yqZo0iW9Vo=", + "dev": true, + "requires": { + "accepts": "1.0.3", + "bytes": "1.0.0", + "compressible": "1.1.0", + "on-headers": "0.0.0", + "vary": "0.1.0" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "connect": { + "version": "2.7.11", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.7.11.tgz", + "integrity": "sha1-9WHV7vcLjXGcOX9yTTS6QGXHej4=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.1", + "bytes": "0.2.0", + "cookie": "0.0.5", + "cookie-signature": "1.0.1", + "debug": "3.1.0", + "formidable": "1.0.14", + "fresh": "0.1.0", + "pause": "0.0.1", + "qs": "0.6.5", + "send": "0.1.1" + } + }, + "connect-timeout": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.1.0.tgz", + "integrity": "sha1-/IBhX8els4Y70DGa8kkdLX/cXwU=", + "dev": true, + "requires": { + "debug": "0.8.1" + }, + "dependencies": { + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", + "dev": true + } + } + }, + "console-browserify": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-0.1.6.tgz", + "integrity": "sha1-0SijwLuINQ61YmxufHGm8P1ImDw=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "consolidate": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/consolidate/-/consolidate-0.14.5.tgz", + "integrity": "sha1-WiUEe8dvcwcmZ8jLUsmJiI9JTGM=", + "dev": true, + "requires": { + "bluebird": "3.5.1" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.0.5.tgz", + "integrity": "sha1-+az521frdWjJ/MWWJWt7si4wfIE=", + "dev": true + }, + "cookie-jar": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.3.0.tgz", + "integrity": "sha1-vJon1OK5fhhs1XyeIGPLmfpozMw=", + "dev": true + }, + "cookie-parser": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.1.0.tgz", + "integrity": "sha1-L4JlqjtVczqF7vIH8OJTDD6M9wU=", + "dev": true, + "requires": { + "cookie": "0.1.2", + "cookie-signature": "1.0.3" + }, + "dependencies": { + "cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.3.tgz", + "integrity": "sha1-kc2ZfMUftkFZVzjGnNoCAyj1D/k=", + "dev": true + } + } + }, + "cookie-signature": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.1.tgz", + "integrity": "sha1-ROByFIrwHm6OJK+/EmkNaK5pjss=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.2.14" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + } + } + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "dev": true, + "requires": { + "boom": "0.4.2" + } + }, + "csrf-tokens": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/csrf-tokens/-/csrf-tokens-1.0.4.tgz", + "integrity": "sha1-SWclaLJwM0hkTqyvYc29wFS6VvI=", + "dev": true, + "requires": { + "rndm": "1.2.0", + "scmp": "0.0.3", + "uid2": "0.0.3" + } + }, + "csurf": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.2.1.tgz", + "integrity": "sha1-OSj6I3WS7Vgkp8Ih2Fgb81ap2nY=", + "dev": true, + "requires": { + "csrf-tokens": "1.0.4" + } + }, + "ctype": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.2.tgz", + "integrity": "sha1-/oCR1Gijc6Cwyf+Lv7NCXACXOh0=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "delayed-stream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", + "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "engine.io": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.8.0.tgz", + "integrity": "sha1-PutfJky3XbvsG6rqJtYfWk6s4qo=", + "dev": true, + "requires": { + "accepts": "1.3.3", + "base64id": "0.1.0", + "cookie": "0.3.1", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "ws": "1.1.1" + }, + "dependencies": { + "accepts": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.3.tgz", + "integrity": "sha1-w8p0NJOGSMPg2cHjKN1otiLChMo=", + "dev": true, + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + } + } + }, + "engine.io-client": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.8.0.tgz", + "integrity": "sha1-e3MOQSdBQIdZbZvjyI0rxf22z1w=", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "component-inherit": "0.0.3", + "debug": "2.3.3", + "engine.io-parser": "1.3.1", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parsejson": "0.0.3", + "parseqs": "0.0.5", + "parseuri": "0.0.5", + "ws": "1.1.1", + "xmlhttprequest-ssl": "1.5.3", + "yeast": "0.1.2" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.3.1.tgz", + "integrity": "sha1-lVTxrjMQfW+9FwylRm0vgz9qB88=", + "dev": true, + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.5", + "blob": "0.0.4", + "has-binary": "0.1.6", + "wtf-8": "1.0.0" + }, + "dependencies": { + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "errorhandler": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.0.2.tgz", + "integrity": "sha1-WH1Hu7vEjP/hMsOs2nIVyQJVgQg=", + "dev": true + }, + "escape-html": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.1.tgz", + "integrity": "sha1-GBoobq05ejmpKFfPsdQwUuNWv/A=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "eventemitter3": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", + "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "dev": true + }, + "events-to-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/events-to-array/-/events-to-array-1.1.2.tgz", + "integrity": "sha1-LUH1Y+H+QA7Uli/hpNXGp1Od9/Y=", + "dev": true + }, + "execa": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.9.0.tgz", + "integrity": "sha512-BbUMBiX4hqiHZUA5+JujIjNb6TyAlp2D5KLheMjMluwOuzcnylDL4AxZYLLn1n2AGB49eSWwyKvvEQoRpnAtmA==", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "0.3.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "1.1.2", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.3", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.16", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, + "requires": { + "mime-types": "2.1.18", + "negotiator": "0.6.1" + } + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.2", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.16" + } + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cookie": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "2.0.3", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + }, + "dependencies": { + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.2", + "destroy": "1.0.4", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, + "requires": { + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + } + } + }, + "express-session": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.2.1.tgz", + "integrity": "sha1-J0GhZh6zpKF6fbCkgEn78FV05GU=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.1", + "cookie": "0.1.2", + "cookie-signature": "1.0.3", + "debug": "0.8.1", + "on-headers": "0.0.0", + "uid2": "0.0.3", + "utils-merge": "1.0.0" + }, + "dependencies": { + "cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.3.tgz", + "integrity": "sha1-kc2ZfMUftkFZVzjGnNoCAyj1D/k=", + "dev": true + }, + "debug": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.8.1.tgz", + "integrity": "sha1-IP9NJvXkIstoobrLu2EDmtjBwTA=", + "dev": true + } + } + }, + "falafel": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-0.1.6.tgz", + "integrity": "sha1-MITPPUG1nRXIE75vJZVX/cgrBmA=", + "dev": true, + "requires": { + "esprima": "1.0.4" + }, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "dev": true + } + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": "0.7.0" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.2", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + } + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "requires": { + "glob": "5.0.15" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + } + } + }, + "finished": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/finished/-/finished-1.2.2.tgz", + "integrity": "sha1-QWCOr639ZWg7RqEiC8Sx7D2u3Ng=", + "dev": true, + "requires": { + "ee-first": "1.0.3" + }, + "dependencies": { + "ee-first": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.0.3.tgz", + "integrity": "sha1-bJjECJq+y1p7hcGsRJqmA9Oz2r4=", + "dev": true + } + } + }, + "fireworm": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/fireworm/-/fireworm-0.7.1.tgz", + "integrity": "sha1-zPIPeUHxCIg/zduZOD2+bhhhx1g=", + "dev": true, + "requires": { + "async": "0.2.10", + "is-type": "0.0.1", + "lodash.debounce": "3.1.1", + "lodash.flatten": "3.0.2", + "minimatch": "3.0.4" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + } + } + }, + "forever-agent": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", + "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", + "dev": true + }, + "form-data": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.8.tgz", + "integrity": "sha1-CJDNEAXFzOzAudJKiAUskkQtDbU=", + "dev": true, + "requires": { + "async": "0.2.10", + "combined-stream": "0.0.7", + "mime": "1.2.11" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + }, + "formidable": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", + "integrity": "sha1-Kz9MQRy7X91pXESEPiojUUpDIxo=", + "dev": true + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fresh": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.1.0.tgz", + "integrity": "sha1-A+SwF4Qk5MLV0ZpU2IFM3JeTSFA=", + "dev": true + }, + "fs-tools": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/fs-tools/-/fs-tools-0.2.11.tgz", + "integrity": "sha1-ZKYzkRn42mh75NH9vaN+4PiOZEw=", + "dev": true, + "requires": { + "async": "0.2.10", + "lodash": "2.4.2" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + } + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "requires": { + "aproba": "1.2.0", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true, + "requires": { + "globule": "1.2.0" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "minimatch": "0.3.0" + } + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "requires": { + "glob": "7.1.2", + "lodash": "4.17.5", + "minimatch": "3.0.4" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growly": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz", + "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=", + "dev": true + }, + "grunt": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", + "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", + "dev": true, + "requires": { + "coffeescript": "1.10.0", + "dateformat": "1.0.12", + "eventemitter2": "0.4.14", + "exit": "0.1.2", + "findup-sync": "0.3.0", + "glob": "7.0.6", + "grunt-cli": "1.2.0", + "grunt-known-options": "1.1.0", + "grunt-legacy-log": "1.0.0", + "grunt-legacy-util": "1.0.0", + "iconv-lite": "0.4.19", + "js-yaml": "3.5.5", + "minimatch": "3.0.4", + "nopt": "3.0.6", + "path-is-absolute": "1.0.1", + "rimraf": "2.2.8" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "grunt-cli": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "dev": true, + "requires": { + "findup-sync": "0.3.0", + "grunt-known-options": "1.1.0", + "nopt": "3.0.6", + "resolve": "1.1.7" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + } + } + }, + "grunt-contrib-clean": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-0.4.1.tgz", + "integrity": "sha1-f49G4vKnGH6cLQg6swJiqmpk4zQ=", + "dev": true + }, + "grunt-contrib-connect": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-connect/-/grunt-contrib-connect-0.3.0.tgz", + "integrity": "sha1-H6JTU/GtgLeSKIdYI1+v+YtYPKU=", + "dev": true, + "requires": { + "connect": "2.7.11" + } + }, + "grunt-contrib-copy": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-0.4.1.tgz", + "integrity": "sha1-8HU7QK4hu3BtrvsLKZ4DzfX6nW4=", + "dev": true + }, + "grunt-contrib-jshint": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.6.5.tgz", + "integrity": "sha1-OvtGdnRTZMxKGe7nk0wOBgCLVm4=", + "dev": true, + "requires": { + "jshint": "2.1.11" + } + }, + "grunt-contrib-uglify": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.2.7.tgz", + "integrity": "sha1-5r2lHgxAoUWfbOrUI8Ze/XJaG/c=", + "dev": true, + "requires": { + "grunt-lib-contrib": "0.6.1", + "uglify-js": "2.4.24" + } + }, + "grunt-contrib-watch": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz", + "integrity": "sha1-hKGnodar0m7VaEE0lscxM+mQAY8=", + "dev": true, + "requires": { + "async": "1.5.2", + "gaze": "1.1.2", + "lodash": "3.10.1", + "tiny-lr": "0.2.1" + } + }, + "grunt-curl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-curl/-/grunt-curl-1.1.1.tgz", + "integrity": "sha1-Is9fPNoHx6ybTS1rKCJqzFVJdkI=", + "dev": true, + "requires": { + "grunt-retro": "0.6.4", + "request": "2.21.0" + } + }, + "grunt-ember-s3": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grunt-ember-s3/-/grunt-ember-s3-1.0.4.tgz", + "integrity": "sha1-NUilok2BAUPqTbEsuQa+UmDMpJE=", + "dev": true, + "requires": { + "async": "0.2.10", + "s3": "0.3.1" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + }, + "grunt-known-options": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.0.tgz", + "integrity": "sha1-pCdO6zL6dl2lp6OxcSYXzjsUQUk=", + "dev": true + }, + "grunt-legacy-log": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-1.0.0.tgz", + "integrity": "sha1-+4bxgJhHvAfcR4Q/ns1srLYt8tU=", + "dev": true, + "requires": { + "colors": "1.1.2", + "grunt-legacy-log-utils": "1.0.0", + "hooker": "0.2.3", + "lodash": "3.10.1", + "underscore.string": "3.2.3" + } + }, + "grunt-legacy-log-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-1.0.0.tgz", + "integrity": "sha1-p7ji0Ps1taUPSvmG/BEnSevJbz0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "lodash": "4.3.0" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + } + } + }, + "grunt-legacy-util": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-1.0.0.tgz", + "integrity": "sha1-OGqnjcbtUJhsKxiVcmWxtIq7m4Y=", + "dev": true, + "requires": { + "async": "1.5.2", + "exit": "0.1.2", + "getobject": "0.1.0", + "hooker": "0.2.3", + "lodash": "4.3.0", + "underscore.string": "3.2.3", + "which": "1.2.14" + }, + "dependencies": { + "lodash": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.3.0.tgz", + "integrity": "sha1-79nEpuxT87BUEkKZFcPkgk5NJaQ=", + "dev": true + } + } + }, + "grunt-lib-contrib": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/grunt-lib-contrib/-/grunt-lib-contrib-0.6.1.tgz", + "integrity": "sha1-P1att9oG6BR5XuJBWw6+X7iQPrs=", + "dev": true, + "requires": { + "zlib-browserify": "0.0.1" + } + }, + "grunt-neuter": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/grunt-neuter/-/grunt-neuter-0.6.0.tgz", + "integrity": "sha1-h/h+11gqdTakmgt07aOeebicsbE=", + "dev": true, + "requires": { + "glob": "3.2.11", + "source-map": "0.1.34" + } + }, + "grunt-release": { + "version": "git+https://github.com/trek/grunt-release.git#7b766605c85605f2845bf93492a1ec1de6daa7a1", + "dev": true, + "requires": { + "semver": "1.1.4", + "shelljs": "0.1.4" + }, + "dependencies": { + "semver": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-1.1.4.tgz", + "integrity": "sha1-LlpOcrqwNHLMl/cnU7RQiRLvVUA=", + "dev": true + } + } + }, + "grunt-retro": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/grunt-retro/-/grunt-retro-0.6.4.tgz", + "integrity": "sha1-8mqEj2pHl6X/foUOYCIMDea+jnI=", + "dev": true + }, + "grunt-strip": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/grunt-strip/-/grunt-strip-0.2.1.tgz", + "integrity": "sha1-D6far6Citd/fvCYWeOp+LXUnpL8=", + "dev": true, + "requires": { + "falafel": "0.1.6" + } + }, + "grunt-strip-node": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/grunt-strip-node/-/grunt-strip-node-0.1.1.tgz", + "integrity": "sha1-++KNzKYlivr3Pw5pqJMTcIAn3Rw=", + "dev": true, + "requires": { + "falafel": "0.1.6" + } + }, + "grunt-testem-mincer": { + "version": "github:patocallaghan/grunt-testem-mincer#1776e8dba749ec12a4b37a59d9863a352c29d9f3", + "dev": true, + "requires": { + "coffee-script": "1.12.7", + "connect": "2.19.6", + "mincer": "0.5.13", + "sugar": "1.3.9", + "testem": "2.0.0" + }, + "dependencies": { + "body-parser": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.3.1.tgz", + "integrity": "sha1-GnRRP8eJfXDbVlieDQPwoT8b+pQ=", + "dev": true, + "requires": { + "bytes": "1.0.0", + "qs": "0.6.6", + "raw-body": "1.1.6", + "type-is": "1.2.1" + } + }, + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + }, + "coffee-script": { + "version": "1.12.7", + "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.12.7.tgz", + "integrity": "sha512-fLeEhqwymYat/MpTPUjSKHVYYl0ec2mOyALEMLmzr5i1isuG+6jfI2j2d5oBO3VIzgUXgBVIcOT9uH1TFxBckw==", + "dev": true + }, + "connect": { + "version": "2.19.6", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.19.6.tgz", + "integrity": "sha1-1HP9eUnFW0I6ZPhCDb0Gnbd82dI=", + "dev": true, + "requires": { + "basic-auth-connect": "1.0.0", + "body-parser": "1.3.1", + "bytes": "1.0.0", + "compression": "1.0.7", + "connect-timeout": "1.1.0", + "cookie": "0.1.2", + "cookie-parser": "1.1.0", + "cookie-signature": "1.0.3", + "csurf": "1.2.1", + "debug": "1.0.2", + "errorhandler": "1.0.2", + "escape-html": "1.0.1", + "express-session": "1.2.1", + "fresh": "0.2.2", + "method-override": "2.0.2", + "morgan": "1.1.1", + "multiparty": "3.2.8", + "on-headers": "0.0.0", + "parseurl": "1.0.1", + "pause": "0.0.1", + "qs": "0.6.6", + "response-time": "2.0.0", + "serve-favicon": "2.0.1", + "serve-index": "1.1.1", + "serve-static": "1.2.3", + "type-is": "1.2.1", + "vhost": "1.0.0" + } + }, + "cookie": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.2.tgz", + "integrity": "sha1-cv7D0k5Io0Mgc9kMEmQgBQYQBLE=", + "dev": true + }, + "cookie-signature": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.3.tgz", + "integrity": "sha1-kc2ZfMUftkFZVzjGnNoCAyj1D/k=", + "dev": true + }, + "debug": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", + "integrity": "sha1-OElZHBDM5khHbDx8Li40FttZY8Q=", + "dev": true, + "requires": { + "ms": "0.6.2" + } + }, + "fresh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", + "integrity": "sha1-lzHc9WeMf660T7kDxPct9VGH+nc=", + "dev": true + }, + "mime-types": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-1.0.0.tgz", + "integrity": "sha1-antKavLn2S+Xr+A/BHx4AejwAdI=", + "dev": true + }, + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", + "dev": true + }, + "parseurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.0.1.tgz", + "integrity": "sha1-Llfc5u/dN8NRhwEDCUTCK/OIt7Q=", + "dev": true + }, + "qs": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", + "integrity": "sha1-bgFQmP9RlouKPIGQAdXyyJvEsQc=", + "dev": true + }, + "raw-body": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-1.1.6.tgz", + "integrity": "sha1-mOnfmn4t+ZSTG3zbSyprlpSnTwI=", + "dev": true, + "requires": { + "bytes": "1.0.0" + } + }, + "type-is": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.2.1.tgz", + "integrity": "sha1-c9RICApPHdGKyx7v/2KWjFtdVKI=", + "dev": true, + "requires": { + "mime-types": "1.0.0" + } + } + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-binary": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.7.tgz", + "integrity": "sha1-aOYesWIQyVRaClzOBqhzkS/h5ow=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hawk": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.13.1.tgz", + "integrity": "sha1-NheViCH1gxHk1/beKR/KZitBLvQ=", + "dev": true, + "requires": { + "boom": "0.4.2", + "cryptiles": "0.2.2", + "hoek": "0.8.5", + "sntp": "0.2.4" + } + }, + "hike": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hike/-/hike-0.1.4.tgz", + "integrity": "sha1-06/Q4JIHnHsLLjw38uLJTqLGb14=", + "dev": true, + "requires": { + "lodash": "2.4.2" + }, + "dependencies": { + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + } + } + }, + "hoek": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.8.5.tgz", + "integrity": "sha1-Hp/XcO9+vgJ0rfy1sIBqAlpeTp8=", + "dev": true + }, + "hooker": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", + "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", + "dev": true + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "statuses": "1.4.0" + } + }, + "http-parser-js": { + "version": "0.4.10", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz", + "integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q=", + "dev": true + }, + "http-proxy": { + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", + "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "dev": true, + "requires": { + "eventemitter3": "1.2.0", + "requires-port": "1.0.0" + } + }, + "http-signature": { + "version": "0.9.11", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.9.11.tgz", + "integrity": "sha1-nognFFcjFeZ5Cl0KeVXv/x8Z5lM=", + "dev": true, + "requires": { + "asn1": "0.1.11", + "assert-plus": "0.1.2", + "ctype": "0.5.2" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ipaddr.js": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.6.0.tgz", + "integrity": "sha1-4/o1e3c9phnybpXwSdBVxyeW+Gs=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-type": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/is-type/-/is-type-0.0.1.tgz", + "integrity": "sha1-9lHYXDZdRJVdFKUdjXBh8/a0d5w=", + "dev": true, + "requires": { + "core-util-is": "1.0.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "js-yaml": { + "version": "3.5.5", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.5.5.tgz", + "integrity": "sha1-A3fDgBfKvHMisNH7zSWkkWQfL74=", + "dev": true, + "requires": { + "argparse": "1.0.10", + "esprima": "2.7.3" + } + }, + "jshint": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.1.11.tgz", + "integrity": "sha1-61EI/vm6Xd67gwmD9XLSQuSeP5Y=", + "dev": true, + "requires": { + "cli": "0.4.5", + "console-browserify": "0.1.6", + "minimatch": "0.3.0", + "shelljs": "0.1.4", + "underscore": "1.4.4" + } + }, + "json-stringify-safe": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-4.0.0.tgz", + "integrity": "sha1-d8JxqupUMC5o7+rMtWq78GqbGlQ=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "knox": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/knox/-/knox-0.8.10.tgz", + "integrity": "sha1-ai7c2sHSrjedHhmU1Vm5XCg7JYg=", + "dev": true, + "requires": { + "debug": "0.7.4", + "mime": "1.2.11", + "stream-counter": "0.1.0", + "xml2js": "0.2.8" + }, + "dependencies": { + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "dev": true + } + } + }, + "livereload-js": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/livereload-js/-/livereload-js-2.3.0.tgz", + "integrity": "sha512-j1R0/FeGa64Y+NmqfZhyoVRzcFlOZ8sNlKzHjh4VvLULFACZhn68XrX5DFg2FhMvSMJmROuFxRSa560ECWKBMg==", + "dev": true + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "lodash._baseflatten": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/lodash._baseflatten/-/lodash._baseflatten-3.1.4.tgz", + "integrity": "sha1-B3D/gBMa9uNPO1EXlqe6UhTmX/c=", + "dev": true, + "requires": { + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.assignin": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.assignin/-/lodash.assignin-4.2.0.tgz", + "integrity": "sha1-uo31+4QesKPoBEIysOJjqNxqKKI=", + "dev": true + }, + "lodash.castarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.castarray/-/lodash.castarray-4.4.0.tgz", + "integrity": "sha1-wCUTUV4wna3dTCTGDP3c9ZdtkRU=", + "dev": true + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "lodash.debounce": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-3.1.1.tgz", + "integrity": "sha1-gSIRw3ipTMKdWqTjNGzwv846ffU=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1" + } + }, + "lodash.find": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.find/-/lodash.find-4.6.0.tgz", + "integrity": "sha1-ywcE1Hq3F4n/oN6Ll92Sb7iLE7E=", + "dev": true + }, + "lodash.flatten": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-3.0.2.tgz", + "integrity": "sha1-3hz1d1j49EeTGdNcPpzGDEUBk4w=", + "dev": true, + "requires": { + "lodash._baseflatten": "3.1.4", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.uniqby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz", + "integrity": "sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "matchdep": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-0.1.2.tgz", + "integrity": "sha1-L1OfCB0GnzIFox5hU3Ob/RPGYsY=", + "dev": true, + "requires": { + "minimatch": "0.2.14" + }, + "dependencies": { + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "method-override": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.0.2.tgz", + "integrity": "sha1-AFMSeMeXiWQL8n6X4mo6Wh98ynM=", + "dev": true, + "requires": { + "methods": "1.0.1", + "parseurl": "1.0.1", + "vary": "0.1.0" + }, + "dependencies": { + "parseurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.0.1.tgz", + "integrity": "sha1-Llfc5u/dN8NRhwEDCUTCK/OIt7Q=", + "dev": true + } + } + }, + "methods": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.0.1.tgz", + "integrity": "sha1-dbyRlD3/19oDfPPusO1zoAN80Us=", + "dev": true + }, + "mime": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", + "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "dev": true + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "mimoza": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mimoza/-/mimoza-0.3.0.tgz", + "integrity": "sha1-AHr8y0yPys5lL6NT1ILCZK1wwaY=", + "dev": true + }, + "mincer": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/mincer/-/mincer-0.5.13.tgz", + "integrity": "sha1-SUN5gOpjNuxYRA1x6wnOlEU+c9U=", + "dev": true, + "requires": { + "argparse": "0.1.16", + "async": "0.2.10", + "fs-tools": "0.2.11", + "hike": "0.1.4", + "lodash": "2.4.2", + "mimoza": "0.3.0", + "shellwords": "0.1.1" + }, + "dependencies": { + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "dev": true, + "requires": { + "underscore": "1.7.0", + "underscore.string": "2.4.0" + } + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + }, + "lodash": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", + "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", + "dev": true + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", + "dev": true + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", + "dev": true + } + } + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "morgan": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.1.1.tgz", + "integrity": "sha1-zeRdLoB+vMQ5dFhG6oA5LmkJgUY=", + "dev": true, + "requires": { + "bytes": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-1.0.0.tgz", + "integrity": "sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multiparty": { + "version": "3.2.8", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-3.2.8.tgz", + "integrity": "sha1-veITAdrSlChuFVsrYHEMauBK5k8=", + "dev": true, + "requires": { + "readable-stream": "1.1.14", + "stream-counter": "0.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "stream-counter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", + "integrity": "sha1-3tJmVWMZyLDiIoErnPOyb6fZR94=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + } + } + } + }, + "mustache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", + "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=", + "dev": true + }, + "negotiator": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.4.6.tgz", + "integrity": "sha1-9F+vn6gz7TylElDqmn3fxCZ6RLM=", + "dev": true + }, + "node-notifier": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-5.2.1.tgz", + "integrity": "sha512-MIBs+AAd6dJ2SklbbE8RUDRlIVhU8MaNLh1A9SUZDUHPiZkWLFde6UNwG41yQHZEToHgJMXqyVZ9UcS/ReOVTg==", + "dev": true, + "requires": { + "growly": "1.3.0", + "semver": "5.5.0", + "shellwords": "0.1.1", + "which": "1.3.0" + }, + "dependencies": { + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + } + } + }, + "node-uuid": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", + "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", + "dev": true + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "dev": true, + "requires": { + "abbrev": "1.1.1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "5.5.0", + "validate-npm-package-license": "3.0.2" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "dev": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=", + "dev": true + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-0.0.0.tgz", + "integrity": "sha1-7igX+DRDJXhc2cLfKyQrvBfK9MQ=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parsejson": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.3.tgz", + "integrity": "sha1-q343WfIJ7OmUN5c/fQ8fZK4OZKs=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseqs": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz", + "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseuri": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz", + "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=", + "dev": true, + "requires": { + "better-assert": "1.0.2" + } + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "printf": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/printf/-/printf-0.2.5.tgz", + "integrity": "sha1-xDjKLKM+OSdnHbSracDlL5NqTw8=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "proxy-addr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.3.tgz", + "integrity": "sha512-jQTChiCJteusULxjBp8+jftSQE5Obdl3k4cnmLA6WXtK6XFuWRnvVL7aCiBqaLPM8c4ph0S4tKna8XvmIwEnXQ==", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.6.0" + } + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "qs": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.5.tgz", + "integrity": "sha1-KUsmjksNQlD23eGbO4s0k13/FO8=", + "dev": true + }, + "range-parser": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-0.0.4.tgz", + "integrity": "sha1-wEJ//vUcEKy6B4KkbJYC50T/Ygs=", + "dev": true + }, + "raw-body": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.7.tgz", + "integrity": "sha1-rf6s4uT7MJgFgBTQjActzFl1h3Q=", + "dev": true, + "requires": { + "bytes": "2.4.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.4.0.tgz", + "integrity": "sha1-fZcZb51br39pNeJZhVSe3SpsIzk=", + "dev": true + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=", + "dev": true + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "request": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.21.0.tgz", + "integrity": "sha1-VyirnEXlqHyZ2szVMCmLZnOoaNc=", + "dev": true, + "requires": { + "aws-sign": "0.3.0", + "cookie-jar": "0.3.0", + "forever-agent": "0.5.2", + "form-data": "0.0.8", + "hawk": "0.13.1", + "http-signature": "0.9.11", + "json-stringify-safe": "4.0.0", + "mime": "1.2.11", + "node-uuid": "1.4.8", + "oauth-sign": "0.3.0", + "qs": "0.6.5", + "tunnel-agent": "0.3.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "response-time": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.0.0.tgz", + "integrity": "sha1-Zcs5/VDeL0/9vdKF8YVZZr1vyzY=", + "dev": true, + "requires": { + "on-headers": "0.0.0" + } + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "rndm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=", + "dev": true + }, + "s3": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/s3/-/s3-0.3.1.tgz", + "integrity": "sha1-dv8JcydEtF14XuHXkBol65QAMKI=", + "dev": true, + "requires": { + "knox": "0.8.10" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "scmp": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-0.0.3.tgz", + "integrity": "sha1-NkjfLXKUZB5/eGc//CloHZutkHM=", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "send": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.1.1.tgz", + "integrity": "sha1-C8/L0D3vbi2GEuGr+PSJW0UMYMg=", + "dev": true, + "requires": { + "debug": "3.1.0", + "fresh": "0.1.0", + "mime": "1.2.11", + "range-parser": "0.0.4" + } + }, + "serve-favicon": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.0.1.tgz", + "integrity": "sha1-SCaXXZ8XPKOkFY6WmBYfdd7Hr+w=", + "dev": true, + "requires": { + "fresh": "0.2.2" + }, + "dependencies": { + "fresh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", + "integrity": "sha1-lzHc9WeMf660T7kDxPct9VGH+nc=", + "dev": true + } + } + }, + "serve-index": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.1.1.tgz", + "integrity": "sha1-6trdj9B0E63RejAcZX9S/AXxnS8=", + "dev": true, + "requires": { + "accepts": "1.0.3", + "batch": "0.5.0" + } + }, + "serve-static": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.2.3.tgz", + "integrity": "sha1-k87Lw0Dweey4WJKB0dwxwmwM0Vg=", + "dev": true, + "requires": { + "escape-html": "1.0.1", + "parseurl": "1.0.1", + "send": "0.4.3" + }, + "dependencies": { + "debug": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", + "integrity": "sha1-OElZHBDM5khHbDx8Li40FttZY8Q=", + "dev": true, + "requires": { + "ms": "0.6.2" + } + }, + "fresh": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.2.2.tgz", + "integrity": "sha1-lzHc9WeMf660T7kDxPct9VGH+nc=", + "dev": true + }, + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=", + "dev": true + }, + "parseurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.0.1.tgz", + "integrity": "sha1-Llfc5u/dN8NRhwEDCUTCK/OIt7Q=", + "dev": true + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=", + "dev": true + }, + "send": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/send/-/send-0.4.3.tgz", + "integrity": "sha1-lieyO3cH+/Y3ODHKxXkzMLWUtkA=", + "dev": true, + "requires": { + "debug": "1.0.2", + "escape-html": "1.0.1", + "finished": "1.2.2", + "fresh": "0.2.2", + "mime": "1.2.11", + "range-parser": "1.0.3" + } + } + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shelljs": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz", + "integrity": "sha1-37vnjVbDwBaNL7eeEOzR28sH7A4=", + "dev": true + }, + "shellwords": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz", + "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==", + "dev": true + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "dev": true, + "requires": { + "hoek": "0.9.1" + }, + "dependencies": { + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", + "dev": true + } + } + }, + "socket.io": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.6.0.tgz", + "integrity": "sha1-PkDZMmN+a9kjmBslyvfFPoO24uE=", + "dev": true, + "requires": { + "debug": "2.3.3", + "engine.io": "1.8.0", + "has-binary": "0.1.7", + "object-assign": "4.1.0", + "socket.io-adapter": "0.5.0", + "socket.io-client": "1.6.0", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "object-assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.0.tgz", + "integrity": "sha1-ejs9DpgGPUP0wD8uiubNUahog6A=", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.5.0.tgz", + "integrity": "sha1-y21LuL7IHhB4uZZ3+c7QBGBmu4s=", + "dev": true, + "requires": { + "debug": "2.3.3", + "socket.io-parser": "2.3.1" + }, + "dependencies": { + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-client": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.6.0.tgz", + "integrity": "sha1-W2aPT3cTBN/u0XkGRwg4b6ZxeFM=", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.2.1", + "debug": "2.3.3", + "engine.io-client": "1.8.0", + "has-binary": "0.1.7", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.5", + "socket.io-parser": "2.3.1", + "to-array": "0.1.4" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.3.3.tgz", + "integrity": "sha1-QMRT5n5uE8kB3ewxeviYbNqe/4w=", + "dev": true, + "requires": { + "ms": "0.7.2" + } + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + } + } + }, + "socket.io-parser": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.3.1.tgz", + "integrity": "sha1-3VMgJRA85Clpcya+/WQAX8/ltKA=", + "dev": true, + "requires": { + "component-emitter": "1.1.2", + "debug": "2.2.0", + "isarray": "0.0.1", + "json3": "3.3.2" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + } + } + }, + "source-map": { + "version": "0.1.34", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.34.tgz", + "integrity": "sha1-p8/omux7FoLDsZjQrPtH19CQVms=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + }, + "spawn-args": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/spawn-args/-/spawn-args-0.2.0.tgz", + "integrity": "sha1-+30L0dcP1DFr2ePew4nmX51jYbs=", + "dev": true + }, + "spdx-correct": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-2.0.4.tgz", + "integrity": "sha512-c+4gPpt9YDhz7cHlz5UrsHzxxRi4ksclxnEEKsuGT9JdwSC+ZNmsGbYRzzgxyZaBYpcWnlu+4lPcdLKx4DOCmA==", + "dev": true, + "requires": { + "spdx-expression-parse": "2.0.2", + "spdx-license-ids": "2.0.1" + }, + "dependencies": { + "spdx-expression-parse": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-2.0.2.tgz", + "integrity": "sha512-oFxOkWCfFS0ltNp0H66gXlU4NF6bxg7RkoTYR0413t+yTY9zyj+AIWsjtN8dcVp6703ijDYBWBIARlJ7DkyP9Q==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "2.0.1" + } + } + } + }, + "spdx-exceptions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", + "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==", + "dev": true + }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "2.1.0", + "spdx-license-ids": "3.0.0" + }, + "dependencies": { + "spdx-license-ids": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", + "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==", + "dev": true + } + } + }, + "spdx-license-ids": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-2.0.1.tgz", + "integrity": "sha1-AgF7zDU07k/+9tWNIOfT6aHDyOw=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "dev": true + }, + "stream-counter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.1.0.tgz", + "integrity": "sha1-oDXkKTYftX82Fgbhf82Ki5Z3Mns=", + "dev": true, + "requires": { + "readable-stream": "1.0.34" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "styled_string": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/styled_string/-/styled_string-0.0.1.tgz", + "integrity": "sha1-0ieCvYEpVFm8Tx3xjEutjpTdEko=", + "dev": true + }, + "sugar": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/sugar/-/sugar-1.3.9.tgz", + "integrity": "sha1-+HnGyHchJStR/QtlIEEtmNg8sXk=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "tap-parser": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/tap-parser/-/tap-parser-5.4.0.tgz", + "integrity": "sha512-BIsIaGqv7uTQgTW1KLTMNPSEQf4zDDPgYOBRdgOfuB+JFOLRBfEu6cLa/KvMvmqggu1FKXDfitjLwsq4827RvA==", + "dev": true, + "requires": { + "events-to-array": "1.1.2", + "js-yaml": "3.5.5", + "readable-stream": "2.3.4" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true, + "optional": true + }, + "readable-stream": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "dev": true, + "optional": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "testem": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/testem/-/testem-2.0.0.tgz", + "integrity": "sha1-sFyWIAx6yYuumY1xyUwMU0WQfRM=", + "dev": true, + "requires": { + "backbone": "1.3.3", + "bluebird": "3.5.1", + "charm": "1.0.2", + "commander": "2.14.1", + "consolidate": "0.14.5", + "execa": "0.9.0", + "express": "4.16.2", + "fireworm": "0.7.1", + "glob": "7.1.2", + "http-proxy": "1.16.2", + "js-yaml": "3.5.5", + "lodash.assignin": "4.2.0", + "lodash.castarray": "4.4.0", + "lodash.clonedeep": "4.5.0", + "lodash.find": "4.6.0", + "lodash.uniqby": "4.7.0", + "mkdirp": "0.5.1", + "mustache": "2.3.0", + "node-notifier": "5.2.1", + "npmlog": "4.1.2", + "printf": "0.2.5", + "rimraf": "2.6.2", + "socket.io": "1.6.0", + "spawn-args": "0.2.0", + "styled_string": "0.0.1", + "tap-parser": "5.4.0", + "xmldom": "0.1.27" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + } + } + }, + "tiny-lr": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tiny-lr/-/tiny-lr-0.2.1.tgz", + "integrity": "sha1-s/26gC5dVqM8L28QeUsy5Hescp0=", + "dev": true, + "requires": { + "body-parser": "1.14.2", + "debug": "2.2.0", + "faye-websocket": "0.10.0", + "livereload-js": "2.3.0", + "parseurl": "1.3.2", + "qs": "5.1.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "dev": true, + "requires": { + "ms": "0.7.1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=", + "dev": true + }, + "qs": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", + "dev": true + } + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", + "integrity": "sha1-rWgbaPUyGtKCfEz7G31d8s/pQu4=", + "dev": true + }, + "type-is": { + "version": "1.6.16", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz", + "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.18" + } + }, + "uglify-js": { + "version": "2.4.24", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.4.24.tgz", + "integrity": "sha1-+tV1XB4Vd2WLsG/5q25UjJW+vW4=", + "dev": true, + "requires": { + "async": "0.2.10", + "source-map": "0.1.34", + "uglify-to-browserify": "1.0.2", + "yargs": "3.5.4" + }, + "dependencies": { + "async": { + "version": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "dev": true + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true + }, + "uid2": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid2/-/uid2-0.0.3.tgz", + "integrity": "sha1-SDEm4Rd03y9xuLY53NeZw3YWK4I=", + "dev": true + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "underscore": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", + "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", + "dev": true + }, + "underscore.string": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-3.2.3.tgz", + "integrity": "sha1-gGmSYzZl1eX8tNsfs6hi62jp5to=", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.2.tgz", + "integrity": "sha512-8zlGw3EZDpC7iUDKy4yHCSqFwkBTeAK4h1QqDC3ST6rT7dzvu2ZuclExZN7zuXNEhQ3+2UBQgdca5eNNL06sBg==", + "dev": true, + "requires": { + "spdx-correct": "2.0.4", + "spdx-expression-parse": "3.0.0" + } + }, + "vary": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-0.1.0.tgz", + "integrity": "sha1-3wlFiZ6TwMxb0YzIMh2dIedPYXY=", + "dev": true + }, + "vhost": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vhost/-/vhost-1.0.0.tgz", + "integrity": "sha1-ZUUT8omk+Jiqt0W71jPkAYDJxMA=", + "dev": true + }, + "websocket-driver": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", + "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "dev": true, + "requires": { + "http-parser-js": "0.4.10", + "websocket-extensions": "0.1.3" + } + }, + "websocket-extensions": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", + "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", + "dev": true + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "requires": { + "string-width": "1.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.1.tgz", + "integrity": "sha1-CC3bbGQehdS7RR8D1S8G6r2x8Bg=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "wtf-8": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wtf-8/-/wtf-8-1.0.0.tgz", + "integrity": "sha1-OS2LotDxw00e4tYw8V0O+2jhBIo=", + "dev": true + }, + "xml2js": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", + "integrity": "sha1-m4FpCTFjH/CdGVdUn69U9PmAs8I=", + "dev": true, + "requires": { + "sax": "0.5.8" + } + }, + "xmldom": { + "version": "0.1.27", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.1.27.tgz", + "integrity": "sha1-1QH5ezvbQDr4757MIFcxh6rawOk=", + "dev": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.3.tgz", + "integrity": "sha1-GFqIjATspGw+QHDZn3tJ3jUomS0=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", + "dev": true, + "requires": { + "camelcase": "1.2.1", + "decamelize": "1.2.0", + "window-size": "0.1.0", + "wordwrap": "0.0.2" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "zlib-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/zlib-browserify/-/zlib-browserify-0.0.1.tgz", + "integrity": "sha1-T6akXQDbwV8xikr6HZr8Aljhdsw=", + "dev": true + } + } +} diff --git a/packages/ember-model/lib/belongs_to.js b/packages/ember-model/lib/belongs_to.js index 013553a..ba0588b 100644 --- a/packages/ember-model/lib/belongs_to.js +++ b/packages/ember-model/lib/belongs_to.js @@ -3,8 +3,10 @@ var get = Ember.get, set = Ember.set; function storeFor(record) { - if (record.container) { - return record.container.lookup('emstore:main'); + var owner = Ember.getOwner(record); + + if (owner) { + return owner.lookup('emstore:main'); } return null; @@ -118,7 +120,11 @@ Ember.Model.reopen({ if (meta.options.embedded) { var primaryKey = get(type, 'primaryKey'), id = idOrAttrs[primaryKey]; - record = type.create({ isLoaded: false, id: id, container: this.container }); + record = type.create({ isLoaded: false, id: id }); + + var owner = Ember.getOwner(this); + Ember.setOwner(record, owner); + record.load(id, idOrAttrs); } else { if (emstore) { diff --git a/packages/ember-model/lib/has_many.js b/packages/ember-model/lib/has_many.js index a2ee68c..86605e8 100644 --- a/packages/ember-model/lib/has_many.js +++ b/packages/ember-model/lib/has_many.js @@ -8,7 +8,7 @@ function getType(record) { this.type = get(Ember.lookup, this.type); if (!this.type) { - var emstore = record.container.lookup('emstore:main'); + var emstore = Ember.getOwner(record).lookup('emstore:main'); this.type = emstore.modelFor(type); this.type.reopenClass({ adapter: emstore.adapterFor(type) }); } @@ -28,11 +28,12 @@ Ember.hasMany = function(type, options) { Ember.assert("Type cannot be empty", !Ember.isEmpty(type)); var key = options.key || propertyKey; - return this.getHasMany(key, type, meta, this.container); + var owner = Ember.getOwner(this); + return this.getHasMany(key, type, meta, owner); }, set: function(propertyKey, newContentArray, existingArray) { if (!existingArray) { - existingArray = this.getHasMany(options.key || propertyKey, type, meta, this.container); + existingArray = this.getHasMany(options.key || propertyKey, type, meta, Ember.getOwner(this)); } return existingArray.setObjects(newContentArray); } @@ -40,7 +41,7 @@ Ember.hasMany = function(type, options) { }; Ember.Model.reopen({ - getHasMany: function(key, type, meta, container) { + getHasMany: function(key, type, meta, owner) { var embedded = meta.options.embedded, collectionClass = embedded ? Ember.EmbeddedHasManyArray : Ember.HasManyArray; @@ -50,10 +51,10 @@ Ember.Model.reopen({ content: this._getHasManyContent(key, type, embedded), embedded: embedded, key: key, - relationshipKey: meta.relationshipKey, - container: container + relationshipKey: meta.relationshipKey }); + Ember.setOwner(collection, owner); this._registerHasManyArray(collection); return collection; diff --git a/packages/ember-model/lib/has_many_array.js b/packages/ember-model/lib/has_many_array.js index 876f0f9..c2468f1 100644 --- a/packages/ember-model/lib/has_many_array.js +++ b/packages/ember-model/lib/has_many_array.js @@ -43,7 +43,8 @@ Ember.ManyArray = Ember.RecordArray.extend({ // need to add observer if it wasn't materialized before var observerNeeded = (content[idx].record) ? false : true; - var record = this.materializeRecord(idx, this.container); + var owner = Ember.getOwner(this); + var record = this.materializeRecord(idx, owner); if (observerNeeded) { var isDirtyRecord = record.get('isDirty'), isNewRecord = record.get('isNew'); @@ -164,19 +165,17 @@ Ember.ManyArray = Ember.RecordArray.extend({ }); Ember.HasManyArray = Ember.ManyArray.extend({ - materializeRecord: function(idx, container) { + materializeRecord: function(idx, owner) { var klass = get(this, 'modelClass'), content = get(this, 'content'), reference = content.objectAt(idx), record = reference.record; if (record) { - if (! record.container) { - record.container = container; - } + Ember.setOwner(record, owner); return record; } - return klass._findFetchById(reference.id, false, container); + return klass._findFetchById(reference.id, false, owner); }, toJSON: function() { @@ -202,7 +201,7 @@ Ember.EmbeddedHasManyArray = Ember.ManyArray.extend({ return record; // FIXME: inject parent's id }, - materializeRecord: function(idx, container) { + materializeRecord: function(idx, owner) { var klass = get(this, 'modelClass'), primaryKey = get(klass, 'primaryKey'), content = get(this, 'content'), @@ -213,14 +212,15 @@ Ember.EmbeddedHasManyArray = Ember.ManyArray.extend({ if (reference.record) { record = reference.record; } else { - record = klass.create({ _reference: reference, container: container }); + record = klass.create({ _reference: reference }); reference.record = record; + Ember.setOwner(record, owner); + if (attrs) { record.load(attrs[primaryKey], attrs); } } - record.container = container; return record; }, diff --git a/packages/ember-model/lib/model.js b/packages/ember-model/lib/model.js index 2e7ea95..9bcb3bb 100644 --- a/packages/ember-model/lib/model.js +++ b/packages/ember-model/lib/model.js @@ -137,7 +137,7 @@ Ember.Model = Ember.Object.extend(Ember.Evented, { if (relationshipMeta.options.embedded) { relationshipType = relationshipMeta.type; if (typeof relationshipType === "string") { - relationshipType = Ember.get(Ember.lookup, relationshipType) || this.container.lookupFactory('model:'+ relationshipType); + relationshipType = Ember.get(Ember.lookup, relationshipType) || Ember.getOwner(this).resolveRegistration('model:'+ relationshipType); } relationshipData = data[relationshipKey]; @@ -249,7 +249,7 @@ Ember.Model = Ember.Object.extend(Ember.Evented, { reload: function() { this.getWithDefault('_dirtyAttributes', Ember.A([])).clear(); - return this.constructor.reload(this.get(get(this.constructor, 'primaryKey')), this.container); + return this.constructor.reload(this.get(get(this.constructor, 'primaryKey')), Ember.getOwner(this)); }, revert: function() { @@ -453,8 +453,9 @@ Ember.Model.reopenClass({ return this._findFetchQuery(params, true); }, - _findFetchQuery: function(params, isFetch, container) { - var records = Ember.RecordArray.create({modelClass: this, _query: params, container: container}); + _findFetchQuery: function(params, isFetch, owner) { + var records = Ember.RecordArray.create({modelClass: this, _query: params}); + Ember.setOwner(records, owner); var promise = this.adapter.findQuery(this, records, params); @@ -469,12 +470,14 @@ Ember.Model.reopenClass({ return this._findFetchMany(ids, true); }, - _findFetchMany: function(ids, isFetch, container) { + _findFetchMany: function(ids, isFetch, owner) { Ember.assert("findFetchMany requires an array", Ember.isArray(ids)); - var records = Ember.RecordArray.create({_ids: ids, modelClass: this, container: container}), + var records = Ember.RecordArray.create({_ids: ids, modelClass: this}), deferred; + Ember.setOwner(records, owner); + if (!this.recordArrays) { this.recordArrays = []; } this.recordArrays.push(records); @@ -494,7 +497,7 @@ Ember.Model.reopenClass({ this._currentBatchDeferreds.push(deferred); } - Ember.run.scheduleOnce('data', this, this._executeBatch, container); + Ember.run.scheduleOnce('data', this, this._executeBatch, owner); return isFetch ? deferred.promise : records; }, @@ -507,7 +510,7 @@ Ember.Model.reopenClass({ return this._findFetchAll(true); }, - _findFetchAll: function(isFetch, container) { + _findFetchAll: function(isFetch, owner) { var self = this; var currentFetchPromise = this._currentFindFetchAllPromise; @@ -523,7 +526,8 @@ Ember.Model.reopenClass({ } } - var records = this._findAllRecordArray = Ember.RecordArray.create({modelClass: this, container: container}); + var records = this._findAllRecordArray = Ember.RecordArray.create({modelClass: this}); + Ember.setOwner(records, owner); var promise = this._currentFindFetchAllPromise = this.adapter.findAll(this, records); @@ -550,8 +554,8 @@ Ember.Model.reopenClass({ return this._findFetchById(id, true); }, - _findFetchById: function(id, isFetch, container) { - var record = this.cachedRecordForId(id, container), + _findFetchById: function(id, isFetch, owner) { + var record = this.cachedRecordForId(id, owner), isLoaded = get(record, 'isLoaded'), adapter = get(this, 'adapter'), deferredOrPromise; @@ -575,8 +579,8 @@ Ember.Model.reopenClass({ _currentBatchRecordArrays: null, _currentBatchDeferreds: null, - reload: function(id, container) { - var record = this.cachedRecordForId(id, container); + reload: function(id, owner) { + var record = this.cachedRecordForId(id, owner); record.set('isLoaded', false); return this._fetchById(record, id); }, @@ -601,7 +605,8 @@ Ember.Model.reopenClass({ if (!this._currentBatchDeferreds) { this._currentBatchDeferreds = []; } this._currentBatchDeferreds.push(deferred); - Ember.run.scheduleOnce('data', this, this._executeBatch, record.container); + var owner = Ember.getOwner(record); + Ember.run.scheduleOnce('data', this, this._executeBatch, owner); return deferred.promise; } else { @@ -609,7 +614,7 @@ Ember.Model.reopenClass({ } }, - _executeBatch: function(container) { + _executeBatch: function(owner) { var batchIds = this._currentBatchIds, batchRecordArrays = this._currentBatchRecordArrays, batchDeferreds = this._currentBatchDeferreds, @@ -623,15 +628,16 @@ Ember.Model.reopenClass({ this._currentBatchDeferreds = null; for (i = 0; i < batchIds.length; i++) { - if (!this.cachedRecordForId(batchIds[i]).get('isLoaded')) { + if (!this.cachedRecordForId(batchIds[i], owner).get('isLoaded')) { requestIds.push(batchIds[i]); } } if (requestIds.length === 1) { - promise = get(this, 'adapter').find(this.cachedRecordForId(requestIds[0], container), requestIds[0]); + promise = get(this, 'adapter').find(this.cachedRecordForId(requestIds[0], owner), requestIds[0]); } else { - var recordArray = Ember.RecordArray.create({_ids: batchIds, container: container}); + var recordArray = Ember.RecordArray.create({_ids: batchIds }); + Ember.setOwner(recordArray, owner); if (requestIds.length === 0) { promise = new Ember.RSVP.Promise(function(resolve, reject) { resolve(recordArray); }); recordArray.notifyLoaded(); @@ -660,21 +666,18 @@ Ember.Model.reopenClass({ }); }, - getCachedReferenceRecord: function(id, container){ + getCachedReferenceRecord: function(id){ var ref = this._getReferenceById(id); if(ref && ref.record) { - if (! ref.record.container) { - ref.record.container = container; - } return ref.record; } return undefined; }, - cachedRecordForId: function(id, container) { + cachedRecordForId: function(id, owner) { var record; if (!this.transient) { - record = this.getCachedReferenceRecord(id, container); + record = this.getCachedReferenceRecord(id); } if (!record) { @@ -682,8 +685,9 @@ Ember.Model.reopenClass({ attrs = {isLoaded: false}; attrs[primaryKey] = id; - attrs.container = container; record = this.create(attrs); + Ember.setOwner(record, owner); + if (!this.transient) { var sideloadedData = this.sideloadedData && this.sideloadedData[id]; if (sideloadedData) { @@ -755,15 +759,16 @@ Ember.Model.reopenClass({ }, // FIXME - findFromCacheOrLoad: function(data, container) { + findFromCacheOrLoad: function(data, owner) { var record; if (!data[get(this, 'primaryKey')]) { - record = this.create({isLoaded: false, container: container}); + record = this.create({isLoaded: false}); } else { - record = this.cachedRecordForId(data[get(this, 'primaryKey')], container); + record = this.cachedRecordForId(data[get(this, 'primaryKey')], owner); } - // set(record, 'data', data); record.load(data[get(this, 'primaryKey')], data); + Ember.setOwner(record, owner); + return record; }, @@ -785,7 +790,7 @@ Ember.Model.reopenClass({ }, this).forEach(callback); }, - load: function(hashes, container) { + load: function(hashes) { if (Ember.typeOf(hashes) !== 'array') { hashes = [hashes]; } if (!this.sideloadedData) { this.sideloadedData = {}; } @@ -793,7 +798,7 @@ Ember.Model.reopenClass({ for (var i = 0, l = hashes.length; i < l; i++) { var hash = hashes[i], primaryKey = hash[get(this, 'primaryKey')], - record = this.getCachedReferenceRecord(primaryKey, container); + record = this.getCachedReferenceRecord(primaryKey); if (record) { record.load(primaryKey, hash); diff --git a/packages/ember-model/lib/record_array.js b/packages/ember-model/lib/record_array.js index b5067a0..e6d3cb8 100644 --- a/packages/ember-model/lib/record_array.js +++ b/packages/ember-model/lib/record_array.js @@ -12,7 +12,7 @@ Ember.RecordArray = Ember.ArrayProxy.extend(Ember.Evented, { loadForFindMany: function(klass) { var self = this; - var content = get(this, '_ids').map(function(id) { return klass.cachedRecordForId(id, self.container); }); + var content = get(this, '_ids').map(function(id) { return klass.cachedRecordForId(id, Ember.getOwner(self)); }); set(this, 'content', Ember.A(content)); this.notifyLoaded(); }, @@ -24,8 +24,9 @@ Ember.RecordArray = Ember.ArrayProxy.extend(Ember.Evented, { materializeData: function(klass, data) { var self = this; + var owner = Ember.getOwner(this); return Ember.A(data.map(function(el) { - return klass.findFromCacheOrLoad(el, self.container); // FIXME + return klass.findFromCacheOrLoad(el, owner); })); }, @@ -33,7 +34,7 @@ Ember.RecordArray = Ember.ArrayProxy.extend(Ember.Evented, { var modelClass = this.get('modelClass'), self = this, promises; - + set(this, 'isLoaded', false); if (modelClass._findAllRecordArray === this) { return modelClass.adapter.findAll(modelClass, this); diff --git a/packages/ember-model/lib/store.js b/packages/ember-model/lib/store.js index a6f097f..6925a3f 100644 --- a/packages/ember-model/lib/store.js +++ b/packages/ember-model/lib/store.js @@ -1,22 +1,20 @@ function NIL() {} -Ember.Model.Store = Ember.Object.extend({ - container: null, - +Ember.Model.Store = Ember.Service.extend({ modelFor: function(type) { - return this.container.lookupFactory('model:'+type); + return Ember.getOwner(this).factoryFor('model:' + type).class; }, adapterFor: function(type) { - var adapter = this.modelFor(type).adapter, - container = this.container; + var adapter = this.modelFor(type).adapter; + var owner = Ember.getOwner(this); if (adapter && adapter !== Ember.Model.adapter) { return adapter; } else { - adapter = container.lookupFactory('adapter:'+ type) || - container.lookupFactory('adapter:application') || - container.lookupFactory('adapter:REST'); + adapter = owner.factoryFor('adapter:' + type) || + owner.factoryFor('adapter:application') || + owner.factoryFor('adapter:REST'); return adapter ? adapter.create() : adapter; } @@ -25,7 +23,13 @@ Ember.Model.Store = Ember.Object.extend({ createRecord: function(type, props) { var klass = this.modelFor(type); klass.reopenClass({adapter: this.adapterFor(type)}); - return klass.create(Ember.merge({container: this.container}, props)); + + var record = klass.create(props); + + var owner = Ember.getOwner(this); + Ember.setOwner(record, owner); + + return record; }, find: function(type, id) { @@ -33,21 +37,23 @@ Ember.Model.Store = Ember.Object.extend({ return this._find(type, id, true); }, - _find: function(type, id, async) { + _find: function(type, id, isAsync) { var klass = this.modelFor(type); // if (!klass.adapter) { klass.reopenClass({adapter: this.adapterFor(type)}); // } + var owner = Ember.getOwner(this); + if (id === NIL) { - return klass._findFetchAll(async, this.container); + return klass._findFetchAll(isAsync, owner); } else if (Ember.isArray(id)) { - return klass._findFetchMany(id, async, this.container); + return klass._findFetchMany(id, isAsync, owner); } else if (typeof id === 'object') { - return klass._findFetchQuery(id, async, this.container); + return klass._findFetchQuery(id, isAsync, owner); } else { - return klass._findFetchById(id, async, this.container); + return klass._findFetchById(id, isAsync, owner); } }, diff --git a/packages/ember-model/tests/adapter/rest_adapter_test.js b/packages/ember-model/tests/adapter/rest_adapter_test.js index 9299a67..3319abd 100644 --- a/packages/ember-model/tests/adapter/rest_adapter_test.js +++ b/packages/ember-model/tests/adapter/rest_adapter_test.js @@ -18,17 +18,23 @@ QUnit.module("Ember.RESTAdapter", { QUnit.test("throws an error if a url isn't provided", function(assert) { assert.expect(3); - assert.throws(function() { - Ember.run(RESTModel, RESTModel.find); - }, /requires a `url` property to be specified/); + Ember.run(function() { + assert.throws(function() { + RESTModel.find(); + }, /requires a `url` property to be specified/); + }); - assert.throws(function() { - Ember.run(RESTModel, RESTModel.find, 1); - }, /requires a `url` property to be specified/); + Ember.run(function() { + assert.throws(function() { + RESTModel.find(1); + }, /requires a `url` property to be specified/); + }); - assert.throws(function() { - Ember.run(RESTModel, RESTModel.find, {}); - }, /requires a `url` property to be specified/); + Ember.run(function() { + assert.throws(function() { + RESTModel.find({}); + }, /requires a `url` property to be specified/); + }); }); QUnit.module("Ember.RESTAdapter - with a url specified", { @@ -412,7 +418,7 @@ QUnit.test("findQuery calls didFindQuery callback after finishing", function(ass QUnit.test("findQuery with params", function(assert) { assert.expect(1); - adapter._ajax = function(url, params, method) { + adapter._ajax = function(url, params, method) { assert.deepEqual(params, {foo: 'bar', num: 42}); return ajaxSuccess({posts: []}); }; @@ -778,7 +784,7 @@ QUnit.test("find() resolves with record", function(assert) { var data = {id: 1, name: 'Erik'}, record = RESTModel.create(); - + RESTModel.collectionKey = undefined; adapter._ajax = function(url, params, method) { return ajaxSuccess(data); @@ -799,7 +805,7 @@ QUnit.test("findAll() resolves with records", function(assert) { {id: 2, name: 'Aaron'} ], records = Ember.RecordArray.create(); - + RESTModel.collectionKey = undefined; adapter._ajax = function(url, params, method) { return ajaxSuccess(data); @@ -820,7 +826,7 @@ QUnit.test("findQuery() resolves with records", function(assert) { {id: 2, name: 'Aaron'} ], records = Ember.RecordArray.create(); - + RESTModel.collectionKey = undefined; adapter._ajax = function(url, params, method) { return ajaxSuccess(data); @@ -838,7 +844,7 @@ QUnit.test("createRecord() resolves with record", function(assert) { var data = {id: 1, name: 'Erik'}, record = RESTModel.create(); - + RESTModel.rootKey = undefined; adapter._ajax = function(url, params, method) { return ajaxSuccess(data); @@ -855,7 +861,7 @@ QUnit.test("saveRecord() resolves with record", function(assert) { var data = {id: 1, name: 'Erik'}, record = RESTModel.create({name: 'Ray'}); - + RESTModel.rootKey = undefined; adapter._ajax = function(url, params, method) { return ajaxSuccess(data); diff --git a/packages/ember-model/tests/belongs_to_test.js b/packages/ember-model/tests/belongs_to_test.js index 8232c13..3ac2bdf 100644 --- a/packages/ember-model/tests/belongs_to_test.js +++ b/packages/ember-model/tests/belongs_to_test.js @@ -56,6 +56,7 @@ QUnit.test("model can be specified with a string to a resolved path", function(a var App; Ember.run(function() { App = Ember.Application.create({}); + App.register('emstore:main', Ember.Model.Store); }); App.Article = Ember.Model.extend({ id: Ember.attr(String) @@ -64,7 +65,9 @@ QUnit.test("model can be specified with a string to a resolved path", function(a article: Ember.belongsTo('article', { key: 'article', embedded: true }) }); - var comment = App.Comment.create({container: App.__container__}); + var store = App.__container__.lookup('emstore:main'); + var comment = store.createRecord('comment', {}); + Ember.run(comment, comment.load, 1, { article: { id: 'a' } }); var article = Ember.run(comment, comment.get, 'article'); @@ -74,6 +77,8 @@ QUnit.test("model can be specified with a string to a resolved path", function(a }); QUnit.test("non embedded belongsTo should get a record by its id", function(assert) { + var done = assert.async(); + var Article = Ember.Model.extend({ slug: Ember.attr(String) }), @@ -89,7 +94,6 @@ QUnit.test("non embedded belongsTo should get a record by its id", function(asse Ember.run(comment, comment.load, 1, { article_slug: 'first-article' }); var article = Ember.run(comment, comment.get, 'article'); - var done = assert.async(); article.one('didLoad', function() { assert.equal(article.get('slug'), 'first-article'); assert.ok(article instanceof Article); @@ -98,6 +102,8 @@ QUnit.test("non embedded belongsTo should get a record by its id", function(asse }); QUnit.test("relationship should be refreshed when data changes", function(assert) { + var done = assert.async(); + var Article = Ember.Model.extend({ slug: Ember.attr(String) }), @@ -117,7 +123,6 @@ QUnit.test("relationship should be refreshed when data changes", function(assert Ember.run(comment, comment.load, 1, { article_slug: 'first-article' }); article = Ember.run(comment, comment.get, 'article'); - var done = assert.async(); article.one('didLoad', function() { assert.equal(article.get('slug'), 'first-article'); assert.ok(article instanceof Article); @@ -200,7 +205,6 @@ QUnit.test("un-embedded belongsTo CP should handle set", function(assert) { }); assert.deepEqual(post.toJSON(), {id: 1, author_id: 100}); - }); QUnit.test("embedded belongsTo CP should handle set", function(assert) { @@ -482,8 +486,6 @@ QUnit.test("relationships should be seralized when specified with string", funct QUnit.test("belongsTo from an embedded source is able to materialize without having to re-find", function(assert) { - - var Company = Ember.Company = Ember.Model.extend({ id: Ember.attr('string'), title: Ember.attr('string'), @@ -527,10 +529,7 @@ QUnit.test("belongsTo from an embedded source is able to materialize without hav assert.equal(project1, post1.get('project')); }); - QUnit.test("unloaded records are removed from reference cache", function(assert) { - - var Company = Ember.Company = Ember.Model.extend({ id: Ember.attr('string'), title: Ember.attr('string'), @@ -569,7 +568,6 @@ QUnit.test("unloaded records are removed from reference cache", function(assert) company = Company.find(1); var reloadedProject1 = company.get('projects.firstObject'); - assert.notEqual(project1, reloadedProject1); assert.equal(project1.get('title'), 'project one title'); assert.equal(reloadedProject1.get('title'), 'project one new title'); @@ -619,8 +617,6 @@ QUnit.test("unloaded records are removed from hasMany cache", function(assert) { }); QUnit.test("belongsTo records created are available from reference cache", function(assert) { - - var Company = Ember.Company = Ember.Model.extend({ id: Ember.attr('string'), title: Ember.attr('string'), @@ -701,10 +697,11 @@ QUnit.test("key defaults to model's property key", function(assert) { assert.deepEqual(comment.toJSON(), { article: 2 }); }); -QUnit.test("non embedded belongsTo should return a record with a container", function(assert) { +QUnit.test("non embedded belongsTo should return a record with an owner", function(assert) { var App; Ember.run(function() { App = Ember.Application.create({}); + App.register('emstore:main', Ember.Model.Store); }); App.Article = Ember.Model.extend({ id: Ember.attr(String) @@ -716,9 +713,11 @@ QUnit.test("non embedded belongsTo should return a record with a container", fun App.Article.adapter = Ember.FixtureAdapter.create(); App.Article.FIXTURES = [{ id: 'first-article' }]; - var comment = App.Comment.create({container: App.__container__}); + var store = App.__container__.lookup('emstore:main'); + var comment = store.createRecord('comment', {}); + Ember.run(comment, comment.load, 1, { article_slug: 'first-article' }); var article = Ember.run(comment, comment.get, 'article'); - assert.ok(article.get('container')); + assert.ok(Ember.getOwner(article)); Ember.run(App, 'destroy'); }); diff --git a/packages/ember-model/tests/has_many_test.js b/packages/ember-model/tests/has_many_test.js index 8a7d06e..57a32e3 100644 --- a/packages/ember-model/tests/has_many_test.js +++ b/packages/ember-model/tests/has_many_test.js @@ -86,8 +86,10 @@ QUnit.test("model can be specified with a string instead of a class", function(a QUnit.test("model can be specified with a string to a resolved path", function(assert) { var App; + Ember.run(function() { App = Ember.Application.create({}); + App.register('emstore:main', Ember.Model.Store); }); App.Subcomment = Ember.Model.extend({ @@ -101,7 +103,9 @@ QUnit.test("model can be specified with a string to a resolved path", function(a comments: Ember.hasMany('comment', { key: 'comments', embedded: true }) }); - var article = App.Article.create({container: App.__container__}); + var store = App.__container__.lookup('emstore:main'); + var article = store.createRecord('article', {}); + var subcomments = { subcomments: Ember.A([ {id: 'c'}, @@ -239,8 +243,6 @@ QUnit.test("materializing the relationship should not dirty the record", functio }); QUnit.test("has many records created are available from reference cache", function(assert) { - - var Company = Ember.Company = Ember.Model.extend({ id: Ember.attr('string'), title: Ember.attr('string'), @@ -265,10 +267,10 @@ QUnit.test("has many records created are available from reference cache", functi projects:[{ id: 1, title: 'project one title', - company: 1, - posts: [{id: 1, title: 'title', body: 'body', project:1 }, + company: 1, + posts: [{id: 1, title: 'title', body: 'body', project:1 }, {id: 2, title: 'title two', body: 'body two', project:1 }] - }] + }] }; Company.load([compJson]); @@ -306,10 +308,9 @@ QUnit.test("relationship type cannot be empty", function(assert) { Ember.run(article, article.load, 1, {comments: Ember.A([{token: 'a'}, {token: 'b'}])}); expectAssertion(assert, function() { - article.get('comments'); + article.get('comments'); }, /Type cannot be empty/); - }); QUnit.test("key defaults to model's property key", function(assert) { diff --git a/packages/ember-model/tests/model_test.js b/packages/ember-model/tests/model_test.js index eea390d..1b3e6e4 100644 --- a/packages/ember-model/tests/model_test.js +++ b/packages/ember-model/tests/model_test.js @@ -17,9 +17,6 @@ QUnit.module("Ember.Model", { {name: 'Erik'}, {name: 'Alex'} ]; - }, - afterEach: function() { - } }); @@ -87,23 +84,24 @@ QUnit.test("can define attributes with Ember.attr, data is accessible", function QUnit.test("can handle models without an ID", function(assert) { assert.expect(3); - var records = ModelWithoutID.find(); var done = assert.async(); + + var records = ModelWithoutID.find(); records.on('didLoad', function() { assert.equal(records.get('length'), 2); assert.equal(records.get('firstObject.name'), 'Erik'); assert.equal(records.get('lastObject.name'), 'Alex'); done(); }); - }); QUnit.test("can handle models with ID of zero", function(assert) { assert.expect(1); + var done = assert.async(); var ModelWithZeroID = Model.extend({ - id: Ember.attr(), - name: Ember.attr() + id: Ember.attr(), + name: Ember.attr() }); ModelWithZeroID.adapter = Ember.FixtureAdapter.create(); @@ -112,25 +110,25 @@ QUnit.test("can handle models with ID of zero", function(assert) { ]; var record = Ember.run(ModelWithZeroID, ModelWithZeroID.find, 0); - var done = assert.async(); record.on('didLoad', function() { assert.equal(record.get('name'), 'Erik'); done(); }); + }); -// test("coercion", function() { +// QUnit.test("coercion", function() { // }); QUnit.test(".find(id) delegates to the adapter's find method", function(assert) { assert.expect(6); + var done = assert.async(); var record = Ember.run(Model, Model.find, 'a'); assert.ok(record, "Record was returned by find"); assert.ok(!record.get('isLoaded')); assert.ok(record.get('isLoading')); - var done = assert.async(); record.on('didLoad', function() { assert.equal(record.get('name'), 'Erik', "Loaded value is accessible from the record"); @@ -191,12 +189,12 @@ QUnit.test(".reload() loads the record via the adapter after it was loaded", fun QUnit.test(".reload() returns a promise", function(assert) { assert.expect(2); + var done = assert.async(); Model.load([{ token: 'a', name: 'Yehuda' }]); var record = Ember.run(Model, Model.find, 'a'); var promise = Ember.run(record, record.reload); - var done = assert.async(); promise.then(function(resolvedRecord) { assert.ok(resolvedRecord === record, ".reload() resolved with same record"); assert.ok(true, ".reload() returned a promise"); @@ -206,9 +204,9 @@ QUnit.test(".reload() returns a promise", function(assert) { QUnit.test(".revert() sets the data back to its saved state", function(assert) { assert.expect(3); + var done = assert.async(); var record = Ember.run(Model, Model.find, 'a'); - var done = assert.async(); record.on('didLoad', function() { record.set('name', 'Brian'); @@ -280,16 +278,15 @@ QUnit.test(".clearCache destroys sideloadedData and record references", function assert.ok(Model._referenceCache === undefined); assert.ok(Model.sideloadedData === undefined); - }); QUnit.test("new records are added to the identity map", function(assert) { assert.expect(2); + var done = assert.async(); var record = Model.create({token: 2, name: 'Yehuda'}); record.save(); - var done = assert.async(); record.on("didCreateRecord", function() { assert.ok(Model._referenceCache); @@ -300,11 +297,11 @@ QUnit.test("new records are added to the identity map", function(assert) { QUnit.test("creating a new record adds it to existing record arrays", function(assert) { assert.expect(1); + var done = assert.async(); var records = Model.find(); var record = Model.create({token: 'b', name: 'Yehuda'}); record.save(); - var done = assert.async(); record.on('didSaveRecord', function() { assert.equal(records.get('length'), 2, "The record array was updated"); @@ -314,9 +311,9 @@ QUnit.test("creating a new record adds it to existing record arrays", function(a QUnit.test("destroying a record removes it from record arrays", function(assert) { assert.expect(2); + var done = assert.async(); var records = Model.find(); - var done = assert.async(); records.on('didLoad', function() { assert.equal(records.get('length'), 1, "The record array was updated"); var record = Model.find('a'); @@ -330,6 +327,7 @@ QUnit.test("destroying a record removes it from record arrays", function(assert) QUnit.test("record isNew & isSaving flags", function(assert) { assert.expect(5); + var done = assert.async(); var record = Model.create(); assert.ok(record.get('isNew')); @@ -338,8 +336,6 @@ QUnit.test("record isNew & isSaving flags", function(assert) { assert.ok(record.get('isNew')); assert.ok(record.get('isSaving')); - var done = assert.async(); - record.on('didSaveRecord', function() { assert.ok(!record.get('isNew')); assert.ok(!record.get('isSaving')); @@ -347,12 +343,11 @@ QUnit.test("record isNew & isSaving flags", function(assert) { }); }); - QUnit.test("record.toJSON() is generated from Ember.attr definitions", function(assert) { assert.expect(1); + var done = assert.async(); var record = Ember.run(Model, Model.find, 'a'); - var done = assert.async(); record.on('didLoad', function() { assert.deepEqual(record.toJSON(), {token: 'a', name: 'Erik'}); done(); @@ -361,11 +356,11 @@ QUnit.test("record.toJSON() is generated from Ember.attr definitions", function( QUnit.test("record.toJSON() uses rootKey if it is defined", function(assert) { assert.expect(1); + var done = assert.async(); Model.rootKey = 'model'; var record = Ember.run(Model, Model.find, 'a'); - var done = assert.async(); record.on('didLoad', function() { assert.deepEqual(record.toJSON(), { model: { token: 'a', name: 'Erik' } }); done(); @@ -391,9 +386,9 @@ QUnit.test("record.toJSON() can use computed property as rootKey", function(asse QUnit.test("Model.fetch() returns a promise", function(assert) { assert.expect(1); + var done = assert.async(); var promise = Ember.run(Model, Model.fetch); - var done = assert.async(); promise.then(function(record) { assert.ok(record.get('isLoaded')); done(); @@ -402,9 +397,9 @@ QUnit.test("Model.fetch() returns a promise", function(assert) { QUnit.test("Model.fetch(id) returns a promise", function(assert) { assert.expect(1); + var done = assert.async(); var promise = Ember.run(Model, Model.fetch, 'a'); - var done = assert.async(); promise.then(function(record) { assert.ok(record.get('isLoaded')); done(); @@ -413,9 +408,9 @@ QUnit.test("Model.fetch(id) returns a promise", function(assert) { QUnit.test("Model#save() returns a promise", function(assert) { assert.expect(2); + var done = assert.async(); var promise = Ember.run(Model, Model.fetch, 'a'); - var done = assert.async(); promise.then(function(record) { record.set('name', 'Stefan'); record.save().then(function(record2) { @@ -428,9 +423,9 @@ QUnit.test("Model#save() returns a promise", function(assert) { QUnit.test("Model#deleteRecord() returns a promise", function(assert) { assert.expect(2); + var done = assert.async(); var promise = Ember.run(Model, Model.fetch, 'a'); - var done = assert.async(); promise.then(function(record) { record.deleteRecord().then(function(record2) { assert.equal(record, record2); @@ -442,10 +437,10 @@ QUnit.test("Model#deleteRecord() returns a promise", function(assert) { QUnit.test("Model#save() works as expected", function(assert) { assert.expect(2); + var done = assert.async(); var recordsPromise = Ember.run(Model, Model.fetch); var record = Ember.run(Model, Model.find, 'a'); - var done = assert.async(); recordsPromise.then(function(records) { assert.ok(!record.get('isNew')); @@ -460,6 +455,7 @@ QUnit.test("Model#save() works as expected", function(assert) { QUnit.test("Model#create() works as expected", function(assert) { assert.expect(10); + var done = assert.async(); var record = Model.create({name: 'Yehuda'}); @@ -467,7 +463,6 @@ QUnit.test("Model#create() works as expected", function(assert) { assert.ok(record.get('isLoaded'), "record isLoaded upon instantiation"); assert.ok(!record.get('isSaving'), "record isSaving is false upon instantiation"); - var done = assert.async(); record.save().then(function(record2) { assert.equal(record, record2, "The same record object is passed into the resolved promise"); assert.ok(!record.get('isNew'), "The record is no longer new after being saved"); @@ -617,29 +612,29 @@ QUnit.test("toJSON works with string names", function(assert) { var App; Ember.run(function() { App = Ember.Application.create({}); + App.register('emstore:main', Ember.Model.Store); }); var Comment = Ember.Model.extend({ - container: App.__container__, id: Ember.attr(), text: Ember.attr() }), Author = Ember.Model.extend({ - container: App.__container__, id: Ember.attr(), name: Ember.attr() }), Article = Ember.Model.extend({ - container: App.__container__, id: 1, title: Ember.attr(), comments: Ember.hasMany('comment', { key: 'comments' }), author: Ember.belongsTo('author', { key: 'author' }) }); - App.registry.register('model:comment', Comment); - App.registry.register('model:author', Author); - App.registry.register('model:article', Article); + App.register('model:comment', Comment); + App.register('model:author', Author); + App.register('model:article', Article); + + assert.ok(true); var articleData = { id: 1, @@ -658,12 +653,12 @@ QUnit.test("toJSON works with string names", function(assert) { {id: 3, text: 'tres'} ]; + var store = App.__container__.lookup('emstore:main'); + var article = store.createRecord('article', {name: "Erik"}); - var article = Article.create(); Ember.run(article, article.load, articleData.id, articleData); var json = Ember.run(article, article.toJSON); - assert.deepEqual(json.comments, [1, 2, 3], "JSON should contain ids of hasMany relationship"); assert.equal(json.author, 1, "JSON should contain id of belongsTo relationship"); Ember.run(function() { @@ -673,6 +668,7 @@ QUnit.test("toJSON works with string names", function(assert) { QUnit.test("creating a record with camelizedKeys = true works as expected", function(assert) { assert.expect(1); + var done = assert.async(); var Page = Ember.Model.extend({ someAuthor: Ember.attr() @@ -684,7 +680,6 @@ QUnit.test("creating a record with camelizedKeys = true works as expected", func var record = Page.create({someAuthor: 'Brian'}); record.save(); - var done = assert.async(); record.on('didCreateRecord', function() { assert.equal(record.get('someAuthor'), 'Brian', 'preserves data keys on didCreateRecord'); @@ -724,6 +719,7 @@ QUnit.test("record is available in reference cache when load is run in cachedRec QUnit.test("fetchQuery returns a promise", function(assert) { assert.expect(1); + var done = assert.async(); var FixtureFindQueryAdapter = Ember.FixtureAdapter.extend({ findQuery: function(klass, records, params) { @@ -737,7 +733,6 @@ QUnit.test("fetchQuery returns a promise", function(assert) { Model.adapter = FixtureFindQueryAdapter.create(); var promise = Ember.run(Model, Model.fetchQuery, {name: 'a'}); - var done = assert.async(); promise.then(function(records) { assert.ok(records.get('isLoaded')); done(); @@ -746,6 +741,7 @@ QUnit.test("fetchQuery returns a promise", function(assert) { QUnit.test("second promise returned by fetchAll when loading, resolves on load", function(assert) { assert.expect(1); + var done = assert.async(); var deferred = Ember.RSVP.defer(); @@ -763,7 +759,6 @@ QUnit.test("second promise returned by fetchAll when loading, resolves on load", var firstPromise = Ember.run(Model, Model.fetchAll); var secondPromise = Ember.run(Model, Model.fetchAll); - var done = assert.async(); secondPromise.then(function(records) { assert.ok(records.get('isLoaded'), 'records should be loaded when promise resolves'); @@ -774,19 +769,22 @@ QUnit.test("second promise returned by fetchAll when loading, resolves on load", }); QUnit.test("fetchAll returns a promise", function(assert) { - var promise = Ember.run(Model, Model.fetchAll); - var done = assert.async(); - promise.then(function(records) { - assert.ok(records.get('isLoaded')); - assert.equal(records.get('length'), 1); - done(); - }); + assert.expect(2); + var done = assert.async(); + + var promise = Ember.run(Model, Model.fetchAll); + promise.then(function(records) { + assert.ok(records.get('isLoaded')); + assert.equal(records.get('length'), 1); + done(); + }); }); QUnit.test("fetchAll returns promise if findAll RecordArray already exists", function(assert) { assert.expect(1); - var promise = Ember.run(Model, Model.fetch); var done = assert.async(); + + var promise = Ember.run(Model, Model.fetch); promise.then(function(records) { var secondPromise = Ember.run(Model, Model.fetch); secondPromise.then(function() { @@ -798,9 +796,10 @@ QUnit.test("fetchAll returns promise if findAll RecordArray already exists", fun QUnit.test("fetchAll resolves to same RecordArray when called multiple times", function(assert) { assert.expect(1); + var done = assert.async(); + var promiseOne = Ember.run(Model, Model.fetch); var promiseTwo = Ember.run(Model, Model.fetch); - var done = assert.async(); Ember.RSVP.all([promiseOne, promiseTwo]).then(function(records) { assert.ok(records[0] === records[1], "Both promises resolve with same RecordArray"); done(); @@ -808,6 +807,9 @@ QUnit.test("fetchAll resolves to same RecordArray when called multiple times", f }); QUnit.test("fetchMany returns a promise", function(assert) { + assert.expect(1); + var done = assert.async(); + var FixtureFindQueryAdapter = Ember.FixtureAdapter.extend({ findMany: function(klass, records, params) { records.set('isLoaded', true); @@ -820,7 +822,6 @@ QUnit.test("fetchMany returns a promise", function(assert) { Model.adapter = FixtureFindQueryAdapter.create(); var promise = Ember.run(Model, Model.fetchMany, ['a', 'b']); - var done = assert.async(); promise.then(function(records) { assert.ok(records.get('isLoaded')); done(); @@ -829,9 +830,9 @@ QUnit.test("fetchMany returns a promise", function(assert) { QUnit.test("fetchById returns a promise", function(assert) { assert.expect(1); + var done = assert.async(); var promise = Ember.run(Model, Model.fetchById, 'a'); - var done = assert.async(); promise.then(function(record) { assert.ok(record.get('isLoaded')); done(); @@ -840,6 +841,7 @@ QUnit.test("fetchById returns a promise", function(assert) { QUnit.test("fetchQuery resolves with error object", function(assert) { assert.expect(1); + var done = assert.async(); var FixtureFindQueryAdapter = Ember.FixtureAdapter.extend({ findQuery: function(klass, records, params) { @@ -852,7 +854,6 @@ QUnit.test("fetchQuery resolves with error object", function(assert) { Model.adapter = FixtureFindQueryAdapter.create(); var promise = Ember.run(Model, Model.fetchQuery, {name: 'a'}); - var done = assert.async(); promise.then(null, function(error) { assert.deepEqual(error, {error: true}); done(); @@ -861,6 +862,7 @@ QUnit.test("fetchQuery resolves with error object", function(assert) { QUnit.test("fetchAll resolves with error object", function(assert) { assert.expect(1); + var done = assert.async(); var FixtureFindQueryAdapter = Ember.FixtureAdapter.extend({ findAll: function(klass, records, params) { @@ -873,7 +875,6 @@ QUnit.test("fetchAll resolves with error object", function(assert) { Model.adapter = FixtureFindQueryAdapter.create(); var promise = Ember.run(Model, Model.fetchAll); - var done = assert.async(); promise.then(null, function(error) { assert.equal(error.error, true); done(); @@ -882,6 +883,7 @@ QUnit.test("fetchAll resolves with error object", function(assert) { QUnit.test("fetchById resolves with error object", function(assert) { assert.expect(1); + var done = assert.async(); var FixtureFindQueryAdapter = Ember.FixtureAdapter.extend({ find: function(record, id) { @@ -894,7 +896,6 @@ QUnit.test("fetchById resolves with error object", function(assert) { Model.adapter = FixtureFindQueryAdapter.create(); var promise = Ember.run(Model, Model.fetchById, 'a'); - var done = assert.async(); promise.then(null, function(error) { assert.deepEqual(error, {error: true}); done(); @@ -902,6 +903,9 @@ QUnit.test("fetchById resolves with error object", function(assert) { }); QUnit.test("fetchMany resolves with error object", function(assert) { + assert.expect(1); + var done = assert.async(); + var FixtureFindQueryAdapter = Ember.FixtureAdapter.extend({ findMany: function(klass, records, params) { return new Ember.RSVP.Promise(function(resolve, reject) { @@ -913,7 +917,6 @@ QUnit.test("fetchMany resolves with error object", function(assert) { Model.adapter = FixtureFindQueryAdapter.create(); var promise = Ember.run(Model, Model.fetchMany, ['a', 'b']); - var done = assert.async(); promise.then(null, function(error) { assert.deepEqual(error, {error: true}); done(); @@ -922,22 +925,22 @@ QUnit.test("fetchMany resolves with error object", function(assert) { QUnit.test(".clearCache destroys _findAllRecordArray reference", function(assert) { assert.expect(1); + var done = assert.async(); var records = Model.find(); - var done = assert.async(); records.on('didLoad', function() { Model.clearCache(); var newRecords = Model.find(); - assert.equal( newRecords.get( 'isLoaded' ), false, "clearCache should clear _findAllRecordArray" ); + assert.equal(newRecords.get( 'isLoaded' ), false, "clearCache should clear _findAllRecordArray"); done(); }); }); -// TODO: test that creating a record calls load - -// test('Model#registerRecordArray', function(){ - -// }); - -// test('Model#unregisterRecordArray', function(){ - -// }); +// // TODO: test that creating a record calls load +// +// // QUnit.test('Model#registerRecordArray', function(){ +// +// // }); +// +// // QUnit.test('Model#unregisterRecordArray', function(){ +// +// // }); diff --git a/packages/ember-model/tests/record_array_test.js b/packages/ember-model/tests/record_array_test.js index 3e03fc1..639af1c 100644 --- a/packages/ember-model/tests/record_array_test.js +++ b/packages/ember-model/tests/record_array_test.js @@ -1,4 +1,4 @@ -var Model, container; +var Model; function ajaxSuccess(data) { return new Ember.RSVP.Promise(function(resolve, reject) { @@ -18,27 +18,32 @@ QUnit.module("Ember.RecordArray", { {id: 2, name: 'Stefan'}, {id: 3, name: 'Kris'} ]; - container = new Ember.Registry().container(); - }, - afterEach: function() { } + } }); -QUnit.test("load creates records with container when container exists", function(assert) { - var records = Ember.RecordArray.create({modelClass: Model, container: container}); +QUnit.test("load creates records with owner when owner exists", function(assert) { + assert.expect(6); + + var owner = createOwner(); + + var records = Ember.RecordArray.create({ modelClass: Model }); + Ember.setOwner(records, owner); Ember.run(records, records.load, Model, Model.FIXTURES); records.forEach(function(record){ assert.ok(record.get('isLoaded')); - assert.ok(record.get('container')); + assert.equal(Ember.getOwner(record), owner); }); }); QUnit.test("when called with findMany, should contain an array of the IDs contained in the RecordArray", function(assert) { + assert.expect(4); + var done = assert.async(); + var records = Ember.run(Model, Model.find, [1,2,3]); assert.deepEqual(records.get('_ids'), [1,2,3]); assert.equal(records.get('length'), 0); assert.ok(!records.get('isLoaded')); - var done = assert.async(); records.one('didLoad', function() { assert.equal(records.get('length'), 3); @@ -123,7 +128,6 @@ QUnit.test("findQuery RecordArray implements reload", function(assert) { assert.equal(records.get('length'), 3); assert.ok(records.get('isLoaded')); assert.deepEqual(RESTModel.find(2).toJSON(), {id: 2, name: 'Amos'}); - }); QUnit.test("findMany RecordArray implements reload", function(assert) { @@ -166,7 +170,6 @@ QUnit.test("findMany RecordArray implements reload", function(assert) { assert.equal(records.get('length'), 2); assert.ok(records.get('isLoaded')); assert.deepEqual(RESTModel.find(2).toJSON(), {id: 2, name: 'Amos'}); - }); QUnit.test("reload handles record removal", function(assert) { diff --git a/packages/ember-model/tests/store_test.js b/packages/ember-model/tests/store_test.js index c99ce5c..87d3756 100644 --- a/packages/ember-model/tests/store_test.js +++ b/packages/ember-model/tests/store_test.js @@ -1,11 +1,9 @@ -var TestModel, EmbeddedModel, UUIDModel, store, registry, container, App; +var TestModel, EmbeddedModel, UUIDModel, store, owner; QUnit.module("Ember.Model.Store", { beforeEach: function() { - registry = new Ember.Registry(); - container = registry.container(); + owner = createOwner(); - store = Ember.Model.Store.create({container: container}); TestModel = Ember.Model.extend({ token: Ember.attr(), name: Ember.attr(), @@ -61,32 +59,34 @@ QUnit.module("Ember.Model.Store", { }); EmbeddedModel.adapter = Ember.FixtureAdapter.create({}); - registry.register('model:test', TestModel); - registry.register('model:embedded', EmbeddedModel); - registry.register('model:uuid', UUIDModel); - registry.register('emstore:main', Ember.Model.Store); + owner.register('model:test', TestModel); + owner.register('model:embedded', EmbeddedModel); + owner.register('model:uuid', UUIDModel); + owner.register('emstore:main', Ember.Model.Store); + + store = owner.lookup('emstore:main'); } }); -QUnit.test("store.createRecord(type) returns a record with a container", function(assert) { +QUnit.test("store.createRecord(type) returns a record with an owner", function(assert) { var record = Ember.run(store, store.createRecord, 'test'); - assert.equal(record.container, container); - assert.equal(record.container, container); + assert.equal(Ember.getOwner(record), owner); }); QUnit.test("store.createRecord(type) with properties", function(assert) { assert.expect(2); + var record = Ember.run(store, store.createRecord, 'test', {token: 'c', name: 'Andrew'}); assert.equal(record.get('token'), 'c'); assert.equal(record.get('name'), 'Andrew'); }); -QUnit.test("model.load(hashes) returns a existing record with correct container", function(assert) { +QUnit.test("model.load(hashes) returns a existing record with correct owner", function(assert) { var model = store.modelFor('uuid'), record = Ember.run(store, store.createRecord, 'uuid'); assert.equal(model, UUIDModel); - assert.equal(record.container, container); + assert.equal(Ember.getOwner(record), owner); assert.ok(record.set('token', 'c')); @@ -98,68 +98,75 @@ QUnit.test("model.load(hashes) returns a existing record with correct container" assert.equal(record.get('id'), 1234); assert.equal(record.get('token'), 'd'); assert.equal(record.get('name'), 'Andrew'); - assert.equal(record.get('container'), container); + assert.equal(Ember.getOwner(record), owner); - model.load({id: 1234, name: 'Peter'}, container); + model.load({id: 1234, name: 'Peter'}, owner); assert.equal(record.get('id'), 1234); assert.equal(record.get('token'), undefined); assert.equal(record.get('name'), 'Peter'); - assert.equal(record.get('container'), container); + assert.equal(Ember.getOwner(record), owner); }); -QUnit.test("store.find(type) returns a record with hasMany and belongsTo that should all have a container", function(assert) { +QUnit.test("store.find(type) returns a record with hasMany and belongsTo that should all have an owner", function(assert) { assert.expect(4); - var promise = Ember.run(store, store.find, 'test', 'a'); var done = assert.async(); + + var promise = Ember.run(store, store.find, 'test', 'a'); + promise.then(function(record) { - assert.ok(record.get('container')); - assert.ok(record.get('embeddedBelongsTo').get('container')); + assert.equal(Ember.getOwner(record), owner); + + assert.equal(Ember.getOwner(record.get('embeddedBelongsTo')), owner); record.get('embeddedHasmany').forEach(function(embeddedBelongsToRecord) { - assert.ok(embeddedBelongsToRecord.get('container')); + assert.equal(Ember.getOwner(embeddedBelongsToRecord), owner); }); + done(); }); }); -QUnit.test("store.find(type, id) returns a promise and loads a container for the record", function(assert) { +QUnit.test("store.find(type, id) returns a promise and loads an owner for the record", function(assert) { assert.expect(2); - - var promise = Ember.run(store, store.find, 'test','a'); var done = assert.async(); + + var promise = Ember.run(store, store.find, 'test', 'a'); promise.then(function(record) { assert.ok(record.get('isLoaded')); - assert.ok(record.get('container')); + assert.equal(Ember.getOwner(record), owner); + done(); }); }); -QUnit.test("store.find(type) returns a promise and loads a container for each record", function(assert) { +QUnit.test("store.find(type) returns a promise and loads an owner for each record", function(assert) { assert.expect(5); + var done = assert.async(); var promise = Ember.run(store, store.find, 'test'); - var done = assert.async(); promise.then(function(records) { assert.equal(records.content.length, 2); + records.forEach(function(record){ assert.ok(record.get('isLoaded')); - assert.ok(record.get('container')); + assert.equal(Ember.getOwner(record), owner); }); + done(); }); }); -QUnit.test("store.find(type, Array) returns a promise and loads a container for each record", function(assert) { +QUnit.test("store.find(type, Array) returns a promise and loads an owner for each record", function(assert) { assert.expect(5); + var done = assert.async(); var promise = Ember.run(store, store.find, 'test', ['a','b']); - var done = assert.async(); promise.then(function(records) { assert.equal(records.content.length, 2); records.forEach(function(record){ assert.ok(record.get('isLoaded')); - assert.ok(record.get('container')); + assert.equal(Ember.getOwner(record), owner); }); done(); }); @@ -172,39 +179,40 @@ QUnit.test("store.adapterFor(type) returns klass.adapter first", function(assert QUnit.test("store.adapterFor(type) returns type adapter if no klass.adapter", function(assert) { TestModel.adapter = undefined; - registry.register('adapter:test', Ember.FixtureAdapter); - registry.register('adapter:application', null); + owner.register('adapter:test', Ember.FixtureAdapter); + owner.unregister('adapter:application'); var adapter = Ember.run(store, store.adapterFor, 'test'); assert.ok(adapter instanceof Ember.FixtureAdapter); }); QUnit.test("store.adapterFor(type) returns application adapter if no klass.adapter or type adapter", function(assert) { TestModel.adapter = undefined; - registry.register('adapter:test', null); - registry.register('adapter:application', Ember.FixtureAdapter); + owner.unregister('adapter:test'); + owner.register('adapter:application', Ember.FixtureAdapter); var adapter = Ember.run(store, store.adapterFor, 'test'); assert.ok(adapter instanceof Ember.FixtureAdapter); + assert.ok(true); }); QUnit.test("store.adapterFor(type) defaults to RESTAdapter if no adapter specified", function(assert) { - TestModel.adapter = undefined; - registry.register('adapter:test', null); - registry.register('adapter:application', null); - registry.register('adapter:REST', Ember.RESTAdapter); + owner.unregister('adapter:test'); + owner.unregister('adapter:application'); + owner.register('adapter:REST', Ember.RESTAdapter); var adapter = Ember.run(store, store.adapterFor, 'test'); assert.ok(adapter instanceof Ember.RESTAdapter); }); QUnit.test("store.find(type) records use application adapter if no klass.adapter or type adapter", function(assert) { assert.expect(3); + var done = assert.async(); + TestModel.adapter = undefined; EmbeddedModel.adapter = undefined; - registry.register('adapter:test', null); - registry.register('adapter:application', Ember.FixtureAdapter); + owner.unregister('adapter:test'); + owner.register('adapter:application', Ember.FixtureAdapter); var promise = Ember.run(store, store.find, 'test','a'); - var done = assert.async(); promise.then(function(record) { assert.ok(record.get('constructor.adapter') instanceof Ember.FixtureAdapter, 'Adapter for record is application adapter'); @@ -215,20 +223,21 @@ QUnit.test("store.find(type) records use application adapter if no klass.adapter }); QUnit.test("Registering a custom store on application works", function(assert) { + var app; Ember.run(function() { var CustomStore = Ember.Model.Store.extend({ custom: true }); - App = Ember.Application.create({ + app = Ember.Application.create({ TestRoute: Ember.Route.extend(), Store: CustomStore }); }); - container = App.__container__; + var container = app.__container__; assert.ok(container.lookup('emstore:application')); assert.ok(container.lookup('emstore:main').get('custom')); var testRoute = container.lookup('route:test'); assert.ok(testRoute.get('emstore.custom')); - Ember.run(App, 'destroy'); + Ember.run(app, 'destroy'); }); diff --git a/tests/runner.html.tmpl b/tests/runner.html.tmpl index 7ed0b6d..4c1b03b 100644 --- a/tests/runner.html.tmpl +++ b/tests/runner.html.tmpl @@ -20,12 +20,11 @@ - + diff --git a/tests/expect_assertion_helper.js b/tests/test_helpers.js similarity index 82% rename from tests/expect_assertion_helper.js rename to tests/test_helpers.js index 1f737e9..46f9d67 100644 --- a/tests/expect_assertion_helper.js +++ b/tests/test_helpers.js @@ -51,3 +51,17 @@ } } window.expectAssertion = expectAssertion; + + +var Owner = Ember.Object.extend(Ember._RegistryProxyMixin, Ember._ContainerProxyMixin); +window.createOwner = function() { + var registry = new Ember.Registry(); + var owner = Owner.create({ + __registry__: registry + }); + var container = registry.container({ + owner: owner + }); + owner.__container__ = container; + return owner; +};