diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 000000000..b30a14e7b --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,26 @@ +name: Setup node and yarn +description: Setup node and install dependencies using yarn +inputs: + use_lockfile: + description: 'Whether to use the lockfile vs latest floating dependencies' + required: false + default: true +runs: + using: 'composite' + steps: + - uses: volta-cli/action@v3 + env: + ACTIONS_STEP_DEBUG: true + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + shell: bash + - uses: actions/cache@v3 + id: yarn-cache + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}-v1 + restore-keys: | + ${{ runner.os }}-yarn- + - run: yarn install ${{ fromJSON('{"false":"--no-lockfile", "true":"--frozen-lockfile"}')[inputs.use_lockfile] }} + shell: bash diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0a5ece402..6243423fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,25 +26,12 @@ jobs: steps: - uses: actions/checkout@v3 - - uses: volta-cli/action@v3 - env: - ACTIONS_STEP_DEBUG: true - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v2 - id: yarn-cache - with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}-v1 - restore-keys: | - ${{ runner.os }}-yarn- - - run: yarn --frozen-lockfile + - uses: ./.github/actions/setup - name: lint run: yarn lint - id: set-matrix working-directory: test-packages/support - run: echo "::set-output name=matrix::$(node ./suite-setup-util.js --matrix)" + run: echo "matrix=$(node ./suite-setup-util.js --matrix)" >> $GITHUB_OUTPUT test: needs: ['preflight'] @@ -58,20 +45,9 @@ jobs: steps: - uses: actions/checkout@v3 - - uses: volta-cli/action@v3 - env: - ACTIONS_STEP_DEBUG: true - - name: Get yarn cache directory path - id: yarn-cache-dir-path - run: echo "::set-output name=dir::$(yarn cache dir)" - - uses: actions/cache@v2 - id: yarn-cache + - uses: ./.github/actions/setup with: - path: ${{ steps.yarn-cache-dir-path.outputs.dir }} - key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}-v1 - restore-keys: | - ${{ runner.os }}-yarn- - - run: yarn --no-lockfile + use_lockfile: false - name: suite run: ${{ matrix.command }} working-directory: ${{ matrix.dir }} diff --git a/packages/addon-shim/.prettierignore b/packages/addon-shim/.prettierignore index 922165552..4178fd571 100644 --- a/packages/addon-shim/.prettierignore +++ b/packages/addon-shim/.prettierignore @@ -14,8 +14,12 @@ /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/packages/compat/package.json b/packages/compat/package.json index f6d654512..48a4d52fd 100644 --- a/packages/compat/package.json +++ b/packages/compat/package.json @@ -78,10 +78,10 @@ "@types/resolve": "^1.20.0", "@types/semver": "^7.3.6", "@types/strip-bom": "^4.0.1", - "broccoli-stew": "^3.0.0", "ember-cli-htmlbars-3": "npm:ember-cli-htmlbars@3", "ember-cli-htmlbars-inline-precompile": "^2.1.0", "ember-engines": "^0.8.19", + "scenario-tester": "^2.0.1", "typescript": "*" }, "peerDependencies": { diff --git a/packages/compat/src/compat-app.ts b/packages/compat/src/compat-app.ts index 11b484adc..3b30590ba 100644 --- a/packages/compat/src/compat-app.ts +++ b/packages/compat/src/compat-app.ts @@ -37,8 +37,6 @@ import { tmpdir } from '@embroider/shared-internals'; import { Options as AdjustImportsOptions } from '@embroider/core/src/babel-plugin-adjust-imports'; import { getEmberExports } from '@embroider/core/src/load-ember-template-compiler'; -import semver from 'semver'; - interface TreeNames { appJS: BroccoliNode; htmlTree: BroccoliNode; @@ -360,11 +358,6 @@ class CompatAppAdapter implements AppAdapter { activeAddons[addon.name] = addon.root; } - let emberSource = this.activeAddonChildren().find(a => a.name === 'ember-source')!; - let emberNeedsModulesPolyfill = semver.satisfies(emberSource.version, '<3.27.0-beta.0', { - includePrerelease: true, - }); - return { activeAddons, renameModules, @@ -380,7 +373,6 @@ class CompatAppAdapter implements AppAdapter { // up as a side-effect of babel transpilation, and babel is subject to // persistent caching. externalsDir: join(tmpdir, 'embroider', 'externals'), - emberNeedsModulesPolyfill, appRoot: this.root, }; } diff --git a/packages/compat/src/moved-package-cache.ts b/packages/compat/src/moved-package-cache.ts index f5c7f7463..997ae870d 100644 --- a/packages/compat/src/moved-package-cache.ts +++ b/packages/compat/src/moved-package-cache.ts @@ -3,9 +3,10 @@ import { ensureSymlinkSync, readdirSync, realpathSync, lstatSync } from 'fs-extr import { Memoize } from 'typescript-memoize'; import { PackageCache, Package, getOrCreate } from '@embroider/core'; import { MacrosConfig } from '@embroider/macros/src/node'; +import os from 'os'; function assertNoTildeExpansion(source: string, target: string) { - if (target.includes('~')) { + if (target.includes('~') && os.platform() !== 'win32') { throw new Error( `The symbolic link: ${source}'s target: ${target} contained a bash expansion '~' which is not supported.` ); diff --git a/packages/compat/tests/addon-styles.test.ts b/packages/compat/tests/addon-styles.test.ts deleted file mode 100644 index 387b54081..000000000 --- a/packages/compat/tests/addon-styles.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { Project, BuildResult, expectFilesAt, ExpectFile } from '@embroider/test-support'; -import { throwOnWarnings } from '@embroider/core'; - -describe('addon.styles tests', function () { - jest.setTimeout(120000); - let build: BuildResult; - let app: Project; - let expectFile: ExpectFile; - - throwOnWarnings(); - - beforeAll(async function () { - app = Project.emberNew(); - - let addon1 = app.addAddon( - 'my-addon1', - ` - treeForStyles() { - const buildFunnel = require('broccoli-funnel'); - const path = require('path'); - let tree = buildFunnel(path.join(__dirname, 'node_modules/third-party1'), { - destDir: '.' - }); - return this._super.treeForStyles.call(this, tree); - } - ` - ); - addon1.addDependency('third-party1', '1.2.3').files = { - 'third-party1.css': '.error { color: red; }', - }; - addon1.linkPackage('broccoli-funnel'); - - let addon2 = app.addAddon( - 'my-addon2', - ` - treeForStyles() { - const buildFunnel = require('broccoli-funnel'); - const path = require('path'); - return buildFunnel(path.join(__dirname, 'node_modules/third-party2'), { - destDir: '.' - }); - } - ` - ); - addon2.addDependency('third-party2', '1.2.3').files = { - 'third-party2.css': '.success { color: green }', - }; - addon2.linkPackage('broccoli-funnel'); - - let addon3 = app.addAddon('my-addon3'); - (addon3.files.addon as Project['files']).styles = { - 'addon.css': ` - .from-addon { - background-color: red; - } - `, - 'outer.css': ` - .from-outer { - background-color: blue; - } - `, - nested: { - 'inner.css': ` - .from-inner { - background-color: green; - } - `, - }, - }; - - build = await BuildResult.build(app, { - stage: 1, - type: 'app', - emberAppOptions: { - tests: false, - }, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test('treeForStyles adds styles to build', function () { - expectFile('node_modules/@embroider/synthesized-styles/assets/third-party1.css').matches('.error { color: red; }'); - }); - - // prevent regression of https://github.com/embroider-build/embroider/issues/164 - test('treeForStyles not calling super adds styles to build', function () { - expectFile('node_modules/@embroider/synthesized-styles/assets/third-party2.css').matches( - '.success { color: green }' - ); - }); - - test(`all addon CSS gets convert to implicit-styles`, function () { - let implicitStyles = expectFile('node_modules/my-addon3/package.json').json().get('ember-addon.implicit-styles'); - implicitStyles.includes('./my-addon3.css'); - implicitStyles.includes('./outer.css'); - implicitStyles.includes('./nested/inner.css'); - expectFile('node_modules/my-addon3/my-addon3.css').matches(`from-addon`); - expectFile('node_modules/my-addon3/outer.css').matches(`from-outer`); - expectFile('node_modules/my-addon3/nested/inner.css').matches(`from-inner`); - }); -}); diff --git a/packages/compat/tests/app-import.test.ts b/packages/compat/tests/app-import.test.ts deleted file mode 100644 index b937b1dac..000000000 --- a/packages/compat/tests/app-import.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { Project, BuildResult, expectFilesAt, ExpectFile } from '@embroider/test-support'; -import { throwOnWarnings } from '@embroider/core'; -import { join } from 'path'; - -describe('app.import tests', function () { - jest.setTimeout(120000); - let build: BuildResult; - let app: Project; - let expectFile: ExpectFile; - - throwOnWarnings(); - - beforeAll(async function () { - app = Project.emberNew(); - - let addon = app.addAddon( - 'my-addon', - ` - included() { - this._super.included.apply(this, arguments); - this.import('vendor/some-font.ttf', { destDir: 'fonts' }); - this.import('node_modules/third-party/third-party.js', { outputFile: 'assets/tp.js' }); - } - ` - ); - addon.files.vendor = { - 'some-font.ttf': `some font`, - }; - - addon.addDependency('third-party', '1.2.3').files = { - 'third-party.js': '// third party', - }; - - build = await BuildResult.build(app, { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - }, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test('destDir puts vendor files into public assets', function () { - expectFile('node_modules/@embroider/synthesized-vendor/package.json') - .json() - .get(['ember-addon', 'public-assets', './vendor/some-font.ttf']) - .equals('fonts/some-font.ttf'); - expectFile('node_modules/@embroider/synthesized-vendor/vendor/some-font.ttf').exists(); - }); - - test('handle non-transformed node_module with explicit outputFile', function () { - expectFile('node_modules/@embroider/synthesized-vendor/package.json') - .json() - .get([ - 'ember-addon', - 'public-assets', - join(app.baseDir, 'node_modules', 'my-addon', 'node_modules', 'third-party', 'third-party.js'), - ]) - .equals('assets/tp.js'); - }); -}); diff --git a/packages/compat/tests/audit.test.ts b/packages/compat/tests/audit.test.ts index 429f7b518..9315d361f 100644 --- a/packages/compat/tests/audit.test.ts +++ b/packages/compat/tests/audit.test.ts @@ -1,4 +1,5 @@ -import { emberTemplateCompilerPath, Project } from '@embroider/test-support'; +import { emberTemplateCompilerPath } from '@embroider/test-support'; +import { Project } from 'scenario-tester'; import { AppMeta, NodeTemplateCompilerParams, throwOnWarnings } from '@embroider/core'; import merge from 'lodash/merge'; import fromPairs from 'lodash/fromPairs'; @@ -15,7 +16,7 @@ describe('audit', function () { let app: Project; async function audit() { - app.writeSync(); + await app.write(); let audit = new Audit(app.baseDir); return await audit.run(); } @@ -48,7 +49,6 @@ describe('audit', function () { activeAddons: {}, relocatedFiles: {}, resolvableExtensions, - emberNeedsModulesPolyfill: true, appRoot: '.', }, }), diff --git a/packages/compat/tests/dummy-app.test.ts b/packages/compat/tests/dummy-app.test.ts deleted file mode 100644 index 576ae4f37..000000000 --- a/packages/compat/tests/dummy-app.test.ts +++ /dev/null @@ -1,135 +0,0 @@ -import { Project, BuildResult, expectFilesAt, ExpectFile } from '@embroider/test-support'; -import { throwOnWarnings } from '@embroider/core'; -import merge from 'lodash/merge'; -import { writeFileSync } from 'fs-extra'; -import { join } from 'path'; - -describe('dummy app tests', function () { - jest.setTimeout(120000); - let build: BuildResult; - let project: Project; - let expectFile: ExpectFile; - - throwOnWarnings(); - - beforeAll(async function () { - project = Project.addonNew(); - merge(project.files, { - 'ember-cli-build.js': `'use strict'; - - const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); - - module.exports = function(defaults) { - let app = new EmberAddon(defaults, {}); - const { Webpack } = require('@embroider/webpack'); - return require('@embroider/compat').compatBuild(app, Webpack); - };`, - 'index.js': `'use strict'; - - module.exports = { - name: require('./package').name - };`, - - addon: { - components: { - 'example.hbs': `hello`, - }, - }, - - tests: { - dummy: { - app: { - 'app.js': `import Application from '@ember/application'; - import Resolver from 'ember-resolver'; - import loadInitializers from 'ember-load-initializers'; - import config from 'dummy/config/environment'; - - export default class App extends Application { - modulePrefix = config.modulePrefix; - podModulePrefix = config.podModulePrefix; - Resolver = Resolver; - } - - loadInitializers(App, config.modulePrefix);`, - 'index.html': ` - - - - - Dummy - - - - {{content-for "head"}} - - - - - {{content-for "head-footer"}} - - - {{content-for "body"}} - - - - - {{content-for "body-footer"}} - - `, - styles: { - 'app.css': '', - }, - }, - config: { - 'environment.js': `module.exports = function(environment) { - let ENV = { - modulePrefix: 'dummy', - environment, - rootURL: '/', - locationType: 'auto', - EmberENV: { - FEATURES: { - }, - EXTEND_PROTOTYPES: { - Date: false - } - }, - APP: {} - }; - return ENV; - };`, - }, - public: { - 'robots.txt': 'go away bots', - }, - }, - }, - }); - - build = await BuildResult.build(project, { - stage: 2, - type: 'addon', - emberAppOptions: { - tests: false, - }, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test('rebuilds addon code', async function () { - expectFile('../../components/example.hbs').matches(/hello/); - writeFileSync(join(project.baseDir, 'addon/components/example.hbs'), 'goodbye'); - build.didChange(project.baseDir); - await build.rebuild(); - expectFile('../../components/example.hbs').matches(/goodbye/); - }); - - test('contains public assets from dummy app', async function () { - expectFile('robots.txt').exists(); - expectFile('package.json').json().get('ember-addon.assets').includes('robots.txt'); - }); -}); diff --git a/packages/compat/tests/exclude-dot-files.test.ts b/packages/compat/tests/exclude-dot-files.test.ts deleted file mode 100644 index 7e8647953..000000000 --- a/packages/compat/tests/exclude-dot-files.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -import { Project, BuildResult, ExpectFile, expectFilesAt } from '@embroider/test-support'; -import { throwOnWarnings } from '@embroider/core'; - -describe('dot files are excluded as modules from apps and addons', function () { - jest.setTimeout(120000); - let build: BuildResult; - let app: Project; - let expectFile: ExpectFile; - - throwOnWarnings(); - - beforeAll(async function () { - app = Project.emberNew(); - app.files.app = Object.assign({}, app.files.app, { - '.foobar.js': `// foobar content`, - '.barbaz.js': `// barbaz content`, - 'bizbiz.js': `// bizbiz content`, - }); - - let addon = app.addAddon('my-addon'); - - addon.files.addon = Object.assign({}, addon.files.addon, { - '.fooaddon.js': `// fooaddon content`, - 'baraddon.js': `// bizbiz content`, - }); - - build = await BuildResult.build(app, { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - }, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test('dot files are not included as app modules', function () { - // dot files should exist on disk - expectFile('.foobar.js').exists(); - expectFile('.barbaz.js').exists(); - expectFile('bizbiz.js').exists(); - - // dot files should not be included as modules - expectFile('assets/my-app.js').doesNotMatch('my-app/.foobar'); - expectFile('assets/my-app.js').doesNotMatch('my-app/.barbaz'); - expectFile('assets/my-app.js').matches('my-app/bizbiz'); - }); - - test('dot files are not included as addon implicit-modules', function () { - // Dot files should exist on disk - expectFile('node_modules/my-addon/.fooaddon.js').exists(); - expectFile('node_modules/my-addon/baraddon.js').exists(); - - let myAddonPackage = expectFile('node_modules/my-addon/package.json').json(); - - // dot files are not included as implicit-modules - myAddonPackage.get(['ember-addon', 'implicit-modules']).deepEquals(['./baraddon']); - }); -}); diff --git a/packages/compat/tests/namespaced-app.test.ts b/packages/compat/tests/namespaced-app.test.ts deleted file mode 100644 index 4075a4278..000000000 --- a/packages/compat/tests/namespaced-app.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Project, BuildResult, expectFilesAt, ExpectFile } from '@embroider/test-support'; -import { throwOnWarnings } from '@embroider/core'; - -describe('namespaced app', function () { - jest.setTimeout(120000); - let build: BuildResult; - let expectFile: ExpectFile; - - throwOnWarnings(); - - beforeAll(async function () { - let app = Project.emberNew('@ef4/namespaced-app'); - let addon = app.addAddon('my-addon'); - addon.files['my-implicit-module.js'] = ''; - addon.pkg['ember-addon'] = { - version: 2, - type: 'addon', - 'implicit-modules': ['./my-implicit-module.js'], - }; - build = await BuildResult.build(app, { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - }, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test(`app js location`, function () { - expectFile('assets/@ef4/namespaced-app.js').exists(); - }); - - test(`imports within app js`, function () { - let assertFile = expectFile('assets/@ef4/namespaced-app.js'); - assertFile.matches( - /d\(["'"]my-addon\/my-implicit-module["'], function\(\)\{ return i\(["']\.\.\/\.\.\/node_modules\/my-addon\/my-implicit-module\.js["']\);/, - 'implicit-modules have correct paths' - ); - assertFile.matches( - /d\(["']@ef4\/namespaced-app\/app['"], function\(\)\{ return i\(['"]\.\.\/\.\.\/app\.js"\);\}\);/, - `app's own modules are correct` - ); - }); - - test(`app css location`, function () { - expectFile('assets/@ef4/namespaced-app.css').exists(); - }); -}); diff --git a/packages/compat/tests/plugin-hints.test.ts b/packages/compat/tests/plugin-hints.test.ts deleted file mode 100644 index 63aa51bcc..000000000 --- a/packages/compat/tests/plugin-hints.test.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { Project, BuildResult, ExpectFile, expectFilesAt } from '@embroider/test-support'; -import { BuildParams } from '@embroider/test-support/build'; -import { throwOnWarnings } from '@embroider/core'; - -export function samplePlugin() { - return { visitor: {} }; -} - -describe('plugin hints', function () { - jest.setTimeout(120000); - throwOnWarnings(); - - describe('can result in parallelizable babel', function () { - let expectFile: ExpectFile; - let build: BuildResult; - - beforeAll(async function () { - let buildOptions: Partial = { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - babel: { - plugins: [samplePlugin], - }, - }, - embroiderOptions: { - pluginHints: [ - { - resolve: [__filename], - useMethod: 'samplePlugin', - }, - ], - }, - }; - let app = Project.emberNew(); - build = await BuildResult.build(app, buildOptions); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - it('is parallel safe', function () { - expectFile('./package.json').json().get('ember-addon.babel.isParallelSafe').equals(true); - }); - }); -}); diff --git a/packages/compat/tests/preprocessors.test.ts b/packages/compat/tests/preprocessors.test.ts deleted file mode 100644 index 4ee7c840f..000000000 --- a/packages/compat/tests/preprocessors.test.ts +++ /dev/null @@ -1,126 +0,0 @@ -import { Project, BuildResult, expectFilesAt, ExpectFile } from '@embroider/test-support'; -import { throwOnWarnings } from '@embroider/core'; -import merge from 'lodash/merge'; - -describe('preprocessors tests', function () { - jest.setTimeout(120000); - let build: BuildResult; - let app: Project; - let expectFile: ExpectFile; - - throwOnWarnings(); - - beforeAll(async function () { - app = Project.emberNew('my-app'); - - merge(app.files, { - config: { - 'targets.js': `module.exports = { browsers: ['last 1 Chrome versions'] }`, - }, - app: { - components: { - 'from-the-app.js': ` - import Component from '@glimmer/component'; - export default class extends Component {} - `, - 'from-the-app.hbs': `
{{this.title}}
`, - }, - }, - }); - - const PACKAGE_MY_PREPROCESSOR = 'my-preprocessor'; - let addonPreprocessor = app.addAddon(PACKAGE_MY_PREPROCESSOR); - - const INDEX_JS_WITH_PREPROCESSOR = `const { map } = require('broccoli-stew'); - -module.exports = { - name: require('./package').name, - - setupPreprocessorRegistry(type, registry) { - if (type !== 'parent') { - return; - } - - registry.add('js', { - name: 'special-path-processor', - toTree(tree, inputPath) { - if (inputPath !== '/') { - return tree; - } - - let augmented = map( - tree, - '**/*.{js,css}', - function (content, relativePath) { - return \`/*path@\${relativePath}*/\n\${content}\`; - } - ); - return augmented; - }, - }); - } -}; -`; - - addonPreprocessor.linkDevPackage('broccoli-stew'); - addonPreprocessor.files['index.js'] = INDEX_JS_WITH_PREPROCESSOR; - - let addon = app.addAddon('my-addon'); - - merge(addon.files, { - app: { - components: { - 'greeting.js': `export { default } from 'my-addon/components/greeting';`, - }, - }, - addon: { - components: { - 'greeting.js': ` - import Component from '@glimmer/component'; - export default class extends Component {} - `, - 'greeting.hbs': `Hello World`, - }, - }, - }); - - // We must explicitly pass the addonPreprocessor using the - // name is not sufficient. - addon.addDependency(addonPreprocessor); - - build = await BuildResult.build(app, { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - }, - }); - - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async () => { - await build.cleanup(); - }); - - test('dependencies are setup for this test suite correctly', () => { - expectFile('package.json').exists(); - expectFile('package.json').matches(/my-preprocessor/, 'has the preprocessor dependency'); - expectFile('node_modules/my-addon/package.json').exists(); - expectFile('node_modules/my-addon/package.json').matches(/my-preprocessor/, 'has the preprocessor dependency'); - expectFile('node_modules/my-preprocessor/package.json').exists(); - }); - - test('app has correct path embedded in comment', () => { - const assertFile = expectFile('components/from-the-app.js'); - assertFile.exists(); - // This is the expected output during an classic build. - assertFile.matches(/path@my-app\/components\/from-the-app\.js/, 'has a path comment in app components'); - }); - - test('addon has correct path embedded in comment', () => { - expectFile('node_modules/my-preprocessor/package.json').exists(); - const assertFile = expectFile('node_modules/my-addon/components/greeting.js'); - assertFile.matches(/path@my-addon\/components\/greeting\.js/, 'has a path comment in app components'); - }); -}); diff --git a/packages/compat/tests/renaming.test.ts b/packages/compat/tests/renaming.test.ts deleted file mode 100644 index 5e788e646..000000000 --- a/packages/compat/tests/renaming.test.ts +++ /dev/null @@ -1,220 +0,0 @@ -import { Project, BuildResult, definesPattern, ExpectFile, expectFilesAt } from '@embroider/test-support'; - -import { throwOnWarnings } from '@embroider/core'; -import merge from 'lodash/merge'; - -describe('renaming tests', function () { - jest.setTimeout(120000); - let expectFile: ExpectFile; - let build: BuildResult; - - throwOnWarnings(); - - beforeAll(async function () { - let app = Project.emberNew(); - - app.linkPackage('ember-auto-import'); - let aLib = app.addDependency('a-library'); - merge(aLib.files, { 'index.js': '' }); - - (app.files.app as Project['files']).components = { - 'import-lodash.js': ` - import lodash from "lodash"; - `, - 'import-capitalize.js': ` - import capitalize from "lodash/capitalize"; - `, - 'import-own-thing.js': ` - import ownThing from "emits-multiple-packages/own-thing"; - `, - 'import-somebody-elses.js': ` - import environment from "somebody-elses-package/environment"; - `, - 'import-somebody-elses-utils.js': ` - import environment from "somebody-elses-package/utils"; - `, - 'import-somebody-elses-utils-index.js': ` - import environment from "somebody-elses-package/utils/index"; - `, - 'import-somebody-elses-utils-index-explicit.js': ` - import environment from "somebody-elses-package/utils/index.js"; - `, - 'import-somebody-elses-original.js': ` - import topLevel from "somebody-elses-package"; - import deeper from "somebody-elses-package/deeper"; - `, - 'import-single-file-package.js': ` - import whatever from 'single-file-package'; - `, - }; - app.addAddon('somebody-elses-package'); - - let addon = app.addAddon( - 'ember-lodash', - ` - moduleName() { return 'lodash'; } - ` - ); - addon.files.addon = { - 'index.js': `// lodash index`, - 'capitalize.js': `// lodash capitalize`, - }; - - addon = app.addAddon( - 'emits-multiple-packages', - ` - treeForAddon(tree) { - // doesn't call super so we can escape our namespace - return tree; - } - ` - ); - - addon.files.addon = { - 'emits-multiple-packages': { - 'own-thing.js': '// own thing', - }, - 'somebody-elses-package': { - 'environment.js': '// somebody elses environment', - utils: { - 'index.js': '// somebody elses utils', - }, - }, - 'single-file-package.js': '// single file package', - }; - - let firstAddonWithAppTreeImport = app.addAddon('has-app-tree-import'); - (firstAddonWithAppTreeImport.files.app as Project['files'])[ - 'first.js' - ] = `export { default } from 'has-app-tree-import';`; - (firstAddonWithAppTreeImport.files.app as Project['files'])[ - 'imports-dep.js' - ] = `export { default } from 'inner-dep';`; - (firstAddonWithAppTreeImport.files.addon as Project['files'])['index.js'] = `export default "first-copy";`; - - let innerDep = firstAddonWithAppTreeImport.addAddon('inner-dep'); - (innerDep.files.addon as Project['files'])['index.js'] = `export default "inner-dep";`; - - let secondAddonWithAppTreeImport = app.addAddon('intermediate').addAddon('has-app-tree-import'); - (secondAddonWithAppTreeImport.files.app as Project['files'])[ - 'second.js' - ] = `export { default } from 'has-app-tree-import';`; - (secondAddonWithAppTreeImport.files.addon as Project['files'])['index.js'] = `export default "second-copy";`; - - // an addon that emits code from its own app tree that is really authored as - // part of the app and therefore does thing like refer to the app's modules - // by the app's package name - let mirageLike = app.addAddon('mirage-like'); - merge(mirageLike.files, { - app: { - mirage: { - 'config.js': ` - import "my-app/components/import-lodash"; - import "a-library"; - `, - }, - }, - }); - - build = await BuildResult.build(app, { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - }, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test('whole package renaming works for top-level module', function () { - let assertFile = expectFile('components/import-lodash.js').transform(build.transpile); - assertFile.matches(/import lodash from ["']ember-lodash["']/); - expectFile('node_modules/ember-lodash/index.js').matches(/lodash index/); - }); - test('whole package renaming works for interior module', function () { - let assertFile = expectFile('components/import-capitalize.js').transform(build.transpile); - assertFile.matches(/import capitalize from ["']ember-lodash\/capitalize["']/); - expectFile('node_modules/ember-lodash/capitalize.js').matches(/lodash capitalize/); - }); - test("modules in own namespace don't get renamed", function () { - let assertFile = expectFile('components/import-own-thing.js').transform(build.transpile); - assertFile.matches(/import ownThing from ["']emits-multiple-packages\/own-thing["']/); - expectFile('node_modules/emits-multiple-packages/own-thing.js').matches(/own thing/); - }); - test('modules outside our namespace do get renamed', function () { - let assertFile = expectFile('components/import-somebody-elses.js').transform(build.transpile); - assertFile.matches( - /import environment from ["']emits-multiple-packages\/somebody-elses-package\/environment(\.js)?["']/ - ); - expectFile('node_modules/emits-multiple-packages/somebody-elses-package/environment.js').matches( - /somebody elses environment/ - ); - }); - test('modules outside our namespace do get renamed, with index.js', function () { - let assertFile = expectFile('components/import-somebody-elses-utils.js').transform(build.transpile); - assertFile.matches( - /import environment from ["']emits-multiple-packages\/somebody-elses-package\/utils\/index\.js["']/ - ); - expectFile('node_modules/emits-multiple-packages/somebody-elses-package/utils/index.js').matches( - /somebody elses utils/ - ); - }); - test('modules outside our namespace do get renamed, with index', function () { - let assertFile = expectFile('components/import-somebody-elses-utils-index.js').transform(build.transpile); - assertFile.matches( - /import environment from ["']emits-multiple-packages\/somebody-elses-package\/utils\/index\.js["']/ - ); - }); - test('modules outside our namespace do get renamed, with index with extension', function () { - let assertFile = expectFile('components/import-somebody-elses-utils-index-explicit.js').transform(build.transpile); - assertFile.matches( - /import environment from ["']emits-multiple-packages\/somebody-elses-package\/utils\/index\.js["']/ - ); - }); - test('renamed modules keep their classic runtime name when used as implicit-modules', function () { - let assertFile = expectFile('assets/my-app.js').transform(build.transpile); - assertFile.matches( - definesPattern( - 'somebody-elses-package/environment', - '../node_modules/emits-multiple-packages/somebody-elses-package/environment' - ) - ); - }); - test('rewriting one modules does not capture entire package namespace', function () { - let assertFile = expectFile('components/import-somebody-elses-original.js').transform(build.transpile); - assertFile.matches(/import topLevel from ["']somebody-elses-package["']/); - assertFile.matches(/import deeper from ["']somebody-elses-package\/deeper["']/); - }); - test('single file package gets captured and renamed', function () { - let assertFile = expectFile('components/import-single-file-package.js').transform(build.transpile); - assertFile.matches(/import whatever from ["']emits-multiple-packages\/single-file-package\/index.js['"]/); - expectFile('./node_modules/emits-multiple-packages/single-file-package/index.js').matches(/single file package/); - }); - test('files copied into app from addons resolve their own original packages', function () { - let assertFile = expectFile('first.js').transform(build.transpile); - assertFile.matches(/export \{ default \} from ['"]\.\/node_modules\/has-app-tree-import['"]/); - - assertFile = expectFile('second.js').transform(build.transpile); - assertFile.matches( - /export \{ default \} from ['"]\.\/node_modules\/intermediate\/node_modules\/has-app-tree-import['"]/ - ); - }); - test(`files copied into app from addons resolve the addon's deps`, function () { - let assertFile = expectFile('imports-dep.js').transform(build.transpile); - assertFile.matches( - /export \{ default \} from ['"]\.\/node_modules\/has-app-tree-import\/node_modules\/inner-dep['"]/ - ); - }); - test(`app-tree files from addons that import from the app get rewritten to relative imports`, function () { - let assertFile = expectFile('mirage/config.js').transform(build.transpile); - assertFile.matches(/import ['"]\.\.\/components\/import-lodash['"]/); - }); - test(`files copied into app from addons can resolve the app's deps`, function () { - let assertFile = expectFile('mirage/config.js').transform(build.transpile); - assertFile.matches(/import ['"]a-library['"]/); - }); -}); diff --git a/packages/compat/tests/route-split.test.ts b/packages/compat/tests/route-split.test.ts deleted file mode 100644 index 829a32bca..000000000 --- a/packages/compat/tests/route-split.test.ts +++ /dev/null @@ -1,392 +0,0 @@ -import { Project, BuildResult, ExpectFile, expectFilesAt } from '@embroider/test-support'; -import { BuildParams } from '@embroider/test-support/build'; -import { throwOnWarnings } from '@embroider/core'; -import merge from 'lodash/merge'; -import { Audit, AuditResults } from '../src/audit'; - -describe('splitAtRoutes', function () { - jest.setTimeout(120000); - throwOnWarnings(); - - describe('basics', function () { - let expectFile: ExpectFile; - let build: BuildResult; - - beforeAll(async function () { - let buildOptions: Partial = { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - babel: { - plugins: [], - }, - }, - embroiderOptions: { - staticAddonTrees: true, - staticAddonTestSupportTrees: true, - staticHelpers: true, - staticModifiers: true, - staticComponents: true, - splitAtRoutes: ['people'], - }, - }; - let app = Project.emberNew('my-app'); - merge(app.files, { - app: { - templates: { - 'index.hbs': '', - 'people.hbs': '

People

{{outlet}}', - people: { - 'index.hbs': '', - 'show.hbs': '', - 'edit.hbs': '', - }, - }, - controllers: { - 'index.js': '', - 'people.js': '', - people: { - 'show.js': '', - }, - }, - routes: { - 'index.js': '', - 'people.js': '', - people: { - 'show.js': '', - }, - }, - components: { - 'welcome.hbs': '', - 'all-people.js': 'export default class {}', - 'one-person.hbs': '{{capitalize @person.name}}', - 'unused.hbs': '', - }, - helpers: { - 'capitalize.js': 'export default function(){}', - }, - modifiers: { - 'auto-focus.js': 'export default function(){}', - }, - }, - }); - build = await BuildResult.build(app, buildOptions); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - it('has no components in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('all-people'); - expectFile('./assets/my-app.js').doesNotMatch('welcome'); - expectFile('./assets/my-app.js').doesNotMatch('unused'); - }); - - it('has no helpers in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('capitalize'); - }); - - it('has no modifiers in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('auto-focus'); - }); - - it('has non-split controllers in main entrypoint', function () { - expectFile('./assets/my-app.js').matches('controllers/index'); - }); - - it('has non-split route templates in main entrypoint', function () { - expectFile('./assets/my-app.js').matches('templates/index'); - }); - - it('has non-split routes in main entrypoint', function () { - expectFile('./assets/my-app.js').matches('routes/index'); - }); - - it('does not have split controllers in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('controllers/people'); - expectFile('./assets/my-app.js').doesNotMatch('controllers/people/show'); - }); - - it('does not have split route templates in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('templates/people'); - expectFile('./assets/my-app.js').doesNotMatch('templates/people/index'); - expectFile('./assets/my-app.js').doesNotMatch('templates/people/show'); - }); - - it('does not have split routes in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('routes/people'); - expectFile('./assets/my-app.js').doesNotMatch('routes/people/show'); - }); - - it('dynamically imports the route entrypoint from the main entrypoint', function () { - expectFile('./assets/my-app.js').matches('import("./_route_/people.js")'); - }); - - it('has split controllers in route entrypoint', function () { - expectFile('./assets/_route_/people.js').matches('controllers/people'); - expectFile('./assets/_route_/people.js').matches('controllers/people/show'); - }); - - it('has split route templates in route entrypoint', function () { - expectFile('./assets/_route_/people.js').matches('templates/people'); - expectFile('./assets/_route_/people.js').matches('templates/people/index'); - expectFile('./assets/_route_/people.js').matches('templates/people/show'); - }); - - it('has split routes in route entrypoint', function () { - expectFile('./assets/_route_/people.js').matches('routes/people'); - expectFile('./assets/_route_/people.js').matches('routes/people/show'); - }); - - it('has no components in route entrypoint', function () { - expectFile('./assets/_route_/people.js').doesNotMatch('all-people'); - expectFile('./assets/_route_/people.js').doesNotMatch('welcome'); - expectFile('./assets/_route_/people.js').doesNotMatch('unused'); - }); - - it('has no helpers in route entrypoint', function () { - expectFile('./assets/_route_/people.js').doesNotMatch('capitalize'); - }); - - it('has no helpers in route entrypoint', function () { - expectFile('./assets/_route_/people.js').doesNotMatch('auto-focus'); - }); - - describe('audit', function () { - let auditResults: AuditResults; - beforeAll(async function () { - let audit = new Audit(build.outputPath); - auditResults = await audit.run(); - }); - - it('has no issues', function () { - expect(auditResults.findings).toEqual([]); - }); - - it('helper is consumed only from the template that uses it', function () { - expect(auditResults.modules['./helpers/capitalize.js']?.consumedFrom).toEqual(['./components/one-person.hbs']); - }); - - it('component is consumed only from the template that uses it', function () { - expect(auditResults.modules['./components/one-person.js']?.consumedFrom).toEqual([ - './templates/people/show.hbs', - ]); - }); - - it('modifier is consumed only from the template that uses it', function () { - expect(auditResults.modules['./modifiers/auto-focus.js']?.consumedFrom).toEqual([ - './templates/people/edit.hbs', - ]); - }); - - it('does not include unused component', function () { - expect(auditResults.modules['./components/unused.hbs']).toBe(undefined); - }); - }); - }); - - describe('pods', function () { - let expectFile: ExpectFile; - let build: BuildResult; - - beforeAll(async function () { - let buildOptions: Partial = { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - babel: { - plugins: [], - }, - }, - embroiderOptions: { - staticAddonTrees: true, - staticAddonTestSupportTrees: true, - staticHelpers: true, - staticModifiers: true, - staticComponents: true, - splitAtRoutes: ['people'], - }, - }; - let app = Project.emberNew('my-app'); - merge(app.files, { - app: { - pods: { - index: { - 'template.hbs': '', - 'controller.js': '', - 'route.js': '', - }, - people: { - 'template.hbs': '

People

{{outlet}}', - 'controller.js': '', - 'route.js': '', - index: { - 'template.hbs': '', - }, - show: { - 'template.hbs': '', - 'controller.js': '', - 'route.js': '', - }, - edit: { - 'template.hbs': '', - 'controller.js': '', - 'route.js': '', - }, - }, - }, - components: { - 'welcome.hbs': '', - 'all-people.js': 'export default class {}', - 'one-person.hbs': '{{capitalize @person.name}}', - 'unused.hbs': '', - }, - helpers: { - 'capitalize.js': 'export default function(){}', - }, - modifiers: { - 'auto-focus.js': 'export default function(){}', - }, - }, - config: { - 'environment.js': `module.exports = function(environment) { - let ENV = { - modulePrefix: 'my-app', - podModulePrefix: 'my-app/pods', - environment, - rootURL: '/', - locationType: 'auto', - EmberENV: { - FEATURES: { - }, - EXTEND_PROTOTYPES: { - Date: false - } - }, - APP: {} - }; - return ENV; -};`, - }, - }); - build = await BuildResult.build(app, buildOptions); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - it('has no components in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('all-people'); - expectFile('./assets/my-app.js').doesNotMatch('welcome'); - expectFile('./assets/my-app.js').doesNotMatch('unused'); - }); - - it('has no helpers in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('capitalize'); - }); - - it('has no modifiers in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('auto-focus'); - }); - - it('has non-split controllers in main entrypoint', function () { - expectFile('./assets/my-app.js').matches('pods/index/controller'); - }); - - it('has non-split route templates in main entrypoint', function () { - expectFile('./assets/my-app.js').matches('pods/index/template'); - }); - - it('has non-split routes in main entrypoint', function () { - expectFile('./assets/my-app.js').matches('pods/index/route'); - }); - - it('does not have split controllers in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('pods/people/controller'); - expectFile('./assets/my-app.js').doesNotMatch('pods/people/show/controller'); - }); - - it('does not have split route templates in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('pods/people/template'); - expectFile('./assets/my-app.js').doesNotMatch('pods/people/index/template'); - expectFile('./assets/my-app.js').doesNotMatch('pods/people/show/template'); - }); - - it('does not have split routes in main entrypoint', function () { - expectFile('./assets/my-app.js').doesNotMatch('pods/people/route'); - expectFile('./assets/my-app.js').doesNotMatch('pods/people/show/route'); - }); - - it('dynamically imports the route entrypoint from the main entrypoint', function () { - expectFile('./assets/my-app.js').matches('import("./_route_/people.js")'); - }); - - it('has split controllers in route entrypoint', function () { - expectFile('./assets/_route_/people.js').matches('pods/people/controller'); - expectFile('./assets/_route_/people.js').matches('pods/people/show/controller'); - }); - - it('has split route templates in route entrypoint', function () { - expectFile('./assets/_route_/people.js').matches('pods/people/template'); - expectFile('./assets/_route_/people.js').matches('pods/people/index/template'); - expectFile('./assets/_route_/people.js').matches('pods/people/show/template'); - }); - - it('has split routes in route entrypoint', function () { - expectFile('./assets/_route_/people.js').matches('pods/people/route'); - expectFile('./assets/_route_/people.js').matches('pods/people/show/route'); - }); - - it('has no components in route entrypoint', function () { - expectFile('./assets/_route_/people.js').doesNotMatch('all-people'); - expectFile('./assets/_route_/people.js').doesNotMatch('welcome'); - expectFile('./assets/_route_/people.js').doesNotMatch('unused'); - }); - - it('has no helpers in route entrypoint', function () { - expectFile('./assets/_route_/people.js').doesNotMatch('capitalize'); - }); - - it('has no modifiers in route entrypoint', function () { - expectFile('./assets/_route_/people.js').doesNotMatch('auto-focus'); - }); - - describe('audit', function () { - let auditResults: AuditResults; - beforeAll(async function () { - let audit = new Audit(build.outputPath); - auditResults = await audit.run(); - }); - - it('has no issues', function () { - expect(auditResults.findings).toEqual([]); - }); - - it('helper is consumed only from the template that uses it', function () { - expect(auditResults.modules['./helpers/capitalize.js']?.consumedFrom).toEqual(['./components/one-person.hbs']); - }); - - it('component is consumed only from the template that uses it', function () { - expect(auditResults.modules['./components/one-person.js']?.consumedFrom).toEqual([ - './pods/people/show/template.hbs', - ]); - }); - - it('modifier is consumed only from the template that uses it', function () { - expect(auditResults.modules['./modifiers/auto-focus.js']?.consumedFrom).toEqual([ - './pods/people/edit/template.hbs', - ]); - }); - - it('does not include unused component', function () { - expect(auditResults.modules['./components/unused.hbs']).toBe(undefined); - }); - }); - }); -}); diff --git a/packages/compat/tests/stage2.test.ts b/packages/compat/tests/stage2.test.ts deleted file mode 100644 index be8b3406e..000000000 --- a/packages/compat/tests/stage2.test.ts +++ /dev/null @@ -1,775 +0,0 @@ -import { Project, BuildResult, ExpectFile, expectFilesAt } from '@embroider/test-support'; -import { BuildParams } from '@embroider/test-support/build'; -import { throwOnWarnings } from '@embroider/core'; -import Options from '../src/options'; -import { join } from 'path'; -import { writeFileSync, unlinkSync } from 'fs'; -import merge from 'lodash/merge'; -import resolve from 'resolve'; - -describe('stage2 build', function () { - jest.setTimeout(120000); - throwOnWarnings(); - - describe('in repo addons of addons works', function () { - let expectFile: ExpectFile; - let build: BuildResult; - - beforeAll(async function () { - let buildOptions: Partial = { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - babel: { - plugins: [], - }, - }, - embroiderOptions: {}, - }; - let app = Project.emberNew(); - - let depA = app.addAddon('dep-a'); - let depB = app.addAddon('dep-b'); - let depC = app.addAddon('dep-c'); - - depA.linkPackage('dep-c', depC.root); - depB.linkPackage('dep-c', depC.root); - - depC.addInRepoAddon('in-repo-d', '', { - app: { service: { 'in-repo.js': 'in-repo-d' } }, - }); - - depA.addInRepoAddon('in-repo-a', '', { - app: { service: { 'in-repo.js': 'in-repo-a' } }, - }); - depB.addInRepoAddon('in-repo-b', '', { - app: { service: { 'in-repo.js': 'in-repo-b' } }, - }); - depB.addInRepoAddon('in-repo-c', '', { - app: { service: { 'in-repo.js': 'in-repo-c' } }, - }); - - // make an in-repo addon with a dependency on a secondary in-repo-addon - let primary = app.addInRepoAddon('primary-in-repo-addon'); - if (!primary.pkg['ember-addon']) { - primary.pkg['ember-addon'] = {}; - } - if (!primary.pkg['ember-addon'].paths) { - primary.pkg['ember-addon'].paths = []; - } - primary.pkg['ember-addon'].paths.push('../secondary-in-repo-addon'); - - // critically, this in-repo addon gets removed from the app's actual - // ember-addon.paths, so it's *only* consumed by primary-in-repo-addon. - app.addInRepoAddon('secondary-in-repo-addon', '', { - app: { - services: { - 'secondary.js': '// secondary', - }, - }, - addon: { - components: { - 'secondary.js': '// secondary component', - }, - }, - }); - app.pkg['ember-addon'].paths = app.pkg['ember-addon'].paths.filter( - (p: string) => p !== 'lib/secondary-in-repo-addon' - ); - - build = await BuildResult.build(app, buildOptions); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - it('in repo addons are symlinked correctly', function () { - // check that package json contains in repo dep - expectFile('./node_modules/dep-a/package.json').json().get('dependencies.in-repo-a').equals('0.0.0'); - expectFile('./node_modules/dep-b/package.json').json().get('dependencies.in-repo-b').equals('0.0.0'); - expectFile('./node_modules/dep-b/package.json').json().get('dependencies.in-repo-c').equals('0.0.0'); - - // check that symlinks are correct - expectFile('./node_modules/dep-a/node_modules/in-repo-a/package.json').exists(); - expectFile('./node_modules/dep-b/node_modules/in-repo-b/package.json').exists(); - expectFile('./node_modules/dep-b/node_modules/in-repo-c/package.json').exists(); - - // check that the in repo addons are correct upgraded - expectFile('./node_modules/dep-a/node_modules/in-repo-a/package.json') - .json() - .get('ember-addon.version') - .equals(2); - expectFile('./node_modules/dep-b/node_modules/in-repo-b/package.json') - .json() - .get('ember-addon.version') - .equals(2); - expectFile('./node_modules/dep-b/node_modules/in-repo-c/package.json') - .json() - .get('ember-addon.version') - .equals(2); - - // check that the app trees with in repo addon are combined correctly - expectFile('./service/in-repo.js').matches(/in-repo-c/); - }); - - it('incorporates in-repo-addons of in-repo-addons correctly', function () { - // secondary in-repo-addon was correctly detected and activated - expectFile('./services/secondary.js').exists(); - - // secondary is resolvable from primary - expect( - resolve.sync('secondary-in-repo-addon/components/secondary', { - basedir: join(build.outputPath, 'node_modules', 'primary-in-repo-addon'), - }) - ).toBeTruthy(); - }); - }); - - describe('addon ordering is preserved from ember-cli with orderIdx', function () { - let expectFile: ExpectFile; - let build: BuildResult; - - // these test attempt to describe the addon ordering behavior from ember-cli that was - // introduced via: https://github.com/ember-cli/ember-cli/commit/098a9b304b551fe235bd42399ce6975af2a1bc48 - beforeAll(async function () { - let buildOptions: Partial = { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - babel: { - plugins: [], - }, - }, - embroiderOptions: {}, - }; - let app = Project.emberNew(); - - let depB = app.addAddon('dep-b'); - let depA = app.addAddon('dep-a'); - - merge(depB.files, { - app: { service: { 'addon.js': 'dep-b', 'dep-wins-over-dev.js': 'dep-b', 'in-repo-over-deps.js': 'dep-b' } }, - }); - merge(depA.files, { app: { service: { 'addon.js': 'dep-a' } } }); - - app.addInRepoAddon('in-repo-a', '', { - app: { service: { 'in-repo.js': 'in-repo-a', 'in-repo-over-deps.js': 'in-repo-a' } }, - }); - app.addInRepoAddon('in-repo-b', '', { app: { service: { 'in-repo.js': 'in-repo-b' } } }); - - let devA = app.addDevAddon('dev-a'); - let devB = app.addDevAddon('dev-b'); - let devC = app.addDevAddon('dev-c'); - let devD = app.addDevAddon('dev-d'); - let devE = app.addDevAddon('dev-e'); - let devF = app.addDevAddon('dev-f'); - - devB.pkg['ember-addon'].after = 'dev-e'; - devF.pkg['ember-addon'].before = 'dev-d'; - - merge(devA.files, { app: { service: { 'dev-addon.js': 'dev-a', 'dep-wins-over-dev.js': 'dev-a' } } }); - merge(devB.files, { app: { service: { 'test-after.js': 'dev-b' } } }); - merge(devC.files, { app: { service: { 'dev-addon.js': 'dev-c' } } }); - merge(devD.files, { app: { service: { 'test-before.js': 'dev-d' } } }); - merge(devE.files, { app: { service: { 'test-after.js': 'dev-e' } } }); - merge(devF.files, { app: { service: { 'test-before.js': 'dev-f' } } }); - - build = await BuildResult.build(app, buildOptions); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - it('verifies that the correct lexigraphically sorted addons win', function () { - expectFile('./service/in-repo.js').matches(/in-repo-b/); - expectFile('./service/addon.js').matches(/dep-b/); - expectFile('./service/dev-addon.js').matches(/dev-c/); - }); - - it('addons declared as dependencies should win over devDependencies', function () { - expectFile('./service/dep-wins-over-dev.js').matches(/dep-b/); - }); - - it('in repo addons declared win over dependencies', function () { - expectFile('./service/in-repo-over-deps.js').matches(/in-repo-a/); - }); - - it('ordering with before specified', function () { - expectFile('./service/test-before.js').matches(/dev-d/); - }); - - it('ordering with after specified', function () { - expectFile('./service/test-after.js').matches(/dev-b/); - }); - }); - - describe('static with rules', function () { - let expectFile: ExpectFile; - let build: BuildResult; - let app: Project; - - beforeAll(async function () { - app = Project.emberNew(); - app.addDependency('some-library', '1.0.0'); - app.linkPackage('ember-auto-import'); - app.linkPackage('webpack'); - app.linkPackage('@embroider/sample-transforms'); - - merge(app.files, { - app: { - templates: { - 'index.hbs': ` - - - - `, - 'curly.hbs': ` - {{hello-world useDynamic="first-choice" }} - {{hello-world useDynamic=(component "third-choice") }} - `, - components: { - 'first-choice.hbs': 'first', - 'second-choice.hbs': 'second', - 'third-choice.hbs': 'third', - 'module-name-check': { - 'index.hbs': '
hello world
', - }, - }, - }, - components: { - 'uses-inline-template.js': ` - import hbs from "htmlbars-inline-precompile"; - export default Component.extend({ - layout: hbs${'`'}{{first-choice}}${'`'} - }) - `, - }, - 'use-deep-addon.js': `import thing from 'deep-addon'`, - 'custom-babel-needed.js': `console.log('embroider-sample-transforms-target');`, - 'does-dynamic-import.js': ` - export default function() { - return import('some-library'); - } - `, - helpers: { - 'embroider-sample-transforms-module.js': 'export default function() {}', - }, - 'static-dir': { - 'my-library.js': '', - }, - 'static-dir-not-really': { - 'something.js': '', - }, - 'non-static-dir': { - 'another-library.js': '', - }, - 'top-level-static.js': '', - }, - public: { - 'public-file-1.txt': `initial state`, - }, - }); - - let addon = app.addAddon('my-addon'); - merge(addon.files, { - addon: { - components: { - 'hello-world.js': ` - import Component from '@ember/component'; - import layout from '../templates/components/hello-world'; - import computed from '@ember/object/computed'; - import somethingExternal from 'not-a-resolvable-package'; - export default Component.extend({ - dynamicComponentName: computed('useDynamic', function() { - return this.useDynamic || 'default-dynamic'; - }), - layout - }); - `, - 'has-relative-template.js': ` - import Component from '@ember/component'; - import layout from './t'; - export default Component.extend({ - layout - }); - `, - 't.hbs': ``, - 'uses-amd-require.js': ` - export default function() { - require('some-package'); - } - `, - }, - 'synthetic-import-1.js': '', - templates: { - components: { - 'hello-world.hbs': ` - {{component dynamicComponentName}} - `, - }, - }, - }, - app: { - components: { - 'hello-world.js': `export { default } from 'my-addon/components/hello-world'`, - }, - templates: { - components: { - 'direct-template-reexport.js': `export { default } from 'my-addon/templates/components/hello-world';`, - }, - }, - }, - public: { - 'package.json': JSON.stringify({ customStuff: { fromMyAddon: true }, name: 'should-be-overridden' }), - }, - }); - - let deepAddon = addon.addAddon('deep-addon'); - merge(deepAddon.files, { - addon: { - 'index.js': '// deep-addon index', - }, - }); - - app.addDependency('babel-filter-test1', '1.2.3').files = { - 'index.js': '', - }; - - app.addDependency('babel-filter-test2', '4.5.6').files = { - 'index.js': '', - }; - - app.addDependency('babel-filter-test3', '1.0.0').files = { - 'index.js': '', - }; - - app.addDependency('babel-filter-test4', '1.0.0').files = { - 'index.js': ` - module.exports = function() { - return require('some-package'); - } - `, - }; - - let options: Options = { - staticComponents: true, - staticHelpers: true, - skipBabel: [ - { - package: 'babel-filter-test1', - }, - { - package: 'babel-filter-test2', - semverRange: '^4.0.0', - }, - { - package: 'babel-filter-test3', - semverRange: '^2.0.0', - }, - ], - staticAppPaths: ['static-dir', 'top-level-static.js'], - packageRules: [ - { - package: 'my-addon', - components: { - '{{hello-world}}': { - acceptsComponentArguments: [ - { - name: 'useDynamic', - becomes: 'dynamicComponentName', - }, - ], - layout: { - addonPath: 'templates/components/hello-world.hbs', - }, - }, - }, - addonModules: { - 'components/hello-world.js': { - dependsOnModules: ['../synthetic-import-1'], - dependsOnComponents: ['{{second-choice}}'], - }, - }, - appModules: { - 'components/hello-world.js': { - dependsOnModules: ['my-addon/synthetic-import-1'], - }, - }, - }, - ], - }; - build = await BuildResult.build(app, { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - babel: { - plugins: [require.resolve('ember-auto-import/babel-plugin')], - }, - }, - embroiderOptions: options, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test('index.hbs', function () { - let assertFile = expectFile('templates/index.hbs').transform(build.transpile); - assertFile.matches(/import \w+ from ["']..\/components\/hello-world\.js["']/, 'explicit dependency'); - assertFile.matches( - /import \w+ from ["'].\/components\/third-choice\.hbs["']/, - 'static component helper dependency' - ); - assertFile.matches(/import \w+ from ["'].\/components\/first-choice\.hbs["']/, 'rule-driven string attribute'); - assertFile.matches( - /import \w+ from ["'].\/components\/second-choice\.hbs["']/, - 'rule-driven mustache string literal' - ); - }); - - test('curly.hbs', function () { - let assertFile = expectFile('templates/curly.hbs').transform(build.transpile); - assertFile.matches(/import \w+ from ["']..\/components\/hello-world\.js["']/, 'explicit dependency'); - assertFile.matches( - /import \w+ from ["'].\/components\/third-choice\.hbs["']/, - 'static component helper dependency' - ); - assertFile.matches(/import \w+ from ["'].\/components\/first-choice\.hbs["']/, 'rule-driven string attribute'); - }); - - test('hello-world.hbs', function () { - // the point of this test is to ensure that we can transpile with no - // warning about the dynamicComponentName. - let assertFile = expectFile('node_modules/my-addon/templates/components/hello-world.hbs').transform( - build.transpile - ); - - // this is a pretty trivial test, but it's needed to force the - // transpilation to happen because transform() is lazy. - assertFile.matches(/dynamicComponentName/); - }); - - test('addon/hello-world.js', function () { - let assertFile = expectFile('node_modules/my-addon/components/hello-world.js').transform(build.transpile); - assertFile.matches( - /window\.define\(["']\my-addon\/synthetic-import-1["'],\s*function\s\(\)\s*\{\s*return\s+esc\(require\(["']\.\.\/synthetic-import-1/ - ); - assertFile.matches( - /window\.define\(["']my-app\/templates\/components\/second-choice["'],\s*function\s\(\)\s*\{\s*return\s+esc\(require\(["']\.\.\/\.\.\/\.\.\/templates\/components\/second-choice\.hbs["']/ - ); - assertFile.matches( - /import somethingExternal from ["'].*\/externals\/not-a-resolvable-package["']/, - 'externals are handled correctly' - ); - }); - - test('app/hello-world.js', function () { - let assertFile = expectFile('./components/hello-world.js').transform(build.transpile); - assertFile.matches( - /window\.define\(["']\my-addon\/synthetic-import-1["'],\s*function\s\(\)\s*\{\s*return\s+esc\(require\(["']\.\.\/node_modules\/my-addon\/synthetic-import-1/ - ); - assertFile.matches( - /export \{ default \} from ['"]\.\.\/node_modules\/my-addon\/components\/hello-world['"]/, - 'remapped to precise copy of my-addon' - ); - }); - - test('app/templates/components/direct-template-reexport.js', function () { - let assertFile = expectFile('./templates/components/direct-template-reexport.js').transform(build.transpile); - assertFile.matches( - /export \{ default \} from ['"]\.\.\/\.\.\/node_modules\/my-addon\/templates\/components\/hello-world['"]/, - 'rewrites reexports of templates' - ); - }); - - test('uses-inline-template.js', function () { - let assertFile = expectFile('./components/uses-inline-template.js').transform(build.transpile); - assertFile.matches(/import a\d? from ["']\.\.\/templates\/components\/first-choice.hbs/); - assertFile.matches(/window\.define\(["']\my-app\/templates\/components\/first-choice["']/); - }); - - test('component with relative import of arbitrarily placed template', function () { - let assertFile = expectFile('node_modules/my-addon/components/has-relative-template.js').transform( - build.transpile - ); - assertFile.matches(/import layout from ["']\.\/t['"]/, 'arbitrary relative template remains the same'); - }); - - test('app can import a deep addon', function () { - let assertFile = expectFile('use-deep-addon.js').transform(build.transpile); - assertFile.matches(/import thing from ["']\.\/node_modules\/my-addon\/node_modules\/deep-addon['"]/); - }); - - test('amd require in an addon gets rewritten to window.require', function () { - let assertFile = expectFile('node_modules/my-addon/components/uses-amd-require.js').transform(build.transpile); - assertFile.matches(/window\.require\(['"]some-package['"]\)/, 'should find window.require'); - }); - - test('cjs require in non-ember package does not get rewritten to window.require', function () { - let assertFile = expectFile('node_modules/babel-filter-test4/index.js').transform(build.transpile); - assertFile.matches(/return require\(['"]some-package['"]\)/, 'should find plain cjs require'); - }); - - test('transpilation runs for ember addons', async function () { - expect(build.shouldTranspile('node_modules/my-addon/components/has-relative-template.js')).toBeTruthy(); - }); - - test('transpilation is skipped when package matches skipBabel', async function () { - expect(!build.shouldTranspile('node_modules/babel-filter-test1/index.js')).toBeTruthy(); - }); - - test('transpilation is skipped when package and version match skipBabel', async function () { - expect(!build.shouldTranspile('node_modules/babel-filter-test2/index.js')).toBeTruthy(); - }); - - test('transpilation runs when package version does not match skipBabel', async function () { - expect(build.shouldTranspile('node_modules/babel-filter-test3/index.js')).toBeTruthy(); - }); - - test('transpilation runs for non-ember package that is not explicitly skipped', async function () { - expect(build.shouldTranspile('node_modules/babel-filter-test4/index.js')).toBeTruthy(); - }); - - test(`app's babel plugins ran`, async function () { - let assertFile = expectFile('custom-babel-needed.js').transform(build.transpile); - assertFile.matches(/console\.log\(['"]embroider-sample-transforms-result['"]\)/); - }); - - test(`changes in app.css are propagated at rebuild`, async function () { - expectFile('assets/my-app.css').doesNotMatch('newly-added-class'); - writeFileSync(join(app.baseDir, 'app/styles/app.css'), `.newly-added-class { color: red }`); - build.didChange(join(app.baseDir, 'app/styles')); - await build.rebuild(); - expectFile('assets/my-app.css').matches('newly-added-class'); - }); - - test(`public assets are included`, async function () { - expectFile('public-file-1.txt').matches(/initial state/); - expectFile('package.json').json().get('ember-addon.assets').includes('public-file-1.txt'); - }); - - test(`updated public asset`, async function () { - writeFileSync(join(app.baseDir, 'public/public-file-1.txt'), `updated state`); - build.didChange(join(app.baseDir, 'app')); - await build.rebuild(); - expectFile('public-file-1.txt').matches(/updated state/); - }); - - test(`added public asset`, async function () { - writeFileSync(join(app.baseDir, 'public/public-file-2.txt'), `added`); - build.didChange(join(app.baseDir, 'app')); - await build.rebuild(); - expectFile('public-file-2.txt').matches(/added/); - expectFile('package.json').json().get('ember-addon.assets').includes('public-file-2.txt'); - }); - - test(`removed public asset`, async function () { - unlinkSync(join(app.baseDir, 'public/public-file-1.txt')); - build.didChange(join(app.baseDir, 'app')); - await build.rebuild(); - expectFile('public-file-1.txt').doesNotExist(); - expectFile('package.json').json().get('ember-addon.assets').doesNotInclude('public-file-1.txt'); - }); - - test('dynamic import is preserved', function () { - expectFile('./does-dynamic-import.js') - .transform(build.transpile) - .matches(/return import\(['"]some-library['"]\)/); - }); - - test('hbs transform sees expected module name', function () { - let assertFile = expectFile('templates/components/module-name-check/index.hbs').transform(build.transpile); - assertFile.matches( - '"my-app/templates/components/module-name-check/index.hbs"', - 'our sample transform injected the expected moduleName into the compiled template' - ); - }); - - test('non-static other paths are included in the entrypoint', function () { - expectFile('assets/my-app.js').matches(/i\("..\/non-static-dir\/another-library\.js"\)/); - }); - - test('static other paths are not included in the entrypoint', function () { - expectFile('assets/my-app.js').doesNotMatch(/i\("..\/static-dir\/my-library\.js"\)/); - }); - - test('top-level static other paths are not included in the entrypoint', function () { - expectFile('assets/my-app.js').doesNotMatch(/i\("..\/top-level-static\.js"\)/); - }); - - test('staticAppPaths do not match partial path segments', function () { - expectFile('assets/my-app.js').matches(/i\("..\/static-dir-not-really\/something\.js"\)/); - }); - }); - - describe('addon dummy app', function () { - let build: BuildResult; - let expectFile: ExpectFile; - - beforeAll(async function () { - let app = Project.addonNew(); - merge(app.files, { - addon: { - components: { - 'hello-world.js': ` - import { isDevelopingThisPackage } from '@embroider/macros'; - console.log(isDevelopingThisPackage());`, - }, - }, - tests: { - dummy: { - app: { - components: { - 'inside-dummy-app.js': ` - import { isDevelopingThisPackage } from '@embroider/macros'; - console.log(isDevelopingThisPackage());`, - }, - }, - }, - }, - }); - build = await BuildResult.build(app, { - stage: 2, - type: 'addon', - emberAppOptions: { - tests: false, - }, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test('dummy app sees that its being developed', function () { - let assertFile = expectFile('components/inside-dummy-app.js').transform(build.transpile); - assertFile.matches(/console\.log\(true\)/); - }); - - test('addon within dummy app sees that its being developed', function () { - let assertFile = expectFile( - resolve.sync('my-addon/components/hello-world', { - basedir: build.outputPath, - }) - ).transform(build.transpile); - assertFile.matches(/console\.log\(true\)/); - }); - }); - - describe('engines with css', function () { - let build: BuildResult; - let expectFile: ExpectFile; - - beforeAll(async function () { - let app = Project.emberNew(); - let buildOptions: Partial = { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - babel: { - plugins: [], - }, - }, - embroiderOptions: {}, - }; - - app.linkPackage('ember-engines'); - - let lazyEngine = app.addEngine('lazy-engine', true); - let eagerEngine = app.addEngine('eager-engine', false); - - merge(lazyEngine.files, { - addon: { - styles: { - 'addon.css': `.lazy { background-color: red; }`, - }, - }, - }); - - merge(eagerEngine.files, { - addon: { - styles: { - 'addon.css': `.eager { background-color: blue; }`, - }, - }, - }); - - build = await BuildResult.build(app, buildOptions); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test('lazy engines appear in _embroiderEngineBundles_', function () { - expectFile('assets/my-app.js').matches(`w._embroiderEngineBundles_ = [ - { - names: ["lazy-engine"], - load: function() { - return import("./_engine_/lazy-engine.js"); - } - }, -]`); - }); - - test('lazy engine css is imported', function () { - expectFile('assets/_engine_/lazy-engine.js') - .matches(` if (macroCondition(!getGlobalConfig().fastboot?.isRunning)) { -i(\"../../node_modules/lazy-engine/lazy-engine.css\"); - }`); - }); - - test('eager engine css is merged with vendor.css', function () { - expectFile('assets/vendor.css').matches(`.eager { background-color: blue; }`); - }); - }); - - describe('lazy engines without css', function () { - let build: BuildResult; - let expectFile: ExpectFile; - - beforeAll(async function () { - let app = Project.emberNew(); - let buildOptions: Partial = { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - babel: { - plugins: [], - }, - }, - embroiderOptions: {}, - }; - - app.linkPackage('ember-engines'); - app.addEngine('lazy-engine', true); - - build = await BuildResult.build(app, buildOptions); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test('lazy engine css is not imported', function () { - expectFile('assets/_engine_/lazy-engine.js') - .doesNotMatch(` if (macroCondition(!getGlobalConfig().fastboot?.isRunning)) { -i(\"../../node_modules/lazy-engine/lazy-engine.css\"); - }`); - }); - }); -}); diff --git a/packages/compat/tests/template-colocation.test.ts b/packages/compat/tests/template-colocation.test.ts deleted file mode 100644 index 46445d50b..000000000 --- a/packages/compat/tests/template-colocation.test.ts +++ /dev/null @@ -1,314 +0,0 @@ -import { Project, BuildResult, ExpectFile, expectFilesAt } from '@embroider/test-support'; - -import { throwOnWarnings } from '@embroider/core'; -import Options from '../src/options'; -import merge from 'lodash/merge'; - -describe('template colocation', function () { - jest.setTimeout(120000); - let expectFile: ExpectFile; - let build: BuildResult; - let app: Project; - - throwOnWarnings(); - - beforeAll(async function () { - app = Project.emberNew(); - - merge(app.files, { - config: { - 'targets.js': `module.exports = { browsers: ['last 1 Chrome versions'] }`, - }, - app: { - templates: { - 'index.hbs': ` - - - `, - }, - components: { - 'has-colocated-template.js': ` - import Component from '@glimmer/component'; - export default class extends Component {} - `, - 'has-colocated-template.hbs': `
{{this.title}}
`, - 'template-only-component.hbs': `
I am template only
`, - }, - }, - }); - - let addon = app.addAddon('my-addon'); - merge(addon.files, { - app: { - components: { - 'component-one.js': `export { default } from 'my-addon/components/component-one';`, - }, - }, - addon: { - components: { - 'component-one.js': ` - import Component from '@glimmer/component'; - export default class extends Component {} - `, - 'component-one.hbs': `component one template`, - 'component-two.hbs': `component two templates`, - }, - }, - }); - - let options: Options = { - // our tests are going to check for how the components get implicitly - // included, so this must be false. - staticComponents: false, - }; - - build = await BuildResult.build(app, { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - }, - embroiderOptions: options, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test(`app's colocated template is associated with JS`, function () { - let assertFile = expectFile('components/has-colocated-template.js').transform(build.transpile); - assertFile.matches(/import TEMPLATE from ['"]\.\/has-colocated-template.hbs['"];/, 'imported template'); - assertFile.matches(/const setComponentTemplate = Ember\._setComponentTemplate;/, 'found setComponentTemplate'); - assertFile.matches( - /export default setComponentTemplate\(TEMPLATE, class extends Component \{\}/, - 'default export is wrapped' - ); - }); - - test(`app's template-only component JS is synthesized`, function () { - let assertFile = expectFile('components/template-only-component.js').transform(build.transpile); - assertFile.matches(/import TEMPLATE from ['"]\.\/template-only-component.hbs['"];/, 'imported template'); - assertFile.matches(/const setComponentTemplate = Ember\._setComponentTemplate;/, 'found setComponentTemplate'); - assertFile.matches( - /export default setComponentTemplate\(TEMPLATE, Ember._templateOnlyComponent\(\)\)/, - 'default export is wrapped' - ); - }); - - test(`app's colocated components are implicitly included correctly`, function () { - let assertFile = expectFile('assets/my-app.js'); - assertFile.matches( - /d\(["']my-app\/components\/has-colocated-template["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/has-colocated-template\.js['"]\);\s*\}/ - ); - assertFile.matches( - /d\(["']my-app\/components\/template-only-component["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/template-only-component\.js['"]\);\s*\}/ - ); - }); - - test(`addon's colocated template is associated with JS`, function () { - let assertFile = expectFile('node_modules/my-addon/components/component-one.js').transform(build.transpile); - assertFile.matches(/import TEMPLATE from ['"]\.\/component-one.hbs['"];/, 'imported template'); - assertFile.matches(/const setComponentTemplate = Ember\._setComponentTemplate;/, 'found setComponentTemplate'); - assertFile.matches( - /export default setComponentTemplate\(TEMPLATE, class extends Component \{\}/, - 'default export is wrapped' - ); - }); - - test(`addon's template-only component JS is synthesized`, function () { - let assertFile = expectFile('node_modules/my-addon/components/component-two.js').transform(build.transpile); - assertFile.matches(/import TEMPLATE from ['"]\.\/component-two.hbs['"];/, 'imported template'); - assertFile.matches(/const setComponentTemplate = Ember\._setComponentTemplate;/, 'found setComponentTemplate'); - assertFile.matches( - /export default setComponentTemplate\(TEMPLATE, Ember._templateOnlyComponent\(\)\)/, - 'default export is wrapped' - ); - }); - - test(`addon's colocated components are correct in implicit-modules`, function () { - let assertFile = expectFile('node_modules/my-addon/package.json').json(); - assertFile.get(['ember-addon', 'implicit-modules']).includes('./components/component-one'); - assertFile.get(['ember-addon', 'implicit-modules']).includes('./components/component-two'); - assertFile.get(['ember-addon', 'implicit-modules']).doesNotInclude('./components/component-one.hbs'); - assertFile.get(['ember-addon', 'implicit-modules']).doesNotInclude('./components/component-two.hbs'); - }); -}); - -describe('template colocation with staticComponents', function () { - jest.setTimeout(120000); - let expectFile: ExpectFile; - let build: BuildResult; - let app: Project; - - throwOnWarnings(); - - beforeAll(async function () { - app = Project.emberNew(); - - merge(app.files, { - config: { - 'targets.js': `module.exports = { browsers: ['last 1 Chrome versions'] }`, - }, - app: { - templates: { - 'index.hbs': ` - - - `, - }, - components: { - 'has-colocated-template.js': ` - import Component from '@glimmer/component'; - export default class extends Component {} - `, - 'has-colocated-template.hbs': `
{{this.title}}
`, - 'template-only-component.hbs': `
I am template only
`, - }, - }, - }); - - let addon = app.addAddon('my-addon'); - merge(addon.files, { - app: { - components: { - 'component-one.js': `export { default } from 'my-addon/components/component-one';`, - }, - }, - addon: { - components: { - 'component-one.js': ` - import Component from '@glimmer/component'; - export default class extends Component {} - `, - 'component-one.hbs': `component one template`, - 'component-two.hbs': `component two templates`, - }, - }, - }); - - let options: Options = { - staticComponents: true, - staticAddonTrees: true, - }; - - build = await BuildResult.build(app, { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - }, - embroiderOptions: options, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test(`app's colocated components are not implicitly included`, function () { - let assertFile = expectFile('assets/my-app.js'); - assertFile.doesNotMatch( - /d\(["']my-app\/components\/has-colocated-template["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/has-colocated-template['"]\);\s*\}/ - ); - assertFile.doesNotMatch( - /d\(["']my-app\/components\/template-only-component["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/template-only-component['"]\);\s*\}/ - ); - }); - - test(`addon's colocated components are not in implicit-modules`, function () { - let assertFile = expectFile('node_modules/my-addon/package.json').json(); - assertFile.get(['ember-addon', 'implicit-modules']).equals(undefined); - }); -}); - -describe('not to be confused with the pod component', function () { - jest.setTimeout(120000); - let expectFile: ExpectFile; - let build: BuildResult; - let app: Project; - - throwOnWarnings(); - - beforeAll(async function () { - app = Project.emberNew(); - - merge(app.files, { - config: { - 'environment.js': `module.exports = function(environment) { - let ENV = { - modulePrefix: 'my-app', - podModulePrefix: '', - environment, - rootURL: '/', - locationType: 'auto', - EmberENV: { - FEATURES: { - }, - EXTEND_PROTOTYPES: { - Date: false - } - }, - APP: {} - }; - return ENV; -};`, - }, - app: { - templates: { - 'index.hbs': ` - - - `, - }, - components: { - 'pod-component': { - 'component.js': ` - import Component from '@glimmer/component'; - export default class extends Component {} - `, - 'template.hbs': `
{{this.title}}
`, - }, - 'template-only': { - 'template.hbs': `
I am template only
`, - }, - }, - }, - }); - - let options: Options = { - // our tests are going to check for how the components get implicitly - // included, so this must be false. - staticComponents: false, - }; - - build = await BuildResult.build(app, { - stage: 2, - type: 'app', - emberAppOptions: { - tests: false, - }, - embroiderOptions: options, - }); - expectFile = expectFilesAt(build.outputPath); - }); - - afterAll(async function () { - await build.cleanup(); - }); - - test(`app's pod components and templates are implicitly included correctly`, function () { - let assertFile = expectFile('assets/my-app.js'); - assertFile.matches( - /d\(["']my-app\/components\/pod-component\/component["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/pod-component\/component\.js['"]\);\}\)/ - ); - assertFile.matches( - /d\(["']my-app\/components\/pod-component\/template["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/pod-component\/template\.hbs['"]\);\}\)/ - ); - assertFile.matches( - /d\(["']my-app\/components\/template-only\/template["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/template-only\/template\.hbs['"]\);\s*\}/ - ); - }); -}); diff --git a/packages/core/src/app.ts b/packages/core/src/app.ts index dc76b8972..6467efd64 100644 --- a/packages/core/src/app.ts +++ b/packages/core/src/app.ts @@ -34,7 +34,6 @@ import { AppFiles, Engine, EngineSummary, RouteFiles } from './app-files'; import partition from 'lodash/partition'; import mergeWith from 'lodash/mergeWith'; import cloneDeep from 'lodash/cloneDeep'; -import type { Params as InlineBabelParams } from './babel-plugin-inline-hbs-node'; import { PortableHint, maybeNodeModuleVersion } from './portable'; import escapeRegExp from 'escape-string-regexp'; import { getEmberExports } from './load-ember-template-compiler'; @@ -385,32 +384,16 @@ export class AppBuilder { // https://github.com/webpack/webpack/issues/12154 babel.plugins.push(require.resolve('./rename-require-plugin')); - if (this.adapter.adjustImportsOptions().emberNeedsModulesPolyfill) { - // on older ember versions that need the modules-api-polyfill, we use our - // bespoke inline template compiler plugin. - babel.plugins.push([ - join(__dirname, 'babel-plugin-inline-hbs-node.js'), - { - templateCompiler: templateCompilerParams, - stage: 3, - } as InlineBabelParams, - ]); - } else { - // on newer ember versions that don't need the modules-api-polyfill, we - // can compose with the newer babel-plugin-ember-template-compilation, and - // use a simpler plugin that only needs to handle inserting discovered - // dependencies. - babel.plugins.push([ - join(__dirname, '../src/babel-plugin-inline-hbs-deps-node.js'), - { templateCompiler: templateCompilerParams }, - ]); - babel.plugins.push([ - require.resolve('babel-plugin-ember-template-compilation'), - { - precompilerPath: join(__dirname, '../src/babel-plugin-inline-hbs-deps-node.js'), - } as InlinePrecompileOptions, - ]); - } + babel.plugins.push([ + join(__dirname, '../src/babel-plugin-inline-hbs-deps-node.js'), + { templateCompiler: templateCompilerParams }, + ]); + babel.plugins.push([ + require.resolve('babel-plugin-ember-template-compilation'), + { + precompilerPath: join(__dirname, '../src/babel-plugin-inline-hbs-deps-node.js'), + } as InlinePrecompileOptions, + ]); // this is @embroider/macros configured for full stage3 resolution babel.plugins.push(...this.macrosConfig.babelPluginConfig()); @@ -441,7 +424,7 @@ export class AppBuilder { let relocatedFiles: AdjustImportsOptions['relocatedFiles'] = {}; for (let { destPath, appFiles } of engines) { for (let [relativePath, originalPath] of appFiles.relocatedFiles) { - relocatedFiles[join(destPath, relativePath).split(sep).join('/')] = originalPath; + relocatedFiles[join(destPath, relativePath)] = originalPath; } } let relocatedFilesPath = join(this.root, '_relocated_files.json'); @@ -1099,11 +1082,7 @@ export class AppBuilder { private get staticAppPathsPattern(): RegExp | undefined { if (this.options.staticAppPaths.length > 0) { return new RegExp( - '^(?:' + - this.options.staticAppPaths.map(staticAppPath => escapeRegExp(staticAppPath.replace(/\//g, sep))).join('|') + - ')(?:$|' + - sep + - ')' + '^(?:' + this.options.staticAppPaths.map(staticAppPath => escapeRegExp(staticAppPath)).join('|') + ')(?:$|/)' ); } } diff --git a/packages/core/src/babel-plugin-adjust-imports.ts b/packages/core/src/babel-plugin-adjust-imports.ts index bd7f99c82..99c8b87b5 100644 --- a/packages/core/src/babel-plugin-adjust-imports.ts +++ b/packages/core/src/babel-plugin-adjust-imports.ts @@ -6,7 +6,6 @@ import type { types as t } from '@babel/core'; import { PackageCache, Package, V2Package, explicitRelative } from '@embroider/shared-internals'; import { Memoize } from 'typescript-memoize'; import { compile } from './js-handlebars'; -import { handleImportDeclaration } from './mini-modules-polyfill'; import { ImportUtil } from 'babel-import-util'; import { randomBytes } from 'crypto'; import { outputFileSync, pathExistsSync, renameSync } from 'fs-extra'; @@ -41,7 +40,6 @@ export interface Options { }; relocatedFiles: { [relativePath: string]: string }; resolvableExtensions: string[]; - emberNeedsModulesPolyfill: boolean; appRoot: string; } @@ -386,7 +384,7 @@ export default function main(babel: typeof Babel) { exit(path: NodePath, state: State) { for (let child of path.get('body')) { if (child.isImportDeclaration() || child.isExportNamedDeclaration() || child.isExportAllDeclaration()) { - rewriteTopLevelImport(t, child, state); + rewriteTopLevelImport(child, state); } } }, @@ -445,7 +443,6 @@ export default function main(babel: typeof Babel) { } function rewriteTopLevelImport( - t: BabelTypes, path: NodePath, state: State ) { @@ -455,14 +452,6 @@ function rewriteTopLevelImport( return; } - if (opts.emberNeedsModulesPolyfill && path.isImportDeclaration()) { - let replacement = handleImportDeclaration(t, path); - if (replacement) { - path.replaceWith(replacement); - return; - } - } - let specifier = adjustSpecifier(source.value, state.adjustFile, opts, false); if (specifier !== source.value) { source.value = specifier; diff --git a/packages/core/src/babel-plugin-inline-hbs-node.ts b/packages/core/src/babel-plugin-inline-hbs-node.ts deleted file mode 100644 index bc5a46044..000000000 --- a/packages/core/src/babel-plugin-inline-hbs-node.ts +++ /dev/null @@ -1,18 +0,0 @@ -/* - This plugin is used only for Ember < 3.27. For newer Ember's we have a - different implementation that shares the standard - babel-plugin-ember-template-compilation and supports passing Javascript - lexically scoped names into templates. -*/ - -import { NodeTemplateCompiler, NodeTemplateCompilerParams } from './template-compiler-node'; -import make from './babel-plugin-inline-hbs'; -import type * as Babel from '@babel/core'; - -export interface Params { - templateCompiler: NodeTemplateCompilerParams; -} - -export default make((opts: Params) => new NodeTemplateCompiler(opts.templateCompiler)) as ( - babel: typeof Babel -) => babel.PluginObj; diff --git a/packages/core/src/babel-plugin-inline-hbs.ts b/packages/core/src/babel-plugin-inline-hbs.ts deleted file mode 100644 index 72ebe03e3..000000000 --- a/packages/core/src/babel-plugin-inline-hbs.ts +++ /dev/null @@ -1,197 +0,0 @@ -/* - This plugin is used only for Ember < 3.27. For newer Ember's we have a - different implementation that shares the standard - babel-plugin-ember-template-compilation and supports passing Javascript - lexically scoped names into templates. -*/ - -import type { types as t } from '@babel/core'; -import type * as Babel from '@babel/core'; -import type { NodePath } from '@babel/traverse'; -import { join } from 'path'; -import type { TemplateCompiler } from './template-compiler-common'; -import { parse } from '@babel/core'; -import { ResolvedDep } from './resolver'; -import { ImportUtil } from 'babel-import-util'; -import { templateCompilationModules } from '@embroider/shared-internals'; - -type BabelTypes = typeof t; - -interface State { - opts: O; - file: { - code: string; - opts: { - filename: string; - }; - }; - dependencies: Map; - templateCompiler: TemplateCompiler | undefined; - adder: ImportUtil; -} - -export default function make(getCompiler: (opts: O) => TemplateCompiler) { - function inlineHBSTransform(babel: typeof Babel): Babel.PluginObj> { - let t = babel.types; - return { - visitor: { - Program: { - enter(path: NodePath, state: State) { - state.dependencies = new Map(); - state.adder = new ImportUtil(t, path); - }, - exit(path: NodePath, state: State) { - for (let { module, exportedName } of templateCompilationModules) { - state.adder.removeImport(module, exportedName); - } - let counter = 0; - for (let dep of state.dependencies.values()) { - path.node.body.unshift(amdDefine(dep.runtimeName, counter, t)); - path.node.body.unshift( - t.importDeclaration( - [t.importDefaultSpecifier(t.identifier(`a${counter++}`))], - t.stringLiteral(dep.path) - ) - ); - } - }, - }, - TaggedTemplateExpression(path: NodePath, state: State) { - for (let { module, exportedName } of templateCompilationModules) { - if (path.get('tag').referencesImport(module, exportedName)) { - handleTagged(path, state, t); - } - } - }, - CallExpression(path: NodePath, state: State) { - for (let { module, exportedName } of templateCompilationModules) { - if (path.get('callee').referencesImport(module, exportedName)) { - handleCalled(path, state, t); - } - } - }, - }, - }; - } - - inlineHBSTransform._parallelBabel = { - requireFile: __filename, - }; - - inlineHBSTransform.baseDir = function () { - return join(__dirname, '..'); - }; - - function handleTagged(path: NodePath, state: State, t: BabelTypes) { - if (path.node.quasi.expressions.length) { - throw path.buildCodeFrameError('placeholders inside a tagged template string are not supported'); - } - let template = path.node.quasi.quasis.map(quasi => quasi.value.cooked).join(''); - let { compiled, dependencies } = compiler(state).precompile(template, { filename: state.file.opts.filename }); - for (let dep of dependencies) { - state.dependencies.set(dep.runtimeName, dep); - } - - path.replaceWith( - t.callExpression(state.adder.import(path, '@ember/template-factory', 'createTemplateFactory'), [ - jsonLiteral(compiled, t), - ]) - ); - } - - function handleCalled(path: NodePath, state: State, t: BabelTypes) { - let { template, insertRuntimeErrors } = getCallArguments(path); - let compilerInstance = compiler(state); - - let result: ReturnType; - try { - result = compilerInstance.precompile(template, { filename: state.file.opts.filename, insertRuntimeErrors }); - } catch (err) { - if (insertRuntimeErrors) { - path.replaceWith( - t.callExpression( - t.functionExpression( - null, - [], - t.blockStatement([ - t.throwStatement(t.newExpression(t.identifier('Error'), [t.stringLiteral(err.message)])), - ]) - ), - [] - ) - ); - return; - } - throw err; - } - let { compiled, dependencies } = result; - for (let dep of dependencies) { - state.dependencies.set(dep.runtimeName, dep); - } - path.replaceWith( - t.callExpression(state.adder.import(path, '@ember/template-factory', 'createTemplateFactory'), [ - jsonLiteral(compiled, t), - ]) - ); - } - - function jsonLiteral(value: unknown | undefined, t: BabelTypes) { - if (typeof value === 'undefined') { - return t.identifier('undefined'); - } - let ast = parse(`a(${value})`, {}) as t.File; - let statement = ast.program.body[0] as t.ExpressionStatement; - let expression = statement.expression as t.CallExpression; - return expression.arguments[0]; - } - - function compiler(state: State) { - if (!state.templateCompiler) { - state.templateCompiler = getCompiler(state.opts); - } - return state.templateCompiler; - } - - function amdDefine(runtimeName: string, importCounter: number, t: BabelTypes) { - return t.expressionStatement( - t.callExpression(t.memberExpression(t.identifier('window'), t.identifier('define')), [ - t.stringLiteral(runtimeName), - t.functionExpression(null, [], t.blockStatement([t.returnStatement(t.identifier(`a${importCounter}`))])), - ]) - ); - } - - function getTemplateString(template: any, path: NodePath): string { - if (template?.type === 'StringLiteral') { - return template.value; - } - // treat inert TemplateLiteral (without subexpressions) like a StringLiteral - if (template?.type === 'TemplateLiteral' && !template.expressions.length) { - return template.quasis[0].value.cooked; - } - throw path.buildCodeFrameError('hbs accepts only a string literal argument'); - } - - function getCallArguments(path: NodePath): { template: string; insertRuntimeErrors: boolean } { - let [template, options] = path.node.arguments; - - let insertRuntimeErrors = - options?.type === 'ObjectExpression' && - options.properties.some( - prop => - prop.type === 'ObjectProperty' && - prop.computed === false && - prop.key.type === 'Identifier' && - prop.key.name === 'insertRuntimeErrors' && - prop.value.type === 'BooleanLiteral' && - prop.value.value - ); - - return { - template: getTemplateString(template, path), - insertRuntimeErrors, - }; - } - - return inlineHBSTransform; -} diff --git a/packages/core/src/messages.ts b/packages/core/src/messages.ts index bcff24f06..4b5368551 100644 --- a/packages/core/src/messages.ts +++ b/packages/core/src/messages.ts @@ -37,10 +37,20 @@ export function warn(message: string, ...params: any[]) { // for use in our test suites let hardFailMode = 0; -export function throwOnWarnings() { - // Jest mode - beforeAll(() => hardFailMode++); - afterAll(() => hardFailMode--); +export function throwOnWarnings(hooks?: NestedHooks) { + if (hooks) { + // qunit mode + hooks.before(() => { + hardFailMode++; + }); + hooks.after(() => { + hardFailMode--; + }); + } else { + // Jest mode + beforeAll(() => hardFailMode++); + afterAll(() => hardFailMode--); + } } export function expectWarning(pattern: RegExp, fn: () => void) { diff --git a/packages/core/src/mini-modules-polyfill.ts b/packages/core/src/mini-modules-polyfill.ts deleted file mode 100644 index 2c05657b6..000000000 --- a/packages/core/src/mini-modules-polyfill.ts +++ /dev/null @@ -1,88 +0,0 @@ -import type { types as t } from '@babel/core'; -import type { NodePath } from '@babel/traverse'; - -type BabelTypes = typeof t; - -// this is intentionally not the whole babel-plugin-ember-modules-api-polyfill. -// That runs very early, so any usage of polyfilled imports that gets emitted by -// our other babel plugins can't take advantage of it. -// -// If I was going to try to do this properly, I would change -// babel-plugin-ember-modules-api-polyfill to run very late in the game, like -// this code does, so that other plugins could always not worry about it. But -// seeing as modules-api-polyfill is already on the way out, it's simpler to -// just handle the small piece of its functionality that matter to us: -// -// - all our usage (emitted by our babel plugins) is static imports, not dynamic -// ones, so it's OK to just walk the top level, saving us the cost of a full -// traverse -// - we only emit a handful of specific imports that are easy to just list here -// -// -let replacements: { [moduleSpecifier: string]: { [name: string]: ((t: BabelTypes) => t.Expression) | undefined } } = { - '@ember/component/template-only': { - default(t: BabelTypes) { - return t.memberExpression(t.identifier('Ember'), t.identifier('_templateOnlyComponent')); - }, - }, - '@ember/template-factory': { - createTemplateFactory(t) { - return t.memberExpression( - t.memberExpression(t.identifier('Ember'), t.identifier('HTMLBars')), - t.identifier('template') - ); - }, - }, - '@ember/component': { - default(t: BabelTypes) { - return t.memberExpression(t.identifier('Ember'), t.identifier('Component')); - }, - setComponentTemplate(t: BabelTypes) { - return t.memberExpression(t.identifier('Ember'), t.identifier('_setComponentTemplate')); - }, - }, -}; - -export default function miniModulesPolyfill(babel: unknown) { - let t = (babel as any).types as BabelTypes; - return { - visitor: { - Program: { - exit(path: NodePath) { - for (let child of path.get('body')) { - if (child.isImportDeclaration()) { - let replacement = handleImportDeclaration(t, child); - if (replacement) { - path.replaceWith(replacement); - } - } - } - }, - }, - }, - }; -} - -export function handleImportDeclaration(t: BabelTypes, path: NodePath) { - let match = replacements[path.node.source.value]; - if (match) { - let specifiers = path.get('specifiers'); - let replacers = specifiers.map(specifier => ({ replacer: match[specifier.node.local.name], specifier })); - if (replacers.every(r => Boolean(r.replacer))) { - path.replaceWith( - t.variableDeclaration( - 'const', - replacers.map(r => t.variableDeclarator(r.specifier.node.local, r.replacer!(t))) - ) - ); - } else { - for (let { specifier, replacer } of replacers) { - if (replacer) { - path.insertAfter(t.variableDeclaration('const', [t.variableDeclarator(specifier.node.local, replacer(t))])); - specifier.remove(); - } - } - } - } - return undefined; -} diff --git a/packages/core/tests/babel-plugin-adjust-imports.test.ts b/packages/core/tests/babel-plugin-adjust-imports.test.ts index d7ae0648d..d202c5cb4 100644 --- a/packages/core/tests/babel-plugin-adjust-imports.test.ts +++ b/packages/core/tests/babel-plugin-adjust-imports.test.ts @@ -94,7 +94,6 @@ describe('babel-plugin-adjust-imports', function () { relocatedFiles: {}, externalsDir: 'test', resolvableExtensions: ['.js', '.hbs'], - emberNeedsModulesPolyfill: false, appRoot: '/nonexistent', }; diff --git a/packages/core/tests/inline-hbs.test.ts b/packages/core/tests/inline-hbs.test.ts deleted file mode 100644 index 5a865ab37..000000000 --- a/packages/core/tests/inline-hbs.test.ts +++ /dev/null @@ -1,247 +0,0 @@ -import { allBabelVersions, emberTemplateCompilerPath } from '@embroider/test-support'; -import { join } from 'path'; -import { NodeTemplateCompilerParams } from '../src/template-compiler-node'; -import sampleTransform from '@embroider/sample-transforms/lib/glimmer-plugin'; -import type { Params as InlineBabelParams } from '../src/babel-plugin-inline-hbs-node'; -import type { Params as Stage1InlineBabelParams } from '../src/babel-plugin-stage1-inline-hbs-node'; -import type { Options as InlinePrecompileOptions } from 'babel-plugin-ember-template-compilation'; -import { Resolver } from '../src'; -import { ResolvedDep } from '../src/resolver'; - -function stage1Tests(transform: (code: string) => string) { - test('template literal form', () => { - let code = transform(` - import hbs from 'htmlbars-inline-precompile'; - export default function() { - return hbs${'`'}
${'`'}; - } - `); - expect(code).toMatch(/import hbs from 'htmlbars-inline-precompile'/); - expect(code).toMatch(/return hbs`
{ - let code = transform(` - import hbs from 'htmlbars-inline-precompile'; - export default function() { - return hbs("
"); - } - `); - expect(code).toMatch(/import hbs from 'htmlbars-inline-precompile'/); - expect(code).toMatch(/return hbs\("
{ - let code = transform(` - import hbs from 'htmlbars-inline-precompile'; - export default function() { - return hbs(\`
\`); - } - `); - expect(code).toMatch(/import hbs from 'htmlbars-inline-precompile'/); - expect(code).toMatch(/return hbs\("
{ - let code = transform(` - import hbs from 'htmlbars-inline-precompile'; - export default function() { - return hbs("
", { insertRuntimeErrors: true }); - } - `); - expect(code).toMatch(/import hbs from 'htmlbars-inline-precompile'/); - expect(code).toMatch(/return hbs\("
",\s*\{\s*insertRuntimeErrors: true\s*\}\)/); - }); -} - -function stage3Tests(transform: (code: string) => string) { - test('discovered dependencies are added', () => { - let code = transform(` - import hbs from 'htmlbars-inline-precompile'; - export default function() { - return hbs${'`'}${'`'}; - } - `); - expect(code).toMatch(/import a0 from "\.\/components\/foo\.js"/); - expect(code).toMatch(/window\.define\("my-app\/components\/foo", function/); - }); - - test('tagged template literal form', () => { - let code = transform(` - import hbs from 'htmlbars-inline-precompile'; - export default function() { - return hbs${'`'}
${'`'}; - } - `); - expect(code).not.toMatch(/import hbs from 'htmlbars-inline-precompile'/); - expect(code).toMatch(/import { createTemplateFactory } from ['"]@ember\/template-factory['"]/); - expect(code).toMatch(/return createTemplateFactory\(/); - }); - test('call form', () => { - let code = transform(` - import hbs from 'htmlbars-inline-precompile'; - export default function() { - return hbs("
"); - } - `); - expect(code).not.toMatch(/import hbs from 'htmlbars-inline-precompile'/); - expect(code).toMatch(/import { createTemplateFactory } from ['"]@ember\/template-factory['"]/); - expect(code).toMatch(/return createTemplateFactory\(/); - }); - test('call form with template literal', () => { - let code = transform(` - import hbs from 'htmlbars-inline-precompile'; - export default function() { - return hbs(\`
\`); - } - `); - expect(code).not.toMatch(/import hbs from 'htmlbars-inline-precompile'/); - expect(code).toMatch(/import { createTemplateFactory } from ['"]@ember\/template-factory['"]/); - expect(code).toMatch(/return createTemplateFactory\(/); - }); - test('runtime errors become exceptions in stage 3', () => { - let code = transform(` - import hbs from 'htmlbars-inline-precompile'; - export default function() { - return hbs("
", { insertRuntimeErrors: true }); - } - `); - expect(code).not.toMatch(/import hbs from 'htmlbars-inline-precompile'/); - expect(code).toMatch(/throw new Error\("Unclosed element `div`/); - }); -} - -describe('inline-hbs', () => { - describe('stage1 non-module-ember', () => { - allBabelVersions({ - babelConfig() { - let templateCompiler: NodeTemplateCompilerParams = { - compilerPath: emberTemplateCompilerPath(), - compilerChecksum: `mock-compiler-checksum${Math.random()}`, - EmberENV: {}, - plugins: { - ast: [sampleTransform], - }, - }; - return { - plugins: [ - [ - join(__dirname, '../src/babel-plugin-stage1-inline-hbs-node.js'), - { templateCompiler } as Stage1InlineBabelParams, - ], - ], - }; - }, - createTests: stage1Tests, - }); - }); - - describe('stage1 module-ember', () => { - allBabelVersions({ - babelConfig() { - let templateCompiler: NodeTemplateCompilerParams = { - compilerPath: emberTemplateCompilerPath(), - compilerChecksum: `mock-compiler-checksum${Math.random()}`, - EmberENV: {}, - plugins: { - ast: [sampleTransform], - }, - }; - return { - plugins: [ - [ - join(__dirname, '../src/babel-plugin-stage1-inline-hbs-node.js'), - { templateCompiler } as Stage1InlineBabelParams, - ], - ], - }; - }, - createTests: stage1Tests, - }); - }); - - describe('stage3 non-module-ember', () => { - allBabelVersions({ - includePresetsTests: true, - babelConfig() { - let templateCompiler: NodeTemplateCompilerParams = { - compilerPath: emberTemplateCompilerPath(), - compilerChecksum: `mock-compiler-checksum${Math.random()}`, - EmberENV: {}, - plugins: { - ast: [], - }, - resolver: new StubResolver(), - }; - return { - plugins: [ - [ - join(__dirname, '../src/babel-plugin-inline-hbs-node.js'), - { templateCompiler, stage: 3, needsModulesPolyfill: true } as InlineBabelParams, - ], - ], - }; - }, - createTests: stage3Tests, - }); - }); - - describe('stage3 module-ember', () => { - allBabelVersions({ - includePresetsTests: false, - babelConfig() { - let templateCompiler: NodeTemplateCompilerParams = { - compilerPath: emberTemplateCompilerPath(), - compilerChecksum: `mock-compiler-checksum${Math.random()}`, - EmberENV: {}, - plugins: { - ast: [], - }, - resolver: new StubResolver(), - }; - return { - plugins: [ - [join(__dirname, '../src/babel-plugin-inline-hbs-deps-node.js'), { templateCompiler }], - [ - require.resolve('babel-plugin-ember-template-compilation'), - { - precompilerPath: join(__dirname, '../src/babel-plugin-inline-hbs-deps-node.js'), - } as InlinePrecompileOptions, - ], - ], - }; - }, - createTests: stage3Tests, - }); - }); -}); - -class StubResolver implements Resolver { - astTransformer(): unknown { - return undefined; - } - dependenciesOf(_moduleName: string): ResolvedDep[] { - return [{ runtimeName: 'my-app/components/foo', path: './components/foo.js', absPath: '/tmp/components/foo.js' }]; - } - - absPathToRuntimePath(absPath: string): string { - return absPath; - } - - absPathToRuntimeName(absPath: string): string { - return absPath; - } - - adjustImportsOptions = { - renamePackages: {}, - renameModules: {}, - extraImports: [], - externalsDir: '/tmp/embroider-externals', - activeAddons: {}, - relocatedFiles: {}, - resolvableExtensions: ['.js', '.hbs'], - emberNeedsModulesPolyfill: true, - appRoot: '/tmp/nonexistent', - }; -} diff --git a/packages/macros/package.json b/packages/macros/package.json index c24a6edea..e228311a9 100644 --- a/packages/macros/package.json +++ b/packages/macros/package.json @@ -44,6 +44,7 @@ "@types/node": "^15.12.2", "@types/resolve": "^1.20.0", "@types/semver": "^7.3.6", + "scenario-tester": "^2.0.1", "code-equality-assertions": "^0.7.0", "typescript": "*" }, diff --git a/packages/macros/src/macros-config.ts b/packages/macros/src/macros-config.ts index b4e865bc9..7b8b8719f 100644 --- a/packages/macros/src/macros-config.ts +++ b/packages/macros/src/macros-config.ts @@ -145,9 +145,7 @@ export default class MacrosConfig { this._importSyncImplementation = value; } - private packageCache: PackageCache; - - private constructor(private appRoot: string) { + private constructor(private origAppRoot: string) { // this uses globalConfig because these things truly are global. Even if a // package doesn't have a dep or peerDep on @embroider/macros, it's legit // for them to want to know the answer to these questions, and there is only @@ -165,7 +163,14 @@ export default class MacrosConfig { // true to distinguish the two. isTesting: false, }; - this.packageCache = PackageCache.shared('embroider-stage3', appRoot); + } + + private get packageCache() { + return PackageCache.shared('embroider-macros', this.origAppRoot); + } + + private get appRoot(): string { + return this.moves.get(this.origAppRoot) ?? this.origAppRoot; } private _configWritable = true; @@ -321,7 +326,11 @@ export default class MacrosConfig { owningPackageRoot, isDevelopingPackageRoots: [...this.isDevelopingPackageRoots].map(root => this.moves.get(root) || root), - appPackageRoot: this.moves.get(this.appRoot) ?? this.appRoot, + + // lazy so that packageMoved() can still affect this + get appPackageRoot() { + return self.appRoot; + }, // This is used as a signature so we can detect ourself among the plugins // emitted from v1 addons. @@ -334,7 +343,7 @@ export default class MacrosConfig { importSyncImplementation: this.importSyncImplementation, }; - let lockFilePath = findUp.sync(['yarn.lock', 'package-lock.json', 'pnpm-lock.yaml'], { cwd: opts.appPackageRoot }); + let lockFilePath = findUp.sync(['yarn.lock', 'package-lock.json', 'pnpm-lock.yaml'], { cwd: self.appRoot }); if (!lockFilePath) { lockFilePath = findUp.sync('package.json', { cwd: opts.appPackageRoot }); diff --git a/packages/macros/tests/babel/dependency-satisfies.test.ts b/packages/macros/tests/babel/dependency-satisfies.test.ts index 9cb02fb6d..64a295792 100644 --- a/packages/macros/tests/babel/dependency-satisfies.test.ts +++ b/packages/macros/tests/babel/dependency-satisfies.test.ts @@ -1,4 +1,5 @@ -import { allBabelVersions, Project, runDefault } from '@embroider/test-support'; +import { allBabelVersions, runDefault } from '@embroider/test-support'; +import { Project } from 'scenario-tester'; import { join } from 'path'; import { MacrosConfig } from '../../src/node'; diff --git a/packages/macros/tests/babel/helpers.ts b/packages/macros/tests/babel/helpers.ts index 51b62a65c..d4341e7c9 100644 --- a/packages/macros/tests/babel/helpers.ts +++ b/packages/macros/tests/babel/helpers.ts @@ -1,6 +1,7 @@ import { MacrosConfig } from '../../src/node'; import { join, dirname } from 'path'; -import { allBabelVersions as allBabel, Project, runDefault, Transform, toCJS } from '@embroider/test-support'; +import { allBabelVersions as allBabel, runDefault, Transform, toCJS } from '@embroider/test-support'; +import { Project } from 'scenario-tester'; import { readFileSync } from 'fs'; import { Script, createContext } from 'vm'; import { explicitRelative } from '@embroider/shared-internals'; diff --git a/packages/macros/tests/babel/macro-condition.test.ts b/packages/macros/tests/babel/macro-condition.test.ts index ecf383f9f..87d552019 100644 --- a/packages/macros/tests/babel/macro-condition.test.ts +++ b/packages/macros/tests/babel/macro-condition.test.ts @@ -1,5 +1,6 @@ import { makeRunner, makeBabelConfig, allModes } from './helpers'; -import { allBabelVersions, Project } from '@embroider/test-support'; +import { allBabelVersions } from '@embroider/test-support'; +import { Project } from 'scenario-tester'; import { MacrosConfig } from '../../src/node'; import { join } from 'path'; diff --git a/packages/macros/tests/glimmer/helpers.ts b/packages/macros/tests/glimmer/helpers.ts index e5dcd7048..29dd4c1ce 100644 --- a/packages/macros/tests/glimmer/helpers.ts +++ b/packages/macros/tests/glimmer/helpers.ts @@ -1,6 +1,7 @@ import { NodeTemplateCompiler } from '@embroider/core'; import { getEmberExports } from '@embroider/core/src/load-ember-template-compiler'; -import { emberTemplateCompilerPath, Project } from '@embroider/test-support'; +import { emberTemplateCompilerPath } from '@embroider/test-support'; +import { Project } from 'scenario-tester'; import { MacrosConfig } from '../../src/node'; import { join } from 'path'; diff --git a/packages/macros/tests/glimmer/macro-condition.test.ts b/packages/macros/tests/glimmer/macro-condition.test.ts index 88082f853..3fd2c0a77 100644 --- a/packages/macros/tests/glimmer/macro-condition.test.ts +++ b/packages/macros/tests/glimmer/macro-condition.test.ts @@ -1,4 +1,4 @@ -import { Project } from '@embroider/test-support'; +import { Project } from 'scenario-tester'; import { join } from 'path'; import { templateTests, TemplateTransformOptions } from './helpers'; diff --git a/packages/router/.ember-cli b/packages/router/.ember-cli index ee64cfed2..4ccb4bf43 100644 --- a/packages/router/.ember-cli +++ b/packages/router/.ember-cli @@ -5,5 +5,11 @@ Setting `disableAnalytics` to true will prevent any data from being sent. */ - "disableAnalytics": false + "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/packages/router/.eslintignore b/packages/router/.eslintignore index 701947ed3..d474a40bd 100644 --- a/packages/router/.eslintignore +++ b/packages/router/.eslintignore @@ -19,4 +19,7 @@ # 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/packages/router/.eslintrc.js b/packages/router/.eslintrc.js index 56a5a401e..2e271d458 100644 --- a/packages/router/.eslintrc.js +++ b/packages/router/.eslintrc.js @@ -51,7 +51,7 @@ module.exports = { extends: ['plugin:node/recommended'], }, { - // Test files: + // test files files: ['tests/**/*-test.{js,ts}'], extends: ['plugin:qunit/recommended'], }, diff --git a/packages/router/.github/workflows/ci.yml b/packages/router/.github/workflows/ci.yml new file mode 100644 index 000000000..7aceb858a --- /dev/null +++ b/packages/router/.github/workflows/ci.yml @@ -0,0 +1,79 @@ +name: CI + +on: + push: + branches: + - main + - master + pull_request: {} + +concurrency: + group: ci-${{ github.head_ref || github.ref }} + cancel-in-progress: true + +jobs: + test: + name: "Tests" + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v3 + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: yarn + - name: Install Dependencies + run: yarn install --frozen-lockfile + - name: Lint + run: yarn lint + - name: Run Tests + run: yarn test:ember + + floating: + name: "Floating Dependencies" + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: yarn + - name: Install Dependencies + run: yarn install --no-lockfile + - name: Run Tests + run: yarn test:ember + + try-scenarios: + name: ${{ matrix.try-scenario }} + runs-on: ubuntu-latest + needs: "test" + timeout-minutes: 10 + + strategy: + fail-fast: false + matrix: + try-scenario: + - ember-lts-3.24 + - ember-lts-3.28 + - ember-release + - ember-beta + - ember-canary + - ember-classic + - embroider-safe + - embroider-optimized + + steps: + - uses: actions/checkout@v3 + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: yarn + - name: Install Dependencies + run: yarn install --frozen-lockfile + - name: Run Tests + run: ./node_modules/.bin/ember try:one ${{ matrix.try-scenario }} diff --git a/packages/router/.gitignore b/packages/router/.gitignore index 7e0f7ddce..f1e859b29 100644 --- a/packages/router/.gitignore +++ b/packages/router/.gitignore @@ -23,4 +23,10 @@ # 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/packages/router/.npmignore b/packages/router/.npmignore index f30effe9b..3aac2443f 100644 --- a/packages/router/.npmignore +++ b/packages/router/.npmignore @@ -14,6 +14,7 @@ /.eslintignore /.eslintrc.js /.git/ +/.github/ /.gitignore /.prettierignore /.prettierrc.js @@ -33,4 +34,7 @@ # 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/packages/router/.prettierignore b/packages/router/.prettierignore index 922165552..4178fd571 100644 --- a/packages/router/.prettierignore +++ b/packages/router/.prettierignore @@ -14,8 +14,12 @@ /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/packages/router/.travis.yml b/packages/router/.travis.yml deleted file mode 100644 index 3761119d8..000000000 --- a/packages/router/.travis.yml +++ /dev/null @@ -1,63 +0,0 @@ ---- -language: node_js -node_js: - # we recommend testing addons with the same minimum supported node version as Ember CLI - # so that your addon works for all apps - - '12' - -dist: xenial - -addons: - chrome: stable - -cache: - yarn: true - -env: - global: - # See https://git.io/vdao3 for details. - - JOBS=1 - -branches: - only: - - master - # npm version tags - - /^v\d+\.\d+\.\d+/ - -jobs: - fast_finish: false - allow_failures: - - env: EMBER_TRY_SCENARIO=ember-canary - - include: - # runs linting and tests with current locked deps - - stage: 'Tests' - name: 'Tests' - script: - - yarn lint - - yarn test:ember - - - stage: 'Additional Tests' - name: 'Floating Dependencies' - install: - - yarn install --no-lockfile --non-interactive - script: - - yarn test:ember - - # we recommend new addons test the current and previous LTS - # as well as latest stable release (bonus points to beta/canary) - - env: EMBER_TRY_SCENARIO=ember-lts-3.16 - - env: EMBER_TRY_SCENARIO=ember-lts-3.20 - - env: EMBER_TRY_SCENARIO=ember-lts-3.24 - - env: EMBER_TRY_SCENARIO=ember-release - - env: EMBER_TRY_SCENARIO=ember-beta - - env: EMBER_TRY_SCENARIO=ember-canary - - env: EMBER_TRY_SCENARIO=ember-default-with-jquery - - env: EMBER_TRY_SCENARIO=ember-classic - -before_install: - - curl -o- -L https://yarnpkg.com/install.sh | bash - - export PATH=$HOME/.yarn/bin:$PATH - -script: - - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO diff --git a/packages/router/CONTRIBUTING.md b/packages/router/CONTRIBUTING.md index 6a47ef7e5..7b59444a9 100644 --- a/packages/router/CONTRIBUTING.md +++ b/packages/router/CONTRIBUTING.md @@ -22,4 +22,4 @@ - `ember serve` - Visit the dummy application at [http://localhost:4200](http://localhost:4200). -For more information on using ember-cli, visit [https://ember-cli.com/](https://ember-cli.com/). +For more information on using ember-cli, visit [https://cli.emberjs.com/release/](https://cli.emberjs.com/release/). diff --git a/packages/router/package.json b/packages/router/package.json index bf112fecf..ba3eacf07 100644 --- a/packages/router/package.json +++ b/packages/router/package.json @@ -33,51 +33,49 @@ "dependencies": { "@ember/test-waiters": "^3.0.0", "@embroider/macros": "1.9.0", - "ember-cli-babel": "^7.26.6", - "ember-cli-htmlbars": "^5.7.1" + "ember-cli-babel": "^7.26.11", + "ember-cli-htmlbars": "^6.1.0" }, "devDependencies": { "@ember/optional-features": "^2.0.0", "@ember/string": "^3.0.0", - "@ember/test-helpers": "^2.4.2", + "@ember/test-helpers": "^2.8.1", "@embroider/compat": "1.9.0", "@embroider/core": "1.9.0", "@embroider/test-support": "0.36.0", "@embroider/webpack": "1.9.0", - "@glimmer/component": "^1.0.4", - "@glimmer/tracking": "^1.0.4", + "@glimmer/component": "^1.1.2", + "@glimmer/tracking": "^1.1.2", "@types/ember__routing": "^3.16.9", "babel-eslint": "^10.1.0", "broccoli-asset-rev": "^3.0.0", "cross-env": "^7.0.3", - "ember-auto-import": "^2.2.0", - "ember-cli": "~3.28.4", - "ember-cli-dependency-checker": "^3.2.0", + "ember-auto-import": "^2.4.2", + "ember-cli": "~4.6.0", + "ember-cli-dependency-checker": "^3.3.1", "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", "ember-cli-terser": "^4.0.2", "ember-disable-prototype-extensions": "^1.1.3", - "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.2", - "ember-maybe-import-regenerator": "^1.0.0", - "ember-page-title": "^6.2.2", - "ember-qunit": "^5.1.4", - "ember-resolver": "^8.0.2", - "ember-source": "~3.28.0", + "ember-page-title": "^7.0.0", + "ember-qunit": "^5.1.5", + "ember-resolver": "^8.0.3", + "ember-source": "~4.6.0", "ember-source-channel-url": "^3.0.0", - "ember-template-lint": "^3.6.0", + "ember-template-lint": "^4.10.1", "eslint": "^7.32.0", - "eslint-config-prettier": "^8.3.0", - "eslint-plugin-ember": "^10.5.4", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-ember": "^11.0.2", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.4.1", - "eslint-plugin-qunit": "^6.2.0", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-qunit": "^7.3.1", "loader.js": "^4.7.0", "npm-run-all": "^4.1.5", - "prettier": "^2.3.2", - "qunit": "^2.16.0", - "qunit-dom": "^1.6.0", - "webpack": "^5" + "prettier": "^2.7.1", + "qunit": "^2.19.1", + "qunit-dom": "^2.0.0", + "webpack": "^5.74.0" }, "peerDependencies": { "@embroider/core": "^1.8.3", @@ -92,7 +90,7 @@ } }, "engines": { - "node": "12.* || 14.* || >= 16" + "node": "14.* || >= 16" }, "ember": { "edition": "octane" diff --git a/packages/router/tests/acceptance/lazy-routes-test.js b/packages/router/tests/acceptance/lazy-routes-test.js index c9fdb5706..5f3ec4c2b 100644 --- a/packages/router/tests/acceptance/lazy-routes-test.js +++ b/packages/router/tests/acceptance/lazy-routes-test.js @@ -70,7 +70,11 @@ module('Acceptance | lazy routes', function (hooks) { if (ENV.isClassic) { test('classic builds can not see @embroider/core config', async function (assert) { let config = getGlobalConfig()['@embroider/core']; - assert.equal(config, undefined, 'expected no embroider core config'); + assert.strictEqual( + config, + undefined, + 'expected no embroider core config' + ); }); } else { test('can see @embroider/core config', async function (assert) { diff --git a/packages/router/tests/dummy/app/index.html b/packages/router/tests/dummy/app/index.html index 61400b20f..8c195bc41 100644 --- a/packages/router/tests/dummy/app/index.html +++ b/packages/router/tests/dummy/app/index.html @@ -2,7 +2,6 @@ - Dummy diff --git a/packages/router/tests/dummy/config/ember-cli-update.json b/packages/router/tests/dummy/config/ember-cli-update.json index ef25a7f40..386d522b9 100644 --- a/packages/router/tests/dummy/config/ember-cli-update.json +++ b/packages/router/tests/dummy/config/ember-cli-update.json @@ -3,14 +3,17 @@ "packages": [ { "name": "ember-cli", - "version": "3.28.4", + "version": "4.6.0", "blueprints": [ { "name": "addon", "outputRepo": "https://github.com/ember-cli/ember-addon-output", "codemodsSource": "ember-addon-codemods-manifest@1", "isBaseBlueprint": true, - "options": ["--yarn", "--no-welcome"] + "options": [ + "--yarn", + "--no-welcome" + ] } ] } diff --git a/packages/router/tests/dummy/config/environment.js b/packages/router/tests/dummy/config/environment.js index 904a50a58..83ce1ed26 100644 --- a/packages/router/tests/dummy/config/environment.js +++ b/packages/router/tests/dummy/config/environment.js @@ -5,16 +5,12 @@ module.exports = function (environment) { modulePrefix: 'dummy', environment, rootURL: '/', - locationType: 'auto', + locationType: 'history', EmberENV: { FEATURES: { // Here you can enable experimental features on an ember canary build // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true }, - EXTEND_PROTOTYPES: { - // Prevent Ember Data from overriding Date.parse. - Date: false, - }, }, APP: { diff --git a/packages/router/tests/dummy/config/targets.js b/packages/router/tests/dummy/config/targets.js index 3cd797ab4..1e48e0599 100644 --- a/packages/router/tests/dummy/config/targets.js +++ b/packages/router/tests/dummy/config/targets.js @@ -6,21 +6,6 @@ const browsers = [ 'last 1 Safari versions', ]; -// Ember's browser support policy is changing, and IE11 support will end in -// v4.0 onwards. -// -// See https://deprecations.emberjs.com/v3.x#toc_3-0-browser-support-policy -// -// If you need IE11 support on a version of Ember that still offers support -// for it, uncomment the code block below. -// -// const isCI = Boolean(process.env.CI); -// const isProduction = process.env.EMBER_ENV === 'production'; -// -// if (isCI || isProduction) { -// browsers.push('ie 11'); -// } - module.exports = { browsers, }; diff --git a/packages/router/tests/helpers/.gitkeep b/packages/router/tests/helpers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/router/tests/helpers/index.js b/packages/router/tests/helpers/index.js new file mode 100644 index 000000000..7f70de80f --- /dev/null +++ b/packages/router/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/packages/router/tests/index.html b/packages/router/tests/index.html index 091c90690..9fd58b86f 100644 --- a/packages/router/tests/index.html +++ b/packages/router/tests/index.html @@ -2,7 +2,6 @@ - Dummy Tests diff --git a/packages/shared-internals/src/package-cache.ts b/packages/shared-internals/src/package-cache.ts index 4282f1a1d..1c2fb8e07 100644 --- a/packages/shared-internals/src/package-cache.ts +++ b/packages/shared-internals/src/package-cache.ts @@ -78,7 +78,11 @@ export default class PackageCache { } static shared(identifier: string, appRoot: string) { - return getOrCreate(shared, identifier, () => new PackageCache(appRoot)); + let pk = getOrCreate(shared, identifier + appRoot, () => new PackageCache(appRoot)); + if (pk.appRoot !== appRoot) { + throw new Error(`bug: PackageCache appRoot disagreement ${appRoot}!=${pk.appRoot}`); + } + return pk; } } diff --git a/packages/shared-internals/src/paths.ts b/packages/shared-internals/src/paths.ts index e07c2db76..fb6b18acd 100644 --- a/packages/shared-internals/src/paths.ts +++ b/packages/shared-internals/src/paths.ts @@ -19,17 +19,9 @@ export function explicitRelative(fromDir: string, toFile: string) { return toFile; } - // windows supports both "./" and ".\", but webpack 5 insists on "./" - if (result.startsWith('.\\')) { - return './' + result.slice(2); - } - - // windows supports both "../" and "..\", but webpack 5 insists on "../" - if (result.startsWith('..\\')) { - return '../' + result.slice(3); - } - - return result; + // windows supports both kinds of path separators but webpack wants relative + // paths to use forward slashes. + return result.replace(/\\/g, '/'); } // given a list like ['.js', '.ts'], return a regular expression for files ending diff --git a/packages/util/.ember-cli b/packages/util/.ember-cli index ee64cfed2..4ccb4bf43 100644 --- a/packages/util/.ember-cli +++ b/packages/util/.ember-cli @@ -5,5 +5,11 @@ Setting `disableAnalytics` to true will prevent any data from being sent. */ - "disableAnalytics": false + "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/packages/util/.eslintignore b/packages/util/.eslintignore index 09d7628dd..7616988ac 100644 --- a/packages/util/.eslintignore +++ b/packages/util/.eslintignore @@ -15,9 +15,13 @@ # 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/packages/util/.eslintrc.js b/packages/util/.eslintrc.js index 4a4256d65..275041165 100644 --- a/packages/util/.eslintrc.js +++ b/packages/util/.eslintrc.js @@ -23,21 +23,15 @@ module.exports = { // node files { files: [ - '.eslintrc.js', - '.prettierrc.js', - '.template-lintrc.js', - 'ember-cli-build.js', - 'addon-main.js', - 'testem.js', - 'blueprints/*/index.js', - 'config/**/*.js', - 'tests/dummy/config/**/*.js', - ], - excludedFiles: [ - 'addon/**', - 'addon-test-support/**', - 'app/**', - 'tests/dummy/app/**', + './.eslintrc.js', + './.prettierrc.js', + './.template-lintrc.js', + './ember-cli-build.js', + './addon-main.js', + './testem.js', + './blueprints/*/index.js', + './config/**/*.js', + './tests/dummy/config/**/*.js', ], parserOptions: { sourceType: 'script', @@ -58,7 +52,7 @@ module.exports = { sourceType: 'module', }, plugins: ['@typescript-eslint'], - extends: ['prettier/@typescript-eslint'], + extends: ['prettier'], rules: { '@typescript-eslint/naming-convention': [ 'error', @@ -77,5 +71,10 @@ module.exports = { '@typescript-eslint/no-require-imports': 'error', }, }, + { + // test files + files: ['tests/**/*-test.{js,ts}'], + extends: ['plugin:qunit/recommended'], + }, ], }; diff --git a/packages/util/.github/workflows/ci.yml b/packages/util/.github/workflows/ci.yml new file mode 100644 index 000000000..7aceb858a --- /dev/null +++ b/packages/util/.github/workflows/ci.yml @@ -0,0 +1,79 @@ +name: CI + +on: + push: + branches: + - main + - master + pull_request: {} + +concurrency: + group: ci-${{ github.head_ref || github.ref }} + cancel-in-progress: true + +jobs: + test: + name: "Tests" + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v3 + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: yarn + - name: Install Dependencies + run: yarn install --frozen-lockfile + - name: Lint + run: yarn lint + - name: Run Tests + run: yarn test:ember + + floating: + name: "Floating Dependencies" + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: yarn + - name: Install Dependencies + run: yarn install --no-lockfile + - name: Run Tests + run: yarn test:ember + + try-scenarios: + name: ${{ matrix.try-scenario }} + runs-on: ubuntu-latest + needs: "test" + timeout-minutes: 10 + + strategy: + fail-fast: false + matrix: + try-scenario: + - ember-lts-3.24 + - ember-lts-3.28 + - ember-release + - ember-beta + - ember-canary + - ember-classic + - embroider-safe + - embroider-optimized + + steps: + - uses: actions/checkout@v3 + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: yarn + - name: Install Dependencies + run: yarn install --frozen-lockfile + - name: Run Tests + run: ./node_modules/.bin/ember try:one ${{ matrix.try-scenario }} diff --git a/packages/util/.gitignore b/packages/util/.gitignore index 008bca93c..a82eec5fe 100644 --- a/packages/util/.gitignore +++ b/packages/util/.gitignore @@ -26,4 +26,10 @@ # 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/packages/util/.npmignore b/packages/util/.npmignore index 88818f2c8..3aac2443f 100644 --- a/packages/util/.npmignore +++ b/packages/util/.npmignore @@ -14,7 +14,10 @@ /.eslintignore /.eslintrc.js /.git/ +/.github/ /.gitignore +/.prettierignore +/.prettierrc.js /.template-lintrc.js /.travis.yml /.watchmanconfig @@ -24,10 +27,14 @@ /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/packages/util/.prettierignore b/packages/util/.prettierignore index 922165552..4178fd571 100644 --- a/packages/util/.prettierignore +++ b/packages/util/.prettierignore @@ -14,8 +14,12 @@ /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/packages/util/.template-lintrc.js b/packages/util/.template-lintrc.js index 3b0b9af95..f35f61c7b 100644 --- a/packages/util/.template-lintrc.js +++ b/packages/util/.template-lintrc.js @@ -1,5 +1,5 @@ 'use strict'; module.exports = { - extends: 'octane', + extends: 'recommended', }; diff --git a/packages/util/.travis.yml b/packages/util/.travis.yml deleted file mode 100644 index 3a7ed03cd..000000000 --- a/packages/util/.travis.yml +++ /dev/null @@ -1,62 +0,0 @@ ---- -language: node_js -node_js: - # we recommend testing addons with the same minimum supported node version as Ember CLI - # so that your addon works for all apps - - "10" - -dist: xenial - -addons: - chrome: stable - -cache: - yarn: true - -env: - global: - # See https://git.io/vdao3 for details. - - JOBS=1 - -branches: - only: - - master - # npm version tags - - /^v\d+\.\d+\.\d+/ - -jobs: - fast_finish: true - allow_failures: - - env: EMBER_TRY_SCENARIO=ember-canary - - include: - # runs linting and tests with current locked deps - - stage: "Tests" - name: "Tests" - script: - - yarn lint - - yarn test:ember - - - stage: "Additional Tests" - name: "Floating Dependencies" - install: - - yarn install --no-lockfile --non-interactive - script: - - yarn test:ember - - # we recommend new addons test the current and previous LTS - # as well as latest stable release (bonus points to beta/canary) - - env: EMBER_TRY_SCENARIO=ember-lts-3.16 - - env: EMBER_TRY_SCENARIO=ember-lts-3.20 - - env: EMBER_TRY_SCENARIO=ember-release - - env: EMBER_TRY_SCENARIO=ember-beta - - env: EMBER_TRY_SCENARIO=ember-canary - - env: EMBER_TRY_SCENARIO=ember-default-with-jquery - - env: EMBER_TRY_SCENARIO=ember-classic - -before_install: - - curl -o- -L https://yarnpkg.com/install.sh | bash - - export PATH=$HOME/.yarn/bin:$PATH - -script: - - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO diff --git a/packages/util/CONTRIBUTING.md b/packages/util/CONTRIBUTING.md index c52f2904c..d10e16f69 100644 --- a/packages/util/CONTRIBUTING.md +++ b/packages/util/CONTRIBUTING.md @@ -23,4 +23,4 @@ - `ember serve` - Visit the dummy application at [http://localhost:4200](http://localhost:4200). -For more information on using ember-cli, visit [https://ember-cli.com/](https://ember-cli.com/). +For more information on using ember-cli, visit [https://cli.emberjs.com/release/](https://cli.emberjs.com/release/). diff --git a/packages/util/README.md b/packages/util/README.md index da255796c..fc06d69b3 100644 --- a/packages/util/README.md +++ b/packages/util/README.md @@ -41,7 +41,10 @@ export default class extends Component { Example usage in a template: ```hbs -{{#let (ensure-safe-component (or @title (component "default-title"))) as |Title|}} +{{#let + (ensure-safe-component (or @title (component 'default-title'))) + as |Title| +}} {{/let}} ``` diff --git a/packages/util/package.json b/packages/util/package.json index 296e220fc..ce589bef9 100644 --- a/packages/util/package.json +++ b/packages/util/package.json @@ -15,7 +15,7 @@ "scripts": { "prepare": "tsc", "build": "ember build --environment=production", - "lint": "npm-run-all --aggregate-output --continue-on-error --parallel 'lint:!(fix)'", + "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", "lint:hbs": "ember-template-lint .", "lint:hbs:fix": "ember-template-lint . --fix", @@ -30,7 +30,7 @@ "dependencies": { "@embroider/macros": "^1.9.0", "broccoli-funnel": "^3.0.5", - "ember-cli-babel": "^7.23.1" + "ember-cli-babel": "^7.26.11" }, "peerDependencies": { "ember-source": "*" @@ -39,51 +39,50 @@ "@babel/core": "^7.19.6", "@ember/jquery": "^2.0.0", "@ember/optional-features": "^2.0.0", - "@ember/test-helpers": "^2.4.2", + "@ember/test-helpers": "^2.8.1", "@embroider/compat": "1.9.0", "@embroider/core": "1.9.0", "@embroider/test-setup": "1.8.3", "@embroider/test-support": "0.36.0", "@embroider/webpack": "1.9.0", - "@glimmer/component": "^1.0.3", - "@glimmer/tracking": "^1.0.3", + "@glimmer/component": "^1.1.2", + "@glimmer/tracking": "^1.1.2", "@typescript-eslint/eslint-plugin": "^4.1.1", "@typescript-eslint/parser": "^4.1.1", "babel-eslint": "^10.1.0", "broccoli-asset-rev": "^3.0.0", "cross-env": "^7.0.3", - "ember-auto-import": "^2.2.0", - "ember-cli": "~3.28.0", - "ember-cli-dependency-checker": "^3.2.0", - "ember-cli-htmlbars": "^5.3.2", - "ember-cli-inject-live-reload": "^2.0.2", + "ember-auto-import": "^2.4.2", + "ember-cli": "~4.6.0", + "ember-cli-dependency-checker": "^3.3.1", + "ember-cli-htmlbars": "^6.1.0", + "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", - "ember-cli-terser": "^4.0.1", + "ember-cli-terser": "^4.0.2", "ember-disable-prototype-extensions": "^1.1.3", - "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.2", - "ember-maybe-import-regenerator": "^1.0.0", - "ember-page-title": "^6.2.1", - "ember-qunit": "^5.1.2", - "ember-resolver": "^8.0.2", - "ember-source": "~3.26", + "ember-page-title": "^7.0.0", + "ember-qunit": "^5.1.5", + "ember-resolver": "^8.0.3", + "ember-source": "~4.6.0", "ember-source-channel-url": "^3.0.0", - "ember-template-lint": "^2.18.1", - "eslint": "^7.20.0", - "eslint-config-prettier": "^7.2.0", - "eslint-plugin-ember": "^10.2.0", + "ember-template-lint": "^4.10.1", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-ember": "^11.0.2", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-qunit": "^7.3.1", "loader.js": "^4.7.0", "npm-run-all": "^4.1.5", - "prettier": "^2.2.1", - "qunit": "^2.16.0", - "qunit-dom": "^1.6.0", + "prettier": "^2.7.1", + "qunit": "^2.19.1", + "qunit-dom": "^2.0.0", "typescript": "*", - "webpack": "^5" + "webpack": "^5.74.0" }, "engines": { - "node": "12.* || 14.* || >= 16" + "node": "14.* || >= 16" }, "ember": { "edition": "octane" diff --git a/packages/util/tests/dummy/app/index.html b/packages/util/tests/dummy/app/index.html index 61400b20f..8c195bc41 100644 --- a/packages/util/tests/dummy/app/index.html +++ b/packages/util/tests/dummy/app/index.html @@ -2,7 +2,6 @@ <html> <head> <meta charset="utf-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> <title>Dummy diff --git a/packages/util/tests/dummy/config/ember-cli-update.json b/packages/util/tests/dummy/config/ember-cli-update.json index dfc391e64..d8eff6c8d 100644 --- a/packages/util/tests/dummy/config/ember-cli-update.json +++ b/packages/util/tests/dummy/config/ember-cli-update.json @@ -3,7 +3,7 @@ "packages": [ { "name": "ember-cli", - "version": "3.25.2", + "version": "4.6.0", "blueprints": [ { "name": "addon", diff --git a/packages/util/tests/dummy/config/environment.js b/packages/util/tests/dummy/config/environment.js index ba4e8cb76..15d2fccdc 100644 --- a/packages/util/tests/dummy/config/environment.js +++ b/packages/util/tests/dummy/config/environment.js @@ -5,16 +5,12 @@ module.exports = function (environment) { modulePrefix: 'dummy', environment, rootURL: '/', - locationType: 'auto', + locationType: 'history', EmberENV: { FEATURES: { // Here you can enable experimental features on an ember canary build // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true }, - EXTEND_PROTOTYPES: { - // Prevent Ember Data from overriding Date.parse. - Date: false, - }, }, APP: { diff --git a/packages/util/tests/dummy/config/targets.js b/packages/util/tests/dummy/config/targets.js index 4b33327e8..1e48e0599 100644 --- a/packages/util/tests/dummy/config/targets.js +++ b/packages/util/tests/dummy/config/targets.js @@ -6,13 +6,6 @@ const browsers = [ 'last 1 Safari versions', ]; -const isCI = Boolean(process.env.CI); -const isProduction = process.env.EMBER_ENV === 'production'; - -if (isCI || isProduction) { - browsers.push('ie 11'); -} - module.exports = { browsers, }; diff --git a/packages/util/tests/helpers/.gitkeep b/packages/util/tests/helpers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/packages/util/tests/helpers/index.js b/packages/util/tests/helpers/index.js new file mode 100644 index 000000000..7f70de80f --- /dev/null +++ b/packages/util/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/packages/util/tests/index.html b/packages/util/tests/index.html index 3eb848dbd..b74fc8be6 100644 --- a/packages/util/tests/index.html +++ b/packages/util/tests/index.html @@ -2,7 +2,6 @@ - Dummy Tests @@ -28,7 +27,7 @@
- + diff --git a/packages/util/tests/integration/helpers/ensure-safe-component-test.js b/packages/util/tests/integration/helpers/ensure-safe-component-test.js index 6cd68011c..1097a5246 100644 --- a/packages/util/tests/integration/helpers/ensure-safe-component-test.js +++ b/packages/util/tests/integration/helpers/ensure-safe-component-test.js @@ -29,7 +29,10 @@ module('Integration | Helper | ensure-safe-component', function (hooks) { await render(hbs` `); - assert.equal(this.element.textContent.trim(), 'hello from some-component'); + assert.strictEqual( + this.element.textContent.trim(), + 'hello from some-component' + ); }); test('template-only component class value', async function (assert) { @@ -37,7 +40,10 @@ module('Integration | Helper | ensure-safe-component', function (hooks) { await render(hbs` `); - assert.equal(this.element.textContent.trim(), 'hello from some-component'); + assert.strictEqual( + this.element.textContent.trim(), + 'hello from some-component' + ); }); test('co-located component class value', async function (assert) { @@ -45,7 +51,7 @@ module('Integration | Helper | ensure-safe-component', function (hooks) { await render(hbs` `); - assert.equal( + assert.strictEqual( this.element.textContent.trim(), 'hello from colocated-example' ); @@ -79,7 +85,10 @@ module('Integration | Helper | ensure-safe-component', function (hooks) { `); - assert.equal(this.element.textContent.trim(), 'hello from some-component'); + assert.strictEqual( + this.element.textContent.trim(), + 'hello from some-component' + ); }); test('template helper with curried component value', async function (assert) { @@ -98,7 +107,10 @@ module('Integration | Helper | ensure-safe-component', function (hooks) { await render(hbs` `); - assert.equal(this.element.textContent.trim(), 'hello from some-component'); + assert.strictEqual( + this.element.textContent.trim(), + 'hello from some-component' + ); }); test('template helper with string value', async function (assert) { @@ -110,7 +122,10 @@ module('Integration | Helper | ensure-safe-component', function (hooks) { {{/let}} `); }, /You're trying to invoke the component "some-component" by passing its name as a string/); - assert.equal(this.element.textContent.trim(), 'hello from some-component'); + assert.strictEqual( + this.element.textContent.trim(), + 'hello from some-component' + ); }); test('rerender stability', async function (assert) { @@ -130,11 +145,11 @@ module('Integration | Helper | ensure-safe-component', function (hooks) { {{/let}} `); - assert.equal(this.element.textContent.trim(), 'first:hello'); + assert.strictEqual(this.element.textContent.trim(), 'first:hello'); assert.deepEqual(log, ['target instantiated']); this.set('message', 'goodbye'); await settled(); - assert.equal(this.element.textContent.trim(), 'first:goodbye'); + assert.strictEqual(this.element.textContent.trim(), 'first:goodbye'); assert.deepEqual(log, ['target instantiated']); this.set( @@ -150,7 +165,7 @@ module('Integration | Helper | ensure-safe-component', function (hooks) { ) ); await settled(); - assert.equal(this.element.textContent.trim(), 'second:goodbye'); + assert.strictEqual(this.element.textContent.trim(), 'second:goodbye'); assert.deepEqual(log, ['target instantiated', 'new target instantiated']); }); }); diff --git a/packages/util/tests/unit/services/ensure-registered-test.js b/packages/util/tests/unit/services/ensure-registered-test.js index 876b710b9..53e566804 100644 --- a/packages/util/tests/unit/services/ensure-registered-test.js +++ b/packages/util/tests/unit/services/ensure-registered-test.js @@ -10,24 +10,24 @@ module('Unit | Service | ensure-registered', function (hooks) { test('it returns nonce for class', function (assert) { let service = this.owner.lookup('service:-ensure-registered'); - assert.equal(service.register(Klass1), '-ensure0'); + assert.strictEqual(service.register(Klass1), '-ensure0'); }); test('it returns different nonce for different class', function (assert) { let service = this.owner.lookup('service:-ensure-registered'); - assert.equal(service.register(Klass1), '-ensure0'); - assert.equal(service.register(Klass2), '-ensure1'); + assert.strictEqual(service.register(Klass1), '-ensure0'); + assert.strictEqual(service.register(Klass2), '-ensure1'); }); test('it returns same nonce for same class', function (assert) { let service = this.owner.lookup('service:-ensure-registered'); - assert.equal(service.register(Klass1), '-ensure0'); - assert.equal(service.register(Klass1), '-ensure0'); + assert.strictEqual(service.register(Klass1), '-ensure0'); + assert.strictEqual(service.register(Klass1), '-ensure0'); }); test('it registers component', function (assert) { let service = this.owner.lookup('service:-ensure-registered'); - assert.equal(service.register(Klass1), '-ensure0'); + assert.strictEqual(service.register(Klass1), '-ensure0'); assert.ok(this.owner.hasRegistration('component:-ensure0')); }); }); diff --git a/test-packages/sample-transforms/index.js b/test-packages/sample-transforms/index.js index 10bbe9142..4f3408acf 100644 --- a/test-packages/sample-transforms/index.js +++ b/test-packages/sample-transforms/index.js @@ -13,13 +13,21 @@ module.exports = { setupPreprocessorRegistry(type, registry) { if (type === 'parent') { - registry.add('htmlbars-ast-plugin', { - name: `@embroider/sample-transforms`, - plugin: require('./lib/glimmer-plugin'), - baseDir() { - return __dirname; - } - }); + registry.add('htmlbars-ast-plugin', this._plugin()); } - } + }, + + _plugin() { + return { + name: `@embroider/sample-transforms`, + plugin: require('./lib/glimmer-plugin'), + baseDir() { + return __dirname; + }, + parallelBabel: { + requireFile: __filename, + buildUsing: '_plugin', + }, + }; + }, }; diff --git a/test-packages/sample-transforms/lib/glimmer-plugin.js b/test-packages/sample-transforms/lib/glimmer-plugin.js index 7d1aa5d33..366a2479f 100644 --- a/test-packages/sample-transforms/lib/glimmer-plugin.js +++ b/test-packages/sample-transforms/lib/glimmer-plugin.js @@ -22,15 +22,4 @@ function sampleTransform(env) { }; } -sampleTransform.parallelBabel = { - requireFile: __filename, - buildUsing: 'restore', -}; - -sampleTransform.baseDir = function () { - return require('path').join(__dirname, '..'); -}; - -sampleTransform.restore = () => sampleTransform; - module.exports = sampleTransform; diff --git a/test-packages/sample-transforms/package.json b/test-packages/sample-transforms/package.json index 6bed11e36..ce778d684 100644 --- a/test-packages/sample-transforms/package.json +++ b/test-packages/sample-transforms/package.json @@ -31,7 +31,7 @@ "ember-cli": "~3.28.0", "ember-cli-dependency-checker": "^3.1.0", "ember-cli-eslint": "^5.1.0", - "ember-cli-htmlbars": "^4.3.1", + "ember-cli-htmlbars": "^6.0.0", "ember-cli-inject-live-reload": "^1.8.2", "ember-cli-sri": "^2.1.1", "ember-cli-uglify": "^2.1.0", diff --git a/test-packages/support/.gitignore b/test-packages/support/.gitignore index 91a9e7159..b49e547f4 100644 --- a/test-packages/support/.gitignore +++ b/test-packages/support/.gitignore @@ -2,6 +2,5 @@ *.js *.d.ts *.map -/dynamic_suites !vendor/ember-template-compiler.js diff --git a/test-packages/support/build.ts b/test-packages/support/build.ts deleted file mode 100644 index c3d2a3d5a..000000000 --- a/test-packages/support/build.ts +++ /dev/null @@ -1,170 +0,0 @@ -import { Project } from './project'; -import EmberCLIProject from 'ember-cli/lib/models/project'; -import { Addons, App } from '@embroider/compat'; -import { Builder } from 'broccoli'; -import EmberApp from 'ember-cli/lib/broccoli/ember-app'; -import EmberAddon from 'ember-cli/lib/broccoli/ember-addon'; -import Instrumentation from 'ember-cli/lib/models/instrumentation'; -import PackageInfoCache from 'ember-cli/lib/models/package-info-cache'; -import { readJSONSync } from 'fs-extra'; -import { join } from 'path'; -import MockUI from 'console-ui/mock'; -import { TransformOptions, transform } from '@babel/core'; -import { Options } from '../../packages/compat/src'; -import { BoundExpectFile } from './file-assertions'; -import { AppMeta, hbsToJS } from '@embroider/core'; -import { Memoize } from 'typescript-memoize'; -import { stableWorkspaceDir } from '@embroider/compat/src/default-pipeline'; - -export interface BuildParams { - stage: 1 | 2; - type: 'app' | 'addon'; - emberAppOptions: any; - embroiderOptions: Options; -} - -const defaultParams = Object.freeze({ - stage: 1, - type: 'app', - emberAppOptions: Object.freeze({}), - embroiderOptions: Object.freeze({}), -}); - -export default class BuildResult { - static async build(project: Project, rawParams: Partial) { - let params: BuildParams = Object.assign({}, defaultParams, rawParams); - params.emberAppOptions = Object.assign({}, params.emberAppOptions); - params.embroiderOptions = Object.assign({}, params.embroiderOptions); - project.writeSync(); - - let origDir = process.cwd(); - try { - // this is here because EmberAddon makes a bad assumption that the project - // root is always the current working directory - process.chdir(project.baseDir); - - let instance; - if (params.type === 'addon') { - instance = emberAddon(project.baseDir, params.emberAppOptions); - } else { - instance = emberApp(project.baseDir, params.emberAppOptions); - } - - params.embroiderOptions.workspaceDir = stableWorkspaceDir(instance.project.root); - - let addons = new Addons(instance, params.embroiderOptions); - let tree; - if (params.stage === 1) { - tree = addons.tree; - } else { - let compatApp = new App(instance, addons, params.embroiderOptions); - tree = compatApp.tree; - } - let builder = new Builder(tree); - let builderPromise = builder.build(); - let results = await Promise.all([builderPromise, addons.ready()]); - let basePath = results[1].outputPath; - return new BuildResult(project, basePath, builder); - } finally { - process.chdir(origDir); - } - } - private constructor(private project: Project, public outputPath: string, private builder: Builder) { - this.transpile = this.transpile.bind(this); - this.shouldTranspile = this.shouldTranspile.bind(this); - } - - async cleanup() { - this.project.dispose(); - await this.builder.cleanup(); - } - - transpile(contents: string, fileAssert: BoundExpectFile): string { - if (fileAssert.path.endsWith('.hbs')) { - return transform(hbsToJS(contents), Object.assign({ filename: fileAssert.fullPath }, this.babelConfig))!.code!; - } else if (fileAssert.path.endsWith('.js')) { - return transform(contents, Object.assign({ filename: fileAssert.fullPath }, this.babelConfig))!.code!; - } else { - return contents; - } - } - - // This allows our tests to simulate what a real Watcher would do, without - // managing all the asynchrony of a real Watcher. - // - // This is necessary once you have BROCCOLI_ENABLED_MEMOIZE=true. - async didChange(dir: string) { - let node = this.builder.watchedSourceNodeWrappers.find(nw => nw.nodeInfo.sourceDirectory === dir); - if (!node) { - throw new Error( - `test tried to simulated a watched file change in ${dir}, but we could not find the corresponding watched broccoli node` - ); - } - node.revise(); - } - - async rebuild() { - let origDir = process.cwd(); - try { - // this is here because EmberAddon makes a bad assumption that the project - // root is always the current working directory - process.chdir(this.project.baseDir); - await this.builder.build(); - } finally { - process.chdir(origDir); - } - } - - shouldTranspile(relativePath: string) { - // eslint-disable-next-line @typescript-eslint/no-require-imports - let shouldTranspile = require(join(this.outputPath, '_babel_filter_')); - return shouldTranspile(join(this.outputPath, relativePath)) as boolean; - } - - @Memoize() - private get pkgJSON() { - return readJSONSync(join(this.outputPath, 'package.json')); - } - - private get emberMeta(): AppMeta { - return this.pkgJSON['ember-addon'] as AppMeta; - } - - @Memoize() - private get babelConfig() { - if (this.emberMeta['babel'].majorVersion !== 7) { - throw new Error(`@embroider/test-support doesn't support babel 6 inside our app fixture tests`); - } - // eslint-disable-next-line @typescript-eslint/no-require-imports - return require(join(this.outputPath, this.emberMeta['babel'].filename)) as TransformOptions; - } -} - -function emberApp(dir: string, userOpts: any = {}): any { - let cli = new MockCLI(); - let project = new EmberCLIProject(dir, readJSONSync(join(dir, 'package.json')), cli.ui, cli); - return new EmberApp({ project }, userOpts); -} - -function emberAddon(dir: string, userOpts: any = {}): any { - let cli = new MockCLI(); - let project = new EmberCLIProject(dir, readJSONSync(join(dir, 'package.json')), cli.ui, cli); - return new EmberAddon({ project }, userOpts); -} - -class MockCLI { - ui: any; - root: string; - npmPackage: string; - instrumentation: Instrumentation; - packageInfoCache: PackageInfoCache; - constructor(options?: any) { - options = options || {}; - - this.ui = options.ui || new MockUI(); - this.root = join(__dirname, '..', '..'); - this.npmPackage = options.npmPackage || 'ember-cli'; - this.instrumentation = options.instrumentation || new Instrumentation({}); - this.packageInfoCache = new PackageInfoCache(this.ui); - } -} diff --git a/test-packages/support/dynamic_suites/.gitkeep b/test-packages/support/dynamic_suites/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/test-packages/support/file-assertions.ts b/test-packages/support/file-assertions.ts index 1ad1da715..711c0c96c 100644 --- a/test-packages/support/file-assertions.ts +++ b/test-packages/support/file-assertions.ts @@ -152,7 +152,7 @@ export class TransformedFileExpect extends BoundExpectFile { result: false, actual: err, expected: 'transformer to run', - message: err.message, + message: err.stack, }; } } @@ -183,7 +183,7 @@ export class JSONExpect { this.adapter.assert(this.contents); return; } - expect(this.contents.data).toBe(expected); + this.adapter.equals(this.contents.data, expected); } includes(expected: any, message?: string): void { diff --git a/test-packages/support/index.ts b/test-packages/support/index.ts index b7b62db02..b5198f02b 100644 --- a/test-packages/support/index.ts +++ b/test-packages/support/index.ts @@ -107,6 +107,6 @@ export function definesPattern(runtimeName: string, buildTimeName: string): RegE ); } -export { Project } from './project'; -export { default as BuildResult } from './build'; export { expectFilesAt, ExpectFile } from './file-assertions'; +export { Rebuilder } from './rebuilder'; +export { Transpiler } from './transpiler'; diff --git a/test-packages/support/package.json b/test-packages/support/package.json index 06851e2fc..ed253129c 100644 --- a/test-packages/support/package.json +++ b/test-packages/support/package.json @@ -16,11 +16,10 @@ "ember-auto-import": "^2.2.0", "ember-cli": "~3.28.0", "ember-cli-babel": "^7.20.5", - "ember-cli-htmlbars": "^4.2.0", + "ember-cli-htmlbars": "^6.0.0", "ember-resolver": "^7.0.0", "ember-source": "~3.26", "execa": "^4.0.3", - "fixturify-project": "^2.1.0", "fs-extra": "^7.0.0", "loader.js": "^4.7.0", "lodash": "^4.17.10", diff --git a/test-packages/support/project.ts b/test-packages/support/project.ts deleted file mode 100644 index e816a0014..000000000 --- a/test-packages/support/project.ts +++ /dev/null @@ -1,413 +0,0 @@ -import FixturifyProject from 'fixturify-project'; -import { join, dirname } from 'path'; -import { ensureSymlinkSync } from 'fs-extra'; -import merge from 'lodash/merge'; -import Options from '../../packages/core/src/options'; - -function cliBuildFile(emberAppOptions = '', embroiderOptions: Options = {}) { - return ` -const EmberApp = require('ember-cli/lib/broccoli/ember-app'); -module.exports = function(defaults) { - let app = new EmberApp(defaults, { - ${emberAppOptions} - }); - if (process.env.CLASSIC) { - return app.toTree(); - } - const Webpack = require('@embroider/webpack').Webpack; - return require('@embroider/compat').compatBuild(app, Webpack, ${JSON.stringify(embroiderOptions, null, 2)}); -}; -`; -} - -function addonBuildFile(emberAppOptions: any = {}, embroiderOptions: Options = {}) { - return ` -const EmberAddon = require('ember-cli/lib/broccoli/ember-addon'); -module.exports = function(defaults) { - let app = new EmberAddon(defaults, ${JSON.stringify(emberAppOptions, null, 2)}); - if (process.env.CLASSIC) { - return app.toTree(); - } -const Webpack = require('@embroider/webpack').Webpack; -return require('@embroider/compat').compatBuild(app, Webpack, ${JSON.stringify(embroiderOptions)}); -};`; -} - -function addonIndexFile(content: string) { - return ` -module.exports = { - name: require('./package').name, - ${content} -}; -`; -} - -function environmentFile(appName: string) { - return ` -module.exports = function(environment) { - let ENV = { - modulePrefix: '${appName}', - environment, - rootURL: '/', - locationType: 'auto', - EmberENV: { - FEATURES: { - }, - EXTEND_PROTOTYPES: { - Date: false - } - }, - APP: {} - }; - return ENV; -}; -`; -} - -function addonEnvironmentFile() { - return `module.exports = function(/* environment, appConfig */) { - return { }; - };`; -} - -function indexFile(appName: string) { - return ` - - - - - - App - - - - {{content-for "head"}} - - - - - {{content-for "head-footer"}} - - - {{content-for "body"}} - - - - - {{content-for "body-footer"}} - - -`; -} - -function appJSFile() { - return ` - import Application from '@ember/application'; -import Resolver from './resolver'; -import loadInitializers from 'ember-load-initializers'; -import config from './config/environment'; - -const App = Application.extend({ - modulePrefix: config.modulePrefix, - podModulePrefix: config.podModulePrefix, - Resolver -}); - -loadInitializers(App, config.modulePrefix); - -export default App; -`; -} - -function engineIndex(lazy = false) { - return ` -const EngineAddon = require('ember-engines/lib/engine-addon'); - -module.exports = EngineAddon.extend({ - name: require('./package').name, - lazyLoading: { - enabled: ${lazy}, - }, -}); -`; -} - -function engineConfig(name: string) { - return ` -module.exports = function(environment) { - const ENV = { - modulePrefix: '${name}', - environment: environment - } - - return ENV; -}; - `; -} - -function engineAddonFile() { - return ` -import Engine from '@ember/engine'; -import loadInitializers from 'ember-load-initializers'; -import Resolver from 'ember-resolver'; -import config from './config/environment'; - -const { modulePrefix } = config; - -export default class YourEngine extends Engine { - modulePrefix = modulePrefix; - Resolver = Resolver; -} - -loadInitializers(YourEngine, modulePrefix); - `; -} - -export class Project extends FixturifyProject { - // FIXME: update fixturify-project to allow easier customization of `pkg` - declare pkg: any; - - static emberNew(name = 'my-app'): Project { - let app = new Project(name); - app.files = { - // you might think you want to pass params to customize cliBuildFile, but - // that doesn't really work given how our tests work. Pass emberAppOptions - // to BuildResult.build instead, because it needs access to the EmberApp - // instance, which is not returned out of ember-cli-build.js. - 'ember-cli-build.js': cliBuildFile(), - config: { - 'environment.js': environmentFile(name), - }, - app: { - 'index.html': indexFile(name), - styles: { - 'app.css': '', - }, - 'app.js': appJSFile(), - 'resolver.js': `export { default } from 'ember-resolver';`, - }, - }; - app.linkPackage('ember-cli'); - app.linkPackage('loader.js'); - app.linkPackage('ember-cli-htmlbars'); - app.linkPackage('ember-cli-babel'); - app.linkPackage('ember-source'); - app.linkPackage('ember-resolver'); - app.linkPackage('@embroider/compat'); - app.linkPackage('@embroider/core'); - app.linkPackage('@embroider/webpack'); - app.linkPackage('@glimmer/component'); - - return app; - } - - static addonNew(emberAppOptions?: any, embroiderOptions?: Options): Project { - let name = 'my-addon'; - let app = new Project(name); - app.files = { - 'index.js': `module.exports = { name: "${name}" };`, - 'ember-cli-build.js': addonBuildFile(emberAppOptions, embroiderOptions), - config: { - 'environment.js': addonEnvironmentFile(), - }, - app: {}, - addon: {}, - tests: { - dummy: { - app: { - 'app.js': appJSFile(), - 'index.html': indexFile('dummy'), - styles: { - 'app.css': '', - }, - }, - config: { - 'environment.js': environmentFile('dummy'), - }, - }, - }, - }; - app.linkDevPackage('ember-cli'); - app.linkDevPackage('loader.js'); - app.linkPackage('ember-cli-htmlbars'); - app.linkPackage('ember-cli-babel'); - app.linkPackage('@glimmer/component'); - app.linkDevPackage('ember-source'); - app.linkDevPackage('ember-resolver'); - app.linkDevPackage('@embroider/compat'); - app.linkDevPackage('@embroider/core'); - app.linkDevPackage('@embroider/webpack'); - - app.pkg.keywords = ['ember-addon']; - app.pkg['ember-addon'] = { - configPath: 'tests/dummy/config', - }; - return app; - } - - private packageLinks: Map = new Map(); - private devPackageLinks: Set = new Set(); - private inRepoAddons: Set = new Set(); - - linkDevPackage(name: string, target?: string) { - this.devPackageLinks.add(name); - this.linkPackage(name, target); - } - - linkPackage(name: string, target?: string) { - if (!target) { - target = dirname(require.resolve(join(name, 'package.json'))); - } - this.packageLinks.set(name, target); - } - - addDependency(name: string | Project, version?: string, cb?: (project: FixturifyProject) => void): Project { - return super.addDependency(name, version, cb) as Project; - } - - addDevDependency(name: string | Project, version?: string, cb?: (project: FixturifyProject) => void): Project { - return super.addDevDependency(name, version, cb) as Project; - } - - writeSync(root?: string) { - super.writeSync(root); - let stack: { project: Project; root: string }[] = [{ project: this, root: root || this.root }]; - while (stack.length > 0) { - let { project, root } = stack.shift()!; - for (let [name, target] of project.packageLinks) { - ensureSymlinkSync(target, join(root, project.name, 'node_modules', name), 'dir'); - } - for (let dep of project.inRepoAddons) { - let root = join(project.root, project.name, 'lib'); - dep.writeSync(root); - stack.push({ project: dep, root }); - } - for (let dep of project.dependencies()) { - stack.push({ project: dep as Project, root: join(root, project.name, 'node_modules') }); - } - for (let dep of project.devDependencies()) { - stack.push({ project: dep as Project, root: join(root, project.name, 'node_modules') }); - } - } - } - - addAddon(name: string, indexContent = '') { - let addon = this.addDependency(name); - addon.files = { - 'index.js': addonIndexFile(indexContent), - addon: { - templates: { - components: {}, - }, - }, - app: {}, - }; - addon.linkPackage('ember-cli-htmlbars'); - addon.linkPackage('ember-cli-babel'); - - addon.pkg.keywords = ['ember-addon']; - addon.pkg['ember-addon'] = {}; - return addon; - } - - addDevAddon(name: string, indexContent = '') { - let addon = this.addDevDependency(name); - addon.files = { - 'index.js': addonIndexFile(indexContent), - addon: { - templates: { - components: {}, - }, - }, - app: {}, - }; - addon.linkPackage('ember-cli-htmlbars'); - addon.linkPackage('ember-cli-babel'); - - addon.pkg.keywords = ['ember-addon']; - addon.pkg['ember-addon'] = {}; - return addon; - } - - addInRepoAddon(name: string, indexContent = '', additionalFiles?: {}) { - if (!this.pkg['ember-addon']) { - this.pkg['ember-addon'] = {}; - } - - if (!this.pkg['ember-addon'].paths) { - this.pkg['ember-addon'].paths = []; - } - - this.pkg['ember-addon'].paths.push(`lib/${name}`); - - let addon = new Project(name); - merge( - addon.files, - { - 'index.js': addonIndexFile(indexContent), - }, - additionalFiles - ); - addon.pkg['keywords'] = ['ember-addon']; - this.inRepoAddons.add(addon); - return addon; - } - - addEngine(name: string, lazy: boolean): Project { - let addonProject = this.addAddon(name); - - addonProject.pkg.keywords.push('ember-engine'); - - merge(addonProject.files, { - 'index.js': engineIndex(lazy), - config: { - 'environment.js': engineConfig(name), - }, - addon: { - 'engine.js': engineAddonFile(), - }, - }); - - addonProject.linkDevPackage('ember-engines'); - - return addonProject; - } - - toJSON(): Project['files']; - toJSON(key: string): Project['files'] | string; - toJSON(key?: string) { - let result = key ? super.toJSON(key) : super.toJSON(); - if (!key && this.packageLinks.size > 0) { - let baseJSON = unwrapPackageName(result, this.name); - let pkg = JSON.parse(baseJSON['package.json']); - for (let [name] of this.packageLinks) { - if (this.devPackageLinks.has(name)) { - pkg.devDependencies[name] = '*'; - } else { - pkg.dependencies[name] = '*'; - } - } - baseJSON['package.json'] = JSON.stringify(pkg, null, 2); - } - return result; - } -} - -function parseScoped(name: string) { - let matched = name.match(/(@[^@\/]+)\/(.*)/); - if (matched) { - return { - scope: matched[1], - name: matched[2], - }; - } - return null; -} - -function unwrapPackageName(obj: any, packageName: string) { - let scoped = parseScoped(packageName); - if (scoped) { - return obj[scoped.scope][scoped.name]; - } - return obj[packageName]; -} diff --git a/test-packages/support/rebuilder.ts b/test-packages/support/rebuilder.ts new file mode 100644 index 000000000..7cd317f64 --- /dev/null +++ b/test-packages/support/rebuilder.ts @@ -0,0 +1,166 @@ +import { ChildProcess, fork } from 'child_process'; +import type Project from 'ember-cli/lib/models/project'; +import type { Builder } from 'broccoli'; + +/* + A minimalist test harness for running ember-cli builds and rebuilds on demand. + + The main benefit here is that you get a promise based API for both initial + build and explicitly-required subsequent builds. +*/ + +export class Rebuilder { + private pending: + | undefined + | { + expecting: 'built'; + resolve: (message: BuiltMessage) => void; + reject: (err: unknown) => void; + } + | { + expecting: 'shutdown'; + resolve: () => void; + reject: (err: unknown) => void; + }; + + private combinedBuffer: string[] = []; + private child: ChildProcess; + + #outputPath: string | undefined; + + private constructor(projectPath: string, env?: Record) { + this.child = fork(__filename, [], { + env: { ...process.env, ...env }, + cwd: projectPath, + stdio: ['inherit', 'pipe', 'pipe', 'ipc'], + }); + this.child.stderr!.on('data', data => this.captureStream(data)); + this.child.stdout!.on('data', data => this.captureStream(data)); + + this.child.on('close', exitCode => this.handleClose(exitCode)); + + this.child.on('message', (m: BuiltMessage) => this.handleMessage(m)); + } + + async build(opts?: { changedDirs?: string[] }): Promise { + this.child.send(['rebuild', opts?.changedDirs ?? []]); + await new Promise((resolve, reject) => { + this.pending = { resolve, reject, expecting: 'built' }; + }); + } + + async shutdown() { + this.child.send(['shutdown']); + await new Promise((resolve, reject) => { + this.pending = { resolve, reject, expecting: 'shutdown' }; + }); + } + + private captureStream(data: string) { + this.combinedBuffer.push(data); + } + + get outputPath(): string { + return this.#outputPath!; + } + + private handleClose(exitCode: number | null) { + if (!this.pending) { + throw new Error(`unexpected child exit. ${this.combinedBuffer.join('')}`); + } + let p = this.pending; + this.pending = undefined; + if (p.expecting === 'shutdown' && exitCode === 0) { + p.resolve(); + } else { + p.reject(new Error(this.combinedBuffer.join(''))); + } + } + + private async ready(): Promise { + let { outputPath } = await new Promise((resolve, reject) => { + this.pending = { resolve, reject, expecting: 'built' }; + }); + this.#outputPath = outputPath; + } + + private handleMessage(m: BuiltMessage) { + if (!this.pending) { + throw new Error(`unexpected message with nothing pending ${JSON.stringify(m)}\n${this.combinedBuffer.join('')}`); + } + let p = this.pending; + this.pending = undefined; + if (m.type === p.expecting) { + p.resolve(m as any); + } else { + p.reject(new Error(`unexpected message ${JSON.stringify(m)}.\n${this.combinedBuffer.join('')}`)); + } + } + + static async create(projectPath: string, env?: Record): Promise { + let instance = new this(projectPath, env); + await instance.ready(); + return instance; + } +} + +interface BuiltMessage { + type: 'built'; + outputPath: string; +} + +function sendToParent(message: BuiltMessage) { + process.send!(message); +} + +async function main() { + const { Builder } = await import('broccoli'); + const { default: Project } = await import( + require.resolve('ember-cli/lib/models/project', { paths: [process.cwd()] }) + ); + const { resolve } = await import('path'); + + let project: Project = (Project as any).closestSync(process.cwd()); + let mod = require(resolve('./ember-cli-build')); + let tree = mod({ project }); + let builder = new Builder(tree); + + await builder.build(); + sendToParent({ type: 'built', outputPath: builder.outputPath }); + + process.on('message', async (m: ['rebuild', string[]] | ['shutdown']) => { + try { + if (m[0] === 'rebuild') { + for (let changed of m[1]) { + didChange(builder, changed); + } + await builder.build(); + sendToParent({ type: 'built', outputPath: builder.outputPath }); + } + if (m[0] === 'shutdown') { + await builder.cleanup(); + process.exit(0); + } + } catch (err) { + process.stderr.write(err.stack); + process.exit(-1); + } + }); +} + +if (require.main === module) { + main().catch(err => { + process.stderr.write(err.stack); + process.exit(-1); + }); +} + +function didChange(builder: Builder, dir: string) { + let node = builder.watchedSourceNodeWrappers.find(nw => nw.nodeInfo.sourceDirectory === dir); + if (!node) { + throw new Error( + `test tried to simulated a watched file change in ${dir}, but we could not find the corresponding watched broccoli node` + ); + } + node.revise(); +} diff --git a/test-packages/support/transpiler.ts b/test-packages/support/transpiler.ts new file mode 100644 index 000000000..0e2a2587a --- /dev/null +++ b/test-packages/support/transpiler.ts @@ -0,0 +1,47 @@ +import { readJSONSync } from 'fs-extra'; +import { join } from 'path'; +import { TransformOptions, transform } from '@babel/core'; +import { BoundExpectFile } from './file-assertions'; +import { AppMeta, hbsToJS } from '@embroider/core'; +import { Memoize } from 'typescript-memoize'; + +export class Transpiler { + constructor(private outputPath: string) { + this.transpile = this.transpile.bind(this); + this.shouldTranspile = this.shouldTranspile.bind(this); + } + + transpile(contents: string, fileAssert: BoundExpectFile): string { + if (fileAssert.path.endsWith('.hbs')) { + return transform(hbsToJS(contents), Object.assign({ filename: fileAssert.fullPath }, this.babelConfig))!.code!; + } else if (fileAssert.path.endsWith('.js')) { + return transform(contents, Object.assign({ filename: fileAssert.fullPath }, this.babelConfig))!.code!; + } else { + return contents; + } + } + + shouldTranspile(relativePath: string) { + // eslint-disable-next-line @typescript-eslint/no-require-imports + let shouldTranspile = require(join(this.outputPath, '_babel_filter_')); + return shouldTranspile(join(this.outputPath, relativePath)) as boolean; + } + + @Memoize() + private get pkgJSON() { + return readJSONSync(join(this.outputPath, 'package.json')); + } + + private get emberMeta(): AppMeta { + return this.pkgJSON['ember-addon'] as AppMeta; + } + + @Memoize() + private get babelConfig() { + if (this.emberMeta['babel'].majorVersion !== 7) { + throw new Error(`@embroider/test-support only suports babel 7`); + } + // eslint-disable-next-line @typescript-eslint/no-require-imports + return require(join(this.outputPath, this.emberMeta['babel'].filename)) as TransformOptions; + } +} diff --git a/tests/addon-template/.ember-cli b/tests/addon-template/.ember-cli index ee64cfed2..4ccb4bf43 100644 --- a/tests/addon-template/.ember-cli +++ b/tests/addon-template/.ember-cli @@ -5,5 +5,11 @@ Setting `disableAnalytics` to true will prevent any data from being sent. */ - "disableAnalytics": false + "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/tests/addon-template/.eslintignore b/tests/addon-template/.eslintignore index 922165552..d474a40bd 100644 --- a/tests/addon-template/.eslintignore +++ b/tests/addon-template/.eslintignore @@ -13,9 +13,13 @@ # 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/tests/addon-template/.eslintrc.js b/tests/addon-template/.eslintrc.js index 2504063f6..d025472e6 100644 --- a/tests/addon-template/.eslintrc.js +++ b/tests/addon-template/.eslintrc.js @@ -24,21 +24,15 @@ module.exports = { // node files { files: [ - '.eslintrc.js', - '.prettierrc.js', - '.template-lintrc.js', - 'ember-cli-build.js', - 'index.js', - 'testem.js', - 'blueprints/*/index.js', - 'config/**/*.js', - 'tests/dummy/config/**/*.js', - ], - excludedFiles: [ - 'addon/**', - 'addon-test-support/**', - 'app/**', - 'tests/dummy/app/**', + './.eslintrc.js', + './.prettierrc.js', + './.template-lintrc.js', + './ember-cli-build.js', + './index.js', + './testem.js', + './blueprints/*/index.js', + './config/**/*.js', + './tests/dummy/config/**/*.js', ], parserOptions: { sourceType: 'script', @@ -50,5 +44,10 @@ module.exports = { plugins: ['node'], extends: ['plugin:node/recommended'], }, + { + // test files + files: ['tests/**/*-test.{js,ts}'], + extends: ['plugin:qunit/recommended'], + }, ], }; diff --git a/tests/addon-template/.github/workflows/ci.yml b/tests/addon-template/.github/workflows/ci.yml new file mode 100644 index 000000000..73f2e4c50 --- /dev/null +++ b/tests/addon-template/.github/workflows/ci.yml @@ -0,0 +1,79 @@ +name: CI + +on: + push: + branches: + - main + - master + pull_request: {} + +concurrency: + group: ci-${{ github.head_ref || github.ref }} + cancel-in-progress: true + +jobs: + test: + name: "Tests" + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v3 + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: npm + - name: Install Dependencies + run: npm ci + - name: Lint + run: npm run lint + - name: Run Tests + run: npm run test:ember + + floating: + name: "Floating Dependencies" + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: npm + - name: Install Dependencies + run: npm install --no-shrinkwrap + - name: Run Tests + run: npm run test:ember + + try-scenarios: + name: ${{ matrix.try-scenario }} + runs-on: ubuntu-latest + needs: "test" + timeout-minutes: 10 + + strategy: + fail-fast: false + matrix: + try-scenario: + - ember-lts-3.24 + - ember-lts-3.28 + - ember-release + - ember-beta + - ember-canary + - ember-classic + - embroider-safe + - embroider-optimized + + steps: + - uses: actions/checkout@v3 + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: npm + - name: Install Dependencies + run: npm ci + - name: Run Tests + run: ./node_modules/.bin/ember try:one ${{ matrix.try-scenario }} diff --git a/tests/addon-template/.gitignore b/tests/addon-template/.gitignore index 7e0f7ddce..f1e859b29 100644 --- a/tests/addon-template/.gitignore +++ b/tests/addon-template/.gitignore @@ -23,4 +23,10 @@ # 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/tests/addon-template/.npmignore b/tests/addon-template/.npmignore index 1556c4d3c..3aac2443f 100644 --- a/tests/addon-template/.npmignore +++ b/tests/addon-template/.npmignore @@ -14,6 +14,7 @@ /.eslintignore /.eslintrc.js /.git/ +/.github/ /.gitignore /.prettierignore /.prettierrc.js @@ -26,10 +27,14 @@ /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/tests/addon-template/.prettierignore b/tests/addon-template/.prettierignore index 922165552..4178fd571 100644 --- a/tests/addon-template/.prettierignore +++ b/tests/addon-template/.prettierignore @@ -14,8 +14,12 @@ /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/tests/addon-template/.template-lintrc.js b/tests/addon-template/.template-lintrc.js index 3b0b9af95..f35f61c7b 100644 --- a/tests/addon-template/.template-lintrc.js +++ b/tests/addon-template/.template-lintrc.js @@ -1,5 +1,5 @@ 'use strict'; module.exports = { - extends: 'octane', + extends: 'recommended', }; diff --git a/tests/addon-template/.travis.yml b/tests/addon-template/.travis.yml deleted file mode 100644 index b9b72cdba..000000000 --- a/tests/addon-template/.travis.yml +++ /dev/null @@ -1,61 +0,0 @@ ---- -language: node_js -node_js: - # we recommend testing addons with the same minimum supported node version as Ember CLI - # so that your addon works for all apps - - "10" - -dist: xenial - -addons: - chrome: stable - -cache: - directories: - - $HOME/.npm - -env: - global: - # See https://git.io/vdao3 for details. - - JOBS=1 - -branches: - only: - - master - # npm version tags - - /^v\d+\.\d+\.\d+/ - -jobs: - fast_finish: true - allow_failures: - - env: EMBER_TRY_SCENARIO=ember-canary - - include: - # runs linting and tests with current locked deps - - stage: "Tests" - name: "Tests" - script: - - npm run lint - - npm run test:ember - - - stage: "Additional Tests" - name: "Floating Dependencies" - install: - - npm install --no-package-lock - script: - - npm run test:ember - - # we recommend new addons test the current and previous LTS - # as well as latest stable release (bonus points to beta/canary) - - env: EMBER_TRY_SCENARIO=ember-lts-3.16 - - env: EMBER_TRY_SCENARIO=ember-lts-3.20 - - env: EMBER_TRY_SCENARIO=ember-release - - env: EMBER_TRY_SCENARIO=ember-beta - - env: EMBER_TRY_SCENARIO=ember-canary - - env: EMBER_TRY_SCENARIO=ember-default-with-jquery - - env: EMBER_TRY_SCENARIO=ember-classic - - env: EMBER_TRY_SCENARIO=embroider-safe - - env: EMBER_TRY_SCENARIO=embroider-optimized - -script: - - node_modules/.bin/ember try:one $EMBER_TRY_SCENARIO diff --git a/tests/addon-template/CONTRIBUTING.md b/tests/addon-template/CONTRIBUTING.md index a76cf73b8..90816462b 100644 --- a/tests/addon-template/CONTRIBUTING.md +++ b/tests/addon-template/CONTRIBUTING.md @@ -22,4 +22,4 @@ * `ember serve` * Visit the dummy application at [http://localhost:4200](http://localhost:4200). -For more information on using ember-cli, visit [https://ember-cli.com/](https://ember-cli.com/). +For more information on using ember-cli, visit [https://cli.emberjs.com/release/](https://cli.emberjs.com/release/). diff --git a/tests/addon-template/README.md b/tests/addon-template/README.md index b94972ba1..f6d7e2bc0 100644 --- a/tests/addon-template/README.md +++ b/tests/addon-template/README.md @@ -1,38 +1,32 @@ -addon-template -============================================================================== +# addon-template [Short description of the addon.] -Compatibility ------------------------------------------------------------------------------- +## Compatibility -* Ember.js v3.16 or above -* Ember CLI v2.13 or above -* Node.js v10 or above +* Ember.js v3.24 or above +* Ember CLI v3.24 or above +* Node.js v14 or above -Installation ------------------------------------------------------------------------------- +## Installation ``` ember install addon-template ``` -Usage ------------------------------------------------------------------------------- +## Usage [Longer description of how to use the addon in apps.] -Contributing ------------------------------------------------------------------------------- +## Contributing See the [Contributing](CONTRIBUTING.md) guide for details. -License ------------------------------------------------------------------------------- +## License This project is licensed under the [MIT License](LICENSE.md). diff --git a/tests/addon-template/config/ember-try.js b/tests/addon-template/config/ember-try.js index 2ab59e5b6..9dbefdd3a 100644 --- a/tests/addon-template/config/ember-try.js +++ b/tests/addon-template/config/ember-try.js @@ -7,18 +7,18 @@ module.exports = async function () { return { scenarios: [ { - name: 'ember-lts-3.16', + name: 'ember-lts-3.24', npm: { devDependencies: { - 'ember-source': '~3.16.0', + 'ember-source': '~3.24.3', }, }, }, { - name: 'ember-lts-3.20', + name: 'ember-lts-3.28', npm: { devDependencies: { - 'ember-source': '~3.20.5', + 'ember-source': '~3.28.0', }, }, }, @@ -46,19 +46,6 @@ module.exports = async function () { }, }, }, - { - name: 'ember-default-with-jquery', - env: { - EMBER_OPTIONAL_FEATURES: JSON.stringify({ - 'jquery-integration': true, - }), - }, - npm: { - devDependencies: { - '@ember/jquery': '^1.1.0', - }, - }, - }, { name: 'ember-classic', env: { @@ -69,6 +56,9 @@ module.exports = async function () { }), }, npm: { + devDependencies: { + 'ember-source': '~3.28.0', + }, ember: { edition: 'classic', }, diff --git a/tests/addon-template/ember-cli-build.js b/tests/addon-template/ember-cli-build.js index a778499b7..e211c6334 100644 --- a/tests/addon-template/ember-cli-build.js +++ b/tests/addon-template/ember-cli-build.js @@ -15,5 +15,11 @@ module.exports = function (defaults) { */ const { maybeEmbroider } = require('@embroider/test-setup'); - return maybeEmbroider(app); + return maybeEmbroider(app, { + skipBabel: [ + { + package: 'qunit', + }, + ], + }); }; diff --git a/tests/addon-template/package.json b/tests/addon-template/package.json index fe0d7ce4a..652e7fdcb 100644 --- a/tests/addon-template/package.json +++ b/tests/addon-template/package.json @@ -14,7 +14,7 @@ }, "scripts": { "build": "ember build --environment=production", - "lint": "npm-run-all --aggregate-output --continue-on-error --parallel 'lint:!(fix)'", + "lint": "npm-run-all --aggregate-output --continue-on-error --parallel \"lint:!(fix)\"", "lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix", "lint:hbs": "ember-template-lint .", "lint:hbs:fix": "ember-template-lint . --fix", @@ -26,49 +26,48 @@ "test:ember-compatibility": "ember try:each" }, "dependencies": { - "ember-cli-babel": "^7.26.3", - "ember-cli-htmlbars": "^5.7.1" + "ember-cli-babel": "^7.26.11", + "ember-cli-htmlbars": "^6.1.0" }, "devDependencies": { "@babel/core": "^7.19.3", "@ember/optional-features": "^2.0.0", - "@ember/test-helpers": "^2.4.2", + "@ember/test-helpers": "^2.8.1", "@embroider/test-setup": "^1.8.3", - "@glimmer/component": "^1.0.4", - "@glimmer/tracking": "^1.0.4", + "@glimmer/component": "^1.1.2", + "@glimmer/tracking": "^1.1.2", "babel-eslint": "^10.1.0", "broccoli-asset-rev": "^3.0.0", - "ember-auto-import": "^2.2.0", - "ember-cli": "~3.28.0", - "ember-cli-dependency-checker": "^3.2.0", - "ember-cli-inject-live-reload": "^2.0.2", + "ember-auto-import": "^2.4.2", + "ember-cli": "~4.6.0", + "ember-cli-dependency-checker": "^3.3.1", + "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", - "ember-cli-terser": "^4.0.1", + "ember-cli-terser": "^4.0.2", "ember-disable-prototype-extensions": "^1.1.3", - "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.2", - "ember-maybe-import-regenerator": "^1.0.0", - "ember-page-title": "^6.2.1", - "ember-qunit": "^5.1.4", - "ember-resolver": "^8.0.2", - "ember-source": "~3.26", + "ember-page-title": "^7.0.0", + "ember-qunit": "^5.1.5", + "ember-resolver": "^8.0.3", + "ember-source": "~4.6.0", "ember-source-channel-url": "^3.0.0", - "ember-template-lint": "^3.2.0", - "ember-try": "^1.4.0", - "eslint": "^7.23.0", - "eslint-config-prettier": "^8.1.0", - "eslint-plugin-ember": "^10.3.0", + "ember-template-lint": "^4.10.1", + "ember-try": "^2.0.0", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-ember": "^11.0.2", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-qunit": "^7.3.1", "loader.js": "^4.7.0", "npm-run-all": "^4.1.5", - "prettier": "^2.2.1", - "qunit": "^2.16.0", - "qunit-dom": "^1.6.0", - "webpack": "^5" + "prettier": "^2.7.1", + "qunit": "^2.19.1", + "qunit-dom": "^2.0.0", + "webpack": "^5.74.0" }, "engines": { - "node": "10.* || >= 12" + "node": "14.* || >= 16" }, "ember": { "edition": "octane" diff --git a/tests/addon-template/tests/dummy/app/index.html b/tests/addon-template/tests/dummy/app/index.html index 61400b20f..8c195bc41 100644 --- a/tests/addon-template/tests/dummy/app/index.html +++ b/tests/addon-template/tests/dummy/app/index.html @@ -2,7 +2,6 @@ - Dummy diff --git a/tests/addon-template/tests/dummy/config/ember-cli-update.json b/tests/addon-template/tests/dummy/config/ember-cli-update.json index 1f6ba0d3c..4bda977f3 100644 --- a/tests/addon-template/tests/dummy/config/ember-cli-update.json +++ b/tests/addon-template/tests/dummy/config/ember-cli-update.json @@ -3,14 +3,13 @@ "packages": [ { "name": "ember-cli", - "version": "3.26.0", + "version": "4.6.0", "blueprints": [ { "name": "addon", "outputRepo": "https://github.com/ember-cli/ember-addon-output", "codemodsSource": "ember-addon-codemods-manifest@1", - "isBaseBlueprint": true, - "options": [] + "isBaseBlueprint": true } ] } diff --git a/tests/addon-template/tests/dummy/config/environment.js b/tests/addon-template/tests/dummy/config/environment.js index ba4e8cb76..15d2fccdc 100644 --- a/tests/addon-template/tests/dummy/config/environment.js +++ b/tests/addon-template/tests/dummy/config/environment.js @@ -5,16 +5,12 @@ module.exports = function (environment) { modulePrefix: 'dummy', environment, rootURL: '/', - locationType: 'auto', + locationType: 'history', EmberENV: { FEATURES: { // Here you can enable experimental features on an ember canary build // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true }, - EXTEND_PROTOTYPES: { - // Prevent Ember Data from overriding Date.parse. - Date: false, - }, }, APP: { diff --git a/tests/addon-template/tests/dummy/config/targets.js b/tests/addon-template/tests/dummy/config/targets.js index 4b33327e8..1e48e0599 100644 --- a/tests/addon-template/tests/dummy/config/targets.js +++ b/tests/addon-template/tests/dummy/config/targets.js @@ -6,13 +6,6 @@ const browsers = [ 'last 1 Safari versions', ]; -const isCI = Boolean(process.env.CI); -const isProduction = process.env.EMBER_ENV === 'production'; - -if (isCI || isProduction) { - browsers.push('ie 11'); -} - module.exports = { browsers, }; diff --git a/tests/addon-template/tests/helpers/.gitkeep b/tests/addon-template/tests/helpers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/addon-template/tests/helpers/index.js b/tests/addon-template/tests/helpers/index.js new file mode 100644 index 000000000..7f70de80f --- /dev/null +++ b/tests/addon-template/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/tests/addon-template/tests/index.html b/tests/addon-template/tests/index.html index 3eb848dbd..b74fc8be6 100644 --- a/tests/addon-template/tests/index.html +++ b/tests/addon-template/tests/index.html @@ -2,7 +2,6 @@ - Dummy Tests @@ -28,7 +27,7 @@
- + diff --git a/tests/app-template/.ember-cli b/tests/app-template/.ember-cli index ee64cfed2..4ccb4bf43 100644 --- a/tests/app-template/.ember-cli +++ b/tests/app-template/.ember-cli @@ -5,5 +5,11 @@ Setting `disableAnalytics` to true will prevent any data from being sent. */ - "disableAnalytics": false + "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/tests/app-template/.eslintignore b/tests/app-template/.eslintignore index 72df37307..d474a40bd 100644 --- a/tests/app-template/.eslintignore +++ b/tests/app-template/.eslintignore @@ -13,8 +13,13 @@ # 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/tests/app-template/.eslintrc.js b/tests/app-template/.eslintrc.js index 758a8e843..7e313e08e 100644 --- a/tests/app-template/.eslintrc.js +++ b/tests/app-template/.eslintrc.js @@ -17,14 +17,15 @@ module.exports = { // node files { files: [ - '.eslintrc.js', - '.template-lintrc.js', - 'ember-cli-build.js', - 'testem.js', - 'blueprints/*/index.js', - 'config/**/*.js', - 'lib/*/index.js', - 'server/**/*.js', + './.eslintrc.js', + './.prettierrc.js', + './.template-lintrc.js', + './ember-cli-build.js', + './testem.js', + './blueprints/*/index.js', + './config/**/*.js', + './lib/*/index.js', + './server/**/*.js', ], parserOptions: { sourceType: 'script', @@ -41,5 +42,10 @@ module.exports = { 'node/no-unpublished-require': 'off', }, }, + { + // test files + files: ['tests/**/*-test.{js,ts}'], + extends: ['plugin:qunit/recommended'], + }, ], }; diff --git a/tests/app-template/.github/workflows/ci.yml b/tests/app-template/.github/workflows/ci.yml new file mode 100644 index 000000000..0321412cd --- /dev/null +++ b/tests/app-template/.github/workflows/ci.yml @@ -0,0 +1,47 @@ +name: CI + +on: + push: + branches: + - main + - master + pull_request: {} + +concurrency: + group: ci-${{ github.head_ref || github.ref }} + cancel-in-progress: true + +jobs: + lint: + name: "Lint" + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v3 + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: yarn + - name: Install Dependencies + run: yarn install --frozen-lockfile + - name: Lint + run: yarn lint + + test: + name: "Test" + runs-on: ubuntu-latest + timeout-minutes: 10 + + steps: + - uses: actions/checkout@v3 + - name: Install Node + uses: actions/setup-node@v3 + with: + node-version: 14.x + cache: yarn + - name: Install Dependencies + run: yarn install --frozen-lockfile + - name: Run Tests + run: yarn test diff --git a/tests/app-template/.gitignore b/tests/app-template/.gitignore index c40a1b2ab..59a00ea13 100644 --- a/tests/app-template/.gitignore +++ b/tests/app-template/.gitignore @@ -22,4 +22,10 @@ # 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/tests/app-template/.template-lintrc.js b/tests/app-template/.template-lintrc.js index 3b0b9af95..f35f61c7b 100644 --- a/tests/app-template/.template-lintrc.js +++ b/tests/app-template/.template-lintrc.js @@ -1,5 +1,5 @@ 'use strict'; module.exports = { - extends: 'octane', + extends: 'recommended', }; diff --git a/tests/app-template/README.md b/tests/app-template/README.md index 8481bf261..3d5527987 100644 --- a/tests/app-template/README.md +++ b/tests/app-template/README.md @@ -10,7 +10,7 @@ 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://ember-cli.com/) +* [Ember CLI](https://cli.emberjs.com/release/) * [Google Chrome](https://google.com/chrome/) ## Installation @@ -52,7 +52,7 @@ Specify what it takes to deploy your app. ## Further Reading / Useful Links * [ember.js](https://emberjs.com/) -* [ember-cli](https://ember-cli.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/tests/app-template/app/index.html b/tests/app-template/app/index.html index 594551b74..70cc17dbb 100644 --- a/tests/app-template/app/index.html +++ b/tests/app-template/app/index.html @@ -2,7 +2,6 @@ - AppTemplate diff --git a/tests/app-template/config/ember-cli-update.json b/tests/app-template/config/ember-cli-update.json index 4c36188f4..1767e741c 100644 --- a/tests/app-template/config/ember-cli-update.json +++ b/tests/app-template/config/ember-cli-update.json @@ -3,7 +3,7 @@ "packages": [ { "name": "ember-cli", - "version": "3.26.0", + "version": "4.6.0", "blueprints": [ { "name": "app", diff --git a/tests/app-template/config/environment.js b/tests/app-template/config/environment.js index e09edae54..fd7336e9f 100644 --- a/tests/app-template/config/environment.js +++ b/tests/app-template/config/environment.js @@ -1,26 +1,22 @@ 'use strict'; -module.exports = function(environment) { +module.exports = function (environment) { let ENV = { modulePrefix: 'app-template', environment, rootURL: '/', - locationType: 'auto', + locationType: 'history', EmberENV: { FEATURES: { // Here you can enable experimental features on an ember canary build // e.g. EMBER_NATIVE_DECORATOR_SUPPORT: true }, - EXTEND_PROTOTYPES: { - // Prevent Ember Data from overriding Date.parse. - Date: false - } }, APP: { // Here you can pass flags/options to your application instance // when it is created - } + }, }; if (environment === 'development') { diff --git a/tests/app-template/config/targets.js b/tests/app-template/config/targets.js index fb7f01b09..9f6cc6396 100644 --- a/tests/app-template/config/targets.js +++ b/tests/app-template/config/targets.js @@ -2,13 +2,6 @@ const browsers = ['last 1 Chrome versions', 'last 1 Firefox versions', 'last 1 Safari versions']; -const isCI = Boolean(process.env.CI); -const isProduction = process.env.EMBER_ENV === 'production'; - -if (isCI || isProduction) { - browsers.push('ie 11'); -} - module.exports = { browsers, }; diff --git a/tests/app-template/package.json b/tests/app-template/package.json index 1f227dc16..5a133053a 100644 --- a/tests/app-template/package.json +++ b/tests/app-template/package.json @@ -26,49 +26,48 @@ "devDependencies": { "@babel/core": "^7.19.3", "@ember/optional-features": "^2.0.0", - "@ember/test-helpers": "^2.4.2", + "@ember/test-helpers": "^2.8.1", "@embroider/compat": "1.9.0", "@embroider/core": "1.9.0", "@embroider/router": "1.9.0", "@embroider/test-setup": "1.8.3", "@embroider/webpack": "1.9.0", - "@glimmer/component": "^1.0.4", - "@glimmer/tracking": "^1.0.4", + "@glimmer/component": "^1.1.2", + "@glimmer/tracking": "^1.1.2", "babel-eslint": "^10.1.0", "broccoli-asset-rev": "^3.0.0", - "ember-auto-import": "^2.2.0", - "ember-cli": "~3.28.0", + "ember-auto-import": "^2.4.2", + "ember-cli": "~4.6.0", "ember-cli-app-version": "^5.0.0", - "ember-cli-babel": "^7.26.3", - "ember-cli-dependency-checker": "^3.2.0", - "ember-cli-htmlbars": "^5.7.1", - "ember-cli-inject-live-reload": "^2.0.2", + "ember-cli-babel": "^7.26.11", + "ember-cli-dependency-checker": "^3.3.1", + "ember-cli-htmlbars": "^6.1.0", + "ember-cli-inject-live-reload": "^2.1.0", "ember-cli-sri": "^2.1.1", - "ember-cli-terser": "^4.0.1", - "ember-data": "~3.28.3", - "ember-export-application-global": "^2.0.1", - "ember-fetch": "^8.0.1", + "ember-cli-terser": "^4.0.2", + "ember-data": "~4.4.0", + "ember-fetch": "^8.1.1", "ember-load-initializers": "^2.1.2", - "ember-maybe-import-regenerator": "^1.0.0", - "ember-page-title": "^6.2.1", - "ember-qunit": "^5.1.4", - "ember-resolver": "^8.0.2", - "ember-source": "~3.28", - "ember-template-lint": "^3.2.0", - "eslint": "^7.23.0", - "eslint-config-prettier": "^8.1.0", - "eslint-plugin-ember": "^10.3.0", + "ember-page-title": "^7.0.0", + "ember-qunit": "^5.1.5", + "ember-resolver": "^8.0.3", + "ember-source": "~4.6.0", + "ember-template-lint": "^4.10.1", + "eslint": "^7.32.0", + "eslint-config-prettier": "^8.5.0", + "eslint-plugin-ember": "^11.0.2", "eslint-plugin-node": "^11.1.0", - "eslint-plugin-prettier": "^3.3.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-qunit": "^7.3.1", "loader.js": "^4.7.0", "npm-run-all": "^4.1.5", - "prettier": "^2.2.1", - "qunit": "^2.16.0", - "qunit-dom": "^1.6.0", - "webpack": "^5" + "prettier": "^2.7.1", + "qunit": "^2.19.1", + "qunit-dom": "^2.0.0", + "webpack": "^5.74.0" }, "engines": { - "node": "10.* || >= 12" + "node": "14.* || >= 16" }, "ember": { "edition": "octane" diff --git a/tests/app-template/tests/helpers/.gitkeep b/tests/app-template/tests/helpers/.gitkeep deleted file mode 100644 index e69de29bb..000000000 diff --git a/tests/app-template/tests/helpers/index.js b/tests/app-template/tests/helpers/index.js new file mode 100644 index 000000000..7f70de80f --- /dev/null +++ b/tests/app-template/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/tests/app-template/tests/index.html b/tests/app-template/tests/index.html index cb59624f4..a2a87500b 100644 --- a/tests/app-template/tests/index.html +++ b/tests/app-template/tests/index.html @@ -1,25 +1,21 @@ - - - App-Template Tests - - + + AppTemplate Tests + + - {{content-for "head"}} - {{content-for "test-head"}} + {{content-for "head"}} {{content-for "test-head"}} - - - + + + - {{content-for "head-footer"}} - {{content-for "test-head-footer"}} + {{content-for "head-footer"}} {{content-for "test-head-footer"}} - {{content-for "body"}} - {{content-for "test-body"}} + {{content-for "body"}} {{content-for "test-body"}}
@@ -28,13 +24,12 @@
- + - {{content-for "body-footer"}} - {{content-for "test-body-footer"}} + {{content-for "body-footer"}} {{content-for "test-body-footer"}} diff --git a/tests/fixtures/eager-engine/addon/styles/addon.css b/tests/fixtures/eager-engine/addon/styles/addon.css index 7320a2992..61952af39 100644 --- a/tests/fixtures/eager-engine/addon/styles/addon.css +++ b/tests/fixtures/eager-engine/addon/styles/addon.css @@ -4,3 +4,5 @@ border-left-color: blue; content: 'eager-engine/addon/styles/addon.css'; } + +.eager { background-color: blue; } diff --git a/tests/fixtures/lazy-engine/addon/styles/addon.css b/tests/fixtures/lazy-engine/addon/styles/addon.css index 048c91042..f78ea69af 100644 --- a/tests/fixtures/lazy-engine/addon/styles/addon.css +++ b/tests/fixtures/lazy-engine/addon/styles/addon.css @@ -4,3 +4,7 @@ border-right-color: blue; content: 'lazy-engine/addon/styles/addon.css'; } + +.lazy { + background-color: red; +} diff --git a/tests/scenarios/compat-addon-styles-test.ts b/tests/scenarios/compat-addon-styles-test.ts new file mode 100644 index 000000000..6fbc2971d --- /dev/null +++ b/tests/scenarios/compat-addon-styles-test.ts @@ -0,0 +1,133 @@ +import { expectFilesAt, ExpectFile } from '@embroider/test-support'; +import { PreparedApp } from 'scenario-tester'; +import { throwOnWarnings } from '@embroider/core'; +import { appScenarios, baseAddon } from './scenarios'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import QUnit from 'qunit'; +import { merge } from 'lodash'; +const { module: Qmodule, test } = QUnit; + +appScenarios + .map('compat-addon-styles', project => { + let addon1 = baseAddon(); + addon1.pkg.name = 'my-addon1'; + + merge(addon1.files, { + 'index.js': ` + module.exports = { + name: require('./package.json').name, + treeForStyles() { + const buildFunnel = require('broccoli-funnel'); + const path = require('path'); + let tree = buildFunnel(path.join(__dirname, 'node_modules/third-party1'), { + destDir: '.' + }); + return this._super.treeForStyles.call(this, tree); + } + } + `, + }); + + addon1.addDependency('third-party1', '1.2.3').files = { + 'third-party1.css': '.error { color: red; }', + }; + addon1.linkDependency('broccoli-funnel', { baseDir: __dirname }); + project.addDependency(addon1); + + let addon2 = baseAddon(); + addon2.pkg.name = 'my-addon2'; + + merge(addon2.files, { + 'index.js': ` + module.exports = { + name: require('./package.json').name, + treeForStyles() { + const buildFunnel = require('broccoli-funnel'); + const path = require('path'); + return buildFunnel(path.join(__dirname, 'node_modules/third-party2'), { + destDir: '.' + }); + } + } + `, + }); + + addon2.addDependency('third-party2', '1.2.3').files = { + 'third-party2.css': '.success { color: green }', + }; + addon2.linkDependency('broccoli-funnel', { baseDir: __dirname }); + project.addDependency(addon2); + + let addon3 = baseAddon(); + addon3.pkg.name = 'my-addon3'; + merge(addon3.files, { + addon: { + styles: { + 'addon.css': ` + .from-addon { + background-color: red; + } + `, + 'outer.css': ` + .from-outer { + background-color: blue; + } + `, + nested: { + 'inner.css': ` + .from-inner { + background-color: green; + } + `, + }, + }, + }, + }); + + project.addDependency(addon3); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE1_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage1-output'), 'utf8'), { qunit: assert }); + }); + + test('treeForStyles adds styles to build', function () { + expectFile('node_modules/@embroider/synthesized-styles/assets/third-party1.css').matches( + '.error { color: red; }' + ); + }); + + // prevent regression of https://github.com/embroider-build/embroider/issues/164 + test('treeForStyles not calling super adds styles to build', function () { + expectFile('node_modules/@embroider/synthesized-styles/assets/third-party2.css').matches( + '.success { color: green }' + ); + }); + + test(`all addon CSS gets convert to implicit-styles`, function () { + let implicitStyles = expectFile('node_modules/my-addon3/package.json') + .json() + .get('ember-addon.implicit-styles'); + implicitStyles.includes('./my-addon3.css'); + implicitStyles.includes('./outer.css'); + implicitStyles.includes('./nested/inner.css'); + expectFile('node_modules/my-addon3/my-addon3.css').matches(`from-addon`); + expectFile('node_modules/my-addon3/outer.css').matches(`from-outer`); + expectFile('node_modules/my-addon3/nested/inner.css').matches(`from-inner`); + }); + }); + }); diff --git a/tests/scenarios/compat-app-dot-import-test.ts b/tests/scenarios/compat-app-dot-import-test.ts new file mode 100644 index 000000000..9718aa5c1 --- /dev/null +++ b/tests/scenarios/compat-app-dot-import-test.ts @@ -0,0 +1,70 @@ +import { expectFilesAt, ExpectFile } from '@embroider/test-support'; +import { throwOnWarnings } from '@embroider/core'; +import { PreparedApp } from 'scenario-tester'; +import { join } from 'path'; +import { readFileSync } from 'fs'; +import { appScenarios, baseAddon } from './scenarios'; +import QUnit from 'qunit'; +import { merge } from 'lodash'; +const { module: Qmodule, test } = QUnit; + +appScenarios + .map('compat-app-dot-import', app => { + let addon = baseAddon(); + addon.pkg.name = 'my-addon'; + merge(addon.files, { + 'index.js': ` + module.exports = { + name: require('./package.json').name, + included() { + this._super.included.apply(this, arguments); + this.import('vendor/some-font.ttf', { destDir: 'fonts' }); + this.import('node_modules/third-party/third-party.js', { outputFile: 'assets/tp.js' }); + } + }; + `, + vendor: { + 'some-font.ttf': `some font`, + }, + }); + addon.addDependency('third-party', '1.2.3').files = { + 'third-party.js': '// third party', + }; + app.addDevDependency(addon); + }) + .forEachScenario(function (scenario) { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + test('destDir puts vendor files into public assets', function () { + expectFile('node_modules/@embroider/synthesized-vendor/package.json') + .json() + .get(['ember-addon', 'public-assets', './vendor/some-font.ttf']) + .equals('fonts/some-font.ttf'); + expectFile('node_modules/@embroider/synthesized-vendor/vendor/some-font.ttf').exists(); + }); + + test('handle non-transformed node_module with explicit outputFile', function () { + expectFile('node_modules/@embroider/synthesized-vendor/package.json') + .json() + .get([ + 'ember-addon', + 'public-assets', + join(app.dir, 'node_modules', 'my-addon', 'node_modules', 'third-party', 'third-party.js'), + ]) + .equals('assets/tp.js'); + }); + }); + }); diff --git a/tests/scenarios/compat-dummy-app-test.ts b/tests/scenarios/compat-dummy-app-test.ts new file mode 100644 index 000000000..7cd36bc92 --- /dev/null +++ b/tests/scenarios/compat-dummy-app-test.ts @@ -0,0 +1,64 @@ +import { ExpectFile, expectFilesAt, Rebuilder } from '@embroider/test-support'; +import { PreparedApp } from 'scenario-tester'; +import { throwOnWarnings } from '@embroider/core'; +import merge from 'lodash/merge'; +import { readFileSync, writeFileSync } from 'fs'; +import { join } from 'path'; +import QUnit from 'qunit'; +const { module: Qmodule, test } = QUnit; + +import { dummyAppScenarios } from './scenarios'; + +dummyAppScenarios + .map('compat-dummy-app-tests', project => { + merge(project.files, { + addon: { + components: { + 'example.hbs': `hello`, + }, + }, + tests: { + dummy: { + public: { + 'robots.txt': 'go away bots', + }, + }, + }, + }); + project.linkDevDependency('@embroider/core', { baseDir: __dirname }); + project.linkDevDependency('@embroider/compat', { baseDir: __dirname }); + project.linkDevDependency('@embroider/webpack', { baseDir: __dirname }); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let builder: Rebuilder; + let expectFile: ExpectFile; + + hooks.before(async () => { + app = await scenario.prepare(); + builder = await Rebuilder.create(app.dir, { STAGE2_ONLY: 'true' }); + }); + hooks.after(async () => { + await builder?.shutdown(); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(builder.outputPath, '.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test('rebuilds addon code', async function () { + expectFile('../../components/example.hbs').matches(/hello/); + writeFileSync(join(app.dir, 'addon/components/example.hbs'), 'goodbye'); + await builder.build({ changedDirs: [app.dir] }); + expectFile('../../components/example.hbs').matches(/goodbye/); + }); + + test('contains public assets from dummy app', async function () { + expectFile('robots.txt').exists(); + expectFile('package.json').json().get('ember-addon.assets').includes('robots.txt'); + }); + }); + }); diff --git a/tests/scenarios/compat-exclude-dot-files-test.ts b/tests/scenarios/compat-exclude-dot-files-test.ts new file mode 100644 index 000000000..8c6b00145 --- /dev/null +++ b/tests/scenarios/compat-exclude-dot-files-test.ts @@ -0,0 +1,72 @@ +import { ExpectFile, expectFilesAt } from '@embroider/test-support'; +import { throwOnWarnings } from '@embroider/core'; +import { PreparedApp } from 'scenario-tester'; +import { appScenarios, baseAddon } from './scenarios'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import QUnit from 'qunit'; +import { merge } from 'lodash'; +const { module: Qmodule, test } = QUnit; + +appScenarios + .map('compat-exclude-dot-files', app => { + merge(app.files, { + app: { + '.foobar.js': `// foobar content`, + '.barbaz.js': `// barbaz content`, + 'bizbiz.js': `// bizbiz content`, + }, + }); + + let addon = baseAddon(); + addon.pkg.name = 'my-addon'; + merge(addon.files, { + addon: { + '.fooaddon.js': `// fooaddon content`, + 'baraddon.js': `// bizbiz content`, + }, + }); + app.addDevDependency(addon); + }) + .forEachScenario(function (scenario) { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test('dot files are not included as app modules', function () { + // dot files should exist on disk + expectFile('.foobar.js').exists(); + expectFile('.barbaz.js').exists(); + expectFile('bizbiz.js').exists(); + + // dot files should not be included as modules + expectFile('assets/app-template.js').doesNotMatch('app-template/.foobar'); + expectFile('assets/app-template.js').doesNotMatch('app-template/.barbaz'); + expectFile('assets/app-template.js').matches('app-template/bizbiz'); + }); + + test('dot files are not included as addon implicit-modules', function () { + // Dot files should exist on disk + expectFile('node_modules/my-addon/.fooaddon.js').exists(); + expectFile('node_modules/my-addon/baraddon.js').exists(); + + let myAddonPackage = expectFile('node_modules/my-addon/package.json').json(); + + // dot files are not included as implicit-modules + myAddonPackage.get(['ember-addon', 'implicit-modules']).deepEquals(['./baraddon']); + }); + }); + }); diff --git a/tests/scenarios/compat-namespaced-app-test.ts b/tests/scenarios/compat-namespaced-app-test.ts new file mode 100644 index 000000000..55e59a49c --- /dev/null +++ b/tests/scenarios/compat-namespaced-app-test.ts @@ -0,0 +1,61 @@ +import { PreparedApp } from 'scenario-tester'; +import { appScenarios, baseAddon, renameApp } from './scenarios'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import QUnit from 'qunit'; +const { module: Qmodule, test } = QUnit; +import { expectFilesAt, ExpectFile } from '@embroider/test-support'; +import { throwOnWarnings } from '@embroider/core'; + +appScenarios + .map('compat-namespaced-app', app => { + renameApp(app, '@ef4/namespaced-app'); + + let addon = baseAddon(); + addon.pkg.name = 'my-addon'; + addon.pkg['ember-addon'] = { + version: 2, + type: 'addon', + 'implicit-modules': ['./my-implicit-module.js'], + }; + addon.files['my-implicit-module.js'] = ''; + app.addDevDependency(addon); + }) + .forEachScenario(function (scenario) { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + test(`app js location`, function () { + expectFile('assets/@ef4/namespaced-app.js').exists(); + }); + + test(`imports within app js`, function () { + let assertFile = expectFile('assets/@ef4/namespaced-app.js'); + assertFile.matches( + /d\(["'"]my-addon\/my-implicit-module["'], function\(\)\{ return i\(["']\.\.\/\.\.\/node_modules\/my-addon\/my-implicit-module\.js["']\);/, + 'implicit-modules have correct paths' + ); + assertFile.matches( + /d\(["']@ef4\/namespaced-app\/app['"], function\(\)\{ return i\(['"]\.\.\/\.\.\/app\.js"\);\}\);/, + `app's own modules are correct` + ); + }); + + test(`app css location`, function () { + expectFile('assets/@ef4/namespaced-app.css').exists(); + }); + }); + }); diff --git a/tests/scenarios/compat-plugin-hints-test.ts b/tests/scenarios/compat-plugin-hints-test.ts new file mode 100644 index 000000000..694fb3bc9 --- /dev/null +++ b/tests/scenarios/compat-plugin-hints-test.ts @@ -0,0 +1,70 @@ +import { ExpectFile, expectFilesAt } from '@embroider/test-support'; +import { throwOnWarnings } from '@embroider/core'; +import { PreparedApp } from 'scenario-tester'; +import { appScenarios } from './scenarios'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import QUnit from 'qunit'; +const { module: Qmodule, test } = QUnit; + +export function samplePlugin() { + return { visitor: {} }; +} + +appScenarios + .map('compat-plugin-hints', app => { + app.files['ember-cli-build.js'] = ` + 'use strict'; + + const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + const { maybeEmbroider } = require('@embroider/test-setup'); + + module.exports = function (defaults) { + let app = new EmberApp(defaults, { + babel: { + plugins: [ + // deliberately non-serializable form + require("${__filename.replace(/\\/g, '/').replace(/\.ts$/, '.js')}").samplePlugin + ] + } + }); + + return maybeEmbroider(app, { + skipBabel: [ + { + package: 'qunit', + }, + ], + pluginHints: [ + { + resolve: ["${__filename.replace(/\\/g, '/').replace(/\.ts$/, '.js')}"], + useMethod: 'samplePlugin', + }, + ], + }); + }; + `; + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test('is parallel safe', function () { + expectFile('./package.json').json().get('ember-addon.babel.isParallelSafe').equals(true); + }); + }); + }); diff --git a/tests/scenarios/compat-preprocessors-test.ts b/tests/scenarios/compat-preprocessors-test.ts new file mode 100644 index 000000000..1032282a5 --- /dev/null +++ b/tests/scenarios/compat-preprocessors-test.ts @@ -0,0 +1,127 @@ +import { PreparedApp } from 'scenario-tester'; +import { appScenarios, baseAddon } from './scenarios'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { expectFilesAt, ExpectFile } from '@embroider/test-support'; +import { throwOnWarnings } from '@embroider/core'; +import merge from 'lodash/merge'; +import QUnit from 'qunit'; +const { module: Qmodule, test } = QUnit; + +appScenarios + .map('compat-preprocessors', app => { + function makePreprocessor() { + let addonPreprocessor = baseAddon(); + addonPreprocessor.pkg.name = 'my-preprocessor'; + addonPreprocessor.linkDependency('broccoli-stew', { baseDir: __dirname }); + merge(addonPreprocessor.files, { + 'index.js': ` + const { map } = require('broccoli-stew'); + + module.exports = { + name: require('./package').name, + + setupPreprocessorRegistry(type, registry) { + if (type !== 'parent') { + return; + } + + registry.add('js', { + name: 'special-path-processor', + toTree(tree, inputPath) { + if (inputPath !== '/') { + return tree; + } + + let augmented = map( + tree, + '**/*.{js,css}', + function (content, relativePath) { + return \`/*path@\${relativePath}*/\n\${content}\`; + } + ); + return augmented; + }, + }); + } + }; + `, + }); + return addonPreprocessor; + } + app.addDevDependency(makePreprocessor()); + merge(app.files, { + config: { + 'targets.js': `module.exports = { browsers: ['last 1 Chrome versions'] }`, + }, + app: { + components: { + 'from-the-app.js': ` + import Component from '@glimmer/component'; + export default class extends Component {} + `, + 'from-the-app.hbs': `
{{this.title}}
`, + }, + }, + }); + + let addon = baseAddon(); + addon.pkg.name = 'my-addon'; + addon.addDependency(makePreprocessor()); + merge(addon.files, { + app: { + components: { + 'greeting.js': `export { default } from 'my-addon/components/greeting';`, + }, + }, + addon: { + components: { + 'greeting.js': ` + import Component from '@glimmer/component'; + export default class extends Component {} + `, + 'greeting.hbs': `Hello World`, + }, + }, + }); + app.addDevDependency(addon); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test('dependencies are setup for this test suite correctly', () => { + expectFile('package.json').exists(); + expectFile('package.json').matches(/my-preprocessor/, 'has the preprocessor dependency'); + expectFile('node_modules/my-addon/package.json').exists(); + expectFile('node_modules/my-addon/package.json').matches(/my-preprocessor/, 'has the preprocessor dependency'); + expectFile('node_modules/my-preprocessor/package.json').exists(); + }); + + test('app has correct path embedded in comment', () => { + const assertFile = expectFile('components/from-the-app.js'); + assertFile.exists(); + // This is the expected output during an classic build. + assertFile.matches(/path@app-template\/components\/from-the-app\.js/, 'has a path comment in app components'); + }); + + test('addon has correct path embedded in comment', () => { + expectFile('node_modules/my-preprocessor/package.json').exists(); + const assertFile = expectFile('node_modules/my-addon/components/greeting.js'); + assertFile.matches(/path@my-addon\/components\/greeting\.js/, 'has a path comment in app components'); + }); + }); + }); diff --git a/tests/scenarios/compat-renaming-test.ts b/tests/scenarios/compat-renaming-test.ts new file mode 100644 index 000000000..450afaad2 --- /dev/null +++ b/tests/scenarios/compat-renaming-test.ts @@ -0,0 +1,263 @@ +import { PreparedApp } from 'scenario-tester'; +import { appScenarios, baseAddon } from './scenarios'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import QUnit from 'qunit'; +const { module: Qmodule, test } = QUnit; + +import { definesPattern, ExpectFile, expectFilesAt, Transpiler } from '@embroider/test-support'; + +import { throwOnWarnings } from '@embroider/core'; +import merge from 'lodash/merge'; + +appScenarios + .map('compat-renaming', app => { + app.addDependency('a-library', { files: { 'index.js': '' } }); + merge(app.files, { + app: { + components: { + 'import-lodash.js': ` + import lodash from "lodash"; + `, + 'import-capitalize.js': ` + import capitalize from "lodash/capitalize"; + `, + 'import-own-thing.js': ` + import ownThing from "emits-multiple-packages/own-thing"; + `, + 'import-somebody-elses.js': ` + import environment from "somebody-elses-package/environment"; + `, + 'import-somebody-elses-utils.js': ` + import environment from "somebody-elses-package/utils"; + `, + 'import-somebody-elses-utils-index.js': ` + import environment from "somebody-elses-package/utils/index"; + `, + 'import-somebody-elses-utils-index-explicit.js': ` + import environment from "somebody-elses-package/utils/index.js"; + `, + 'import-somebody-elses-original.js': ` + import topLevel from "somebody-elses-package"; + import deeper from "somebody-elses-package/deeper"; + `, + 'import-single-file-package.js': ` + import whatever from 'single-file-package'; + `, + }, + }, + }); + + let somebodyElses = baseAddon(); + somebodyElses.pkg.name = 'somebody-elses-package'; + app.addDevDependency(somebodyElses); + + let emberLodash = baseAddon(); + emberLodash.pkg.name = 'ember-lodash'; + merge(emberLodash.files, { + 'index.js': ` + module.exports = { + name: require('./package.json').name, + moduleName() { return 'lodash'; } + } + `, + addon: { + 'index.js': `// lodash index`, + 'capitalize.js': `// lodash capitalize`, + }, + }); + app.addDevDependency(emberLodash); + + let emitsMultiple = baseAddon(); + emitsMultiple.pkg.name = 'emits-multiple-packages'; + merge(emitsMultiple.files, { + 'index.js': ` + module.exports = { + name: require('./package.json').name, + treeForAddon(tree) { + // doesn't call super so we can escape our namespace + return tree; + } + } + `, + addon: { + 'emits-multiple-packages': { + 'own-thing.js': '// own thing', + }, + 'somebody-elses-package': { + 'environment.js': '// somebody elses environment', + utils: { + 'index.js': '// somebody elses utils', + }, + }, + 'single-file-package.js': '// single file package', + }, + }); + app.addDependency(emitsMultiple); + + let firstAddonWithAppTreeImport = baseAddon(); + firstAddonWithAppTreeImport.pkg.name = 'has-app-tree-import'; + app.addDevDependency(firstAddonWithAppTreeImport); + merge(firstAddonWithAppTreeImport.files, { + app: { + 'first.js': `export { default } from 'has-app-tree-import';`, + 'imports-dep.js': `export { default } from 'inner-dep';`, + }, + addon: { + 'index.js': `export default "first-copy";`, + }, + }); + + let innerDep = baseAddon(); + innerDep.pkg.name = 'inner-dep'; + firstAddonWithAppTreeImport.addDependency(innerDep); + merge(innerDep.files, { + addon: { + 'index.js': `export default "inner-dep";`, + }, + }); + + let secondAddonWithAppTreeImport = baseAddon(); + secondAddonWithAppTreeImport.pkg.name = 'has-app-tree-import'; + merge(secondAddonWithAppTreeImport.files, { + app: { + 'second.js': `export { default } from 'has-app-tree-import';`, + }, + addon: { + 'index.js': `export default "second-copy";`, + }, + }); + let intermediate = baseAddon(); + intermediate.pkg.name = 'intermediate'; + intermediate.addDependency(secondAddonWithAppTreeImport); + app.addDevDependency(intermediate); + + // an addon that emits code from its own app tree that is really authored as + // part of the app and therefore does thing like refer to the app's modules + // by the app's package name + let mirageLike = baseAddon(); + mirageLike.pkg.name = 'mirage-like'; + app.addDevDependency(mirageLike); + merge(mirageLike.files, { + app: { + mirage: { + 'config.js': ` + import "app-template/components/import-lodash"; + import "a-library"; + `, + }, + }, + }); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + let build: Transpiler; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + build = new Transpiler(expectFile.basePath); + }); + + test('whole package renaming works for top-level module', function () { + let assertFile = expectFile('components/import-lodash.js').transform(build.transpile); + assertFile.matches(/import lodash from ["']ember-lodash["']/); + expectFile('node_modules/ember-lodash/index.js').matches(/lodash index/); + }); + test('whole package renaming works for interior module', function () { + let assertFile = expectFile('components/import-capitalize.js').transform(build.transpile); + assertFile.matches(/import capitalize from ["']ember-lodash\/capitalize["']/); + expectFile('node_modules/ember-lodash/capitalize.js').matches(/lodash capitalize/); + }); + test("modules in own namespace don't get renamed", function () { + let assertFile = expectFile('components/import-own-thing.js').transform(build.transpile); + assertFile.matches(/import ownThing from ["']emits-multiple-packages\/own-thing["']/); + expectFile('node_modules/emits-multiple-packages/own-thing.js').matches(/own thing/); + }); + test('modules outside our namespace do get renamed', function () { + let assertFile = expectFile('components/import-somebody-elses.js').transform(build.transpile); + assertFile.matches( + /import environment from ["']emits-multiple-packages\/somebody-elses-package\/environment(\.js)?["']/ + ); + expectFile('node_modules/emits-multiple-packages/somebody-elses-package/environment.js').matches( + /somebody elses environment/ + ); + }); + test('modules outside our namespace do get renamed, with index.js', function () { + let assertFile = expectFile('components/import-somebody-elses-utils.js').transform(build.transpile); + assertFile.matches( + /import environment from ["']emits-multiple-packages\/somebody-elses-package\/utils\/index\.js["']/ + ); + expectFile('node_modules/emits-multiple-packages/somebody-elses-package/utils/index.js').matches( + /somebody elses utils/ + ); + }); + test('modules outside our namespace do get renamed, with index', function () { + let assertFile = expectFile('components/import-somebody-elses-utils-index.js').transform(build.transpile); + assertFile.matches( + /import environment from ["']emits-multiple-packages\/somebody-elses-package\/utils\/index\.js["']/ + ); + }); + test('modules outside our namespace do get renamed, with index with extension', function () { + let assertFile = expectFile('components/import-somebody-elses-utils-index-explicit.js').transform( + build.transpile + ); + assertFile.matches( + /import environment from ["']emits-multiple-packages\/somebody-elses-package\/utils\/index\.js["']/ + ); + }); + test('renamed modules keep their classic runtime name when used as implicit-modules', function () { + let assertFile = expectFile('assets/app-template.js').transform(build.transpile); + assertFile.matches( + definesPattern( + 'somebody-elses-package/environment', + '../node_modules/emits-multiple-packages/somebody-elses-package/environment' + ) + ); + }); + test('rewriting one modules does not capture entire package namespace', function () { + let assertFile = expectFile('components/import-somebody-elses-original.js').transform(build.transpile); + assertFile.matches(/import topLevel from ["']somebody-elses-package["']/); + assertFile.matches(/import deeper from ["']somebody-elses-package\/deeper["']/); + }); + test('single file package gets captured and renamed', function () { + let assertFile = expectFile('components/import-single-file-package.js').transform(build.transpile); + assertFile.matches(/import whatever from ["']emits-multiple-packages\/single-file-package\/index.js['"]/); + expectFile('./node_modules/emits-multiple-packages/single-file-package/index.js').matches( + /single file package/ + ); + }); + test('files copied into app from addons resolve their own original packages', function () { + let assertFile = expectFile('first.js').transform(build.transpile); + assertFile.matches(/export \{ default \} from ['"]\.\/node_modules\/has-app-tree-import['"]/); + + assertFile = expectFile('second.js').transform(build.transpile); + assertFile.matches( + /export \{ default \} from ['"]\.\/node_modules\/intermediate\/node_modules\/has-app-tree-import['"]/ + ); + }); + test(`files copied into app from addons resolve the addon's deps`, function () { + let assertFile = expectFile('imports-dep.js').transform(build.transpile); + assertFile.matches( + /export \{ default \} from ['"]\.\/node_modules\/has-app-tree-import\/node_modules\/inner-dep['"]/ + ); + }); + test(`app-tree files from addons that import from the app get rewritten to relative imports`, function () { + let assertFile = expectFile('mirage/config.js').transform(build.transpile); + assertFile.matches(/import ['"]\.\.\/components\/import-lodash['"]/); + }); + test(`files copied into app from addons can resolve the app's deps`, function () { + let assertFile = expectFile('mirage/config.js').transform(build.transpile); + assertFile.matches(/import ['"]a-library['"]/); + }); + }); + }); diff --git a/tests/scenarios/compat-route-split-test.ts b/tests/scenarios/compat-route-split-test.ts new file mode 100644 index 000000000..035c389ff --- /dev/null +++ b/tests/scenarios/compat-route-split-test.ts @@ -0,0 +1,391 @@ +import { PreparedApp } from 'scenario-tester'; +import { appScenarios, renameApp } from './scenarios'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import QUnit from 'qunit'; +const { module: Qmodule, test } = QUnit; + +import { ExpectFile, expectFilesAt } from '@embroider/test-support'; +import { throwOnWarnings } from '@embroider/core'; +import merge from 'lodash/merge'; +import { Audit, AuditResults } from '@embroider/compat/src/audit'; + +let splitScenarios = appScenarios.map('compat-splitAtRoutes', app => { + renameApp(app, 'my-app'); + merge(app.files, { + 'ember-cli-build.js': ` + 'use strict'; + + const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + const { maybeEmbroider } = require('@embroider/test-setup'); + + module.exports = function (defaults) { + let app = new EmberApp(defaults, {}); + return maybeEmbroider(app, { + staticAddonTrees: true, + staticAddonTestSupportTrees: true, + staticHelpers: true, + staticModifiers: true, + staticComponents: true, + splitAtRoutes: ['people'], + }); + }; + `, + app: { + components: { + 'welcome.hbs': '', + 'all-people.js': 'export default class {}', + 'one-person.hbs': '{{capitalize @person.name}}', + 'unused.hbs': '', + }, + helpers: { + 'capitalize.js': 'export default function(){}', + }, + modifiers: { + 'auto-focus.js': 'export default function(){}', + }, + }, + }); + app.linkDependency('@ember/string', { baseDir: __dirname }); +}); + +splitScenarios + .map('basic', app => { + merge(app.files, { + app: { + templates: { + 'index.hbs': '', + 'people.hbs': '

People

{{outlet}}', + people: { + 'index.hbs': '', + 'show.hbs': '', + 'edit.hbs': '', + }, + }, + controllers: { + 'index.js': '', + 'people.js': '', + people: { + 'show.js': '', + }, + }, + routes: { + 'index.js': '', + 'people.js': '', + people: { + 'show.js': '', + }, + }, + }, + }); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test('has no components in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('all-people'); + expectFile('./assets/my-app.js').doesNotMatch('welcome'); + expectFile('./assets/my-app.js').doesNotMatch('unused'); + }); + + test('has no helpers in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('capitalize'); + }); + + test('has no modifiers in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('auto-focus'); + }); + + test('has non-split controllers in main entrypoint', function () { + expectFile('./assets/my-app.js').matches('controllers/index'); + }); + + test('has non-split route templates in main entrypoint', function () { + expectFile('./assets/my-app.js').matches('templates/index'); + }); + + test('has non-split routes in main entrypoint', function () { + expectFile('./assets/my-app.js').matches('routes/index'); + }); + + test('does not have split controllers in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('controllers/people'); + expectFile('./assets/my-app.js').doesNotMatch('controllers/people/show'); + }); + + test('does not have split route templates in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('templates/people'); + expectFile('./assets/my-app.js').doesNotMatch('templates/people/index'); + expectFile('./assets/my-app.js').doesNotMatch('templates/people/show'); + }); + + test('does not have split routes in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('routes/people'); + expectFile('./assets/my-app.js').doesNotMatch('routes/people/show'); + }); + + test('dynamically imports the route entrypoint from the main entrypoint', function () { + expectFile('./assets/my-app.js').matches('import("./_route_/people.js")'); + }); + + test('has split controllers in route entrypoint', function () { + expectFile('./assets/_route_/people.js').matches('controllers/people'); + expectFile('./assets/_route_/people.js').matches('controllers/people/show'); + }); + + test('has split route templates in route entrypoint', function () { + expectFile('./assets/_route_/people.js').matches('templates/people'); + expectFile('./assets/_route_/people.js').matches('templates/people/index'); + expectFile('./assets/_route_/people.js').matches('templates/people/show'); + }); + + test('has split routes in route entrypoint', function () { + expectFile('./assets/_route_/people.js').matches('routes/people'); + expectFile('./assets/_route_/people.js').matches('routes/people/show'); + }); + + test('has no components in route entrypoint', function () { + expectFile('./assets/_route_/people.js').doesNotMatch('all-people'); + expectFile('./assets/_route_/people.js').doesNotMatch('welcome'); + expectFile('./assets/_route_/people.js').doesNotMatch('unused'); + }); + + test('has no helpers in route entrypoint', function () { + expectFile('./assets/_route_/people.js').doesNotMatch('capitalize'); + }); + + test('has no helpers in route entrypoint', function () { + expectFile('./assets/_route_/people.js').doesNotMatch('auto-focus'); + }); + + Qmodule('audit', function (hooks) { + let auditResults: AuditResults; + hooks.before(async function () { + let audit = new Audit(expectFile.basePath); + auditResults = await audit.run(); + }); + + test('has no issues', function (assert) { + assert.deepEqual(auditResults.findings, []); + }); + + test('helper is consumed only from the template that uses it', function (assert) { + assert.deepEqual(auditResults.modules['./helpers/capitalize.js']?.consumedFrom, [ + './components/one-person.hbs', + ]); + }); + + test('component is consumed only from the template that uses it', function (assert) { + assert.deepEqual(auditResults.modules['./components/one-person.js']?.consumedFrom, [ + './templates/people/show.hbs', + ]); + }); + + test('modifier is consumed only from the template that uses it', function (assert) { + assert.deepEqual(auditResults.modules['./modifiers/auto-focus.js']?.consumedFrom, [ + './templates/people/edit.hbs', + ]); + }); + + test('does not include unused component', function (assert) { + assert.strictEqual(auditResults.modules['./components/unused.hbs'], undefined); + }); + }); + }); + }); + +splitScenarios + .map('pods', app => { + merge(app.files, { + app: { + pods: { + index: { + 'template.hbs': '', + 'controller.js': '', + 'route.js': '', + }, + people: { + 'template.hbs': '

People

{{outlet}}', + 'controller.js': '', + 'route.js': '', + index: { + 'template.hbs': '', + }, + show: { + 'template.hbs': '', + 'controller.js': '', + 'route.js': '', + }, + edit: { + 'template.hbs': '', + 'controller.js': '', + 'route.js': '', + }, + }, + }, + }, + config: { + 'environment.js': ` + module.exports = function(environment) { + let ENV = { + modulePrefix: 'my-app', + podModulePrefix: 'my-app/pods', + environment, + rootURL: '/', + locationType: 'auto', + EmberENV: { + FEATURES: { + }, + EXTEND_PROTOTYPES: { + Date: false + } + }, + APP: {} + }; + return ENV; + };`, + }, + }); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test('has no components in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('all-people'); + expectFile('./assets/my-app.js').doesNotMatch('welcome'); + expectFile('./assets/my-app.js').doesNotMatch('unused'); + }); + + test('has no helpers in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('capitalize'); + }); + + test('has no modifiers in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('auto-focus'); + }); + + test('has non-split controllers in main entrypoint', function () { + expectFile('./assets/my-app.js').matches('pods/index/controller'); + }); + + test('has non-split route templates in main entrypoint', function () { + expectFile('./assets/my-app.js').matches('pods/index/template'); + }); + + test('has non-split routes in main entrypoint', function () { + expectFile('./assets/my-app.js').matches('pods/index/route'); + }); + + test('does not have split controllers in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('pods/people/controller'); + expectFile('./assets/my-app.js').doesNotMatch('pods/people/show/controller'); + }); + + test('does not have split route templates in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('pods/people/template'); + expectFile('./assets/my-app.js').doesNotMatch('pods/people/index/template'); + expectFile('./assets/my-app.js').doesNotMatch('pods/people/show/template'); + }); + + test('does not have split routes in main entrypoint', function () { + expectFile('./assets/my-app.js').doesNotMatch('pods/people/route'); + expectFile('./assets/my-app.js').doesNotMatch('pods/people/show/route'); + }); + + test('dynamically imports the route entrypoint from the main entrypoint', function () { + expectFile('./assets/my-app.js').matches('import("./_route_/people.js")'); + }); + + test('has split controllers in route entrypoint', function () { + expectFile('./assets/_route_/people.js').matches('pods/people/controller'); + expectFile('./assets/_route_/people.js').matches('pods/people/show/controller'); + }); + + test('has split route templates in route entrypoint', function () { + expectFile('./assets/_route_/people.js').matches('pods/people/template'); + expectFile('./assets/_route_/people.js').matches('pods/people/index/template'); + expectFile('./assets/_route_/people.js').matches('pods/people/show/template'); + }); + + test('has split routes in route entrypoint', function () { + expectFile('./assets/_route_/people.js').matches('pods/people/route'); + expectFile('./assets/_route_/people.js').matches('pods/people/show/route'); + }); + + test('has no components in route entrypoint', function () { + expectFile('./assets/_route_/people.js').doesNotMatch('all-people'); + expectFile('./assets/_route_/people.js').doesNotMatch('welcome'); + expectFile('./assets/_route_/people.js').doesNotMatch('unused'); + }); + + test('has no helpers in route entrypoint', function () { + expectFile('./assets/_route_/people.js').doesNotMatch('capitalize'); + }); + + test('has no modifiers in route entrypoint', function () { + expectFile('./assets/_route_/people.js').doesNotMatch('auto-focus'); + }); + + Qmodule('audit', function (hooks) { + let auditResults: AuditResults; + hooks.before(async function () { + let audit = new Audit(expectFile.basePath); + auditResults = await audit.run(); + }); + + test('has no issues', function (assert) { + assert.deepEqual(auditResults.findings, []); + }); + + test('helper is consumed only from the template that uses it', function (assert) { + assert.deepEqual(auditResults.modules['./helpers/capitalize.js']?.consumedFrom, [ + './components/one-person.hbs', + ]); + }); + + test('component is consumed only from the template that uses it', function (assert) { + assert.deepEqual(auditResults.modules['./components/one-person.js']?.consumedFrom, [ + './pods/people/show/template.hbs', + ]); + }); + + test('modifier is consumed only from the template that uses it', function (assert) { + assert.deepEqual(auditResults.modules['./modifiers/auto-focus.js']?.consumedFrom, [ + './pods/people/edit/template.hbs', + ]); + }); + + test('does not include unused component', function (assert) { + assert.strictEqual(auditResults.modules['./components/unused.hbs'], undefined); + }); + }); + }); + }); diff --git a/tests/scenarios/compat-stage2-test.ts b/tests/scenarios/compat-stage2-test.ts new file mode 100644 index 000000000..aefd75636 --- /dev/null +++ b/tests/scenarios/compat-stage2-test.ts @@ -0,0 +1,740 @@ +import { Options } from '@embroider/compat'; +import { writeFileSync, unlinkSync } from 'fs'; +import resolve from 'resolve'; +import { PreparedApp, Project } from 'scenario-tester'; +import { appScenarios, baseAddon, dummyAppScenarios, renameApp } from './scenarios'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { ExpectFile, expectFilesAt, Rebuilder, Transpiler } from '@embroider/test-support'; +import { throwOnWarnings } from '@embroider/core'; +import merge from 'lodash/merge'; +import QUnit from 'qunit'; +const { module: Qmodule, test } = QUnit; + +let stage2Scenarios = appScenarios.map('compat-stage2-build', app => { + renameApp(app, 'my-app'); +}); + +stage2Scenarios + .map('in-repo-addons-of-addons', app => { + let depA = addAddon(app, 'dep-a'); + let depB = addAddon(app, 'dep-b'); + let depC = addAddon(app, 'dep-c'); + + depA.linkDependency('dep-c', { project: depC }); + depB.linkDependency('dep-c', { project: depC }); + + addInRepoAddon(depC, 'in-repo-d', { + app: { service: { 'in-repo.js': 'in-repo-d' } }, + }); + addInRepoAddon(depA, 'in-repo-a', { + app: { service: { 'in-repo.js': 'in-repo-a' } }, + }); + addInRepoAddon(depB, 'in-repo-b', { + app: { service: { 'in-repo.js': 'in-repo-b' } }, + }); + addInRepoAddon(depB, 'in-repo-c', { + app: { service: { 'in-repo.js': 'in-repo-c' } }, + }); + + // make an in-repo addon with a dependency on a secondary in-repo-addon + addInRepoAddon(app, 'primary-in-repo-addon', { + 'package.json': JSON.stringify( + { + name: 'primary-in-repo-addon', + keywords: ['ember-addon'], + 'ember-addon': { + paths: ['../secondary-in-repo-addon'], + }, + }, + null, + 2 + ), + }); + + // critically, this in-repo addon gets removed from the app's actual + // ember-addon.paths, so it's *only* consumed by primary-in-repo-addon. + addInRepoAddon(app, 'secondary-in-repo-addon', { + app: { + services: { + 'secondary.js': '// secondary', + }, + }, + addon: { + components: { + 'secondary.js': '// secondary component', + }, + }, + }); + (app.pkg['ember-addon'] as any).paths = (app.pkg['ember-addon'] as any).paths.filter( + (p: string) => p !== 'lib/secondary-in-repo-addon' + ); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test('in repo addons are symlinked correctly', function () { + // check that package json contains in repo dep + expectFile('./node_modules/dep-a/package.json').json().get('dependencies.in-repo-a').equals('0.0.0'); + expectFile('./node_modules/dep-b/package.json').json().get('dependencies.in-repo-b').equals('0.0.0'); + expectFile('./node_modules/dep-b/package.json').json().get('dependencies.in-repo-c').equals('0.0.0'); + + // check that symlinks are correct + expectFile('./node_modules/dep-a/node_modules/in-repo-a/package.json').exists(); + expectFile('./node_modules/dep-b/node_modules/in-repo-b/package.json').exists(); + expectFile('./node_modules/dep-b/node_modules/in-repo-c/package.json').exists(); + + // check that the in repo addons are correct upgraded + expectFile('./node_modules/dep-a/node_modules/in-repo-a/package.json') + .json() + .get('ember-addon.version') + .equals(2); + expectFile('./node_modules/dep-b/node_modules/in-repo-b/package.json') + .json() + .get('ember-addon.version') + .equals(2); + expectFile('./node_modules/dep-b/node_modules/in-repo-c/package.json') + .json() + .get('ember-addon.version') + .equals(2); + + // check that the app trees with in repo addon are combined correctly + expectFile('./service/in-repo.js').matches(/in-repo-c/); + }); + + test('incorporates in-repo-addons of in-repo-addons correctly', function (assert) { + // secondary in-repo-addon was correctly detected and activated + expectFile('./services/secondary.js').exists(); + + assert.ok( + resolve.sync('secondary-in-repo-addon/components/secondary', { + basedir: join(expectFile.basePath, 'node_modules', 'primary-in-repo-addon'), + }), + 'secondary is resolvable from primary' + ); + }); + }); + }); + +stage2Scenarios + .map('addon-ordering-is-preserved', app => { + // these test attempt to describe the addon ordering behavior from ember-cli that was + // introduced via: https://github.com/ember-cli/ember-cli/commit/098a9b304b551fe235bd42399ce6975af2a1bc48 + + let depB = addAddon(app, 'dep-b'); + let depA = addAddon(app, 'dep-a'); + + merge(depB.files, { + app: { service: { 'addon.js': 'dep-b', 'dep-wins-over-dev.js': 'dep-b', 'in-repo-over-deps.js': 'dep-b' } }, + }); + merge(depA.files, { app: { service: { 'addon.js': 'dep-a' } } }); + + addInRepoAddon(app, 'in-repo-a', { + app: { service: { 'in-repo.js': 'in-repo-a', 'in-repo-over-deps.js': 'in-repo-a' } }, + }); + addInRepoAddon(app, 'in-repo-b', { app: { service: { 'in-repo.js': 'in-repo-b' } } }); + + let devA = addDevAddon(app, 'dev-a'); + let devB = addDevAddon(app, 'dev-b'); + let devC = addDevAddon(app, 'dev-c'); + let devD = addDevAddon(app, 'dev-d'); + let devE = addDevAddon(app, 'dev-e'); + let devF = addDevAddon(app, 'dev-f'); + + (devB.pkg['ember-addon'] as any).after = 'dev-e'; + (devF.pkg['ember-addon'] as any).before = 'dev-d'; + + merge(devA.files, { app: { service: { 'dev-addon.js': 'dev-a', 'dep-wins-over-dev.js': 'dev-a' } } }); + merge(devB.files, { app: { service: { 'test-after.js': 'dev-b' } } }); + merge(devC.files, { app: { service: { 'dev-addon.js': 'dev-c' } } }); + merge(devD.files, { app: { service: { 'test-before.js': 'dev-d' } } }); + merge(devE.files, { app: { service: { 'test-after.js': 'dev-e' } } }); + merge(devF.files, { app: { service: { 'test-before.js': 'dev-f' } } }); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test('verifies that the correct lexigraphically sorted addons win', function () { + expectFile('./service/in-repo.js').matches(/in-repo-b/); + expectFile('./service/addon.js').matches(/dep-b/); + expectFile('./service/dev-addon.js').matches(/dev-c/); + }); + + test('addons declared as dependencies should win over devDependencies', function () { + expectFile('./service/dep-wins-over-dev.js').matches(/dep-b/); + }); + + test('in repo addons declared win over dependencies', function () { + expectFile('./service/in-repo-over-deps.js').matches(/in-repo-a/); + }); + + test('ordering with before specified', function () { + expectFile('./service/test-before.js').matches(/dev-d/); + }); + + test('ordering with after specified', function () { + expectFile('./service/test-after.js').matches(/dev-b/); + }); + }); + }); + +stage2Scenarios + .map('static-with-rules', app => { + app.addDependency('some-library', '1.0.0'); + app.linkDependency('@embroider/sample-transforms', { baseDir: __dirname }); + + let options: Options = { + staticComponents: true, + staticHelpers: true, + skipBabel: [ + { + package: 'babel-filter-test1', + }, + { + package: 'babel-filter-test2', + semverRange: '^4.0.0', + }, + { + package: 'babel-filter-test3', + semverRange: '^2.0.0', + }, + ], + staticAppPaths: ['static-dir', 'top-level-static.js'], + packageRules: [ + { + package: 'my-addon', + components: { + '{{hello-world}}': { + acceptsComponentArguments: [ + { + name: 'useDynamic', + becomes: 'dynamicComponentName', + }, + ], + layout: { + addonPath: 'templates/components/hello-world.hbs', + }, + }, + }, + addonModules: { + 'components/hello-world.js': { + dependsOnModules: ['../synthetic-import-1'], + dependsOnComponents: ['{{second-choice}}'], + }, + }, + appModules: { + 'components/hello-world.js': { + dependsOnModules: ['my-addon/synthetic-import-1'], + }, + }, + }, + ], + }; + + merge(app.files, { + 'ember-cli-build.js': ` + 'use strict'; + const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + const { maybeEmbroider } = require('@embroider/test-setup'); + let opts = ${JSON.stringify(options)}; + module.exports = function (defaults) { + let app = new EmberApp(defaults, { + babel: { + plugins: [require.resolve('ember-auto-import/babel-plugin')] + } + }); + return maybeEmbroider(app, { + skipBabel: [ + { + package: 'qunit', + }, + ], + ...opts + }); + }; + `, + app: { + templates: { + 'index.hbs': ` + + + + `, + 'curly.hbs': ` + {{hello-world useDynamic="first-choice" }} + {{hello-world useDynamic=(component "third-choice") }} + `, + components: { + 'first-choice.hbs': 'first', + 'second-choice.hbs': 'second', + 'third-choice.hbs': 'third', + 'module-name-check': { + 'index.hbs': '
hello world
', + }, + }, + }, + components: { + 'uses-inline-template.js': ` + import hbs from "htmlbars-inline-precompile"; + export default Component.extend({ + layout: hbs${'`'}{{first-choice}}${'`'} + }) + `, + }, + 'use-deep-addon.js': `import thing from 'deep-addon'`, + 'custom-babel-needed.js': `console.log('embroider-sample-transforms-target');`, + 'does-dynamic-import.js': ` + export default function() { + return import('some-library'); + } + `, + helpers: { + 'embroider-sample-transforms-module.js': 'export default function() {}', + }, + 'static-dir': { + 'my-library.js': '', + }, + 'static-dir-not-really': { + 'something.js': '', + }, + 'non-static-dir': { + 'another-library.js': '', + }, + 'top-level-static.js': '', + }, + public: { + 'public-file-1.txt': `initial state`, + }, + }); + + let addon = addAddon(app, 'my-addon'); + merge(addon.files, { + addon: { + components: { + 'hello-world.js': ` + import Component from '@ember/component'; + import layout from '../templates/components/hello-world'; + import computed from '@ember/object/computed'; + import somethingExternal from 'not-a-resolvable-package'; + export default Component.extend({ + dynamicComponentName: computed('useDynamic', function() { + return this.useDynamic || 'default-dynamic'; + }), + layout + }); + `, + 'has-relative-template.js': ` + import Component from '@ember/component'; + import layout from './t'; + export default Component.extend({ + layout + }); + `, + 't.hbs': ``, + 'uses-amd-require.js': ` + export default function() { + require('some-package'); + } + `, + }, + 'synthetic-import-1.js': '', + templates: { + components: { + 'hello-world.hbs': ` + {{component dynamicComponentName}} + `, + }, + }, + }, + app: { + components: { + 'hello-world.js': `export { default } from 'my-addon/components/hello-world'`, + }, + templates: { + components: { + 'direct-template-reexport.js': `export { default } from 'my-addon/templates/components/hello-world';`, + }, + }, + }, + public: { + 'package.json': JSON.stringify({ customStuff: { fromMyAddon: true }, name: 'should-be-overridden' }), + }, + }); + + let deepAddon = addAddon(addon, 'deep-addon'); + merge(deepAddon.files, { + addon: { + 'index.js': '// deep-addon index', + }, + }); + + app.addDependency('babel-filter-test1', '1.2.3').files = { + 'index.js': '', + }; + + app.addDependency('babel-filter-test2', '4.5.6').files = { + 'index.js': '', + }; + + app.addDependency('babel-filter-test3', '1.0.0').files = { + 'index.js': '', + }; + + app.addDependency('babel-filter-test4', '1.0.0').files = { + 'index.js': ` + module.exports = function() { + return require('some-package'); + } + `, + }; + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + let build: Transpiler; + let builder: Rebuilder; + + hooks.before(async () => { + app = await scenario.prepare(); + builder = await Rebuilder.create(app.dir, { STAGE2_ONLY: 'true' }); + }); + + hooks.after(async () => { + await builder?.shutdown(); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(builder.outputPath, '.stage2-output'), 'utf8'), { + qunit: assert, + }); + build = new Transpiler(expectFile.basePath); + }); + + test('index.hbs', function () { + let assertFile = expectFile('templates/index.hbs').transform(build.transpile); + assertFile.matches(/import \w+ from ["']..\/components\/hello-world\.js["']/, 'explicit dependency'); + assertFile.matches( + /import \w+ from ["'].\/components\/third-choice\.hbs["']/, + 'static component helper dependency' + ); + assertFile.matches(/import \w+ from ["'].\/components\/first-choice\.hbs["']/, 'rule-driven string attribute'); + assertFile.matches( + /import \w+ from ["'].\/components\/second-choice\.hbs["']/, + 'rule-driven mustache string literal' + ); + }); + + test('curly.hbs', function () { + let assertFile = expectFile('templates/curly.hbs').transform(build.transpile); + assertFile.matches(/import \w+ from ["']..\/components\/hello-world\.js["']/, 'explicit dependency'); + assertFile.matches( + /import \w+ from ["'].\/components\/third-choice\.hbs["']/, + 'static component helper dependency' + ); + assertFile.matches(/import \w+ from ["'].\/components\/first-choice\.hbs["']/, 'rule-driven string attribute'); + }); + + test('hello-world.hbs', function () { + // the point of this test is to ensure that we can transpile with no + // warning about the dynamicComponentName. + let assertFile = expectFile('node_modules/my-addon/templates/components/hello-world.hbs').transform( + build.transpile + ); + + // this is a pretty trivial test, but it's needed to force the + // transpilation to happen because transform() is lazy. + assertFile.matches(/dynamicComponentName/); + }); + + test('addon/hello-world.js', function () { + let assertFile = expectFile('node_modules/my-addon/components/hello-world.js').transform(build.transpile); + assertFile.matches( + /window\.define\(["']\my-addon\/synthetic-import-1["'],\s*function\s\(\)\s*\{\s*return\s+esc\(require\(["']\.\.\/synthetic-import-1/ + ); + assertFile.matches( + /window\.define\(["']my-app\/templates\/components\/second-choice["'],\s*function\s\(\)\s*\{\s*return\s+esc\(require\(["']\.\.\/\.\.\/\.\.\/templates\/components\/second-choice\.hbs["']/ + ); + assertFile.matches( + /import somethingExternal from ["'].*\/externals\/not-a-resolvable-package["']/, + 'externals are handled correctly' + ); + }); + + test('app/hello-world.js', function () { + let assertFile = expectFile('./components/hello-world.js').transform(build.transpile); + assertFile.matches( + /window\.define\(["']\my-addon\/synthetic-import-1["'],\s*function\s\(\)\s*\{\s*return\s+esc\(require\(["']\.\.\/node_modules\/my-addon\/synthetic-import-1/ + ); + assertFile.matches( + /export \{ default \} from ['"]\.\.\/node_modules\/my-addon\/components\/hello-world['"]/, + 'remapped to precise copy of my-addon' + ); + }); + + test('app/templates/components/direct-template-reexport.js', function () { + let assertFile = expectFile('./templates/components/direct-template-reexport.js').transform(build.transpile); + assertFile.matches( + /export \{ default \} from ['"]\.\.\/\.\.\/node_modules\/my-addon\/templates\/components\/hello-world['"]/, + 'rewrites reexports of templates' + ); + }); + + test('uses-inline-template.js', function () { + let assertFile = expectFile('./components/uses-inline-template.js').transform(build.transpile); + assertFile.matches(/import a\d? from ["']\.\.\/templates\/components\/first-choice.hbs/); + assertFile.matches(/window\.define\(["']\my-app\/templates\/components\/first-choice["']/); + }); + + test('component with relative import of arbitrarily placed template', function () { + let assertFile = expectFile('node_modules/my-addon/components/has-relative-template.js').transform( + build.transpile + ); + assertFile.matches(/import layout from ["']\.\/t['"]/, 'arbitrary relative template remains the same'); + }); + + test('app can import a deep addon', function () { + let assertFile = expectFile('use-deep-addon.js').transform(build.transpile); + assertFile.matches(/import thing from ["']\.\/node_modules\/my-addon\/node_modules\/deep-addon['"]/); + }); + + test('amd require in an addon gets rewritten to window.require', function () { + let assertFile = expectFile('node_modules/my-addon/components/uses-amd-require.js').transform(build.transpile); + assertFile.matches(/window\.require\(['"]some-package['"]\)/, 'should find window.require'); + }); + + test('cjs require in non-ember package does not get rewritten to window.require', function () { + let assertFile = expectFile('node_modules/babel-filter-test4/index.js').transform(build.transpile); + assertFile.matches(/return require\(['"]some-package['"]\)/, 'should find plain cjs require'); + }); + + test('transpilation runs for ember addons', async function (assert) { + assert.ok(build.shouldTranspile('node_modules/my-addon/components/has-relative-template.js')); + }); + + test('transpilation is skipped when package matches skipBabel', async function (assert) { + assert.ok(!build.shouldTranspile('node_modules/babel-filter-test1/index.js')); + }); + + test('transpilation is skipped when package and version match skipBabel', async function (assert) { + assert.ok(!build.shouldTranspile('node_modules/babel-filter-test2/index.js')); + }); + + test('transpilation runs when package version does not match skipBabel', async function (assert) { + assert.ok(build.shouldTranspile('node_modules/babel-filter-test3/index.js')); + }); + + test('transpilation runs for non-ember package that is not explicitly skipped', async function (assert) { + assert.ok(build.shouldTranspile('node_modules/babel-filter-test4/index.js')); + }); + + test(`app's babel plugins ran`, async function () { + let assertFile = expectFile('custom-babel-needed.js').transform(build.transpile); + assertFile.matches(/console\.log\(['"]embroider-sample-transforms-result['"]\)/); + }); + + test(`changes in app.css are propagated at rebuild`, async function () { + expectFile('assets/my-app.css').doesNotMatch('newly-added-class'); + writeFileSync(join(app.dir, 'app/styles/app.css'), `.newly-added-class { color: red }`); + await builder.build({ changedDirs: [join(app.dir, 'app/styles')] }); + expectFile('assets/my-app.css').matches('newly-added-class'); + }); + + test(`public assets are included`, async function () { + expectFile('public-file-1.txt').matches(/initial state/); + expectFile('package.json').json().get('ember-addon.assets').includes('public-file-1.txt'); + }); + + test(`updated public asset`, async function () { + writeFileSync(join(app.dir, 'public/public-file-1.txt'), `updated state`); + await builder.build({ changedDirs: [join(app.dir, 'app')] }); + + expectFile('public-file-1.txt').matches(/updated state/); + }); + + test(`added public asset`, async function () { + writeFileSync(join(app.dir, 'public/public-file-2.txt'), `added`); + await builder.build({ changedDirs: [join(app.dir, 'app')] }); + expectFile('public-file-2.txt').matches(/added/); + expectFile('package.json').json().get('ember-addon.assets').includes('public-file-2.txt'); + }); + + test(`removed public asset`, async function () { + unlinkSync(join(app.dir, 'public/public-file-1.txt')); + await builder.build({ changedDirs: [join(app.dir, 'app')] }); + expectFile('public-file-1.txt').doesNotExist(); + expectFile('package.json').json().get('ember-addon.assets').doesNotInclude('public-file-1.txt'); + }); + + test('dynamic import is preserved', function () { + expectFile('./does-dynamic-import.js') + .transform(build.transpile) + .matches(/return import\(['"]some-library['"]\)/); + }); + + test('hbs transform sees expected module name', function () { + let assertFile = expectFile('templates/components/module-name-check/index.hbs').transform(build.transpile); + assertFile.matches( + '"my-app/templates/components/module-name-check/index.hbs"', + 'our sample transform injected the expected moduleName into the compiled template' + ); + }); + + test('non-static other paths are included in the entrypoint', function () { + expectFile('assets/my-app.js').matches(/i\("..\/non-static-dir\/another-library\.js"\)/); + }); + + test('static other paths are not included in the entrypoint', function () { + expectFile('assets/my-app.js').doesNotMatch(/i\("..\/static-dir\/my-library\.js"\)/); + }); + + test('top-level static other paths are not included in the entrypoint', function () { + expectFile('assets/my-app.js').doesNotMatch(/i\("..\/top-level-static\.js"\)/); + }); + + test('staticAppPaths do not match partial path segments', function () { + expectFile('assets/my-app.js').matches(/i\("..\/static-dir-not-really\/something\.js"\)/); + }); + }); + }); + +dummyAppScenarios + .map('compat-stage2-addon-dummy-app', app => { + renameApp(app, 'my-addon'); + app.linkDependency('@embroider/core', { baseDir: __dirname }); + app.linkDependency('@embroider/compat', { baseDir: __dirname }); + app.linkDependency('@embroider/webpack', { baseDir: __dirname }); + + merge(app.files, { + addon: { + components: { + 'hello-world.js': ` + import { isDevelopingThisPackage } from '@embroider/macros'; + console.log(isDevelopingThisPackage());`, + }, + }, + tests: { + dummy: { + app: { + components: { + 'inside-dummy-app.js': ` + import { isDevelopingThisPackage } from '@embroider/macros'; + console.log(isDevelopingThisPackage());`, + }, + }, + }, + }, + }); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + let build: Transpiler; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + build = new Transpiler(expectFile.basePath); + }); + + test('dummy app sees that its being developed', function () { + let assertFile = expectFile('components/inside-dummy-app.js').transform(build.transpile); + assertFile.matches(/console\.log\(true\)/); + }); + + test('addon within dummy app sees that its being developed', function () { + let assertFile = expectFile( + resolve.sync('my-addon/components/hello-world', { + basedir: expectFile.basePath, + }) + ).transform(build.transpile); + assertFile.matches(/console\.log\(true\)/); + }); + }); + }); + +function addAddon(app: Project, name: string) { + let addon = baseAddon(); + addon.pkg.name = name; + app.addDependency(addon); + return addon; +} + +function addDevAddon(app: Project, name: string) { + let addon = baseAddon(); + addon.pkg.name = name; + app.addDevDependency(addon); + return addon; +} + +function addInRepoAddon(app: Project, name: string, additionalFiles?: {}) { + if (!app.pkg['ember-addon']) { + app.pkg['ember-addon'] = {}; + } + + let pkg = app.pkg as any; + + if (!pkg['ember-addon'].paths) { + pkg['ember-addon'].paths = []; + } + + pkg['ember-addon'].paths.push(`lib/${name}`); + + merge(app.files, { + lib: { + [name]: { + 'package.json': JSON.stringify( + { + name, + version: '0.0.0', + keywords: ['ember-addon'], + }, + null, + 2 + ), + 'index.js': `module.exports = { + name: require('./package').name, + };`, + ...additionalFiles, + }, + }, + }); +} diff --git a/tests/scenarios/compat-template-colocation-test.ts b/tests/scenarios/compat-template-colocation-test.ts new file mode 100644 index 000000000..cbc3d4e4b --- /dev/null +++ b/tests/scenarios/compat-template-colocation-test.ts @@ -0,0 +1,295 @@ +import { PreparedApp } from 'scenario-tester'; +import { appScenarios, baseAddon, renameApp } from './scenarios'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { ExpectFile, expectFilesAt, Transpiler } from '@embroider/test-support'; +import { throwOnWarnings } from '@embroider/core'; +import merge from 'lodash/merge'; +import QUnit from 'qunit'; +const { module: Qmodule, test } = QUnit; + +let scenarios = appScenarios.map('compat-template-colocation', app => { + renameApp(app, 'my-app'); + merge(app.files, { + config: { + 'targets.js': `module.exports = { browsers: ['last 1 Chrome versions'] }`, + }, + app: { + templates: { + 'index.hbs': ` + + + `, + }, + components: { + 'has-colocated-template.js': ` + import Component from '@glimmer/component'; + export default class extends Component {} + `, + 'has-colocated-template.hbs': `
{{this.title}}
`, + 'template-only-component.hbs': `
I am template only
`, + }, + }, + }); + + let addon = baseAddon(); + addon.pkg.name = 'my-addon'; + app.addDevDependency(addon); + merge(addon.files, { + app: { + components: { + 'component-one.js': `export { default } from 'my-addon/components/component-one';`, + }, + }, + addon: { + components: { + 'component-one.js': ` + import Component from '@glimmer/component'; + export default class extends Component {} + `, + 'component-one.hbs': `component one template`, + 'component-two.hbs': `component two templates`, + }, + }, + }); +}); + +scenarios + .map('staticComponent-false', app => { + merge(app.files, { + 'ember-cli-build.js': ` + 'use strict'; + const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + const { maybeEmbroider } = require('@embroider/test-setup'); + module.exports = function (defaults) { + let app = new EmberApp(defaults, {}); + return maybeEmbroider(app, { + staticComponents: false, + }); + }; + `, + }); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + let build: Transpiler; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + build = new Transpiler(expectFile.basePath); + }); + + test(`app's colocated template is associated with JS`, function () { + let assertFile = expectFile('components/has-colocated-template.js').transform(build.transpile); + assertFile.matches(/import TEMPLATE from ['"]\.\/has-colocated-template.hbs['"];/, 'imported template'); + assertFile.matches(/import \{ setComponentTemplate \}/, 'found setComponentTemplate'); + + assertFile.matches( + /export default setComponentTemplate\(TEMPLATE, class extends Component \{\}/, + 'default export is wrapped' + ); + }); + + test(`app's template-only component JS is synthesized`, function () { + let assertFile = expectFile('components/template-only-component.js').transform(build.transpile); + assertFile.matches(/import TEMPLATE from ['"]\.\/template-only-component.hbs['"];/, 'imported template'); + assertFile.matches(/import \{ setComponentTemplate \}/, 'found setComponentTemplate'); + assertFile.matches(/import templateOnlyComponent/, 'found templateOnlyComponent'); + + assertFile.matches( + /export default setComponentTemplate\(TEMPLATE, templateOnlyComponent\(\)\)/, + 'default export is wrapped' + ); + }); + + test(`app's colocated components are implicitly included correctly`, function () { + let assertFile = expectFile('assets/my-app.js'); + assertFile.matches( + /d\(["']my-app\/components\/has-colocated-template["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/has-colocated-template\.js['"]\);\s*\}/ + ); + assertFile.matches( + /d\(["']my-app\/components\/template-only-component["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/template-only-component\.js['"]\);\s*\}/ + ); + }); + + test(`addon's colocated template is associated with JS`, function () { + let assertFile = expectFile('node_modules/my-addon/components/component-one.js').transform(build.transpile); + assertFile.matches(/import TEMPLATE from ['"]\.\/component-one.hbs['"];/, 'imported template'); + assertFile.matches(/import \{ setComponentTemplate \}/, 'found setComponentTemplate'); + assertFile.matches( + /export default setComponentTemplate\(TEMPLATE, class extends Component \{\}/, + 'default export is wrapped' + ); + }); + + test(`addon's template-only component JS is synthesized`, function () { + let assertFile = expectFile('node_modules/my-addon/components/component-two.js').transform(build.transpile); + assertFile.matches(/import TEMPLATE from ['"]\.\/component-two.hbs['"];/, 'imported template'); + assertFile.matches(/import \{ setComponentTemplate \}/, 'found setComponentTemplate'); + assertFile.matches(/import templateOnlyComponent/, 'found templateOnlyComponent'); + assertFile.matches( + /export default setComponentTemplate\(TEMPLATE, templateOnlyComponent\(\)\)/, + 'default export is wrapped' + ); + }); + + test(`addon's colocated components are correct in implicit-modules`, function () { + let assertFile = expectFile('node_modules/my-addon/package.json').json(); + assertFile.get(['ember-addon', 'implicit-modules']).includes('./components/component-one'); + assertFile.get(['ember-addon', 'implicit-modules']).includes('./components/component-two'); + assertFile.get(['ember-addon', 'implicit-modules']).doesNotInclude('./components/component-one.hbs'); + assertFile.get(['ember-addon', 'implicit-modules']).doesNotInclude('./components/component-two.hbs'); + }); + }); + }); + +scenarios + .map('staticComponents-true', app => { + merge(app.files, { + 'ember-cli-build.js': ` + 'use strict'; + const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + const { maybeEmbroider } = require('@embroider/test-setup'); + module.exports = function (defaults) { + let app = new EmberApp(defaults, {}); + return maybeEmbroider(app, { + staticComponents: true, + staticAddonTrees: true, + }); + }; + `, + }); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test(`app's colocated components are not implicitly included`, function () { + let assertFile = expectFile('assets/my-app.js'); + assertFile.doesNotMatch( + /d\(["']my-app\/components\/has-colocated-template["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/has-colocated-template['"]\);\s*\}/ + ); + assertFile.doesNotMatch( + /d\(["']my-app\/components\/template-only-component["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/template-only-component['"]\);\s*\}/ + ); + }); + + test(`addon's colocated components are not in implicit-modules`, function () { + let assertFile = expectFile('node_modules/my-addon/package.json').json(); + assertFile.get(['ember-addon', 'implicit-modules']).equals(undefined); + }); + }); + }); + +appScenarios + .map('compat-template-colocation-pods', app => { + renameApp(app, 'my-app'); + merge(app.files, { + 'ember-cli-build.js': ` + 'use strict'; + const EmberApp = require('ember-cli/lib/broccoli/ember-app'); + const { maybeEmbroider } = require('@embroider/test-setup'); + module.exports = function (defaults) { + let app = new EmberApp(defaults, {}); + return maybeEmbroider(app, { + staticComponents: false, + }); + }; + `, + + config: { + 'environment.js': `module.exports = function(environment) { + let ENV = { + modulePrefix: 'my-app', + podModulePrefix: '', + environment, + rootURL: '/', + locationType: 'auto', + EmberENV: { + FEATURES: { + }, + EXTEND_PROTOTYPES: { + Date: false + } + }, + APP: {} + }; + return ENV; + };`, + }, + app: { + templates: { + 'index.hbs': ` + + + `, + }, + components: { + 'pod-component': { + 'component.js': ` + import Component from '@glimmer/component'; + export default class extends Component {} + `, + 'template.hbs': `
{{this.title}}
`, + }, + 'template-only': { + 'template.hbs': `
I am template only
`, + }, + }, + }, + }); + }) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + throwOnWarnings(hooks); + + let app: PreparedApp; + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('ember build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test(`app's pod components and templates are implicitly included correctly`, function () { + let assertFile = expectFile('assets/my-app.js'); + assertFile.matches( + /d\(["']my-app\/components\/pod-component\/component["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/pod-component\/component\.js['"]\);\}\)/ + ); + assertFile.matches( + /d\(["']my-app\/components\/pod-component\/template["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/pod-component\/template\.hbs['"]\);\}\)/ + ); + assertFile.matches( + /d\(["']my-app\/components\/template-only\/template["'], function\(\)\s*\{\s*return i\(["']\.\.\/components\/template-only\/template\.hbs['"]\);\s*\}/ + ); + }); + }); + }); diff --git a/tests/scenarios/engines-test.ts b/tests/scenarios/engines-test.ts index 1d08007fc..f1942bac4 100644 --- a/tests/scenarios/engines-test.ts +++ b/tests/scenarios/engines-test.ts @@ -3,7 +3,10 @@ import { PreparedApp, Project } from 'scenario-tester'; import QUnit from 'qunit'; import merge from 'lodash/merge'; import { setupFastboot, loadFromFixtureData } from './helpers'; -import { dirname } from 'path'; +import { ExpectFile, expectFilesAt } from '@embroider/test-support'; +import { dirname, join } from 'path'; +import { readFileSync } from 'fs'; + const { module: Qmodule, test } = QUnit; // Both ember-engines and its dependency ember-asset-loader have undeclared @@ -30,8 +33,8 @@ function emberEngines(): Project { return engines; } -appScenarios - .skip('release') // ember-engines doesn't have an ember 4.0 compatible release yet. +let engineScenarios = appScenarios + .only('lts_3_28') // ember-engines doesn't have an ember 4.0 compatible release yet. .map('engines', project => { let eagerEngine = baseAddon(); let lazyEngine = baseAddon(); @@ -74,13 +77,50 @@ appScenarios let engineTestFiles = loadFromFixtureData('engines-host-app'); merge(project.files, engineTestFiles); - }) - .expand({ - 'with-fastboot': project => { - project.linkDependency('ember-cli-fastboot', { baseDir: __dirname }); - project.linkDependency('fastboot', { baseDir: __dirname }); - }, - 'without-fastboot': () => {}, + }); + +engineScenarios + .map('without-fastboot', () => {}) + .forEachScenario(scenario => { + Qmodule(scenario.name, function (hooks) { + let app: PreparedApp; + let expectFile: ExpectFile; + + hooks.before(async assert => { + app = await scenario.prepare(); + let result = await app.execute('yarn run build', { env: { STAGE2_ONLY: 'true' } }); + assert.equal(result.exitCode, 0, result.output); + }); + + hooks.beforeEach(assert => { + expectFile = expectFilesAt(readFileSync(join(app.dir, 'dist/.stage2-output'), 'utf8'), { qunit: assert }); + }); + + test(`yarn test`, async function (assert) { + let result = await app.execute('yarn test'); + assert.equal(result.exitCode, 0, result.output); + }); + + test('lazy engines appear in _embroiderEngineBundles_', function () { + expectFile('assets/app-template.js').matches(/import\("\.\/_engine_\/lazy-engine\.js"\)/); + }); + + test('lazy engine css is imported', function () { + expectFile('assets/_engine_/lazy-engine.js').matches( + /i\("\.\.\/\.\.\/node_modules\/lazy-engine\/lazy-engine\.css"\)/ + ); + }); + + test('eager engine css is merged with vendor.css', function () { + expectFile('assets/vendor.css').matches(`.eager { background-color: blue; }`); + }); + }); + }); + +engineScenarios + .map('with-fastboot', app => { + app.linkDependency('ember-cli-fastboot', { baseDir: __dirname }); + app.linkDependency('fastboot', { baseDir: __dirname }); }) .forEachScenario(scenario => { Qmodule(scenario.name, function (hooks) { @@ -94,37 +134,27 @@ appScenarios assert.equal(result.exitCode, 0, result.output); }); - if (/with-fastboot/.test(scenario.name)) { - Qmodule(`fastboot`, function (hooks) { - let visit: any; - - hooks.before(async () => { - ({ visit } = await setupFastboot(app)); - }); - - test('host-app', async function (assert) { - let doc = (await visit('/')).window.document; - assert.equal( - doc.querySelector('[data-test-duplicated-helper]').textContent.trim(), - 'from-engines-host-app' - ); - }); - - test('lazy-engine', async function (assert) { - let doc = (await visit('/use-lazy-engine')).window.document; - assert.equal(doc.querySelector('[data-test-lazy-engine-main] > h1').textContent.trim(), 'Lazy engine'); - assert.equal(doc.querySelector('[data-test-duplicated-helper]').textContent.trim(), 'from-lazy-engine'); - }); - - test('eager-engine', async function (assert) { - let doc = (await visit('/use-eager-engine')).window.document; - assert.equal(doc.querySelector('[data-test-eager-engine-main] > h1').textContent.trim(), 'Eager engine'); - assert.equal( - doc.querySelector('[data-test-duplicated-helper]').textContent.trim(), - 'from-eager-engine-helper' - ); - }); - }); - } + let visit: any; + + hooks.before(async () => { + ({ visit } = await setupFastboot(app)); + }); + + test('host-app', async function (assert) { + let doc = (await visit('/')).window.document; + assert.equal(doc.querySelector('[data-test-duplicated-helper]').textContent.trim(), 'from-engines-host-app'); + }); + + test('lazy-engine', async function (assert) { + let doc = (await visit('/use-lazy-engine')).window.document; + assert.equal(doc.querySelector('[data-test-lazy-engine-main] > h1').textContent.trim(), 'Lazy engine'); + assert.equal(doc.querySelector('[data-test-duplicated-helper]').textContent.trim(), 'from-lazy-engine'); + }); + + test('eager-engine', async function (assert) { + let doc = (await visit('/use-eager-engine')).window.document; + assert.equal(doc.querySelector('[data-test-eager-engine-main] > h1').textContent.trim(), 'Eager engine'); + assert.equal(doc.querySelector('[data-test-duplicated-helper]').textContent.trim(), 'from-eager-engine-helper'); + }); }); }); diff --git a/tests/scenarios/glimmer-tracking-test.ts b/tests/scenarios/glimmer-tracking-test.ts index 35fd34b4b..2c81e5226 100644 --- a/tests/scenarios/glimmer-tracking-test.ts +++ b/tests/scenarios/glimmer-tracking-test.ts @@ -6,7 +6,7 @@ const { module: Qmodule, test } = QUnit; appScenarios .only('release') - .map('transform @glimmer/tracking', project => { + .map('transform-@glimmer/tracking', project => { merge(project.files, { app: { components: { diff --git a/tests/scenarios/package.json b/tests/scenarios/package.json index 023d47d44..a5c00884f 100644 --- a/tests/scenarios/package.json +++ b/tests/scenarios/package.json @@ -2,6 +2,8 @@ "name": "@embroider/test-scenarios", "version": "0.0.0", "dependencies": { + "@embroider/core": "1.9.0", + "@embroider/compat": "1.9.0", "@embroider/shared-internals": "1.8.3", "@embroider/test-support": "0.36.0", "@types/qunit": "^2.11.1", @@ -31,21 +33,21 @@ "@babel/plugin-transform-runtime": "^7.18.6", "@babel/preset-env": "^7.16.11", "@babel/preset-typescript": "^7.18.6", - "@ember/string": "^1.0.0", "@embroider/macros": "1.9.0", "@embroider/addon-shim": "1.8.3", "@embroider/router": "1.9.0", "@embroider/util": "1.9.0", + "@ember/string": "^3.0.0", "@rollup/plugin-babel": "^5.3.1", "@tsconfig/ember": "1.0.1", "bootstrap": "^4.3.1", "broccoli-funnel": "^3.0.5", "broccoli-merge-trees": "^3.0.2", "broccoli-persistent-filter": "^3.1.2", + "broccoli-stew": "^3.0.0", "ember-bootstrap": "^5.0.0", "ember-cli": "~3.28.0", - "ember-cli-3.16": "npm:ember-cli@~3.16.0", - "ember-cli-3.24": "npm:ember-cli@~3.24.0", + "ember-cli-4.4": "npm:ember-cli@~4.4.0", "ember-cli-beta": "npm:ember-cli@beta", "ember-cli-fastboot": "^3.2.0", "ember-cli-htmlbars-3": "npm:ember-cli-htmlbars@3", @@ -54,14 +56,12 @@ "ember-cli-latest": "npm:ember-cli@latest", "ember-composable-helpers": "^4.4.1", "ember-data": "~3.28.0", - "ember-data-3.16": "npm:ember-data@~3.16.0", - "ember-data-3.24": "npm:ember-data@~3.24.0", + "ember-data-4.4": "npm:ember-data@~4.4.0", "ember-data-latest": "npm:ember-data@4.4.1", "ember-engines": "^0.8.17", "ember-inline-svg": "^0.2.1", "ember-source": "~3.28.0", - "ember-source-3.16": "npm:ember-source@~3.16.0", - "ember-source-3.24": "npm:ember-source@~3.24.0", + "ember-source-4.4": "npm:ember-source@~4.4.0", "ember-source-beta": "npm:ember-source@beta", "ember-source-latest": "npm:ember-source@latest", "ember-truth-helpers": "^3.0.0", diff --git a/tests/scenarios/scenarios.ts b/tests/scenarios/scenarios.ts index 4725831a4..40269d186 100644 --- a/tests/scenarios/scenarios.ts +++ b/tests/scenarios/scenarios.ts @@ -1,30 +1,18 @@ import { Scenarios, Project } from 'scenario-tester'; import { dirname } from 'path'; -async function lts_3_16(project: Project) { - project.linkDevDependency('ember-source', { baseDir: __dirname, resolveName: 'ember-source-3.16' }); - project.linkDevDependency('ember-cli', { baseDir: __dirname, resolveName: 'ember-cli-3.16' }); - project.linkDevDependency('ember-data', { baseDir: __dirname, resolveName: 'ember-data-3.16' }); - - // needed because the ember-inflector used by this ember-data version blows up without it - project.linkDevDependency('@ember/string', { baseDir: __dirname }); -} - -async function lts_3_24(project: Project) { - project.linkDevDependency('ember-source', { baseDir: __dirname, resolveName: 'ember-source-3.24' }); - project.linkDevDependency('ember-cli', { baseDir: __dirname, resolveName: 'ember-cli-3.24' }); - project.linkDevDependency('ember-data', { baseDir: __dirname, resolveName: 'ember-data-3.24' }); - - // needed because the ember-inflector used by this ember-data version blows up without it - project.linkDevDependency('@ember/string', { baseDir: __dirname }); -} - async function lts_3_28(project: Project) { project.linkDevDependency('ember-source', { baseDir: __dirname, resolveName: 'ember-source' }); project.linkDevDependency('ember-cli', { baseDir: __dirname, resolveName: 'ember-cli' }); project.linkDevDependency('ember-data', { baseDir: __dirname, resolveName: 'ember-data' }); } +async function lts_4_4(project: Project) { + project.linkDevDependency('ember-source', { baseDir: __dirname, resolveName: 'ember-source-4.4' }); + project.linkDevDependency('ember-cli', { baseDir: __dirname, resolveName: 'ember-cli-4.4' }); + project.linkDevDependency('ember-data', { baseDir: __dirname, resolveName: 'ember-data-4.4' }); +} + async function release(project: Project) { project.linkDevDependency('ember-source', { baseDir: __dirname, resolveName: 'ember-source-latest' }); project.linkDevDependency('ember-cli', { baseDir: __dirname, resolveName: 'ember-cli-latest' }); @@ -33,9 +21,8 @@ async function release(project: Project) { export function supportMatrix(scenarios: Scenarios) { return scenarios.expand({ - lts_3_16, - lts_3_24, lts_3_28, + lts_4_4, release, }); } @@ -62,3 +49,20 @@ export function baseTSApp() { export const appScenarios = supportMatrix(Scenarios.fromProject(baseApp)); export const tsAppScenarios = supportMatrix(Scenarios.fromProject(baseTSApp)); export const dummyAppScenarios = supportMatrix(Scenarios.fromProject(() => baseAddon('dummy-app'))); + +// renames a v1 app +export function renameApp(project: Project, newName: string) { + let oldName = project.pkg.name; + let target = new RegExp('\\b' + oldName + '\\b', 'g'); + function rename(files: Project['files']) { + for (let [path, content] of Object.entries(files)) { + if (typeof content === 'string') { + files[path] = content.replace(target, newName); + } else if (content) { + rename(content); + } + } + } + rename(project.files); + project.pkg.name = newName; +} diff --git a/tests/scenarios/typescript-app-test.ts b/tests/scenarios/typescript-app-test.ts index d0fa5aa50..e6cc311e4 100644 --- a/tests/scenarios/typescript-app-test.ts +++ b/tests/scenarios/typescript-app-test.ts @@ -5,8 +5,6 @@ import merge from 'lodash/merge'; const { module: Qmodule, test } = QUnit; tsAppScenarios - .skip('lts_3_16') - .skip('lts_3_24') .map('typescript-app', project => { merge(project.files, { app: { diff --git a/tests/scenarios/v2-addon-dev-test.ts b/tests/scenarios/v2-addon-dev-test.ts index 4c9261e69..07b34db35 100644 --- a/tests/scenarios/v2-addon-dev-test.ts +++ b/tests/scenarios/v2-addon-dev-test.ts @@ -7,13 +7,7 @@ import { ExpectFile, expectFilesAt } from '@embroider/test-support'; const { module: Qmodule, test } = QUnit; -/** - * The type of addon this is testing with only works in - * ember-source@3.25+ - */ appScenarios - .skip('lts_3_16') - .skip('lts_3_24') .map('v2-addon-dev-js', async project => { let addon = baseV2Addon(); addon.pkg.name = 'v2-addon'; diff --git a/tests/scenarios/v2-addon-dev-typescript-test.ts b/tests/scenarios/v2-addon-dev-typescript-test.ts index f76c2f48f..a070824a5 100644 --- a/tests/scenarios/v2-addon-dev-typescript-test.ts +++ b/tests/scenarios/v2-addon-dev-typescript-test.ts @@ -8,8 +8,6 @@ import { pathExistsSync, readJsonSync, readFileSync } from 'fs-extra'; const { module: Qmodule, test } = QUnit; appScenarios - .skip('lts_3_16') - .skip('lts_3_24') .map('v2-addon-dev-typescript', async project => { let addon = baseV2Addon(); addon.pkg.name = 'v2-addon'; diff --git a/yarn.lock b/yarn.lock index e8c3bbd83..480038f28 100644 --- a/yarn.lock +++ b/yarn.lock @@ -46,7 +46,7 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.19.4.tgz#95c86de137bf0317f3a570e1b6e996b427299747" integrity sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw== -"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.12.9", "@babel/core@^7.13.8", "@babel/core@^7.14.5", "@babel/core@^7.3.4", "@babel/core@^7.7.7", "@babel/core@^7.8.7": +"@babel/core@^7.0.0", "@babel/core@^7.1.6", "@babel/core@^7.12.0", "@babel/core@^7.12.10", "@babel/core@^7.12.3", "@babel/core@^7.13.8", "@babel/core@^7.14.5", "@babel/core@^7.3.4", "@babel/core@^7.8.7": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.14.5.tgz#d281f46a9905f07d1b3bf71ead54d9c7d89cb1e3" integrity sha512-RN/AwP2DJmQTZSfiDaD+JQQ/J99KsIpOCfBE5pL+5jJSt7nI3nYGoAXZu+ffYSQ029NLs2DstZb+eR81uuARgg== @@ -109,6 +109,27 @@ json5 "^2.2.1" semver "^6.3.0" +"@babel/core@^7.18.6": + version "7.18.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.10.tgz#39ad504991d77f1f3da91be0b8b949a5bc466fb8" + integrity sha512-JQM6k6ENcBFKVtWvLavlvi/mPcpYZ3+R+2EySDEMSMbp7Mn4FexlbbJVrx2R7Ijhr01T8gyqrOaABWIOgxeUyw== + dependencies: + "@ampproject/remapping" "^2.1.0" + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-compilation-targets" "^7.18.9" + "@babel/helper-module-transforms" "^7.18.9" + "@babel/helpers" "^7.18.9" + "@babel/parser" "^7.18.10" + "@babel/template" "^7.18.10" + "@babel/traverse" "^7.18.10" + "@babel/types" "^7.18.10" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.1" + semver "^6.3.0" + "@babel/core@^7.19.3": version "7.19.3" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c" @@ -139,6 +160,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.18.10": + version "7.18.12" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.12.tgz#fa58daa303757bd6f5e4bbca91b342040463d9f4" + integrity sha512-dfQ8ebCN98SvyL7IxNMCUtZQSq5R7kxgN+r8qYTGDmmSion1hX2C0zq2yo1bsCDhXixokv1SAWTZUMYbO/V5zg== + dependencies: + "@babel/types" "^7.18.10" + "@jridgewell/gen-mapping" "^0.3.2" + jsesc "^2.5.1" + "@babel/generator@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" @@ -226,7 +256,7 @@ browserslist "^4.21.3" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.5.5", "@babel/helper-create-class-features-plugin@^7.8.3": +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.5.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.5.tgz#8842ec495516dd1ed8f6c572be92ba78b1e9beef" integrity sha512-Uq9z2e7ZtcnDMirRqAGLRaLwJn+Lrh388v5ETrR3pALJnElVh2zqQmdbz4W2RUJYohAPh2mtyPUgyMHMzXMncQ== @@ -660,6 +690,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.19.6.tgz#b923430cb94f58a7eae8facbffa9efd19130e7f8" integrity sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA== +"@babel/parser@^7.18.11": + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.11.tgz#68bb07ab3d380affa9a3f96728df07969645d2d9" + integrity sha512-9JKn5vN+hDt0Hdqn1PiJ2guflwP+B6Ga8qbDuoF0PzzVhrzsKIJo8yGqVk6CmMHiMei9w1C1Bp9IMJSIK+HPIQ== + "@babel/parser@^7.18.6", "@babel/parser@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" @@ -832,7 +867,7 @@ "@babel/helper-plugin-utils" "^7.18.9" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5", "@babel/plugin-proposal-nullish-coalescing-operator@^7.4.4": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.14.5.tgz#ee38589ce00e2cc59b299ec3ea406fcd3a0fdaf6" integrity sha512-gun/SOnMqjSb98Nkaq2rTKMwervfdAoz6NphdY0vTfuzMfryj+tDGb2n6UkDKwez+Y8PZDhE3D143v6Gepp4Hg== @@ -902,7 +937,7 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.14.5", "@babel/plugin-proposal-optional-chaining@^7.6.0": +"@babel/plugin-proposal-optional-chaining@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.14.5.tgz#fa83651e60a360e3f13797eef00b8d519695b603" integrity sha512-ycz+VOzo2UbWNI1rQXxIuMOzrDdHGrI23fRiz/Si2R4kv2XZQ1BK8ccdHwehMKBlcH/joGW/tzrUmo67gbJHlQ== @@ -1112,7 +1147,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.14.5", "@babel/plugin-syntax-typescript@^7.2.0", "@babel/plugin-syntax-typescript@^7.8.3": +"@babel/plugin-syntax-typescript@^7.14.5", "@babel/plugin-syntax-typescript@^7.2.0": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz#b82c6ce471b165b5ce420cf92914d6fb46225716" integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== @@ -1172,7 +1207,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-block-scoping@^7.14.5", "@babel/plugin-transform-block-scoping@^7.7.4", "@babel/plugin-transform-block-scoping@^7.8.3": +"@babel/plugin-transform-block-scoping@^7.14.5", "@babel/plugin-transform-block-scoping@^7.8.3": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.5.tgz#8cc63e61e50f42e078e6f09be775a75f23ef9939" integrity sha512-LBYm4ZocNgoCqyxMLoOnwpsmQ18HWTQvql64t3GvMUzLQrNoV1BDG0lNftC8QKYERkZgCCT/7J5xWGObGAyHDw== @@ -1346,7 +1381,7 @@ dependencies: "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.13.0", "@babel/plugin-transform-modules-amd@^7.14.5", "@babel/plugin-transform-modules-amd@^7.7.5": +"@babel/plugin-transform-modules-amd@^7.12.1", "@babel/plugin-transform-modules-amd@^7.13.0", "@babel/plugin-transform-modules-amd@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.5.tgz#4fd9ce7e3411cb8b83848480b7041d83004858f7" integrity sha512-3lpOU8Vxmp3roC4vzFpSdEpGUWSMsHFreTWOMMLzel2gNGfHE5UWIh/LN6ghHs2xurUp4jRFYMUIZhuFbody1g== @@ -1662,15 +1697,6 @@ "@babel/helper-plugin-utils" "^7.0.0" "@babel/plugin-syntax-typescript" "^7.2.0" -"@babel/plugin-transform-typescript@~7.8.0": - version "7.8.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.8.7.tgz#48bccff331108a7b3a28c3a4adc89e036dc3efda" - integrity sha512-7O0UsPQVNKqpHeHLpfvOG4uXmlw+MOxYvUv6Otc9uH5SYMIxvF6eBdjkWvC3f9G+VXe0RsNExyAQBeTRug/wqQ== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.8.3" - "@babel/helper-plugin-utils" "^7.8.3" - "@babel/plugin-syntax-typescript" "^7.8.3" - "@babel/plugin-transform-unicode-escapes@^7.14.5": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.14.5.tgz#9d4bd2a681e3c5d7acf4f57fa9e51175d91d0c6b" @@ -1970,6 +1996,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.18.10": + version "7.18.11" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.11.tgz#3d51f2afbd83ecf9912bcbb5c4d94e3d2ddaa16f" + integrity sha512-TG9PiM2R/cWCAy6BPJKeHzNbu4lPzOSZpeMfeNErskGpTJx6trEvFaVCbDvpcxwy49BKWmEPwiW8mrysNiDvIQ== + dependencies: + "@babel/code-frame" "^7.18.6" + "@babel/generator" "^7.18.10" + "@babel/helper-environment-visitor" "^7.18.9" + "@babel/helper-function-name" "^7.18.9" + "@babel/helper-hoist-variables" "^7.18.6" + "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/parser" "^7.18.11" + "@babel/types" "^7.18.10" + debug "^4.1.0" + globals "^11.1.0" + "@babel/traverse@^7.18.9": version "7.18.9" resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" @@ -2018,7 +2060,7 @@ debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.14.5", "@babel/types@^7.4.0", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2": +"@babel/types@^7.0.0", "@babel/types@^7.1.6", "@babel/types@^7.12.1", "@babel/types@^7.14.5", "@babel/types@^7.4.4", "@babel/types@^7.7.0", "@babel/types@^7.7.2": version "7.14.5" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.14.5.tgz#3bb997ba829a2104cedb20689c4a5b8121d383ff" integrity sha512-M/NzBpEL95I5Hh4dwhin5JlE7EzO5PHMAuzjxss3tiOBD46KfQvVedN/3jEPZvdRvtsK2222XfdHogNIttFgcg== @@ -2272,30 +2314,10 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@ember-data/adapter@3.16.9": - version "3.16.9" - resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.16.9.tgz#d4cb172b708c18ea077becae9ad8b784ce306c85" - integrity sha512-3DsJE34lhwCcA/RhsNIjzrRylxh91guBHDflRZV7Vb6rwtPHjd/a4HotwJPH4mL07Ec7UhWd5dHk+O2hKQ5/Hg== - dependencies: - "@ember-data/private-build-infra" "3.16.9" - "@ember-data/store" "3.16.9" - "@ember/edition-utils" "^1.2.0" - ember-cli-babel "^7.20.5" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" - -"@ember-data/adapter@3.24.2": - version "3.24.2" - resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.24.2.tgz#dd0b0f4f3c6e83dcba8c1a65d799a4c737f5eeec" - integrity sha512-3NmgrGNOUYKseJjUHcre3IOhLlpPMg7o9o8ZNRyi7r2M1n9flsXuKzJPMiteAic3U7bhODk44gorYjQ6goCzHw== - dependencies: - "@ember-data/private-build-infra" "3.24.2" - "@ember-data/store" "3.24.2" - "@ember/edition-utils" "^1.2.0" - "@ember/string" "^1.0.0" - ember-cli-babel "^7.18.0" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" +"@colors/colors@1.5.0": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.5.0.tgz#bb504579c1cae923e6576a4f5da43d25f97bdbd9" + integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== "@ember-data/adapter@3.28.10": version "3.28.10" @@ -2310,19 +2332,6 @@ ember-cli-test-info "^1.0.0" ember-cli-typescript "^4.1.0" -"@ember-data/adapter@3.28.3": - version "3.28.3" - resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-3.28.3.tgz#9f2976d32060a94a5e6b11f16d04419bd6dc21f9" - integrity sha512-VY8aml7Qw6BYEVyBbE6wMVY3CvXta7VCAs+WfchaOSeAVQSnzxYao//1jXlpnLKTKwJHc6q5rVHxfp8DLUBCuw== - dependencies: - "@ember-data/private-build-infra" "3.28.3" - "@ember-data/store" "3.28.3" - "@ember/edition-utils" "^1.2.0" - "@ember/string" "^3.0.0" - ember-cli-babel "^7.26.6" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^4.1.0" - "@ember-data/adapter@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@ember-data/adapter/-/adapter-4.4.1.tgz#1c61fcb0392cb9b04479f7886f8373e89f71e163" @@ -2337,22 +2346,6 @@ ember-cli-test-info "^1.0.0" ember-cli-typescript "^5.0.0" -"@ember-data/canary-features@3.16.9": - version "3.16.9" - resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.16.9.tgz#f68eec8cf73ccf8b9cbfe9e163313251144cd958" - integrity sha512-ENnSGmgGofd0lPzKPuWIavTXosYSiikASQAEaoa7wQ49ACaIVLqobpPfqnBeUI+Ng/UNAuKrum+gc7t8uDmSew== - dependencies: - ember-cli-babel "^7.20.5" - ember-cli-typescript "^3.1.3" - -"@ember-data/canary-features@3.24.2": - version "3.24.2" - resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.24.2.tgz#bd91beda313fc4d7ef3d8fc5dc709d53350c246c" - integrity sha512-duCgl99T6QQ4HuXNMI1l1vA8g7cvi7Ol/loVFOtkJn+MOlcQOzXNATuNqC/LPjTiHpPdQTL18+fq2wIZEDnq0w== - dependencies: - ember-cli-babel "^7.18.0" - ember-cli-typescript "^3.1.3" - "@ember-data/canary-features@3.28.10": version "3.28.10" resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.28.10.tgz#860602536ca2ee526f7bffa9e9ccdf6686a259b8" @@ -2361,14 +2354,6 @@ ember-cli-babel "^7.26.6" ember-cli-typescript "^4.1.0" -"@ember-data/canary-features@3.28.3": - version "3.28.3" - resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-3.28.3.tgz#d3b469defa5e12f1adf0162fb0c61cd3a5fbc108" - integrity sha512-7DlArWpwN4M+Yt1o6fJ3ddvCyDqbpXiWuv0erncLyZomHEiEMwyiT6O9ddtE9sqsxu+g3721xbuB0bMsgnMilA== - dependencies: - ember-cli-babel "^7.26.6" - ember-cli-typescript "^4.1.0" - "@ember-data/canary-features@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@ember-data/canary-features/-/canary-features-4.4.1.tgz#2e169c235ee095e84040fb01f6ebe171b986a464" @@ -2377,29 +2362,6 @@ ember-cli-babel "^7.26.11" ember-cli-typescript "^5.0.0" -"@ember-data/debug@3.16.9": - version "3.16.9" - resolved "https://registry.yarnpkg.com/@ember-data/debug/-/debug-3.16.9.tgz#598247819f85bda371f46438d6c807c8c72e5475" - integrity sha512-dUJAyK8ciJMHmhn/7jVIho6x0Yq6AlY6sZCaBQX9sojC38E+l3P0QgDBc+ic1w86V45DPwZKOCHG9I5i0kV4Bg== - dependencies: - "@ember-data/private-build-infra" "3.16.9" - "@ember/edition-utils" "^1.2.0" - ember-cli-babel "^7.20.5" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" - -"@ember-data/debug@3.24.2": - version "3.24.2" - resolved "https://registry.yarnpkg.com/@ember-data/debug/-/debug-3.24.2.tgz#6b96fb9cd0914071efb9ac3c6befc1a3a55f5d38" - integrity sha512-RPTGoSFPGjhB7ZVbv3eGFL6NeZKCtWv9BrZwrZH7ZvHWN1Vc7vYG3NAsLAafpjbkfSo4KG2OKHZGftpXCIl2Og== - dependencies: - "@ember-data/private-build-infra" "3.24.2" - "@ember/edition-utils" "^1.2.0" - "@ember/string" "^1.0.0" - ember-cli-babel "^7.18.0" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" - "@ember-data/debug@3.28.10": version "3.28.10" resolved "https://registry.yarnpkg.com/@ember-data/debug/-/debug-3.28.10.tgz#a5d680a7ef9dccfc23c088f8b91d420e7d3a8d89" @@ -2412,18 +2374,6 @@ ember-cli-test-info "^1.0.0" ember-cli-typescript "^4.1.0" -"@ember-data/debug@3.28.3": - version "3.28.3" - resolved "https://registry.yarnpkg.com/@ember-data/debug/-/debug-3.28.3.tgz#d928a4d93f3fe1cb20c65bf20bd17b1a99d0c5cd" - integrity sha512-4eudplK48o4TVGP8/onmbJuEFLep0HDzYS+wMdrwNlJZx+0y+3NLq3Bifx8IvQ42aSjFrxTJCBNczFMO0iE61A== - dependencies: - "@ember-data/private-build-infra" "3.28.3" - "@ember/edition-utils" "^1.2.0" - "@ember/string" "^3.0.0" - ember-cli-babel "^7.26.6" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^4.1.0" - "@ember-data/debug@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@ember-data/debug/-/debug-4.4.1.tgz#848c32e05f91f6e975c9c7af53f9d3c2d49d1da8" @@ -2437,39 +2387,6 @@ ember-cli-test-info "^1.0.0" ember-cli-typescript "^5.0.0" -"@ember-data/model@3.16.9": - version "3.16.9" - resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.16.9.tgz#de002feedf100acd47b93916a7dbef436e9b770a" - integrity sha512-K9pl2eOTtGH2z/XUwydZYn5Lsnz15gudm9oAjTvvU9yxMlrkRx09TmBr0m0TDMZOl64vTPbQySrHBtguJM0Ppg== - dependencies: - "@ember-data/canary-features" "3.16.9" - "@ember-data/private-build-infra" "3.16.9" - "@ember-data/store" "3.16.9" - "@ember/edition-utils" "^1.2.0" - ember-cli-babel "^7.20.5" - ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" - ember-compatibility-helpers "^1.2.0" - inflection "1.12.0" - -"@ember-data/model@3.24.2": - version "3.24.2" - resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.24.2.tgz#8d718b8151eb2489328c5957d9ffc367b5b9a512" - integrity sha512-vKBYlWZYk0uh+7TiEYADQakUpJLbZ+ahU9ez2WEMtsdl4cDHpEBwyFH76Zmh3dp2Pz/aq5UwOtEHz/ggpUo7fQ== - dependencies: - "@ember-data/canary-features" "3.24.2" - "@ember-data/private-build-infra" "3.24.2" - "@ember-data/store" "3.24.2" - "@ember/edition-utils" "^1.2.0" - "@ember/string" "^1.0.0" - ember-cli-babel "^7.18.0" - ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" - ember-compatibility-helpers "^1.2.0" - inflection "1.12.0" - "@ember-data/model@3.28.10": version "3.28.10" resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.28.10.tgz#a1890bc69bfc6aac33ed4c37834810984a8f3c66" @@ -2488,24 +2405,6 @@ ember-compatibility-helpers "^1.2.0" inflection "~1.13.1" -"@ember-data/model@3.28.3": - version "3.28.3" - resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-3.28.3.tgz#b3a9e58144f39c81e10e3e14390b7f3cebdce463" - integrity sha512-SxbcJe6RI8rUM/urYQxql9/+E6SPruhGU0AOpvpiP0IPlaRv+oZCKmvXsO2MSKRxmV89YenJNUQ9p/ch0iuMYA== - dependencies: - "@ember-data/canary-features" "3.28.3" - "@ember-data/private-build-infra" "3.28.3" - "@ember-data/store" "3.28.3" - "@ember/edition-utils" "^1.2.0" - "@ember/string" "^3.0.0" - ember-cached-decorator-polyfill "^0.1.4" - ember-cli-babel "^7.26.6" - ember-cli-string-utils "^1.1.0" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^4.1.0" - ember-compatibility-helpers "^1.2.0" - inflection "~1.13.1" - "@ember-data/model@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@ember-data/model/-/model-4.4.1.tgz#cd5018579c6648dd40de5c8defc93bf84a342fde" @@ -2525,70 +2424,6 @@ ember-compatibility-helpers "^1.2.0" inflection "~1.13.1" -"@ember-data/private-build-infra@3.16.9": - version "3.16.9" - resolved "https://registry.yarnpkg.com/@ember-data/private-build-infra/-/private-build-infra-3.16.9.tgz#992bff2ff2fdcb5db1b147f723830b2a2a4b1369" - integrity sha512-2IDMNlglsN5v44UZ4FGBYK88ZXPh504+o5cSjKW9CnlZd4imqcxp0KXYWfiGffzGxKllDCWuRsc43lpNu5Clng== - dependencies: - "@babel/plugin-transform-block-scoping" "^7.7.4" - "@ember-data/canary-features" "3.16.9" - "@ember/edition-utils" "^1.2.0" - babel-plugin-debug-macros "^0.3.3" - babel-plugin-filter-imports "^4.0.0" - babel6-plugin-strip-class-callcheck "^6.0.0" - broccoli-debug "^0.6.5" - broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.2" - broccoli-rollup "^4.1.1" - calculate-cache-key-for-tree "^2.0.0" - chalk "^3.0.0" - ember-cli-babel "^7.20.5" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-typescript "^3.1.3" - ember-cli-version-checker "^3.1.2" - esm "^3.2.25" - git-repo-info "^2.1.1" - glob "^7.1.6" - npm-git-info "^1.0.3" - rimraf "^3.0.0" - rsvp "^4.8.5" - semver "^6.3.0" - silent-error "^1.1.1" - -"@ember-data/private-build-infra@3.24.2": - version "3.24.2" - resolved "https://registry.yarnpkg.com/@ember-data/private-build-infra/-/private-build-infra-3.24.2.tgz#2b77fb4490a6c657d9f82ce8c54fe22157e03963" - integrity sha512-uYv9BOGaNxsSacE0jFRFhrs/Xg6f8Rma2Ap/mVjwouBvu+DV2cl5E2zIMalygu/ngIiGhiNUeUp2RpjSpR054w== - dependencies: - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@ember-data/canary-features" "3.24.2" - "@ember/edition-utils" "^1.2.0" - babel-plugin-debug-macros "^0.3.3" - babel-plugin-filter-imports "^4.0.0" - babel6-plugin-strip-class-callcheck "^6.0.0" - broccoli-debug "^0.6.5" - broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^4.2.0" - broccoli-rollup "^4.1.1" - calculate-cache-key-for-tree "^2.0.0" - chalk "^4.0.0" - ember-cli-babel "^7.18.0" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-typescript "^3.1.3" - ember-cli-version-checker "^5.1.1" - esm "^3.2.25" - git-repo-info "^2.1.1" - glob "^7.1.6" - npm-git-info "^1.0.3" - rimraf "^3.0.2" - rsvp "^4.8.5" - semver "^7.1.3" - silent-error "^1.1.1" - "@ember-data/private-build-infra@3.28.10": version "3.28.10" resolved "https://registry.yarnpkg.com/@ember-data/private-build-infra/-/private-build-infra-3.28.10.tgz#ba4f764a54bbb7d62822a24adbd2a1b976fbec7c" @@ -2621,38 +2456,6 @@ semver "^7.1.3" silent-error "^1.1.1" -"@ember-data/private-build-infra@3.28.3": - version "3.28.3" - resolved "https://registry.yarnpkg.com/@ember-data/private-build-infra/-/private-build-infra-3.28.3.tgz#1169d8885a9d1abc671552ac80136b857785d491" - integrity sha512-aFeZJe+aa7ETaWdsrXAq63e3a9InYacGyp9xxDM37x6TENZ9Z/hdSKf9nOXYqiMuFzcNy5i1a7RUM0z1HWV1vQ== - dependencies: - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@ember-data/canary-features" "3.28.3" - "@ember/edition-utils" "^1.2.0" - babel-plugin-debug-macros "^0.3.3" - babel-plugin-filter-imports "^4.0.0" - babel6-plugin-strip-class-callcheck "^6.0.0" - broccoli-debug "^0.6.5" - broccoli-file-creator "^2.1.1" - broccoli-funnel "^3.0.3" - broccoli-merge-trees "^4.2.0" - broccoli-rollup "^4.1.1" - calculate-cache-key-for-tree "^2.0.0" - chalk "^4.0.0" - ember-cli-babel "^7.26.6" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-typescript "^4.1.0" - ember-cli-version-checker "^5.1.1" - esm "^3.2.25" - git-repo-info "^2.1.1" - glob "^7.1.6" - npm-git-info "^1.0.3" - rimraf "^3.0.2" - rsvp "^4.8.5" - semver "^7.1.3" - silent-error "^1.1.1" - "@ember-data/private-build-infra@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@ember-data/private-build-infra/-/private-build-infra-4.4.1.tgz#cd9ed50072f71b5aaac72946abc44fc6043047b0" @@ -2685,34 +2488,6 @@ semver "^7.1.3" silent-error "^1.1.1" -"@ember-data/record-data@3.16.9": - version "3.16.9" - resolved "https://registry.yarnpkg.com/@ember-data/record-data/-/record-data-3.16.9.tgz#6cb50e8402081cb50422dfd72247d23063fb6008" - integrity sha512-uKGY5TyzpHaoN6UBV00B1j3xF/X2oqV14jm4y+EFvwiGC3mY+qDHuTUXUmBAKzB664JykEPKjIBPSBWFj2eHQg== - dependencies: - "@ember-data/canary-features" "3.16.9" - "@ember-data/private-build-infra" "3.16.9" - "@ember-data/store" "3.16.9" - "@ember/edition-utils" "^1.2.0" - "@ember/ordered-set" "^2.0.3" - ember-cli-babel "^7.20.5" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" - -"@ember-data/record-data@3.24.2": - version "3.24.2" - resolved "https://registry.yarnpkg.com/@ember-data/record-data/-/record-data-3.24.2.tgz#cf07dd13c74d02046af2dc4a9102f9f6cb897184" - integrity sha512-vdsWiPp29lwgMeyf4O1sXZ8xJf/zPCIEfksYeGaJ9VhiTKOucqiRxIFeI2cdyqxkM0frtCyNwYEntpy871Os2Q== - dependencies: - "@ember-data/canary-features" "3.24.2" - "@ember-data/private-build-infra" "3.24.2" - "@ember-data/store" "3.24.2" - "@ember/edition-utils" "^1.2.0" - "@ember/ordered-set" "^4.0.0" - ember-cli-babel "^7.18.0" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" - "@ember-data/record-data@3.28.10": version "3.28.10" resolved "https://registry.yarnpkg.com/@ember-data/record-data/-/record-data-3.28.10.tgz#af90e8b81f32253970f6c276b2f1988097138456" @@ -2726,19 +2501,6 @@ ember-cli-test-info "^1.0.0" ember-cli-typescript "^4.1.0" -"@ember-data/record-data@3.28.3": - version "3.28.3" - resolved "https://registry.yarnpkg.com/@ember-data/record-data/-/record-data-3.28.3.tgz#3c8c1d1a56d6f9b9c3de8715e66ad7ca6c402daa" - integrity sha512-sUFoNKg4nyiiKdhazsaTBhslzFgTH3etRDZB6jHzVg2gcO+lTks64UkQqTCgX15vxxn5YTS4qqI0iAGfMhlUeg== - dependencies: - "@ember-data/canary-features" "3.28.3" - "@ember-data/private-build-infra" "3.28.3" - "@ember-data/store" "3.28.3" - "@ember/edition-utils" "^1.2.0" - ember-cli-babel "^7.26.6" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^4.1.0" - "@ember-data/record-data@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@ember-data/record-data/-/record-data-4.4.1.tgz#1524d361e2d1f8c8b24e5f5e7417a82b9b0f51ed" @@ -2758,28 +2520,6 @@ resolved "https://registry.yarnpkg.com/@ember-data/rfc395-data/-/rfc395-data-0.0.4.tgz#ecb86efdf5d7733a76ff14ea651a1b0ed1f8a843" integrity sha512-tGRdvgC9/QMQSuSuJV45xoyhI0Pzjm7A9o/MVVA3HakXIImJbbzx/k/6dO9CUEQXIyS2y0fW6C1XaYOG7rY0FQ== -"@ember-data/serializer@3.16.9": - version "3.16.9" - resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.16.9.tgz#78a4688c488329024e717a35a6ec9018b3a0a568" - integrity sha512-4mB8v/lhH/fup8lGOxBVvQphULNZLlCryVIl1JE8jLZf7tiGIr0flwMtoYOmapU44EaTsoq7Xa+NzAttxWKH7A== - dependencies: - "@ember-data/private-build-infra" "3.16.9" - "@ember-data/store" "3.16.9" - ember-cli-babel "^7.20.5" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" - -"@ember-data/serializer@3.24.2": - version "3.24.2" - resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.24.2.tgz#d95816f4af4b9d3031bdd198cd10e6bde3fa8b17" - integrity sha512-so/NkQgtecXqPdFMjUHkXQ73n9TFVMigZeCFuippkP3lQu2HquJ9u/e+WRcgLzziU7q+eBTnt2Lar9uLkXMNyw== - dependencies: - "@ember-data/private-build-infra" "3.24.2" - "@ember-data/store" "3.24.2" - ember-cli-babel "^7.18.0" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^3.1.3" - "@ember-data/serializer@3.28.10": version "3.28.10" resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.28.10.tgz#4b560dbdd6ba43f8576e4cae59c67ca77639bdee" @@ -2791,17 +2531,6 @@ ember-cli-test-info "^1.0.0" ember-cli-typescript "^4.1.0" -"@ember-data/serializer@3.28.3": - version "3.28.3" - resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-3.28.3.tgz#3bd962892c67e5473ffffe29d1f4ebbc68ff8e21" - integrity sha512-8n2JxITm2MVzjSsaDC4MKsoc8z5T3kxIvWLUhJZWa1bOtftmyxCRwfrC4aeLgDV9gdXy0INCdtJ3L5L4qkChkQ== - dependencies: - "@ember-data/private-build-infra" "3.28.3" - "@ember-data/store" "3.28.3" - ember-cli-babel "^7.26.6" - ember-cli-test-info "^1.0.0" - ember-cli-typescript "^4.1.0" - "@ember-data/serializer@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@ember-data/serializer/-/serializer-4.4.1.tgz#0699bd08e76d298776663d783f819380fe818700" @@ -2814,31 +2543,6 @@ ember-cli-test-info "^1.0.0" ember-cli-typescript "^5.0.0" -"@ember-data/store@3.16.9": - version "3.16.9" - resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.16.9.tgz#4336ea1d0b6b597df85573bbd87ebc9889cf4fa6" - integrity sha512-xD04Ljz78DTcz3io5maH+AgJMhXKTR/vM4PkPUOgP8H1hrfYc3BFo6sWiOHrE6Lh3lIS2Ux0GdkWlUDNdQXMdg== - dependencies: - "@ember-data/canary-features" "3.16.9" - "@ember-data/private-build-infra" "3.16.9" - ember-cli-babel "^7.20.5" - ember-cli-path-utils "^1.0.0" - ember-cli-typescript "^3.1.3" - heimdalljs "^0.3.0" - -"@ember-data/store@3.24.2": - version "3.24.2" - resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.24.2.tgz#2583e03f8c51c5b049a29bbed304ae78085e8b9b" - integrity sha512-FJVZIrCwFDebh/s3Gy4YC+PK7BRaDIudor53coia236hpAW9eO/itO/ZbOGt9eFumWzX6eUFxJixD0o9FvGybA== - dependencies: - "@ember-data/canary-features" "3.24.2" - "@ember-data/private-build-infra" "3.24.2" - "@ember/string" "^1.0.0" - ember-cli-babel "^7.18.0" - ember-cli-path-utils "^1.0.0" - ember-cli-typescript "^3.1.3" - heimdalljs "^0.3.0" - "@ember-data/store@3.28.10": version "3.28.10" resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.28.10.tgz#023ae0a821efc23f712b543d5df0e3077739a914" @@ -2853,19 +2557,6 @@ ember-cli-path-utils "^1.0.0" ember-cli-typescript "^4.1.0" -"@ember-data/store@3.28.3": - version "3.28.3" - resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-3.28.3.tgz#4f186ae3d9903cc35be01c0739e856b775d79cbd" - integrity sha512-mZTrG8Vj/Sg1T24bnRPH5pbyBTmU5b+A5M+N2TOvHwS/JELTfdpJz3jYrqnpWzvru0VttqLipH7M8P4eEq34Cg== - dependencies: - "@ember-data/canary-features" "3.28.3" - "@ember-data/private-build-infra" "3.28.3" - "@ember/string" "^3.0.0" - "@glimmer/tracking" "^1.0.4" - ember-cli-babel "^7.26.6" - ember-cli-path-utils "^1.0.0" - ember-cli-typescript "^4.1.0" - "@ember-data/store@4.4.1": version "4.4.1" resolved "https://registry.yarnpkg.com/@ember-data/store/-/store-4.4.1.tgz#07c49e9228d56e63dcaba793aa4061ba28633e32" @@ -2914,16 +2605,6 @@ slash "^3.0.0" tslib "^2.2.0" -"@ember-template-lint/todo-utils@^8.1.0": - version "8.1.0" - resolved "https://registry.yarnpkg.com/@ember-template-lint/todo-utils/-/todo-utils-8.1.0.tgz#0fe8ef9ebd1948dea34d27d89a2e245687bb57d9" - integrity sha512-fnxDli4RfYGVBXc64D0fg7ifkSrNE8J/ee4eqQLzTrsUJbisWMlmU2NTHm990XcZkulYkCnkiLKERU/k1tx5IQ== - dependencies: - "@types/eslint" "^7.2.10" - fs-extra "^9.1.0" - slash "^3.0.0" - tslib "^2.1.0" - "@ember/edition-utils@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@ember/edition-utils/-/edition-utils-1.2.0.tgz#a039f542dc14c8e8299c81cd5abba95e2459cfa6" @@ -2966,22 +2647,6 @@ mkdirp "^1.0.4" silent-error "^1.1.1" -"@ember/ordered-set@^2.0.3": - version "2.0.3" - resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-2.0.3.tgz#2ac1ca73b3bd116063cae814898832ef434a57f9" - integrity sha512-F4yfVk6WMc4AUHxeZsC3CaKyTvO0qSZJy7WWHCFTlVDQw6vubn+FvnGdhzpN1F00EiXMI4Tv1tJdSquHcCnYrA== - dependencies: - ember-cli-babel "^6.16.0" - ember-compatibility-helpers "^1.1.1" - -"@ember/ordered-set@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@ember/ordered-set/-/ordered-set-4.0.0.tgz#c5ec021ab8d4734c6db92708a81edd499d45fd31" - integrity sha512-cUCcme4R5H37HyK8w0qzdG5+lpb3XVr2RQHLyWEP4JsKI66Ob4tizoJOs8rb/XdHCv+F5WeA321hfPMi3DrZbg== - dependencies: - ember-cli-babel "^7.22.1" - ember-compatibility-helpers "^1.1.1" - "@ember/render-modifiers@^2.0.0": version "2.0.4" resolved "https://registry.yarnpkg.com/@ember/render-modifiers/-/render-modifiers-2.0.4.tgz#0ac7af647cb736076dbfcd54ca71e090cd329d71" @@ -2991,13 +2656,6 @@ ember-cli-babel "^7.26.11" ember-modifier-manager-polyfill "^1.2.0" -"@ember/string@^1.0.0": - version "1.0.0" - resolved "https://registry.yarnpkg.com/@ember/string/-/string-1.0.0.tgz#3a2254caedacb95e09071204d36cad49e0f8b855" - integrity sha512-KZ+CcIXFdyIBMztxDMgza4SdLJgIeUgTjDAoHk6M50C2u1X/BK7KWUIN7MIK2LNTOMvbib9lWwEzKboxdI4lBw== - dependencies: - ember-cli-babel "^7.4.0" - "@ember/string@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@ember/string/-/string-3.0.0.tgz#e3a3cc7874c9f64eadfdac644d8b1238721ce289" @@ -3017,7 +2675,7 @@ ember-cli-htmlbars "^5.7.1" ember-destroyable-polyfill "^2.0.3" -"@ember/test-helpers@^2.7.0": +"@ember/test-helpers@^2.7.0", "@ember/test-helpers@^2.8.1": version "2.8.1" resolved "https://registry.yarnpkg.com/@ember/test-helpers/-/test-helpers-2.8.1.tgz#20f2e30d48172c2ff713e1db7fbec5352f918d4e" integrity sha512-jbsYwWyAdhL/pdPu7Gb3SG1gvIXY70FWMtC/Us0Kmvk82Y+5YUQ1SOC0io75qmOGYQmH7eQrd/bquEVd+4XtdQ== @@ -3163,7 +2821,7 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" -"@glimmer/component@^1.0.0", "@glimmer/component@^1.0.3", "@glimmer/component@^1.0.4": +"@glimmer/component@^1.0.0", "@glimmer/component@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@glimmer/component/-/component-1.0.4.tgz#1c85a5181615a6647f6acfaaed68e28ad7e9626e" integrity sha512-sS4N8wtcKfYdUJ6O3m8nbTut6NjErdz94Ap8VB1ekcg4WSD+7sI7Nmv6kt2rdPoe363nUdjUbRBzHNWhLzraBw== @@ -3233,6 +2891,13 @@ dependencies: "@glimmer/env" "^0.1.7" +"@glimmer/global-context@0.83.1": + version "0.83.1" + resolved "https://registry.yarnpkg.com/@glimmer/global-context/-/global-context-0.83.1.tgz#3e2d97f10ff623bcfb5b7dc29a858d546a6c6d66" + integrity sha512-OwlgqpbOJU73EjZOZdftab0fKbtdJ4x/QQeJseL9cvaAUiK3+w52M5ONFxD1T/yPBp2Mf7NCYqA/uL8tRbzY2A== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/interfaces@0.65.3": version "0.65.3" resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.65.3.tgz#ef3df40b42ab8b6dc36efea81652abddda72f23c" @@ -3247,6 +2912,13 @@ dependencies: "@simple-dom/interface" "^1.4.0" +"@glimmer/interfaces@0.83.1": + version "0.83.1" + resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.83.1.tgz#fb16f5f683ddc55f130887b6141f58c0751350fe" + integrity sha512-rjAztghzX97v8I4rk3+NguM3XGYcFjc/GbJ8qrEj19KF2lUDoDBW1sB7f0tov3BD5HlrGXei/vOh4+DHfjeB5w== + dependencies: + "@simple-dom/interface" "^1.4.0" + "@glimmer/interfaces@0.84.2": version "0.84.2" resolved "https://registry.yarnpkg.com/@glimmer/interfaces/-/interfaces-0.84.2.tgz#764cf92c954adcd1a851e5dc68ec1f6b654dc3bd" @@ -3291,6 +2963,17 @@ "@glimmer/util" "0.65.3" "@glimmer/validator" "0.65.3" +"@glimmer/reference@^0.83.1": + version "0.83.1" + resolved "https://registry.yarnpkg.com/@glimmer/reference/-/reference-0.83.1.tgz#0345b95431b5bb19843b308e6311d1ef81e36192" + integrity sha512-BThEwDlMkJB1WBPWDrww+VxgGyDbwxh5FFPvGhkovvCZnCb7fAMUCt9pi6CUZtviugkWOBFtE9P4eZZbOLkXeg== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/global-context" "0.83.1" + "@glimmer/interfaces" "0.83.1" + "@glimmer/util" "0.83.1" + "@glimmer/validator" "0.83.1" + "@glimmer/resolver@^0.4.1": version "0.4.3" resolved "https://registry.yarnpkg.com/@glimmer/resolver/-/resolver-0.4.3.tgz#b1baae5c3291b4621002ccf8d7870466097e841d" @@ -3341,6 +3024,16 @@ "@handlebars/parser" "^1.1.0" simple-html-tokenizer "^0.5.10" +"@glimmer/syntax@^0.83.1": + version "0.83.1" + resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.83.1.tgz#7e18dd445871c157ba0281f12a4fbf316fa49b41" + integrity sha512-n3vEd0GtjtgkOsd2gqkSimp8ecqq5KrHyana/s1XJZvVAPD5rMWT9WvAVWG8XAktns8BxjwLIUoj/vkOfA+eHg== + dependencies: + "@glimmer/interfaces" "0.83.1" + "@glimmer/util" "0.83.1" + "@handlebars/parser" "~2.0.0" + simple-html-tokenizer "^0.5.11" + "@glimmer/syntax@^0.84.2": version "0.84.2" resolved "https://registry.yarnpkg.com/@glimmer/syntax/-/syntax-0.84.2.tgz#a3f65e51eec20f6adb79c6159d1ad1166fa5bccd" @@ -3351,7 +3044,7 @@ "@handlebars/parser" "~2.0.0" simple-html-tokenizer "^0.5.11" -"@glimmer/tracking@^1.0.0", "@glimmer/tracking@^1.0.3", "@glimmer/tracking@^1.0.4": +"@glimmer/tracking@^1.0.0", "@glimmer/tracking@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@glimmer/tracking/-/tracking-1.0.4.tgz#f1bc1412fe5e2236d0f8d502994a8f88af1bbb21" integrity sha512-F+oT8I55ba2puSGIzInmVrv/8QA2PcK1VD+GWgFMhF6WC97D+uZX7BFg+a3s/2N4FVBq5KHE+QxZzgazM151Yw== @@ -3385,6 +3078,15 @@ "@glimmer/interfaces" "0.80.0" "@simple-dom/interface" "^1.4.0" +"@glimmer/util@0.83.1": + version "0.83.1" + resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.83.1.tgz#cc7511b03164d658cf6e3262fce5a0fcb82edceb" + integrity sha512-amvjtl9dvrkxsoitXAly9W5NUaLIE3A2J2tWhBWIL1Z6DOFotfX7ytIosOIcPhJLZCtiXPHzMutQRv0G/MSMsA== + dependencies: + "@glimmer/env" "0.1.7" + "@glimmer/interfaces" "0.83.1" + "@simple-dom/interface" "^1.4.0" + "@glimmer/util@0.84.2": version "0.84.2" resolved "https://registry.yarnpkg.com/@glimmer/util/-/util-0.84.2.tgz#2711ba40f25f44b2ea309cad49f5c2622c6211bc" @@ -3412,6 +3114,14 @@ "@glimmer/env" "^0.1.7" "@glimmer/global-context" "0.65.3" +"@glimmer/validator@0.83.1", "@glimmer/validator@^0.83.0": + version "0.83.1" + resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.83.1.tgz#7578cb2284f728c8e9302c51fc6e7660b570ac54" + integrity sha512-LaILSNnQgDHZpaUsfjVndbS1JfVn0xdTlJdFJblPbhoVklOBSReZVekens3EQ6xOr3BC612sRm1hBnEPixOY6A== + dependencies: + "@glimmer/env" "^0.1.7" + "@glimmer/global-context" "0.83.1" + "@glimmer/validator@^0.44.0": version "0.44.0" resolved "https://registry.yarnpkg.com/@glimmer/validator/-/validator-0.44.0.tgz#03d127097dc9cb23052cdb7fcae59d0a9dca53e1" @@ -3452,6 +3162,13 @@ dependencies: babel-plugin-debug-macros "^0.3.4" +"@glimmer/vm-babel-plugins@0.84.2": + version "0.84.2" + resolved "https://registry.yarnpkg.com/@glimmer/vm-babel-plugins/-/vm-babel-plugins-0.84.2.tgz#653ce82a6656b4396d87a479d8699450d35a17f0" + integrity sha512-HS2dEbJ3CgXn56wk/5QdudM7rE3vtNMvPIoG7Rrg+GhkGMNxBCIRxOeEF2g520j9rwlA2LAZFpc7MCDMFbTjNA== + dependencies: + babel-plugin-debug-macros "^0.3.4" + "@glimmer/vm@^0.42.2": version "0.42.2" resolved "https://registry.yarnpkg.com/@glimmer/vm/-/vm-0.42.2.tgz#492a4f05eac587c3a37371b3c62593f20bef553d" @@ -3756,6 +3473,19 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" +"@lint-todo/utils@^13.0.3": + version "13.0.3" + resolved "https://registry.yarnpkg.com/@lint-todo/utils/-/utils-13.0.3.tgz#ca222f38738b43eb43384d56e7292ba9cab3e891" + integrity sha512-7Grdii4L/ae8FiykBcsEfum3m9yxVKPNQXpqJDPhWMHsReEunaQDkx/WLsjiNBctRb+roNHZQuXQYlJwoTlqOw== + dependencies: + "@types/eslint" "^7.2.13" + find-up "^5.0.0" + fs-extra "^9.1.0" + proper-lockfile "^4.1.2" + slash "^3.0.0" + tslib "^2.3.1" + upath "^2.0.1" + "@manypkg/find-root@^1.1.0": version "1.1.0" resolved "https://registry.yarnpkg.com/@manypkg/find-root/-/find-root-1.1.0.tgz#a62d8ed1cd7e7d4c11d9d52a8397460b5d4ad29f" @@ -3878,6 +3608,11 @@ resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.24.47.tgz#530b67163714356f93e82bdb871e7db4b7bc564e" integrity sha512-J4Xw0xYK4h7eC34MNOPQi6IkNxGRck6n4VJpWDzXIFVTW8I/D43Gf+NfWz/v/7NHlzWOPd3+T4PJ4OqklQ2u7A== +"@sindresorhus/is@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.14.0.tgz#9fb3a3cf3132328151f353de4632e01e52102bea" + integrity sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ== + "@sindresorhus/is@^0.7.0": version "0.7.0" resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-0.7.0.tgz#9a06f4f137ee84d7df0460c1fdb1135ffa6c50fd" @@ -3897,6 +3632,13 @@ dependencies: "@sinonjs/commons" "^1.7.0" +"@szmarczak/http-timer@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-1.1.2.tgz#b1665e2c461a2cd92f4c1bbf50d5454de0d4b421" + integrity sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA== + dependencies: + defer-to-connect "^1.0.1" + "@tootallnate/once@1": version "1.1.2" resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82" @@ -3970,11 +3712,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/broccoli-plugin@^1.3.0": - version "1.3.0" - resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-1.3.0.tgz#38f8462fecaebc4e09a32e4d4ed1b9808f75bbca" - integrity sha512-SLk4/hFc2kGvgwNFrpn2O1juxFOllcHAywvlo7VwxfExLzoz1GGJ0oIZCwj5fwSpvHw4AWpZjJ1fUvb62PDayQ== - "@types/broccoli-plugin@^3.0.0": version "3.0.0" resolved "https://registry.yarnpkg.com/@types/broccoli-plugin/-/broccoli-plugin-3.0.0.tgz#290fda2270c47a568edfd0cefab8bb840d8bb7b2" @@ -4267,7 +4004,7 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*", "@types/eslint@^7.2.10": +"@types/eslint@*": version "7.2.13" resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-7.2.13.tgz#e0ca7219ba5ded402062ad6f926d491ebb29dd53" integrity sha512-LKmQCWAlnVHvvXq4oasNUMTJJb2GwSyTY8+1C7OH5ILR8mPLaljv1jxL1bXW3xB3jFbQxTKxJAvI8PyjB09aBg== @@ -5168,7 +4905,7 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -abortcontroller-polyfill@^1.7.1, abortcontroller-polyfill@^1.7.3: +abortcontroller-polyfill@^1.7.3: version "1.7.3" resolved "https://registry.yarnpkg.com/abortcontroller-polyfill/-/abortcontroller-polyfill-1.7.3.tgz#1b5b487bd6436b5b764fd52a612509702c3144b5" integrity sha512-zetDJxd89y3X99Kvo4qFx8GKlt6GsvN3UcRZHwU6iFA/0KiOmhkTVhe8oRoTBiTVPZu09x3vCra47+w8Yz1+2Q== @@ -5229,7 +4966,7 @@ acorn@^6.0.7, acorn@^6.4.1: resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.4.2.tgz#35866fd710528e92de10cf06016498e47e39e1e6" integrity sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ== -acorn@^7.1.0, acorn@^7.1.1, acorn@^7.4.0: +acorn@^7.1.1, acorn@^7.4.0: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== @@ -5494,6 +5231,11 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== +aria-query@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/aria-query/-/aria-query-5.0.0.tgz#210c21aaf469613ee8c9a62c7f86525e058db52c" + integrity sha512-V+SM7AbUwJ+EBnB8+DXs0hPZHO0W6pqBcc0dW90OwtVG02PswOu/teuARoLQjdDOH+t9pJgGnW5/Qmouf3gPJg== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" @@ -5974,14 +5716,6 @@ babel-plugin-ember-template-compilation@^1.0.0: magic-string "^0.25.7" string.prototype.matchall "^4.0.5" -babel-plugin-filter-imports@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-3.0.0.tgz#a849683837ad29960da17492fb32789ab6b09a11" - integrity sha512-p/chjzVTgCxUqyLM0q/pfWVZS7IJTwGQMwNg0LOvuQpKiTftQgZDtkGB8XvETnUw19rRcL7bJCTopSwibTN2tA== - dependencies: - "@babel/types" "^7.4.0" - lodash "^4.17.11" - babel-plugin-filter-imports@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-4.0.0.tgz#068f8da15236a96a9602c36dc6f4a6eeca70a4f4" @@ -5995,11 +5729,6 @@ babel-plugin-htmlbars-inline-precompile@^1.0.0: resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-1.0.0.tgz#a9d2f6eaad8a3f3d361602de593a8cbef8179c22" integrity sha512-4jvKEHR1bAX03hBDZ94IXsYCj3bwk9vYsn6ux6JZNL2U5pvzCWjqyrGahfsGNrhERyxw8IqcirOi9Q6WCo3dkQ== -babel-plugin-htmlbars-inline-precompile@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-3.2.0.tgz#c4882ea875d0f5683f0d91c1f72e29a4f14b5606" - integrity sha512-IUeZmgs9tMUGXYu1vfke5I18yYJFldFGdNFQOWslXTnDWXzpwPih7QFduUqvT+awDpDuNtXpdt5JAf43Q1Hhzg== - babel-plugin-htmlbars-inline-precompile@^5.0.0, babel-plugin-htmlbars-inline-precompile@^5.2.1: version "5.3.0" resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-5.3.0.tgz#eeaff07c35415264aea4d6bafb5e71167f6ffb2f" @@ -6511,11 +6240,6 @@ base64-arraybuffer@0.1.4: resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812" integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI= -base64-js@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784" - integrity sha1-Ak8Pcq+iW3X5wO5zzU9V7Bvtl4Q= - base64-js@^1.0.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -6558,6 +6282,18 @@ big.js@^5.2.2: resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== +bin-links@^3.0.0: + version "3.0.3" + resolved "https://registry.yarnpkg.com/bin-links/-/bin-links-3.0.3.tgz#3842711ef3db2cd9f16a5f404a996a12db355a6e" + integrity sha512-zKdnMPWEdh4F5INR07/eBrodC7QrF5JKvqskjz/ZZRXg5YSAZIbn8zGhbhUrElzHBZ2fvEQdOU59RHcTG3GiwA== + dependencies: + cmd-shim "^5.0.0" + mkdirp-infer-owner "^2.0.0" + npm-normalize-package-bin "^2.0.0" + read-cmd-shim "^3.0.0" + rimraf "^3.0.0" + write-file-atomic "^4.0.0" + binary-extensions@^1.0.0: version "1.13.1" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65" @@ -6673,15 +6409,7 @@ bootstrap@^4.3.1: resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-4.6.0.tgz#97b9f29ac98f98dfa43bf7468262d84392552fd7" integrity sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw== -bops@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/bops/-/bops-0.0.3.tgz#c5cbf6fea8be7401ca5ea6d1679e6c4e8b407c79" - integrity sha1-xcv2/qi+dAHKXqbRZ55sTotAfHk= - dependencies: - base64-js "0.0.2" - to-utf8 "0.0.1" - -bower-config@^1.4.1, bower-config@^1.4.3: +bower-config@^1.4.3: version "1.4.3" resolved "https://registry.yarnpkg.com/bower-config/-/bower-config-1.4.3.tgz#3454fecdc5f08e7aa9cc6d556e492be0669689ae" integrity sha512-MVyyUk3d1S7d2cl6YISViwJBc2VXCkxF5AUFykvN0PQj5FsUiMNSgAYTso18oRFfyZ6XEtjrgg9MAaufHbOwNw== @@ -6729,7 +6457,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -6786,7 +6514,7 @@ broccoli-babel-transpiler@^6.5.0: rsvp "^4.8.2" workerpool "^2.3.0" -broccoli-babel-transpiler@^7.2.0, broccoli-babel-transpiler@^7.3.0, broccoli-babel-transpiler@^7.8.0: +broccoli-babel-transpiler@^7.2.0, broccoli-babel-transpiler@^7.8.0: version "7.8.0" resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.8.0.tgz#7e0f01fce5739f49bbadeee7f1e625ca51cad66e" integrity sha512-dv30Td5uL7dO3NzQUqQKQs+Iq7JGKnCNtvc6GBO76uVPqGnRlsQZcYqdBVr33JrctR+ZrpTUf7TjsFKeDRFA8Q== @@ -6804,6 +6532,24 @@ broccoli-babel-transpiler@^7.2.0, broccoli-babel-transpiler@^7.3.0, broccoli-bab rsvp "^4.8.4" workerpool "^3.1.1" +broccoli-babel-transpiler@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/broccoli-babel-transpiler/-/broccoli-babel-transpiler-7.8.1.tgz#a5dc04cf4f59de98124fc128683ab2b83e5d28c1" + integrity sha512-6IXBgfRt7HZ61g67ssBc6lBb3Smw3DPZ9dEYirgtvXWpRZ2A9M22nxy6opEwJDgDJzlu/bB7ToppW33OFkA1gA== + dependencies: + "@babel/core" "^7.12.0" + "@babel/polyfill" "^7.11.5" + broccoli-funnel "^2.0.2" + broccoli-merge-trees "^3.0.2" + broccoli-persistent-filter "^2.2.1" + clone "^2.1.2" + hash-for-dep "^1.4.7" + heimdalljs "^0.2.1" + heimdalljs-logger "^0.1.9" + json-stable-stringify "^1.0.1" + rsvp "^4.8.4" + workerpool "^3.1.1" + broccoli-builder@^0.18.14: version "0.18.14" resolved "https://registry.yarnpkg.com/broccoli-builder/-/broccoli-builder-0.18.14.tgz#4b79e2f844de11a4e1b816c3f49c6df4776c312d" @@ -6851,7 +6597,7 @@ broccoli-clean-css@^1.1.0: inline-source-map-comment "^1.0.5" json-stable-stringify "^1.0.0" -broccoli-concat@^3.2.2, broccoli-concat@^3.7.4: +broccoli-concat@^3.2.2: version "3.7.5" resolved "https://registry.yarnpkg.com/broccoli-concat/-/broccoli-concat-3.7.5.tgz#223beda8c1184252cf08ae020a3d45ffa6a48218" integrity sha512-rDs1Mej3Ej0Cy5yIO9oIQq5+BCv0opAwS2NW7M0BeCsAMeFM42Z/zacDUC6jKc5OV5wiHvGTyCPLnZkMe0h6kQ== @@ -7093,25 +6839,6 @@ broccoli-middleware@^2.1.1: has-ansi "^3.0.0" mime-types "^2.1.18" -broccoli-module-normalizer@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/broccoli-module-normalizer/-/broccoli-module-normalizer-1.3.0.tgz#f9982d9cbb776b4ed754161cc6547784d3eb19de" - integrity sha512-0idZCOtdVG6xXoQ36Psc1ApMCr3lW5DB+WEAOEwHcUoESIBHzwcRPQTxheGIjZ5o0hxpsRYAUH5x0ErtNezbrQ== - dependencies: - broccoli-plugin "^1.3.0" - merge-trees "^1.0.1" - rimraf "^2.6.2" - symlink-or-copy "^1.1.8" - -broccoli-module-unification-reexporter@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/broccoli-module-unification-reexporter/-/broccoli-module-unification-reexporter-1.0.0.tgz#031909c5d3f159ec11d5f9e2346f2861db8acb3e" - integrity sha512-HTi9ua520M20aBZomaiBopsSt3yjL7J/paR3XPjieygK7+ShATBiZdn0B+ZPiniBi4I8JuMn1q0fNFUevtP//A== - dependencies: - broccoli-plugin "^1.3.0" - mkdirp "^0.5.1" - walk-sync "^0.3.2" - broccoli-node-api@^1.6.0, broccoli-node-api@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/broccoli-node-api/-/broccoli-node-api-1.7.0.tgz#391aa6edecd2a42c63c111b4162956b2fa288cb6" @@ -7127,13 +6854,6 @@ broccoli-node-info@^2.1.0: resolved "https://registry.yarnpkg.com/broccoli-node-info/-/broccoli-node-info-2.2.0.tgz#feb01c13020792f429e01d7f7845dc5b3a7932b3" integrity sha512-VabSGRpKIzpmC+r+tJueCE5h8k6vON7EIMMWu6d/FyPdtijwLQ7QvzShEw+m3mHoDzUaj/kiZsDYrS8X2adsBg== -broccoli-output-wrapper@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-2.0.0.tgz#f1e0b9b2f259a67fd41a380141c3c20b096828e6" - integrity sha512-V/ozejo+snzNf75i/a6iTmp71k+rlvqjE3+jYfimuMwR1tjNNRdtfno+NGNQB2An9bIAeqZnKhMDurAznHAdtA== - dependencies: - heimdalljs-logger "^0.1.10" - broccoli-output-wrapper@^3.2.5: version "3.2.5" resolved "https://registry.yarnpkg.com/broccoli-output-wrapper/-/broccoli-output-wrapper-3.2.5.tgz#514b17801c92922a2c2f87fd145df2a25a11bc5f" @@ -7232,7 +6952,7 @@ broccoli-plugin@^1.0.0, broccoli-plugin@^1.1.0, broccoli-plugin@^1.2.0, broccoli rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: +broccoli-plugin@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-2.1.0.tgz#2fab6c578219cfcc64f773e9616073313fc8b334" integrity sha512-ElE4caljW4slapyEhSD9jU9Uayc8SoSABWdmY9SqbV8DHNxU6xg1jJsPcMm+cXOvggR3+G+OXAYQeFjWVnznaw== @@ -7242,19 +6962,6 @@ broccoli-plugin@^2.0.0, broccoli-plugin@^2.1.0: rimraf "^2.3.4" symlink-or-copy "^1.1.8" -broccoli-plugin@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/broccoli-plugin/-/broccoli-plugin-3.1.0.tgz#54ba6dd90a42ec3db5624063292610e326b1e542" - integrity sha512-7w7FP8WJYjLvb0eaw27LO678TGGaom++49O1VYIuzjhXjK5kn2+AMlDm7CaUFw4F7CLGoVQeZ84d8gICMJa4lA== - dependencies: - broccoli-node-api "^1.6.0" - broccoli-output-wrapper "^2.0.0" - fs-merger "^3.0.1" - promise-map-series "^0.2.1" - quick-temp "^0.1.3" - rimraf "^2.3.4" - symlink-or-copy "^1.1.8" - broccoli-rollup@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-2.1.1.tgz#0b77dc4b7560a53e998ea85f3b56772612d4988d" @@ -7272,21 +6979,6 @@ broccoli-rollup@^2.1.1: symlink-or-copy "^1.1.8" walk-sync "^0.3.1" -broccoli-rollup@^4.1.1: - version "4.1.1" - resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-4.1.1.tgz#7531a24d88ddab9f1bace1c6ee6e6ca74a38d36f" - integrity sha512-hkp0dB5chiemi32t6hLe5bJvxuTOm1TU+SryFlZIs95KT9+94uj0C8w6k6CsZ2HuIdIZg6D252t4gwOlcTXrpA== - dependencies: - "@types/broccoli-plugin" "^1.3.0" - broccoli-plugin "^2.0.0" - fs-tree-diff "^2.0.1" - heimdalljs "^0.2.6" - node-modules-path "^1.0.1" - rollup "^1.12.0" - rollup-pluginutils "^2.8.1" - symlink-or-copy "^1.2.0" - walk-sync "^1.1.3" - broccoli-rollup@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/broccoli-rollup/-/broccoli-rollup-5.0.0.tgz#a77b53bcef1b70e988913fee82265c0a4ca530da" @@ -7458,7 +7150,7 @@ broccoli@^2.0.0: underscore.string "^3.2.2" watch-detector "^0.1.0" -broccoli@^3.3.3, broccoli@^3.4.2, broccoli@^3.5.0, broccoli@^3.5.1, broccoli@^3.5.2: +broccoli@^3.4.2, broccoli@^3.5.0, broccoli@^3.5.1, broccoli@^3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/broccoli/-/broccoli-3.5.2.tgz#60921167d57b43fb5bad527420d62fe532595ef4" integrity sha512-sWi3b3fTUSVPDsz5KsQ5eCQNVAtLgkIE/HYFkEZXR/07clqmd4E/gFiuwSaqa9b+QTXc1Uemfb7TVWbEIURWDg== @@ -7592,24 +7284,6 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" -buffer-alloc-unsafe@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz#bd7dc26ae2972d0eda253be061dba992349c19f0" - integrity sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg== - -buffer-alloc@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/buffer-alloc/-/buffer-alloc-1.2.0.tgz#890dd90d923a873e08e10e5fd51a57e5b7cce0ec" - integrity sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow== - dependencies: - buffer-alloc-unsafe "^1.1.0" - buffer-fill "^1.0.0" - -buffer-fill@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-fill/-/buffer-fill-1.0.0.tgz#f8f78b76789888ef39f205cd637f68e702122b2c" - integrity sha1-+PeLdniYiO858gXNY39o5wISKyw= - buffer-from@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" @@ -7647,6 +7321,13 @@ builtins@^1.0.3: resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88" integrity sha1-y5T662HIaWRR2zZTThQi+U8K7og= +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/builtins/-/builtins-5.0.1.tgz#87f6db9ab0458be728564fa81d876d8d74552fa9" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + bytes@1: version "1.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8" @@ -7716,6 +7397,19 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" +cacheable-request@^6.0.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-6.1.0.tgz#20ffb8bd162ba4be11e9567d823db651052ca912" + integrity sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg== + dependencies: + clone-response "^1.0.2" + get-stream "^5.1.0" + http-cache-semantics "^4.0.0" + keyv "^3.0.0" + lowercase-keys "^2.0.0" + normalize-url "^4.1.0" + responselike "^1.0.2" + calculate-cache-key-for-tree@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/calculate-cache-key-for-tree/-/calculate-cache-key-for-tree-2.0.0.tgz#7ac57f149a4188eacb0a45b210689215d3fef8d6" @@ -7794,11 +7488,6 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -capture-stack-trace@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.1.tgz#a6c0bbe1f38f3aa0b92238ecb6ff42c344d4135d" - integrity sha512-mYQLZnx5Qt1JgB1WEiMCf2647plpGeQ2NMR/5L0HNZzGQo4fuSPnK+wjfPnKZV0aiJDgzmWqqkV/g7JD+DW0qw== - cardinal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-1.0.0.tgz#50e21c1b0aa37729f9377def196b5a9cec932ee9" @@ -7912,6 +7601,11 @@ chownr@^1.1.1: resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b" integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== +chownr@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== + chrome-trace-event@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz#1015eced4741e15d06664a957dbbf50d041e26ac" @@ -7927,7 +7621,7 @@ ci-info@^3.1.0, ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.4.0.tgz#b28484fd436cbc267900364f096c9dc185efb251" integrity sha512-t5QdPT5jq3o262DOQ8zA6E1tlH2upmUc4Hlvrbx1pGYJuiiHl7O7rvVNI+l8HTVhd/q3Qc9vqimkNk5yiXsAug== -ci-info@^3.3.0: +ci-info@^3.3.0, ci-info@^3.3.1, ci-info@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== @@ -8006,15 +7700,14 @@ cli-spinners@^2.0.0, cli-spinners@^2.5.0: resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.6.0.tgz#36c7dc98fb6a9a76bd6238ec3f77e2425627e939" integrity sha512-t+4/y50K/+4xcCRosKkA7W4gTr1MySvLV0q+PxmG7FJ5g+66ChKurYjxBCjHggHH3HA5Hh9cy+lcUGWDqVH+4Q== -cli-table3@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.5.1.tgz#0252372d94dfc40dbd8df06005f48f31f656f202" - integrity sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw== +cli-table3@^0.6.0: + version "0.6.2" + resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.2.tgz#aaf5df9d8b5bf12634dc8b3040806a0c07120d2a" + integrity sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw== dependencies: - object-assign "^4.1.0" - string-width "^2.1.1" + string-width "^4.2.0" optionalDependencies: - colors "^1.1.2" + "@colors/colors" "1.5.0" cli-table@^0.3.1: version "0.3.6" @@ -8067,6 +7760,13 @@ clone-response@1.0.2: dependencies: mimic-response "^1.0.0" +clone-response@^1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3" + integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA== + dependencies: + mimic-response "^1.0.0" + clone@^1.0.2: version "1.0.4" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" @@ -8077,6 +7777,13 @@ clone@^2.0.0, clone@^2.1.2: resolved "https://registry.yarnpkg.com/clone/-/clone-2.1.2.tgz#1b7f4b9f591f1e8f83670401600345a02887435f" integrity sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18= +cmd-shim@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cmd-shim/-/cmd-shim-5.0.0.tgz#8d0aaa1a6b0708630694c4dbde070ed94c707724" + integrity sha512-qkCtZ59BidfEwHltnJwkyVZn+XQojdAySM1D1gSeh11Z4pW1Kpolkyo53L5noc0nrxmIvyFwTmJRo4xs7FFLPw== + dependencies: + mkdirp-infer-owner "^2.0.0" + co@^4.6.0: version "4.6.0" resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" @@ -8157,7 +7864,7 @@ colors@1.0.3: resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= -colors@^1.1.2, colors@^1.4.0: +colors@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== @@ -8201,6 +7908,11 @@ commander@^6.2.1: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-8.3.0.tgz#4837ea1b2da67b9c616a67afbb0fafee567bca66" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + common-tags@^1.8.0: version "1.8.0" resolved "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz#8e3153e542d4a39e9b10554434afaaf98956a937" @@ -8258,7 +7970,7 @@ concat-stream@^1.5.0: readable-stream "^2.2.2" typedarray "^0.0.6" -configstore@^5.0.0, configstore@^5.0.1: +configstore@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/configstore/-/configstore-5.0.1.tgz#d365021b5df4b98cdd187d6a3b0e3f6a7cc5ed96" integrity sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA== @@ -8290,7 +8002,7 @@ console-control-strings@^1.0.0, console-control-strings@^1.1.0, console-control- resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4= -console-ui@^3.0.0, console-ui@^3.0.4, console-ui@^3.1.1, console-ui@^3.1.2: +console-ui@^3.0.0, console-ui@^3.0.4, console-ui@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/console-ui/-/console-ui-3.1.2.tgz#51aef616ff02013c85ccee6a6d77ef7a94202e7a" integrity sha512-+5j3R4wZJcEYZeXk30whc4ZU/+fWW9JMTNntVuMYpjZJ9n26Cxr0tUBXco1NRjVZRpRVvZ4DDKKKIHNYeUG9Dw== @@ -8452,13 +8164,6 @@ create-ecdh@^4.0.0: bn.js "^4.1.0" elliptic "^6.5.3" -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - integrity sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y= - dependencies: - capture-stack-trace "^1.0.0" - create-hash@^1.1.0, create-hash@^1.1.2, create-hash@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz#889078af11a63756bcfb59bd221996be3a9ef196" @@ -8599,7 +8304,7 @@ css-tree@1.0.0-alpha25: mdn-data "^1.0.0" source-map "^0.5.3" -css-tree@^1.0.0-alpha.39, css-tree@^1.1.2: +css-tree@^1.1.2: version "1.1.3" resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.3.tgz#eb4870fb6fd7707327ec95c2ff2ab09b5e8db91d" integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== @@ -8607,6 +8312,14 @@ css-tree@^1.0.0-alpha.39, css-tree@^1.1.2: mdn-data "2.0.14" source-map "^0.6.1" +css-tree@^2.0.4: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + css-url-regex@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/css-url-regex/-/css-url-regex-1.1.0.tgz#83834230cc9f74c457de59eebd1543feeb83b7ec" @@ -8716,16 +8429,16 @@ dataloader@^1.4.0: resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-1.4.0.tgz#bca11d867f5d3f1b9ed9f737bd15970c65dff5c8" integrity sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw== -date-fns@^2.21.3: - version "2.22.1" - resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.22.1.tgz#1e5af959831ebb1d82992bf67b765052d8f0efc4" - integrity sha512-yUFPQjrxEmIsMqlHhAhmxkuH769baF21Kk+nZwZGyrMoyLA+LugaQtC0+Tqf9CBUUULWwUJt6Q5ySI3LJDDCGg== - date-fns@^2.23.0: version "2.23.0" resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.23.0.tgz#4e886c941659af0cf7b30fafdd1eaa37e88788a9" integrity sha512-5ycpauovVyAk0kXNZz6ZoB9AYMZB4DObse7P3BPWmyEjXNORTI8EJ6X0uaSAq4sCHzM1uajzrkr6HnsLQpxGXA== +date-fns@^2.29.1: + version "2.29.1" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.1.tgz#9667c2615525e552b5135a3116b95b1961456e60" + integrity sha512-dlLD5rKaKxpFdnjrs+5azHDFOPEu4ANy/LTh04A1DTzMM7qoajmKCBc8pkKRFT41CNzw+4gQh79X5C+Jq27HAw== + date-time@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/date-time/-/date-time-2.1.0.tgz#0286d1b4c769633b3ca13e1e62558d2dbdc2eba2" @@ -8830,6 +8543,11 @@ defaults@^1.0.3: dependencies: clone "^1.0.2" +defer-to-connect@^1.0.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-1.1.3.tgz#331ae050c08dcf789f8c83a7b81f0ed94f4ac591" + integrity sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ== + define-properties@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1" @@ -8946,7 +8664,7 @@ diff-sequences@^29.2.0: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.2.0.tgz#4c55b5b40706c7b5d2c5c75999a50c56d214e8f6" integrity sha512-413SY5JpYeSBZxmenGEmCVQ8mCgtFJF0w9PROdaS6z987XC2Pd2GOKqOITLtMftmyFZqgtCOb/QA7/Z3ZXfzIw== -diff@^4.0.1, diff@^4.0.2: +diff@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== @@ -9056,11 +8774,6 @@ dotenv@^8.1.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-8.6.0.tgz#061af664d19f7f4d8fc6e4ff9b584ce237adcb8b" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== -duplex@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/duplex/-/duplex-1.0.0.tgz#6abc5c16ec17e4c578578727126700590d3a2dda" - integrity sha1-arxcFuwX5MV4V4cnEmcAWQ06Ldo= - duplexer3@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" @@ -9233,7 +8946,7 @@ ember-auto-import@^2.2.0: typescript-memoize "^1.0.0-alpha.3" walk-sync "^0.3.3" -ember-auto-import@^2.2.3, ember-auto-import@^2.2.4, ember-auto-import@^2.4.0, ember-auto-import@^2.4.1: +ember-auto-import@^2.2.3, ember-auto-import@^2.2.4, ember-auto-import@^2.4.0, ember-auto-import@^2.4.1, ember-auto-import@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/ember-auto-import/-/ember-auto-import-2.4.2.tgz#d4d3bc6885a11cf124f606f5c37169bdf76e37ae" integrity sha512-REh+1aJWpTkvN42a/ga41OuRpUsSW7UQfPr2wPtYx56o/xoSNhVBXejy7yV9ObrkN7gogz6fs2xZwih5cOwpYg== @@ -9326,140 +9039,44 @@ ember-cached-decorator-polyfill@^0.1.4: ember-cli-babel "^7.21.0" ember-cli-babel-plugin-helpers "^1.1.1" -"ember-cli-3.16@npm:ember-cli@~3.16.0": - version "3.16.2" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.16.2.tgz#97fcf7f5109a0cc5e9f8ee8e971d3420d670eedb" - integrity sha512-x8czGIdRnS7bPRYY7PEhhVGakHTDGF1arKlgw8yBSch29hCuxmbMrxjQxEkvkTtQ8cb7a840N4eVyEujeYPQIw== - dependencies: - "@babel/core" "^7.7.7" - "@babel/plugin-transform-modules-amd" "^7.7.5" - amd-name-resolver "^1.3.1" - babel-plugin-module-resolver "^4.0.0" - bower-config "^1.4.1" - bower-endpoint-parser "0.2.2" - broccoli "^3.3.3" - broccoli-amd-funnel "^2.0.1" - broccoli-babel-transpiler "^7.3.0" - broccoli-builder "^0.18.14" - broccoli-concat "^3.7.4" - broccoli-config-loader "^1.0.1" - broccoli-config-replace "^1.1.2" - broccoli-debug "^0.6.5" - broccoli-funnel "^2.0.2" - broccoli-funnel-reducer "^1.0.0" - broccoli-merge-trees "^3.0.2" - broccoli-middleware "^2.1.1" - broccoli-module-normalizer "^1.3.0" - broccoli-module-unification-reexporter "^1.0.0" - broccoli-slow-trees "^3.0.1" - broccoli-source "^3.0.0" - broccoli-stew "^3.0.0" - calculate-cache-key-for-tree "^2.0.0" - capture-exit "^2.0.0" - chalk "^3.0.0" - ci-info "^2.0.0" - clean-base-url "^1.0.0" - compression "^1.7.4" - configstore "^5.0.0" - console-ui "^3.1.1" - core-object "^3.1.5" - dag-map "^2.0.2" - diff "^4.0.1" - ember-cli-is-package-missing "^1.0.0" - ember-cli-lodash-subset "^2.0.1" - ember-cli-normalize-entity-name "^1.0.0" - ember-cli-preprocess-registry "^3.3.0" - ember-cli-string-utils "^1.1.0" - ember-source-channel-url "^2.0.1" - ensure-posix-path "^1.0.2" - execa "^1.0.0" - exit "^0.1.2" - express "^4.16.4" - filesize "^4.2.0" - find-up "^4.1.0" - find-yarn-workspace-root "^1.2.1" - fs-extra "^8.1.0" - fs-tree-diff "^2.0.1" - get-caller-file "^2.0.5" - git-repo-info "^2.1.1" - glob "^7.1.4" - heimdalljs "^0.2.6" - heimdalljs-fs-monitor "^0.2.3" - heimdalljs-graph "^1.0.0" - heimdalljs-logger "^0.1.10" - http-proxy "^1.18.0" - inflection "^1.12.0" - is-git-url "^1.0.0" - isbinaryfile "^3.0.3" - js-yaml "^3.13.1" - json-stable-stringify "^1.0.1" - leek "0.0.24" - lodash.template "^4.5.0" - markdown-it "^9.1.0" - markdown-it-terminal "0.1.0" - minimatch "^3.0.4" - morgan "^1.9.1" - nopt "^3.0.6" - npm-package-arg "^6.1.1" - p-defer "^3.0.0" - portfinder "^1.0.25" - promise-map-series "^0.3.0" - promise.prototype.finally "^3.1.2" - quick-temp "^0.1.8" - resolve "^1.12.0" - resolve-package-path "^2.0.0" - rsvp "^4.8.5" - sane "^4.1.0" - semver "^6.3.0" - silent-error "^1.1.1" - sort-package-json "^1.39.1" - symlink-or-copy "^1.2.0" - temp "0.9.1" - testem "^3.0.1" - tiny-lr "^1.1.1" - tree-sync "^2.0.0" - uuid "^3.4.0" - walk-sync "^2.0.2" - watch-detector "^1.0.0" - yam "^1.0.0" - -"ember-cli-3.24@npm:ember-cli@~3.24.0": - version "3.24.0" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.24.0.tgz#dbda4938e74fdafe4da1c42b49356f9d14c10697" - integrity sha512-dLurYpluRcE+XjCHy/JzUBcW4dBKhjmXH3zUjyof89gFjj+8EFjB0b2tqyS6buKqBasinVaX8lZZVIXYCdFtNA== +"ember-cli-4.4@npm:ember-cli@~4.4.0", ember-cli@~4.4.0: + name ember-cli-4.4 + version "4.4.0" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-4.4.0.tgz#4e9211a71277c8373cc1dce313822b23249e7cad" + integrity sha512-0MulrhbyahIHMUDVaNJHQrlJi7xfN6G8XBTF6URfN65DfUAFBOjUKlVqVciQqE6evbltu388D+uvqhbNtIr7mA== dependencies: - "@babel/core" "^7.12.9" - "@babel/plugin-transform-modules-amd" "^7.12.1" + "@babel/core" "^7.17.9" + "@babel/plugin-transform-modules-amd" "^7.16.7" amd-name-resolver "^1.3.1" - babel-plugin-module-resolver "^4.0.0" + babel-plugin-module-resolver "^4.1.0" bower-config "^1.4.3" bower-endpoint-parser "0.2.2" - broccoli "^3.5.0" + broccoli "^3.5.2" broccoli-amd-funnel "^2.0.1" broccoli-babel-transpiler "^7.8.0" broccoli-builder "^0.18.14" - broccoli-concat "^4.2.4" + broccoli-concat "^4.2.5" broccoli-config-loader "^1.0.1" broccoli-config-replace "^1.1.2" broccoli-debug "^0.6.5" - broccoli-funnel "^2.0.2" + broccoli-funnel "^3.0.8" broccoli-funnel-reducer "^1.0.0" - broccoli-merge-trees "^3.0.2" + broccoli-merge-trees "^4.2.0" broccoli-middleware "^2.1.1" broccoli-slow-trees "^3.1.0" - broccoli-source "^3.0.0" + broccoli-source "^3.0.1" broccoli-stew "^3.0.0" calculate-cache-key-for-tree "^2.0.0" capture-exit "^2.0.0" - chalk "^4.1.0" - ci-info "^2.0.0" + chalk "^4.1.2" + ci-info "^3.3.0" clean-base-url "^1.0.0" compression "^1.7.4" configstore "^5.0.1" console-ui "^3.1.2" core-object "^3.1.5" dag-map "^2.0.2" - diff "^4.0.2" + diff "^5.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" @@ -9467,57 +9084,58 @@ ember-cached-decorator-polyfill@^0.1.4: ember-cli-string-utils "^1.1.0" ember-source-channel-url "^3.0.0" ensure-posix-path "^1.1.1" - execa "^4.1.0" + execa "^5.1.1" exit "^0.1.2" - express "^4.17.1" - filesize "^6.1.0" + express "^4.17.2" + filesize "^8.0.6" find-up "^5.0.0" find-yarn-workspace-root "^2.0.0" - fixturify-project "^2.1.0" - fs-extra "^9.0.1" + fixturify-project "^2.1.1" + fs-extra "^9.1.0" fs-tree-diff "^2.0.1" get-caller-file "^2.0.5" git-repo-info "^2.1.1" - glob "^7.1.6" + glob "^7.2.0" heimdalljs "^0.2.6" - heimdalljs-fs-monitor "^1.1.0" + heimdalljs-fs-monitor "^1.1.1" heimdalljs-graph "^1.0.0" heimdalljs-logger "^0.1.10" http-proxy "^1.18.1" - inflection "^1.12.0" + inflection "^1.13.1" is-git-url "^1.0.0" - is-language-code "^2.0.0" - isbinaryfile "^4.0.6" + is-language-code "^3.1.0" + isbinaryfile "^4.0.8" js-yaml "^3.14.0" - json-stable-stringify "^1.0.1" leek "0.0.24" lodash.template "^4.5.0" - markdown-it "^12.0.2" + markdown-it "^12.2.0" markdown-it-terminal "0.2.1" - minimatch "^3.0.4" + minimatch "^5.0.1" morgan "^1.10.0" nopt "^3.0.6" - npm-package-arg "^8.1.0" + npm-package-arg "^8.1.5" p-defer "^3.0.0" portfinder "^1.0.28" promise-map-series "^0.3.0" - promise.hash.helper "^1.0.7" + promise.hash.helper "^1.0.8" quick-temp "^0.1.8" - resolve "^1.19.0" + remove-types "^1.0.0" + resolve "^1.20.0" resolve-package-path "^3.1.0" - sane "^4.1.0" - semver "^7.3.2" + safe-stable-stringify "^2.3.1" + sane "^5.0.1" + semver "^7.3.5" silent-error "^1.1.1" - sort-package-json "^1.48.0" + sort-package-json "^1.55.0" symlink-or-copy "^1.3.1" temp "0.9.4" - testem "^3.2.0" + testem "^3.6.0" tiny-lr "^2.0.0" tree-sync "^2.1.0" - uuid "^8.3.1" + uuid "^8.3.2" walk-sync "^2.2.0" - watch-detector "^1.0.0" - workerpool "^6.0.3" + watch-detector "^1.0.1" + workerpool "^6.2.0" yam "^1.0.0" ember-cli-app-version@^5.0.0: @@ -9528,12 +9146,12 @@ ember-cli-app-version@^5.0.0: ember-cli-babel "^7.23.1" git-repo-info "^2.1.1" -ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.0, ember-cli-babel-plugin-helpers@^1.1.1: +ember-cli-babel-plugin-helpers@^1.0.0, ember-cli-babel-plugin-helpers@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ember-cli-babel-plugin-helpers/-/ember-cli-babel-plugin-helpers-1.1.1.tgz#5016b80cdef37036c4282eef2d863e1d73576879" integrity sha512-sKvOiPNHr5F/60NLd7SFzMpYPte/nnGkq/tMIfXejfKHIhaiIkYFqX8Z9UFTKWLLn+V7NOaby6niNPZUdvKCRw== -ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0: +ember-cli-babel@^6.16.0: version "6.18.0" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-6.18.0.tgz#3f6435fd275172edeff2b634ee7b29ce74318957" integrity sha512-7ceC8joNYxY2wES16iIBlbPSxwKDBhYwC8drU3ZEvuPDMwVv1KzxCNu1fvxyFEBWhwaRNTUxSCsEVoTd9nosGA== @@ -9552,7 +9170,7 @@ ember-cli-babel@^6.16.0, ember-cli-babel@^6.6.0: ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.6, ember-cli-babel@^7.4.0, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.0.0, ember-cli-babel@^7.1.3, ember-cli-babel@^7.10.0, ember-cli-babel@^7.13.0, ember-cli-babel@^7.13.2, ember-cli-babel@^7.17.2, ember-cli-babel@^7.18.0, ember-cli-babel@^7.19.0, ember-cli-babel@^7.20.5, ember-cli-babel@^7.21.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.26.3, ember-cli-babel@^7.26.6, ember-cli-babel@^7.5.0, ember-cli-babel@^7.7.3: version "7.26.6" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.26.6.tgz#322fbbd3baad9dd99e3276ff05bc6faef5e54b39" integrity sha512-040svtfj2RC35j/WMwdWJFusZaXmNoytLAMyBDGLMSlRvznudTxZjGlPV6UupmtTBApy58cEF8Fq4a+COWoEmQ== @@ -9725,7 +9343,7 @@ ember-cli-build-config-editor@0.5.1: dependencies: recast "^0.12.0" -ember-cli-dependency-checker@^3.1.0, ember-cli-dependency-checker@^3.2.0: +ember-cli-dependency-checker@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.2.0.tgz#9202ad9e14d6fda33cffc22a11c343c2a8885330" integrity sha512-dkSmcJ/jY/2ms/S6ph2jXSfOW5VfOpLfg5DFEbra0SaMNgYkNDFF1o0U4OdTsG37L5h/AXWNuVtnOa4TMabz9Q== @@ -9796,8 +9414,7 @@ ember-cli-get-component-path-option@^1.0.0: json-stable-stringify "^1.0.1" strip-bom "^3.0.0" -"ember-cli-htmlbars-6@npm:ember-cli-htmlbars@6", ember-cli-htmlbars@^6.0.0, ember-cli-htmlbars@^6.0.1: - name ember-cli-htmlbars-6 +"ember-cli-htmlbars-6@npm:ember-cli-htmlbars@6", ember-cli-htmlbars@^6.0.0, ember-cli-htmlbars@^6.0.1, ember-cli-htmlbars@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-6.1.0.tgz#97150c2a6f9a981475599d74817df66f5d816c2b" integrity sha512-kT+MA2JsNLk10HpxAjpB5HHtR0WCoxZEUwLsy/BBww5lXmsrf34QzmTw7SL6DabZVxs+YCb9RhU9KTmFygGxCg== @@ -9828,27 +9445,7 @@ ember-cli-htmlbars-inline-precompile@^2.1.0: heimdalljs-logger "^0.1.9" silent-error "^1.1.0" -ember-cli-htmlbars@^4.2.0, ember-cli-htmlbars@^4.3.1: - version "4.5.0" - resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-4.5.0.tgz#d299e4f7eba6f30dc723ee086906cc550beb252e" - integrity sha512-bYJpK1pqFu9AadDAGTw05g2LMNzY8xTCIqQm7dMJmKEoUpLRFbPf4SfHXrktzDh7Q5iggl6Skzf1M0bPlIxARw== - dependencies: - "@ember/edition-utils" "^1.2.0" - babel-plugin-htmlbars-inline-precompile "^3.2.0" - broccoli-debug "^0.6.5" - broccoli-persistent-filter "^2.3.1" - broccoli-plugin "^3.1.0" - common-tags "^1.8.0" - ember-cli-babel-plugin-helpers "^1.1.0" - fs-tree-diff "^2.0.1" - hash-for-dep "^1.5.1" - heimdalljs-logger "^0.1.10" - json-stable-stringify "^1.0.1" - semver "^6.3.0" - strip-bom "^4.0.0" - walk-sync "^2.0.2" - -ember-cli-htmlbars@^5.3.1, ember-cli-htmlbars@^5.3.2, ember-cli-htmlbars@^5.7.1: +ember-cli-htmlbars@^5.3.1, ember-cli-htmlbars@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-5.7.1.tgz#eb5b88c7d9083bc27665fb5447a9b7503b32ce4f" integrity sha512-9laCgL4tSy48orNoQgQKEHp93MaqAs9ZOl7or5q+8iyGGJHW6sVXIYrVv5/5O9HfV6Ts8/pW1rSoaeKyLUE+oA== @@ -9878,14 +9475,6 @@ ember-cli-inject-live-reload@^1.8.2: clean-base-url "^1.0.0" ember-cli-version-checker "^2.1.2" -ember-cli-inject-live-reload@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.0.2.tgz#95edb543b386239d35959e5ea9579f5382976ac7" - integrity sha512-HDD6o/kBHT/kUtazklU0OW23q2jigIN42QmcpFdXUSvJ2/2SYA6yIqSUxWfJgISmtn5gTNZ2KPq1p3dLkhJxSQ== - dependencies: - clean-base-url "^1.0.0" - ember-cli-version-checker "^3.1.3" - ember-cli-inject-live-reload@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.1.0.tgz#ef63c733c133024d5726405a3c247fa12e88a385" @@ -10035,7 +9624,7 @@ ember-cli-string-utils@^1.0.0, ember-cli-string-utils@^1.1.0: resolved "https://registry.yarnpkg.com/ember-cli-string-utils/-/ember-cli-string-utils-1.1.0.tgz#39b677fc2805f55173735376fcef278eaa4452a1" integrity sha1-ObZ3/CgF9VFzc1N2/O8njqpEUqE= -ember-cli-terser@^4.0.1, ember-cli-terser@^4.0.2: +ember-cli-terser@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/ember-cli-terser/-/ember-cli-terser-4.0.2.tgz#c436a9e4159f76a615b051cba0584844652b7dcd" integrity sha512-Ej77K+YhCZImotoi/CU2cfsoZaswoPlGaM5TB3LvjvPDlVPRhxUHO2RsaUVC5lsGeRLRiHCOxVtoJ6GyqexzFA== @@ -10099,26 +9688,6 @@ ember-cli-typescript@^2.0.2: stagehand "^1.0.0" walk-sync "^1.0.0" -ember-cli-typescript@^3.1.3: - version "3.1.4" - resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-3.1.4.tgz#21d6ccd670d1f2e34c9cce68c6e32c442f46806b" - integrity sha512-HJ73kL45OGRmIkPhBNFt31I1SGUvdZND+LCH21+qpq3pPlFpJG8GORyXpP+2ze8PbnITNLzwe5AwUrpyuRswdQ== - dependencies: - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.4.4" - "@babel/plugin-proposal-optional-chaining" "^7.6.0" - "@babel/plugin-transform-typescript" "~7.8.0" - ansi-to-html "^0.6.6" - broccoli-stew "^3.0.0" - debug "^4.0.0" - ember-cli-babel-plugin-helpers "^1.0.0" - execa "^3.0.0" - fs-extra "^8.0.0" - resolve "^1.5.0" - rsvp "^4.8.1" - semver "^6.3.0" - stagehand "^1.0.0" - walk-sync "^2.0.0" - ember-cli-typescript@^4.0.0, ember-cli-typescript@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/ember-cli-typescript/-/ember-cli-typescript-4.1.0.tgz#2ff17be2e6d26b58c88b1764cb73887e7176618b" @@ -10167,7 +9736,7 @@ ember-cli-version-checker@^2.1.0, ember-cli-version-checker@^2.1.2: resolve "^1.3.3" semver "^5.3.0" -ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.2, ember-cli-version-checker@^3.1.3: +ember-cli-version-checker@^3.0.0, ember-cli-version-checker@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-3.1.3.tgz#7c9b4f5ff30fdebcd480b1c06c4de43bb51c522c" integrity sha512-PZNSvpzwWgv68hcXxyjREpj3WWb81A7rtYNQq1lLEgrWIchF8ApKJjWP3NBpHjaatwILkZAV8klair5WFlXAKg== @@ -10290,117 +9859,20 @@ ember-cli@~3.28.0: workerpool "^6.1.4" yam "^1.0.0" -ember-cli@~3.28.4: - version "3.28.4" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.28.4.tgz#784cfeaf5319e409edc3e03e5d99bcfcf18f9e53" - integrity sha512-bRQpZqx1YctDNR7gb5CXfXYkZtieMh4F6v6bZtu+Da8jWTKoGizG1LXsG/Bhs96USPjlZZsErkSBo6qiGjJlcA== - dependencies: - "@babel/core" "^7.13.8" - "@babel/plugin-transform-modules-amd" "^7.12.1" - amd-name-resolver "^1.3.1" - babel-plugin-module-resolver "^4.1.0" - bower-config "^1.4.3" - bower-endpoint-parser "0.2.2" - broccoli "^3.5.1" - broccoli-amd-funnel "^2.0.1" - broccoli-babel-transpiler "^7.8.0" - broccoli-builder "^0.18.14" - broccoli-concat "^4.2.5" - broccoli-config-loader "^1.0.1" - broccoli-config-replace "^1.1.2" - broccoli-debug "^0.6.5" - broccoli-funnel "^3.0.5" - broccoli-funnel-reducer "^1.0.0" - broccoli-merge-trees "^3.0.2" - broccoli-middleware "^2.1.1" - broccoli-slow-trees "^3.1.0" - broccoli-source "^3.0.0" - broccoli-stew "^3.0.0" - calculate-cache-key-for-tree "^2.0.0" - capture-exit "^2.0.0" - chalk "^4.1.0" - ci-info "^2.0.0" - clean-base-url "^1.0.0" - compression "^1.7.4" - configstore "^5.0.1" - console-ui "^3.1.2" - core-object "^3.1.5" - dag-map "^2.0.2" - diff "^5.0.0" - ember-cli-is-package-missing "^1.0.0" - ember-cli-lodash-subset "^2.0.1" - ember-cli-normalize-entity-name "^1.0.0" - ember-cli-preprocess-registry "^3.3.0" - ember-cli-string-utils "^1.1.0" - ember-source-channel-url "^3.0.0" - ensure-posix-path "^1.1.1" - execa "^5.0.0" - exit "^0.1.2" - express "^4.17.1" - filesize "^6.1.0" - find-up "^5.0.0" - find-yarn-workspace-root "^2.0.0" - fixturify-project "^2.1.1" - fs-extra "^9.1.0" - fs-tree-diff "^2.0.1" - get-caller-file "^2.0.5" - git-repo-info "^2.1.1" - glob "^7.1.6" - heimdalljs "^0.2.6" - heimdalljs-fs-monitor "^1.1.0" - heimdalljs-graph "^1.0.0" - heimdalljs-logger "^0.1.10" - http-proxy "^1.18.1" - inflection "^1.12.0" - is-git-url "^1.0.0" - is-language-code "^2.0.0" - isbinaryfile "^4.0.6" - js-yaml "^3.14.0" - json-stable-stringify "^1.0.1" - leek "0.0.24" - lodash.template "^4.5.0" - markdown-it "^12.0.4" - markdown-it-terminal "0.2.1" - minimatch "^3.0.4" - morgan "^1.10.0" - nopt "^3.0.6" - npm-package-arg "^8.1.1" - p-defer "^3.0.0" - portfinder "^1.0.28" - promise-map-series "^0.3.0" - promise.hash.helper "^1.0.7" - quick-temp "^0.1.8" - resolve "^1.20.0" - resolve-package-path "^3.1.0" - sane "^4.1.0" - semver "^7.3.4" - silent-error "^1.1.1" - sort-package-json "^1.49.0" - symlink-or-copy "^1.3.1" - temp "0.9.4" - testem "^3.2.0" - tiny-lr "^2.0.0" - tree-sync "^2.1.0" - uuid "^8.3.2" - walk-sync "^2.2.0" - watch-detector "^1.0.0" - workerpool "^6.1.4" - yam "^1.0.0" - -ember-cli@~4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-4.4.0.tgz#4e9211a71277c8373cc1dce313822b23249e7cad" - integrity sha512-0MulrhbyahIHMUDVaNJHQrlJi7xfN6G8XBTF6URfN65DfUAFBOjUKlVqVciQqE6evbltu388D+uvqhbNtIr7mA== +ember-cli@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-4.6.0.tgz#ff409b99d074414a8944bdadf6db820eaf2dfb7b" + integrity sha512-4OAPHJJt4wARrTzfpfEM49KA1JJjMZ/8mhUncdqJFJG19/mS6yJiAUemnsLhZLnbjicB/gYSQ3rrUv/vxeX3cA== dependencies: - "@babel/core" "^7.17.9" - "@babel/plugin-transform-modules-amd" "^7.16.7" + "@babel/core" "^7.18.6" + "@babel/plugin-transform-modules-amd" "^7.18.6" amd-name-resolver "^1.3.1" babel-plugin-module-resolver "^4.1.0" bower-config "^1.4.3" bower-endpoint-parser "0.2.2" broccoli "^3.5.2" broccoli-amd-funnel "^2.0.1" - broccoli-babel-transpiler "^7.8.0" + broccoli-babel-transpiler "^7.8.1" broccoli-builder "^0.18.14" broccoli-concat "^4.2.5" broccoli-config-loader "^1.0.1" @@ -10416,14 +9888,14 @@ ember-cli@~4.4.0: calculate-cache-key-for-tree "^2.0.0" capture-exit "^2.0.0" chalk "^4.1.2" - ci-info "^3.3.0" + ci-info "^3.3.1" clean-base-url "^1.0.0" compression "^1.7.4" configstore "^5.0.1" console-ui "^3.1.2" core-object "^3.1.5" dag-map "^2.0.2" - diff "^5.0.0" + diff "^5.1.0" ember-cli-is-package-missing "^1.0.0" ember-cli-lodash-subset "^2.0.1" ember-cli-normalize-entity-name "^1.0.0" @@ -10433,12 +9905,12 @@ ember-cli@~4.4.0: ensure-posix-path "^1.1.1" execa "^5.1.1" exit "^0.1.2" - express "^4.17.2" - filesize "^8.0.6" + express "^4.18.1" + filesize "^9.0.11" find-up "^5.0.0" find-yarn-workspace-root "^2.0.0" fixturify-project "^2.1.1" - fs-extra "^9.1.0" + fs-extra "^10.1.0" fs-tree-diff "^2.0.1" get-caller-file "^2.0.5" git-repo-info "^2.1.1" @@ -10451,41 +9923,41 @@ ember-cli@~4.4.0: inflection "^1.13.1" is-git-url "^1.0.0" is-language-code "^3.1.0" - isbinaryfile "^4.0.8" + isbinaryfile "^5.0.0" js-yaml "^3.14.0" leek "0.0.24" lodash.template "^4.5.0" - markdown-it "^12.2.0" + markdown-it "^13.0.1" markdown-it-terminal "0.2.1" - minimatch "^5.0.1" + minimatch "^5.1.0" morgan "^1.10.0" nopt "^3.0.6" - npm-package-arg "^8.1.5" + npm-package-arg "^9.0.2" p-defer "^3.0.0" portfinder "^1.0.28" promise-map-series "^0.3.0" promise.hash.helper "^1.0.8" quick-temp "^0.1.8" remove-types "^1.0.0" - resolve "^1.20.0" - resolve-package-path "^3.1.0" + resolve "^1.22.1" + resolve-package-path "^4.0.3" safe-stable-stringify "^2.3.1" sane "^5.0.1" semver "^7.3.5" silent-error "^1.1.1" - sort-package-json "^1.55.0" + sort-package-json "^1.57.0" symlink-or-copy "^1.3.1" temp "0.9.4" - testem "^3.6.0" + testem "^3.7.0" tiny-lr "^2.0.0" tree-sync "^2.1.0" uuid "^8.3.2" walk-sync "^2.2.0" watch-detector "^1.0.1" - workerpool "^6.2.0" + workerpool "^6.2.1" yam "^1.0.0" -ember-compatibility-helpers@^1.1.1, ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1: +ember-compatibility-helpers@^1.1.2, ember-compatibility-helpers@^1.2.0, ember-compatibility-helpers@^1.2.1: version "1.2.4" resolved "https://registry.yarnpkg.com/ember-compatibility-helpers/-/ember-compatibility-helpers-1.2.4.tgz#70e0fef7048969141626eed6006f3880df612cd1" integrity sha512-qjzQVtogyYJrSs6I4DuyCDwDCaj5JWBVNPoZDZBk8pt7caNoN0eBYRYJdin95QKaNMQODxTLPWaI4UUDQ1YWhg== @@ -10527,48 +9999,8 @@ ember-concurrency@^2.1.2: ember-compatibility-helpers "^1.2.0" ember-destroyable-polyfill "^2.0.2" -"ember-data-3.16@npm:ember-data@~3.16.0": - version "3.16.9" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.16.9.tgz#02789dbf03adb76abb68a6b959e1ec8bfa29674e" - integrity sha512-CAiftBDrrXSsnx7fEJojKE/OG3h/IZxGRMNqL0B0LPLUDWTzPV6LwtQEehUAUcuRCVDODdMW4e71136pG1cFQQ== - dependencies: - "@ember-data/adapter" "3.16.9" - "@ember-data/debug" "3.16.9" - "@ember-data/model" "3.16.9" - "@ember-data/private-build-infra" "3.16.9" - "@ember-data/record-data" "3.16.9" - "@ember-data/serializer" "3.16.9" - "@ember-data/store" "3.16.9" - "@ember/edition-utils" "^1.2.0" - "@ember/ordered-set" "^2.0.3" - "@glimmer/env" "^0.1.7" - broccoli-merge-trees "^3.0.2" - ember-cli-babel "^7.20.5" - ember-cli-typescript "^3.1.3" - ember-inflector "^3.0.1" - -"ember-data-3.24@npm:ember-data@~3.24.0": - version "3.24.2" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.24.2.tgz#34d72b0bc83fce1791bf09a8391425717b9c3f55" - integrity sha512-dfpLagJn09eEcoVqU4NfMs3J+750jJU7rLZA7uFY2/+0M0a4iGhjbm1dVVZQTkrfNiYHXvOOItr1bOT9sMC8Hg== - dependencies: - "@ember-data/adapter" "3.24.2" - "@ember-data/debug" "3.24.2" - "@ember-data/model" "3.24.2" - "@ember-data/private-build-infra" "3.24.2" - "@ember-data/record-data" "3.24.2" - "@ember-data/serializer" "3.24.2" - "@ember-data/store" "3.24.2" - "@ember/edition-utils" "^1.2.0" - "@ember/ordered-set" "^4.0.0" - "@ember/string" "^1.0.0" - "@glimmer/env" "^0.1.7" - broccoli-merge-trees "^4.2.0" - ember-cli-babel "^7.18.0" - ember-cli-typescript "^3.1.3" - ember-inflector "^3.0.1" - -"ember-data-latest@npm:ember-data@4.4.1": +"ember-data-4.4@npm:ember-data@~4.4.0", "ember-data-latest@npm:ember-data@4.4.1", ember-data@~4.4.0: + name ember-data-4.4 version "4.4.1" resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-4.4.1.tgz#86e56d55b49986dff8ae1cc98a740c829e53961e" integrity sha512-Jc8a2OTX3rcnbmVwBjdeOYPSKUHWYRH+RMyDSLN3fpLp/A8pZp1Lkn3b5/ZEi9DmBRirxIDSSSPPZ6RDTMBYlQ== @@ -10609,26 +10041,6 @@ ember-data@~3.28.0: ember-cli-typescript "^4.1.0" ember-inflector "^4.0.1" -ember-data@~3.28.3: - version "3.28.3" - resolved "https://registry.yarnpkg.com/ember-data/-/ember-data-3.28.3.tgz#091690f4497f15150479eec0c42a0f22b216aecd" - integrity sha512-9Ivpzb5RD7sHCG2qFX2MvUL7IT5WojdYqg3BVveNvfLpf/vrrcrsk/UpmHzhtCbT0SJTHUYYBTqIceNLU08vhg== - dependencies: - "@ember-data/adapter" "3.28.3" - "@ember-data/debug" "3.28.3" - "@ember-data/model" "3.28.3" - "@ember-data/private-build-infra" "3.28.3" - "@ember-data/record-data" "3.28.3" - "@ember-data/serializer" "3.28.3" - "@ember-data/store" "3.28.3" - "@ember/edition-utils" "^1.2.0" - "@ember/string" "^3.0.0" - "@glimmer/env" "^0.1.7" - broccoli-merge-trees "^4.2.0" - ember-cli-babel "^7.26.6" - ember-cli-typescript "^4.1.0" - ember-inflector "^4.0.1" - ember-decorators@^6.1.0: version "6.1.1" resolved "https://registry.yarnpkg.com/ember-decorators/-/ember-decorators-6.1.1.tgz#6d770f8999cf5a413a1ee459afd520838c0fc470" @@ -10690,26 +10102,6 @@ ember-export-application-global@^2.0.0, ember-export-application-global@^2.0.1: resolved "https://registry.yarnpkg.com/ember-export-application-global/-/ember-export-application-global-2.0.1.tgz#b120a70e322ab208defc9e2daebe8d0dfc2dcd46" integrity sha512-B7wiurPgsxsSGzJuPFkpBWnaeuCu2PGpG2BjyrfA1VcL7//o+5RSnZqiCEY326y7qmxb2GoCgo0ft03KBU0rRw== -ember-fetch@^8.0.1: - version "8.0.5" - resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-8.0.5.tgz#0ed6257b3158473f662e72831cab223010c5ec50" - integrity sha512-tKwSWZ2l4jKynqUuF8qgwiCfzmnRWDDO2j5l0Lrn4TgZo8YXbdM3DfgheLSZd+aybBFEAtXBgKH0qaTox28LFg== - dependencies: - abortcontroller-polyfill "^1.7.1" - broccoli-concat "^4.2.5" - broccoli-debug "^0.6.5" - broccoli-merge-trees "^4.2.0" - broccoli-rollup "^2.1.1" - broccoli-stew "^3.0.0" - broccoli-templater "^2.0.1" - calculate-cache-key-for-tree "^2.0.0" - caniuse-api "^3.0.0" - ember-cli-babel "^7.23.1" - ember-cli-typescript "^3.1.3" - ember-cli-version-checker "^5.1.2" - node-fetch "^2.6.1" - whatwg-fetch "^3.6.2" - ember-fetch@^8.1.1: version "8.1.1" resolved "https://registry.yarnpkg.com/ember-fetch/-/ember-fetch-8.1.1.tgz#d68d4a58529121a572ec09c39c6a3ad174c83a2e" @@ -10748,13 +10140,6 @@ ember-in-element-polyfill@^1.0.1: ember-cli-htmlbars "^5.3.1" ember-cli-version-checker "^5.1.2" -ember-inflector@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-3.0.1.tgz#04be6df4d7e4000f6d6bd70787cdc995f77be4ab" - integrity sha512-fngrwMsnhkBt51KZgwNwQYxgURwV4lxtoHdjxf7RueGZ5zM7frJLevhHw7pbQNGqXZ3N+MRkhfNOLkdDK9kFdA== - dependencies: - ember-cli-babel "^6.6.0" - ember-inflector@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/ember-inflector/-/ember-inflector-4.0.1.tgz#e0aa9e39119156a278c80bb8cdec8462ecb8e6ab" @@ -10831,13 +10216,6 @@ ember-on-helper@^0.1.0: dependencies: ember-cli-babel "^7.7.3" -ember-page-title@^6.2.1, ember-page-title@^6.2.2: - version "6.2.2" - resolved "https://registry.yarnpkg.com/ember-page-title/-/ember-page-title-6.2.2.tgz#980838c44e96cba1d00f42435d707936af627324" - integrity sha512-YTXA+cylZrh9zO0zwjlaAGReT2MVOxAMnVO1OOygFrs1JBs4D6CKV3tImoilg3AvIXFBeJfFNNUbJOdRd9IGGg== - dependencies: - ember-cli-babel "^7.23.1" - ember-page-title@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/ember-page-title/-/ember-page-title-7.0.0.tgz#11bebd4901d80757646c9006954a13e4fc187421" @@ -10856,7 +10234,7 @@ ember-popper-modifier@^2.0.0: ember-cli-htmlbars "^6.0.0" ember-modifier "^3.1.0" -ember-qunit@^5.1.2, ember-qunit@^5.1.4: +ember-qunit@^5.1.4: version "5.1.4" resolved "https://registry.yarnpkg.com/ember-qunit/-/ember-qunit-5.1.4.tgz#bc69f963a0f5409ce33bee1e4d8146b1407147bf" integrity sha512-L8L3TA5UYdsoJl9If88CU6Liu5Kr76uEpXimeJIyjoRX2kI57YWI2/76uiW7UU0qdYfvcmVazgd+MJGj9aB2JA== @@ -10928,18 +10306,6 @@ ember-resolver@^7.0.0: ember-cli-version-checker "^3.1.3" resolve "^1.14.0" -ember-resolver@^8.0.2: - version "8.0.2" - resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-8.0.2.tgz#8a45a744aaf5391eb52b4cb393b3b06d2db1975c" - integrity sha512-BmCoPT8nf5uv0g2QkhMsrG1Gmu6MtXd6igfhCVzCTMTwZ97SxhJKqoMY62EP/av5HVSWBC/Sa1uGU5cQvX1Aog== - dependencies: - babel-plugin-debug-macros "^0.3.3" - broccoli-funnel "^3.0.3" - broccoli-merge-trees "^4.2.0" - ember-cli-babel "^7.22.1" - ember-cli-version-checker "^5.1.1" - resolve "^1.17.0" - ember-resolver@^8.0.3: version "8.0.3" resolved "https://registry.yarnpkg.com/ember-resolver/-/ember-resolver-8.0.3.tgz#40f243aa58281bf195c695fe84a6b291e204690a" @@ -10966,64 +10332,37 @@ ember-router-generator@^2.0.0: "@babel/traverse" "^7.4.5" recast "^0.18.1" -"ember-source-3.16@npm:ember-source@~3.16.0": - version "3.16.10" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.16.10.tgz#1a81006cb5f2e1b192f47c8ef4c5cd6336691e14" - integrity sha512-Vh+J1RWntKdovnjBJCwTJyrNDbj0UQ95geQRBk3tA6HCinnqRIAMxj1I2yF8aY19w/ljpsUOdog0RSjEm5oLDg== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-object-assign" "^7.8.3" - "@ember/edition-utils" "^1.2.0" - babel-plugin-debug-macros "^0.3.3" - babel-plugin-filter-imports "^3.0.0" - broccoli-concat "^3.7.4" - broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^3.0.2" - chalk "^2.4.2" - ember-cli-babel "^7.18.0" - ember-cli-get-component-path-option "^1.0.0" - ember-cli-is-package-missing "^1.0.0" - ember-cli-normalize-entity-name "^1.0.0" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-version-checker "^3.1.3" - ember-router-generator "^2.0.0" - inflection "^1.12.0" - jquery "^3.4.1" - resolve "^1.11.1" - semver "^6.1.1" - silent-error "^1.1.1" - -"ember-source-3.24@npm:ember-source@~3.24.0": - version "3.24.4" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.24.4.tgz#db3f70cbe4155d48474177f1564627a1fc980f64" - integrity sha512-C5sFGxT743n2PCaTnpvy3GWHdPz+/Ve9qjcSdfRjUvFCSYNhsRkxkpXRvXEU8WoUXY35Pm4vV9RsiorX1M+/Tw== +"ember-source-4.4@npm:ember-source@~4.4.0", ember-source@~4.4.0: + name ember-source-4.4 + version "4.4.2" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-4.4.2.tgz#4a77f865de1b2962aca2d4d29dedcc414752b7d7" + integrity sha512-5mVVNc6X5nyrkJk4Xn+mqG4VTeB0G2DsVJP/J5cxGPOnl7tQk3vFUAKB9hwXsDtT2elLYIxuS1ob0hZ/3XxPrQ== dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-object-assign" "^7.8.3" + "@babel/helper-module-imports" "^7.16.7" + "@babel/plugin-transform-block-scoping" "^7.16.0" "@ember/edition-utils" "^1.2.0" - babel-plugin-debug-macros "^0.3.3" + "@glimmer/vm-babel-plugins" "0.83.1" + babel-plugin-debug-macros "^0.3.4" babel-plugin-filter-imports "^4.0.0" - broccoli-concat "^4.2.4" + broccoli-concat "^4.2.5" broccoli-debug "^0.6.4" - broccoli-funnel "^2.0.2" + broccoli-file-creator "^2.1.1" + broccoli-funnel "^3.0.8" broccoli-merge-trees "^4.2.0" chalk "^4.0.0" - ember-cli-babel "^7.23.0" + ember-auto-import "^2.4.0" + ember-cli-babel "^7.26.11" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" ember-cli-normalize-entity-name "^1.0.0" ember-cli-path-utils "^1.0.0" ember-cli-string-utils "^1.1.0" - ember-cli-version-checker "^5.1.1" + ember-cli-typescript-blueprint-polyfill "^0.1.0" + ember-cli-version-checker "^5.1.2" ember-router-generator "^2.0.0" - inflection "^1.12.0" - jquery "^3.5.0" - resolve "^1.17.0" - semver "^6.1.1" + inflection "^1.13.2" + resolve "^1.22.0" + semver "^7.3.4" silent-error "^1.1.1" "ember-source-beta@npm:ember-source@beta": @@ -11058,20 +10397,13 @@ ember-router-generator@^2.0.0: semver "^7.3.4" silent-error "^1.1.1" -ember-source-channel-url@^1.0.1, ember-source-channel-url@^1.1.0: +ember-source-channel-url@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-1.2.0.tgz#77eb9d0889e5f5370e6c70fcb2696c63ff4a34a1" integrity sha512-CLClcHzVf+8GoFk4176R16nwXoel70bd7DKVAY6D8M0m5fJJhbTrAPYpDA0lY8A60HZo9j/s8A8LWiGh1YmdZg== dependencies: got "^8.0.1" -ember-source-channel-url@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-2.0.1.tgz#18b88f8a00b7746e7a456b3551abb3aea18729cc" - integrity sha512-YlLUHW9gNvxEaohIj5exykoTZb4xj9ZRTcR4J3svv9S8rjAHJUnHmqC5Fd9onCs+NGxHo7KwR/fDwsfadbDu5Q== - dependencies: - got "^8.0.1" - ember-source-channel-url@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-source-channel-url/-/ember-source-channel-url-3.0.0.tgz#bcd5be72c63fa0b8c390b3121783b462063e2a1b" @@ -11142,38 +10474,6 @@ ember-source@~3.26: semver "^7.3.4" silent-error "^1.1.1" -ember-source@~3.28: - version "3.28.9" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.28.9.tgz#804c56b2d71d3cc3decff15a3273bb35d668300a" - integrity sha512-Fy7V3yvj+3oyo2+ke52aaihKMcFnnF7Oj9ixj547yzh2faqRfqouB5ZSiwXFH8rxw22rKaM8DiuQO4JN2Ay6xQ== - dependencies: - "@babel/helper-module-imports" "^7.8.3" - "@babel/plugin-transform-block-scoping" "^7.8.3" - "@babel/plugin-transform-object-assign" "^7.8.3" - "@ember/edition-utils" "^1.2.0" - "@glimmer/vm-babel-plugins" "0.80.3" - babel-plugin-debug-macros "^0.3.4" - babel-plugin-filter-imports "^4.0.0" - broccoli-concat "^4.2.4" - broccoli-debug "^0.6.4" - broccoli-file-creator "^2.1.1" - broccoli-funnel "^2.0.2" - broccoli-merge-trees "^4.2.0" - chalk "^4.0.0" - ember-cli-babel "^7.23.0" - ember-cli-get-component-path-option "^1.0.0" - ember-cli-is-package-missing "^1.0.0" - ember-cli-normalize-entity-name "^1.0.0" - ember-cli-path-utils "^1.0.0" - ember-cli-string-utils "^1.1.0" - ember-cli-version-checker "^5.1.1" - ember-router-generator "^2.0.0" - inflection "^1.12.0" - jquery "^3.5.1" - resolve "^1.17.0" - semver "^7.3.4" - silent-error "^1.1.1" - ember-source@~3.28.0: version "3.28.6" resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-3.28.6.tgz#ed0f200fa6cb76dffabe3cce73417d7b290d6e98" @@ -11206,15 +10506,15 @@ ember-source@~3.28.0: semver "^7.3.4" silent-error "^1.1.1" -ember-source@~4.4.0: - version "4.4.2" - resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-4.4.2.tgz#4a77f865de1b2962aca2d4d29dedcc414752b7d7" - integrity sha512-5mVVNc6X5nyrkJk4Xn+mqG4VTeB0G2DsVJP/J5cxGPOnl7tQk3vFUAKB9hwXsDtT2elLYIxuS1ob0hZ/3XxPrQ== +ember-source@~4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/ember-source/-/ember-source-4.6.0.tgz#14067fb4581804b94249df15667059cef942dece" + integrity sha512-VIxKnb2CkNiVBfWkbNg+BxmyDEPQ+aam303TvXrp4kpykdaJwlck8PunxO5oJjFXJ7VnfJ6Y2ccV6+qerkHTsg== dependencies: "@babel/helper-module-imports" "^7.16.7" "@babel/plugin-transform-block-scoping" "^7.16.0" "@ember/edition-utils" "^1.2.0" - "@glimmer/vm-babel-plugins" "0.83.1" + "@glimmer/vm-babel-plugins" "0.84.2" babel-plugin-debug-macros "^0.3.4" babel-plugin-filter-imports "^4.0.0" broccoli-concat "^4.2.5" @@ -11223,7 +10523,7 @@ ember-source@~4.4.0: broccoli-funnel "^3.0.8" broccoli-merge-trees "^4.2.0" chalk "^4.0.0" - ember-auto-import "^2.4.0" + ember-auto-import "^2.4.1" ember-cli-babel "^7.26.11" ember-cli-get-component-path-option "^1.0.0" ember-cli-is-package-missing "^1.0.0" @@ -11235,7 +10535,7 @@ ember-source@~4.4.0: ember-router-generator "^2.0.0" inflection "^1.13.2" resolve "^1.22.0" - semver "^7.3.4" + semver "^7.3.7" silent-error "^1.1.1" ember-style-modifier@^0.8.0: @@ -11246,42 +10546,6 @@ ember-style-modifier@^0.8.0: ember-cli-babel "^7.26.6" ember-modifier "^3.2.7" -ember-template-lint@^2.18.1: - version "2.21.0" - resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-2.21.0.tgz#7e120abf309a8810eeed26c52377943faf15a95b" - integrity sha512-19QbEqJQdMfcRS7PsQsubflRowEtnkbD0tpYR4q/xq4lodmhU7hhOFvlTQgbxD/jwW5Ur+tkOwH4KFy9JwOyXA== - dependencies: - chalk "^4.0.0" - ember-template-recast "^5.0.1" - find-up "^5.0.0" - fuse.js "^6.4.6" - get-stdin "^8.0.0" - globby "^11.0.2" - is-glob "^4.0.1" - micromatch "^4.0.2" - resolve "^1.20.0" - v8-compile-cache "^2.2.0" - yargs "^16.2.0" - -ember-template-lint@^3.2.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-3.4.2.tgz#d9480957b576b2b7ed02b4bf6bdb7c4b80243581" - integrity sha512-YorsJ5cVmrt0hm2gTVwsKsX/NpYp6X7oa+z7a2iAtwBEz4GyEImUpH3YF7ilXHMFB6d5k96LLKzF73cyBJliuQ== - dependencies: - "@ember-template-lint/todo-utils" "^8.1.0" - chalk "^4.1.1" - date-fns "^2.21.3" - ember-template-recast "^5.0.1" - find-up "^5.0.0" - fuse.js "^6.4.6" - get-stdin "^8.0.0" - globby "^11.0.3" - is-glob "^4.0.1" - micromatch "^4.0.4" - resolve "^1.20.0" - v8-compile-cache "^2.3.0" - yargs "^16.2.0" - ember-template-lint@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-3.6.0.tgz#cb5bf92648f9fcca1cd67e8dd42d431a92ac2255" @@ -11302,7 +10566,29 @@ ember-template-lint@^3.6.0: v8-compile-cache "^2.3.0" yargs "^16.2.0" -ember-template-recast@^5.0.1, ember-template-recast@^5.0.3: +ember-template-lint@^4.10.1: + version "4.12.0" + resolved "https://registry.yarnpkg.com/ember-template-lint/-/ember-template-lint-4.12.0.tgz#0708cf280cbad9419c399e52714d29a72dad2dbf" + integrity sha512-udWWclqxMc7bljIWAnR7wr1/U7R6V0wmSAWGnQ/DqKmNshnVWnzC94wixzvbdrubi/kn1SIEGsyf0bebTkS8rQ== + dependencies: + "@lint-todo/utils" "^13.0.3" + aria-query "^5.0.0" + chalk "^4.1.2" + ci-info "^3.3.2" + date-fns "^2.29.1" + ember-template-recast "^6.1.3" + find-up "^6.3.0" + fuse.js "^6.5.3" + get-stdin "^9.0.0" + globby "^13.1.2" + is-glob "^4.0.3" + language-tags "^1.0.5" + micromatch "^4.0.5" + resolve "^1.22.1" + v8-compile-cache "^2.3.0" + yargs "^17.5.1" + +ember-template-recast@^5.0.3: version "5.0.3" resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-5.0.3.tgz#79df27a70bdce7be17f14db13886afde1e9d02d6" integrity sha512-qsJYQhf29Dk6QMfviXhUPE+byMOs6iRQxUDHgkj8yqjeppvjHaFG96hZi/NAXJTm/M7o3PpfF5YlmeaKtI9UeQ== @@ -11319,6 +10605,23 @@ ember-template-recast@^5.0.1, ember-template-recast@^5.0.3: tmp "^0.2.1" workerpool "^6.1.4" +ember-template-recast@^6.1.3: + version "6.1.3" + resolved "https://registry.yarnpkg.com/ember-template-recast/-/ember-template-recast-6.1.3.tgz#1e9b256ee9da24bcaa7c213088d01f32afc88001" + integrity sha512-45lkfjrWlrMPlOd5rLFeQeePZwAvcS//x1x15kaiQTlqQdYWiYNXwbpWHqV+p9fXY6bEjl6EbyPhG/zBkgh8MA== + dependencies: + "@glimmer/reference" "^0.83.1" + "@glimmer/syntax" "^0.83.1" + "@glimmer/validator" "^0.83.0" + async-promise-queue "^1.0.5" + colors "^1.4.0" + commander "^8.3.0" + globby "^11.0.3" + ora "^5.4.0" + slash "^3.0.0" + tmp "^0.2.1" + workerpool "^6.1.5" + ember-truth-helpers@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ember-truth-helpers/-/ember-truth-helpers-3.0.0.tgz#86766bdca4ac9b86bce3d262dff2aabc4a0ea384" @@ -11326,41 +10629,32 @@ ember-truth-helpers@^3.0.0: dependencies: ember-cli-babel "^7.22.1" -ember-try-config@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-3.0.0.tgz#012d8c90cae9eb624e2b62040bf7e76a1aa58edc" - integrity sha512-pNwHS29O1ACczkrxBKRtDY0TzTb7uPnA5eHEe+4NF6qpLK5FVnL3EtgZ8+yVYtnm1If5mZ07rIubw45vaSek7w== +ember-try-config@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/ember-try-config/-/ember-try-config-4.0.0.tgz#8dbdcc071e7acbcb34750b4ed7faf1ab009766f1" + integrity sha512-jAv7fqYJK7QYYekPc/8Nr7KOqDpv/asqM6F8xcRnbmf9UrD35BkSffY63qUuiD9e0aR5qiMNBIQzH8f65rGDqw== dependencies: - ember-source-channel-url "^1.0.1" - lodash "^4.6.1" - package-json "^4.0.1" - remote-git-tags "^2.0.0" - rsvp "^4.8.1" - semver "^5.5.0" + ember-source-channel-url "^3.0.0" + lodash "^4.17.20" + package-json "^6.5.0" + remote-git-tags "^3.0.0" + semver "^7.3.2" -ember-try@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-1.4.0.tgz#be15965bd1727c27a65a78c4c8392f03763cc565" - integrity sha512-o0SoCH4K8umCf8etphla8FDygKfQGkwY+w47wEuYFVKaESrOZaK63ObnAK7DTKkjJU74Fss2abf+r+pAWpX43g== +ember-try@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ember-try/-/ember-try-2.0.0.tgz#2671c221f5a0335fa2c189d00db7146e2e72a1dd" + integrity sha512-2N7Vic45sbAegA5fhdfDjVbEVS4r+ze+tTQs2/wkY+8fC5yAGHfCM5ocyoTfBN5m7EhznC3AyMsOy4hLPzHFSQ== dependencies: - chalk "^2.4.2" - cli-table3 "^0.5.1" + chalk "^4.1.2" + cli-table3 "^0.6.0" core-object "^3.1.5" - debug "^4.1.1" - ember-try-config "^3.0.0" - execa "^1.0.0" - extend "^3.0.0" - fs-extra "^5.0.0" - promise-map-series "^0.2.1" - resolve "^1.10.1" - rimraf "^2.6.3" - rsvp "^4.7.0" - walk-sync "^1.1.3" - -emit-function@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/emit-function/-/emit-function-0.0.2.tgz#e3a50b3d61be1bf8ca88b924bf713157a5bec124" - integrity sha1-46ULPWG+G/jKiLkkv3ExV6W+wSQ= + debug "^4.3.2" + ember-try-config "^4.0.0" + execa "^4.1.0" + fs-extra "^9.0.1" + resolve "^1.20.0" + rimraf "^3.0.2" + walk-sync "^2.2.0" emittery@^0.10.2: version "0.10.2" @@ -11466,6 +10760,11 @@ entities@~2.1.0: resolved "https://registry.yarnpkg.com/entities/-/entities-2.1.0.tgz#992d3129cf7df6870b96c57858c249a120f8b8b5" integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== +entities@~3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/entities/-/entities-3.0.1.tgz#2b887ca62585e96db3903482d336c1006c3001d4" + integrity sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q== + errlop@^2.0.0: version "2.2.0" resolved "https://registry.yarnpkg.com/errlop/-/errlop-2.2.0.tgz#1ff383f8f917ae328bebb802d6ca69666a42d21b" @@ -11607,16 +10906,16 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@^7.2.0: - version "7.2.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-7.2.0.tgz#f4a4bd2832e810e8cc7c1411ec85b3e85c0c53f9" - integrity sha512-rV4Qu0C3nfJKPOAhFujFxB7RMP+URFyQqqOZW9DMRD7ZDTFyjaIlETU3xzHELt++4ugC0+Jm084HQYkkJe+Ivg== - -eslint-config-prettier@^8.1.0, eslint-config-prettier@^8.3.0: +eslint-config-prettier@^8.3.0: version "8.3.0" resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.3.0.tgz#f7471b20b6fe8a9a9254cc684454202886a2dd7a" integrity sha512-BgZuLUSeKzvlL/VUjx/Yb787VQ26RU3gGjA3iiFvdsp/2bMfVIWUVP7tjxtjS0e+HP409cPlPvNkQloz8C91ew== +eslint-config-prettier@^8.5.0: + version "8.5.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" + integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + eslint-import-resolver-node@^0.3.4: version "0.3.4" resolved "https://registry.yarnpkg.com/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz#85ffa81942c25012d8231096ddf679c03042c717" @@ -11631,28 +10930,15 @@ eslint-module-utils@^2.6.1: integrity sha512-ZXI9B8cxAJIH4nfkhTwcRTEAnrVfobYqwjWy/QMCZ8rHkZHFjf9yO4BzpiF9kCSfNlMG54eKigISHpX0+AaT4A== dependencies: debug "^3.2.7" - pkg-dir "^2.0.0" - -eslint-plugin-ember@^10.2.0, eslint-plugin-ember@^10.3.0: - version "10.5.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-10.5.0.tgz#f2a9e8286dcc026287501bcca4f587af1a7363f5" - integrity sha512-i9+zPBgVKH0Goe6/BCY06+Nzjf72vBzWerdtn5YzAXwVbX+O3fZHXKfTwtNS64o/4F+0HyJ356EisD1PuUQGLA== - dependencies: - "@ember-data/rfc395-data" "^0.0.4" - css-tree "^1.0.0-alpha.39" - ember-rfc176-data "^0.3.15" - eslint-utils "^3.0.0" - lodash.kebabcase "^4.1.1" - requireindex "^1.2.0" - snake-case "^3.0.3" + pkg-dir "^2.0.0" -eslint-plugin-ember@^10.5.4: - version "10.5.7" - resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-10.5.7.tgz#132dcd139fc9e830b707910d1ee4a458b83ab9d4" - integrity sha512-PTnZxbexrvRgEUtiuTaRjcFIIezzNsaJLUkvOoKhmxXTZnWgSPV36PGv5ml0BOallWYAOocefjTgv9SWvlmEdw== +eslint-plugin-ember@^11.0.2: + version "11.0.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-ember/-/eslint-plugin-ember-11.0.5.tgz#b4a1ce7df123e6b2d18c148b9340e62d32bc6b98" + integrity sha512-Hc6aQ6lsdjf9xPrgO0rRY5EjTSIssUEJ4IJZU+idtexead0DX1C5hZDgG9XTKYQIYwRR3JFFC5R4h6KOPCcQRQ== dependencies: "@ember-data/rfc395-data" "^0.0.4" - css-tree "^1.0.0-alpha.39" + css-tree "^2.0.4" ember-rfc176-data "^0.3.15" eslint-utils "^3.0.0" estraverse "^5.2.0" @@ -11730,24 +11016,24 @@ eslint-plugin-node@^9.0.1: resolve "^1.10.1" semver "^6.1.0" -eslint-plugin-prettier@^3.1.4, eslint-plugin-prettier@^3.3.1: +eslint-plugin-prettier@^3.1.4: version "3.4.0" resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.0.tgz#cdbad3bf1dbd2b177e9825737fe63b476a08f0c7" integrity sha512-UDK6rJT6INSfcOo545jiaOwB701uAIt2/dR7WnFQoGCVl1/EMqdANBmwUaqqQ45aXprsTGzSa39LI1PyuRBxxw== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-prettier@^3.4.1: - version "3.4.1" - resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz#e9ddb200efb6f3d05ffe83b1665a716af4a387e5" - integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz#651cbb88b1dab98bfd42f017a12fa6b2d993f94b" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== dependencies: prettier-linter-helpers "^1.0.0" -eslint-plugin-qunit@^6.2.0: - version "6.2.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-qunit/-/eslint-plugin-qunit-6.2.0.tgz#f4efda29da99523e560848d9592c39c0590c308d" - integrity sha512-KvPmkIC2MHpfRxs/r8WUeeGkG6y+3qwSi2AZIBtjcM/YG6Z3k0GxW5Hbu3l7X0TDhljVCeBb9Q5puUkHzl83Mw== +eslint-plugin-qunit@^7.3.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-qunit/-/eslint-plugin-qunit-7.3.1.tgz#cb7c0012199a8db8ff43916d07b0361e999a53b1" + integrity sha512-L1yutkLqCgr70ZmMAbBKPvUOUwhKryZ0RaJKOzw72Bmn8no3JNBL9hhbX2aTvfZqYM/wLXIT0nICZiGrV4xVJw== dependencies: eslint-utils "^3.0.0" requireindex "^1.2.0" @@ -11841,7 +11127,7 @@ eslint@^5.6.0: table "^5.2.3" text-table "^0.2.0" -eslint@^7.14.0, eslint@^7.20.0, eslint@^7.23.0: +eslint@^7.14.0: version "7.28.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.28.0.tgz#435aa17a0b82c13bb2be9d51408b617e49c1e820" integrity sha512-UMfH0VSjP0G4p3EWirscJEQ/cHqnT/iuH6oNZOB94nBjWbMnhGEPxsZm1eyIW0C/9jLI0Fow4W5DXLjEI7mn1g== @@ -12070,22 +11356,6 @@ execa@^2.0.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" -execa@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz#c08ed4550ef65d858fac269ffc8572446f37eb89" - integrity sha512-r9vdGQk4bmCuK1yKQu1KTwcT2zwfWdbdaXfCtAh+5nU/4fSX+JAb7vZGvI5naJrQlvONrEB20jeruESI69530g== - dependencies: - cross-spawn "^7.0.0" - get-stream "^5.0.0" - human-signals "^1.1.1" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.0" - onetime "^5.1.0" - p-finally "^2.0.0" - signal-exit "^3.0.2" - strip-final-newline "^2.0.0" - execa@^4.0.0, execa@^4.0.3, execa@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" @@ -12152,7 +11422,7 @@ expect@^29.0.0, expect@^29.2.1: jest-message-util "^29.2.1" jest-util "^29.2.1" -express@^4.10.7, express@^4.16.4, express@^4.17.1: +express@^4.10.7, express@^4.17.1: version "4.17.1" resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134" integrity sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g== @@ -12188,7 +11458,7 @@ express@^4.10.7, express@^4.16.4, express@^4.17.1: utils-merge "1.0.1" vary "~1.1.2" -express@^4.17.2: +express@^4.17.2, express@^4.18.1: version "4.18.1" resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf" integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q== @@ -12240,11 +11510,6 @@ extend-shallow@^3.0.0, extend-shallow@^3.0.2: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" - integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== - extendable-error@^0.1.5: version "0.1.7" resolved "https://registry.yarnpkg.com/extendable-error/-/extendable-error-0.1.7.tgz#60b9adf206264ac920058a7395685ae4670c2b96" @@ -12309,6 +11574,17 @@ fast-glob@^3.0.3, fast-glob@^3.1.1: micromatch "^4.0.2" picomatch "^2.2.1" +fast-glob@^3.2.11: + version "3.2.11" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9" + integrity sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.2" + merge2 "^1.3.0" + micromatch "^4.0.4" + fast-glob@^3.2.9: version "3.2.12" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" @@ -12421,13 +11697,6 @@ faye-websocket@^0.11.3: dependencies: websocket-driver ">=0.5.1" -faye-websocket@~0.10.0: - version "0.10.0" - resolved "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz#4e492f8d04dfb6f89003507f6edbf2d501e7c6f4" - integrity sha1-TkkvjQTftviQA1B/btvy1QHnxvQ= - dependencies: - websocket-driver ">=0.5.1" - fb-watchman@^2.0.0, fb-watchman@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.1.tgz#fc84fb39d2709cf3ff6d743706157bb5708a8a85" @@ -12473,7 +11742,7 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== -filesize@^4.1.2, filesize@^4.2.0: +filesize@^4.1.2: version "4.2.1" resolved "https://registry.yarnpkg.com/filesize/-/filesize-4.2.1.tgz#ab1cb2069db5d415911c1a13e144c0e743bc89bc" integrity sha512-bP82Hi8VRZX/TUBKfE24iiUGsB/sfm2WUrwTQyAzQrhO3V9IhcBBNBXMyzLY5orACxRyYJ3d2HeRVX+eFv4lmA== @@ -12493,6 +11762,11 @@ filesize@^8.0.6: resolved "https://registry.yarnpkg.com/filesize/-/filesize-8.0.7.tgz#695e70d80f4e47012c132d57a059e80c6b580bd8" integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== +filesize@^9.0.11: + version "9.0.11" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-9.0.11.tgz#4ac3a42c084232dd9b2a1da0107f32d42fcfa5e4" + integrity sha512-gTAiTtI0STpKa5xesyTA9hA3LX4ga8sm2nWRcffEa1L/5vQwb4mj2MdzMkoHoGv4QzfDshQZuYscQSf8c4TKOA== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -12597,6 +11871,14 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + find-yarn-workspace-root2@1.2.16: version "1.2.16" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root2/-/find-yarn-workspace-root2-1.2.16.tgz#60287009dd2f324f59646bdb4b7610a6b301c2a9" @@ -12605,7 +11887,7 @@ find-yarn-workspace-root2@1.2.16: micromatch "^4.0.2" pkg-dir "^4.2.0" -find-yarn-workspace-root@^1.1.0, find-yarn-workspace-root@^1.2.1: +find-yarn-workspace-root@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-1.2.1.tgz#40eb8e6e7c2502ddfaa2577c176f221422f860db" integrity sha512-dVtfb0WuQG+8Ag2uWkbG79hOUzEsRrhBzgfn86g2sJPkzmcpGdghbNTfUKGTxymFrY/tLIodDzLoW9nOJ4FY8Q== @@ -12678,13 +11960,15 @@ fixturify-project@^2.1.0, fixturify-project@^2.1.1: tmp "^0.0.33" type-fest "^0.11.0" -fixturify-project@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-4.0.1.tgz#9c9a29690b0b6f87654a67f9f56972cf97dd6b9a" - integrity sha512-WSWVgJl2bjrxj68HBo35fE/DXwVtVef5J07O/v22J0HbZNb72QVPeyaLyK4vw9M6SNIwkOxg/YAdBQSIETLCUA== +fixturify-project@^5.0.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/fixturify-project/-/fixturify-project-5.2.0.tgz#9774f6fe1823e29940b2214f4bfd87011f51ebf3" + integrity sha512-7H20FpTbA8P586gS/5SuVmKYLBdOs1oPTF7R2If5lhlcmI+ht48p9atbBtD6kOIuRUPrx6W2yLxUCToBl8W22w== dependencies: + bin-links "^3.0.0" + deepmerge "^4.2.2" fixturify "^2.1.1" - resolve-package-path "^3.1.0" + resolve-package-path "^4.0.3" tmp "^0.0.33" type-fest "^2.3.2" walk-sync "^3.0.0" @@ -12852,6 +12136,15 @@ fs-extra@^10.0.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^10.1.0: + version "10.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" + integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-3.0.1.tgz#3794f378c58b342ea7dbbb23095109c4b3b62291" @@ -12916,7 +12209,7 @@ fs-extra@^9.0.1, fs-extra@^9.1.0: jsonfile "^6.0.1" universalify "^2.0.0" -fs-merger@^3.0.1, fs-merger@^3.2.1: +fs-merger@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/fs-merger/-/fs-merger-3.2.1.tgz#a225b11ae530426138294b8fbb19e82e3d4e0b3b" integrity sha512-AN6sX12liy0JE7C2evclwoo0aCG3PFulLjrTLsJpWh/2mM+DinhpSGqYLbHBBbIW1PLRNcFhJG8Axtz8mQW3ug== @@ -13017,6 +12310,11 @@ fuse.js@^6.4.6: resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.4.6.tgz#62f216c110e5aa22486aff20be7896d19a059b79" integrity sha512-/gYxR/0VpXmWSfZOIPS3rWwU8SHgsRTwWuXhyb2O6s7aRuVtHtxCkR33bNYu3wyLyNx/Wpv0vU7FZy8Vj53VNw== +fuse.js@^6.5.3: + version "6.6.2" + resolved "https://registry.yarnpkg.com/fuse.js/-/fuse.js-6.6.2.tgz#fe463fed4b98c0226ac3da2856a415576dc9a111" + integrity sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA== + gauge@^4.0.3: version "4.0.4" resolved "https://registry.yarnpkg.com/gauge/-/gauge-4.0.4.tgz#52ff0652f2bbf607a989793d53b751bef2328dce" @@ -13088,19 +12386,24 @@ get-stdin@^8.0.0: resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-8.0.0.tgz#cbad6a73feb75f6eeb22ba9e01f89aa28aa97a53" integrity sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg== +get-stdin@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-9.0.0.tgz#3983ff82e03d56f1b2ea0d3e60325f39d703a575" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + get-stream@3.0.0, get-stream@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" integrity sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ= -get-stream@^4.0.0: +get-stream@^4.0.0, get-stream@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz#c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5" integrity sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w== dependencies: pump "^3.0.0" -get-stream@^5.0.0: +get-stream@^5.0.0, get-stream@^5.1.0: version "5.2.0" resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3" integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== @@ -13125,61 +12428,16 @@ get-value@^2.0.3, get-value@^2.0.6: resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= -git-fetch-pack@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/git-fetch-pack/-/git-fetch-pack-0.1.1.tgz#7703a32cf0db80f060d2766a34ac00d02cebcdf5" - integrity sha1-dwOjLPDbgPBg0nZqNKwA0CzrzfU= - dependencies: - bops "0.0.3" - emit-function "0.0.2" - git-packed-ref-parse "0.0.0" - through "~2.2.7" - git-hooks-list@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156" integrity sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ== -git-packed-ref-parse@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/git-packed-ref-parse/-/git-packed-ref-parse-0.0.0.tgz#b85046931f3e4a65679b5de54af3a5d3df372646" - integrity sha1-uFBGkx8+SmVnm13lSvOl0983JkY= - dependencies: - line-stream "0.0.0" - through "~2.2.7" - -git-read-pkt-line@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/git-read-pkt-line/-/git-read-pkt-line-0.0.8.tgz#494037854ed57bd90cd55676540d86ab0cb36caa" - integrity sha1-SUA3hU7Ve9kM1VZ2VA2GqwyzbKo= - dependencies: - bops "0.0.3" - through "~2.2.7" - git-repo-info@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/git-repo-info/-/git-repo-info-2.1.1.tgz#220ffed8cbae74ef8a80e3052f2ccb5179aed058" integrity sha512-8aCohiDo4jwjOwma4FmYFd3i97urZulL8XL24nIPxuE+GZnfsAyy/g2Shqx6OjUiFKUXZM+Yy+KHnOmmA3FVcg== -git-transport-protocol@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/git-transport-protocol/-/git-transport-protocol-0.1.0.tgz#99f4dd6389b9161eded74a9e617d6ba5ed0a6c2c" - integrity sha1-mfTdY4m5Fh7e10qeYX1rpe0KbCw= - dependencies: - duplex "~1.0.0" - emit-function "0.0.2" - git-read-pkt-line "0.0.8" - git-write-pkt-line "0.1.0" - through "~2.2.7" - -git-write-pkt-line@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/git-write-pkt-line/-/git-write-pkt-line-0.1.0.tgz#a84c1856c09011908389b2f06f911d91f6394694" - integrity sha1-qEwYVsCQEZCDibLwb5EdkfY5RpQ= - dependencies: - bops "0.0.3" - through "~2.2.7" - glob-parent@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" @@ -13317,7 +12575,7 @@ globby@^11.0.0: merge2 "^1.4.1" slash "^3.0.0" -globby@^11.0.2, globby@^11.0.3: +globby@^11.0.3: version "11.0.3" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.3.tgz#9b1f0cb523e171dd1ad8c7b2a9fb4b644b9593cb" integrity sha512-ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg== @@ -13341,28 +12599,22 @@ globby@^11.0.4: merge2 "^1.3.0" slash "^3.0.0" +globby@^13.1.2: + version "13.1.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" + integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== + dependencies: + dir-glob "^3.0.1" + fast-glob "^3.2.11" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^4.0.0" + globrex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - integrity sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA= - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - got@^8.0.1: version "8.3.2" resolved "https://registry.yarnpkg.com/got/-/got-8.3.2.tgz#1d23f64390e97f776cac52e5b936e5f514d2e937" @@ -13386,6 +12638,23 @@ got@^8.0.1: url-parse-lax "^3.0.0" url-to-options "^1.0.1" +got@^9.6.0: + version "9.6.0" + resolved "https://registry.yarnpkg.com/got/-/got-9.6.0.tgz#edf45e7d67f99545705de1f7bbeeeb121765ed85" + integrity sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q== + dependencies: + "@sindresorhus/is" "^0.14.0" + "@szmarczak/http-timer" "^1.1.2" + cacheable-request "^6.0.0" + decompress-response "^3.3.0" + duplexer3 "^0.1.4" + get-stream "^4.1.0" + lowercase-keys "^1.0.1" + mimic-response "^1.0.1" + p-cancelable "^1.0.0" + to-readable-stream "^1.0.0" + url-parse-lax "^3.0.0" + graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.5, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" @@ -13565,14 +12834,6 @@ hash.js@^1.0.0, hash.js@^1.0.3: inherits "^2.0.3" minimalistic-assert "^1.0.1" -heimdalljs-fs-monitor@^0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-0.2.3.tgz#1aedd4b1c61d86c51f6141fb75c5a3350dc41b15" - integrity sha512-fYAvqSP0CxeOjLrt61B4wux/jqZzdZnS2xfb2oc14NP6BTZ8gtgtR2op6gKFakOR8lm8GN9Xhz1K4A1ZvJ4RQw== - dependencies: - heimdalljs "^0.2.3" - heimdalljs-logger "^0.1.7" - heimdalljs-fs-monitor@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/heimdalljs-fs-monitor/-/heimdalljs-fs-monitor-1.1.0.tgz#0ad5aa1dac0a30d5940a74edeea3d515e70225e4" @@ -13615,13 +12876,6 @@ heimdalljs@^0.2.0, heimdalljs@^0.2.1, heimdalljs@^0.2.3, heimdalljs@^0.2.5, heim dependencies: rsvp "~3.2.1" -heimdalljs@^0.3.0: - version "0.3.3" - resolved "https://registry.yarnpkg.com/heimdalljs/-/heimdalljs-0.3.3.tgz#e92d2c6f77fd46d5bf50b610d28ad31755054d0b" - integrity sha1-6S0sb3f9RtW/ULYQ0orTF1UFTQs= - dependencies: - rsvp "~3.2.1" - helpertypes@^0.0.18: version "0.0.18" resolved "https://registry.yarnpkg.com/helpertypes/-/helpertypes-0.0.18.tgz#fd2bf5d3351cc7d80f7876732361d3adba63e5b4" @@ -13651,7 +12905,7 @@ homedir-polyfill@^1.0.1: dependencies: parse-passwd "^1.0.0" -hosted-git-info@^2.1.4, hosted-git-info@^2.7.1: +hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw== @@ -13663,6 +12917,13 @@ hosted-git-info@^4.0.1: dependencies: lru-cache "^6.0.0" +hosted-git-info@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-5.1.0.tgz#9786123f92ef3627f24abc3f15c20d98ec4a6594" + integrity sha512-Ek+QmMEqZF8XrbFdwoDjSbm7rT23pCgEMOJmz6GPk/s4yH//RQfNPArhIxbguNxROq/+5lNBwCDHMhA903Kx1Q== + dependencies: + lru-cache "^7.5.1" + html-encoding-sniffer@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz#42a6dc4fd33f00281176e8b23759ca4e4fa185f3" @@ -13687,6 +12948,11 @@ http-cache-semantics@3.8.1: resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz#39b0e16add9b605bf0a9ef3d9daaf4843b4cacd2" integrity sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w== +http-cache-semantics@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" + integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + http-errors@1.7.2: version "1.7.2" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz#4f5029cf13239f31036e5b2e55292bcfbcc85c8f" @@ -13753,7 +13019,7 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-proxy@^1.13.1, http-proxy@^1.18.0, http-proxy@^1.18.1: +http-proxy@^1.13.1, http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549" integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== @@ -13865,16 +13131,11 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -infer-owner@^1.0.3: +infer-owner@^1.0.3, infer-owner@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467" integrity sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A== -inflection@1.12.0: - version "1.12.0" - resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.12.0.tgz#a200935656d6f5f6bc4dc7502e1aecb703228416" - integrity sha1-ogCTVlbW9fa8TcdQLhrstwMihBY= - inflection@^1.12.0, inflection@~1.13.1: version "1.13.1" resolved "https://registry.yarnpkg.com/inflection/-/inflection-1.13.1.tgz#c5cadd80888a90cf84c2e96e340d7edc85d5f0cb" @@ -14086,9 +13347,9 @@ is-core-module@^2.2.0, is-core-module@^2.4.0: has "^1.0.3" is-core-module@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.9.0.tgz#e1c34429cd51c6dd9e09e0799e396e27b19a9c69" - integrity sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A== + version "2.10.0" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.10.0.tgz#9012ede0a91c69587e647514e1d5277019e728ed" + integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg== dependencies: has "^1.0.3" @@ -14290,11 +13551,6 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - integrity sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ= - is-reference@^1.1.0: version "1.2.1" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" @@ -14318,7 +13574,7 @@ is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0: +is-retry-allowed@^1.1.0: version "1.2.0" resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4" integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg== @@ -14330,7 +13586,7 @@ is-shared-array-buffer@^1.0.2: dependencies: call-bind "^1.0.2" -is-stream@^1.0.0, is-stream@^1.1.0: +is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" integrity sha1-EtSj3U5o4Lec6428hBc66A2RykQ= @@ -14417,13 +13673,6 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= -isbinaryfile@^3.0.3: - version "3.0.3" - resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-3.0.3.tgz#5d6def3edebf6e8ca8cae9c30183a804b5f8be80" - integrity sha512-8cJBL5tTd2OS0dM4jz07wQd5g0dCCqIhUxPIGtZfa5L6hWlvV5MHTITy/DBAsF+Oe2LS1X3krBUhNwaGUWpWxw== - dependencies: - buffer-alloc "^1.2.0" - isbinaryfile@^4.0.6: version "4.0.8" resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.8.tgz#5d34b94865bd4946633ecc78a026fc76c5b11fcf" @@ -14434,6 +13683,11 @@ isbinaryfile@^4.0.8: resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-4.0.10.tgz#0c5b5e30c2557a2f06febd37b7322946aaee42b3" integrity sha512-iHrqe5shvBUcFbmZq9zOQHBoeOhZJu6RQGrDpBgenUm/Am+F3JM2MgQj+rK3Z601fzrL5gLZWtAPH2OBaSVcyw== +isbinaryfile@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/isbinaryfile/-/isbinaryfile-5.0.0.tgz#034b7e54989dab8986598cbcea41f66663c65234" + integrity sha512-UDdnyGvMajJUWCkib7Cei/dvyJrrvo4FIrsvSFWdPpXSUorzXrDJ0S+X5Q4ZlasfPjca4yqCNNsjbCeiy8FFeg== + isbot@3.4.5: version "3.4.5" resolved "https://registry.yarnpkg.com/isbot/-/isbot-3.4.5.tgz#69554585b725238692d9cc41d9a842c5b37fa33d" @@ -14903,7 +14157,7 @@ jest@^29.2.1: import-local "^3.0.2" jest-cli "^29.2.1" -jquery@^3.4.1, jquery@^3.5.0, jquery@^3.5.1: +jquery@^3.5.0, jquery@^3.5.1: version "3.6.0" resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470" integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw== @@ -15128,6 +14382,13 @@ keyv@3.0.0: dependencies: json-buffer "3.0.0" +keyv@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-3.1.0.tgz#ecc228486f69991e49e9476485a5be1e8fc5c4d9" + integrity sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA== + dependencies: + json-buffer "3.0.0" + kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -15169,6 +14430,18 @@ kleur@^4.1.4: resolved "https://registry.yarnpkg.com/kleur/-/kleur-4.1.5.tgz#95106101795f7050c6c650f350c683febddb1780" integrity sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ== +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.yarnpkg.com/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz#2e1500861b2e457eba7e7ae86877cbd08fa1fd1d" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/language-tags/-/language-tags-1.0.5.tgz#d321dbc4da30ba8bf3024e040fa5c14661f9193a" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + leek@0.0.24: version "0.0.24" resolved "https://registry.yarnpkg.com/leek/-/leek-0.0.24.tgz#e400e57f0e60d8ef2bd4d068dc428a54345dbcda" @@ -15207,13 +14480,6 @@ line-column@^1.0.2: isarray "^1.0.0" isobject "^2.0.0" -line-stream@0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/line-stream/-/line-stream-0.0.0.tgz#888b7cc7951c6a05ce4d696dd1e6b8262371bb45" - integrity sha1-iIt8x5UcagXOTWlt0ea4JiNxu0U= - dependencies: - through "~2.2.0" - lines-and-columns@^1.1.6: version "1.1.6" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz#1c00c743b433cd0a4e80758f7b64a57440d9ff00" @@ -15233,10 +14499,12 @@ linkify-it@^3.0.1: dependencies: uc.micro "^1.0.1" -livereload-js@^2.3.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/livereload-js/-/livereload-js-2.4.0.tgz#447c31cf1ea9ab52fc20db615c5ddf678f78009c" - integrity sha512-XPQH8Z2GDP/Hwz2PCDrh2mth4yFejwA1OZ/81Ti3LgKyhDcEjsSsqFWZojHG0va/duGd+WyosY7eXLDoOyqcPw== +linkify-it@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-4.0.1.tgz#01f1d5e508190d06669982ba31a7d9f56a5751ec" + integrity sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw== + dependencies: + uc.micro "^1.0.1" livereload-js@^3.3.1: version "3.3.2" @@ -15331,6 +14599,13 @@ locate-path@^6.0.0: dependencies: p-locate "^5.0.0" +locate-path@^7.1.0: + version "7.1.1" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.1.1.tgz#8e1e5a75c7343770cef02ff93c4bf1f0aa666374" + integrity sha512-vJXaRMJgRVD3+cUZs3Mncj2mxpt5mP0EmNOsxRSZRMlbqjvxzDEOIUWXGmavo0ZC9+tNZCBLQ66reA11nbpHZg== + dependencies: + p-locate "^6.0.0" + lodash._baseassign@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" @@ -15519,7 +14794,7 @@ lodash.uniqby@^4.7.0: resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= -lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.6.1, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -15558,11 +14833,16 @@ lowercase-keys@1.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" integrity sha1-TjNms55/VFfjXxMkvfb4jQv8cwY= -lowercase-keys@^1.0.0: +lowercase-keys@^1.0.0, lowercase-keys@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f" integrity sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA== +lowercase-keys@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" + integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== + lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" @@ -15585,6 +14865,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +lru-cache@^7.5.1: + version "7.13.2" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.13.2.tgz#bb5d3f1deea3f3a7a35c1c44345566a612e09cd0" + integrity sha512-VJL3nIpA79TodY/ctmZEfhASgqekbT574/c4j3jn4bKXbSCnTTCH/KltZyvL2GlV+tGSMtsWyem8DCX7qKTMBA== + magic-string@^0.24.0: version "0.24.1" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.24.1.tgz#7e38e5f126cae9f15e71f0cf8e450818ca7d5a8f" @@ -15662,17 +14947,6 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -markdown-it-terminal@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.1.0.tgz#545abd8dd01c3d62353bfcea71db580b51d22bd9" - integrity sha1-VFq9jdAcPWI1O/zqcdtYC1HSK9k= - dependencies: - ansi-styles "^3.0.0" - cardinal "^1.0.0" - cli-table "^0.3.1" - lodash.merge "^4.6.0" - markdown-it "^8.3.1" - markdown-it-terminal@0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/markdown-it-terminal/-/markdown-it-terminal-0.2.1.tgz#670fd5ea824a7dcaa1591dcbeef28bf70aff1705" @@ -15684,7 +14958,7 @@ markdown-it-terminal@0.2.1: lodash.merge "^4.6.2" markdown-it "^8.3.1" -markdown-it@^12.0.2, markdown-it@^12.0.4: +markdown-it@^12.0.4: version "12.0.6" resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-12.0.6.tgz#adcc8e5fe020af292ccbdf161fe84f1961516138" integrity sha512-qv3sVLl4lMT96LLtR7xeRJX11OUFjsaD5oVat2/SNBIb21bJXwal2+SklcRbTwGwqWpWH/HRtYavOoJE+seL8w== @@ -15706,21 +14980,21 @@ markdown-it@^12.2.0: mdurl "^1.0.1" uc.micro "^1.0.5" -markdown-it@^8.3.1: - version "8.4.2" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" - integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== +markdown-it@^13.0.1: + version "13.0.1" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-13.0.1.tgz#c6ecc431cacf1a5da531423fc6a42807814af430" + integrity sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q== dependencies: - argparse "^1.0.7" - entities "~1.1.1" - linkify-it "^2.0.0" + argparse "^2.0.1" + entities "~3.0.1" + linkify-it "^4.0.1" mdurl "^1.0.1" uc.micro "^1.0.5" -markdown-it@^9.1.0: - version "9.1.0" - resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-9.1.0.tgz#df9601c168568704d554b1fff9af0c5b561168d9" - integrity sha512-xHKG4C8iPriyfu/jc2hsCC045fKrMQ0VexX2F1FGYiRxDxqMB2aAhF8WauJ3fltn2kb90moGBkiiEdooGIg55w== +markdown-it@^8.3.1: + version "8.4.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" + integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== dependencies: argparse "^1.0.7" entities "~1.1.1" @@ -15776,6 +15050,11 @@ mdn-data@2.0.14: resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.14.tgz#7113fc4281917d63ce29b43446f701e68c25ba50" integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + mdn-data@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-1.2.0.tgz#eadd28b0f2d307cf27e71524609bfb749ebfc0b6" @@ -15913,6 +15192,14 @@ micromatch@^4.0.2, micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" +micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz#f080351c865b0dc562a8462966daa53543c78a4d" @@ -15960,7 +15247,7 @@ mimic-fn@^2.1.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -mimic-response@^1.0.0: +mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ== @@ -16001,7 +15288,7 @@ minimatch@^3.1.1: dependencies: brace-expansion "^1.1.7" -minimatch@^5.0.1: +minimatch@^5.0.1, minimatch@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.0.tgz#1717b464f4971b144f6aabe8f2d0b8e4511e09c7" integrity sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg== @@ -16064,6 +15351,15 @@ mixme@^0.5.1: resolved "https://registry.yarnpkg.com/mixme/-/mixme-0.5.4.tgz#8cb3bd0cd32a513c161bf1ca99d143f0bcf2eff3" integrity sha512-3KYa4m4Vlqx98GPdOHghxSdNtTvcP8E0kkaJ5Dlh+h2DRzF7zpuVVcA8B0QpKd11YJeP9QQ7ASkKzOeu195Wzw== +mkdirp-infer-owner@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316" + integrity sha512-sdqtiFt3lkOaYvTXSRIUjkIdPTcxgv5+fgqYE/5qgwdw12cOrAuzzgzvVExIkH/ul1oeHN3bCLOWSG3XOqbKKw== + dependencies: + chownr "^2.0.0" + infer-owner "^1.0.4" + mkdirp "^1.0.3" + mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: version "0.5.5" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" @@ -16071,7 +15367,7 @@ mkdirp@^0.5.0, mkdirp@^0.5.1, mkdirp@^0.5.3, mkdirp@^0.5.5, mkdirp@~0.5.1: dependencies: minimist "^1.2.5" -mkdirp@^1.0.4: +mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== @@ -16081,7 +15377,7 @@ mktemp@~0.4.0: resolved "https://registry.yarnpkg.com/mktemp/-/mktemp-0.4.0.tgz#6d0515611c8a8c84e484aa2000129b98e981ff0b" integrity sha1-bQUVYRyKjITkhKogABKbmOmB/ws= -morgan@^1.10.0, morgan@^1.9.1: +morgan@^1.10.0: version "1.10.0" resolved "https://registry.yarnpkg.com/morgan/-/morgan-1.10.0.tgz#091778abc1fc47cd3509824653dae1faab6b17d7" integrity sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ== @@ -16341,20 +15637,20 @@ normalize-url@2.0.1: query-string "^5.0.1" sort-keys "^2.0.0" +normalize-url@^4.1.0: + version "4.5.1" + resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-4.5.1.tgz#0dd90cf1288ee1d1313b87081c9a5932ee48518a" + integrity sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA== + npm-git-info@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/npm-git-info/-/npm-git-info-1.0.3.tgz#a933c42ec321e80d3646e0d6e844afe94630e1d5" integrity sha1-qTPELsMh6A02RuDW6ESv6UYw4dU= -npm-package-arg@^6.1.1: - version "6.1.1" - resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-6.1.1.tgz#02168cb0a49a2b75bf988a28698de7b529df5cb7" - integrity sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg== - dependencies: - hosted-git-info "^2.7.1" - osenv "^0.1.5" - semver "^5.6.0" - validate-npm-package-name "^3.0.0" +npm-normalize-package-bin@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/npm-normalize-package-bin/-/npm-normalize-package-bin-2.0.0.tgz#9447a1adaaf89d8ad0abe24c6c84ad614a675fff" + integrity sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ== npm-package-arg@^8.1.0, npm-package-arg@^8.1.1: version "8.1.4" @@ -16374,6 +15670,16 @@ npm-package-arg@^8.1.5: semver "^7.3.4" validate-npm-package-name "^3.0.0" +npm-package-arg@^9.0.2: + version "9.1.0" + resolved "https://registry.yarnpkg.com/npm-package-arg/-/npm-package-arg-9.1.0.tgz#a60e9f1e7c03e4e3e4e994ea87fff8b90b522987" + integrity sha512-4J0GL+u2Nh6OnhvUKXRr2ZMG4lR8qtLp+kv7UiV00Y+nGiSxtttCyIRHCt5L5BNkXQld/RceYItau3MDOoGiBw== + dependencies: + hosted-git-info "^5.0.0" + proc-log "^2.0.1" + semver "^7.3.5" + validate-npm-package-name "^4.0.0" + npm-run-all@^4.1.5: version "4.1.5" resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba" @@ -16644,7 +15950,7 @@ os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.1, os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= -osenv@^0.1.3, osenv@^0.1.5: +osenv@^0.1.3: version "0.1.5" resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.5.tgz#85cdfafaeb28e8677f416e287592b5f3f49ea410" integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g== @@ -16662,6 +15968,11 @@ p-cancelable@^0.4.0: resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-0.4.1.tgz#35f363d67d52081c8d9585e37bcceb7e0bbcb2a0" integrity sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ== +p-cancelable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-1.1.0.tgz#d078d15a3af409220c886f1d9a0ca2e441ab26cc" + integrity sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw== + p-defer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/p-defer/-/p-defer-3.0.0.tgz#d1dceb4ee9b2b604b1d94ffec83760175d4e6f83" @@ -16710,6 +16021,13 @@ p-limit@^3.0.2, p-limit@^3.1.0: dependencies: yocto-queue "^0.1.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" @@ -16738,6 +16056,13 @@ p-locate@^5.0.0: dependencies: p-limit "^3.0.2" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz#310928feef9c9ecc65b68b17693018a665cea175" @@ -16767,15 +16092,15 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -package-json@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - integrity sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0= +package-json@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" + integrity sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ== dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" + got "^9.6.0" + registry-auth-token "^4.0.0" + registry-url "^5.0.0" + semver "^6.2.0" pako@~1.0.5: version "1.0.11" @@ -16877,6 +16202,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@1.0.1, path-is-absolute@^1.0.0, path-is-absolute@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -16957,6 +16287,11 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pidtree@^0.3.0: version "0.3.1" resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a" @@ -17024,7 +16359,7 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" -portfinder@^1.0.25, portfinder@^1.0.28: +portfinder@^1.0.28: version "1.0.28" resolved "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.28.tgz#67c4622852bd5374dd1dd900f779f53462fac778" integrity sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA== @@ -17108,11 +16443,6 @@ prelude-ls@~1.1.2: resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - integrity sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw= - prepend-http@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-2.0.0.tgz#e92434bfa5ea8c19f41cdfd401d741a3c819d897" @@ -17125,16 +16455,11 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@^2.2.1, prettier@^2.3.1: +prettier@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.1.tgz#76903c3f8c4449bc9ac597acefa24dc5ad4cbea6" integrity sha512-p+vNbgpLjif/+D+DwAZAbndtRrR0md0MwfmOVN9N+2RgyACMT+7tfaRnT+WDPkqnuVwleyuBIG2XBxKDme3hPA== -prettier@^2.3.2: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== - prettier@^2.5.1, prettier@^2.6.2, prettier@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" @@ -17166,6 +16491,11 @@ private@^0.1.6, private@^0.1.8, private@~0.1.5: resolved "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz#2381edb3689f7a53d653190060fcf822d2f368ff" integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg== +proc-log@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/proc-log/-/proc-log-2.0.1.tgz#8f3f69a1f608de27878f91f5c688b225391cb685" + integrity sha512-Kcmo2FhfDTXdcbfDH76N7uBYHINxc/8GW7UAVuVP9I+Va3uHSerrnKV6dLooga/gh7GlgzuCCr/eoldnL1muGw== + process-nextick-args@~2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" @@ -17215,7 +16545,7 @@ promise.hash.helper@^1.0.8: resolved "https://registry.yarnpkg.com/promise.hash.helper/-/promise.hash.helper-1.0.8.tgz#8c5fa0570f6f96821f52364fd72292b2c5a114f7" integrity sha512-KYcnXctWUWyVD3W3Ye0ZDuA1N8Szrh85cVCxpG6xYrOk/0CttRtYCmU30nWsUch0NuExQQ63QXvzRE6FLimZmg== -promise.prototype.finally@^3.1.0, promise.prototype.finally@^3.1.2: +promise.prototype.finally@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/promise.prototype.finally/-/promise.prototype.finally-3.1.2.tgz#b8af89160c9c673cefe3b4c4435b53cfd0287067" integrity sha512-A2HuJWl2opDH0EafgdjwEw7HysI8ff/n4lW4QEVBCUXFk9QeGecBWv0Deph0UmLe3tTNYegz8MOjsVuE6SMoJA== @@ -17232,6 +16562,15 @@ prompts@^2.0.1: kleur "^3.0.3" sisteransi "^1.0.5" +proper-lockfile@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/proper-lockfile/-/proper-lockfile-4.1.2.tgz#c8b9de2af6b2f1601067f98e01ac66baa223141f" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + proxy-addr@~2.0.5, proxy-addr@~2.0.7: version "2.0.7" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025" @@ -17446,7 +16785,7 @@ raw-body@~1.1.0: bytes "1" string_decoder "0.10" -rc@^1.0.1, rc@^1.1.6: +rc@^1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" integrity sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw== @@ -17461,6 +16800,11 @@ react-is@^18.0.0: resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== +read-cmd-shim@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/read-cmd-shim/-/read-cmd-shim-3.0.1.tgz#868c235ec59d1de2db69e11aec885bc095aea087" + integrity sha512-kEmDUoYf/CDy8yZbLTmhB1X9kkjf9Q80PCNsDMb7ufrGd6zZSQA1+UyjrO+pZm5K/S4OXCWJeiIt1JA8kAsa6g== + read-pkg-up@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-3.0.0.tgz#3ed496685dba0f8fe118d0691dc51f4a1ff96f07" @@ -17731,20 +17075,19 @@ regexpu-core@^5.1.0: unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.0.0" -registry-auth-token@^3.0.1: - version "3.4.0" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.4.0.tgz#d7446815433f5d5ed6431cd5dca21048f66b397e" - integrity sha512-4LM6Fw8eBQdwMYcES4yTnn2TqIasbXuwDx3um+QRs7S55aMKCBKBxvPXl2RiUjHwuJLTyYfxSpmfSAjQpcuP+A== +registry-auth-token@^4.0.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-4.2.1.tgz#6d7b4006441918972ccd5fedcd41dc322c79b250" + integrity sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw== dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" + rc "^1.2.8" -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - integrity sha1-PU74cPc93h138M+aOBQyRE4XSUI= +registry-url@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-5.1.0.tgz#e98334b50d5434b81136b44ec638d9c2009c5009" + integrity sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw== dependencies: - rc "^1.0.1" + rc "^1.2.8" regjsgen@^0.2.0: version "0.2.0" @@ -17782,13 +17125,10 @@ regjsparser@^0.8.2: dependencies: jsesc "~0.5.0" -remote-git-tags@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/remote-git-tags/-/remote-git-tags-2.0.0.tgz#1152f39cf8b5268ae0e4307636ef741ec341664c" - integrity sha1-EVLznPi1Jorg5DB2Nu90HsNBZkw= - dependencies: - git-fetch-pack "^0.1.1" - git-transport-protocol "^0.1.0" +remote-git-tags@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/remote-git-tags/-/remote-git-tags-3.0.0.tgz#424f8ec2cdea00bb5af1784a49190f25e16983c3" + integrity sha512-C9hAO4eoEsX+OXA4rla66pXZQ+TLQ8T9dttgQj18yuKlPMTVkIkdYXvlMC55IuUsIkV6DpmQYi10JKFLaU+l7w== remove-trailing-separator@^1.0.1: version "1.1.0" @@ -17951,7 +17291,7 @@ resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.1 is-core-module "^2.2.0" path-parse "^1.0.6" -resolve@^1.22.0: +resolve@^1.22.0, resolve@^1.22.1: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -17960,7 +17300,7 @@ resolve@^1.22.0: path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -responselike@1.0.2: +responselike@1.0.2, responselike@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/responselike/-/responselike-1.0.2.tgz#918720ef3b631c5642be068f15ade5a46f4ba1e7" integrity sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec= @@ -17988,6 +17328,11 @@ ret@~0.1.10: resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" integrity sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg== +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b" + integrity sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs= + reusify@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" @@ -18076,15 +17421,6 @@ rollup@^0.57.1: signal-exit "^3.0.2" sourcemap-codec "^1.4.1" -rollup@^1.12.0: - version "1.32.1" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-1.32.1.tgz#4480e52d9d9e2ae4b46ba0d9ddeaf3163940f9c4" - integrity sha512-/2HA0Ec70TvQnXdzynFffkjA6XN+1e2pEv/uKS5Ulca40g2L7KuOE3riasHoNVHOsFD5KKZgDsMk1CP3Tw9s+A== - dependencies: - "@types/estree" "*" - "@types/node" "*" - acorn "^7.1.0" - rollup@^2.50.0, rollup@^2.69.1: version "2.77.2" resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.77.2.tgz#6b6075c55f9cc2040a5912e6e062151e42e2c4e3" @@ -18236,11 +17572,11 @@ saxes@^5.0.1: xmlchars "^2.2.0" scenario-tester@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/scenario-tester/-/scenario-tester-2.0.1.tgz#e53d5a0b5e63ab438021e1db350ad32b3793a09c" - integrity sha512-eOKsyXxYfB5PyNVOLu6vsgT7KuLA87TGZnCkWLY6xKyZfMDmMLmHFfVnYNUQz0AS4XUvQObtVNhmkJwjNsRwtA== + version "2.1.2" + resolved "https://registry.yarnpkg.com/scenario-tester/-/scenario-tester-2.1.2.tgz#2ea585aa5702e5abbe44ef9ae1cdaa2f2aae0659" + integrity sha512-fuwZoavM2v3CyfghIc3gCi36vFDSzIAW1mdgxjUXVQIsoR0aTG657CMnwYAagIN8Aqn1Qt9oJMuqIpggOvybQg== dependencies: - fixturify-project "^4.0.1" + fixturify-project "^5.0.0" fs-extra "^9.1.0" glob "^7.1.6" tmp "^0.2.1" @@ -18292,7 +17628,7 @@ schema-utils@^4.0.0: ajv-formats "^2.1.1" ajv-keywords "^5.0.0" -"semver@2 || 3 || 4 || 5", semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semver@^5.6.0: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -18302,11 +17638,18 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: +semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== +semver@^7.0.0, semver@^7.3.7: + version "7.3.7" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" + integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== + dependencies: + lru-cache "^6.0.0" + semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: version "7.3.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" @@ -18314,13 +17657,6 @@ semver@^7.1.3, semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5: dependencies: lru-cache "^6.0.0" -semver@^7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - semver@^7.3.8: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" @@ -18541,6 +17877,11 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + slice-ansi@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" @@ -18650,7 +17991,7 @@ sort-object-keys@^1.1.3: resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== -sort-package-json@^1.39.1, sort-package-json@^1.48.0, sort-package-json@^1.49.0: +sort-package-json@^1.48.0, sort-package-json@^1.49.0: version "1.50.0" resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.50.0.tgz#19fc109fe23bd157bd03c8e572fa3251a52467d8" integrity sha512-qZpqhMU9XTntebgAgc4hv/D6Fzhh7kFnwvV6a7+q8y8J5JoaDqPYQnvXPf7BBqG95tdE8X6JVNo7/jDzcbdfUg== @@ -18662,7 +18003,7 @@ sort-package-json@^1.39.1, sort-package-json@^1.48.0, sort-package-json@^1.49.0: is-plain-obj "2.1.0" sort-object-keys "^1.1.3" -sort-package-json@^1.55.0: +sort-package-json@^1.55.0, sort-package-json@^1.57.0: version "1.57.0" resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.57.0.tgz#e95fb44af8ede0bb6147e3f39258102d4bb23fc4" integrity sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q== @@ -18684,6 +18025,11 @@ source-map-js@^0.6.2: resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-0.6.2.tgz#0bb5de631b41cfbda6cfba8bd05a80efdfd2385e" integrity sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug== +source-map-js@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + source-map-resolve@^0.5.0: version "0.5.3" resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" @@ -18951,7 +18297,7 @@ string-width@^1.0.1: is-fullwidth-code-point "^1.0.0" strip-ansi "^3.0.0" -"string-width@^1.0.2 || 2", string-width@^2.1.0, string-width@^2.1.1: +"string-width@^1.0.2 || 2", string-width@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== @@ -19288,13 +18634,6 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.0.tgz#5c373d281d9c672848213d0e037d1c4165ab426b" integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== -temp@0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.1.tgz#2d666114fafa26966cd4065996d7ceedd4dd4697" - integrity sha512-WMuOgiua1xb5R56lE0eH6ivpVmg/lq2OHm4+LtT/xtEtPQ+sz6N3bBM6WZ5FvO1lO4IKIOb43qnhoc4qxP5OeA== - dependencies: - rimraf "~2.6.2" - temp@0.9.4: version "0.9.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.9.4.tgz#cd20a8580cb63635d0e4e9d4bd989d44286e7620" @@ -19392,7 +18731,7 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" -testem@^3.0.1, testem@^3.2.0: +testem@^3.2.0: version "3.4.2" resolved "https://registry.yarnpkg.com/testem/-/testem-3.4.2.tgz#0ee3ca4025a9085d47230b0c797c815882d4029e" integrity sha512-5undkzAltqE9fuLHy7c6Co/+pQWt0+03tsLpE97bx6ufymV9lJ1VkSO/tEfvQXk6XpLFcKTmbN/EM0RoK8FIOg== @@ -19427,7 +18766,7 @@ testem@^3.0.1, testem@^3.2.0: tmp "0.0.33" xmldom "^0.6.0" -testem@^3.6.0: +testem@^3.6.0, testem@^3.7.0: version "3.8.0" resolved "https://registry.yarnpkg.com/testem/-/testem-3.8.0.tgz#651aeddbd433ef55ecf7262f0e58b89e1dccb9ac" integrity sha512-WEaFOq2ZGqM3IQji+Q2uXHGdln5upKhSZ1pLYe9W4CttDELAo588frNovk8UQmB+Xg2mDI8G2zmm7qKuWsldtw== @@ -19504,17 +18843,12 @@ through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= -through@~2.2.0, through@~2.2.7: - version "2.2.7" - resolved "https://registry.yarnpkg.com/through/-/through-2.2.7.tgz#6e8e21200191d4eb6a99f6f010df46aa1c6eb2bd" - integrity sha1-bo4hIAGR1OtqmfbwEN9Gqhxusr0= - time-zone@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/time-zone/-/time-zone-1.0.0.tgz#99c5bf55958966af6d06d83bdf3800dc82faec5d" integrity sha1-mcW/VZWJZq9tBtg73zgA3IL67F0= -timed-out@^4.0.0, timed-out@^4.0.1: +timed-out@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" integrity sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8= @@ -19534,18 +18868,6 @@ tiny-glob@0.2.9: globalyzer "0.1.0" globrex "^0.1.2" -tiny-lr@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-1.1.1.tgz#9fa547412f238fedb068ee295af8b682c98b2aab" - integrity sha512-44yhA3tsaRoMOjQQ+5v5mVdqef+kH6Qze9jTpqtVufgYjYt08zyZAwNwwVBj3i1rJMnR52IxOW0LK0vBzgAkuA== - dependencies: - body "^5.1.0" - debug "^3.1.0" - faye-websocket "~0.10.0" - livereload-js "^2.3.0" - object-assign "^4.1.0" - qs "^6.4.0" - tiny-lr@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tiny-lr/-/tiny-lr-2.0.0.tgz#863659d7ce1ed201a117d8197d7f8b9a27bdc085" @@ -19618,6 +18940,11 @@ to-object-path@^0.3.0: dependencies: kind-of "^3.0.2" +to-readable-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" + integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== + to-regex-range@^2.1.0: version "2.1.1" resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" @@ -19643,11 +18970,6 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -to-utf8@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852" - integrity sha1-0Xrqcv8vujm55DYBvns/9y4ImFI= - toidentifier@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553" @@ -19770,7 +19092,7 @@ tslib@^1.8.1, tslib@^1.9.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.3, tslib@^2.1.0: +tslib@^2.0.3: version "2.2.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.2.0.tgz#fb2c475977e35e241311ede2693cee1ec6698f5c" integrity sha512-gS9GVHRU+RGn5KQM2rllAlR3dU6m7AcpJKdtH8gFvQiC4Otgk98XnmMU+nZenHt/+VhnBPWwgrJsyrdcw6i23w== @@ -19780,7 +19102,7 @@ tslib@^2.2.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.3.1.tgz#e8a335add5ceae51aa261d32a490158ef042ef01" integrity sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw== -tslib@^2.4.0: +tslib@^2.3.1, tslib@^2.4.0: version "2.4.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== @@ -20064,16 +19386,16 @@ untildify@^2.1.0: dependencies: os-homedir "^1.0.0" -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - integrity sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c= - upath@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894" integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== +upath@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/upath/-/upath-2.0.1.tgz#50c73dea68d6f6b990f51d279ce6081665d61a8b" + integrity sha512-1uEe95xksV1O0CYKXo8vQvN1JEbtJp7lb7C5U9HMsIp6IVwntkH/oNUzyVNQSd4S1sYk2FpSSW44FqMc8qee5w== + update-browserslist-db@^1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" @@ -20094,13 +19416,6 @@ urix@^0.1.0: resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - integrity sha1-evjzA2Rem9eaJy56FKxovAYJ2nM= - dependencies: - prepend-http "^1.0.1" - url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" @@ -20176,17 +19491,12 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM= -uuid@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -uuid@^8.3.0, uuid@^8.3.1, uuid@^8.3.2: +uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== -v8-compile-cache@^2.0.3, v8-compile-cache@^2.2.0, v8-compile-cache@^2.3.0: +v8-compile-cache@^2.0.3, v8-compile-cache@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== @@ -20215,6 +19525,13 @@ validate-npm-package-name@^3.0.0: dependencies: builtins "^1.0.3" +validate-npm-package-name@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/validate-npm-package-name/-/validate-npm-package-name-4.0.0.tgz#fe8f1c50ac20afdb86f177da85b3600f0ac0d747" + integrity sha512-mzR0L8ZDktZjpX4OB46KT+56MAhl4EIazWP/+G/HPGuvfdaqg4YsCdtOm6U9+LOFyYDoh4dpnpxZRB9MQQns5Q== + dependencies: + builtins "^5.0.0" + validate-peer-dependencies@^1.1.0, validate-peer-dependencies@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/validate-peer-dependencies/-/validate-peer-dependencies-1.2.0.tgz#22aab93c514f4fda457d36c80685e8b1160d2036" @@ -20483,7 +19800,7 @@ webpack@^5, webpack@^5.38.1: watchpack "^2.2.0" webpack-sources "^2.3.0" -webpack@^5.72.1: +webpack@^5.72.1, webpack@^5.74.0: version "5.74.0" resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980" integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA== @@ -20684,7 +20001,7 @@ workerpool@^6.0.0, workerpool@^6.0.3, workerpool@^6.1.4: resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.1.4.tgz#6a972b6df82e38d50248ee2820aa98e2d0ad3090" integrity sha512-jGWPzsUqzkow8HoAvqaPWTUPCrlPJaJ5tY8Iz7n1uCz3tTp6s3CDG0FF1NsX42WNlkRSW6Mr+CDZGnNoSsKa7g== -workerpool@^6.2.0: +workerpool@^6.1.5, workerpool@^6.2.0, workerpool@^6.2.1: version "6.2.1" resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343" integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw== @@ -20732,7 +20049,7 @@ write-file-atomic@^3.0.0: signal-exit "^3.0.2" typedarray-to-buffer "^3.1.5" -write-file-atomic@^4.0.1: +write-file-atomic@^4.0.0, write-file-atomic@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-4.0.2.tgz#a9df01ae5b77858a027fd2e80768ee433555fcfd" integrity sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg== @@ -20894,6 +20211,19 @@ yargs@^17.1.1, yargs@^17.3.1: y18n "^5.0.5" yargs-parser "^21.0.0" +yargs@^17.5.1: + version "17.5.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.5.1.tgz#e109900cab6fcb7fd44b1d8249166feb0b36e58e" + integrity sha512-t6YAJcxDkNX7NFYiVtKvWUz8l+PaKTLiL63mJYWR2GnHq2gjEWISzsLp9wg3aY36dY1j+gfIEL3pIF+XlJJfbA== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.3" + y18n "^5.0.5" + yargs-parser "^21.0.0" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" @@ -20903,3 +20233,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==