diff --git a/lib/colocated-babel-plugin.js b/lib/colocated-babel-plugin.js index 544c2cb0..3b15ee99 100644 --- a/lib/colocated-babel-plugin.js +++ b/lib/colocated-babel-plugin.js @@ -3,7 +3,11 @@ module.exports = function (babel) { let t = babel.types; - function makeSetComponentTemplateMemberExpression() { + function makeSetComponentTemplateExpression(state) { + if (!state.opts.requiresModuleApiPolyfill) { + return state._colocationEnsureImport('setComponentTemplate', '@ember/component'); + } + return t.memberExpression(t.identifier('Ember'), t.identifier('_setComponentTemplate')); } @@ -15,6 +19,53 @@ module.exports = function (babel) { name: 'ember-cli-htmlbars-colocation-template', visitor: { + Program(path, state) { + let allAddedImports = {}; + + state._colocationEnsureImport = (exportName, moduleName) => { + let addedImports = (allAddedImports[moduleName] = allAddedImports[moduleName] || {}); + + if (addedImports[exportName]) return t.identifier(addedImports[exportName].name); + + let importDeclarations = path.get('body').filter((n) => n.type === 'ImportDeclaration'); + + let preexistingImportDeclaration = importDeclarations.find( + (n) => n.get('source').get('value').node === moduleName + ); + + if (preexistingImportDeclaration) { + let importSpecifier = preexistingImportDeclaration + .get('specifiers') + .find(({ node }) => { + return exportName === 'default' + ? t.isImportDefaultSpecifier(node) + : node.imported && node.imported.name === exportName; + }); + + if (importSpecifier) { + addedImports[exportName] = importSpecifier.node.local; + } + } + + if (!addedImports[exportName]) { + let uid = path.scope.generateUidIdentifier( + exportName === 'default' ? moduleName : exportName + ); + addedImports[exportName] = uid; + + let newImportSpecifier = + exportName === 'default' + ? t.importDefaultSpecifier(uid) + : t.importSpecifier(uid, t.identifier(exportName)); + + let newImport = t.importDeclaration([newImportSpecifier], t.stringLiteral(moduleName)); + path.unshiftContainer('body', newImport); + } + + return t.identifier(addedImports[exportName].name); + }; + }, + VariableDeclarator(path, state) { if (path.node.id.name === '__COLOCATED_TEMPLATE__') { state.colocatedTemplateFound = true; @@ -38,7 +89,7 @@ module.exports = function (babel) { state.setComponentTemplateInjected = true; let defaultExportDeclaration = path.node.declaration; - let setComponentTemplateMemberExpression = makeSetComponentTemplateMemberExpression(); + let setComponentTemplateMemberExpression = makeSetComponentTemplateExpression(state); let colocatedTemplateIdentifier = makeColocatedTemplateIdentifier(); if (defaultExportDeclaration.type === 'ClassDeclaration') { @@ -85,7 +136,7 @@ module.exports = function (babel) { state.setComponentTemplateInjected = true; path.parent.body.push( t.expressionStatement( - t.callExpression(makeSetComponentTemplateMemberExpression(), [ + t.callExpression(makeSetComponentTemplateExpression(state), [ makeColocatedTemplateIdentifier(), defaultSpecifier.local, ]) diff --git a/lib/ember-addon-main.js b/lib/ember-addon-main.js index 13bad063..ca7ca7ea 100644 --- a/lib/ember-addon-main.js +++ b/lib/ember-addon-main.js @@ -3,6 +3,7 @@ const path = require('path'); const SilentError = require('silent-error'); const utils = require('./utils'); +const VersionChecker = require('ember-cli-version-checker'); let registryInvocationCounter = 0; @@ -62,7 +63,7 @@ module.exports = { transpileTree(inputTree, htmlbarsOptions) { const TemplateCompiler = require('./template-compiler-plugin'); - return new TemplateCompiler(inputTree, htmlbarsOptions); + return new TemplateCompiler(inputTree, htmlbarsOptions, this._requiresModuleApiPolyfill); }, setupPreprocessorRegistry(type, registry) { @@ -169,6 +170,9 @@ module.exports = { let isProduction = process.env.EMBER_ENV === 'production'; + let checker = new VersionChecker(this.parent).for('ember-source', 'npm'); + this._requiresModuleApiPolyfill = checker.exists() && checker.lt('3.27.0-alpha.1'); + // This is an option intended to be used only be `ember-template-imports`. // DO NOT USE THIS let customModules = @@ -190,7 +194,8 @@ module.exports = { this.projectConfig(), templateCompilerPath, isProduction, - customModules + customModules, + this._requiresModuleApiPolyfill ); babelPlugins.push(htmlbarsInlinePrecompilePlugin); @@ -205,6 +210,7 @@ module.exports = { projectConfig: this.projectConfig(), templateCompilerPath, modules: customModules, + requiresModuleApiPolyfill: this._requiresModuleApiPolyfill, }); babelPlugins.push(htmlBarsPlugin); @@ -212,7 +218,10 @@ module.exports = { } if (this._shouldColocateTemplates() && !utils.isColocatedBabelPluginRegistered(babelPlugins)) { - babelPlugins.push(require.resolve('./colocated-babel-plugin')); + babelPlugins.push([ + require.resolve('./colocated-babel-plugin'), + { requiresModuleApiPolyfill: this._requiresModuleApiPolyfill }, + ]); } }, diff --git a/lib/template-compiler-plugin.js b/lib/template-compiler-plugin.js index 2847706d..4f9a58c5 100644 --- a/lib/template-compiler-plugin.js +++ b/lib/template-compiler-plugin.js @@ -24,7 +24,7 @@ function rethrowBuildError(error) { } class TemplateCompiler extends Filter { - constructor(inputTree, _options) { + constructor(inputTree, _options, requiresModuleApiPolyfill = true) { let options = _options || {}; if (!('persist' in options)) { @@ -35,6 +35,7 @@ class TemplateCompiler extends Filter { this.options = options; this.inputTree = inputTree; + this.requiresModuleApiPolyfill = requiresModuleApiPolyfill; // TODO: do we need this? this.precompile = this.options.templateCompiler.precompile; @@ -51,6 +52,7 @@ class TemplateCompiler extends Filter { processString(string, relativePath) { let srcDir = this.inputPaths[0]; let srcName = path.join(srcDir, relativePath); + try { // we have to reverse these for reasons that are a bit bonkers. the initial // version of this system used `registeredPlugin` from @@ -63,25 +65,23 @@ class TemplateCompiler extends Filter { // sooooooo...... we are forced to maintain that **absolutely bonkers** ordering let astPlugins = this.options.plugins ? [...this.options.plugins.ast].reverse() : []; - let result = - 'export default ' + - utils.template(this.options.templateCompiler, stripBom(string), { - contents: string, - isProduction: this.options.isProduction, - moduleName: relativePath, - parseOptions: { - srcName: srcName, - }, - - // intentionally not using `plugins: this.options.plugins` here - // because if we do, Ember will mutate the shared plugins object (adding - // all of the built in AST transforms into plugins.ast, which breaks - // persistent caching) - plugins: { - ast: astPlugins, - }, - }) + - ';'; + let precompiled = this.options.templateCompiler.precompile(stripBom(string), { + contents: string, + isProduction: this.options.isProduction, + moduleName: relativePath, + parseOptions: { + srcName: srcName, + }, + + // intentionally not using `plugins: this.options.plugins` here + // because if we do, Ember will mutate the shared plugins object (adding + // all of the built in AST transforms into plugins.ast, which breaks + // persistent caching) + plugins: { + ast: astPlugins, + }, + }); + if (this.options.dependencyInvalidation) { let plugins = pluginsWithDependencies(this.options.plugins.ast); let dependencies = []; @@ -91,7 +91,12 @@ class TemplateCompiler extends Filter { } this.dependencies.setDependencies(relativePath, dependencies); } - return result; + + if (this.requiresModuleApiPolyfill) { + return `export default Ember.HTMLBars.template(${precompiled});`; + } else { + return `import { createTemplateFactory } from '@ember/template-factory';\n\nexport default createTemplateFactory(${precompiled});`; + } } catch (error) { rethrowBuildError(error); } @@ -106,6 +111,8 @@ class TemplateCompiler extends Filter { } } + strippedOptions._requiresModuleApiPolyfill = this.requiresModuleApiPolyfill; + return strippedOptions; } diff --git a/lib/utils.js b/lib/utils.js index dc1bcf73..b62cc71f 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -50,9 +50,11 @@ function isInlinePrecompileBabelPluginRegistered(plugins) { } function isColocatedBabelPluginRegistered(plugins) { - return plugins.some( - (plugin) => typeof plugin === 'string' && plugin === require.resolve('./colocated-babel-plugin') - ); + return plugins.some((plugin) => { + let path = Array.isArray(plugin) ? plugin[0] : plugin; + + return typeof path === 'string' && path === require.resolve('./colocated-babel-plugin'); + }); } function buildParalleizedBabelPlugin( @@ -60,7 +62,8 @@ function buildParalleizedBabelPlugin( projectConfig, templateCompilerPath, isProduction, - customModules + customModules, + requiresModuleApiPolyfill ) { let parallelBabelInfo = { requireFile: require.resolve('./require-from-worker'), @@ -71,6 +74,7 @@ function buildParalleizedBabelPlugin( projectConfig, parallelConfigs: pluginInfo.parallelConfigs, modules: Object.assign({}, customModules, INLINE_PRECOMPILE_MODULES), + requiresModuleApiPolyfill, }, }; @@ -199,12 +203,6 @@ function initializeEmberENV(templateCompiler, EmberENV) { } } -function template(templateCompiler, string, options) { - let precompiled = templateCompiler.precompile(string, options); - - return 'Ember.HTMLBars.template(' + precompiled + ')'; -} - function setup(pluginInfo, options) { let projectConfig = options.projectConfig || {}; let templateCompilerPath = options.templateCompilerPath; @@ -230,18 +228,9 @@ function setup(pluginInfo, options) { plugins: { ast: astPlugins, }, - }; - for (let option in _options) { - if (option === 'scope') { - // The template compiler expects this option to be named `locals`, but - // we want users to pass it in as `scope`. In the future, we should update - // the template compiler to accept scope as well and remove this. - options.locals = _options.scope; - } else { - options[option] = _options[option]; - } - } + ..._options, + }; return templatePrecompile(template, options); }; @@ -261,7 +250,7 @@ function setup(pluginInfo, options) { { precompile, isProduction: options.isProduction, - ensureModuleApiPolyfill: true, + ensureModuleApiPolyfill: options.requiresModuleApiPolyfill, modules: Object.assign({}, options.modules, INLINE_PRECOMPILE_MODULES), }, 'ember-cli-htmlbars:inline-precompile', @@ -355,7 +344,6 @@ function setupPlugins(wrappers) { module.exports = { buildOptions, initializeEmberENV, - template, setup, makeCacheKey, setupPlugins, diff --git a/node-tests/addon-test.js b/node-tests/addon-test.js index 3b81566a..de4b9a4e 100644 --- a/node-tests/addon-test.js +++ b/node-tests/addon-test.js @@ -34,6 +34,7 @@ describe('ember-cli-htmlbars addon', function () { project, parent: project, ui: this.ui, + _requiresModuleApiPolyfill: true, }); project.addons.push(this.addon); diff --git a/node-tests/colocated-babel-plugin-test.js b/node-tests/colocated-babel-plugin-test.js index 01b8ce78..764cf846 100644 --- a/node-tests/colocated-babel-plugin-test.js +++ b/node-tests/colocated-babel-plugin-test.js @@ -22,161 +22,350 @@ const RuntimePlugin = [ describe('ColocatedBabelPlugin', function () { this.slow(500); - it('can be used with decorators', function () { - let { code } = babel.transformSync( - stripIndent` - import Component from '@glimmer/component'; - const __COLOCATED_TEMPLATE__ = 'ok'; - - export default class MyComponent extends Component { - @tracked data = null; - }; - `, - { plugins: [RuntimePlugin, ColocatedBabelPlugin, DecoratorsPlugin, ClassPropertiesPlugin] } - ); - - assert.strictEqual( - code, - stripIndent` - import _initializerDefineProperty from "@babel/runtime/helpers/esm/initializerDefineProperty"; - import _applyDecoratedDescriptor from "@babel/runtime/helpers/esm/applyDecoratedDescriptor"; - import _initializerWarningHelper from "@babel/runtime/helpers/esm/initializerWarningHelper"; - - var _class, _descriptor, _temp; - - import Component from '@glimmer/component'; - const __COLOCATED_TEMPLATE__ = 'ok'; - let MyComponent = (_class = (_temp = class MyComponent extends Component { - constructor(...args) { - super(...args); - - _initializerDefineProperty(this, "data", _descriptor, this); - } - - }, _temp), (_descriptor = _applyDecoratedDescriptor(_class.prototype, "data", [tracked], { - configurable: true, - enumerable: true, - writable: true, - initializer: function () { - return null; - } - })), _class); - export { MyComponent as default }; - ; - - Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); - ` - ); - }); + describe('requiresModuleApiPolyfill: true', function () { + const ColocatedBabelPluginOptions = [ColocatedBabelPlugin, { requiresModuleApiPolyfill: true }]; - it('can be used with TypeScript merged declarations', function () { - let { code } = babel.transformSync( - stripIndent` - import Component from 'somewhere'; - const __COLOCATED_TEMPLATE__ = 'ok'; - type MyArgs = { required: string; optional?: number }; - - export default interface MyComponent extends MyArgs {} - export default class MyComponent extends Component {} - `, - { plugins: [ColocatedBabelPlugin, TypeScriptPlugin] } - ); - - assert.strictEqual( - code, - stripIndent` - import Component from 'somewhere'; - const __COLOCATED_TEMPLATE__ = 'ok'; - export default class MyComponent extends Component {} - - Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); - ` - ); - }); + it('can be used with decorators', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from '@glimmer/component'; + const __COLOCATED_TEMPLATE__ = 'ok'; - it('sets the template for non-class default exports', function () { - let { code } = babel.transformSync( - stripIndent` - import MyComponent from 'other-module'; - const __COLOCATED_TEMPLATE__ = 'ok'; - export default MyComponent; - `, - { plugins: [ColocatedBabelPlugin] } - ); - - assert.strictEqual( - code, - stripIndent` - import MyComponent from 'other-module'; - const __COLOCATED_TEMPLATE__ = 'ok'; - export default Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); - ` - ); - }); + export default class MyComponent extends Component { + @tracked data = null; + }; + `, + { + plugins: [ + RuntimePlugin, + ColocatedBabelPluginOptions, + DecoratorsPlugin, + ClassPropertiesPlugin, + ], + } + ); - it('sets the template for named class default exports', function () { - let { code } = babel.transformSync( - stripIndent` - import Component from 'somewhere'; - const __COLOCATED_TEMPLATE__ = 'ok'; - export default class MyComponent extends Component {} - `, - { plugins: [ColocatedBabelPlugin] } - ); - - assert.strictEqual( - code, - stripIndent` - import Component from 'somewhere'; - const __COLOCATED_TEMPLATE__ = 'ok'; - export default class MyComponent extends Component {} - - Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); - ` - ); - }); + assert.strictEqual( + code, + stripIndent` + import _initializerDefineProperty from "@babel/runtime/helpers/esm/initializerDefineProperty"; + import _applyDecoratedDescriptor from "@babel/runtime/helpers/esm/applyDecoratedDescriptor"; + import _initializerWarningHelper from "@babel/runtime/helpers/esm/initializerWarningHelper"; + + var _class, _descriptor, _temp; + + import Component from '@glimmer/component'; + const __COLOCATED_TEMPLATE__ = 'ok'; + let MyComponent = (_class = (_temp = class MyComponent extends Component { + constructor(...args) { + super(...args); + + _initializerDefineProperty(this, "data", _descriptor, this); + } + + }, _temp), (_descriptor = _applyDecoratedDescriptor(_class.prototype, "data", [tracked], { + configurable: true, + enumerable: true, + writable: true, + initializer: function () { + return null; + } + })), _class); + export { MyComponent as default }; + ; + + Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); + + it('can be used with TypeScript merged declarations', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + type MyArgs = { required: string; optional?: number }; + + export default interface MyComponent extends MyArgs {} + export default class MyComponent extends Component {} + `, + { plugins: [ColocatedBabelPluginOptions, TypeScriptPlugin] } + ); + + assert.strictEqual( + code, + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default class MyComponent extends Component {} + + Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); + + it('sets the template for non-class default exports', function () { + let { code } = babel.transformSync( + stripIndent` + import MyComponent from 'other-module'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default MyComponent; + `, + { plugins: [ColocatedBabelPluginOptions] } + ); + + assert.strictEqual( + code, + stripIndent` + import MyComponent from 'other-module'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); + + it('sets the template for named class default exports', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default class MyComponent extends Component {} + `, + { plugins: [ColocatedBabelPluginOptions] } + ); + + assert.strictEqual( + code, + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default class MyComponent extends Component {} + + Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); + + it('sets the template for anonymous class default exports', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default class extends Component {} + `, + { plugins: [ColocatedBabelPluginOptions] } + ); + + assert.strictEqual( + code, + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, class extends Component {}); + ` + ); + }); + + it('sets the template for identifier `as default` exports', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + const MyComponent = class extends Component {}; + export { MyComponent as default }; + `, + { plugins: [ColocatedBabelPluginOptions] } + ); + + assert.strictEqual( + code, + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + const MyComponent = class extends Component {}; + export { MyComponent as default }; - it('sets the template for anonymous class default exports', function () { - let { code } = babel.transformSync( - stripIndent` - import Component from 'somewhere'; - const __COLOCATED_TEMPLATE__ = 'ok'; - export default class extends Component {} - `, - { plugins: [ColocatedBabelPlugin] } - ); - - assert.strictEqual( - code, - stripIndent` - import Component from 'somewhere'; - const __COLOCATED_TEMPLATE__ = 'ok'; - export default Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, class extends Component {}); - ` - ); + Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); }); - it('sets the template for identifier `as default` exports', function () { - let { code } = babel.transformSync( - stripIndent` - import Component from 'somewhere'; - const __COLOCATED_TEMPLATE__ = 'ok'; - const MyComponent = class extends Component {}; - export { MyComponent as default }; - `, - { plugins: [ColocatedBabelPlugin] } - ); - - assert.strictEqual( - code, - stripIndent` - import Component from 'somewhere'; - const __COLOCATED_TEMPLATE__ = 'ok'; - const MyComponent = class extends Component {}; - export { MyComponent as default }; - - Ember._setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); - ` - ); + describe('requiresModuleApiPolyfill: false', function () { + const ColocatedBabelPluginOptions = [ + ColocatedBabelPlugin, + { requiresModuleApiPolyfill: false }, + ]; + + it('can be used with decorators', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from '@glimmer/component'; + const __COLOCATED_TEMPLATE__ = 'ok'; + + export default class MyComponent extends Component { + @tracked data = null; + }; + `, + { + plugins: [ + RuntimePlugin, + ColocatedBabelPluginOptions, + DecoratorsPlugin, + ClassPropertiesPlugin, + ], + } + ); + + assert.strictEqual( + code, + stripIndent` + import _initializerDefineProperty from "@babel/runtime/helpers/esm/initializerDefineProperty"; + import _applyDecoratedDescriptor from "@babel/runtime/helpers/esm/applyDecoratedDescriptor"; + import _initializerWarningHelper from "@babel/runtime/helpers/esm/initializerWarningHelper"; + + var _class, _descriptor, _temp; + + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import Component from '@glimmer/component'; + const __COLOCATED_TEMPLATE__ = 'ok'; + let MyComponent = (_class = (_temp = class MyComponent extends Component { + constructor(...args) { + super(...args); + + _initializerDefineProperty(this, "data", _descriptor, this); + } + + }, _temp), (_descriptor = _applyDecoratedDescriptor(_class.prototype, "data", [tracked], { + configurable: true, + enumerable: true, + writable: true, + initializer: function () { + return null; + } + })), _class); + export { MyComponent as default }; + ; + + _setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); + + it('can be used with TypeScript merged declarations', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + type MyArgs = { required: string; optional?: number }; + + export default interface MyComponent extends MyArgs {} + export default class MyComponent extends Component {} + `, + { plugins: [ColocatedBabelPluginOptions, TypeScriptPlugin] } + ); + + assert.strictEqual( + code, + stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default class MyComponent extends Component {} + + _setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); + + it('sets the template for non-class default exports', function () { + let { code } = babel.transformSync( + stripIndent` + import MyComponent from 'other-module'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default MyComponent; + `, + { plugins: [ColocatedBabelPluginOptions] } + ); + + assert.strictEqual( + code, + stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import MyComponent from 'other-module'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default _setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); + + it('sets the template for named class default exports', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default class MyComponent extends Component {} + `, + { plugins: [ColocatedBabelPluginOptions] } + ); + + assert.strictEqual( + code, + stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default class MyComponent extends Component {} + + _setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); + + it('sets the template for anonymous class default exports', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default class extends Component {} + `, + { plugins: [ColocatedBabelPluginOptions] } + ); + + assert.strictEqual( + code, + stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + export default _setComponentTemplate(__COLOCATED_TEMPLATE__, class extends Component {}); + ` + ); + }); + + it('sets the template for identifier `as default` exports', function () { + let { code } = babel.transformSync( + stripIndent` + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + const MyComponent = class extends Component {}; + export { MyComponent as default }; + `, + { plugins: [ColocatedBabelPluginOptions] } + ); + + assert.strictEqual( + code, + stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import Component from 'somewhere'; + const __COLOCATED_TEMPLATE__ = 'ok'; + const MyComponent = class extends Component {}; + export { MyComponent as default }; + + _setComponentTemplate(__COLOCATED_TEMPLATE__, MyComponent); + ` + ); + }); }); }); diff --git a/node-tests/colocated-test.js b/node-tests/colocated-test.js index 18949b3b..bdc4b4e8 100644 --- a/node-tests/colocated-test.js +++ b/node-tests/colocated-test.js @@ -32,7 +32,7 @@ class BabelTranspiler extends BroccoliPersistentFilter { } } -describe('Colocation - Broccoli + Babel Integration', function () { +describe('Colocation - Broccoli + Babel Integration (modules API: true)', function () { this.timeout(10000); let input, output; @@ -57,7 +57,7 @@ describe('Colocation - Broccoli + Babel Integration', function () { }); let babelTree = new BabelTranspiler(colocatedTree, { - plugins: [...plugins, ColocatedBabelPlugin], + plugins: [...plugins, [ColocatedBabelPlugin, { requiresModuleApiPolyfill: true }]], }); output = _createBuilder(babelTree); @@ -416,3 +416,393 @@ describe('Colocation - Broccoli + Babel Integration', function () { it('does not break class decorator usage'); }); + +describe('Colocation - Broccoli + Babel Integration (modules API: false)', function () { + this.timeout(10000); + + let input, output; + + beforeEach(async function () { + input = await createTempDir(); + }); + + afterEach(async function () { + await input.dispose(); + + if (output) { + await output.dispose(); + } + }); + + function createBuilder(plugins = []) { + let colocatedTree = new ColocatedTemplateCompiler(input.path(), { + precompile(template) { + return JSON.stringify({ template }); + }, + }); + + let babelTree = new BabelTranspiler(colocatedTree, { + plugins: [...plugins, [ColocatedBabelPlugin, { requiresModuleApiPolyfill: false }]], + }); + + output = _createBuilder(babelTree); + + return output; + } + + it('works for template only component', async function () { + input.write({ + 'app-name-here': { + components: { + 'foo.hbs': `{{yield}}`, + }, + templates: { + 'application.hbs': `{{outlet}}`, + }, + }, + }); + + createBuilder(); + + await output.build(); + + assert.deepStrictEqual(output.read(), { + 'app-name-here': { + components: { + 'foo.js': stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import { hbs } from 'ember-cli-htmlbars'; + + const __COLOCATED_TEMPLATE__ = hbs("{{yield}}", { + "contents": "{{yield}}", + "moduleName": "app-name-here/components/foo.hbs", + "parseOptions": { + "srcName": "app-name-here/components/foo.hbs" + } + }); + + import templateOnly from '@ember/component/template-only'; + export default _setComponentTemplate(__COLOCATED_TEMPLATE__, templateOnly()); + `, + }, + templates: { + 'application.hbs': '{{outlet}}', + }, + }, + }); + }); + + it('works for component with template and class', async function () { + input.write({ + 'app-name-here': { + components: { + 'foo.hbs': `{{yield}}`, + 'foo.js': stripIndent` + import Component from '@glimmer/component'; + + export default class FooComponent extends Component {} + `, + }, + templates: { + 'application.hbs': `{{outlet}}`, + }, + }, + }); + + createBuilder(); + + await output.build(); + + assert.deepStrictEqual(output.read(), { + 'app-name-here': { + components: { + 'foo.js': stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import { hbs } from 'ember-cli-htmlbars'; + + const __COLOCATED_TEMPLATE__ = hbs("{{yield}}", { + "contents": "{{yield}}", + "moduleName": "app-name-here/components/foo.hbs", + "parseOptions": { + "srcName": "app-name-here/components/foo.hbs" + } + }); + + import Component from '@glimmer/component'; + export default class FooComponent extends Component {} + + _setComponentTemplate(__COLOCATED_TEMPLATE__, FooComponent); + `, + }, + templates: { + 'application.hbs': '{{outlet}}', + }, + }, + }); + }); + + it('works for typescript component class with template', async function () { + input.write({ + 'app-name-here': { + components: { + 'foo.hbs': `{{yield}}`, + 'foo.ts': stripIndent` + import Component from '@glimmer/component'; + + export default class FooComponent extends Component {} + `, + }, + templates: { + 'application.hbs': `{{outlet}}`, + }, + }, + }); + + createBuilder([TypescriptTransform]); + + await output.build(); + + assert.deepStrictEqual(output.read(), { + 'app-name-here': { + components: { + 'foo.js': stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import { hbs } from 'ember-cli-htmlbars'; + + const __COLOCATED_TEMPLATE__ = hbs("{{yield}}", { + "contents": "{{yield}}", + "moduleName": "app-name-here/components/foo.hbs", + "parseOptions": { + "srcName": "app-name-here/components/foo.hbs" + } + }); + + import Component from '@glimmer/component'; + export default class FooComponent extends Component {} + + _setComponentTemplate(__COLOCATED_TEMPLATE__, FooComponent); + `, + }, + templates: { + 'application.hbs': '{{outlet}}', + }, + }, + }); + }); + + it('works for scoped addon using template only component', async function () { + input.write({ + '@scope-name': { + 'addon-name-here': { + components: { + 'foo.hbs': `{{yield}}`, + }, + templates: { + 'application.hbs': `{{outlet}}`, + }, + }, + }, + }); + + createBuilder(); + + await output.build(); + + assert.deepStrictEqual(output.read(), { + '@scope-name': { + 'addon-name-here': { + components: { + 'foo.js': stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import { hbs } from 'ember-cli-htmlbars'; + + const __COLOCATED_TEMPLATE__ = hbs("{{yield}}", { + "contents": "{{yield}}", + "moduleName": "@scope-name/addon-name-here/components/foo.hbs", + "parseOptions": { + "srcName": "@scope-name/addon-name-here/components/foo.hbs" + } + }); + + import templateOnly from '@ember/component/template-only'; + export default _setComponentTemplate(__COLOCATED_TEMPLATE__, templateOnly()); + `, + }, + templates: { + 'application.hbs': '{{outlet}}', + }, + }, + }, + }); + }); + + it('works for scoped addon using component with template and class', async function () { + input.write({ + '@scope-name': { + 'addon-name-here': { + components: { + 'foo.hbs': `{{yield}}`, + 'foo.js': stripIndent` + import Component from '@glimmer/component'; + export default class FooComponent extends Component {} + `, + }, + templates: { + 'application.hbs': `{{outlet}}`, + }, + }, + }, + }); + + createBuilder(); + + await output.build(); + + assert.deepStrictEqual(output.read(), { + '@scope-name': { + 'addon-name-here': { + components: { + 'foo.js': stripIndent` + import { setComponentTemplate as _setComponentTemplate } from "@ember/component"; + import { hbs } from 'ember-cli-htmlbars'; + + const __COLOCATED_TEMPLATE__ = hbs("{{yield}}", { + "contents": "{{yield}}", + "moduleName": "@scope-name/addon-name-here/components/foo.hbs", + "parseOptions": { + "srcName": "@scope-name/addon-name-here/components/foo.hbs" + } + }); + + import Component from '@glimmer/component'; + export default class FooComponent extends Component {} + + _setComponentTemplate(__COLOCATED_TEMPLATE__, FooComponent); + `, + }, + templates: { + 'application.hbs': '{{outlet}}', + }, + }, + }, + }); + }); + + it('does nothing for "classic" location components', async function () { + input.write({ + 'app-name-here': { + components: { + 'foo.js': stripIndent` + import Component from '@glimmer/component'; + export default class FooComponent extends Component {} + `, + }, + templates: { + 'application.hbs': `{{outlet}}`, + components: { + 'foo.hbs': `{{yield}}`, + }, + }, + }, + }); + + createBuilder(); + + await output.build(); + + assert.deepStrictEqual(output.read(), input.read()); + }); + + it('does nothing for "pod" location templates', async function () { + input.write({ + 'addon-name-here': { + components: { + foo: { + 'template.hbs': `{{yield}}`, + }, + }, + }, + }); + + createBuilder(); + await output.build(); + + assert.deepStrictEqual(output.read(), input.read()); + }); + + it('it works if there are no input files', async function () { + input.write({}); + + createBuilder(); + await output.build(); + + assert.deepStrictEqual(output.read(), {}); + }); + + it('it works if input is manually using setComponentTemplate - no colocated template exists', async function () { + input.write({ + 'app-name-here': { + components: { + 'foo.js': stripIndent` + import Component from '@glimmer/component'; + import { setComponentTemplate } from '@ember/component'; + import hbs from 'ember-cli-htmlbars-inline-precompile'; + export default class FooComponent extends Component {} + setComponentTemplate(FooComponent, hbs\`sometemplate\`); + `, + }, + templates: { + 'application.hbs': `{{outlet}}`, + }, + }, + }); + + createBuilder(); + await output.build(); + + assert.deepStrictEqual(output.read(), { + 'app-name-here': { + components: { + 'foo.js': stripIndent` + import Component from '@glimmer/component'; + import { setComponentTemplate } from '@ember/component'; + import hbs from 'ember-cli-htmlbars-inline-precompile'; + export default class FooComponent extends Component {} + setComponentTemplate(FooComponent, hbs\`sometemplate\`); + `, + }, + templates: { + 'application.hbs': '{{outlet}}', + }, + }, + }); + }); + + it('emits an error when a default export is not present in a component JS file', async function () { + input.write({ + 'app-name-here': { + components: { + 'foo.hbs': `{{yield}}`, + 'foo.js': stripIndent` + export function whatever() {} + `, + }, + }, + }); + + createBuilder(); + await output.build(); + + assert.deepStrictEqual(output.read(), { + 'app-name-here': { + components: { + 'foo.js': stripIndent` + export function whatever() {}\nthrow new Error("\`app-name-here/components/foo.hbs\` does not contain a \`default export\`. Did you forget to export the component class?"); + `, + }, + }, + }); + }); + + it('does not break class decorator usage'); +}); diff --git a/node-tests/template_compiler_test.js b/node-tests/template_compiler_test.js index b41741fa..76bd4601 100644 --- a/node-tests/template_compiler_test.js +++ b/node-tests/template_compiler_test.js @@ -5,6 +5,7 @@ const TemplateCompiler = require('../lib/template-compiler-plugin'); const co = require('co'); const { createTempDir, createBuilder } = require('broccoli-test-helper'); const fixturify = require('fixturify'); +const { stripIndent } = require('common-tags'); describe('TemplateCompiler', function () { this.timeout(10000); @@ -47,144 +48,309 @@ describe('TemplateCompiler', function () { htmlbarsPrecompile = htmlbarsOptions.templateCompiler.precompile; }); - it( - 'precompiles templates into htmlbars', - co.wrap(function* () { - let tree = new TemplateCompiler(input.path(), htmlbarsOptions); + describe('requiresModuleApiPolyfill: true', function () { + it( + 'precompiles templates into htmlbars', + co.wrap(function* () { + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, true); + + output = createBuilder(tree); + yield output.build(); + + let source = input.readText('template.hbs'); + let expected = `export default Ember.HTMLBars.template(${htmlbarsPrecompile(source, { + moduleName: 'template.hbs', + })});`; + assert.strictEqual(output.readText('template.js'), expected); + }) + ); + + it('invokes AST plugins', async function () { + let source = '{{foo-bar}}'; + input.write({ + 'template.hbs': source, + }); + let plugin = (env) => { + return { + name: 'fake-ast-plugin', + + visitor: { + MustacheStatement() { + return env.syntax.builders.text('Huzzah!'); + }, + }, + }; + }; + + htmlbarsOptions.plugins.ast.push(plugin); + + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, true); output = createBuilder(tree); - yield output.build(); + await output.build(); - let source = input.readText('template.hbs'); let expected = `export default Ember.HTMLBars.template(${htmlbarsPrecompile(source, { moduleName: 'template.hbs', + plugins: { + ast: [plugin], + }, })});`; - assert.strictEqual(output.readText('template.js'), expected); - }) - ); - it('invokes AST plugins', async function () { - let source = '{{foo-bar}}'; - input.write({ - 'template.hbs': source, + let outputString = output.readText('template.js'); + assert.strictEqual(outputString, expected); + assert.ok(outputString.includes('Huzzah!')); }); - let plugin = (env) => { - return { - name: 'fake-ast-plugin', - visitor: { - MustacheStatement() { - return env.syntax.builders.text('Huzzah!'); - }, - }, - }; - }; + it('AST Plugins have access to `isProduction` status', async function () { + let source = '{{foo-bar}}'; + input.write({ + 'template.hbs': source, + }); - htmlbarsOptions.plugins.ast.push(plugin); + let wasProduction = false; + let plugin = (env) => { + wasProduction = env.isProduction; - let tree = new TemplateCompiler(input.path(), htmlbarsOptions); + return { + name: 'fake-ast-plugin', - output = createBuilder(tree); - await output.build(); + visitor: {}, + }; + }; - let expected = `export default Ember.HTMLBars.template(${htmlbarsPrecompile(source, { - moduleName: 'template.hbs', - plugins: { - ast: [plugin], - }, - })});`; + htmlbarsOptions.isProduction = true; + htmlbarsOptions.plugins.ast.push(plugin); - let outputString = output.readText('template.js'); - assert.strictEqual(outputString, expected); - assert.ok(outputString.includes('Huzzah!')); - }); + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, true); + + output = createBuilder(tree); + await output.build(); - it('AST Plugins have access to `isProduction` status', async function () { - let source = '{{foo-bar}}'; - input.write({ - 'template.hbs': source, + assert.ok(wasProduction); }); - let wasProduction = false; - let plugin = (env) => { - wasProduction = env.isProduction; + it( + 'ignores utf-8 byte order marks', + co.wrap(function* () { + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, true); - return { - name: 'fake-ast-plugin', + output = createBuilder(tree); + yield output.build(); - visitor: {}, - }; - }; + let source = input.readText('template.hbs'); + let expected = `export default Ember.HTMLBars.template(${htmlbarsPrecompile(source, { + moduleName: 'template-with-bom.hbs', + })});`; + + assert.strictEqual(output.readText('template-with-bom.js'), expected); + }) + ); + + it( + 'passes FEATURES to compiler when provided as `FEATURES` [DEPRECATED]', + co.wrap(function* () { + htmlbarsOptions.FEATURES = { + 'ember-htmlbars-component-generation': true, + }; + + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, true); + + output = createBuilder(tree); + yield output.build(); + + let source = input.readText('web-component-template.hbs'); + let expected = `export default Ember.HTMLBars.template(${htmlbarsPrecompile(source, { + moduleName: 'web-component-template.hbs', + })});`; + + assert.strictEqual(output.readText('web-component-template.js'), expected); + }) + ); - htmlbarsOptions.isProduction = true; - htmlbarsOptions.plugins.ast.push(plugin); + it( + 'passes FEATURES to compiler when provided as `EmberENV.FEATURES`', + co.wrap(function* () { + htmlbarsOptions.EmberENV = { + FEATURES: { + 'ember-htmlbars-component-generation': true, + }, + }; + + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, true); - let tree = new TemplateCompiler(input.path(), htmlbarsOptions); + output = createBuilder(tree); + yield output.build(); - output = createBuilder(tree); - await output.build(); + let source = input.readText('web-component-template.hbs'); + let expected = `export default Ember.HTMLBars.template(${htmlbarsPrecompile(source, { + moduleName: 'web-component-template.hbs', + })});`; - assert.ok(wasProduction); + assert.strictEqual(output.readText('web-component-template.js'), expected); + }) + ); }); - it( - 'ignores utf-8 byte order marks', - co.wrap(function* () { - let tree = new TemplateCompiler(input.path(), htmlbarsOptions); + describe('requiresModuleApiPolyfill: false', function () { + it( + 'precompiles templates into htmlbars', + co.wrap(function* () { + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, false); + + output = createBuilder(tree); + yield output.build(); + + let source = input.readText('template.hbs'); + let expected = stripIndent` + import { createTemplateFactory } from '@ember/template-factory'; + + export default createTemplateFactory(${htmlbarsPrecompile(source, { + moduleName: 'template.hbs', + })}); + `; + assert.strictEqual(output.readText('template.js'), expected); + }) + ); + + it('invokes AST plugins', async function () { + let source = '{{foo-bar}}'; + input.write({ + 'template.hbs': source, + }); + let plugin = (env) => { + return { + name: 'fake-ast-plugin', + + visitor: { + MustacheStatement() { + return env.syntax.builders.text('Huzzah!'); + }, + }, + }; + }; + + htmlbarsOptions.plugins.ast.push(plugin); + + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, false); output = createBuilder(tree); - yield output.build(); + await output.build(); - let source = input.readText('template.hbs'); - let expected = `export default Ember.HTMLBars.template(${htmlbarsPrecompile(source, { - moduleName: 'template-with-bom.hbs', - })});`; + let expected = stripIndent` + import { createTemplateFactory } from '@ember/template-factory'; - assert.strictEqual(output.readText('template-with-bom.js'), expected); - }) - ); + export default createTemplateFactory(${htmlbarsPrecompile(source, { + moduleName: 'template.hbs', + plugins: { + ast: [plugin], + }, + })}); + `; - it( - 'passes FEATURES to compiler when provided as `FEATURES` [DEPRECATED]', - co.wrap(function* () { - htmlbarsOptions.FEATURES = { - 'ember-htmlbars-component-generation': true, + let outputString = output.readText('template.js'); + assert.strictEqual(outputString, expected); + assert.ok(outputString.includes('Huzzah!')); + }); + + it('AST Plugins have access to `isProduction` status', async function () { + let source = '{{foo-bar}}'; + input.write({ + 'template.hbs': source, + }); + + let wasProduction = false; + let plugin = (env) => { + wasProduction = env.isProduction; + + return { + name: 'fake-ast-plugin', + + visitor: {}, + }; }; - let tree = new TemplateCompiler(input.path(), htmlbarsOptions); + htmlbarsOptions.isProduction = true; + htmlbarsOptions.plugins.ast.push(plugin); + + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, false); output = createBuilder(tree); - yield output.build(); + await output.build(); - let source = input.readText('web-component-template.hbs'); - let expected = `export default Ember.HTMLBars.template(${htmlbarsPrecompile(source, { - moduleName: 'web-component-template.hbs', - })});`; + assert.ok(wasProduction); + }); - assert.strictEqual(output.readText('web-component-template.js'), expected); - }) - ); + it( + 'ignores utf-8 byte order marks', + co.wrap(function* () { + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, false); - it( - 'passes FEATURES to compiler when provided as `EmberENV.FEATURES`', - co.wrap(function* () { - htmlbarsOptions.EmberENV = { - FEATURES: { + output = createBuilder(tree); + yield output.build(); + + let source = input.readText('template.hbs'); + let expected = stripIndent` + import { createTemplateFactory } from '@ember/template-factory'; + + export default createTemplateFactory(${htmlbarsPrecompile(source, { + moduleName: 'template-with-bom.hbs', + })}); + `; + + assert.strictEqual(output.readText('template-with-bom.js'), expected); + }) + ); + + it( + 'passes FEATURES to compiler when provided as `FEATURES` [DEPRECATED]', + co.wrap(function* () { + htmlbarsOptions.FEATURES = { 'ember-htmlbars-component-generation': true, - }, - }; + }; - let tree = new TemplateCompiler(input.path(), htmlbarsOptions); + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, false); - output = createBuilder(tree); - yield output.build(); + output = createBuilder(tree); + yield output.build(); - let source = input.readText('web-component-template.hbs'); - let expected = `export default Ember.HTMLBars.template(${htmlbarsPrecompile(source, { - moduleName: 'web-component-template.hbs', - })});`; + let source = input.readText('web-component-template.hbs'); + let expected = stripIndent` + import { createTemplateFactory } from '@ember/template-factory'; - assert.strictEqual(output.readText('web-component-template.js'), expected); - }) - ); + export default createTemplateFactory(${htmlbarsPrecompile(source, { + moduleName: 'web-component-template.hbs', + })}); + `; + + assert.strictEqual(output.readText('web-component-template.js'), expected); + }) + ); + + it( + 'passes FEATURES to compiler when provided as `EmberENV.FEATURES`', + co.wrap(function* () { + htmlbarsOptions.EmberENV = { + FEATURES: { + 'ember-htmlbars-component-generation': true, + }, + }; + + let tree = new TemplateCompiler(input.path(), htmlbarsOptions, false); + + output = createBuilder(tree); + yield output.build(); + + let source = input.readText('web-component-template.hbs'); + let expected = stripIndent` + import { createTemplateFactory } from '@ember/template-factory'; + + export default createTemplateFactory(${htmlbarsPrecompile(source, { + moduleName: 'web-component-template.hbs', + })}); + `; + + assert.strictEqual(output.readText('web-component-template.js'), expected); + }) + ); + }); }); diff --git a/package.json b/package.json index 3982d95e..5d3dd60e 100644 --- a/package.json +++ b/package.json @@ -33,12 +33,13 @@ }, "dependencies": { "@ember/edition-utils": "^1.2.0", - "babel-plugin-htmlbars-inline-precompile": "^4.4.6", + "babel-plugin-htmlbars-inline-precompile": "^5.0.0", "broccoli-debug": "^0.6.5", "broccoli-persistent-filter": "^3.1.2", "broccoli-plugin": "^4.0.3", "common-tags": "^1.8.0", "ember-cli-babel-plugin-helpers": "^1.1.1", + "ember-cli-version-checker": "^5.1.2", "fs-tree-diff": "^2.0.1", "hash-for-dep": "^1.5.1", "heimdalljs-logger": "^0.1.10", @@ -66,10 +67,9 @@ "core-object": "^3.1.5", "ember-cli": "~3.25.2", "ember-cli-app-version": "^4.0.0", - "ember-cli-babel": "^7.23.1", + "ember-cli-babel": "^7.25.0", "ember-cli-dependency-checker": "^3.2.0", "ember-cli-inject-live-reload": "^2.0.2", - "ember-cli-version-checker": "^5.1.1", "ember-compatibility-helpers": "^1.2.2", "ember-export-application-global": "^2.0.1", "ember-load-initializers": "^2.1.1", diff --git a/yarn.lock b/yarn.lock index 8dadca30..15e85061 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21,6 +21,11 @@ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.12.1.tgz#d7386a689aa0ddf06255005b4b991988021101a0" integrity sha512-725AQupWJZ8ba0jbKceeFblZTY90McUBWMwHhkFQ9q1zKPJ95GUktljFcgcsIVwRnTnRKlcYzfiNImg5G9m6ZQ== +"@babel/compat-data@^7.13.0", "@babel/compat-data@^7.13.8": + version "7.13.11" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.13.11.tgz#9c8fe523c206979c9a81b1e12fe50c1254f1aa35" + integrity sha512-BwKEkO+2a67DcFeS3RLl0Z3Gs2OvdXewuWjc1Hfokhb5eQWP9YRYH1/+VrVZvql2CfjOiNGqSAFOYt4lsqTHzg== + "@babel/core@^7.12.0", "@babel/core@^7.12.10", "@babel/core@^7.3.4": version "7.12.10" resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.12.10.tgz#b79a2e1b9f70ed3d84bbfb6d8c4ef825f606bccd" @@ -76,6 +81,16 @@ browserslist "^4.12.0" semver "^5.5.0" +"@babel/helper-compilation-targets@^7.13.0": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.10.tgz#1310a1678cb8427c07a753750da4f8ce442bdd0c" + integrity sha512-/Xju7Qg1GQO4mHZ/Kcs6Au7gfafgZnwm+a7sy/ow/tV1sHeraRUHbjdat8/UvDor4Tez+siGKDk6zIKtCPKVJA== + dependencies: + "@babel/compat-data" "^7.13.8" + "@babel/helper-validator-option" "^7.12.17" + browserslist "^4.14.5" + semver "^6.3.0" + "@babel/helper-create-class-features-plugin@^7.12.1", "@babel/helper-create-class-features-plugin@^7.13.0": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.13.8.tgz#0367bd0a7505156ce018ca464f7ac91ba58c1a04" @@ -105,6 +120,20 @@ "@babel/types" "^7.10.4" lodash "^4.17.13" +"@babel/helper-define-polyfill-provider@^0.1.5": + version "0.1.5" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.1.5.tgz#3c2f91b7971b9fc11fe779c945c014065dea340e" + integrity sha512-nXuzCSwlJ/WKr8qxzW816gwyT6VZgiJG17zR40fou70yfAcqjoNyTLl/DQ+FExw5Hx5KNqshmN8Ldl/r2N7cTg== + dependencies: + "@babel/helper-compilation-targets" "^7.13.0" + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/traverse" "^7.13.0" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + semver "^6.1.2" + "@babel/helper-explode-assignable-expression@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz#40a1cd917bff1288f699a94a75b37a1a2dbd8c7c" @@ -150,6 +179,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-module-imports@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.12.13.tgz#ec67e4404f41750463e455cc3203f6a32e93fcb0" + integrity sha512-NGmfvRp9Rqxy0uHSSVP+SRIW1q31a7Ji10cLBcqSDUngGentY4FRiHOFZFE1CLU5eiL0oE8reH7Tg1y99TDM/g== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-module-transforms@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz#7954fec71f5b32c48e4b303b437c34453fd7247c" @@ -165,6 +201,21 @@ "@babel/types" "^7.12.1" lodash "^4.17.19" +"@babel/helper-module-transforms@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.13.0.tgz#42eb4bd8eea68bab46751212c357bfed8b40f6f1" + integrity sha512-Ls8/VBwH577+pw7Ku1QkUWIyRRNHpYlts7+qSqBBFCW3I8QteB9DxfcZ5YJpOwH6Ihe/wn8ch7fMGOP1OhEIvw== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-replace-supers" "^7.13.0" + "@babel/helper-simple-access" "^7.12.13" + "@babel/helper-split-export-declaration" "^7.12.13" + "@babel/helper-validator-identifier" "^7.12.11" + "@babel/template" "^7.12.13" + "@babel/traverse" "^7.13.0" + "@babel/types" "^7.13.0" + lodash "^4.17.19" + "@babel/helper-optimise-call-expression@^7.10.4", "@babel/helper-optimise-call-expression@^7.12.13": version "7.12.13" resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz#5c02d171b4c8615b1e7163f888c1c81c30a2aaea" @@ -172,7 +223,7 @@ dependencies: "@babel/types" "^7.12.13" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": version "7.13.0" resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz#806526ce125aed03373bc416a828321e3a6a33af" integrity sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ== @@ -210,6 +261,13 @@ dependencies: "@babel/types" "^7.12.1" +"@babel/helper-simple-access@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.12.13.tgz#8478bcc5cacf6aa1672b251c1d2dde5ccd61a6c4" + integrity sha512-0ski5dyYIHEfwpWGx5GPWhH35j342JaflmCeQmsPWcrOQDtCN6C1zKAVRFVbK53lPW2c9TsuLLSUDf0tIGJ5hA== + dependencies: + "@babel/types" "^7.12.13" + "@babel/helper-skip-transparent-expression-wrappers@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz#462dc63a7e435ade8468385c63d2b84cce4b3cbf" @@ -234,6 +292,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.1.tgz#175567380c3e77d60ff98a54bb015fe78f2178d9" integrity sha512-YpJabsXlJVWP0USHjnC/AQDTLlZERbON577YUVO/wLpqyj6HAtVYnWaQaN0iUN+1/tWn3c+uKKXjRut5115Y2A== +"@babel/helper-validator-option@^7.12.17": + version "7.12.17" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz#d1fbf012e1a79b7eebbfdc6d270baaf8d9eb9831" + integrity sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw== + "@babel/helper-wrap-function@^7.10.4": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz#8a6f701eab0ff39f765b5a1cfef409990e624b87" @@ -293,6 +356,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-decorators" "^7.12.1" +"@babel/plugin-proposal-decorators@^7.13.5": + version "7.13.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.13.5.tgz#d28071457a5ba8ee1394b23e38d5dcf32ea20ef7" + integrity sha512-i0GDfVNuoapwiheevUOuSW67mInqJ8qw7uWfpjNVeHMn143kXblEy/bmL9AdZ/0yf/4BMQeWXezK0tQIvNPqag== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-decorators" "^7.12.13" + "@babel/plugin-proposal-dynamic-import@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz#43eb5c2a3487ecd98c5c8ea8b5fdb69a2749b2dc" @@ -404,6 +476,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-decorators@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.12.13.tgz#fac829bf3c7ef4a1bc916257b403e58c6bdaf648" + integrity sha512-Rw6aIXGuqDLr6/LoBBYE57nKOzQpz/aDkKlMqEwH+Vp0MXbG6H/TfRjaY343LKxzAKAMXIHsQ8JzaZKuDZ9MwA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-syntax-dynamic-import@^7.8.0": version "7.8.3" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3" @@ -481,6 +560,13 @@ dependencies: "@babel/helper-plugin-utils" "^7.10.4" +"@babel/plugin-syntax-typescript@^7.12.13": + version "7.12.13" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.12.13.tgz#9dff111ca64154cef0f4dc52cf843d9f12ce4474" + integrity sha512-cHP3u1JiUiG2LFDKbXnwVad81GvfyIOmCD6HIEId6ojrY0Drfy2q1jw7BwN7dE84+kTnBjLkXoL3IEy/3JPu2w== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + "@babel/plugin-transform-arrow-functions@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz#8083ffc86ac8e777fbe24b5967c4b2521f3cb2b3" @@ -600,6 +686,15 @@ "@babel/helper-plugin-utils" "^7.10.4" babel-plugin-dynamic-import-node "^2.3.3" +"@babel/plugin-transform-modules-amd@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.13.0.tgz#19f511d60e3d8753cc5a6d4e775d3a5184866cc3" + integrity sha512-EKy/E2NHhY/6Vw5d1k3rgoobftcNUmp9fGjb9XZwQLtTctsRBOTRO7RHHxfIky1ogMN5BxN7p9uMA3SzPfotMQ== + dependencies: + "@babel/helper-module-transforms" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-dynamic-import-node "^2.3.3" + "@babel/plugin-transform-modules-commonjs@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz#fa403124542636c786cf9b460a0ffbb48a86e648" @@ -696,6 +791,18 @@ resolve "^1.8.1" semver "^5.5.1" +"@babel/plugin-transform-runtime@^7.13.9": + version "7.13.10" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.13.10.tgz#a1e40d22e2bf570c591c9c7e5ab42d6bf1e419e1" + integrity sha512-Y5k8ipgfvz5d/76tx7JYbKQTcgFSU6VgJ3kKQv4zGTKr+a9T/KBvfRvGtSFgKDQGt/DBykQixV0vNWKIdzWErA== + dependencies: + "@babel/helper-module-imports" "^7.12.13" + "@babel/helper-plugin-utils" "^7.13.0" + babel-plugin-polyfill-corejs2 "^0.1.4" + babel-plugin-polyfill-corejs3 "^0.1.3" + babel-plugin-polyfill-regenerator "^0.1.2" + semver "^6.3.0" + "@babel/plugin-transform-shorthand-properties@^7.12.1": version "7.12.1" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz#0bf9cac5550fce0cfdf043420f661d645fdc75e3" @@ -742,6 +849,15 @@ "@babel/helper-plugin-utils" "^7.10.4" "@babel/plugin-syntax-typescript" "^7.12.1" +"@babel/plugin-transform-typescript@^7.13.0": + version "7.13.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.13.0.tgz#4a498e1f3600342d2a9e61f60131018f55774853" + integrity sha512-elQEwluzaU8R8dbVuW2Q2Y8Nznf7hnjM7+DSCd14Lo5fF63C9qNLbwZYbmZrtV9/ySpSUpkRpQXvJb6xyu4hCQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.13.0" + "@babel/helper-plugin-utils" "^7.13.0" + "@babel/plugin-syntax-typescript" "^7.12.13" + "@babel/plugin-transform-typescript@~7.4.0": version "7.4.5" resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.4.5.tgz#ab3351ba35307b79981993536c93ff8be050ba28" @@ -856,6 +972,13 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" +"@babel/runtime@7.12.18": + version "7.12.18" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b" + integrity sha512-BogPQ7ciE6SYAUPtlm9tWbgI9+2AgqSam6QivMgXgAT+fKbgppaj4ZX15MHeLC1PVF5sNk70huBu20XxWOs8Cg== + dependencies: + regenerator-runtime "^0.13.4" + "@babel/runtime@^7.12.0", "@babel/runtime@^7.13.8", "@babel/runtime@^7.8.4": version "7.13.8" resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.8.tgz#cc886a85c072df1de23670dc1aa59fc116c4017c" @@ -1934,6 +2057,13 @@ babel-plugin-ember-modules-api-polyfill@^3.2.1, babel-plugin-ember-modules-api-p dependencies: ember-rfc176-data "^0.3.16" +babel-plugin-ember-modules-api-polyfill@^3.5.0: + version "3.5.0" + resolved "https://registry.yarnpkg.com/babel-plugin-ember-modules-api-polyfill/-/babel-plugin-ember-modules-api-polyfill-3.5.0.tgz#27b6087fac75661f779f32e60f94b14d0e9f6965" + integrity sha512-pJajN/DkQUnStw0Az8c6khVcMQHgzqWr61lLNtVeu0g61LRW0k9jyK7vaedrHDWGe/Qe8sxG5wpiyW9NsMqFzA== + dependencies: + ember-rfc176-data "^0.3.17" + 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" @@ -1947,14 +2077,14 @@ 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@^4.4.6: - version "4.4.6" - resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-4.4.6.tgz#9fd632ad2717226b90bde6940b4148b3a323fddb" - integrity sha512-h/HA2T+iKL/AmmOaaH5w107F8G/foMPyapuMWFtwqa+RqHYNiaNg73JCQ13XMa2SJGPYckHE9hKgjV699k1tVA== +babel-plugin-htmlbars-inline-precompile@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-5.0.0.tgz#b3a3008bdedbd3543e745fc953769cc10d4a7021" + integrity sha512-ZPIV7zVwVcwRyTWCp29HSwIPcvqX7PoslpKlNu53AzAx5X4QBwuMb9fFsUYY3JcriNZb5xWFOM4AE95XW0UYeA== dependencies: babel-plugin-ember-modules-api-polyfill "^3.4.0" -babel-plugin-module-resolver@^3.1.1: +babel-plugin-module-resolver@^3.1.1, babel-plugin-module-resolver@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz#ddfa5e301e3b9aa12d852a9979f18b37881ff5a7" integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA== @@ -1976,6 +2106,30 @@ babel-plugin-module-resolver@^4.0.0: reselect "^4.0.0" resolve "^1.13.1" +babel-plugin-polyfill-corejs2@^0.1.4: + version "0.1.10" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.1.10.tgz#a2c5c245f56c0cac3dbddbf0726a46b24f0f81d1" + integrity sha512-DO95wD4g0A8KRaHKi0D51NdGXzvpqVLnLu5BTvDlpqUEpTmeEtypgC1xqesORaWmiUOQI14UHKlzNd9iZ2G3ZA== + dependencies: + "@babel/compat-data" "^7.13.0" + "@babel/helper-define-polyfill-provider" "^0.1.5" + semver "^6.1.1" + +babel-plugin-polyfill-corejs3@^0.1.3: + version "0.1.7" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.1.7.tgz#80449d9d6f2274912e05d9e182b54816904befd0" + integrity sha512-u+gbS9bbPhZWEeyy1oR/YaaSpod/KDT07arZHb80aTpl8H5ZBq+uN1nN9/xtX7jQyfLdPfoqI4Rue/MQSWJquw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.5" + core-js-compat "^3.8.1" + +babel-plugin-polyfill-regenerator@^0.1.2: + version "0.1.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.1.6.tgz#0fe06a026fe0faa628ccc8ba3302da0a6ce02f3f" + integrity sha512-OUrYG9iKPKz8NxswXbRAdSwF0GhRdIEMTloQATJi4bDuFqrXaXcCUT/VGNrr8pBcjMh1RxZ7Xt9cytVJTJfvMg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.1.5" + babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -2863,6 +3017,11 @@ broccoli-source@^1.1.0: resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-1.1.0.tgz#54f0e82c8b73f46580cbbc4f578f0b32fca8f809" integrity sha1-VPDoLItz9GWAy7xPV48LMvyo+Ak= +broccoli-source@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-2.1.2.tgz#e9ae834f143b607e9ec114ade66731500c38b90b" + integrity sha512-1lLayO4wfS0c0Sj50VfHJXNWf94FYY0WUhxj0R77thbs6uWI7USiOWFqQV5dRmhAJnoKaGN4WyLGQbgjgiYFwQ== + broccoli-source@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/broccoli-source/-/broccoli-source-3.0.0.tgz#c7c9ba24505941b72a0244568285bc859f69dfbd" @@ -2980,6 +3139,17 @@ browserslist@^4.12.0, browserslist@^4.8.3: escalade "^3.0.1" node-releases "^1.1.58" +browserslist@^4.14.5, browserslist@^4.16.3: + version "4.16.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.16.3.tgz#340aa46940d7db878748567c5dea24a48ddf3717" + integrity sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw== + dependencies: + caniuse-lite "^1.0.30001181" + colorette "^1.2.1" + electron-to-chromium "^1.3.649" + escalade "^3.1.1" + node-releases "^1.1.70" + bser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/bser/-/bser-2.1.0.tgz#65fc784bf7f87c009b973c12db6546902fa9c7b5" @@ -3125,6 +3295,11 @@ caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001088: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001091.tgz#84908c67b98e02c2a56d4afa51e6458b53fb5321" integrity sha512-ECd8gfBBpv0GKsEYY5052+8PBjExiugDoi3dfkJcxujh2mf7kiuDvb1o27GXlOOGopKiIPYEX8XDPYj7eo3E9w== +caniuse-lite@^1.0.30001181: + version "1.0.30001202" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001202.tgz#4cb3bd5e8a808e8cd89e4e66c549989bc8137201" + integrity sha512-ZcijQNqrcF8JNLjzvEiXqX4JUYxoZa7Pvcsd9UD8Kz4TvhTonOSNRsK+qtvpVL4l6+T1Rh4LFtLfnNWg6BGWCQ== + capture-exit@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/capture-exit/-/capture-exit-2.0.0.tgz#fb953bfaebeb781f62898239dabb426d08a509a4" @@ -3441,6 +3616,11 @@ color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== +colorette@^1.2.1: + version "1.2.2" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.2.tgz#cbcc79d5e99caea2dbf10eb3a26fd8b3e6acfa94" + integrity sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w== + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -3644,6 +3824,14 @@ core-js-compat@^3.6.2: browserslist "^4.8.3" semver "7.0.0" +core-js-compat@^3.8.1: + version "3.9.1" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.9.1.tgz#4e572acfe90aff69d76d8c37759d21a5c59bb455" + integrity sha512-jXAirMQxrkbiiLsCx9bQPJFA6llDadKMpYrBJQJ3/c4/vsPP/fAf29h24tviRlvwUL6AmY5CHLu2GvjuYviQqA== + dependencies: + browserslist "^4.16.3" + semver "7.0.0" + core-js@^2.4.0, core-js@^2.5.0, core-js@^2.6.5: version "2.6.9" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" @@ -3975,6 +4163,11 @@ electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.483: resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.483.tgz#9269e7cfc1c8e72709824da171cbe47ca5e3ca9e" integrity sha512-+05RF8S9rk8S0G8eBCqBRBaRq7+UN3lDs2DAvnG8SBSgQO3hjy0+qt4CmRk5eiuGbTcaicgXfPmBi31a+BD3lg== +electron-to-chromium@^1.3.649: + version "1.3.691" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.691.tgz#a671eaf135a3ccec0915eb8d844a0952aba79f3b" + integrity sha512-ZqiO69KImmOGCyoH0icQPU3SndJiW93juEvf63gQngyhODO6SpQIPMTOHldtCs5DS5GMKvAkquk230E2zt2vpw== + ember-assign-polyfill@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/ember-assign-polyfill/-/ember-assign-polyfill-2.6.0.tgz#07847e3357ee35b33f886a0b5fbec6873f6860eb" @@ -4015,7 +4208,7 @@ ember-cli-babel@^6.0.0-beta.4, ember-cli-babel@^6.16.0, ember-cli-babel@^6.8.1: ember-cli-version-checker "^2.1.2" semver "^5.5.0" -ember-cli-babel@^7.1.2, ember-cli-babel@^7.11.0, ember-cli-babel@^7.12.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.23.1, ember-cli-babel@^7.7.3: +ember-cli-babel@^7.1.2, ember-cli-babel@^7.11.0, ember-cli-babel@^7.12.0, ember-cli-babel@^7.18.0, ember-cli-babel@^7.22.1, ember-cli-babel@^7.23.0, ember-cli-babel@^7.7.3: version "7.23.1" resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.23.1.tgz#d1517228ede08a5d4b045c78a7429728e956b30b" integrity sha512-qYggmt3hRs6QJ6cRkww3ahMpyP8IEV2KFrIRO/Z6hu9MkE/8Y28Xd5NjQl6fPV3oLoG0vwuHzhNe3Jr7Wec8zw== @@ -4047,6 +4240,39 @@ ember-cli-babel@^7.1.2, ember-cli-babel@^7.11.0, ember-cli-babel@^7.12.0, ember- rimraf "^3.0.1" semver "^5.5.0" +ember-cli-babel@^7.25.0: + version "7.25.0" + resolved "https://registry.yarnpkg.com/ember-cli-babel/-/ember-cli-babel-7.25.0.tgz#14a347cf52bc99648229b4b2a445c98b6390368a" + integrity sha512-pBCtTTyle0UwdbwQ7gg7zsrG8Rg7dnK1saMoE4hv9iBL01uU+RhErlFrKtaTf6OOIpQM2Ri1zO6Tb3kJMbD6sg== + dependencies: + "@babel/core" "^7.12.0" + "@babel/helper-compilation-targets" "^7.12.0" + "@babel/plugin-proposal-class-properties" "^7.13.0" + "@babel/plugin-proposal-decorators" "^7.13.5" + "@babel/plugin-transform-modules-amd" "^7.13.0" + "@babel/plugin-transform-runtime" "^7.13.9" + "@babel/plugin-transform-typescript" "^7.13.0" + "@babel/polyfill" "^7.11.5" + "@babel/preset-env" "^7.12.0" + "@babel/runtime" "7.12.18" + amd-name-resolver "^1.3.1" + babel-plugin-debug-macros "^0.3.4" + babel-plugin-ember-data-packages-polyfill "^0.1.2" + babel-plugin-ember-modules-api-polyfill "^3.5.0" + babel-plugin-module-resolver "^3.2.0" + broccoli-babel-transpiler "^7.8.0" + broccoli-debug "^0.6.4" + broccoli-funnel "^2.0.2" + broccoli-source "^2.1.2" + clone "^2.1.2" + ember-cli-babel-plugin-helpers "^1.1.1" + ember-cli-version-checker "^4.1.0" + ensure-posix-path "^1.0.2" + fixturify-project "^1.10.0" + resolve-package-path "^3.1.0" + rimraf "^3.0.1" + semver "^5.5.0" + ember-cli-dependency-checker@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/ember-cli-dependency-checker/-/ember-cli-dependency-checker-3.2.0.tgz#9202ad9e14d6fda33cffc22a11c343c2a8885330" @@ -4178,6 +4404,15 @@ ember-cli-version-checker@^5.0.2, ember-cli-version-checker@^5.1.1: semver "^7.3.2" silent-error "^1.1.1" +ember-cli-version-checker@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/ember-cli-version-checker/-/ember-cli-version-checker-5.1.2.tgz#649c7b6404902e3b3d69c396e054cea964911ab0" + integrity sha512-rk7GY+FmLn/2e22HsZs0Ycrz8HQ1W3Fv+2TFOuEFW9optnDXDgkntPBIl6gact/LHsfBM5RKbM3dHsIIeLgl0Q== + dependencies: + resolve-package-path "^3.1.0" + semver "^7.3.4" + silent-error "^1.1.1" + ember-cli@~3.25.2: version "3.25.2" resolved "https://registry.yarnpkg.com/ember-cli/-/ember-cli-3.25.2.tgz#e48203adfb2e6ff8f93d88b602f2c7c3b1633be2" @@ -4337,6 +4572,11 @@ ember-rfc176-data@^0.3.13, ember-rfc176-data@^0.3.15, ember-rfc176-data@^0.3.16: resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.16.tgz#2ace0ac9cf9016d493a74a1d931643a308679803" integrity sha512-IYAzffS90r2ybAcx8c2qprYfkxa70G+/UPkxMN1hw55DU5S2aLOX6v3umKDZItoRhrvZMCnzwsdfKSrKdC9Wbg== +ember-rfc176-data@^0.3.17: + version "0.3.17" + resolved "https://registry.yarnpkg.com/ember-rfc176-data/-/ember-rfc176-data-0.3.17.tgz#d4fc6c33abd6ef7b3440c107a28e04417b49860a" + integrity sha512-EVzTTKqxv9FZbEh6Ktw56YyWRAA0MijKvl7H8C06wVF+8f/cRRz3dXxa4nkwjzyVwx4rzKGuIGq77hxJAQhWWw== + ember-router-generator@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ember-router-generator/-/ember-router-generator-2.0.0.tgz#d04abfed4ba8b42d166477bbce47fccc672dbde0" @@ -7027,6 +7267,11 @@ lodash.debounce@^3.1.1: dependencies: lodash._getnative "^3.0.0" +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= + lodash.find@^4.5.1: version "4.6.0" resolved "https://registry.yarnpkg.com/lodash.find/-/lodash.find-4.6.0.tgz#cb0704d47ab71789ffa0de8b97dd926fb88b13b1" @@ -7728,6 +7973,11 @@ node-releases@^1.1.58: resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz#8ee20eef30fa60e52755fcc0942def5a734fe935" integrity sha512-NxBudgVKiRh/2aPWMgPR7bPTX0VPmGx5QBwCtdHitnqFE5/O8DeBXuIMH1nwNnw/aMo6AjOrpsHzfY3UbUJ7yg== +node-releases@^1.1.70: + version "1.1.71" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.71.tgz#cb1334b179896b1c89ecfdd4b725fb7bbdfc7dbb" + integrity sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg== + node-watch@0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/node-watch/-/node-watch-0.6.1.tgz#b9874111ce9f5841b1c7596120206c7b825be0e9" @@ -8911,7 +9161,7 @@ resolve@1.9.0: dependencies: path-parse "^1.0.6" -resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: +resolve@^1.1.6, resolve@^1.10.0, resolve@^1.10.1, resolve@^1.11.1, resolve@^1.12.0, resolve@^1.13.1, resolve@^1.14.2, resolve@^1.15.1, resolve@^1.17.0, resolve@^1.19.0, resolve@^1.3.3, resolve@^1.4.0, resolve@^1.5.0, resolve@^1.8.1: version "1.20.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.20.0.tgz#629a013fb3f70755d6f0b7935cc1c2c5378b1975" integrity sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A== @@ -9095,7 +9345,7 @@ semver@^5.1.0, semver@^5.3.0, semver@^5.4.1, semver@^5.5.0, semver@^5.5.1, semve resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.2.0, 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==