diff --git a/.travis.yml b/.travis.yml index 6f7ffed0d6b..422e694a68d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,7 +14,6 @@ cache: before_install: - | - phantomjs --version export DISPLAY=:99.0 sh -e /etc/init.d/xvfb start @@ -33,8 +32,8 @@ after_success: env: global: - - SAUCE_USERNAME=ember-ci - - SAUCE_ACCESS_KEY=b5cff982-069f-4a0d-ac34-b77e57c2e295 + - BROWSERSTACK_USERNAME=emberjscoreteam1 + - BROWSERSTACK_ACCESS_KEY=YsPxXKcahx9XszyHS2Gr - DISABLE_SOURCE_MAPS=true - BROCCOLI_ENV=production - S3_BUCKET_NAME=builds.emberjs.com @@ -52,10 +51,11 @@ env: - secure: e0yxVfwVW61d3Mi/QBOsY6Rfd1mZd3VXUd9xNRoz/fkvQJRuVwDe7oG3NOuJ4LZzvMw7BJ+zpDV9D8nKhAyPEEOgpkkMHUB7Ds83pHG4qSMzm4EAwBCadDLXCQirldz8dzN5FAqgGucXoj5fj/p2SKOkO6qWIZveGr8pdBJEG1E= matrix: - TEST_SUITE=each-package-tests PUBLISH=true + - TEST_SUITE=browserstack - TEST_SUITE=built-tests EMBER_ENV=production DISABLE_JSCS=true DISABLE_JSHINT=true - TEST_SUITE=old-jquery-and-extend-prototypes DISABLE_JSCS=true DISABLE_JSHINT=true - TEST_SUITE=node DISABLE_JSCS=true DISABLE_JSHINT=true - TEST_SUITE=blueprints - TEST_SUITE=travis-browsers DISABLE_JSCS=true DISABLE_JSHINT=true - - TEST_SUITE=sauce + - TEST_SUITE=browserstack - TEST_SUITE=allow-backtracking-rerender ALLOW_BACKTRACKING=true diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fed05b1e1cf..f5ce54ba5a0 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -252,7 +252,7 @@ Within the Travis build, you can see that we (currently) run six different test * The `each-package-tests` test suite is closest to what you normally run locally on your machine. * The `build-tests EMBER_ENV=production...` test suite runs tests against a production build. -* The `sauce` test suite runs tests against various supported browsers. +* The `browserstack` test suite runs tests against various supported browsers. ## Common Travis CI Build Issues diff --git a/README.md b/README.md index 340b3bc7bff..9a815c7bfbf 100644 --- a/README.md +++ b/README.md @@ -8,10 +8,6 @@ Build Status

-

- Sauce Test Status -

