diff --git a/.eslintignore b/.eslintignore index e2b411191..618e92150 100644 --- a/.eslintignore +++ b/.eslintignore @@ -20,6 +20,8 @@ /packages/test-setup/**/*.d.ts /packages/addon-shim/**/*.js /packages/addon-shim/**/*.d.ts +/packages/addon-dev/**/*.js +/packages/addon-dev/**/*.d.ts /tests/fixtures/ # unconventional js diff --git a/packages/addon-dev/.eslintignore b/packages/addon-dev/.eslintignore new file mode 100644 index 000000000..4336ad549 --- /dev/null +++ b/packages/addon-dev/.eslintignore @@ -0,0 +1,7 @@ +# compiled output +/src/**/*.js +/src/**/*.d.ts + +# dependencies +/node_modules/ + diff --git a/packages/addon-dev/.gitignore b/packages/addon-dev/.gitignore new file mode 100644 index 000000000..2ebf498ab --- /dev/null +++ b/packages/addon-dev/.gitignore @@ -0,0 +1,10 @@ +# See https://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/src/**/*.js +/src/**/*.d.ts +/src/**/*.map + +# dependencies +/node_modules/ + diff --git a/packages/addon-dev/.prettierrc.js b/packages/addon-dev/.prettierrc.js new file mode 100644 index 000000000..534e6d35a --- /dev/null +++ b/packages/addon-dev/.prettierrc.js @@ -0,0 +1,5 @@ +'use strict'; + +module.exports = { + singleQuote: true, +}; diff --git a/packages/addon-dev/README.md b/packages/addon-dev/README.md new file mode 100644 index 000000000..e35cd5ed2 --- /dev/null +++ b/packages/addon-dev/README.md @@ -0,0 +1,34 @@ +# @embroider/addon-dev + +Utilities for working on v2 addons. + +## Rollup Utilities + +`@embroider/addon-dev/rollup` exports utilities for building addons with rollup. To use them: + +1. Add the following `devDependencies` to your addon: + + - @embroider/addon-dev + - rollup + - @babel/core + - @rollup/plugin-babel + +2. Copy the `./sample-rollup.config.js` in this repo to your own `rollup.config.js`. + +## addon-dev command + +The `addon-dev` command helps with common tasks in v2 addons. + +- linking up a test application that is embedded within your addon's repo +- synchronizing `devDependencies` from an embedded test application out into + your addon's actual package.json + +(You can avoid the need for both of these if you keep your addon and its test app as separate packages in a monorepo instead.) + +## Contributing + +See the top-level CONTRIBUTING.md in this monorepo. + +## License + +This project is licensed under the MIT License. diff --git a/packages/addon-dev/package.json b/packages/addon-dev/package.json new file mode 100644 index 000000000..d22037aa0 --- /dev/null +++ b/packages/addon-dev/package.json @@ -0,0 +1,41 @@ +{ + "name": "@embroider/addon-dev", + "version": "0.45.0", + "description": "Utilities for addon authors", + "repository": { + "type": "git", + "url": "https://github.com/embroider-build/embroider.git", + "directory": "packages/addon-dev" + }, + "license": "MIT", + "author": "Edward Faulkner ", + "bin": { + "addon-dev": "./src/commands.js" + }, + "exports": { + "./template-colocation-plugin": "./src/template-colocation-plugin.js", + "./rollup": "./src/rollup.js" + }, + "dependencies": { + "@embroider/shared-internals": "^0.45.0", + "@rollup/pluginutils": "^4.1.1", + "fs-extra": "^10.0.0", + "minimatch": "^3.0.4", + "rollup-plugin-copy-assets": "^2.0.3", + "rollup-plugin-delete": "^2.0.0", + "walk-sync": "^3.0.0", + "yargs": "^17.0.1" + }, + "devDependencies": { + "@types/fs-extra": "^9.0.12", + "@types/minimatch": "^3.0.4", + "@types/yargs": "^17.0.3", + "rollup": "^2.58.0" + }, + "engines": { + "node": "12.* || 14.* || >= 16" + }, + "volta": { + "extends": "../../package.json" + } +} diff --git a/packages/addon-dev/sample-rollup.config.js b/packages/addon-dev/sample-rollup.config.js new file mode 100644 index 000000000..c2cb808bf --- /dev/null +++ b/packages/addon-dev/sample-rollup.config.js @@ -0,0 +1,41 @@ +import babel from '@rollup/plugin-babel'; +import { Addon } from '@embroider/addon-dev/rollup'; + +const addon = new Addon({ + srcDir: 'src', + destDir: 'dist', +}); + +export default { + // This provides defaults that work well alongside `publicEntrypoints` below. + // You can augment this if you need to. + output: addon.output(), + + plugins: [ + // These are the modules that users should be able to import from your + // addon. Anything not listed here may get optimized away. + addon.publicEntrypoints(['components/**/*.js', 'index.js']), + + // These are the modules that should get reexported into the traditional + // "app" tree. Things in here should also be in publicEntrypoints above, but + // not everything in publicEntrypoints necessarily needs to go here. + addon.appReexports(['components/welcome-page.js']), + + // This babel config should *not* apply presets or compile away ES modules. + // It exists only to provide development niceties for you, like automatic + // template colocation. + babel({ + plugins: ['@embroider/addon-dev/template-colocation-plugin'], + }), + + // Ensure that standalone .hbs files are properly integrated as Javascript. + addon.hbs(), + + // addons are allowed to contain imports of .css files, which we want rollup + // to leave alone and keep in the published output. + addon.keepAssets(['**/*.css']), + + // Remove leftover build artifacts when starting a new build. + addon.clean(), + ], +}; diff --git a/packages/addon-shim/src/commands.ts b/packages/addon-dev/src/commands.ts similarity index 98% rename from packages/addon-shim/src/commands.ts rename to packages/addon-dev/src/commands.ts index cbf9e574d..43dcff7e4 100755 --- a/packages/addon-shim/src/commands.ts +++ b/packages/addon-dev/src/commands.ts @@ -20,7 +20,7 @@ function commonArgs(yargs: Argv) { } yargs(process.argv.slice(2)) - .scriptName('addon-shim') + .scriptName('addon-dev') .command( 'link-test-app', 'Ensures that a test app (that lives a subdir under an addon) has access to the addon and all appropriate deps', diff --git a/packages/addon-dev/src/rollup-app-reexports.ts b/packages/addon-dev/src/rollup-app-reexports.ts new file mode 100644 index 000000000..5010c191c --- /dev/null +++ b/packages/addon-dev/src/rollup-app-reexports.ts @@ -0,0 +1,31 @@ +import { readJsonSync, writeJsonSync } from 'fs-extra'; +import minimatch from 'minimatch'; +import type { Plugin } from 'rollup'; + +export default function appReexports(opts: { + from: string; + to: string; + include: string[]; +}): Plugin { + return { + name: 'app-reexports', + generateBundle(_, bundle) { + let pkg = readJsonSync('package.json'); + let appJS: Record = {}; + for (let filename of Object.keys(bundle)) { + if (opts.include.some((glob) => minimatch(filename, glob))) { + appJS[`./${filename}`] = `./dist/_app_/${filename}`; + this.emitFile({ + type: 'asset', + fileName: `_app_/${filename}`, + source: `export { default } from "${pkg.name}/${filename}";\n`, + }); + } + } + pkg['ember-addon'] = Object.assign({}, pkg['ember-addon'], { + 'app-js': appJS, + }); + writeJsonSync('package.json', pkg, { spaces: 2 }); + }, + }; +} diff --git a/packages/addon-dev/src/rollup-hbs-plugin.ts b/packages/addon-dev/src/rollup-hbs-plugin.ts new file mode 100644 index 000000000..3c62d71e5 --- /dev/null +++ b/packages/addon-dev/src/rollup-hbs-plugin.ts @@ -0,0 +1,23 @@ +import { createFilter } from '@rollup/pluginutils'; +import type { Plugin } from 'rollup'; +import { readFileSync } from 'fs'; +const backtick = '`'; + +export default function rollupHbsPlugin(): Plugin { + const filter = createFilter('**/*.hbs'); + + return { + name: 'rollup-hbs-plugin', + load(id: string) { + if (!filter(id)) return; + let input = readFileSync(id, 'utf8'); + let code = + `import { hbs } from 'ember-cli-htmlbars';\n` + + `export default hbs${backtick}${input}${backtick};`; + return { + code, + id: id + '.js', + }; + }, + }; +} diff --git a/packages/addon-dev/src/rollup-keep-assets.ts b/packages/addon-dev/src/rollup-keep-assets.ts new file mode 100644 index 000000000..adb40a160 --- /dev/null +++ b/packages/addon-dev/src/rollup-keep-assets.ts @@ -0,0 +1,48 @@ +import walkSync from 'walk-sync'; +import type { Plugin } from 'rollup'; +import { readFileSync } from 'fs'; +import { join } from 'path'; +import minimatch from 'minimatch'; + +export default function keepAssets({ + from, + include, +}: { + from: string; + include: string[]; +}): Plugin { + return { + name: 'copy-assets', + + // imports of assets should be left alone in the source code. This can cover + // the case of .css as defined in the embroider v2 addon spec. + async resolveId(source, importer, options) { + const resolution = await this.resolve(source, importer, { + skipSelf: true, + ...options, + }); + if ( + resolution && + include.some((pattern) => minimatch(resolution.id, pattern)) + ) { + return { id: source, external: true }; + } + return resolution; + }, + + // the assets go into the output directory in the same relative locations as + // in the input directory + async generateBundle() { + for (let name of walkSync(from, { + globs: include, + directories: false, + })) { + this.emitFile({ + type: 'asset', + fileName: name, + source: readFileSync(join(from, name), 'utf8'), + }); + } + }, + }; +} diff --git a/packages/addon-dev/src/rollup-public-entrypoints.ts b/packages/addon-dev/src/rollup-public-entrypoints.ts new file mode 100644 index 000000000..d7afb2236 --- /dev/null +++ b/packages/addon-dev/src/rollup-public-entrypoints.ts @@ -0,0 +1,23 @@ +import walkSync from 'walk-sync'; +import type { Plugin } from 'rollup'; +import { join } from 'path'; + +export default function publicEntrypoints(args: { + srcDir: string; + include: string[]; +}): Plugin { + return { + name: 'addon-modules', + buildStart() { + for (let name of walkSync(args.srcDir, { + globs: args.include, + })) { + this.emitFile({ + type: 'chunk', + id: join(args.srcDir, name), + fileName: name, + }); + } + }, + }; +} diff --git a/packages/addon-dev/src/rollup.ts b/packages/addon-dev/src/rollup.ts new file mode 100644 index 000000000..bbc93d9f9 --- /dev/null +++ b/packages/addon-dev/src/rollup.ts @@ -0,0 +1,66 @@ +import { default as hbs } from './rollup-hbs-plugin'; +import { default as publicEntrypoints } from './rollup-public-entrypoints'; +import { default as appReexports } from './rollup-app-reexports'; +import { default as clean } from 'rollup-plugin-delete'; +import { default as keepAssets } from './rollup-keep-assets'; +import type { Plugin } from 'rollup'; + +export class Addon { + #srcDir: string; + #destDir: string; + + constructor(params: { srcDir?: string; destDir?: string } = {}) { + this.#srcDir = params.srcDir ?? 'src'; + this.#destDir = params.destDir ?? 'dist'; + } + + // Given a list of globs describing modules in your srcDir, this generates + // corresponding appTree modules that contain reexports, and updates your + // package.json metadata to list them all. + appReexports(patterns: string[]): Plugin { + return appReexports({ + from: this.#srcDir, + to: this.#destDir, + include: patterns, + }); + } + + // This configures rollup to emit public entrypoints for each module in your + // srcDir that matches one of the given globs. Typical addons will want to + // match patterns like "components/**/*.js", "index.js", and "test-support.js". + publicEntrypoints(patterns: string[]) { + return publicEntrypoints({ srcDir: this.#srcDir, include: patterns }); + } + + // This wraps standalone .hbs files as Javascript files using inline + // templates. This means special resolving rules for .hbs files aren't + // required for javascript tooling to understand your package. + hbs() { + return hbs(); + } + + // By default rollup does not clear the output directory between builds. This + // does that. + clean() { + return clean({ targets: `${this.#destDir}/*` }); + } + + // V2 Addons are allowed to contain imports of .css files. This tells rollup + // to leave those imports alone and to make sure the corresponding .css files + // are kept in the same relative locations in the destDir as they were in the + // srcDir. + keepAssets(patterns: string[]) { + return keepAssets({ + from: this.#srcDir, + include: patterns, + }); + } + + // This is the default `output` configuration you should pass to rollup. We're + // emitting ES modules, in your `destDir`, and their filenames are equal to + // their bundle names (the bundle names get generated by `publicEntrypoints` + // above). + output() { + return { dir: this.#destDir, format: 'es', entryFileNames: '[name]' }; + } +} diff --git a/packages/addon-dev/src/template-colocation-plugin.ts b/packages/addon-dev/src/template-colocation-plugin.ts new file mode 100644 index 000000000..c8600be26 --- /dev/null +++ b/packages/addon-dev/src/template-colocation-plugin.ts @@ -0,0 +1,4 @@ +export { + default, + Options, +} from '@embroider/shared-internals/src/template-colocation-plugin'; diff --git a/packages/addon-shim/addon-main.js b/packages/addon-shim/addon-main.js index 41fef8b7d..6a1a29de3 100644 --- a/packages/addon-shim/addon-main.js +++ b/packages/addon-shim/addon-main.js @@ -9,8 +9,4 @@ module.exports = { .find((a) => a.name === 'ember-auto-import') .registerV2Addon(this.parent.name, this.parent.pkg.root); }, - - includedCommands() { - return require('./src/commands').default; - }, }; diff --git a/packages/addon-shim/package.json b/packages/addon-shim/package.json index 79a84a4c6..943f5a8ac 100644 --- a/packages/addon-shim/package.json +++ b/packages/addon-shim/package.json @@ -17,23 +17,16 @@ "doc": "doc", "test": "tests" }, - "bin": { - "addon-shim": "./src/commands.js" - }, "scripts": { "prepare": "tsc" }, "dependencies": { "@embroider/shared-internals": "^0.45.0", "ember-auto-import": "^2.2.0", - "fs-extra": "^10.0.0", - "semver": "^7.3.5", - "yargs": "^17.0.1" + "semver": "^7.3.5" }, "devDependencies": { - "@types/fs-extra": "^9.0.12", "@types/semver": "^7.3.6", - "@types/yargs": "^17.0.2", "typescript": "*", "webpack": "^5" }, diff --git a/packages/compat/package.json b/packages/compat/package.json index af9896f50..426974c5d 100644 --- a/packages/compat/package.json +++ b/packages/compat/package.json @@ -33,7 +33,7 @@ "@embroider/macros": "0.45.0", "@embroider/shared-internals": "0.45.0", "@types/babel__code-frame": "^7.0.2", - "@types/yargs": "^17.0.0", + "@types/yargs": "^17.0.3", "assert-never": "^1.1.0", "babel-plugin-syntax-dynamic-import": "^6.18.0", "babylon": "^6.18.0", diff --git a/packages/core/src/app.ts b/packages/core/src/app.ts index 34b56179f..b5037b0c0 100644 --- a/packages/core/src/app.ts +++ b/packages/core/src/app.ts @@ -39,6 +39,7 @@ 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'; +import type { Options as ColocationOptions } from '@embroider/shared-internals/src/template-colocation-plugin'; export type EmberENV = unknown; @@ -396,7 +397,13 @@ export class AppBuilder { // this is @embroider/macros configured for full stage3 resolution babel.plugins.push(...this.macrosConfig.babelPluginConfig()); - babel.plugins.push([require.resolve('./template-colocation-plugin')]); + let colocationOptions: ColocationOptions = { + packageGuard: true, + }; + babel.plugins.push([ + require.resolve('@embroider/shared-internals/src/template-colocation-plugin'), + colocationOptions, + ]); babel.plugins.push(this.adjustImportsPlugin(appFiles)); diff --git a/packages/shared-internals/package.json b/packages/shared-internals/package.json index fa7bb064e..2c665bcec 100644 --- a/packages/shared-internals/package.json +++ b/packages/shared-internals/package.json @@ -13,7 +13,8 @@ "browser": "./src/browser-index.js", "default": "./src/index.js" }, - "./src/babel-plugin-cache-busting.js": "./src/babel-plugin-cache-busting.js" + "./src/babel-plugin-cache-busting.js": "./src/babel-plugin-cache-busting.js", + "./src/template-colocation-plugin": "./src/template-colocation-plugin.js" }, "license": "MIT", "author": "Edward Faulkner", @@ -28,6 +29,7 @@ "test": "jest" }, "dependencies": { + "babel-import-util": "^0.2.0", "ember-rfc176-data": "^0.3.17", "resolve-package-path": "^4.0.1", "typescript-memoize": "^1.0.1", @@ -36,6 +38,7 @@ "semver": "^7.3.5" }, "devDependencies": { + "@embroider/test-support": "0.36.0", "@types/semver": "^7.3.6", "@types/tmp": "^0.1.0", "fixturify": "^2.1.1", diff --git a/packages/core/src/template-colocation-plugin.ts b/packages/shared-internals/src/template-colocation-plugin.ts similarity index 72% rename from packages/core/src/template-colocation-plugin.ts rename to packages/shared-internals/src/template-colocation-plugin.ts index 50fbaecf8..d7e4505aa 100644 --- a/packages/core/src/template-colocation-plugin.ts +++ b/packages/shared-internals/src/template-colocation-plugin.ts @@ -2,18 +2,33 @@ import type { NodePath } from '@babel/traverse'; import { existsSync } from 'fs'; import type * as t from '@babel/types'; import { dirname } from 'path'; -import { explicitRelative } from '@embroider/shared-internals'; -import { PackageCache } from '@embroider/shared-internals'; +import { explicitRelative, PackageCache } from '.'; + import { ImportUtil } from 'babel-import-util'; type BabelTypes = typeof t; -const packageCache = PackageCache.shared('embroider-stage3'); +// these options are designed so the defaults are appropriate for use within an +// addon's dev pipeline, whereas when we use it within Embroider we diverge from +// the defaults. That means less options for addon authors to need to know +// about. +export interface Options { + // Defaults to false. + // + // When true, we will only apply changes to components that are owned by + // packages that are auto-upgraded v2 ember packages. When false, we apply + // changes to whatever we see. + // + // This option is used by Embroider itself to help with compatibility, other + // users should probably not use it. + packageGuard?: boolean; +} interface State { colocatedTemplate: string | undefined; associate: { component: t.Identifier; template: t.Identifier } | undefined; adder: ImportUtil; + opts: Options; } function setComponentTemplate(target: NodePath, state: State) { @@ -29,9 +44,11 @@ export default function main(babel: unknown) { state.adder = new ImportUtil(t, path); let filename = path.hub.file.opts.filename; - let owningPackage = packageCache.ownerOfFile(filename); - if (!owningPackage || !owningPackage.isV2Ember() || !owningPackage.meta['auto-upgraded']) { - return; + if (state.opts.packageGuard) { + let owningPackage = PackageCache.shared('embroider-stage3').ownerOfFile(filename); + if (!owningPackage || !owningPackage.isV2Ember() || !owningPackage.meta['auto-upgraded']) { + return; + } } let hbsFilename = filename.replace(/\.\w{1,3}$/, '') + '.hbs'; @@ -40,9 +57,6 @@ export default function main(babel: unknown) { } }, exit(path: NodePath, state: State) { - if (!state.colocatedTemplate) { - return; - } if (state.associate) { path.node.body.push( t.expressionStatement( @@ -57,14 +71,14 @@ export default function main(babel: unknown) { }, ExportDefaultDeclaration(path: NodePath, state: State) { - if (!state.colocatedTemplate) { + let template = getTemplate(path, state); + if (!template) { return; } let declaration = path.get('declaration').node; if (t.isClassDeclaration(declaration)) { - let template = importTemplate(path, state.adder, state.colocatedTemplate); if (declaration.id != null) { state.associate = { template, component: declaration.id }; } else { @@ -74,8 +88,6 @@ export default function main(babel: unknown) { ]); } } else if (t.isFunctionDeclaration(declaration)) { - let template = importTemplate(path, state.adder, state.colocatedTemplate); - if (declaration.id != null) { state.associate = { template, component: declaration.id }; } else { @@ -93,12 +105,12 @@ export default function main(babel: unknown) { } else if (t.isTSDeclareFunction(declaration)) { // we don't rewrite this } else { - let local = importTemplate(path, state.adder, state.colocatedTemplate); - path.node.declaration = t.callExpression(setComponentTemplate(path, state), [local, declaration]); + path.node.declaration = t.callExpression(setComponentTemplate(path, state), [template, declaration]); } }, ExportNamedDeclaration(path: NodePath, state: State) { - if (!state.colocatedTemplate) { + let template = getTemplate(path, state); + if (!template) { return; } let { node } = path; @@ -108,7 +120,6 @@ export default function main(babel: unknown) { const name = specifier.exported.type === 'Identifier' ? specifier.exported.name : specifier.exported.value; if (name === 'default') { - let template = importTemplate(path, state.adder, state.colocatedTemplate); if (node.source) { // our default export is a reexport from elsewhere. We will // synthesize a new import for it so we can get a local handle @@ -127,6 +138,13 @@ export default function main(babel: unknown) { }; } -function importTemplate(target: NodePath, adder: ImportUtil, colocatedTemplate: string) { - return adder.import(target, explicitRelative(dirname(colocatedTemplate), colocatedTemplate), 'default', 'TEMPLATE'); +function getTemplate(target: NodePath, state: State) { + if (state.colocatedTemplate) { + return state.adder.import( + target, + explicitRelative(dirname(state.colocatedTemplate), state.colocatedTemplate), + 'default', + 'TEMPLATE' + ); + } } diff --git a/packages/core/tests/template-colocation-plugin.test.ts b/packages/shared-internals/tests/template-colocation-plugin.test.ts similarity index 96% rename from packages/core/tests/template-colocation-plugin.test.ts rename to packages/shared-internals/tests/template-colocation-plugin.test.ts index 3d7fa37d7..3a92fa916 100644 --- a/packages/core/tests/template-colocation-plugin.test.ts +++ b/packages/shared-internals/tests/template-colocation-plugin.test.ts @@ -11,11 +11,13 @@ describe('template-colocation-plugin', () => { jest.setTimeout(120000); let filename: string; + let plugins: any = []; + allBabelVersions({ babelConfig() { return { filename, - plugins: [[join(__dirname, '../src/template-colocation-plugin.js'), { needsModulesPolyfill: true }]], + plugins, }; }, createTests(transform) { @@ -29,6 +31,14 @@ describe('template-colocation-plugin', () => { let name; ({ name, removeCallback } = tmp.dirSync()); filename = join(name, 'sample.js'); + plugins = [ + [ + join(__dirname, '../src/template-colocation-plugin.js'), + { + templateMode: 'imported', + }, + ], + ]; writeJSONSync(join(name, 'package.json'), { name: 'sample-package', keywords: ['ember-addon'], diff --git a/yarn.lock b/yarn.lock index 79444e8b3..cd84f8a72 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2381,6 +2381,14 @@ dependencies: "@octokit/openapi-types" "^7.2.3" +"@rollup/pluginutils@^4.1.1": + version "4.1.1" + resolved "https://registry.yarnpkg.com/@rollup/pluginutils/-/pluginutils-4.1.1.tgz#1d4da86dd4eded15656a57d933fda2b9a08d47ec" + integrity sha512-clDjivHqWGXi7u+0d2r2sBi4Ie6VLEAzWMIkvJLnDmxoOhBYOTfzGbOQBA32THHm11/LiJbd01tJUpJsbshSWQ== + dependencies: + estree-walker "^2.0.1" + picomatch "^2.2.2" + "@simple-dom/document@^1.4.0": version "1.4.0" resolved "https://registry.yarnpkg.com/@simple-dom/document/-/document-1.4.0.tgz#af60855f957f284d436983798ef1006cca1a1678" @@ -2964,17 +2972,10 @@ dependencies: "@types/yargs-parser" "*" -"@types/yargs@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.0.tgz#32f740934eedf0a5cd19470249f317755c91f1ae" - integrity sha512-RS7u2X7vdXjVQs160PWY1pjLBw6GJj04utojn0KU8p2rRZR37FSzzK6XOT+KLzT/DVbDYRyezroc0LHIvM5Z2A== - dependencies: - "@types/yargs-parser" "*" - -"@types/yargs@^17.0.2": - version "17.0.2" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.2.tgz#8fb2e0f4cdc7ab2a1a570106e56533f31225b584" - integrity sha512-JhZ+pNdKMfB0rXauaDlrIvm+U7V4m03PPOSVoPS66z8gf+G4Z/UW8UlrVIj2MRQOBzuoEvYtjS0bqYwnpZaS9Q== +"@types/yargs@^17.0.3": + version "17.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.3.tgz#e6c552aa3277b21a8e802019d03ee5e77894cf27" + integrity sha512-K7rm3Ke3ag/pAniBe80A6J6fjoqRibvCrl3dRmtXV9eCEt9h/pZwmHX9MzjQVUc/elneQTL4Ky7XKorC71Lmxw== dependencies: "@types/yargs-parser" "*" @@ -5656,16 +5657,24 @@ browserify-zlib@^0.2.0: dependencies: pako "~1.0.5" -browserslist@^3.2.6, browserslist@^4.0.0, browserslist@^4.14.0, browserslist@^4.14.5, browserslist@^4.16.6: - version "4.17.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.2.tgz#aa15dbd2fab399a399fe4df601bb09363c5458a6" - integrity sha512-jSDZyqJmkKMEMi7SZAgX5UltFdR5NAO43vY0AwTpu4X3sGH7GLLQ83KiUomgrnvZRCeW0yPPnKqnxPqQOER9zQ== +browserslist@^3.2.6: + version "3.2.8" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-3.2.8.tgz#b0005361d6471f0f5952797a76fc985f1f978fc6" + integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ== + dependencies: + caniuse-lite "^1.0.30000844" + electron-to-chromium "^1.3.47" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6: + version "4.17.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.3.tgz#2844cd6eebe14d12384b0122d217550160d2d624" + integrity sha512-59IqHJV5VGdcJZ+GZ2hU5n4Kv3YiASzW6Xk5g9tf5a/MAzGeFwgGWU39fVzNIOVcgB3+Gp+kiQu0HEfTVU/3VQ== dependencies: - caniuse-lite "^1.0.30001261" - electron-to-chromium "^1.3.854" + caniuse-lite "^1.0.30001264" + electron-to-chromium "^1.3.857" escalade "^3.1.1" - nanocolors "^0.2.12" - node-releases "^1.1.76" + node-releases "^1.1.77" + picocolors "^0.2.1" bser@2.1.1: version "2.1.1" @@ -5901,10 +5910,10 @@ caniuse-lite@^1.0.0: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001236.tgz#0a80de4cdf62e1770bb46a30d884fc8d633e3958" integrity sha512-o0PRQSrSCGJKCPZcgMzl5fUaj5xHe8qA2m4QRvnyY4e1lITqoNkr7q/Oh1NcpGSy0Th97UZ35yoKcINPoq7YOQ== -caniuse-lite@^1.0.30001261: - version "1.0.30001263" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001263.tgz#7ce7a6fb482a137585cbc908aaf38e90c53a16a4" - integrity sha512-doiV5dft6yzWO1WwU19kt8Qz8R0/8DgEziz6/9n2FxUasteZNwNNYSmJO3GLBH8lCVE73AB1RPDPAeYbcO5Cvw== +caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001264: + version "1.0.30001265" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001265.tgz#0613c9e6c922e422792e6fcefdf9a3afeee4f8c3" + integrity sha512-YzBnspggWV5hep1m9Z6sZVLOt7vrju8xWooFAgN6BA5qvy98qPAPb7vNUzypFaoh2pb3vlfzbDO8tB57UPGbtw== capture-exit@^2.0.0: version "2.0.0" @@ -6894,6 +6903,20 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +del@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/del/-/del-5.1.0.tgz#d9487c94e367410e6eff2925ee58c0c84a75b3a7" + integrity sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA== + dependencies: + globby "^10.0.1" + graceful-fs "^4.2.2" + is-glob "^4.0.1" + is-path-cwd "^2.2.0" + is-path-inside "^3.0.1" + p-map "^3.0.0" + rimraf "^3.0.0" + slash "^3.0.0" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -7118,10 +7141,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.854: - version "1.3.856" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.856.tgz#75dee0eef9702bffabbf4c1293c989cd3cacb7ba" - integrity sha512-lSezYIe1/p5qkEswAfaQUseOBiwGwuCvRl/MKzOEVe++DcmQ92+43dznDl4rFJ4Zpu+kevhwyIf7KjJevyDA/A== +electron-to-chromium@^1.3.47, electron-to-chromium@^1.3.857: + version "1.3.862" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.862.tgz#c1c5d4382449e2c9b0e67fe1652f4fc451d6d8c0" + integrity sha512-o+FMbCD+hAUJ9S8bfz/FaqA0gE8OpCCm58KhhGogOEqiA1BLFSoVYLi+tW+S/ZavnqBn++n0XZm7HQiBVPs8Jg== elliptic@^6.5.3: version "6.5.4" @@ -9559,6 +9582,11 @@ estree-walker@^0.6.1: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.6.1.tgz#53049143f40c6eb918b23671d1fe3219f3a1b362" integrity sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w== +estree-walker@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" + integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -9915,7 +9943,21 @@ fastboot-transform@^0.1.0, fastboot-transform@^0.1.3: broccoli-stew "^1.5.0" convert-source-map "^1.5.1" -fastboot@^2.0.0, fastboot@^2.0.1, fastboot@^3.1.0: +fastboot@^2.0.0, fastboot@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-2.0.3.tgz#0b712e6c590f1b463dc5b12138893bcbbafa2459" + integrity sha512-NNH/o+XhITAQUnW2CC9IDXlcnI74W2BONjtRSRmc01N3uJl/7pcvX9iWTUWu2PYQbQZUBu8HzVFt7GmQ9qw9JQ== + dependencies: + chalk "^2.0.1" + cookie "^0.4.0" + debug "^4.1.0" + najax "^1.0.3" + resolve "^1.8.1" + rsvp "^4.8.0" + simple-dom "^1.4.0" + source-map-support "^0.5.0" + +fastboot@^3.1.0: version "3.1.2" resolved "https://registry.yarnpkg.com/fastboot/-/fastboot-3.1.2.tgz#c10a97be3a61fbbf9e4bd8abc43373e8739d1787" integrity sha512-yvhJfIRd4wWWACk+qjJxQI+WBIQ+pyQyp0/fxrQyA/cYJgZAXOHb+22zXJbJXaPku3fHS+gBl7crwovIkl8bhQ== @@ -10498,7 +10540,7 @@ fsevents@^1.2.7: bindings "^1.5.0" nan "^2.12.1" -fsevents@~2.3.1: +fsevents@~2.3.1, fsevents@~2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== @@ -10785,6 +10827,20 @@ globby@11.0.3, globby@^11.0.2, globby@^11.0.3: merge2 "^1.3.0" slash "^3.0.0" +globby@^10.0.1: + version "10.0.2" + resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.2.tgz#277593e745acaa4646c3ab411289ec47a0392543" + integrity sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg== + dependencies: + "@types/glob" "^7.1.1" + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.0.3" + glob "^7.1.3" + ignore "^5.1.1" + merge2 "^1.2.3" + slash "^3.0.0" + globby@^11.0.4: version "11.0.4" resolved "https://registry.yarnpkg.com/globby/-/globby-11.0.4.tgz#2cbaff77c2f2a62e71e9b2813a67b97a3a3001a5" @@ -11802,7 +11858,12 @@ is-object@^1.0.1: resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== -is-path-inside@^3.0.2: +is-path-cwd@^2.2.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz#67d43b82664a7b5191fd9119127eb300048a9fdb" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-inside@^3.0.1, is-path-inside@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -12405,6 +12466,11 @@ jest@^24.9.0: import-local "^2.0.0" jest-cli "^24.9.0" +jquery-deferred@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/jquery-deferred/-/jquery-deferred-0.3.1.tgz#596eca1caaff54f61b110962b23cafea74c35355" + integrity sha1-WW7KHKr/VPYbEQlisjyv6nTDU1U= + jquery@^3.4.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" @@ -13740,16 +13806,20 @@ mz@^2.4.0: object-assign "^4.0.1" thenify-all "^1.0.0" +najax@^1.0.3: + version "1.0.7" + resolved "https://registry.yarnpkg.com/najax/-/najax-1.0.7.tgz#706dce52d4b738dce01aee97f392ccdb79d51eef" + integrity sha512-JqBMguf2plv1IDqhOE6eebnTivjS/ej0C/Sw831jVc+dRQIMK37oyktdQCGAQtwpl5DikOWI2xGfIlBPSSLgXg== + dependencies: + jquery-deferred "^0.3.0" + lodash "^4.17.21" + qs "^6.2.0" + nan@^2.12.1: version "2.14.2" resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.2.tgz#f5376400695168f4cc694ac9393d0c9585eeea19" integrity sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ== -nanocolors@^0.2.12: - version "0.2.12" - resolved "https://registry.yarnpkg.com/nanocolors/-/nanocolors-0.2.12.tgz#4d05932e70116078673ea4cc6699a1c56cc77777" - integrity sha512-SFNdALvzW+rVlzqexid6epYdt8H9Zol7xDoQarioEFcFN0JHo4CYNztAxmtfgGTVRCmFlEOqqhBpoFGKqSAMug== - nanoid@^3.1.23: version "3.1.23" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.23.tgz#f744086ce7c2bc47ee0a8472574d5c78e4183a81" @@ -13872,10 +13942,10 @@ node-notifier@^9.0.1: uuid "^8.3.0" which "^2.0.2" -node-releases@^1.1.76: - version "1.1.76" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.76.tgz#df245b062b0cafbd5282ab6792f7dccc2d97f36e" - integrity sha512-9/IECtNr8dXNmPWmFXepT0/7o5eolGesHUa3mtr0KlgnCvnZxwh2qensKL42JJY2vQKC3nIBXetFAqR+PW1CmA== +node-releases@^1.1.77: + version "1.1.77" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.77.tgz#50b0cfede855dd374e7585bf228ff34e57c1c32e" + integrity sha512-rB1DUFUNAN4Gn9keO2K1efO35IDK7yKHCdCaIMvFO7yUYmmZYeDjnGKle26G4rwj+LKRQpjyUUvMkPglwGCYNQ== node-watch@0.7.2: version "0.7.2" @@ -14592,7 +14662,12 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3: version "2.3.0" resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.0.tgz#f1f061de8f6a4bf022892e2d128234fb98302972" integrity sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw== @@ -14960,7 +15035,7 @@ qs@6.7.0: resolved "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz#41dc1a015e3d581f1621776be31afb2876a9b1bc" integrity sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ== -qs@^6.4.0, qs@^6.9.4: +qs@^6.2.0, qs@^6.4.0, qs@^6.9.4: version "6.10.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.1.tgz#4931482fa8d647a5aab799c5271d2133b981fb6a" integrity sha512-M528Hph6wsSVOBiYUnGf+K/7w0hNshs/duGsNXPUCLH5XAqjEtiPGwNONLV0tBH8NoGb0mvD5JubnUTrujKDTg== @@ -15030,7 +15105,7 @@ qunit-dom@^1.6.0: ember-cli-babel "^7.23.0" ember-cli-version-checker "^5.1.1" -qunit@^2.14.1, qunit@^2.16.0: +qunit@^2.16.0: version "2.17.2" resolved "https://registry.yarnpkg.com/qunit/-/qunit-2.17.2.tgz#5cb278e131d931f25c109a0fdb0518be7754c25a" integrity sha512-17isVvuOmALzsPjiV7wFg/6O5vJYXBrQZPwocfQSSh0I/rXvfX7bKMFJ4GMVW3U4P8r2mBeUy8EAngti4QD2Vw== @@ -15696,6 +15771,20 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^3.0.0" inherits "^2.0.1" +rollup-plugin-copy-assets@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-copy-assets/-/rollup-plugin-copy-assets-2.0.3.tgz#9a9098894c3ded16d2eee8c4108055e332b5f59f" + integrity sha512-ETShhQGb9SoiwcNrvb3BhUNSGR89Jao0+XxxfzzLW1YsUzx8+rMO4z9oqWWmo6OHUmfNQRvqRj0cAyPkS9lN9w== + dependencies: + fs-extra "^7.0.1" + +rollup-plugin-delete@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/rollup-plugin-delete/-/rollup-plugin-delete-2.0.0.tgz#262acf80660d48c3b167fb0baabd0c3ab985c153" + integrity sha512-/VpLMtDy+8wwRlDANuYmDa9ss/knGsAgrDhM+tEwB1npHwNu4DYNmDfUL55csse/GHs9Q+SMT/rw9uiaZ3pnzA== + dependencies: + del "^5.1.0" + rollup-pluginutils@^2.0.1, rollup-pluginutils@^2.8.1: version "2.8.2" resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.8.2.tgz#72f2af0748b592364dbd3389e600e5a9444a351e" @@ -15729,12 +15818,19 @@ rollup@^1.12.0: "@types/node" "*" acorn "^7.1.0" +rollup@^2.58.0: + version "2.58.0" + resolved "https://registry.yarnpkg.com/rollup/-/rollup-2.58.0.tgz#a643983365e7bf7f5b7c62a8331b983b7c4c67fb" + integrity sha512-NOXpusKnaRpbS7ZVSzcEXqxcLDOagN6iFS8p45RkoiMqPHDLwJm758UF05KlMoCRbLBTZsPOIa887gZJ1AiXvw== + optionalDependencies: + fsevents "~2.3.2" + rsvp@^3.0.14, rsvp@^3.0.17, rsvp@^3.0.18, rsvp@^3.0.21, rsvp@^3.0.6, rsvp@^3.1.0: version "3.6.2" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-3.6.2.tgz#2e96491599a96cde1b515d5674a8f7a91452926a" integrity sha512-OfWGQTb9vnwRjwtA2QwpG2ICclHC3pgXZO5xt8H2EfgDquO0qVdSb5T88L4qJVAEugbS56pAuV4XZM58UX8ulw== -rsvp@^4.0.1, rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4, rsvp@^4.8.5: +rsvp@^4.0.1, rsvp@^4.6.1, rsvp@^4.7.0, rsvp@^4.8.0, rsvp@^4.8.1, rsvp@^4.8.2, rsvp@^4.8.3, rsvp@^4.8.4, rsvp@^4.8.5: version "4.8.5" resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== @@ -16242,6 +16338,14 @@ source-map-support@^0.4.15: dependencies: source-map "^0.5.6" +source-map-support@^0.5.0: + version "0.5.20" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.20.tgz#12166089f8f5e5e8c56926b377633392dd2cb6c9" + integrity sha512-n1lZZ8Ve4ksRqizaBQgxXDgKwttHDhyfQjA6YZZn8+AroHbsIz+JjwxQDxbp+7y5OYCI8t1Yk7etjD9CRd2hIw== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map-support@^0.5.16, source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@~0.5.10, source-map-support@~0.5.12, source-map-support@~0.5.19: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61"