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 {{sound-position-progress}} + @type Modifier +*/ + +import { action } from '@ember/object'; +import { inject as service } from '@ember/service'; +import Modifier from 'ember-modifier'; + +export default class SoundPositionProgressModifier extends Modifier { + @service stereo; + + get url() { + return this.args.positional[0] + } + + get loadedSound() { + return this.stereo.findSound(this.url); + } + + @action onPositionChange() { + this.element.style.width = `${(this.loadedSound.position / this.loadedSound.duration) * 100}%`; + this.element.style.pointerEvents = 'none'; + } + + didInstall() { + this.element.setAttribute('data-sound-position-progress', true) + } + + didReceiveArguments() { + if (this.url) { + this.stereo.soundProxy(this.url).afterLoad(sound => { + sound.on('audio-position-changed', this.onPositionChange); + }) + } + } + + willRemove() { + try { + if (this.loadedSound) { + this.loadedSound.off('audio-position-changed', this.onPositionChange); + } + } catch (e) { /* geez, relax */ } + } +} diff --git a/addon/modifiers/sound-position-slider.js b/addon/modifiers/sound-position-slider.js index cb94d6ac..0e5ab7ad 100644 --- a/addon/modifiers/sound-position-slider.js +++ b/addon/modifiers/sound-position-slider.js @@ -1,11 +1,11 @@ /** * This is the modifier used to transform an element into a position control, where clicking it will change a 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 @@ +
+
+
+ + + + + +
+ +
+ {{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 (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"