diff --git a/addons/api/.eslintrc.js b/addons/api/.eslintrc.js index 85a190092..b705ae52d 100644 --- a/addons/api/.eslintrc.js +++ b/addons/api/.eslintrc.js @@ -21,7 +21,8 @@ module.exports = { browser: true }, rules: { - 'ember/no-jquery': 'error' + 'ember/no-jquery': 'error', + 'ember/no-new-mixins': 0 }, overrides: [ // node files diff --git a/addons/api/addon/mixins/scope-adapter.js b/addons/api/addon/mixins/scope-adapter.js new file mode 100644 index 000000000..705e5f1c0 --- /dev/null +++ b/addons/api/addon/mixins/scope-adapter.js @@ -0,0 +1,53 @@ +import Mixin from '@ember/object/mixin'; +import { inject as service } from '@ember/service'; + +/** + * Add this mixin to resource adapters which should be accessed via an + * org/project-scoped URL. This mixin appends a scope path based on the scope + * reported by `ScopeService`. + */ +export default Mixin.create({ + // =services + + scope: service(), + + // =properties + + /** + * If true and the current scope has a project, will include the project in + * the resource path. Set to false for resources that are scoped exclusively + * to org. + * @type {boolean} + */ + includeProject: true, + + // =methods + + /** + * Appends a scope path to the URL prefix, if a scope is set. + * @override + * @return {string} + */ + urlPrefix() { + const prefix = this._super(...arguments); + let scopePath = this.scopePath; + // Ensure a slash is added between prefix + scope path if needed. + if (scopePath && prefix.charAt(prefix.length - 1) !== '/') { + scopePath = `/${scopePath}`; + } + return `${prefix}${scopePath}`; + }, + + /** + * Generates a scope path for the current scope as reported by `ScopeService`. + * If no scope is set, returns empty string. + * @return {string} + */ + get scopePath() { + const { org, project } = this.scope; + const scopePath = []; + if (org) scopePath.push('orgs', org.id); + if (project && this.includeProject) scopePath.push('projects', project.id); + return scopePath.join('/'); + }, +}); diff --git a/addons/api/addon/services/scope.js b/addons/api/addon/services/scope.js new file mode 100644 index 000000000..370bdfb8c --- /dev/null +++ b/addons/api/addon/services/scope.js @@ -0,0 +1,123 @@ +import Service from '@ember/service'; +import { tracked } from '@glimmer/tracking'; +import { computed } from '@ember/object'; + +/** + * This module includes two parts: + * + * - `Scope` class: a data structure representing an org/project tuple + * - `ScopeService`: manages the scope and exposes it to the application + */ + +/** + * Represents a _scope_, which is defined as an organization/project tuple. + * This class is intended as a simple data structure and is used by the + * scope service (see below). + * Immutable. + */ +class Scope { + /** + * @type {?object} + * @private + */ + #org = null; + + /** + * @type {?object} + * @private + */ + #project = null; + + /** + * Initializes an instance of `Scope` with optional org and project. + * A scope with only project is invalid and in thi scenario, project will + * be null. + * @param {?object} org + * @param {?object} project + */ + constructor(org = null, project = null) { + if (org) this.#org = org; + if (org && project) this.#project = project; + } + + /** + * Org for this scope. Immutable. + * @type {?object} + */ + get org() { + return this.#org; + } + + /** + * Project for this scope. + * @type {?object} + */ + get project() { + return this.#project; + } + + /** + * Returns the JSON representation of this scope. + * @return {?object} + */ + toJSON() { + const { org, project } = this; + return { org, project }; + } +} + +export { Scope }; + +/** + * The scope service manages the current scope, making it available throughout + * the Ember application. Use `service.org` and `service.project` directly, + * rather than interacting with the internal `scope` member. + * + * @example + * // inject the scope service + * import { inject as service } from '@ember/service'; + * class MyClass { + * @service scope; + * } + * + * // set an org, project, or both + * this.scope.org = {id: 1}; + * this.scope.project = {id: 2}; + * + * // retrieve the org and/or project + * const org = this.scope.org; + * const project = this.scope.project; + */ +export default class ScopeService extends Service { + /** + * The currently selected scope. This is an internal member only. + * @type {?Scope} + */ + @tracked scope = new Scope(); + + /** + * When setting org, `service.org = {...}`, a new scope is instantiated, + * since scopes are immutable. + * @type {?object} + */ + @computed('scope.org') + get org() { + return this.scope ? this.scope.org : null; + } + set org(org) { + this.scope = new Scope(org, this.project); + } + + /** + * When setting project, `service.project = {...}`, a new scope is + * instantiated, since scopes are immutable. + * @type {?object} + */ + @computed('scope.project') + get project() { + return this.scope ? this.scope.project : null; + } + set project(project) { + this.scope = new Scope(this.org, project); + } +} diff --git a/addons/api/addon/services/storage.js b/addons/api/addon/services/storage.js new file mode 100644 index 000000000..3f4be864f --- /dev/null +++ b/addons/api/addon/services/storage.js @@ -0,0 +1,130 @@ +import Service from '@ember/service'; +import { getOwner } from '@ember/application'; +import { get } from '@ember/object'; + +/** + * A dead simple memory storage class used by `StorageService` when it + * is configued for memory-only. + */ +class MemoryStorage { + /** + * Internal storage object. + * @type {object} + * @private + */ + #storage = {}; + + /** + * Gets a value from storage. + * @param {string} key + * @return {any} + */ + getItem(key) { + return this.#storage[key]; + } + + /** + * Sets a value to storage. + * @param {string} key + */ + setItem(key, value) { + this.#storage[key] = value; + } + + /** + * Removes a value from storage. + * @param {string} key + */ + removeItem(key) { + delete this.#storage[key]; + } +} + +/** + * The storage service provides a simple way to persist data in the browser. + * Most of the time localStorage is used. Appplications may specify in-memory + * storage via the config, for example: + * + * ENV.storage = { + * memory: true + * }; + * + * @example + * import Route from '@ember/routing/route'; + * import { inject as service } from '@ember/service'; + * export default class ApplicationRoute extends Route { + * @service storage; + * afterModel() { + * this.storage.setItem('key', 'value'); + * } + * } + */ +export default class StorageService extends Service { + /** + * @type {MemoryStorage} + * @private + */ + #memoryStorage = new MemoryStorage(); + + /** + * Gets the underlying storage mechanism. + * @return {Storage} + */ + get storage() { + // Get the application config to determine if memory storage is enabled + const config = getOwner(this).resolveRegistration('config:environment'); + const inMemory = get(config, 'storage.memory'); + // Get the global context object (window) via service lookup, + // because just reaching for a global is icky + const globalContext = getOwner(this).lookup('service:-document') + .documentElement.parentNode.defaultView; + // If memory storage enabled, return the memory storage instance, + // otherwise return localStorage. + return inMemory ? this.#memoryStorage : globalContext.localStorage; + } + + /** + * Returns the storage namespace, which is the application's `modulePrefix`. + * @return {string} + */ + get namespace() { + const config = getOwner(this).resolveRegistration('config:environment'); + return config.modulePrefix; + } + + /** + * Returns a fully qualified key from the passed string. A fully qualified + * key includes the namespace. + * @param {string} key + * @return {string} fully qualified key + */ + qualifiedKey(key) { + return `${this.namespace}:${key}`; + } + + /** + * Gets a value from storage. + * @param {string} key + * @return {any} + */ + getItem(key) { + const value = this.storage.getItem(this.qualifiedKey(key)); + if (value) return JSON.parse(value); + } + + /** + * Sets a value to storage. + * @param {string} key + */ + setItem(key, value) { + this.storage.setItem(this.qualifiedKey(key), JSON.stringify(value)); + } + + /** + * Removes a value from storage. + * @param {string} key + */ + removeItem(key) { + this.storage.removeItem(this.qualifiedKey(key)); + } +} diff --git a/addons/api/app/services/scope.js b/addons/api/app/services/scope.js new file mode 100644 index 000000000..6c4b4d6c8 --- /dev/null +++ b/addons/api/app/services/scope.js @@ -0,0 +1 @@ +export { default, Scope } from 'api/services/scope'; diff --git a/addons/api/app/services/storage.js b/addons/api/app/services/storage.js new file mode 100644 index 000000000..51cbec2c0 --- /dev/null +++ b/addons/api/app/services/storage.js @@ -0,0 +1 @@ +export { default } from 'api/services/storage'; diff --git a/addons/api/package.json b/addons/api/package.json index 453611318..46be73f6e 100644 --- a/addons/api/package.json +++ b/addons/api/package.json @@ -38,6 +38,7 @@ "ember-cli-sri": "^2.1.1", "ember-cli-template-lint": "^1.0.0-beta.3", "ember-cli-uglify": "^3.0.0", + "ember-data": "^3.16.0", "ember-disable-prototype-extensions": "^1.1.3", "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.1", diff --git a/addons/api/tests/dummy/app/routes/application.js b/addons/api/tests/dummy/app/routes/application.js new file mode 100644 index 000000000..62946d66d --- /dev/null +++ b/addons/api/tests/dummy/app/routes/application.js @@ -0,0 +1,10 @@ +import Route from '@ember/routing/route'; +import { inject as service } from '@ember/service'; + +export default class ApplicationRoute extends Route { + @service scope; + + afterModel() { + //console.log(this.scope); + } +} diff --git a/addons/api/tests/dummy/app/templates/application.hbs b/addons/api/tests/dummy/app/templates/application.hbs index 5230580f8..f8bc38e7b 100644 --- a/addons/api/tests/dummy/app/templates/application.hbs +++ b/addons/api/tests/dummy/app/templates/application.hbs @@ -1,3 +1,3 @@

Welcome to Ember

-{{outlet}} \ No newline at end of file +{{outlet}} diff --git a/addons/api/tests/dummy/app/templates/index.hbs b/addons/api/tests/dummy/app/templates/index.hbs new file mode 100644 index 000000000..9015a7a32 --- /dev/null +++ b/addons/api/tests/dummy/app/templates/index.hbs @@ -0,0 +1 @@ +index diff --git a/addons/api/tests/dummy/config/environment.js b/addons/api/tests/dummy/config/environment.js index ba4e8cb76..1b05a0196 100644 --- a/addons/api/tests/dummy/config/environment.js +++ b/addons/api/tests/dummy/config/environment.js @@ -41,6 +41,10 @@ module.exports = function (environment) { ENV.APP.rootElement = '#ember-testing'; ENV.APP.autoboot = false; + + ENV.storage = { + memory: true, + }; } if (environment === 'production') { diff --git a/addons/api/tests/unit/mixins/scope-adapter-test.js b/addons/api/tests/unit/mixins/scope-adapter-test.js new file mode 100644 index 000000000..5e042ae93 --- /dev/null +++ b/addons/api/tests/unit/mixins/scope-adapter-test.js @@ -0,0 +1,68 @@ +import RESTAdapter from '@ember-data/adapter/rest'; +import ScopeAdapterMixin from 'api/mixins/scope-adapter'; +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Mixin | scope-adapter', function (hooks) { + setupTest(hooks); + + test('it does not interfere with basic URLs', function (assert) { + assert.expect(1); + //const service = this.owner.lookup('service:scope'); + const ScopeAdapter = RESTAdapter.extend(ScopeAdapterMixin); + this.owner.register('adapter:scope', ScopeAdapter); + const adapter = this.owner.lookup('adapter:scope'); + const url = adapter._buildURL('model', 1); + assert.equal(url, '/models/1'); + }); + + test('it does not interfere with namespaced URLs', function (assert) { + assert.expect(1); + //const service = this.owner.lookup('service:scope'); + const ScopeAdapter = RESTAdapter.extend(ScopeAdapterMixin, { + namespace: 'api/v1', + }); + this.owner.register('adapter:scope', ScopeAdapter); + const adapter = this.owner.lookup('adapter:scope'); + const url = adapter._buildURL('model', 1); + assert.equal(url, '/api/v1/models/1'); + }); + + test('it adds a scope to basic URLs when scope is set', function (assert) { + assert.expect(4); + const service = this.owner.lookup('service:scope'); + service.org = { id: 1 }; + const ScopeAdapter = RESTAdapter.extend(ScopeAdapterMixin, { + namespace: 'api/v1', + }); + this.owner.register('adapter:scope', ScopeAdapter); + const adapter = this.owner.lookup('adapter:scope'); + let url = adapter._buildURL('model', 1); + assert.equal(url, '/api/v1/orgs/1/models/1'); + service.project = { id: 2 }; + url = adapter._buildURL('model', 1); + assert.equal(url, '/api/v1/orgs/1/projects/2/models/1'); + service.org = { id: 'foobar' }; + url = adapter._buildURL('model', 1); + assert.equal(url, '/api/v1/orgs/foobar/projects/2/models/1'); + // can't have a project without an org + service.org = null; + url = adapter._buildURL('model', 1); + assert.equal(url, '/api/v1/models/1'); + }); + + test('it does not add a project scope to basic URLs when includeProject is false', function (assert) { + assert.expect(1); + const service = this.owner.lookup('service:scope'); + service.org = { id: 1 }; + service.project = { id: 2 }; + const ScopeAdapter = RESTAdapter.extend(ScopeAdapterMixin, { + namespace: 'api/v1', + includeProject: false, + }); + this.owner.register('adapter:scope', ScopeAdapter); + const adapter = this.owner.lookup('adapter:scope'); + let url = adapter._buildURL('model', 1); + assert.equal(url, '/api/v1/orgs/1/models/1'); + }); +}); diff --git a/addons/api/tests/unit/services/scope-test.js b/addons/api/tests/unit/services/scope-test.js new file mode 100644 index 000000000..c94b1bfd5 --- /dev/null +++ b/addons/api/tests/unit/services/scope-test.js @@ -0,0 +1,66 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; +import { Scope } from '../../../services/scope'; + +module('Unit | Service | scope class', function (hooks) { + setupTest(hooks); + + test('it provides a scope class', function (assert) { + assert.expect(1); + assert.ok(Scope); + }); + + test('it has initializable org and project members', function (assert) { + assert.expect(2); + const org = { id: 1 }; + const project = { id: 2 }; + const scope = new Scope(org, project); + assert.equal(scope.org.id, 1); + assert.equal(scope.project.id, 2); + }); + + test('it has a null project if org is null, even if project was initialized to non-null', function (assert) { + assert.expect(2); + const org = null; + const project = { id: 2 }; + const scope = new Scope(org, project); + assert.notOk(scope.org); + assert.notOk(scope.project); + }); + + test('it serializes to JSON', function (assert) { + assert.expect(2); + let scope = new Scope({ id: 1 }); + assert.deepEqual(scope.toJSON(), { + org: { id: 1 }, + project: null, + }); + scope = new Scope({ id: 1 }, { id: 2 }); + assert.deepEqual(scope.toJSON(), { + org: { id: 1 }, + project: { id: 2 }, + }); + }); +}); + +module('Unit | Service | scope', function (hooks) { + setupTest(hooks); + + test('it returns nulls when scope is not set', function (assert) { + assert.expect(2); + const service = this.owner.lookup('service:scope'); + assert.equal(service.org, null); + assert.equal(service.project, null); + }); + + test('it aliases org and project to a scope instance', function (assert) { + assert.expect(2); + const service = this.owner.lookup('service:scope'); + const org = { id: 1 }; + const project = { id: 2 }; + service.org = org; + service.project = project; + assert.equal(service.org, service.scope.org); + assert.equal(service.project, service.scope.project); + }); +}); diff --git a/addons/api/tests/unit/services/storage-test.js b/addons/api/tests/unit/services/storage-test.js new file mode 100644 index 000000000..61702c765 --- /dev/null +++ b/addons/api/tests/unit/services/storage-test.js @@ -0,0 +1,38 @@ +import { module, test } from 'qunit'; +import { setupTest } from 'ember-qunit'; + +module('Unit | Service | storage', function (hooks) { + setupTest(hooks); + + test('it can persist values', function (assert) { + assert.expect(1); + const service = this.owner.lookup('service:storage'); + service.setItem('foo', 'bar'); + assert.equal(service.getItem('foo'), 'bar'); + }); + + test('it can remove persisted values', function (assert) { + assert.expect(2); + const service = this.owner.lookup('service:storage'); + service.setItem('foo', 'bar'); + assert.equal(service.getItem('foo'), 'bar'); + service.removeItem('foo'); + assert.notOk(service.getItem('foo')); + }); + + // NOTE: the following tests are order-dependent, so may be invalidated + // if we switch to random test ordering + + test("it's in-memory storage is implicitly refreshed for every test case", function (assert) { + assert.expect(1); + const service = this.owner.lookup('service:storage'); + service.setItem('foo', 'bar'); + assert.equal(service.getItem('foo'), 'bar'); + }); + + test("it's in-memory storage is implicitly refreshed for every test case", function (assert) { + assert.expect(1); + const service = this.owner.lookup('service:storage'); + assert.notOk(service.getItem('foo')); + }); +}); diff --git a/addons/rose/app/controllers/index.js b/addons/rose/app/controllers/index.js index d311e73a0..3b56b102a 100644 --- a/addons/rose/app/controllers/index.js +++ b/addons/rose/app/controllers/index.js @@ -3,8 +3,8 @@ import { action } from '@ember/object'; export default class IndexController extends Controller { @action - selectChange(value) { + selectChange(/*value*/) { // eslint-disable-next-line no-console - console.log(value); + //console.log(value); } } diff --git a/yarn.lock b/yarn.lock index 7d58252e0..9b37bbb9d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -389,7 +389,7 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-json-strings" "^7.8.0" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4", "@babel/plugin-proposal-nullish-coalescing-operator@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.8.3.tgz#e4572253fdeed65cddeecfdab3f928afeb2fd5d2" integrity sha512-TS9MlfzXpXKt6YYomudb/KU7nQI6/xnapG6in1uZxoxDghuSMZsPb6D2fyUwNYSAp4l1iR7QtFOjkqcRYcUsfw== @@ -431,7 +431,7 @@ "@babel/helper-plugin-utils" "^7.8.3" "@babel/plugin-syntax-optional-catch-binding" "^7.8.0" -"@babel/plugin-proposal-optional-chaining@^7.9.0": +"@babel/plugin-proposal-optional-chaining@^7.6.0", "@babel/plugin-proposal-optional-chaining@^7.9.0": version "7.9.0" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.9.0.tgz#31db16b154c39d6b8a645292472b98394c292a58" integrity sha512-NDn5tu3tcv4W30jNhmc2hyD5c56G6cXx4TesJubhxrJeCvuuMpttxr0OnNCqbZGhFjLrg+NIhxxC+BK5F6yS3w== @@ -871,6 +871,15 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" +"@babel/plugin-transform-typescript@~7.8.0": + version "7.8.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.7.tgz#48bccff331108a7b3a28c3a4adc89e036dc3efda" + integrity sha512-7O0UsPQVNKqpHeHLpfvOG4uXmlw+MOxYvUv6Otc9uH5SYMIxvF6eBdjkWvC3f9G+VXe0RsNExyAQBeTRug/wqQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.8.3" + "@babel/helper-plugin-utils" "^7.8.3" + "@babel/plugin-syntax-typescript" "^7.8.3" + "@babel/plugin-transform-unicode-regex@^7.8.3": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz#0cef36e3ba73e5c57273effb182f46b91a1ecaad" @@ -1112,7 +1121,7 @@ lodash "^4.17.13" to-fast-properties "^2.0.0" -"@babel/types@^7.4.0", "@babel/types@^7.6.0", "@babel/types@^7.9.6": +"@babel/types@^7.4.0", "@babel/types@^7.6.0", "@babel/types@^7.7.2", "@babel/types@^7.9.6": version "7.9.6" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.9.6.tgz#2c5502b427251e9de1bd2dff95add646d95cc9f7" integrity sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA== @@ -1179,11 +1188,127 @@ resolved "https://registry.yarnpkg.com/@egoist/vue-to-react/-/vue-to-react-1.1.0.tgz#83c884b8608e8ee62e76c03e91ce9c26063a91ad" integrity sha512-MwfwXHDh6ptZGLEtNLPXp2Wghteav7mzpT2Mcwl3NZWKF814i5hhHnNkVrcQQEuxUroSWQqzxLkMKSb+nhPang== +"@ember-data/adapter@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.18.0.tgz#0e25af9357d632bccb90df3109c679e922a64a25" + integrity sha512-fNFbnHF+QM9QAwd+AF131QRUM9P2W5mE5hycVyaHVfBPdNSDCJI85Ca+nwFF1GfwzImlUojUAyW5z+MzJCXhEw== + dependencies: + "@ember-data/private-build-infra" "3.18.0" + "@ember-data/store" "3.18.0" + "@ember/edition-utils" "^1.2.0" + ember-cli-babel "^7.18.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^3.1.3" + +"@ember-data/canary-features@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.18.0.tgz#cc94867a8d6309d7dff48143c79497c43fd301d2" + integrity sha512-NRddFSlqdN5D86MKBgJ4MQzAzKHGQasDOWCEoGJHMF/Muh3I1NqAVAtI/I68wPr/k1j5hP1wMT6/tBsBMJXb/Q== + dependencies: + ember-cli-babel "^7.18.0" + ember-cli-typescript "^3.1.3" + +"@ember-data/debug@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@ember-data/debug/-/debug-3.18.0.tgz#3ce284ce89e83b05ceae81a5be03248a341591fb" + integrity sha512-9g/ghkq8SLmbOG0UUTyeX0ZAmQ3j3us2Ajkg8u3pVDKEpNdbQLhU5Npd9rf5gJe1TKmLcH7AcDpu85ZPLbb69w== + dependencies: + "@ember-data/private-build-infra" "3.18.0" + "@ember/edition-utils" "^1.2.0" + ember-cli-babel "^7.18.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^3.1.3" + +"@ember-data/model@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.18.0.tgz#f2aebb34005dd2926cf11810d3b3cf7f2cc6c5ff" + integrity sha512-faFCpBl6VBzPl6tcJKi7FVEnC9xcx3qnle70tJWTAC++MK+GHlpQofNPWVu6cCebfDojHrLszfxjrDzmjvizqQ== + dependencies: + "@ember-data/canary-features" "3.18.0" + "@ember-data/private-build-infra" "3.18.0" + "@ember-data/store" "3.18.0" + "@ember/edition-utils" "^1.2.0" + ember-cli-babel "^7.18.0" + ember-cli-string-utils "^1.1.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^3.1.3" + ember-compatibility-helpers "^1.2.0" + inflection "1.12.0" + +"@ember-data/private-build-infra@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@ember-data/private-build-infra/-/private-build-infra-3.18.0.tgz#4420c375fa2462946ad6f9c62f73b79bba4d0e87" + integrity sha512-iQ4TzYdDCm0awv7S0Xg0AfQCDfwkl5pTCk7G8DfzbA3IIGJ0sFR19cq1IZkNKxqTUzU5ecb+394YybHjz81hMQ== + dependencies: + "@babel/plugin-transform-block-scoping" "^7.8.3" + "@ember-data/canary-features" "3.18.0" + "@ember/edition-utils" "^1.2.0" + babel-plugin-debug-macros "^0.3.3" + babel-plugin-filter-imports "^4.0.0" + babel6-plugin-strip-class-callcheck "^6.0.0" + broccoli-debug "^0.6.5" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^4.1.0" + broccoli-rollup "^4.1.1" + calculate-cache-key-for-tree "^2.0.0" + chalk "^3.0.0" + ember-cli-babel "^7.18.0" + ember-cli-path-utils "^1.0.0" + ember-cli-string-utils "^1.1.0" + ember-cli-typescript "^3.1.3" + ember-cli-version-checker "^4.1.0" + esm "^3.2.25" + git-repo-info "^2.1.1" + glob "^7.1.6" + npm-git-info "^1.0.3" + rimraf "^3.0.2" + rsvp "^4.8.5" + semver "^7.1.3" + silent-error "^1.1.1" + +"@ember-data/record-data@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@ember-data/record-data/-/record-data-3.18.0.tgz#c98e55e74950c3383080a5deb5b32a7210c2919e" + integrity sha512-WRrqBjFbD5tHeKnda+lvN9+3cPV/tJE0dkZIebheCvnkqueeGgp0+CW8ASp2iFySqRsBjlSxt1g46YrRdKVJtA== + dependencies: + "@ember-data/canary-features" "3.18.0" + "@ember-data/private-build-infra" "3.18.0" + "@ember-data/store" "3.18.0" + "@ember/edition-utils" "^1.2.0" + "@ember/ordered-set" "^2.0.3" + ember-cli-babel "^7.18.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^3.1.3" + "@ember-data/rfc395-data@^0.0.4": version "0.0.4" resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== +"@ember-data/serializer@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.18.0.tgz#d61fa2a11f6875f73bfdb492d316f052aa12b6ad" + integrity sha512-YBDHtGBxsHTIkk3c5ok3TrM3JCD2iW1n427Qe0v3/QMQCxX3eKT4rS8p0PP/orT5sUZ05zNOw6HlKfdEUKqAhA== + dependencies: + "@ember-data/private-build-infra" "3.18.0" + "@ember-data/store" "3.18.0" + ember-cli-babel "^7.18.0" + ember-cli-test-info "^1.0.0" + ember-cli-typescript "^3.1.3" + +"@ember-data/store@3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.18.0.tgz#04f7734a1f654c4eaf999f94f5a1451e763b7670" + integrity sha512-FBfXqRct3khpUsdusdFVFt8qNrWDPpqT/V0wFnwjSje5uX+DSwZ247SrtCYkwf6OziSzOfWR/w286O+0nawAyQ== + dependencies: + "@ember-data/canary-features" "3.18.0" + "@ember-data/private-build-infra" "3.18.0" + ember-cli-babel "^7.18.0" + ember-cli-path-utils "^1.0.0" + ember-cli-typescript "^3.1.3" + heimdalljs "^0.3.0" + "@ember/edition-utils@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" @@ -1202,6 +1327,14 @@ silent-error "^1.1.1" util.promisify "^1.0.0" +"@ember/ordered-set@^2.0.3": + version "2.0.3" + resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.3.tgz#2ac1ca73b3bd116063cae814898832ef434a57f9" + integrity sha512-F4yfVk6WMc4AUHxeZsC3CaKyTvO0qSZJy7WWHCFTlVDQw6vubn+FvnGdhzpN1F00EiXMI4Tv1tJdSquHcCnYrA== + dependencies: + ember-cli-babel "^6.16.0" + ember-compatibility-helpers "^1.1.1" + "@ember/test-helpers@^1.7.0", "@ember/test-helpers@^1.7.1": version "1.7.1" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-1.7.1.tgz#cc22a954b3b46856518f034bd492a74e0482389f" @@ -2073,6 +2206,11 @@ "@types/connect" "*" "@types/node" "*" +"@types/broccoli-plugin@^1.3.0": + version "1.3.0" + resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#38f8462fecaebc4e09a32e4d4ed1b9808f75bbca" + integrity sha512-SLk4/hFc2kGvgwNFrpn2O1juxFOllcHAywvlo7VwxfExLzoz1GGJ0oIZCwj5fwSpvHw4AWpZjJ1fUvb62PDayQ== + "@types/chai-as-promised@^7.1.2": version "7.1.2" resolved "https://registry.yarnpkg.com/@types/chai-as-promised/-/chai-as-promised-7.1.2.tgz#2f564420e81eaf8650169e5a3a6b93e096e5068b" @@ -2097,6 +2235,11 @@ dependencies: "@types/node" "*" +"@types/estree@*": + version "0.0.44" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.44.tgz#980cc5a29a3ef3bea6ff1f7d021047d7ea575e21" + integrity sha512-iaIVzr+w2ZJ5HkidlZ3EJM8VTZb2MJLCjw3V+505yVts0gRC4UMvjw0d1HPtGqI/HQC/KdsYtayfzl+AXY2R8g== + "@types/events@*": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7" @@ -3565,6 +3708,14 @@ babel-plugin-filter-imports@^3.0.0: "@babel/types" "^7.4.0" lodash "^4.17.11" +babel-plugin-filter-imports@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-4.0.0.tgz#068f8da15236a96a9602c36dc6f4a6eeca70a4f4" + integrity sha512-jDLlxI8QnfKd7PtieH6pl4tZJzymzfCDCPGdTq/grgbiYAikwDPp/oL0IlFJn0HQjLpcLkyYhPKkUVneRESw5w== + dependencies: + "@babel/types" "^7.7.2" + lodash "^4.17.15" + babel-plugin-htmlbars-inline-precompile@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" @@ -4130,6 +4281,11 @@ babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0: lodash "^4.17.4" to-fast-properties "^1.0.3" +babel6-plugin-strip-class-callcheck@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/babel6-plugin-strip-class-callcheck/-/babel6-plugin-strip-class-callcheck-6.0.0.tgz#de841c1abebbd39f78de0affb2c9a52ee228fddf" + integrity sha1-3oQcGr6705943gr/ssmlLuIo/d8= + babylon@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz#af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3" @@ -4679,7 +4835,7 @@ broccoli-merge-trees@^3.0.0, broccoli-merge-trees@^3.0.1, broccoli-merge-trees@^ broccoli-plugin "^1.3.0" merge-trees "^2.0.0" -broccoli-merge-trees@^4.2.0: +broccoli-merge-trees@^4.1.0, broccoli-merge-trees@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/broccoli-merge-trees/-/broccoli-merge-trees-4.2.0.tgz#692d3c163ecea08c5714a9434d664e628919f47c" integrity sha512-nTrQe5AQtCrW4enLRvbD/vTLHqyW2tz+vsLXQe4IEaUhepuMGVKJJr+I8n34Vu6fPjmPLwTjzNC8izMIDMtHPw== @@ -4806,7 +4962,7 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^2.1.0: +broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334" integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw== @@ -4842,6 +4998,21 @@ broccoli-plugin@^4.0.1, broccoli-plugin@^4.0.2: rimraf "^3.0.0" symlink-or-copy "^1.3.0" +broccoli-rollup@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-4.1.1.tgz#7531a24d88ddab9f1bace1c6ee6e6ca74a38d36f" + integrity sha512-hkp0dB5chiemi32t6hLe5bJvxuTOm1TU+SryFlZIs95KT9+94uj0C8w6k6CsZ2HuIdIZg6D252t4gwOlcTXrpA== + dependencies: + "@types/broccoli-plugin" "^1.3.0" + broccoli-plugin "^2.0.0" + fs-tree-diff "^2.0.1" + heimdalljs "^0.2.6" + node-modules-path "^1.0.1" + rollup "^1.12.0" + rollup-pluginutils "^2.8.1" + symlink-or-copy "^1.2.0" + walk-sync "^1.1.3" + broccoli-sass-source-maps@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/broccoli-sass-source-maps/-/broccoli-sass-source-maps-4.0.0.tgz#1ee4c10a810b10955b0502e28f85ab672f5961a2" @@ -7026,7 +7197,7 @@ ember-cli-sri@^2.1.1: dependencies: broccoli-sri-hash "^2.1.0" -ember-cli-string-utils@^1.1.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" integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= @@ -7048,6 +7219,13 @@ ember-cli-template-lint@^1.0.0-beta.3: strip-ansi "^4.0.0" walk-sync "^1.1.3" +ember-cli-test-info@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/ember-cli-test-info/-/ember-cli-test-info-1.0.0.tgz#ed4e960f249e97523cf891e4aed2072ce84577b4" + integrity sha1-7U6WDySel1I8+JHkrtIHLOhFd7Q= + dependencies: + ember-cli-string-utils "^1.0.0" + ember-cli-test-loader@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/ember-cli-test-loader/-/ember-cli-test-loader-2.2.0.tgz#3fb8d5d1357e4460d3f0a092f5375e71b6f7c243" @@ -7090,6 +7268,26 @@ ember-cli-typescript@^2.0.2: stagehand "^1.0.0" walk-sync "^1.0.0" +ember-cli-typescript@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.1.3.tgz#a2c7ec6a8a5e57c38eb52d83e36d8e18c7071e60" + integrity sha512-bFi15H60L9TLYfn9XUzi+RAP1gTWHFtVdSy9IHvxXHlCvTlFZ+2rfuugr/f8reQLz9gvJccKc5TyRD7v+uhx0Q== + dependencies: + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.4.4" + "@babel/plugin-proposal-optional-chaining" "^7.6.0" + "@babel/plugin-transform-typescript" "~7.8.0" + ansi-to-html "^0.6.6" + broccoli-stew "^3.0.0" + debug "^4.0.0" + ember-cli-babel-plugin-helpers "^1.0.0" + execa "^3.0.0" + fs-extra "^8.0.0" + resolve "^1.5.0" + rsvp "^4.8.1" + semver "^6.3.0" + stagehand "^1.0.0" + walk-sync "^2.0.0" + ember-cli-uglify@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-cli-uglify/-/ember-cli-uglify-3.0.0.tgz#8819665b2cc5fe70e3ba9fe7a94645209bc42fd6" @@ -7227,7 +7425,7 @@ ember-cli@~3.16.1: watch-detector "^1.0.0" yam "^1.0.0" -ember-compatibility-helpers@^1.1.2: +ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.1.tgz#87c92c4303f990ff455c28ca39fb3ee11441aa16" integrity sha512-6wzYvnhg1ihQUT5yGqnLtleq3Nv5KNv79WhrEuNU9SwR4uIxCO+KpyC7r3d5VI0EM7/Nmv9Nd0yTkzmTMdVG1A== @@ -7236,6 +7434,26 @@ ember-compatibility-helpers@^1.1.2: ember-cli-version-checker "^2.1.1" semver "^5.4.1" +ember-data@^3.16.0: + version "3.18.0" + resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.18.0.tgz#e7c27e311b62f986e55075dc61ca581e7c74a4d3" + integrity sha512-8P5A6Il7X0QQJRJA4OXdX7yOc8A5/befxfbFBNTzi2Ptq+m2zNBfdW98lfPb9M6h3GMjwsZCmVlNVK6ic8dmMA== + dependencies: + "@ember-data/adapter" "3.18.0" + "@ember-data/debug" "3.18.0" + "@ember-data/model" "3.18.0" + "@ember-data/private-build-infra" "3.18.0" + "@ember-data/record-data" "3.18.0" + "@ember-data/serializer" "3.18.0" + "@ember-data/store" "3.18.0" + "@ember/edition-utils" "^1.2.0" + "@ember/ordered-set" "^2.0.3" + "@glimmer/env" "^0.1.7" + broccoli-merge-trees "^4.1.0" + ember-cli-babel "^7.18.0" + ember-cli-typescript "^3.1.3" + ember-inflector "^3.0.1" + ember-disable-prototype-extensions@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/ember-disable-prototype-extensions/-/ember-disable-prototype-extensions-1.1.3.tgz#1969135217654b5e278f9fe2d9d4e49b5720329e" @@ -7246,6 +7464,13 @@ ember-export-application-global@^2.0.1: resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.1.tgz#b120a70e322ab208defc9e2daebe8d0dfc2dcd46" integrity sha512-B7wiurPgsxsSGzJuPFkpBWnaeuCu2PGpG2BjyrfA1VcL7//o+5RSnZqiCEY326y7qmxb2GoCgo0ft03KBU0rRw== +ember-inflector@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" + integrity sha512-fngrwMsnhkBt51KZgwNwQYxgURwV4lxtoHdjxf7RueGZ5zM7frJLevhHw7pbQNGqXZ3N+MRkhfNOLkdDK9kFdA== + dependencies: + ember-cli-babel "^6.6.0" + ember-inline-svg@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ember-inline-svg/-/ember-inline-svg-1.0.0.tgz#d8c243667a9277b0fef06eb63e4f1c4cf1e8013e" @@ -7890,7 +8115,7 @@ eslint@^5.6.0: table "^5.2.3" text-table "^0.2.0" -esm@^3.2.4: +esm@^3.2.25, esm@^3.2.4: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== @@ -7951,6 +8176,11 @@ estraverse@^5.1.0: resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz#374309d39fd935ae500e7b92e8a6b4c720e59642" integrity sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw== +estree-walker@^0.6.1: + version "0.6.1" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" + integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -8032,6 +8262,22 @@ execa@^2.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^3.0.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" + integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== + dependencies: + cross-spawn "^7.0.0" + get-stream "^5.0.0" + human-signals "^1.1.1" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.0" + onetime "^5.1.0" + p-finally "^2.0.0" + signal-exit "^3.0.2" + strip-final-newline "^2.0.0" + exists-sync@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/exists-sync/-/exists-sync-0.0.4.tgz#9744c2c428cc03b01060db454d4b12f0ef3c8879" @@ -9486,6 +9732,13 @@ heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heim dependencies: rsvp "~3.2.1" +heimdalljs@^0.3.0: + version "0.3.3" + resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" + integrity sha1-6S0sb3f9RtW/ULYQ0orTF1UFTQs= + dependencies: + rsvp "~3.2.1" + highlight.js@~9.13.0: version "9.13.1" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.13.1.tgz#054586d53a6863311168488a0f58d6c505ce641e" @@ -9690,6 +9943,11 @@ https@^1.0.0: resolved "https://registry.yarnpkg.com/https/-/https-1.0.0.tgz#3c37c7ae1a8eeb966904a2ad1e975a194b7ed3a4" integrity sha1-PDfHrhqO65ZpBKKtHpdaGUt+06Q= +human-signals@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" + integrity sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw== + iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" @@ -9794,7 +10052,7 @@ infer-owner@^1.0.3, infer-owner@^1.0.4: resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== -inflection@^1.12.0: +inflection@1.12.0, inflection@^1.12.0: version "1.12.0" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= @@ -11936,7 +12194,7 @@ node-libs-browser@^2.0.0, node-libs-browser@^2.2.1: util "^0.11.0" vm-browserify "^1.0.1" -node-modules-path@^1.0.0: +node-modules-path@^1.0.0, node-modules-path@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/node-modules-path/-/node-modules-path-1.0.2.tgz#e3acede9b7baf4bc336e3496b58e5b40d517056e" integrity sha512-6Gbjq+d7uhkO7epaKi5DNgUJn7H0gEyA4Jg0Mo1uQOi3Rk50G83LtmhhFyw0LxnAFhtlspkiiw52ISP13qzcBg== @@ -12023,6 +12281,11 @@ normalize-url@2.0.1: query-string "^5.0.1" sort-keys "^2.0.0" +npm-git-info@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" + integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= + npm-normalize-package-bin@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz#6e79a41f23fd235c0623218228da7d9c23b8f6e2" @@ -12052,6 +12315,13 @@ npm-run-path@^3.0.0: dependencies: path-key "^3.0.0" +npm-run-path@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + npmlog@^4.0.0, npmlog@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" @@ -14251,6 +14521,22 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rollup-pluginutils@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" + integrity sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ== + dependencies: + estree-walker "^0.6.1" + +rollup@^1.12.0: + version "1.32.1" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" + integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== + dependencies: + "@types/estree" "*" + "@types/node" "*" + acorn "^7.1.0" + rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" @@ -14443,6 +14729,11 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.3.0: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.1.3: + version "7.3.2" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz#604962b052b81ed0786aae84389ffba70ffd3938" + integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== + send@0.17.1: version "0.17.1" resolved "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz#c1d8b059f7900f7466dd4938bdc44e11ddb376c8"