diff --git a/addon/modifiers/sound-position-progress.js b/addon/modifiers/sound-position-progress.js
new file mode 100644
index 00000000..4b57bea9
--- /dev/null
+++ b/addon/modifiers/sound-position-progress.js
@@ -0,0 +1,51 @@
+/**
+ * This is the modifier used to transform an element into a progress bar, where it will take up the width equivalent to the sound's position
+ * ```hbs
+
+
```
*
- @class {{stereo-position-track}}
+ @class {{sound-position-slider}}
@type Modifier
*/
@@ -13,9 +13,8 @@ import { action } from '@ember/object';
import { inject as service } from '@ember/service';
import { task, waitForProperty } from 'ember-concurrency';
import { next } from '@ember/runloop';
-import Modifier from 'ember-modifier';
-
-export default class SoundPositionSliderModifier extends Modifier {
+import DidPanModifier from 'ember-gesture-modifiers/modifiers/did-pan';
+export default class SoundPositionSliderModifier extends DidPanModifier {
@service stereo;
get url() {
@@ -55,7 +54,7 @@ export default class SoundPositionSliderModifier extends Modifier {
@action
handleTap(e) {
- var rect = e.target.getBoundingClientRect();
+ var rect = this.element.getBoundingClientRect();
var x = e.clientX - rect.left; //x position within the element.
if (
@@ -77,17 +76,42 @@ export default class SoundPositionSliderModifier extends Modifier {
}
didInstall() {
- this.element.setAttribute('data-stereo-position-track', true)
if (this.isRangeControl) {
this.element.setAttribute('max', 100);
this.element.setAttribute('min', 0);
this.element.setAttribute('value', 0);
this.element.setAttribute('disabled', 'disabled');
} else {
- this.element.addEventListener('click', this.handleTap, true);
- this.element.addEventListener('mousedown', this.handleTap, true);
- this.element.addEventListener('tap', this.handleTap, true);
+ super.didInstall(...arguments);
+ this.element.addEventListener('click', this.handleTap);
+ this.element.addEventListener('mousedown', this.handleTap);
+ this.element.addEventListener('tap', this.handleTap);
}
+ this.element.setAttribute('data-sound-position-slider', true)
+ }
+
+
+ @action
+ onPanStart() {
+ }
+
+ @action
+ onPan(e) {
+ if (
+ this.loadedSound &&
+ this.loadedSound.isFastForwardable &&
+ this.loadedSound.isRewindable &&
+ this.element
+ ) {
+ var rect = this.element.getBoundingClientRect();
+ let percentPosition = ((e.current.x - rect.x) / rect.width)
+ let actualPosition = percentPosition * this.loadedSound.duration;
+ this.loadedSound.position = actualPosition;
+ }
+ }
+
+ @action
+ onPanEnd() {
}
didReceiveArguments() {
@@ -101,10 +125,19 @@ export default class SoundPositionSliderModifier extends Modifier {
}
}).catch(() => { })
} else {
- this.afterLoad.perform(sound => {
- sound.on('audio-position-changed', this.onPositionChange.bind(this));
+ super.removeEventListeners();
+
+ super.threshold = 10;
+ super.axis = 'horizontal';
+ super.capture = false;
+ super.preventScroll = false;
+ super.pointerTypes = ['touch', 'mouse'];
- }).catch(() => { });
+ super.didPanStart = this.onPanStart.bind(this)
+ super.didPan = this.onPan.bind(this)
+ super.didPanEnd = this.onPanEnd.bind(this)
+
+ super.addEventListeners();
}
}
@@ -117,13 +150,14 @@ export default class SoundPositionSliderModifier extends Modifier {
this.element.removeEventListener('change', this.onChange, true);
}
else {
+ super.willRemove(...arguments);
if (this.loadedSound) {
this.loadedSound.off('audio-position-changed', this.onPositionChange.bind(this));
}
- this.element.removeEventListener('change', this.onChange, true);
- this.element.removeEventListener('click', this.handleTap, true);
- this.element.removeEventListener('tap', this.handleTap, true);
- this.element.removeEventListener('mousedown', this.handleTap, true);
+ this.element.removeEventListener('change', this.onChange);
+ this.element.removeEventListener('click', this.handleTap);
+ this.element.removeEventListener('tap', this.handleTap);
+ this.element.removeEventListener('mousedown', this.handleTap);
}
} catch (e) { /* geez, relax */ }
}
diff --git a/app/modifiers/sound-position-progress.js b/app/modifiers/sound-position-progress.js
new file mode 100644
index 00000000..7cf17e59
--- /dev/null
+++ b/app/modifiers/sound-position-progress.js
@@ -0,0 +1 @@
+export { default } from 'ember-stereo/modifiers/sound-position-progress';
diff --git a/package.json b/package.json
index 7bfa2cf6..afb71d10 100644
--- a/package.json
+++ b/package.json
@@ -45,6 +45,7 @@
"debug": "4.3.2",
"ember-auto-import": "^1.11.3",
"ember-cli-babel": "^7.26.6",
+ "ember-gesture-modifiers": "^2.0.0",
"ember-cli-htmlbars": "^5.7.1",
"ember-concurrency": "^2.1.2",
"ember-get-config": "^0.3.0",
diff --git a/tests/dummy/app/components/docs/custom-position-control.hbs b/tests/dummy/app/components/docs/custom-position-control.hbs
new file mode 100644
index 00000000..8ba76dd7
--- /dev/null
+++ b/tests/dummy/app/components/docs/custom-position-control.hbs
@@ -0,0 +1,107 @@
+
+
+
+
+ {{svg-jar
+ 'skip-backward-outline'
+ height=20
+ width=30
+ title='Skip Backward'
+ }}
+
+
+
+ {{#if (sound-is-playing @identifier)}}
+ {{svg-jar 'pause-outline' height=20 width=30 title='Pause'}}
+ {{else if (sound-is-loading @identifier)}}
+ {{svg-jar
+ 'loading-outline'
+ height=20
+ width=30
+ title='Loading'
+ class='animate-spin'
+ }}
+ {{else if (sound-is-loaded @identifier)}}
+ {{svg-jar 'resume-outline' height=20 width=30 title='Pause'}}
+ {{else}}
+ {{svg-jar 'play-outline' height=20 width=30 title='Play'}}
+ {{/if}}
+
+
+
+ {{svg-jar
+ 'skip-forward-outline'
+ height=20
+ width=30
+ title='Skip Forward'
+ }}
+
+
+
+
+ {{sound-position @identifier format='time'}}
+ {{#if (sound-is-seekable @identifier)}}
+ {{! template-lint-disable require-input-label }}
+ {{! BEGIN-SNIPPET position-modifiers.hbs }}
+
+ {{! END-SNIPPET }}
+ {{else}}
+
+
+ {{/if}}
+ {{sound-duration @identifier format='time'}}
+
+
+
+
+
+
+ {{#if (gt (stereo-volume) 0)}}
+ {{svg-jar 'volume-low-outline' height=20 width=30}}
+ {{else}}
+ {{svg-jar 'volume-mute-outline' height=20 width=30}}
+ {{/if}}
+
+
+
+
+
+ {{#if (sound-is-errored @identifier)}}
+
+ {{sound-error-details @identifier}}
+
+ {{/if}}
+
+
+
+
+ {{demo.snippet 'position-modifiers.hbs'}}
+
\ No newline at end of file
diff --git a/tests/dummy/app/components/sound-display.js b/tests/dummy/app/components/sound-display.js
index 9b269b7c..77a87d33 100644
--- a/tests/dummy/app/components/sound-display.js
+++ b/tests/dummy/app/components/sound-display.js
@@ -14,7 +14,6 @@ export default class SoundDisplay extends Component {
this.soundProxy = this.stereo.soundProxy(this.args.url)
}
-
get loadedSound() {
return this.stereo.findSound(this.args.url);
}
diff --git a/tests/dummy/app/router.js b/tests/dummy/app/router.js
index de7362a4..adcc9a85 100644
--- a/tests/dummy/app/router.js
+++ b/tests/dummy/app/router.js
@@ -22,6 +22,7 @@ Router.map(function () {
this.route('event-monitoring');
this.route('waiting-for-sounds');
this.route('volume');
+ this.route('custom-position-controls');
this.route('testing');
});
diff --git a/tests/dummy/app/styles/components/_stereo-player.css b/tests/dummy/app/styles/components/_stereo-player.css
index f321565c..b15a8f3b 100644
--- a/tests/dummy/app/styles/components/_stereo-player.css
+++ b/tests/dummy/app/styles/components/_stereo-player.css
@@ -14,6 +14,17 @@
@apply flex items-center flex-grow w-full gap-2 whitespace-nowrap;
}
+.stereo-player-position-slider {
+ @apply relative w-full flex items-center justify-start bg-on-surface-3 rounded h-2;
+}
+.stereo-player-position-thumb {
+ @apply bg-on-surface-3 absolute h-4 w-4 flex rounded-lg shadow-sm;
+ top: 15px;
+}
+.stereo-player-position-progress {
+ @apply bg-accent-0 h-2 flex rounded;
+}
+
.stereo-player input[type='range'] {
@apply bg-on-surface-2;
}
diff --git a/tests/dummy/app/templates/docs/custom-position-controls.md b/tests/dummy/app/templates/docs/custom-position-controls.md
new file mode 100644
index 00000000..7ac8cecb
--- /dev/null
+++ b/tests/dummy/app/templates/docs/custom-position-controls.md
@@ -0,0 +1,2 @@
+
+{{docs/custom-position-control identifier="/sounds/works-just-like-a-vcr.mp3"}}
diff --git a/tests/dummy/config/environment.js b/tests/dummy/config/environment.js
index ade07760..7db5a931 100644
--- a/tests/dummy/config/environment.js
+++ b/tests/dummy/config/environment.js
@@ -14,7 +14,7 @@ module.exports = function (environment) {
EXTEND_PROTOTYPES: {
// Prevent Ember Data from overriding Date.parse.
Date: false,
- },
+ }
},
APP: {
diff --git a/tests/integration/modifiers/sound-position-progress-test.js b/tests/integration/modifiers/sound-position-progress-test.js
new file mode 100644
index 00000000..6d3c503a
--- /dev/null
+++ b/tests/integration/modifiers/sound-position-progress-test.js
@@ -0,0 +1,14 @@
+import { module, test } from 'qunit';
+import { setupRenderingTest } from 'ember-qunit';
+import { render } from '@ember/test-helpers';
+import { hbs } from 'ember-cli-htmlbars';
+
+module('Integration | Modifier | sound-position-progress', function (hooks) {
+ setupRenderingTest(hooks);
+
+ test('it renders', async function (assert) {
+ await render(hbs`
`);
+
+ assert.ok(true);
+ });
+});
diff --git a/yarn.lock b/yarn.lock
index adbe8052..c3193ab9 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -3555,6 +3555,11 @@ babel-helpers@^6.24.1:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
+babel-import-util@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/babel-import-util/-/babel-import-util-0.2.0.tgz#b468bb679919601a3570f9e317536c54f2862e23"
+ integrity sha512-CtWYYHU/MgK88rxMrLfkD356dApswtR/kWZ/c6JifG1m10e7tBBrs/366dFzWMAoqYmG5/JSh+94tUSpIwh+ag==
+
babel-loader@^8.0.6:
version "8.2.2"
resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81"
@@ -3621,6 +3626,16 @@ babel-plugin-ember-modules-api-polyfill@^3.5.0:
dependencies:
ember-rfc176-data "^0.3.17"
+babel-plugin-ember-template-compilation@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-ember-template-compilation/-/babel-plugin-ember-template-compilation-1.0.1.tgz#64baf434ff1b751c6292936f8b9eb75a2f8149dc"
+ integrity sha512-V/kY6CDyUNrl5Kx6UPKUPhzSKNfdrxNii+S5zK4dgJvVyoxFv7Ykg06Ct/yskY0LkA4wUPdYN7JOBtYJwHk2sg==
+ dependencies:
+ babel-import-util "^0.2.0"
+ line-column "^1.0.2"
+ magic-string "^0.25.7"
+ string.prototype.matchall "^4.0.5"
+
babel-plugin-filter-imports@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/babel-plugin-filter-imports/-/babel-plugin-filter-imports-3.0.0.tgz#a849683837ad29960da17492fb32789ab6b09a11"
@@ -3653,6 +3668,17 @@ babel-plugin-htmlbars-inline-precompile@^5.0.0:
parse-static-imports "^1.1.0"
string.prototype.matchall "^4.0.4"
+babel-plugin-htmlbars-inline-precompile@^5.3.0:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/babel-plugin-htmlbars-inline-precompile/-/babel-plugin-htmlbars-inline-precompile-5.3.1.tgz#5ba272e2e4b6221522401f5f1d98a73b1de38787"
+ integrity sha512-QWjjFgSKtSRIcsBhJmEwS2laIdrA6na8HAlc/pEAhjHgQsah/gMiBFRZvbQTy//hWxR4BMwV7/Mya7q5H8uHeA==
+ dependencies:
+ babel-plugin-ember-modules-api-polyfill "^3.5.0"
+ line-column "^1.0.2"
+ magic-string "^0.25.7"
+ parse-static-imports "^1.1.0"
+ string.prototype.matchall "^4.0.5"
+
babel-plugin-istanbul@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-6.0.0.tgz#e159ccdc9af95e0b570c75b4573b7c34d671d765"
@@ -7320,6 +7346,27 @@ ember-cli-htmlbars@^5.0.0, ember-cli-htmlbars@^5.3.1, ember-cli-htmlbars@^5.6.3,
strip-bom "^4.0.0"
walk-sync "^2.2.0"
+ember-cli-htmlbars@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/ember-cli-htmlbars/-/ember-cli-htmlbars-6.0.0.tgz#9d0b67c0f107467b6c8ecdc47d64e877489841bf"
+ integrity sha512-7h9Lb1kfvLecMUOX8wCbwjzCsgXdNDs8qpOsDuKV6YaGS9jDZHu4P5xTYLX78YepEUnwOw1atCYWzBUsJHWrzA==
+ dependencies:
+ "@ember/edition-utils" "^1.2.0"
+ babel-plugin-ember-template-compilation "^1.0.0"
+ babel-plugin-htmlbars-inline-precompile "^5.3.0"
+ broccoli-debug "^0.6.5"
+ broccoli-persistent-filter "^3.1.2"
+ broccoli-plugin "^4.0.3"
+ ember-cli-version-checker "^5.1.2"
+ fs-tree-diff "^2.0.1"
+ hash-for-dep "^1.5.1"
+ heimdalljs-logger "^0.1.10"
+ json-stable-stringify "^1.0.1"
+ semver "^7.3.4"
+ silent-error "^1.1.1"
+ strip-bom "^4.0.0"
+ walk-sync "^2.2.0"
+
ember-cli-inject-live-reload@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ember-cli-inject-live-reload/-/ember-cli-inject-live-reload-2.1.0.tgz#ef63c733c133024d5726405a3c247fa12e88a385"
@@ -7745,6 +7792,15 @@ ember-format-json@^0.0.4:
ember-cli-htmlbars "^3.0.0"
json-formatter-js "^2.2.1"
+ember-gesture-modifiers@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/ember-gesture-modifiers/-/ember-gesture-modifiers-2.0.0.tgz#e1e5ce78997c1dae0bda8bc02ddff670d9f7b07e"
+ integrity sha512-XYc45/J2PU8zFCx8zHZL0kxilV7NwxibP/fPcLMhY1ihNO6xQlqMmV3/D5btkWjJ7KUWsJUUDrgA4h5i3EQvbg==
+ dependencies:
+ ember-cli-babel "^7.26.6"
+ ember-cli-htmlbars "^6.0.0"
+ ember-modifier "^2.1.0"
+
ember-get-config@^0.3.0:
version "0.3.0"
resolved "https://registry.yarnpkg.com/ember-get-config/-/ember-get-config-0.3.0.tgz#a73a1a87b48d9dde4c66a0e52ed5260b8a48cfbd"
@@ -7822,7 +7878,7 @@ ember-modifier-manager-polyfill@^1.1.0, ember-modifier-manager-polyfill@^1.2.0:
ember-cli-version-checker "^2.1.2"
ember-compatibility-helpers "^1.2.0"
-ember-modifier@^2.1.1:
+ember-modifier@^2.1.0, ember-modifier@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/ember-modifier/-/ember-modifier-2.1.2.tgz#62d18faedf972dcd9d34f90d5321fbc943d139b1"
integrity sha512-3Lsu1fV1sIGa66HOW07RZc6EHISwKt5VA5AUnFss2HX6OTfpxTJ2qvPctt2Yt0XPQXJ4G6BQasr/F35CX7UGJA==
@@ -8260,6 +8316,32 @@ es-abstract@^1.17.2, es-abstract@^1.18.0-next.2, es-abstract@^1.18.2:
string.prototype.trimstart "^1.0.4"
unbox-primitive "^1.0.1"
+es-abstract@^1.19.1:
+ version "1.19.1"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3"
+ integrity sha512-2vJ6tjA/UfqLm2MPs7jxVybLoB8i1t1Jd9R3kISld20sIxPcTbLuggQOUxeWeAvIUkduv/CfMjuh4WmiXr2v9w==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ get-intrinsic "^1.1.1"
+ get-symbol-description "^1.0.0"
+ has "^1.0.3"
+ has-symbols "^1.0.2"
+ internal-slot "^1.0.3"
+ is-callable "^1.2.4"
+ is-negative-zero "^2.0.1"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.1"
+ is-string "^1.0.7"
+ is-weakref "^1.0.1"
+ object-inspect "^1.11.0"
+ object-keys "^1.1.1"
+ object.assign "^4.1.2"
+ string.prototype.trimend "^1.0.4"
+ string.prototype.trimstart "^1.0.4"
+ unbox-primitive "^1.0.1"
+
es-to-primitive@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz#e55cd4c9cdc188bcefb03b366c736323fc5c898a"
@@ -9529,6 +9611,14 @@ get-stream@^6.0.0:
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.0.0.tgz#7fdb81c900101fbd564dd5f1a30af5aadc1e58d6"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
get-value@^2.0.3, get-value@^2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
@@ -10590,7 +10680,7 @@ is-buffer@^1.1.5:
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be"
integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==
-is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3:
+is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.3, is-callable@^1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
@@ -10814,7 +10904,7 @@ is-reference@^1.1.0:
dependencies:
"@types/estree" "*"
-is-regex@^1.1.3:
+is-regex@^1.1.3, is-regex@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958"
integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
@@ -10827,6 +10917,11 @@ is-retry-allowed@^1.0.0, is-retry-allowed@^1.1.0:
resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz#d778488bd0a4666a3be8a1482b9f2baafedea8b4"
integrity sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==
+is-shared-array-buffer@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
+ integrity sha512-IU0NmyknYZN0rChcKhRO1X8LYz5Isj/Fsqh8NJOSf+N/hCOTwy29F32Ik7a+QszE63IdvmwdTPDd6cZ5pg4cwA==
+
is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44"
@@ -10837,7 +10932,7 @@ is-stream@^2.0.0:
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
-is-string@^1.0.5, is-string@^1.0.6:
+is-string@^1.0.5, is-string@^1.0.6, is-string@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.7.tgz#0dd12bf2006f255bb58f695110eff7491eebc0fd"
integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
@@ -10880,6 +10975,13 @@ is-utf8@^0.2.0:
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+is-weakref@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.1.tgz#842dba4ec17fa9ac9850df2d6efbc1737274f2a2"
+ integrity sha512-b2jKc2pQZjaeFYWEf7ScFj+Be1I+PXmlu572Q8coTXZ+LD/QQZ7ShPMst8h16riVgyXTQwUsFEl74mDvc/3MHQ==
+ dependencies:
+ call-bind "^1.0.0"
+
is-windows@^1.0.1, is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@@ -15903,6 +16005,20 @@ string.prototype.matchall@^4.0.4:
regexp.prototype.flags "^1.3.1"
side-channel "^1.0.4"
+string.prototype.matchall@^4.0.5:
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.6.tgz#5abb5dabc94c7b0ea2380f65ba610b3a544b15fa"
+ integrity sha512-6WgDX8HmQqvEd7J+G6VtAahhsQIssiZ8zl7zKh1VDMFyL3hRTJP4FTNA3RbIp2TOQ9AYNDcc7e3fH0Qbup+DBg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+ get-intrinsic "^1.1.1"
+ has-symbols "^1.0.2"
+ internal-slot "^1.0.3"
+ regexp.prototype.flags "^1.3.1"
+ side-channel "^1.0.4"
+
string.prototype.padend@^3.0.0:
version "3.1.2"
resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz#6858ca4f35c5268ebd5e8615e1327d55f59ee311"