diff --git a/TODO b/TODO index afa8aa8c..5263fcfe 100755 --- a/TODO +++ b/TODO @@ -1,5 +1,3 @@ -TODO: add qunit-dom.js to build system - TODO: add ember-test-helpers addon-test-helpers types to tsconfig diff --git a/ember-app-boilerplate/package.json b/ember-app-boilerplate/package.json index 66e3dedb..e2080ea9 100755 --- a/ember-app-boilerplate/package.json +++ b/ember-app-boilerplate/package.json @@ -13,9 +13,10 @@ "repository": "", "main": "src/main.js", "scripts": { - "build": "mber build", - "start": "mber server", - "test": "mber test" + "typecheck": "node_modules/.bin/tsc --project tsconfig.json --noEmit", + "build": "node_modules/.bin/mber build", + "start": "node_modules/.bin/mber start", + "test": "node_modules/.bin/mber test" }, "engines": { "node": "^13.*" @@ -23,8 +24,8 @@ "devDependencies": { "mber": "{{mberVersion}}", "eslint": "^6.8.0", - "eslint-plugin-ember": "^7.7.2", - "qunit-dom": "1.0.0", + "eslint-plugin-ember": "^7.10.1", + "qunit-dom": "1.1.0", "@types/ember": "^3.1.1", "@types/ember-data": "^3.1.9", "@types/ember-qunit": "^3.4.7", @@ -43,7 +44,7 @@ "memserver": "^2.0.10", "abortcontroller-polyfill": "^1.4.0", "ember-cli-fastboot": "^2.2.1", - "ember-data": "3.16.0", + "ember-data": "3.17.0", "ember-devtools": "^6.0.0", "ember-modifier": "^1.0.2", "fastboot": "^3.0.0", diff --git a/ember-app-boilerplate/src/data/models/application/adapter.ts b/ember-app-boilerplate/src/data/models/application/adapter.ts index f15ebee6..d19ba15b 100644 --- a/ember-app-boilerplate/src/data/models/application/adapter.ts +++ b/ember-app-boilerplate/src/data/models/application/adapter.ts @@ -20,13 +20,13 @@ export default class ApplicationAdapter extends RESTAdapter { // return { Authorization: `Bearer ${this.session.authenticationToken}` }; // } // } - handleResponse(status, headers, payload) { + handleResponse(status, headers, payload, requestData) { if (this.isInvalid(status, headers, payload)) { const errors = errorsHashToArray(payload.errors); return new InvalidError(errors); } - return super.handleResponse(...arguments); + return super.handleResponse(status, headers, payload, requestData); } } diff --git a/ember-app-boilerplate/src/main.ts b/ember-app-boilerplate/src/main.ts index 1d5a750b..e26ee689 100755 --- a/ember-app-boilerplate/src/main.ts +++ b/ember-app-boilerplate/src/main.ts @@ -4,9 +4,15 @@ import loadInitializers from 'ember-load-initializers'; import config from '../config/environment'; declare global { + interface FreeObject { + [propName: string]: any; + } + interface Window { runningTests: any; Ember: any; + DISABLE_MEMSERVER?: boolean; + MemServer?: FreeObject; } } diff --git a/ember-app-boilerplate/src/resolver.ts b/ember-app-boilerplate/src/resolver.ts index 1343bfd6..a920f4c1 100755 --- a/ember-app-boilerplate/src/resolver.ts +++ b/ember-app-boilerplate/src/resolver.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import Resolver from 'ember-resolver/resolvers/fallback'; import buildResolverConfig from 'ember-resolver/ember-config'; import config from '../config/environment'; diff --git a/ember-app-boilerplate/src/router.ts b/ember-app-boilerplate/src/router.ts index 438a0d71..e539bc83 100755 --- a/ember-app-boilerplate/src/router.ts +++ b/ember-app-boilerplate/src/router.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import EmberRouter from '@ember/routing/router'; import DocumentationRouter from 'mber-documentation'; import ENV from '../config/environment'; diff --git a/ember-app-boilerplate/src/ui/components/welcome-page/component.ts b/ember-app-boilerplate/src/ui/components/welcome-page/component.ts index 43d1e414..90c5cd2a 100644 --- a/ember-app-boilerplate/src/ui/components/welcome-page/component.ts +++ b/ember-app-boilerplate/src/ui/components/welcome-page/component.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import { VERSION } from '@ember/version'; import Component from '@glimmer/component'; diff --git a/ember-app-boilerplate/tsconfig.json b/ember-app-boilerplate/tsconfig.json index b75b2398..6863c034 100644 --- a/ember-app-boilerplate/tsconfig.json +++ b/ember-app-boilerplate/tsconfig.json @@ -5,22 +5,23 @@ "allowJs": true, "moduleResolution": "node", "allowSyntheticDefaultImports": true, - "noImplicitAny": true, - "noImplicitThis": true, - "alwaysStrict": true, - "strictNullChecks": true, - "strictPropertyInitialization": true, - "noFallthroughCasesInSwitch": true, - "noUnusedLocals": true, - "noUnusedParameters": true, - "noImplicitReturns": true, + "noImplicitAny": false, + "noImplicitThis": false, + "alwaysStrict": false, + "strictNullChecks": false, + "strictPropertyInitialization": false, + "noFallthroughCasesInSwitch": false, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noImplicitReturns": false, "noEmitOnError": false, - "noEmit": true, - "inlineSourceMap": true, - "inlineSources": true, + "noEmit": false, + "inlineSourceMap": false, + "inlineSources": false, "baseUrl": ".", "module": "es6", "experimentalDecorators": true, + "skipLibCheck": true, "paths": { "{{applicationName}}/tests/*": [ "tests/*" diff --git a/lib/addons/memserver/instance-initializers/memserver.js b/lib/addons/memserver/instance-initializers/memserver.js index 023f9d25..b5a757cf 100644 --- a/lib/addons/memserver/instance-initializers/memserver.js +++ b/lib/addons/memserver/instance-initializers/memserver.js @@ -1,6 +1,4 @@ import require from 'require'; -import { classify} from '@ember/string'; -import { singularize } from 'ember-inflector'; import Memserver from 'memserver/server'; export default { diff --git a/package-lock.json b/package-lock.json index b4b72476..6e094e3f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -13,9 +13,9 @@ } }, "@babel/compat-data": { - "version": "7.8.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.5.tgz", - "integrity": "sha512-jWYUqQX/ObOhG1UiEkbH5SANsE/8oKXiQWjj7p7xgj9Zmnt//aUvyz4dBkK0HNsS8/cbyC5NmmH87VekW+mXFg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.6.tgz", + "integrity": "sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q==", "requires": { "browserslist": "^4.8.5", "invariant": "^2.2.4", @@ -42,68 +42,14 @@ "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.7.tgz", - "integrity": "sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew==", - "requires": { - "@babel/types": "^7.8.7", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/parser": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.7.tgz", - "integrity": "sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A==" - }, - "@babel/template": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", - "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, - "@babel/traverse": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", - "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.6", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", - "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.7.tgz", + "integrity": "sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew==", "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.8.7", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -134,42 +80,30 @@ "@babel/helper-hoist-variables": "^7.8.3", "@babel/traverse": "^7.8.3", "@babel/types": "^7.8.7" - }, - "dependencies": { - "@babel/types": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", - "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/helper-compilation-targets": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.4.tgz", - "integrity": "sha512-3k3BsKMvPp5bjxgMdrFyq0UaEO48HciVrOVF0+lon8pp95cyJ2ujAh0TrBHNMnJGT2rr0iKOJPFFbSqjDyf/Pg==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", + "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", "requires": { - "@babel/compat-data": "^7.8.4", - "browserslist": "^4.8.5", + "@babel/compat-data": "^7.8.6", + "browserslist": "^4.9.1", "invariant": "^2.2.4", "levenary": "^1.1.1", "semver": "^5.5.0" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.3.tgz", - "integrity": "sha512-qmp4pD7zeTxsv0JNecSBsEmG1ei2MqwJq4YQcK3ZWm/0t07QstWfvuV/vm3Qt5xNMFETn2SZqpMx2MQzbtq+KA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.8.6.tgz", + "integrity": "sha512-klTBDdsr+VFFqaDHm5rR69OpEQtO2Qv8ECxHS1mNhJJvaHArR6a1xTf5K/eZW7eZpJbhCx3NW1Yt/sKsLXLblg==", "requires": { "@babel/helper-function-name": "^7.8.3", "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", "@babel/helper-plugin-utils": "^7.8.3", - "@babel/helper-replace-supers": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3" } }, @@ -245,15 +179,16 @@ } }, "@babel/helper-module-transforms": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.3.tgz", - "integrity": "sha512-C7NG6B7vfBa/pwCOshpMbOYUmrYQDfCpVL/JCRu0ek8B5p8kue1+BCXpg2vOYs7w5ACB9GTOBYQ5U6NwrMg+3Q==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.8.6.tgz", + "integrity": "sha512-RDnGJSR5EFBJjG3deY0NiL0K9TO8SXxS9n/MPsbPK/s9LbQymuLNtlzvDiNS7IpecuL45cMeLVkA+HfmlrnkRg==", "requires": { "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-simple-access": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/template": "^7.8.3", - "@babel/types": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.8.6", "lodash": "^4.17.13" } }, @@ -291,14 +226,14 @@ } }, "@babel/helper-replace-supers": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.3.tgz", - "integrity": "sha512-xOUssL6ho41U81etpLoT2RTdvdus4VfHamCuAm4AHxGr+0it5fnwoVdwUJ7GFEqCsQYzJUhcbsN9wB9apcYKFA==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", "requires": { "@babel/helper-member-expression-to-functions": "^7.8.3", "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/helper-simple-access": { @@ -350,9 +285,9 @@ } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==" + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.7.tgz", + "integrity": "sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A==" }, "@babel/plugin-proposal-async-generator-functions": { "version": "7.8.3", @@ -574,61 +509,6 @@ "@babel/helper-replace-supers": "^7.8.6", "@babel/helper-split-export-declaration": "^7.8.3", "globals": "^11.1.0" - }, - "dependencies": { - "@babel/generator": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.7.tgz", - "integrity": "sha512-DQwjiKJqH4C3qGiyQCAExJHoZssn49JTMJgZ8SANGgVFdkupcUhLOdkAeoC6kmHZCPfoDG5M0b6cFlSN5wW7Ew==", - "requires": { - "@babel/types": "^7.8.7", - "jsesc": "^2.5.1", - "lodash": "^4.17.13", - "source-map": "^0.5.0" - } - }, - "@babel/helper-replace-supers": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", - "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", - "requires": { - "@babel/helper-member-expression-to-functions": "^7.8.3", - "@babel/helper-optimise-call-expression": "^7.8.3", - "@babel/traverse": "^7.8.6", - "@babel/types": "^7.8.6" - } - }, - "@babel/parser": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.7.tgz", - "integrity": "sha512-9JWls8WilDXFGxs0phaXAZgpxTZhSk/yOYH2hTHC0X1yC7Z78IJfvR1vJ+rmJKq3I35td2XzXzN6ZLYlna+r/A==" - }, - "@babel/traverse": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", - "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", - "requires": { - "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.6", - "@babel/helper-function-name": "^7.8.3", - "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.6", - "@babel/types": "^7.8.6", - "debug": "^4.1.0", - "globals": "^11.1.0", - "lodash": "^4.17.13" - } - }, - "@babel/types": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", - "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - } } }, "@babel/plugin-transform-computed-properties": { @@ -888,12 +768,12 @@ } }, "@babel/polyfill": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.8.3.tgz", - "integrity": "sha512-0QEgn2zkCzqGIkSWWAEmvxD7e00Nm9asTtQvi7HdlYvMhjy/J38V/1Y9ode0zEJeIuxAI0uftiAzqc7nVeWUGg==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.8.7.tgz", + "integrity": "sha512-LeSfP9bNZH2UOZgcGcZ0PIHUt1ZuHub1L3CVmEyqLxCeDLm4C5Gi8jRH8ZX2PNpDhQCo0z6y/+DIs2JlliXW8w==", "requires": { "core-js": "^2.6.5", - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" } }, "@babel/preset-env": { @@ -958,117 +838,46 @@ "invariant": "^2.2.2", "levenary": "^1.1.1", "semver": "^5.5.0" - }, - "dependencies": { - "@babel/compat-data": { - "version": "7.8.6", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.8.6.tgz", - "integrity": "sha512-CurCIKPTkS25Mb8mz267vU95vy+TyUpnctEX2lV33xWNmHAfjruztgiPBbXZRh3xZZy1CYvGx6XfxyTVS+sk7Q==", - "requires": { - "browserslist": "^4.8.5", - "invariant": "^2.2.4", - "semver": "^5.5.0" - } - }, - "@babel/helper-compilation-targets": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.8.7.tgz", - "integrity": "sha512-4mWm8DCK2LugIS+p1yArqvG1Pf162upsIsjE7cNBjez+NjliQpVhj20obE520nao0o14DaTnFJv+Fw5a0JpoUw==", - "requires": { - "@babel/compat-data": "^7.8.6", - "browserslist": "^4.9.1", - "invariant": "^2.2.4", - "levenary": "^1.1.1", - "semver": "^5.5.0" - }, - "dependencies": { - "browserslist": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz", - "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==", - "requires": { - "caniuse-lite": "^1.0.30001030", - "electron-to-chromium": "^1.3.363", - "node-releases": "^1.1.50" - } - } - } - }, - "@babel/types": { - "version": "7.8.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", - "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", - "requires": { - "esutils": "^2.0.2", - "lodash": "^4.17.13", - "to-fast-properties": "^2.0.0" - } - }, - "caniuse-lite": { - "version": "1.0.30001031", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001031.tgz", - "integrity": "sha512-DpAP5a1NGRLgYfaNCaXIRyGARi+3tJA2quZXNNA1Du26VyVkqvy2tznNu5ANyN1Y5aX44QDotZSVSUSi2uMGjg==" - }, - "electron-to-chromium": { - "version": "1.3.368", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.368.tgz", - "integrity": "sha512-fqzDipW3p+uDkHUHFPrdW3wINRKcJsbnJwBD7hgaQEQwcuLSvNLw6SeUp5gKDpTbmTl7zri7IZfhsdTUTnygJg==" - }, - "node-releases": { - "version": "1.1.50", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.50.tgz", - "integrity": "sha512-lgAmPv9eYZ0bGwUYAKlr8MG6K4CvWliWqnkcT2P8mMAgVrH3lqfBPorFlxiG1pHQnqmavJZ9vbMXUTNyMLbrgQ==", - "requires": { - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } - } - } } }, "@babel/runtime": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.4.tgz", - "integrity": "sha512-neAp3zt80trRVBI1x0azq6c57aNBqYZH8KhMm3TaB7wEI5Q4A2SHfBHE8w9gOhI/lrqxtEbXZgQIrHP+wvSGwQ==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.8.7.tgz", + "integrity": "sha512-+AATMUFppJDw6aiR5NVPHqIQBlV/Pj8wY/EZH+lmvRdUo9xBaz/rF3alAwFJQavvKfeOlPE7oaaDHVbcySbCsg==", "requires": { - "regenerator-runtime": "^0.13.2" + "regenerator-runtime": "^0.13.4" } }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.6.tgz", + "integrity": "sha512-2B8l0db/DPi8iinITKuo7cbPznLCEk0kCxDoB9/N6gGNg/gxOXiR/IcymAFPiBwk5w6TtQ27w4wpElgp9btR9A==", "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", + "@babel/generator": "^7.8.6", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.7.tgz", + "integrity": "sha512-k2TreEHxFA4CjGkL+GYjRyx35W0Mr7DP5+9q6WMkyKXB+904bYmG40syjMFV0oLlhhFCwWl0vA0DyzTDkwAiJw==", "requires": { "esutils": "^2.0.2", "lodash": "^4.17.13", @@ -1144,18 +953,6 @@ "ember-cli-typescript": "^3.1.3", "ember-compatibility-helpers": "^1.2.0", "inflection": "1.12.0" - }, - "dependencies": { - "@ember-data/canary-features": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@ember-data/canary-features/-/canary-features-3.17.0.tgz", - "integrity": "sha512-vJ9KiHNW1LD2VgQLxZqPFhuVl0GVn82m+dlpU8tC9mPsqjTBPyAja2gKtzigRaWxUslW35+1zl/d9u8bhPJMew==", - "dev": true, - "requires": { - "ember-cli-babel": "^7.13.2", - "ember-cli-typescript": "^3.1.3" - } - } } }, "@ember-data/private-build-infra": { @@ -1192,16 +989,6 @@ "silent-error": "^1.1.1" }, "dependencies": { - "@ember-data/canary-features": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@ember-data/canary-features/-/canary-features-3.17.0.tgz", - "integrity": "sha512-vJ9KiHNW1LD2VgQLxZqPFhuVl0GVn82m+dlpU8tC9mPsqjTBPyAja2gKtzigRaWxUslW35+1zl/d9u8bhPJMew==", - "dev": true, - "requires": { - "ember-cli-babel": "^7.13.2", - "ember-cli-typescript": "^3.1.3" - } - }, "ansi-styles": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", @@ -1328,18 +1115,6 @@ "ember-cli-babel": "^7.13.2", "ember-cli-test-info": "^1.0.0", "ember-cli-typescript": "^3.1.3" - }, - "dependencies": { - "@ember-data/canary-features": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@ember-data/canary-features/-/canary-features-3.17.0.tgz", - "integrity": "sha512-vJ9KiHNW1LD2VgQLxZqPFhuVl0GVn82m+dlpU8tC9mPsqjTBPyAja2gKtzigRaWxUslW35+1zl/d9u8bhPJMew==", - "dev": true, - "requires": { - "ember-cli-babel": "^7.13.2", - "ember-cli-typescript": "^3.1.3" - } - } } }, "@ember-data/rfc395-data": { @@ -1374,16 +1149,6 @@ "heimdalljs": "^0.3.0" }, "dependencies": { - "@ember-data/canary-features": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/@ember-data/canary-features/-/canary-features-3.17.0.tgz", - "integrity": "sha512-vJ9KiHNW1LD2VgQLxZqPFhuVl0GVn82m+dlpU8tC9mPsqjTBPyAja2gKtzigRaWxUslW35+1zl/d9u8bhPJMew==", - "dev": true, - "requires": { - "ember-cli-babel": "^7.13.2", - "ember-cli-typescript": "^3.1.3" - } - }, "heimdalljs": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/heimdalljs/-/heimdalljs-0.3.3.tgz", @@ -1707,14 +1472,6 @@ "dev": true, "requires": { "@glimmer/di": "^0.2.0" - }, - "dependencies": { - "@glimmer/di": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/@glimmer/di/-/di-0.2.1.tgz", - "integrity": "sha512-0D53YVuEgGdHfTl9LGWDZqVzGhn4cT0CXqyAuOYkKFLvqboJXz6SnkRhQNPhhA2hLVrPnvUz3+choQmPhHLGGQ==", - "dev": true - } } }, "@glimmer/util": { @@ -1860,9 +1617,9 @@ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==" }, "@types/node": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-13.7.0.tgz", - "integrity": "sha512-GnZbirvmqZUzMgkFn70c74OQpTTUcCzlhQliTzYjQMqg+hVKcDnxdL19Ne3UdYzdMA/+W3eb646FWn/ZaT1NfQ==" + "version": "13.9.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.9.0.tgz", + "integrity": "sha512-0ARSQootUG1RljH2HncpsY2TJBfGQIKOOi7kxzUY6z54ePu/ZD+wJA8zI2Q6v8rol2qpG/rvqsReco8zNMPvhQ==" }, "@types/normalize-package-data": { "version": "2.4.0", @@ -1970,24 +1727,12 @@ "requires": { "acorn": "^7.1.1", "acorn-walk": "^7.1.1" - }, - "dependencies": { - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, - "acorn-walk": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", - "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" - } } }, "acorn-jsx": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.1.0.tgz", - "integrity": "sha512-tMUqwBWfLFbJbizRmEcWSLw6HnFzfdJs2sOJEOwwtVPMoH/0Ay+E703oZz78VSXZiiDcZrQ5XKjPIUQixhmgVw==" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==" }, "acorn-node": { "version": "1.8.2", @@ -2000,9 +1745,9 @@ } }, "acorn-walk": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.0.0.tgz", - "integrity": "sha512-7Bv1We7ZGuU79zZbb6rRqcpxo3OY+zrdtloZWoyD8fmGX+FeXRjE+iuGkZjSXLVovLzrsvMGMy0EkwA0E0umxg==" + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" }, "agent-base": { "version": "5.1.1", @@ -2020,9 +1765,9 @@ } }, "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -2100,11 +1845,18 @@ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==" }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==" + } } }, "ansi-regex": { @@ -2778,9 +2530,9 @@ } }, "babel-plugin-ember-data-packages-polyfill": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-ember-data-packages-polyfill/-/babel-plugin-ember-data-packages-polyfill-0.1.1.tgz", - "integrity": "sha512-WQlevWS8RNNVCm4SNI6PogUMhH4Eu2ectRd/SVcKVnLnzaOHJjN9W1eaoQ9dwBidDgHhtXUbvkBSdLExaW+MYA==", + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/babel-plugin-ember-data-packages-polyfill/-/babel-plugin-ember-data-packages-polyfill-0.1.2.tgz", + "integrity": "sha512-kTHnOwoOXfPXi00Z8yAgyD64+jdSXk3pknnS7NlqnCKAU6YDkXZ4Y7irl66kaZjZn0FBBt0P4YOZFZk85jYOww==", "requires": { "@ember-data/rfc395-data": "^0.0.4" } @@ -4135,19 +3887,19 @@ } }, "browserslist": { - "version": "4.8.6", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.8.6.tgz", - "integrity": "sha512-ZHao85gf0eZ0ESxLfCp73GG9O/VTytYDIkIiZDlURppLTI9wErSM/5yAKEq6rcUdxBLjMELmrYUJGg5sxGKMHg==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.9.1.tgz", + "integrity": "sha512-Q0DnKq20End3raFulq6Vfp1ecB9fh8yUNV55s8sekaDDeqBaCtWlRHCUdaWyUeSSBJM7IbM6HcsyaeYqgeDhnw==", "requires": { - "caniuse-lite": "^1.0.30001023", - "electron-to-chromium": "^1.3.341", - "node-releases": "^1.1.47" + "caniuse-lite": "^1.0.30001030", + "electron-to-chromium": "^1.3.363", + "node-releases": "^1.1.50" } }, "buffer": { - "version": "5.4.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.4.3.tgz", - "integrity": "sha512-zvj65TkFeIt3i6aj5bIvJDzjjQQGs4o/sNoezg1F1kYap9Nu2jcUdpwzRSJTHMMzG0H7bZkn4rNQpImhuxWX2A==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.5.0.tgz", + "integrity": "sha512-9FTEDjLjwoAkEwyMGDjYJQN2gfRgOKBKRfiglhvibGbpeeU/pQn1bJxQqm32OD/AIeEuHxU9roxXxg34Byp/Ww==", "requires": { "base64-js": "^1.0.2", "ieee754": "^1.1.4" @@ -4230,9 +3982,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001025", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001025.tgz", - "integrity": "sha512-SKyFdHYfXUZf5V85+PJgLYyit27q4wgvZuf8QTOk1osbypcROihMBlx9GRar2/pIcKH2r4OehdlBr9x6PXetAQ==" + "version": "1.0.30001033", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001033.tgz", + "integrity": "sha512-8Ibzxee6ibc5q88cM1usPsMpJOG5CTq0s/dKOmlekPbDGKt+UrnOOTPSjQz3kVo6yL7N4SB5xd+FGLHQmbzh6A==" }, "caseless": { "version": "0.12.0", @@ -5171,9 +4923,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.345", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.345.tgz", - "integrity": "sha512-f8nx53+Z9Y+SPWGg3YdHrbYYfIJAtbUjpFfW4X1RwTZ94iUG7geg9tV8HqzAXX7XTNgyWgAFvce4yce8ZKxKmg==" + "version": "1.3.375", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.375.tgz", + "integrity": "sha512-zmaFnYVBtfpF8bGRYxgPeVAlXB7N3On8rjBE2ROc6wOpTPpzRWaiHo6KkbJMvlH07CH33uks/TEb6kuMMn8q6A==" }, "elliptic": { "version": "6.5.2", @@ -5340,9 +5092,9 @@ } }, "ember-cli-babel": { - "version": "7.17.2", - "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-7.17.2.tgz", - "integrity": "sha512-64jRwtRVtEp4ghhew/sHeMsPyUOg3t1TB2dary5mCbKkRasb3L7FwF7xnuzPihaz+AW/v2LqYLALXGCml5XNLA==", + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-7.18.0.tgz", + "integrity": "sha512-OLPfYD8wSfCrmGHcUf8zEfySSvbAL+5Qp2RWLycJIMaBZhg+SncKj5kVkL3cPJR5n2hVHPdfmKTQIYjOYl6FnQ==", "requires": { "@babel/core": "^7.8.4", "@babel/helper-compilation-targets": "^7.8.4", @@ -5356,7 +5108,7 @@ "@babel/runtime": "^7.8.4", "amd-name-resolver": "^1.2.1", "babel-plugin-debug-macros": "^0.3.0", - "babel-plugin-ember-data-packages-polyfill": "^0.1.1", + "babel-plugin-ember-data-packages-polyfill": "^0.1.2", "babel-plugin-ember-modules-api-polyfill": "^2.12.0", "babel-plugin-module-resolver": "^3.1.1", "broccoli-babel-transpiler": "^7.4.0", @@ -6613,70 +6365,6 @@ "semver": "^7.1.3" }, "dependencies": { - "babel-plugin-ember-data-packages-polyfill": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/babel-plugin-ember-data-packages-polyfill/-/babel-plugin-ember-data-packages-polyfill-0.1.2.tgz", - "integrity": "sha512-kTHnOwoOXfPXi00Z8yAgyD64+jdSXk3pknnS7NlqnCKAU6YDkXZ4Y7irl66kaZjZn0FBBt0P4YOZFZk85jYOww==", - "dev": true, - "requires": { - "@ember-data/rfc395-data": "^0.0.4" - } - }, - "babel-plugin-module-resolver": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz", - "integrity": "sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==", - "dev": true, - "requires": { - "find-babel-config": "^1.1.0", - "glob": "^7.1.2", - "pkg-up": "^2.0.0", - "reselect": "^3.0.1", - "resolve": "^1.4.0" - } - }, - "ember-cli-babel": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/ember-cli-babel/-/ember-cli-babel-7.18.0.tgz", - "integrity": "sha512-OLPfYD8wSfCrmGHcUf8zEfySSvbAL+5Qp2RWLycJIMaBZhg+SncKj5kVkL3cPJR5n2hVHPdfmKTQIYjOYl6FnQ==", - "dev": true, - "requires": { - "@babel/core": "^7.8.4", - "@babel/helper-compilation-targets": "^7.8.4", - "@babel/plugin-proposal-class-properties": "^7.8.3", - "@babel/plugin-proposal-decorators": "^7.8.3", - "@babel/plugin-transform-modules-amd": "^7.8.3", - "@babel/plugin-transform-runtime": "^7.8.3", - "@babel/plugin-transform-typescript": "^7.8.3", - "@babel/polyfill": "^7.8.3", - "@babel/preset-env": "^7.8.4", - "@babel/runtime": "^7.8.4", - "amd-name-resolver": "^1.2.1", - "babel-plugin-debug-macros": "^0.3.0", - "babel-plugin-ember-data-packages-polyfill": "^0.1.2", - "babel-plugin-ember-modules-api-polyfill": "^2.12.0", - "babel-plugin-module-resolver": "^3.1.1", - "broccoli-babel-transpiler": "^7.4.0", - "broccoli-debug": "^0.6.4", - "broccoli-funnel": "^2.0.1", - "broccoli-source": "^1.1.0", - "clone": "^2.1.2", - "ember-cli-babel-plugin-helpers": "^1.1.0", - "ember-cli-version-checker": "^4.1.0", - "ensure-posix-path": "^1.0.2", - "fixturify-project": "^1.10.0", - "rimraf": "^3.0.1", - "semver": "^5.5.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } - }, "semver": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", @@ -6839,9 +6527,9 @@ } }, "globals": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-12.3.0.tgz", - "integrity": "sha512-wAfjdLgFsPZsklLJvOBUBmzYE8/CwhEqSBEMRXA3qxIiNtyqvjYurAtIfDh6chlEPUfmTY3MnZh5Hfh4q0UlIw==", + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz", + "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==", "requires": { "type-fest": "^0.8.1" } @@ -6926,12 +6614,12 @@ "dev": true }, "espree": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.2.tgz", - "integrity": "sha512-2iUPuuPP+yW1PZaMSDM9eyVf8D5P0Hi8h83YtZ5bPc/zHYjII5khoixIUTMO794NOY8F/ThF1Bo8ncZILarUTA==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "requires": { - "acorn": "^7.1.0", - "acorn-jsx": "^5.1.0", + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", "eslint-visitor-keys": "^1.1.0" } }, @@ -6941,9 +6629,9 @@ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" }, "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.1.0.tgz", + "integrity": "sha512-MxYW9xKmROWF672KqjO75sszsA8Mxhw06YFeS5VHlB98KDHbOSurm3ArsjO60Eaf3QmGMCP1yn+0JQkNLo/97Q==", "requires": { "estraverse": "^4.0.0" } @@ -7459,9 +7147,9 @@ } }, "figures": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.1.0.tgz", - "integrity": "sha512-ravh8VRXqHuMvZt/d8GblBeqDMkdJMBdv/2KntFH+ra5MXkO7nxNKpzQ3n6QD/2da1kH0aWmNISdvhM7gl2gVg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "requires": { "escape-string-regexp": "^1.0.5" } @@ -7542,9 +7230,9 @@ } }, "fixturify": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fixturify/-/fixturify-1.2.0.tgz", - "integrity": "sha512-b5CMQmBZKsGR6HGqdSrLOGYGHIqrR0CUrcGU/lDL0mYy+DtGm5cnb61Z0UiIUqMVZIoV0CbN+u9/Gwjj+ICg0A==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fixturify/-/fixturify-1.3.0.tgz", + "integrity": "sha512-tL0svlOy56pIMMUQ4bU1xRe6NZbFSa/ABTWMxW2mH38lFGc9TrNAKWcMBQ7eIjo3wqSS8f2ICabFaatFyFmrVQ==", "requires": { "@types/fs-extra": "^5.0.5", "@types/minimatch": "^3.0.3", @@ -8082,9 +7770,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8296,36 +7984,67 @@ } }, "inquirer": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.0.4.tgz", - "integrity": "sha512-Bu5Td5+j11sCkqfqmUTiwv+tWisMtP0L7Q8WrqA2C/BbBhy1YTdFrvjjlrKq8oagA/tLQBski2Gcx/Sqyi2qSQ==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", "requires": { "ansi-escapes": "^4.2.1", - "chalk": "^2.4.2", + "chalk": "^3.0.0", "cli-cursor": "^3.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^3.0.0", "lodash": "^4.17.15", "mute-stream": "0.0.8", - "run-async": "^2.2.0", + "run-async": "^2.4.0", "rxjs": "^6.5.3", "string-width": "^4.1.0", - "strip-ansi": "^5.1.0", + "strip-ansi": "^6.0.0", "through": "^2.3.6" }, "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", "requires": { - "ansi-regex": "^4.1.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "requires": { + "has-flag": "^4.0.0" } } } @@ -8381,9 +8100,9 @@ "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=" }, "ipaddr.js": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", - "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" }, "irregular-plurals": { "version": "3.2.0", @@ -8633,63 +8352,10 @@ "xml-name-validator": "^3.0.0" }, "dependencies": { - "acorn": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", - "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" - }, "parse5": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.1.tgz", "integrity": "sha512-ugq4DFI0Ptb+WWjAdOK16+u/nHfiIrcE+sh8kZMaM0WllQKLI9rOUq6c2b7cwPkXdzfQESqvoqK6ug7U/Yyzug==" - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - } - } } } }, @@ -9062,9 +8728,9 @@ } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==" + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" }, "matcher": { "version": "2.1.0", @@ -9426,9 +9092,9 @@ } }, "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.3.tgz", + "integrity": "sha512-+bMdgqjMN/Z77a6NlY/I3U5LlRDbnmaAk6lDveAPKwSpcPM4tKAuYsvYF8xjhOPXhOYGe/73vVLVez5PW+jqhw==" }, "mkdirp": { "version": "0.5.1", @@ -9575,9 +9241,9 @@ "dev": true }, "node-releases": { - "version": "1.1.48", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.48.tgz", - "integrity": "sha512-Hr8BbmUl1ujAST0K0snItzEA5zkJTQup8VNTKNfT6Zw8vTJkIiagUPNfxHmgDOyfFYNfKAul40sD0UEYTvwebw==", + "version": "1.1.51", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.51.tgz", + "integrity": "sha512-1eQEs6HFYY1kMXQPOLzCf7HdjReErmvn85tZESMczdCNVWP3Y7URYLBAyYynuI7yef1zj4HN5q+oB2x67QU0lw==", "requires": { "semver": "^6.3.0" }, @@ -10237,18 +9903,18 @@ } }, "proxy-addr": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", - "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { "forwarded": "~0.1.2", - "ipaddr.js": "1.9.0" + "ipaddr.js": "1.9.1" } }, "proxy-from-env": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", - "integrity": "sha1-M8UDmPcOp+uW0h97gXYwpVeRx+4=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "psl": { "version": "1.7.0", @@ -10396,6 +10062,141 @@ } } }, + "qunit-dom": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/qunit-dom/-/qunit-dom-1.1.0.tgz", + "integrity": "sha512-YYlM6LIBorgqqK8tU/0ggefi9o1QKVSKOO1gfXZb/Ng5MFI7PK1H9qaGHjWGomW8v6MaMYrYkMh6ISiLbdRzuQ==", + "dev": true, + "requires": { + "broccoli-funnel": "^3.0.2", + "broccoli-merge-trees": "^4.1.0" + }, + "dependencies": { + "broccoli-funnel": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/broccoli-funnel/-/broccoli-funnel-3.0.2.tgz", + "integrity": "sha512-yRa7f0H/BtfqXNmL4eCYtAiVAQASI5b83//17MxAYp3I+w8XzGY8Tc3mwhdUrAgh6Zhb6LZwgvUZDZPTLmkK7w==", + "dev": true, + "requires": { + "array-equal": "^1.0.0", + "blank-object": "^1.0.1", + "broccoli-plugin": "^4.0.1", + "debug": "^4.1.1", + "fast-ordered-set": "^1.0.0", + "fs-tree-diff": "^2.0.1", + "heimdalljs": "^0.2.0", + "minimatch": "^3.0.0", + "path-posix": "^1.0.0", + "walk-sync": "^2.0.2" + } + }, + "broccoli-merge-trees": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/broccoli-merge-trees/-/broccoli-merge-trees-4.1.0.tgz", + "integrity": "sha512-1OXsksKPFiRdiZZOfh1z1mm7ZqKezlMS+DPBpHMDLSb6AhYHvoQfjf0KuMXbY8aoYskj7+Z+EJ5SsS/OC2v5yw==", + "dev": true, + "requires": { + "broccoli-plugin": "^3.1.0", + "merge-trees": "^2.0.0" + }, + "dependencies": { + "broccoli-output-wrapper": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/broccoli-output-wrapper/-/broccoli-output-wrapper-2.0.0.tgz", + "integrity": "sha512-V/ozejo+snzNf75i/a6iTmp71k+rlvqjE3+jYfimuMwR1tjNNRdtfno+NGNQB2An9bIAeqZnKhMDurAznHAdtA==", + "dev": true, + "requires": { + "heimdalljs-logger": "^0.1.10" + } + }, + "broccoli-plugin": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/broccoli-plugin/-/broccoli-plugin-3.1.0.tgz", + "integrity": "sha512-7w7FP8WJYjLvb0eaw27LO678TGGaom++49O1VYIuzjhXjK5kn2+AMlDm7CaUFw4F7CLGoVQeZ84d8gICMJa4lA==", + "dev": true, + "requires": { + "broccoli-node-api": "^1.6.0", + "broccoli-output-wrapper": "^2.0.0", + "fs-merger": "^3.0.1", + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.3", + "rimraf": "^2.3.4", + "symlink-or-copy": "^1.1.8" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "broccoli-output-wrapper": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/broccoli-output-wrapper/-/broccoli-output-wrapper-3.2.1.tgz", + "integrity": "sha512-mhOTy8AyzEsqgefR2ejbv5QTy3dbY2bvDfkARo55Xml52r2MU0CehQu4T/CH6oPcAXkdVYG/hGm9UpV1vU9Ohg==", + "dev": true, + "requires": { + "fs-extra": "^8.1.0", + "heimdalljs-logger": "^0.1.10", + "symlink-or-copy": "^1.2.0" + } + }, + "broccoli-plugin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/broccoli-plugin/-/broccoli-plugin-4.0.1.tgz", + "integrity": "sha512-rBYVtV1rWvlDS8fd+CUUG7L/TO5VUCRjaGm2HEOBaTwUYQKswKJXLRSxwv0CYLo3QfVZJpI1akcn7NGe9kywIQ==", + "dev": true, + "requires": { + "broccoli-node-api": "^1.6.0", + "broccoli-output-wrapper": "^3.1.1", + "fs-merger": "^3.0.1", + "promise-map-series": "^0.2.1", + "quick-temp": "^0.1.3", + "rimraf": "^3.0.0", + "symlink-or-copy": "^1.3.0" + } + }, + "fs-tree-diff": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/fs-tree-diff/-/fs-tree-diff-2.0.1.tgz", + "integrity": "sha512-x+CfAZ/lJHQqwlD64pYM5QxWjzWhSjroaVsr8PW831zOApL55qPibed0c+xebaLWVr2BnHFoHdrwOv8pzt8R5A==", + "dev": true, + "requires": { + "@types/symlink-or-copy": "^1.2.0", + "heimdalljs-logger": "^0.1.7", + "object-assign": "^4.1.0", + "path-posix": "^1.0.0", + "symlink-or-copy": "^1.1.8" + } + }, + "matcher-collection": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/matcher-collection/-/matcher-collection-2.0.1.tgz", + "integrity": "sha512-daE62nS2ZQsDg9raM0IlZzLmI2u+7ZapXBwdoeBUKAYERPDDIc0qNqA8E0Rp2D+gspKR7BgIFP52GeujaGXWeQ==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "minimatch": "^3.0.2" + } + }, + "walk-sync": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/walk-sync/-/walk-sync-2.0.2.tgz", + "integrity": "sha512-dCZkrxfHjPn7tIvdYrX3uMD/R0beVrHpA8lROQ5wWrl8psJgR6xwCkwqTFes0dNujbS2o/ITpvSYgIFsLsf13A==", + "dev": true, + "requires": { + "@types/minimatch": "^3.0.3", + "ensure-posix-path": "^1.1.0", + "matcher-collection": "^2.0.0" + } + } + } + }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -10562,9 +10363,9 @@ } }, "regenerator-runtime": { - "version": "0.13.3", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", - "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==" + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.4.tgz", + "integrity": "sha512-plpwicqEzfEyTQohIKktWigcLzmNStMGwbOUbykx51/29Z3JOGYldaaNGK7ngNXV+UcoqvIMmloZ48Sr74sd+g==" }, "regenerator-transform": { "version": "0.14.2", @@ -10617,9 +10418,9 @@ "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==" }, "regjsparser": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.3.tgz", - "integrity": "sha512-8uZvYbnfAtEm9Ab8NTb3hdLwL4g/LQzEYP7Xs27T96abJCCE2d6r3cPZPQEsLKy0vRSGVNG+/zVGtLr86HQduA==", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "requires": { "jsesc": "~0.5.0" }, @@ -10640,10 +10441,9 @@ } }, "request": { - "version": "2.88.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", - "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", - "dev": true, + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", "requires": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -10652,7 +10452,7 @@ "extend": "~3.0.2", "forever-agent": "~0.6.1", "form-data": "~2.3.2", - "har-validator": "~5.1.0", + "har-validator": "~5.1.3", "http-signature": "~1.2.0", "is-typedarray": "~1.0.0", "isstream": "~0.1.2", @@ -10662,25 +10462,28 @@ "performance-now": "^2.1.0", "qs": "~6.5.2", "safe-buffer": "^5.1.2", - "tough-cookie": "~2.4.3", + "tough-cookie": "~2.5.0", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" }, "dependencies": { + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, "qs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==", - "dev": true + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" }, "tough-cookie": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", - "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", - "dev": true, + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", "requires": { - "psl": "^1.1.24", - "punycode": "^1.4.1" + "psl": "^1.1.28", + "punycode": "^2.1.1" } } } @@ -10847,9 +10650,9 @@ "integrity": "sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA==" }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.0.tgz", + "integrity": "sha512-xJTbh/d7Lm7SBhc1tNvTpeCHaEzoyxPrqNlvSdMfBTYwaY++UJFyXUOxAtsRUXjlqOfj8luNaR9vjCh4KeV+pg==", "requires": { "is-promise": "^2.1.0" } @@ -11290,9 +11093,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.5.0.tgz", - "integrity": "sha512-gSz026xs2LfxBPudDuI41V1lka8cxg64E66SGe78zJlsUofOg/yqwezdIcdfwik6B4h8LFmWPA9ef9X3FiNFLA==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -11780,9 +11583,9 @@ } }, "tslib": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", - "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==" + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" }, "tsutils": { "version": "3.17.1", diff --git a/package.json b/package.json index 769915ab..674217b0 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@ember/test-helpers": "1.7.1", "@glimmer/di": "^0.2.1", "@glimmer/resolver": "^0.4.3", + "@typescript-eslint/parser": "2.23.0", "ava": "^3.5.0", "cors": "^2.8.5", "ember-cli-fastboot": "2.2.1", @@ -52,10 +53,10 @@ "mber-head": "^0.1.0", "morgan": "^1.9.1", "qunit": "2.9.3", + "qunit-dom": "^1.1.0", "strip-ansi": "^6.0.0", - "whatwg-fetch": "^3.0.0", - "@typescript-eslint/parser": "2.23.0", - "typescript": "^3.8.3" + "typescript": "^3.8.3", + "whatwg-fetch": "^3.0.0" }, "repository": { "type": "git", diff --git a/scripts/build-test-support.js b/scripts/build-test-support.js index 1a5e5bd4..4c5f0122 100644 --- a/scripts/build-test-support.js +++ b/scripts/build-test-support.js @@ -6,6 +6,7 @@ import Console from '../lib/utils/console.js'; import countTime from '../lib/utils/count-time.js'; import findProjectRoot from '../lib/utils/find-project-root.js'; import importAddonFolderToAMD from '../lib/transpilers/import-addon-folder-to-amd.js'; +import transpileNPMImports from '../lib/transpilers/transpile-npm-imports.js'; import { formatTimePassed, formatSize } from '../lib/utils/asset-reporter.js'; const compileScssAsync = promisify(sass.render); @@ -80,6 +81,7 @@ function buildTestVendorJS() { fs.readFile(`${MODULE_PATH}/@ember/test-helpers/vendor/monkey-patches.js`), fs.readFile(`${MODULE_PATH}/qunit/qunit/qunit.js`), fs.readFile(`${MODULE_PATH}/ember-qunit/vendor/ember-qunit/qunit-configuration.js`), + transpileNPMImports('qunit-dom', 'node_modules/qunit-dom/dist/qunit-dom.js', { transpile: false }), importAddonFolderToAMD('ember-test-waiters', 'ember-test-waiters/addon'), importAddonFolderToAMD( '@ember/test-helpers', diff --git a/scripts/global-jquery.js b/scripts/global-jquery.js deleted file mode 100755 index 764afbab..00000000 --- a/scripts/global-jquery.js +++ /dev/null @@ -1,35 +0,0 @@ -require('@babel/polyfill'); - -const rollup = require('rollup'); - -import virtual from 'rollup-plugin-virtual'; -import resolve from 'rollup-plugin-node-resolve'; -import commonjs from 'rollup-plugin-commonjs'; - -const build = async () => { - const bundle = await rollup.rollup({ - input: 'jquery.js', - plugins: [ - virtual({ - 'jquery.js': ` - import $ from 'jquery'; - - window.$ = window.jQuery = $ - - export default $; - ` - }), - resolve(), - commonjs() - ] - }); - - await bundle.write({ - format: 'iife', - name: 'jQuery', - file: './vendor/jquery.js', - sourcemap: true - }); -} - -build(); diff --git a/vendor/memserver.js b/vendor/memserver.js index 0321e352..9344360a 100644 --- a/vendor/memserver.js +++ b/vendor/memserver.js @@ -810,6 +810,12 @@ function from (value, encodingOrOffset, length) { return fromArrayBuffer(value, encodingOrOffset, length) } + if (typeof SharedArrayBuffer !== 'undefined' && + (isInstance(value, SharedArrayBuffer) || + (value && isInstance(value.buffer, SharedArrayBuffer)))) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + if (typeof value === 'number') { throw new TypeError( 'The "value" argument must not be of type number. Received type number' @@ -8682,6 +8688,12 @@ function from (value, encodingOrOffset, length) { return fromArrayBuffer(value, encodingOrOffset, length) } + if (typeof SharedArrayBuffer !== 'undefined' && + (isInstance(value, SharedArrayBuffer) || + (value && isInstance(value.buffer, SharedArrayBuffer)))) { + return fromArrayBuffer(value, encodingOrOffset, length) + } + if (typeof value === 'number') { throw new TypeError( 'The "value" argument must not be of type number. Received type number' diff --git a/vendor/test-support.js b/vendor/test-support.js index 43896a29..e8271fdb 100644 --- a/vendor/test-support.js +++ b/vendor/test-support.js @@ -9333,6 +9333,1395 @@ define("ember-testing/lib/test/waiters", ["exports"], function (_exports) { QUnit.config.testTimeout = QUnit.urlParams.devmode ? null : 60000; //Default Test Timeout 60 Seconds })(); + + ;(function() { + function vendorModule() { + 'use strict'; + + (function () { + 'use strict'; + + function exists(options, message) { + var expectedCount = null; + if (typeof options === 'string') { + message = options; + } + else if (options) { + expectedCount = options.count; + } + var elements = this.findElements(); + if (expectedCount === null) { + var result = elements.length > 0; + var expected = format(this.targetDescription); + var actual = result ? expected : format(this.targetDescription, 0); + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else if (typeof expectedCount === 'number') { + var result = elements.length === expectedCount; + var actual = format(this.targetDescription, elements.length); + var expected = format(this.targetDescription, expectedCount); + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else { + throw new TypeError("Unexpected Parameter: " + expectedCount); + } + } + function format(selector, num) { + if (num === undefined || num === null) { + return "Element " + selector + " exists"; + } + else if (num === 0) { + return "Element " + selector + " does not exist"; + } + else if (num === 1) { + return "Element " + selector + " exists once"; + } + else if (num === 2) { + return "Element " + selector + " exists twice"; + } + else { + return "Element " + selector + " exists " + num + " times"; + } + } + + // imported from https://github.com/nathanboktae/chai-dom + function elementToString(el) { + if (!el) + return ''; + var desc; + if (el instanceof NodeList) { + if (el.length === 0) { + return 'empty NodeList'; + } + desc = Array.prototype.slice + .call(el, 0, 5) + .map(elementToString) + .join(', '); + return el.length > 5 ? desc + "... (+" + (el.length - 5) + " more)" : desc; + } + if (!(el instanceof HTMLElement || el instanceof SVGElement)) { + return String(el); + } + desc = el.tagName.toLowerCase(); + if (el.id) { + desc += "#" + el.id; + } + if (el.className && !(el.className instanceof SVGAnimatedString)) { + desc += "." + String(el.className).replace(/\s+/g, '.'); + } + Array.prototype.forEach.call(el.attributes, function (attr) { + if (attr.name !== 'class' && attr.name !== 'id') { + desc += "[" + attr.name + (attr.value ? "=\"" + attr.value + "\"]" : ']'); + } + }); + return desc; + } + + function focused(message) { + var element = this.findTargetElement(); + if (!element) + return; + var result = document.activeElement === element; + var actual = elementToString(document.activeElement); + var expected = elementToString(this.target); + if (!message) { + message = "Element " + expected + " is focused"; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + + function notFocused(message) { + var element = this.findTargetElement(); + if (!element) + return; + var result = document.activeElement !== element; + var expected = "Element " + this.targetDescription + " is not focused"; + var actual = result ? expected : "Element " + this.targetDescription + " is focused"; + if (!message) { + message = expected; + } + this.pushResult({ result: result, message: message, actual: actual, expected: expected }); + } + + function checked(message) { + var element = this.findTargetElement(); + if (!element) + return; + var isChecked = element.checked === true; + var isNotChecked = element.checked === false; + var result = isChecked; + var hasCheckedProp = isChecked || isNotChecked; + if (!hasCheckedProp) { + var ariaChecked = element.getAttribute('aria-checked'); + if (ariaChecked !== null) { + result = ariaChecked === 'true'; + } + } + var actual = result ? 'checked' : 'not checked'; + var expected = 'checked'; + if (!message) { + message = "Element " + elementToString(this.target) + " is checked"; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + + function notChecked(message) { + var element = this.findTargetElement(); + if (!element) + return; + var isChecked = element.checked === true; + var isNotChecked = element.checked === false; + var result = !isChecked; + var hasCheckedProp = isChecked || isNotChecked; + if (!hasCheckedProp) { + var ariaChecked = element.getAttribute('aria-checked'); + if (ariaChecked !== null) { + result = ariaChecked !== 'true'; + } + } + var actual = result ? 'not checked' : 'checked'; + var expected = 'not checked'; + if (!message) { + message = "Element " + elementToString(this.target) + " is not checked"; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + + function required(message) { + var element = this.findTargetElement(); + if (!element) + return; + if (!(element instanceof HTMLInputElement || + element instanceof HTMLTextAreaElement || + element instanceof HTMLSelectElement)) { + throw new TypeError("Unexpected Element Type: " + element.toString()); + } + var result = element.required === true; + var actual = result ? 'required' : 'not required'; + var expected = 'required'; + if (!message) { + message = "Element " + elementToString(this.target) + " is required"; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + + function notRequired(message) { + var element = this.findTargetElement(); + if (!element) + return; + if (!(element instanceof HTMLInputElement || + element instanceof HTMLTextAreaElement || + element instanceof HTMLSelectElement)) { + throw new TypeError("Unexpected Element Type: " + element.toString()); + } + var result = element.required === false; + var actual = !result ? 'required' : 'not required'; + var expected = 'not required'; + if (!message) { + message = "Element " + elementToString(this.target) + " is not required"; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + + // Visible logic based on jQuery's + // https://github.com/jquery/jquery/blob/4a2bcc27f9c3ee24b3effac0fbe1285d1ee23cc5/src/css/hiddenVisibleSelectors.js#L11-L13 + function visible(el) { + if (el === null) + return false; + if (el.offsetWidth === 0 || el.offsetHeight === 0) + return false; + var clientRects = el.getClientRects(); + if (clientRects.length === 0) + return false; + for (var i = 0; i < clientRects.length; i++) { + var rect = clientRects[i]; + if (rect.width !== 0 && rect.height !== 0) + return true; + } + return false; + } + + function isVisible(options, message) { + var expectedCount = null; + if (typeof options === 'string') { + message = options; + } + else if (options) { + expectedCount = options.count; + } + var elements = this.findElements().filter(visible); + if (expectedCount === null) { + var result = elements.length > 0; + var expected = format$1(this.targetDescription); + var actual = result ? expected : format$1(this.targetDescription, 0); + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else if (typeof expectedCount === 'number') { + var result = elements.length === expectedCount; + var actual = format$1(this.targetDescription, elements.length); + var expected = format$1(this.targetDescription, expectedCount); + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else { + throw new TypeError("Unexpected Parameter: " + expectedCount); + } + } + function format$1(selector, num) { + if (num === undefined || num === null) { + return "Element " + selector + " is visible"; + } + else if (num === 0) { + return "Element " + selector + " is not visible"; + } + else if (num === 1) { + return "Element " + selector + " is visible once"; + } + else if (num === 2) { + return "Element " + selector + " is visible twice"; + } + else { + return "Element " + selector + " is visible " + num + " times"; + } + } + + function isDisabled(message, options) { + if (options === void 0) { options = {}; } + var inverted = options.inverted; + var element = this.findTargetElement(); + if (!element) + return; + if (!(element instanceof HTMLInputElement || + element instanceof HTMLTextAreaElement || + element instanceof HTMLSelectElement || + element instanceof HTMLButtonElement || + element instanceof HTMLOptGroupElement || + element instanceof HTMLOptionElement || + element instanceof HTMLFieldSetElement)) { + throw new TypeError("Unexpected Element Type: " + element.toString()); + } + var result = element.disabled === !inverted; + var actual = element.disabled === false + ? "Element " + this.targetDescription + " is not disabled" + : "Element " + this.targetDescription + " is disabled"; + var expected = inverted + ? "Element " + this.targetDescription + " is not disabled" + : "Element " + this.targetDescription + " is disabled"; + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + + function matchesSelector(elements, compareSelector) { + var failures = elements.filter(function (it) { return !it.matches(compareSelector); }); + return failures.length; + } + + function collapseWhitespace(string) { + return string + .replace(/[\t\r\n]/g, ' ') + .replace(/ +/g, ' ') + .replace(/^ /, '') + .replace(/ $/, ''); + } + + /** + * This function can be used to convert a NodeList to a regular array. + * We should be using `Array.from()` for this, but IE11 doesn't support that :( + * + * @private + */ + function toArray(list) { + return Array.prototype.slice.call(list); + } + + var DOMAssertions = /** @class */ (function () { + function DOMAssertions(target, rootElement, testContext) { + this.target = target; + this.rootElement = rootElement; + this.testContext = testContext; + } + /** + * Assert an {@link HTMLElement} (or multiple) matching the `selector` exists. + * + * @param {object?} options + * @param {number?} options.count + * @param {string?} message + * + * @example + * assert.dom('#title').exists(); + * assert.dom('.choice').exists({ count: 4 }); + * + * @see {@link #doesNotExist} + */ + DOMAssertions.prototype.exists = function (options, message) { + exists.call(this, options, message); + return this; + }; + /** + * Assert an {@link HTMLElement} matching the `selector` does not exists. + * + * @param {string?} message + * + * @example + * assert.dom('.should-not-exist').doesNotExist(); + * + * @see {@link #exists} + */ + DOMAssertions.prototype.doesNotExist = function (message) { + exists.call(this, { count: 0 }, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` is currently checked. + * + * Note: This also supports `aria-checked="true/false"`. + * + * @param {string?} message + * + * @example + * assert.dom('input.active').isChecked(); + * + * @see {@link #isNotChecked} + */ + DOMAssertions.prototype.isChecked = function (message) { + checked.call(this, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` is currently unchecked. + * + * Note: This also supports `aria-checked="true/false"`. + * + * @param {string?} message + * + * @example + * assert.dom('input.active').isNotChecked(); + * + * @see {@link #isChecked} + */ + DOMAssertions.prototype.isNotChecked = function (message) { + notChecked.call(this, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` is currently focused. + * + * @param {string?} message + * + * @example + * assert.dom('input.email').isFocused(); + * + * @see {@link #isNotFocused} + */ + DOMAssertions.prototype.isFocused = function (message) { + focused.call(this, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` is not currently focused. + * + * @param {string?} message + * + * @example + * assert.dom('input[type="password"]').isNotFocused(); + * + * @see {@link #isFocused} + */ + DOMAssertions.prototype.isNotFocused = function (message) { + notFocused.call(this, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` is currently required. + * + * @param {string?} message + * + * @example + * assert.dom('input[type="text"]').isRequired(); + * + * @see {@link #isNotRequired} + */ + DOMAssertions.prototype.isRequired = function (message) { + required.call(this, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` is currently not required. + * + * @param {string?} message + * + * @example + * assert.dom('input[type="text"]').isNotRequired(); + * + * @see {@link #isRequired} + */ + DOMAssertions.prototype.isNotRequired = function (message) { + notRequired.call(this, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` exists and is visible. + * + * Visibility is determined by asserting that: + * + * - the element's offsetWidth and offsetHeight are non-zero + * - any of the element's DOMRect objects have a non-zero size + * + * Additionally, visibility in this case means that the element is visible on the page, + * but not necessarily in the viewport. + * + * @param {object?} options + * @param {number?} options.count + * @param {string?} message + * + * @example + * assert.dom('#title').isVisible(); + * assert.dom('.choice').isVisible({ count: 4 }); + * + * @see {@link #isNotVisible} + */ + DOMAssertions.prototype.isVisible = function (options, message) { + isVisible.call(this, options, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` does not exist or is not visible on the page. + * + * Visibility is determined by asserting that: + * + * - the element's offsetWidth or offsetHeight are zero + * - all of the element's DOMRect objects have a size of zero + * + * Additionally, visibility in this case means that the element is visible on the page, + * but not necessarily in the viewport. + * + * @param {string?} message + * + * @example + * assert.dom('.foo').isNotVisible(); + * + * @see {@link #isVisible} + */ + DOMAssertions.prototype.isNotVisible = function (message) { + isVisible.call(this, { count: 0 }, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} has an attribute with the provided `name` + * and optionally checks if the attribute `value` matches the provided text + * or regular expression. + * + * @param {string} name + * @param {string|RegExp|object?} value + * @param {string?} message + * + * @example + * assert.dom('input.password-input').hasAttribute('type', 'password'); + * + * @see {@link #doesNotHaveAttribute} + */ + DOMAssertions.prototype.hasAttribute = function (name, value, message) { + var element = this.findTargetElement(); + if (!element) + return this; + if (arguments.length === 1) { + value = { any: true }; + } + var actualValue = element.getAttribute(name); + if (value instanceof RegExp) { + var result = value.test(actualValue); + var expected = "Element " + this.targetDescription + " has attribute \"" + name + "\" with value matching " + value; + var actual = actualValue === null + ? "Element " + this.targetDescription + " does not have attribute \"" + name + "\"" + : "Element " + this.targetDescription + " has attribute \"" + name + "\" with value " + JSON.stringify(actualValue); + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else if (value.any === true) { + var result = actualValue !== null; + var expected = "Element " + this.targetDescription + " has attribute \"" + name + "\""; + var actual = result + ? expected + : "Element " + this.targetDescription + " does not have attribute \"" + name + "\""; + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else { + var result = value === actualValue; + var expected = "Element " + this.targetDescription + " has attribute \"" + name + "\" with value " + JSON.stringify(value); + var actual = actualValue === null + ? "Element " + this.targetDescription + " does not have attribute \"" + name + "\"" + : "Element " + this.targetDescription + " has attribute \"" + name + "\" with value " + JSON.stringify(actualValue); + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + return this; + }; + /** + * Assert that the {@link HTMLElement} has no attribute with the provided `name`. + * + * **Aliases:** `hasNoAttribute`, `lacksAttribute` + * + * @param {string} name + * @param {string?} message + * + * @example + * assert.dom('input.username').hasNoAttribute('disabled'); + * + * @see {@link #hasAttribute} + */ + DOMAssertions.prototype.doesNotHaveAttribute = function (name, message) { + var element = this.findTargetElement(); + if (!element) + return; + var result = !element.hasAttribute(name); + var expected = "Element " + this.targetDescription + " does not have attribute \"" + name + "\""; + var actual = expected; + if (!result) { + var value = element.getAttribute(name); + actual = "Element " + this.targetDescription + " has attribute \"" + name + "\" with value " + JSON.stringify(value); + } + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + return this; + }; + DOMAssertions.prototype.hasNoAttribute = function (name, message) { + return this.doesNotHaveAttribute(name, message); + }; + DOMAssertions.prototype.lacksAttribute = function (name, message) { + return this.doesNotHaveAttribute(name, message); + }; + /** + * Assert that the {@link HTMLElement} has a property with the provided `name` + * and checks if the property `value` matches the provided text or regular + * expression. + * + * @param {string} name + * @param {string|RegExp} value + * @param {string?} message + * + * @example + * assert.dom('input.password-input').hasProperty('type', 'password'); + * + * @see {@link #doesNotHaveProperty} + */ + DOMAssertions.prototype.hasProperty = function (name, value, message) { + var element = this.findTargetElement(); + if (!element) + return this; + var description = this.targetDescription; + var actualValue = element[name]; + if (value instanceof RegExp) { + var result = value.test(String(actualValue)); + var expected = "Element " + description + " has property \"" + name + "\" with value matching " + value; + var actual = "Element " + description + " has property \"" + name + "\" with value " + JSON.stringify(actualValue); + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else { + var result = value === actualValue; + var expected = "Element " + description + " has property \"" + name + "\" with value " + JSON.stringify(value); + var actual = "Element " + description + " has property \"" + name + "\" with value " + JSON.stringify(actualValue); + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` is disabled. + * + * @param {string?} message + * + * @example + * assert.dom('.foo').isDisabled(); + * + * @see {@link #isNotDisabled} + */ + DOMAssertions.prototype.isDisabled = function (message) { + isDisabled.call(this, message); + return this; + }; + /** + * Assert that the {@link HTMLElement} or an {@link HTMLElement} matching the + * `selector` is not disabled. + * + * @param {string?} message + * + * @example + * assert.dom('.foo').isNotDisabled(); + * + * @see {@link #isDisabled} + */ + DOMAssertions.prototype.isNotDisabled = function (message) { + isDisabled.call(this, message, { inverted: true }); + return this; + }; + /** + * Assert that the {@link HTMLElement} has the `expected` CSS class using + * [`classList`](https://developer.mozilla.org/en-US/docs/Web/API/Element/classList). + * + * `expected` can also be a regular expression, and the assertion will return + * true if any of the element's CSS classes match. + * + * @param {string|RegExp} expected + * @param {string?} message + * + * @example + * assert.dom('input[type="password"]').hasClass('secret-password-input'); + * + * @example + * assert.dom('input[type="password"]').hasClass(/.*password-input/); + * + * @see {@link #doesNotHaveClass} + */ + DOMAssertions.prototype.hasClass = function (expected, message) { + var element = this.findTargetElement(); + if (!element) + return this; + var actual = element.classList.toString(); + if (expected instanceof RegExp) { + var classNames = Array.prototype.slice.call(element.classList); + var result = classNames.some(function (className) { + return expected.test(className); + }); + if (!message) { + message = "Element " + this.targetDescription + " has CSS class matching " + expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else { + var result = element.classList.contains(expected); + if (!message) { + message = "Element " + this.targetDescription + " has CSS class \"" + expected + "\""; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + return this; + }; + /** + * Assert that the {@link HTMLElement} does not have the `expected` CSS class using + * [`classList`](https://developer.mozilla.org/en-US/docs/Web/API/Element/classList). + * + * `expected` can also be a regular expression, and the assertion will return + * true if none of the element's CSS classes match. + * + * **Aliases:** `hasNoClass`, `lacksClass` + * + * @param {string|RegExp} expected + * @param {string?} message + * + * @example + * assert.dom('input[type="password"]').doesNotHaveClass('username-input'); + * + * @example + * assert.dom('input[type="password"]').doesNotHaveClass(/username-.*-input/); + * + * @see {@link #hasClass} + */ + DOMAssertions.prototype.doesNotHaveClass = function (expected, message) { + var element = this.findTargetElement(); + if (!element) + return this; + var actual = element.classList.toString(); + if (expected instanceof RegExp) { + var classNames = Array.prototype.slice.call(element.classList); + var result = classNames.every(function (className) { + return !expected.test(className); + }); + if (!message) { + message = "Element " + this.targetDescription + " does not have CSS class matching " + expected; + } + this.pushResult({ result: result, actual: actual, expected: "not: " + expected, message: message }); + } + else { + var result = !element.classList.contains(expected); + if (!message) { + message = "Element " + this.targetDescription + " does not have CSS class \"" + expected + "\""; + } + this.pushResult({ result: result, actual: actual, expected: "not: " + expected, message: message }); + } + return this; + }; + DOMAssertions.prototype.hasNoClass = function (expected, message) { + return this.doesNotHaveClass(expected, message); + }; + DOMAssertions.prototype.lacksClass = function (expected, message) { + return this.doesNotHaveClass(expected, message); + }; + /** + * Assert that the [HTMLElement][] has the `expected` style declarations using + * [`window.getComputedStyle`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle). + * + * @name hasStyle + * @param {object} expected + * @param {string?} message + * + * @example + * assert.dom('.progress-bar').hasStyle({ + * opacity: 1, + * display: 'block' + * }); + * + * @see {@link #hasClass} + */ + DOMAssertions.prototype.hasStyle = function (expected, message) { + return this.hasPseudoElementStyle(null, expected, message); + }; + /** + * Assert that the pseudo element for `selector` of the [HTMLElement][] has the `expected` style declarations using + * [`window.getComputedStyle`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle). + * + * @name hasPseudoElementStyle + * @param {string} selector + * @param {object} expected + * @param {string?} message + * + * @example + * assert.dom('.progress-bar').hasPseudoElementStyle(':after', { + * content: '";"', + * }); + * + * @see {@link #hasClass} + */ + DOMAssertions.prototype.hasPseudoElementStyle = function (selector, expected, message) { + var element = this.findTargetElement(); + if (!element) + return this; + var computedStyle = window.getComputedStyle(element, selector); + var expectedProperties = Object.keys(expected); + if (expectedProperties.length <= 0) { + throw new TypeError("Missing style expectations. There must be at least one style property in the passed in expectation object."); + } + var result = expectedProperties.every(function (property) { return computedStyle[property] === expected[property]; }); + var actual = {}; + expectedProperties.forEach(function (property) { return (actual[property] = computedStyle[property]); }); + if (!message) { + var normalizedSelector = selector ? selector.replace(/^:{0,2}/, '::') : ''; + message = "Element " + this.targetDescription + normalizedSelector + " has style \"" + JSON.stringify(expected) + "\""; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + return this; + }; + /** + * Assert that the [HTMLElement][] does not have the `expected` style declarations using + * [`window.getComputedStyle`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle). + * + * @name doesNotHaveStyle + * @param {object} expected + * @param {string?} message + * + * @example + * assert.dom('.progress-bar').doesNotHaveStyle({ + * opacity: 1, + * display: 'block' + * }); + * + * @see {@link #hasClass} + */ + DOMAssertions.prototype.doesNotHaveStyle = function (expected, message) { + return this.doesNotHavePseudoElementStyle(null, expected, message); + }; + /** + * Assert that the pseudo element for `selector` of the [HTMLElement][] does not have the `expected` style declarations using + * [`window.getComputedStyle`](https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle). + * + * @name doesNotHavePseudoElementStyle + * @param {string} selector + * @param {object} expected + * @param {string?} message + * + * @example + * assert.dom('.progress-bar').doesNotHavePseudoElementStyle(':after', { + * content: '";"', + * }); + * + * @see {@link #hasClass} + */ + DOMAssertions.prototype.doesNotHavePseudoElementStyle = function (selector, expected, message) { + var element = this.findTargetElement(); + if (!element) + return this; + var computedStyle = window.getComputedStyle(element, selector); + var expectedProperties = Object.keys(expected); + if (expectedProperties.length <= 0) { + throw new TypeError("Missing style expectations. There must be at least one style property in the passed in expectation object."); + } + var result = expectedProperties.some(function (property) { return computedStyle[property] !== expected[property]; }); + var actual = {}; + expectedProperties.forEach(function (property) { return (actual[property] = computedStyle[property]); }); + if (!message) { + var normalizedSelector = selector ? selector.replace(/^:{0,2}/, '::') : ''; + message = "Element " + this.targetDescription + normalizedSelector + " does not have style \"" + JSON.stringify(expected) + "\""; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + return this; + }; + /** + * Assert that the text of the {@link HTMLElement} or an {@link HTMLElement} + * matching the `selector` matches the `expected` text, using the + * [`textContent`](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) + * attribute and stripping/collapsing whitespace. + * + * `expected` can also be a regular expression. + * + * > Note: This assertion will collapse whitespace if the type you pass in is a string. + * > If you are testing specifically for whitespace integrity, pass your expected text + * > in as a RegEx pattern. + * + * **Aliases:** `matchesText` + * + * @param {string|RegExp} expected + * @param {string?} message + * + * @example + * //

+ * // Welcome to QUnit + * //

+ * + * assert.dom('#title').hasText('Welcome to QUnit'); + * + * @example + * assert.dom('.foo').hasText(/[12]\d{3}/); + * + * @see {@link #includesText} + */ + DOMAssertions.prototype.hasText = function (expected, message) { + var element = this.findTargetElement(); + if (!element) + return this; + if (expected instanceof RegExp) { + var result = expected.test(element.textContent); + var actual = element.textContent; + if (!message) { + message = "Element " + this.targetDescription + " has text matching " + expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else if (expected.any === true) { + var result = Boolean(element.textContent); + var expected_1 = "Element " + this.targetDescription + " has a text"; + var actual = result ? expected_1 : "Element " + this.targetDescription + " has no text"; + if (!message) { + message = expected_1; + } + this.pushResult({ result: result, actual: actual, expected: expected_1, message: message }); + } + else if (typeof expected === 'string') { + expected = collapseWhitespace(expected); + var actual = collapseWhitespace(element.textContent); + var result = actual === expected; + if (!message) { + message = "Element " + this.targetDescription + " has text \"" + expected + "\""; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else { + throw new TypeError("You must pass a string or Regular Expression to \"hasText\". You passed " + expected + "."); + } + return this; + }; + DOMAssertions.prototype.matchesText = function (expected, message) { + return this.hasText(expected, message); + }; + /** + * Assert that the `textContent` property of an {@link HTMLElement} is not empty. + * + * @param {string?} message + * + * @example + * assert.dom('button.share').hasAnyText(); + * + * @see {@link #hasText} + */ + DOMAssertions.prototype.hasAnyText = function (message) { + return this.hasText({ any: true }, message); + }; + /** + * Assert that the `textContent` property of an {@link HTMLElement} is empty. + * + * @param {string?} message + * + * @example + * assert.dom('div').hasNoText(); + * + * @see {@link #hasNoText} + */ + DOMAssertions.prototype.hasNoText = function (message) { + return this.hasText('', message); + }; + /** + * Assert that the text of the {@link HTMLElement} or an {@link HTMLElement} + * matching the `selector` contains the given `text`, using the + * [`textContent`](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) + * attribute. + * + * > Note: This assertion will collapse whitespace in `textContent` before searching. + * > If you would like to assert on a string that *should* contain line breaks, tabs, + * > more than one space in a row, or starting/ending whitespace, use the {@link #hasText} + * > selector and pass your expected text in as a RegEx pattern. + * + * **Aliases:** `containsText`, `hasTextContaining` + * + * @param {string} text + * @param {string?} message + * + * @example + * assert.dom('#title').includesText('Welcome'); + * + * @see {@link #hasText} + */ + DOMAssertions.prototype.includesText = function (text, message) { + var element = this.findTargetElement(); + if (!element) + return this; + var collapsedText = collapseWhitespace(element.textContent); + var result = collapsedText.indexOf(text) !== -1; + var actual = collapsedText; + var expected = text; + if (!message) { + message = "Element " + this.targetDescription + " has text containing \"" + text + "\""; + } + if (!result && text !== collapseWhitespace(text)) { + console.warn('The `.includesText()`, `.containsText()`, and `.hasTextContaining()` assertions collapse whitespace. The text you are checking for contains whitespace that may have made your test fail incorrectly. Try the `.hasText()` assertion passing in your expected text as a RegExp pattern. Your text:\n' + + text); + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + return this; + }; + DOMAssertions.prototype.containsText = function (expected, message) { + return this.includesText(expected, message); + }; + DOMAssertions.prototype.hasTextContaining = function (expected, message) { + return this.includesText(expected, message); + }; + /** + * Assert that the text of the {@link HTMLElement} or an {@link HTMLElement} + * matching the `selector` does not include the given `text`, using the + * [`textContent`](https://developer.mozilla.org/en-US/docs/Web/API/Node/textContent) + * attribute. + * + * **Aliases:** `doesNotContainText`, `doesNotHaveTextContaining` + * + * @param {string} text + * @param {string?} message + * + * @example + * assert.dom('#title').doesNotIncludeText('Welcome'); + */ + DOMAssertions.prototype.doesNotIncludeText = function (text, message) { + var element = this.findTargetElement(); + if (!element) + return this; + var collapsedText = collapseWhitespace(element.textContent); + var result = collapsedText.indexOf(text) === -1; + var expected = "Element " + this.targetDescription + " does not include text \"" + text + "\""; + var actual = expected; + if (!result) { + actual = "Element " + this.targetDescription + " includes text \"" + text + "\""; + } + if (!message) { + message = expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + return this; + }; + DOMAssertions.prototype.doesNotContainText = function (unexpected, message) { + return this.doesNotIncludeText(unexpected, message); + }; + DOMAssertions.prototype.doesNotHaveTextContaining = function (unexpected, message) { + return this.doesNotIncludeText(unexpected, message); + }; + /** + * Assert that the `value` property of an {@link HTMLInputElement} matches + * the `expected` text or regular expression. + * + * If no `expected` value is provided, the assertion will fail if the + * `value` is an empty string. + * + * @param {string|RegExp|object?} expected + * @param {string?} message + * + * @example + * assert.dom('input.username').hasValue('HSimpson'); + + * @see {@link #hasAnyValue} + * @see {@link #hasNoValue} + */ + DOMAssertions.prototype.hasValue = function (expected, message) { + var element = this.findTargetElement(); + if (!element) + return this; + if (arguments.length === 0) { + expected = { any: true }; + } + var value = element.value; + if (expected instanceof RegExp) { + var result = expected.test(value); + var actual = value; + if (!message) { + message = "Element " + this.targetDescription + " has value matching " + expected; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + else if (expected.any === true) { + var result = Boolean(value); + var expected_2 = "Element " + this.targetDescription + " has a value"; + var actual = result ? expected_2 : "Element " + this.targetDescription + " has no value"; + if (!message) { + message = expected_2; + } + this.pushResult({ result: result, actual: actual, expected: expected_2, message: message }); + } + else { + var actual = value; + var result = actual === expected; + if (!message) { + message = "Element " + this.targetDescription + " has value \"" + expected + "\""; + } + this.pushResult({ result: result, actual: actual, expected: expected, message: message }); + } + return this; + }; + /** + * Assert that the `value` property of an {@link HTMLInputElement} is not empty. + * + * @param {string?} message + * + * @example + * assert.dom('input.username').hasAnyValue(); + * + * @see {@link #hasValue} + * @see {@link #hasNoValue} + */ + DOMAssertions.prototype.hasAnyValue = function (message) { + return this.hasValue({ any: true }, message); + }; + /** + * Assert that the `value` property of an {@link HTMLInputElement} is empty. + * + * **Aliases:** `lacksValue` + * + * @param {string?} message + * + * @example + * assert.dom('input.username').hasNoValue(); + * + * @see {@link #hasValue} + * @see {@link #hasAnyValue} + */ + DOMAssertions.prototype.hasNoValue = function (message) { + return this.hasValue('', message); + }; + DOMAssertions.prototype.lacksValue = function (message) { + return this.hasNoValue(message); + }; + /** + * Assert that the target selector selects only Elements that are also selected by + * compareSelector. + * + * @param {string} compareSelector + * @param {string?} message + * + * @example + * assert.dom('p.red').matchesSelector('div.wrapper p:last-child') + */ + DOMAssertions.prototype.matchesSelector = function (compareSelector, message) { + var targetElements = this.target instanceof Element ? [this.target] : this.findElements(); + var targets = targetElements.length; + var matchFailures = matchesSelector(targetElements, compareSelector); + var singleElement = targets === 1; + var selectedByPart = this.target instanceof Element ? 'passed' : "selected by " + this.target; + var actual; + var expected; + if (matchFailures === 0) { + // no failures matching. + if (!message) { + message = singleElement + ? "The element " + selectedByPart + " also matches the selector " + compareSelector + "." + : targets + " elements, selected by " + this.target + ", also match the selector " + compareSelector + "."; + } + actual = expected = message; + this.pushResult({ result: true, actual: actual, expected: expected, message: message }); + } + else { + var difference = targets - matchFailures; + // there were failures when matching. + if (!message) { + message = singleElement + ? "The element " + selectedByPart + " did not also match the selector " + compareSelector + "." + : matchFailures + " out of " + targets + " elements selected by " + this.target + " did not also match the selector " + compareSelector + "."; + } + actual = singleElement ? message : difference + " elements matched " + compareSelector + "."; + expected = singleElement + ? "The element should have matched " + compareSelector + "." + : targets + " elements should have matched " + compareSelector + "."; + this.pushResult({ result: false, actual: actual, expected: expected, message: message }); + } + return this; + }; + /** + * Assert that the target selector selects only Elements that are not also selected by + * compareSelector. + * + * @param {string} compareSelector + * @param {string?} message + * + * @example + * assert.dom('input').doesNotMatchSelector('input[disabled]') + */ + DOMAssertions.prototype.doesNotMatchSelector = function (compareSelector, message) { + var targetElements = this.target instanceof Element ? [this.target] : this.findElements(); + var targets = targetElements.length; + var matchFailures = matchesSelector(targetElements, compareSelector); + var singleElement = targets === 1; + var selectedByPart = this.target instanceof Element ? 'passed' : "selected by " + this.target; + var actual; + var expected; + if (matchFailures === targets) { + // the assertion is successful because no element matched the other selector. + if (!message) { + message = singleElement + ? "The element " + selectedByPart + " did not also match the selector " + compareSelector + "." + : targets + " elements, selected by " + this.target + ", did not also match the selector " + compareSelector + "."; + } + actual = expected = message; + this.pushResult({ result: true, actual: actual, expected: expected, message: message }); + } + else { + var difference = targets - matchFailures; + // the assertion fails because at least one element matched the other selector. + if (!message) { + message = singleElement + ? "The element " + selectedByPart + " must not also match the selector " + compareSelector + "." + : difference + " elements out of " + targets + ", selected by " + this.target + ", must not also match the selector " + compareSelector + "."; + } + actual = singleElement + ? "The element " + selectedByPart + " matched " + compareSelector + "." + : matchFailures + " elements did not match " + compareSelector + "."; + expected = singleElement + ? message + : targets + " elements should not have matched " + compareSelector + "."; + this.pushResult({ result: false, actual: actual, expected: expected, message: message }); + } + return this; + }; + /** + * Assert that the tagName of the {@link HTMLElement} or an {@link HTMLElement} + * matching the `selector` matches the `expected` tagName, using the + * [`tagName`](https://developer.mozilla.org/en-US/docs/Web/API/Element/tagName) + * property of the {@link HTMLElement}. + * + * @param {string} expected + * @param {string?} message + * + * @example + * //

+ * // Title + * //

+ * + * assert.dom('#title').hasTagName('h1'); + */ + DOMAssertions.prototype.hasTagName = function (tagName, message) { + var element = this.findTargetElement(); + var actual; + var expected; + if (!element) + return this; + if (typeof tagName !== 'string') { + throw new TypeError("You must pass a string to \"hasTagName\". You passed " + tagName + "."); + } + actual = element.tagName.toLowerCase(); + expected = tagName.toLowerCase(); + if (actual === expected) { + if (!message) { + message = "Element " + this.targetDescription + " has tagName " + expected; + } + this.pushResult({ result: true, actual: actual, expected: expected, message: message }); + } + else { + if (!message) { + message = "Element " + this.targetDescription + " does not have tagName " + expected; + } + this.pushResult({ result: false, actual: actual, expected: expected, message: message }); + } + return this; + }; + /** + * Assert that the tagName of the {@link HTMLElement} or an {@link HTMLElement} + * matching the `selector` does not match the `expected` tagName, using the + * [`tagName`](https://developer.mozilla.org/en-US/docs/Web/API/Element/tagName) + * property of the {@link HTMLElement}. + * + * @param {string} expected + * @param {string?} message + * + * @example + * //
+ * // Title + * //
+ * + * assert.dom('section#block').doesNotHaveTagName('div'); + */ + DOMAssertions.prototype.doesNotHaveTagName = function (tagName, message) { + var element = this.findTargetElement(); + var actual; + var expected; + if (!element) + return this; + if (typeof tagName !== 'string') { + throw new TypeError("You must pass a string to \"doesNotHaveTagName\". You passed " + tagName + "."); + } + actual = element.tagName.toLowerCase(); + expected = tagName.toLowerCase(); + if (actual !== expected) { + if (!message) { + message = "Element " + this.targetDescription + " does not have tagName " + expected; + } + this.pushResult({ result: true, actual: actual, expected: expected, message: message }); + } + else { + if (!message) { + message = "Element " + this.targetDescription + " has tagName " + expected; + } + this.pushResult({ result: false, actual: actual, expected: expected, message: message }); + } + return this; + }; + /** + * @private + */ + DOMAssertions.prototype.pushResult = function (result) { + this.testContext.pushResult(result); + }; + /** + * Finds a valid HTMLElement from target, or pushes a failing assertion if a valid + * element is not found. + * @private + * @returns (HTMLElement|null) a valid HTMLElement, or null + */ + DOMAssertions.prototype.findTargetElement = function () { + var el = this.findElement(); + if (el === null) { + var message = "Element " + (this.target || '') + " should exist"; + this.pushResult({ message: message, result: false, actual: undefined, expected: undefined }); + return null; + } + return el; + }; + /** + * Finds a valid HTMLElement from target + * @private + * @returns (HTMLElement|null) a valid HTMLElement, or null + * @throws TypeError will be thrown if target is an unrecognized type + */ + DOMAssertions.prototype.findElement = function () { + if (this.target === null) { + return null; + } + else if (typeof this.target === 'string') { + return this.rootElement.querySelector(this.target); + } + else if (this.target instanceof Element) { + return this.target; + } + else { + throw new TypeError("Unexpected Parameter: " + this.target); + } + }; + /** + * Finds a collection of Element instances from target using querySelectorAll + * @private + * @returns (Element[]) an array of Element instances + * @throws TypeError will be thrown if target is an unrecognized type + */ + DOMAssertions.prototype.findElements = function () { + if (this.target === null) { + return []; + } + else if (typeof this.target === 'string') { + return toArray(this.rootElement.querySelectorAll(this.target)); + } + else if (this.target instanceof Element) { + return [this.target]; + } + else { + throw new TypeError("Unexpected Parameter: " + this.target); + } + }; + Object.defineProperty(DOMAssertions.prototype, "targetDescription", { + /** + * @private + */ + get: function () { + return elementToString(this.target); + }, + enumerable: true, + configurable: true + }); + return DOMAssertions; + }()); + + /* global QUnit */ + QUnit.assert.dom = function (target, rootElement) { + if (!isValidRootElement(rootElement)) { + throw new Error(rootElement + " is not a valid root element"); + } + rootElement = rootElement || this.dom.rootElement || document; + return new DOMAssertions(target || rootElement, rootElement, this); + }; + function isValidRootElement(element) { + return (!element || + (typeof element === 'object' && + typeof element.querySelector === 'function' && + typeof element.querySelectorAll === 'function')); + } + +}()); +//# sourceMappingURL=qunit-dom.js.map + + + + return window['qunit-dom']; + + } + + define('qunit-dom', [], vendorModule); + })(); + define("ember-test-waiters/build-waiter", ["exports", "ember-test-waiters/token", "ember-test-waiters/waiter-manager"], function (_exports, _token, _waiterManager) { "use strict";