From 548bca4b28c6d8aeb638490eaf5c94a9929e880e Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Tue, 2 May 2023 11:11:34 -0400 Subject: [PATCH 1/5] Extract test-app in to own package so that we can properly test that the addon is correctly consumable when installed. --- .github/workflows/ci.yml | 6 +- addon/package.json | 2 +- .../tests/dummy/config/ember-cli-update.json | 21 - addon/tests/dummy/public/crossdomain.xml | 15 - addon/tests/helpers/destroy-app.js | 5 - addon/tests/helpers/module-for-acceptance.js | 26 - addon/tests/helpers/resolver.js | 18 - addon/tests/helpers/start-app.js | 15 - addon/tests/integration/setup-test-test.js | 5 - addon/tests/test-helper.js | 6 - package.json | 11 +- pnpm-lock.yaml | 1055 ++++++++++++++++- test-app/.editorconfig | 19 + test-app/.ember-cli | 15 + test-app/.eslintignore | 25 + test-app/.eslintrc.js | 56 + test-app/.gitignore | 32 + test-app/.npmignore | 40 + test-app/.prettierignore | 25 + test-app/.prettierrc.js | 12 + test-app/.template-lintrc.js | 5 + test-app/.watchmanconfig | 3 + test-app/README.md | 57 + {addon/tests/dummy => test-app}/app/app.js | 4 +- .../app/components/.gitkeep | 0 .../app/controllers/.gitkeep | 0 .../dummy => test-app}/app/helpers/.gitkeep | 0 .../tests/dummy => test-app}/app/index.html | 6 +- .../dummy => test-app}/app/models/.gitkeep | 0 .../tests/dummy => test-app}/app/resolver.js | 0 {addon/tests/dummy => test-app}/app/router.js | 2 +- .../dummy => test-app}/app/routes/.gitkeep | 0 .../dummy => test-app}/app/styles/app.css | 0 .../app/templates/application.hbs | 0 .../app/templates/components/.gitkeep | 0 {addon => test-app}/config/ember-try.js | 0 .../dummy => test-app}/config/environment.js | 3 +- .../config/optional-features.json | 0 .../dummy => test-app}/config/targets.js | 0 test-app/ember-cli-build.js | 36 + test-app/package.json | 78 ++ .../dummy => test-app}/public/robots.txt | 0 test-app/testem.js | 23 + .../tests/acceptance/basic-test.js | 76 +- test-app/tests/helpers/index.js | 42 + test-app/tests/helpers/resolver.js | 5 + {addon => test-app}/tests/index.html | 6 +- .../tests/integration/.gitkeep | 0 .../integration/setup-rendering-test-test.js | 20 +- test-app/tests/integration/setup-test-test.js | 50 + test-app/tests/test-helper.js | 12 + {addon => test-app}/tests/unit/.gitkeep | 0 .../tests/unit/adapter-test.js | 7 +- .../tests/unit/ember-testing-test.js | 2 +- .../setup-ember-onerror-validation-test.js | 0 .../unit/test-isolation-validation-test.js | 17 +- .../tests/unit/unhandled-rejection-test.js | 6 +- .../tests/unit/utils/patch-assert-helper.js | 0 test-app/types/index.d.ts | 272 +++++ test-app/types/local-types.d.ts | 2 + test-app/types/tsconfig.json | 11 + 61 files changed, 1944 insertions(+), 210 deletions(-) delete mode 100644 addon/tests/dummy/config/ember-cli-update.json delete mode 100644 addon/tests/dummy/public/crossdomain.xml delete mode 100644 addon/tests/helpers/destroy-app.js delete mode 100644 addon/tests/helpers/module-for-acceptance.js delete mode 100644 addon/tests/helpers/resolver.js delete mode 100644 addon/tests/helpers/start-app.js delete mode 100644 addon/tests/test-helper.js create mode 100644 test-app/.editorconfig create mode 100644 test-app/.ember-cli create mode 100644 test-app/.eslintignore create mode 100644 test-app/.eslintrc.js create mode 100644 test-app/.gitignore create mode 100644 test-app/.npmignore create mode 100644 test-app/.prettierignore create mode 100644 test-app/.prettierrc.js create mode 100644 test-app/.template-lintrc.js create mode 100644 test-app/.watchmanconfig create mode 100644 test-app/README.md rename {addon/tests/dummy => test-app}/app/app.js (77%) rename {addon/tests/dummy => test-app}/app/components/.gitkeep (100%) rename {addon/tests/dummy => test-app}/app/controllers/.gitkeep (100%) rename {addon/tests/dummy => test-app}/app/helpers/.gitkeep (100%) rename {addon/tests/dummy => test-app}/app/index.html (84%) rename {addon/tests/dummy => test-app}/app/models/.gitkeep (100%) rename {addon/tests/dummy => test-app}/app/resolver.js (100%) rename {addon/tests/dummy => test-app}/app/router.js (79%) rename {addon/tests/dummy => test-app}/app/routes/.gitkeep (100%) rename {addon/tests/dummy => test-app}/app/styles/app.css (100%) rename {addon/tests/dummy => test-app}/app/templates/application.hbs (100%) rename {addon/tests/dummy => test-app}/app/templates/components/.gitkeep (100%) rename {addon => test-app}/config/ember-try.js (100%) rename {addon/tests/dummy => test-app}/config/environment.js (94%) rename {addon/tests/dummy => test-app}/config/optional-features.json (100%) rename {addon/tests/dummy => test-app}/config/targets.js (100%) create mode 100644 test-app/ember-cli-build.js create mode 100644 test-app/package.json rename {addon/tests/dummy => test-app}/public/robots.txt (100%) create mode 100644 test-app/testem.js rename {addon => test-app}/tests/acceptance/basic-test.js (56%) create mode 100644 test-app/tests/helpers/index.js create mode 100644 test-app/tests/helpers/resolver.js rename {addon => test-app}/tests/index.html (86%) rename {addon => test-app}/tests/integration/.gitkeep (100%) rename {addon => test-app}/tests/integration/setup-rendering-test-test.js (74%) create mode 100644 test-app/tests/integration/setup-test-test.js create mode 100644 test-app/tests/test-helper.js rename {addon => test-app}/tests/unit/.gitkeep (100%) rename {addon => test-app}/tests/unit/adapter-test.js (92%) rename {addon => test-app}/tests/unit/ember-testing-test.js (80%) rename {addon => test-app}/tests/unit/setup-ember-onerror-validation-test.js (100%) rename {addon => test-app}/tests/unit/test-isolation-validation-test.js (84%) rename {addon => test-app}/tests/unit/unhandled-rejection-test.js (93%) rename {addon => test-app}/tests/unit/utils/patch-assert-helper.js (100%) create mode 100644 test-app/types/index.d.ts create mode 100644 test-app/types/local-types.d.ts create mode 100644 test-app/types/tsconfig.json diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 59ed419e..1bd2a996 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -23,7 +23,7 @@ jobs: - uses: wyvox/action@v1 - run: pnpm lint - run: pnpm test:ember - working-directory: addon + working-directory: test-app floating-dependencies: name: 'Floating Dependencies' @@ -35,7 +35,7 @@ jobs: with: pnpm-args: '--no-lockfile' - run: pnpm test:ember - working-directory: addon + working-directory: test-app try-scenarios: name: 'Try: ${{ matrix.ember-try-scenario }}' @@ -60,7 +60,7 @@ jobs: - uses: wyvox/action@v1 - name: test run: node_modules/.bin/ember try:one ${{ matrix.ember-try-scenario }} --skip-cleanup - working-directory: addon + working-directory: test-app types: runs-on: ubuntu-latest diff --git a/addon/package.json b/addon/package.json index 639e7bd7..606592c7 100644 --- a/addon/package.json +++ b/addon/package.json @@ -76,7 +76,7 @@ "expect-type": "^0.15.0", "loader.js": "^4.7.0", "npm-run-all": "^4.1.5", - "prettier": "2.8.4", + "prettier": "2.8.8", "qunit": "^2.19.4", "release-it": "^15.7.0", "release-it-lerna-changelog": "^5.0.0", diff --git a/addon/tests/dummy/config/ember-cli-update.json b/addon/tests/dummy/config/ember-cli-update.json deleted file mode 100644 index a895bc9d..00000000 --- a/addon/tests/dummy/config/ember-cli-update.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "schemaVersion": "1.0.0", - "packages": [ - { - "name": "ember-cli", - "version": "4.8.0", - "blueprints": [ - { - "name": "addon", - "outputRepo": "https://github.com/ember-cli/ember-addon-output", - "codemodsSource": "ember-addon-codemods-manifest@1", - "isBaseBlueprint": true, - "options": [ - "--welcome", - "--yarn" - ] - } - ] - } - ] -} diff --git a/addon/tests/dummy/public/crossdomain.xml b/addon/tests/dummy/public/crossdomain.xml deleted file mode 100644 index 0c16a7a0..00000000 --- a/addon/tests/dummy/public/crossdomain.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - - diff --git a/addon/tests/helpers/destroy-app.js b/addon/tests/helpers/destroy-app.js deleted file mode 100644 index c3d4d1ab..00000000 --- a/addon/tests/helpers/destroy-app.js +++ /dev/null @@ -1,5 +0,0 @@ -import Ember from 'ember'; - -export default function destroyApp(application) { - Ember.run(application, 'destroy'); -} diff --git a/addon/tests/helpers/module-for-acceptance.js b/addon/tests/helpers/module-for-acceptance.js deleted file mode 100644 index 11df35ec..00000000 --- a/addon/tests/helpers/module-for-acceptance.js +++ /dev/null @@ -1,26 +0,0 @@ -import { module } from 'qunit'; -import Ember from 'ember'; -import startApp from '../helpers/start-app'; -import destroyApp from '../helpers/destroy-app'; - -const { - RSVP: { resolve }, -} = Ember; - -export default function (name, options = {}) { - module(name, { - beforeEach() { - this.application = startApp(); - - if (options.beforeEach) { - return options.beforeEach.apply(this, arguments); - } - }, - - afterEach() { - let afterEach = - options.afterEach && options.afterEach.apply(this, arguments); - return resolve(afterEach).then(() => destroyApp(this.application)); - }, - }); -} diff --git a/addon/tests/helpers/resolver.js b/addon/tests/helpers/resolver.js deleted file mode 100644 index 19c797d0..00000000 --- a/addon/tests/helpers/resolver.js +++ /dev/null @@ -1,18 +0,0 @@ -import App from '../../app'; -import { setRegistry } from '../../resolver'; -import config from '../../config/environment'; -import { setResolver } from '@ember/test-helpers'; - -export const application = App.create(config.APP); -export const resolver = application.Resolver.create({ - namespace: application, - isResolverFromTestHelpers: true, -}); - -export default resolver; - -setResolver(resolver); - -export function setResolverRegistry(registry) { - setRegistry(registry); -} diff --git a/addon/tests/helpers/start-app.js b/addon/tests/helpers/start-app.js deleted file mode 100644 index 9a605eb8..00000000 --- a/addon/tests/helpers/start-app.js +++ /dev/null @@ -1,15 +0,0 @@ -import Ember from 'ember'; -import Application from '../../app'; -import config from '../../config/environment'; - -export default function startApp(attrs) { - let attributes = Ember.merge({}, config.APP); - attributes = Ember.merge(attributes, attrs); // use defaults, but you can override; - - return Ember.run(() => { - let application = Application.create(attributes); - application.setupForTesting(); - application.injectTestHelpers(); - return application; - }); -} diff --git a/addon/tests/integration/setup-test-test.js b/addon/tests/integration/setup-test-test.js index ff21eda9..c83c40fc 100644 --- a/addon/tests/integration/setup-test-test.js +++ b/addon/tests/integration/setup-test-test.js @@ -2,13 +2,8 @@ import { module, test } from 'qunit'; import Service, { inject as injectService } from '@ember/service'; import Component from '@ember/component'; import { setupTest } from 'ember-qunit'; -import { setResolverRegistry } from '../helpers/resolver'; module('setupTest tests', function (hooks) { - hooks.beforeEach(function () { - setResolverRegistry({}); - }); - setupTest(hooks); test('can be used for unit style testing', function (assert) { diff --git a/addon/tests/test-helper.js b/addon/tests/test-helper.js deleted file mode 100644 index 2085b4ce..00000000 --- a/addon/tests/test-helper.js +++ /dev/null @@ -1,6 +0,0 @@ -import { application } from './helpers/resolver'; -import { start } from 'ember-qunit'; -import { setApplication } from '@ember/test-helpers'; - -setApplication(application); -start(); diff --git a/package.json b/package.json index d41aa2b6..ff3be3c4 100644 --- a/package.json +++ b/package.json @@ -5,12 +5,15 @@ "license": "MIT", "repository": "https://github.com/emberjs/ember-qunit", "scripts": { - "lint": "pnpm --filter '*' lint", - "lint:fix": "pnpm --filter '*' lint:fix", - "test": "pnpm --filter '*' test" + "lint": "yarn workspaces run lint", + "lint:fix": "yarn workspaces run lint:fix", + "test": "yarn workspaces run test" }, + "workspaces": [ + "addon" + ], "volta": { "node": "18.16.0", - "pnpm": "8.6.1" + "yarn": "1.22.19" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 026cd7c0..197ed777 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -118,7 +118,7 @@ importers: version: 11.1.0(eslint@8.35.0) eslint-plugin-prettier: specifier: ^4.2.1 - version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.35.0)(prettier@2.8.4) + version: 4.2.1(eslint-config-prettier@8.6.0)(eslint@8.35.0)(prettier@2.8.8) expect-type: specifier: ^0.15.0 version: 0.15.0 @@ -129,8 +129,8 @@ importers: specifier: ^4.1.5 version: 4.1.5 prettier: - specifier: 2.8.4 - version: 2.8.4 + specifier: 2.8.8 + version: 2.8.8 qunit: specifier: ^2.19.4 version: 2.19.4 @@ -147,6 +147,133 @@ importers: specifier: ^5.75.0 version: 5.75.0 + test-app: + dependencies: + ember-qunit: + specifier: link:../addon + version: link:../addon + devDependencies: + '@babel/core': + specifier: ^7.21.0 + version: 7.21.0 + '@babel/eslint-parser': + specifier: ^7.19.1 + version: 7.19.1(@babel/core@7.21.0)(eslint@8.39.0) + '@ember/optional-features': + specifier: ^2.0.0 + version: 2.0.0 + '@ember/string': + specifier: ^3.0.1 + version: 3.1.1 + '@ember/test-helpers': + specifier: ^2.9.3 + version: 2.9.3(@babel/core@7.21.0)(ember-source@4.10.0) + '@ember/test-waiters': + specifier: ^3.0.2 + version: 3.0.2 + '@embroider/test-setup': + specifier: ^2.1.1 + version: 2.1.1 + '@glimmer/component': + specifier: ^1.1.2 + version: 1.1.2(@babel/core@7.21.0) + '@glimmer/tracking': + specifier: ^1.1.2 + version: 1.1.2 + '@tsconfig/ember': + specifier: ^2.0.0 + version: 2.0.0 + '@types/qunit': + specifier: ^2.19.4 + version: 2.19.4 + '@types/rsvp': + specifier: ^4.0.4 + version: 4.0.4 + concurrently: + specifier: ^8.0.1 + version: 8.0.1 + ember-angle-bracket-invocation-polyfill: + specifier: ^3.0.2 + version: 3.0.2(@babel/core@7.21.0) + ember-auto-import: + specifier: ^2.6.3 + version: 2.6.3(webpack@5.75.0) + ember-cli: + specifier: ~4.10.0 + version: 4.10.0 + ember-cli-babel: + specifier: ^7.26.11 + version: 7.26.11 + ember-cli-dependency-checker: + specifier: ^3.3.1 + version: 3.3.1(ember-cli@4.10.0) + ember-cli-htmlbars: + specifier: ^6.2.0 + version: 6.2.0 + ember-cli-inject-live-reload: + specifier: ^2.1.0 + version: 2.1.0 + ember-cli-terser: + specifier: ^4.0.2 + version: 4.0.2 + ember-disable-prototype-extensions: + specifier: ^1.1.3 + version: 1.1.3 + ember-load-initializers: + specifier: ^2.1.2 + version: 2.1.2(@babel/core@7.21.0) + ember-resolver: + specifier: ^10.1.0 + version: 10.1.0(@ember/string@3.1.1)(ember-source@4.10.0) + ember-source: + specifier: ~4.10.0 + version: 4.10.0(@babel/core@7.21.0)(@glimmer/component@1.1.2)(webpack@5.75.0) + ember-source-channel-url: + specifier: ^3.0.0 + version: 3.0.0 + ember-template-lint: + specifier: ^5.7.3 + version: 5.7.3 + ember-try: + specifier: ^2.0.0 + version: 2.0.0 + eslint: + specifier: ^8.39.0 + version: 8.39.0 + eslint-plugin-disable-features: + specifier: ^0.1.3 + version: 0.1.3 + eslint-plugin-ember: + specifier: ^11.5.2 + version: 11.5.2(eslint@8.39.0) + eslint-plugin-n: + specifier: ^15.7.0 + version: 15.7.0(eslint@8.39.0) + eslint-plugin-qunit: + specifier: ^7.3.4 + version: 7.3.4(eslint@8.39.0) + expect-type: + specifier: ^0.15.0 + version: 0.15.0 + loader.js: + specifier: ^4.7.0 + version: 4.7.0 + prettier: + specifier: ^2.8.8 + version: 2.8.8 + qunit: + specifier: ^2.19.4 + version: 2.19.4 + qunit-dom: + specifier: ^2.0.0 + version: 2.0.0 + typescript: + specifier: ^4.9.5 + version: 4.9.5 + webpack: + specifier: ^5.75.0 + version: 5.75.0 + packages: /@ampproject/remapping@2.2.0: @@ -202,6 +329,20 @@ packages: semver: 6.3.0 dev: true + /@babel/eslint-parser@7.19.1(@babel/core@7.21.0)(eslint@8.39.0): + resolution: {integrity: sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': '>=7.11.0' + eslint: ^7.5.0 || ^8.0.0 + dependencies: + '@babel/core': 7.21.0 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 8.39.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.0 + dev: true + /@babel/generator@7.21.1: resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} engines: {node: '>=6.9.0'} @@ -274,7 +415,7 @@ packages: '@babel/helper-plugin-utils': 7.19.0 debug: 4.3.4 lodash.debounce: 4.0.8 - resolve: 1.22.1 + resolve: 1.22.3 semver: 6.3.0 transitivePeerDependencies: - supports-color @@ -1271,6 +1412,13 @@ packages: engines: {node: '>=6.9.0'} dependencies: regenerator-runtime: 0.13.10 + dev: true + + /@babel/runtime@7.22.5: + resolution: {integrity: sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.13.11 /@babel/template@7.20.7: resolution: {integrity: sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==} @@ -1351,6 +1499,28 @@ packages: - supports-color dev: true + /@ember/test-helpers@2.9.3(@babel/core@7.21.0)(ember-source@4.10.0): + resolution: {integrity: sha512-ejVg4Dj+G/6zyLvQsYOvmGiOLU6AS94tY4ClaO1E2oVvjjtVJIRmVLFN61I+DuyBg9hS3cFoPjQRTZB9MRIbxQ==} + engines: {node: 10.* || 12.* || 14.* || 15.* || >= 16.*} + peerDependencies: + ember-source: '>=3.8.0' + dependencies: + '@ember/test-waiters': 3.0.2 + '@embroider/macros': 1.10.0 + '@embroider/util': 1.11.1(ember-source@4.10.0) + broccoli-debug: 0.6.5 + broccoli-funnel: 3.0.8 + ember-cli-babel: 7.26.11 + ember-cli-htmlbars: 6.2.0 + ember-destroyable-polyfill: 2.0.3(@babel/core@7.21.0) + ember-source: 4.10.0(@babel/core@7.21.0)(@glimmer/component@1.1.2)(webpack@5.75.0) + transitivePeerDependencies: + - '@babel/core' + - '@glint/environment-ember-loose' + - '@glint/template' + - supports-color + dev: true + /@ember/test-helpers@3.0.3(ember-source@4.10.0)(webpack@5.75.0): resolution: {integrity: sha512-W8fEWritv36W216wmuusOlsUJs+iDFkOvHratI8tw466NV4deq9TVej1p5DtUFeDUUP/E14IxqrNNC3qaYszfQ==} engines: {node: 16.* || >= 18} @@ -1397,6 +1567,27 @@ packages: transitivePeerDependencies: - supports-color + /@embroider/macros@1.11.0: + resolution: {integrity: sha512-P/WSB+PqKSja5qXjYvhLyUM0ivcDoI9kkqs+R0GNujfVhS0EIIAMHfD9uHDBbhzFit39pT0QJqgcXGE2rprCPA==} + engines: {node: 12.* || 14.* || >= 16} + peerDependencies: + '@glint/template': ^1.0.0 + peerDependenciesMeta: + '@glint/template': + optional: true + dependencies: + '@embroider/shared-internals': 2.1.0 + assert-never: 1.2.1 + babel-import-util: 1.3.0 + ember-cli-babel: 7.26.11 + find-up: 5.0.0 + lodash: 4.17.21 + resolve: 1.22.3 + semver: 7.3.8 + transitivePeerDependencies: + - supports-color + dev: true + /@embroider/shared-internals@2.0.0: resolution: {integrity: sha512-qZ2/xky9mWm5YC6noOa6AiAwgISEQ78YTZNv4SNu2PFgEK/H+Ha/3ddngzGSsnXkVnIHZyxIBzhxETonQYHY9g==} engines: {node: 12.* || 14.* || >= 16} @@ -1410,6 +1601,20 @@ packages: semver: 7.3.8 typescript-memoize: 1.1.1 + /@embroider/shared-internals@2.1.0: + resolution: {integrity: sha512-9hKbMxW7wDWt1BqdpnLZ5W6ETrmAg9HnfBwf1IDkT+8he5nOdTD0PNtruMjm7V0Tb9p9hI7O+UXSa8ZnX1BQXg==} + engines: {node: 12.* || 14.* || >= 16} + dependencies: + babel-import-util: 1.3.0 + ember-rfc176-data: 0.3.18 + fs-extra: 9.1.0 + js-string-escape: 1.0.1 + lodash: 4.17.21 + resolve-package-path: 4.0.3 + semver: 7.3.8 + typescript-memoize: 1.1.1 + dev: true + /@embroider/test-setup@2.1.1: resolution: {integrity: sha512-t81a2z2OEFAOZVbV7wkgiDuCyZ3ajD7J7J+keaTfNSRiXoQgeFFASEECYq1TCsH8m/R+xHMRiY59apF2FIeFhw==} engines: {node: 12.* || 14.* || >= 16} @@ -1418,6 +1623,42 @@ packages: resolve: 1.22.1 dev: true + /@embroider/util@1.11.1(ember-source@4.10.0): + resolution: {integrity: sha512-IqzlEQahM2cfLvo4PULA2WyvROqr9jRmeSv0GGZzpitWCh6l4FDwweOLSArdlKSXdQxHkKhwBMCi//7DhKjRlg==} + engines: {node: 14.* || >= 16} + peerDependencies: + '@glint/environment-ember-loose': ^1.0.0 + '@glint/template': ^1.0.0 + ember-source: '*' + peerDependenciesMeta: + '@glint/environment-ember-loose': + optional: true + '@glint/template': + optional: true + dependencies: + '@embroider/macros': 1.11.0 + broccoli-funnel: 3.0.8 + ember-cli-babel: 7.26.11 + ember-source: 4.10.0(@babel/core@7.21.0)(@glimmer/component@1.1.2)(webpack@5.75.0) + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.39.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.39.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /@eslint-community/regexpp@4.5.1: + resolution: {integrity: sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + /@eslint/eslintrc@2.0.0: resolution: {integrity: sha512-fluIaaV+GyV24CCu/ggiHdV+j4RNh85yQnAYS/G2mZODZgGmmlrgCydjUcV3YvxCm9x8nMAfThsqTni4KiXT4A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1435,11 +1676,33 @@ packages: - supports-color dev: true + /@eslint/eslintrc@2.0.3: + resolution: {integrity: sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.5.2 + globals: 13.20.0 + ignore: 5.2.0 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + /@eslint/js@8.35.0: resolution: {integrity: sha512-JXdzbRiWclLVoD8sNUjR443VVlYqiYmDVT6rGUEIEHU5YJW0gaVZwV2xgM7D4arkvASqD0IlLUVjHiFuxaftRw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /@eslint/js@8.39.0: + resolution: {integrity: sha512-kf9RB0Fg7NZfap83B3QOqOGg9QmD9yBudqQXzzOtn3i4y7ZUXe5ONeW34Gwi+TxhH4mvj72R1Zc300KUMa9Bng==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /@gar/promisify@1.1.3: resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} dev: true @@ -1475,10 +1738,67 @@ packages: resolution: {integrity: sha512-JKF/a9I9jw6fGoz8kA7LEQslrwJ5jms5CXhu/aqkBWk+PmZ6pTl8mlb/eJ/5ujBGTiQzBhy5AIWF712iA+4/mw==} dev: true + /@glimmer/global-context@0.84.3: + resolution: {integrity: sha512-8Oy9Wg5IZxMEeAnVmzD2NkObf89BeHoFSzJgJROE/deutd3rxg83mvlOez4zBBGYwnTb+VGU2LYRpet92egJjA==} + dependencies: + '@glimmer/env': 0.1.7 + dev: true + + /@glimmer/interfaces@0.84.3: + resolution: {integrity: sha512-dk32ykoNojt0mvEaIW6Vli5MGTbQo58uy3Epj7ahCgTHmWOKuw/0G83f2UmFprRwFx689YTXG38I/vbpltEjzg==} + dependencies: + '@simple-dom/interface': 1.4.0 + dev: true + + /@glimmer/reference@0.84.3: + resolution: {integrity: sha512-lV+p/aWPVC8vUjmlvYVU7WQJsLh319SdXuAWoX/SE3pq340BJlAJiEcAc6q52y9JNhT57gMwtjMX96W5Xcx/qw==} + dependencies: + '@glimmer/env': 0.1.7 + '@glimmer/global-context': 0.84.3 + '@glimmer/interfaces': 0.84.3 + '@glimmer/util': 0.84.3 + '@glimmer/validator': 0.84.3 + dev: true + + /@glimmer/syntax@0.84.3: + resolution: {integrity: sha512-ioVbTic6ZisLxqTgRBL2PCjYZTFIwobifCustrozRU2xGDiYvVIL0vt25h2c1ioDsX59UgVlDkIK4YTAQQSd2A==} + dependencies: + '@glimmer/interfaces': 0.84.3 + '@glimmer/util': 0.84.3 + '@handlebars/parser': 2.0.0 + simple-html-tokenizer: 0.5.11 + dev: true + + /@glimmer/tracking@1.1.2: + resolution: {integrity: sha512-cyV32zsHh+CnftuRX84ALZpd2rpbDrhLhJnTXn9W//QpqdRZ5rdMsxSY9fOsj0CKEc706tmEU299oNnDc0d7tA==} + dependencies: + '@glimmer/env': 0.1.7 + '@glimmer/validator': 0.44.0 + dev: true + /@glimmer/util@0.44.0: resolution: {integrity: sha512-duAsm30uVK9jSysElCbLyU6QQYO2X9iLDLBIBUcCqck9qN1o3tK2qWiHbGK5d6g8E2AJ4H88UrfElkyaJlGrwg==} dev: true + /@glimmer/util@0.84.3: + resolution: {integrity: sha512-qFkh6s16ZSRuu2rfz3T4Wp0fylFj3HBsONGXQcrAdZjdUaIS6v3pNj6mecJ71qRgcym9Hbaq/7/fefIwECUiKw==} + dependencies: + '@glimmer/env': 0.1.7 + '@glimmer/interfaces': 0.84.3 + '@simple-dom/interface': 1.4.0 + dev: true + + /@glimmer/validator@0.44.0: + resolution: {integrity: sha512-i01plR0EgFVz69GDrEuFgq1NheIjZcyTy3c7q+w7d096ddPVeVcRzU3LKaqCfovvLJ+6lJx40j45ecycASUUyw==} + dev: true + + /@glimmer/validator@0.84.3: + resolution: {integrity: sha512-RTBV4TokUB0vI31UC7ikpV7lOYpWUlyqaKV//pRC4pexYMlmqnVhkFrdiimB/R1XyNdUOQUmnIAcdic39NkbhQ==} + dependencies: + '@glimmer/env': 0.1.7 + '@glimmer/global-context': 0.84.3 + dev: true + /@glimmer/vm-babel-plugins@0.84.2(@babel/core@7.21.0): resolution: {integrity: sha512-HS2dEbJ3CgXn56wk/5QdudM7rE3vtNMvPIoG7Rrg+GhkGMNxBCIRxOeEF2g520j9rwlA2LAZFpc7MCDMFbTjNA==} dependencies: @@ -1487,6 +1807,10 @@ packages: - '@babel/core' dev: true + /@handlebars/parser@2.0.0: + resolution: {integrity: sha512-EP9uEDZv/L5Qh9IWuMUGJRfwhXJ4h1dqKTT4/3+tY0eu7sPis7xh23j61SYUnNF4vqCQvvUXpDo9Bh/+q1zASA==} + dev: true + /@humanwhocodes/config-array@0.11.8: resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==} engines: {node: '>=10.10.0'} @@ -1549,6 +1873,19 @@ packages: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 + /@lint-todo/utils@13.1.0: + resolution: {integrity: sha512-uzcZPIPH7hcs+hKMiHfp58MosJpI9sTTgl1pGYau4zq34q1ppswJ6nLeohv/cDhqEBrHjtvldt8zDnVJXRvBlA==} + engines: {node: 12.* || >= 14} + dependencies: + '@types/eslint': 7.29.0 + find-up: 5.0.0 + fs-extra: 9.1.0 + proper-lockfile: 4.1.2 + slash: 3.0.0 + tslib: 2.4.0 + upath: 2.0.1 + dev: true + /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1: resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} dependencies: @@ -1733,6 +2070,10 @@ packages: config-chain: 1.1.13 dev: true + /@simple-dom/interface@1.4.0: + resolution: {integrity: sha512-l5qumKFWU0S+4ZzMaLXFU8tQZsicHEMEyAxI5kDFGhJsRqDwe0a7/iPA/GdxlGyDKseQQAgIz5kzU7eXTrlSpA==} + dev: true + /@sindresorhus/is@0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} engines: {node: '>=6'} @@ -1813,6 +2154,13 @@ packages: '@types/eslint': 8.4.7 '@types/estree': 1.0.0 + /@types/eslint@7.29.0: + resolution: {integrity: sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==} + dependencies: + '@types/estree': 1.0.0 + '@types/json-schema': 7.0.11 + dev: true + /@types/eslint@8.4.7: resolution: {integrity: sha512-ehM7cCt2RSFs42mb+lcmhFT9ouIlV92PuaeRGn8N8c98oMjG4Z5pJHA9b1QiCcuqnbPSHcyfiD3mlhqMaHsQIw==} dependencies: @@ -2298,6 +2646,12 @@ packages: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} dev: true + /aria-query@5.1.3: + resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} + dependencies: + deep-equal: 2.2.1 + dev: true + /arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} @@ -2313,6 +2667,13 @@ packages: engines: {node: '>=0.10.0'} dev: true + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + dev: true + /array-equal@1.0.0: resolution: {integrity: sha512-H3LU5RLiSsGXPhN+Nipar0iR0IofH+8r89G2y1tBKxQ/agagKyAjhkAFDRBfodP2caPrNKHpAWNIM/c9yeL7uA==} @@ -2436,6 +2797,11 @@ packages: resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} engines: {node: '>= 0.4'} + /babel-import-util@0.2.0: + resolution: {integrity: sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag==} + engines: {node: '>= 12.*'} + dev: true + /babel-import-util@1.3.0: resolution: {integrity: sha512-PPzUT17eAI18zn6ek1R3sB4Krc/MbnmT1MkZQFmyhjoaEGBVwNABhfVU9+EKcDSKrrOm9OIpGhjxukx1GCiy1g==} engines: {node: '>= 12.*'} @@ -2485,8 +2851,8 @@ packages: dependencies: ember-rfc176-data: 0.3.18 - /babel-plugin-ember-template-compilation@2.0.0: - resolution: {integrity: sha512-d+4jaB2ik0rt9TH0K9kOlKJeRBHEb373FgFMcU9ZaJL2zYuVXe19bqy+cWlLpLf1tpOBcBG9QTlFBCoImlOt1g==} + /babel-plugin-ember-template-compilation@2.0.3: + resolution: {integrity: sha512-SIetZD/uCLnzIBTJtzYGc2Q55TPqM5WyjuOgW+Is1W3SZVljlY3JD5Add29hDMs//OvXBWoXfOopQxkfG4/pIA==} engines: {node: '>= 12.*'} dependencies: babel-import-util: 1.3.0 @@ -2518,7 +2884,7 @@ packages: glob: 7.2.3 pkg-up: 2.0.0 reselect: 3.0.1 - resolve: 1.22.1 + resolve: 1.22.3 /babel-plugin-module-resolver@4.1.0: resolution: {integrity: sha512-MlX10UDheRr3lb3P0WcaIdtCSRlxdQsB1sBqL7W0raF070bGl1HQQq5K3T2vf2XAYie+ww+5AKC/WrkjRO2knA==} @@ -2528,7 +2894,7 @@ packages: glob: 7.2.3 pkg-up: 3.1.0 reselect: 4.1.6 - resolve: 1.22.1 + resolve: 1.22.3 dev: true /babel-plugin-polyfill-corejs2@0.3.3(@babel/core@7.21.0): @@ -3076,7 +3442,7 @@ packages: ensure-posix-path: 1.1.1 fs-extra: 8.1.0 minimatch: 3.1.2 - resolve: 1.22.1 + resolve: 1.22.3 rsvp: 4.8.5 symlink-or-copy: 1.3.1 walk-sync: 1.1.4 @@ -3365,6 +3731,11 @@ packages: engines: {node: '>=8'} dev: true + /ci-info@3.8.0: + resolution: {integrity: sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==} + engines: {node: '>=8'} + dev: true + /class-utils@0.3.6: resolution: {integrity: sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==} engines: {node: '>=0.10.0'} @@ -3547,6 +3918,11 @@ packages: engines: {node: '>=0.1.90'} dev: true + /colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + dev: true + /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3567,6 +3943,11 @@ packages: engines: {node: '>= 10'} dev: true + /commander@8.3.0: + resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==} + engines: {node: '>= 12'} + dev: true + /common-tags@1.8.2: resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==} engines: {node: '>=4.0.0'} @@ -3604,6 +3985,22 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + /concurrently@8.0.1: + resolution: {integrity: sha512-Sh8bGQMEL0TAmAm2meAXMjcASHZa7V0xXQVDBLknCPa9TPtkY9yYs+0cnGGgfdkW0SV1Mlg+hVGfXcoI8d3MJA==} + engines: {node: ^14.13.0 || >=16.0.0} + hasBin: true + dependencies: + chalk: 4.1.2 + date-fns: 2.30.0 + lodash: 4.17.21 + rxjs: 7.8.0 + shell-quote: 1.8.1 + spawn-command: 0.0.2-1 + supports-color: 8.1.1 + tree-kill: 1.2.2 + yargs: 17.7.2 + dev: true + /config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} dependencies: @@ -3957,6 +4354,14 @@ packages: semver: 7.3.8 webpack: 5.75.0 + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.0.2 + dev: true + /cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -3976,6 +4381,13 @@ packages: engines: {node: '>= 12'} dev: true + /date-fns@2.30.0: + resolution: {integrity: sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==} + engines: {node: '>=0.11'} + dependencies: + '@babel/runtime': 7.22.5 + dev: true + /debug@2.6.9: resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} peerDependencies: @@ -4033,6 +4445,29 @@ packages: mimic-response: 3.1.0 dev: true + /deep-equal@2.2.1: + resolution: {integrity: sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + es-get-iterator: 1.1.3 + get-intrinsic: 1.2.0 + is-arguments: 1.1.1 + is-array-buffer: 3.0.2 + is-date-object: 1.0.5 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + isarray: 2.0.5 + object-is: 1.1.5 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.0 + side-channel: 1.0.4 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.1 + which-typed-array: 1.1.9 + dev: true + /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} @@ -4069,6 +4504,14 @@ packages: has-property-descriptors: 1.0.0 object-keys: 1.1.1 + /define-properties@1.2.0: + resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + /define-property@0.2.5: resolution: {integrity: sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==} engines: {node: '>=0.10.0'} @@ -4163,6 +4606,13 @@ packages: esutils: 2.0.3 dev: true + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.4.0 + dev: true + /dot-prop@5.3.0: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} @@ -4255,6 +4705,46 @@ packages: - supports-color - webpack + /ember-auto-import@2.6.3(webpack@5.75.0): + resolution: {integrity: sha512-uLhrRDJYWCRvQ4JQ1e64XlSrqAKSd6PXaJ9ZsZI6Tlms9T4DtQFxNXasqji2ZRJBVrxEoLCRYX3RTldsQ0vNGQ==} + engines: {node: 12.* || 14.* || >= 16} + dependencies: + '@babel/core': 7.21.0 + '@babel/plugin-proposal-class-properties': 7.18.6(@babel/core@7.21.0) + '@babel/plugin-proposal-decorators': 7.19.6(@babel/core@7.21.0) + '@babel/preset-env': 7.19.4(@babel/core@7.21.0) + '@embroider/macros': 1.10.0 + '@embroider/shared-internals': 2.0.0 + babel-loader: 8.2.5(@babel/core@7.21.0)(webpack@5.75.0) + babel-plugin-ember-modules-api-polyfill: 3.5.0 + babel-plugin-ember-template-compilation: 2.0.3 + babel-plugin-htmlbars-inline-precompile: 5.3.1 + babel-plugin-syntax-dynamic-import: 6.18.0 + broccoli-debug: 0.6.5 + broccoli-funnel: 3.0.8 + broccoli-merge-trees: 4.2.0 + broccoli-plugin: 4.0.7 + broccoli-source: 3.0.1 + css-loader: 5.2.7(webpack@5.75.0) + debug: 4.3.4 + fs-extra: 10.1.0 + fs-tree-diff: 2.0.1 + handlebars: 4.7.7 + js-string-escape: 1.0.1 + lodash: 4.17.21 + mini-css-extract-plugin: 2.6.1(webpack@5.75.0) + parse5: 6.0.1 + resolve: 1.22.1 + resolve-package-path: 4.0.3 + semver: 7.3.8 + style-loader: 2.0.0(webpack@5.75.0) + typescript-memoize: 1.1.1 + walk-sync: 3.0.0 + transitivePeerDependencies: + - supports-color + - webpack + dev: true + /ember-cli-babel-plugin-helpers@1.1.1: resolution: {integrity: sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw==} engines: {node: 6.* || 8.* || >= 10.*} @@ -4321,7 +4811,7 @@ packages: engines: {node: 12.* || 14.* || >= 16} dependencies: '@ember/edition-utils': 1.2.0 - babel-plugin-ember-template-compilation: 2.0.0 + babel-plugin-ember-template-compilation: 2.0.3 babel-plugin-htmlbars-inline-precompile: 5.3.1 broccoli-debug: 0.6.5 broccoli-persistent-filter: 3.1.3 @@ -4440,7 +4930,7 @@ packages: ember-cli-babel-plugin-helpers: 1.1.1 execa: 2.1.0 fs-extra: 8.1.0 - resolve: 1.22.1 + resolve: 1.22.3 rsvp: 4.8.5 semver: 6.3.0 stagehand: 1.0.0 @@ -4660,6 +5150,18 @@ packages: - supports-color dev: true + /ember-destroyable-polyfill@2.0.3(@babel/core@7.21.0): + resolution: {integrity: sha512-TovtNqCumzyAiW0/OisSkkVK93xnVF4NRU6+FN0ubpfwEOpRrmM2RqDwXI6YAChCgSHON1cz0DfQStpA1Gjuuw==} + engines: {node: 10.* || >= 12} + dependencies: + ember-cli-babel: 7.26.11 + ember-cli-version-checker: 5.1.2 + ember-compatibility-helpers: 1.2.6(@babel/core@7.21.0) + transitivePeerDependencies: + - '@babel/core' + - supports-color + dev: true + /ember-disable-prototype-extensions@1.1.3: resolution: {integrity: sha512-SB9NcZ27OtoUk+gfalsc3QU17+54OoqR668qHcuvHByk4KAhGxCKlkm9EBlKJcGr7yceOOAJqohTcCEBqfRw9g==} engines: {node: '>= 0.10.0'} @@ -4676,6 +5178,23 @@ packages: - supports-color dev: true + /ember-resolver@10.1.0(@ember/string@3.1.1)(ember-source@4.10.0): + resolution: {integrity: sha512-Ju/ORUUbGnR83AgC3qV6fIVuM5tyi/nPRf9ggTM2+kdeGPLNTSkNZ0zSbjWEm0kerDezMjj/RoGuLvZl/L758w==} + engines: {node: 14.* || 16.* || >= 18} + peerDependencies: + '@ember/string': ^3.0.1 + ember-source: ^4.8.3 + peerDependenciesMeta: + ember-source: + optional: true + dependencies: + '@ember/string': 3.1.1 + ember-cli-babel: 7.26.11 + ember-source: 4.10.0(@babel/core@7.21.0)(@glimmer/component@1.1.2)(webpack@5.75.0) + transitivePeerDependencies: + - supports-color + dev: true + /ember-resolver@9.0.1(ember-source@4.10.0): resolution: {integrity: sha512-vFdaxDuwp0xptxa4uhJE8mNLQf6/8Mz+mBohsF4721hz03ieW+zdSSR04fCetFVCLxtNhGmmrIZrClDcA5dB9w==} engines: {node: 14.* || 16.* || >= 18} @@ -4754,6 +5273,70 @@ packages: - webpack dev: true + /ember-template-imports@3.4.2: + resolution: {integrity: sha512-OS8TUVG2kQYYwP3netunLVfeijPoOKIs1SvPQRTNOQX4Pu8xGGBEZmrv0U1YTnQn12Eg+p6w/0UdGbUnITjyzw==} + engines: {node: 12.* || >= 14} + dependencies: + babel-import-util: 0.2.0 + broccoli-stew: 3.0.0 + ember-cli-babel-plugin-helpers: 1.1.1 + ember-cli-version-checker: 5.1.2 + line-column: 1.0.2 + magic-string: 0.25.9 + parse-static-imports: 1.1.0 + string.prototype.matchall: 4.0.8 + validate-peer-dependencies: 1.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /ember-template-lint@5.7.3: + resolution: {integrity: sha512-7ev+5pSXe2qv5TFDkt7G90pfuaiGGWPCQDaNs1/9QqGW++3JiNdMdKxq1lpBcny7zRYSOWBRIN+YiVgREAxvUg==} + engines: {node: ^14.18.0 || ^16.0.0 || >= 18.0.0} + hasBin: true + dependencies: + '@lint-todo/utils': 13.1.0 + aria-query: 5.1.3 + chalk: 5.2.0 + ci-info: 3.8.0 + date-fns: 2.30.0 + ember-template-imports: 3.4.2 + ember-template-recast: 6.1.4 + eslint-formatter-kakoune: 1.0.0 + find-up: 6.3.0 + fuse.js: 6.6.2 + get-stdin: 9.0.0 + globby: 13.1.4 + is-glob: 4.0.3 + language-tags: 1.0.8 + micromatch: 4.0.5 + resolve: 1.22.3 + v8-compile-cache: 2.3.0 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: true + + /ember-template-recast@6.1.4: + resolution: {integrity: sha512-fCh+rOK6z+/tsdkTbOE+e7f84P6ObnIRQrCCrnu21E4X05hPeradikIkRMhJdxn4NWrxitfZskQDd37TR/lsNQ==} + engines: {node: 12.* || 14.* || >= 16.*} + hasBin: true + dependencies: + '@glimmer/reference': 0.84.3 + '@glimmer/syntax': 0.84.3 + '@glimmer/validator': 0.84.3 + async-promise-queue: 1.0.5 + colors: 1.4.0 + commander: 8.3.0 + globby: 11.1.0 + ora: 5.4.1 + slash: 3.0.0 + tmp: 0.2.1 + workerpool: 6.4.0 + transitivePeerDependencies: + - supports-color + dev: true + /ember-try-config@4.0.0: resolution: {integrity: sha512-jAv7fqYJK7QYYekPc/8Nr7KOqDpv/asqM6F8xcRnbmf9UrD35BkSffY63qUuiD9e0aR5qiMNBIQzH8f65rGDqw==} engines: {node: 10.* || 12.* || >= 14} @@ -4941,6 +5524,20 @@ packages: isarray: 2.0.5 dev: true + /es-get-iterator@1.1.3: + resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + has-symbols: 1.0.3 + is-arguments: 1.1.1 + is-map: 2.0.2 + is-set: 2.0.2 + is-string: 1.0.7 + isarray: 2.0.5 + stop-iteration-iterator: 1.0.0 + dev: true + /es-module-lexer@0.9.3: resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} @@ -5009,6 +5606,10 @@ packages: eslint: 8.35.0 dev: true + /eslint-formatter-kakoune@1.0.0: + resolution: {integrity: sha512-Uk/TVLt6Nf6Xoz7C1iYuZjOSdJxe5aaauGRke8JhKeJwD66Y61/pY2FjtLP04Ooq9PwV34bzrkKkU2UZ5FtDRA==} + dev: true + /eslint-plugin-disable-features@0.1.3: resolution: {integrity: sha512-7Cq7aNz9gI38oCLc2RxCgC8OtQyg5thnY++zuJ0V2dCKN8FhfLz4S5c4ubtzoywvdS7HDWC3J0cVRkhEGniLOA==} engines: {node: '>=4.0.0'} @@ -5016,17 +5617,68 @@ packages: requireindex: 1.1.0 dev: true + /eslint-plugin-ember@11.5.2(eslint@8.39.0): + resolution: {integrity: sha512-OFlBkV0VSemGtq3cZDWOm/kwOipiswvPIVL6VDJjpEv85BDtbGdqoyvaF9d6/MY7u5aDCh62oOgKQFw9JQGadA==} + engines: {node: 14.* || 16.* || >= 18} + peerDependencies: + eslint: '>= 7' + dependencies: + '@ember-data/rfc395-data': 0.0.4 + '@glimmer/syntax': 0.84.3 + css-tree: 2.3.1 + ember-rfc176-data: 0.3.18 + ember-template-imports: 3.4.2 + eslint: 8.39.0 + eslint-utils: 3.0.0(eslint@8.39.0) + estraverse: 5.3.0 + lodash.camelcase: 4.3.0 + lodash.kebabcase: 4.1.1 + magic-string: 0.30.0 + requireindex: 1.2.0 + snake-case: 3.0.4 + transitivePeerDependencies: + - supports-color + dev: true + /eslint-plugin-es@3.0.1(eslint@8.35.0): resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==} engines: {node: '>=8.10.0'} peerDependencies: eslint: '>=4.19.1' dependencies: - eslint: 8.35.0 + eslint: 8.35.0 + eslint-utils: 2.1.0 + regexpp: 3.2.0 + dev: true + + /eslint-plugin-es@4.1.0(eslint@8.39.0): + resolution: {integrity: sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==} + engines: {node: '>=8.10.0'} + peerDependencies: + eslint: '>=4.19.1' + dependencies: + eslint: 8.39.0 eslint-utils: 2.1.0 regexpp: 3.2.0 dev: true + /eslint-plugin-n@15.7.0(eslint@8.39.0): + resolution: {integrity: sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==} + engines: {node: '>=12.22.0'} + peerDependencies: + eslint: '>=7.0.0' + dependencies: + builtins: 5.0.1 + eslint: 8.39.0 + eslint-plugin-es: 4.1.0(eslint@8.39.0) + eslint-utils: 3.0.0(eslint@8.39.0) + ignore: 5.2.0 + is-core-module: 2.11.0 + minimatch: 3.1.2 + resolve: 1.22.1 + semver: 7.3.8 + dev: true + /eslint-plugin-node@11.1.0(eslint@8.35.0): resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==} engines: {node: '>=8.10.0'} @@ -5042,7 +5694,7 @@ packages: semver: 6.3.0 dev: true - /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.6.0)(eslint@8.35.0)(prettier@2.8.4): + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.6.0)(eslint@8.35.0)(prettier@2.8.8): resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} engines: {node: '>=12.0.0'} peerDependencies: @@ -5055,10 +5707,20 @@ packages: dependencies: eslint: 8.35.0 eslint-config-prettier: 8.6.0(eslint@8.35.0) - prettier: 2.8.4 + prettier: 2.8.8 prettier-linter-helpers: 1.0.0 dev: true + /eslint-plugin-qunit@7.3.4(eslint@8.39.0): + resolution: {integrity: sha512-EbDM0zJerH9zVdUswMJpcFF7wrrpvsGuYfNexUpa5hZkkdFhaFcX+yD+RSK4Nrauw4psMGlcqeWUMhaVo+Manw==} + engines: {node: 12.x || 14.x || >=16.0.0} + dependencies: + eslint-utils: 3.0.0(eslint@8.39.0) + requireindex: 1.2.0 + transitivePeerDependencies: + - eslint + dev: true + /eslint-scope@5.1.1: resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} engines: {node: '>=8.0.0'} @@ -5074,6 +5736,14 @@ packages: estraverse: 5.3.0 dev: true + /eslint-scope@7.2.0: + resolution: {integrity: sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + /eslint-utils@2.1.0: resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==} engines: {node: '>=6'} @@ -5091,6 +5761,16 @@ packages: eslint-visitor-keys: 2.1.0 dev: true + /eslint-utils@3.0.0(eslint@8.39.0): + resolution: {integrity: sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==} + engines: {node: ^10.0.0 || ^12.0.0 || >= 14.0.0} + peerDependencies: + eslint: '>=5' + dependencies: + eslint: 8.39.0 + eslint-visitor-keys: 2.1.0 + dev: true + /eslint-visitor-keys@1.3.0: resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==} engines: {node: '>=4'} @@ -5106,6 +5786,11 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true + /eslint-visitor-keys@3.4.1: + resolution: {integrity: sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + /eslint@8.35.0: resolution: {integrity: sha512-BxAf1fVL7w+JLRQhWl2pzGeSiGqbWumV4WNvc9Rhp6tiCtm4oHnyPBSEtMGZwrQgudFQ+otqzWoPB7x+hxoWsw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5155,6 +5840,55 @@ packages: - supports-color dev: true + /eslint@8.39.0: + resolution: {integrity: sha512-mwiok6cy7KTW7rBpo05k6+p4YVZByLNjAZ/ACB9DRCu4YDRwjXI01tWHp6KAUWelsBetTxKK/2sHB0vdS8Z2Og==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.39.0) + '@eslint-community/regexpp': 4.5.1 + '@eslint/eslintrc': 2.0.3 + '@eslint/js': 8.39.0 + '@humanwhocodes/config-array': 0.11.8 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.0 + eslint-visitor-keys: 3.4.1 + espree: 9.5.2 + esquery: 1.4.2 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.20.0 + grapheme-splitter: 1.0.4 + ignore: 5.2.0 + import-fresh: 3.3.0 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-sdsl: 4.1.5 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.1 + strip-ansi: 6.0.1 + strip-json-comments: 3.1.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + /esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} @@ -5166,7 +5900,16 @@ packages: dependencies: acorn: 8.8.1 acorn-jsx: 5.3.2(acorn@8.8.1) - eslint-visitor-keys: 3.3.0 + eslint-visitor-keys: 3.4.1 + dev: true + + /espree@9.5.2: + resolution: {integrity: sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.8.1 + acorn-jsx: 5.3.2(acorn@8.8.1) + eslint-visitor-keys: 3.4.1 dev: true /esprima@3.0.0: @@ -5620,6 +6363,14 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 + /find-up@6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + /find-yarn-workspace-root@1.2.1: resolution: {integrity: sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q==} dependencies: @@ -5889,6 +6640,11 @@ packages: /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + /fuse.js@6.6.2: + resolution: {integrity: sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==} + engines: {node: '>=10'} + dev: true + /gauge@4.0.4: resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -5924,6 +6680,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + dev: true + /get-stream@4.1.0: resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} engines: {node: '>=6'} @@ -6100,6 +6861,18 @@ packages: slash: 3.0.0 dev: true + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + /globby@13.1.3: resolution: {integrity: sha512-8krCNHXvlCgHDpegPzleMq07yMYTO2sXKASmZmquEYWEmCx6J5UTRbp5RwMJkTJGtcQ44YpiUYUiN0b9mzy8Bw==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -6111,6 +6884,17 @@ packages: slash: 4.0.0 dev: true + /globby@13.1.4: + resolution: {integrity: sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.2.12 + ignore: 5.2.0 + merge2: 1.4.1 + slash: 4.0.0 + dev: true + /globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} dev: true @@ -6675,6 +7459,14 @@ packages: get-intrinsic: 1.2.0 is-typed-array: 1.1.10 + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + is-typed-array: 1.1.10 + dev: true + /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} dev: true @@ -6711,6 +7503,11 @@ packages: dependencies: has: 1.0.3 + /is-core-module@2.12.1: + resolution: {integrity: sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==} + dependencies: + has: 1.0.3 + /is-data-descriptor@0.1.4: resolution: {integrity: sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg==} engines: {node: '>=0.10.0'} @@ -6959,11 +7756,22 @@ packages: engines: {node: '>=12'} dev: true + /is-weakmap@2.0.1: + resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} + dev: true + /is-weakref@1.0.2: resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} dependencies: call-bind: 1.0.2 + /is-weakset@2.0.2: + resolution: {integrity: sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.0 + dev: true + /is-windows@1.0.2: resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} engines: {node: '>=0.10.0'} @@ -7189,6 +7997,16 @@ packages: engines: {node: '>=6'} dev: true + /language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + dev: true + + /language-tags@1.0.8: + resolution: {integrity: sha512-aWAZwgPLS8hJ20lNPm9HNVs4inexz6S2sQa3wx/+ycuutMNE5/IfYxiWYBbi+9UWCQVaXYCOPUl6gFrPR7+jGg==} + dependencies: + language-subtag-registry: 0.3.22 + dev: true + /latest-version@7.0.0: resolution: {integrity: sha512-KvNT4XqAMzdcL6ka6Tl3i2lYeFDgXNCuIX+xNx6ZMVR1dFq+idXd9FLKNMOIx0t9mJ9/HudyX4oZWXZQ0UJHeg==} engines: {node: '>=14.16'} @@ -7326,6 +8144,13 @@ packages: dependencies: p-locate: 5.0.0 + /locate-path@7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + /lodash._baseassign@3.2.0: resolution: {integrity: sha512-t3N26QR2IdSN+gqSy9Ds9pBu/J1EAFEshKlUHpJG3rvyJOYgcELIxcIeKKfZk7sjOz11cFfzJRsyFry/JyabJQ==} dependencies: @@ -7380,6 +8205,10 @@ packages: resolution: {integrity: sha512-yX/rx6d/UTVh7sSVWVSIMjfnz95evAgDFdb1ZozC35I9mSFCkmzptOzevxjgbQUsc78NR44LVHWjsoMQXy9FDg==} dev: true + /lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + dev: true + /lodash.castarray@4.4.0: resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} dev: true @@ -7424,6 +8253,10 @@ packages: resolution: {integrity: sha512-JwObCrNJuT0Nnbuecmqr5DgtuBppuCvGD9lxjFpAzwnVtdGoDQ1zig+5W8k5/6Gcn0gZ3936HDAlGd28i7sOGQ==} dev: true + /lodash.kebabcase@4.1.1: + resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==} + dev: true + /lodash.keys@3.1.2: resolution: {integrity: sha512-CuBsapFjcubOGMn3VD+24HOAPxM79tH+V6ivJL3CHYjtrawauDJHUk//Yew9Hvc6e9rbCrURGk8z6PC+8WJBfQ==} dependencies: @@ -7491,6 +8324,12 @@ packages: is-unicode-supported: 1.3.0 dev: true + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.4.0 + dev: true + /lowercase-keys@1.0.1: resolution: {integrity: sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==} engines: {node: '>=0.10.0'} @@ -7532,6 +8371,13 @@ packages: dependencies: sourcemap-codec: 1.4.8 + /magic-string@0.30.0: + resolution: {integrity: sha512-LA+31JYDJLs82r2ScLrlz1GjSgu66ZV518eyWT+S8VhyQn/JL0u9MeBOvQMGYiPk1DBiSN9DDMOcXvigJZaViQ==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.14 + dev: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -7655,6 +8501,10 @@ packages: resolution: {integrity: sha512-n4Vypz/DZgwo0iMHLQL49dJzlp7YtAJP+N07MZHpjPf/5XJuHUWstviF4Mn2jEiR/GNmtnRRqnwsXExk3igfFA==} dev: true + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: true + /mdurl@1.0.1: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: true @@ -8178,6 +9028,13 @@ packages: resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} dev: true + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.4.0 + dev: true + /node-domexception@1.0.0: resolution: {integrity: sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ==} engines: {node: '>=10.5.0'} @@ -8242,7 +9099,7 @@ packages: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} dependencies: hosted-git-info: 2.8.9 - resolve: 1.22.1 + resolve: 1.22.3 semver: 5.7.1 validate-npm-package-license: 3.0.4 dev: true @@ -8353,6 +9210,14 @@ packages: /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + /object-is@1.1.5: + resolution: {integrity: sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.1.4 + dev: true + /object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -8586,6 +9451,13 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-limit@4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate@2.0.0: resolution: {integrity: sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==} engines: {node: '>=4'} @@ -8611,6 +9483,13 @@ packages: dependencies: p-limit: 3.1.0 + /p-locate@6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + /p-map@3.0.0: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} engines: {node: '>=8'} @@ -8755,6 +9634,11 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + /path-exists@5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -8949,8 +9833,8 @@ packages: fast-diff: 1.2.0 dev: true - /prettier@2.8.4: - resolution: {integrity: sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==} + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} hasBin: true dev: true @@ -9024,6 +9908,14 @@ packages: engines: {node: 10.* || >= 12.*} dev: true + /proper-lockfile@4.1.2: + resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} + dependencies: + graceful-fs: 4.2.10 + retry: 0.12.0 + signal-exit: 3.0.7 + dev: true + /proto-list@1.2.4: resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==} dev: true @@ -9101,6 +9993,18 @@ packages: rimraf: 2.7.1 underscore.string: 3.3.6 + /qunit-dom@2.0.0: + resolution: {integrity: sha512-mElzLN99wYPOGekahqRA+mq7NcThXY9c+/tDkgJmT7W5LeZAFNyITr2rFKNnCbWLIhuLdFw88kCBMrJSfyBYpA==} + engines: {node: 12.* || 14.* || >= 16.*} + dependencies: + broccoli-funnel: 3.0.8 + broccoli-merge-trees: 4.2.0 + ember-cli-babel: 7.26.11 + ember-cli-version-checker: 5.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /qunit@2.19.4: resolution: {integrity: sha512-aqUzzUeCqlleWYKlpgfdHHw9C6KxkB9H3wNfiBg5yHqQMzy0xw/pbCRHYFkjl8MsP/t8qkTQE+JTYL71azgiew==} engines: {node: '>=10'} @@ -9199,7 +10103,7 @@ packages: resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} engines: {node: '>= 0.10'} dependencies: - resolve: 1.22.1 + resolve: 1.22.3 dev: true /redeyed@1.0.1: @@ -9220,10 +10124,13 @@ packages: /regenerator-runtime@0.13.10: resolution: {integrity: sha512-KepLsg4dU12hryUO7bp/axHAKvwGOCV0sGloQtpagJ12ai+ojVDqkeGSiRX1zlq+kjIMZ1t7gpze+26QqtdGqw==} + /regenerator-runtime@0.13.11: + resolution: {integrity: sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==} + /regenerator-transform@0.15.0: resolution: {integrity: sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==} dependencies: - '@babel/runtime': 7.19.4 + '@babel/runtime': 7.22.5 /regex-not@1.0.2: resolution: {integrity: sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==} @@ -9241,6 +10148,15 @@ packages: define-properties: 1.1.4 functions-have-names: 1.2.3 + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + functions-have-names: 1.2.3 + dev: true + /regexpp@3.2.0: resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==} engines: {node: '>=8'} @@ -9365,7 +10281,7 @@ packages: '@babel/core': 7.21.0 '@babel/plugin-syntax-decorators': 7.19.0(@babel/core@7.21.0) '@babel/plugin-transform-typescript': 7.19.3(@babel/core@7.21.0) - prettier: 2.8.4 + prettier: 2.8.8 transitivePeerDependencies: - supports-color dev: true @@ -9394,6 +10310,11 @@ packages: engines: {node: '>=0.10.5'} dev: true + /requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + dev: true + /requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} dev: true @@ -9426,21 +10347,21 @@ packages: resolution: {integrity: sha512-fVEKHGeK85bGbVFuwO9o1aU0n3vqQGrezPc51JGu9UTXpFQfWq5qCeKxyaRUSvephs+06c5j5rPq/dzHGEo8+Q==} dependencies: path-root: 0.1.1 - resolve: 1.22.1 + resolve: 1.22.3 /resolve-package-path@2.0.0: resolution: {integrity: sha512-/CLuzodHO2wyyHTzls5Qr+EFeG6RcW4u6//gjYvUfcfyuplIX1SSccU+A5A9A78Gmezkl3NBkFAMxLbzTY9TJA==} engines: {node: 8.* || 10.* || >= 12} dependencies: path-root: 0.1.1 - resolve: 1.22.1 + resolve: 1.22.3 /resolve-package-path@3.1.0: resolution: {integrity: sha512-2oC2EjWbMJwvSN6Z7DbDfJMnD8MYEouaLn5eIX0j8XwPsYCVIyY9bbnX88YHVkbr8XHqvZrYbxaLPibfTYKZMA==} engines: {node: 10.* || >= 12} dependencies: path-root: 0.1.1 - resolve: 1.22.1 + resolve: 1.22.3 /resolve-package-path@4.0.3: resolution: {integrity: sha512-SRpNAPW4kewOaNUt8VPqhJ0UMxawMwzJD8V7m1cJfdSTK9ieZwS6K7Dabsm4bmLFM96Z5Y/UznrpG5kt1im8yA==} @@ -9469,6 +10390,14 @@ packages: path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 + /resolve@1.22.3: + resolution: {integrity: sha512-P8ur/gp/AmbEzjr729bZnLjXK5Z+4P0zhIJgBgzqRih7hL7BOukHGtSTA3ACMY467GRFz3duQsi0bDZdR7DKdw==} + hasBin: true + dependencies: + is-core-module: 2.12.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + /responselike@1.0.2: resolution: {integrity: sha512-/Fpe5guzJk1gPqdJLJR5u7eG/gNY4nImjbRDaVWVMRhne55TCmj2i9Q+54PBRfatRC8v/rIiv9BN0pMd9OV5EQ==} dependencies: @@ -9790,6 +10719,10 @@ packages: resolution: {integrity: sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw==} dev: true + /shell-quote@1.8.1: + resolution: {integrity: sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==} + dev: true + /shelljs@0.8.5: resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} engines: {node: '>=4'} @@ -9822,6 +10755,10 @@ packages: transitivePeerDependencies: - supports-color + /simple-html-tokenizer@0.5.11: + resolution: {integrity: sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og==} + dev: true + /slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -9837,6 +10774,13 @@ packages: engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} dev: true + /snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + dependencies: + dot-case: 3.0.4 + tslib: 2.4.0 + dev: true + /snapdragon-node@2.1.1: resolution: {integrity: sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==} engines: {node: '>=0.10.0'} @@ -10017,6 +10961,10 @@ packages: resolution: {integrity: sha512-73BoniQDcRWgnLAf/suKH6V5H54gd1KLzwYN9FB6J/evqTV33htH9xwV/4BHek+++jzxpVlZQKKZkqstPQPmQg==} dev: true + /spawn-command@0.0.2-1: + resolution: {integrity: sha512-n98l9E2RMSJ9ON1AKisHzz7V42VDiBQGY6PB1BwRglz99wpVsSuGzQ+jOi6lFXBGVTCrRpltvjm+/XA+tpeJrg==} + dev: true + /spdx-correct@3.1.1: resolution: {integrity: sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==} dependencies: @@ -10087,6 +11035,13 @@ packages: engines: {node: '>= 0.8'} dev: true + /stop-iteration-iterator@1.0.0: + resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==} + engines: {node: '>= 0.4'} + dependencies: + internal-slot: 1.0.4 + dev: true + /string-template@0.2.1: resolution: {integrity: sha512-Yptehjogou2xm4UJbxJ4CxgZx12HBfeystp0y3x7s4Dj32ltVVG1Gg8YhKjHZkHicuKpZX/ffilA8505VbUbpw==} dev: true @@ -10593,6 +11548,11 @@ packages: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} dev: true + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + dev: true + /tree-sync@1.4.0: resolution: {integrity: sha512-YvYllqh3qrR5TAYZZTXdspnIhlKAYezPYw11ntmweoceu4VK+keN356phHRIIo1d+RDmLpHZrUlmxga2gc9kSQ==} dependencies: @@ -10821,6 +11781,11 @@ packages: os-homedir: 1.0.2 dev: true + /upath@2.0.1: + resolution: {integrity: sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w==} + engines: {node: '>=4'} + dev: true + /update-browserslist-db@1.0.10(browserslist@4.21.4): resolution: {integrity: sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==} hasBin: true @@ -10905,6 +11870,10 @@ packages: sade: 1.8.1 dev: true + /v8-compile-cache@2.3.0: + resolution: {integrity: sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==} + dev: true + /validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} dependencies: @@ -10919,6 +11888,13 @@ packages: builtins: 5.0.1 dev: true + /validate-peer-dependencies@1.2.0: + resolution: {integrity: sha512-nd2HUpKc6RWblPZQ2GDuI65sxJ2n/UqZwSBVtj64xlWjMx0m7ZB2m9b2JS3v1f+n9VWH/dd1CMhkHfP6pIdckA==} + dependencies: + resolve-package-path: 3.1.0 + semver: 7.3.8 + dev: true + /validate-peer-dependencies@2.2.0: resolution: {integrity: sha512-8X1OWlERjiUY6P6tdeU9E0EwO8RA3bahoOVG7ulOZT5MqgNDUO/BQoVjYiHPcNe+v8glsboZRIw9iToMAA2zAA==} engines: {node: '>= 12'} @@ -11083,6 +12059,15 @@ packages: is-string: 1.0.7 is-symbol: 1.0.4 + /which-collection@1.0.1: + resolution: {integrity: sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==} + dependencies: + is-map: 2.0.2 + is-set: 2.0.2 + is-weakmap: 2.0.1 + is-weakset: 2.0.2 + dev: true + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'} @@ -11159,6 +12144,10 @@ packages: resolution: {integrity: sha512-0x7gJm1rhpn5SPG9NENOxPtbfUZZtK/qOg6gEdSqeDBA3dTeR91RJqSPjccPRCkhNfrnnl/dWxSSj5w9CtdzNA==} dev: true + /workerpool@6.4.0: + resolution: {integrity: sha512-i3KR1mQMNwY2wx20ozq2EjISGtQWDIfV56We+yGJ5yDs8jTwQiLLaqHlkBHITlCuJnYlVRmXegxFxZg7gqI++A==} + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -11276,6 +12265,24 @@ packages: yargs-parser: 21.1.1 dev: true + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: true + /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true diff --git a/test-app/.editorconfig b/test-app/.editorconfig new file mode 100644 index 00000000..c35a0024 --- /dev/null +++ b/test-app/.editorconfig @@ -0,0 +1,19 @@ +# EditorConfig helps developers define and maintain consistent +# coding styles between different editors and IDEs +# editorconfig.org + +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true +indent_style = space +indent_size = 2 + +[*.hbs] +insert_final_newline = false + +[*.{diff,md}] +trim_trailing_whitespace = false diff --git a/test-app/.ember-cli b/test-app/.ember-cli new file mode 100644 index 00000000..8c1812cf --- /dev/null +++ b/test-app/.ember-cli @@ -0,0 +1,15 @@ +{ + /** + Ember CLI sends analytics information by default. The data is completely + anonymous, but there are times when you might want to disable this behavior. + + Setting `disableAnalytics` to true will prevent any data from being sent. + */ + "disableAnalytics": false, + + /** + Setting `isTypeScriptProject` to true will force the blueprint generators to generate TypeScript + rather than JavaScript by default, when a TypeScript version of a given blueprint is available. + */ + "isTypeScriptProject": false +} diff --git a/test-app/.eslintignore b/test-app/.eslintignore new file mode 100644 index 00000000..d474a40b --- /dev/null +++ b/test-app/.eslintignore @@ -0,0 +1,25 @@ +# unconventional js +/blueprints/*/files/ +/vendor/ + +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ +/node_modules/ + +# misc +/coverage/ +!.* +.*/ +.eslintcache + +# ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/npm-shrinkwrap.json.ember-try +/package.json.ember-try +/package-lock.json.ember-try +/yarn.lock.ember-try diff --git a/test-app/.eslintrc.js b/test-app/.eslintrc.js new file mode 100644 index 00000000..25ceaab4 --- /dev/null +++ b/test-app/.eslintrc.js @@ -0,0 +1,56 @@ +'use strict'; + +module.exports = { + root: true, + parser: '@babel/eslint-parser', + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + requireConfigFile: false, + babelOptions: { + plugins: [ + ['@babel/plugin-proposal-decorators', { decoratorsBeforeExport: true }], + ], + }, + }, + plugins: ['ember'], + extends: [ + 'eslint:recommended', + 'plugin:ember/recommended', + 'plugin:prettier/recommended', + ], + env: { + browser: true, + }, + rules: {}, + overrides: [ + // node files + { + files: [ + './.eslintrc.js', + './.prettierrc.js', + './.stylelintrc.js', + './.template-lintrc.js', + './ember-cli-build.js', + './testem.js', + './blueprints/*/index.js', + './config/**/*.js', + './lib/*/index.js', + './server/**/*.js', + ], + parserOptions: { + sourceType: 'script', + }, + env: { + browser: false, + node: true, + }, + extends: ['plugin:n/recommended'], + }, + { + // test files + files: ['tests/**/*-test.{js,ts}'], + extends: ['plugin:qunit/recommended'], + }, + ], +}; diff --git a/test-app/.gitignore b/test-app/.gitignore new file mode 100644 index 00000000..f1e859b2 --- /dev/null +++ b/test-app/.gitignore @@ -0,0 +1,32 @@ +# See https://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ +/node_modules/ + +# misc +/.env* +/.pnp* +/.sass-cache +/.eslintcache +/connect.lock +/coverage/ +/libpeerconnection.log +/npm-debug.log* +/testem.log +/yarn-error.log + +# ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/npm-shrinkwrap.json.ember-try +/package.json.ember-try +/package-lock.json.ember-try +/yarn.lock.ember-try + +# broccoli-debug +/DEBUG/ diff --git a/test-app/.npmignore b/test-app/.npmignore new file mode 100644 index 00000000..3aac2443 --- /dev/null +++ b/test-app/.npmignore @@ -0,0 +1,40 @@ +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ + +# misc +/.bowerrc +/.editorconfig +/.ember-cli +/.env* +/.eslintcache +/.eslintignore +/.eslintrc.js +/.git/ +/.github/ +/.gitignore +/.prettierignore +/.prettierrc.js +/.template-lintrc.js +/.travis.yml +/.watchmanconfig +/bower.json +/config/ember-try.js +/CONTRIBUTING.md +/ember-cli-build.js +/testem.js +/tests/ +/yarn-error.log +/yarn.lock +.gitkeep + +# ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/npm-shrinkwrap.json.ember-try +/package.json.ember-try +/package-lock.json.ember-try +/yarn.lock.ember-try diff --git a/test-app/.prettierignore b/test-app/.prettierignore new file mode 100644 index 00000000..4178fd57 --- /dev/null +++ b/test-app/.prettierignore @@ -0,0 +1,25 @@ +# unconventional js +/blueprints/*/files/ +/vendor/ + +# compiled output +/dist/ +/tmp/ + +# dependencies +/bower_components/ +/node_modules/ + +# misc +/coverage/ +!.* +.eslintcache +.lint-todo/ + +# ember-try +/.node_modules.ember-try/ +/bower.json.ember-try +/npm-shrinkwrap.json.ember-try +/package.json.ember-try +/package-lock.json.ember-try +/yarn.lock.ember-try diff --git a/test-app/.prettierrc.js b/test-app/.prettierrc.js new file mode 100644 index 00000000..e5f7b6d1 --- /dev/null +++ b/test-app/.prettierrc.js @@ -0,0 +1,12 @@ +'use strict'; + +module.exports = { + overrides: [ + { + files: '*.{js,ts}', + options: { + singleQuote: true, + }, + }, + ], +}; diff --git a/test-app/.template-lintrc.js b/test-app/.template-lintrc.js new file mode 100644 index 00000000..f35f61c7 --- /dev/null +++ b/test-app/.template-lintrc.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + extends: 'recommended', +}; diff --git a/test-app/.watchmanconfig b/test-app/.watchmanconfig new file mode 100644 index 00000000..e7834e3e --- /dev/null +++ b/test-app/.watchmanconfig @@ -0,0 +1,3 @@ +{ + "ignore_dirs": ["tmp", "dist"] +} diff --git a/test-app/README.md b/test-app/README.md new file mode 100644 index 00000000..8f4a03f0 --- /dev/null +++ b/test-app/README.md @@ -0,0 +1,57 @@ +# test-app + +This README outlines the details of collaborating on this Ember application. +A short introduction of this app could easily go here. + +## Prerequisites + +You will need the following things properly installed on your computer. + +* [Git](https://git-scm.com/) +* [Node.js](https://nodejs.org/) +* [Yarn](https://yarnpkg.com/) +* [Ember CLI](https://cli.emberjs.com/release/) +* [Google Chrome](https://google.com/chrome/) + +## Installation + +* `git clone ` this repository +* `cd test-app` +* `yarn install` + +## Running / Development + +* `ember serve` +* Visit your app at [http://localhost:4200](http://localhost:4200). +* Visit your tests at [http://localhost:4200/tests](http://localhost:4200/tests). + +### Code Generators + +Make use of the many generators for code, try `ember help generate` for more details + +### Running Tests + +* `ember test` +* `ember test --server` + +### Linting + +* `yarn lint` +* `yarn lint:fix` + +### Building + +* `ember build` (development) +* `ember build --environment production` (production) + +### Deploying + +Specify what it takes to deploy your app. + +## Further Reading / Useful Links + +* [ember.js](https://emberjs.com/) +* [ember-cli](https://cli.emberjs.com/release/) +* Development Browser Extensions + * [ember inspector for chrome](https://chrome.google.com/webstore/detail/ember-inspector/bmdblncegkenkacieihfhpjfppoconhi) + * [ember inspector for firefox](https://addons.mozilla.org/en-US/firefox/addon/ember-inspector/) diff --git a/addon/tests/dummy/app/app.js b/test-app/app/app.js similarity index 77% rename from addon/tests/dummy/app/app.js rename to test-app/app/app.js index d0b375ac..1ba93424 100644 --- a/addon/tests/dummy/app/app.js +++ b/test-app/app/app.js @@ -1,7 +1,7 @@ import Application from '@ember/application'; -import Resolver from './resolver'; +import Resolver from 'ember-resolver'; import loadInitializers from 'ember-load-initializers'; -import config from 'dummy/config/environment'; +import config from 'test-app/config/environment'; export default class App extends Application { modulePrefix = config.modulePrefix; diff --git a/addon/tests/dummy/app/components/.gitkeep b/test-app/app/components/.gitkeep similarity index 100% rename from addon/tests/dummy/app/components/.gitkeep rename to test-app/app/components/.gitkeep diff --git a/addon/tests/dummy/app/controllers/.gitkeep b/test-app/app/controllers/.gitkeep similarity index 100% rename from addon/tests/dummy/app/controllers/.gitkeep rename to test-app/app/controllers/.gitkeep diff --git a/addon/tests/dummy/app/helpers/.gitkeep b/test-app/app/helpers/.gitkeep similarity index 100% rename from addon/tests/dummy/app/helpers/.gitkeep rename to test-app/app/helpers/.gitkeep diff --git a/addon/tests/dummy/app/index.html b/test-app/app/index.html similarity index 84% rename from addon/tests/dummy/app/index.html rename to test-app/app/index.html index 8c195bc4..90cb9a37 100644 --- a/addon/tests/dummy/app/index.html +++ b/test-app/app/index.html @@ -2,14 +2,14 @@ - Dummy + TestApp {{content-for "head"}} - + {{content-for "head-footer"}} @@ -17,7 +17,7 @@ {{content-for "body"}} - + {{content-for "body-footer"}} diff --git a/addon/tests/dummy/app/models/.gitkeep b/test-app/app/models/.gitkeep similarity index 100% rename from addon/tests/dummy/app/models/.gitkeep rename to test-app/app/models/.gitkeep diff --git a/addon/tests/dummy/app/resolver.js b/test-app/app/resolver.js similarity index 100% rename from addon/tests/dummy/app/resolver.js rename to test-app/app/resolver.js diff --git a/addon/tests/dummy/app/router.js b/test-app/app/router.js similarity index 79% rename from addon/tests/dummy/app/router.js rename to test-app/app/router.js index 64e543ab..38a0b80a 100644 --- a/addon/tests/dummy/app/router.js +++ b/test-app/app/router.js @@ -1,5 +1,5 @@ import EmberRouter from '@ember/routing/router'; -import config from 'dummy/config/environment'; +import config from 'test-app/config/environment'; export default class Router extends EmberRouter { location = config.locationType; diff --git a/addon/tests/dummy/app/routes/.gitkeep b/test-app/app/routes/.gitkeep similarity index 100% rename from addon/tests/dummy/app/routes/.gitkeep rename to test-app/app/routes/.gitkeep diff --git a/addon/tests/dummy/app/styles/app.css b/test-app/app/styles/app.css similarity index 100% rename from addon/tests/dummy/app/styles/app.css rename to test-app/app/styles/app.css diff --git a/addon/tests/dummy/app/templates/application.hbs b/test-app/app/templates/application.hbs similarity index 100% rename from addon/tests/dummy/app/templates/application.hbs rename to test-app/app/templates/application.hbs diff --git a/addon/tests/dummy/app/templates/components/.gitkeep b/test-app/app/templates/components/.gitkeep similarity index 100% rename from addon/tests/dummy/app/templates/components/.gitkeep rename to test-app/app/templates/components/.gitkeep diff --git a/addon/config/ember-try.js b/test-app/config/ember-try.js similarity index 100% rename from addon/config/ember-try.js rename to test-app/config/ember-try.js diff --git a/addon/tests/dummy/config/environment.js b/test-app/config/environment.js similarity index 94% rename from addon/tests/dummy/config/environment.js rename to test-app/config/environment.js index 2b367497..113d30ae 100644 --- a/addon/tests/dummy/config/environment.js +++ b/test-app/config/environment.js @@ -2,11 +2,12 @@ module.exports = function (environment) { const ENV = { - modulePrefix: 'dummy', + modulePrefix: 'test-app', environment, rootURL: '/', locationType: 'history', EmberENV: { + EXTEND_PROTOTYPES: false, FEATURES: { // Here you can enable experimental features on an ember canary build // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true diff --git a/addon/tests/dummy/config/optional-features.json b/test-app/config/optional-features.json similarity index 100% rename from addon/tests/dummy/config/optional-features.json rename to test-app/config/optional-features.json diff --git a/addon/tests/dummy/config/targets.js b/test-app/config/targets.js similarity index 100% rename from addon/tests/dummy/config/targets.js rename to test-app/config/targets.js diff --git a/test-app/ember-cli-build.js b/test-app/ember-cli-build.js new file mode 100644 index 00000000..1b2b3ae7 --- /dev/null +++ b/test-app/ember-cli-build.js @@ -0,0 +1,36 @@ +/* eslint-env node */ +'use strict'; + +const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + +module.exports = function (defaults) { + const app = new EmberApp(defaults, { + name: 'test-app', + }); + + const { maybeEmbroider } = require('@embroider/test-setup'); + return maybeEmbroider(app, { + packageRules: [ + { + // See: https://github.com/embroider-build/embroider/issues/522 + package: 'test-app', + components: { + '{{template-only}}': { + safeToIgnore: true, + }, + '{{js-only}}': { + safeToIgnore: true, + }, + '{{jax}}': { + safeToIgnore: true, + }, + }, + }, + ], + skipBabel: [ + { + package: 'qunit', + }, + ], + }); +}; diff --git a/test-app/package.json b/test-app/package.json new file mode 100644 index 00000000..fe64095a --- /dev/null +++ b/test-app/package.json @@ -0,0 +1,78 @@ +{ + "name": "test-app", + "version": "0.0.0", + "description": "Test app for ember-qunit", + "repository": { + "type": "git", + "url": "https://github.com/emberjs/ember-qunit.git" + }, + "license": "MIT", + "scripts": { + "build": "ember build --environment=production", + "lint": "concurrently \"npm:lint:*(!fix)\" --names \"lint:\"", + "lint:fix": "concurrently \"npm:lint:*:fix\" --names \"fix:\"", + "lint:hbs": "ember-template-lint .", + "lint:hbs:fix": "ember-template-lint . --fix", + "lint:js": "eslint . --cache", + "lint:js:fix": "eslint . --fix", + "start": "ember serve", + "test": "concurrently \"npm:lint\" \"npm:test:*\" --names \"lint,test:\"", + "test:types": "tsc --noEmit --project types", + "test:ember": "ember test", + "test:ember-compatibility": "ember try:each" + }, + "dependencies": { + "ember-qunit": "link:../addon" + }, + "devDependencies": { + "@babel/core": "^7.21.0", + "@babel/eslint-parser": "^7.19.1", + "@ember/optional-features": "^2.0.0", + "@ember/string": "^3.0.1", + "@ember/test-helpers": "^2.9.3", + "@ember/test-waiters": "^3.0.2", + "@embroider/test-setup": "^2.1.1", + "@glimmer/component": "^1.1.2", + "@glimmer/tracking": "^1.1.2", + "@tsconfig/ember": "^2.0.0", + "@types/qunit": "^2.19.4", + "@types/rsvp": "^4.0.4", + "concurrently": "^8.0.1", + "ember-angle-bracket-invocation-polyfill": "^3.0.2", + "ember-auto-import": "^2.6.3", + "ember-cli": "~4.10.0", + "ember-cli-babel": "^7.26.11", + "ember-cli-dependency-checker": "^3.3.1", + "ember-cli-htmlbars": "^6.2.0", + "ember-cli-inject-live-reload": "^2.1.0", + "ember-cli-terser": "^4.0.2", + "ember-disable-prototype-extensions": "^1.1.3", + "ember-load-initializers": "^2.1.2", + "ember-resolver": "^10.1.0", + "ember-source": "~4.10.0", + "ember-source-channel-url": "^3.0.0", + "ember-template-lint": "^5.7.3", + "ember-try": "^2.0.0", + "eslint": "^8.39.0", + "eslint-plugin-disable-features": "^0.1.3", + "eslint-plugin-ember": "^11.5.2", + "eslint-plugin-n": "^15.7.0", + "eslint-plugin-qunit": "^7.3.4", + "expect-type": "^0.15.0", + "loader.js": "^4.7.0", + "prettier": "^2.8.8", + "qunit": "^2.19.4", + "qunit-dom": "^2.0.0", + "typescript": "^4.9.5", + "webpack": "^5.75.0" + }, + "engines": { + "node": "14.* || 16.* || >= 18" + }, + "ember": { + "edition": "octane" + }, + "volta": { + "extends": "../package.json" + } +} diff --git a/addon/tests/dummy/public/robots.txt b/test-app/public/robots.txt similarity index 100% rename from addon/tests/dummy/public/robots.txt rename to test-app/public/robots.txt diff --git a/test-app/testem.js b/test-app/testem.js new file mode 100644 index 00000000..ed2f3712 --- /dev/null +++ b/test-app/testem.js @@ -0,0 +1,23 @@ +'use strict'; + +module.exports = { + test_page: 'tests/index.html?hidepassed', + disable_watching: true, + launch_in_ci: ['Chrome'], + launch_in_dev: ['Chrome'], + browser_start_timeout: 120, + browser_args: { + Chrome: { + ci: [ + // --no-sandbox is needed when running Chrome inside a container + process.env.CI ? '--no-sandbox' : null, + '--headless', + '--disable-dev-shm-usage', + '--disable-software-rasterizer', + '--mute-audio', + '--remote-debugging-port=0', + '--window-size=1440,900', + ].filter(Boolean), + }, + }, +}; diff --git a/addon/tests/acceptance/basic-test.js b/test-app/tests/acceptance/basic-test.js similarity index 56% rename from addon/tests/acceptance/basic-test.js rename to test-app/tests/acceptance/basic-test.js index d2306237..c86af6ad 100644 --- a/addon/tests/acceptance/basic-test.js +++ b/test-app/tests/acceptance/basic-test.js @@ -12,7 +12,10 @@ import { import { setResolverRegistry } from '../helpers/resolver'; module('setupApplicationTest tests', function (hooks) { - const Router = EmberRouter.extend({ location: 'none' }); + class Router extends EmberRouter { + location = 'none'; + } + Router.map(function () { this.route('widgets'); this.route('posts', function () { @@ -20,8 +23,10 @@ module('setupApplicationTest tests', function (hooks) { }); }); + setupApplicationTest(hooks); + hooks.beforeEach(function () { - setResolverRegistry({ + setResolverRegistry(this.owner, { 'router:main': Router, 'template:application': hbs` @@ -30,88 +35,95 @@ module('setupApplicationTest tests', function (hooks) { 'template:index': hbs`

Hello World!

`, 'template:posts': hbs`

Posts Page

{{outlet}}`, 'template:posts/post': hbs`
{{this.model.post_id}}
`, - 'route:posts/post': Route.extend({ + 'route:posts/post': class extends Route { model(params) { return params; - }, - }), + } + }, }); }); - setupApplicationTest(hooks); - test('can render', async function (assert) { await visit('/'); - assert.equal(currentRouteName(), 'index'); - assert.equal(currentURL(), '/'); + assert.strictEqual(currentRouteName(), 'index'); + assert.strictEqual(currentURL(), '/'); - assert.equal( + assert.strictEqual( this.element.querySelector('.nav').textContent, 'posts | widgets' ); - assert.equal(this.element.querySelector('h1').textContent, 'Hello World!'); + assert.strictEqual( + this.element.querySelector('h1').textContent, + 'Hello World!' + ); }); test('can perform a basic template rendering for nested route', async function (assert) { await visit('/posts/1'); - assert.equal(currentRouteName(), 'posts.post'); - assert.equal(currentURL(), '/posts/1'); + assert.strictEqual(currentRouteName(), 'posts.post'); + assert.strictEqual(currentURL(), '/posts/1'); - assert.equal( + assert.strictEqual( this.element.querySelector('.nav').textContent, 'posts | widgets' ); - assert.equal(this.element.querySelector('.post-id').textContent, '1'); + assert.strictEqual(this.element.querySelector('.post-id').textContent, '1'); }); test('can visit multiple times', async function (assert) { await visit('/posts/1'); - assert.equal(currentRouteName(), 'posts.post'); - assert.equal(currentURL(), '/posts/1'); + assert.strictEqual(currentRouteName(), 'posts.post'); + assert.strictEqual(currentURL(), '/posts/1'); - assert.equal( + assert.strictEqual( this.element.querySelector('.nav').textContent, 'posts | widgets' ); - assert.equal(this.element.querySelector('.post-id').textContent, '1'); + assert.strictEqual(this.element.querySelector('.post-id').textContent, '1'); await visit('/'); - assert.equal(currentRouteName(), 'index'); - assert.equal(currentURL(), '/'); + assert.strictEqual(currentRouteName(), 'index'); + assert.strictEqual(currentURL(), '/'); - assert.equal( + assert.strictEqual( this.element.querySelector('.nav').textContent, 'posts | widgets' ); - assert.equal(this.element.querySelector('h1').textContent, 'Hello World!'); + assert.strictEqual( + this.element.querySelector('h1').textContent, + 'Hello World!' + ); await visit('/posts/2'); - assert.equal(currentRouteName(), 'posts.post'); - assert.equal(currentURL(), '/posts/2'); + assert.strictEqual(currentRouteName(), 'posts.post'); + assert.strictEqual(currentURL(), '/posts/2'); - assert.equal( + assert.strictEqual( this.element.querySelector('.nav').textContent, 'posts | widgets' ); - assert.equal(this.element.querySelector('.post-id').textContent, '2'); + assert.strictEqual(this.element.querySelector('.post-id').textContent, '2'); }); test('can navigate amongst routes', async function (assert) { await visit('/'); - assert.equal(currentRouteName(), 'index'); - assert.equal(currentURL(), '/'); + assert.strictEqual(currentRouteName(), 'index'); + assert.strictEqual(currentURL(), '/'); await click('a[href="/posts"]'); - assert.equal(currentRouteName(), 'posts.index'); - assert.equal(currentURL(), '/posts'); + assert.strictEqual(currentRouteName(), 'posts.index'); + assert.strictEqual(currentURL(), '/posts'); - assert.equal(this.element.querySelector('h1').textContent, 'Posts Page'); + assert.strictEqual( + this.element.querySelector('h1').textContent, + 'Posts Page' + ); }); }); diff --git a/test-app/tests/helpers/index.js b/test-app/tests/helpers/index.js new file mode 100644 index 00000000..7f70de80 --- /dev/null +++ b/test-app/tests/helpers/index.js @@ -0,0 +1,42 @@ +import { + setupApplicationTest as upstreamSetupApplicationTest, + setupRenderingTest as upstreamSetupRenderingTest, + setupTest as upstreamSetupTest, +} from 'ember-qunit'; + +// This file exists to provide wrappers around ember-qunit's / ember-mocha's +// test setup functions. This way, you can easily extend the setup that is +// needed per test type. + +function setupApplicationTest(hooks, options) { + upstreamSetupApplicationTest(hooks, options); + + // Additional setup for application tests can be done here. + // + // For example, if you need an authenticated session for each + // application test, you could do: + // + // hooks.beforeEach(async function () { + // await authenticateSession(); // ember-simple-auth + // }); + // + // This is also a good place to call test setup functions coming + // from other addons: + // + // setupIntl(hooks); // ember-intl + // setupMirage(hooks); // ember-cli-mirage +} + +function setupRenderingTest(hooks, options) { + upstreamSetupRenderingTest(hooks, options); + + // Additional setup for rendering tests can be done here. +} + +function setupTest(hooks, options) { + upstreamSetupTest(hooks, options); + + // Additional setup for unit tests can be done here. +} + +export { setupApplicationTest, setupRenderingTest, setupTest }; diff --git a/test-app/tests/helpers/resolver.js b/test-app/tests/helpers/resolver.js new file mode 100644 index 00000000..b5059ef1 --- /dev/null +++ b/test-app/tests/helpers/resolver.js @@ -0,0 +1,5 @@ +export function setResolverRegistry(owner, registry) { + for (let [key, value] of Object.entries(registry)) { + owner.register(key, value); + } +} diff --git a/addon/tests/index.html b/test-app/tests/index.html similarity index 86% rename from addon/tests/index.html rename to test-app/tests/index.html index b74fc8be..e4b2e696 100644 --- a/addon/tests/index.html +++ b/test-app/tests/index.html @@ -2,7 +2,7 @@ - Dummy Tests + TestApp Tests @@ -10,7 +10,7 @@ {{content-for "test-head"}} - + {{content-for "head-footer"}} @@ -30,7 +30,7 @@ - + {{content-for "body-footer"}} diff --git a/addon/tests/integration/.gitkeep b/test-app/tests/integration/.gitkeep similarity index 100% rename from addon/tests/integration/.gitkeep rename to test-app/tests/integration/.gitkeep diff --git a/addon/tests/integration/setup-rendering-test-test.js b/test-app/tests/integration/setup-rendering-test-test.js similarity index 74% rename from addon/tests/integration/setup-rendering-test-test.js rename to test-app/tests/integration/setup-rendering-test-test.js index e3a57c52..78923073 100644 --- a/addon/tests/integration/setup-rendering-test-test.js +++ b/test-app/tests/integration/setup-rendering-test-test.js @@ -1,22 +1,18 @@ +/* eslint-disable ember/no-classic-components */ import { module, test } from 'qunit'; import Component from '@ember/component'; import { helper } from '@ember/component/helper'; import { hbs } from 'ember-cli-htmlbars'; import { setupRenderingTest } from 'ember-qunit'; import { render } from '@ember/test-helpers'; -import { setResolverRegistry } from '../helpers/resolver'; module('setupRenderingTest tests', function (hooks) { - hooks.beforeEach(function () { - setResolverRegistry({}); - }); - setupRenderingTest(hooks); test('can render a simple template', async function (assert) { await render(hbs`

Hello!

`); - assert.equal(this.element.textContent, 'Hello!'); + assert.strictEqual(this.element.textContent, 'Hello!'); }); test('can invoke template only components', async function (assert) { @@ -24,20 +20,24 @@ module('setupRenderingTest tests', function (hooks) { 'template:components/template-only', hbs`template-only component here` ); - await render(hbs`{{template-only}}`); + await render(hbs``); - assert.equal(this.element.textContent, 'template-only component here'); + assert.strictEqual( + this.element.textContent, + 'template-only component here' + ); }); test('can invoke JS only components', async function (assert) { this.owner.register( 'component:js-only', + // eslint-disable-next-line ember/no-classic-classes Component.extend({ classNames: ['js-only'], }) ); - await render(hbs`{{js-only}}`); + await render(hbs``); assert.ok( this.element.querySelector('.js-only'), @@ -53,6 +53,6 @@ module('setupRenderingTest tests', function (hooks) { await render(hbs`{{jax "max"}}`); - assert.equal(this.element.textContent, 'max-jax'); + assert.strictEqual(this.element.textContent, 'max-jax'); }); }); diff --git a/test-app/tests/integration/setup-test-test.js b/test-app/tests/integration/setup-test-test.js new file mode 100644 index 00000000..30e373f0 --- /dev/null +++ b/test-app/tests/integration/setup-test-test.js @@ -0,0 +1,50 @@ +import { module, test } from 'qunit'; +import Service, { inject as injectService } from '@ember/service'; +import { setupTest } from 'ember-qunit'; +import hasEmberVersion from '@ember/test-helpers/has-ember-version'; + +module('setupTest tests', function (hooks) { + if (!hasEmberVersion(2, 4)) { + return; + } + + setupTest(hooks); + + test('can be used for unit style testing', function (assert) { + this.owner.register( + 'service:foo', + class extends Service { + someMethod() { + return 'hello thar!'; + } + } + ); + + let subject = this.owner.lookup('service:foo'); + + assert.strictEqual(subject.someMethod(), 'hello thar!'); + }); + + test('can access a shared service instance', function (assert) { + this.owner.register('service:bar', class extends Service {}); + this.owner.register( + 'service:foo', + class extends Service { + @injectService bar; + + someMethod() { + this.set('bar.someProp', 'derp'); + } + } + ); + + let subject = this.owner.lookup('service:foo'); + let bar = this.owner.lookup('service:bar'); + + assert.notOk(bar.get('someProp'), 'precond - initially undefined'); + + subject.someMethod(); + + assert.strictEqual(bar.get('someProp'), 'derp', 'property updated'); + }); +}); diff --git a/test-app/tests/test-helper.js b/test-app/tests/test-helper.js new file mode 100644 index 00000000..81843044 --- /dev/null +++ b/test-app/tests/test-helper.js @@ -0,0 +1,12 @@ +import Application from 'test-app/app'; +import config from 'test-app/config/environment'; +import * as QUnit from 'qunit'; +import { setApplication } from '@ember/test-helpers'; +import { setup } from 'qunit-dom'; +import { start } from 'ember-qunit'; + +setApplication(Application.create(config.APP)); + +setup(QUnit.assert); + +start(); diff --git a/addon/tests/unit/.gitkeep b/test-app/tests/unit/.gitkeep similarity index 100% rename from addon/tests/unit/.gitkeep rename to test-app/tests/unit/.gitkeep diff --git a/addon/tests/unit/adapter-test.js b/test-app/tests/unit/adapter-test.js similarity index 92% rename from addon/tests/unit/adapter-test.js rename to test-app/tests/unit/adapter-test.js index 2ea588cc..33c94990 100644 --- a/addon/tests/unit/adapter-test.js +++ b/test-app/tests/unit/adapter-test.js @@ -9,6 +9,7 @@ import { Promise } from 'rsvp'; module('QUnitAdapter'); test('asyncStart waits for asyncEnd to finish a test', function (assert) { + assert.expect(1); const adapter = QUnitAdapter.create(); adapter.asyncStart(); @@ -19,6 +20,7 @@ test('asyncStart waits for asyncEnd to finish a test', function (assert) { }); test('asyncStart waits for equal numbers of asyncEnd to finish a test', function (assert) { + assert.expect(1); const adapter = QUnitAdapter.create(); adapter.asyncStart(); @@ -32,6 +34,7 @@ test('asyncStart waits for equal numbers of asyncEnd to finish a test', function }); test('asyncStart should handle skipped tests that has no assert', function (assert) { + assert.expect(2); let FakeQUnitWithoutAssert = { config: { current: {}, @@ -41,7 +44,7 @@ test('asyncStart should handle skipped tests that has no assert', function (asse const adapter = QUnitAdapter.create({ qunit: FakeQUnitWithoutAssert }); adapter.asyncStart(); - assert.equal(adapter.doneCallbacks.length, 1); + assert.strictEqual(adapter.doneCallbacks.length, 1); assert.deepEqual(adapter.doneCallbacks, [ { test: FakeQUnitWithoutAssert.config.current, @@ -54,6 +57,7 @@ module('QUnitAdapter - Balanced async with native Promise', function () { const adapter = QUnitAdapter.create(); test('asyncStart invoked', function (assert) { + assert.expect(1); adapter.asyncStart(); assert.ok(true); @@ -74,6 +78,7 @@ module('QUnitAdapter - Balanced async with RSVP.Promise', function () { const adapter = QUnitAdapter.create(); test('asyncStart invoked', function (assert) { + assert.expect(1); adapter.asyncStart(); assert.ok(true); diff --git a/addon/tests/unit/ember-testing-test.js b/test-app/tests/unit/ember-testing-test.js similarity index 80% rename from addon/tests/unit/ember-testing-test.js rename to test-app/tests/unit/ember-testing-test.js index 0628127c..f6d26756 100644 --- a/addon/tests/unit/ember-testing-test.js +++ b/test-app/tests/unit/ember-testing-test.js @@ -3,6 +3,6 @@ import { module, test } from 'qunit'; module('setupEmberTesting', function () { test('Ember.testing is true in all test contexts', function (assert) { - assert.strictEqual(Ember.testing, true); + assert.true(Ember.testing); }); }); diff --git a/addon/tests/unit/setup-ember-onerror-validation-test.js b/test-app/tests/unit/setup-ember-onerror-validation-test.js similarity index 100% rename from addon/tests/unit/setup-ember-onerror-validation-test.js rename to test-app/tests/unit/setup-ember-onerror-validation-test.js diff --git a/addon/tests/unit/test-isolation-validation-test.js b/test-app/tests/unit/test-isolation-validation-test.js similarity index 84% rename from addon/tests/unit/test-isolation-validation-test.js rename to test-app/tests/unit/test-isolation-validation-test.js index d956ed71..24c12e96 100644 --- a/addon/tests/unit/test-isolation-validation-test.js +++ b/test-app/tests/unit/test-isolation-validation-test.js @@ -1,6 +1,6 @@ -import Ember from 'ember'; import { later, _backburner as backburner } from '@ember/runloop'; -import { module, test } from 'qunit'; +import { registerWaiter, unregisterWaiter } from '@ember/test'; +import QUnit, { module, test } from 'qunit'; import { installTestNotIsolatedHook } from 'ember-qunit/test-isolation-validation'; import { getDebugInfo } from '@ember/test-helpers'; import patchAssert from './utils/patch-assert-helper'; @@ -14,17 +14,12 @@ if (getDebugInfo()) { return !isWaiterPending; }; - // In Ember < 2.8 `registerWaiter` expected to be bound to - // `Ember.Test` 😭 - // - // Once we have dropped support for < 2.8 we should swap this to - // use: - // - // import { registerWaiter } from '@ember/test'; - Ember.Test.registerWaiter(waiter); + // eslint-disable-next-line ember/no-legacy-test-waiters + registerWaiter(waiter); QUnit.on('testEnd', function () { - Ember.Test.unregisterWaiter(this._waiter); + // eslint-disable-next-line ember/no-legacy-test-waiters + unregisterWaiter(this._waiter); }); hooks.beforeEach(function () { diff --git a/addon/tests/unit/unhandled-rejection-test.js b/test-app/tests/unit/unhandled-rejection-test.js similarity index 93% rename from addon/tests/unit/unhandled-rejection-test.js rename to test-app/tests/unit/unhandled-rejection-test.js index d7d4b159..6f7dd065 100644 --- a/addon/tests/unit/unhandled-rejection-test.js +++ b/test-app/tests/unit/unhandled-rejection-test.js @@ -21,6 +21,7 @@ module('unhandle promise rejections', function (hooks) { }); test('RSVP promises cause an unhandled rejection', function (assert) { + assert.expect(2); let done = assert.async(); window.onerror = (message) => { @@ -36,7 +37,7 @@ module('unhandle promise rejections', function (hooks) { }; // ensure we do not exit this test until the assertion has happened - setTimeout(done, 10); + setTimeout(() => done(), 10); new RSVPPromise((resolve) => { setTimeout(resolve); @@ -47,10 +48,11 @@ module('unhandle promise rejections', function (hooks) { if (HAS_NATIVE_PROMISE && HAS_UNHANDLED_REJECTION_HANDLER) { test('native promises cause an unhandled rejection', function (assert) { + assert.expect(1); let done = assert.async(); // ensure we do not exit this test until the assertion has happened - setTimeout(done, 10); + setTimeout(() => done(), 10); new self.Promise((resolve) => { setTimeout(resolve); diff --git a/addon/tests/unit/utils/patch-assert-helper.js b/test-app/tests/unit/utils/patch-assert-helper.js similarity index 100% rename from addon/tests/unit/utils/patch-assert-helper.js rename to test-app/tests/unit/utils/patch-assert-helper.js diff --git a/test-app/types/index.d.ts b/test-app/types/index.d.ts new file mode 100644 index 00000000..d11b83d5 --- /dev/null +++ b/test-app/types/index.d.ts @@ -0,0 +1,272 @@ +// Type definitions for ember-qunit 5.0 +// Project: https://github.com/emberjs/ember-qunit#readme +// Definitions by: Dan Freeman +// Chris Krycho +// James C. Davis +// Definitions: https://github.com/DefinitelyTyped/DefinitelyTyped +// Minimum TypeScript Version: 4.4 + +import EmberTestAdapter from '@ember/test/adapter'; +import { Resolver } from '@ember/owner'; +import { TestContext } from '@ember/test-helpers'; + +/** + * Sets a Resolver globally which will be used to look up objects from each test's container. + */ +export function setResolver(resolver: Resolver): void; + +/** + * Options for configuring the test runner. Normally, you will not need to + * customize this. It is exported primarily so that end user app code can name + * it when passing it back to the framework. + */ +export interface SetupTestOptions { + /** + * The resolver to use when instantiating container-managed entities in the test. + */ + resolver?: Resolver | undefined; +} + +/** + * Sets up acceptance tests. + * + * The `setupApplicationTest` function is used for all acceptance tests. It + * is invoked in the callback scope of a QUnit module (aka "nested module"). + * + * Once invoked, all subsequent hooks.beforeEach and test invocations will + * have access to the following: + * * `this.owner` - the owner object that been set on the test context. + * * `this.pauseTest` and `this.resumeTest` - allow easy pausing/resuming of tests. + * * `this.element` which returns the DOM element representing the application's root element. + */ +export function setupApplicationTest( + hooks: NestedHooks, + options?: SetupTestOptions +): void; + +/** + * Sets up tests that need to render snippets of templates. + * + * The setupRenderingTest method is used for tests that need to render + * snippets of templates. It is also invoked in the callback scope of a + * QUnit module (aka "nested module"). + * + * Once invoked, all subsequent hooks.beforeEach and test invocations will + * have access to the following: + * * All of the methods / properties listed for `setupTest` + * * this.render(...) - Renders the provided template snippet returning a + * promise that resolves once rendering has completed + * * An importable render function that de-sugars into this.render will be + * the default output of blueprints + * * this.element - Returns the native DOM element representing the element + * that was rendered via this.render + * * this.$(...) - When jQuery is present, executes a jQuery selector with + * the current this.element as its root + */ +export function setupRenderingTest( + hooks: NestedHooks, + options?: SetupTestOptions +): void; + +/** + * Sets up tests that do not need to render snippets of templates. + * + * The `setupTest` method is used for all types of tests except for those + * that need to render snippets of templates. It is invoked in the callback + * scope of a QUnit module (aka "nested module"). + * + * Once invoked, all subsequent hooks.beforeEach and test invocations will + * have access to the following: + * * this.owner - This exposes the standard "owner API" for the test environment. + * * this.set / this.setProperties - Allows setting values on the test context. + * * this.get / this.getProperties - Retrieves values from the test context. + */ +export function setupTest(hooks: NestedHooks, options?: SetupTestOptions): void; + +export class QUnitAdapter extends EmberTestAdapter {} + +export { module, test, skip, only, todo } from 'qunit'; + +interface QUnitStartOptions { + /** + * If `false` tests will not be loaded automatically. + */ + loadTests?: boolean | undefined; + + /** + * If `false` the test container will not be setup based on `devmode`, + * `dockcontainer`, or `nocontainer` URL params. + */ + setupTestContainer?: boolean | undefined; + + /** + * If `false` tests will not be automatically started (you must run + * `QUnit.start()` to kick them off). + */ + startTests?: boolean | undefined; + + /** + * If `false` the default Ember.Test adapter will not be updated. + */ + setupTestAdapter?: boolean | undefined; + + /** + * `false` opts out of the default behavior of setting `Ember.testing` + * to `true` before all tests and back to `false` after each test will. + */ + setupEmberTesting?: boolean | undefined; + + /** + * If `false` validation of `Ember.onerror` will be disabled. + */ + setupEmberOnerrorValidation?: boolean | undefined; + + /** + * If `false` test isolation validation will be disabled. + */ + setupTestIsolationValidation?: boolean | undefined; +} + +export function start(options?: QUnitStartOptions): void; + +// SAFETY: all of the `TC extends TestContext` generics below are just wildly, +// impossibly unsafe. QUnit cannot -- ever! -- guarantee that the test context +// is properly set up in a type-safe way to match this. However, it is the only +// way to handle setting state in a TS-visible way prior to Ember RFC 0785, +// which is slooooowly rolling out across the ecosystem in conjunction with the +// `