diff --git a/README.md b/README.md index 157818e..b8fe496 100644 --- a/README.md +++ b/README.md @@ -155,6 +155,4 @@ The script uses two heuristics to determine whether the keyboard is being used: or `Shift + Tab`. - focus moves into an element which requires keyboard interaction, such as a text field -- _TODO: ideally, we also trigger keyboard modality - following a keyboard event which activates an element or causes a mutation; - this still needs to be implemented._ +- We also trigger keyboard modality following a keyboard event which activates an element or causes a mutation. The following keys that typically result in a change of context or focus are handled: `Backspace`, `Enter`, `Esc`, `Space`, `PageUp`, `PageDown`, `End`, `Home`, `ArrowLeft`, `ArrowUp`, `ArrowRight`, `ArrowDown`, or `Delete`. diff --git a/dist/focus-ring.js b/dist/focus-ring.js index 48fa3ab..da5dffe 100644 --- a/dist/focus-ring.js +++ b/dist/focus-ring.js @@ -11,7 +11,7 @@ * @return {ClassList} */ -var index = function (el) { +var domClasslist = function (el) { return new ClassList(el); }; @@ -170,11 +170,47 @@ ClassList.prototype.toggle = function (token, force) { return (typeof force == 'boolean' ? force : !hasToken); }; +// element-closest | CC0-1.0 | github.com/jonathantneal/closest + +(function (ElementProto) { + if (typeof ElementProto.matches !== 'function') { + ElementProto.matches = ElementProto.msMatchesSelector || ElementProto.mozMatchesSelector || ElementProto.webkitMatchesSelector || function matches(selector) { + var element = this; + var elements = (element.document || element.ownerDocument).querySelectorAll(selector); + var index = 0; + + while (elements[index] && elements[index] !== element) { + ++index; + } + + return Boolean(elements[index]); + }; + } + + if (typeof ElementProto.closest !== 'function') { + ElementProto.closest = function closest(selector) { + var element = this; + + while (element && element.nodeType === 1) { + if (element.matches(selector)) { + return element; + } + + element = element.parentNode; + } + + return null; + }; + } +})(window.Element.prototype); + /** * https://github.com/WICG/focus-ring */ function init() { + var hadKeyboardEvent = false; var elWithFocusRing; + var elementsWithFocusRing = document.getElementsByClassName('focus-ring'); var inputTypesWhitelist = { 'radio': true, @@ -197,6 +233,121 @@ function init() { 'datetime-local': true, }; + // keys that often produce a change of context or focus + var navigationKeys = [ + 8 /* Backspace */, + 9 /* Tab */, + 13 /* Enter */, + 27 /* Esc */, + 32 /* Space */, + 33 /* PageUp */, + 34 /* PageDown */, + 35 /* End */, + 36 /* Home */, + 37 /* ArrowLeft */, + 38 /* ArrowUp */, + 39 /* ArrowRight */, + 40 /* ArrowDown */, + 46/* Delete */, + ]; + + var behavior = { + incrementable: { + inputType: { + 'checkbox': true, + 'radio': true, + 'range': true, + }, + role: { + 'button': true, + 'checkbox': true, + 'columnheading': true, + 'gridcell': true, + 'menuitem': true, + 'menuitemcheckbox': true, + 'menuitemradio': true, + 'option': true, + 'radio': true, + 'row': true, + 'rowheading': true, + 'slider': true, + 'tab': true, + 'treeitem': true, + }, + }, + selectable: { + inputType: { + 'checkbox': true, + 'radio': true, + }, + role: { + 'button': true, + 'checkbox': true, + 'columnheading': true, + 'gridcell': true, + 'menuitemcheckbox': true, + 'menuitemradio': true, + 'option': true, + 'radio': true, + 'row': true, + 'rowheading': true, + 'treeitem': true, + }, + }, + deletable: { + inputType: { + }, + role: { + 'option': true, + 'row': true, + 'tab': true, + 'treeitem': true, + }, + }, + }; + + /** + * Computes whether keyboard event should be treated as initiating focus navigation. + * @param {Event} e + * @return {boolean} + */ + function handleEventAsNavigation(e) { + if (e.altKey || e.ctrlKey || e.metaKey) + return false; + + var index = navigationKeys.indexOf(e.keyCode); + var tagName = e.target.tagName; + var inputType = tagName === 'INPUT' ? e.target.type : undefined; + var ariaRole = e.target.getAttribute('role'); + + // If key is not generally considered navigation, don't handle it as such. + if (index === -1) + return false; + + // ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Home/End, PageUp/PageDown + if (e.keyCode > 32 && e.keyCode < 41) + // Return true if target is an input or has a role and is whitelisted as 'incrementable'. + return (inputType && behavior.incrementable.inputType[inputType]) + || (ariaRole && behavior.incrementable.role[ariaRole]); + + // Enter or Space + if (e.keyCode == 13 || e.keyCode == 32) + // Return true if target is an input or has a role and is whitelisted as 'selectable'. + return (inputType && behavior.selectable.inputType[inputType]) + || (ariaRole && behavior.selectable.role[ariaRole]); + + // Esc key when target is a descendant of a dialog or menu. + if (e.keyCode == 27) + return event.target.closest('[role$="dialog"],[role="menu"]') !== null; + + // Backspace or Delete + if (e.keyCode == 8 || e.keyCode == 46) + // Return true if target has a role and is whitelisted as 'deletable'. + return ariaRole && behavior.deletable.role[ariaRole]; + + return e.keyCode == 9; + } + /** * Computes whether the given element should automatically trigger the * `focus-ring` class being added, i.e. whether it should always match @@ -226,9 +377,9 @@ function init() { * @param {Element} el */ function addFocusRingClass(el) { - if (index(el).contains('focus-ring')) + if (domClasslist(el).contains('focus-ring')) return; - index(el).add('focus-ring'); + domClasslist(el).add('focus-ring'); el.setAttribute('data-focus-ring-added', ''); } @@ -240,32 +391,52 @@ function init() { function removeFocusRingClass(el) { if (!el.hasAttribute('data-focus-ring-added')) return; - index(el).remove('focus-ring'); + domClasslist(el).remove('focus-ring'); el.removeAttribute('data-focus-ring-added'); } /** - * On `keyup` add `focus-ring` class if the user pressed Tab and the event - * target is an element that will likely require interaction via the - * keyboard (e.g. a text box). - * The `keyup` event is used over the focus event because: - * 1. `focus` is a device-independent event, and `keyup` ensures the - * `focus-ring` class is only added when focus originates from - * keyboard navigation. - * 2. Unlike `focus`, keyup` will fire when the user navigates from the - * browser chrome into the document. (For more, see issue #15) + * On `keydown`, set `hadKeyboardEvent`, add `focus-ring` class if the + * key was Tab or another navigation key. * @param {Event} e */ - function onKeyUp(e) { - if (e.altKey || e.ctrlKey || e.metaKey) + function onKeyDown(e) { + if (!handleEventAsNavigation(e)) return; - if (e.keyCode != 9) + hadKeyboardEvent = true; + } + + /** + * On `mousedown`, unset `hadKeyboardEvent`, remove `focus-ring` class from elements where not + * originally added by the author. + * @param {Event} e + */ + function onMouseDown(e) { + hadKeyboardEvent = false; + if (elementsWithFocusRing.length) { + for(var i = 0; i < elementsWithFocusRing.length; i++) { + if (!focusTriggersKeyboardModality(elementsWithFocusRing[i])) { + removeFocusRingClass(elementsWithFocusRing[i]); + } + } + } + } + + /** + * On `focus`, add the `focus-ring` class to the target if: + * - the target received focus as a result of keyboard navigation + * - the event target is an element that will likely require interaction + * via the keyboard (e.g. a text box) + * @param {Event} e + */ + function onFocus(e) { + if (e.target == document) return; - var target = e.target; - if (focusTriggersKeyboardModality(target)) { - addFocusRingClass(target); + if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) { + addFocusRingClass(e.target); + hadKeyboardEvent = false; } } @@ -304,7 +475,7 @@ function init() { // document.activeElement === null if (!document.activeElement) return; - if (index(document.activeElement).contains('focus-ring')) { + if (domClasslist(document.activeElement).contains('focus-ring')) { // Keep a reference to the element to which the focus-ring class is applied // so the focus-ring class can be restored to it if the window regains // focus after being blurred. @@ -312,12 +483,14 @@ function init() { } } - document.addEventListener('keyup', onKeyUp, true); + document.addEventListener('keydown', onKeyDown, true); + document.addEventListener('mousedown', onMouseDown, true); + document.addEventListener('focus', onFocus, true); document.addEventListener('blur', onBlur, true); window.addEventListener('focus', onWindowFocus, true); window.addEventListener('blur', onWindowBlur, true); - index(document.body).add('js-focus-ring'); + domClasslist(document.body).add('js-focus-ring'); } /** diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..9f25f75 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,1642 @@ +{ + "name": "wicg-focus-ring", + "version": "2.0.1", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "acorn": { + "version": "5.1.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/acorn/-/acorn-5.1.2.tgz", + "integrity": "sha1-kRy1PgNoB88Pp3jcXTcPvYZCRtc=", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ajv-keywords": { + "version": "1.5.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/ajv-keywords/-/ajv-keywords-1.5.1.tgz", + "integrity": "sha1-MU3QpLM2j609/NxU7eYXG4htrzw=", + "dev": true + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/brace-expansion/-/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-resolve": { + "version": "1.11.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/browser-resolve/-/browser-resolve-1.11.2.tgz", + "integrity": "sha1-j/CbCixCFxihBRwmCzLkj0QpOM4=", + "dev": true, + "requires": { + "resolve": "1.1.7" + }, + "dependencies": { + "resolve": { + "version": "1.1.7", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/resolve/-/resolve-1.1.7.tgz", + "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", + "dev": true + } + } + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha1-gVyZ6oT2gJUp0vRXkb34JxE1LWY=", + "dev": true + }, + "cli-cursor": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/cli-cursor/-/cli-cursor-1.0.2.tgz", + "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "dev": true, + "requires": { + "restore-cursor": "1.0.1" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", + "dev": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.3", + "typedarray": "0.0.6" + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "d": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/d/-/d-1.0.0.tgz", + "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", + "dev": true, + "requires": { + "es5-ext": "0.10.30" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/debug/-/debug-2.6.9.tgz", + "integrity": "sha1-XRKFFd8TT/Mn6QpMk/Tgd6U2NB8=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "doctrine": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/doctrine/-/doctrine-2.0.0.tgz", + "integrity": "sha1-xz2NKQnSIpHhoAejlYBNqLZl/mM=", + "dev": true, + "requires": { + "esutils": "2.0.2", + "isarray": "1.0.0" + } + }, + "dom-classlist": { + "version": "1.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/dom-classlist/-/dom-classlist-1.0.1.tgz", + "integrity": "sha1-cigU3C9QnT19BvJTO6n/SO7qWbk=" + }, + "element-closest": { + "version": "2.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/element-closest/-/element-closest-2.0.2.tgz", + "integrity": "sha1-cqdAoQdFM4LijfnOXbtajfD5Zuw=" + }, + "es5-ext": { + "version": "0.10.30", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/es5-ext/-/es5-ext-0.10.30.tgz", + "integrity": "sha1-cUGhaDZpfbq/qq7uQUlc4p9SyTk=", + "dev": true, + "requires": { + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "es6-iterator": { + "version": "2.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/es6-iterator/-/es6-iterator-2.0.1.tgz", + "integrity": "sha1-jjGcnwRTv1ddN0lAplWSDlnKVRI=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-symbol": "3.1.1" + } + }, + "es6-map": { + "version": "0.1.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/es6-map/-/es6-map-0.1.5.tgz", + "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-iterator": "2.0.1", + "es6-set": "0.1.5", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-set": { + "version": "0.1.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/es6-set/-/es6-set-0.1.5.tgz", + "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1", + "event-emitter": "0.3.5" + } + }, + "es6-symbol": { + "version": "3.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/es6-symbol/-/es6-symbol-3.1.1.tgz", + "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30" + } + }, + "es6-weak-map": { + "version": "2.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/es6-weak-map/-/es6-weak-map-2.0.2.tgz", + "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30", + "es6-iterator": "2.0.1", + "es6-symbol": "3.1.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escope": { + "version": "3.6.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/escope/-/escope-3.6.0.tgz", + "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", + "dev": true, + "requires": { + "es6-map": "0.1.5", + "es6-weak-map": "2.0.2", + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint": { + "version": "3.19.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/eslint/-/eslint-3.19.0.tgz", + "integrity": "sha1-yPxiAcf0DdCJQbh8CFdnOGpnmsw=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "chalk": "1.1.3", + "concat-stream": "1.6.0", + "debug": "2.6.9", + "doctrine": "2.0.0", + "escope": "3.6.0", + "espree": "3.5.1", + "esquery": "1.0.0", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "glob": "7.1.2", + "globals": "9.18.0", + "ignore": "3.3.5", + "imurmurhash": "0.1.4", + "inquirer": "0.12.0", + "is-my-json-valid": "2.16.1", + "is-resolvable": "1.0.0", + "js-yaml": "3.10.0", + "json-stable-stringify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "1.2.1", + "progress": "1.1.8", + "require-uncached": "1.0.3", + "shelljs": "0.7.8", + "strip-bom": "3.0.0", + "strip-json-comments": "2.0.1", + "table": "3.8.3", + "text-table": "0.2.0", + "user-home": "2.0.0" + } + }, + "eslint-config-google": { + "version": "0.7.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/eslint-config-google/-/eslint-config-google-0.7.1.tgz", + "integrity": "sha1-VZj4SY6eB4Qg80uASVuNlZ9lH7I=", + "dev": true + }, + "espree": { + "version": "3.5.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/espree/-/espree-3.5.1.tgz", + "integrity": "sha1-DJiLirRttTEAoZVK5LqZXd0n2H4=", + "dev": true, + "requires": { + "acorn": "5.1.2", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "estree-walker": { + "version": "0.5.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/estree-walker/-/estree-walker-0.5.0.tgz", + "integrity": "sha1-quO1fELeuAEONJyJJGLw5xxd0ao=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-emitter": { + "version": "0.3.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", + "dev": true, + "requires": { + "d": "1.0.0", + "es5-ext": "0.10.30" + } + }, + "exit-hook": { + "version": "1.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/exit-hook/-/exit-hook-1.1.1.tgz", + "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "figures": { + "version": "1.7.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/glob/-/glob-7.1.2.tgz", + "integrity": "sha1-wZyd+aAocC1nhhI4SmVSQExjbRU=", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/globals/-/globals-9.18.0.tgz", + "integrity": "sha1-qjiWs+abSH8X4x7SFD1pqOMMLYo=", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "ignore": { + "version": "3.3.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/ignore/-/ignore-3.3.5.tgz", + "integrity": "sha1-xOcVRV9gc6jX5drnLS/J1xZj26Y=", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "inquirer": { + "version": "0.12.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/inquirer/-/inquirer-0.12.0.tgz", + "integrity": "sha1-HvK/1jUE3wvHV4X/+MLEHfEvB34=", + "dev": true, + "requires": { + "ansi-escapes": "1.4.0", + "ansi-regex": "2.1.1", + "chalk": "1.1.3", + "cli-cursor": "1.0.2", + "cli-width": "2.2.0", + "figures": "1.7.0", + "lodash": "4.17.4", + "readline2": "1.0.1", + "run-async": "0.1.0", + "rx-lite": "3.1.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.0.4", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/interpret/-/interpret-1.0.4.tgz", + "integrity": "sha1-ggzdWIuGj/sZGoCVBtbJyPISsbA=", + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-module": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha1-Mlj7afeMFNW4FdZkM2tM/7ZEFZE=", + "dev": true + }, + "is-my-json-valid": { + "version": "2.16.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-my-json-valid/-/is-my-json-valid-2.16.1.tgz", + "integrity": "sha1-WoRnd+LCYg0eaRBOXToDsfYIjxE=", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-resolvable": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-resolvable/-/is-resolvable-1.0.0.tgz", + "integrity": "sha1-jfV8YeouPFAUCNEA+wE8+NbgzGI=", + "dev": true, + "requires": { + "tryit": "1.0.3" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "lodash": { + "version": "4.17.4", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + }, + "magic-string": { + "version": "0.22.4", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/magic-string/-/magic-string-0.22.4.tgz", + "integrity": "sha1-MQObTkA2Y5VhjB1s+Bk8U5F0df8=", + "dev": true, + "requires": { + "vlq": "0.2.3" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "dev": true, + "requires": { + "brace-expansion": "1.1.8" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "mute-stream": { + "version": "0.0.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/mute-stream/-/mute-stream-0.0.5.tgz", + "integrity": "sha1-j7+rsKmKJT0xhDMfno3rc3L6xsA=", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "1.1.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/onetime/-/onetime-1.1.0.tgz", + "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "dev": true + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "2.0.4" + } + }, + "pluralize": { + "version": "1.2.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/pluralize/-/pluralize-1.2.1.tgz", + "integrity": "sha1-0aIUg/0iu0HlihL6NCGCMUCJfEU=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "progress": { + "version": "1.1.8", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/progress/-/progress-1.1.8.tgz", + "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readline2": { + "version": "1.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/readline2/-/readline2-1.0.1.tgz", + "integrity": "sha1-QQWWCP/BVHV7cV2ZidGZ/783LjU=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "mute-stream": "0.0.5" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.4.0" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "require-relative": { + "version": "0.8.7", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/require-relative/-/require-relative-0.8.7.tgz", + "integrity": "sha1-eZlTn8ngR6N5KPoZb44VY9q9Nt4=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "resolve": { + "version": "1.4.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/resolve/-/resolve-1.4.0.tgz", + "integrity": "sha1-p1vgHFPaJdk0qY69DkxKcxL5KoY=", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "restore-cursor": { + "version": "1.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/restore-cursor/-/restore-cursor-1.0.1.tgz", + "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "dev": true, + "requires": { + "exit-hook": "1.1.1", + "onetime": "1.1.0" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha1-LtgVDSShbqhlHm1u8PR8QVjOejY=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "rollup": { + "version": "0.41.6", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/rollup/-/rollup-0.41.6.tgz", + "integrity": "sha1-4NBUl4d6OYwQTYFtJzOnGKepTio=", + "dev": true, + "requires": { + "source-map-support": "0.4.18" + } + }, + "rollup-plugin-commonjs": { + "version": "8.2.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.1.tgz", + "integrity": "sha1-XkDHg3XrFjwUx2vOadoXUOWQWi4=", + "dev": true, + "requires": { + "acorn": "5.1.2", + "estree-walker": "0.5.0", + "magic-string": "0.22.4", + "resolve": "1.4.0", + "rollup-pluginutils": "2.0.1" + } + }, + "rollup-plugin-node-resolve": { + "version": "3.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz", + "integrity": "sha1-i4l8TDAw1QASd7BRSyXSygloPuA=", + "dev": true, + "requires": { + "browser-resolve": "1.11.2", + "builtin-modules": "1.1.1", + "is-module": "1.0.0", + "resolve": "1.4.0" + } + }, + "rollup-pluginutils": { + "version": "2.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz", + "integrity": "sha1-fslbNXP2VDpGpkYb2afFRFJdD8A=", + "dev": true, + "requires": { + "estree-walker": "0.3.1", + "micromatch": "2.3.11" + }, + "dependencies": { + "estree-walker": { + "version": "0.3.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/estree-walker/-/estree-walker-0.3.1.tgz", + "integrity": "sha1-5rGlHPcpJSTnI3wxLl/mZgwc4ao=", + "dev": true + } + } + }, + "rollup-watch": { + "version": "3.2.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/rollup-watch/-/rollup-watch-3.2.2.tgz", + "integrity": "sha1-XldCMunvNtqRd/RpRtgIDLJnNUs=", + "dev": true, + "requires": { + "require-relative": "0.8.7" + } + }, + "run-async": { + "version": "0.1.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/run-async/-/run-async-0.1.0.tgz", + "integrity": "sha1-yK1KXhEGYeQCp9IbUw4AnyX444k=", + "dev": true, + "requires": { + "once": "1.4.0" + } + }, + "rx-lite": { + "version": "3.1.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/rx-lite/-/rx-lite-3.1.2.tgz", + "integrity": "sha1-Gc5QLKVyZl87ZHsQk5+X/RYV8QI=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=", + "dev": true + }, + "shelljs": { + "version": "0.7.8", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/shelljs/-/shelljs-0.7.8.tgz", + "integrity": "sha1-3svPh0sNHl+3LhSxZKloMEjprLM=", + "dev": true, + "requires": { + "glob": "7.1.2", + "interpret": "1.0.4", + "rechoir": "0.6.2" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha1-Aoam3ovkJkEzhZTpfM6nXwosWF8=", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "table": { + "version": "3.8.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/table/-/table-3.8.3.tgz", + "integrity": "sha1-K7xULw/amGGnVdOUf+/Ys/UThV8=", + "dev": true, + "requires": { + "ajv": "4.11.8", + "ajv-keywords": "1.5.1", + "chalk": "1.1.3", + "lodash": "4.17.4", + "slice-ansi": "0.0.4", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha1-q5Pyeo3BPSjKyBXEYhQ6bZASrp4=", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "tryit": { + "version": "1.0.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/tryit/-/tryit-1.0.3.tgz", + "integrity": "sha1-OTvnMKlEb9Hq1tpZoBQwjzbCics=", + "dev": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "user-home": { + "version": "2.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/user-home/-/user-home-2.0.0.tgz", + "integrity": "sha1-nHC/2Babwdy/SGBODwS4tJzenp8=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "vlq": { + "version": "0.2.3", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/vlq/-/vlq-0.2.3.tgz", + "integrity": "sha1-jz5DKM9jsVQMDWfhsneDhviXWyY=", + "dev": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://artifactory.corp.adobe.com:443/artifactory/api/npm/npm-dcloud/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + } + } +} diff --git a/package.json b/package.json index ca49d8f..4cebded 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "rollup-watch": "^3.2.2" }, "dependencies": { - "dom-classlist": "^1.0.1" + "dom-classlist": "^1.0.1", + "element-closest": "^2.0.2" } } diff --git a/src/focus-ring.js b/src/focus-ring.js index 4ccecd7..1c0d534 100644 --- a/src/focus-ring.js +++ b/src/focus-ring.js @@ -1,10 +1,13 @@ import classList from 'dom-classlist'; +import 'element-closest'; /** * https://github.com/WICG/focus-ring */ function init() { + var hadKeyboardEvent = false; var elWithFocusRing; + var elementsWithFocusRing = document.getElementsByClassName('focus-ring'); var inputTypesWhitelist = { 'radio': true, @@ -27,6 +30,121 @@ function init() { 'datetime-local': true, }; + // keys that often produce a change of context or focus + var navigationKeys = [ + 8 /* Backspace */, + 9 /* Tab */, + 13 /* Enter */, + 27 /* Esc */, + 32 /* Space */, + 33 /* PageUp */, + 34 /* PageDown */, + 35 /* End */, + 36 /* Home */, + 37 /* ArrowLeft */, + 38 /* ArrowUp */, + 39 /* ArrowRight */, + 40 /* ArrowDown */, + 46/* Delete */, + ]; + + var behavior = { + incrementable: { + inputType: { + 'checkbox': true, + 'radio': true, + 'range': true, + }, + role: { + 'button': true, + 'checkbox': true, + 'columnheading': true, + 'gridcell': true, + 'menuitem': true, + 'menuitemcheckbox': true, + 'menuitemradio': true, + 'option': true, + 'radio': true, + 'row': true, + 'rowheading': true, + 'slider': true, + 'tab': true, + 'treeitem': true, + }, + }, + selectable: { + inputType: { + 'checkbox': true, + 'radio': true, + }, + role: { + 'button': true, + 'checkbox': true, + 'columnheading': true, + 'gridcell': true, + 'menuitemcheckbox': true, + 'menuitemradio': true, + 'option': true, + 'radio': true, + 'row': true, + 'rowheading': true, + 'treeitem': true, + }, + }, + deletable: { + inputType: { + }, + role: { + 'option': true, + 'row': true, + 'tab': true, + 'treeitem': true, + }, + }, + }; + + /** + * Computes whether keyboard event should be treated as initiating focus navigation. + * @param {Event} e + * @return {boolean} + */ + function handleEventAsNavigation(e) { + if (e.altKey || e.ctrlKey || e.metaKey) + return false; + + var index = navigationKeys.indexOf(e.keyCode); + var tagName = e.target.tagName; + var inputType = tagName === 'INPUT' ? e.target.type : undefined; + var ariaRole = e.target.getAttribute('role'); + + // If key is not generally considered navigation, don't handle it as such. + if (index === -1) + return false; + + // ArrowUp, ArrowDown, ArrowLeft, ArrowRight, Home/End, PageUp/PageDown + if (e.keyCode > 32 && e.keyCode < 41) + // Return true if target is an input or has a role and is whitelisted as 'incrementable'. + return (inputType && behavior.incrementable.inputType[inputType]) + || (ariaRole && behavior.incrementable.role[ariaRole]); + + // Enter or Space + if (e.keyCode == 13 || e.keyCode == 32) + // Return true if target is an input or has a role and is whitelisted as 'selectable'. + return (inputType && behavior.selectable.inputType[inputType]) + || (ariaRole && behavior.selectable.role[ariaRole]); + + // Esc key when target is a descendant of a dialog or menu. + if (e.keyCode == 27) + return event.target.closest('[role$="dialog"],[role="menu"]') !== null; + + // Backspace or Delete + if (e.keyCode == 8 || e.keyCode == 46) + // Return true if target has a role and is whitelisted as 'deletable'. + return ariaRole && behavior.deletable.role[ariaRole]; + + return e.keyCode == 9; + } + /** * Computes whether the given element should automatically trigger the * `focus-ring` class being added, i.e. whether it should always match @@ -75,27 +193,47 @@ function init() { } /** - * On `keyup` add `focus-ring` class if the user pressed Tab and the event - * target is an element that will likely require interaction via the - * keyboard (e.g. a text box). - * The `keyup` event is used over the focus event because: - * 1. `focus` is a device-independent event, and `keyup` ensures the - * `focus-ring` class is only added when focus originates from - * keyboard navigation. - * 2. Unlike `focus`, keyup` will fire when the user navigates from the - * browser chrome into the document. (For more, see issue #15) + * On `keydown`, set `hadKeyboardEvent`, add `focus-ring` class if the + * key was Tab or another navigation key. * @param {Event} e */ - function onKeyUp(e) { - if (e.altKey || e.ctrlKey || e.metaKey) + function onKeyDown(e) { + if (!handleEventAsNavigation(e)) return; - if (e.keyCode != 9) + hadKeyboardEvent = true; + } + + /** + * On `mousedown`, unset `hadKeyboardEvent`, remove `focus-ring` class from elements where not + * originally added by the author. + * @param {Event} e + */ + function onMouseDown(e) { + hadKeyboardEvent = false; + if (elementsWithFocusRing.length) { + for(var i = 0; i < elementsWithFocusRing.length; i++) { + if (!focusTriggersKeyboardModality(elementsWithFocusRing[i])) { + removeFocusRingClass(elementsWithFocusRing[i]); + } + } + } + } + + /** + * On `focus`, add the `focus-ring` class to the target if: + * - the target received focus as a result of keyboard navigation + * - the event target is an element that will likely require interaction + * via the keyboard (e.g. a text box) + * @param {Event} e + */ + function onFocus(e) { + if (e.target == document) return; - var target = e.target; - if (focusTriggersKeyboardModality(target)) { - addFocusRingClass(target); + if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) { + addFocusRingClass(e.target); + hadKeyboardEvent = false; } } @@ -142,7 +280,9 @@ function init() { } } - document.addEventListener('keyup', onKeyUp, true); + document.addEventListener('keydown', onKeyDown, true); + document.addEventListener('mousedown', onMouseDown, true); + document.addEventListener('focus', onFocus, true); document.addEventListener('blur', onBlur, true); window.addEventListener('focus', onWindowFocus, true); window.addEventListener('blur', onWindowBlur, true);