- Ember.js is a JavaScript framework that greatly reduces the time, effort and resources needed to build any web application. It is focused on making you, the developer, as productive as possible by doing all the common, repetitive, yet essential, tasks involved in most web development projects. @@ -27,3 +23,9 @@ Ember.js also provides access to the most advanced features of JavaScript, HTML # Contribution See [CONTRIBUTING.md](https://github.com/emberjs/ember.js/blob/master/CONTRIBUTING.md) + +--- + +Cross-browser testing provided by: + +BrowserStack diff --git a/bin/run-sauce-tests.js b/bin/run-browserstack-tests.js similarity index 74% rename from bin/run-sauce-tests.js rename to bin/run-browserstack-tests.js index 7ca35774abb..d1d28dc247f 100755 --- a/bin/run-sauce-tests.js +++ b/bin/run-browserstack-tests.js @@ -35,16 +35,22 @@ function run(command, _args) { RSVP.resolve() .then(function() { - return run('./node_modules/.bin/ember', [ 'sauce:connect' ]); + return run('./node_modules/.bin/ember', [ 'browserstack:connect' ]); }) .then(function() { // Calling testem directly here instead of `ember test` so that // we do not have to do a double build (by the time this is run // we have already ran `ember build`). - return run('./node_modules/.bin/testem', [ 'ci', '-f', 'testem.dist.json', '--port', '7000' ]); + return run('./node_modules/.bin/testem', [ 'ci', '-f', 'testem.dist.js', '--host', '127.0.0.1', '--port', '7774' ]); }) .finally(function() { - return run('./node_modules/.bin/ember', [ 'sauce:disconnect' ]); + var promise = RSVP.resolve(); + if (process.env.TRAVIS_JOB_NUMBER) { + promise = run('./node_modules/.bin/ember', ['browserstack:results']); + } + return promise.then(function() { + return run('./node_modules/.bin/ember', ['browserstack:disconnect']); + }); }) .catch(function(error) { console.log('error'); diff --git a/bin/run-tests.js b/bin/run-tests.js index cec84553355..26d70e8bd2a 100755 --- a/bin/run-tests.js +++ b/bin/run-tests.js @@ -27,63 +27,145 @@ server.listen(PORT); function run(queryString) { return new RSVP.Promise(function(resolve, reject) { var url = 'http://localhost:' + PORT + '/tests/?' + queryString; - runInPhantom(url, 3, resolve, reject); + runInBrowser(url, 3, resolve, reject); }); } -function runInPhantom(url, retries, resolve, reject) { - var args = [require.resolve('qunit-phantomjs-runner'), url, '900']; +function runInBrowser(url, retries, resolve, reject) { + var result = {output: [], errors: [], code: null}; - console.log('Running: phantomjs ' + args.join(' ')); + console.log('Running Chrome headless: ' + url); - var crashed = false; - var child = spawn('phantomjs', args); - var result = {output: [], errors: [], code: null}; + var puppeteer = require('puppeteer'); - child.stdout.on('data', function (data) { - var string = data.toString(); - var lines = string.split('\n'); + puppeteer.launch().then(function(browser) { + browser.newPage().then(function(page) { + /* globals window */ + var crashed; - lines.forEach(function(line) { - if (line.indexOf('0 failed.') > -1) { - console.log(chalk.green(line)); - } else { - console.log(line); - } - }); - result.output.push(string); - }); + page.on('console', function(msg) { + console.log(msg.text); - child.stderr.on('data', function (data) { - var string = data.toString(); + result.output.push(msg.text); + }); - if (string.indexOf('PhantomJS has crashed.') > -1) { - crashed = true; - } + page.on('error', function(err) { + var string = err.toString(); - result.errors.push(string); - console.error(chalk.red(string)); - }); + if (string.indexOf('Chrome headless has crashed.') > -1) { + crashed = true; + } + + result.errors.push(string); + console.error(chalk.red(string)); + }); + + var addLogging = function() { + window.document.addEventListener('DOMContentLoaded', function() { + var testsTotal = 0; + var testsPassed = 0; + var testsFailed = 0; + var currentTestAssertions = []; + + QUnit.log(function (details) { + var response; + + // Ignore passing assertions + if (details.result) { + return; + } + + response = details.message || ''; + + if (typeof details.expected !== 'undefined') { + if (response) { + response += ', '; + } + + response += 'expected: ' + details.expected + ', but was: ' + details.actual; + } + + if (details.source) { + response += '\n' + details.source; + } + + currentTestAssertions.push('Failed assertion: ' + response); + }); + + QUnit.testDone(function (result) { + var i, + len, + name = ''; + + if (result.module) { + name += result.module + ': '; + } + name += result.name; + + testsTotal++; - child.on('close', function (code) { - result.code = code; - - if (!crashed && code === 0) { - resolve(result); - } else if (crashed) { - console.log(chalk.red('Phantom crashed with exit code ' + code)); - - if (retries > 1) { - console.log(chalk.yellow('Retrying... ¯\_(ツ)_/¯')); - runInPhantom(url, retries - 1, resolve, reject); - } else { - console.log(chalk.red('Giving up! (╯°□°)╯︵ ┻━┻')); - console.log(chalk.yellow('This might be a known issue with PhantomJS 1.9.8, skipping for now')); - resolve(result); - } - } else { - reject(result); - } + if (result.failed) { + testsFailed++; + console.log('\n' + 'Test failed: ' + name); + + for (i = 0, len = currentTestAssertions.length; i < len; i++) { + console.log(' ' + currentTestAssertions[i]); + } + } else { + testsPassed++; + } + + currentTestAssertions.length = 0; + }); + + QUnit.done(function (result) { + console.log('\n' + 'Took ' + result.runtime + 'ms to run ' + testsTotal + ' tests. ' + testsPassed + ' passed, ' + testsFailed + ' failed.'); + + if (typeof window.callPhantom === 'function') { + window.callPhantom({ + 'name': 'QUnit.done', + 'data': result + }); + } + }); + }); + }; + + page.exposeFunction('callPhantom', function(message) { + if (message && message.name === 'QUnit.done') { + result = message.data; + var failed = !result || !result.total || result.failed; + + if (!result.total) { + console.error('No tests were executed. Are you loading tests asynchronously?'); + } + + var code = failed ? 1 : 0; + result.code = code; + + if (!crashed && code === 0) { + resolve(result); + } else if (crashed) { + console.log(chalk.red('Browser crashed with exit code ' + code)); + + if (retries > 1) { + console.log(chalk.yellow('Retrying... ¯\_(ツ)_/¯')); + runInBrowser(url, retries - 1, resolve, reject); + } else { + console.log(chalk.red('Giving up! (╯°□°)╯︵ ┻━┻')); + console.log(chalk.yellow('This might be a known issue with Chrome headless, skipping for now')); + resolve(result); + } + } else { + reject(result); + } + } + }); + + page.evaluateOnNewDocument(addLogging); + + page.goto(url, { timeout: 900 }); + }); }); } @@ -173,12 +255,11 @@ switch (process.env.TEST_SUITE) { case 'travis-browsers': console.log('suite: travis-browsers'); require('./run-travis-browser-tests'); - return; - - case 'sauce': - console.log('suite: sauce'); - require('./run-sauce-tests'); - return; + break; + case 'browserstack': + console.log('suite: browserstack'); + require('./run-browserstack-tests'); + break; default: console.log('suite: default (generate each package)'); generateEachPackageTests(); diff --git a/lib/failure-only-testem-reporter.js b/lib/failure-only-testem-reporter.js new file mode 100644 index 00000000000..a39322bb25d --- /dev/null +++ b/lib/failure-only-testem-reporter.js @@ -0,0 +1,24 @@ +var TapReporter = require('testem/lib/reporters/tap_reporter'); + +function FailureOnlyReporter() { + TapReporter.apply(this, arguments); + this._reportCount = 0; +} + +FailureOnlyReporter.prototype = Object.create(TapReporter.prototype); +FailureOnlyReporter.prototype.constructor = FailureOnlyReporter; + +FailureOnlyReporter.prototype.display = function(prefix, result) { + this._reportCount++; + + if (!result.passed) { + TapReporter.prototype.display.apply(this, arguments); + } + + if (this._reportCount > 100) { + this.out.write('pass count: ' + this.pass + '\n'); + this._reportCount = 0; + } +}; + +module.exports = FailureOnlyReporter; diff --git a/package.json b/package.json index fa19003f430..94da0ebadd3 100644 --- a/package.json +++ b/package.json @@ -30,15 +30,14 @@ "docs": "ember ember-cli-yuidoc", "link:glimmer": "node bin/yarn-link-glimmer.js", "release": "node scripts/release.js", - "sauce:launch": "ember sauce:launch", "start": "ember serve", "pretest": "ember build", "prepare": "ember build -prod", "test": "node bin/run-tests.js", "test:blueprints": "node node-tests/nodetest-runner.js", "test:node": "node bin/run-node-tests.js", - "test:sauce": "node bin/run-sauce-tests.js", - "test:testem": "testem -f testem.dist.json" + "test:browserstack": "node bin/run-browserstack-tests.js", + "test:testem": "testem -f testem.dist.js" }, "dependencies": { "broccoli-funnel": "^1.2.0", @@ -94,8 +93,8 @@ "dag-map": "^2.0.2", "ember-cli": "2.10.0", "ember-cli-blueprint-test-helpers": "^0.12.0", + "ember-cli-browserstack": "^0.0.4", "ember-cli-dependency-checker": "^1.4.0", - "ember-cli-sauce": "^2.1.0", "ember-cli-yuidoc": "^0.8.8", "ember-dev": "github:emberjs/ember-dev#eace534", "ember-publisher": "0.0.7", @@ -109,8 +108,8 @@ "html-differ": "^1.3.4", "lodash.uniq": "^4.5.0", "mocha": "^2.4.5", + "puppeteer": "^0.13.0", "qunit-extras": "^1.5.0", - "qunit-phantomjs-runner": "^2.2.0", "qunitjs": "^1.22.0", "route-recognizer": "^0.3.3", "router_js": "^1.2.8", @@ -119,7 +118,7 @@ "serve-static": "^1.12.2", "simple-dom": "^0.3.0", "simple-html-tokenizer": "^0.4.1", - "testem": "1.15.0", + "testem": "^1.18.4", "tslint": "^5.8.0" }, "ember-addon": { diff --git a/packages/ember-application/lib/system/engine.js b/packages/ember-application/lib/system/engine.js index 229683e5fab..f2761676d27 100644 --- a/packages/ember-application/lib/system/engine.js +++ b/packages/ember-application/lib/system/engine.js @@ -466,7 +466,7 @@ Engine.reopenClass({ @return {*} the resolved value for a given lookup */ function resolverFor(namespace) { - let ResolverClass = namespace.get('Resolver') || DefaultResolver; + let ResolverClass = get(namespace, 'Resolver') || DefaultResolver; return ResolverClass.create({ namespace diff --git a/packages/ember-application/lib/system/resolver.js b/packages/ember-application/lib/system/resolver.js index 03d5da19c63..b104eab092c 100644 --- a/packages/ember-application/lib/system/resolver.js +++ b/packages/ember-application/lib/system/resolver.js @@ -14,23 +14,6 @@ import validateType from '../utils/validate-type'; import { getTemplate } from 'ember-glimmer'; import { DEBUG } from 'ember-env-flags'; -export const Resolver = EmberObject.extend({ - /* - This will be set to the Application instance when it is - created. - - @property namespace - */ - namespace: null, - normalize: null, // required - resolve: null, // required - parseName: null, // required - lookupDescription: null, // required - makeToString: null, // required - resolveOther: null, // required - _logLookup: null // required -}); - /** The DefaultResolver defines the default lookup rules to resolve container lookups before consulting the container for registered @@ -100,7 +83,12 @@ export const Resolver = EmberObject.extend({ @public */ -export default EmberObject.extend({ +class DefaultResolver extends EmberObject { + // Workaround for weird JIT bug with FireFox and our test suite. + static create(props) { + return super.create(props); + } + /** This will be set to the Application instance when it is created. @@ -108,11 +96,13 @@ export default EmberObject.extend({ @property namespace @public */ - namespace: null, init() { + if (this.namespace == null) { + throw new Error('missing namespace'); + } this._parseNameCache = dictionary(null); - }, + } normalize(fullName) { let [ type, name ] = fullName.split(':'); @@ -132,7 +122,7 @@ export default EmberObject.extend({ } else { return fullName; } - }, + } /** This method is called via the container's resolver method. @@ -166,7 +156,7 @@ export default EmberObject.extend({ } return resolved; - }, + } /** Convert the string name of the form 'type:name' to @@ -182,7 +172,7 @@ export default EmberObject.extend({ return this._parseNameCache[fullName] || ( (this._parseNameCache[fullName] = this._parseName(fullName)) ); - }, + } _parseName(fullName) { let [ type, fullNameWithoutType ] = fullName.split(':'); @@ -220,7 +210,7 @@ export default EmberObject.extend({ root, resolveMethodName: `resolve${resolveMethodName}` }; - }, + } /** Returns a human-readable description for a fullName. Used by the @@ -247,11 +237,11 @@ export default EmberObject.extend({ } return description; - }, + } makeToString(factory, fullName) { return factory.toString(); - }, + } /** Given a parseName object (output from `parseName`), apply @@ -268,7 +258,7 @@ export default EmberObject.extend({ } else { parsedName.name = parsedName.name.replace(/\./g, '_'); } - }, + } /** Look up the template in Ember.TEMPLATES @@ -281,7 +271,7 @@ export default EmberObject.extend({ let templateName = parsedName.fullNameWithoutType.replace(/\./g, '/'); return getTemplate(templateName) || getTemplate(StringUtils.decamelize(templateName)); - }, + } /** Lookup the view using `resolveOther` @@ -294,7 +284,7 @@ export default EmberObject.extend({ resolveView(parsedName) { this.useRouterNaming(parsedName); return this.resolveOther(parsedName); - }, + } /** Lookup the controller using `resolveOther` @@ -307,7 +297,7 @@ export default EmberObject.extend({ resolveController(parsedName) { this.useRouterNaming(parsedName); return this.resolveOther(parsedName); - }, + } /** Lookup the route using `resolveOther` @@ -319,7 +309,7 @@ export default EmberObject.extend({ resolveRoute(parsedName) { this.useRouterNaming(parsedName); return this.resolveOther(parsedName); - }, + } /** Lookup the model on the Application namespace @@ -334,7 +324,7 @@ export default EmberObject.extend({ let factory = get(parsedName.root, className); return factory; - }, + } /** Look up the specified object (from parsedName) on the appropriate namespace (usually on the Application) @@ -346,7 +336,7 @@ export default EmberObject.extend({ */ resolveHelper(parsedName) { return this.resolveOther(parsedName); - }, + } /** Look up the specified object (from parsedName) on the appropriate namespace (usually on the Application) @@ -360,12 +350,12 @@ export default EmberObject.extend({ let className = StringUtils.classify(parsedName.name) + StringUtils.classify(parsedName.type); let factory = get(parsedName.root, className); return factory; - }, + } resolveMain(parsedName) { let className = StringUtils.classify(parsedName.type); return get(parsedName.root, className); - }, + } /** @method _logLookup @@ -384,7 +374,7 @@ export default EmberObject.extend({ } info(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName)); - }, + } /** Used to iterate all items of a given type. @@ -411,7 +401,7 @@ export default EmberObject.extend({ } return known; - }, + } /** Converts provided name from the backing namespace into a container lookup name. @@ -433,4 +423,27 @@ export default EmberObject.extend({ return `${type}:${dasherizedName}`; } -}); +} + +export default DefaultResolver; + +if (DEBUG) { + /** + @method _logLookup + @param {Boolean} found + @param {Object} parsedName + @private + */ + DefaultResolver.prototype._logLookup = function(found, parsedName) { + let symbol = found ? '[✓]' : '[ ]'; + + let padding; + if (parsedName.fullName.length > 60) { + padding = '.'; + } else { + padding = new Array(60 - parsedName.fullName.length).join('.'); + } + + info(symbol, parsedName.fullName, padding, this.lookupDescription(parsedName.fullName)); + }; +} diff --git a/packages/ember-glimmer/tests/integration/components/curly-components-test.js b/packages/ember-glimmer/tests/integration/components/curly-components-test.js index 8c80d9a4de6..354d5ce5923 100644 --- a/packages/ember-glimmer/tests/integration/components/curly-components-test.js +++ b/packages/ember-glimmer/tests/integration/components/curly-components-test.js @@ -280,7 +280,7 @@ moduleFor('Components test: curly components', class extends RenderingTest { expectAssertion(() => { this.render('{{foo-bar}}'); - }, /You cannot use a computed property for the component's `tagName` \(<\(.+>\)\./); + }, /You cannot use a computed property for the component's `tagName` \(<.+>\)\./); } ['@test class is applied before didInsertElement'](assert) { @@ -2136,7 +2136,7 @@ moduleFor('Components test: curly components', class extends RenderingTest { assert.equal(this.$('#inner-value').text(), '1', 'initial render of inner'); assert.equal(this.$('#middle-value').text(), '', 'initial render of middle (observers do not run during init)'); - let expectedBacktrackingMessage = /modified "value" twice on <\(.+> in a single render\. It was rendered in "component:x-middle" and modified in "component:x-inner"/; + let expectedBacktrackingMessage = /modified "value" twice on <.+> in a single render\. It was rendered in "component:x-middle" and modified in "component:x-inner"/; if (EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { expectDeprecation(expectedBacktrackingMessage); diff --git a/packages/ember-metal/lib/meta.js b/packages/ember-metal/lib/meta.js index cfb7ec74414..287879aec42 100644 --- a/packages/ember-metal/lib/meta.js +++ b/packages/ember-metal/lib/meta.js @@ -16,6 +16,9 @@ import { removeChainWatcher } from './chains'; +const getPrototypeOf = Object.getPrototypeOf; +const objectPrototype = Object.prototype; + let counters; if (DEBUG) { counters = { @@ -45,11 +48,12 @@ const META_FIELD = '__ember_meta__'; const NODE_STACK = []; export class Meta { - constructor(obj, parentMeta) { + constructor(obj) { if (DEBUG) { counters.metaInstantiated++; } + this._parent = undefined; this._cache = undefined; this._weak = undefined; this._watching = undefined; @@ -72,13 +76,7 @@ export class Meta { // when meta(obj).proto === obj, the object is intended to be only a // prototype and doesn't need to actually be observable itself - this.proto = undefined; - - // The next meta in our inheritance chain. We (will) track this - // explicitly instead of using prototypical inheritance because we - // have detailed knowledge of how each property should really be - // inherited, and we can optimize it much better than JS runtimes. - this.parent = parentMeta; + this.proto = obj.constructor === undefined ? undefined : obj.constructor.prototype; if (EMBER_GLIMMER_DETECT_BACKTRACKING_RERENDER || EMBER_GLIMMER_ALLOW_BACKTRACKING_RERENDER) { this._lastRendered = undefined; @@ -93,6 +91,15 @@ export class Meta { this._suspendedListeners = undefined; } + get parent() { + let parent = this._parent; + if (parent === undefined) { + let proto = getPrototypeOf(this.source); + this._parent = parent = proto === null || proto === objectPrototype ? null : meta(proto); + } + return parent; + } + isInitialized(obj) { return this.proto !== obj; } @@ -177,7 +184,7 @@ export class Meta { _getInherited(key) { let pointer = this; - while (pointer !== undefined) { + while (pointer !== null) { let map = pointer[key]; if (map !== undefined) { return map; @@ -188,7 +195,7 @@ export class Meta { _findInherited(key, subkey) { let pointer = this; - while (pointer !== undefined) { + while (pointer !== null) { let map = pointer[key]; if (map !== undefined) { let value = map[subkey]; @@ -203,7 +210,7 @@ export class Meta { // Implements a member that provides a lazily created map of maps, // with inheritance at both levels. writeDeps(subkey, itemkey, value) { - assert(`Cannot modify dependent keys for \`${itemkey}\` on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); + assert(this.isMetaDestroyed() && `Cannot modify dependent keys for \`${itemkey}\` on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); let outerMap = this._getOrCreateOwnMap('_deps'); let innerMap = outerMap[subkey]; @@ -215,7 +222,7 @@ export class Meta { peekDeps(subkey, itemkey) { let pointer = this; - while (pointer !== undefined) { + while (pointer !== null) { let map = pointer._deps; if (map !== undefined) { let value = map[subkey]; @@ -232,7 +239,7 @@ export class Meta { hasDeps(subkey) { let pointer = this; - while (pointer !== undefined) { + while (pointer !== null) { let deps = pointer._deps; if (deps !== undefined && deps[subkey] !== undefined) { return true; @@ -250,7 +257,7 @@ export class Meta { let pointer = this; let seen; let calls; - while (pointer !== undefined) { + while (pointer !== null) { let map = pointer[key]; if (map !== undefined) { let innerMap = map[subkey]; @@ -293,7 +300,7 @@ export class Meta { readableTags() { return this._tags; } writableTag(create) { - assert(`Cannot create a new tag for \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); + assert(this.isMetaDestroyed() && `Cannot create a new tag for \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); let ret = this._tag; if (ret === undefined) { ret = this._tag = create(this.source); @@ -306,7 +313,7 @@ export class Meta { } writableChainWatchers(create) { - assert(`Cannot create a new chain watcher for \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); + assert(this.isMetaDestroyed() && `Cannot create a new chain watcher for \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); let ret = this._chainWatchers; if (ret === undefined) { ret = this._chainWatchers = create(this.source); @@ -319,10 +326,10 @@ export class Meta { } writableChains(create) { - assert(`Cannot create a new chains for \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); + assert(this.isMetaDestroyed() && `Cannot create a new chains for \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); let ret = this._chains; if (ret === undefined) { - if (this.parent === undefined) { + if (this.parent === null) { ret = create(this.source); } else { ret = this.parent.writableChains(create).copy(this.source); @@ -337,7 +344,7 @@ export class Meta { } writeWatching(subkey, value) { - assert(`Cannot update watchers for \`${subkey}\` on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); + assert(this.isMetaDestroyed() && `Cannot update watchers for \`${subkey}\` on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); let map = this._getOrCreateOwnMap('_watching'); map[subkey] = value; } @@ -347,7 +354,7 @@ export class Meta { } writeMixins(subkey, value) { - assert(`Cannot add mixins for \`${subkey}\` on \`${toString(this.source)}\` call writeMixins after it has been destroyed.`, !this.isMetaDestroyed()); + assert(this.isMetaDestroyed() && `Cannot add mixins for \`${subkey}\` on \`${toString(this.source)}\` call writeMixins after it has been destroyed.`, !this.isMetaDestroyed()); let map = this._getOrCreateOwnMap('_mixins'); map[subkey] = value; } @@ -359,7 +366,7 @@ export class Meta { forEachMixins(fn) { let pointer = this; let seen; - while (pointer !== undefined) { + while (pointer !== null) { let map = pointer._mixins; if (map !== undefined) { for (let key in map) { @@ -375,7 +382,7 @@ export class Meta { } writeBindings(subkey, value) { - assert(`Cannot add a binding for \`${subkey}\` on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); + assert(this.isMetaDestroyed() && `Cannot add a binding for \`${subkey}\` on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); let map = this._getOrCreateOwnMap('_bindings'); map[subkey] = value; @@ -388,7 +395,7 @@ export class Meta { forEachBindings(fn) { let pointer = this; let seen; - while (pointer !== undefined) { + while (pointer !== null) { let map = pointer._bindings; if (map !== undefined) { for (let key in map) { @@ -404,12 +411,12 @@ export class Meta { } clearBindings() { - assert(`Cannot clear bindings on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); + assert(this.isMetaDestroyed() && `Cannot clear bindings on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); this._bindings = undefined; } writeValues(subkey, value) { - assert(`Cannot set the value of \`${subkey}\` on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); + assert(this.isMetaDestroyed() && `Cannot set the value of \`${subkey}\` on \`${toString(this.source)}\` after it has been destroyed.`, !this.isMetaDestroyed()); let map = this._getOrCreateOwnMap('_values'); map[subkey] = value; @@ -457,7 +464,7 @@ if (MANDATORY_SETTER) { let pointer = this; - while (pointer !== undefined) { + while (pointer !== null) { let map = pointer[internalKey]; if (map !== undefined) { let value = map[subkey]; @@ -487,7 +494,6 @@ let setMeta, peekMeta; // choose the one appropriate for given platform if (HAS_NATIVE_WEAKMAP) { - let getPrototypeOf = Object.getPrototypeOf; let metaStore = new WeakMap(); setMeta = function WeakMap_setMeta(obj, meta) { @@ -500,7 +506,7 @@ if (HAS_NATIVE_WEAKMAP) { peekMeta = function WeakMap_peekParentMeta(obj) { let pointer = obj; let meta; - while (pointer !== undefined && pointer !== null) { + while (pointer !== null && pointer !== null) { meta = metaStore.get(pointer); // jshint loopfunc:true if (DEBUG) { @@ -567,17 +573,13 @@ export function meta(obj) { } let maybeMeta = peekMeta(obj); - let parent; // remove this code, in-favor of explicit parent - if (maybeMeta !== undefined) { - if (maybeMeta.source === obj) { - return maybeMeta; - } - parent = maybeMeta; + if (maybeMeta !== undefined && maybeMeta.source === obj) { + return maybeMeta; } - let newMeta = new Meta(obj, parent); + let newMeta = new Meta(obj); setMeta(obj, newMeta); return newMeta; } diff --git a/packages/ember-metal/lib/meta_listeners.js b/packages/ember-metal/lib/meta_listeners.js index 678910c7c30..91cbee5427f 100644 --- a/packages/ember-metal/lib/meta_listeners.js +++ b/packages/ember-metal/lib/meta_listeners.js @@ -25,7 +25,7 @@ export const protoMethods = { if (this._listenersFinalized) { return; } if (this._listeners === undefined) { this._listeners = []; } let pointer = this.parent; - while (pointer !== undefined) { + while (pointer !== null) { let listeners = pointer._listeners; if (listeners !== undefined) { this._listeners = this._listeners.concat(listeners); @@ -38,7 +38,7 @@ export const protoMethods = { removeFromListeners(eventName, target, method, didRemove) { let pointer = this; - while (pointer !== undefined) { + while (pointer !== null) { let listeners = pointer._listeners; if (listeners !== undefined) { for (let index = listeners.length - 4; index >= 0; index -= 4) { @@ -67,7 +67,7 @@ export const protoMethods = { matchingListeners(eventName) { let pointer = this; let result; - while (pointer !== undefined) { + while (pointer !== null) { let listeners = pointer._listeners; if (listeners !== undefined) { for (let index = 0; index < listeners.length; index += 4) { @@ -121,7 +121,7 @@ export const protoMethods = { watchedEvents() { let pointer = this; let names = {}; - while (pointer !== undefined) { + while (pointer !== null) { let listeners = pointer._listeners; if (listeners !== undefined) { for (let index = 0; index < listeners.length; index += 4) { diff --git a/packages/ember-metal/lib/mixin.js b/packages/ember-metal/lib/mixin.js index 719dad9c234..0f8970b11f8 100644 --- a/packages/ember-metal/lib/mixin.js +++ b/packages/ember-metal/lib/mixin.js @@ -290,7 +290,7 @@ function connectBindings(obj, meta) { } function finishPartial(obj, meta) { - connectBindings(obj, meta || metaFor(obj)); + connectBindings(obj, meta === undefined ? metaFor(obj) : meta); return obj; } diff --git a/packages/ember-runtime/lib/controllers/controller.js b/packages/ember-runtime/lib/controllers/controller.js index a397f6013b6..151ffce8c77 100644 --- a/packages/ember-runtime/lib/controllers/controller.js +++ b/packages/ember-runtime/lib/controllers/controller.js @@ -18,14 +18,6 @@ const Controller = EmberObject.extend(Mixin); deprecateUnderscoreActions(Controller); -function controllerInjectionHelper(factory) { - assert( - 'Defining an injected controller property on a ' + - 'non-controller is not allowed.', - Mixin.detect(factory.PrototypeMixin) - ); -} - /** Creates a property that lazily looks up another controller in the container. Can only be used when defining another controller. @@ -55,6 +47,6 @@ function controllerInjectionHelper(factory) { @return {Ember.InjectedProperty} injection descriptor instance @public */ -createInjectionHelper('controller', controllerInjectionHelper); +createInjectionHelper('controller'); export default Controller; diff --git a/packages/ember-runtime/lib/system/core_object.js b/packages/ember-runtime/lib/system/core_object.js index cb913b9462e..a5e147683c6 100644 --- a/packages/ember-runtime/lib/system/core_object.js +++ b/packages/ember-runtime/lib/system/core_object.js @@ -7,12 +7,10 @@ import { assign, guidFor, - generateGuid, makeArray, - GUID_KEY_PROPERTY, symbol, NAME_KEY, - GUID_KEY + GUID_KEY_PROPERTY } from 'ember-utils'; import { get, @@ -21,20 +19,19 @@ import { sendEvent, detectBinding, Mixin, - REQUIRED, defineProperty, Binding, ComputedProperty, computed, InjectedProperty, run, + peekMeta, destroy, - descriptor, _hasCachedComputedProperties } from 'ember-metal'; import ActionHandler from '../mixins/action_handler'; import { validatePropertyInjections } from '../inject'; -import { assert, Error as EmberError } from 'ember-debug'; +import { assert, deprecate, Error as EmberError } from 'ember-debug'; import { DEBUG } from 'ember-env-flags'; import { MANDATORY_SETTER } from 'ember/features'; @@ -45,166 +42,148 @@ let reopen = Mixin.prototype.reopen; export const POST_INIT = symbol('POST_INIT'); -function makeCtor() { - // Note: avoid accessing any properties on the object since it makes the - // method a lot faster. This is glue code so we want it to be as fast as - // possible. +const wasApplied = new WeakMap(); - let wasApplied = false; - let initProperties, initFactory; +const factoryMap = new WeakMap(); - class Class { - constructor() { - if (!wasApplied) { - Class.proto(); // prepare prototype... - } +const NAME_KEY_MAP = new WeakMap(); +const GUID_KEY_MAP = new WeakMap(); - if (arguments.length > 0) { - initProperties = [arguments[0]]; - } +const prototypeMixinMap = new WeakMap(); - this.__defineNonEnumerable(GUID_KEY_PROPERTY); - let m = meta(this); - let proto = m.proto; - m.proto = this; +const DELAY_INIT = Object.freeze({}); - if (initFactory) { - m.factory = initFactory; - initFactory = null; - } - if (initProperties) { - // capture locally so we can clear the closed over variable - let props = initProperties; - initProperties = null; - - let concatenatedProperties = this.concatenatedProperties; - let mergedProperties = this.mergedProperties; - let hasConcatenatedProps = concatenatedProperties && concatenatedProperties.length > 0; - let hasMergedProps = mergedProperties && mergedProperties.length > 0; - - for (let i = 0; i < props.length; i++) { - let properties = props[i]; - - assert( - 'Ember.Object.create only accepts objects.', - typeof properties === 'object' || properties === undefined - ); - - assert( - 'Ember.Object.create no longer supports mixing in other ' + - 'definitions, use .extend & .create separately instead.', - !(properties instanceof Mixin) - ); - - if (!properties) { continue; } - - let keyNames = Object.keys(properties); - - for (let j = 0; j < keyNames.length; j++) { - let keyName = keyNames[j]; - let value = properties[keyName]; - - if (detectBinding(keyName)) { - m.writeBindings(keyName, value); - } - - assert( - 'Ember.Object.create no longer supports defining computed ' + - 'properties. Define computed properties using extend() or reopen() ' + - 'before calling create().', - !(value instanceof ComputedProperty) - ); - assert( - 'Ember.Object.create no longer supports defining methods that call _super.', - !(typeof value === 'function' && value.toString().indexOf('._super') !== -1) - ); - assert( - '`actions` must be provided at extend time, not at create time, ' + - 'when Ember.ActionHandler is used (i.e. views, controllers & routes).', - !((keyName === 'actions') && ActionHandler.detect(this)) - ); - - let baseValue = this[keyName]; - let isDescriptor = baseValue !== null && typeof baseValue === 'object' && baseValue.isDescriptor; - - if (hasConcatenatedProps && concatenatedProperties.indexOf(keyName) > -1) { - if (baseValue) { - value = makeArray(baseValue).concat(value); - } else { - value = makeArray(value); - } - } - - if (hasMergedProps && mergedProperties.indexOf(keyName) > -1) { - value = assign({}, baseValue, value); - } - - if (isDescriptor) { - baseValue.set(this, keyName, value); - } else if (typeof this.setUnknownProperty === 'function' && !(keyName in this)) { - this.setUnknownProperty(keyName, value); - } else { - if (MANDATORY_SETTER) { - defineProperty(this, keyName, null, value); // setup mandatory setter - } else { - this[keyName] = value; - } - } - } - } - } +function initialize(obj, properties) { + let m = meta(obj); - finishPartial(this, m); - - this.init(...arguments); + if (properties) { + assert( + 'Ember.Object.create only accepts objects.', + typeof properties === 'object' && properties !== null + ); - this[POST_INIT](); + assert( + 'Ember.Object.create no longer supports mixing in other ' + + 'definitions, use .extend & .create separately instead.', + !(properties instanceof Mixin) + ); - m.proto = proto; - finishChains(m); - sendEvent(this, 'init', undefined, undefined, undefined, m); - } + let concatenatedProperties = obj.concatenatedProperties; + let mergedProperties = obj.mergedProperties; + let hasConcatenatedProps = + concatenatedProperties !== undefined && concatenatedProperties.length > 0; + let hasMergedProps = mergedProperties !== undefined && mergedProperties.length > 0; - static willReopen() { - if (wasApplied) { - Class.PrototypeMixin = Mixin.create(Class.PrototypeMixin); - } + let keyNames = Object.keys(properties); - wasApplied = false; - } + for (let i = 0; i < keyNames.length; i++) { + let keyName = keyNames[i]; + let value = properties[keyName]; - static _initProperties(args) { initProperties = args; } - static _initFactory(factory) { initFactory = factory; } + if (detectBinding(keyName)) { + m.writeBindings(keyName, value); + } - static proto() { - let superclass = Class.superclass; - if (superclass) { superclass.proto(); } + assert( + 'Ember.Object.create no longer supports defining computed ' + + 'properties. Define computed properties using extend() or reopen() ' + + 'before calling create().', + !(value instanceof ComputedProperty) + ); + assert( + 'Ember.Object.create no longer supports defining methods that call _super.', + !(typeof value === 'function' && value.toString().indexOf('._super') !== -1) + ); + assert( + '`actions` must be provided at extend time, not at create time, ' + + 'when Ember.ActionHandler is used (i.e. views, controllers & routes).', + !(keyName === 'actions' && ActionHandler.detect(obj)) + ); + + let baseValue = obj[keyName]; + let isDescriptor = baseValue !== null && typeof baseValue === 'object' && baseValue.isDescriptor; + + if (hasConcatenatedProps && concatenatedProperties.indexOf(keyName) > -1) { + if (baseValue) { + value = makeArray(baseValue).concat(value); + } else { + value = makeArray(value); + } + } - if (!wasApplied) { - wasApplied = true; - Class.PrototypeMixin.applyPartial(Class.prototype); + if (hasMergedProps && mergedProperties.indexOf(keyName) > -1) { + value = assign({}, baseValue, value); } - return this.prototype; + if (isDescriptor) { + baseValue.set(obj, keyName, value); + } else if (typeof obj.setUnknownProperty === 'function' && !(keyName in obj)) { + obj.setUnknownProperty(keyName, value); + } else { + if (MANDATORY_SETTER) { + defineProperty(obj, keyName, null, value, m); // setup mandatory setter + } else { + obj[keyName] = value; + } + } } } - Class.toString = Mixin.prototype.toString; + finishPartial(obj, m); - return Class; + obj.init(properties); + + obj[POST_INIT](); + + // re-enable chains + m.proto = obj.constructor.prototype; + finishChains(m); + sendEvent(obj, 'init', undefined, undefined, undefined, m); } /** @class CoreObject @public */ -let CoreObject = makeCtor(); -CoreObject.toString = () => 'Ember.CoreObject'; -CoreObject.PrototypeMixin = Mixin.create({ +class CoreObject { + static _initFactory(factory) { + factoryMap.set(this, factory); + } + + constructor(properties) { + // pluck off factory + let initFactory = factoryMap.get(this.constructor); + if (initFactory !== undefined) { + factoryMap.delete(this.constructor); + } + + // prepare prototype... + this.constructor.proto(); + + // disable chains + this.__defineNonEnumerable(GUID_KEY_PROPERTY); + let m = meta(this); + m.proto = this; + m.factory = initFactory; + + if (properties !== DELAY_INIT) { + deprecate( + 'using `new` with Ember.Object has been deprecated. Please use `create` instead.', + false, + { + id: 'object.new-constructor', + until: '3.5.0', + } + ); + + initialize(this, properties); + } + } + reopen(...args) { applyMixin(this, args, true); return this; - }, + } /** An overridable method called when objects are instantiated. By default, @@ -213,6 +192,8 @@ CoreObject.PrototypeMixin = Mixin.create({ Example: ```javascript + import Ember.Object from '@ember/object'; + const Person = Ember.Object.extend({ init() { alert(`Name is ${this.get('name')}`); @@ -235,14 +216,14 @@ CoreObject.PrototypeMixin = Mixin.create({ @method init @public */ - init() {}, + init() {} - [POST_INIT]() { }, // Private, and only for didInitAttrs willReceiveAttrs + [POST_INIT]() {} // Private, and only for didReceiveAttrs __defineNonEnumerable(property) { Object.defineProperty(this, property.name, property.descriptor); //this[property.name] = property.descriptor.value; - }, + } /** Defines the properties that will be concatenated from the superclass @@ -259,6 +240,8 @@ CoreObject.PrototypeMixin = Mixin.create({ property and a normal one: ```javascript + import Ember.Object from '@ember/object'; + const Bar = Ember.Object.extend({ // Configure which properties to concatenate concatenatedProperties: ['concatenatedProperty'], @@ -301,7 +284,7 @@ CoreObject.PrototypeMixin = Mixin.create({ Using the `concatenatedProperties` property, we can tell Ember to mix the content of the properties. - In `Ember.Component` the `classNames`, `classNameBindings` and + In `Component` the `classNames`, `classNameBindings` and `attributeBindings` properties are concatenated. This feature is available for you to use throughout the Ember object model, @@ -315,7 +298,6 @@ CoreObject.PrototypeMixin = Mixin.create({ @default null @public */ - concatenatedProperties: null, /** Defines the properties that will be merged from the superclass @@ -332,6 +314,8 @@ CoreObject.PrototypeMixin = Mixin.create({ property and a normal one: ```javascript + import Ember.Object from '@ember/object'; + const Bar = Ember.Object.extend({ // Configure which properties are to be merged mergedProperties: ['mergedProperty'], @@ -376,7 +360,7 @@ CoreObject.PrototypeMixin = Mixin.create({ This behavior is not available during object `create` calls. It is only available at `extend` time. - In `Ember.Route` the `queryParams` property is merged. + In `Route` the `queryParams` property is merged. This feature is available for you to use throughout the Ember object model, although typical app developers are likely to use it infrequently. Since @@ -389,7 +373,6 @@ CoreObject.PrototypeMixin = Mixin.create({ @default null @public */ - mergedProperties: null, /** Destroyed object property flag. @@ -401,20 +384,13 @@ CoreObject.PrototypeMixin = Mixin.create({ @default false @public */ - isDestroyed: descriptor({ - get() { - return meta(this).isSourceDestroyed(); - }, - - set(value) { - // prevent setting while applying mixins - if (value !== null && typeof value === 'object' && value.isDescriptor) { - return; - } + get isDestroyed() { + return peekMeta(this).isSourceDestroyed(); + } - assert(`You cannot set \`${this}.isDestroyed\` directly, please use \`.destroy()\`.`, false); - } - }), + set isDestroyed(value) { + assert(`You cannot set \`${this}.isDestroyed\` directly, please use \`.destroy()\`.`, false); + } /** Destruction scheduled flag. The `destroy()` method has been called. @@ -426,20 +402,13 @@ CoreObject.PrototypeMixin = Mixin.create({ @default false @public */ - isDestroying: descriptor({ - get() { - return meta(this).isSourceDestroying(); - }, - - set(value) { - // prevent setting while applying mixins - if (value !== null && typeof value === 'object' && value.isDescriptor) { - return; - } + get isDestroying() { + return peekMeta(this).isSourceDestroying(); + } - assert(`You cannot set \`${this}.isDestroying\` directly, please use \`.destroy()\`.`, false); - } - }), + set isDestroying(value) { + assert(`You cannot set \`${this}.isDestroying\` directly, please use \`.destroy()\`.`, false); + } /** Destroys an object by setting the `isDestroyed` flag and removing its @@ -452,12 +421,14 @@ CoreObject.PrototypeMixin = Mixin.create({ happen immediately. It will set an isDestroying flag immediately. @method destroy - @return {EmberObject} receiver + @return {Ember.Object} receiver @public */ destroy() { - let m = meta(this); - if (m.isSourceDestroying()) { return; } + let m = peekMeta(this); + if (m.isSourceDestroying()) { + return; + } m.setSourceDestroying(); @@ -465,7 +436,7 @@ CoreObject.PrototypeMixin = Mixin.create({ schedule('destroy', this, this._scheduledDestroy, m); return this; - }, + } /** Override to implement teardown. @@ -473,7 +444,7 @@ CoreObject.PrototypeMixin = Mixin.create({ @method willDestroy @public */ - willDestroy() {}, + willDestroy() {} /** Invoked by the run loop to actually destroy the object. This is @@ -483,16 +454,18 @@ CoreObject.PrototypeMixin = Mixin.create({ @method _scheduledDestroy */ _scheduledDestroy(m) { - if (m.isSourceDestroyed()) { return; } + if (m.isSourceDestroyed()) { + return; + } destroy(this); m.setSourceDestroyed(); - }, + } bind(to, from) { if (!(from instanceof Binding)) { from = Binding.from(from); } from.to(to).connect(this); return from; - }, + } /** Returns a string representation which attempts to provide more information @@ -500,18 +473,20 @@ CoreObject.PrototypeMixin = Mixin.create({ objects. ```javascript - const Person = Ember.Object.extend() - person = Person.create() - person.toString() //=> "" + import Ember.Object from '@ember/object'; + + const Person = Ember.Object.extend(); + person = Person.create(); + person.toString(); //=> "" ``` If the object's class is not defined on an Ember namespace, it will indicate it is a subclass of the registered superclass: ```javascript - const Student = Person.extend() - let student = Student.create() - student.toString() //=> "<(subclass of Person):ember1025>" + const Student = Person.extend(); + let student = Student.create(); + student.toString(); //=> "<(subclass of Person):ember1025>" ``` If the method `toStringExtension` is defined, its return value will be @@ -523,7 +498,7 @@ CoreObject.PrototypeMixin = Mixin.create({ return this.get('fullName'); } }); - teacher = Teacher.create() + teacher = Teacher.create(); teacher.toString(); //=> "" ``` @@ -539,27 +514,22 @@ CoreObject.PrototypeMixin = Mixin.create({ return ret; } -}); - -CoreObject.PrototypeMixin.ownerConstructor = CoreObject; - -CoreObject.__super__ = null; -let ClassMixinProps = { - - ClassMixin: REQUIRED, - - PrototypeMixin: REQUIRED, + // We need NAME_KEY to not inherit another constructor's value + static get [NAME_KEY]() { + return NAME_KEY_MAP.get(this); + } - isClass: true, + static set [NAME_KEY](value) { + NAME_KEY_MAP.set(this, value); + } - isMethod: false, - [NAME_KEY]: null, - [GUID_KEY]: null, /** Creates a new subclass. ```javascript + import Ember.Object from '@ember/object'; + const Person = Ember.Object.extend({ say(thing) { alert(thing); @@ -570,10 +540,12 @@ let ClassMixinProps = { This defines a new subclass of Ember.Object: `Person`. It contains one method: `say()`. You can also create a subclass from any existing class by calling its `extend()` method. - For example, you might want to create a subclass of Ember's built-in `Ember.Component` class: + For example, you might want to create a subclass of Ember's built-in `Component` class: ```javascript - const PersonComponent = Ember.Component.extend({ + import Component from '@ember/component'; + + const PersonComponent = Component.extend({ tagName: 'li', classNameBindings: ['isAdministrator'] }); @@ -583,6 +555,8 @@ let ClassMixinProps = { implementation of your parent class by calling the special `_super()` method: ```javascript + import Ember.Object from '@ember/object'; + const Person = Ember.Object.extend({ say(thing) { let name = this.get('name'); @@ -613,6 +587,9 @@ let ClassMixinProps = { You can also pass `Mixin` classes to add additional properties to the subclass. ```javascript + import Ember.Object from '@ember/object'; + import Mixin from '@ember/object/mixin'; + const Person = Ember.Object.extend({ say(thing) { alert(`${this.get('name')} says: ${thing}`); @@ -620,7 +597,7 @@ let ClassMixinProps = { }); const SingingMixin = Mixin.create({ - sing(thing){ + sing(thing) { alert(`${this.get('name')} sings: la la la ${thing}`); } }); @@ -641,34 +618,19 @@ let ClassMixinProps = { @param {Object} [arguments]* Object containing values to use within the new class @public */ - extend() { - let Class = makeCtor(); - let proto; - Class.ClassMixin = Mixin.create(this.ClassMixin); - Class.PrototypeMixin = Mixin.create(this.PrototypeMixin); - - Class.ClassMixin.ownerConstructor = Class; - Class.PrototypeMixin.ownerConstructor = Class; - + static extend() { + let Class = class extends this {}; reopen.apply(Class.PrototypeMixin, arguments); - - Class.superclass = this; - Class.__super__ = this.prototype; - - proto = Class.prototype = Object.create(this.prototype); - proto.constructor = Class; - generateGuid(proto); - meta(proto).proto = proto; // this will disable observers on prototype - - Class.ClassMixin.apply(Class); return Class; - }, + } /** Creates an instance of a class. Accepts either no arguments, or an object containing values to initialize the newly instantiated object with. ```javascript + import Ember.Object from '@ember/object'; + const Person = Ember.Object.extend({ helloWorld() { alert(`Hi, my name is ${this.get('name')}`); @@ -683,7 +645,7 @@ let ClassMixinProps = { ``` `create` will call the `init` function if defined during - `Ember.AnyObject.extend` + `AnyObject.extend` If no arguments are passed to `create`, it will not set values to the new instance during initialization: @@ -703,19 +665,26 @@ let ClassMixinProps = { @param [arguments]* @public */ - create(...args) { + static create(props, extra) { let C = this; - if (args.length > 0) { - this._initProperties(args); + let instance = new C(DELAY_INIT); + + if (extra === undefined) { + initialize(instance, props); + } else { + initialize(instance, flattenProps.apply(this, arguments)); } - return new C(); - }, + + return instance; + } /** Augments a constructor's prototype with additional properties and functions: ```javascript + import Ember.Object from '@ember/object'; + const MyObject = Ember.Object.extend({ name: 'an object' }); @@ -743,16 +712,32 @@ let ClassMixinProps = { @static @public */ - reopen() { + static reopen() { this.willReopen(); reopen.apply(this.PrototypeMixin, arguments); return this; - }, + } + + static willReopen() { + let p = this.prototype; + if (wasApplied.has(p)) { + wasApplied.delete(p); + + // If the base mixin already exists and was applied, create a new mixin to + // make sure that it gets properly applied. Reusing the same mixin after + // the first `proto` call will cause it to get skipped. + if (prototypeMixinMap.has(this)) { + prototypeMixinMap.set(this, Mixin.create(this.PrototypeMixin)); + } + } + } /** Augments a constructor's own properties and functions: ```javascript + import Ember.Object from '@ember/object'; + const MyObject = Ember.Object.extend({ name: 'an object' }); @@ -769,6 +754,8 @@ let ClassMixinProps = { These are only available on the class and not on any instance of that class. ```javascript + import Ember.Object from '@ember/object'; + const Person = Ember.Object.extend({ name: '', sayHello() { @@ -806,24 +793,27 @@ let ClassMixinProps = { @static @public */ - reopenClass() { - reopen.apply(this.ClassMixin, arguments); + static reopenClass() { applyMixin(this, arguments, false); return this; - }, + } - detect(obj) { - if ('function' !== typeof obj) { return false; } + static detect(obj) { + if ('function' !== typeof obj) { + return false; + } while (obj) { - if (obj === this) { return true; } + if (obj === this) { + return true; + } obj = obj.superclass; } return false; - }, + } - detectInstance(obj) { + static detectInstance(obj) { return obj instanceof this; - }, + } /** In some cases, you may want to annotate computed properties with additional @@ -834,7 +824,9 @@ let ClassMixinProps = { You can pass a hash of these values to a computed property like this: ```javascript - person: Ember.computed(function() { + import { computed } from '@ember/object'; + + person: computed(function() { let personId = this.get('personId'); return Person.create({ id: personId }); }).meta({ type: Person }) @@ -854,7 +846,7 @@ let ClassMixinProps = { @param key {String} property name @private */ - metaForProperty(key) { + static metaForProperty(key) { let proto = this.proto(); let possibleDesc = proto[key]; @@ -863,26 +855,7 @@ let ClassMixinProps = { possibleDesc !== null && typeof possibleDesc === 'object' && possibleDesc.isDescriptor ); return possibleDesc._meta || {}; - }, - - _computedProperties: computed(function() { - _hasCachedComputedProperties(); - let proto = this.proto(); - let property; - let properties = []; - - for (let name in proto) { - property = proto[name]; - - if (property !== null && typeof property === 'object' && property.isDescriptor) { - properties.push({ - name, - meta: property._meta - }); - } - } - return properties; - }).readOnly(), + } /** Iterate over each computed property for the class, passing its name @@ -894,7 +867,7 @@ let ClassMixinProps = { @param {Object} binding @private */ - eachComputedProperty(callback, binding) { + static eachComputedProperty(callback, binding) { let property; let empty = {}; @@ -905,10 +878,107 @@ let ClassMixinProps = { callback.call(binding || this, property.name, property.meta || empty); } } -}; -function injectedPropertyAssertion() { - assert('Injected properties are invalid', validatePropertyInjections(this)); + static get PrototypeMixin() { + let prototypeMixin = prototypeMixinMap.get(this); + if (prototypeMixin === undefined) { + prototypeMixin = Mixin.create(); + prototypeMixin.ownerConstructor = this; + prototypeMixinMap.set(this, prototypeMixin); + } + return prototypeMixin; + } + + static get superclass() { + let c = Object.getPrototypeOf(this); + if (c !== Function.prototype) return c; + } + + static proto() { + let p = this.prototype; + if (!wasApplied.has(p)) { + wasApplied.set(p, true); + let parent = this.superclass; + if (parent) { + parent.proto(); + } + + // If the prototype mixin exists, apply it. In the case of native classes, + // it will not exist (unless the class has been reopened). + if (prototypeMixinMap.has(this)) { + this.PrototypeMixin.applyPartial(p); + } + } + return p; + } +} + +defineProperty(CoreObject, '_computedProperties', computed(function() { + _hasCachedComputedProperties(); + let proto = this.proto(); + let property; + let properties = []; + + for (let name in proto) { + property = proto[name]; + + if (property !== null && typeof property === 'object' && property.isDescriptor) { + properties.push({ + name, + meta: property._meta + }); + } + } + return properties; +}).readOnly()); + +CoreObject.isClass = true; +CoreObject.isMethod = false; + +function flattenProps(...props) { + let { concatenatedProperties, mergedProperties } = this; + let hasConcatenatedProps = + concatenatedProperties !== undefined && concatenatedProperties.length > 0; + let hasMergedProps = mergedProperties !== undefined && mergedProperties.length > 0; + + let initProperties = {}; + + for (let i = 0; i < props.length; i++) { + let properties = props[i]; + + assert( + 'Ember.Object.create no longer supports mixing in other ' + + 'definitions, use .extend & .create separately instead.', + !(properties instanceof Mixin) + ); + + let keyNames = Object.keys(properties); + + for (let j = 0, k = keyNames.length; j < k; j++) { + let keyName = keyNames[j]; + let value = properties[keyName]; + + if (hasConcatenatedProps && concatenatedProperties.indexOf(keyName) > -1) { + let baseValue = initProperties[keyName]; + + if (baseValue) { + value = makeArray(baseValue).concat(value); + } else { + value = makeArray(value); + } + } + + if (hasMergedProps && mergedProperties.indexOf(keyName) > -1) { + let baseValue = initProperties[keyName]; + + value = assign({}, baseValue, value); + } + + initProperties[keyName] = value; + } + } + + return initProperties; } if (DEBUG) { @@ -918,7 +988,22 @@ if (DEBUG) { @private @method _onLookup */ - ClassMixinProps._onLookup = injectedPropertyAssertion; + CoreObject._onLookup = function injectedPropertyAssertion(debugContainerKey) { + assert('Injected properties are invalid', validatePropertyInjections(this)); + + let [type] = debugContainerKey.split(':'); + let proto = this.proto(); + + for (let key in proto) { + let desc = proto[key]; + if (desc instanceof InjectedProperty) { + assert( + `Defining \`${key}\` as an injected controller property on a non-controller (\`${debugContainerKey}\`) is not allowed.`, + type === 'controller' || desc.type !== 'controller' + ); + } + } + }; } /** @@ -929,7 +1014,7 @@ if (DEBUG) { @return {Object} Hash of all lazy injected property keys to container names @private */ -ClassMixinProps._lazyInjections = function() { +CoreObject._lazyInjections = function() { let injections = {}; let proto = this.proto(); let key; @@ -945,11 +1030,4 @@ ClassMixinProps._lazyInjections = function() { return injections; }; -let ClassMixin = Mixin.create(ClassMixinProps); - -ClassMixin.ownerConstructor = CoreObject; - -CoreObject.ClassMixin = ClassMixin; - -ClassMixin.apply(CoreObject); export default CoreObject; diff --git a/packages/ember-runtime/lib/system/namespace.js b/packages/ember-runtime/lib/system/namespace.js index 40618220101..302d15a6499 100644 --- a/packages/ember-runtime/lib/system/namespace.js +++ b/packages/ember-runtime/lib/system/namespace.js @@ -111,7 +111,7 @@ function processNamespace(paths, root, seen) { paths[idx] = key; // If we have found an unprocessed class - if (obj && obj.toString === classToString && !obj[NAME_KEY]) { + if (obj && obj.toString === classToString && !Object.hasOwnProperty.call(obj, NAME_KEY)) { // Replace the class' `toString` with the dot-separated path // and set its `NAME_KEY` obj[NAME_KEY] = paths.join('.'); @@ -201,6 +201,8 @@ function classToString() { return (this[NAME_KEY] = calculateToString(this)); } +EmberObject.toString = classToString; + function processAllNamespaces() { let unprocessedNamespaces = !Namespace.PROCESSED; let unprocessedMixins = hasUnprocessedMixins(); diff --git a/packages/ember-runtime/lib/system/object.js b/packages/ember-runtime/lib/system/object.js index 8e0efea7026..ac51ffd58b5 100644 --- a/packages/ember-runtime/lib/system/object.js +++ b/packages/ember-runtime/lib/system/object.js @@ -3,18 +3,17 @@ */ import { symbol, NAME_KEY, OWNER } from 'ember-utils'; -import { on, descriptor, meta as metaFor } from 'ember-metal'; +import { addListener, peekMeta } from 'ember-metal'; import CoreObject from './core_object'; import Observable from '../mixins/observable'; import { assert } from 'ember-debug'; import { DEBUG } from 'ember-env-flags'; -let OVERRIDE_CONTAINER_KEY = symbol('OVERRIDE_CONTAINER_KEY'); let OVERRIDE_OWNER = symbol('OVERRIDE_OWNER'); /** - `Ember.Object` is the main base class for all Ember objects. It is a subclass - of `Ember.CoreObject` with the `Ember.Observable` mixin applied. For details, + `EmberObject` is the main base class for all Ember objects. It is a subclass + of `CoreObject` with the `Observable` mixin applied. For details, see the documentation for each of these. @class EmberObject @@ -22,43 +21,33 @@ let OVERRIDE_OWNER = symbol('OVERRIDE_OWNER'); @uses Observable @public */ -const EmberObject = CoreObject.extend(Observable, { - _debugContainerKey: descriptor({ - enumerable: false, - get() { - if (this[OVERRIDE_CONTAINER_KEY]) { - return this[OVERRIDE_CONTAINER_KEY]; - } - - let meta = metaFor(this); - let { factory } = meta; - - return factory && factory.fullName; - } - }), +class EmberObject extends CoreObject { + get _debugContainerKey() { + let meta = peekMeta(this); + let { factory } = meta; - [OWNER]: descriptor({ - enumerable: false, - get() { - if (this[OVERRIDE_OWNER]) { - return this[OVERRIDE_OWNER]; - } + return factory && factory.fullName; + } - let meta = metaFor(this); - let { factory } = meta; + get [OWNER]() { + if (this[OVERRIDE_OWNER]) { + return this[OVERRIDE_OWNER]; + } - return factory && factory.owner; - }, + let meta = peekMeta(this); + let { factory } = meta; - // we need a setter here largely to support - // folks calling `owner.ownerInjection()` API - set(value) { - this[OVERRIDE_OWNER] = value; - } - }) -}); + return factory !== undefined && factory.owner; + } + + set [OWNER](value) { + this[OVERRIDE_OWNER] = value; + } +} -EmberObject.toString = () => 'Ember.Object'; +EmberObject[NAME_KEY] = 'Ember.Object'; +EmberObject.PrototypeMixin.reopen(Observable); +EmberObject.proto(); export let FrameworkObject = EmberObject; @@ -66,19 +55,23 @@ if (DEBUG) { let INIT_WAS_CALLED = symbol('INIT_WAS_CALLED'); let ASSERT_INIT_WAS_CALLED = symbol('ASSERT_INIT_WAS_CALLED'); - FrameworkObject = EmberObject.extend({ + FrameworkObject = class FrameworkObject extends EmberObject { init() { this._super(...arguments); this[INIT_WAS_CALLED] = true; - }, + } - [ASSERT_INIT_WAS_CALLED]: on('init', function() { + [ASSERT_INIT_WAS_CALLED]() { assert( `You must call \`this._super(...arguments);\` when overriding \`init\` on a framework object. Please update ${this} to call \`this._super(...arguments);\` from \`init\`.`, this[INIT_WAS_CALLED] ); - }) - }); + } + }; + + FrameworkObject[NAME_KEY] = 'FrameworkObject'; + + addListener(FrameworkObject.prototype, 'init', null, ASSERT_INIT_WAS_CALLED); } export default EmberObject; diff --git a/packages/ember-runtime/tests/controllers/controller_test.js b/packages/ember-runtime/tests/controllers/controller_test.js index 75a26ef6d74..82303259a4d 100644 --- a/packages/ember-runtime/tests/controllers/controller_test.js +++ b/packages/ember-runtime/tests/controllers/controller_test.js @@ -166,7 +166,7 @@ if (!EmberDev.runningProdBuild) { owner.register('foo:main', AnObject); owner.lookup('foo:main'); - }, /Defining an injected controller property on a non-controller is not allowed./); + }, /Defining `foo` as an injected controller property on a non-controller \(`foo:main`\) is not allowed./); }); } diff --git a/packages/ember-runtime/tests/mixins/array_test.js b/packages/ember-runtime/tests/mixins/array_test.js index c229f792238..d16a5c08ce6 100644 --- a/packages/ember-runtime/tests/mixins/array_test.js +++ b/packages/ember-runtime/tests/mixins/array_test.js @@ -24,8 +24,8 @@ import { A as emberA } from '../../system/native_array'; const TestArray = EmberObject.extend(EmberArray, { _content: null, - init(ary = []) { - this._content = ary; + init() { + this._content = this._content || []; }, // some methods to modify the array so we can test changes. Note that @@ -60,7 +60,7 @@ ArrayTests.extend({ newObject(ary) { ary = ary ? ary.slice() : this.newFixture(3); - return new TestArray(ary); + return TestArray.create({ _content: ary }); }, // allows for testing of the basic enumerable after an internal mutation @@ -83,7 +83,7 @@ QUnit.test('the return value of slice has Ember.Array applied', function() { }); QUnit.test('slice supports negative index arguments', function() { - let testArray = new TestArray([1, 2, 3, 4]); + let testArray = TestArray.create({ _content: [1, 2, 3, 4] }); deepEqual(testArray.slice(-2), [3, 4], 'slice(-2)'); deepEqual(testArray.slice(-2, -1), [3], 'slice(-2, -1'); @@ -320,12 +320,14 @@ let ary; QUnit.module('EmberArray.@each support', { setup() { - ary = new TestArray([ - { isDone: true, desc: 'Todo 1' }, - { isDone: false, desc: 'Todo 2' }, - { isDone: true, desc: 'Todo 3' }, - { isDone: false, desc: 'Todo 4' } - ]); + ary = TestArray.create({ + _content: [ + { isDone: true, desc: 'Todo 1' }, + { isDone: false, desc: 'Todo 2' }, + { isDone: true, desc: 'Todo 3' }, + { isDone: false, desc: 'Todo 4' } + ] + }); }, teardown() { diff --git a/packages/ember-runtime/tests/mixins/copyable_test.js b/packages/ember-runtime/tests/mixins/copyable_test.js index ab4ee3938b6..4c7af6ffa76 100644 --- a/packages/ember-runtime/tests/mixins/copyable_test.js +++ b/packages/ember-runtime/tests/mixins/copyable_test.js @@ -28,7 +28,7 @@ const CopyableObject = EmberObject.extend(Copyable, { }, copy() { - let ret = new CopyableObject(); + let ret = CopyableObject.create(); set(ret, 'id', get(this, 'id')); return ret; } @@ -39,7 +39,7 @@ CopyableTests.extend({ name: 'Copyable Basic Test', newObject() { - return new CopyableObject(); + return CopyableObject.create(); }, isEqual(a, b) { diff --git a/packages/ember-runtime/tests/mixins/enumerable_test.js b/packages/ember-runtime/tests/mixins/enumerable_test.js index ad40200fc7f..032750c95a0 100644 --- a/packages/ember-runtime/tests/mixins/enumerable_test.js +++ b/packages/ember-runtime/tests/mixins/enumerable_test.js @@ -18,8 +18,8 @@ function K() { return this; } const TestEnumerable = EmberObject.extend(Enumerable, { _content: null, - init(ary = []) { - this._content = ary; + init() { + this._content = this._content || []; }, addObject(obj) { @@ -51,7 +51,7 @@ EnumerableTests.extend({ newObject(ary) { ary = ary ? ary.slice() : this.newFixture(3); - return new TestEnumerable(ary); + return TestEnumerable.create({ _content: ary }); }, // allows for testing of the basic enumerable after an internal mutation diff --git a/packages/ember-runtime/tests/mixins/mutable_array_test.js b/packages/ember-runtime/tests/mixins/mutable_array_test.js index f2724a89f1b..2c13fadbb42 100644 --- a/packages/ember-runtime/tests/mixins/mutable_array_test.js +++ b/packages/ember-runtime/tests/mixins/mutable_array_test.js @@ -16,8 +16,8 @@ const TestMutableArray = EmberObject.extend(MutableArray, { _content: null, - init(ary = []) { - this._content = emberA(ary); + init() { + this._content = this._content || []; }, replace(idx, amt, objects) { @@ -55,7 +55,7 @@ MutableArrayTests.extend({ newObject(ary) { ary = ary ? ary.slice() : this.newFixture(3); - return new TestMutableArray(ary); + return TestMutableArray.create({ _content: ary }); }, // allows for testing of the basic enumerable after an internal mutation diff --git a/packages/ember-runtime/tests/mixins/mutable_enumerable_test.js b/packages/ember-runtime/tests/mixins/mutable_enumerable_test.js index 3f5b8532b73..b6004b57c95 100644 --- a/packages/ember-runtime/tests/mixins/mutable_enumerable_test.js +++ b/packages/ember-runtime/tests/mixins/mutable_enumerable_test.js @@ -10,6 +10,7 @@ import { computed, get } from 'ember-metal'; const TestMutableEnumerable = EmberObject.extend(MutableEnumerable, { _content: null, + addObject(obj) { if (this._content.indexOf(obj) >= 0) { return this; @@ -32,8 +33,8 @@ const TestMutableEnumerable = EmberObject.extend(MutableEnumerable, { return this; }, - init(ary) { - this._content = ary || []; + init() { + this._content = this._content || []; }, nextObject(idx) { @@ -55,7 +56,7 @@ MutableEnumerableTests.extend({ newObject(ary) { ary = ary ? ary.slice() : this.newFixture(3); - return new TestMutableEnumerable(ary); + return TestMutableEnumerable.create({ _content: ary }); }, // allows for testing of the basic enumerable after an internal mutation diff --git a/packages/ember-runtime/tests/suites/suite.js b/packages/ember-runtime/tests/suites/suite.js index 8313ad2aa7c..37444eed418 100644 --- a/packages/ember-runtime/tests/suites/suite.js +++ b/packages/ember-runtime/tests/suites/suite.js @@ -57,7 +57,7 @@ Suite.reopenClass({ run() { let C = this; - return new C().run(); + return C.create().run(); }, module(desc, opts) { diff --git a/packages/ember-runtime/tests/system/core_object_test.js b/packages/ember-runtime/tests/system/core_object_test.js index 7a4fec7c8e5..fc9793ff63b 100644 --- a/packages/ember-runtime/tests/system/core_object_test.js +++ b/packages/ember-runtime/tests/system/core_object_test.js @@ -4,31 +4,30 @@ import { set, observer } from 'ember-metal'; QUnit.module('Ember.CoreObject'); QUnit.test('works with new (one arg)', function() { - let obj = new CoreObject({ - firstName: 'Stef', - lastName: 'Penner' - }); - - equal(obj.firstName, 'Stef'); - equal(obj.lastName, 'Penner'); + expectDeprecation(() => { + let obj = new CoreObject({ + firstName: 'Stef', + lastName: 'Penner' + }); + }, /using `new` with Ember.Object has been deprecated/); }); QUnit.test('works with new (> 1 arg)', function() { - let obj = new CoreObject({ - firstName: 'Stef', - lastName: 'Penner' - }, { - other: 'name' - }); - - equal(obj.firstName, 'Stef'); - equal(obj.lastName, 'Penner'); - - equal(obj.other, undefined); // doesn't support multiple pojo' to the constructor + expectDeprecation(() => { + new CoreObject( + { + firstName: 'Stef', + lastName: 'Penner', + }, + { + other: 'name', + } + ); + }, /using `new` with Ember.Object has been deprecated/); }); QUnit.test('toString should be not be added as a property when calling toString()', function() { - let obj = new CoreObject({ + let obj = CoreObject.create({ firstName: 'Foo', lastName: 'Bar' }); diff --git a/packages/ember-runtime/tests/system/object/computed_test.js b/packages/ember-runtime/tests/system/object/computed_test.js index 23aeead7a5d..42df570332a 100644 --- a/packages/ember-runtime/tests/system/object/computed_test.js +++ b/packages/ember-runtime/tests/system/object/computed_test.js @@ -16,7 +16,7 @@ testWithDefault('computed property on instance', function(get, set) { foo: computed(function() { return 'FOO'; }) }); - equal(get(new MyClass(), 'foo'), 'FOO'); + equal(get(MyClass.create(), 'foo'), 'FOO'); }); @@ -29,7 +29,7 @@ testWithDefault('computed property on subclass', function(get, set) { foo: computed(function() { return 'BAR'; }) }); - equal(get(new Subclass(), 'foo'), 'BAR'); + equal(get(Subclass.create(), 'foo'), 'BAR'); }); @@ -42,7 +42,7 @@ testWithDefault('replacing computed property with regular val', function(get, se foo: 'BAR' }); - equal(get(new Subclass(), 'foo'), 'BAR'); + equal(get(Subclass.create(), 'foo'), 'BAR'); }); testWithDefault('complex depndent keys', function(get, set) { @@ -66,8 +66,8 @@ testWithDefault('complex depndent keys', function(get, set) { count: 20 }); - let obj1 = new MyClass(); - let obj2 = new Subclass(); + let obj1 = MyClass.create(); + let obj2 = Subclass.create(); equal(get(obj1, 'foo'), 'BIFF 1'); equal(get(obj2, 'foo'), 'BIFF 21'); @@ -112,7 +112,7 @@ testWithDefault('complex dependent keys changing complex dependent keys', functi }).property('bar2.baz') }); - let obj2 = new Subclass(); + let obj2 = Subclass.create(); equal(get(obj2, 'foo'), 'BIFF2 1'); diff --git a/packages/ember-runtime/tests/system/object/destroy_test.js b/packages/ember-runtime/tests/system/object/destroy_test.js index 921cfc2e148..0180b072d1e 100644 --- a/packages/ember-runtime/tests/system/object/destroy_test.js +++ b/packages/ember-runtime/tests/system/object/destroy_test.js @@ -123,13 +123,13 @@ QUnit.test('destroyed objects should not see each others changes during teardown }) }); - objs.a = new A(); + objs.a = A.create(); - objs.b = new B(); + objs.b = B.create(); - objs.c = new C(); + objs.c = C.create(); - new LongLivedObject(); + LongLivedObject.create(); run(() => { let keys = Object.keys(objs); diff --git a/packages/ember-runtime/tests/system/object/es-compatibility-test.js b/packages/ember-runtime/tests/system/object/es-compatibility-test.js index 6ad906a039c..ba8850461dd 100644 --- a/packages/ember-runtime/tests/system/object/es-compatibility-test.js +++ b/packages/ember-runtime/tests/system/object/es-compatibility-test.js @@ -1,150 +1,427 @@ import EmberObject from '../../../system/object'; -import { Mixin } from 'ember-metal'; - -QUnit.module('EmberObject ES Compatibility'); - -QUnit.test('extending an Ember.Object', function(assert) { - let calls = []; - - class MyObject extends EmberObject { - constructor() { - calls.push('constructor'); - super(...arguments); - this.postInitProperty = 'post-init-property'; +import { Mixin, defineProperty, computed, addObserver, addListener, sendEvent } from 'ember-metal'; +import { moduleFor, AbstractTestCase } from 'internal-test-helpers'; + +moduleFor( + 'EmberObject ES Compatibility', + class extends AbstractTestCase { + ['@test extending an Ember.Object'](assert) { + let calls = []; + + class MyObject extends EmberObject { + constructor() { + calls.push('constructor'); + super(...arguments); + this.postInitProperty = 'post-init-property'; + } + + init() { + calls.push('init'); + super.init(...arguments); + this.initProperty = 'init-property'; + } + } + + let myObject = MyObject.create({ passedProperty: 'passed-property' }); + + assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (create)'); + assert.equal( + myObject.postInitProperty, + 'post-init-property', + 'constructor property available on instance (create)' + ); + assert.equal( + myObject.initProperty, + 'init-property', + 'init property available on instance (create)' + ); + assert.equal( + myObject.passedProperty, + 'passed-property', + 'passed property available on instance (create)' + ); } - init() { - calls.push('init'); - super.init(...arguments); - this.initProperty = 'init-property'; + ['@test normal method super'](assert) { + let calls = []; + + let Foo = EmberObject.extend({ + method() { + calls.push('foo'); + }, + }); + + let Bar = Foo.extend({ + method() { + this._super(); + calls.push('bar'); + }, + }); + + class Baz extends Bar { + method() { + super.method(); + calls.push('baz'); + } + } + + let Qux = Baz.extend({ + method() { + this._super(); + calls.push('qux'); + }, + }); + + let Quux = Qux.extend({ + method() { + this._super(); + calls.push('quux'); + }, + }); + + class Corge extends Quux { + method() { + super.method(); + calls.push('corge'); + } + } + + let callValues = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']; + + [Foo, Bar, Baz, Qux, Quux, Corge].forEach((Class, index) => { + calls = []; + Class.create().method(); + + assert.deepEqual( + calls, + callValues.slice(0, index + 1), + 'chain of static methods called with super' + ); + }); } - } - - let myObject = MyObject.create({ passedProperty: 'passed-property' }); - - assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (create)'); - assert.equal(myObject.postInitProperty, 'post-init-property', 'constructor property available on instance (create)'); - assert.equal(myObject.initProperty, 'init-property', 'init property available on instance (create)'); - assert.equal(myObject.passedProperty, 'passed-property', 'passed property available on instance (create)'); - calls = []; - myObject = new MyObject({ passedProperty: 'passed-property' }); - - assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (new)'); - assert.equal(myObject.postInitProperty, 'post-init-property', 'constructor property available on instance (new)'); - assert.equal(myObject.initProperty, 'init-property', 'init property available on instance (new)'); - assert.equal(myObject.passedProperty, 'passed-property', 'passed property available on instance (new)'); -}); - -QUnit.test('using super', function(assert) { - let calls = []; - - let SuperSuperObject = EmberObject.extend({ - method() { - calls.push('super-super-method'); + ['@test static method super'](assert) { + let calls; + + let Foo = EmberObject.extend(); + Foo.reopenClass({ + method() { + calls.push('foo'); + }, + }); + + let Bar = Foo.extend(); + Bar.reopenClass({ + method() { + this._super(); + calls.push('bar'); + }, + }); + + class Baz extends Bar { + static method() { + super.method(); + calls.push('baz'); + } + } + + let Qux = Baz.extend(); + Qux.reopenClass({ + method() { + this._super(); + calls.push('qux'); + }, + }); + + let Quux = Qux.extend(); + Quux.reopenClass({ + method() { + this._super(); + calls.push('quux'); + }, + }); + + class Corge extends Quux { + static method() { + super.method(); + calls.push('corge'); + } + } + + let callValues = ['foo', 'bar', 'baz', 'qux', 'quux', 'corge']; + + [Foo, Bar, Baz, Qux, Quux, Corge].forEach((Class, index) => { + calls = []; + Class.method(); + + assert.deepEqual( + calls, + callValues.slice(0, index + 1), + 'chain of static methods called with super' + ); + }); } - }); - let SuperObject = SuperSuperObject.extend({ - method() { - this._super(); - calls.push('super-method'); - } - }); + ['@test using mixins'](assert) { + let Mixin1 = Mixin.create({ + property1: 'data-1', + }); - class MyObject extends SuperObject { - method() { - super.method(); - calls.push('method'); - } - } - - let myObject = new MyObject(); - myObject.method(); - - assert.deepEqual(calls, [ - 'super-super-method', - 'super-method', - 'method' - ], 'chain of prototype methods called with super'); -}); + let Mixin2 = Mixin.create({ + property2: 'data-2', + }); -QUnit.test('using mixins', function(assert) { - let Mixin1 = Mixin.create({ - property1: 'data-1' - }); + class MyObject extends EmberObject.extend(Mixin1, Mixin2) {} - let Mixin2 = Mixin.create({ - property2: 'data-2' - }); + let myObject = MyObject.create(); + assert.equal(myObject.property1, 'data-1', 'includes the first mixin'); + assert.equal(myObject.property2, 'data-2', 'includes the second mixin'); + } - class MyObject extends EmberObject.extend(Mixin1, Mixin2) {} + ['@test using instanceof'](assert) { + class MyObject extends EmberObject {} - let myObject = new MyObject(); - assert.equal(myObject.property1, 'data-1', 'includes the first mixin'); - assert.equal(myObject.property2, 'data-2', 'includes the second mixin'); -}); + let myObject = MyObject.create(); -QUnit.test('using instanceof', function(assert) { - class MyObject extends EmberObject {} + assert.ok(myObject instanceof MyObject); + assert.ok(myObject instanceof EmberObject); + } - let myObject1 = MyObject.create(); - let myObject2 = new MyObject(); + ['@test extending an ES subclass of EmberObject'](assert) { + let calls = []; - assert.ok(myObject1 instanceof MyObject); - assert.ok(myObject1 instanceof EmberObject); + class SubEmberObject extends EmberObject { + constructor() { + calls.push('constructor'); + super(...arguments); + } - assert.ok(myObject2 instanceof MyObject); - assert.ok(myObject2 instanceof EmberObject); -}); + init() { + calls.push('init'); + super.init(...arguments); + } + } -QUnit.test('extending an ES subclass of EmberObject', function(assert) { - let calls = []; + class MyObject extends SubEmberObject {} - class SubEmberObject extends EmberObject { - constructor() { - calls.push('constructor'); - super(...arguments); + MyObject.create(); + assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (create)'); } - init() { - calls.push('init'); - super.init(...arguments); + ['@test calling extend on an ES subclass of EmberObject'](assert) { + let calls = []; + + class SubEmberObject extends EmberObject { + constructor() { + calls.push('before constructor'); + super(...arguments); + calls.push('after constructor'); + this.foo = 123; + } + + init() { + calls.push('init'); + super.init(...arguments); + } + } + + let MyObject = SubEmberObject.extend({}); + + MyObject.create(); + assert.deepEqual( + calls, + ['before constructor', 'after constructor', 'init'], + 'constructor then init called (create)' + ); + + let obj = MyObject.create({ + foo: 456, + bar: 789, + }); + + assert.equal(obj.foo, 456, 'sets class fields on instance correctly'); + assert.equal(obj.bar, 789, 'sets passed in properties on instance correctly'); } - } - - class MyObject extends SubEmberObject {} - MyObject.create(); - assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (create)'); + ['@test calling metaForProperty on a native class works'](assert) { + assert.expect(0); - calls = []; - new MyObject(); - assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (new)'); -}); + class SubEmberObject extends EmberObject {} -// TODO: Needs to be fixed. Currently only `init` is called. -QUnit.skip('calling extend on an ES subclass of EmberObject', function(assert) { - let calls = []; + defineProperty( + SubEmberObject.prototype, + 'foo', + computed('foo', { + get() { + return 'bar'; + }, + }) + ); - class SubEmberObject extends EmberObject { - constructor() { - calls.push('constructor'); - super(...arguments); + // able to get meta without throwing an error + SubEmberObject.metaForProperty('foo'); } - init() { - calls.push('init'); - super.init(...arguments); + '@test super and _super interop between old and new methods'(assert) { + let calls = []; + let changes = []; + let events = []; + let lastProps; + + class A extends EmberObject { + init(props) { + calls.push('A init'); + lastProps = props; + } + } + + let Mixin1 = Mixin.create({ + init() { + calls.push('Mixin1 init before _super'); + this._super(...arguments); + calls.push('Mixin1 init after _super'); + }, + }); + + let Mixin2 = Mixin.create({ + init() { + calls.push('Mixin2 init before _super'); + this._super(...arguments); + calls.push('Mixin2 init after _super'); + }, + }); + + class B extends A.extend(Mixin1, Mixin2) { + init() { + calls.push('B init before super.init'); + super.init(...arguments); + calls.push('B init after super.init'); + } + + onSomeEvent(evt) { + events.push(`B onSomeEvent ${evt}`); + } + + fullNameDidChange() { + changes.push('B fullNameDidChange'); + } + } + + // // define a CP + defineProperty( + B.prototype, + 'full', + computed('first', 'last', { + get() { + return this.first + ' ' + this.last; + }, + }) + ); + + // Only string observers are allowed for prototypes + addObserver(B.prototype, 'full', null, 'fullNameDidChange'); + + // Only string listeners are allowed for prototypes + addListener(B.prototype, 'someEvent', null, 'onSomeEvent'); + + B.reopen({ + init() { + calls.push('reopen init before _super'); + this._super(...arguments); + calls.push('reopen init after _super'); + }, + }); + + let C = B.extend({ + init() { + calls.push('C init before _super'); + this._super(...arguments); + calls.push('C init after _super'); + }, + + onSomeEvent(evt) { + calls.push('C onSomeEvent before _super'); + this._super(evt); + calls.push('C onSomeEvent after _super'); + }, + + fullNameDidChange() { + calls.push('C fullNameDidChange before _super'); + this._super(); + calls.push('C fullNameDidChange after _super'); + }, + }); + + class D extends C { + init() { + calls.push('D init before super.init'); + super.init(...arguments); + calls.push('D init after super.init'); + } + + onSomeEvent(evt) { + events.push('D onSomeEvent before super.onSomeEvent'); + super.onSomeEvent(evt); + events.push('D onSomeEvent after super.onSomeEvent'); + } + + fullNameDidChange() { + changes.push('D fullNameDidChange before super.fullNameDidChange'); + super.fullNameDidChange(); + changes.push('D fullNameDidChange after super.fullNameDidChange'); + } + + triggerSomeEvent(...args) { + sendEvent(this, 'someEvent', args); + } + } + + assert.deepEqual(calls, [], 'nothing has been called'); + assert.deepEqual(changes, [], 'full has not changed'); + assert.deepEqual(events, [], 'onSomeEvent has not been triggered'); + + let d = D.create({ first: 'Robert', last: 'Jackson' }); + + assert.deepEqual(calls, [ + 'D init before super.init', + 'C init before _super', + 'reopen init before _super', + 'B init before super.init', + 'Mixin2 init before _super', + 'Mixin1 init before _super', + 'A init', + 'Mixin1 init after _super', + 'Mixin2 init after _super', + 'B init after super.init', + 'reopen init after _super', + 'C init after _super', + 'D init after super.init', + ]); + assert.deepEqual(changes, [], 'full has not changed'); + assert.deepEqual(events, [], 'onSomeEvent has not been triggered'); + + assert.deepEqual(lastProps, { + first: 'Robert', + last: 'Jackson', + }); + + assert.equal(d.get('full'), 'Robert Jackson'); + + d.setProperties({ first: 'Kris', last: 'Selden' }); + assert.deepEqual(changes, [ + 'D fullNameDidChange before super.fullNameDidChange', + 'B fullNameDidChange', + 'D fullNameDidChange after super.fullNameDidChange', + ]); + + assert.equal(d.get('full'), 'Kris Selden'); + + d.triggerSomeEvent('event arg'); + assert.deepEqual(events, [ + 'D onSomeEvent before super.onSomeEvent', + 'B onSomeEvent event arg', + 'D onSomeEvent after super.onSomeEvent', + ]); } } - - let MyObject = SubEmberObject.extend({}); - - MyObject.create(); - assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (create)'); - - calls = []; - new MyObject(); - assert.deepEqual(calls, ['constructor', 'init'], 'constructor then init called (new)'); -}); +); diff --git a/packages/ember-runtime/tests/system/object/extend_test.js b/packages/ember-runtime/tests/system/object/extend_test.js index 37024b14aae..d452e97d32d 100644 --- a/packages/ember-runtime/tests/system/object/extend_test.js +++ b/packages/ember-runtime/tests/system/object/extend_test.js @@ -6,14 +6,14 @@ QUnit.module('EmberObject.extend'); QUnit.test('Basic extend', function() { let SomeClass = EmberObject.extend({ foo: 'BAR' }); ok(SomeClass.isClass, 'A class has isClass of true'); - let obj = new SomeClass(); + let obj = SomeClass.create(); equal(obj.foo, 'BAR'); }); QUnit.test('Sub-subclass', function() { let SomeClass = EmberObject.extend({ foo: 'BAR' }); let AnotherClass = SomeClass.extend({ bar: 'FOO' }); - let obj = new AnotherClass(); + let obj = AnotherClass.create(); equal(obj.foo, 'BAR'); equal(obj.bar, 'FOO'); }); @@ -43,7 +43,7 @@ QUnit.test('Overriding a method several layers deep', function() { } }); - let obj = new FinalClass(); + let obj = FinalClass.create(); obj.foo(); obj.bar(); equal(obj.fooCnt, 2, 'should invoke both'); @@ -67,9 +67,9 @@ QUnit.test('With concatenatedProperties', function() { let SomeClass = EmberObject.extend({ things: 'foo', concatenatedProperties: ['things'] }); let AnotherClass = SomeClass.extend({ things: 'bar' }); let YetAnotherClass = SomeClass.extend({ things: 'baz' }); - let some = new SomeClass(); - let another = new AnotherClass(); - let yetAnother = new YetAnotherClass(); + let some = SomeClass.create(); + let another = AnotherClass.create(); + let yetAnother = YetAnotherClass.create(); deepEqual(some.get('things'), ['foo'], 'base class should have just its value'); deepEqual(another.get('things'), ['foo', 'bar'], 'subclass should have base class\' and its own'); deepEqual(yetAnother.get('things'), ['foo', 'baz'], 'subclass should have base class\' and its own'); @@ -85,9 +85,9 @@ QUnit.test('With concatenatedProperties class properties', function() { AnotherClass.reopenClass({ things: 'bar' }); let YetAnotherClass = SomeClass.extend(); YetAnotherClass.reopenClass({ things: 'baz' }); - let some = new SomeClass(); - let another = new AnotherClass(); - let yetAnother = new YetAnotherClass(); + let some = SomeClass.create(); + let another = AnotherClass.create(); + let yetAnother = YetAnotherClass.create(); deepEqual(get(some.constructor, 'things'), ['foo'], 'base class should have just its value'); deepEqual(get(another.constructor, 'things'), ['foo', 'bar'], 'subclass should have base class\' and its own'); deepEqual(get(yetAnother.constructor, 'things'), ['foo', 'baz'], 'subclass should have base class\' and its own'); diff --git a/packages/ember-runtime/tests/system/object/observer_test.js b/packages/ember-runtime/tests/system/object/observer_test.js index a37a2b55bc9..031564fd9a4 100644 --- a/packages/ember-runtime/tests/system/object/observer_test.js +++ b/packages/ember-runtime/tests/system/object/observer_test.js @@ -13,7 +13,7 @@ testBoth('observer on class', function(get, set) { }) }); - let obj = new MyClass(); + let obj = MyClass.create(); equal(get(obj, 'count'), 0, 'should not invoke observer immediately'); set(obj, 'bar', 'BAZ'); @@ -35,7 +35,7 @@ testBoth('observer on subclass', function(get, set) { }) }); - let obj = new Subclass(); + let obj = Subclass.create(); equal(get(obj, 'count'), 0, 'should not invoke observer immediately'); set(obj, 'bar', 'BAZ'); @@ -196,7 +196,7 @@ testBoth('chain observer on class that has a reference to an uninitialized objec } }); - let parent = new ParentClass(); + let parent = ParentClass.create(); equal(changed, false, 'precond'); diff --git a/packages/ember-runtime/tests/system/object/reopen_test.js b/packages/ember-runtime/tests/system/object/reopen_test.js index 3caf49ff28e..41495688f02 100644 --- a/packages/ember-runtime/tests/system/object/reopen_test.js +++ b/packages/ember-runtime/tests/system/object/reopen_test.js @@ -10,8 +10,8 @@ QUnit.test('adds new properties to subclass instance', function() { bar: 'BAR' }); - equal(new Subclass().foo(), 'FOO', 'Adds method'); - equal(get(new Subclass(), 'bar'), 'BAR', 'Adds property'); + equal(Subclass.create().foo(), 'FOO', 'Adds method'); + equal(get(Subclass.create(), 'bar'), 'BAR', 'Adds property'); }); QUnit.test('reopened properties inherited by subclasses', function() { @@ -23,8 +23,8 @@ QUnit.test('reopened properties inherited by subclasses', function() { bar: 'BAR' }); - equal(new SubSub().foo(), 'FOO', 'Adds method'); - equal(get(new SubSub(), 'bar'), 'BAR', 'Adds property'); + equal(SubSub.create().foo(), 'FOO', 'Adds method'); + equal(get(SubSub.create(), 'bar'), 'BAR', 'Adds property'); }); QUnit.test('allows reopening already instantiated classes', function() { diff --git a/packages/ember-runtime/tests/system/object/toString_test.js b/packages/ember-runtime/tests/system/object/toString_test.js index 68cb674c581..57aebf920ae 100644 --- a/packages/ember-runtime/tests/system/object/toString_test.js +++ b/packages/ember-runtime/tests/system/object/toString_test.js @@ -15,10 +15,6 @@ QUnit.module('system/object/toString', { } }); -QUnit.test('NAME_KEY slot is present on Class', function() { - ok(EmberObject.extend().hasOwnProperty(NAME_KEY), 'Ember Class\'s have a NAME_KEY slot'); -}); - QUnit.test('toString() returns the same value if called twice', function() { let Foo = Namespace.create(); Foo.toString = function() { return 'Foo'; }; diff --git a/packages/ember-testing/lib/setup_for_testing.js b/packages/ember-testing/lib/setup_for_testing.js index 9390ab10945..19e5ef7c77f 100644 --- a/packages/ember-testing/lib/setup_for_testing.js +++ b/packages/ember-testing/lib/setup_for_testing.js @@ -32,7 +32,7 @@ export default function setupForTesting() { let adapter = getAdapter(); // if adapter is not manually set default to QUnit if (!adapter) { - setAdapter((typeof self.QUnit === 'undefined') ? new Adapter() : new QUnitAdapter()); + setAdapter((typeof self.QUnit === 'undefined') ? Adapter.create() : QUnitAdapter.create()); } if (jQuery) { diff --git a/packages/ember-testing/tests/adapters/adapter_test.js b/packages/ember-testing/tests/adapters/adapter_test.js index f68ce1ee231..b556c9660a1 100644 --- a/packages/ember-testing/tests/adapters/adapter_test.js +++ b/packages/ember-testing/tests/adapters/adapter_test.js @@ -5,7 +5,7 @@ var adapter; QUnit.module('ember-testing Adapter', { setup() { - adapter = new Adapter(); + adapter = Adapter.create(); }, teardown() { run(adapter, adapter.destroy); diff --git a/packages/ember-testing/tests/adapters/qunit_test.js b/packages/ember-testing/tests/adapters/qunit_test.js index 958d1ead482..ebbf22ba844 100644 --- a/packages/ember-testing/tests/adapters/qunit_test.js +++ b/packages/ember-testing/tests/adapters/qunit_test.js @@ -5,7 +5,7 @@ var adapter; QUnit.module('ember-testing QUnitAdapter', { setup() { - adapter = new QUnitAdapter(); + adapter = QUnitAdapter.create(); }, teardown() { run(adapter, adapter.destroy); diff --git a/packages/external-helpers/lib/external-helpers-dev.js b/packages/external-helpers/lib/external-helpers-dev.js index 835a162fe24..99ed71491ac 100644 --- a/packages/external-helpers/lib/external-helpers-dev.js +++ b/packages/external-helpers/lib/external-helpers-dev.js @@ -1,3 +1,7 @@ +const create = Object.create; +const setPrototypeOf = Object.setPrototypeOf; +const defineProperty = Object.defineProperty; + export function classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); @@ -6,19 +10,19 @@ export function classCallCheck(instance, Constructor) { export function inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { - throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); + throw new TypeError( + 'Super expression must either be null or a function, not ' + typeof superClass + ); } - - subClass.prototype = Object.create(superClass && superClass.prototype, { + subClass.prototype = create(superClass === null ? null : superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, - configurable: true - } + configurable: true, + }, }); - - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : defaults(subClass, superClass); + if (superClass !== null) setPrototypeOf(subClass, superClass); } export function taggedTemplateLiteralLoose(strings, raw) { @@ -32,33 +36,19 @@ function defineProperties(target, props) { descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); + defineProperty(target, descriptor.key, descriptor); } } export function createClass(Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); + if (protoProps !== undefined) defineProperties(Constructor.prototype, protoProps); + if (staticProps !== undefined) defineProperties(Constructor, staticProps); return Constructor; } -export function defaults(obj, defaults) { - var keys = Object.getOwnPropertyNames(defaults); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - var value = Object.getOwnPropertyDescriptor(defaults, key); - if (value && value.configurable && obj[key] === undefined) { - Object.defineProperty(obj, key, value); - } - } - return obj; -} - -export const possibleConstructorReturn = (function (self, call) { +export const possibleConstructorReturn = function(self, call) { if (!self) { throw new ReferenceError(`this hasn't been initialized - super() hasn't been called`); } - return call && (typeof call === 'object' || typeof call === 'function') ? call : self; -}); - -export const slice = Array.prototype.slice; + return (call !== null && typeof call === 'object') || typeof call === 'function' ? call : self; +}; diff --git a/packages/external-helpers/lib/external-helpers-prod.js b/packages/external-helpers/lib/external-helpers-prod.js index dc1c93cfd52..2fac6d95e3a 100644 --- a/packages/external-helpers/lib/external-helpers-prod.js +++ b/packages/external-helpers/lib/external-helpers-prod.js @@ -1,14 +1,19 @@ +const create = Object.create; +const setPrototypeOf = Object.setPrototypeOf; +const defineProperty = Object.defineProperty; + +export function classCallCheck() {} + export function inherits(subClass, superClass) { - subClass.prototype = Object.create(superClass && superClass.prototype, { + subClass.prototype = create(superClass === null ? null : superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, - configurable: true - } + configurable: true, + }, }); - - if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : defaults(subClass, superClass); + if (superClass !== null) setPrototypeOf(subClass, superClass); } export function taggedTemplateLiteralLoose(strings, raw) { @@ -22,30 +27,16 @@ function defineProperties(target, props) { descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; - Object.defineProperty(target, descriptor.key, descriptor); + defineProperty(target, descriptor.key, descriptor); } } export function createClass(Constructor, protoProps, staticProps) { - if (protoProps) defineProperties(Constructor.prototype, protoProps); - if (staticProps) defineProperties(Constructor, staticProps); + if (protoProps !== undefined) defineProperties(Constructor.prototype, protoProps); + if (staticProps !== undefined) defineProperties(Constructor, staticProps); return Constructor; } -export function defaults(obj, defaults) { - var keys = Object.getOwnPropertyNames(defaults); - for (var i = 0; i < keys.length; i++) { - var key = keys[i]; - var value = Object.getOwnPropertyDescriptor(defaults, key); - if (value && value.configurable && obj[key] === undefined) { - Object.defineProperty(obj, key, value); - } - } - return obj; +export function possibleConstructorReturn(self, call) { + return (call !== null && typeof call === 'object') || typeof call === 'function' ? call : self; } - -export const possibleConstructorReturn = (function (self, call) { - return call && (typeof call === 'object' || typeof call === 'function') ? call : self; -}); - -export const slice = Array.prototype.slice; \ No newline at end of file diff --git a/packages/internal-test-helpers/lib/build-owner.js b/packages/internal-test-helpers/lib/build-owner.js index 3e82021ba53..1b71487c725 100644 --- a/packages/internal-test-helpers/lib/build-owner.js +++ b/packages/internal-test-helpers/lib/build-owner.js @@ -10,6 +10,16 @@ import { Object as EmberObject } from 'ember-runtime'; +class ResolverWrapper { + constructor(resolver) { + this.resolver = resolver; + } + + create() { + return this.resolver; + } +} + export default function buildOwner(options = {}) { let ownerOptions = options.ownerOptions || {}; let resolver = options.resolver; @@ -18,7 +28,7 @@ export default function buildOwner(options = {}) { let Owner = EmberObject.extend(RegistryProxyMixin, ContainerProxyMixin); let namespace = EmberObject.create({ - Resolver: { create() { return resolver; } } + Resolver: new ResolverWrapper(resolver), }); let fallbackRegistry = Application.buildRegistry(namespace); diff --git a/testem.dist.js b/testem.dist.js new file mode 100644 index 00000000000..fab4bc763f2 --- /dev/null +++ b/testem.dist.js @@ -0,0 +1,94 @@ +var FailureOnlyReporter = require('./lib/failure-only-testem-reporter'); + +function FailureOnlyPerBrowserReporter() { + FailureOnlyReporter.apply(this, arguments); + this._resultsByBrowser = {}; +} + +FailureOnlyPerBrowserReporter.prototype = Object.create(FailureOnlyReporter.prototype); +FailureOnlyPerBrowserReporter.prototype.constructor = FailureOnlyPerBrowserReporter; + +FailureOnlyPerBrowserReporter.prototype.report = function(prefix, data) { + if (!this._resultsByBrowser[prefix]) { + this._resultsByBrowser[prefix] = { + total: 0, + pass: 0, + skipped: 0 + }; + } + + this._resultsByBrowser[prefix].total++; + if (data.skipped) { + this._resultsByBrowser[prefix].skipped++; + } else if (data.passed) { + this._resultsByBrowser[prefix].pass++; + } + + FailureOnlyReporter.prototype.report.apply(this, arguments); +}; + +FailureOnlyPerBrowserReporter.prototype.summaryDisplay = function() { + var originalSummary = FailureOnlyReporter.prototype.summaryDisplay.apply(this, arguments); + var lines = []; + var resultsByBrowser = this._resultsByBrowser; + Object.keys(resultsByBrowser).forEach(function(browser) { + var results = resultsByBrowser[browser]; + + lines.push('#'); + lines.push('# Browser: ' + browser); + lines.push('# tests ' + results.total); + lines.push('# pass ' + results.pass); + lines.push('# skip ' + results.skipped); + lines.push('# fail ' + (results.total - results.pass - results.skipped)); + }); + lines.push('#'); + return lines.join('\n') + '\n' + originalSummary; +}; + +module.exports = { + framework: "qunit", + test_page: "dist/tests/index.html?hidepassed&hideskipped&timeout=60000", + timeout: 540, + reporter: FailureOnlyPerBrowserReporter, + browser_start_timeout: 600, + parallel: 4, + disable_watching: true, + launchers: { + BS_Chrome_Current: { + exe: "node_modules/.bin/browserstack-launch", + args: ["--os", "Windows", "--osv", "10", "--b", "chrome", "--bv", "latest", "-t", "600", "--u", ""], + protocol: "browser" + }, + BS_Firefox_Current: { + exe: "node_modules/.bin/browserstack-launch", + args: ["--os", "Windows", "--osv", "10", "--b", "firefox", "--bv", "latest", "-t", "600", "--u", ""], + protocol: "browser" + }, + BS_Safari_Current: { + exe: "node_modules/.bin/browserstack-launch", + args: ["--os", "OS X", "--osv", "High Sierra", "--b", "safari", "--bv", "latest", "-t", "600", "--u", ""], + protocol: "browser" + }, + BS_Safari_Last: { + exe: "node_modules/.bin/browserstack-launch", + args: ["--os", "OS X", "--osv", "Sierra", "--b", "safari", "--bv", "latest", "-t", "600", "--u", ""], + protocol: "browser" + }, + BS_MS_Edge: { + exe: "node_modules/.bin/browserstack-launch", + args: ["--os", "Windows", "--osv", "10", "--b", "edge", "--bv", "latest", "-t", "600", "--u", ""], + protocol: "browser" + }, + BS_IE_11: { + exe: "node_modules/.bin/browserstack-launch", + args: ["--os", "Windows", "--osv", "10", "--b", "ie", "--bv", "11.0", "-t", "600", "--u", ""], + protocol: "browser" + } + }, + launch_in_dev: [], + launch_in_ci: [ + "BS_Safari_Current", + "BS_MS_Edge", + "BS_IE_11" + ] +}; diff --git a/testem.dist.json b/testem.dist.json index 4dbcabd7b6c..16a6844e4b5 100644 --- a/testem.dist.json +++ b/testem.dist.json @@ -38,7 +38,7 @@ "protocol": "tap" } }, - "launch_in_dev": ["PhantomJS"], + "launch_in_dev": [], "launch_in_ci": [ "SL_Safari_Current", "SL_MS_Edge", diff --git a/testem.json b/testem.json index 92b16264a61..8c28788213d 100644 --- a/testem.json +++ b/testem.json @@ -4,5 +4,5 @@ "timeout": 540, "parallel": 4, "disable_watching": true, - "launch_in_dev": ["PhantomJS"] + "launch_in_dev": [] } diff --git a/testem.travis-browsers.js b/testem.travis-browsers.js index ea6f8ae91a2..ea7a29a8da5 100644 --- a/testem.travis-browsers.js +++ b/testem.travis-browsers.js @@ -1,25 +1,4 @@ -var TapReporter = require('testem/lib/reporters/tap_reporter'); - -function FailureOnlyReporter() { - TapReporter.apply(this, arguments); - this._reportCount = 0; -} - -FailureOnlyReporter.prototype = Object.create(TapReporter.prototype); -FailureOnlyReporter.prototype.constructor = FailureOnlyReporter; - -FailureOnlyReporter.prototype.display = function(prefix, result) { - this._reportCount++; - - if (!result.passed) { - TapReporter.prototype.display.apply(this, arguments); - } - - if (this._reportCount > 100) { - this.out.write('pass count: ' + this.pass); - this._reportCount = 0; - } -}; +var FailureOnlyReporter = require('./lib/failure-only-testem-reporter'); module.exports = { framework: 'qunit', @@ -27,13 +6,7 @@ module.exports = { timeout: 540, parallel: 1, disable_watching: true, - launch_in_dev: [ - 'Firefox', - 'Chrome' - ], - launch_in_ci: [ - 'Firefox', - 'Chrome' - ], - reporter: new FailureOnlyReporter() + launch_in_dev: ['Firefox'], + launch_in_ci: ['Firefox'], + reporter: FailureOnlyReporter, }; diff --git a/yarn.lock b/yarn.lock index 575309ead8e..883ebf050cc 100644 --- a/yarn.lock +++ b/yarn.lock @@ -108,20 +108,15 @@ acorn@^5.0.1: version "5.1.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.1.1.tgz#53fe161111f912ab999ee887a90a0bc52822fd75" -adm-zip@~0.4.3: - version "0.4.7" - resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.4.7.tgz#8606c2cbf1c426ce8c8ec00174447fd49b6eafc1" - after@0.8.1: version "0.8.1" resolved "https://registry.yarnpkg.com/after/-/after-0.8.1.tgz#ab5d4fb883f596816d3515f8f791c0af486dd627" -agent-base@2: - version "2.1.1" - resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-2.1.1.tgz#d6de10d5af6132d5bd692427d46fc538539094c7" +agent-base@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-4.2.1.tgz#d89e5999f797875674c07d87f260fc41e83e8ca9" dependencies: - extend "~3.0.0" - semver "~5.0.1" + es6-promisify "^5.0.0" ajv-keywords@^1.0.0: version "1.5.1" @@ -154,6 +149,12 @@ amd-name-resolver@0.0.6: dependencies: ensure-posix-path "^1.0.1" +amd-name-resolver@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/amd-name-resolver/-/amd-name-resolver-1.2.0.tgz#fc41b3848824b557313897d71f8d5a0184fbe679" + dependencies: + ensure-posix-path "^1.0.1" + amdefine@>=0.0.4: version "1.0.1" resolved "https://registry.yarnpkg.com/amdefine/-/amdefine-1.0.1.tgz#4a5282ac164729e93619bcfd3ad151f817ce91f5" @@ -221,31 +222,6 @@ aproba@^1.0.3, aproba@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.0.4.tgz#2713680775e7614c8ba186c065d4e2e52d1072c0" -archiver-utils@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/archiver-utils/-/archiver-utils-1.3.0.tgz#e50b4c09c70bf3d680e32ff1b7994e9f9d895174" - dependencies: - glob "^7.0.0" - graceful-fs "^4.1.0" - lazystream "^1.0.0" - lodash "^4.8.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - -archiver@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/archiver/-/archiver-1.3.0.tgz#4f2194d6d8f99df3f531e6881f14f15d55faaf22" - dependencies: - archiver-utils "^1.3.0" - async "^2.0.0" - buffer-crc32 "^0.2.1" - glob "^7.0.0" - lodash "^4.8.0" - readable-stream "^2.0.0" - tar-stream "^1.5.0" - walkdir "^0.0.11" - zip-stream "^1.1.0" - archy@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/archy/-/archy-1.0.0.tgz#f9c8c13757cc1dd7bc379ac77b2c62a5c2868c40" @@ -356,10 +332,6 @@ ast-types@0.8.12: version "0.8.12" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.8.12.tgz#a0d90e4351bb887716c83fd637ebf818af4adfcc" -ast-types@0.9.11: - version "0.9.11" - resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.11.tgz#371177bb59232ff5ceaa1d09ee5cad705b1a5aa9" - ast-types@0.9.6: version "0.9.6" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.9.6.tgz#102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9" @@ -376,23 +348,21 @@ async-disk-cache@^1.2.1: rsvp "^3.0.18" username-sync "1.0.1" +async-limiter@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.0.tgz#78faed8c3d074ab81f22b4e985d79e8738f720f8" + async-promise-queue@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/async-promise-queue/-/async-promise-queue-1.0.3.tgz#70c9c37635620f894978814b6c65e6e14e2573ee" dependencies: async "^2.4.1" -async@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/async/-/async-2.0.1.tgz#b709cc0280a9c36f09f4536be823c838a9049e25" - dependencies: - lodash "^4.8.0" - async@^1.4.0, async@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" -async@^2.0.0, async@^2.0.1, async@^2.1.2, async@^2.4.1: +async@^2.0.1, async@^2.4.1: version "2.5.0" resolved "https://registry.yarnpkg.com/async/-/async-2.5.0.tgz#843190fd6b7357a0b9e1c956edddd5ec8462b54d" dependencies: @@ -445,6 +415,14 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.0" +babel-code-frame@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + babel-core@^5.0.0: version "5.8.38" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-5.8.38.tgz#1fcaee79d7e61b750b00b8e54f6dfc9d0af86558" @@ -520,6 +498,30 @@ babel-core@^6.14.0, babel-core@^6.24.1: slash "^1.0.0" source-map "^0.5.0" +babel-core@^6.26.0: + version "6.26.3" + resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.26.3.tgz#b2e2f09e342d0f0c88e2f02e067794125e75c207" + dependencies: + babel-code-frame "^6.26.0" + babel-generator "^6.26.0" + babel-helpers "^6.24.1" + babel-messages "^6.23.0" + babel-register "^6.26.0" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + convert-source-map "^1.5.1" + debug "^2.6.9" + json5 "^0.5.1" + lodash "^4.17.4" + minimatch "^3.0.4" + path-is-absolute "^1.0.1" + private "^0.1.8" + slash "^1.0.0" + source-map "^0.5.7" + babel-generator@^6.25.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.25.0.tgz#33a1af70d5f2890aeb465a4a7793c1df6a9ea9fc" @@ -533,6 +535,27 @@ babel-generator@^6.25.0: source-map "^0.5.0" trim-right "^1.0.1" +babel-generator@^6.26.0: + version "6.26.1" + resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.26.1.tgz#1844408d3b8f0d35a404ea7ac180f087a601bd90" + dependencies: + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + detect-indent "^4.0.0" + jsesc "^1.3.0" + lodash "^4.17.4" + source-map "^0.5.7" + trim-right "^1.0.1" + +babel-helper-builder-binary-assignment-operator-visitor@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz#cce4517ada356f4220bcae8a02c2b346f9a56664" + dependencies: + babel-helper-explode-assignable-expression "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-helper-call-delegate@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz#ece6aacddc76e41c3461f88bfc575bd0daa2df8d" @@ -551,6 +574,14 @@ babel-helper-define-map@^6.24.1: babel-types "^6.24.1" lodash "^4.2.0" +babel-helper-explode-assignable-expression@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz#f25b82cf7dc10433c55f70592d5746400ac22caa" + dependencies: + babel-runtime "^6.22.0" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helper-function-name@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz#d3475b8c03ed98242a25b48351ab18399d3580a9" @@ -586,6 +617,24 @@ babel-helper-optimise-call-expression@^6.24.1: babel-runtime "^6.22.0" babel-types "^6.24.1" +babel-helper-regex@^6.24.1: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz#325c59f902f82f24b74faceed0363954f6495e72" + dependencies: + babel-runtime "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + +babel-helper-remap-async-to-generator@^6.24.1: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz#5ec581827ad723fecdd381f1c928390676e4551b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + babel-traverse "^6.24.1" + babel-types "^6.24.1" + babel-helper-remove-or-void@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.1.1.tgz#9d7e1856dc6fafcb41b283a416730dc1844f66d7" @@ -628,12 +677,18 @@ babel-plugin-dead-code-elimination@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/babel-plugin-dead-code-elimination/-/babel-plugin-dead-code-elimination-1.0.2.tgz#5f7c451274dcd7cccdbfbb3e0b85dd28121f0f65" -babel-plugin-debug-macros@^0.1.10: +babel-plugin-debug-macros@^0.1.10, babel-plugin-debug-macros@^0.1.11: version "0.1.11" resolved "https://registry.yarnpkg.com/babel-plugin-debug-macros/-/babel-plugin-debug-macros-0.1.11.tgz#6c562bf561fccd406ce14ab04f42c218cf956605" dependencies: semver "^5.3.0" +babel-plugin-ember-modules-api-polyfill@^2.3.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-2.3.2.tgz#56ea34bea963498d070a2b7dc2ce18a92c434093" + dependencies: + ember-rfc176-data "^0.3.0" + babel-plugin-eval@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/babel-plugin-eval/-/babel-plugin-eval-1.0.1.tgz#a2faed25ce6be69ade4bfec263f70169195950da" @@ -696,12 +751,48 @@ babel-plugin-runtime@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/babel-plugin-runtime/-/babel-plugin-runtime-1.0.7.tgz#bf7c7d966dd56ecd5c17fa1cb253c9acb7e54aaf" +babel-plugin-syntax-async-functions@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" + +babel-plugin-syntax-exponentiation-operator@^6.8.0: + version "6.13.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de" + +babel-plugin-syntax-trailing-function-commas@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3" + +babel-plugin-transform-async-to-generator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz#6536e378aff6cb1d5517ac0e40eb3e9fc8d08761" + dependencies: + babel-helper-remap-async-to-generator "^6.24.1" + babel-plugin-syntax-async-functions "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-es2015-arrow-functions@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221" dependencies: babel-runtime "^6.22.0" +babel-plugin-transform-es2015-block-scoped-functions@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz#bbc51b49f964d70cb8d8e0b94e820246ce3a6141" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-block-scoping@^6.23.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz#d70f5299c1308d05c12f463813b0a09e73b1895f" + dependencies: + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + lodash "^4.17.4" + babel-plugin-transform-es2015-block-scoping@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.24.1.tgz#76c295dc3a4741b1665adfd3167215dcff32a576" @@ -712,7 +803,7 @@ babel-plugin-transform-es2015-block-scoping@^6.24.1: babel-types "^6.24.1" lodash "^4.2.0" -babel-plugin-transform-es2015-classes@^6.24.1: +babel-plugin-transform-es2015-classes@^6.23.0, babel-plugin-transform-es2015-classes@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz#5a4c58a50c9c9461e564b4b2a3bfabc97a2584db" dependencies: @@ -726,7 +817,7 @@ babel-plugin-transform-es2015-classes@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-computed-properties@^6.24.1: +babel-plugin-transform-es2015-computed-properties@^6.22.0, babel-plugin-transform-es2015-computed-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz#6fe2a8d16895d5634f4cd999b6d3480a308159b3" dependencies: @@ -739,7 +830,34 @@ babel-plugin-transform-es2015-destructuring@^6.23.0: dependencies: babel-runtime "^6.22.0" -babel-plugin-transform-es2015-modules-amd@^6.24.1: +babel-plugin-transform-es2015-duplicate-keys@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz#73eb3d310ca969e3ef9ec91c53741a6f1576423e" + dependencies: + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-for-of@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz#f47c95b2b613df1d3ecc2fdb7573623c75248691" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-function-name@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz#834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b" + dependencies: + babel-helper-function-name "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + +babel-plugin-transform-es2015-literals@^6.22.0: + version "6.22.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz#4f54a02d6cd66cf915280019a31d31925377ca2e" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.0, babel-plugin-transform-es2015-modules-amd@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz#3b3e54017239842d6d19c3011c4bd2f00a00d154" dependencies: @@ -747,6 +865,15 @@ babel-plugin-transform-es2015-modules-amd@^6.24.1: babel-runtime "^6.22.0" babel-template "^6.24.1" +babel-plugin-transform-es2015-modules-commonjs@^6.23.0: + version "6.26.2" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz#58a793863a9e7ca870bdc5a881117ffac27db6f3" + dependencies: + babel-plugin-transform-strict-mode "^6.24.1" + babel-runtime "^6.26.0" + babel-template "^6.26.0" + babel-types "^6.26.0" + babel-plugin-transform-es2015-modules-commonjs@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.24.1.tgz#d3e310b40ef664a36622200097c6d440298f2bfe" @@ -756,7 +883,30 @@ babel-plugin-transform-es2015-modules-commonjs@^6.24.1: babel-template "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-parameters@^6.24.1: +babel-plugin-transform-es2015-modules-systemjs@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz#ff89a142b9119a906195f5f106ecf305d9407d23" + dependencies: + babel-helper-hoist-variables "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-modules-umd@^6.23.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz#ac997e6285cd18ed6176adb607d602344ad38468" + dependencies: + babel-plugin-transform-es2015-modules-amd "^6.24.1" + babel-runtime "^6.22.0" + babel-template "^6.24.1" + +babel-plugin-transform-es2015-object-super@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz#24cef69ae21cb83a7f8603dad021f572eb278f8d" + dependencies: + babel-helper-replace-supers "^6.24.1" + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-parameters@^6.23.0, babel-plugin-transform-es2015-parameters@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz#57ac351ab49caf14a97cd13b09f66fdf0a625f2b" dependencies: @@ -767,7 +917,7 @@ babel-plugin-transform-es2015-parameters@^6.24.1: babel-traverse "^6.24.1" babel-types "^6.24.1" -babel-plugin-transform-es2015-shorthand-properties@^6.24.1: +babel-plugin-transform-es2015-shorthand-properties@^6.22.0, babel-plugin-transform-es2015-shorthand-properties@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz#24f875d6721c87661bbd99a4622e51f14de38aa0" dependencies: @@ -780,12 +930,42 @@ babel-plugin-transform-es2015-spread@^6.22.0: dependencies: babel-runtime "^6.22.0" +babel-plugin-transform-es2015-sticky-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz#00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + babel-types "^6.24.1" + babel-plugin-transform-es2015-template-literals@^6.22.0: version "6.22.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz#a84b3450f7e9f8f1f6839d6d687da84bb1236d8d" dependencies: babel-runtime "^6.22.0" +babel-plugin-transform-es2015-typeof-symbol@^6.23.0: + version "6.23.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz#dec09f1cddff94b52ac73d505c84df59dcceb372" + dependencies: + babel-runtime "^6.22.0" + +babel-plugin-transform-es2015-unicode-regex@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz#d38b12f42ea7323f729387f18a7c5ae1faeb35e9" + dependencies: + babel-helper-regex "^6.24.1" + babel-runtime "^6.22.0" + regexpu-core "^2.0.0" + +babel-plugin-transform-exponentiation-operator@^6.22.0: + version "6.24.1" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz#2ab0c9c7f3098fa48907772bb813fe41e8de3a0e" + dependencies: + babel-helper-builder-binary-assignment-operator-visitor "^6.24.1" + babel-plugin-syntax-exponentiation-operator "^6.8.0" + babel-runtime "^6.22.0" + babel-plugin-transform-proto-to-assign@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-proto-to-assign/-/babel-plugin-transform-proto-to-assign-6.23.0.tgz#1c24951598793fc6a1d18118a11de1c36376fe2e" @@ -793,6 +973,12 @@ babel-plugin-transform-proto-to-assign@^6.23.0: babel-runtime "^6.22.0" lodash "^4.2.0" +babel-plugin-transform-regenerator@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz#e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f" + dependencies: + regenerator-transform "^0.10.0" + babel-plugin-transform-strict-mode@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz#d5faf7aa578a65bbe591cf5edae04a0c67020758" @@ -810,6 +996,49 @@ babel-plugin-undefined-to-void@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/babel-plugin-undefined-to-void/-/babel-plugin-undefined-to-void-1.1.6.tgz#7f578ef8b78dfae6003385d8417a61eda06e2f81" +babel-polyfill@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153" + dependencies: + babel-runtime "^6.26.0" + core-js "^2.5.0" + regenerator-runtime "^0.10.5" + +babel-preset-env@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.7.0.tgz#dea79fa4ebeb883cd35dab07e260c1c9c04df77a" + dependencies: + babel-plugin-check-es2015-constants "^6.22.0" + babel-plugin-syntax-trailing-function-commas "^6.22.0" + babel-plugin-transform-async-to-generator "^6.22.0" + babel-plugin-transform-es2015-arrow-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoped-functions "^6.22.0" + babel-plugin-transform-es2015-block-scoping "^6.23.0" + babel-plugin-transform-es2015-classes "^6.23.0" + babel-plugin-transform-es2015-computed-properties "^6.22.0" + babel-plugin-transform-es2015-destructuring "^6.23.0" + babel-plugin-transform-es2015-duplicate-keys "^6.22.0" + babel-plugin-transform-es2015-for-of "^6.23.0" + babel-plugin-transform-es2015-function-name "^6.22.0" + babel-plugin-transform-es2015-literals "^6.22.0" + babel-plugin-transform-es2015-modules-amd "^6.22.0" + babel-plugin-transform-es2015-modules-commonjs "^6.23.0" + babel-plugin-transform-es2015-modules-systemjs "^6.23.0" + babel-plugin-transform-es2015-modules-umd "^6.23.0" + babel-plugin-transform-es2015-object-super "^6.22.0" + babel-plugin-transform-es2015-parameters "^6.23.0" + babel-plugin-transform-es2015-shorthand-properties "^6.22.0" + babel-plugin-transform-es2015-spread "^6.22.0" + babel-plugin-transform-es2015-sticky-regex "^6.22.0" + babel-plugin-transform-es2015-template-literals "^6.22.0" + babel-plugin-transform-es2015-typeof-symbol "^6.23.0" + babel-plugin-transform-es2015-unicode-regex "^6.22.0" + babel-plugin-transform-exponentiation-operator "^6.22.0" + babel-plugin-transform-regenerator "^6.22.0" + browserslist "^3.2.6" + invariant "^2.2.2" + semver "^5.3.0" + babel-register@^6.24.1: version "6.24.1" resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.1.tgz#7e10e13a2f71065bdfad5a1787ba45bca6ded75f" @@ -822,6 +1051,18 @@ babel-register@^6.24.1: mkdirp "^0.5.1" source-map-support "^0.4.2" +babel-register@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.26.0.tgz#6ed021173e2fcb486d7acb45c6009a856f647071" + dependencies: + babel-core "^6.26.0" + babel-runtime "^6.26.0" + core-js "^2.5.0" + home-or-tmp "^2.0.0" + lodash "^4.17.4" + mkdirp "^0.5.1" + source-map-support "^0.4.15" + babel-runtime@^6.18.0, babel-runtime@^6.22.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.23.0.tgz#0a9489f144de70efb3ce4300accdb329e2fc543b" @@ -829,6 +1070,13 @@ babel-runtime@^6.18.0, babel-runtime@^6.22.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" +babel-runtime@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" + dependencies: + core-js "^2.4.0" + regenerator-runtime "^0.11.0" + babel-template@^6.24.1, babel-template@^6.25.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.25.0.tgz#665241166b7c2aa4c619d71e192969552b10c071" @@ -839,6 +1087,16 @@ babel-template@^6.24.1, babel-template@^6.25.0: babylon "^6.17.2" lodash "^4.2.0" +babel-template@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.26.0.tgz#de03e2d16396b069f46dd9fff8521fb1a0e35e02" + dependencies: + babel-runtime "^6.26.0" + babel-traverse "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + lodash "^4.17.4" + babel-traverse@^6.24.1, babel-traverse@^6.25.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.25.0.tgz#2257497e2fcd19b89edc13c4c91381f9512496f1" @@ -853,6 +1111,29 @@ babel-traverse@^6.24.1, babel-traverse@^6.25.0: invariant "^2.2.0" lodash "^4.2.0" +babel-traverse@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.26.0.tgz#46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee" + dependencies: + babel-code-frame "^6.26.0" + babel-messages "^6.23.0" + babel-runtime "^6.26.0" + babel-types "^6.26.0" + babylon "^6.18.0" + debug "^2.6.8" + globals "^9.18.0" + invariant "^2.2.2" + lodash "^4.17.4" + +babel-types@^6.19.0, babel-types@^6.26.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.26.0.tgz#a3b073f94ab49eb6fa55cd65227a334380632497" + dependencies: + babel-runtime "^6.26.0" + esutils "^2.0.2" + lodash "^4.17.4" + to-fast-properties "^1.0.3" + babel-types@^6.24.1, babel-types@^6.25.0: version "6.25.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.25.0.tgz#70afb248d5660e5d18f811d91c8303b54134a18e" @@ -870,6 +1151,10 @@ babylon@^6.17.2: version "6.17.4" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.4.tgz#3e8b7402b88d22c3423e137a1577883b15ff869a" +babylon@^6.18.0: + version "6.18.0" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" + backbone@^1.1.2: version "1.3.3" resolved "https://registry.yarnpkg.com/backbone/-/backbone-1.3.3.tgz#4cc80ea7cb1631ac474889ce40f2f8bc683b2999" @@ -920,7 +1205,7 @@ better-assert@~1.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/binaryextensions/-/binaryextensions-2.0.0.tgz#e597d1a7a6a3558a2d1c7241a16c99965e6aa40f" -bl@^1.0.0, bl@~1.1.2: +bl@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/bl/-/bl-1.1.2.tgz#fdca871a99713aa00d19e3bbba41c44787a65398" dependencies: @@ -1036,6 +1321,21 @@ broccoli-babel-transpiler@^6.1.1: rsvp "^3.5.0" workerpool "^2.2.1" +broccoli-babel-transpiler@^6.4.2: + version "6.4.3" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-6.4.3.tgz#06e399298d41700cdc10d675b1d808a89ef6b2d0" + dependencies: + babel-core "^6.26.0" + broccoli-funnel "^2.0.1" + broccoli-merge-trees "^2.0.0" + broccoli-persistent-filter "^1.4.3" + clone "^2.0.0" + hash-for-dep "^1.2.3" + heimdalljs-logger "^0.1.7" + json-stable-stringify "^1.0.0" + rsvp "^4.8.2" + workerpool "^2.3.0" + broccoli-brocfile-loader@^0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/broccoli-brocfile-loader/-/broccoli-brocfile-loader-0.18.0.tgz#2e86021c805c34ffc8d29a2fb721cf273e819e4b" @@ -1130,6 +1430,17 @@ broccoli-debug@^0.6.1: symlink-or-copy "^1.1.8" tree-sync "^1.2.2" +broccoli-debug@^0.6.4: + version "0.6.4" + resolved "https://registry.yarnpkg.com/broccoli-debug/-/broccoli-debug-0.6.4.tgz#986eb3d2005e00e3bb91f9d0a10ab137210cd150" + dependencies: + broccoli-plugin "^1.2.1" + fs-tree-diff "^0.5.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + symlink-or-copy "^1.1.8" + tree-sync "^1.2.2" + broccoli-file-creator@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/broccoli-file-creator/-/broccoli-file-creator-1.1.1.tgz#1b35b67d215abdfadd8d49eeb69493c39e6c3450" @@ -1177,6 +1488,24 @@ broccoli-funnel@^1.0.0, broccoli-funnel@^1.0.1, broccoli-funnel@^1.0.6, broccoli symlink-or-copy "^1.0.0" walk-sync "^0.3.1" +broccoli-funnel@^2.0.0, broccoli-funnel@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/broccoli-funnel/-/broccoli-funnel-2.0.1.tgz#6823c73b675ef78fffa7ab800f083e768b51d449" + dependencies: + array-equal "^1.0.0" + blank-object "^1.0.1" + broccoli-plugin "^1.3.0" + debug "^2.2.0" + fast-ordered-set "^1.0.0" + fs-tree-diff "^0.5.3" + heimdalljs "^0.2.0" + minimatch "^3.0.0" + mkdirp "^0.5.0" + path-posix "^1.0.0" + rimraf "^2.4.3" + symlink-or-copy "^1.0.0" + walk-sync "^0.3.1" + broccoli-kitchen-sink-helpers@^0.2.5, broccoli-kitchen-sink-helpers@^0.2.6, broccoli-kitchen-sink-helpers@~0.2.0: version "0.2.9" resolved "https://registry.yarnpkg.com/broccoli-kitchen-sink-helpers/-/broccoli-kitchen-sink-helpers-0.2.9.tgz#a5e0986ed8d76fb5984b68c3f0450d3a96e36ecc" @@ -1249,6 +1578,24 @@ broccoli-persistent-filter@^1.1.5, broccoli-persistent-filter@^1.1.6, broccoli-p symlink-or-copy "^1.0.1" walk-sync "^0.3.1" +broccoli-persistent-filter@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/broccoli-persistent-filter/-/broccoli-persistent-filter-1.4.3.tgz#3511bc52fc53740cda51621f58a28152d9911bc1" + dependencies: + async-disk-cache "^1.2.1" + async-promise-queue "^1.0.3" + broccoli-plugin "^1.0.0" + fs-tree-diff "^0.5.2" + hash-for-dep "^1.0.2" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.7" + mkdirp "^0.5.1" + promise-map-series "^0.2.1" + rimraf "^2.6.1" + rsvp "^3.0.18" + symlink-or-copy "^1.0.1" + walk-sync "^0.3.1" + broccoli-plugin@1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-1.1.0.tgz#73e2cfa05f8ea1e3fc1420c40c3d9e7dc724bf02" @@ -1347,15 +1694,37 @@ broccoli-writer@^0.1.1, broccoli-writer@~0.1.1: quick-temp "^0.1.0" rsvp "^3.0.6" +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +browserstack-local@^1.3.0: + version "1.3.3" + resolved "https://registry.yarnpkg.com/browserstack-local/-/browserstack-local-1.3.3.tgz#7500d630f24651e89a8fe9b3f5c166d3b67259af" + dependencies: + https-proxy-agent "^2.2.1" + is-running "^2.0.0" + sinon "^1.17.6" + temp-fs "^0.9.9" + +browserstack@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/browserstack/-/browserstack-1.5.1.tgz#e2dfa66ffee940ebad0a07f7e00fd4687c455d66" + dependencies: + https-proxy-agent "^2.2.1" + bser@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" dependencies: node-int64 "^0.4.0" -buffer-crc32@^0.2.1: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" +buffer-from@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.0.tgz#87fcaa3a298358e0ade6e442cfce840740d1ad04" buffer-shims@^1.0.0: version "1.0.0" @@ -1407,12 +1776,20 @@ camelcase@^1.0.2, camelcase@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-1.2.1.tgz#9bb5304d2e0b56698b2c758b08a3eaa9daa58a39" +camelcase@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" + can-symlink@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/can-symlink/-/can-symlink-1.0.0.tgz#97b607d8a84bb6c6e228b902d864ecb594b9d219" dependencies: tmp "0.0.28" +caniuse-lite@^1.0.30000844: + version "1.0.30000865" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000865.tgz#70026616e8afe6e1442f8bb4e1092987d81a2f25" + capture-exit@^1.0.4: version "1.2.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-1.2.0.tgz#1c5fcc489fd0ab00d4f1ac7ae1072e3173fbab6f" @@ -1577,6 +1954,14 @@ cliui@^2.1.0: right-align "^0.1.1" wordwrap "0.0.2" +cliui@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.1.0.tgz#348422dbe82d800b3022eef4f6ac10bf2e4d1b49" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + clone@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" @@ -1713,15 +2098,6 @@ component-inherit@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/component-inherit/-/component-inherit-0.0.3.tgz#645fc4adf58b72b649d5cae65135619db26ff143" -compress-commons@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/compress-commons/-/compress-commons-1.2.0.tgz#58587092ef20d37cb58baf000112c9278ff73b9f" - dependencies: - buffer-crc32 "^0.2.1" - crc32-stream "^2.0.0" - normalize-path "^2.0.0" - readable-stream "^2.0.0" - compressible@~2.0.10: version "2.0.10" resolved "https://registry.yarnpkg.com/compressible/-/compressible-2.0.10.tgz#feda1c7f7617912732b29bf8cf26252a20b9eecd" @@ -1744,6 +2120,15 @@ concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" +concat-stream@1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + concat-stream@^1.4.7, concat-stream@^1.5.2: version "1.6.0" resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.0.tgz#0aac662fd52be78964d5532f694784e70110acf7" @@ -1799,6 +2184,10 @@ convert-source-map@^1.1.0: version "1.5.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" +convert-source-map@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" + cookie-signature@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz#e303a882b342cc3ee8ca513a79999734dab3ae2c" @@ -1811,10 +2200,14 @@ core-js@^1.0.0: version "1.2.7" resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" -core-js@^2.4.0, core-js@^2.4.1: +core-js@^2.4.0: version "2.4.1" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.4.1.tgz#4de911e667b0eae9124e34254b53aea6fc618d3e" +core-js@^2.5.0: + version "2.5.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.7.tgz#f972608ff0cead68b841a16a932d0b183791814e" + core-object@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/core-object/-/core-object-1.1.0.tgz#86d63918733cf9da1a5aae729e62c0a88e66ad0a" @@ -1829,18 +2222,7 @@ core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" -crc32-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/crc32-stream/-/crc32-stream-2.0.0.tgz#e3cdd3b4df3168dd74e3de3fbbcb7b297fe908f4" - dependencies: - crc "^3.4.4" - readable-stream "^2.0.0" - -crc@^3.4.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/crc/-/crc-3.4.4.tgz#9da1e980e3bd44fc5c93bf5ab3da3378d85e466b" - -cross-spawn@^5.0.0: +cross-spawn@^5.0.0, cross-spawn@^5.0.1, cross-spawn@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" dependencies: @@ -1888,12 +2270,6 @@ dashdash@^1.12.0: dependencies: assert-plus "^1.0.0" -debug@2, debug@2.6.8, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.4.0, debug@~2.6.7: - version "2.6.8" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" - dependencies: - ms "2.0.0" - debug@2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/debug/-/debug-2.2.0.tgz#f87057e995b1a1f6ae6a4960664137bc56f039da" @@ -1912,11 +2288,29 @@ debug@2.6.7: dependencies: ms "2.0.0" +debug@2.6.8, debug@^2.1.0, debug@^2.1.1, debug@^2.1.3, debug@^2.2.0, debug@^2.4.0, debug@~2.6.7: + version "2.6.8" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc" + dependencies: + ms "2.0.0" + +debug@2.6.9, debug@^2.6.8, debug@^2.6.9: + version "2.6.9" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" + dependencies: + ms "2.0.0" + +debug@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.1.0.tgz#5bb5a0672628b64149566ba16819e61518c67261" + dependencies: + ms "2.0.0" + debuglog@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492" -decamelize@^1.0.0: +decamelize@^1.0.0, decamelize@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" @@ -2064,6 +2458,10 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" +electron-to-chromium@^1.3.47: + version "1.3.52" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.52.tgz#d2d9f1270ba4a3b967b831c40ef71fb4d9ab5ce0" + ember-cli-babel@^5.0.0: version "5.2.4" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-5.2.4.tgz#5ce4f46b08ed6f6d21e878619fb689719d6e8e13" @@ -2074,6 +2472,24 @@ ember-cli-babel@^5.0.0: ember-cli-version-checker "^1.0.2" resolve "^1.1.2" +ember-cli-babel@^6.6.0: + version "6.14.1" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.14.1.tgz#796339229035910b625593caffbc2683792ada68" + dependencies: + amd-name-resolver "1.2.0" + babel-plugin-debug-macros "^0.1.11" + babel-plugin-ember-modules-api-polyfill "^2.3.0" + babel-plugin-transform-es2015-modules-amd "^6.24.0" + babel-polyfill "^6.26.0" + babel-preset-env "^1.7.0" + broccoli-babel-transpiler "^6.4.2" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.0" + broccoli-source "^1.1.0" + clone "^2.0.0" + ember-cli-version-checker "^2.1.2" + semver "^5.5.0" + ember-cli-blueprint-test-helpers@^0.12.0: version "0.12.1" resolved "https://registry.yarnpkg.com/ember-cli-blueprint-test-helpers/-/ember-cli-blueprint-test-helpers-0.12.1.tgz#c109c684fefc44eb9c2b84b71e3bbb0dd5432a85" @@ -2101,6 +2517,16 @@ ember-cli-broccoli-sane-watcher@^2.0.3: rsvp "^3.0.18" sane "^1.1.1" +ember-cli-browserstack@^0.0.4: + version "0.0.4" + resolved "https://registry.yarnpkg.com/ember-cli-browserstack/-/ember-cli-browserstack-0.0.4.tgz#a92c65a5a514f9cf138061a9f4a37cc1ffb8c6ab" + dependencies: + browserstack "^1.5.0" + browserstack-local "^1.3.0" + ember-cli-babel "^6.6.0" + rsvp "^4.7.0" + yargs "^10.0.3" + ember-cli-dependency-checker@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-1.4.0.tgz#2b13f977e1eea843fc1a21a001be6ca5d4ef1942" @@ -2188,14 +2614,6 @@ ember-cli-preprocess-registry@^3.0.0: process-relative-require "^1.0.0" silent-error "^1.0.0" -ember-cli-sauce@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/ember-cli-sauce/-/ember-cli-sauce-2.1.0.tgz#ecafc2bc7c2cd63fd7b98fb2296fa96809907b79" - dependencies: - recast "^0.12.0" - rsvp "^3.6.1" - saucie "^3.2.0" - ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" @@ -2218,6 +2636,13 @@ ember-cli-version-checker@^1.0.2, ember-cli-version-checker@^1.1.6, ember-cli-ve dependencies: semver "^5.3.0" +ember-cli-version-checker@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-2.1.2.tgz#305ce102390c66e4e0f1432dea9dc5c7c19fed98" + dependencies: + resolve "^1.3.3" + semver "^5.3.0" + ember-cli-yuidoc@^0.8.8: version "0.8.8" resolved "https://registry.yarnpkg.com/ember-cli-yuidoc/-/ember-cli-yuidoc-0.8.8.tgz#3858baaf85388a976024f9de40f1075fea58f606" @@ -2325,6 +2750,10 @@ ember-publisher@0.0.7: dependencies: aws-sdk "^2.0.9" +ember-rfc176-data@^0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.3.tgz#27fba08d540a7463a4366c48eaa19c5a44971a39" + ember-router-generator@^1.0.0, ember-router-generator@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-1.2.3.tgz#8ed2ca86ff323363120fc14278191e9e8f1315ee" @@ -2368,12 +2797,6 @@ encoding@^0.1.11: dependencies: iconv-lite "~0.4.13" -end-of-stream@^1.0.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.0.tgz#7a90d833efda6cfa6eac0f4949dbb0fad3a63206" - dependencies: - once "^1.4.0" - engine.io-client@1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-1.8.0.tgz#7b730e4127414087596d9be3c88d2bc5fdb6cf5c" @@ -2454,6 +2877,16 @@ es6-map@^0.1.3, es6-map@^0.1.4: es6-symbol "~3.1.1" event-emitter "~0.3.5" +es6-promise@^4.0.3: + version "4.2.4" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.4.tgz#dc4221c2b16518760bd8c39a52d8f356fc00ed29" + +es6-promisify@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/es6-promisify/-/es6-promisify-5.0.0.tgz#5109d62f3e56ea967c4b63505aef08291c8a5203" + dependencies: + es6-promise "^4.0.3" + es6-set@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/es6-set/-/es6-set-0.1.5.tgz#d2b3ec5d4d800ced818db538d28974db0a73ccb1" @@ -2567,7 +3000,7 @@ esprima@^2.6.0: version "2.7.3" resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" -esprima@^4.0.0, esprima@~4.0.0: +esprima@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" @@ -2625,6 +3058,18 @@ exec-sh@^0.2.0: dependencies: merge "^1.1.3" +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exists-sync@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.3.tgz#b910000bedbb113b378b82f5f5a7638107622dcf" @@ -2692,7 +3137,7 @@ express@^4.10.7, express@^4.12.3, express@^4.13.1, express@^4.15.2: utils-merge "1.0.0" vary "~1.1.1" -extend@3, extend@^3.0.0, extend@~3.0.0: +extend@^3.0.0, extend@~3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -2710,6 +3155,15 @@ extglob@^0.3.1: dependencies: is-extglob "^1.0.0" +extract-zip@^1.6.5: + version "1.6.7" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-1.6.7.tgz#a840b4b8af6403264c8db57f4f1a74333ef81fe9" + dependencies: + concat-stream "1.6.2" + debug "2.6.9" + mkdirp "0.5.1" + yauzl "2.4.1" + extsprintf@1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" @@ -2749,6 +3203,12 @@ fb-watchman@^2.0.0: dependencies: bser "^2.0.0" +fd-slicer@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" + dependencies: + pend "~1.2.0" + figures@^1.3.5: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -2804,6 +3264,12 @@ find-up@^1.1.2: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + findup-sync@^0.4.2: version "0.4.3" resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.4.3.tgz#40043929e7bc60adf0b7f4827c4c6e75a0deca12" @@ -2881,6 +3347,12 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +formatio@1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.1.1.tgz#5ed3ccd636551097383465d996199100e86161e9" + dependencies: + samsam "~1.1" + forwarded@~0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.0.tgz#19ef9874c4ae1c297bcf078fde63a09b66a84363" @@ -3050,7 +3522,7 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" -get-caller-file@^1.0.0: +get-caller-file@^1.0.0, get-caller-file@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-1.0.2.tgz#f702e63127e7e231c160a80c1554acb70d5047e5" @@ -3058,6 +3530,10 @@ get-stdin@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + getpass@^0.1.1: version "0.1.7" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" @@ -3169,7 +3645,7 @@ globals@^6.4.0: version "6.4.1" resolved "https://registry.yarnpkg.com/globals/-/globals-6.4.1.tgz#8498032b3b6d1cc81eebc5f79690d8fe29fabf4f" -globals@^9.0.0, globals@^9.14.0: +globals@^9.0.0, globals@^9.14.0, globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3184,7 +3660,7 @@ globby@^5.0.0: pify "^2.0.0" pinkie-promise "^2.0.0" -graceful-fs@^4.1.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.6: +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@~4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" @@ -3286,6 +3762,15 @@ hash-for-dep@^1.0.2: heimdalljs-logger "^0.1.7" resolve "^1.1.6" +hash-for-dep@^1.2.3: + version "1.2.3" + resolved "https://registry.yarnpkg.com/hash-for-dep/-/hash-for-dep-1.2.3.tgz#5ec69fca32c23523972d52acb5bb65ffc3664cab" + dependencies: + broccoli-kitchen-sink-helpers "^0.3.1" + heimdalljs "^0.2.3" + heimdalljs-logger "^0.1.7" + resolve "^1.4.0" + hawk@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/hawk/-/hawk-1.1.1.tgz#87cd491f9b46e4e2aeaca335416766885d2d1ed9" @@ -3399,13 +3884,12 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" -https-proxy-agent@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-1.0.0.tgz#35f7da6c48ce4ddbfa264891ac593ee5ff8671e6" +https-proxy-agent@^2.1.0, https-proxy-agent@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz#51552970fa04d723e04c56d04178c3f92592bbc0" dependencies: - agent-base "2" - debug "2" - extend "3" + agent-base "^4.1.0" + debug "^3.1.0" iconv-lite@^0.4.13, iconv-lite@^0.4.5, iconv-lite@~0.4.13: version "0.4.18" @@ -3520,6 +4004,12 @@ invariant@^2.2.0: dependencies: loose-envify "^1.0.0" +invariant@^2.2.2: + version "2.2.4" + resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6" + dependencies: + loose-envify "^1.0.0" + invert-kv@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" @@ -3651,7 +4141,11 @@ is-resolvable@^1.0.0: dependencies: tryit "^1.0.1" -is-stream@^1.0.1: +is-running@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-running/-/is-running-2.1.0.tgz#30a73ff5cc3854e4fc25490809e9f5abf8de09e0" + +is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" @@ -3726,7 +4220,7 @@ js-tokens@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-1.0.1.tgz#cc435a5c8b94ad15acb7983140fc80182c89aeae" -js-tokens@^3.0.0: +js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" @@ -3788,7 +4282,7 @@ json5@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/json5/-/json5-0.4.0.tgz#054352e4c4c80c86c0923877d449de176a732c8d" -json5@^0.5.0: +json5@^0.5.0, json5@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz#1eade7acc012034ad84e2396767ead9fa5495821" @@ -3843,12 +4337,6 @@ lazy-cache@^1.0.3: version "1.0.4" resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-1.0.4.tgz#a1d78fc3a50474cb80845d3b3b6e1da49a446e8e" -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - dependencies: - readable-stream "^2.0.5" - lcid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" @@ -3897,6 +4385,13 @@ livereload-js@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.2.2.tgz#6c87257e648ab475bc24ea257457edcc1f8d0bc2" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + lockfile@~1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/lockfile/-/lockfile-1.0.3.tgz#2638fc39a0331e9cac1a04b71799931c9c50df79" @@ -4106,6 +4601,10 @@ lodash.uniq@^4.2.0, lodash.uniq@^4.5.0, lodash.uniq@~4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + lodash.without@~4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.without/-/lodash.without-4.4.0.tgz#3cd4574a00b67bae373a94b748772640507b7aac" @@ -4114,18 +4613,22 @@ lodash@2.4.1: version "2.4.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-2.4.1.tgz#5b7723034dda4d262e5a46fb2c58d7cc22f71420" -lodash@4.16.2: - version "4.16.2" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.16.2.tgz#3e626db827048a699281a8a125226326cfc0e652" - lodash@^3.10.0, lodash@^3.10.1, lodash@^3.9.3: version "3.10.1" resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" -lodash@^4.0.0, lodash@^4.14.0, lodash@^4.16.1, lodash@^4.16.6, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1, lodash@^4.8.0: +lodash@^4.0.0, lodash@^4.14.0, lodash@^4.16.1, lodash@^4.2.0, lodash@^4.3.0, lodash@^4.6.1: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" +lodash@^4.17.4: + version "4.17.10" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.10.tgz#1b7793cf7259ea38fb3661d4d38b3260af8ae4e7" + +lolex@1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.3.2.tgz#7c3da62ffcb30f0f5a80a2566ca24e45d8a01f31" + longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" @@ -4217,6 +4720,12 @@ media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" +mem@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/mem/-/mem-1.1.0.tgz#5edd52b485ca1d900fe64895505399a0dfa45f76" + dependencies: + mimic-fn "^1.0.0" + memory-streams@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/memory-streams/-/memory-streams-0.1.2.tgz#273ff777ab60fec599b116355255282cca2c50c2" @@ -4290,10 +4799,18 @@ mime@^1.2.11: version "1.3.6" resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0" +mime@^1.3.4: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" + mime@~1.2.11: version "1.2.11" resolved "https://registry.yarnpkg.com/mime/-/mime-1.2.11.tgz#58203eed86e3a5ef17aed2b7d9ebd47f0a60dd10" +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + minimatch@0.3: version "0.3.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-0.3.0.tgz#275d8edaac4f1bb3326472089e7949c8394699dd" @@ -4477,7 +4994,7 @@ normalize-package-data@^2.0.0, "normalize-package-data@~1.0.1 || ^2.0.0", normal semver "2 || 3 || 4 || 5" validate-npm-package-license "^3.0.1" -normalize-path@^2.0.0, normalize-path@^2.0.1: +normalize-path@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" dependencies: @@ -4516,6 +5033,12 @@ npm-registry-client@~7.2.1: optionalDependencies: npmlog "~2.0.0 || ~3.1.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + npm-user-validate@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" @@ -4664,7 +5187,7 @@ on-headers@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.1.tgz#928f5d0f470d49342651ea6794b0857c100693f7" -once@^1.3.0, once@^1.3.3, once@^1.4.0, once@~1.4.0: +once@^1.3.0, once@^1.3.3, once@~1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -4719,6 +5242,14 @@ os-locale@^1.4.0: dependencies: lcid "^1.0.0" +os-locale@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-2.1.0.tgz#42bc2900a6b5b8bd17376c8e882b65afccf24bf2" + dependencies: + execa "^0.7.0" + lcid "^1.0.0" + mem "^1.1.0" + os-shim@^0.1.2: version "0.1.3" resolved "https://registry.yarnpkg.com/os-shim/-/os-shim-0.1.3.tgz#6b62c3791cf7909ea35ed46e17658bb417cb3917" @@ -4742,6 +5273,26 @@ output-file-sync@^1.1.0: mkdirp "^0.5.1" object-assign "^4.1.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + +p-limit@^1.1.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz#b86bd5f0c25690911c7590fcbfc2010d54b3ccb8" + dependencies: + p-try "^1.0.0" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -4797,7 +5348,11 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" -path-is-absolute@^1.0.0: +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + +path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -4805,6 +5360,10 @@ path-is-inside@^1.0.1, path-is-inside@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + path-parse@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" @@ -4817,6 +5376,10 @@ path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" @@ -4863,6 +5426,10 @@ private@^0.1.6, private@~0.1.5: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" +private@^0.1.8: + version "0.1.8" + resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" + process-nextick-args@~1.0.6: version "1.0.7" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" @@ -4877,6 +5444,10 @@ progress@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/progress/-/progress-1.1.8.tgz#e260c78f6161cdd9b0e56cc3e0a85de17c7a57be" +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + promise-map-series@^0.2.1: version "0.2.3" resolved "https://registry.yarnpkg.com/promise-map-series/-/promise-map-series-0.2.3.tgz#c2d377afc93253f6bd03dbb77755eb88ab20a847" @@ -4900,6 +5471,10 @@ proxy-addr@~1.1.4: forwarded "~0.1.0" ipaddr.js "1.3.0" +proxy-from-env@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" + pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" @@ -4912,7 +5487,20 @@ punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" -q@1.4.1, q@^1.1.2: +puppeteer@^0.13.0: + version "0.13.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-0.13.0.tgz#2e6956205f2c640964c2107f620ae1eef8bde8fd" + dependencies: + debug "^2.6.8" + extract-zip "^1.6.5" + https-proxy-agent "^2.1.0" + mime "^1.3.4" + progress "^2.0.0" + proxy-from-env "^1.0.0" + rimraf "^2.6.1" + ws "^3.0.0" + +q@^1.1.2: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" @@ -4932,10 +5520,6 @@ qs@~6.2.0: version "6.2.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.2.3.tgz#1cfcb25c10a9b2b483053ff39f5dfc9233908cfe" -qs@~6.3.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" - querystring@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz#b209849203bb25df820da756e747005878521620" @@ -4952,16 +5536,6 @@ qunit-extras@^1.5.0: version "1.5.0" resolved "https://registry.yarnpkg.com/qunit-extras/-/qunit-extras-1.5.0.tgz#a64d1c5088ab20c01c0e1b04c72132c397b3964c" -qunit-phantomjs-runner@^2.2.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/qunit-phantomjs-runner/-/qunit-phantomjs-runner-2.3.0.tgz#270acb197c0f2fcaaf06676ab0a48fd5aca66a99" - dependencies: - qunit-reporter-junit "^1.0.2" - -qunit-reporter-junit@^1.0.2: - version "1.1.1" - resolved "https://registry.yarnpkg.com/qunit-reporter-junit/-/qunit-reporter-junit-1.1.1.tgz#eeb6226457896993e795a11940f18af6afa579b4" - qunitjs@^1.22.0: version "1.23.1" resolved "https://registry.yarnpkg.com/qunitjs/-/qunitjs-1.23.1.tgz#1971cf97ac9be01a64d2315508d2e48e6fd4e719" @@ -5029,7 +5603,7 @@ read@1, read@~1.0.1, read@~1.0.7: dependencies: mute-stream "~0.0.4" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.2.2: +"readable-stream@1 || 2", readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -5115,16 +5689,6 @@ recast@^0.11.17, recast@^0.11.3: private "~0.1.5" source-map "~0.5.0" -recast@^0.12.0: - version "0.12.6" - resolved "https://registry.yarnpkg.com/recast/-/recast-0.12.6.tgz#4b0fb82feb1d10b3bd62d34943426d9b3ed30d4c" - dependencies: - ast-types "0.9.11" - core-js "^2.4.1" - esprima "~4.0.0" - private "~0.1.5" - source-map "~0.5.0" - rechoir@^0.6.2: version "0.6.2" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" @@ -5141,10 +5705,22 @@ regenerate@^1.2.1: version "1.3.2" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.2.tgz#d1941c67bad437e1be76433add5b385f95b19260" -regenerator-runtime@^0.10.0: +regenerator-runtime@^0.10.0, regenerator-runtime@^0.10.5: version "0.10.5" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" +regenerator-runtime@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" + +regenerator-transform@^0.10.0: + version "0.10.1" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.10.1.tgz#1e4996837231da8b7f3cf4114d71b5691a0680dd" + dependencies: + babel-runtime "^6.18.0" + babel-types "^6.19.0" + private "^0.1.6" + regenerator@0.8.40: version "0.8.40" resolved "https://registry.yarnpkg.com/regenerator/-/regenerator-0.8.40.tgz#a0e457c58ebdbae575c9f8cd75127e93756435d8" @@ -5163,6 +5739,14 @@ regex-cache@^0.4.2: is-equal-shallow "^0.1.3" is-primitive "^2.0.0" +regexpu-core@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-2.0.0.tgz#49d038837b8dcf8bfa5b9a42139938e6ea2ae240" + dependencies: + regenerate "^1.2.1" + regjsgen "^0.2.0" + regjsparser "^0.1.4" + regexpu@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/regexpu/-/regexpu-1.3.0.tgz#e534dc991a9e5846050c98de6d7dd4a55c9ea16d" @@ -5207,7 +5791,7 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2, request@^2.74.0, request@^2.81.0: +request@2, request@^2.74.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -5234,31 +5818,6 @@ request@2, request@^2.74.0, request@^2.81.0: tunnel-agent "^0.6.0" uuid "^3.0.0" -request@2.79.0: - version "2.79.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - uuid "^3.0.0" - request@~2.40.0: version "2.40.0" resolved "https://registry.yarnpkg.com/request/-/request-2.40.0.tgz#4dd670f696f1e6e842e66b4b5e839301ab9beb67" @@ -5304,6 +5863,14 @@ request@~2.74.0: tough-cookie "~2.3.0" tunnel-agent "~0.4.1" +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" + +require-main-filename@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-1.0.1.tgz#97f717b69d48784f5f526a6c5aa8ffdda055a4d1" + require-uncached@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -5342,6 +5909,12 @@ resolve@^1.3.2: dependencies: path-parse "^1.0.5" +resolve@^1.4.0: + version "1.8.1" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" + dependencies: + path-parse "^1.0.5" + restore-cursor@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541" @@ -5359,7 +5932,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.1.4, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.2, rimraf@^2.5.3, rimraf@^2.5.4, rimraf@^2.6.1: +rimraf@2, rimraf@^2.1.4, rimraf@^2.2.8, rimraf@^2.3.2, rimraf@^2.3.4, rimraf@^2.4.1, rimraf@^2.4.3, rimraf@^2.4.4, rimraf@^2.5.2, rimraf@^2.5.3, rimraf@^2.6.1: version "2.6.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: @@ -5369,7 +5942,7 @@ rimraf@~2.2.6: version "2.2.8" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.2.8.tgz#e439be2aaee327321952730f99a8929e4fc50582" -rimraf@~2.5.4: +rimraf@~2.5.2, rimraf@~2.5.4: version "2.5.4" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: @@ -5393,7 +5966,7 @@ rsvp@3.0.14: version "3.0.14" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.14.tgz#9d2968cf36d878d3bb9a9a5a4b8e1ff55a76dd31" -rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.2.1, rsvp@^3.3.3, rsvp@^3.5.0, rsvp@^3.6.1: +rsvp@^3.0.14, rsvp@^3.0.16, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.2.1, rsvp@^3.3.3, rsvp@^3.5.0: version "3.6.1" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.1.tgz#34f4a7ac2859f7bacc8f49789c5604f1e26ae702" @@ -5401,6 +5974,10 @@ rsvp@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.7.0.tgz#dc1b0b1a536f7dec9d2be45e0a12ad4197c9fd96" +rsvp@^4.8.2: + version "4.8.2" + resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.2.tgz#9d5647108735784eb13418cdddb56f75b919d722" + rsvp@~3.0.6: version "3.0.21" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.0.21.tgz#49c588fe18ef293bcd0ab9f4e6756e6ac433359f" @@ -5437,6 +6014,14 @@ safe-json-parse@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57" +samsam@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.2.tgz#bec11fdc83a9fda063401210e40176c3024d1567" + +samsam@~1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.1.3.tgz#9f5087419b4d091f232571e7fa52e90b0f552621" + sane@^1.1.1: version "1.7.0" resolved "https://registry.yarnpkg.com/sane/-/sane-1.7.0.tgz#b3579bccb45c94cf20355cc81124990dfd346e30" @@ -5449,26 +6034,6 @@ sane@^1.1.1: walker "~1.0.5" watch "~0.10.0" -sauce-connect-launcher@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/sauce-connect-launcher/-/sauce-connect-launcher-1.2.2.tgz#7346cc8fbdc443191323439b0733451f5f3521f2" - dependencies: - adm-zip "~0.4.3" - async "^2.1.2" - https-proxy-agent "~1.0.0" - lodash "^4.16.6" - rimraf "^2.5.4" - -saucie@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/saucie/-/saucie-3.2.0.tgz#f3cb07acc253daeda65f12f56cdf88063359670e" - dependencies: - bluebird "^3.1.1" - commander "^2.9.0" - request "^2.81.0" - sauce-connect-launcher "^1.2.2" - wd "^1.2.0" - sax@1.2.1, sax@>=0.6.0: version "1.2.1" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.1.tgz#7b8e656190b228e81a66aea748480d828cd2d37a" @@ -5481,9 +6046,9 @@ semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" -semver@~5.0.1: - version "5.0.3" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.0.3.tgz#77466de589cd5d3c95f138aa78bc569a3cb5d27a" +semver@^5.5.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" send@0.15.3: version "0.15.3" @@ -5512,7 +6077,7 @@ serve-static@1.12.3, serve-static@^1.12.2: parseurl "~1.3.1" send "0.15.3" -set-blocking@~2.0.0: +set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -5583,6 +6148,15 @@ simple-is@~0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/simple-is/-/simple-is-0.2.0.tgz#2abb75aade39deb5cc815ce10e6191164850baf0" +sinon@^1.17.6: + version "1.17.7" + resolved "https://registry.yarnpkg.com/sinon/-/sinon-1.17.7.tgz#4542a4f49ba0c45c05eb2e9dd9d203e2b8efe0bf" + dependencies: + formatio "1.1.1" + lolex "1.3.2" + samsam "1.1.2" + util ">=0.10.3 <1" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -5677,6 +6251,12 @@ source-map-support@^0.4.0, source-map-support@^0.4.2: dependencies: source-map "^0.5.6" +source-map-support@^0.4.15: + version "0.4.18" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" + dependencies: + source-map "^0.5.6" + source-map-url@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.3.0.tgz#7ecaf13b57bcd09da8a40c5d269db33799d4aaf9" @@ -5697,6 +6277,10 @@ source-map@^0.5.0, source-map@^0.5.6, source-map@~0.5.0, source-map@~0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + spawn-args@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/spawn-args/-/spawn-args-0.2.0.tgz#fb7d0bd1d70fd4316bd9e3dec389e65f9d6361bb" @@ -5722,7 +6306,7 @@ spdx-license-ids@^1.0.2: version "1.2.2" resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" -sprintf-js@^1.0.3, sprintf-js@~1.0.2: +sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -5767,6 +6351,13 @@ string-width@^2.0.0: is-fullwidth-code-point "^2.0.0" strip-ansi "^4.0.0" +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + string_decoder@0.10, string_decoder@~0.10.x: version "0.10.31" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" @@ -5817,6 +6408,10 @@ strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" @@ -5877,15 +6472,6 @@ tap-parser@^5.1.0: optionalDependencies: readable-stream "^2" -tar-stream@^1.5.0: - version "1.5.4" - resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.4.tgz#36549cf04ed1aee9b2a30c0143252238daf94016" - dependencies: - bl "^1.0.0" - end-of-stream "^1.0.0" - readable-stream "^2.0.0" - xtend "^4.0.0" - tar@^2.0.0, tar@~2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -5894,6 +6480,12 @@ tar@^2.0.0, tar@~2.2.1: fstream "^1.0.2" inherits "2" +temp-fs@^0.9.9: + version "0.9.9" + resolved "https://registry.yarnpkg.com/temp-fs/-/temp-fs-0.9.9.tgz#8071730437870720e9431532fe2814364f8803d7" + dependencies: + rimraf "~2.5.2" + temp@0.8.3: version "0.8.3" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.3.tgz#e0c6bc4d26b903124410e4fed81103014dfc1f59" @@ -5901,7 +6493,38 @@ temp@0.8.3: os-tmpdir "^1.0.0" rimraf "~2.2.6" -testem@1.15.0, testem@^1.8.1: +testem@^1.18.4: + version "1.18.5" + resolved "https://registry.yarnpkg.com/testem/-/testem-1.18.5.tgz#912f3bfd4773519fa3cce0a8fd0e354763cbd545" + dependencies: + backbone "^1.1.2" + bluebird "^3.4.6" + charm "^1.0.0" + commander "^2.6.0" + consolidate "^0.14.0" + cross-spawn "^5.1.0" + express "^4.10.7" + fireworm "^0.7.0" + glob "^7.0.4" + http-proxy "^1.13.1" + js-yaml "^3.2.5" + lodash.assignin "^4.1.0" + lodash.clonedeep "^4.4.1" + lodash.find "^4.5.1" + lodash.uniqby "^4.7.0" + mkdirp "^0.5.1" + mustache "^2.2.1" + node-notifier "^5.0.1" + npmlog "^4.0.0" + printf "^0.2.3" + rimraf "^2.4.4" + socket.io "1.6.0" + spawn-args "^0.2.0" + styled_string "0.0.1" + tap-parser "^5.1.0" + xmldom "^0.1.19" + +testem@^1.8.1: version "1.15.0" resolved "https://registry.yarnpkg.com/testem/-/testem-1.15.0.tgz#2e3a9e7ac29f16a20f718eb0c4b12e7a44900675" dependencies: @@ -5981,7 +6604,7 @@ to-array@0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" -to-fast-properties@^1.0.0, to-fast-properties@^1.0.1: +to-fast-properties@^1.0.0, to-fast-properties@^1.0.1, to-fast-properties@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz#b83571fa4d8c25b82e231b06e3a3055de4ca1a47" @@ -6121,17 +6744,14 @@ ultron@1.0.x: version "1.0.2" resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.0.2.tgz#ace116ab557cd197386a4e88f4685378c8b2e4fa" +ultron@~1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/ultron/-/ultron-1.1.1.tgz#9fe1536a10a664a65266a1e3ccf85fd36302bc9c" + umask@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" -underscore.string@3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-3.3.4.tgz#2c2a3f9f83e64762fdc45e6ceac65142864213db" - dependencies: - sprintf-js "^1.0.3" - util-deprecate "^1.0.2" - underscore.string@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/underscore.string/-/underscore.string-2.3.3.tgz#71c08bf6b428b1133f37e78fa3a21c82f7329b0d" @@ -6187,7 +6807,7 @@ username-sync@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/username-sync/-/username-sync-1.0.1.tgz#1cde87eefcf94b8822984d938ba2b797426dae1f" -util-deprecate@^1.0.2, util-deprecate@~1.0.1: +util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -6195,6 +6815,12 @@ util-extend@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/util-extend/-/util-extend-1.0.3.tgz#a7c216d267545169637b3b6edc6ca9119e2ff93f" +"util@>=0.10.3 <1": + version "0.11.0" + resolved "https://registry.yarnpkg.com/util/-/util-0.11.0.tgz#c5f391beb244103d799b21077a926fef8769e1fb" + dependencies: + inherits "2.0.3" + utils-merge@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.0.tgz#0294fb922bb9375153541c4f7096231f287c8af8" @@ -6226,10 +6852,6 @@ validate-npm-package-name@~2.2.2: dependencies: builtins "0.0.7" -vargs@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/vargs/-/vargs-0.1.0.tgz#6b6184da6520cc3204ce1b407cac26d92609ebff" - vary@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.1.tgz#67535ebb694c1d52257457984665323f587e8d37" @@ -6274,10 +6896,6 @@ walk-sync@^0.3.0, walk-sync@^0.3.1: ensure-posix-path "^1.0.0" matcher-collection "^1.0.0" -walkdir@^0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/walkdir/-/walkdir-0.0.11.tgz#a16d025eb931bd03b52f308caed0f40fcebe9532" - walker@~1.0.5: version "1.0.7" resolved "https://registry.yarnpkg.com/walker/-/walker-1.0.7.tgz#2f7f9b8fd10d677262b18a884e28d19618e028fb" @@ -6294,19 +6912,6 @@ wcwidth@^1.0.0: dependencies: defaults "^1.0.3" -wd@^1.2.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/wd/-/wd-1.4.0.tgz#85958787abc32f048d4b3927b2ab3c5fc8c9c9fa" - dependencies: - archiver "1.3.0" - async "2.0.1" - lodash "4.16.2" - mkdirp "^0.5.1" - q "1.4.1" - request "2.79.0" - underscore.string "3.3.4" - vargs "0.1.0" - websocket-driver@>=0.5.1: version "0.6.5" resolved "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz#5cb2556ceb85f4373c6d8238aa691c8454e13a36" @@ -6317,6 +6922,10 @@ websocket-extensions@>=0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.1.tgz#76899499c184b6ef754377c2dbb0cd6cb55d29e7" +which-module@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" + which@1, which@^1.2.12, which@^1.2.9, which@~1.2.11: version "1.2.14" resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" @@ -6355,6 +6964,19 @@ workerpool@^2.2.1: dependencies: object-assign "4.1.1" +workerpool@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-2.3.0.tgz#86c5cbe946b55e7dc9d12b1936c8801a6e2d744d" + dependencies: + object-assign "4.1.1" + +wrap-ansi@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" + dependencies: + string-width "^1.0.1" + strip-ansi "^3.0.1" + wrappy@1, wrappy@~1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" @@ -6388,6 +7010,14 @@ ws@1.1.1: options ">=0.0.5" ultron "1.0.x" +ws@^3.0.0: + version "3.3.3" + resolved "https://registry.yarnpkg.com/ws/-/ws-3.3.3.tgz#f1cf84fe2d5e901ebce94efaece785f187a228f2" + dependencies: + async-limiter "~1.0.0" + safe-buffer "~5.1.0" + ultron "~1.1.0" + wtf-8@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wtf-8/-/wtf-8-1.0.0.tgz#392d8ba2d0f1c34d1ee2d630f15d0efb68e1048a" @@ -6423,7 +7053,7 @@ xtend@^4.0.0, xtend@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" -y18n@^3.2.0: +y18n@^3.2.0, y18n@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" @@ -6438,6 +7068,29 @@ yam@0.0.22: fs-extra "^0.30.0" lodash.merge "^4.4.0" +yargs-parser@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" + dependencies: + camelcase "^4.1.0" + +yargs@^10.0.3: + version "10.1.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5" + dependencies: + cliui "^4.0.0" + decamelize "^1.1.1" + find-up "^2.1.0" + get-caller-file "^1.0.1" + os-locale "^2.0.0" + require-directory "^2.1.1" + require-main-filename "^1.0.1" + set-blocking "^2.0.0" + string-width "^2.0.0" + which-module "^2.0.0" + y18n "^3.2.1" + yargs-parser "^8.1.0" + yargs@~3.10.0: version "3.10.0" resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.10.0.tgz#f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1" @@ -6458,6 +7111,12 @@ yargs@~3.27.0: window-size "^0.1.2" y18n "^3.2.0" +yauzl@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.4.1.tgz#9528f442dab1b2284e58b4379bb194e22e0c4005" + dependencies: + fd-slicer "~1.0.1" + yeast@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/yeast/-/yeast-0.1.2.tgz#008e06d8094320c372dbc2f8ed76a0ca6c8ac419" @@ -6479,12 +7138,3 @@ yuidocjs@^0.10.0: minimatch "^3.0.2" rimraf "^2.4.1" yui "^3.18.1" - -zip-stream@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-1.2.0.tgz#a8bc45f4c1b49699c6b90198baacaacdbcd4ba04" - dependencies: - archiver-utils "^1.3.0" - compress-commons "^1.2.0" - lodash "^4.8.0" - readable-stream "^2.0.0"