+
```
Allows you to select elements by `js-org-update` and still filter by the `data-org-name` attribute if you need to. Both `js-org-update` and `data-org-name` are clearly static symbols that are easy to search for.
-## Formatting
-
`js-` classes must start with `js-` (obviously) and only contain lowercase letters and numbers separated by `-`s. The ESLint [`github/js-class-name`](https://github.com/github/eslint-plugin-github/blob/master/lib/rules/js-class-name.js) rule enforces this style.
-## See Also
-
[@defunkt's original proposal from 2010](https://web.archive.org/web/20180902223055/http://ozmm.org/posts/slightly_obtrusive_javascript.html).
+
+👎 Examples of **incorrect** code for this rule:
+
+```js
+const el = document.querySelector('.js-Foo')
+```
+
+👍 Examples of **correct** code for this rule:
+
+```js
+const el = document.querySelector('.js-foo')
+```
+
+## Version
+
+4.3.2
diff --git a/docs/rules/no-blur.md b/docs/rules/no-blur.md
index 506e0f02..9e5b70ca 100644
--- a/docs/rules/no-blur.md
+++ b/docs/rules/no-blur.md
@@ -1,14 +1,22 @@
-# No `element.blur()`
+# No Blur
Do not use `element.blur()`. Blurring an element causes the focus position to be reset causing accessibility issues when using keyboard or voice navigation. Instead, restore focus by calling `element.focus()` on a prior element.
+## Rule Details
+
+- [Use of `blur()` is discouraged by WHATWG HTML spec](https://html.spec.whatwg.org/multipage/interaction.html#dom-blur)
+
+👎 Examples of **incorrect** code for this rule:
+
```js
-// bad
menu.addEventListener('close', () => {
input.blur()
})
+```
+
+👍 Examples of **correct** code for this rule:
-// good
+```js
menu.addEventListener('open', () => {
const previouslyFocusedElement = document.activeElement
@@ -20,6 +28,6 @@ menu.addEventListener('open', () => {
})
```
-## See Also
+## Version
-- [Use of `blur()` is discouraged by WHATWG HTML spec](https://html.spec.whatwg.org/multipage/interaction.html#dom-blur)
+4.3.2
diff --git a/docs/rules/no-d-none.md b/docs/rules/no-d-none.md
index 0247d90f..adc7d556 100644
--- a/docs/rules/no-d-none.md
+++ b/docs/rules/no-d-none.md
@@ -1,11 +1,21 @@
-# No `d-none`
+# No D None
+
+## Rule Details
Ideally JavaScript behaviors should not rely on Primer CSS when the `hidden` property can be used.
-```html
-
+👎 Examples of **incorrect** code for this rule:
+
+```js
+div.classList.add('d-none')
```
+👍 Examples of **correct** code for this rule:
+
```js
div.hidden = false
```
+
+## Version
+
+4.3.2
diff --git a/docs/rules/no-dataset.md b/docs/rules/no-dataset.md
index 30b92ba6..aa6cf16e 100644
--- a/docs/rules/no-dataset.md
+++ b/docs/rules/no-dataset.md
@@ -1,3 +1,21 @@
-# No `dataset`
+# No Dataset
+
+## Rule Details
Due to [camel-case transformations](https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement/dataset#Name_conversion), using dataset is not easily greppable. Instead, use `el.getAttribute('data-what-ever')`.
+
+👎 Examples of **incorrect** code for this rule:
+
+```js
+el.dataset.coolThing
+```
+
+👍 Examples of **correct** code for this rule:
+
+```js
+el.getAttribute('data-cool-thing')
+```
+
+## Version
+
+4.3.2
diff --git a/docs/rules/no-flowfixme.md b/docs/rules/no-flowfixme.md
deleted file mode 100644
index 9de4ec2b..00000000
--- a/docs/rules/no-flowfixme.md
+++ /dev/null
@@ -1 +0,0 @@
-# Avoid $FlowFixMe
diff --git a/docs/rules/no-implicit-buggy-globals.md b/docs/rules/no-implicit-buggy-globals.md
new file mode 100644
index 00000000..a76093f4
--- /dev/null
+++ b/docs/rules/no-implicit-buggy-globals.md
@@ -0,0 +1,21 @@
+# No Implicit Buggy Globals
+
+## Rule Details
+
+👎 Examples of **incorrect** code for this rule:
+
+```js
+var foo = 1
+```
+
+👍 Examples of **correct** code for this rule:
+
+```js
+;(function () {
+ const foo = 1
+})()
+```
+
+## Version
+
+4.3.2
diff --git a/docs/rules/no-inner-html.md b/docs/rules/no-inner-html.md
index 26226794..b2456f9d 100644
--- a/docs/rules/no-inner-html.md
+++ b/docs/rules/no-inner-html.md
@@ -1,19 +1,27 @@
-# No `innerHTML`
+# No Inner HTML
+
+## Rule Details
Using `innerHTML` poses a potential security risk. Prefer using `textContent` to set text to an element.
+https://github.com/github/paste-markdown/security/advisories/GHSA-gpfj-4j6g-c4w9
+
+👎 Examples of **incorrect** code for this rule:
+
```js
-// bad
function setContent(element, content) {
element.innerHTML = content
}
+```
+
+👍 Examples of **correct** code for this rule:
-// good
+```js
function setContent(element, content) {
element.textContent = content
}
```
-## See Also
+## Version
-https://github.com/github/paste-markdown/security/advisories/GHSA-gpfj-4j6g-c4w9
+4.3.2
diff --git a/docs/rules/no-innerText.md b/docs/rules/no-innerText.md
new file mode 100644
index 00000000..03847496
--- /dev/null
+++ b/docs/rules/no-innerText.md
@@ -0,0 +1,21 @@
+# No InnerText
+
+## Rule Details
+
+👎 Examples of **incorrect** code for this rule:
+
+```js
+const el = document.createElement('div')
+el.innerText = 'foo'
+```
+
+👍 Examples of **correct** code for this rule:
+
+```js
+const el = document.createElement('div')
+el.textContent = 'foo'
+```
+
+## Version
+
+4.3.2
diff --git a/docs/rules/no-then.md b/docs/rules/no-then.md
index ef21fdbc..3b4ac88b 100644
--- a/docs/rules/no-then.md
+++ b/docs/rules/no-then.md
@@ -1,31 +1,36 @@
-# No `Promise.then`
+# No Then
+
+## Rule Details
Yes, you should use promises, but prefer `async`/`await` syntax instead of `Promise.then()` callback chaining.
+https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
+
+👎 Examples of **incorrect** code for this rule:
+
```js
-// bad
function getProcessedData(url) {
- return downloadData(url)
- .catch(e => {
- return downloadFallbackData(url)
- })
- .then(v => {
- return processDataInWorker(v)
- })
+ return downloadData(url).catch(e => {
+ console.log('Error occured!', e)
+ })
}
+```
+
+👍 Examples of **correct** code for this rule:
-// good
+```js
async function getProcessedData(url) {
let v
try {
v = await downloadData(url)
} catch (e) {
- v = await downloadFallbackData(url)
+ console.log('Error occured!', e)
+ return
}
- return processDataInWorker(v)
+ return v
}
```
-## See Also
+## Version
-https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function
+4.3.2
diff --git a/docs/rules/no-useless-passive.md b/docs/rules/no-useless-passive.md
index 1f8413f5..edf43ec0 100644
--- a/docs/rules/no-useless-passive.md
+++ b/docs/rules/no-useless-passive.md
@@ -4,20 +4,36 @@ This rule disallows setting `passive: true` for events on which it will have no
Events where `passive: true` has an effect are: `touchstart`, `touchmove`, `wheel`, and `mousewheel`.
+## Rule Details
+
+Adding `passive: true` informs the browser that this event will not be calling `preventDefault` and as such is safe to asynchronously dispatch, freeing up the main thread for lag-free operation. However many events are not cancel-able and as such setting `passive: true` will have no effect on the browser.
+
+It is safe to leave the option set, but this may have a negative effect on code authors, as they might believe setting `passive: true` has a positive effect on their operations, leading to a false-confidence in code with `passive: true`. As such, removing the option where it has no effect demonstrates to the code author that this code will need to avoid expensive operations as this might have a detrimental affect on UI performance.
+
+https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners
+
+👎 Examples of **incorrect** code for this rule:
+
```js
// bad (passive has no effect here)
-window.addEventListener('scroll', () => { /* ... */ }, { passive: true })
-
-// good
-window.addEventListener('scroll', () => { /* ... */ })
+window.addEventListener(
+ 'scroll',
+ () => {
+ console.log('Scroll event fired!')
+ },
+ {passive: true}
+)
```
-## Why?
-
-Adding `passive: true` informs the browser that this event will not be calling `preventDefault` and as such is safe to asynchronously dispatch, freeing up the main thread for lag-free operation. However many events are not cancel-able and as such setting `passive: true` will have no effect on the browser.
+👍 Examples of **correct** code for this rule:
-It is safe to leave the option set, but this may have a negative effect on code authors, as they might believe setting `passive: true` has a positive effect on their operations, leading to a false-confidence in code with `passive: true`. As such, removing the option where it has no effect demonstrates to the code author that this code will need to avoid expensive operations as this might have a detrimental affect on UI performance.
+```js
+// good
+window.addEventListener('scroll', () => {
+ console.log('Scroll event fired!')
+})
+```
-## See Also
+## Version
-https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners
+4.3.2
diff --git a/docs/rules/prefer-observers.md b/docs/rules/prefer-observers.md
index fd5dd09c..c3216aa4 100644
--- a/docs/rules/prefer-observers.md
+++ b/docs/rules/prefer-observers.md
@@ -2,46 +2,56 @@
Some events, such as `scroll` and `resize` have traditionally caused performance issues on web pages, as they are high frequency events, firing many times per second as the user interacts with the page viewport.
-## Scroll vs IntersectionObserver
+## Rule Details
Typically `scroll` events are used to determine if an element is intersecting a viewport, which can result in expensive operations such as layout calculations, which has a detrimental affect on UI performance. Recent developments in web standards have introduced the `IntersectionObserver`, which is a more performant mechanism for determining if an element is intersecting the viewport.
+Similarly, `resize` events are typically used to determine if the viewport is smaller or larger than a certain size, similar to CSS media break points. Similar to the `IntersectionObserver` the `ResizeObserver` also exists as a more performant mechanism for observing changes to the viewport size.
+
```js
-// bad, expensive, error-prone code to determine if the element is in the viewport;
-window.addEventListener('scroll', () => {
- const isIntersecting = checkIfElementIntersects(element.getBoundingClientRect(), window.innerHeight, document.clientHeight)
- element.classList.toggle('intersecting', isIntersecting)
+// bad, low-performing code to determine if the element is less than 500px large
+window.addEventListener('resize', () => {
+ element.classList.toggle('size-small', element.getBoundingClientRect().width < 500)
})
-// good - more performant and less error-prone
-const observer = new IntersectionObserver(entries => {
- for(const {target, isIntersecting} of entries) {
- target.classList.toggle(target, isIntersecting)
+// good - more performant, only fires when the actual elements change size
+const observer = new ResizeObserver(entries => {
+ for (const {target, contentRect} of entries) {
+ target.classList.toggle('size-small', contentRect.width < 500)
}
})
observer.observe(element)
```
-## Resize vs ResizeObserver
+https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
+https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API
-Similarly, `resize` events are typically used to determine if the viewport is smaller or larger than a certain size, similar to CSS media break points. Similar to the `IntersectionObserver` the `ResizeObserver` also exists as a more performant mechanism for observing changes to the viewport size.
+👎 Examples of **incorrect** code for this rule:
```js
-// bad, low-performing code to determine if the element is less than 500px large
-window.addEventListener('resize', () => {
- element.classList.toggle('size-small', element.getBoundingClientRect().width < 500)
+// bad, expensive, error-prone code to determine if the element is in the viewport;
+window.addEventListener('scroll', () => {
+ const isIntersecting = checkIfElementIntersects(
+ element.getBoundingClientRect(),
+ window.innerHeight,
+ document.clientHeight
+ )
+ element.classList.toggle('intersecting', isIntersecting)
})
+```
-// good - more performant, only fires when the actual elements change size
-const observer = new ResizeObserver(entries => {
- for(const {target, contentRect} of entries) {
- target.classList.toggle('size-small', contentRect.width < 500)
+👍 Examples of **correct** code for this rule:
+
+```js
+// good - more performant and less error-prone
+const observer = new IntersectionObserver(entries => {
+ for (const {target, isIntersecting} of entries) {
+ target.classList.toggle(target, isIntersecting)
}
})
observer.observe(element)
```
-## See Also
+## Version
-https://developer.mozilla.org/en-US/docs/Web/API/Intersection_Observer_API
-https://developer.mozilla.org/en-US/docs/Web/API/Resize_Observer_API
+4.3.2
diff --git a/docs/rules/require-passive-events.md b/docs/rules/require-passive-events.md
index b860e8ef..e94eca86 100644
--- a/docs/rules/require-passive-events.md
+++ b/docs/rules/require-passive-events.md
@@ -2,20 +2,36 @@
This rule enforces adding `passive: true` to high frequency event listeners (`touchstart`, `touchmove`, `wheel`, `mousewheel`).
+## Rule Details
+
+Adding these events listeners can block the main thread as it waits to find out if the callbacks call `preventDefault`. This can cause large amounts UI lag, which will be noticeable for users.
+
+Adding `passive: true` informs the browser that this event will not be calling `preventDefault` and as such is safe to asynchronously dispatch, freeing up the main thread for lag-free operation.
+
+See also: https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners
+
+👎 Examples of **incorrect** code for this rule:
+
```js
// bad
-window.addEventListener('touchstart', () => { /* ... */ })
-
-// good
-window.addEventListener('touchstart', () => { /* ... */ }, { passive: true })
+window.addEventListener('touchstart', () => {
+ /* ... */
+})
```
-## Why?
-
-Adding these events listeners can block the main thread as it waits to find out if the callbacks call `preventDefault`. This can cause large amounts UI lag, which will be noticeable for users.
+👍 Examples of **correct** code for this rule:
-Adding `passive: true` informs the browser that this event will not be calling `preventDefault` and as such is safe to asynchronously dispatch, freeing up the main thread for lag-free operation.
+```js
+// good
+window.addEventListener(
+ 'touchstart',
+ () => {
+ /* ... */
+ },
+ {passive: true}
+)
+```
-## See Also
+## Version
-https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Improving_scrolling_performance_with_passive_listeners
+4.3.2
diff --git a/docs/rules/unescaped-html-literal.md b/docs/rules/unescaped-html-literal.md
index 0c071aca..777fd84d 100644
--- a/docs/rules/unescaped-html-literal.md
+++ b/docs/rules/unescaped-html-literal.md
@@ -1,21 +1,30 @@
-# Avoid unescaped HTML string literals
+# Unescaped HTML Literal
+
+## Rule Details
Constructing raw HTML with string literals is error prone and may lead to security issues.
Instead use [`lit-html`](https://github.com/Polymer/lit-html)'s `html` tagged template literal to safely construct HTML literal strings. Alternatively, you can use document builder APIs like `document.createElement`.
+👎 Examples of **incorrect** code for this rule:
+
```js
-// bad
const title = `
Hello ${name}!
`
+```
+
+👍 Examples of **correct** code for this rule:
+```js
// good
const title = html`Hello ${name}!
`
+```
+```js
// also good
const title = document.createElement('h1')
title.textContent = `Hello ${name}!`
```
-## See Also
+## Version
-https://github.com/Polymer/lit-html
+4.3.2
diff --git a/lib/index.js b/lib/index.js
index c98a8121..3bd81bf7 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -10,17 +10,17 @@ module.exports = {
'no-d-none': require('./rules/no-d-none'),
'no-dataset': require('./rules/no-dataset'),
'no-implicit-buggy-globals': require('./rules/no-implicit-buggy-globals'),
- 'no-innerText': require('./rules/no-innerText'),
'no-inner-html': require('./rules/no-inner-html'),
+ 'no-innerText': require('./rules/no-innerText'),
'no-then': require('./rules/no-then'),
- 'unescaped-html-literal': require('./rules/unescaped-html-literal'),
'no-useless-passive': require('./rules/no-useless-passive'),
'prefer-observers': require('./rules/prefer-observers'),
- 'require-passive-events': require('./rules/require-passive-events')
+ 'require-passive-events': require('./rules/require-passive-events'),
+ 'unescaped-html-literal': require('./rules/unescaped-html-literal')
},
configs: {
- internal: require('./configs/internal'),
browser: require('./configs/browser'),
+ internal: require('./configs/internal'),
recommended: require('./configs/recommended'),
typescript: require('./configs/typescript')
}
diff --git a/package-lock.json b/package-lock.json
index 3f0f39f3..6186a42b 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -546,6 +546,18 @@
"fsevents": "~2.3.1"
}
},
+ "node_modules/chokidar/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/cliui": {
"version": "7.0.4",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz",
@@ -557,6 +569,29 @@
"wrap-ansi": "^7.0.0"
}
},
+ "node_modules/cliui/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cliui/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
@@ -1066,17 +1101,6 @@
"node": ">=4.0"
}
},
- "node_modules/eslint/node_modules/glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "dependencies": {
- "is-glob": "^4.0.3"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
"node_modules/eslint/node_modules/ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
@@ -1197,6 +1221,17 @@
"node": ">=8"
}
},
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
@@ -1360,14 +1395,14 @@
}
},
"node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"dependencies": {
- "is-glob": "^4.0.1"
+ "is-glob": "^4.0.3"
},
"engines": {
- "node": ">= 6"
+ "node": ">=10.13.0"
}
},
"node_modules/globals": {
@@ -1614,12 +1649,12 @@
}
},
"node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true,
"engines": {
- "node": ">=8"
+ "node": ">=4"
}
},
"node_modules/is-glob": {
@@ -2516,17 +2551,37 @@
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true,
"dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
},
"engines": {
- "node": ">=8"
+ "node": ">=4"
+ }
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
}
},
"node_modules/string.prototype.trimend": {
@@ -2749,49 +2804,6 @@
"string-width": "^1.0.2 || 2"
}
},
- "node_modules/wide-align/node_modules/ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/wide-align/node_modules/is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
- "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/wide-align/node_modules/string-width": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "dependencies": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/wide-align/node_modules/strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "dependencies": {
- "ansi-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/word-wrap": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
@@ -2823,6 +2835,29 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/wrap-ansi/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
@@ -2884,6 +2919,29 @@
"node": ">=10"
}
},
+ "node_modules/yargs/node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yargs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/yocto-queue": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
@@ -3240,6 +3298,17 @@
"is-glob": "~4.0.1",
"normalize-path": "~3.0.0",
"readdirp": "~3.5.0"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
}
},
"cliui": {
@@ -3251,6 +3320,25 @@
"string-width": "^4.2.0",
"strip-ansi": "^6.0.0",
"wrap-ansi": "^7.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ }
}
},
"color-convert": {
@@ -3456,14 +3544,6 @@
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
"integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ=="
},
- "glob-parent": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
- "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
- "requires": {
- "is-glob": "^4.0.3"
- }
- },
"ignore": {
"version": "4.0.6",
"resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
@@ -3721,6 +3801,16 @@
"glob-parent": "^5.1.2",
"merge2": "^1.3.0",
"micromatch": "^4.0.4"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ }
}
},
"fast-json-stable-stringify": {
@@ -3846,11 +3936,11 @@
}
},
"glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
"requires": {
- "is-glob": "^4.0.1"
+ "is-glob": "^4.0.3"
}
},
"globals": {
@@ -4013,9 +4103,9 @@
"integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI="
},
"is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
"dev": true
},
"is-glob": {
@@ -4620,14 +4710,30 @@
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw="
},
"string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
"dev": true,
"requires": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^3.0.0"
+ }
+ }
}
},
"string.prototype.trimend": {
@@ -4786,39 +4892,6 @@
"dev": true,
"requires": {
"string-width": "^1.0.2 || 2"
- },
- "dependencies": {
- "ansi-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
- "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
- "dev": true
- },
- "is-fullwidth-code-point": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/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://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
- "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
- "dev": true,
- "requires": {
- "is-fullwidth-code-point": "^2.0.0",
- "strip-ansi": "^4.0.0"
- }
- },
- "strip-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
- "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
- "dev": true,
- "requires": {
- "ansi-regex": "^3.0.0"
- }
- }
}
},
"word-wrap": {
@@ -4841,6 +4914,25 @@
"ansi-styles": "^4.0.0",
"string-width": "^4.1.0",
"strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ }
}
},
"wrappy": {
@@ -4872,6 +4964,25 @@
"string-width": "^4.2.0",
"y18n": "^5.0.5",
"yargs-parser": "^20.2.2"
+ },
+ "dependencies": {
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ }
+ }
}
},
"yargs-parser": {