From 06a1b7a79943b0df680b22347afeb31060c17be6 Mon Sep 17 00:00:00 2001 From: Gavin Joyce Date: Tue, 13 Feb 2018 09:36:39 +0000 Subject: [PATCH 1/2] upgrade to Ember 2.12.0 --- .jshintrc | 1 + bower.json | 2 +- ember-model.js | 2 +- package-lock.json | 1827 +++++++++++++++++ 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 | 37 +- .../tests/adapter/find_all_test.js | 1 + .../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 | 100 +- tests/runner.html.tmpl | 2 +- ...ct_assertion_helper.js => test_helpers.js} | 14 + 19 files changed, 2112 insertions(+), 227 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..44aefe9 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.12.0" }, "devDependencies": { "qunit": "~2.5" diff --git a/ember-model.js b/ember-model.js index f97c756..b156323 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..813e698 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1827 @@ +{ + "name": "ember-model", + "version": "0.0.18", + "lockfileVersion": 1, + "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 + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "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 + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true + }, + "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 + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "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 + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "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 + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": 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, + "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 + }, + "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": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "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 + }, + "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 + }, + "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 + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true + }, + "cli": { + "version": "0.4.5", + "resolved": "https://registry.npmjs.org/cli/-/cli-0.4.5.tgz", + "integrity": "sha1-ePlIXNFhtWbppsctcXDEJw6B22E=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "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": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "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 + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true + }, + "connect": { + "version": "2.7.11", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.7.11.tgz", + "integrity": "sha1-9WHV7vcLjXGcOX9yTTS6QGXHej4=", + "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 + }, + "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-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 + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true + } + } + }, + "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 + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true + }, + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": 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 + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true + }, + "es6-promise": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", + "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==", + "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 + }, + "eventemitter2": { + "version": "0.4.14", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", + "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", + "dev": true + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extract-zip": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.6.tgz", + "integrity": "sha1-EpDt6NINCHK0Kf0/NRyhKOxe+Fw=", + "dev": true, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "falafel": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/falafel/-/falafel-0.1.6.tgz", + "integrity": "sha1-MITPPUG1nRXIE75vJZVX/cgrBmA=", + "dev": true, + "dependencies": { + "esprima": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", + "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", + "dev": true + } + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "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 + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "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 + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "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 + } + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true + }, + "formidable": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.14.tgz", + "integrity": "sha1-Kz9MQRy7X91pXESEPiojUUpDIxo=", + "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-extra": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz", + "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=", + "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 + }, + "gaze": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.2.tgz", + "integrity": "sha1-hHIkZ3rbiHDWeSV+0ziP22HkAQU=", + "dev": true + }, + "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 + }, + "getobject": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", + "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "dev": true + }, + "globule": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.2.0.tgz", + "integrity": "sha1-HcScaCLdnoovoAuiopUAboZkvQk=", + "dev": true, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true + }, + "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 + } + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "grunt": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/grunt/-/grunt-1.0.2.tgz", + "integrity": "sha1-TmpeaVtwRy/VME9fqeNCNoNqc7w=", + "dev": true, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true + }, + "grunt-cli": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.2.0.tgz", + "integrity": "sha1-VisRnrsGndtGSs4oRVAb6Xs1tqg=", + "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 + } + } + }, + "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 + }, + "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 + }, + "grunt-contrib-qunit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/grunt-contrib-qunit/-/grunt-contrib-qunit-2.0.0.tgz", + "integrity": "sha1-VKUbSyyE/uYsO34AFFySjR7Ct+w=", + "dev": true + }, + "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 + }, + "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 + }, + "grunt-curl": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/grunt-curl/-/grunt-curl-1.1.1.tgz", + "integrity": "sha1-Is9fPNoHx6ybTS1rKCJqzFVJdkI=", + "dev": true, + "dependencies": { + "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": "0.2.10", + "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", + "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, + "dependencies": { + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", + "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 + }, + "cryptiles": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", + "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "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 + }, + "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 + }, + "hawk": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.13.1.tgz", + "integrity": "sha1-NheViCH1gxHk1/beKR/KZitBLvQ=", + "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 + }, + "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 + }, + "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 + }, + "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 + }, + "oauth-sign": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", + "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", + "dev": true + }, + "request": { + "version": "2.21.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.21.0.tgz", + "integrity": "sha1-VyirnEXlqHyZ2szVMCmLZnOoaNc=", + "dev": true + }, + "sntp": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", + "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "dev": true, + "dependencies": { + "hoek": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", + "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", + "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 + } + } + }, + "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, + "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 + }, + "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, + "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, + "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 + }, + "grunt-lib-phantomjs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/grunt-lib-phantomjs/-/grunt-lib-phantomjs-1.1.0.tgz", + "integrity": "sha1-np7c3Z/S3UDgwYHJQ3HVcqpe6tI=", + "dev": true, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "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 + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true + } + } + }, + "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 + }, + "grunt-release": { + "version": "git+https://github.com/trek/grunt-release.git#7b766605c85605f2845bf93492a1ec1de6daa7a1", + "dev": true, + "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 + }, + "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 + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true + }, + "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 + }, + "hasha": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz", + "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=", + "dev": true + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "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 + }, + "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-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true + }, + "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 + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "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 + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true + }, + "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-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "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": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "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 + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "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 + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jshint": { + "version": "2.1.11", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.1.11.tgz", + "integrity": "sha1-61EI/vm6Xd67gwmD9XLSQuSeP5Y=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true + }, + "kew": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", + "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=", + "dev": true + }, + "klaw": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", + "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", + "dev": true + }, + "knox": { + "version": "0.8.10", + "resolved": "https://registry.npmjs.org/knox/-/knox-0.8.10.tgz", + "integrity": "sha1-ai7c2sHSrjedHhmU1Vm5XCg7JYg=", + "dev": true, + "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 + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "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 + }, + "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, + "dependencies": { + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true + } + } + }, + "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 + }, + "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.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true + }, + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "dev": true + }, + "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.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.0.tgz", + "integrity": "sha1-HXMHam35hs2TROFecfzAWkyavxI=", + "dev": true, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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 + }, + "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 + }, + "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.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "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 + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true + }, + "package": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/package/-/package-1.0.1.tgz", + "integrity": "sha1-0lofmeJQbcsn1nBLg9yooxLk7cw=", + "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 + }, + "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 + }, + "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-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true + }, + "pause": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.0.1.tgz", + "integrity": "sha1-HUCLP9t2kjuVQ9lvtMnf1TXZy10=", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "phantomjs-prebuilt": { + "version": "2.1.16", + "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz", + "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=", + "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 + }, + "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 + }, + "progress": { + "version": "1.1.8", + "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "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, + "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 + }, + "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 + }, + "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 + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "dependencies": { + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + } + } + }, + "request-progress": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz", + "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=", + "dev": true + }, + "resolve": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + }, + "rimraf": { + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", + "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", + "dev": true + }, + "s3": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/s3/-/s3-0.3.1.tgz", + "integrity": "sha1-dv8JcydEtF14XuHXkBol65QAMKI=", + "dev": true + }, + "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 + }, + "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 + }, + "shelljs": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.1.4.tgz", + "integrity": "sha1-37vnjVbDwBaNL7eeEOzR28sH7A4=", + "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": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "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 + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "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 + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "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, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "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 + }, + "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 + } + } + }, + "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 + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "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 + }, + "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 + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "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 + }, + "temporary": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/temporary/-/temporary-0.0.8.tgz", + "integrity": "sha1-oYqYHSi6jKNgJ/s8MFOMPst0CsA=", + "dev": true + }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=", + "dev": true + }, + "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, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "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.1.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.1.0.tgz", + "integrity": "sha1-TZMuXH6kEcynajEtOaYGIA/VDNk=", + "dev": true + } + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "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.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "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, + "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 + }, + "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 + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "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 + }, + "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 + }, + "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 + }, + "xml2js": { + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.2.8.tgz", + "integrity": "sha1-m4FpCTFjH/CdGVdUn69U9PmAs8I=", + "dev": true + }, + "yargs": { + "version": "3.5.4", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.5.4.tgz", + "integrity": "sha1-2K/49mXpTDS9JZvevRv68N3TU2E=", + "dev": true, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz", + "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=", + "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 36e4751..383c4b8 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('store:main'); + var owner = Ember.getOwner(record); + + if (owner) { + return owner.lookup('store: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 (store) { diff --git a/packages/ember-model/lib/has_many.js b/packages/ember-model/lib/has_many.js index aa5652c..8c608e4 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 store = record.container.lookup('store:main'); + var store = Ember.getOwner(record).lookup('store:main'); this.type = store.modelFor(type); this.type.reopenClass({ adapter: store.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 f273129..476d1c7 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); } }, @@ -64,6 +70,7 @@ Ember.onLoad('Ember.Application', function(Application) { initialize: function() { var application = arguments[1] || arguments[0]; var store = application.Store || Ember.Model.Store; + application.register('store:application', store); application.register('store:main', store); diff --git a/packages/ember-model/tests/adapter/find_all_test.js b/packages/ember-model/tests/adapter/find_all_test.js index 70851e2..ff0ee06 100644 --- a/packages/ember-model/tests/adapter/find_all_test.js +++ b/packages/ember-model/tests/adapter/find_all_test.js @@ -39,6 +39,7 @@ QUnit.test("Model.find() returns the same RecordArray for each successful call", assert.equal(firstResult, secondResult, "The same RecordArray was returned"); }); +//TODO: GJ: this fails with `grunt test` but not `grunt develop` QUnit.test("Model.find() returns a new RecordArray if the last call failed", function(assert) { var Model = Ember.Model.extend(); Model.adapter = { 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..393879c 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('store: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('store: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('store: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('store: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..ede4a7b 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('store: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('store: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..fe141b7 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('store: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('store: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 b001f26..6071915 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('store:main', Ember.Model.Store); + owner.register('model:test', TestModel); + owner.register('model:embedded', EmbeddedModel); + owner.register('model:uuid', UUIDModel); + owner.register('store:main', Ember.Model.Store); + + store = owner.lookup('store: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,22 @@ 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('store:application')); assert.ok(container.lookup('store:main').get('custom')); var testRoute = container.lookup('route:test'); assert.ok(testRoute.get('store.custom')); - Ember.run(App, 'destroy'); + Ember.run(app, 'destroy'); }); diff --git a/tests/runner.html.tmpl b/tests/runner.html.tmpl index 6de89ac..29f8759 100644 --- a/tests/runner.html.tmpl +++ b/tests/runner.html.tmpl @@ -20,7 +20,7 @@ - +