diff --git a/CHANGELOG.md b/CHANGELOG.md index ca44a2d0..bbeae454 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,22 @@ +## 2.5.0 (August 12, 2019) + +### pack + +* Redesigned `option-parser` with encapsulated theme option support and environment variable overriding. +* Fixed V8 snapshot failure when attempting to polyfill `.toLocaleString`, but `Int8Array.prototype.toLocaleString` already exists. +* Fixed bug where undefined `ri` values would result in `Infinity` pixel values. + +### test + +* Added mock support for `.animate`. +* Added support for theme-based iLib resbundle resource paths. +* Fixed `.env` files not being processed and loaded into `process.env`. + +### template + +* Added support for `type` template property (used during project creation messages if `prepare` is not overriden). Defaults to `'app'`. +* Fixed bug where template function parameters `defaultGenerator` and `type` could be accidentally overriden via command line arguments. + ## 2.4.1 (July 14, 2019) * Fixed alias prioritization for iLib to correctly locate/index iLib when build framework builds. diff --git a/bin/enact.js b/bin/enact.js index 9c44276a..f11ff38c 100755 --- a/bin/enact.js +++ b/bin/enact.js @@ -59,6 +59,7 @@ if (process.argv.indexOf('-v') >= 0 || process.argv.indexOf('--version') >= 0) { case 'transpile': case 'pack': case 'clean': + case 'info': case 'test': case 'eject': case 'template': diff --git a/commands/create.js b/commands/create.js index 4e55b4ae..11f33456 100755 --- a/commands/create.js +++ b/commands/create.js @@ -18,13 +18,14 @@ const minimist = require('minimist'); const validatePackageName = require('validate-npm-package-name'); const ENACT_DEV_NPM = '@enact/cli'; -const CORE_JS_NPM = 'core-js@2'; +const CORE_JS_NPM = 'core-js@3'; const INCLUDED = path.dirname(require.resolve('@enact/template-moonstone')); const TEMPLATE_DIR = path.join(process.env.APPDATA || os.homedir(), '.enact'); const defaultGenerator = { overwrite: false, install: true, + type: 'app', validate: ({template, name}) => { const validation = validatePackageName(name); @@ -53,7 +54,7 @@ const defaultGenerator = { } } }, - prepare: ({directory, name}) => { + prepare: ({directory, name, type}) => { // After the workspace is ensured to exist, but before template is copied const validFiles = [ // Generic project fragments and outside tool configs. @@ -82,9 +83,9 @@ const defaultGenerator = { ]; const rel = path.relative(process.cwd(), directory); if (!rel || rel === '.') { - console.log('Creating a new Enact app...'); + console.log(`Creating a new Enact ${type}...`); } else { - console.log(`Creating a new Enact app in ${rel}...`); + console.log(`Creating a new Enact ${type} in ${rel}...`); } console.log(); @@ -146,8 +147,11 @@ const defaultGenerator = { }; function displayHelp() { + let e = 'node ' + path.relative(process.cwd(), __filename); + if (require.main !== module) e = 'enact create'; + console.log(' Usage'); - console.log(' enact create [options] []'); + console.log(` ${e} [options] []`); console.log(); console.log(' Arguments'); console.log(' directory Optional destination directory'); @@ -248,7 +252,7 @@ function npmInstall(directory, verbose, ...rest) { function api(opts = {}) { return resolveTemplateGenerator(opts.template).then(({generator, templatePath}) => { - const params = Object.assign({opts, defaultGenerator}, opts); + const params = Object.assign({}, opts, {opts, defaultGenerator, type: generator.type}); return new Promise(resolve => resolve(generator.validate && generator.validate(params))) .then(() => fs.ensureDir(opts.directory)) diff --git a/commands/eject.js b/commands/eject.js index d5fe0315..21b41eed 100755 --- a/commands/eject.js +++ b/commands/eject.js @@ -51,8 +51,11 @@ const bareTasks = { }; function displayHelp() { + let e = 'node ' + path.relative(process.cwd(), __filename); + if (require.main !== module) e = 'enact eject'; + console.log(' Usage'); - console.log(' enact eject [options]'); + console.log(` ${e} [options]`); console.log(); console.log(' Options'); console.log(' -b, --bare Abandon Enact CLI command enhancements'); diff --git a/commands/info.js b/commands/info.js new file mode 100644 index 00000000..37e2446f --- /dev/null +++ b/commands/info.js @@ -0,0 +1,174 @@ +/* eslint-env node, es6 */ +const path = require('path'); +const fs = require('fs'); +const chalk = require('chalk'); +const spawn = require('cross-spawn'); +const minimist = require('minimist'); +const resolveSync = require('resolve').sync; + +function displayHelp() { + let e = 'node ' + path.relative(process.cwd(), __filename); + if (require.main !== module) e = 'enact info'; + + console.log(' Usage'); + console.log(` ${e} [options]`); + console.log(); + console.log(' Options'); + console.log(' --dev Include dev dependencies'); + console.log(' --cli Display CLI information'); + console.log(' -v, --version Display version information'); + console.log(' -h, --help Display help information'); + console.log(); + process.exit(0); +} + +function logVersion(pkg, rel = __dirname) { + try { + const jsonPath = resolveSync(pkg + '/package.json', {basedir: rel}); + const meta = require(jsonPath); + const dir = path.dirname(jsonPath); + if (fs.lstatSync(dir).isSymbolicLink()) { + const realDir = fs.realpathSync(dir); + const git = gitInfo(realDir); + console.log(meta.name + ': ' + (git || meta.version)); + console.log(chalk.cyan('\tSymlinked from'), realDir); + } else { + console.log(meta.name + ': ' + meta.version); + } + } catch (e) { + console.log(pkg + ': ' + chalk.red('')); + } +} + +function gitInfo(dir) { + const git = (args = []) => { + try { + const result = spawn.sync('git', args, {encoding: 'utf8', cwd: dir, env: process.env}); + if (!result.error && result.status === 0) return result.stdout.trim(); + } catch (e) {} + }; + const tag = git(['describe', '--tags', '--exact-match']); + if (tag) { + return chalk.green(`${tag} (git)`); + } else { + const branch = git(['symbolic-ref', '-q', '--short', 'HEAD']) || 'HEAD'; + const commit = git(['rev-parse', '--short', 'HEAD']); + if (commit) return chalk.green(`${branch} @ ${commit} (git)`); + } +} + +function globalModules() { + try { + const result = spawn.sync('npm', ['config', 'get', 'prefix', '-g'], { + cwd: process.cwd(), + env: process.env + }); + if (result.error || result.status !== 0 || !(result.stdout = result.stdout.trim())) { + return require('global-modules'); + } else if (process.platform === 'win32' || ['msys', 'cygwin'].includes(process.env.OSTYPE)) { + return path.resolve(result.stdout, 'node_modules'); + } else { + return path.resolve(result.stdout, 'lib/node_modules'); + } + } catch (e) { + return require('global-modules'); + } +} + +function api({cliInfo = false, dev = false} = {}) { + return new Promise((resolve, reject) => { + try { + if (cliInfo) { + // Display info on CLI itself + const gm = globalModules(); + const gCLI = path.join(gm, '@enact', 'cli'); + const isGlobal = + fs.existsSync(gCLI) && + path.dirname(require.resolve(path.join(gCLI, 'package.json'))) === path.dirname(__dirname); + console.log(chalk.yellow.bold('==Enact CLI Info==')); + if (isGlobal && fs.lstatSync(gCLI).isSymbolicLink()) { + const ver = gitInfo(__dirname) || require('../package.json').version; + console.log(`Enact CLI: ${ver}`); + console.log(chalk.cyan('\tSymlinked from'), path.dirname(__dirname)); + } else { + console.log(`@enact/cli: ${require('../package.json').version}`); + } + console.log(`Installed Globally: ${isGlobal}`); + if (isGlobal) console.log(`Global Modules: ${gm}`); + console.log(); + + // Display info on in-house components, likely to be linked in + console.log(chalk.yellow.bold('==Enact Components==')); + [ + '@enact/dev-utils', + 'eslint-config-enact', + 'eslint-plugin-enact', + 'postcss-resolution-independence' + ].forEach(dep => logVersion(dep)); + console.log(); + + // Display info on notable 3rd party components + console.log(chalk.yellow.bold('==Third Party Components==')); + console.log(`Babel: ${require('@babel/core/package.json').version}`); + console.log(`ESLint: ${require('eslint/package.json').version}`); + console.log(`Jest: ${require('jest/package.json').version}`); + console.log(`LESS: ${require('less/package.json').version}`); + console.log(`Webpack: ${require('webpack/package.json').version}`); + } else { + const app = require('@enact/dev-utils').optionParser; + const meta = require(path.join(app.context, 'package.json')); + const bl = require(resolveSync('browserslist', { + basedir: path.dirname(require.resolve('@enact/dev-utils/package.json')), + preserveSymlinks: false + })); + app.setEnactTargetsAsDefault(); + console.log(chalk.yellow.bold('==Project Info==')); + console.log(`Name: ${app.name}`); + console.log(`Version: ${gitInfo(app.context) || meta.version}`); + console.log(`Path: ${app.context}`); + console.log(`Theme: ${(app.theme || {}).name}`); + if (app.proxer) console.log(`Serve Proxy: ${app.proxy}`); + if (app.template) console.log(`Template: ${app.template}`); + if (app.externalStartup) console.log(`External Startup: ${app.externalStartup}`); + if (app.deep) console.log(`Deep: ${app.deep}`); + if (app.forceCSSModules) console.log(`Force CSS Modules: ${app.forceCSSModules}`); + console.log(`Resolution Independence: ${JSON.stringify(app.ri)}`); + console.log(`Browserslist: ${bl.loadConfig({path: app.context})}`); + console.log(`Environment: ${app.environment}`); + console.log(); + console.log(chalk.yellow.bold('==Dependencies==')); + if (meta.dependencies) { + Object.keys(meta.dependencies).forEach(dep => { + logVersion(dep, app.context); + }); + } + if (dev && meta.devDependencies) { + console.log(); + console.log(chalk.yellow.bold('==Dev Dependencies==')); + Object.keys(meta.devDependencies).forEach(dep => { + logVersion(dep, app.context); + }); + } + } + resolve(); + } catch (e) { + reject(e); + } + }); +} + +function cli(args) { + const opts = minimist(args, { + boolean: ['cli', 'help'], + alias: {h: 'help'} + }); + if (opts.help) displayHelp(); + + api({cliInfo: opts.cli, dev: opts.dev}).catch(err => { + console.error(chalk.red('ERROR: ') + 'Failed to display info.\n' + err.message); + process.exit(1); + }); +} + +module.exports = {api, cli}; +if (require.main === module) cli(process.argv.slice(2)); diff --git a/commands/link.js b/commands/link.js index 684088fd..18662acd 100755 --- a/commands/link.js +++ b/commands/link.js @@ -7,8 +7,11 @@ const minimist = require('minimist'); const packageRoot = require('@enact/dev-utils').packageRoot; function displayHelp() { + let e = 'node ' + path.relative(process.cwd(), __filename); + if (require.main !== module) e = 'enact link'; + console.log(' Usage'); - console.log(' enact link [options]'); + console.log(` ${e} [options]`); console.log(); console.log(' Options'); console.log(' --verbose Verbose output logging'); diff --git a/commands/pack.js b/commands/pack.js index cfa34b59..c34b1db6 100755 --- a/commands/pack.js +++ b/commands/pack.js @@ -177,11 +177,13 @@ function watch(config) { function api(opts = {}) { if (opts.meta) { - let meta; - try { - meta = JSON.parse(opts.meta); - } catch (e) { - throw new Error('Invalid metadata; must be a valid JSON string.\n' + e.message); + let meta = opts.meta; + if (typeof meta === 'string') { + try { + meta = JSON.parse(opts.meta); + } catch (e) { + throw new Error('Invalid metadata; must be a valid JSON string.\n' + e.message); + } } app.applyEnactMeta(meta); } diff --git a/commands/template.js b/commands/template.js index e0d455d6..fe0fb53f 100755 --- a/commands/template.js +++ b/commands/template.js @@ -14,35 +14,38 @@ const INCLUDED = path.dirname(require.resolve('@enact/template-moonstone')); const DEFAULT_LINK = path.join(TEMPLATE_DIR, 'default'); function displayHelp() { + let e = 'node ' + path.relative(process.cwd(), __filename); + if (require.main !== module) e = 'enact template'; + console.log(' Usage'); - console.log(' enact template ...'); + console.log(` ${e} ...`); console.log(); console.log(' Actions'); - console.log(' enact template install [source] [name]'); + console.log(` ${e} install [source] [name]`); console.log(chalk.dim(' Install a template from a local or remote source')); console.log(); console.log(' source Git URI, npm package or local directory'); console.log(' (default: cwd)'); console.log(' name Specific name for the template'); console.log(); - console.log(' enact template link [directory] [name]'); + console.log(` ${e} link [directory] [name]`); console.log(chalk.dim(' Symlink a directory into template management')); console.log(); console.log(' directory Local directory path to link'); console.log(' (default: cwd)'); console.log(' name Specific name for the template'); console.log(); - console.log(' enact template remove '); + console.log(` ${e} remove `); console.log(chalk.dim(' Remove a template by name')); console.log(); console.log(' name Name of template to remove'); console.log(); - console.log(' enact template default [name]'); + console.log(` ${e} default [name]`); console.log(chalk.dim(' Choose a default template for "enact create"')); console.log(); console.log(' name Specific template to set default'); console.log(); - console.log(' enact template list'); + console.log(` ${e} list`); console.log(chalk.dim(' List all templates installed/linked')); console.log(); console.log(' Options'); diff --git a/commands/transpile.js b/commands/transpile.js index 2bb656fb..009290c6 100755 --- a/commands/transpile.js +++ b/commands/transpile.js @@ -21,8 +21,11 @@ const lessPlugins = [ ]; function displayHelp() { + let e = 'node ' + path.relative(process.cwd(), __filename); + if (require.main !== module) e = 'enact transpile'; + console.log(' Usage'); - console.log(' enact transpile [options]'); + console.log(` ${e} [options]`); console.log(); console.log(' Options'); console.log(' -i, --ignore Pattern of filepaths to ignore'); diff --git a/config/jest/jest.config.js b/config/jest/jest.config.js index 12695604..8207739c 100644 --- a/config/jest/jest.config.js +++ b/config/jest/jest.config.js @@ -10,25 +10,25 @@ */ const fs = require('fs'); const path = require('path'); -const {packageRoot} = require('@enact/dev-utils'); +const {optionParser: app} = require('@enact/dev-utils'); -// Do this as the first thing so that any code reading it knows the right env. -process.env.BABEL_ENV = 'test'; -process.env.NODE_ENV = 'test'; -process.env.PUBLIC_URL = ''; -process.env.BROWSERSLIST = 'current node'; - -const pkg = packageRoot(); const iLibDirs = ['node_modules/@enact/i18n/ilib', 'node_modules/ilib', 'ilib']; const globals = { __DEV__: true, - ILIB_BASE_PATH: iLibDirs.find(f => fs.existsSync(path.join(pkg.path, f))) || iLibDirs[1], + ILIB_BASE_PATH: iLibDirs.find(f => fs.existsSync(path.join(app.context, f))) || iLibDirs[1], ILIB_RESOURCES_PATH: 'resources', - ILIB_CACHE_ID: new Date().getTime() + '', - ILIB_MOONSTONE_PATH: 'node_modules/@enact/moonstone/resources' + ILIB_CACHE_ID: new Date().getTime() + '' }; -if (pkg.meta.name === '@enact/moonstone') { +for (let t = app.theme; t; t = t.theme) { + const themeEnv = path + .basename(t.name) + .replace(/[-_\s]/g, '_') + .toUpperCase(); + globals[themeEnv] = path.relative(app.context, path.join(t.path, 'resources')).replace(/\\/g, '/'); +} + +if (app.name === '@enact/moonstone') { globals.ILIB_MOONSTONE_PATH = 'resources'; globals.ILIB_RESOURCES_PATH = '_resources_'; } @@ -41,6 +41,15 @@ const ignorePatterns = [ '/(.*/)*dist/' ]; +// Setup env var to signify a testing environment +process.env.BABEL_ENV = 'test'; +process.env.NODE_ENV = 'test'; +process.env.PUBLIC_URL = ''; +process.env.BROWSERSLIST = 'current node'; + +// Load applicable .env files into environment variables. +require('../dotenv').load(app.context); + module.exports = { collectCoverageFrom: ['**/*.{js,jsx,ts,tsx}', '!**/*.d.ts'], coveragePathIgnorePatterns: ignorePatterns, @@ -68,9 +77,9 @@ module.exports = { '^.+\\.module\\.(css|less)$': require.resolve('identity-obj-proxy'), '^enzyme$': require.resolve('enzyme'), // Backward compatibility for new iLib location with old Enact - '^ilib[/](.*)$': path.join(pkg.path, globals.ILIB_BASE_PATH, '$1'), + '^ilib[/](.*)$': path.join(app.context, globals.ILIB_BASE_PATH, '$1'), // Backward compatibility for old iLib location with new Enact - '^@enact[/]i18n[/]ilib[/](.*)$': path.join(pkg.path, globals.ILIB_BASE_PATH, '$1') + '^@enact[/]i18n[/]ilib[/](.*)$': path.join(app.context, globals.ILIB_BASE_PATH, '$1') }, moduleFileExtensions: ['js', 'jsx', 'json', 'ts', 'tsx'], globals diff --git a/config/jest/setupTests.js b/config/jest/setupTests.js index 0c14f455..ff6fe54a 100644 --- a/config/jest/setupTests.js +++ b/config/jest/setupTests.js @@ -84,3 +84,17 @@ class ILibXHR extends XHR { } } global.XMLHttpRequest = ILibXHR; + +global.Element.prototype.animate = jest.fn().mockImplementation(() => { + const animation = { + onfinish: null, + cancel: () => { + if (animation.onfinish) animation.onfinish(); + }, + finish: () => { + if (animation.onfinish) animation.onfinish(); + } + }; + + return animation; +}); diff --git a/config/polyfills.js b/config/polyfills.js index f7291f08..81218ead 100644 --- a/config/polyfills.js +++ b/config/polyfills.js @@ -9,12 +9,18 @@ if (!global.skipPolyfills && !global._babelPolyfill) { // Temporarily remap [Array].toLocaleString to [Array].toString. // Fixes an issue with loading the polyfills within the v8 snapshot environment // where toLocaleString() within the TypedArray polyfills causes snapshot failure. - var origToLocaleString = Array.prototype.toLocaleString; + var origToLocaleString = Array.prototype.toLocaleString, + origTypedToLocaleString; Array.prototype.toLocaleString = Array.prototype.toString; + if (global.Int8Array && Int8Array.prototype.toLocaleString) { + origTypedToLocaleString = Int8Array.prototype.toLocaleString; + Int8Array.prototype.toLocaleString = Int8Array.prototype.toString; + } // Apply core-js polyfills require('./corejs-proxy'); // Restore real [Array].toLocaleString for runtime usage. - Array.prototype.toLocaleString = origToLocaleString; + if (origToLocaleString) Array.prototype.toLocaleString = origToLocaleString; + if (origTypedToLocaleString) Int8Array.prototype.toLocaleString = origTypedToLocaleString; } diff --git a/config/webpack.config.js b/config/webpack.config.js index a2544567..dd44a729 100644 --- a/config/webpack.config.js +++ b/config/webpack.config.js @@ -102,7 +102,7 @@ module.exports = function(env) { features: {'custom-properties': false} }), // Resolution indepedence support - app.ri && require('postcss-resolution-independence')(app.ri) + app.ri !== false && require('postcss-resolution-independence')(app.ri) ].filter(Boolean) } } diff --git a/docs/serving-apps.md b/docs/serving-apps.md index bf90d586..5bceddc2 100644 --- a/docs/serving-apps.md +++ b/docs/serving-apps.md @@ -15,7 +15,10 @@ order: 6 The `enact serve` command (aliased as `npm run serve`) will build and host your project on **http://localhost:8080/**. The options allow you to customize the host IP and host port, which can also be overriden via `HOST` and `PORT` environment variable. While the `enact serve` is active, any changes to source code will trigger a rebuild and update any loaded browser windows. ## Custom Proxy -Additional custom HTTP proxy options can declared in the project's **package.json** within the `enact` object's `proxy` property. + +Enact CLI uses [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) to allow applications to redirect HTTP requests to the proxy URL. When a resource is requested such as `fetch('/api/data')`, the development server will recognize that path does not represent a static asset and will redirect to the proxy path (e.g. `http://localhost:4000/api/data`). + +This feature can be configured in the project's **package.json** within the `enact` object's `proxy` property. For example: ```js @@ -23,11 +26,11 @@ For example: ... "enact": { ... - "proxy": { ... } + "proxy": "http://localhost:4000" ... + } ... } ``` -See [http-proxy-middleware](https://github.com/chimurai/http-proxy-middleware) for details on available configurations. > **NOTE** The `serve` command opens a port for connections from outside the current machine. Firewall software may block or be used to block access to this port. diff --git a/index.js b/index.js index 26631fc5..223c4b9f 100644 --- a/index.js +++ b/index.js @@ -1,13 +1,24 @@ -module.exports = { - create: require('./commands/create').api, - link: require('./commands/link').api, - pack: require('./commands/pack').api, - serve: require('./commands/serve').api, - clean: require('./commands/clean').ali, - lint: require('./commands/lint').api, - test: require('./commands/test').api, - eject: require('./commands/eject').api, - template: require('./commands/template').api, - transpile: require('./commands/transpile').api, - license: require('./commands/license').api +const exportAPIs = commands => { + commands.forEach(name => { + Object.defineProperty(module.exports, name, { + configurable: false, + enumerable: true, + get: () => require(`./commands/${name}`).api + }); + }); }; + +exportAPIs([ + // List of commands to export via getters + 'create', + 'link', + 'pack', + 'serve', + 'clean', + 'lint', + 'test', + 'eject', + 'template', + 'transpile', + 'license' +]); diff --git a/package-lock.json b/package-lock.json index d2e7a17f..23bcd953 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "@enact/cli", - "version": "2.4.1", + "version": "2.5.0", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -880,9 +880,9 @@ "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==" }, "@enact/dev-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@enact/dev-utils/-/dev-utils-2.3.0.tgz", - "integrity": "sha512-mUp6T1nYvGgEvKAyvCqaEKFnw8eAS5w4yGtNalVx4T8KUAzSx/0nnYuXCUUnN09bfwnWULiCqMKzhCmsVa18PA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@enact/dev-utils/-/dev-utils-2.4.0.tgz", + "integrity": "sha512-hhgHV08BPEvLYRe+GRa1w07HGTzp/H2+ix7EmvcAujgW9MxWwlNZKsMOXMsyeXhG8bS8hU/FDQ4IZVyv5G5N6w==", "requires": { "browserslist": "^4.1.0", "chalk": "^2.4.1", @@ -900,9 +900,20 @@ "react-is": "^16.7.0", "react-reconciler": "^0.20.4", "react-test-renderer": "^16.7.0", + "resolve": "^1.11.1", "tapable": "^1.1.0", "webpack-bundle-analyzer": "^3.3.2", "webpack-sources": "^1.2.0" + }, + "dependencies": { + "resolve": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.1.tgz", + "integrity": "sha512-vIpgF6wfuJOZI7KKKSP+HmiKggadPQAdsp5HiC1mvqnfp0gF1vdwgBWZIdrVft9pgqoMFQN+R7BSWZiBxx+BBw==", + "requires": { + "path-parse": "^1.0.6" + } + } } }, "@enact/template-moonstone": { @@ -1923,21 +1934,14 @@ } }, "bfj": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", - "integrity": "sha512-BmBJa4Lip6BPRINSZ0BPEIfB1wUY/9rwbwvIHQA1KjX9om29B6id0wnWXq7m3bn5JrUVjeOTnVuhPT1FiHwPGw==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.1.tgz", + "integrity": "sha512-+GUNvzHR4nRyGybQc2WpNJL4MJazMuvf92ueIyA0bIkPRwhhQu3IfZQ2PSoVPpCBJfmoSdOxu5rnotfFLlvYRQ==", "requires": { - "bluebird": "^3.5.5", - "check-types": "^8.0.3", - "hoopy": "^0.1.4", - "tryer": "^1.0.1" - }, - "dependencies": { - "bluebird": { - "version": "3.5.5", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" - } + "bluebird": "^3.5.1", + "check-types": "^7.3.0", + "hoopy": "^0.1.2", + "tryer": "^1.0.0" } }, "big.js": { @@ -2353,9 +2357,9 @@ "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" }, "check-types": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/check-types/-/check-types-8.0.3.tgz", - "integrity": "sha512-YpeKZngUmG65rLudJ4taU7VLkOCTMhNl/u4ctNC56LQS/zJTyNH0Lrtwm1tfTsbLlwvlfsA2d1c8vCf/Kh2KwQ==" + "version": "7.4.0", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-7.4.0.tgz", + "integrity": "sha512-YbulWHdfP99UfZ73NcUDlNJhEIDgm9Doq9GhpyXbF+7Aegi3CVV7qqMCKTTqJxlvEvnQBp9IA+dxsGN6xK/nSg==" }, "cheerio": { "version": "1.0.0-rc.2", @@ -3538,9 +3542,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "ejs": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.2.tgz", - "integrity": "sha512-PcW2a0tyTuPHz3tWyYqtK6r1fZ3gp+3Sop8Ph+ZYN81Ob5rwmbHEzaqs10N3BEsaGTkh/ooniXK+WwszGlc2+Q==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.6.1.tgz", + "integrity": "sha512-0xy4A/twfrRCnkhfk8ErDi5DqdAsAqeGxht4xkCUrsvhhbQNs7E+4jV0CN7+NKIY0aHE72+XvqtBIXzD31ZbXQ==" }, "electron-to-chromium": { "version": "1.3.155", @@ -11922,9 +11926,9 @@ } }, "ws": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", - "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.1.3.tgz", + "integrity": "sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==", "requires": { "async-limiter": "~1.0.0" } diff --git a/package.json b/package.json index bb1aed47..f612db6c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@enact/cli", - "version": "2.4.1", + "version": "2.5.0", "description": "Full-featured build environment tool for Enact applications.", "main": "index.js", "author": "Jason Robitaille ", @@ -47,7 +47,7 @@ "@babel/preset-env": "7.4.3", "@babel/preset-react": "7.0.0", "@babel/preset-typescript": "7.3.3", - "@enact/dev-utils": "2.3.0", + "@enact/dev-utils": "2.4.0", "@enact/template-moonstone": "2.3.3", "acorn": "^6.0.0", "babel-core": "7.0.0-bridge.0",