diff --git a/.github/workflows/android-perf.yml b/.github/workflows/android-perf.yml index 70878631..f0cc6ca8 100644 --- a/.github/workflows/android-perf.yml +++ b/.github/workflows/android-perf.yml @@ -29,11 +29,11 @@ jobs: device: [single-android, 32bit-android] include: - device: single-android - initPerformanceThresholdSec: 3.0 - procPerformanceThresholdSec: 0.5 + initPerformanceThresholdSec: 6.0 + procPerformanceThresholdSec: 1.0 - device: 32bit-android - initPerformanceThresholdSec: 9.0 - procPerformanceThresholdSec: 3.5 + initPerformanceThresholdSec: 18.0 + procPerformanceThresholdSec: 7.0 steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/go-demos.yml b/.github/workflows/go-demos.yml index 4c09fe7e..8e1ecf89 100644 --- a/.github/workflows/go-demos.yml +++ b/.github/workflows/go-demos.yml @@ -74,7 +74,7 @@ jobs: - name: Test filedemo run: ./leopard_file_demo -access_key ${{secrets.PV_VALID_ACCESS_KEY}} -input_audio_path ../../resources/audio_samples/test.wav - + build-grpc-demo: runs-on: ${{ matrix.os }} defaults: diff --git a/.github/workflows/ios-perf.yml b/.github/workflows/ios-perf.yml index 84958078..03e4f2d1 100644 --- a/.github/workflows/ios-perf.yml +++ b/.github/workflows/ios-perf.yml @@ -29,8 +29,8 @@ jobs: device: [ios-perf] include: - device: ios-perf - initPerformanceThresholdSec: 1.5 - procPerformanceThresholdSec: 0.2 + initPerformanceThresholdSec: 3.0 + procPerformanceThresholdSec: 0.4 steps: - name: Checkout diff --git a/.github/workflows/java-demos.yml b/.github/workflows/java-demos.yml index 82d4cb21..217dd970 100644 --- a/.github/workflows/java-demos.yml +++ b/.github/workflows/java-demos.yml @@ -26,14 +26,15 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] + java-version: ['11', '17', '19'] steps: - uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK ${{ matrix.java-version }} uses: actions/setup-java@v3 with: - java-version: '11' + java-version: ${{ matrix.java-version }} distribution: 'temurin' - name: Build diff --git a/.github/workflows/java-perf.yml b/.github/workflows/java-perf.yml index 4604990d..ef5a02fd 100644 --- a/.github/workflows/java-perf.yml +++ b/.github/workflows/java-perf.yml @@ -31,13 +31,13 @@ jobs: os: [ubuntu-latest, macos-latest, windows-latest] include: - os: ubuntu-latest - init_performance_threshold_sec: 2.0 - proc_performance_threshold_sec: 0.7 - - os: windows-latest - init_performance_threshold_sec: 2.5 + init_performance_threshold_sec: 4.0 proc_performance_threshold_sec: 0.9 - os: macos-latest - init_performance_threshold_sec: 2.4 + init_performance_threshold_sec: 4.5 + proc_performance_threshold_sec: 1.9 + - os: windows-latest + init_performance_threshold_sec: 4.0 proc_performance_threshold_sec: 0.9 steps: @@ -64,20 +64,20 @@ jobs: machine: [rpi3-32, rpi3-64, rpi4-32, rpi4-64, jetson] include: - machine: rpi3-32 - init_performance_threshold_sec: 7.6 - proc_performance_threshold_sec: 3.3 + init_performance_threshold_sec: 16.0 + proc_performance_threshold_sec: 6.0 - machine: rpi3-64 - init_performance_threshold_sec: 8.4 - proc_performance_threshold_sec: 3.3 + init_performance_threshold_sec: 14.0 + proc_performance_threshold_sec: 5.5 - machine: rpi4-32 - init_performance_threshold_sec: 5.7 - proc_performance_threshold_sec: 2.1 + init_performance_threshold_sec: 7.0 + proc_performance_threshold_sec: 2.5 - machine: rpi4-64 - init_performance_threshold_sec: 5.1 - proc_performance_threshold_sec: 2.0 + init_performance_threshold_sec: 7.0 + proc_performance_threshold_sec: 2.5 - machine: jetson - init_performance_threshold_sec: 5.1 - proc_performance_threshold_sec: 2.0 + init_performance_threshold_sec: 7.0 + proc_performance_threshold_sec: 2.6 steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/java.yml b/.github/workflows/java.yml index 9d9afd76..ea82c444 100644 --- a/.github/workflows/java.yml +++ b/.github/workflows/java.yml @@ -34,14 +34,15 @@ jobs: strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] + java-version: ['11', '17', '19'] steps: - uses: actions/checkout@v3 - - name: Set up JDK 11 + - name: Set up JDK ${{ matrix.java-version }} uses: actions/setup-java@v3 with: - java-version: '11' + java-version: ${{ matrix.java-version }} distribution: 'temurin' - name: Build diff --git a/.github/workflows/nodejs-demos.yml b/.github/workflows/nodejs-demos.yml index bc7fd348..29e8ba3f 100644 --- a/.github/workflows/nodejs-demos.yml +++ b/.github/workflows/nodejs-demos.yml @@ -33,7 +33,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node-version: [14.x, 16.x, 18.x, 20.x] + node-version: [16.x, 18.x, 20.x] steps: - uses: actions/checkout@v3 @@ -43,9 +43,6 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: Pre-build dependencies - run: npm install yarn - - name: Install dependencies run: yarn install @@ -62,9 +59,6 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Pre-build dependencies - run: npm install --global yarn - - name: Install dependencies run: yarn install @@ -77,18 +71,14 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node-version: [lts/*] steps: - uses: actions/checkout@v3 - - name: Use Node.js ${{ matrix.node-version }} + - name: Use Node.js LTS uses: actions/setup-node@v3 with: - node-version: ${{ matrix.node-version }} - - - name: Pre-build dependencies - run: npm install yarn + node-version: lts/* - name: Install dependencies run: yarn install diff --git a/.github/workflows/nodejs-perf.yml b/.github/workflows/nodejs-perf.yml index 9cff05bd..4e61b7f3 100644 --- a/.github/workflows/nodejs-perf.yml +++ b/.github/workflows/nodejs-perf.yml @@ -32,14 +32,14 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] include: - os: ubuntu-latest - init_performance_threshold_sec: 2.0 - proc_performance_threshold_sec: 0.7 - - os: windows-latest init_performance_threshold_sec: 2.5 proc_performance_threshold_sec: 0.9 + - os: windows-latest + init_performance_threshold_sec: 2.5 + proc_performance_threshold_sec: 1.1 - os: macos-latest - init_performance_threshold_sec: 3.5 - proc_performance_threshold_sec: 0.9 + init_performance_threshold_sec: 4.0 + proc_performance_threshold_sec: 2.0 steps: @@ -50,9 +50,6 @@ jobs: with: node-version: 18.x - - name: Pre-build dependencies - run: npm install yarn - - name: Install dependencies run: yarn install @@ -69,26 +66,23 @@ jobs: include: - machine: rpi3-32 init_performance_threshold_sec: 7.6 - proc_performance_threshold_sec: 3.3 + proc_performance_threshold_sec: 4.5 - machine: rpi3-64 init_performance_threshold_sec: 8.4 - proc_performance_threshold_sec: 3.3 + proc_performance_threshold_sec: 4.5 - machine: rpi4-32 init_performance_threshold_sec: 5.7 - proc_performance_threshold_sec: 2.1 + proc_performance_threshold_sec: 3.3 - machine: rpi4-64 init_performance_threshold_sec: 5.1 - proc_performance_threshold_sec: 2.0 + proc_performance_threshold_sec: 3.2 - machine: jetson init_performance_threshold_sec: 5.1 - proc_performance_threshold_sec: 2.0 + proc_performance_threshold_sec: 3.2 steps: - uses: actions/checkout@v3 - - name: Pre-build dependencies - run: npm install --global yarn - - name: Install dependencies run: yarn install diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index a43e88e0..aa0f8c65 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -35,7 +35,7 @@ jobs: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] - node-version: [14.x, 16.x, 18.x, 20.x] + node-version: [16.x, 18.x, 20.x] steps: - uses: actions/checkout@v3 @@ -45,9 +45,6 @@ jobs: with: node-version: ${{ matrix.node-version }} - - name: Pre-build dependencies - run: npm install yarn - - name: Install dependencies run: yarn install @@ -64,9 +61,6 @@ jobs: steps: - uses: actions/checkout@v3 - - name: Pre-build dependencies - run: npm install --global yarn - - name: Install dependencies run: yarn install diff --git a/.github/workflows/python-demos.yml b/.github/workflows/python-demos.yml index 53ba5912..eb4ddc71 100644 --- a/.github/workflows/python-demos.yml +++ b/.github/workflows/python-demos.yml @@ -60,7 +60,7 @@ jobs: - name: Test run: python3 leopard_demo_file.py --access_key ${{secrets.PV_VALID_ACCESS_KEY}} --wav_paths ../../resources/audio_samples/test.wav - + build-subtitle-demo: runs-on: ${{ matrix.os }} defaults: @@ -118,7 +118,7 @@ jobs: run: pip install -r requirements.txt - name: Test - run: python main.py + run: python main.py --access_key ${{secrets.PV_VALID_ACCESS_KEY}} --url https://www.youtube.com/watch?v=b7wzFEDU0U8 --transcript_path test.txt diff --git a/.github/workflows/python-perf.yml b/.github/workflows/python-perf.yml index 17c0d361..5cca453c 100644 --- a/.github/workflows/python-perf.yml +++ b/.github/workflows/python-perf.yml @@ -39,14 +39,14 @@ jobs: os: [ubuntu-latest, windows-latest, macos-latest] include: - os: ubuntu-latest - init_performance_threshold_sec: 2.0 + init_performance_threshold_sec: 3.5 proc_performance_threshold_sec: 0.7 - os: windows-latest - init_performance_threshold_sec: 2.5 - proc_performance_threshold_sec: 0.9 + init_performance_threshold_sec: 3.5 + proc_performance_threshold_sec: 0.7 - os: macos-latest - init_performance_threshold_sec: 2.4 - proc_performance_threshold_sec: 0.9 + init_performance_threshold_sec: 3.8 + proc_performance_threshold_sec: 1.2 steps: - uses: actions/checkout@v3 @@ -74,20 +74,20 @@ jobs: machine: [rpi3-32, rpi3-64, rpi4-32, rpi4-64, jetson] include: - machine: rpi3-32 - init_performance_threshold_sec: 7.6 - proc_performance_threshold_sec: 3.3 + init_performance_threshold_sec: 8.5 + proc_performance_threshold_sec: 4.5 - machine: rpi3-64 - init_performance_threshold_sec: 8.4 - proc_performance_threshold_sec: 3.3 + init_performance_threshold_sec: 9.0 + proc_performance_threshold_sec: 4.5 - machine: rpi4-32 - init_performance_threshold_sec: 5.7 - proc_performance_threshold_sec: 2.1 + init_performance_threshold_sec: 7.2 + proc_performance_threshold_sec: 3.0 - machine: rpi4-64 - init_performance_threshold_sec: 5.1 - proc_performance_threshold_sec: 2.0 + init_performance_threshold_sec: 6.5 + proc_performance_threshold_sec: 2.8 - machine: jetson - init_performance_threshold_sec: 5.1 - proc_performance_threshold_sec: 2.0 + init_performance_threshold_sec: 6.0 + proc_performance_threshold_sec: 2.8 steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/react-codestyle.yml b/.github/workflows/react-codestyle.yml index e877f1d9..96ff5d91 100644 --- a/.github/workflows/react-codestyle.yml +++ b/.github/workflows/react-codestyle.yml @@ -34,6 +34,14 @@ jobs: - name: Pre-build dependencies run: npm install yarn + - name: Build Local Web SDK + run: yarn && yarn copywasm && yarn build + working-directory: binding/web + + - name: Build Local React SDK + run: yarn && yarn build + working-directory: binding/react + - name: Run Binding Linter run: yarn && yarn lint working-directory: binding/react diff --git a/.github/workflows/react-demos.yml b/.github/workflows/react-demos.yml index 6dfc22b7..770f5fd3 100644 --- a/.github/workflows/react-demos.yml +++ b/.github/workflows/react-demos.yml @@ -38,6 +38,14 @@ jobs: - name: Pre-build dependencies run: npm install yarn + - name: Build Local Web SDK + run: yarn && yarn copywasm && yarn build + working-directory: binding/web + + - name: Build Local React SDK + run: yarn && yarn build + working-directory: binding/react + - name: Install dependencies run: yarn install diff --git a/.github/workflows/react-native-tests.yml b/.github/workflows/react-native-tests.yml index a3d47b4d..47fc1440 100644 --- a/.github/workflows/react-native-tests.yml +++ b/.github/workflows/react-native-tests.yml @@ -6,8 +6,6 @@ on: paths: - 'binding/react-native/**' - 'lib/common/**' - - 'lib/android/**' - - 'lib/ios/**' - '.github/workflows/react-native-tests.yml' - 'resources/audio_samples/**' - 'resources/.test/**' @@ -16,8 +14,6 @@ on: paths: - 'binding/react-native/**' - 'lib/common/**' - - 'lib/android/**' - - 'lib/ios/**' - '.github/workflows/react-native-tests.yml' - 'resources/audio_samples/**' - 'resources/.test/**' @@ -63,9 +59,10 @@ jobs: run: | yarn install ./copy_test_resources.sh + - name: Cocoapods install working-directory: binding/react-native/test-app/LeopardTestApp/ios - run: pod install + run: pod install --repo-update - name: Inject AppID run: sed -i '.bak' 's:{TESTING_ACCESS_KEY_HERE}:${{secrets.PV_VALID_ACCESS_KEY}}:' Tests.ts diff --git a/.github/workflows/react-native.yml b/.github/workflows/react-native.yml index 467603b2..71d4b59d 100644 --- a/.github/workflows/react-native.yml +++ b/.github/workflows/react-native.yml @@ -8,8 +8,6 @@ on: - 'binding/react-native/**' - '!binding/react-native/README.md' - 'lib/common/**' - - 'lib/android/**' - - 'lib/ios/**' - '.github/workflows/react-native.yml' pull_request: branches: [ master, 'v[0-9]+.[0-9]+' ] @@ -17,8 +15,6 @@ on: - 'binding/react-native/**' - '!binding/react-native/README.md' - 'lib/common/**' - - 'lib/android/**' - - 'lib/ios/**' - '.github/workflows/react-native.yml' defaults: @@ -31,7 +27,7 @@ jobs: strategy: matrix: - node-version: [14.x, 16.x, 18.x] + node-version: [16.x, 18.x, 20.x] steps: - uses: actions/checkout@v3 @@ -48,4 +44,4 @@ jobs: run: yarn install - name: Build - run: yarn + run: yarn prepare diff --git a/.github/workflows/react.yml b/.github/workflows/react.yml index 1eed6171..61c95f59 100644 --- a/.github/workflows/react.yml +++ b/.github/workflows/react.yml @@ -46,6 +46,10 @@ jobs: - name: Pre-build dependencies run: npm install yarn + - name: Build Local Web SDK + run: yarn && yarn copywasm && yarn build + working-directory: binding/web + - name: Install dependencies run: yarn install diff --git a/.github/workflows/web-demos.yml b/.github/workflows/web-demos.yml index 0595b6b8..7b09159c 100644 --- a/.github/workflows/web-demos.yml +++ b/.github/workflows/web-demos.yml @@ -25,7 +25,7 @@ jobs: strategy: matrix: - node-version: [14.x, 16.x, 18.x, 20.x] + node-version: [16.x, 18.x, 20.x] steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/web-perf.yml b/.github/workflows/web-perf.yml index a2c5a0a8..96c9cf38 100644 --- a/.github/workflows/web-perf.yml +++ b/.github/workflows/web-perf.yml @@ -28,8 +28,8 @@ jobs: node-version: [lts/*] include: - node-version: lts/* - initPerformanceThresholdSec: 4.5 - procPerformanceThresholdSec: 0.3 + initPerformanceThresholdSec: 9.0 + procPerformanceThresholdSec: 0.8 steps: - uses: actions/checkout@v3 diff --git a/.github/workflows/web.yml b/.github/workflows/web.yml index a2920820..04e14e3e 100644 --- a/.github/workflows/web.yml +++ b/.github/workflows/web.yml @@ -27,7 +27,7 @@ jobs: strategy: matrix: - node-version: [14.x, 16.x, 18.x, 20.x] + node-version: [16.x, 18.x, 20.x] steps: - uses: actions/checkout@v3 diff --git a/README.md b/README.md index 03d8531a..021984d6 100644 --- a/README.md +++ b/README.md @@ -698,14 +698,24 @@ function App(props) { ## Releases -### v1.2.0 — March 27th, 2023 +### v2.0.0 - November 27th, 2023 + +- Improvements to error reporting +- Upgrades to authorization and authentication system +- Improved engine accuracy +- Various bug fixes and improvements +- Node min support bumped to Node 16 +- Bumped iOS support to iOS 13+ +- Patches to .NET support + +### v1.2.0 - March 27th, 2023 * Added language support for French, German, Italian, Japanese, Korean, Portuguese and Spanish * Added support for .NET 7.0 and fixed support for .NET Standard 2.0 * iOS minimum support moved to 11.0 * Improved stability and performance -### v1.1.0 — August 11th, 2022 +### v1.1.0 - August 11th, 2022 * Added true-casing by default for transcription results * Added option to enable automatic punctuation insertion @@ -713,6 +723,6 @@ function App(props) { * Support for 3gp (AMR) and MP4/m4a (AAC) audio files * Leopard Web SDK release -### v1.0.0 — January 10th, 2022 +### v1.0.0 - January 10th, 2022 * Initial release diff --git a/binding/android/Leopard/leopard/build.gradle b/binding/android/Leopard/leopard/build.gradle index 14e8ea80..f48e4b93 100644 --- a/binding/android/Leopard/leopard/build.gradle +++ b/binding/android/Leopard/leopard/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' ext { PUBLISH_GROUP_ID = 'ai.picovoice' - PUBLISH_VERSION = '1.2.1' + PUBLISH_VERSION = '2.0.0' PUBLISH_ARTIFACT_ID = 'leopard-android' } @@ -38,7 +38,7 @@ dependencies { } task copyLibs(type: Copy) { - from("${rootDir}/../../lib/android") + from("${rootDir}/../../../lib/android") into("${rootDir}/leopard/src/main/jniLibs") } diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/Leopard.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/Leopard.java index 002cddfa..d13eb457 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/Leopard.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/Leopard.java @@ -43,6 +43,11 @@ public class Leopard { } private long handle; + private static String _sdk = "android"; + + public static void setSdk(String sdk) { + Leopard._sdk = sdk; + } /** * Constructor. @@ -50,16 +55,23 @@ public class Leopard { * @param accessKey AccessKey obtained from Picovoice Console * @param modelPath Absolute path to the file containing Leopard model parameters. * @param enableAutomaticPunctuation Set to `true` to enable automatic punctuation insertion. + * @param enableDiarization Set to `true` to enable speaker diarization, which allows Leopard to + * differentiate speakers as part of the transcription process. Word + * metadata will include a `speaker_tag` to identify unique speakers. * @throws LeopardException if there is an error while initializing Leopard. */ private Leopard( String accessKey, String modelPath, - boolean enableAutomaticPunctuation) throws LeopardException { + boolean enableAutomaticPunctuation, + boolean enableDiarization) throws LeopardException { + LeopardNative.setSdk(Leopard._sdk); + handle = LeopardNative.init( accessKey, modelPath, - enableAutomaticPunctuation); + enableAutomaticPunctuation, + enableDiarization); } private static String extractResource( @@ -180,6 +192,7 @@ public static class Builder { private String accessKey = null; private String modelPath = null; private boolean enableAutomaticPunctuation = false; + private boolean enableDiarization = false; /** * Setter the AccessKey. @@ -211,6 +224,18 @@ public Builder setEnableAutomaticPunctuation(boolean enableAutomaticPunctuation) return this; } + /** + * Setter for enabling speaker diarization. + * + * @param enableDiarization Set to `true` to enable speaker diarization, which allows Leopard to + * differentiate speakers as part of the transcription process. Word + * metadata will include a `speaker_tag` to identify unique speakers. + */ + public Builder setEnableDiarization(boolean enableDiarization) { + this.enableDiarization = enableDiarization; + return this; + } + /** * Creates an instance of Leopard Speech-to-Text engine. */ @@ -238,7 +263,8 @@ public Leopard build(Context context) throws LeopardException { return new Leopard( accessKey, modelPath, - enableAutomaticPunctuation); + enableAutomaticPunctuation, + enableDiarization); } } } diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/LeopardNative.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/LeopardNative.java index f10e1d9c..0d2f10fd 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/LeopardNative.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/LeopardNative.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -14,14 +14,17 @@ class LeopardNative { + static native String getVersion(); + static native int getSampleRate(); - static native String getVersion(); + static native void setSdk(String sdk); static native long init( String accessKey, String modelPath, - boolean enableAutomaticPunctuation) throws LeopardException; + boolean enableAutomaticPunctuation, + boolean enableDiarization) throws LeopardException; static native void delete(long object); diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/LeopardTranscript.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/LeopardTranscript.java index 74eeb8d8..5bb58231 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/LeopardTranscript.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/LeopardTranscript.java @@ -1,7 +1,9 @@ /* Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -11,7 +13,7 @@ package ai.picovoice.leopard; /** - * Class that contains transcription results returned from Leopard. + * LeopardTranscript Class. */ public class LeopardTranscript { @@ -48,13 +50,14 @@ public Word[] getWordArray() { } /** - * Class for storing word metadata from Leopard. + * LeopardTranscript.Word class */ public static class Word { private final String word; private final float confidence; private final float startSec; private final float endSec; + private final int speakerTag; /** * Constructor. @@ -63,12 +66,22 @@ public static class Word { * @param confidence Transcription confidence. It is a number within [0, 1]. * @param startSec Start of word in seconds. * @param endSec End of word in seconds. + * @param speakerTag The speaker tag is `-1` if diarization is not enabled during initialization; + * otherwise, it's a non-negative integer identifying unique speakers, with `0` reserved for + * unknown speakers. */ - public Word(String word, float confidence, float startSec, float endSec) { + public Word( + String word, + float confidence, + float startSec, + float endSec, + int speakerTag + ) { this.word = word; this.confidence = confidence; this.startSec = startSec; this.endSec = endSec; + this.speakerTag = speakerTag; } /** @@ -106,5 +119,14 @@ public float getStartSec() { public float getEndSec() { return endSec; } + + /** + * Getter for the speaker tag. + * + * @return Speaker tag. + */ + public int getSpeakerTag() { + return speakerTag; + } } } diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationException.java index 83768915..6040f571 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardActivationException(Throwable cause) { public LeopardActivationException(String message) { super(message); } -} + public LeopardActivationException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationLimitException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationLimitException.java index d6a13b00..cd8cdd95 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationLimitException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationLimitException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardActivationLimitException(Throwable cause) { public LeopardActivationLimitException(String message) { super(message); } -} + public LeopardActivationLimitException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationRefusedException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationRefusedException.java index 943db0f2..acfd4086 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationRefusedException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationRefusedException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardActivationRefusedException(Throwable cause) { public LeopardActivationRefusedException(String message) { super(message); } -} + public LeopardActivationRefusedException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationThrottledException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationThrottledException.java index f4245f4e..e138679d 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationThrottledException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardActivationThrottledException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardActivationThrottledException(Throwable cause) { public LeopardActivationThrottledException(String message) { super(message); } -} + public LeopardActivationThrottledException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardException.java index c5d7985c..1828ed5e 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -11,12 +13,42 @@ package ai.picovoice.leopard; public class LeopardException extends Exception { + private final String message; + private final String[] messageStack; + public LeopardException(Throwable cause) { super(cause); + this.message = cause.getMessage(); + this.messageStack = null; } public LeopardException(String message) { super(message); + this.message = message; + this.messageStack = null; } -} + public LeopardException(String message, String[] messageStack) { + super(message); + this.message = message; + this.messageStack = messageStack; + } + + public String[] getMessageStack() { + return this.messageStack; + } + + @Override + public String getMessage() { + StringBuilder sb = new StringBuilder(message); + if (messageStack != null) { + if (messageStack.length > 0) { + sb.append(":"); + for (int i = 0; i < messageStack.length; i++) { + sb.append(String.format("\n [%d] %s", i, messageStack[i])); + } + } + } + return sb.toString(); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardIOException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardIOException.java index 27849b60..2559011e 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardIOException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardIOException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardIOException(Throwable cause) { public LeopardIOException(String message) { super(message); } -} + public LeopardIOException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardInvalidArgumentException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardInvalidArgumentException.java index 141326b1..eb934c3f 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardInvalidArgumentException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardInvalidArgumentException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardInvalidArgumentException(Throwable cause) { public LeopardInvalidArgumentException(String message) { super(message); } -} + public LeopardInvalidArgumentException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardInvalidStateException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardInvalidStateException.java index a8ae603e..90d56f9d 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardInvalidStateException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardInvalidStateException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardInvalidStateException(Throwable cause) { public LeopardInvalidStateException(String message) { super(message); } -} + public LeopardInvalidStateException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardKeyException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardKeyException.java index 61f4501f..5022a36d 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardKeyException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardKeyException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardKeyException(Throwable cause) { public LeopardKeyException(String message) { super(message); } -} + public LeopardKeyException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardMemoryException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardMemoryException.java index 04c53031..40815cc9 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardMemoryException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardMemoryException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardMemoryException(Throwable cause) { public LeopardMemoryException(String message) { super(message); } -} + public LeopardMemoryException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardRuntimeException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardRuntimeException.java index 9723df6c..d9b8a78e 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardRuntimeException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardRuntimeException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardRuntimeException(Throwable cause) { public LeopardRuntimeException(String message) { super(message); } -} + public LeopardRuntimeException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardStopIterationException.java b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardStopIterationException.java index 6d82a621..8f9570a1 100644 --- a/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardStopIterationException.java +++ b/binding/android/Leopard/leopard/src/main/java/ai/picovoice/leopard/exception/LeopardStopIterationException.java @@ -1,7 +1,9 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and @@ -18,5 +20,8 @@ public LeopardStopIterationException(Throwable cause) { public LeopardStopIterationException(String message) { super(message); } -} + public LeopardStopIterationException(String message, String[] messageStack) { + super(message, messageStack); + } +} diff --git a/binding/android/LeopardTestApp/.gitignore b/binding/android/LeopardTestApp/.gitignore index 66b0063a..76b91577 100644 --- a/binding/android/LeopardTestApp/.gitignore +++ b/binding/android/LeopardTestApp/.gitignore @@ -12,4 +12,3 @@ test_resources *.wav *.jks -!.dummy.jks diff --git a/binding/android/LeopardTestApp/leopard-test-app/build.gradle b/binding/android/LeopardTestApp/leopard-test-app/build.gradle index f91431ec..cb7c3dd3 100644 --- a/binding/android/LeopardTestApp/leopard-test-app/build.gradle +++ b/binding/android/LeopardTestApp/leopard-test-app/build.gradle @@ -140,7 +140,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'ai.picovoice:leopard-android:1.2.1' + implementation 'ai.picovoice:leopard-android:2.0.0' // Espresso UI Testing androidTestImplementation 'androidx.test.ext:junit:1.1.5' diff --git a/binding/android/LeopardTestApp/leopard-test-app/src/androidTest/java/ai/picovoice/leopard/testapp/BaseTest.java b/binding/android/LeopardTestApp/leopard-test-app/src/androidTest/java/ai/picovoice/leopard/testapp/BaseTest.java index 08ddbce3..c4a04845 100644 --- a/binding/android/LeopardTestApp/leopard-test-app/src/androidTest/java/ai/picovoice/leopard/testapp/BaseTest.java +++ b/binding/android/LeopardTestApp/leopard-test-app/src/androidTest/java/ai/picovoice/leopard/testapp/BaseTest.java @@ -13,6 +13,7 @@ package ai.picovoice.leopard.testapp; import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; import android.content.Context; import android.content.res.AssetManager; @@ -99,23 +100,27 @@ protected static short[] readAudioFile(String audioFile) throws Exception { short[] pcm = new short[rawData.length / 2]; ByteBuffer pcmBuff = ByteBuffer.wrap(rawData).order(ByteOrder.LITTLE_ENDIAN); pcmBuff.asShortBuffer().get(pcm); - pcm = Arrays.copyOfRange(pcm, 44, pcm.length); + pcm = Arrays.copyOfRange(pcm, 22, pcm.length); return pcm; } - protected void validateMetadata(LeopardTranscript.Word[] words, String transcript, float audioLength) { - String normTranscript = transcript.toUpperCase(); + protected void validateMetadata( + LeopardTranscript.Word[] words, + LeopardTranscript.Word[] expectedWords, + boolean enableDiarization + ) { + assertEquals(words.length, expectedWords.length); for (int i = 0; i < words.length; i++) { - assertTrue(normTranscript.contains(words[i].getWord().toUpperCase())); - assertTrue(words[i].getStartSec() > 0); - assertTrue(words[i].getStartSec() <= words[i].getEndSec()); - if (i < words.length - 1) { - assertTrue(words[i].getEndSec() <= words[i + 1].getStartSec()); + assertEquals(words[i].getWord(), expectedWords[i].getWord()); + assertEquals(words[i].getConfidence(), expectedWords[i].getConfidence(), 0.01); + assertEquals(words[i].getStartSec(), expectedWords[i].getStartSec(), 0.01); + assertEquals(words[i].getEndSec(), expectedWords[i].getEndSec(), 0.01); + if (enableDiarization) { + assertEquals(words[i].getSpeakerTag(), expectedWords[i].getSpeakerTag()); } else { - assertTrue(words[i].getEndSec() <= audioLength); + assertEquals(words[i].getSpeakerTag(), -1); } - assertTrue(words[i].getConfidence() >= 0.0f && words[i].getConfidence() <= 1.0f); } } diff --git a/binding/android/LeopardTestApp/leopard-test-app/src/androidTest/java/ai/picovoice/leopard/testapp/LeopardTest.java b/binding/android/LeopardTestApp/leopard-test-app/src/androidTest/java/ai/picovoice/leopard/testapp/LeopardTest.java index 19342dfb..893a3e84 100644 --- a/binding/android/LeopardTestApp/leopard-test-app/src/androidTest/java/ai/picovoice/leopard/testapp/LeopardTest.java +++ b/binding/android/LeopardTestApp/leopard-test-app/src/androidTest/java/ai/picovoice/leopard/testapp/LeopardTest.java @@ -12,7 +12,7 @@ package ai.picovoice.leopard.testapp; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.*; import com.google.gson.JsonArray; import com.google.gson.JsonObject; @@ -119,6 +119,33 @@ public void getSampleRate() throws LeopardException { leopard.delete(); } + + @Test + public void testErrorStack() { + String[] error = {}; + try { + new Leopard.Builder() + .setAccessKey("invalid") + .setModelPath(defaultModelPath) + .build(appContext); + } catch (LeopardException e) { + error = e.getMessageStack(); + } + + assertTrue(0 < error.length); + assertTrue(error.length <= 8); + + try { + new Leopard.Builder() + .setAccessKey("invalid") + .setModelPath(defaultModelPath) + .build(appContext); + } catch (LeopardException e) { + for (int i = 0; i < error.length; i++) { + assertEquals(e.getMessageStack()[i], error[i]); + } + } + } } @RunWith(Parameterized.class) @@ -136,28 +163,34 @@ public static class LanguageTests extends BaseTest { public String expectedTranscript; @Parameterized.Parameter(value = 4) - public String[] punctuations; + public String expectedTranscriptWithPunctuation; @Parameterized.Parameter(value = 5) public float errorRate; + @Parameterized.Parameter(value = 6) + public LeopardTranscript.Word[] expectedWords; + @Parameterized.Parameters(name = "{0}") public static Collection initParameters() throws IOException { String testDataJsonString = getTestDataString(); JsonParser parser = new JsonParser(); JsonObject testDataJson = parser.parse(testDataJsonString).getAsJsonObject(); - JsonArray testParameters = testDataJson.getAsJsonObject("tests").getAsJsonArray("parameters"); + JsonArray languageTests = testDataJson + .getAsJsonObject("tests") + .getAsJsonArray("language_tests"); List parameters = new ArrayList<>(); - for (int i = 0; i < testParameters.size(); i++) { - JsonObject testData = testParameters.get(i).getAsJsonObject(); + for (int i = 0; i < languageTests.size(); i++) { + JsonObject testData = languageTests.get(i).getAsJsonObject(); String language = testData.get("language").getAsString(); String audioFile = testData.get("audio_file").getAsString(); String transcript = testData.get("transcript").getAsString(); - JsonArray punctuations = testData.get("punctuations").getAsJsonArray(); + String transcriptWithPunctuation = testData.get("transcript_with_punctuation").getAsString(); float errorRate = testData.get("error_rate").getAsFloat(); + JsonArray words = testData.get("words").getAsJsonArray(); String modelFile; if (language.equals("en")) { @@ -168,9 +201,23 @@ public static Collection initParameters() throws IOException { String testAudioFile = String.format("audio_samples/%s", audioFile); - String[] paramPunctuations = new String[punctuations.size()]; - for (int j = 0; j < punctuations.size(); j++) { - paramPunctuations[j] = punctuations.get(j).getAsString(); + LeopardTranscript.Word[] paramWords = new LeopardTranscript.Word[words.size()]; + for (int j = 0; j < words.size(); j++) { + JsonObject wordObject = words.get(j).getAsJsonObject(); + + String word = wordObject.get("word").getAsString(); + float confidence = wordObject.get("confidence").getAsFloat(); + float startSec = wordObject.get("start_sec").getAsFloat(); + float endSec = wordObject.get("end_sec").getAsFloat(); + int speakerTag = wordObject.get("speaker_tag").getAsInt(); + + paramWords[j] = new LeopardTranscript.Word( + word, + confidence, + startSec, + endSec, + speakerTag + ); } parameters.add(new Object[]{ @@ -178,8 +225,9 @@ public static Collection initParameters() throws IOException { modelFile, testAudioFile, transcript, - paramPunctuations, - errorRate + transcriptWithPunctuation, + errorRate, + paramWords }); } @@ -200,16 +248,11 @@ public void testTranscribeAudioFile() throws Exception { LeopardTranscript result = leopard.processFile(audioFile.getAbsolutePath()); - String normalizedTranscript = expectedTranscript; - for (String punctuation : punctuations) { - normalizedTranscript = normalizedTranscript.replace(punctuation, ""); - } - - assertTrue(getWordErrorRate(result.getTranscriptString(), normalizedTranscript, useCER) < errorRate); + assertTrue(getWordErrorRate(result.getTranscriptString(), expectedTranscript, useCER) < errorRate); validateMetadata( result.getWordArray(), - result.getTranscriptString(), - (float) readAudioFile(audioFile.getAbsolutePath()).length / leopard.getSampleRate() + expectedWords, + false ); leopard.delete(); @@ -228,17 +271,13 @@ public void testTranscribeAudioFileWithPunctuation() throws Exception { boolean useCER = language.equals("ja"); LeopardTranscript result = leopard.processFile(audioFile.getAbsolutePath()); - assertTrue(getWordErrorRate(result.getTranscriptString(), expectedTranscript, useCER) < errorRate); - - String normalizedTranscript = result.getTranscriptString(); - for (String punctuation : punctuations) { - normalizedTranscript = normalizedTranscript.replace(punctuation, ""); - } + assertTrue(getWordErrorRate( + result.getTranscriptString(), expectedTranscriptWithPunctuation, useCER) < errorRate); validateMetadata( result.getWordArray(), - result.getTranscriptString(), - (float) readAudioFile(audioFile.getAbsolutePath()).length / leopard.getSampleRate() + expectedWords, + false ); leopard.delete(); @@ -258,19 +297,130 @@ public void testTranscribeAudioData() throws Exception { LeopardTranscript result = leopard.process(pcm); boolean useCER = language.equals("ja"); - String normalizedTranscript = result.getTranscriptString(); - for (String punctuation : punctuations) { - normalizedTranscript = normalizedTranscript.replace(punctuation, ""); - } + assertTrue(getWordErrorRate(result.getTranscriptString(), expectedTranscript, useCER) < errorRate); + validateMetadata( + result.getWordArray(), + expectedWords, + false + ); + + leopard.delete(); + } + + @Test + public void testTranscribeAudioDataWithDiarization() throws Exception { + String modelPath = new File(testResourcesPath, modelFile).getAbsolutePath(); + Leopard leopard = new Leopard.Builder() + .setAccessKey(accessKey) + .setModelPath(modelPath) + .setEnableDiarization(true) + .build(appContext); + + File audioFile = new File(testResourcesPath, testAudioFile); + short[] pcm = readAudioFile(audioFile.getAbsolutePath()); + + LeopardTranscript result = leopard.process(pcm); + boolean useCER = language.equals("ja"); - assertTrue(getWordErrorRate(result.getTranscriptString(), normalizedTranscript, useCER) < errorRate); + assertTrue(getWordErrorRate(result.getTranscriptString(), expectedTranscript, useCER) < errorRate); validateMetadata( result.getWordArray(), - result.getTranscriptString(), - (float) pcm.length / leopard.getSampleRate() + expectedWords, + true ); leopard.delete(); } } + + @RunWith(Parameterized.class) + public static class DiarizationTests extends BaseTest { + @Parameterized.Parameter(value = 0) + public String language; + + @Parameterized.Parameter(value = 1) + public String modelFile; + + @Parameterized.Parameter(value = 2) + public String testAudioFile; + + @Parameterized.Parameter(value = 3) + public LeopardTranscript.Word[] expectedWords; + + @Parameterized.Parameters(name = "{0}") + public static Collection initParameters() throws IOException { + String testDataJsonString = getTestDataString(); + + JsonParser parser = new JsonParser(); + JsonObject testDataJson = parser.parse(testDataJsonString).getAsJsonObject(); + JsonArray languageTests = testDataJson + .getAsJsonObject("tests") + .getAsJsonArray("diarization_tests"); + + List parameters = new ArrayList<>(); + for (int i = 0; i < languageTests.size(); i++) { + JsonObject testData = languageTests.get(i).getAsJsonObject(); + + String language = testData.get("language").getAsString(); + String audioFile = testData.get("audio_file").getAsString(); + JsonArray words = testData.get("words").getAsJsonArray(); + + String modelFile; + if (language.equals("en")) { + modelFile = "model_files/leopard_params.pv"; + } else { + modelFile = String.format("model_files/leopard_params_%s.pv", language); + } + + String testAudioFile = String.format("audio_samples/%s", audioFile); + + LeopardTranscript.Word[] paramWords = new LeopardTranscript.Word[words.size()]; + for (int j = 0; j < words.size(); j++) { + JsonObject wordObject = words.get(j).getAsJsonObject(); + + String word = wordObject.get("word").getAsString(); + int speakerTag = wordObject.get("speaker_tag").getAsInt(); + + paramWords[j] = new LeopardTranscript.Word( + word, + 0.f, + 0.f, + 0.f, + speakerTag + ); + } + + parameters.add(new Object[]{ + language, + modelFile, + testAudioFile, + paramWords + }); + } + + return parameters; + } + + @Test + public void testDiarizationMultipleSpeakers() throws Exception { + String modelPath = new File(testResourcesPath, modelFile).getAbsolutePath(); + Leopard leopard = new Leopard.Builder() + .setAccessKey(accessKey) + .setModelPath(modelPath) + .setEnableDiarization(true) + .build(appContext); + + File audioFile = new File(testResourcesPath, testAudioFile); + short[] pcm = readAudioFile(audioFile.getAbsolutePath()); + + LeopardTranscript result = leopard.process(pcm); + + assertEquals(result.getWordArray().length, expectedWords.length); + for (int i = 0; i < result.getWordArray().length; i++) { + assertEquals(result.getWordArray()[i].getWord(), expectedWords[i].getWord()); + assertEquals(result.getWordArray()[i].getSpeakerTag(), expectedWords[i].getSpeakerTag()); + } + leopard.delete(); + } + } } diff --git a/binding/dotnet/Leopard/Leopard.cs b/binding/dotnet/Leopard/Leopard.cs index beaf8629..75d0877d 100644 --- a/binding/dotnet/Leopard/Leopard.cs +++ b/binding/dotnet/Leopard/Leopard.cs @@ -10,7 +10,6 @@ specific language governing permissions and limitations under the License. */ using System; -using System.Collections.Generic; using System.IO; using System.Reflection; using System.Runtime.InteropServices; @@ -42,9 +41,9 @@ public enum PvStatus public class Leopard : IDisposable { private const string LIBRARY = "libpv_leopard"; - private IntPtr _libraryPointer = IntPtr.Zero; public static readonly string DEFAULT_MODEL_PATH; + private IntPtr _libraryPointer; static Leopard() { @@ -62,7 +61,7 @@ static Leopard() private static IntPtr ImportResolver(string libraryName, Assembly assembly, DllImportSearchPath? searchPath) { - IntPtr libHandle = IntPtr.Zero; + IntPtr libHandle; NativeLibrary.TryLoad(Utils.PvLibraryPath(libraryName), out libHandle); return libHandle; } @@ -73,12 +72,10 @@ private static IntPtr ImportResolver(string libraryName, Assembly assembly, DllI private static extern PvStatus pv_leopard_init( IntPtr accessKey, IntPtr modelPath, - bool enable_automatic_punctuation, + bool enableAutomaticPunctuation, + bool enableDiarization, out IntPtr handle); - [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] - private static extern Int32 pv_sample_rate(); - [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] private static extern void pv_leopard_delete(IntPtr handle); @@ -108,16 +105,29 @@ private static extern PvStatus pv_leopard_process_file( [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] private static extern IntPtr pv_leopard_version(); + [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] + private static extern Int32 pv_sample_rate(); + + [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] + private static extern void pv_set_sdk(string sdk); + + [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] + private static extern PvStatus pv_get_error_stack(out IntPtr messageStack, out int messageStackDepth); + + [DllImport(LIBRARY, CallingConvention = CallingConvention.Cdecl)] + private static extern void pv_free_error_stack(IntPtr messageStack); + /// /// C Struct for storing word metadata /// [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] private struct CWord { - public IntPtr wordPtr; - public float startSec; - public float endSec; - public float confidence; + public readonly IntPtr wordPtr; + public readonly float startSec; + public readonly float endSec; + public readonly float confidence; + public readonly Int32 speakerTag; } /// @@ -131,10 +141,22 @@ private struct CWord /// /// Set to `true` to enable automatic punctuation insertion. /// + /// + /// Set to `true` to enable speaker diarization, which allows Leopard to differentiate speakers as + /// part of the transcription process. Word metadata will include a `SpeakerTag` to identify unique speakers. + /// /// An instance of Leopard Speech-to-Text engine. - public static Leopard Create(string accessKey, string modelPath = null, bool enableAutomaticPunctuation = false) + public static Leopard Create( + string accessKey, + string modelPath = null, + bool enableAutomaticPunctuation = false, + bool enableDiarization = false) { - return new Leopard(accessKey, modelPath ?? DEFAULT_MODEL_PATH, enableAutomaticPunctuation); + return new Leopard( + accessKey, + modelPath ?? DEFAULT_MODEL_PATH, + enableAutomaticPunctuation, + enableDiarization); } /// @@ -148,10 +170,15 @@ public static Leopard Create(string accessKey, string modelPath = null, bool ena /// /// Set to `true` to enable automatic punctuation insertion. /// + /// + /// Set to `true` to enable speaker diarization, which allows Leopard to differentiate speakers as + /// part of the transcription process. Word metadata will include a `SpeakerTag` to identify unique speakers. + /// private Leopard( string accessKey, string modelPath, - bool enableAutomaticPunctuation) + bool enableAutomaticPunctuation, + bool enableDiarization) { if (string.IsNullOrEmpty(accessKey)) { @@ -166,10 +193,13 @@ private Leopard( IntPtr accessKeyPtr = Utils.GetPtrFromUtf8String(accessKey); IntPtr modelPathPtr = Utils.GetPtrFromUtf8String(modelPath); + pv_set_sdk("dotnet"); + PvStatus status = pv_leopard_init( accessKeyPtr, modelPathPtr, enableAutomaticPunctuation, + enableDiarization, out _libraryPointer); Marshal.FreeHGlobal(accessKeyPtr); @@ -177,7 +207,8 @@ private Leopard( if (status != PvStatus.SUCCESS) { - throw PvStatusToException(status); + string[] messageStack = GetMessageStack(); + throw PvStatusToException(status, "Leopard init failed", messageStack); } Version = Utils.GetUtf8StringFromPtr(pv_leopard_version()); @@ -188,47 +219,54 @@ private Leopard( /// Processes a given audio data and returns its transcription. /// /// - /// Audio data. The audio needs to have a sample rate equal to `.SampleRate` and be 16-bit linearly-encoded. This function operates on single-channel audio. + /// Audio data. The audio needs to have a sample rate equal to `.SampleRate` and be 16-bit linearly-encoded. This + /// function operates on single-channel audio. /// /// /// LeopardTranscript object which contains the transcription results of the engine. /// public LeopardTranscript Process(Int16[] pcm) { - if (pcm.Length == 0 | pcm == null) + if (pcm == null || pcm.Length == 0) { throw new LeopardInvalidArgumentException("Input audio frame is empty"); } - IntPtr transcriptPtr = IntPtr.Zero; - Int32 numWords = 0; - IntPtr wordsPtr = IntPtr.Zero; + IntPtr transcriptPtr; + Int32 numWords; + IntPtr wordsPtr; PvStatus status = pv_leopard_process (_libraryPointer, pcm, - (Int32)pcm.Length, + pcm.Length, out transcriptPtr, out numWords, out wordsPtr); if (status != PvStatus.SUCCESS) { - throw PvStatusToException(status, "Leopard failed to process the audio frame."); + string[] messageStack = GetMessageStack(); + throw PvStatusToException(status, "Leopard process failed", messageStack); } string transcript = Utils.GetUtf8StringFromPtr(transcriptPtr); pv_leopard_transcript_delete(transcriptPtr); - List wordsList = new List(); + + LeopardWord[] wordsList = new LeopardWord[numWords]; IntPtr orgWordsPtr = wordsPtr; for (int i = 0; i < numWords; i++) { CWord cword = (CWord)Marshal.PtrToStructure(wordsPtr, typeof(CWord)); - string word = Utils.GetUtf8StringFromPtr(cword.wordPtr); - wordsList.Add(new LeopardWord(word, cword.confidence, cword.startSec, cword.endSec)); + wordsList[i] = new LeopardWord( + Utils.GetUtf8StringFromPtr(cword.wordPtr), + cword.confidence, + cword.startSec, + cword.endSec, + cword.speakerTag); wordsPtr += Marshal.SizeOf(typeof(CWord)); } pv_leopard_words_delete(orgWordsPtr); - return new LeopardTranscript(transcript, wordsList.ToArray()); + return new LeopardTranscript(transcript, wordsList); } /// @@ -243,6 +281,11 @@ public LeopardTranscript Process(Int16[] pcm) /// public LeopardTranscript ProcessFile(string audioPath) { + if (String.IsNullOrEmpty(audioPath)) + { + throw new LeopardInvalidArgumentException("Audio file path was empty"); + } + if (!File.Exists(audioPath)) { throw new LeopardIOException($"Couldn't find audio file at '{audioPath}'"); @@ -250,9 +293,9 @@ public LeopardTranscript ProcessFile(string audioPath) IntPtr audioPathPtr = Utils.GetPtrFromUtf8String(audioPath); - IntPtr transcriptPtr = IntPtr.Zero; - Int32 numWords = 0; - IntPtr wordsPtr = IntPtr.Zero; + IntPtr transcriptPtr; + Int32 numWords; + IntPtr wordsPtr; PvStatus status = pv_leopard_process_file( _libraryPointer, audioPathPtr, @@ -264,70 +307,86 @@ public LeopardTranscript ProcessFile(string audioPath) if (status != PvStatus.SUCCESS) { - throw PvStatusToException(status, "Leopard failed to process the audio file."); + string[] messageStack = GetMessageStack(); + throw PvStatusToException(status, "Leopard process file failed", messageStack); } string transcript = Utils.GetUtf8StringFromPtr(transcriptPtr); pv_leopard_transcript_delete(transcriptPtr); + + LeopardWord[] wordsList = new LeopardWord[numWords]; IntPtr orgWordsPtr = wordsPtr; - List wordsList = new List(); for (int i = 0; i < numWords; i++) { CWord cword = (CWord)Marshal.PtrToStructure(wordsPtr, typeof(CWord)); - string word = Utils.GetUtf8StringFromPtr(cword.wordPtr); - wordsList.Add(new LeopardWord(word, cword.confidence, cword.startSec, cword.endSec)); + wordsList[i] = new LeopardWord( + Utils.GetUtf8StringFromPtr(cword.wordPtr), + cword.confidence, + cword.startSec, + cword.endSec, + cword.speakerTag); wordsPtr += Marshal.SizeOf(typeof(CWord)); } pv_leopard_words_delete(orgWordsPtr); - return new LeopardTranscript(transcript, wordsList.ToArray()); + return new LeopardTranscript(transcript, wordsList); } /// /// Gets the version number of the Leopard library. /// /// Version of Leopard - public string Version { get; private set; } + public string Version { get; } /// /// Get the audio sample rate required by Leopard /// /// Required sample rate. - public Int32 SampleRate { get; private set; } + public Int32 SampleRate { get; } /// /// Coverts status codes to relevant .NET exceptions /// /// Picovoice library status code. + /// Default error message. + /// Error stack returned from Picovoice library. /// .NET exception - private static Exception PvStatusToException(PvStatus status, string message = "") + private static Exception PvStatusToException( + PvStatus status, + string message = "", + string[] messageStack = null) { + if (messageStack == null) + { + messageStack = new string[] { }; + } + switch (status) { case PvStatus.OUT_OF_MEMORY: - return new LeopardMemoryException(message); + return new LeopardMemoryException(message, messageStack); case PvStatus.IO_ERROR: - return new LeopardIOException(message); + return new LeopardIOException(message, messageStack); case PvStatus.INVALID_ARGUMENT: - return new LeopardInvalidArgumentException(message); + return new LeopardInvalidArgumentException(message, messageStack); case PvStatus.STOP_ITERATION: - return new LeopardStopIterationException(message); + return new LeopardStopIterationException(message, messageStack); case PvStatus.KEY_ERROR: - return new LeopardKeyException(message); + return new LeopardKeyException(message, messageStack); case PvStatus.INVALID_STATE: - return new LeopardInvalidStateException(message); + return new LeopardInvalidStateException(message, messageStack); case PvStatus.RUNTIME_ERROR: - return new LeopardRuntimeException(message); + return new LeopardRuntimeException(message, messageStack); case PvStatus.ACTIVATION_ERROR: - return new LeopardActivationException(message); + return new LeopardActivationException(message, messageStack); case PvStatus.ACTIVATION_LIMIT_REACHED: - return new LeopardActivationLimitException(message); + return new LeopardActivationLimitException(message, messageStack); case PvStatus.ACTIVATION_THROTTLED: - return new LeopardActivationThrottledException(message); + return new LeopardActivationThrottledException(message, messageStack); case PvStatus.ACTIVATION_REFUSED: - return new LeopardActivationRefusedException(message); + return new LeopardActivationRefusedException(message, messageStack); default: - return new LeopardException("Unmapped error code returned from Leopard."); + return new LeopardException("Unmapped error code returned from Leopard.", messageStack); } } @@ -350,5 +409,29 @@ public void Dispose() { Dispose(); } + + private string[] GetMessageStack() + { + Int32 messageStackDepth; + IntPtr messageStackRef; + + PvStatus status = pv_get_error_stack(out messageStackRef, out messageStackDepth); + if (status != PvStatus.SUCCESS) + { + throw PvStatusToException(status, "Unable to get Leopard error state"); + } + + int elementSize = Marshal.SizeOf(typeof(IntPtr)); + string[] messageStack = new string[messageStackDepth]; + + for (int i = 0; i < messageStackDepth; i++) + { + messageStack[i] = Marshal.PtrToStringAnsi(Marshal.ReadIntPtr(messageStackRef, i * elementSize)); + } + + pv_free_error_stack(messageStackRef); + + return messageStack; + } } } \ No newline at end of file diff --git a/binding/dotnet/Leopard/Leopard.csproj b/binding/dotnet/Leopard/Leopard.csproj index f6158107..b1a6b2f2 100644 --- a/binding/dotnet/Leopard/Leopard.csproj +++ b/binding/dotnet/Leopard/Leopard.csproj @@ -2,16 +2,16 @@ net6.0;netcoreapp3.0;netstandard2.0 - 1.2.1 + 2.0.0 Picovoice - + Leopard Speech-to-Text Engine Apache-2.0 https://github.com/Picovoice/leopard https://github.com/Picovoice/leopard.git git Speech-to-Text, Speech Recognition, Voice Recognition, ASR - See https://github.com/Picovoice/leopard/ + See https://github.com/Picovoice/leopard/ Picovoice 2022-2023 Leopard is an on-device speech-to-text engine. Leopard is: @@ -24,6 +24,8 @@ true pv_circle_512.png + + @@ -33,20 +35,15 @@ - build/netcoreapp3.0; - build/net6.0; - - PreserveNewest - - - - build/netstandard2.0/lib/common/leopard_params.pv; - build/netcoreapp3.0/lib/common/leopard_params.pv; - build/net6.0/lib/common/leopard_params.pv; + build/netcoreapp3.0/Leopard.targets; + build/net6.0/Leopard.targets; - lib\common\leopard_params.pv PreserveNewest + + + + build/netstandard2.0/libpv_leopard.dll; @@ -78,8 +75,10 @@ false + + - + build/netcoreapp3.0/lib/raspberry-pi; build/net6.0/lib/raspberry-pi; @@ -98,6 +97,8 @@ false + + @@ -108,8 +109,22 @@ false + + + + + + build/netstandard2.0/lib/common/leopard_params.pv; + build/netcoreapp3.0/lib/common/leopard_params.pv; + build/net6.0/lib/common/leopard_params.pv; + + lib\common\leopard_params.pv + PreserveNewest + + + - + diff --git a/binding/dotnet/Leopard/LeopardException.cs b/binding/dotnet/Leopard/LeopardException.cs index b8e33f13..4d5ccd70 100644 --- a/binding/dotnet/Leopard/LeopardException.cs +++ b/binding/dotnet/Leopard/LeopardException.cs @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -15,10 +15,35 @@ namespace Pv { public class LeopardException : Exception { + private readonly string[] _messageStack; + public LeopardException() { } public LeopardException(string message) : base(message) { } + public LeopardException(string message, string[] messageStack) : base(ModifyMessages(message, messageStack)) + { + this._messageStack = messageStack; + } + + public string[] MessageStack + { + get => _messageStack; + } + + private static string ModifyMessages(string message, string[] messageStack) + { + string messageString = message; + if (messageStack.Length > 0) + { + messageString += ":"; + for (int i = 0; i < messageStack.Length; i++) + { + messageString += $"\n [{i}] {messageStack[i]}"; + } + } + return messageString; + } } public class LeopardMemoryException : LeopardException @@ -26,6 +51,8 @@ public class LeopardMemoryException : LeopardException public LeopardMemoryException() { } public LeopardMemoryException(string message) : base(message) { } + + public LeopardMemoryException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardIOException : LeopardException @@ -33,6 +60,8 @@ public class LeopardIOException : LeopardException public LeopardIOException() { } public LeopardIOException(string message) : base(message) { } + + public LeopardIOException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardInvalidArgumentException : LeopardException @@ -40,6 +69,8 @@ public class LeopardInvalidArgumentException : LeopardException public LeopardInvalidArgumentException() { } public LeopardInvalidArgumentException(string message) : base(message) { } + + public LeopardInvalidArgumentException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardStopIterationException : LeopardException @@ -47,6 +78,8 @@ public class LeopardStopIterationException : LeopardException public LeopardStopIterationException() { } public LeopardStopIterationException(string message) : base(message) { } + + public LeopardStopIterationException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardKeyException : LeopardException @@ -54,6 +87,8 @@ public class LeopardKeyException : LeopardException public LeopardKeyException() { } public LeopardKeyException(string message) : base(message) { } + + public LeopardKeyException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardInvalidStateException : LeopardException @@ -61,6 +96,8 @@ public class LeopardInvalidStateException : LeopardException public LeopardInvalidStateException() { } public LeopardInvalidStateException(string message) : base(message) { } + + public LeopardInvalidStateException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardRuntimeException : LeopardException @@ -68,6 +105,8 @@ public class LeopardRuntimeException : LeopardException public LeopardRuntimeException() { } public LeopardRuntimeException(string message) : base(message) { } + + public LeopardRuntimeException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardActivationException : LeopardException @@ -75,6 +114,8 @@ public class LeopardActivationException : LeopardException public LeopardActivationException() { } public LeopardActivationException(string message) : base(message) { } + + public LeopardActivationException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardActivationLimitException : LeopardException @@ -82,6 +123,8 @@ public class LeopardActivationLimitException : LeopardException public LeopardActivationLimitException() { } public LeopardActivationLimitException(string message) : base(message) { } + + public LeopardActivationLimitException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardActivationThrottledException : LeopardException @@ -89,6 +132,8 @@ public class LeopardActivationThrottledException : LeopardException public LeopardActivationThrottledException() { } public LeopardActivationThrottledException(string message) : base(message) { } + + public LeopardActivationThrottledException(string message, string[] messageStack) : base(message, messageStack) { } } public class LeopardActivationRefusedException : LeopardException @@ -96,6 +141,8 @@ public class LeopardActivationRefusedException : LeopardException public LeopardActivationRefusedException() { } public LeopardActivationRefusedException(string message) : base(message) { } + + public LeopardActivationRefusedException(string message, string[] messageStack) : base(message, messageStack) { } } } \ No newline at end of file diff --git a/binding/dotnet/Leopard/LeopardTranscript.cs b/binding/dotnet/Leopard/LeopardTranscript.cs index f67623e9..b2d2155a 100644 --- a/binding/dotnet/Leopard/LeopardTranscript.cs +++ b/binding/dotnet/Leopard/LeopardTranscript.cs @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -9,6 +9,8 @@ file accompanying this source. specific language governing permissions and limitations under the License. */ +using System; + namespace Pv { /// @@ -19,18 +21,26 @@ public class LeopardWord /// /// Constructor. /// - /// Transcribed word. - /// Transcription confidence. It is a number within [0, 1]. - /// Start of word in seconds. - /// End of word in seconds. - /// - public LeopardWord(string word, float confidence, float startSec, float endSec) + /// Transcribed word. + /// Transcription confidence. It is a number within [0, 1]. + /// Start of word in seconds. + /// End of word in seconds. + /// + /// The speaker tag is `-1` if diarization is not enabled during initialization; otherwise, + /// it's a non-negative integer identifying unique speakers, with `0` reserved for unknown speakers. + /// + public LeopardWord( + string word, + float confidence, + float startSec, + float endSec, + Int32 speakerTag) { Word = word; Confidence = confidence; - StartSec = startSec; EndSec = endSec; + SpeakerTag = speakerTag; } /// @@ -52,6 +62,11 @@ public LeopardWord(string word, float confidence, float startSec, float endSec) /// Getter for endSec. /// public float EndSec { get; } + + /// + /// Getter for speakerTag. + /// + public Int32 SpeakerTag { get; } } /// @@ -63,7 +78,7 @@ public class LeopardTranscript /// Constructor. /// /// - /// transcript String transcript returned from Leopard. + /// Transcript returned from Leopard. /// /// /// Transcribed words and their associated metadata. diff --git a/binding/dotnet/LeopardTest/MainTest.cs b/binding/dotnet/LeopardTest/MainTest.cs index bc39852e..a5b1551f 100644 --- a/binding/dotnet/LeopardTest/MainTest.cs +++ b/binding/dotnet/LeopardTest/MainTest.cs @@ -13,6 +13,7 @@ specific language governing permissions and limitations under the License. using System.Collections.Generic; using System.IO; using System.Reflection; +using System.Runtime.InteropServices; using Fastenshtein; @@ -36,110 +37,170 @@ public static void ClassInitialize(TestContext _) _accessKey = Environment.GetEnvironmentVariable("ACCESS_KEY"); } - private static List GetPcmFromFile(string audioFilePath, int expectedSampleRate) + [Serializable] + private class TestJson { - List data = new List(); - using (BinaryReader reader = new BinaryReader(File.Open(audioFilePath, FileMode.Open))) - { - reader.ReadBytes(24); // skip over part of the header - Assert.AreEqual(reader.ReadInt32(), expectedSampleRate, "Specified sample rate did not match test file."); - reader.ReadBytes(16); // skip over the rest of the header - - while (reader.BaseStream.Position != reader.BaseStream.Length) - { - data.Add(reader.ReadInt16()); - } - } - - return data; + public LanguageTestJson[] language_tests { get; set; } + public DiarizationTestJson[] diarization_tests { get; set; } } - - private static JObject LoadJsonTestData() + [Serializable] + private class LanguageTestJson { - string content = File.ReadAllText(Path.Combine(ROOT_DIR, "resources/.test/test_data.json")); - return JObject.Parse(content); + public string language { get; set; } + public string audio_file { get; set; } + public string transcript { get; set; } + + public string transcript_with_punctuation { get; set; } + public float error_rate { get; set; } + public WordJson[] words { get; set; } } [Serializable] - private class TestParameterJson + private class DiarizationTestJson { public string language { get; set; } public string audio_file { get; set; } - public string transcript { get; set; } + public WordJson[] words { get; set; } + } - public string[] punctuations { get; set; } + [Serializable] + private class WordJson + { + public string word { get; set; } + public float start_sec { get; set; } + public float end_sec { get; set; } + public float confidence { get; set; } + public Int32 speaker_tag { get; set; } + } - public float error_rate { get; set; } + private static TestJson LoadJsonTestData() + { + string content = File.ReadAllText(Path.Combine(ROOT_DIR, "resources/.test/test_data.json")); + return JObject.Parse(content)["tests"].ToObject(); } - public static IEnumerable TestParameters + private static IEnumerable ProcessTestParameters { get { - JObject testDataJson = LoadJsonTestData(); - IList testParametersJson = ((JArray)testDataJson["tests"]["parameters"]).ToObject>(); - List testParameters = new List(); - foreach (TestParameterJson t in testParametersJson) + TestJson testDataJson = LoadJsonTestData(); + object[][] processTestParameters = new object[testDataJson.language_tests.Length][]; + for (int i = 0; i < testDataJson.language_tests.Length; i++) { - testParameters.Add(new object[] - { - t.language, - t.audio_file, - t.transcript, - true, - t.error_rate - }); - - string transcriptWithoutPunctuation = t.transcript; - foreach (string p in t.punctuations) + WordJson[] wordsJson = testDataJson.language_tests[i].words; + LeopardWord[] words = new LeopardWord[wordsJson.Length]; + for (int j = 0; j < wordsJson.Length; j++) { - transcriptWithoutPunctuation = transcriptWithoutPunctuation.Replace(p, ""); + words[j] = new LeopardWord( + wordsJson[j].word, + wordsJson[j].confidence, + wordsJson[j].start_sec, + wordsJson[j].end_sec, + wordsJson[j].speaker_tag); } + processTestParameters[i] = new object[] + { + testDataJson.language_tests[i].language, + testDataJson.language_tests[i].audio_file, + testDataJson.language_tests[i].transcript, + testDataJson.language_tests[i].transcript_with_punctuation, + testDataJson.language_tests[i].error_rate, + words + }; + } + + return processTestParameters; + } + } - testParameters.Add(new object[] + private static IEnumerable DiarizationTestParameters + { + get + { + TestJson testDataJson = LoadJsonTestData(); + object[][] processTestParameters = new object[testDataJson.diarization_tests.Length][]; + for (int i = 0; i < testDataJson.diarization_tests.Length; i++) + { + WordJson[] wordsJson = testDataJson.diarization_tests[i].words; + LeopardWord[] words = new LeopardWord[wordsJson.Length]; + for (int j = 0; j < wordsJson.Length; j++) { - t.language, - t.audio_file, - transcriptWithoutPunctuation, - false, - t.error_rate - }); + words[j] = new LeopardWord( + wordsJson[j].word, + 0, + 0, + 0, + wordsJson[j].speaker_tag); + } + processTestParameters[i] = new object[] + { + testDataJson.diarization_tests[i].language, + testDataJson.diarization_tests[i].audio_file, + words + }; } - return testParameters; + return processTestParameters; } } private static string AppendLanguage(string s, string language) - => language == "en" ? s : $"{s}_{language}"; + { + return language == "en" ? s : $"{s}_{language}"; + } + + private static float GetErrorRate(string transcript, string referenceTranscript) + { + return Levenshtein.Distance(transcript, referenceTranscript) / (float)referenceTranscript.Length; + } private static string GetModelPath(string language) - => Path.Combine( + { + return Path.Combine( ROOT_DIR, "lib/common", $"{AppendLanguage("leopard_params", language)}.pv"); + } - static float GetErrorRate(string transcript, string referenceTranscript) - => Levenshtein.Distance(transcript, referenceTranscript) / (float)referenceTranscript.Length; + private static short[] GetPcmFromFile(string audioFilePath, int expectedSampleRate) + { + List data = new List(); + using (BinaryReader reader = new BinaryReader(File.Open(audioFilePath, FileMode.Open))) + { + reader.ReadBytes(24); // skip over part of the header + Assert.AreEqual(reader.ReadInt32(), expectedSampleRate, "Specified sample rate did not match test file."); + reader.ReadBytes(16); // skip over the rest of the header + + while (reader.BaseStream.Position != reader.BaseStream.Length) + { + data.Add(reader.ReadInt16()); + } + } - private static void ValidateMetadata(LeopardWord[] words, string transcript, float audioLength) + return data.ToArray(); + } + + private static void ValidateMetadata( + LeopardWord[] words, + LeopardWord[] referenceWords, + bool enableDiarization) { - string normTranscript = transcript.ToUpper(); + Assert.AreEqual(words.Length, referenceWords.Length); for (int i = 0; i < words.Length; i++) { - Assert.IsTrue(normTranscript.Contains(words[i].Word.ToUpper())); - Assert.IsTrue(words[i].StartSec > 0); - Assert.IsTrue(words[i].StartSec <= words[i].EndSec); - if (i < words.Length - 1) + Assert.AreEqual(words[i].Word.ToUpper(), referenceWords[i].Word.ToUpper()); + Assert.AreEqual(words[i].StartSec, referenceWords[i].StartSec, 0.1); + Assert.AreEqual(words[i].EndSec, referenceWords[i].EndSec, 0.1); + Assert.AreEqual(words[i].Confidence, referenceWords[i].Confidence, 0.1); + if (enableDiarization) { - Assert.IsTrue(words[i].EndSec <= words[i + 1].StartSec); + Assert.AreEqual(words[i].SpeakerTag, referenceWords[i].SpeakerTag); } else { - Assert.IsTrue(words[i].EndSec <= audioLength); + Assert.AreEqual(words[i].SpeakerTag, -1); } - Assert.IsTrue(words[i].Confidence >= 0.0f && words[i].Confidence <= 1.0f); } } @@ -148,7 +209,9 @@ public void TestVersion() { using (Leopard leopard = Leopard.Create(_accessKey)) { - Assert.IsFalse(string.IsNullOrWhiteSpace(leopard?.Version), "Leopard did not return a valid version number."); + Assert.IsFalse( + string.IsNullOrWhiteSpace(leopard?.Version), + "Leopard did not return a valid version number."); } } @@ -157,74 +220,193 @@ public void TestSampleRate() { using (Leopard leopard = Leopard.Create(_accessKey)) { - Assert.IsTrue(leopard.SampleRate > 0, "Leopard did not return a valid sample rate number."); + Assert.IsTrue( + leopard.SampleRate > 0, + "Leopard did not return a valid sample rate number."); } } [TestMethod] - [DynamicData(nameof(TestParameters))] - public void TestProcessFile( + public void TestMessageStack() + { + Leopard l; + string[] messageList = new string[] { }; + + try + { + l = Leopard.Create("invalid"); + Assert.IsNull(l); + l.Dispose(); + } + catch (LeopardException e) + { + messageList = e.MessageStack; + } + + Assert.IsTrue(0 < messageList.Length); + Assert.IsTrue(messageList.Length < 8); + + try + { + l = Leopard.Create("invalid"); + Assert.IsNull(l); + l.Dispose(); + } + catch (LeopardException e) + { + for (int i = 0; i < messageList.Length; i++) + { + Assert.AreEqual(messageList[i], e.MessageStack[i]); + } + } + } + + [TestMethod] + public void TestProcessMessageStack() + { + Leopard l = Leopard.Create(_accessKey); + short[] testPcm = new short[1024]; + + var obj = typeof(Leopard).GetField("_libraryPointer", BindingFlags.NonPublic | BindingFlags.Instance); + IntPtr address = (IntPtr)obj.GetValue(l); + obj.SetValue(l, IntPtr.Zero); + + try + { + LeopardTranscript res = l.Process(testPcm); + Assert.IsTrue(res == null); + } + catch (LeopardException e) + { + Assert.IsTrue(0 < e.MessageStack.Length); + Assert.IsTrue(e.MessageStack.Length < 8); + } + + obj.SetValue(l, address); + l.Dispose(); + } + + + [TestMethod] + [DynamicData(nameof(ProcessTestParameters))] + public void TestProcess( string language, string testAudioFile, string referenceTranscript, - bool enablePunctuation, - float targetErrorRate) + string _, + float targetErrorRate, + LeopardWord[] referenceWords) { using (Leopard leopard = Leopard.Create( - _accessKey, - modelPath: GetModelPath(language), - enableAutomaticPunctuation: enablePunctuation - )) + _accessKey, + GetModelPath(language))) { + string testAudioPath = Path.Combine(ROOT_DIR, "resources/audio_samples", testAudioFile); + + LeopardTranscript result = leopard.Process(GetPcmFromFile(testAudioPath, leopard.SampleRate)); + float errorRate = GetErrorRate(result.TranscriptString.ToUpper(), referenceTranscript.ToUpper()); + Assert.IsTrue(errorRate < targetErrorRate); + + ValidateMetadata(result.WordArray, referenceWords, false); + } + } + + [TestMethod] + [DynamicData(nameof(ProcessTestParameters))] + public void TestProcessFile( + string language, + string testAudioFile, + string referenceTranscript, + string _, + float targetErrorRate, + LeopardWord[] referenceWords) + { + using (Leopard leopard = Leopard.Create( + _accessKey, + GetModelPath(language))) + { string testAudioPath = Path.Combine(ROOT_DIR, "resources/audio_samples", testAudioFile); LeopardTranscript result = leopard.ProcessFile(testAudioPath); - string transcript = result.TranscriptString; - if (!enablePunctuation) - { - referenceTranscript = referenceTranscript.ToUpper(); - transcript = transcript.ToUpper(); - } + float errorRate = GetErrorRate(result.TranscriptString.ToUpper(), referenceTranscript.ToUpper()); + Assert.IsTrue(errorRate < targetErrorRate); + + ValidateMetadata(result.WordArray, referenceWords, false); + } + } + + [TestMethod] + [DynamicData(nameof(ProcessTestParameters))] + public void TestProcessFileWithPunctuation( + string language, + string testAudioFile, + string _, + string referenceTranscript, + float targetErrorRate, + LeopardWord[] referenceWords) + { + using (Leopard leopard = Leopard.Create( + _accessKey, + GetModelPath(language), + enableAutomaticPunctuation: true)) + { + string testAudioPath = Path.Combine(ROOT_DIR, "resources/audio_samples", testAudioFile); + LeopardTranscript result = leopard.ProcessFile(testAudioPath); - Assert.IsTrue(GetErrorRate(transcript, referenceTranscript) < targetErrorRate); + float errorRate = GetErrorRate(result.TranscriptString.ToUpper(), referenceTranscript.ToUpper()); + Assert.IsTrue(errorRate < targetErrorRate); - float audioLength = GetPcmFromFile(testAudioPath, leopard.SampleRate).Count / (float)leopard.SampleRate; - ValidateMetadata(result.WordArray, referenceTranscript, audioLength); + ValidateMetadata(result.WordArray, referenceWords, false); } } [TestMethod] - [DynamicData(nameof(TestParameters))] - public void TestProcess( + [DynamicData(nameof(ProcessTestParameters))] + public void TestProcessFileWithDiarization( string language, string testAudioFile, string referenceTranscript, - bool enablePunctuation, - float targetErrorRate) + string _, + float targetErrorRate, + LeopardWord[] referenceWords) { using (Leopard leopard = Leopard.Create( - _accessKey, - modelPath: GetModelPath(language), - enableAutomaticPunctuation: enablePunctuation - )) + _accessKey, + GetModelPath(language), + enableDiarization: true)) { string testAudioPath = Path.Combine(ROOT_DIR, "resources/audio_samples", testAudioFile); + LeopardTranscript result = leopard.ProcessFile(testAudioPath); - List pcm = GetPcmFromFile(testAudioPath, leopard.SampleRate); - LeopardTranscript result = leopard.Process(pcm.ToArray()); + float errorRate = GetErrorRate(result.TranscriptString.ToUpper(), referenceTranscript.ToUpper()); + Assert.IsTrue(errorRate < targetErrorRate); - string transcript = result.TranscriptString; - if (!enablePunctuation) - { - referenceTranscript = referenceTranscript.ToUpper(); - transcript = transcript.ToUpper(); - } + ValidateMetadata(result.WordArray, referenceWords, true); + } + } - Assert.IsTrue(GetErrorRate(transcript, referenceTranscript) < targetErrorRate); + [TestMethod] + [DynamicData(nameof(DiarizationTestParameters))] + public void TestDiarization( + string language, + string testAudioFile, + LeopardWord[] referenceWords) + { + using (Leopard leopard = Leopard.Create( + _accessKey, + GetModelPath(language), + enableDiarization: true)) + { + string testAudioPath = Path.Combine(ROOT_DIR, "resources/audio_samples", testAudioFile); + LeopardWord[] words = leopard.ProcessFile(testAudioPath).WordArray; - float audioLength = pcm.Count / (float)leopard.SampleRate; - ValidateMetadata(result.WordArray, referenceTranscript, audioLength); + Assert.AreEqual(words.Length, referenceWords.Length); + for (int i = 0; i < words.Length; i++) + { + Assert.AreEqual(words[i].Word.ToUpper(), referenceWords[i].Word.ToUpper()); + Assert.AreEqual(words[i].SpeakerTag, referenceWords[i].SpeakerTag); + } } } } diff --git a/binding/flutter/CHANGELOG.md b/binding/flutter/CHANGELOG.md index ca716676..151d54c7 100644 --- a/binding/flutter/CHANGELOG.md +++ b/binding/flutter/CHANGELOG.md @@ -18,3 +18,7 @@ ## [1.2.1] - 2023-08-25 * Native packages updated + +## [2.0.0] - 2023-11-15 +* Engine improvements +* Improved error reporting diff --git a/binding/flutter/README.md b/binding/flutter/README.md index 8e4b333b..2924e4d0 100644 --- a/binding/flutter/README.md +++ b/binding/flutter/README.md @@ -20,7 +20,7 @@ Leopard is an on-device speech-to-text engine. Leopard is: This binding is for running Leopard on **Flutter 2.8.1+** on the following platforms: - Android 5.0+ (API 21+) -- iOS 11.0+ +- iOS 13.0+ ## Installation diff --git a/binding/flutter/android/build.gradle b/binding/flutter/android/build.gradle index 149a7da0..aa358b03 100644 --- a/binding/flutter/android/build.gradle +++ b/binding/flutter/android/build.gradle @@ -1,5 +1,5 @@ group 'ai.picovoice.flutter.leopard' -version '1.2.1' +version '2.0.0' buildscript { repositories { @@ -33,5 +33,5 @@ android { } dependencies { - implementation 'ai.picovoice:leopard-android:1.2.1' + implementation 'ai.picovoice:leopard-android:2.0.0' } diff --git a/binding/flutter/android/src/main/java/ai/picovoice/flutter/leopard/LeopardPlugin.java b/binding/flutter/android/src/main/java/ai/picovoice/flutter/leopard/LeopardPlugin.java index 68c3159a..e0f73c9a 100644 --- a/binding/flutter/android/src/main/java/ai/picovoice/flutter/leopard/LeopardPlugin.java +++ b/binding/flutter/android/src/main/java/ai/picovoice/flutter/leopard/LeopardPlugin.java @@ -44,6 +44,8 @@ public void onAttachedToEngine(@NonNull FlutterPluginBinding flutterPluginBindin flutterContext = flutterPluginBinding.getApplicationContext(); channel = new MethodChannel(flutterPluginBinding.getBinaryMessenger(), "leopard"); channel.setMethodCallHandler(this); + + Leopard.setSdk("flutter"); } @Override @@ -90,11 +92,13 @@ private void leopardCreate(@NonNull MethodCall call, @NonNull Result result) { String accessKey = call.argument("accessKey"); String modelPath = call.argument("modelPath"); boolean enableAutomaticPunctuation = call.argument("enableAutomaticPunctuation"); + boolean enableDiarization = call.argument("enableDiarization"); Leopard.Builder leopardBuilder = new Leopard.Builder() .setAccessKey(accessKey) .setModelPath(modelPath) - .setEnableAutomaticPunctuation(enableAutomaticPunctuation); + .setEnableAutomaticPunctuation(enableAutomaticPunctuation) + .setEnableDiarization(enableDiarization); Leopard leopard = leopardBuilder.build(flutterContext); leopardPool.put(String.valueOf(System.identityHashCode(leopard)), leopard); @@ -217,6 +221,7 @@ private Map leopardTranscriptToMap(LeopardTranscript result) { wordMap.put("confidence", word.getConfidence()); wordMap.put("startSec", word.getStartSec()); wordMap.put("endSec", word.getEndSec()); + wordMap.put("speakerTag", word.getSpeakerTag()); words.add(wordMap); } resultMap.put("words", words); diff --git a/binding/flutter/ios/Classes/SwiftLeopardPlugin.swift b/binding/flutter/ios/Classes/SwiftLeopardPlugin.swift index be9ce35d..116c0e77 100644 --- a/binding/flutter/ios/Classes/SwiftLeopardPlugin.swift +++ b/binding/flutter/ios/Classes/SwiftLeopardPlugin.swift @@ -1,5 +1,5 @@ // -// Copyright 2022 Picovoice Inc. +// Copyright 2022-2023 Picovoice Inc. // // You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" // file accompanying this source. @@ -28,6 +28,8 @@ public class SwiftLeopardPlugin: NSObject, FlutterPlugin { let methodChannel = FlutterMethodChannel(name: "leopard", binaryMessenger: registrar.messenger()) registrar.addMethodCallDelegate(instance, channel: methodChannel) + + Leopard.setSdk(sdk: "flutter") } public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { @@ -44,11 +46,13 @@ public class SwiftLeopardPlugin: NSObject, FlutterPlugin { if let accessKey = args["accessKey"] as? String, let modelPath = args["modelPath"] as? String { let enableAutomaticPunctuation = args["enableAutomaticPunctuation"] as? Bool + let enableDiarization = args["enableDiarization"] as? Bool let leopard = try Leopard( accessKey: accessKey, modelPath: modelPath, - enableAutomaticPunctuation: enableAutomaticPunctuation ?? false + enableAutomaticPunctuation: enableAutomaticPunctuation ?? false, + enableDiarization: enableDiarization ?? false ) let handle: String = String(describing: leopard) @@ -137,6 +141,7 @@ public class SwiftLeopardPlugin: NSObject, FlutterPlugin { wordMap["confidence"] = wordMeta.confidence wordMap["startSec"] = wordMeta.startSec wordMap["endSec"] = wordMeta.endSec + wordMap["speakerTag"] = wordMeta.speakerTag wordMapArray.append(wordMap) } resultDictionary["words"] = wordMapArray diff --git a/binding/flutter/ios/leopard_flutter.podspec b/binding/flutter/ios/leopard_flutter.podspec index a072c251..fbdd542c 100644 --- a/binding/flutter/ios/leopard_flutter.podspec +++ b/binding/flutter/ios/leopard_flutter.podspec @@ -1,6 +1,6 @@ Pod::Spec.new do |s| s.name = 'leopard_flutter' - s.version = '1.2.1' + s.version = '2.0.0' s.summary = 'A Flutter package plugin for Picovoice\'s Leopard Speech-to-Text engine' s.description = <<-DESC A Flutter package plugin for Picovoice\'s Leopard Speech-to-Text engine @@ -10,9 +10,9 @@ Pod::Spec.new do |s| s.author = { 'Picovoice' => 'hello@picovoice.ai' } s.source = { :git => "https://github.com/Picovoice/leopard.git" } s.source_files = 'Classes/**/*' - s.platform = :ios, '11.0' + s.platform = :ios, '13.0' s.dependency 'Flutter' - s.dependency 'Leopard-iOS', '~> 1.2.0' + s.dependency 'Leopard-iOS', '~> 2.0.0' s.swift_version = '5.0' end diff --git a/binding/flutter/lib/leopard.dart b/binding/flutter/lib/leopard.dart index 7e3ae686..8890310c 100644 --- a/binding/flutter/lib/leopard.dart +++ b/binding/flutter/lib/leopard.dart @@ -1,5 +1,5 @@ // -// Copyright 2022 Picovoice Inc. +// Copyright 2022-2023 Picovoice Inc. // // You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" // file accompanying this source. @@ -38,11 +38,18 @@ class Leopard { /// /// [enableAutomaticPunctuation] (Optional) Set to `true` to enable automatic punctuation insertion. /// + /// [enableDiarization] (Optional) Set to `true` to enable speaker diarization, which allows Leopard to + /// differentiate speakers as part of the transcription process. Word + /// metadata will include a `speaker_tag` to identify unique speakers. + /// /// Throws a `LeopardException` if not initialized correctly /// /// returns an instance of the Leopard Speech-to-Text engine static Future create(String accessKey, String modelPath, - {enableAutomaticPunctuation = false}) async { + { + enableAutomaticPunctuation = false, + enableDiarization = false + }) async { modelPath = await _tryExtractFlutterAsset(modelPath); try { @@ -50,7 +57,8 @@ class Leopard { Map.from(await _channel.invokeMethod('create', { 'accessKey': accessKey, 'modelPath': modelPath, - 'enableAutomaticPunctuation': enableAutomaticPunctuation + 'enableAutomaticPunctuation': enableAutomaticPunctuation, + 'enableDiarization': enableDiarization })); return Leopard._( @@ -129,7 +137,11 @@ class Leopard { List words = []; for (dynamic word in result['words']) { words.add(LeopardWord( - word['word'], word['startSec'], word['endSec'], word['confidence'])); + word['word'], + word['startSec'], + word['endSec'], + word['confidence'], + word['speakerTag'])); } return LeopardTranscript(transcript, words); } diff --git a/binding/flutter/lib/leopard_transcript.dart b/binding/flutter/lib/leopard_transcript.dart index 1b69053a..c8ea598f 100644 --- a/binding/flutter/lib/leopard_transcript.dart +++ b/binding/flutter/lib/leopard_transcript.dart @@ -26,8 +26,9 @@ class LeopardWord { final double startSec; final double endSec; final double confidence; + final int speakerTag; - LeopardWord(this._word, this.startSec, this.endSec, this.confidence); + LeopardWord(this._word, this.startSec, this.endSec, this.confidence, this.speakerTag); String get word => _word ?? ""; } diff --git a/binding/flutter/pubspec.lock b/binding/flutter/pubspec.lock index 58c93100..2514f310 100644 --- a/binding/flutter/pubspec.lock +++ b/binding/flutter/pubspec.lock @@ -5,63 +5,64 @@ packages: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" - source: hosted - version: "1.3.1" + version: "1.3.0" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" + sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + url: "https://pub.dev" source: hosted - version: "1.16.0" + version: "1.17.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: "35d0f481d939de0d640b3db9a7aa36a52cd22054a798a73b4f50bdad5ce12678" + url: "https://pub.dev" source: hosted version: "1.1.2" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "9fd2163d866769f60f4df8ac1dc59f52498d810c356fe78022e383dd3c57c0e1" + url: "https://pub.dev" source: hosted version: "6.1.0" flutter: @@ -74,109 +75,132 @@ packages: description: flutter source: sdk version: "0.0.0" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" lints: dependency: "direct dev" description: name: lints - url: "https://pub.dartlang.org" + sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + url: "https://pub.dev" source: hosted version: "1.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.15" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.4" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.9.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.8.3" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: e92dee4d38a9044605cb3fb253e9b46eb9375dfcad4515d0379b44ac90797568 + url: "https://pub.dev" source: hosted version: "2.0.9" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: "32bbab16092df3bedab89ed9f2c1cfaedf25d96a5036f62f16d5e372890d068c" + url: "https://pub.dev" source: hosted version: "2.0.13" path_provider_ios: dependency: transitive description: name: path_provider_ios - url: "https://pub.dartlang.org" + sha256: "943b76e54056386432cdc2731cb303e2f580346b61a1fc73819721767be72309" + url: "https://pub.dev" source: hosted version: "2.0.8" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: "1e109f4df28bd95eab71e323008b53d19c4d633bc1ab05b577518773474e9621" + url: "https://pub.dev" source: hosted version: "2.1.5" path_provider_macos: dependency: transitive description: name: path_provider_macos - url: "https://pub.dartlang.org" + sha256: eb58b896ea3a504f0b0fa7870646bda6935a6f752b2a54df33f97070dacca8d4 + url: "https://pub.dev" source: hosted version: "2.0.0" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: c2af5a8a6369992d915f8933dfc23172071001359d17896e83db8be57db8a397 + url: "https://pub.dev" source: hosted version: "2.0.1" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: "366ad4e3541ea707f859e7148d4d5aba67d589d7936cee04a05c464a277eeb27" + url: "https://pub.dev" source: hosted version: "2.0.5" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: ebc79f16b5f6b609aad4a5e63447d4795d16f7adee46e93ed03200848c006735 + url: "https://pub.dev" source: hosted version: "3.0.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: c2c49e16d42fd6983eb55e44b7f197fdf16b4da7aab7f8e1d21da307cad3fb02 + url: "https://pub.dev" source: hosted version: "2.0.0" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: dc3c073b5bc0db4e0f3dbc6b69f8e9cf2f336dafb3db996242ebdacf94c295dd + url: "https://pub.dev" source: hosted version: "4.2.1" sky_engine: @@ -188,65 +212,74 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" + sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + url: "https://pub.dev" source: hosted - version: "0.4.9" + version: "0.5.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: c0ee29e0f6e4ee5a63983aae753640adc15017b34e50424f8b45063426e19c5b + url: "https://pub.dev" source: hosted version: "2.0.5" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: "0186b3f2d66be9a12b0295bddcf8b6f8c0b0cc2f85c6287344e2a6366bc28457" + url: "https://pub.dev" source: hosted version: "0.2.0" sdks: - dart: ">=2.17.0-0 <3.0.0" + dart: ">=3.0.0-0 <4.0.0" flutter: ">=2.8.1" diff --git a/binding/flutter/pubspec.yaml b/binding/flutter/pubspec.yaml index 8ca91fb5..fc9d3395 100644 --- a/binding/flutter/pubspec.yaml +++ b/binding/flutter/pubspec.yaml @@ -1,6 +1,6 @@ name: leopard_flutter description: A Flutter plugin for Picovoice's Leopard Speech-to-Text engine -version: 1.2.1 +version: 2.0.0 homepage: https://picovoice.ai/ repository: https://github.com/Picovoice/leopard/ documentation: https://picovoice.ai/docs/leopard/ diff --git a/binding/go/README.md b/binding/go/README.md index 54ead978..673c9c40 100644 --- a/binding/go/README.md +++ b/binding/go/README.md @@ -1,4 +1,6 @@ -# Leopard Speech-to-Text Engine +# Leopard Binding for Go + +## Leopard Speech-to-Text Engine Made in Vancouver, Canada by [Picovoice](https://picovoice.ai) @@ -17,7 +19,7 @@ Leopard is an on-device speech-to-text engine. Leopard is: - go 1.16+ - Runs on Linux (x86_64), macOS (x86_64, arm64), Windows (x86_64), Raspberry Pi (4, 3), and NVIDIA Jetson Nano. -- **Windows**: The Go binding requires `cgo`, which means that you need to install a gcc compiler like [Mingw](http://mingw-w64.org/) to build it properly. +- **Windows**: The Go binding requires `cgo`, which means that you need to install a gcc compiler like [Mingw](http://mingw-w64.org/) to build it properly. - Go versions less than `1.20` requires `gcc` version `11` or lower. ## Installation diff --git a/binding/go/embedded/lib/common/leopard_params.pv b/binding/go/embedded/lib/common/leopard_params.pv index d87cb150..2a490dfd 100644 Binary files a/binding/go/embedded/lib/common/leopard_params.pv and b/binding/go/embedded/lib/common/leopard_params.pv differ diff --git a/binding/go/embedded/lib/jetson/cortex-a57-aarch64/libpv_leopard.so b/binding/go/embedded/lib/jetson/cortex-a57-aarch64/libpv_leopard.so index eedbbab6..157800d4 100755 Binary files a/binding/go/embedded/lib/jetson/cortex-a57-aarch64/libpv_leopard.so and b/binding/go/embedded/lib/jetson/cortex-a57-aarch64/libpv_leopard.so differ diff --git a/binding/go/embedded/lib/linux/x86_64/libpv_leopard.so b/binding/go/embedded/lib/linux/x86_64/libpv_leopard.so index fd6cce7d..d3f6cd6e 100755 Binary files a/binding/go/embedded/lib/linux/x86_64/libpv_leopard.so and b/binding/go/embedded/lib/linux/x86_64/libpv_leopard.so differ diff --git a/binding/go/embedded/lib/mac/arm64/libpv_leopard.dylib b/binding/go/embedded/lib/mac/arm64/libpv_leopard.dylib index 02ab786b..e5def7ed 100755 Binary files a/binding/go/embedded/lib/mac/arm64/libpv_leopard.dylib and b/binding/go/embedded/lib/mac/arm64/libpv_leopard.dylib differ diff --git a/binding/go/embedded/lib/mac/x86_64/libpv_leopard.dylib b/binding/go/embedded/lib/mac/x86_64/libpv_leopard.dylib index 70307891..4f6b398a 100755 Binary files a/binding/go/embedded/lib/mac/x86_64/libpv_leopard.dylib and b/binding/go/embedded/lib/mac/x86_64/libpv_leopard.dylib differ diff --git a/binding/go/embedded/lib/raspberry-pi/cortex-a53-aarch64/libpv_leopard.so b/binding/go/embedded/lib/raspberry-pi/cortex-a53-aarch64/libpv_leopard.so index b2e2e082..7e14cfb4 100755 Binary files a/binding/go/embedded/lib/raspberry-pi/cortex-a53-aarch64/libpv_leopard.so and b/binding/go/embedded/lib/raspberry-pi/cortex-a53-aarch64/libpv_leopard.so differ diff --git a/binding/go/embedded/lib/raspberry-pi/cortex-a53/libpv_leopard.so b/binding/go/embedded/lib/raspberry-pi/cortex-a53/libpv_leopard.so index 60feba42..0f2d84cf 100755 Binary files a/binding/go/embedded/lib/raspberry-pi/cortex-a53/libpv_leopard.so and b/binding/go/embedded/lib/raspberry-pi/cortex-a53/libpv_leopard.so differ diff --git a/binding/go/embedded/lib/raspberry-pi/cortex-a72-aarch64/libpv_leopard.so b/binding/go/embedded/lib/raspberry-pi/cortex-a72-aarch64/libpv_leopard.so index 80d9804c..546e1c07 100755 Binary files a/binding/go/embedded/lib/raspberry-pi/cortex-a72-aarch64/libpv_leopard.so and b/binding/go/embedded/lib/raspberry-pi/cortex-a72-aarch64/libpv_leopard.so differ diff --git a/binding/go/embedded/lib/raspberry-pi/cortex-a72/libpv_leopard.so b/binding/go/embedded/lib/raspberry-pi/cortex-a72/libpv_leopard.so index 7432d4df..bb3946b6 100755 Binary files a/binding/go/embedded/lib/raspberry-pi/cortex-a72/libpv_leopard.so and b/binding/go/embedded/lib/raspberry-pi/cortex-a72/libpv_leopard.so differ diff --git a/binding/go/embedded/lib/windows/amd64/libpv_leopard.dll b/binding/go/embedded/lib/windows/amd64/libpv_leopard.dll index be8a3dd1..b175080e 100644 Binary files a/binding/go/embedded/lib/windows/amd64/libpv_leopard.dll and b/binding/go/embedded/lib/windows/amd64/libpv_leopard.dll differ diff --git a/binding/go/go.mod b/binding/go/go.mod index d2e317e1..50b76338 100644 --- a/binding/go/go.mod +++ b/binding/go/go.mod @@ -1,3 +1,3 @@ -module github.com/Picovoice/leopard/binding/go +module github.com/Picovoice/leopard/binding/go/v2 go 1.16 diff --git a/binding/go/go_test.mod b/binding/go/go_test.mod index 281658f2..78e6be63 100644 --- a/binding/go/go_test.mod +++ b/binding/go/go_test.mod @@ -1,4 +1,4 @@ -module github.com/Picovoice/leopard/binding/go +module github.com/Picovoice/leopard/binding/go/v2 go 1.16 diff --git a/binding/go/leopard.go b/binding/go/leopard.go index 65b85d8f..601d37b6 100644 --- a/binding/go/leopard.go +++ b/binding/go/leopard.go @@ -1,4 +1,4 @@ -// Copyright 2022 Picovoice Inc. +// Copyright 2022-2023 Picovoice Inc. // // You may not use this file except in compliance with the license. A copy of the license is // located in the "LICENSE" file accompanying this source. @@ -52,8 +52,9 @@ const ( ) type LeopardError struct { - StatusCode PvStatus - Message string + StatusCode PvStatus + Message string + MessageStack []string } type leopardExts struct { @@ -61,7 +62,17 @@ type leopardExts struct { } func (e *LeopardError) Error() string { - return fmt.Sprintf("%s: %s", pvStatusToString(e.StatusCode), e.Message) + var message strings.Builder + message.WriteString(fmt.Sprintf("%s: %s", pvStatusToString(e.StatusCode), e.Message)) + + if len(e.MessageStack) > 0 { + message.WriteString(":") + } + + for i, value := range e.MessageStack { + message.WriteString(fmt.Sprintf("\n [%d] %s", i, value)) + } + return message.String() } // Leopard struct @@ -80,10 +91,14 @@ type Leopard struct { // Flag to enable automatic punctuation insertion. EnableAutomaticPunctuation bool + + // Flag to enable speaker diarization, which allows Leopard to differentiate speakers as part of the transcription process. + // Word metadata will include a `SpeakerTag` to identify unique speakers. + EnableDiarization bool } type LeopardWord struct { - // Transcribed word + // Transcribed word. Word string // Start of word in seconds. @@ -94,6 +109,10 @@ type LeopardWord struct { // Transcription confidence. It is a number within [0, 1]. Confidence float32 + + // Unique speaker identifier. It is `-1` if diarization is not enabled during initialization; otherwise, + // it's a non-negative integer identifying unique speakers, with `0` reserved for unknown speakers. + SpeakerTag int32 } // private vars @@ -123,6 +142,7 @@ func NewLeopard(accessKey string) Leopard { ModelPath: defaultModelFile, LibraryPath: defaultLibPath, EnableAutomaticPunctuation: false, + EnableDiarization: false, } } @@ -130,8 +150,8 @@ func NewLeopard(accessKey string) Leopard { func (leopard *Leopard) Init() error { if leopard.AccessKey == "" { return &LeopardError{ - INVALID_ARGUMENT, - "No AccessKey provided to Leopard"} + StatusCode: INVALID_ARGUMENT, + Message: "No AccessKey provided to Leopard"} } if leopard.ModelPath == "" { @@ -144,21 +164,31 @@ func (leopard *Leopard) Init() error { if _, err := os.Stat(leopard.LibraryPath); os.IsNotExist(err) { return &LeopardError{ - INVALID_ARGUMENT, - fmt.Sprintf("Specified library file could not be found at %s", leopard.LibraryPath)} + StatusCode: INVALID_ARGUMENT, + Message: fmt.Sprintf("Specified library file could not be found at %s", leopard.LibraryPath)} } if _, err := os.Stat(leopard.ModelPath); os.IsNotExist(err) { return &LeopardError{ - INVALID_ARGUMENT, - fmt.Sprintf("Specified model file could not be found at %s", leopard.ModelPath)} + StatusCode: INVALID_ARGUMENT, + Message: fmt.Sprintf("Specified model file could not be found at %s", leopard.ModelPath)} } ret := nativeLeopard.nativeInit(leopard) - if PvStatus(ret) != SUCCESS { + if ret != SUCCESS { + errorStatus, messageStack := nativeLeopard.nativeGetErrorStack() + if errorStatus != SUCCESS { + return &LeopardError{ + StatusCode: errorStatus, + Message: "Unable to get Leopard error state", + } + } + return &LeopardError{ - PvStatus(ret), - "Leopard init failed."} + StatusCode: ret, + Message: "Leopard init failed", + MessageStack: messageStack, + } } SampleRate = nativeLeopard.nativeSampleRate() @@ -171,8 +201,8 @@ func (leopard *Leopard) Init() error { func (leopard *Leopard) Delete() error { if leopard.handle == nil { return &LeopardError{ - INVALID_STATE, - "Leopard has not been initialized or has already been deleted"} + StatusCode: INVALID_STATE, + Message: "Leopard has not been initialized or has already been deleted"} } nativeLeopard.nativeDelete(leopard) @@ -187,21 +217,31 @@ func (leopard *Leopard) Delete() error { func (leopard *Leopard) Process(pcm []int16) (string, []LeopardWord, error) { if leopard.handle == nil { return "", nil, &LeopardError{ - INVALID_STATE, - "Leopard has not been initialized or has already been deleted"} + StatusCode: INVALID_STATE, + Message: "Leopard has not been initialized or has already been deleted"} } if len(pcm) == 0 { return "", nil, &LeopardError{ - INVALID_ARGUMENT, - "Audio data must not be empty"} + StatusCode: INVALID_ARGUMENT, + Message: "Audio data must not be empty"} } ret, transcript, words := nativeLeopard.nativeProcess(leopard, pcm) - if PvStatus(ret) != SUCCESS { + if ret != SUCCESS { + errorStatus, messageStack := nativeLeopard.nativeGetErrorStack() + if errorStatus != SUCCESS { + return "", nil, &LeopardError{ + StatusCode: errorStatus, + Message: "Unable to get Leopard error state", + } + } + return "", nil, &LeopardError{ - PvStatus(ret), - "Leopard process failed."} + StatusCode: ret, + Message: "Leopard process failed", + MessageStack: messageStack, + } } return transcript, words, nil @@ -213,29 +253,31 @@ func (leopard *Leopard) Process(pcm []int16) (string, []LeopardWord, error) { func (leopard *Leopard) ProcessFile(audioPath string) (string, []LeopardWord, error) { if leopard.handle == nil { return "", nil, &LeopardError{ - INVALID_STATE, - "Leopard has not been initialized or has already been deleted"} + StatusCode: INVALID_STATE, + Message: "Leopard has not been initialized or has already been deleted"} } if _, err := os.Stat(audioPath); os.IsNotExist(err) { return "", nil, &LeopardError{ - INVALID_ARGUMENT, - fmt.Sprintf("Specified file could not be found at '%s'", audioPath)} + StatusCode: INVALID_ARGUMENT, + Message: fmt.Sprintf("Specified file could not be found at '%s'", audioPath)} } ret, transcript, words := nativeLeopard.nativeProcessFile(leopard, audioPath) if ret != SUCCESS { - if ret == INVALID_ARGUMENT { - fileExtension := filepath.Ext(audioPath) - if !validExtensions.includes(fileExtension) { - return "", nil, &LeopardError{ - INVALID_ARGUMENT, - fmt.Sprintf("Specified file with extension '%s' is not supported", fileExtension)} + errorStatus, messageStack := nativeLeopard.nativeGetErrorStack() + if errorStatus != SUCCESS { + return "", nil, &LeopardError{ + StatusCode: errorStatus, + Message: "Unable to get Leopard error state", } } + return "", nil, &LeopardError{ - PvStatus(ret), - "Leopard process failed."} + StatusCode: ret, + Message: "Leopard process failed", + MessageStack: messageStack, + } } return transcript, words, nil diff --git a/binding/go/leopard_native.go b/binding/go/leopard_native.go index 61c9c1a8..a8b9fcfd 100644 --- a/binding/go/leopard_native.go +++ b/binding/go/leopard_native.go @@ -22,11 +22,11 @@ package leopard #if defined(_WIN32) || defined(_WIN64) - #include + #include #else - #include + #include #endif @@ -34,11 +34,11 @@ static void *open_dl(const char *dl_path) { #if defined(_WIN32) || defined(_WIN64) - return LoadLibrary((LPCSTR) dl_path); + return LoadLibrary((LPCSTR) dl_path); #else - return dlopen(dl_path, RTLD_NOW); + return dlopen(dl_path, RTLD_NOW); #endif @@ -48,105 +48,109 @@ static void *load_symbol(void *handle, const char *symbol) { #if defined(_WIN32) || defined(_WIN64) - return GetProcAddress((HMODULE) handle, symbol); + return GetProcAddress((HMODULE) handle, symbol); #else - return dlsym(handle, symbol); + return dlsym(handle, symbol); #endif } typedef struct { - const char *word; - float start_sec; - float end_sec; - float confidence; + const char *word; + float start_sec; + float end_sec; + float confidence; + int32_t speaker_tag; } pv_word_t; typedef int32_t (*pv_leopard_sample_rate_func)(); int32_t pv_leopard_sample_rate_wrapper(void *f) { - return ((pv_leopard_sample_rate_func) f)(); + return ((pv_leopard_sample_rate_func) f)(); } typedef char* (*pv_leopard_version_func)(); char* pv_leopard_version_wrapper(void* f) { - return ((pv_leopard_version_func) f)(); + return ((pv_leopard_version_func) f)(); } typedef int32_t (*pv_leopard_init_func)( - const char *access_key, - const char *model_path, - bool enable_punctuation_detection, - void **object); + const char *access_key, + const char *model_path, + bool enable_punctuation_detection, + bool enable_diarization, + void **object); int32_t pv_leopard_init_wrapper( - void *f, - const char *access_key, - const char *model_path, - bool enable_punctuation_detection, - void **object) { - return ((pv_leopard_init_func) f)( - access_key, - model_path, - enable_punctuation_detection, - object); + void *f, + const char *access_key, + const char *model_path, + bool enable_punctuation_detection, + bool enable_diarization, + void **object) { + return ((pv_leopard_init_func) f)( + access_key, + model_path, + enable_punctuation_detection, + enable_diarization, + object); } typedef int32_t (*pv_leopard_process_func)( - void *object, - const int16_t *pcm, - int32_t num_samples, - char **transcript, - int32_t *num_words, - pv_word_t **words); + void *object, + const int16_t *pcm, + int32_t num_samples, + char **transcript, + int32_t *num_words, + pv_word_t **words); int32_t pv_leopard_process_wrapper( - void *f, - void *object, - const int16_t *pcm, - int32_t num_samples, - char **transcript, - int32_t *num_words, - pv_word_t **words) { - return ((pv_leopard_process_func) f)( - object, - pcm, - num_samples, - transcript, - num_words, - words); + void *f, + void *object, + const int16_t *pcm, + int32_t num_samples, + char **transcript, + int32_t *num_words, + pv_word_t **words) { + return ((pv_leopard_process_func) f)( + object, + pcm, + num_samples, + transcript, + num_words, + words); } typedef int32_t (*pv_leopard_process_file_func)( - void *object, - const char *audio_path, - char **transcript, - int32_t *num_words, - pv_word_t **words); + void *object, + const char *audio_path, + char **transcript, + int32_t *num_words, + pv_word_t **words); int32_t pv_leopard_process_file_wrapper( - void *f, - void *object, - const char *audio_path, - char **transcript, - int32_t *num_words, - pv_word_t **words) { - return ((pv_leopard_process_file_func) f)( - object, - audio_path, - transcript, - num_words, - words); + void *f, + void *object, + const char *audio_path, + char **transcript, + int32_t *num_words, + pv_word_t **words) { + return ((pv_leopard_process_file_func) f)( + object, + audio_path, + transcript, + num_words, + words); } typedef void (*pv_leopard_delete_func)(void *); void pv_leopard_delete_wrapper(void *f, void *object) { - return ((pv_leopard_delete_func) f)(object); + return ((pv_leopard_delete_func) f)(object); } typedef void (*pv_leopard_transcript_delete_func)(char *); @@ -161,6 +165,29 @@ void pv_leopard_words_delete_wrapper(void *f, pv_word_t *words) { return ((pv_leopard_words_delete_func) f)(words); } +typedef void (*pv_set_sdk_func)(const char *); + +void pv_set_sdk_wrapper(void *f, const char *sdk) { + return ((pv_set_sdk_func) f)(sdk); +} + +typedef int32_t (*pv_get_error_stack_func)(char ***, int32_t *); + +int32_t pv_get_error_stack_wrapper( + void *f, + char ***message_stack, + int32_t *message_stack_depth) { + return ((pv_get_error_stack_func) f)(message_stack, message_stack_depth); +} + +typedef void (*pv_free_error_stack_func)(char **); + +void pv_free_error_stack_wrapper( + void *f, + char **message_stack) { + return ((pv_free_error_stack_func) f)(message_stack); +} + */ import "C" @@ -175,6 +202,7 @@ type nativeLeopardInterface interface { nativeDelete(*Leopard) nativeSampleRate() nativeVersion() + nativeGetErrorStack() } type nativeLeopardType struct { libraryHandle unsafe.Pointer @@ -186,6 +214,9 @@ type nativeLeopardType struct { pv_leopard_words_delete_ptr unsafe.Pointer pv_leopard_version_ptr unsafe.Pointer pv_sample_rate_ptr unsafe.Pointer + pv_set_sdk_ptr unsafe.Pointer + pv_get_error_stack_ptr unsafe.Pointer + pv_free_error_stack_ptr unsafe.Pointer } func (nl *nativeLeopardType) nativeInit(leopard *Leopard) (status PvStatus) { @@ -194,6 +225,7 @@ func (nl *nativeLeopardType) nativeInit(leopard *Leopard) (status PvStatus) { modelPathC = C.CString(leopard.ModelPath) libraryPathC = C.CString(leopard.LibraryPath) enableAutomaticPunctuationC = C.bool(leopard.EnableAutomaticPunctuation) + enableDiarizationC = C.bool(leopard.EnableDiarization) ) defer C.free(unsafe.Pointer(accessKeyC)) defer C.free(unsafe.Pointer(modelPathC)) @@ -208,12 +240,20 @@ func (nl *nativeLeopardType) nativeInit(leopard *Leopard) (status PvStatus) { nl.pv_leopard_words_delete_ptr = C.load_symbol(nl.libraryHandle, C.CString("pv_leopard_words_delete")) nl.pv_leopard_version_ptr = C.load_symbol(nl.libraryHandle, C.CString("pv_leopard_version")) nl.pv_sample_rate_ptr = C.load_symbol(nl.libraryHandle, C.CString("pv_sample_rate")) + nl.pv_set_sdk_ptr = C.load_symbol(nl.libraryHandle, C.CString("pv_set_sdk")) + nl.pv_get_error_stack_ptr = C.load_symbol(nl.libraryHandle, C.CString("pv_get_error_stack")) + nl.pv_free_error_stack_ptr = C.load_symbol(nl.libraryHandle, C.CString("pv_free_error_stack")) + + C.pv_set_sdk_wrapper( + nl.pv_set_sdk_ptr, + C.CString("go")) var ret = C.pv_leopard_init_wrapper( nl.pv_leopard_init_ptr, accessKeyC, modelPathC, enableAutomaticPunctuationC, + enableDiarizationC, &leopard.handle) return PvStatus(ret) @@ -251,6 +291,7 @@ func (nl *nativeLeopardType) nativeProcess(leopard *Leopard, pcm []int16) (statu StartSec: float32(cWords[i].start_sec), EndSec: float32(cWords[i].end_sec), Confidence: float32(cWords[i].confidence), + SpeakerTag: int32(cWords[i].speaker_tag), } words = append(words, n) } @@ -290,6 +331,7 @@ func (nl *nativeLeopardType) nativeProcessFile(leopard *Leopard, audioPath strin StartSec: float32(cWords[i].start_sec), EndSec: float32(cWords[i].end_sec), Confidence: float32(cWords[i].confidence), + SpeakerTag: int32(cWords[i].speaker_tag), } words = append(words, n) } @@ -308,3 +350,32 @@ func (nl *nativeLeopardType) nativeSampleRate() (sampleRate int) { func (nl *nativeLeopardType) nativeVersion() (version string) { return C.GoString(C.pv_leopard_version_wrapper(nl.pv_leopard_version_ptr)) } + +func (nl *nativeLeopardType) nativeGetErrorStack() (status PvStatus, messageStack []string) { + var messageStackDepthRef C.int32_t + var messageStackRef **C.char + + var ret = C.pv_get_error_stack_wrapper( + nl.pv_get_error_stack_ptr, + &messageStackRef, + &messageStackDepthRef) + + if PvStatus(ret) != SUCCESS { + return PvStatus(ret), []string{} + } + + defer C.pv_free_error_stack_wrapper( + nl.pv_free_error_stack_ptr, + messageStackRef) + + messageStackDepth := int(messageStackDepthRef) + messageStackSlice := (*[1 << 28]*C.char)(unsafe.Pointer(messageStackRef))[:messageStackDepth:messageStackDepth] + + messageStack = make([]string, messageStackDepth) + + for i := 0; i < messageStackDepth; i++ { + messageStack[i] = C.GoString(messageStackSlice[i]) + } + + return PvStatus(ret), messageStack +} diff --git a/binding/go/leopard_test.go b/binding/go/leopard_test.go index 8335d342..f5834ffc 100644 --- a/binding/go/leopard_test.go +++ b/binding/go/leopard_test.go @@ -9,8 +9,6 @@ // limitations under the License. // -// Go binding for Leopard Speech-to-Text engine. - package leopard import ( @@ -19,6 +17,7 @@ import ( "flag" "io/ioutil" "log" + "math" "os" "path/filepath" "reflect" @@ -28,18 +27,26 @@ import ( "github.com/agnivade/levenshtein" ) -type TestParameters struct { - language string - testAudioFile string - transcript string - errorRate float32 - enableAutomaticPunctuation bool +type LanguageTestParameters struct { + language string + testAudioFile string + transcript string + transcriptWithPunctuation string + errorRate float32 + words []LeopardWord +} + +type DiarizationTestParameters struct { + language string + testAudioFile string + words []LeopardWord } var ( - testAccessKey string - leopard Leopard - processTestParameters []TestParameters + testAccessKey string + leopard Leopard + languageTests []LanguageTestParameters + diarizationTests []DiarizationTestParameters ) func TestMain(m *testing.M) { @@ -47,10 +54,14 @@ func TestMain(m *testing.M) { flag.StringVar(&testAccessKey, "access_key", "", "AccessKey for testing") flag.Parse() - processTestParameters = loadTestData() + languageTests, diarizationTests = loadTestData() os.Exit(m.Run()) } +func isClose(value, expected, tolerance float32) bool { + return math.Abs(float64(value-expected)) <= float64(tolerance) +} + func appendLanguage(s string, language string) string { if language == "en" { return s @@ -58,8 +69,8 @@ func appendLanguage(s string, language string) string { return s + "_" + language } } -func loadTestData() []TestParameters { +func loadTestData() (languageTests []LanguageTestParameters, diarizationTests []DiarizationTestParameters) { content, err := ioutil.ReadFile("../../resources/.test/test_data.json") if err != nil { log.Fatalf("Could not read test data json: %v", err) @@ -67,13 +78,28 @@ func loadTestData() []TestParameters { var testData struct { Tests struct { - Parameters []struct { - Language string `json:"language"` - AudioFile string `json:"audio_file"` - Transcript string `json:"transcript"` - Punctuations []string `json:"punctuations"` - ErrorRate float32 `json:"error_rate"` - } `json:"parameters"` + LanguageTests []struct { + Language string `json:"language"` + AudioFile string `json:"audio_file"` + Transcript string `json:"transcript"` + TranscriptWithPunctuation string `json:"transcript_with_punctuation"` + ErrorRate float32 `json:"error_rate"` + Words []struct { + Word string `json:"word"` + StartSec float32 `json:"start_sec"` + EndSec float32 `json:"end_sec"` + Confidence float32 `json:"confidence"` + SpeakerTag int32 `json:"speaker_tag"` + } `json:"words"` + } `json:"language_tests"` + DiarizationTests []struct { + Language string `json:"language"` + AudioFile string `json:"audio_file"` + Words []struct { + Word string `json:"word"` + SpeakerTag int32 `json:"speaker_tag"` + } `json:"words"` + } `json:"diarization_tests"` } `json:"tests"` } err = json.Unmarshal(content, &testData) @@ -81,59 +107,78 @@ func loadTestData() []TestParameters { log.Fatalf("Could not decode test data json: %v", err) } - for _, x := range testData.Tests.Parameters { - testCaseWithPunctuation := TestParameters{ - language: x.Language, - testAudioFile: x.AudioFile, - transcript: x.Transcript, - enableAutomaticPunctuation: true, - errorRate: x.ErrorRate, + for _, x := range testData.Tests.LanguageTests { + languageTestParameters := LanguageTestParameters{ + language: x.Language, + testAudioFile: x.AudioFile, + transcript: x.Transcript, + transcriptWithPunctuation: x.TranscriptWithPunctuation, + errorRate: x.ErrorRate, } - processTestParameters = append(processTestParameters, testCaseWithPunctuation) - transcriptWithoutPunctuation := x.Transcript - for _, p := range x.Punctuations { - transcriptWithoutPunctuation = strings.ReplaceAll(transcriptWithoutPunctuation, p, "") + for _, y := range x.Words { + word := LeopardWord{ + Word: y.Word, + StartSec: y.StartSec, + EndSec: y.EndSec, + Confidence: y.Confidence, + SpeakerTag: y.SpeakerTag, + } + languageTestParameters.words = append(languageTestParameters.words, word) } - testCaseWithoutPunctuation := TestParameters{ - language: x.Language, - testAudioFile: x.AudioFile, - transcript: transcriptWithoutPunctuation, - enableAutomaticPunctuation: false, - errorRate: x.ErrorRate, + + languageTests = append(languageTests, languageTestParameters) + } + + for _, x := range testData.Tests.DiarizationTests { + diarizationTestParameters := DiarizationTestParameters{ + language: x.Language, + testAudioFile: x.AudioFile, } - processTestParameters = append(processTestParameters, testCaseWithoutPunctuation) + + for _, y := range x.Words { + word := LeopardWord{ + Word: y.Word, + SpeakerTag: y.SpeakerTag, + } + diarizationTestParameters.words = append(diarizationTestParameters.words, word) + } + + diarizationTests = append(diarizationTests, diarizationTestParameters) } - return processTestParameters + return languageTests, diarizationTests } -func validateMetadata(t *testing.T, transcript string, words []LeopardWord, audioLength float32) { - transcriptUpperCase := strings.ToUpper(transcript) +func validateMetadata(t *testing.T, referenceWords []LeopardWord, words []LeopardWord, enableDiarization bool) { + if len(words) != len(referenceWords) { + t.Fatalf("Word count `%d` did not match expected word count `%d`", len(words), len(referenceWords)) + } + for i := range words { - wordUpperCase := strings.ToUpper(words[i].Word) - if !strings.Contains(transcriptUpperCase, wordUpperCase) { - t.Fatalf("Word `%s` was not in transcript `%s`", wordUpperCase, transcriptUpperCase) + word := strings.ToUpper(words[i].Word) + referenceWord := strings.ToUpper(referenceWords[i].Word) + if word != referenceWord { + t.Fatalf("Word `%s` did not match expected word `%s`", word, referenceWord) } - if words[i].StartSec <= 0 { - t.Fatalf("Word %d started at %f", i, words[i].StartSec) + if !isClose(words[i].StartSec, referenceWords[i].StartSec, 0.1) { + t.Fatalf("Word %d started at %f, expected %f", i, words[i].StartSec, referenceWords[i].StartSec) } - if words[i].StartSec > words[i].EndSec { - t.Fatalf("Word %d had a start time of %f, but and end time of %f", i, words[i].StartSec, words[i].EndSec) + if !isClose(words[i].EndSec, referenceWords[i].EndSec, 0.1) { + t.Fatalf("Word %d ended at %f, expected %f", i, words[i].EndSec, referenceWords[i].EndSec) } - if i < len(words)-1 { - if words[i].EndSec > words[i+1].StartSec { - t.Fatalf("Word %d had an end time of %f, next word had a start time of %f", i, words[i].EndSec, words[i+1].StartSec) + if !isClose(words[i].Confidence, referenceWords[i].Confidence, 0.1) { + t.Fatalf("Word %d had a confidence of %f, expected %f", i, words[i].Confidence, referenceWords[i].Confidence) + } + if enableDiarization { + if words[i].SpeakerTag != referenceWords[i].SpeakerTag { + t.Fatalf("Word %d had speaker_tag of %d, expected %d", i, words[i].SpeakerTag, referenceWords[i].SpeakerTag) } } else { - if words[i].EndSec > audioLength { - t.Fatalf("Word %d had an end time of %f, audio length is %f", i, words[i].EndSec, audioLength) + if words[i].SpeakerTag != -1 { + t.Fatalf("Word %d had speaker_tag of %d, expected -1", i, words[i].SpeakerTag) } } - - if words[i].Confidence < 0 || words[i].Confidence > 1 { - t.Fatalf("Word %d had an invalid confidence value of %f", i, words[i].Confidence) - } } } @@ -160,10 +205,13 @@ func runProcessTestCase( testAudioFile string, referenceTranscript string, targetErrorRate float32, - enableAutomaticPunctuation bool) { + enableAutomaticPunctuation bool, + enableDiarization bool, + referenceWords []LeopardWord) { leopard = NewLeopard(testAccessKey) leopard.EnableAutomaticPunctuation = enableAutomaticPunctuation + leopard.EnableDiarization = enableDiarization modelPath, _ := filepath.Abs(filepath.Join("../../lib/common", appendLanguage("leopard_params", language)+".pv")) leopard.ModelPath = modelPath @@ -193,15 +241,12 @@ func runProcessTestCase( t.Fatalf("Failed to process pcm buffer: %v", err) } - t.Logf("%s", transcript) - t.Logf("%s", referenceTranscript) - errorRate := float32(levenshtein.ComputeDistance(transcript, referenceTranscript)) / float32(len(referenceTranscript)) if errorRate >= targetErrorRate { t.Fatalf("Expected '%f' got '%f'", targetErrorRate, errorRate) } - validateMetadata(t, transcript, words, float32(len(pcm))/float32(SampleRate)) + validateMetadata(t, referenceWords, words, enableDiarization) } func runProcessFileTestCase( @@ -210,10 +255,13 @@ func runProcessFileTestCase( testAudioFile string, referenceTranscript string, targetErrorRate float32, - enableAutomaticPunctuation bool) { + enableAutomaticPunctuation bool, + enableDiarization bool, + referenceWords []LeopardWord) { leopard = NewLeopard(testAccessKey) leopard.EnableAutomaticPunctuation = enableAutomaticPunctuation + leopard.EnableDiarization = enableDiarization modelPath, _ := filepath.Abs(filepath.Join("../../lib/common", appendLanguage("leopard_params", language)+".pv")) leopard.ModelPath = modelPath @@ -234,26 +282,116 @@ func runProcessFileTestCase( t.Fatalf("Expected '%f' got '%f'", targetErrorRate, errorRate) } - data, err := ioutil.ReadFile(testAudioPath) + validateMetadata(t, referenceWords, words, enableDiarization) +} + +func runDiarizationTestCase( + t *testing.T, + language string, + testAudioFile string, + referenceWords []LeopardWord) { + + leopard = NewLeopard(testAccessKey) + leopard.EnableDiarization = true + + modelPath, _ := filepath.Abs(filepath.Join("../../lib/common", appendLanguage("leopard_params", language)+".pv")) + leopard.ModelPath = modelPath + + err := leopard.Init() if err != nil { - t.Fatalf("Could not read test file: %v", err) + log.Fatalf("Failed to init leopard with: %v", err) } - data = data[44:] // skip header + defer leopard.Delete() - validateMetadata(t, transcript, words, (float32(len(data))/float32(2))/float32(SampleRate)) + testAudioPath, _ := filepath.Abs(filepath.Join("../../resources/audio_samples", testAudioFile)) + _, words, err := leopard.ProcessFile(testAudioPath) + if err != nil { + t.Fatalf("Failed to process pcm buffer: %v", err) + } + + if len(words) != len(referenceWords) { + t.Fatalf("Word count `%d` did not match expected word count `%d`", len(words), len(referenceWords)) + } + for i := range words { + word := strings.ToUpper(words[i].Word) + referenceWord := strings.ToUpper(referenceWords[i].Word) + if word != referenceWord { + t.Fatalf("Word `%s` did not match expected word `%s`", word, referenceWord) + } + if words[i].SpeakerTag != referenceWords[i].SpeakerTag { + t.Fatalf("Word %d had speaker_tag of %d, expected %d", i, words[i].SpeakerTag, referenceWords[i].SpeakerTag) + } + } } func TestProcess(t *testing.T) { - for _, test := range processTestParameters { + for _, test := range languageTests { t.Logf("Running process data test for `%s`", test.language) - runProcessTestCase(t, test.language, test.testAudioFile, test.transcript, test.errorRate, test.enableAutomaticPunctuation) + runProcessTestCase( + t, + test.language, + test.testAudioFile, + test.transcript, + test.errorRate, + false, + false, + test.words) } } func TestProcessFile(t *testing.T) { - for _, test := range processTestParameters { + for _, test := range languageTests { t.Logf("Running process file test for `%s`", test.language) - runProcessTestCase(t, test.language, test.testAudioFile, test.transcript, test.errorRate, test.enableAutomaticPunctuation) + runProcessFileTestCase( + t, + test.language, + test.testAudioFile, + test.transcript, + test.errorRate, + false, + false, + test.words) + } +} + +func TestProcessFileWithPunctuation(t *testing.T) { + for _, test := range languageTests { + t.Logf("Running process file with punctuation test for `%s`", test.language) + runProcessFileTestCase( + t, + test.language, + test.testAudioFile, + test.transcriptWithPunctuation, + test.errorRate, + true, + false, + test.words) + } +} + +func TestProcessFileWithDiarization(t *testing.T) { + for _, test := range languageTests { + t.Logf("Running process file with diarization test for `%s`", test.language) + runProcessFileTestCase( + t, + test.language, + test.testAudioFile, + test.transcript, + test.errorRate, + false, + true, + test.words) + } +} + +func TestDiarization(t *testing.T) { + for _, test := range diarizationTests { + t.Logf("Running diarization test for `%s`", test.language) + runDiarizationTestCase( + t, + test.language, + test.testAudioFile, + test.words) } } @@ -278,3 +416,41 @@ func TestProcessEmptyFile(t *testing.T) { t.Fatalf("Leopard returned %d words on empty file", len(words)) } } + +func TestMessageStack(t *testing.T) { + leopard = NewLeopard("invalid access key") + err := leopard.Init() + err2 := leopard.Init() + + if len(err.Error()) > 1024 { + t.Fatalf("length of error is full: '%d'", len(err.Error())) + } + + if len(err2.Error()) != len(err.Error()) { + t.Fatalf("length of 1st init '%d' does not match 2nd init '%d'", len(err.Error()), len(err2.Error())) + } +} + +func TestProcessMessageStack(t *testing.T) { + leopard = NewLeopard(testAccessKey) + err := leopard.Init() + if err != nil { + log.Fatalf("Failed to init leopard with: %v", err) + } + + address := leopard.handle + leopard.handle = nil + + testPcm := make([]int16, 1014) + + _, _, err = leopard.Process(testPcm) + leopard.handle = address + if err == nil { + t.Fatalf("Expected leopard process to fail") + } + + delErr := leopard.Delete() + if delErr != nil { + t.Fatalf("%v", delErr) + } +} diff --git a/binding/ios/Leopard-iOS.podspec b/binding/ios/Leopard-iOS.podspec index e320121e..f38089ed 100644 --- a/binding/ios/Leopard-iOS.podspec +++ b/binding/ios/Leopard-iOS.podspec @@ -1,7 +1,7 @@ Pod::Spec.new do |s| s.name = 'Leopard-iOS' s.module_name = 'Leopard' - s.version = '1.2.0' + s.version = '2.0.0' s.license = {:type => 'Apache 2.0'} s.summary = 'iOS SDK for Picovoice\'s Leopard speech-to-text engine.' s.description = @@ -23,8 +23,8 @@ Pod::Spec.new do |s| DESC s.homepage = 'https://github.com/Picovoice/leopard/tree/master/binding/ios' s.author = { 'Picovoice' => 'hello@picovoice.ai' } - s.source = { :git => "https://github.com/Picovoice/leopard.git", :tag => "Leopard-iOS-v1.2.0" } - s.ios.deployment_target = '11.0' + s.source = { :git => "https://github.com/Picovoice/leopard.git", :tag => "Leopard-iOS-v2.0.0" } + s.ios.deployment_target = '13.0' s.swift_version = '5.0' s.vendored_frameworks = 'lib/ios/PvLeopard.xcframework' s.source_files = 'binding/ios/*.{swift}' diff --git a/binding/ios/Leopard.swift b/binding/ios/Leopard.swift index 40ab3178..afc78cf4 100644 --- a/binding/ios/Leopard.swift +++ b/binding/ios/Leopard.swift @@ -23,6 +23,11 @@ public struct LeopardWord { /// Transcription confidence. It is a number within [0, 1]. public let confidence: Float + /// The speaker tag is `-1` if diarization is not enabled during initialization; + /// otherwise, it's a non-negative integer identifying unique speakers, with `0` reserved for + /// unknown speakers. + public let speakerTag: Int + /// Constructor. /// /// - Parameters: @@ -30,11 +35,20 @@ public struct LeopardWord { /// - startSec: Start of word in seconds. /// - endSec: End of word in seconds. /// - confidence: Transcription confidence. It is a number within [0, 1]. - public init(word: String, startSec: Float, endSec: Float, confidence: Float) { + /// - speakerTag: The speaker tag is `-1` if diarization is not enabled during initialization; + /// otherwise, it's a non-negative integer identifying unique speakers, with `0` reserved for + /// unknown speakers. + public init( + word: String, + startSec: Float, + endSec: Float, + confidence: Float, + speakerTag: Int) { self.word = word self.startSec = startSec self.endSec = endSec self.confidence = confidence + self.speakerTag = speakerTag } } @@ -57,6 +71,11 @@ public class Leopard { public static let sampleRate = UInt32(pv_sample_rate()) public static let version = String(cString: pv_leopard_version()) + private static var sdk = "ios" + + public static func setSdk(sdk: String) { + self.sdk = sdk + } /// Constructor. /// @@ -64,8 +83,15 @@ public class Leopard { /// - accessKey: The AccessKey obtained from Picovoice Console (https://console.picovoice.ai). /// - modelPath: Absolute path to file containing model parameters. /// - enableAutomaticPunctuation: Set to `true` to enable automatic punctuation insertion. + /// - enableDiarization: Set to `true` to enable speaker diarization, which allows Leopard to + /// differentiate speakers as part of the transcription process. Word metadata will include + /// a `speakerTag` to identify unique speakers. /// - Throws: LeopardError - public init(accessKey: String, modelPath: String, enableAutomaticPunctuation: Bool = false) throws { + public init( + accessKey: String, + modelPath: String, + enableAutomaticPunctuation: Bool = false, + enableDiarization: Bool = false) throws { if accessKey.count == 0 { throw LeopardInvalidArgumentError("AccessKey is required for Leopard initialization") @@ -80,8 +106,15 @@ public class Leopard { accessKey, modelPathArg, enableAutomaticPunctuation, + enableDiarization, &handle) - try checkStatus(status, "Leopard init failed") + + pv_set_sdk(Leopard.sdk) + + if status != PV_STATUS_SUCCESS { + let messageStack = try getMessageStack() + throw pvStatusToLeopardError(status, "Leopard init failed", messageStack) + } } /// Constructor. @@ -90,12 +123,20 @@ public class Leopard { /// - accessKey: The AccessKey obtained from Picovoice Console (https://console.picovoice.ai). /// - modelURL: URL to the file containing model parameters. /// - enableAutomaticPunctuation: Set to `true` to enable automatic punctuation insertion. + /// - enableDiarization: Set to `true` to enable speaker diarization, which allows Leopard to + /// differentiate speakers as part of the transcription process. Word metadata will include + /// a `speakerTag` to identify unique speakers. /// - Throws: LeopardError - public convenience init(accessKey: String, modelURL: URL, enableAutomaticPunctuation: Bool = false) throws { + public convenience init( + accessKey: String, + modelURL: URL, + enableAutomaticPunctuation: Bool = false, + enableDiarization: Bool = false) throws { try self.init( accessKey: accessKey, modelPath: modelURL.path, - enableAutomaticPunctuation: enableAutomaticPunctuation) + enableAutomaticPunctuation: enableAutomaticPunctuation, + enableDiarization: enableDiarization) } deinit { @@ -137,7 +178,10 @@ public class Leopard { &cTranscript, &numWords, &cWords) - try checkStatus(status, "Leopard process failed") + if status != PV_STATUS_SUCCESS { + let messageStack = try getMessageStack() + throw pvStatusToLeopardError(status, "Leopard process failed", messageStack) + } let transcript = String(cString: cTranscript!) pv_leopard_transcript_delete(cTranscript) @@ -149,7 +193,8 @@ public class Leopard { word: String(cString: cWord.word), startSec: Float(cWord.start_sec), endSec: Float(cWord.end_sec), - confidence: Float(cWord.confidence) + confidence: Float(cWord.confidence), + speakerTag: Int(cWord.speaker_tag) ) words.append(word) } @@ -185,15 +230,9 @@ public class Leopard { &cTranscript, &numWords, &cWords) - do { - try checkStatus(status, "Leopard process failed") - } catch let error as LeopardInvalidArgumentError { - let fileExtension = (audioPath as NSString).pathExtension.lowercased() - if !Leopard.supportedAudioTypes.contains(fileExtension) { - throw LeopardInvalidArgumentError("Audio file with format '\(fileExtension)' is not supported") - } else { - throw error - } + if status != PV_STATUS_SUCCESS { + let messageStack = try getMessageStack() + throw pvStatusToLeopardError(status, "Leopard process file failed", messageStack) } let transcript = String(cString: cTranscript!) @@ -206,7 +245,8 @@ public class Leopard { word: String(cString: cWord.word), startSec: Float(cWord.start_sec), endSec: Float(cWord.end_sec), - confidence: Float(cWord.confidence) + confidence: Float(cWord.confidence), + speakerTag: Int(cWord.speaker_tag) ) words.append(word) } @@ -248,37 +288,54 @@ public class Leopard { "If this is a packaged asset, ensure you have added it to your xcode project.") } - private func checkStatus(_ status: pv_status_t, _ message: String) throws { - if status == PV_STATUS_SUCCESS { - return - } - + private func pvStatusToLeopardError( + _ status: pv_status_t, + _ message: String, + _ messageStack: [String] = []) -> LeopardError { switch status { case PV_STATUS_OUT_OF_MEMORY: - throw LeopardMemoryError(message) + return LeopardMemoryError(message, messageStack) case PV_STATUS_IO_ERROR: - throw LeopardIOError(message) + return LeopardIOError(message, messageStack) case PV_STATUS_INVALID_ARGUMENT: - throw LeopardInvalidArgumentError(message) + return LeopardInvalidArgumentError(message, messageStack) case PV_STATUS_STOP_ITERATION: - throw LeopardStopIterationError(message) + return LeopardStopIterationError(message, messageStack) case PV_STATUS_KEY_ERROR: - throw LeopardKeyError(message) + return LeopardKeyError(message, messageStack) case PV_STATUS_INVALID_STATE: - throw LeopardInvalidStateError(message) + return LeopardInvalidStateError(message, messageStack) case PV_STATUS_RUNTIME_ERROR: - throw LeopardRuntimeError(message) + return LeopardRuntimeError(message, messageStack) case PV_STATUS_ACTIVATION_ERROR: - throw LeopardActivationError(message) + return LeopardActivationError(message, messageStack) case PV_STATUS_ACTIVATION_LIMIT_REACHED: - throw LeopardActivationLimitError(message) + return LeopardActivationLimitError(message, messageStack) case PV_STATUS_ACTIVATION_THROTTLED: - throw LeopardActivationThrottledError(message) + return LeopardActivationThrottledError(message, messageStack) case PV_STATUS_ACTIVATION_REFUSED: - throw LeopardActivationRefusedError(message) + return LeopardActivationRefusedError(message, messageStack) default: let pvStatusString = String(cString: pv_status_to_string(status)) - throw LeopardError("\(pvStatusString): \(message)") + return LeopardError("\(pvStatusString): \(message)", messageStack) + } + } + + private func getMessageStack() throws -> [String] { + var messageStackRef: UnsafeMutablePointer?>? + var messageStackDepth: Int32 = 0 + let status = pv_get_error_stack(&messageStackRef, &messageStackDepth) + if status != PV_STATUS_SUCCESS { + throw pvStatusToLeopardError(status, "Unable to get Leopard error state") } + + var messageStack: [String] = [] + for i in 0.. 0.0) - XCTAssert(word.startSec <= word.endSec) - XCTAssert(word.endSec < audioLength) - XCTAssert(word.confidence >= 0.0 && word.confidence <= 1.0) + func validateMetadata(words: [LeopardWord], expectedWords: [LanguageTestWord], enableDiarization: Bool) { + XCTAssert(words.count == expectedWords.count) + for i in 0...size)) + var pcmBuffer = [Int16](repeating: 0, count: ((data.count - 44) / MemoryLayout.size)) _ = pcmBuffer.withUnsafeMutableBytes { - data.copyBytes(to: $0, from: 0...size)) - _ = pcmBuffer.withUnsafeMutableBytes { - data.copyBytes(to: $0, from: 0...size)) - _ = pcmBuffer.withUnsafeMutableBytes { - data.copyBytes(to: $0, from: 0.. 0) + } + } } diff --git a/binding/ios/LeopardAppTest/Podfile b/binding/ios/LeopardAppTest/Podfile index 76c3fa25..5f420d5a 100644 --- a/binding/ios/LeopardAppTest/Podfile +++ b/binding/ios/LeopardAppTest/Podfile @@ -1,14 +1,14 @@ source 'https://cdn.cocoapods.org/' -platform :ios, '11.0' +platform :ios, '13.0' target 'LeopardAppTest' do - pod 'Leopard-iOS', '~> 1.2.0' + pod 'Leopard-iOS', '~> 2.0.0' end target 'LeopardAppTestUITests' do - pod 'Leopard-iOS', '~> 1.2.0' + pod 'Leopard-iOS', '~> 2.0.0' end target 'PerformanceTest' do - pod 'Leopard-iOS', '~> 1.2.0' + pod 'Leopard-iOS', '~> 2.0.0' end diff --git a/binding/ios/LeopardAppTest/Podfile.lock b/binding/ios/LeopardAppTest/Podfile.lock index 70fca33f..35d820d5 100644 --- a/binding/ios/LeopardAppTest/Podfile.lock +++ b/binding/ios/LeopardAppTest/Podfile.lock @@ -1,16 +1,16 @@ PODS: - - Leopard-iOS (1.2.0) + - Leopard-iOS (2.0.0) DEPENDENCIES: - - Leopard-iOS (~> 1.2.0) + - Leopard-iOS (~> 2.0.0) SPEC REPOS: trunk: - Leopard-iOS SPEC CHECKSUMS: - Leopard-iOS: 993bdc6fbdaabfdaa0ddc5def9bd4405abb59bef + Leopard-iOS: ba60cf23fb79ffc01bbefbbd4e063cb2a102f352 -PODFILE CHECKSUM: d13c994daeebb58daf71108632fa5f93074605cb +PODFILE CHECKSUM: f750694a330da2f505bc711b202903ecad09f989 -COCOAPODS: 1.12.0 +COCOAPODS: 1.11.3 diff --git a/binding/ios/LeopardErrors.swift b/binding/ios/LeopardErrors.swift index fe67148a..fa62299c 100644 --- a/binding/ios/LeopardErrors.swift +++ b/binding/ios/LeopardErrors.swift @@ -1,5 +1,5 @@ // -// Copyright 2022 Picovoice Inc. +// Copyright 2022-2023 Picovoice Inc. // You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" // file accompanying this source. // Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on @@ -9,13 +9,22 @@ public class LeopardError: LocalizedError { private let message: String + private let messageStack: [String] - public init (_ message: String) { + public init (_ message: String, _ messageStack: [String] = []) { self.message = message + self.messageStack = messageStack } public var errorDescription: String? { - return message + var messageString = message + if messageStack.count > 0 { + messageString += ":" + for i in 0.. VALID_EXTENSIONS; + + private static String sdk = "java"; static { LIBRARY_PATH = Utils.getPackagedLibraryPath(); @@ -39,19 +41,33 @@ public class Leopard { * @param modelPath Absolute path to the file containing Leopard model parameters. * @param libraryPath Absolute path to the native Leopard library. * @param enableAutomaticPunctuation Set to `true` to enable automatic punctuation insertion. + * @param enableDiarization Set to `true` to enable speaker diarization, which allows Leopard to + * differentiate speakers as part of the transcription process. Word metadata + * will include a `speakerTag` to identify unique speakers. * @throws LeopardException if there is an error while initializing Leopard. */ private Leopard( String accessKey, String modelPath, String libraryPath, - boolean enableAutomaticPunctuation) throws LeopardException { + boolean enableAutomaticPunctuation, + boolean enableDiarization) throws LeopardException { try { System.load(libraryPath); } catch (Exception exception) { throw new LeopardException(exception); } - handle = LeopardNative.init(accessKey, modelPath, enableAutomaticPunctuation); + + LeopardNative.setSdk(Leopard.sdk); + handle = LeopardNative.init( + accessKey, + modelPath, + enableAutomaticPunctuation, + enableDiarization); + } + + public static void setSdk(String sdk) { + Leopard.sdk = sdk; } /** @@ -106,8 +122,8 @@ public LeopardTranscript processFile(String path) throws LeopardException { return LeopardNative.processFile(handle, path); } catch (LeopardInvalidArgumentException e) { if (path.contains(".")) { - String extension = path.substring(path.lastIndexOf(".") + 1); - if (!Arrays.asList(VALID_EXTENSIONS).contains(extension)) { + String extension = path.substring(path.lastIndexOf(".") + 1).toLowerCase(); + if (!VALID_EXTENSIONS.contains(extension)) { throw new LeopardInvalidArgumentException( String.format("Specified file with extension '%s' is not supported", extension)); @@ -142,8 +158,8 @@ public static class Builder { private String accessKey = null; private String libraryPath = null; private String modelPath = null; - private boolean enableAutomaticPunctuation = false; + private boolean enableDiarization = false; /** * Setter the AccessKey. @@ -185,6 +201,18 @@ public Builder setEnableAutomaticPunctuation(boolean enableAutomaticPunctuation) return this; } + /** + * Setter for enabling speaker diarization. + * + * @param enableDiarization Set to `true` to enable speaker diarization, which allows Leopard to + * differentiate speakers as part of the transcription process. Word metadata + * will include a `speakerTag` to identify unique speakers. + */ + public Builder setEnableDiarization(boolean enableDiarization) { + this.enableDiarization = enableDiarization; + return this; + } + /** * Creates an instance of Leopard Speech-to-Text engine. */ @@ -228,7 +256,12 @@ public Leopard build() throws LeopardException { } } - return new Leopard(accessKey, modelPath, libraryPath, enableAutomaticPunctuation); + return new Leopard( + accessKey, + modelPath, + libraryPath, + enableAutomaticPunctuation, + enableDiarization); } } } diff --git a/binding/java/src/ai/picovoice/leopard/LeopardNative.java b/binding/java/src/ai/picovoice/leopard/LeopardNative.java index f10e1d9c..c12d64d9 100644 --- a/binding/java/src/ai/picovoice/leopard/LeopardNative.java +++ b/binding/java/src/ai/picovoice/leopard/LeopardNative.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -18,10 +18,13 @@ class LeopardNative { static native String getVersion(); + static native void setSdk(String sdk); + static native long init( String accessKey, String modelPath, - boolean enableAutomaticPunctuation) throws LeopardException; + boolean enableAutomaticPunctuation, + boolean enableDiarization) throws LeopardException; static native void delete(long object); diff --git a/binding/java/src/ai/picovoice/leopard/LeopardTranscript.java b/binding/java/src/ai/picovoice/leopard/LeopardTranscript.java index 88c3b4ce..729a5f2f 100644 --- a/binding/java/src/ai/picovoice/leopard/LeopardTranscript.java +++ b/binding/java/src/ai/picovoice/leopard/LeopardTranscript.java @@ -57,6 +57,7 @@ public static class Word { private final float confidence; private final float startSec; private final float endSec; + private final int speakerTag; /** * Constructor. @@ -65,12 +66,21 @@ public static class Word { * @param confidence Transcription confidence. It is a number within [0, 1]. * @param startSec Start of word in seconds. * @param endSec End of word in seconds. + * @param speakerTag The speaker tag is `-1` if diarization is not enabled during initialization; + * otherwise, it's a non-negative integer identifying unique speakers, with `0` reserved + * for unknown speakers */ - public Word(String word, float confidence, float startSec, float endSec) { + public Word( + String word, + float confidence, + float startSec, + float endSec, + int speakerTag) { this.word = word; this.confidence = confidence; this.startSec = startSec; this.endSec = endSec; + this.speakerTag = speakerTag; } /** @@ -108,5 +118,14 @@ public float getStartSec() { public float getEndSec() { return endSec; } + + /** + * Getter for the speaker tag. + * + * @return Speaker tag. + */ + public int getSpeakerTag() { + return speakerTag; + } } } diff --git a/binding/java/src/ai/picovoice/leopard/Utils.java b/binding/java/src/ai/picovoice/leopard/Utils.java index 30e13105..50cdae2c 100644 --- a/binding/java/src/ai/picovoice/leopard/Utils.java +++ b/binding/java/src/ai/picovoice/leopard/Utils.java @@ -21,7 +21,9 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.util.Arrays; import java.util.Enumeration; +import java.util.List; import java.util.Locale; import java.util.jar.JarEntry; import java.util.jar.JarFile; @@ -232,8 +234,8 @@ public static String getPackagedLibraryPath() { } } - public static String[] getValidFileExtensions() { - return new String[]{ + public static List getValidFileExtensions() { + return Arrays.asList( "3gp", "flac", "m4a", @@ -243,6 +245,6 @@ public static String[] getValidFileExtensions() { "opus", "vorbis", "wav", - "webm"}; + "webm"); } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationException.java index 5ca54a0a..6040f571 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardActivationException(Throwable cause) { public LeopardActivationException(String message) { super(message); } + + public LeopardActivationException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationLimitException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationLimitException.java index 78675fd6..cd8cdd95 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationLimitException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationLimitException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardActivationLimitException(Throwable cause) { public LeopardActivationLimitException(String message) { super(message); } + + public LeopardActivationLimitException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationRefusedException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationRefusedException.java index 72209774..acfd4086 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationRefusedException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationRefusedException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardActivationRefusedException(Throwable cause) { public LeopardActivationRefusedException(String message) { super(message); } + + public LeopardActivationRefusedException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationThrottledException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationThrottledException.java index 31f5e649..e138679d 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationThrottledException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardActivationThrottledException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardActivationThrottledException(Throwable cause) { public LeopardActivationThrottledException(String message) { super(message); } + + public LeopardActivationThrottledException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardException.java index dfa00366..1828ed5e 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -13,11 +13,42 @@ package ai.picovoice.leopard; public class LeopardException extends Exception { + private final String message; + private final String[] messageStack; + public LeopardException(Throwable cause) { super(cause); + this.message = cause.getMessage(); + this.messageStack = null; } public LeopardException(String message) { super(message); + this.message = message; + this.messageStack = null; + } + + public LeopardException(String message, String[] messageStack) { + super(message); + this.message = message; + this.messageStack = messageStack; + } + + public String[] getMessageStack() { + return this.messageStack; + } + + @Override + public String getMessage() { + StringBuilder sb = new StringBuilder(message); + if (messageStack != null) { + if (messageStack.length > 0) { + sb.append(":"); + for (int i = 0; i < messageStack.length; i++) { + sb.append(String.format("\n [%d] %s", i, messageStack[i])); + } + } + } + return sb.toString(); } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardIOException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardIOException.java index 7aa98ed4..2559011e 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardIOException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardIOException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardIOException(Throwable cause) { public LeopardIOException(String message) { super(message); } + + public LeopardIOException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardInvalidArgumentException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardInvalidArgumentException.java index 10560287..eb934c3f 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardInvalidArgumentException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardInvalidArgumentException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardInvalidArgumentException(Throwable cause) { public LeopardInvalidArgumentException(String message) { super(message); } + + public LeopardInvalidArgumentException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardInvalidStateException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardInvalidStateException.java index 05d6ab81..90d56f9d 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardInvalidStateException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardInvalidStateException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardInvalidStateException(Throwable cause) { public LeopardInvalidStateException(String message) { super(message); } + + public LeopardInvalidStateException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardKeyException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardKeyException.java index 1dc874a3..5022a36d 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardKeyException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardKeyException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardKeyException(Throwable cause) { public LeopardKeyException(String message) { super(message); } + + public LeopardKeyException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardMemoryException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardMemoryException.java index 6aa4e280..40815cc9 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardMemoryException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardMemoryException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardMemoryException(Throwable cause) { public LeopardMemoryException(String message) { super(message); } + + public LeopardMemoryException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardRuntimeException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardRuntimeException.java index d676f24b..d9b8a78e 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardRuntimeException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardRuntimeException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardRuntimeException(Throwable cause) { public LeopardRuntimeException(String message) { super(message); } + + public LeopardRuntimeException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/src/ai/picovoice/leopard/exception/LeopardStopIterationException.java b/binding/java/src/ai/picovoice/leopard/exception/LeopardStopIterationException.java index d6891ab8..8f9570a1 100644 --- a/binding/java/src/ai/picovoice/leopard/exception/LeopardStopIterationException.java +++ b/binding/java/src/ai/picovoice/leopard/exception/LeopardStopIterationException.java @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -20,4 +20,8 @@ public LeopardStopIterationException(Throwable cause) { public LeopardStopIterationException(String message) { super(message); } + + public LeopardStopIterationException(String message, String[] messageStack) { + super(message, messageStack); + } } diff --git a/binding/java/test/ai/picovoice/leopard/LeopardTest.java b/binding/java/test/ai/picovoice/leopard/LeopardTest.java index 23dcddc2..7f96ccda 100644 --- a/binding/java/test/ai/picovoice/leopard/LeopardTest.java +++ b/binding/java/test/ai/picovoice/leopard/LeopardTest.java @@ -35,6 +35,7 @@ import java.util.ArrayList; import java.util.stream.Stream; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; public class LeopardTest { @@ -54,12 +55,82 @@ private static float getErrorRate(String transcript, String expectedTranscript) .apply(transcript, expectedTranscript) / (float) expectedTranscript.length(); } - private static JsonObject loadTestData() throws IOException { + private static ProcessTestData[] loadProcessTestData() throws IOException { final Path testDataPath = Paths.get(System.getProperty("user.dir")) .resolve("../../resources/.test") .resolve("test_data.json"); final String testDataContent = new String(Files.readAllBytes(testDataPath), StandardCharsets.UTF_8); - return JsonParser.parseString(testDataContent).getAsJsonObject(); + final JsonObject testDataJson = JsonParser.parseString(testDataContent).getAsJsonObject(); + + final JsonArray testParameters = testDataJson + .getAsJsonObject("tests") + .getAsJsonArray("language_tests"); + + final ProcessTestData[] processTestData = new ProcessTestData[testParameters.size()]; + for (int i = 0; i < testParameters.size(); i++) { + final JsonObject testData = testParameters.get(i).getAsJsonObject(); + final String language = testData.get("language").getAsString(); + final String testAudioFile = testData.get("audio_file").getAsString(); + final String transcript = testData.get("transcript").getAsString(); + final String transcriptWithPunctuation = testData.get("transcript_with_punctuation").getAsString(); + final float errorRate = testData.get("error_rate").getAsFloat(); + + final JsonArray wordsJson = testData.getAsJsonArray("words"); + final LeopardTranscript.Word[] words = new LeopardTranscript.Word[wordsJson.size()]; + for (int j = 0; j < wordsJson.size(); j++) { + final JsonObject wordJson = wordsJson.get(j).getAsJsonObject(); + words[j] = new LeopardTranscript.Word( + wordJson.get("word").getAsString(), + wordJson.get("confidence").getAsFloat(), + wordJson.get("start_sec").getAsFloat(), + wordJson.get("end_sec").getAsFloat(), + wordJson.get("speaker_tag").getAsInt()); + } + processTestData[i] = new ProcessTestData( + language, + testAudioFile, + transcript, + transcriptWithPunctuation, + errorRate, + words); + } + return processTestData; + } + + private static DiarizationTestData[] loadDiarizationTestData() throws IOException { + final Path testDataPath = Paths.get(System.getProperty("user.dir")) + .resolve("../../resources/.test") + .resolve("test_data.json"); + final String testDataContent = new String(Files.readAllBytes(testDataPath), StandardCharsets.UTF_8); + final JsonObject testDataJson = JsonParser.parseString(testDataContent).getAsJsonObject(); + + final JsonArray testParameters = testDataJson + .getAsJsonObject("tests") + .getAsJsonArray("diarization_tests"); + + final DiarizationTestData[] diarizationTestData = new DiarizationTestData[testParameters.size()]; + for (int i = 0; i < testParameters.size(); i++) { + final JsonObject testData = testParameters.get(i).getAsJsonObject(); + final String language = testData.get("language").getAsString(); + final String testAudioFile = testData.get("audio_file").getAsString(); + + final JsonArray wordsJson = testData.getAsJsonArray("words"); + final LeopardTranscript.Word[] words = new LeopardTranscript.Word[wordsJson.size()]; + for (int j = 0; j < wordsJson.size(); j++) { + final JsonObject wordJson = wordsJson.get(j).getAsJsonObject(); + words[j] = new LeopardTranscript.Word( + wordJson.get("word").getAsString(), + 0, + 0, + 0, + wordJson.get("speaker_tag").getAsInt()); + } + diarizationTestData[i] = new DiarizationTestData( + language, + testAudioFile, + words); + } + return diarizationTestData; } private static short[] readAudioFile(String testAudioPath) throws Exception { @@ -77,44 +148,66 @@ private static short[] readAudioFile(String testAudioPath) throws Exception { return pcm; } - private static Stream transcribeProvider() throws IOException { - - final JsonObject testDataJson = loadTestData(); + private static Stream processTestProvider() throws IOException { + final ProcessTestData[] processTestData = loadProcessTestData(); + final ArrayList testArgs = new ArrayList<>(); + for (ProcessTestData processTestDataItem : processTestData) { + testArgs.add(Arguments.of( + processTestDataItem.language, + processTestDataItem.audioFile, + processTestDataItem.transcript, + false, + false, + processTestDataItem.errorRate, + processTestDataItem.words)); + } - final JsonArray testParameters = testDataJson - .getAsJsonObject("tests") - .getAsJsonArray("parameters"); + return testArgs.stream(); + } + private static Stream processFileTestProvider() throws IOException { + final ProcessTestData[] processTestData = loadProcessTestData(); final ArrayList testArgs = new ArrayList<>(); - for (int i = 0; i < testParameters.size(); i++) { - final JsonObject testData = testParameters.get(i).getAsJsonObject(); - final String language = testData.get("language").getAsString(); - final String testAudioFile = testData.get("audio_file").getAsString(); - final String transcript = testData.get("transcript").getAsString(); - final float errorRate = testData.get("error_rate").getAsFloat(); - + for (ProcessTestData processTestDataItem : processTestData) { testArgs.add(Arguments.of( - language, - testAudioFile, - transcript, + processTestDataItem.language, + processTestDataItem.audioFile, + processTestDataItem.transcript, + false, + false, + processTestDataItem.errorRate, + processTestDataItem.words)); + testArgs.add(Arguments.of( + processTestDataItem.language, + processTestDataItem.audioFile, + processTestDataItem.transcriptWithPunctuation, true, - errorRate) - ); - - String transcriptWithoutPunctuation = transcript; - final JsonArray punctuations = testData.get("punctuations").getAsJsonArray(); - for (int j = 0; j < punctuations.size(); j++) { - String punctuation = punctuations.get(j).getAsString(); - transcriptWithoutPunctuation = transcriptWithoutPunctuation.replace(punctuation, ""); - } + false, + processTestDataItem.errorRate, + processTestDataItem.words)); testArgs.add(Arguments.of( - language, - testAudioFile, - transcriptWithoutPunctuation, + processTestDataItem.language, + processTestDataItem.audioFile, + processTestDataItem.transcript, false, - errorRate) - ); + true, + processTestDataItem.errorRate, + processTestDataItem.words)); + } + + return testArgs.stream(); + } + + private static Stream diarizationTestProvider() throws IOException { + final DiarizationTestData[] diarizationTestData = loadDiarizationTestData(); + final ArrayList testArgs = new ArrayList<>(); + for (DiarizationTestData diarizationTestDataItem : diarizationTestData) { + testArgs.add(Arguments.of( + diarizationTestDataItem.language, + diarizationTestDataItem.audioFile, + diarizationTestDataItem.words)); } + return testArgs.stream(); } @@ -123,18 +216,21 @@ void tearDown() { leopard.delete(); } - void validateMetadata(LeopardTranscript.Word[] words, String transcript, float audioLength) { - String normTranscript = transcript.toUpperCase(); + void validateMetadata( + LeopardTranscript.Word[] words, + LeopardTranscript.Word[] referenceWords, + boolean enableDiarization) { + assertEquals(words.length, referenceWords.length); for (int i = 0; i < words.length; i++) { - assertTrue(normTranscript.contains(words[i].getWord().toUpperCase())); - assertTrue(words[i].getStartSec() > 0); - assertTrue(words[i].getStartSec() <= words[i].getEndSec()); - if (i < words.length - 1) { - assertTrue(words[i].getEndSec() <= words[i + 1].getStartSec()); + assertEquals(words[i].getWord().toUpperCase(), referenceWords[i].getWord().toUpperCase()); + assertEquals(words[i].getStartSec(), referenceWords[i].getStartSec(), 0.1); + assertEquals(words[i].getEndSec(), referenceWords[i].getEndSec(), 0.1); + assertEquals(words[i].getConfidence(), referenceWords[i].getConfidence(), 0.1); + if (enableDiarization) { + assertEquals(words[i].getSpeakerTag(), referenceWords[i].getSpeakerTag()); } else { - assertTrue(words[i].getEndSec() <= audioLength); + assertEquals(words[i].getSpeakerTag(), -1); } - assertTrue(words[i].getConfidence() >= 0.0f && words[i].getConfidence() <= 1.0f); } } @@ -155,14 +251,16 @@ void getSampleRate() throws Exception { assertTrue(leopard.getSampleRate() > 0); } - @ParameterizedTest(name = "test process data for ''{0}'' with punctuation ''{3}''") - @MethodSource("transcribeProvider") + @ParameterizedTest(name = "test process data for ''{0}'' with punctuation ''{3}'' and diarization ''{4}''") + @MethodSource("processTestProvider") void process( String language, String testAudioFile, String referenceTranscript, boolean enableAutomaticPunctuation, - float targetErrorRate) throws Exception { + boolean enableDiarization, + float targetErrorRate, + LeopardTranscript.Word[] referenceWords) throws Exception { String modelPath = Paths.get(System.getProperty("user.dir")) .resolve(String.format("../../lib/common/%s.pv", appendLanguage("leopard_params", language))) .toString(); @@ -171,6 +269,7 @@ void process( .setAccessKey(accessKey) .setModelPath(modelPath) .setEnableAutomaticPunctuation(enableAutomaticPunctuation) + .setEnableDiarization(enableDiarization) .build(); String testAudioPath = Paths.get(System.getProperty("user.dir")) @@ -182,18 +281,20 @@ void process( assertTrue(getErrorRate(result.getTranscriptString(), referenceTranscript) < targetErrorRate); validateMetadata( result.getWordArray(), - result.getTranscriptString(), - (float) pcm.length / LeopardNative.getSampleRate()); + referenceWords, + enableDiarization); } - @ParameterizedTest(name = "test process file for ''{0}'' with punctuation ''{3}''") - @MethodSource("transcribeProvider") + @ParameterizedTest(name = "test process file for ''{0}'' with punctuation ''{3}'' and diarization ''{4}''") + @MethodSource("processFileTestProvider") void processFile( String language, String testAudioFile, String referenceTranscript, boolean enableAutomaticPunctuation, - float targetErrorRate) throws Exception { + boolean enableDiarization, + float targetErrorRate, + LeopardTranscript.Word[] referenceWords) throws Exception { String modelPath = Paths.get(System.getProperty("user.dir")) .resolve(String.format("../../lib/common/%s.pv", appendLanguage("leopard_params", language))) @@ -203,6 +304,7 @@ void processFile( .setAccessKey(accessKey) .setModelPath(modelPath) .setEnableAutomaticPunctuation(enableAutomaticPunctuation) + .setEnableDiarization(enableDiarization) .build(); String testAudioPath = Paths.get(System.getProperty("user.dir")) @@ -213,8 +315,76 @@ void processFile( assertTrue(getErrorRate(result.getTranscriptString(), referenceTranscript) < targetErrorRate); validateMetadata( result.getWordArray(), - result.getTranscriptString(), - (float) readAudioFile(testAudioPath).length / LeopardNative.getSampleRate()); + referenceWords, + enableDiarization); + } + + @ParameterizedTest(name = "test diarization for ''{0}''") + @MethodSource("diarizationTestProvider") + void diarization( + String language, + String testAudioFile, + LeopardTranscript.Word[] referenceWords) throws Exception { + + String modelPath = Paths.get(System.getProperty("user.dir")) + .resolve(String.format("../../lib/common/%s.pv", appendLanguage("leopard_params", language))) + .toString(); + + leopard = new Leopard.Builder() + .setAccessKey(accessKey) + .setModelPath(modelPath) + .setEnableDiarization(true) + .build(); + + String testAudioPath = Paths.get(System.getProperty("user.dir")) + .resolve(String.format("../../resources/audio_samples/%s", testAudioFile)) + .toString(); + + LeopardTranscript result = leopard.processFile(testAudioPath); + LeopardTranscript.Word[] words = result.getWordArray(); + assertEquals(result.getWordArray().length, referenceWords.length); + for (int i = 0; i < words.length; i++) { + assertEquals(words[i].getWord().toUpperCase(), referenceWords[i].getWord().toUpperCase()); + assertEquals(words[i].getSpeakerTag(), referenceWords[i].getSpeakerTag()); + } + } + + private static class ProcessTestData { + public final String language; + public final String audioFile; + public final String transcript; + public final String transcriptWithPunctuation; + public final float errorRate; + public final LeopardTranscript.Word[] words; + + public ProcessTestData( + String language, + String audioFile, + String transcript, + String transcriptWithPunctuation, + float errorRate, + LeopardTranscript.Word[] words) { + this.language = language; + this.audioFile = audioFile; + this.transcript = transcript; + this.transcriptWithPunctuation = transcriptWithPunctuation; + this.errorRate = errorRate; + this.words = words; + } } + private static class DiarizationTestData { + public final String language; + public final String audioFile; + public final LeopardTranscript.Word[] words; + + public DiarizationTestData( + String language, + String audioFile, + LeopardTranscript.Word[] words) { + this.language = language; + this.audioFile = audioFile; + this.words = words; + } + } } diff --git a/binding/nodejs/README.md b/binding/nodejs/README.md index 7c53b8fa..45183d9c 100644 --- a/binding/nodejs/README.md +++ b/binding/nodejs/README.md @@ -1,5 +1,7 @@ # Leopard Binding for Node.js +## Leopard Speech-to-Text Engine + Made in Vancouver, Canada by [Picovoice](https://picovoice.ai) Leopard is an on-device speech-to-text engine. Leopard is: @@ -15,7 +17,7 @@ Leopard is an on-device speech-to-text engine. Leopard is: ## Compatibility -- Node.js 12+ +- Node.js 16+ - Runs on Linux (x86_64), macOS (x86_64, arm64), Windows (x86_64), Raspberry Pi (4, 3), and NVIDIA Jetson Nano. ## Installation @@ -37,7 +39,7 @@ Create an instance of the engine and transcribe an audio file: ```javascript const {Leopard} = require("@picovoice/leopard-node"); -const accessKey = "${ACCESS_KEY}" // Obtained from the Picovoice Console (https://console.picovoice.ai/) +const accessKey = "${ACCESS_KEY}"; // Obtained from the Picovoice Console (https://console.picovoice.ai/) const handle = new Leopard(accessKey); const result = handle.processFile('${AUDIO_PATH}'); diff --git a/binding/nodejs/package.json b/binding/nodejs/package.json index 1a2418ff..b48b3fb3 100644 --- a/binding/nodejs/package.json +++ b/binding/nodejs/package.json @@ -1,6 +1,6 @@ { "name": "@picovoice/leopard-node", - "version": "1.2.0", + "version": "2.0.0", "description": "Picovoice Leopard Node.js binding", "main": "dist/index.js", "types": "dist/types/index.d.ts", @@ -38,7 +38,7 @@ "homepage": "https://picovoice.ai/products/leopard/", "devDependencies": { "@types/jest": "^27.4.1", - "@types/node": "^17.0.21", + "@types/node": "^18.11.9", "@typescript-eslint/eslint-plugin": "^5.19.0", "@typescript-eslint/parser": "^5.19.0", "eslint": "^8.13.0", @@ -53,7 +53,7 @@ "wavefile": "^11.0.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=16.0.0" }, "cpu": [ "!ia32", diff --git a/binding/nodejs/src/errors.ts b/binding/nodejs/src/errors.ts index d5542dd9..7f0730f4 100644 --- a/binding/nodejs/src/errors.ts +++ b/binding/nodejs/src/errors.ts @@ -12,47 +12,81 @@ import PvStatus from './pv_status_t'; -export class LeopardError extends Error {} +export class LeopardError extends Error { + private readonly _message: string; + private readonly _messageStack: string[]; + + constructor(message: string, messageStack: string[] = []) { + super(LeopardError.errorToString(message, messageStack)); + this._message = message; + this._messageStack = messageStack; + } + + get message(): string { + return this._message; + } + + get messageStack(): string[] { + return this._messageStack; + } + + private static errorToString( + initial: string, + messageStack: string[] + ): string { + let msg = initial; + + if (messageStack.length > 0) { + msg += `: ${messageStack.reduce( + (acc, value, index) => acc + '\n [' + index + '] ' + value, + '' + )}`; + } + + return msg; + } +} export class LeopardOutOfMemoryError extends LeopardError {} -export class LeopardIoError extends LeopardError {} +export class LeopardIOError extends LeopardError {} export class LeopardInvalidArgumentError extends LeopardError {} export class LeopardStopIterationError extends LeopardError {} export class LeopardKeyError extends LeopardError {} export class LeopardInvalidStateError extends LeopardError {} export class LeopardRuntimeError extends LeopardError {} export class LeopardActivationError extends LeopardError {} -export class LeopardActivationLimitReached extends LeopardError {} -export class LeopardActivationThrottled extends LeopardError {} -export class LeopardActivationRefused extends LeopardError {} +export class LeopardActivationLimitReachedError extends LeopardError {} +export class LeopardActivationThrottledError extends LeopardError {} +export class LeopardActivationRefusedError extends LeopardError {} export function pvStatusToException( pvStatus: PvStatus, - errorMessage: string + errorMessage: string, + messageStack: string[] = [] ): void { switch (pvStatus) { case PvStatus.OUT_OF_MEMORY: - throw new LeopardOutOfMemoryError(errorMessage); + throw new LeopardOutOfMemoryError(errorMessage, messageStack); case PvStatus.IO_ERROR: - throw new LeopardIoError(errorMessage); + throw new LeopardIOError(errorMessage, messageStack); case PvStatus.INVALID_ARGUMENT: - throw new LeopardInvalidArgumentError(errorMessage); + throw new LeopardInvalidArgumentError(errorMessage, messageStack); case PvStatus.STOP_ITERATION: - throw new LeopardStopIterationError(errorMessage); + throw new LeopardStopIterationError(errorMessage, messageStack); case PvStatus.KEY_ERROR: - throw new LeopardKeyError(errorMessage); + throw new LeopardKeyError(errorMessage, messageStack); case PvStatus.INVALID_STATE: - throw new LeopardInvalidStateError(errorMessage); + throw new LeopardInvalidStateError(errorMessage, messageStack); case PvStatus.RUNTIME_ERROR: - throw new LeopardRuntimeError(errorMessage); + throw new LeopardRuntimeError(errorMessage, messageStack); case PvStatus.ACTIVATION_ERROR: - throw new LeopardActivationError(errorMessage); + throw new LeopardActivationError(errorMessage, messageStack); case PvStatus.ACTIVATION_LIMIT_REACHED: - throw new LeopardActivationLimitReached(errorMessage); + throw new LeopardActivationLimitReachedError(errorMessage, messageStack); case PvStatus.ACTIVATION_THROTTLED: - throw new LeopardActivationThrottled(errorMessage); + throw new LeopardActivationThrottledError(errorMessage, messageStack); case PvStatus.ACTIVATION_REFUSED: - throw new LeopardActivationRefused(errorMessage); + throw new LeopardActivationRefusedError(errorMessage, messageStack); default: // eslint-disable-next-line no-console console.warn(`Unmapped error code: ${pvStatus}`); diff --git a/binding/nodejs/src/index.ts b/binding/nodejs/src/index.ts index a38c8329..72f81548 100644 --- a/binding/nodejs/src/index.ts +++ b/binding/nodejs/src/index.ts @@ -14,13 +14,13 @@ import { Leopard } from './leopard'; import { LeopardActivationError, - LeopardActivationLimitReached, - LeopardActivationRefused, - LeopardActivationThrottled, + LeopardActivationLimitReachedError, + LeopardActivationRefusedError, + LeopardActivationThrottledError, LeopardError, LeopardInvalidArgumentError, LeopardInvalidStateError, - LeopardIoError, + LeopardIOError, LeopardKeyError, LeopardOutOfMemoryError, LeopardRuntimeError, @@ -38,16 +38,16 @@ import { export { Leopard, LeopardActivationError, - LeopardActivationLimitReached, - LeopardActivationRefused, - LeopardActivationThrottled, + LeopardActivationLimitReachedError, + LeopardActivationRefusedError, + LeopardActivationThrottledError, LeopardOptions, LeopardError, LeopardInitOptions, LeopardInputOptions, LeopardInvalidArgumentError, LeopardInvalidStateError, - LeopardIoError, + LeopardIOError, LeopardKeyError, LeopardOutOfMemoryError, LeopardRuntimeError, diff --git a/binding/nodejs/src/leopard.ts b/binding/nodejs/src/leopard.ts index d4564f34..eb40874d 100644 --- a/binding/nodejs/src/leopard.ts +++ b/binding/nodejs/src/leopard.ts @@ -66,6 +66,9 @@ export class Leopard { * @param {string} options.modelPath The path to save and use the model from (.pv extension) * @param {string} options.libraryPath the path to the Leopard dynamic library (.node extension) * @param {boolean} options.enableAutomaticPunctuation Flag to enable automatic punctuation insertion. + * @param {boolean} options.enableDiarization Flag to enable speaker diarization, which allows Leopard to + * differentiate speakers as part of the transcription process. Word metadata will include a `speakerTag` + * to identify unique speakers. */ constructor(accessKey: string, options: LeopardOptions = {}) { if ( @@ -80,6 +83,7 @@ export class Leopard { modelPath = path.resolve(__dirname, DEFAULT_MODEL_PATH), libraryPath = getSystemLibraryPath(), enableAutomaticPunctuation = false, + enableDiarization = false, } = options; if (!fs.existsSync(libraryPath)) { @@ -95,13 +99,17 @@ export class Leopard { } const pvLeopard = require(libraryPath); // eslint-disable-line + this._pvLeopard = pvLeopard; let leopardHandleAndStatus: LeopardHandleAndStatus | null = null; try { + pvLeopard.set_sdk('nodejs'); + leopardHandleAndStatus = pvLeopard.init( accessKey, modelPath, - enableAutomaticPunctuation + enableAutomaticPunctuation, + enableDiarization ); } catch (err: any) { pvStatusToException(err.code, err); @@ -109,11 +117,10 @@ export class Leopard { const status = leopardHandleAndStatus!.status; if (status !== PvStatus.SUCCESS) { - pvStatusToException(status, 'Leopard failed to initialize'); + this.handlePvStatus(status, 'Leopard failed to initialize'); } this._handle = leopardHandleAndStatus!.handle; - this._pvLeopard = pvLeopard; this._sampleRate = pvLeopard.sample_rate(); this._version = pvLeopard.version(); } @@ -169,7 +176,7 @@ export class Leopard { const status = leopardResult!.status; if (status !== PvStatus.SUCCESS) { - pvStatusToException(status, 'Leopard failed to process the audio frame'); + this.handlePvStatus(status, 'Leopard failed to process the audio data'); } return { @@ -221,7 +228,7 @@ export class Leopard { )}' is not supported` ); } - pvStatusToException(status, 'Leopard failed to process the audio file'); + this.handlePvStatus(status, 'Leopard failed to process the audio file'); } return { transcript: leopardResult!.transcript, @@ -248,4 +255,13 @@ export class Leopard { console.warn('Leopard is not initialized'); } } + + private handlePvStatus(status: PvStatus, message: string): void { + const errorObject = this._pvLeopard.get_error_stack(); + if (errorObject.status === PvStatus.SUCCESS) { + pvStatusToException(status, message, errorObject.message_stack); + } else { + pvStatusToException(status, 'Unable to get Leopard error state'); + } + } } diff --git a/binding/nodejs/src/types.ts b/binding/nodejs/src/types.ts index 0251ad04..84d1d0ad 100644 --- a/binding/nodejs/src/types.ts +++ b/binding/nodejs/src/types.ts @@ -16,6 +16,10 @@ export type LeopardWord = { endSec: number; /** Transcription confidence. It is a number within [0, 1]. */ confidence: number; + /** The speaker tag is `-1` if diarization is not enabled during initialization + * otherwise, it's a non-negative integer identifying unique speakers, with `0` reserved + * for unknown speakers */ + speakerTag: number; }; export type LeopardTranscript = { @@ -27,6 +31,7 @@ export type LeopardTranscript = { export type LeopardInitOptions = { enableAutomaticPunctuation?: boolean; + enableDiarization?: boolean; }; export type LeopardInputOptions = { diff --git a/binding/nodejs/test/index.test.ts b/binding/nodejs/test/index.test.ts index 3473f3db..efdff6a8 100644 --- a/binding/nodejs/test/index.test.ts +++ b/binding/nodejs/test/index.test.ts @@ -20,10 +20,12 @@ import { getSystemLibraryPath } from '../src/platforms'; import { getModelPathByLanguage, getAudioFile, - getTestParameters, + getLanguageTestParameters, + getDiarizationTestParameters, } from './test_utils'; -const TEST_PARAMETERS = getTestParameters(); +const LANGUAGE_TEST_PARAMETERS = getLanguageTestParameters(); +const DIARIZATION_TEST_PARAMETERS = getDiarizationTestParameters(); const ACCESS_KEY = process.argv .filter(x => x.startsWith('--access_key='))[0] @@ -66,21 +68,20 @@ const characterErrorRate = ( const validateMetadata = ( words: LeopardWord[], - transcript: string, - audioLength: number + referenceWords: LeopardWord[], + enableDiarization: boolean ) => { - const normTranscript = transcript.toUpperCase(); + expect(words.length).toEqual(referenceWords.length); for (let i = 0; i < words.length; i += 1) { - const word = words[i]; - expect(normTranscript.includes(word.word.toUpperCase())).toBeTruthy(); - expect(word.startSec).toBeGreaterThan(0); - expect(word.startSec).toBeLessThanOrEqual(word.endSec); - if (i < (words.length - 1)) { - const nextWord = words[i + 1]; - expect(word.endSec).toBeLessThanOrEqual(nextWord.startSec); + expect(words[i].word).toEqual(referenceWords[i].word); + expect(words[i].startSec).toBeCloseTo(referenceWords[i].startSec, 1); + expect(words[i].endSec).toBeCloseTo(referenceWords[i].endSec, 1); + expect(words[i].confidence).toBeCloseTo(referenceWords[i].confidence, 1); + if (enableDiarization) { + expect(words[i].speakerTag).toEqual(referenceWords[i].speakerTag); + } else { + expect(words[i].speakerTag).toEqual(-1); } - expect(word.startSec).toBeLessThan(audioLength); - expect(word.confidence >= 0 && word.confidence <= 1).toBeTruthy(); } }; @@ -89,43 +90,33 @@ const loadPcm = (audioFile: string): any => { const waveBuffer = fs.readFileSync(waveFilePath); const waveAudioFile = new WaveFile(waveBuffer); - const pcm: any = waveAudioFile.getSamples(false, Int16Array); - return pcm; + return waveAudioFile.getSamples(false, Int16Array); }; const testLeopardProcess = ( language: string, transcript: string, - punctuations: string[], - testPunctuation: boolean, + enableAutomaticPunctuation: boolean, + enableDiarization: boolean, errorRate: number, - audioFile: string + audioFile: string, + words: LeopardWord[] ) => { const modelPath = getModelPathByLanguage(language); const pcm = loadPcm(audioFile); - let normTranscript = transcript; - if (!testPunctuation) { - for (const punctuation of punctuations) { - normTranscript = normTranscript.replace(new RegExp(`[${punctuation}]`, "g"), ''); - } - } - let leopardEngine = new Leopard(ACCESS_KEY, { modelPath, - enableAutomaticPunctuation: testPunctuation, + enableAutomaticPunctuation, + enableDiarization, }); let res = leopardEngine.process(pcm); expect( - characterErrorRate(res.transcript, normTranscript) < errorRate + characterErrorRate(res.transcript, transcript) < errorRate ).toBeTruthy(); - validateMetadata( - res.words, - res.transcript, - pcm.length / leopardEngine.sampleRate - ); + validateMetadata(res.words, words, enableDiarization); leopardEngine.release(); }; @@ -133,123 +124,145 @@ const testLeopardProcess = ( const testLeopardProcessFile = ( language: string, transcript: string, - punctuations: string[], - testPunctuation: boolean, + enableAutomaticPunctuation: boolean, + enableDiarization: boolean, errorRate: number, - audioFile: string + audioFile: string, + words: LeopardWord[] ) => { const modelPath = getModelPathByLanguage(language); - const pcm = loadPcm(audioFile); - - let normTranscript = transcript; - if (!testPunctuation) { - for (const punctuation of punctuations) { - normTranscript = normTranscript.replace(new RegExp(`[${punctuation}]`, "g"), ''); - } - } let leopardEngine = new Leopard(ACCESS_KEY, { modelPath, - enableAutomaticPunctuation: testPunctuation, + enableAutomaticPunctuation, + enableDiarization, }); const waveFilePath = getAudioFile(audioFile); let res = leopardEngine.processFile(waveFilePath); expect( - characterErrorRate(res.transcript, normTranscript) < errorRate + characterErrorRate(res.transcript, transcript) < errorRate ).toBeTruthy(); - validateMetadata( - res.words, - res.transcript, - pcm.length / leopardEngine.sampleRate - ); + validateMetadata(res.words, words, enableDiarization); leopardEngine.release(); }; describe('successful processes', () => { - it.each(TEST_PARAMETERS)( + it.each(LANGUAGE_TEST_PARAMETERS)( 'testing process `%p`', ( language: string, transcript: string, - punctuations: string[], + _: string, errorRate: number, - audioFile: string + audioFile: string, + words: LeopardWord[] ) => { testLeopardProcess( language, transcript, - punctuations, + false, false, errorRate, - audioFile + audioFile, + words ); } ); - it.each(TEST_PARAMETERS)( - 'testing process `%p` with punctuation', + it.each(LANGUAGE_TEST_PARAMETERS)( + 'testing process file `%p`', ( language: string, transcript: string, - punctuations: string[], + _: string, errorRate: number, - audioFile: string + audioFile: string, + words: LeopardWord[] ) => { - testLeopardProcess( + testLeopardProcessFile( language, transcript, - punctuations, - true, + false, + false, errorRate, - audioFile + audioFile, + words ); } ); - it.each(TEST_PARAMETERS)( - 'testing process file `%p`', + it.each(LANGUAGE_TEST_PARAMETERS)( + 'testing process file `%p` with punctuation', ( language: string, + _: string, transcript: string, - punctuations: string[], errorRate: number, - audioFile: string + audioFile: string, + words: LeopardWord[] ) => { testLeopardProcessFile( language, transcript, - punctuations, + true, false, errorRate, - audioFile + audioFile, + words ); } ); - - it.each(TEST_PARAMETERS)( - 'testing process file `%p` with punctuation', + it.each(LANGUAGE_TEST_PARAMETERS)( + 'testing process file `%p` with diarization', ( language: string, transcript: string, - punctuations: string[], + _: string, errorRate: number, - audioFile: string + audioFile: string, + words: LeopardWord[] ) => { testLeopardProcessFile( language, transcript, - punctuations, + false, true, errorRate, - audioFile + audioFile, + words ); } ); }); +describe('successful diarization', () => { + it.each(DIARIZATION_TEST_PARAMETERS)( + 'testing diarization `%p`', + (language: string, audioFile: string, referenceWords: LeopardWord[]) => { + const modelPath = getModelPathByLanguage(language); + + let leopardEngine = new Leopard(ACCESS_KEY, { + modelPath, + enableDiarization: true, + }); + + const waveFilePath = getAudioFile(audioFile); + let words = leopardEngine.processFile(waveFilePath).words; + + expect(words.length).toEqual(referenceWords.length); + for (let i = 0; i < words.length; i += 1) { + expect(words[i].word).toEqual(referenceWords[i].word); + expect(words[i].speakerTag).toEqual(referenceWords[i].speakerTag); + } + + leopardEngine.release(); + } + ); +}); + describe('Defaults', () => { test('Empty AccessKey', () => { expect(() => { @@ -275,3 +288,25 @@ describe('manual paths', () => { leopardEngine.release(); }); }); + +describe('error message stack', () => { + test('message stack cleared after read', () => { + let error: string[] = []; + try { + new Leopard('invalid'); + } catch (e: any) { + error = e.messageStack; + } + + expect(error.length).toBeGreaterThan(0); + expect(error.length).toBeLessThanOrEqual(8); + + try { + new Leopard('invalid'); + } catch (e: any) { + for (let i = 0; i < error.length; i++) { + expect(error[i]).toEqual(e.messageStack[i]); + } + } + }); +}); diff --git a/binding/nodejs/test/test_utils.ts b/binding/nodejs/test/test_utils.ts index 50ced970..c26cd7af 100644 --- a/binding/nodejs/test/test_utils.ts +++ b/binding/nodejs/test/test_utils.ts @@ -9,6 +9,7 @@ // specific language governing permissions and limitations under the License. // import * as path from 'path'; +import { LeopardWord } from '../src'; const ROOT_DIR = path.join(__dirname, '../../..'); const TEST_DATA_JSON = require(path.join( @@ -34,19 +35,46 @@ export function getAudioFile(audioFile: string): string { return path.join(ROOT_DIR, 'resources/audio_samples', audioFile); } -export function getTestParameters(): [ +export function getLanguageTestParameters(): [ + string, string, string, - string[], number, - string + string, + LeopardWord[] ][] { - let parametersJson = TEST_DATA_JSON.tests.parameters; + let parametersJson = TEST_DATA_JSON.tests.language_tests; return parametersJson.map((x: any) => [ x.language, x.transcript, - x.punctuations, + x.transcript_with_punctuation, x.error_rate, x.audio_file, + x.words.map((w: any) => ({ + word: w.word, + startSec: w.start_sec, + endSec: w.end_sec, + confidence: w.confidence, + speakerTag: w.speaker_tag, + })), + ]); +} + +export function getDiarizationTestParameters(): [ + string, + string, + LeopardWord[] +][] { + let parametersJson = TEST_DATA_JSON.tests.diarization_tests; + return parametersJson.map((x: any) => [ + x.language, + x.audio_file, + x.words.map((w: any) => ({ + word: w.word, + startSec: w.start_sec, + endSec: w.end_sec, + confidence: w.confidence, + speakerTag: w.speaker_tag, + })), ]); } diff --git a/binding/nodejs/yarn.lock b/binding/nodejs/yarn.lock index de020110..2dd5d0cb 100644 --- a/binding/nodejs/yarn.lock +++ b/binding/nodejs/yarn.lock @@ -685,10 +685,12 @@ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.5.tgz#3af577099a99c61479149b716183e70b5239324a" integrity sha512-Ark2WDjjZO7GmvsyFFf81MXuGTA/d6oP38anyxWOL6EREyBKAxKoFHwBhaZxCfLRLpO8JgVXwqOwSwa7jRcjew== -"@types/node@^17.0.21": - version "17.0.45" - resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.45.tgz#2c0fafd78705e7a18b7906b5201a522719dc5190" - integrity sha512-w+tIMs3rq2afQdsPJlODhoUEKzFP1ayaoyl1CcnwtIlsVe7K7bA1NGm4s3PraqTLlXnbIN84zuBlxBWo1u9BLw== +"@types/node@^18.11.9": + version "18.18.9" + resolved "https://registry.yarnpkg.com/@types/node/-/node-18.18.9.tgz#5527ea1832db3bba8eb8023ce8497b7d3f299592" + integrity sha512-0f5klcuImLnG4Qreu9hPj/rEfFq6YRc5n2mAjSsH+ec/mJL+3voBH0+8T7o8RpFjH7ovc+TRsL/c7OYIQsPTfQ== + dependencies: + undici-types "~5.26.4" "@types/prettier@^2.1.5": version "2.7.2" @@ -3580,6 +3582,11 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + universalify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" diff --git a/binding/python/README.md b/binding/python/README.md index f4041701..042c511a 100644 --- a/binding/python/README.md +++ b/binding/python/README.md @@ -1,10 +1,12 @@ -# Leopard Speech-to-Text Engine +# Leopard Binding for Python + +## Leopard Speech-to-Text Engine Made in Vancouver, Canada by [Picovoice](https://picovoice.ai) Leopard is an on-device speech-to-text engine. Leopard is: -- Private; All voice processing runs locally. +- Private; All voice processing runs locally. - [Accurate](https://picovoice.ai/docs/benchmark/stt/) - [Compact and Computationally-Efficient](https://github.com/Picovoice/speech-to-text-benchmark#rtf) - Cross-Platform: @@ -37,9 +39,9 @@ Create an instance of the engine and transcribe an audio file: ```python import pvleopard -handle = pvleopard.create(access_key='${ACCESS_KEY}') +leopard = pvleopard.create(access_key='${ACCESS_KEY}') -transcript, words = handle.process_file('${AUDIO_PATH}') +transcript, words = leopard.process_file('${AUDIO_PATH}') print(transcript) for word in words: print( @@ -48,20 +50,24 @@ for word in words: ``` Replace `${ACCESS_KEY}` with yours obtained from [Picovoice Console](https://console.picovoice.ai/) and -`${AUDIO_PATH}` to the path an audio file. Finally, when done be sure to explicitly release the resources using -`handle.delete()`. +`${AUDIO_PATH}` to the path an audio file. + +Finally, when done be sure to explicitly release the resources: +```python +leopard.delete() +``` ## Language Model -The Leopard Python SDK comes preloaded with a default English language model (`.pv` file). -Default models for other supported languages can be found in [lib/common](../../lib/common). +The Leopard Python SDK comes preloaded with a default English language model (`.pv` file). +Default models for other supported languages can be found in [lib/common](../../lib/common). Create custom language models using the [Picovoice Console](https://console.picovoice.ai/). Here you can train language models with custom vocabulary and boost words in the existing vocabulary. Pass in the `.pv` file via the `model_path` argument: ```python -handle = pvleopard.create( +leopard = pvleopard.create( access_key='${ACCESS_KEY}', model_path='${MODEL_PATH}') ``` diff --git a/binding/python/_factory.py b/binding/python/_factory.py index bd9665ed..4b6e7fae 100644 --- a/binding/python/_factory.py +++ b/binding/python/_factory.py @@ -19,7 +19,8 @@ def create( access_key: str, model_path: Optional[str] = None, library_path: Optional[str] = None, - enable_automatic_punctuation: bool = False) -> Leopard: + enable_automatic_punctuation: bool = False, + enable_diarization: bool = False) -> Leopard: """ Factory method for Leopard speech-to-text engine. @@ -28,6 +29,9 @@ def create( :param model_path: Absolute path to the file containing model parameters. If not set it will be set to the default location. :param enable_automatic_punctuation Set to `True` to enable automatic punctuation insertion. + :param enable_diarization Set to `true` to enable speaker diarization, which allows Leopard to differentiate + speakers as part of the transcription process. Word metadata will include a `speaker_tag` to + identify unique speakers. :return: An instance of Leopard speech-to-text engine. """ @@ -41,7 +45,8 @@ def create( access_key=access_key, model_path=model_path, library_path=library_path, - enable_automatic_punctuation=enable_automatic_punctuation) + enable_automatic_punctuation=enable_automatic_punctuation, + enable_diarization=enable_diarization) __all__ = [ diff --git a/binding/python/_leopard.py b/binding/python/_leopard.py index dc9e44aa..de5c1f61 100644 --- a/binding/python/_leopard.py +++ b/binding/python/_leopard.py @@ -18,7 +18,27 @@ class LeopardError(Exception): - pass + def __init__(self, message: str = '', message_stack: Sequence[str] = None): + super().__init__(message) + + self._message = message + self._message_stack = list() if message_stack is None else message_stack + + def __str__(self): + message = self._message + if len(self._message_stack) > 0: + message += ':' + for i in range(len(self._message_stack)): + message += '\n [%d] %s' % (i, self._message_stack[i]) + return message + + @property + def message(self) -> str: + return self._message + + @property + def message_stack(self) -> Sequence[str]: + return self._message_stack class LeopardMemoryError(LeopardError): @@ -119,14 +139,16 @@ class CWord(Structure): ("word", c_char_p), ("start_sec", c_float), ("end_sec", c_float), - ("confidence", c_float)] + ("confidence", c_float), + ("speaker_tag", c_int32)] def __init__( self, access_key: str, model_path: str, library_path: str, - enable_automatic_punctuation: bool = False) -> None: + enable_automatic_punctuation: bool = False, + enable_diarization: bool = False) -> None: """ Constructor. @@ -134,6 +156,9 @@ def __init__( :param model_path: Absolute path to the file containing model parameters. :param library_path: Absolute path to Leopard's dynamic library. :param enable_automatic_punctuation Set to `True` to enable automatic punctuation insertion. + :param enable_diarization Set to `true` to enable speaker diarization, which allows Leopard to differentiate + speakers as part of the transcription process. Word metadata will include a `speaker_tag` to + identify unique speakers. """ if not isinstance(access_key, str) or len(access_key) == 0: @@ -147,15 +172,36 @@ def __init__( library = cdll.LoadLibrary(library_path) + set_sdk_func = library.pv_set_sdk + set_sdk_func.argtypes = [c_char_p] + set_sdk_func.restype = None + + set_sdk_func('python'.encode('utf-8')) + + self._get_error_stack_func = library.pv_get_error_stack + self._get_error_stack_func.argtypes = [POINTER(POINTER(c_char_p)), POINTER(c_int)] + self._get_error_stack_func.restype = self.PicovoiceStatuses + + self._free_error_stack_func = library.pv_free_error_stack + self._free_error_stack_func.argtypes = [POINTER(c_char_p)] + self._free_error_stack_func.restype = None + init_func = library.pv_leopard_init - init_func.argtypes = [c_char_p, c_char_p, c_bool, POINTER(POINTER(self.CLeopard))] + init_func.argtypes = [c_char_p, c_char_p, c_bool, c_bool, POINTER(POINTER(self.CLeopard))] init_func.restype = self.PicovoiceStatuses self._handle = POINTER(self.CLeopard)() - status = init_func(access_key.encode(), model_path.encode(), enable_automatic_punctuation, byref(self._handle)) + status = init_func( + access_key.encode(), + model_path.encode(), + enable_automatic_punctuation, + enable_diarization, + byref(self._handle)) if status is not self.PicovoiceStatuses.SUCCESS: - raise self._PICOVOICE_STATUS_TO_EXCEPTION[status]() + raise self._PICOVOICE_STATUS_TO_EXCEPTION[status]( + message='Initialization failed', + message_stack=self._get_error_stack()) self._delete_func = library.pv_leopard_delete self._delete_func.argtypes = [POINTER(self.CLeopard)] @@ -201,7 +247,7 @@ def __init__( ] self._words_delete_func.restype = None - Word = namedtuple('Word', ['word', 'start_sec', 'end_sec', 'confidence']) + Word = namedtuple('Word', ['word', 'start_sec', 'end_sec', 'confidence', 'speaker_tag']) def process(self, pcm: Sequence[int]) -> Tuple[str, Sequence[Word]]: """ @@ -227,7 +273,9 @@ def process(self, pcm: Sequence[int]) -> Tuple[str, Sequence[Word]]: byref(num_words), byref(c_words)) if status is not self.PicovoiceStatuses.SUCCESS: - raise self._PICOVOICE_STATUS_TO_EXCEPTION[status]() + raise self._PICOVOICE_STATUS_TO_EXCEPTION[status]( + message='Process failed', + message_stack=self._get_error_stack()) transcript = c_transcript.value.decode('utf-8') self._transcript_delete_func(c_transcript) @@ -238,7 +286,8 @@ def process(self, pcm: Sequence[int]) -> Tuple[str, Sequence[Word]]: word=c_words[i].word.decode('utf-8'), start_sec=c_words[i].start_sec, end_sec=c_words[i].end_sec, - confidence=c_words[i].confidence) + confidence=c_words[i].confidence, + speaker_tag=c_words[i].speaker_tag) words.append(word) self._words_delete_func(c_words) @@ -267,12 +316,9 @@ def process_file(self, audio_path: str) -> Tuple[str, Sequence[Word]]: byref(num_words), byref(c_words)) if status is not self.PicovoiceStatuses.SUCCESS: - if status is self.PicovoiceStatuses.INVALID_ARGUMENT: - if not audio_path.lower().endswith(self._VALID_EXTENSIONS): - raise self._PICOVOICE_STATUS_TO_EXCEPTION[status]( - "Specified file with extension '%s' is not supported" % pathlib.Path(audio_path).suffix - ) - raise self._PICOVOICE_STATUS_TO_EXCEPTION[status]() + raise self._PICOVOICE_STATUS_TO_EXCEPTION[status]( + message='Process file failed', + message_stack=self._get_error_stack()) transcript = c_transcript.value.decode('utf-8') self._transcript_delete_func(c_transcript) @@ -283,7 +329,8 @@ def process_file(self, audio_path: str) -> Tuple[str, Sequence[Word]]: word=c_words[i].word.decode('utf-8'), start_sec=c_words[i].start_sec, end_sec=c_words[i].end_sec, - confidence=c_words[i].confidence) + confidence=c_words[i].confidence, + speaker_tag=c_words[i].speaker_tag) words.append(word) self._words_delete_func(c_words) @@ -307,6 +354,21 @@ def sample_rate(self) -> int: return self._sample_rate + def _get_error_stack(self) -> Sequence[str]: + message_stack_ref = POINTER(c_char_p)() + message_stack_depth = c_int() + status = self._get_error_stack_func(byref(message_stack_ref), byref(message_stack_depth)) + if status is not self.PicovoiceStatuses.SUCCESS: + raise self._PICOVOICE_STATUS_TO_EXCEPTION[status](message='Unable to get Leopard error state') + + message_stack = list() + for i in range(message_stack_depth.value): + message_stack.append(message_stack_ref[i].decode('utf-8')) + + self._free_error_stack_func(message_stack_ref) + + return message_stack + __all__ = [ 'Leopard', diff --git a/binding/python/setup.py b/binding/python/setup.py index 3807fb28..ad14b96f 100644 --- a/binding/python/setup.py +++ b/binding/python/setup.py @@ -14,50 +14,41 @@ import setuptools +INCLUDE_FILES = ('../../LICENSE', '__init__.py', '_factory.py', '_leopard.py', '_util.py') +INCLUDE_LIBS = ('linux', 'mac', 'windows', 'jetson', 'raspberry-pi') + os.system('git clean -dfx') package_folder = os.path.join(os.path.dirname(__file__), 'pvleopard') os.mkdir(package_folder) +manifest_in = "" -shutil.copy(os.path.join(os.path.dirname(__file__), '../../LICENSE'), package_folder) - -shutil.copy(os.path.join(os.path.dirname(__file__), '__init__.py'), os.path.join(package_folder, '__init__.py')) -shutil.copy(os.path.join(os.path.dirname(__file__), '_factory.py'), os.path.join(package_folder, '_factory.py')) -shutil.copy(os.path.join(os.path.dirname(__file__), '_leopard.py'), os.path.join(package_folder, '_leopard.py')) -shutil.copy(os.path.join(os.path.dirname(__file__), '_util.py'), os.path.join(package_folder, '_util.py')) +for rel_path in INCLUDE_FILES: + shutil.copy(os.path.join(os.path.dirname(__file__), rel_path), package_folder) + manifest_in += "include pvleopard/%s\n" % os.path.basename(rel_path) -platforms = ('jetson', 'linux', 'mac', 'raspberry-pi', 'windows') +model_file = 'lib/common/leopard_params.pv' +os.makedirs(os.path.join(package_folder, os.path.split(model_file)[0])) +shutil.copy( + os.path.join(os.path.dirname(__file__), '../..', model_file), + os.path.join(package_folder, model_file)) +manifest_in += "include pvleopard/%s\n" % model_file -os.mkdir(os.path.join(package_folder, 'lib')) -for platform in ('common',) + platforms: +for platform in INCLUDE_LIBS: shutil.copytree( os.path.join(os.path.dirname(__file__), '../../lib', platform), os.path.join(package_folder, 'lib', platform)) - -MANIFEST_IN = """ -include pvleopard/LICENSE -include pvleopard/__init__.py -include pvleopard/_factory.py -include pvleopard/_leopard.py -include pvleopard/_util.py -include pvleopard/lib/common/leopard_params.pv -recursive-include pvleopard/lib/jetson * -include pvleopard/lib/linux/x86_64/libpv_leopard.so -include pvleopard/lib/mac/x86_64/libpv_leopard.dylib -include pvleopard/lib/mac/arm64/libpv_leopard.dylib -recursive-include pvleopard/lib/raspberry-pi * -include pvleopard/lib/windows/amd64/libpv_leopard.dll -""" + manifest_in += "recursive-include pvleopard/lib/%s *\n" % platform with open(os.path.join(os.path.dirname(__file__), 'MANIFEST.in'), 'w') as f: - f.write(MANIFEST_IN.strip('\n ')) + f.write(manifest_in) with open(os.path.join(os.path.dirname(__file__), 'README.md'), 'r') as f: long_description = f.read() setuptools.setup( name="pvleopard", - version="1.2.2", + version="2.0.0", author="Picovoice", author_email="hello@picovoice.ai", description="Leopard Speech-to-Text Engine.", diff --git a/binding/python/test_leopard.py b/binding/python/test_leopard.py index a8708a59..9e4aef3b 100644 --- a/binding/python/test_leopard.py +++ b/binding/python/test_leopard.py @@ -14,12 +14,11 @@ from parameterized import parameterized -from _leopard import * from _util import * from test_util import * -parameters = load_test_data() +language_tests, diarization_tests = load_test_data() class LeopardTestCase(unittest.TestCase): @@ -28,17 +27,21 @@ def setUpClass(cls): cls._access_key = sys.argv[1] cls._audio_directory = os.path.join('..', '..', 'resources', 'audio_samples') - def _validate_metadata(self, words: Sequence[Leopard.Word], transcript: str, audio_length: int): - norm_transcript = transcript.upper() + def _validate_metadata( + self, + words: Sequence[Leopard.Word], + expected_words: Sequence[Leopard.Word], + enable_diarization: bool = False): + self.assertEqual(len(words), len(expected_words)) for i in range(len(words)): - self.assertTrue(words[i].word.upper() in norm_transcript) - self.assertGreater(words[i].start_sec, 0) - self.assertLessEqual(words[i].start_sec, words[i].end_sec) - if i < len(words) - 1: - self.assertLessEqual(words[i].end_sec, words[i + 1].start_sec) + self.assertEqual(words[i].word, expected_words[i].word) + self.assertAlmostEqual(words[i].start_sec, expected_words[i].start_sec, delta=0.01) + self.assertAlmostEqual(words[i].end_sec, expected_words[i].end_sec, delta=0.01) + self.assertAlmostEqual(words[i].confidence, expected_words[i].confidence, delta=0.01) + if enable_diarization: + self.assertEqual(words[i].speaker_tag, expected_words[i].speaker_tag) else: - self.assertLessEqual(words[i].end_sec, audio_length) - self.assertTrue(0 <= words[i].confidence <= 1) + self.assertEqual(words[i].speaker_tag, -1) def test_invalid_access_key(self): with self.assertRaises(LeopardInvalidArgumentError): @@ -69,14 +72,15 @@ def test_version(self): self.assertIsInstance(o.version, str) self.assertGreater(len(o.version), 0) - @parameterized.expand(parameters) + @parameterized.expand(language_tests) def test_process( self, language: str, audio_file: str, expected_transcript: str, - punctuations: List[str], - error_rate: float): + _: str, + error_rate: float, + expected_words: Sequence[Leopard.Word]): o = None try: @@ -90,29 +94,26 @@ def test_process( sample_rate=o.sample_rate) transcript, words = o.process(pcm) - normalized_transcript = expected_transcript - for punctuation in punctuations: - normalized_transcript = normalized_transcript.replace(punctuation, "") - use_cer = language == 'ja' self.assertLessEqual( - get_word_error_rate(transcript, normalized_transcript, use_cer), + get_word_error_rate(transcript, expected_transcript, use_cer), error_rate) - self._validate_metadata(words, transcript, len(pcm)) + self._validate_metadata(words, expected_words) finally: if o is not None: o.delete() - @parameterized.expand(parameters) + @parameterized.expand(language_tests) def test_process_file( self, language: str, audio_file: str, expected_transcript: str, - punctuations: List[str], - error_rate: float): + _: str, + error_rate: float, + expected_words: Sequence[Leopard.Word]): o = None try: @@ -122,33 +123,26 @@ def test_process_file( library_path=default_library_path('../../')) transcript, words = o.process_file(os.path.join(self._audio_directory, audio_file)) - normalized_transcript = expected_transcript - for punctuation in punctuations: - normalized_transcript = normalized_transcript.replace(punctuation, "") - - pcm = read_wav_file( - file_name=os.path.join(self._audio_directory, audio_file), - sample_rate=o.sample_rate) - use_cer = language == 'ja' self.assertLessEqual( - get_word_error_rate(transcript, normalized_transcript, use_cer), + get_word_error_rate(transcript, expected_transcript, use_cer), error_rate) - self._validate_metadata(words, transcript, len(pcm)) + self._validate_metadata(words, expected_words) finally: if o is not None: o.delete() - @parameterized.expand(parameters) + @parameterized.expand(language_tests) def test_process_file_with_punctuation( self, language: str, audio_file: str, - expected_transcript: str, - _: List[str], - error_rate: float): + _: str, + expected_transcript_with_punctuation: str, + error_rate: float, + expected_words: Sequence[Leopard.Word]): o = None try: @@ -159,22 +153,117 @@ def test_process_file_with_punctuation( enable_automatic_punctuation=True) transcript, words = o.process_file(os.path.join(self._audio_directory, audio_file)) + use_cer = language == 'ja' - pcm = read_wav_file( - file_name=os.path.join(self._audio_directory, audio_file), - sample_rate=o.sample_rate) + self.assertLessEqual( + get_word_error_rate(transcript, expected_transcript_with_punctuation, use_cer), + error_rate) + self._validate_metadata(words, expected_words) + + finally: + if o is not None: + o.delete() + + @parameterized.expand(language_tests) + def test_process_file_with_diarization( + self, + language: str, + audio_file: str, + expected_transcript: str, + _: str, + error_rate: float, + expected_words: Sequence[Leopard.Word]): + o = None + try: + o = Leopard( + access_key=self._access_key, + model_path=get_model_path_by_language(language=language), + library_path=default_library_path('../../'), + enable_diarization=True) + + transcript, words = o.process_file(os.path.join(self._audio_directory, audio_file)) use_cer = language == 'ja' self.assertLessEqual( get_word_error_rate(transcript, expected_transcript, use_cer), error_rate) - self._validate_metadata(words, transcript, len(pcm)) + self._validate_metadata(words, expected_words, enable_diarization=True) + + finally: + if o is not None: + o.delete() + + @parameterized.expand(diarization_tests) + def test_diarization_multiple_speakers( + self, + language: str, + audio_file: str, + expected_words: Sequence[Leopard.Word]): + o = None + try: + o = Leopard( + access_key=self._access_key, + model_path=get_model_path_by_language(language=language), + library_path=default_library_path('../../'), + enable_diarization=True) + + _, words = o.process_file(os.path.join(self._audio_directory, audio_file)) + self.assertEqual(len(words), len(expected_words)) + for i in range(len(words)): + self.assertEqual(words[i].word, expected_words[i].word) + self.assertEqual(words[i].speaker_tag, expected_words[i].speaker_tag) finally: if o is not None: o.delete() + def test_message_stack(self): + error = None + try: + o = Leopard( + access_key='invalid', + model_path=get_model_path_by_language(language='en'), + library_path=default_library_path('../../')) + self.assertIsNone(o) + except LeopardError as e: + error = e.message_stack + + self.assertIsNotNone(error) + self.assertGreater(len(error), 0) + + try: + o = Leopard( + access_key='invalid', + model_path=get_model_path_by_language(language='en'), + library_path=default_library_path('../../')) + self.assertIsNone(o) + except LeopardError as e: + self.assertEqual(len(error), len(e.message_stack)) + self.assertListEqual(list(error), list(e.message_stack)) + + def test_process_message_stack(self): + o = Leopard( + access_key=self._access_key, + model_path=get_model_path_by_language(language_tests[0][0]), + library_path=default_library_path('../../')) + + res = o.process_file(os.path.join(self._audio_directory, language_tests[0][1])) + self.assertIsNotNone(res) + + address = o._handle + o._handle = None + + try: + res = o.process_file(os.path.join(self._audio_directory, language_tests[0][1])) + self.assertIsNone(res) + except LeopardError as e: + self.assertGreater(len(e.message_stack), 0) + self.assertLess(len(e.message_stack), 8) + finally: + o._handle = address + o.delete() + if __name__ == '__main__': if len(sys.argv) != 2: diff --git a/binding/python/test_util.py b/binding/python/test_util.py index 7a420724..580594f0 100644 --- a/binding/python/test_util.py +++ b/binding/python/test_util.py @@ -13,8 +13,11 @@ import os import struct import wave + from typing import * +from _leopard import * + def load_test_data() -> List[Tuple[str, str, str, List[str], float]]: data_file_path = os.path.join(os.path.dirname(__file__), "../../resources/.test/test_data.json") @@ -22,11 +25,44 @@ def load_test_data() -> List[Tuple[str, str, str, List[str], float]]: json_test_data = data_file.read() test_data = json.loads(json_test_data)['tests'] - parameters = [ - (t['language'], t['audio_file'], t['transcript'], t['punctuations'], t['error_rate']) - for t in test_data['parameters']] - - return parameters + language_tests = [ + ( + t['language'], + t['audio_file'], + t['transcript'], + t['transcript_with_punctuation'], + t['error_rate'], + [ + Leopard.Word( + word=x['word'], + start_sec=x['start_sec'], + end_sec=x['end_sec'], + confidence=x['confidence'], + speaker_tag=x['speaker_tag']) + for x in t['words'] + ] + ) + for t in test_data['language_tests'] + ] + + diarization_tests = [ + ( + t['language'], + t['audio_file'], + [ + Leopard.Word( + word=x['word'], + start_sec=0, + end_sec=0, + confidence=0, + speaker_tag=x['speaker_tag']) + for x in t['words'] + ] + ) + for t in test_data['diarization_tests'] + ] + + return language_tests, diarization_tests def read_wav_file(file_name: str, sample_rate: int) -> Tuple: diff --git a/binding/react-native/android/build.gradle b/binding/react-native/android/build.gradle index 0adbd900..e762f460 100644 --- a/binding/react-native/android/build.gradle +++ b/binding/react-native/android/build.gradle @@ -118,5 +118,5 @@ repositories { dependencies { // noinspection GradleDynamicVersion api 'com.facebook.react:react-native:+' - implementation 'ai.picovoice:leopard-android:1.2.1' + implementation 'ai.picovoice:leopard-android:2.0.0' } diff --git a/binding/react-native/android/src/main/java/ai/picovoice/reactnative/leopard/LeopardModule.java b/binding/react-native/android/src/main/java/ai/picovoice/reactnative/leopard/LeopardModule.java index 791c2e9a..e71756e8 100644 --- a/binding/react-native/android/src/main/java/ai/picovoice/reactnative/leopard/LeopardModule.java +++ b/binding/react-native/android/src/main/java/ai/picovoice/reactnative/leopard/LeopardModule.java @@ -38,6 +38,8 @@ public class LeopardModule extends ReactContextBaseJavaModule { public LeopardModule(ReactApplicationContext reactContext) { super(reactContext); this.reactContext = reactContext; + + Leopard.setSdk("react-native"); } @Override @@ -50,6 +52,7 @@ public void create( String accessKey, String modelPath, boolean enableAutomaticPunctuation, + boolean enableDiarization, Promise promise) { try { @@ -57,6 +60,7 @@ public void create( .setAccessKey(accessKey) .setModelPath(modelPath.isEmpty() ? null : modelPath) .setEnableAutomaticPunctuation(enableAutomaticPunctuation) + .setEnableDiarization(enableDiarization) .build(reactContext); leopardPool.put(String.valueOf(System.identityHashCode(leopard)), leopard); @@ -146,6 +150,7 @@ private WritableMap leopardTranscriptToWriteableMap(LeopardTranscript result) { wordMap.putDouble("confidence", word.getConfidence()); wordMap.putDouble("startSec", word.getStartSec()); wordMap.putDouble("endSec", word.getEndSec()); + wordMap.putInt("speakerTag", word.getSpeakerTag()); words.pushMap(wordMap); } resultMap.putArray("words", words); diff --git a/binding/react-native/ios/Leopard.m b/binding/react-native/ios/Leopard.m index 02118531..f098948e 100644 --- a/binding/react-native/ios/Leopard.m +++ b/binding/react-native/ios/Leopard.m @@ -16,6 +16,7 @@ @interface RCT_EXTERN_MODULE(PvLeopard, NSObject) RCT_EXTERN_METHOD(create: (NSString *)accessKey modelPath: (NSString *)modelPath enableAutomaticPunctuation: (BOOL)enableAutomaticPunctuation + enableDiarization: (BOOL)enableDiarization resolver: (RCTPromiseResolveBlock)resolve rejecter: (RCTPromiseRejectBlock)reject) diff --git a/binding/react-native/ios/Leopard.swift b/binding/react-native/ios/Leopard.swift index 828785c9..0e507b11 100644 --- a/binding/react-native/ios/Leopard.swift +++ b/binding/react-native/ios/Leopard.swift @@ -1,5 +1,5 @@ // -// Copyright 2022 Picovoice Inc. +// Copyright 2022-2023 Picovoice Inc. // // You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" // file accompanying this source. @@ -15,11 +15,17 @@ import Leopard class PvLeopard: NSObject { private var leopardPool: [String: Leopard] = [:] - @objc(create:modelPath:enableAutomaticPunctuation:resolver:rejecter:) + override init() { + super.init() + Leopard.setSdk(sdk: "react-native") + } + + @objc(create:modelPath:enableAutomaticPunctuation:enableDiarization:resolver:rejecter:) func create( accessKey: String, modelPath: String, enableAutomaticPunctuation: Bool, + enableDiarization: Bool, resolver resolve: RCTPromiseResolveBlock, rejecter reject: RCTPromiseRejectBlock) { @@ -27,7 +33,8 @@ class PvLeopard: NSObject { let leopard = try Leopard( accessKey: accessKey, modelPath: modelPath, - enableAutomaticPunctuation: enableAutomaticPunctuation + enableAutomaticPunctuation: enableAutomaticPunctuation, + enableDiarization: enableDiarization ) let handle: String = String(describing: leopard) @@ -120,6 +127,7 @@ class PvLeopard: NSObject { wordMap["confidence"] = wordMeta.confidence wordMap["startSec"] = wordMeta.startSec wordMap["endSec"] = wordMeta.endSec + wordMap["speakerTag"] = wordMeta.speakerTag wordMapArray.append(wordMap) } resultMap["words"] = wordMapArray diff --git a/binding/react-native/leopard-react-native.podspec b/binding/react-native/leopard-react-native.podspec index 214b4ffa..20ad2a51 100644 --- a/binding/react-native/leopard-react-native.podspec +++ b/binding/react-native/leopard-react-native.podspec @@ -10,11 +10,11 @@ Pod::Spec.new do |s| s.license = package["license"] s.authors = package["author"] - s.platforms = { :ios => "11.0" } + s.platforms = { :ios => "13.0" } s.source = { :git => "https://github.com/Picovoice/leopard.git", :tag => "#{s.version}" } s.source_files = "ios/*.{h,m,mm,swift}" s.dependency "React" - s.dependency "Leopard-iOS", '~> 1.2.0' + s.dependency "Leopard-iOS", '~> 2.0.0' end diff --git a/binding/react-native/package.json b/binding/react-native/package.json index 50d9e6fd..a076fc5b 100644 --- a/binding/react-native/package.json +++ b/binding/react-native/package.json @@ -1,6 +1,6 @@ { "name": "@picovoice/leopard-react-native", - "version": "1.2.1", + "version": "2.0.0", "description": "Picovoice Leopard React Native binding", "main": "lib/commonjs/index", "module": "lib/module/index", diff --git a/binding/react-native/src/leopard.tsx b/binding/react-native/src/leopard.tsx index 5928a5c7..63d60290 100644 --- a/binding/react-native/src/leopard.tsx +++ b/binding/react-native/src/leopard.tsx @@ -1,5 +1,5 @@ // -// Copyright 2022 Picovoice Inc. +// Copyright 2022-2023 Picovoice Inc. // // You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" // file accompanying this source. @@ -31,6 +31,8 @@ class Leopard { * @param modelPath Path to the file containing model parameters. * @param options Optional configuration arguments. * @param options.enableAutomaticPunctuation Set to `true` to enable automatic punctuation insertion. + * @param options.enableDiarization Set to `true` to enable speaker diarization, which allows Leopard to differentiate speakers + * as part of the transcription process. Word metadata will include a `speakerTag` to identify unique speakers. * @returns An instance of the engine. */ public static async create( @@ -38,13 +40,17 @@ class Leopard { modelPath: string, options: LeopardOptions = {} ) { - const { enableAutomaticPunctuation = false } = options; + const { + enableAutomaticPunctuation = false, + enableDiarization = false + } = options; try { let { handle, sampleRate, version } = await RCTLeopard.create( accessKey, modelPath, - enableAutomaticPunctuation + enableAutomaticPunctuation, + enableDiarization ); return new Leopard(handle, sampleRate, version); } catch (err) { diff --git a/binding/react-native/src/leopard_types.ts b/binding/react-native/src/leopard_types.ts index 89762ac3..1b9230b9 100644 --- a/binding/react-native/src/leopard_types.ts +++ b/binding/react-native/src/leopard_types.ts @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on @@ -16,6 +16,8 @@ export type LeopardWord = { endSec: number; /** Transcription confidence. It is a number within [0, 1]. */ confidence: number; + /** Speaker tag. It is set to `-1` if speaker diarization is not enabled during initialization. */ + speakerTag: number; }; export type LeopardTranscript = { @@ -28,4 +30,6 @@ export type LeopardTranscript = { export type LeopardOptions = { /** Set to `true` to enable automatic punctuation insertion. */ enableAutomaticPunctuation?: boolean; + /** Set to `true` to enable speaker diarization. */ + enableDiarization?: boolean; }; diff --git a/binding/react-native/test-app/LeopardTestApp/.ruby-version b/binding/react-native/test-app/LeopardTestApp/.ruby-version deleted file mode 100644 index 49cdd668..00000000 --- a/binding/react-native/test-app/LeopardTestApp/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -2.7.6 diff --git a/binding/react-native/test-app/LeopardTestApp/Gemfile b/binding/react-native/test-app/LeopardTestApp/Gemfile deleted file mode 100644 index 567e5980..00000000 --- a/binding/react-native/test-app/LeopardTestApp/Gemfile +++ /dev/null @@ -1,6 +0,0 @@ -source 'https://rubygems.org' - -# You may use http://rbenv.org/ or https://rvm.io/ to install and use this version -ruby File.read(File.join(__dir__, '.ruby-version')).strip - -gem 'cocoapods', '~> 1.11', '>= 1.11.3' diff --git a/binding/react-native/test-app/LeopardTestApp/Tests.ts b/binding/react-native/test-app/LeopardTestApp/Tests.ts index 4c62668c..9e2859df 100644 --- a/binding/react-native/test-app/LeopardTestApp/Tests.ts +++ b/binding/react-native/test-app/LeopardTestApp/Tests.ts @@ -15,6 +15,14 @@ export type Result = { errorString?: string; }; +type TestWord = { + word: string; + start_sec: number; + end_sec: number; + confidence: number; + speaker_tag: number; +}; + const levenshteinDistance = (words1: string[], words2: string[]) => { const res = Array.from( Array(words1.length + 1), @@ -54,34 +62,34 @@ const wordErrorRate = ( const validateMetadata = ( words: LeopardWord[], - transcript: string, - audioLength: number, + expectedWords: TestWord[], + enableDiarization: boolean, ): string | null => { - const normTranscript = transcript.toUpperCase(); + if (words.length !== expectedWords.length) { + return `Length ${words.length} does not match ${expectedWords.length}`; + } for (let i = 0; i < words.length; i++) { - if (!normTranscript.includes(words[i].word.toUpperCase())) { - return `${words[i].word} is not in transcript.`; + if (words[i].word !== expectedWords[i].word) { + return `Word ${words[i].word} is not equal to ${expectedWords[i].word}`; } - if (words[i].startSec <= 0) { - return `${words[i].word} has invalid startSec: '${words[i].startSec}'`; + if (Math.abs(words[i].startSec - expectedWords[i].start_sec) > 0.01) { + return `Start sec ${words[i].startSec} is not equal to ${expectedWords[i].start_sec}`; } - if (words[i].startSec > words[i].endSec) { - return `${words[i].word} invalid meta: startSec '${words[i].startSec}' > endSec '${words[i].endSec}`; + if (Math.abs(words[i].endSec - expectedWords[i].end_sec) > 0.01) { + return `End sec ${words[i].endSec} is not equal to ${expectedWords[i].end_sec}`; } - if (i < words.length - 1) { - if (words[i].endSec > words[i + 1].startSec) { - return `${words[i].word} invalid meta: endSec '${words[i].endSec}' - is greater than next word startSec - '${words[i + 1].word} - ${words[i + 1].startSec}'`; + if (Math.abs(words[i].confidence - expectedWords[i].confidence) > 0.01) { + return `Confidence ${words[i].confidence} is not equal to ${expectedWords[i].confidence}`; + } + if (enableDiarization) { + if (words[i].speakerTag !== expectedWords[i].speaker_tag) { + return `Speaker ${words[i].speakerTag} is not equal to ${expectedWords[i].speaker_tag}`; } } else { - if (words[i].endSec > audioLength) { - return `${words[i].word} invalid meta: endSec '${words[i].endSec}' is greater than audio length '${audioLength}'`; + if (words[i].speakerTag !== -1) { + return `Invalid speaker tag ${words[i].speakerTag}`; } } - if (!(words[i].confidence >= 0 || words[i].confidence <= 1)) { - return `${words[i].word} invalid meta: invalid confidence value '${words[i].confidence}'`; - } } return null; }; @@ -208,14 +216,19 @@ async function runProcTestCase( language: string, audioFile: string, expectedTranscript: string, - punctuations: string[], + expectedWords: TestWord[], errorRate: number, params: { asFile?: boolean; enablePunctuation?: boolean; + enableDiarization?: boolean; } = {}, ): Promise { - const {asFile = false, enablePunctuation = false} = params; + const { + asFile = false, + enablePunctuation = false, + enableDiarization = false, + } = params; const result: Result = {testName: '', success: false}; @@ -228,6 +241,7 @@ async function runProcTestCase( const leopard = await Leopard.create(TEST_ACCESS_KEY, modelPath, { enableAutomaticPunctuation: enablePunctuation, + enableDiarization: enableDiarization }); const pcm = await getPcmFromFile(audioPath, leopard.sampleRate); @@ -238,16 +252,9 @@ async function runProcTestCase( await leopard.delete(); - let normalizedTranscript = expectedTranscript; - if (!enablePunctuation) { - for (const punctuation of punctuations) { - normalizedTranscript = normalizedTranscript.replace(punctuation, ''); - } - } - const wer = wordErrorRate( transcript, - normalizedTranscript, + expectedTranscript, language === 'ja', ); if (wer > errorRate) { @@ -255,7 +262,7 @@ async function runProcTestCase( return result; } - const errorMessage = validateMetadata(words, transcript, pcm.length); + const errorMessage = validateMetadata(words, expectedWords, enableDiarization); if (errorMessage) { result.errorString = errorMessage; return result; @@ -291,15 +298,15 @@ async function initTests(): Promise { return results; } -async function paramTests(): Promise { +async function languageTests(): Promise { const results: Result[] = []; - for (const testParam of testData.tests.parameters) { + for (const testParam of testData.tests.language_tests) { const result = await runProcTestCase( testParam.language, testParam.audio_file, testParam.transcript, - testParam.punctuations, + testParam.words, testParam.error_rate, ); result.testName = `Process test for '${testParam.language}'`; @@ -307,12 +314,12 @@ async function paramTests(): Promise { results.push(result); } - for (const testParam of testData.tests.parameters) { + for (const testParam of testData.tests.language_tests) { const result = await runProcTestCase( testParam.language, testParam.audio_file, - testParam.transcript, - testParam.punctuations, + testParam.transcript_with_punctuation, + testParam.words, testParam.error_rate, { enablePunctuation: true, @@ -323,12 +330,12 @@ async function paramTests(): Promise { results.push(result); } - for (const testParam of testData.tests.parameters) { + for (const testParam of testData.tests.language_tests) { const result = await runProcTestCase( testParam.language, testParam.audio_file, testParam.transcript, - testParam.punctuations, + testParam.words, testParam.error_rate, { asFile: true, @@ -339,11 +346,81 @@ async function paramTests(): Promise { results.push(result); } + for (const testParam of testData.tests.language_tests) { + const result = await runProcTestCase( + testParam.language, + testParam.audio_file, + testParam.transcript, + testParam.words, + testParam.error_rate, + { + enableDiarization: true, + }, + ); + result.testName = `Process test with diarization for '${testParam.language}'`; + logResult(result); + results.push(result); + } + + return results; +} + +async function diarizationTests(): Promise { + const results: Result[] = []; + + for (const testParam of testData.tests.diarization_tests) { + const result: Result = {testName: '', success: false}; + + const { language, audio_file, words: expectedWords } = testParam; + + try { + const modelPath = + language === 'en' + ? getPath('model_files/leopard_params.pv') + : getPath(`model_files/leopard_params_${language}.pv`); + + const leopard = await Leopard.create(TEST_ACCESS_KEY, modelPath, { + enableDiarization: true + }); + + const { words } = await leopard.processFile(await absolutePath('audio_samples', audio_file)); + await leopard.delete(); + + let errorMessage: string | null = null; + if (words.length !== expectedWords.length) { + errorMessage = `Length ${words.length} does not match ${expectedWords.length}`; + } + for (let i = 0; i < words.length; i++) { + if (words[i].word !== expectedWords[i].word) { + errorMessage = `Word ${words[i].word} is not equal to ${expectedWords[i].word}`; + break; + } + if (words[i].speakerTag !== expectedWords[i].speaker_tag) { + errorMessage = `Speaker ${words[i].speakerTag} is not equal to ${expectedWords[i].speaker_tag}`; + break; + } + } + + if (errorMessage) { + result.errorString = errorMessage; + } else { + result.success = true; + } + } catch (e) { + result.errorString = `Failed to process leopard with: ${e}`; + } + + result.testName = `Diarization multiple speaker test for '${testParam.language}'`; + logResult(result); + results.push(result); + } + return results; } export async function runLeopardTests(): Promise { const initResults = await initTests(); - const paramResults = await paramTests(); - return [...initResults, ...paramResults]; + const languageResults = await languageTests(); + const diarizationResults = await diarizationTests(); + return [...initResults, ...languageResults, ...diarizationResults]; } diff --git a/binding/react-native/test-app/LeopardTestApp/_node-version b/binding/react-native/test-app/LeopardTestApp/_node-version deleted file mode 100644 index b6a7d89c..00000000 --- a/binding/react-native/test-app/LeopardTestApp/_node-version +++ /dev/null @@ -1 +0,0 @@ -16 diff --git a/binding/react-native/test-app/LeopardTestApp/e2e/starter.test.js b/binding/react-native/test-app/LeopardTestApp/e2e/starter.test.js index d8199522..0f8c9c96 100644 --- a/binding/react-native/test-app/LeopardTestApp/e2e/starter.test.js +++ b/binding/react-native/test-app/LeopardTestApp/e2e/starter.test.js @@ -16,7 +16,7 @@ describe('Leopard', () => { .not.toExist() .withTimeout(12 * 60 * 1000); - const numTestCases = testData.tests.parameters.length; + const numTestCases = testData.tests.language_tests.length + testData.tests.diarization_tests.length; for (let i = 0; i < numTestCases; i += 1) { await waitFor(element(by.id('testResult')).atIndex(i)) .toExist() diff --git a/binding/react-native/test-app/LeopardTestApp/ios/LeopardTestApp.xcodeproj/project.pbxproj b/binding/react-native/test-app/LeopardTestApp/ios/LeopardTestApp.xcodeproj/project.pbxproj index 1cba29d5..c67596c9 100644 --- a/binding/react-native/test-app/LeopardTestApp/ios/LeopardTestApp.xcodeproj/project.pbxproj +++ b/binding/react-native/test-app/LeopardTestApp/ios/LeopardTestApp.xcodeproj/project.pbxproj @@ -442,7 +442,7 @@ "$(inherited)", ); INFOPLIST_FILE = LeopardTestAppTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -466,7 +466,7 @@ BUNDLE_LOADER = "$(TEST_HOST)"; COPY_PHASE_STRIP = NO; INFOPLIST_FILE = LeopardTestAppTests/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( "$(inherited)", "@executable_path/Frameworks", @@ -584,7 +584,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", @@ -649,7 +649,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 12.4; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = ( /usr/lib/swift, "$(inherited)", diff --git a/binding/react-native/test-app/LeopardTestApp/ios/Podfile b/binding/react-native/test-app/LeopardTestApp/ios/Podfile index 4e874378..ef3c1510 100644 --- a/binding/react-native/test-app/LeopardTestApp/ios/Podfile +++ b/binding/react-native/test-app/LeopardTestApp/ios/Podfile @@ -1,7 +1,7 @@ require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' -platform :ios, min_ios_version_supported +platform :ios, '13.0' prepare_react_native_project! flipper_config = ENV['NO_FLIPPER'] == "1" ? FlipperConfiguration.disabled : FlipperConfiguration.enabled @@ -14,6 +14,7 @@ end target 'LeopardTestApp' do config = use_native_modules! + pod 'Leopard-iOS', '~> 2.0.0' # Flags change depending on the env values. flags = get_default_flags() diff --git a/binding/react-native/test-app/LeopardTestApp/ios/Podfile.lock b/binding/react-native/test-app/LeopardTestApp/ios/Podfile.lock index add1a43c..52aeeade 100644 --- a/binding/react-native/test-app/LeopardTestApp/ios/Podfile.lock +++ b/binding/react-native/test-app/LeopardTestApp/ios/Podfile.lock @@ -76,9 +76,10 @@ PODS: - hermes-engine (0.71.0): - hermes-engine/Pre-built (= 0.71.0) - hermes-engine/Pre-built (0.71.0) - - Leopard-iOS (1.2.0) - - leopard-react-native (1.2.0): - - Leopard-iOS (~> 1.2.0) + - ios-voice-processor (1.1.0) + - Leopard-iOS (2.0.0) + - leopard-react-native (2.0.0): + - Leopard-iOS (~> 2.0.0) - React - libevent (2.1.12) - OpenSSL-Universal (1.1.1100) @@ -301,7 +302,8 @@ PODS: - React-jsinspector (0.71.0) - React-logger (0.71.0): - glog - - react-native-voice-processor (1.1.0): + - react-native-voice-processor (1.2.0): + - ios-voice-processor (~> 1.1.0) - React-Core - React-perflogger (0.71.0) - React-RCTActionSheet (0.71.0): @@ -386,7 +388,7 @@ PODS: - React-perflogger (= 0.71.0) - RNFS (2.20.0): - React-Core - - SocketRocket (0.6.0) + - SocketRocket (0.6.1) - Yoga (1.14.0) - YogaKit (1.18.1): - Yoga (~> 1.14) @@ -419,6 +421,7 @@ DEPENDENCIES: - FlipperKit/SKIOSNetworkPlugin (= 0.125.0) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) - hermes-engine (from `../node_modules/react-native/sdks/hermes-engine/hermes-engine.podspec`) + - Leopard-iOS (~> 2.0.0) - "leopard-react-native (from `../node_modules/@picovoice/leopard-react-native`)" - libevent (~> 2.1.12) - OpenSSL-Universal (= 1.1.1100) @@ -468,6 +471,7 @@ SPEC REPOS: - Flipper-RSocket - FlipperKit - fmt + - ios-voice-processor - Leopard-iOS - libevent - OpenSSL-Universal @@ -568,8 +572,9 @@ SPEC CHECKSUMS: fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 04b94705f318337d7ead9e6d17c019bd9b1f6b1b hermes-engine: f6e715aa6c8bd38de6c13bc85e07b0a337edaa89 - Leopard-iOS: 993bdc6fbdaabfdaa0ddc5def9bd4405abb59bef - leopard-react-native: 4d82b25e1c7d3a924b5626691e955cac38326d43 + ios-voice-processor: 8e32d7f980a06d392d128ef1cd19cf6ddcaca3c1 + Leopard-iOS: ba60cf23fb79ffc01bbefbbd4e063cb2a102f352 + leopard-react-native: b49c92e652221204b081795393f208e994030d95 libevent: 4049cae6c81cdb3654a443be001fb9bdceff7913 OpenSSL-Universal: ebc357f1e6bc71fa463ccb2fe676756aff50e88c RCT-Folly: 424b8c9a7a0b9ab2886ffe9c3b041ef628fd4fb1 @@ -586,7 +591,7 @@ SPEC CHECKSUMS: React-jsiexecutor: 060dd495f1e2af3d87216f7ca8a94c55ec885b4f React-jsinspector: 5061fcbec93fd672183dfb39cc2f65e55a0835db React-logger: a6c0b3a807a8e81f6d7fea2e72660766f55daa50 - react-native-voice-processor: 3d396bfd42d11ee270bf292ce7cc935ea62d4cae + react-native-voice-processor: aefb0845641c7d67dd47e69606ba7ebb38aab5cd React-perflogger: e5fc4149e9bbb972b8520277f3b23141faa47a36 React-RCTActionSheet: 991de88216bf03ab9bb1d213d73c62ecbe64ade7 React-RCTAnimation: b74e3d1bf5280891a573e447b487fa1db0713b5b @@ -601,10 +606,10 @@ SPEC CHECKSUMS: React-runtimeexecutor: ac80782d9d76ba2b0f709f4de0c427fe33c352dc ReactCommon: 20e38a9be5fe1341b5e422220877cc94034776ba RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 - SocketRocket: fccef3f9c5cedea1353a9ef6ada904fde10d6608 + SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 Yoga: c618b544ff8bd8865cdca602f00cbcdb92fd6d31 YogaKit: f782866e155069a2cca2517aafea43200b01fd5a -PODFILE CHECKSUM: 1855e2a7e7f949ac1bbd508ca89efb85a668f6a6 +PODFILE CHECKSUM: c4f0e13670b7a91f74cbc863e9197fa1fcd6c3ca -COCOAPODS: 1.11.2 +COCOAPODS: 1.11.3 diff --git a/binding/react-native/test-app/LeopardTestApp/package.json b/binding/react-native/test-app/LeopardTestApp/package.json index 3129983e..e531a69f 100644 --- a/binding/react-native/test-app/LeopardTestApp/package.json +++ b/binding/react-native/test-app/LeopardTestApp/package.json @@ -11,7 +11,7 @@ }, "dependencies": { "@picovoice/leopard-react-native": "file:../..", - "@picovoice/react-native-voice-processor": "^1.1.0", + "@picovoice/react-native-voice-processor": "~1.2.0", "base-64": "^1.0.0", "react": "18.2.0", "react-native": "0.71.0", diff --git a/binding/react-native/test-app/LeopardTestApp/yarn.lock b/binding/react-native/test-app/LeopardTestApp/yarn.lock index c5da3cda..5048486d 100644 --- a/binding/react-native/test-app/LeopardTestApp/yarn.lock +++ b/binding/react-native/test-app/LeopardTestApp/yarn.lock @@ -1442,12 +1442,12 @@ fastq "^1.6.0" "@picovoice/leopard-react-native@file:../..": - version "1.2.0" + version "2.0.0" -"@picovoice/react-native-voice-processor@^1.1.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@picovoice/react-native-voice-processor/-/react-native-voice-processor-1.1.0.tgz#fe469f990c3b031411b585f28fc80fc0a9b9de41" - integrity sha512-TzIYL/34VbYhIcKH/LbivZwRpxUiKr4+XW5Gcp8vFdZKGP431SP4Lob2hLhSIu+E/yo1z4xwCELCznMpHyWNhg== +"@picovoice/react-native-voice-processor@~1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@picovoice/react-native-voice-processor/-/react-native-voice-processor-1.2.0.tgz#82a98b41d9236ababe330dae873062ee0e1b24c3" + integrity sha512-zolTEo3qsqeUwY7JRslV/yhiA+oBrkeogOTxjHIEJ//yEsr7YKlI1PcqTbU5/xjmUiukh62gmwTXhosnQYdasQ== "@react-native-community/cli-clean@^10.0.0": version "10.1.1" diff --git a/binding/react-native/yarn.lock b/binding/react-native/yarn.lock index 2b87fd17..d301e920 100644 --- a/binding/react-native/yarn.lock +++ b/binding/react-native/yarn.lock @@ -2,307 +2,300 @@ # yarn lockfile v1 -"@ampproject/remapping@^2.1.0": - version "2.2.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" - integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w== +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.1.tgz#99e8e11851128b8702cd57c33684f1d0f260b630" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== dependencies: - "@jridgewell/gen-mapping" "^0.1.0" + "@jridgewell/gen-mapping" "^0.3.0" "@jridgewell/trace-mapping" "^0.3.9" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" - integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.22.13.tgz#e3c1c099402598483b7a8c46a721d1038803755e" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== dependencies: - "@babel/highlight" "^7.18.6" + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" -"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.20.0", "@babel/compat-data@^7.20.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.5.tgz#86f172690b093373a933223b4745deeb6049e733" - integrity sha512-KZXo2t10+/jxmkhNXc7pZTqRvSOIvVv/+lJwHS+B2rErwOyjuVRh60yVpb7liQ1U5t7lLJ1bz+t8tSypUZdm0g== +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.3.tgz#3febd552541e62b5e883a25eb3effd7c7379db11" + integrity sha512-BmR4bWbDIoFJmJ9z2cZ8Gmm2MXgEDgjdWgpKmKWUt54UGFJdlj31ECtbaDvCG/qVdG3AQ1SfpZEs01lUFbzLOQ== "@babel/core@^7.1.0", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.14.0", "@babel/core@^7.18.5", "@babel/core@^7.7.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.5.tgz#45e2114dc6cd4ab167f81daf7820e8fa1250d113" - integrity sha512-UdOWmk4pNWTm/4DlPUl/Pt4Gz4rcEMb7CY0Y3eJl5Yz1vI8ZJGmHWaVE55LoxRjdpx0z259GE9U5STA9atUinQ== - dependencies: - "@ampproject/remapping" "^2.1.0" - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-module-transforms" "^7.20.2" - "@babel/helpers" "^7.20.5" - "@babel/parser" "^7.20.5" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - convert-source-map "^1.7.0" + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.3.tgz#5ec09c8803b91f51cc887dedc2654a35852849c9" + integrity sha512-Jg+msLuNuCJDyBvFv5+OKOUjWMZgd85bKjbICd3zWrKAo+bJ49HJufi7CQE0q0uR8NGyO6xkCACScNqyjHSZew== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helpers" "^7.23.2" + "@babel/parser" "^7.23.3" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.3" + "@babel/types" "^7.23.3" + convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" - semver "^6.3.0" + json5 "^2.2.3" + semver "^6.3.1" "@babel/eslint-parser@^7.18.2": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4" - integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz#7bf0db1c53b54da0c8a12627373554a0828479ca" + integrity sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" - semver "^6.3.0" + semver "^6.3.1" -"@babel/generator@^7.14.0", "@babel/generator@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.5.tgz#cb25abee3178adf58d6814b68517c62bdbfdda95" - integrity sha512-jl7JY2Ykn9S0yj4DQP82sYvPU+T3g0HFcWTqDLqiuA9tGRNIj9VfbtXGAYTTkyNEnQk1jkMGOdYka8aG/lulCA== +"@babel/generator@^7.14.0", "@babel/generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.3.tgz#86e6e83d95903fbe7613f448613b8b319f330a8e" + integrity sha512-keeZWAV4LU3tW0qRi19HRpabC/ilM0HRBBzf9/k8FFiG4KVpiv0FIy4hHfLfFQZNhziCTPTmd59zoyv6DNISzg== dependencies: - "@babel/types" "^7.20.5" + "@babel/types" "^7.23.3" "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" jsesc "^2.5.1" -"@babel/helper-annotate-as-pure@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" - integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz#acd4edfd7a566d1d51ea975dff38fd52906981bb" - integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw== +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz#e7f06737b197d580a01edf75d97e2c8be99d3882" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== dependencies: - "@babel/helper-explode-assignable-expression" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/types" "^7.22.5" -"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.0.tgz#6bf5374d424e1b3922822f1d9bdaa43b1a139d0a" - integrity sha512-0jp//vDGp9e8hZzBc6N/KwA5ZK3Wsm/pfm4CrY7vzegkVxc65SgSn6wYOnwHe9Js9HRQ1YTCKLGPzDtaS3RoLQ== +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== dependencies: - "@babel/compat-data" "^7.20.0" - "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.21.3" - semver "^6.3.0" + "@babel/types" "^7.22.15" -"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.20.2", "@babel/helper-create-class-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.20.5.tgz#327154eedfb12e977baa4ecc72e5806720a85a06" - integrity sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww== +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-replace-supers" "^7.19.1" - "@babel/helper-split-export-declaration" "^7.18.6" - -"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.20.5.tgz#5ea79b59962a09ec2acf20a963a01ab4d076ccca" - integrity sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - regexpu-core "^5.2.1" - -"@babel/helper-define-polyfill-provider@^0.3.3": - version "0.3.3" - resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz#8612e55be5d51f0cd1f36b4a5a83924e89884b7a" - integrity sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww== + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.3": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.3.tgz#a71c10f7146d809f4a256c373f462d9bba8cf6ba" + integrity sha512-WBrLmuPP47n7PNwsZ57pqam6G/RGo1vw/87b0Blc53tZNGZ4x7YvZ6HgQe2vo1W/FR20OgjeZuGXzudPiXHFug== dependencies: - "@babel/helper-compilation-targets" "^7.17.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" debug "^4.1.1" lodash.debounce "^4.0.8" resolve "^1.14.2" - semver "^6.1.2" -"@babel/helper-environment-visitor@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz#0c0cee9b35d2ca190478756865bb3528422f51be" - integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg== +"@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" + integrity sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA== -"@babel/helper-explode-assignable-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz#41f8228ef0a6f1a036b8dfdfec7ce94f9a6bc096" - integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg== +"@babel/helper-function-name@^7.22.5", "@babel/helper-function-name@^7.23.0": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz#1f9a3cdbd5b2698a670c30d2735f9af95ed52759" + integrity sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw== dependencies: - "@babel/types" "^7.18.6" + "@babel/template" "^7.22.15" + "@babel/types" "^7.23.0" -"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" - integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz#c01a007dac05c085914e8fb652b339db50d823bb" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== dependencies: - "@babel/template" "^7.18.10" - "@babel/types" "^7.19.0" + "@babel/types" "^7.22.5" -"@babel/helper-hoist-variables@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" - integrity sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q== +"@babel/helper-member-expression-to-functions@^7.22.15": + version "7.23.0" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366" + integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.23.0" + +"@babel/helper-module-imports@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz#16146307acdc40cc00c3b2c647713076464bdbf0" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" -"@babel/helper-member-expression-to-functions@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz#1531661e8375af843ad37ac692c132841e2fd815" - integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg== +"@babel/helper-module-transforms@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1" + integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz#f21531a9ccbff644fdd156b4077c16ff0c3f609e" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz#dd7ee3735e8a313b9f7b05a773d892e88e6d7295" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz#7b68e1cb4fa964d2996fd063723fb48eca8498e0" + integrity sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-wrap-function" "^7.22.20" + +"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.9": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793" + integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz#4938357dc7d782b80ed6dbb03a0fba3d22b1d5de" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz#007f15240b5751c537c40e77abb4e89eeaaa8847" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz#322c61b7310c0997fe4c323955667f18fcefb91c" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz#c4ae002c61d2879e724581d96665583dbc1dc0e0" + integrity sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helper-wrap-function@^7.22.20": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569" + integrity sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.15" + "@babel/types" "^7.22.19" + +"@babel/helpers@^7.23.2": + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767" + integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ== dependencies: - "@babel/types" "^7.18.9" - -"@babel/helper-module-imports@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz#1e3ebdbbd08aad1437b428c50204db13c5a3ca6e" - integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.6", "@babel/helper-module-transforms@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.2.tgz#ac53da669501edd37e658602a21ba14c08748712" - integrity sha512-zvBKyJXRbmK07XhMuujYoJ48B5yvvmM6+wcpv6Ivj4Yg6qO7NOZOSnvZN9CRl1zz1Z4cKf8YejmCMh8clOoOeA== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.20.2" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.19.1" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.1" - "@babel/types" "^7.20.2" - -"@babel/helper-optimise-call-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz#9369aa943ee7da47edab2cb4e838acf09d290ffe" - integrity sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" - integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== - -"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz#997458a0e3357080e54e1d79ec347f8a8cd28519" - integrity sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA== - dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-wrap-function" "^7.18.9" - "@babel/types" "^7.18.9" - -"@babel/helper-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz#e1592a9b4b368aa6bdb8784a711e0bcbf0612b78" - integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw== - dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-member-expression-to-functions" "^7.18.9" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/traverse" "^7.19.1" - "@babel/types" "^7.19.0" - -"@babel/helper-simple-access@^7.19.4", "@babel/helper-simple-access@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" - integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== - dependencies: - "@babel/types" "^7.20.2" - -"@babel/helper-skip-transparent-expression-wrappers@^7.18.9": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz#fbe4c52f60518cab8140d77101f0e63a8a230684" - integrity sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg== - dependencies: - "@babel/types" "^7.20.0" - -"@babel/helper-split-export-declaration@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz#7367949bc75b20c6d5a5d4a97bba2824ae8ef075" - integrity sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA== - dependencies: - "@babel/types" "^7.18.6" - -"@babel/helper-string-parser@^7.19.4": - version "7.19.4" - resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" - integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== - -"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": - version "7.19.1" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" - integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== - -"@babel/helper-validator-option@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" - integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== - -"@babel/helper-wrap-function@^7.18.9": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz#75e2d84d499a0ab3b31c33bcfe59d6b8a45f62e3" - integrity sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q== - dependencies: - "@babel/helper-function-name" "^7.19.0" - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/helpers@^7.20.5": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.6.tgz#e64778046b70e04779dfbdf924e7ebb45992c763" - integrity sha512-Pf/OjgfgFRW5bApskEz5pvidpim7tEDPlFtKcNRXWmfHGn9IEI2W2flqRQXTFb7gIPTyK++N6rVHuwKut4XK6w== - dependencies: - "@babel/template" "^7.18.10" - "@babel/traverse" "^7.20.5" - "@babel/types" "^7.20.5" - -"@babel/highlight@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" - integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" - chalk "^2.0.0" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.23.2" + "@babel/types" "^7.23.0" + +"@babel/highlight@^7.22.13": + version "7.22.20" + resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.22.20.tgz#4ca92b71d80554b01427815e06f2df965b9c1f54" + integrity sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg== + dependencies: + "@babel/helper-validator-identifier" "^7.22.20" + chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.18.10", "@babel/parser@^7.20.5": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.5.tgz#7f3c7335fe417665d929f34ae5dceae4c04015e8" - integrity sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA== +"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.3.tgz#0ce0be31a4ca4f1884b5786057cadcb6c3be58f9" + integrity sha512-uVsWNvlVsIninV2prNz/3lHCb+5CJ+e+IUBfbjToAHODtfGYLfCFuY4AU7TskI+dAKk+njsPiBjq1gKTvZOBaw== -"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz#da5b8f9a580acdfbe53494dba45ea389fb09a4d2" - integrity sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ== +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" + integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz#a11af19aa373d68d561f08e0a57242350ed0ec50" - integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg== +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d" + integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.23.3" -"@babel/plugin-proposal-async-generator-functions@^7.20.1": - version "7.20.1" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.1.tgz#352f02baa5d69f4e7529bdac39aaa02d41146af9" - integrity sha512-Gh5rchzSwE4kC+o/6T8waD0WHEQIsDmjltY8WnWRXHUdH8axZhuH86Ov9M72YhJfDrZseQwuuWaaIT/TmePp3g== +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz#20c60d4639d18f7da8602548512e9d3a4c8d7098" + integrity sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w== dependencies: - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-remap-async-to-generator" "^7.18.9" - "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.17.12", "@babel/plugin-proposal-class-properties@^7.18.6": +"@babel/plugin-proposal-class-properties@^7.0.0", "@babel/plugin-proposal-class-properties@^7.13.0", "@babel/plugin-proposal-class-properties@^7.17.12": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3" integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== @@ -310,56 +303,15 @@ "@babel/helper-create-class-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-proposal-class-static-block@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz#8aa81d403ab72d3962fc06c26e222dacfc9b9020" - integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - -"@babel/plugin-proposal-dynamic-import@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz#72bcf8d408799f547d759298c3c27c7e7faa4d94" - integrity sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-proposal-export-default-from@^7.0.0": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.18.10.tgz#091f4794dbce4027c03cf4ebc64d3fb96b75c206" - integrity sha512-5H2N3R2aQFxkV4PIBUR/i7PUSwgTZjouJKzI8eKswfIjT0PhvzkPn0t0wIS5zn6maQuvtT0t1oHtMUz61LOuow== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-default-from" "^7.18.6" - -"@babel/plugin-proposal-export-namespace-from@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz#5f7313ab348cdb19d590145f9247540e94761203" - integrity sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.23.3.tgz#6f511a676c540ccc8d17a8553dbba9230b0ddac0" + integrity sha512-Q23MpLZfSGZL1kU7fWqV262q65svLSCIP5kZ/JCW/rKTCm/FrLjpvEd2kfUYMVeHh4QhV/xzyoRAHWrAZJrE3Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-default-from" "^7.23.3" -"@babel/plugin-proposal-json-strings@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz#7e8788c1811c393aff762817e7dbf1ebd0c05f0b" - integrity sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ== - dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-json-strings" "^7.8.3" - -"@babel/plugin-proposal-logical-assignment-operators@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz#8148cbb350483bf6220af06fa6db3690e14b2e23" - integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - -"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8", "@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6": +"@babel/plugin-proposal-nullish-coalescing-operator@^7.0.0", "@babel/plugin-proposal-nullish-coalescing-operator@^7.13.8": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz#fdd940a99a740e577d6c753ab6fbb43fdb9467e1" integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== @@ -367,26 +319,18 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" -"@babel/plugin-proposal-numeric-separator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz#899b14fbafe87f053d2c5ff05b36029c62e13c75" - integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== +"@babel/plugin-proposal-object-rest-spread@^7.0.0": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - -"@babel/plugin-proposal-object-rest-spread@^7.0.0", "@babel/plugin-proposal-object-rest-spread@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.2.tgz#a556f59d555f06961df1e572bb5eca864c84022d" - integrity sha512-Ks6uej9WFK+fvIMesSqbAto5dD8Dz4VuuFvGJFKgIGSkJuRGcrwGECPA1fDgQK3/DbExBJpEkTeYeB8geIFCSQ== - dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" "@babel/helper-plugin-utils" "^7.20.2" "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-transform-parameters" "^7.20.1" + "@babel/plugin-transform-parameters" "^7.20.7" -"@babel/plugin-proposal-optional-catch-binding@^7.0.0", "@babel/plugin-proposal-optional-catch-binding@^7.18.6": +"@babel/plugin-proposal-optional-catch-binding@^7.0.0": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz#f9400d0e6a3ea93ba9ef70b09e72dd6da638a2cb" integrity sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw== @@ -394,40 +338,19 @@ "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12", "@babel/plugin-proposal-optional-chaining@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz#e8e8fe0723f2563960e4bf5e9690933691915993" - integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w== - dependencies: - "@babel/helper-plugin-utils" "^7.18.9" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - -"@babel/plugin-proposal-private-methods@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea" - integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== - dependencies: - "@babel/helper-create-class-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - -"@babel/plugin-proposal-private-property-in-object@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.20.5.tgz#309c7668f2263f1c711aa399b5a9a6291eef6135" - integrity sha512-Vq7b9dUA12ByzB4EjQTPo25sFhY+08pQDBSZRtUAkj7lb7jahaHR5igera16QZ+3my1nYR4dKsNdYj5IjPHilQ== +"@babel/plugin-proposal-optional-chaining@^7.0.0", "@babel/plugin-proposal-optional-chaining@^7.13.12": + version "7.21.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz#886f5c8978deb7d30f678b2e24346b287234d3ea" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-create-class-features-plugin" "^7.20.5" "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz#af613d2cd5e643643b65cded64207b15c85cb78e" - integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== - dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== "@babel/plugin-syntax-async-generators@^7.8.4": version "7.8.4" @@ -464,12 +387,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.18.6.tgz#8df076711a4818c4ce4f23e61d622b0ba2ff84bc" - integrity sha512-Kr//z3ujSVNx6E9z9ih5xXXMqK07VVTuqPmqGe6Mss/zW5XPeLZeSDZoP9ab/hT4wPKqAgjl2PnhPrcpk8Seew== +"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.23.3.tgz#7e6d4bf595d5724230200fb2b7401d4734b15335" + integrity sha512-KeENO5ck1IeZ/l2lFZNy+mpobV3D2Zy5C1YFnWm+YuY5mQiAWc4yAp13dqgguwsBsFVLh4LPCEqCa5qW13N+hw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-export-namespace-from@^7.8.3": version "7.8.3" @@ -478,21 +401,28 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.3" -"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.18.6", "@babel/plugin-syntax-flow@^7.2.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.18.6.tgz#774d825256f2379d06139be0c723c4dd444f3ca1" - integrity sha512-LUbR+KNTBWCUAqRG9ex5Gnzu2IOkt8jRJbHHXFT9q+L9zm7M/QQbEqXyw1n1pohYvOyWC8CjeyjrSaIwiYjK7A== +"@babel/plugin-syntax-flow@^7.0.0", "@babel/plugin-syntax-flow@^7.2.0", "@babel/plugin-syntax-flow@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz#084564e0f3cc21ea6c70c44cff984a1c0509729a" + integrity sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-assertions@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz#bb50e0d4bea0957235390641209394e87bdb9cc4" - integrity sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ== +"@babel/plugin-syntax-import-assertions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc" + integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-syntax-import-meta@^7.8.3": +"@babel/plugin-syntax-import-attributes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06" + integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51" integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== @@ -506,12 +436,12 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" - integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== +"@babel/plugin-syntax-jsx@^7.0.0", "@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz#8f2e4f8a9b5f9aa16067e142c1ac9cd9f810f473" + integrity sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" @@ -569,378 +499,514 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.20.0": - version "7.20.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.20.0.tgz#4e9a0cfc769c85689b77a2e642d24e9f697fc8c7" - integrity sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ== +"@babel/plugin-syntax-typescript@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz#24f460c85dbbc983cd2b9c4994178bcc01df958f" + integrity sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.18.6": +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz#19063fcf8771ec7b31d742339dac62433d0611fe" - integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ== + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz#ccda3d1ab9d5ced5265fdb13f1882d5476c71615" - integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag== +"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b" + integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ== dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-remap-async-to-generator" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz#9187bf4ba302635b9d70d986ad70f038726216a8" - integrity sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ== +"@babel/plugin-transform-async-generator-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.3.tgz#9df2627bad7f434ed13eef3e61b2b65cafd4885b" + integrity sha512-59GsVNavGxAXCDDbakWSMJhajASb4kBCqDjqJsv+p5nKdbz7istmZ3HrX3L2LuiI80+zsOADCvooqQH3qGCucQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" + "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.20.2": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.20.5.tgz#401215f9dc13dc5262940e2e527c9536b3d7f237" - integrity sha512-WvpEIW9Cbj9ApF3yJCjIEEf1EiNJLtXagOrL5LNWEZOo3jv8pmPoYTSNJQvqej8OavVlgOoOPw6/htGZro6IkA== +"@babel/plugin-transform-async-to-generator@^7.0.0", "@babel/plugin-transform-async-to-generator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa" + integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.20" -"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.20.2.tgz#c0033cf1916ccf78202d04be4281d161f6709bb2" - integrity sha512-9rbPp0lCVVoagvtEyQKSo5L8oo0nQS/iif+lwlAz29MccX2642vWDlSZK+2T2buxbopotId2ld7zZAzRfz9j1g== +"@babel/plugin-transform-block-scoped-functions@^7.0.0", "@babel/plugin-transform-block-scoped-functions@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77" + integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-optimise-call-expression" "^7.18.6" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-replace-supers" "^7.19.1" - "@babel/helper-split-export-declaration" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.3.tgz#e99a3ff08f58edd28a8ed82481df76925a4ffca7" + integrity sha512-QPZxHrThbQia7UdvfpaRRlq/J9ciz1J4go0k+lPBXbgaNeY7IQrBj/9ceWjvMMI07/ZBzHl/F0R/2K0qH7jCVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48" + integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.3.tgz#56f2371c7e5bf6ff964d84c5dc4d4db5536b5159" + integrity sha512-PENDVxdr7ZxKPyi5Ffc0LjXdnJyrJxyqF5T5YjlVg4a0VFfQHW0r8iAtRiDXkfHlu1wwcvdtnndGYIeJLSuRMQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.3.tgz#73380c632c095b03e8503c24fd38f95ad41ffacb" + integrity sha512-FGEQmugvAEu2QtgtU0uTASXevfLMFfBeVCIIdcQhn/uBQsMTjBajdnAtanQlOcuihWh10PZ7+HWvc7NtBwP74w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" -"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz#2357a8224d402dad623caf6259b611e56aec746e" - integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw== +"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" + integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.15" -"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.20.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.20.2.tgz#c23741cfa44ddd35f5e53896e88c75331b8b2792" - integrity sha512-mENM+ZHrvEgxLTBXUiQ621rRXZes3KWUv6NdQlrnr1TkWVw+hUjQBZuP2X32qKlrlG2BzgR95gkuCRSkJl8vIw== +"@babel/plugin-transform-destructuring@^7.0.0", "@babel/plugin-transform-destructuring@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311" + integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz#b286b3e7aae6c7b861e45bed0a2fafd6b1a4fef8" - integrity sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg== +"@babel/plugin-transform-dotall-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50" + integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-duplicate-keys@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz#687f15ee3cdad6d85191eb2a372c4528eaa0ae0e" - integrity sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw== +"@babel/plugin-transform-duplicate-keys@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce" + integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-exponentiation-operator@^7.0.0", "@babel/plugin-transform-exponentiation-operator@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz#421c705f4521888c65e91fdd1af951bfefd4dacd" - integrity sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw== +"@babel/plugin-transform-dynamic-import@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.3.tgz#82625924da9ed5fb11a428efb02e43bc9a3ab13e" + integrity sha512-vTG+cTGxPFou12Rj7ll+eD5yWeNl5/8xvQvF08y5Gv3v4mZQoyFf8/n9zg4q5vvCWt5jmgymfzMAldO7orBn7A== dependencies: - "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" -"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.19.0.tgz#e9e8606633287488216028719638cbbb2f2dde8f" - integrity sha512-sgeMlNaQVbCSpgLSKP4ZZKfsJVnFnNQlUSk6gPYzR/q7tzCgQF2t8RBKAP6cKJeZdveei7Q7Jm527xepI8lNLg== +"@babel/plugin-transform-exponentiation-operator@^7.0.0", "@babel/plugin-transform-exponentiation-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18" + integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-flow" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz#6ef8a50b244eb6a0bdbad0c7c61877e4e30097c1" - integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ== +"@babel/plugin-transform-export-namespace-from@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.3.tgz#dcd066d995f6ac6077e5a4ccb68322a01e23ac49" + integrity sha512-yCLhW34wpJWRdTxxWtFZASJisihrfyMOTOQexhVzA78jlU+dH7Dw+zQgcPepQ5F3C6bAIiblZZ+qBggJdHiBAg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" -"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz#cc354f8234e62968946c61a46d6365440fc764e0" - integrity sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ== +"@babel/plugin-transform-flow-strip-types@^7.0.0", "@babel/plugin-transform-flow-strip-types@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz#cfa7ca159cc3306fab526fc67091556b51af26ff" + integrity sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q== dependencies: - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.23.3" -"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz#72796fdbef80e56fba3c6a699d54f0de557444bc" - integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg== +"@babel/plugin-transform-for-of@^7.0.0", "@babel/plugin-transform-for-of@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.3.tgz#afe115ff0fbce735e02868d41489093c63e15559" + integrity sha512-X8jSm8X1CMwxmK878qsUGJRmbysKNbdpTv/O1/v0LuY/ZkZrng5WYiekYSdg9m09OTmDDUWeEDsTE+17WYbAZw== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz#ac9fdc1a118620ac49b7e7a5d2dc177a1bfee88e" - integrity sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA== +"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc" + integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-amd@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz#aca391801ae55d19c4d8d2ebfeaa33df5f2a2cbd" - integrity sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg== +"@babel/plugin-transform-json-strings@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.3.tgz#489724ab7d3918a4329afb4172b2fd2cf3c8d245" + integrity sha512-H9Ej2OiISIZowZHaBwF0tsJOih1PftXJtE8EWqlEIwpc7LMTGq0rPOrywKLQ4nefzx8/HMR0D3JGXoMHYvhi0A== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" -"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz#25b32feef24df8038fc1ec56038917eacb0b730c" - integrity sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ== +"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4" + integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ== dependencies: - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-simple-access" "^7.19.4" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.19.6": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz#59e2a84064b5736a4471b1aa7b13d4431d327e0d" - integrity sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ== +"@babel/plugin-transform-logical-assignment-operators@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.3.tgz#3a406d6083feb9487083bca6d2334a3c9b6c4808" + integrity sha512-+pD5ZbxofyOygEp+zZAfujY2ShNCXRpDRIPOiBmTO693hhyOEteZgl876Xs9SAHPQpcV0vz8LvA/T+w8AzyX8A== dependencies: - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-module-transforms" "^7.19.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" -"@babel/plugin-transform-modules-umd@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz#81d3832d6034b75b54e62821ba58f28ed0aab4b9" - integrity sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ== +"@babel/plugin-transform-member-expression-literals@^7.0.0", "@babel/plugin-transform-member-expression-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc" + integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag== dependencies: - "@babel/helper-module-transforms" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz#626298dd62ea51d452c3be58b285d23195ba69a8" - integrity sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA== +"@babel/plugin-transform-modules-amd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d" + integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.20.5" - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-new-target@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz#d128f376ae200477f37c4ddfcc722a8a1b3246a8" - integrity sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw== +"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4" + integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" + integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + +"@babel/plugin-transform-modules-umd@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" + integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg== + dependencies: + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz#67fe18ee8ce02d57c855185e27e3dc959b2e991f" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980" + integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.3.tgz#8a613d514b521b640344ed7c56afeff52f9413f8" + integrity sha512-xzg24Lnld4DYIdysyf07zJ1P+iIfJpxtVFOzX4g+bsJ3Ng5Le7rXx9KwqKzuyaUeRnt+I1EICwQITqc0E2PmpA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.3.tgz#2f8da42b75ba89e5cfcd677afd0856d52c0c2e68" + integrity sha512-s9GO7fIBi/BLsZ0v3Rftr6Oe4t0ctJ8h4CCXfPoEJwmvAPMyNrfkOOJzm6b9PX9YXcCJWWQd/sBF/N26eBiMVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" "@babel/plugin-transform-object-assign@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.18.6.tgz#7830b4b6f83e1374a5afb9f6111bcfaea872cdd2" - integrity sha512-mQisZ3JfqWh2gVXvfqYCAAyRs6+7oev+myBsTwW5RnPhYXOTuCEw2oe3YgxlXMViXUS53lG8koulI7mJ+8JE+A== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-assign/-/plugin-transform-object-assign-7.23.3.tgz#64177e8cf943460c7f0e1c410277546804f59625" + integrity sha512-TPJ6O7gVC2rlQH2hvQGRH273G1xdoloCj9Pc07Q7JbIZYDi+Sv5gaE2fu+r5E7qK4zyt6vj0FbZaZTRU5C3OMA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz#fb3c6ccdd15939b6ff7939944b51971ddc35912c" - integrity sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA== +"@babel/plugin-transform-object-rest-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.3.tgz#509373753b5f7202fe1940e92fd075bd7874955f" + integrity sha512-VxHt0ANkDmu8TANdE9Kc0rndo/ccsmfe2Cx2y5sI4hu3AukHQ5wAu4cM7j3ba8B9548ijVyclBU+nuDQftZsog== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-replace-supers" "^7.18.6" + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.23.3" -"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.1": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.20.5.tgz#f8f9186c681d10c3de7620c916156d893c8a019e" - integrity sha512-h7plkOmcndIUWXZFLgpbrh2+fXAi47zcUX7IrOQuZdLD0I0KvjJ6cvo3BEcAOsDOcZhVKGJqv07mkSqK0y2isQ== +"@babel/plugin-transform-object-super@^7.0.0", "@babel/plugin-transform-object-super@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd" + integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" -"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz#e22498903a483448e94e032e9bbb9c5ccbfc93a3" - integrity sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg== +"@babel/plugin-transform-optional-catch-binding@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.3.tgz#362c0b545ee9e5b0fa9d9e6fe77acf9d4c480027" + integrity sha512-LxYSb0iLjUamfm7f1D7GpiS4j0UAC8AOiehnsGAP8BEsIX8EOi3qV6bbctw8M7ZvLtcoZfZX5Z7rN9PlWk0m5A== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" -"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" - integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== +"@babel/plugin-transform-optional-chaining@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.3.tgz#92fc83f54aa3adc34288933fa27e54c13113f4be" + integrity sha512-zvL8vIfIUgMccIAK1lxjvNv572JHFJIKb4MWBz5OGdBQA0fB0Xluix5rmOby48exiJc987neOmP/m9Fnpkz3Tg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" -"@babel/plugin-transform-react-jsx-development@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" - integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== +"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af" + integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4" + integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g== dependencies: - "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.3.tgz#5cd34a2ce6f2d008cc8f91d8dcc29e2c41466da6" + integrity sha512-a5m2oLNFyje2e/rGKjVfAELTVI5mbA0FeZpBnkOWWV7eSmKQ+T/XW0Vf+29ScLzSxX+rnsarvU0oie/4m6hkxA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.0.0", "@babel/plugin-transform-property-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875" + integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200" + integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz#e716b6edbef972a92165cd69d92f1255f7e73e87" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" "@babel/plugin-transform-react-jsx-self@^7.0.0": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.18.6.tgz#3849401bab7ae8ffa1e3e5687c94a753fc75bda7" - integrity sha512-A0LQGx4+4Jv7u/tWzoJF7alZwnBDQd6cGLh9P+Ttk4dpiL+J5p7NSNv/9tlEFFJDq3kjxOavWmbm6t0Gk+A3Ig== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz#ed3e7dadde046cce761a8e3cf003a13d1a7972d9" + integrity sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-react-jsx-source@^7.0.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.19.6.tgz#88578ae8331e5887e8ce28e4c9dc83fb29da0b86" - integrity sha512-RpAi004QyMNisst/pvSanoRdJ4q+jMCWyk9zdw/CyLB9j8RXEahodR6l2GyttDRyEVWZtbN+TpLiHJ3t34LbsQ== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz#03527006bdc8775247a78643c51d4e715fe39a3e" + integrity sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.18.6": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.19.0.tgz#b3cbb7c3a00b92ec8ae1027910e331ba5c500eb9" - integrity sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg== +"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz#7e6266d88705d7c49f11c98db8b9464531289cd6" + integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/plugin-syntax-jsx" "^7.18.6" - "@babel/types" "^7.19.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.15" -"@babel/plugin-transform-react-pure-annotations@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" - integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== +"@babel/plugin-transform-react-pure-annotations@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c" + integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.18.6": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.20.5.tgz#57cda588c7ffb7f4f8483cc83bdcea02a907f04d" - integrity sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ== +"@babel/plugin-transform-regenerator@^7.0.0", "@babel/plugin-transform-regenerator@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c" + integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ== dependencies: - "@babel/helper-plugin-utils" "^7.20.2" - regenerator-transform "^0.15.1" + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" -"@babel/plugin-transform-reserved-words@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz#b1abd8ebf8edaa5f7fe6bbb8d2133d23b6a6f76a" - integrity sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA== +"@babel/plugin-transform-reserved-words@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8" + integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-transform-runtime@^7.0.0": - version "7.19.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz#9d2a9dbf4e12644d6f46e5e75bfbf02b5d6e9194" - integrity sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw== - dependencies: - "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-plugin-utils" "^7.19.0" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - semver "^6.3.0" + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.3.tgz#0aa7485862b0b5cb0559c1a5ec08b4923743ee3b" + integrity sha512-XcQ3X58CKBdBnnZpPaQjgVMePsXtSZzHoku70q9tUAQp02ggPQNM04BF3RvlW1GSM/McbSOQAzEK4MXbS7/JFg== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" + semver "^6.3.1" -"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz#6d6df7983d67b195289be24909e3f12a8f664dc9" - integrity sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw== +"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210" + integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.19.0": - version "7.19.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz#dd60b4620c2fec806d60cfaae364ec2188d593b6" - integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w== +"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c" + integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg== dependencies: - "@babel/helper-plugin-utils" "^7.19.0" - "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" -"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz#c6706eb2b1524028e317720339583ad0f444adcc" - integrity sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q== +"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04" + integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz#04ec6f10acdaa81846689d63fae117dd9c243a5e" - integrity sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA== +"@babel/plugin-transform-template-literals@^7.0.0", "@babel/plugin-transform-template-literals@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07" + integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typeof-symbol@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz#c8cea68263e45addcd6afc9091429f80925762c0" - integrity sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw== +"@babel/plugin-transform-typeof-symbol@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4" + integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-typescript@^7.18.6", "@babel/plugin-transform-typescript@^7.5.0": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.20.2.tgz#91515527b376fc122ba83b13d70b01af8fe98f3f" - integrity sha512-jvS+ngBfrnTUBfOQq8NfGnSbF9BrqlR6hjJ2yVxMkmO5nL/cdifNbI30EfjRlN4g5wYWNnMPyj5Sa6R1pbLeag== +"@babel/plugin-transform-typescript@^7.23.3", "@babel/plugin-transform-typescript@^7.5.0": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.3.tgz#ce806e6cb485d468c48c4f717696719678ab0138" + integrity sha512-ogV0yWnq38CFwH20l2Afz0dfKuZBx9o/Y2Rmh5vuSS0YD1hswgEgTfyTzuSrT2q9btmHRSqYoSfwFUVaC1M1Jw== dependencies: - "@babel/helper-create-class-features-plugin" "^7.20.2" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/plugin-syntax-typescript" "^7.20.0" + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.23.3" -"@babel/plugin-transform-unicode-escapes@^7.18.10": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz#1ecfb0eda83d09bbcb77c09970c2dd55832aa246" - integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ== +"@babel/plugin-transform-unicode-escapes@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925" + integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q== dependencies: - "@babel/helper-plugin-utils" "^7.18.9" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz#194317225d8c201bbae103364ffe9e2cea36cdca" - integrity sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA== +"@babel/plugin-transform-unicode-property-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad" + integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA== dependencies: - "@babel/helper-create-regexp-features-plugin" "^7.18.6" - "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.18.2": - version "7.20.2" - resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.20.2.tgz#9b1642aa47bb9f43a86f9630011780dab7f86506" - integrity sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg== +"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc" + integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw== dependencies: - "@babel/compat-data" "^7.20.1" - "@babel/helper-compilation-targets" "^7.20.0" - "@babel/helper-plugin-utils" "^7.20.2" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-async-generator-functions" "^7.20.1" - "@babel/plugin-proposal-class-properties" "^7.18.6" - "@babel/plugin-proposal-class-static-block" "^7.18.6" - "@babel/plugin-proposal-dynamic-import" "^7.18.6" - "@babel/plugin-proposal-export-namespace-from" "^7.18.9" - "@babel/plugin-proposal-json-strings" "^7.18.6" - "@babel/plugin-proposal-logical-assignment-operators" "^7.18.9" - "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6" - "@babel/plugin-proposal-numeric-separator" "^7.18.6" - "@babel/plugin-proposal-object-rest-spread" "^7.20.2" - "@babel/plugin-proposal-optional-catch-binding" "^7.18.6" - "@babel/plugin-proposal-optional-chaining" "^7.18.9" - "@babel/plugin-proposal-private-methods" "^7.18.6" - "@babel/plugin-proposal-private-property-in-object" "^7.18.6" - "@babel/plugin-proposal-unicode-property-regex" "^7.18.6" + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e" + integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.18.2": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.3.tgz#d299e0140a7650684b95c62be2db0ef8c975143e" + integrity sha512-ovzGc2uuyNfNAs/jyjIGxS8arOHS5FENZaNn4rtE7UdKMMkqHCvboHfcuhWLZNX5cB44QfcGNWjaevxMzzMf+Q== + dependencies: + "@babel/compat-data" "^7.23.3" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.3" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" "@babel/plugin-syntax-async-generators" "^7.8.4" "@babel/plugin-syntax-class-properties" "^7.12.13" "@babel/plugin-syntax-class-static-block" "^7.14.5" "@babel/plugin-syntax-dynamic-import" "^7.8.3" "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.20.0" + "@babel/plugin-syntax-import-assertions" "^7.23.3" + "@babel/plugin-syntax-import-attributes" "^7.23.3" + "@babel/plugin-syntax-import-meta" "^7.10.4" "@babel/plugin-syntax-json-strings" "^7.8.3" "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" @@ -950,91 +1016,107 @@ "@babel/plugin-syntax-optional-chaining" "^7.8.3" "@babel/plugin-syntax-private-property-in-object" "^7.14.5" "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-transform-arrow-functions" "^7.18.6" - "@babel/plugin-transform-async-to-generator" "^7.18.6" - "@babel/plugin-transform-block-scoped-functions" "^7.18.6" - "@babel/plugin-transform-block-scoping" "^7.20.2" - "@babel/plugin-transform-classes" "^7.20.2" - "@babel/plugin-transform-computed-properties" "^7.18.9" - "@babel/plugin-transform-destructuring" "^7.20.2" - "@babel/plugin-transform-dotall-regex" "^7.18.6" - "@babel/plugin-transform-duplicate-keys" "^7.18.9" - "@babel/plugin-transform-exponentiation-operator" "^7.18.6" - "@babel/plugin-transform-for-of" "^7.18.8" - "@babel/plugin-transform-function-name" "^7.18.9" - "@babel/plugin-transform-literals" "^7.18.9" - "@babel/plugin-transform-member-expression-literals" "^7.18.6" - "@babel/plugin-transform-modules-amd" "^7.19.6" - "@babel/plugin-transform-modules-commonjs" "^7.19.6" - "@babel/plugin-transform-modules-systemjs" "^7.19.6" - "@babel/plugin-transform-modules-umd" "^7.18.6" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1" - "@babel/plugin-transform-new-target" "^7.18.6" - "@babel/plugin-transform-object-super" "^7.18.6" - "@babel/plugin-transform-parameters" "^7.20.1" - "@babel/plugin-transform-property-literals" "^7.18.6" - "@babel/plugin-transform-regenerator" "^7.18.6" - "@babel/plugin-transform-reserved-words" "^7.18.6" - "@babel/plugin-transform-shorthand-properties" "^7.18.6" - "@babel/plugin-transform-spread" "^7.19.0" - "@babel/plugin-transform-sticky-regex" "^7.18.6" - "@babel/plugin-transform-template-literals" "^7.18.9" - "@babel/plugin-transform-typeof-symbol" "^7.18.9" - "@babel/plugin-transform-unicode-escapes" "^7.18.10" - "@babel/plugin-transform-unicode-regex" "^7.18.6" - "@babel/preset-modules" "^0.1.5" - "@babel/types" "^7.20.2" - babel-plugin-polyfill-corejs2 "^0.3.3" - babel-plugin-polyfill-corejs3 "^0.6.0" - babel-plugin-polyfill-regenerator "^0.4.1" - core-js-compat "^3.25.1" - semver "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.23.3" + "@babel/plugin-transform-async-generator-functions" "^7.23.3" + "@babel/plugin-transform-async-to-generator" "^7.23.3" + "@babel/plugin-transform-block-scoped-functions" "^7.23.3" + "@babel/plugin-transform-block-scoping" "^7.23.3" + "@babel/plugin-transform-class-properties" "^7.23.3" + "@babel/plugin-transform-class-static-block" "^7.23.3" + "@babel/plugin-transform-classes" "^7.23.3" + "@babel/plugin-transform-computed-properties" "^7.23.3" + "@babel/plugin-transform-destructuring" "^7.23.3" + "@babel/plugin-transform-dotall-regex" "^7.23.3" + "@babel/plugin-transform-duplicate-keys" "^7.23.3" + "@babel/plugin-transform-dynamic-import" "^7.23.3" + "@babel/plugin-transform-exponentiation-operator" "^7.23.3" + "@babel/plugin-transform-export-namespace-from" "^7.23.3" + "@babel/plugin-transform-for-of" "^7.23.3" + "@babel/plugin-transform-function-name" "^7.23.3" + "@babel/plugin-transform-json-strings" "^7.23.3" + "@babel/plugin-transform-literals" "^7.23.3" + "@babel/plugin-transform-logical-assignment-operators" "^7.23.3" + "@babel/plugin-transform-member-expression-literals" "^7.23.3" + "@babel/plugin-transform-modules-amd" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-umd" "^7.23.3" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.23.3" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.3" + "@babel/plugin-transform-numeric-separator" "^7.23.3" + "@babel/plugin-transform-object-rest-spread" "^7.23.3" + "@babel/plugin-transform-object-super" "^7.23.3" + "@babel/plugin-transform-optional-catch-binding" "^7.23.3" + "@babel/plugin-transform-optional-chaining" "^7.23.3" + "@babel/plugin-transform-parameters" "^7.23.3" + "@babel/plugin-transform-private-methods" "^7.23.3" + "@babel/plugin-transform-private-property-in-object" "^7.23.3" + "@babel/plugin-transform-property-literals" "^7.23.3" + "@babel/plugin-transform-regenerator" "^7.23.3" + "@babel/plugin-transform-reserved-words" "^7.23.3" + "@babel/plugin-transform-shorthand-properties" "^7.23.3" + "@babel/plugin-transform-spread" "^7.23.3" + "@babel/plugin-transform-sticky-regex" "^7.23.3" + "@babel/plugin-transform-template-literals" "^7.23.3" + "@babel/plugin-transform-typeof-symbol" "^7.23.3" + "@babel/plugin-transform-unicode-escapes" "^7.23.3" + "@babel/plugin-transform-unicode-property-regex" "^7.23.3" + "@babel/plugin-transform-unicode-regex" "^7.23.3" + "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.6" + babel-plugin-polyfill-corejs3 "^0.8.5" + babel-plugin-polyfill-regenerator "^0.5.3" + core-js-compat "^3.31.0" + semver "^6.3.1" "@babel/preset-flow@^7.13.13", "@babel/preset-flow@^7.17.12": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.18.6.tgz#83f7602ba566e72a9918beefafef8ef16d2810cb" - integrity sha512-E7BDhL64W6OUqpuyHnSroLnqyRTcG6ZdOBl1OKI/QK/HJfplqK/S3sq1Cckx7oTodJ5yOXyfw7rEADJ6UjoQDQ== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.23.3.tgz#8084e08b9ccec287bd077ab288b286fab96ffab1" + integrity sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-flow-strip-types" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-flow-strip-types" "^7.23.3" -"@babel/preset-modules@^0.1.5": - version "0.1.5" - resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.5.tgz#ef939d6e7f268827e1841638dc6ff95515e115d9" - integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== dependencies: "@babel/helper-plugin-utils" "^7.0.0" - "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" - "@babel/plugin-transform-dotall-regex" "^7.4.4" "@babel/types" "^7.4.4" esutils "^2.0.2" "@babel/preset-react@^7.17.12": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" - integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709" + integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-react-display-name" "^7.18.6" - "@babel/plugin-transform-react-jsx" "^7.18.6" - "@babel/plugin-transform-react-jsx-development" "^7.18.6" - "@babel/plugin-transform-react-pure-annotations" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.23.3" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.23.3" "@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.17.12": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz#ce64be3e63eddc44240c6358daefac17b3186399" - integrity sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ== + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.23.3.tgz#14534b34ed5b6d435aa05f1ae1c5e7adcc01d913" + integrity sha512-17oIGVlqz6CchO9RFYn5U6ZpWRZIngayYCtrPRSgANSwC2V1Jb+iP74nVxzzXJte8b8BYxrL1yY96xfhTBrNNQ== dependencies: - "@babel/helper-plugin-utils" "^7.18.6" - "@babel/helper-validator-option" "^7.18.6" - "@babel/plugin-transform-typescript" "^7.18.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.23.3" + "@babel/plugin-transform-modules-commonjs" "^7.23.3" + "@babel/plugin-transform-typescript" "^7.23.3" "@babel/register@^7.13.16": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.18.9.tgz#1888b24bc28d5cc41c412feb015e9ff6b96e439c" - integrity sha512-ZlbnXDcNYHMR25ITwwNKT88JiaukkdVj/nG7r3wnuXkOTHc60Uy05PwMCPre0hSkY68E6zK3xz+vUJSP2jWmcw== + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.22.15.tgz#c2c294a361d59f5fa7bcc8b97ef7319c32ecaec7" + integrity sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" @@ -1042,45 +1124,50 @@ pirates "^4.0.5" source-map-support "^0.5.16" +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + "@babel/runtime@^7.8.4": - version "7.20.6" - resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.20.6.tgz#facf4879bfed9b5326326273a64220f099b0fce3" - integrity sha512-Q+8MqP7TiHMWzSfwiJwXCjyf4GYA4Dgw3emg/7xmwsdLJOZUp+nMqcOwOzzYheuM1rhDu8FSj2l0aoMygEuXuA== - dependencies: - regenerator-runtime "^0.13.11" - -"@babel/template@^7.0.0", "@babel/template@^7.18.10", "@babel/template@^7.3.3": - version "7.18.10" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.10.tgz#6f9134835970d1dbf0835c0d100c9f38de0c5e71" - integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.10" - "@babel/types" "^7.18.10" - -"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.20.1", "@babel/traverse@^7.20.5", "@babel/traverse@^7.7.4": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.5.tgz#78eb244bea8270fdda1ef9af22a5d5e5b7e57133" - integrity sha512-WM5ZNN3JITQIq9tFZaw1ojLU3WgWdtkxnhM1AegMS+PvHjkM5IXjmYEGY7yukz5XS4sJyEf2VzWjI8uAavhxBQ== - dependencies: - "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.20.5" - "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.19.0" - "@babel/helper-hoist-variables" "^7.18.6" - "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.20.5" - "@babel/types" "^7.20.5" + version "7.23.2" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.0.0", "@babel/template@^7.22.15", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.1.0", "@babel/traverse@^7.14.0", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.3": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.3.tgz#26ee5f252e725aa7aca3474aa5b324eaf7908b5b" + integrity sha512-+K0yF1/9yR0oHdE0StHuEj3uTPzwwbrLGfNOndVJVV2TqA5+j3oljJUb4nmB954FLGjNem976+B+eDuLIjesiQ== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.23.3" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.23.3" + "@babel/types" "^7.23.3" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.20.0", "@babel/types@^7.20.2", "@babel/types@^7.20.5", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": - version "7.20.5" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.5.tgz#e206ae370b5393d94dfd1d04cd687cace53efa84" - integrity sha512-c9fst/h2/dcF7H+MJKZ2T0KjEQ8hY/BNnDk/H3XY8C4Aw/eWQXWn/lWntHF9ooUBnGmEvbfGrTgLWc+um0YDUg== +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.3", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.23.3" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.3.tgz#d5ea892c07f2ec371ac704420f4dcdb07b5f9598" + integrity sha512-OZnvoH2l8PK5eUvEcUyCt/sXgr/h+UWpVuBbOljwcrAgUl6lpchoQ++PHGyQy1AtYnVA6CEq3y5xeEI10brpXw== dependencies: - "@babel/helper-string-parser" "^7.19.4" - "@babel/helper-validator-identifier" "^7.19.1" + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" "@bcoe/v8-coverage@^0.2.3": @@ -1096,16 +1183,16 @@ exec-sh "^0.3.2" minimist "^1.2.0" -"@commitlint/cli@^17.3.0": - version "17.3.0" - resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.3.0.tgz#d8497f03e27a5161178e802168d77de2941959a0" - integrity sha512-/H0md7TsKflKzVPz226VfXzVafJFO1f9+r2KcFvmBu08V0T56lZU1s8WL7/xlxqLMqBTVaBf7Ixtc4bskdEEZg== +"@commitlint/cli@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/cli/-/cli-17.8.1.tgz#10492114a022c91dcfb1d84dac773abb3db76d33" + integrity sha512-ay+WbzQesE0Rv4EQKfNbSMiJJ12KdKTDzIt0tcK4k11FdsWmtwP0Kp1NWMOUswfIWo6Eb7p7Ln721Nx9FLNBjg== dependencies: - "@commitlint/format" "^17.0.0" - "@commitlint/lint" "^17.3.0" - "@commitlint/load" "^17.3.0" - "@commitlint/read" "^17.2.0" - "@commitlint/types" "^17.0.0" + "@commitlint/format" "^17.8.1" + "@commitlint/lint" "^17.8.1" + "@commitlint/load" "^17.8.1" + "@commitlint/read" "^17.8.1" + "@commitlint/types" "^17.8.1" execa "^5.0.0" lodash.isfunction "^3.0.9" resolve-from "5.0.0" @@ -1119,141 +1206,141 @@ dependencies: conventional-changelog-conventionalcommits "4.2.1" -"@commitlint/config-validator@^17.1.0": - version "17.1.0" - resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.1.0.tgz#51d09ca53d7a0d19736abf34eb18a66efce0f97a" - integrity sha512-Q1rRRSU09ngrTgeTXHq6ePJs2KrI+axPTgkNYDWSJIuS1Op4w3J30vUfSXjwn5YEJHklK3fSqWNHmBhmTR7Vdg== +"@commitlint/config-validator@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/config-validator/-/config-validator-17.8.1.tgz#5cc93b6b49d5524c9cc345a60e5bf74bcca2b7f9" + integrity sha512-UUgUC+sNiiMwkyiuIFR7JG2cfd9t/7MV8VB4TZ+q02ZFkHoduUS4tJGsCBWvBOGD9Btev6IecPMvlWUfJorkEA== dependencies: - "@commitlint/types" "^17.0.0" + "@commitlint/types" "^17.8.1" ajv "^8.11.0" -"@commitlint/ensure@^17.3.0": - version "17.3.0" - resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.3.0.tgz#d7bb60291a254152b468ccb2be8c0dc79667247e" - integrity sha512-kWbrQHDoW5veIUQx30gXoLOCjWvwC6OOEofhPCLl5ytRPBDAQObMbxTha1Bt2aSyNE/IrJ0s0xkdZ1Gi3wJwQg== +"@commitlint/ensure@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/ensure/-/ensure-17.8.1.tgz#59183557844999dbb6aab6d03629a3d104d01a8d" + integrity sha512-xjafwKxid8s1K23NFpL8JNo6JnY/ysetKo8kegVM7c8vs+kWLP8VrQq+NbhgVlmCojhEDbzQKp4eRXSjVOGsow== dependencies: - "@commitlint/types" "^17.0.0" + "@commitlint/types" "^17.8.1" lodash.camelcase "^4.3.0" lodash.kebabcase "^4.1.1" lodash.snakecase "^4.1.1" lodash.startcase "^4.4.0" lodash.upperfirst "^4.3.1" -"@commitlint/execute-rule@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.0.0.tgz#186e9261fd36733922ae617497888c4bdb6e5c92" - integrity sha512-nVjL/w/zuqjCqSJm8UfpNaw66V9WzuJtQvEnCrK4jDw6qKTmZB+1JQ8m6BQVZbNBcwfYdDNKnhIhqI0Rk7lgpQ== +"@commitlint/execute-rule@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/execute-rule/-/execute-rule-17.8.1.tgz#504ed69eb61044eeb84fdfd10cc18f0dab14f34c" + integrity sha512-JHVupQeSdNI6xzA9SqMF+p/JjrHTcrJdI02PwesQIDCIGUrv04hicJgCcws5nzaoZbROapPs0s6zeVHoxpMwFQ== -"@commitlint/format@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.0.0.tgz#2c991ac0df3955fe5d7d4d733967bd17e6cfd9e0" - integrity sha512-MZzJv7rBp/r6ZQJDEodoZvdRM0vXu1PfQvMTNWFb8jFraxnISMTnPBWMMjr2G/puoMashwaNM//fl7j8gGV5lA== +"@commitlint/format@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/format/-/format-17.8.1.tgz#6108bb6b4408e711006680649927e1b559bdc5f8" + integrity sha512-f3oMTyZ84M9ht7fb93wbCKmWxO5/kKSbwuYvS867duVomoOsgrgljkGGIztmT/srZnaiGbaK8+Wf8Ik2tSr5eg== dependencies: - "@commitlint/types" "^17.0.0" + "@commitlint/types" "^17.8.1" chalk "^4.1.0" -"@commitlint/is-ignored@^17.2.0": - version "17.2.0" - resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.2.0.tgz#07c329396e2457fd37e8707f990c3a49731a168d" - integrity sha512-rgUPUQraHxoMLxiE8GK430HA7/R2vXyLcOT4fQooNrZq9ERutNrP6dw3gdKLkq22Nede3+gEHQYUzL4Wu75ndg== - dependencies: - "@commitlint/types" "^17.0.0" - semver "7.3.7" - -"@commitlint/lint@^17.3.0": - version "17.3.0" - resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.3.0.tgz#16506deaa347d61bd1195b17df1c6809a553d2a0" - integrity sha512-VilOTPg0i9A7CCWM49E9bl5jytfTvfTxf9iwbWAWNjxJ/A5mhPKbm3sHuAdwJ87tDk1k4j8vomYfH23iaY+1Rw== - dependencies: - "@commitlint/is-ignored" "^17.2.0" - "@commitlint/parse" "^17.2.0" - "@commitlint/rules" "^17.3.0" - "@commitlint/types" "^17.0.0" - -"@commitlint/load@^17.3.0": - version "17.3.0" - resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.3.0.tgz#ebfec0198dd1627627e32a2b2ae4744d297599a8" - integrity sha512-u/pV6rCAJrCUN+HylBHLzZ4qj1Ew3+eN9GBPhNi9otGxtOfA8b+8nJSxaNbcC23Ins/kcpjGf9zPSVW7628Umw== - dependencies: - "@commitlint/config-validator" "^17.1.0" - "@commitlint/execute-rule" "^17.0.0" - "@commitlint/resolve-extends" "^17.3.0" - "@commitlint/types" "^17.0.0" - "@types/node" "^14.0.0" +"@commitlint/is-ignored@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/is-ignored/-/is-ignored-17.8.1.tgz#cf25bcd8409c79684b63f8bdeb35df48edda244e" + integrity sha512-UshMi4Ltb4ZlNn4F7WtSEugFDZmctzFpmbqvpyxD3la510J+PLcnyhf9chs7EryaRFJMdAKwsEKfNK0jL/QM4g== + dependencies: + "@commitlint/types" "^17.8.1" + semver "7.5.4" + +"@commitlint/lint@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/lint/-/lint-17.8.1.tgz#bfc21215f6b18d41d4d43e2aa3cb79a5d7726cd8" + integrity sha512-aQUlwIR1/VMv2D4GXSk7PfL5hIaFSfy6hSHV94O8Y27T5q+DlDEgd/cZ4KmVI+MWKzFfCTiTuWqjfRSfdRllCA== + dependencies: + "@commitlint/is-ignored" "^17.8.1" + "@commitlint/parse" "^17.8.1" + "@commitlint/rules" "^17.8.1" + "@commitlint/types" "^17.8.1" + +"@commitlint/load@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/load/-/load-17.8.1.tgz#fa061e7bfa53281eb03ca8517ca26d66a189030c" + integrity sha512-iF4CL7KDFstP1kpVUkT8K2Wl17h2yx9VaR1ztTc8vzByWWcbO/WaKwxsnCOqow9tVAlzPfo1ywk9m2oJ9ucMqA== + dependencies: + "@commitlint/config-validator" "^17.8.1" + "@commitlint/execute-rule" "^17.8.1" + "@commitlint/resolve-extends" "^17.8.1" + "@commitlint/types" "^17.8.1" + "@types/node" "20.5.1" chalk "^4.1.0" - cosmiconfig "^7.0.0" + cosmiconfig "^8.0.0" cosmiconfig-typescript-loader "^4.0.0" lodash.isplainobject "^4.0.6" lodash.merge "^4.6.2" lodash.uniq "^4.5.0" resolve-from "^5.0.0" ts-node "^10.8.1" - typescript "^4.6.4" - -"@commitlint/message@^17.2.0": - version "17.2.0" - resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.2.0.tgz#c546b7a441b9f69493257f9fe0c3c8fc37933b27" - integrity sha512-/4l2KFKxBOuoEn1YAuuNNlAU05Zt7sNsC9H0mPdPm3chOrT4rcX0pOqrQcLtdMrMkJz0gC7b3SF80q2+LtdL9Q== - -"@commitlint/parse@^17.2.0": - version "17.2.0" - resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.2.0.tgz#d87b09436ec741c2267b76a41972b34e53459a81" - integrity sha512-vLzLznK9Y21zQ6F9hf8D6kcIJRb2haAK5T/Vt1uW2CbHYOIfNsR/hJs0XnF/J9ctM20Tfsqv4zBitbYvVw7F6Q== - dependencies: - "@commitlint/types" "^17.0.0" - conventional-changelog-angular "^5.0.11" - conventional-commits-parser "^3.2.2" - -"@commitlint/read@^17.2.0": - version "17.2.0" - resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.2.0.tgz#7a67b7b611d978a344c2430cba030252c2170723" - integrity sha512-bbblBhrHkjxra3ptJNm0abxu7yeAaxumQ8ZtD6GIVqzURCETCP7Dm0tlVvGRDyXBuqX6lIJxh3W7oyKqllDsHQ== - dependencies: - "@commitlint/top-level" "^17.0.0" - "@commitlint/types" "^17.0.0" - fs-extra "^10.0.0" - git-raw-commits "^2.0.0" + typescript "^4.6.4 || ^5.2.2" + +"@commitlint/message@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/message/-/message-17.8.1.tgz#a5cd226c419be20ee03c3d237db6ac37b95958b3" + integrity sha512-6bYL1GUQsD6bLhTH3QQty8pVFoETfFQlMn2Nzmz3AOLqRVfNNtXBaSY0dhZ0dM6A2MEq4+2d7L/2LP8TjqGRkA== + +"@commitlint/parse@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/parse/-/parse-17.8.1.tgz#6e00b8f50ebd63562d25dcf4230da2c9f984e626" + integrity sha512-/wLUickTo0rNpQgWwLPavTm7WbwkZoBy3X8PpkUmlSmQJyWQTj0m6bDjiykMaDt41qcUbfeFfaCvXfiR4EGnfw== + dependencies: + "@commitlint/types" "^17.8.1" + conventional-changelog-angular "^6.0.0" + conventional-commits-parser "^4.0.0" + +"@commitlint/read@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/read/-/read-17.8.1.tgz#b3f28777607c756078356cc133368b0e8c08092f" + integrity sha512-Fd55Oaz9irzBESPCdMd8vWWgxsW3OWR99wOntBDHgf9h7Y6OOHjWEdS9Xzen1GFndqgyoaFplQS5y7KZe0kO2w== + dependencies: + "@commitlint/top-level" "^17.8.1" + "@commitlint/types" "^17.8.1" + fs-extra "^11.0.0" + git-raw-commits "^2.0.11" minimist "^1.2.6" -"@commitlint/resolve-extends@^17.3.0": - version "17.3.0" - resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.3.0.tgz#413a9ec393266d0673e6b9ec2f0974c358ed662d" - integrity sha512-Lf3JufJlc5yVEtJWC8o4IAZaB8FQAUaVlhlAHRACd0TTFizV2Lk2VH70et23KgvbQNf7kQzHs/2B4QZalBv6Cg== +"@commitlint/resolve-extends@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/resolve-extends/-/resolve-extends-17.8.1.tgz#9af01432bf2fd9ce3dd5a00d266cce14e4c977e7" + integrity sha512-W/ryRoQ0TSVXqJrx5SGkaYuAaE/BUontL1j1HsKckvM6e5ZaG0M9126zcwL6peKSuIetJi7E87PRQF8O86EW0Q== dependencies: - "@commitlint/config-validator" "^17.1.0" - "@commitlint/types" "^17.0.0" + "@commitlint/config-validator" "^17.8.1" + "@commitlint/types" "^17.8.1" import-fresh "^3.0.0" lodash.mergewith "^4.6.2" resolve-from "^5.0.0" resolve-global "^1.0.0" -"@commitlint/rules@^17.3.0": - version "17.3.0" - resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.3.0.tgz#4b31d6739f7eb8c7222b323b0bc2b63bd298a4ad" - integrity sha512-s2UhDjC5yP2utx3WWqsnZRzjgzAX8BMwr1nltC0u0p8T/nzpkx4TojEfhlsOUj1t7efxzZRjUAV0NxNwdJyk+g== +"@commitlint/rules@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/rules/-/rules-17.8.1.tgz#da49cab1b7ebaf90d108de9f58f684dc4ccb65a0" + integrity sha512-2b7OdVbN7MTAt9U0vKOYKCDsOvESVXxQmrvuVUZ0rGFMCrCPJWWP1GJ7f0lAypbDAhaGb8zqtdOr47192LBrIA== dependencies: - "@commitlint/ensure" "^17.3.0" - "@commitlint/message" "^17.2.0" - "@commitlint/to-lines" "^17.0.0" - "@commitlint/types" "^17.0.0" + "@commitlint/ensure" "^17.8.1" + "@commitlint/message" "^17.8.1" + "@commitlint/to-lines" "^17.8.1" + "@commitlint/types" "^17.8.1" execa "^5.0.0" -"@commitlint/to-lines@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.0.0.tgz#5766895836b8085b099a098482f88a03f070b411" - integrity sha512-nEi4YEz04Rf2upFbpnEorG8iymyH7o9jYIVFBG1QdzebbIFET3ir+8kQvCZuBE5pKCtViE4XBUsRZz139uFrRQ== +"@commitlint/to-lines@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/to-lines/-/to-lines-17.8.1.tgz#a5c4a7cf7dff3dbdd69289fc0eb19b66f3cfe017" + integrity sha512-LE0jb8CuR/mj6xJyrIk8VLz03OEzXFgLdivBytoooKO5xLt5yalc8Ma5guTWobw998sbR3ogDd+2jed03CFmJA== -"@commitlint/top-level@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.0.0.tgz#ebd0df4c703c026c2fbdc20fa746836334f4ed15" - integrity sha512-dZrEP1PBJvodNWYPOYiLWf6XZergdksKQaT6i1KSROLdjf5Ai0brLOv5/P+CPxBeoj3vBxK4Ax8H1Pg9t7sHIQ== +"@commitlint/top-level@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/top-level/-/top-level-17.8.1.tgz#206d37d6782f33c9572e44fbe3758392fdeea7bc" + integrity sha512-l6+Z6rrNf5p333SHfEte6r+WkOxGlWK4bLuZKbtf/2TXRN+qhrvn1XE63VhD8Oe9oIHQ7F7W1nG2k/TJFhx2yA== dependencies: find-up "^5.0.0" -"@commitlint/types@^17.0.0": - version "17.0.0" - resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.0.0.tgz#3b4604c1a0f06c340ce976e6c6903d4f56e3e690" - integrity sha512-hBAw6U+SkAT5h47zDMeOu3HSiD0SODw4Aq7rRNh1ceUmL7GyLKYhPbUvlRWqZ65XjBLPHZhFyQlRaPNz8qvUyQ== +"@commitlint/types@^17.8.1": + version "17.8.1" + resolved "https://registry.yarnpkg.com/@commitlint/types/-/types-17.8.1.tgz#883a0ad35c5206d5fef7bc6ce1bbe648118af44e" + integrity sha512-PXDQXkAmiMEG162Bqdh9ChML/GJZo6vU+7F03ALKDK8zYc6SuAr47LjG7hGYRqUOz+WK0dU7bQ0xzuqFMdxzeQ== dependencies: chalk "^4.1.0" @@ -1264,14 +1351,26 @@ dependencies: "@jridgewell/trace-mapping" "0.3.9" -"@eslint/eslintrc@^1.4.0": - version "1.4.0" - resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-1.4.0.tgz#8ec64e0df3e7a1971ee1ff5158da87389f167a63" - integrity sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.10.0" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz#548f6de556857c8bb73bbee70c35dc82a2e74d63" + integrity sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA== + +"@eslint/eslintrc@^2.1.3": + version "2.1.3" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.3.tgz#797470a75fe0fbd5a53350ee715e85e87baff22d" + integrity sha512-yZzuIG+jnVu6hNSzFEN07e8BxF3uAzYtQb6uDkaYZLo6oYZDCq454c5kB8zxnzfCYyP4MIuyBn10L0DqwujTmA== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.4.0" + espree "^9.6.0" globals "^13.19.0" ignore "^5.2.0" import-fresh "^3.2.1" @@ -1279,6 +1378,11 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/js@8.53.0": + version "8.53.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.53.0.tgz#bea56f2ed2b5baea164348ff4d5a879f6f81f20d" + integrity sha512-Kn7K8dx/5U6+cT1yEhpX1w4PCSg0M+XyRILPgvwcEBjerFWCwQj5sbr3/VmxqV0JGHCBCzyd6LxypEuehypY1w== + "@hapi/hoek@^9.0.0": version "9.3.0" resolved "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-9.3.0.tgz#8368869dcb735be2e7f5cb7647de78e167a251fb" @@ -1291,12 +1395,12 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@humanwhocodes/config-array@^0.11.8": - version "0.11.8" - resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.8.tgz#03595ac2075a4dc0f191cc2131de14fbd7d410b9" - integrity sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g== +"@humanwhocodes/config-array@^0.11.13": + version "0.11.13" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz#075dc9684f40a531d9b26b0822153c1e832ee297" + integrity sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ== dependencies: - "@humanwhocodes/object-schema" "^1.2.1" + "@humanwhocodes/object-schema" "^2.0.1" debug "^4.1.1" minimatch "^3.0.5" @@ -1305,10 +1409,10 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" - integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== +"@humanwhocodes/object-schema@^2.0.1": + version "2.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" + integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== "@hutson/parse-repository-url@^3.0.0": version "3.0.2" @@ -1525,37 +1629,29 @@ "@types/yargs" "^16.0.0" chalk "^4.0.0" -"@jridgewell/gen-mapping@^0.1.0": - version "0.1.1" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz#e5d2e450306a9491e3bd77e323e38d7aff315996" - integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w== - dependencies: - "@jridgewell/set-array" "^1.0.0" - "@jridgewell/sourcemap-codec" "^1.4.10" - -"@jridgewell/gen-mapping@^0.3.2": - version "0.3.2" - resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz#c1aedc61e853f2bb9f5dfe6d4442d3b565b253b9" - integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A== +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz#7e02e6eb5df901aaedb08514203b096614024098" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== dependencies: "@jridgewell/set-array" "^1.0.1" "@jridgewell/sourcemap-codec" "^1.4.10" "@jridgewell/trace-mapping" "^0.3.9" -"@jridgewell/resolve-uri@3.1.0", "@jridgewell/resolve-uri@^3.0.3": - version "3.1.0" - resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz#2203b118c157721addfe69d47b70465463066d78" - integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== +"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz#c08679063f279615a3326583ba3a90d1d82cc721" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== -"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1": +"@jridgewell/set-array@^1.0.1": version "1.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.1.2.tgz#7c6cf998d6d20b914c0a55a91ae928ff25965e72" integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== -"@jridgewell/sourcemap-codec@1.4.14", "@jridgewell/sourcemap-codec@^1.4.10": - version "1.4.14" - resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz#add4c98d341472a289190b424efbdb096991bb24" - integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== "@jridgewell/trace-mapping@0.3.9": version "0.3.9" @@ -1565,13 +1661,13 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.9": - version "0.3.17" - resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz#793041277af9073b0951a7fe0f0d8c4c98c36985" - integrity sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g== +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.20" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" + integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== dependencies: - "@jridgewell/resolve-uri" "3.1.0" - "@jridgewell/sourcemap-codec" "1.4.14" + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" "@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": version "5.1.1-v1" @@ -1602,105 +1698,120 @@ fastq "^1.6.0" "@octokit/auth-token@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.2.tgz#a0fc8de149fd15876e1ac78f6525c1c5ab48435f" - integrity sha512-pq7CwIMV1kmzkFTimdwjAINCXKTajZErLB4wMLYapR2nuB/Jpr66+05wOTZMSCBXP6n4DdDWT2W19Bm17vU69Q== - dependencies: - "@octokit/types" "^8.0.0" + version "3.0.4" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-3.0.4.tgz#70e941ba742bdd2b49bdb7393e821dea8520a3db" + integrity sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ== -"@octokit/core@^4.1.0": - version "4.1.0" - resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.1.0.tgz#b6b03a478f1716de92b3f4ec4fd64d05ba5a9251" - integrity sha512-Czz/59VefU+kKDy+ZfDwtOIYIkFjExOKf+HA92aiTZJ6EfWpFzYQWw0l54ji8bVmyhc+mGaLUbSUmXazG7z5OQ== +"@octokit/core@^4.2.1": + version "4.2.4" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-4.2.4.tgz#d8769ec2b43ff37cc3ea89ec4681a20ba58ef907" + integrity sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ== dependencies: "@octokit/auth-token" "^3.0.0" "@octokit/graphql" "^5.0.0" "@octokit/request" "^6.0.0" "@octokit/request-error" "^3.0.0" - "@octokit/types" "^8.0.0" + "@octokit/types" "^9.0.0" before-after-hook "^2.2.0" universal-user-agent "^6.0.0" "@octokit/endpoint@^7.0.0": - version "7.0.3" - resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.3.tgz#0b96035673a9e3bedf8bab8f7335de424a2147ed" - integrity sha512-57gRlb28bwTsdNXq+O3JTQ7ERmBTuik9+LelgcLIVfYwf235VHbN9QNo4kXExtp/h8T423cR5iJThKtFYxC7Lw== + version "7.0.6" + resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-7.0.6.tgz#791f65d3937555141fb6c08f91d618a7d645f1e2" + integrity sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/types" "^9.0.0" is-plain-object "^5.0.0" universal-user-agent "^6.0.0" "@octokit/graphql@^5.0.0": - version "5.0.4" - resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.4.tgz#519dd5c05123868276f3ae4e50ad565ed7dff8c8" - integrity sha512-amO1M5QUQgYQo09aStR/XO7KAl13xpigcy/kI8/N1PnZYSS69fgte+xA4+c2DISKqUZfsh0wwjc2FaCt99L41A== + version "5.0.6" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-5.0.6.tgz#9eac411ac4353ccc5d3fca7d76736e6888c5d248" + integrity sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw== dependencies: "@octokit/request" "^6.0.0" - "@octokit/types" "^8.0.0" + "@octokit/types" "^9.0.0" universal-user-agent "^6.0.0" -"@octokit/openapi-types@^14.0.0": - version "14.0.0" - resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-14.0.0.tgz#949c5019028c93f189abbc2fb42f333290f7134a" - integrity sha512-HNWisMYlR8VCnNurDU6os2ikx0s0VyEjDYHNS/h4cgb8DeOxQ0n72HyinUtdDVxJhFy3FWLGl0DJhfEWk3P5Iw== +"@octokit/openapi-types@^18.0.0": + version "18.1.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-18.1.1.tgz#09bdfdabfd8e16d16324326da5148010d765f009" + integrity sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw== -"@octokit/plugin-paginate-rest@^5.0.0": - version "5.0.1" - resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-5.0.1.tgz#93d7e74f1f69d68ba554fa6b888c2a9cf1f99a83" - integrity sha512-7A+rEkS70pH36Z6JivSlR7Zqepz3KVucEFVDnSrgHXzG7WLAzYwcHZbKdfTXHwuTHbkT1vKvz7dHl1+HNf6Qyw== +"@octokit/plugin-paginate-rest@^6.1.2": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-6.1.2.tgz#f86456a7a1fe9e58fec6385a85cf1b34072341f8" + integrity sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/tsconfig" "^1.0.2" + "@octokit/types" "^9.2.3" "@octokit/plugin-request-log@^1.0.4": version "1.0.4" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85" integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA== -"@octokit/plugin-rest-endpoint-methods@^6.7.0": - version "6.7.0" - resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-6.7.0.tgz#2f6f17f25b6babbc8b41d2bb0a95a8839672ce7c" - integrity sha512-orxQ0fAHA7IpYhG2flD2AygztPlGYNAdlzYz8yrD8NDgelPfOYoRPROfEyIe035PlxvbYrgkfUZIhSBKju/Cvw== +"@octokit/plugin-rest-endpoint-methods@^7.1.2": + version "7.2.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-7.2.3.tgz#37a84b171a6cb6658816c82c4082ac3512021797" + integrity sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA== dependencies: - "@octokit/types" "^8.0.0" - deprecation "^2.3.1" + "@octokit/types" "^10.0.0" "@octokit/request-error@^3.0.0": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.2.tgz#f74c0f163d19463b87528efe877216c41d6deb0a" - integrity sha512-WMNOFYrSaX8zXWoJg9u/pKgWPo94JXilMLb2VManNOby9EZxrQaBe/QSC4a1TzpAlpxofg2X/jMnCyZgL6y7eg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-3.0.3.tgz#ef3dd08b8e964e53e55d471acfe00baa892b9c69" + integrity sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ== dependencies: - "@octokit/types" "^8.0.0" + "@octokit/types" "^9.0.0" deprecation "^2.0.0" once "^1.4.0" "@octokit/request@^6.0.0": - version "6.2.2" - resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.2.tgz#a2ba5ac22bddd5dcb3f539b618faa05115c5a255" - integrity sha512-6VDqgj0HMc2FUX2awIs+sM6OwLgwHvAi4KCK3mT2H2IKRt6oH9d0fej5LluF5mck1lRR/rFWN0YIDSYXYSylbw== + version "6.2.8" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-6.2.8.tgz#aaf480b32ab2b210e9dadd8271d187c93171d8eb" + integrity sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw== dependencies: "@octokit/endpoint" "^7.0.0" "@octokit/request-error" "^3.0.0" - "@octokit/types" "^8.0.0" + "@octokit/types" "^9.0.0" is-plain-object "^5.0.0" node-fetch "^2.6.7" universal-user-agent "^6.0.0" -"@octokit/rest@19.0.5": - version "19.0.5" - resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.5.tgz#4dbde8ae69b27dca04b5f1d8119d282575818f6c" - integrity sha512-+4qdrUFq2lk7Va+Qff3ofREQWGBeoTKNqlJO+FGjFP35ZahP+nBenhZiGdu8USSgmq4Ky3IJ/i4u0xbLqHaeow== +"@octokit/rest@19.0.11": + version "19.0.11" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-19.0.11.tgz#2ae01634fed4bd1fca5b642767205ed3fd36177c" + integrity sha512-m2a9VhaP5/tUw8FwfnW2ICXlXpLPIqxtg3XcAiGMLj/Xhw3RSBfZ8le/466ktO1Gcjr8oXudGnHhxV1TXJgFxw== dependencies: - "@octokit/core" "^4.1.0" - "@octokit/plugin-paginate-rest" "^5.0.0" + "@octokit/core" "^4.2.1" + "@octokit/plugin-paginate-rest" "^6.1.2" "@octokit/plugin-request-log" "^1.0.4" - "@octokit/plugin-rest-endpoint-methods" "^6.7.0" + "@octokit/plugin-rest-endpoint-methods" "^7.1.2" -"@octokit/types@^8.0.0": - version "8.0.0" - resolved "https://registry.yarnpkg.com/@octokit/types/-/types-8.0.0.tgz#93f0b865786c4153f0f6924da067fe0bb7426a9f" - integrity sha512-65/TPpOJP1i3K4lBJMnWqPUJ6zuOtzhtagDvydAWbEXpbFYA0oMKKyLb95NFZZP0lSh/4b6K+DQlzvYQJQQePg== +"@octokit/tsconfig@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@octokit/tsconfig/-/tsconfig-1.0.2.tgz#59b024d6f3c0ed82f00d08ead5b3750469125af7" + integrity sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA== + +"@octokit/types@^10.0.0": + version "10.0.0" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-10.0.0.tgz#7ee19c464ea4ada306c43f1a45d444000f419a4a" + integrity sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg== dependencies: - "@octokit/openapi-types" "^14.0.0" + "@octokit/openapi-types" "^18.0.0" + +"@octokit/types@^9.0.0", "@octokit/types@^9.2.3": + version "9.3.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-9.3.2.tgz#3f5f89903b69f6a2d196d78ec35f888c0013cac5" + integrity sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA== + dependencies: + "@octokit/openapi-types" "^18.0.0" + +"@pnpm/config.env-replace@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@pnpm/config.env-replace/-/config.env-replace-1.1.0.tgz#ab29da53df41e8948a00f2433f085f54de8b3a4c" + integrity sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w== "@pnpm/network.ca-file@^1.0.1": version "1.0.2" @@ -1709,11 +1820,12 @@ dependencies: graceful-fs "4.2.10" -"@pnpm/npm-conf@^1.0.4": - version "1.0.5" - resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-1.0.5.tgz#3475541fb71d7b6ce68acaaa3392eae9fedf3276" - integrity sha512-hD8ml183638O3R6/Txrh0L8VzGOrFXgRtRDG4qQC4tONdZ5Z1M+tlUUDUvrjYdmK6G+JTBTeaCLMna11cXzi8A== +"@pnpm/npm-conf@^2.1.0": + version "2.2.2" + resolved "https://registry.yarnpkg.com/@pnpm/npm-conf/-/npm-conf-2.2.2.tgz#0058baf1c26cbb63a828f0193795401684ac86f0" + integrity sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA== dependencies: + "@pnpm/config.env-replace" "^1.1.0" "@pnpm/network.ca-file" "^1.0.1" config-chain "^1.1.11" @@ -1947,7 +2059,7 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@sideway/formula@^3.0.0": +"@sideway/formula@^3.0.1": version "3.0.1" resolved "https://registry.yarnpkg.com/@sideway/formula/-/formula-3.0.1.tgz#80fcbcbaf7ce031e0ef2dd29b1bfc7c3f583611f" integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== @@ -1958,9 +2070,9 @@ integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== "@sindresorhus/is@^5.2.0": - version "5.3.0" - resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.3.0.tgz#0ec9264cf54a527671d990eb874e030b55b70dcc" - integrity sha512-CX6t4SYQ37lzxicAqsBtxA3OseeoVrh9cSJ5PFYam0GksYlupRfy1A+Q4aYD3zvcfECLc0zO2u+ZnR2UYKvCrw== + version "5.6.0" + resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-5.6.0.tgz#41dd6093d34652cddb5d5bdeee04eafc33826668" + integrity sha512-TV7t8GKYaJWsn00tFDqBw8+Uqmr8A0fRU1tvTQhyZzGv0sJCGRQL3JGMI3ucuKo3XIZdUP+Lx7/gh2t3lewy7g== "@sinonjs/commons@^1.7.0": version "1.8.6" @@ -2004,71 +2116,71 @@ integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow== "@tsconfig/node16@^1.0.2": - version "1.0.3" - resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.3.tgz#472eaab5f15c1ffdd7f8628bd4c4f753995ec79e" - integrity sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ== + version "1.0.4" + resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9" + integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA== "@types/babel__core@^7.0.0", "@types/babel__core@^7.1.7": - version "7.1.20" - resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.20.tgz#e168cdd612c92a2d335029ed62ac94c95b362359" - integrity sha512-PVb6Bg2QuscZ30FvOU7z4guG6c926D9YRvOxEaelzndpMsvP+YM74Q/dAFASpg2l6+XLalxSGxcq/lrgYWZtyQ== + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.20.4.tgz#26a87347e6c6f753b3668398e34496d6d9ac6ac0" + integrity sha512-mLnSC22IC4vcWiuObSRjrLd9XcBTGf59vUSoq2jkQDJ/QQ8PMI9rSuzE+aEV8karUMbskw07bKYoUJCKTUaygg== dependencies: - "@babel/parser" "^7.1.0" - "@babel/types" "^7.0.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" "@types/babel__generator" "*" "@types/babel__template" "*" "@types/babel__traverse" "*" "@types/babel__generator@*": - version "7.6.4" - resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.4.tgz#1f20ce4c5b1990b37900b63f050182d28c2439b7" - integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + version "7.6.7" + resolved "https://registry.yarnpkg.com/@types/babel__generator/-/babel__generator-7.6.7.tgz#a7aebf15c7bc0eb9abd638bdb5c0b8700399c9d0" + integrity sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ== dependencies: "@babel/types" "^7.0.0" "@types/babel__template@*": - version "7.4.1" - resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.1.tgz#3d1a48fd9d6c0edfd56f2ff578daed48f36c8969" - integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + version "7.4.4" + resolved "https://registry.yarnpkg.com/@types/babel__template/-/babel__template-7.4.4.tgz#5672513701c1b2199bc6dad636a9d7491586766f" + integrity sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A== dependencies: "@babel/parser" "^7.1.0" "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": - version "7.18.3" - resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.18.3.tgz#dfc508a85781e5698d5b33443416b6268c4b3e8d" - integrity sha512-1kbcJ40lLB7MHsj39U4Sh1uTd2E7rLEa79kmDpI6cy+XiXsteB3POdQomoq4FxszMrO3ZYchkhYJw7A2862b3w== + version "7.20.4" + resolved "https://registry.yarnpkg.com/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" + integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== dependencies: - "@babel/types" "^7.3.0" + "@babel/types" "^7.20.7" "@types/graceful-fs@^4.1.2": - version "4.1.5" - resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.5.tgz#21ffba0d98da4350db64891f92a9e5db3cdb4e15" - integrity sha512-anKkLmZZ+xm4p8JWBf4hElkM4XR+EZeA2M9BAkkTldmcyDY4mbdIJnRghDJH3Ov5ooY7/UAoENtmdMSkaAd7Cw== + version "4.1.9" + resolved "https://registry.yarnpkg.com/@types/graceful-fs/-/graceful-fs-4.1.9.tgz#2a06bc0f68a20ab37b3e36aa238be6abdf49e8b4" + integrity sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ== dependencies: "@types/node" "*" -"@types/http-cache-semantics@^4.0.1": - version "4.0.1" - resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz#0ea7b61496902b95890dc4c3a116b60cb8dae812" - integrity sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ== +"@types/http-cache-semantics@^4.0.2": + version "4.0.4" + resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz#b979ebad3919799c979b17c72621c0bc0a31c6c4" + integrity sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA== "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz#8467d4b3c087805d63580480890791277ce35c44" - integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== "@types/istanbul-lib-report@*": - version "3.0.0" - resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#c14c24f18ea8190c118ee7562b7ff99a36552686" - integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== dependencies: "@types/istanbul-lib-coverage" "*" "@types/istanbul-reports@^3.0.0": - version "3.0.1" - resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz#9153fe98bba2bd565a63add9436d6f0d7f8468ff" - integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== dependencies: "@types/istanbul-lib-report" "*" @@ -2081,44 +2193,46 @@ pretty-format "^26.0.0" "@types/json-schema@^7.0.9": - version "7.0.11" - resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3" - integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ== + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== "@types/minimist@^1.2.0": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" - integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + version "1.2.5" + resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.5.tgz#ec10755e871497bcd83efe927e43ec46e8c0747e" + integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/node@*": - version "18.11.17" - resolved "https://registry.yarnpkg.com/@types/node/-/node-18.11.17.tgz#5c009e1d9c38f4a2a9d45c0b0c493fe6cdb4bcb5" - integrity sha512-HJSUJmni4BeDHhfzn6nF0sVmd1SMezP7/4F0Lq+aXzmp2xm9O7WXrUtHW/CHlYVtZUbByEvWidHqRtcJXGF2Ng== + version "20.9.0" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.9.0.tgz#bfcdc230583aeb891cf51e73cfdaacdd8deae298" + integrity sha512-nekiGu2NDb1BcVofVcEKMIwzlx4NjHlcjhoxxKBNLtz15Y1z7MYf549DFvkHSId02Ax6kGwWntIBPC3l/JZcmw== + dependencies: + undici-types "~5.26.4" -"@types/node@^14.0.0": - version "14.18.35" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.18.35.tgz#879c4659cb7b3fe515844f029c75079c941bb65c" - integrity sha512-2ATO8pfhG1kDvw4Lc4C0GXIMSQFFJBCo/R1fSgTwmUlq5oy95LXyjDQinsRVgQY6gp6ghh3H91wk9ES5/5C+Tw== +"@types/node@20.5.1": + version "20.5.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-20.5.1.tgz#178d58ee7e4834152b0e8b4d30cbfab578b9bb30" + integrity sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg== "@types/normalize-package-data@^2.4.0": - version "2.4.1" - resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301" - integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + version "2.4.4" + resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz#56e2cc26c397c038fab0e3a917a12d5c5909e901" + integrity sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA== "@types/parse-json@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" - integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + version "4.0.2" + resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" + integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== "@types/prettier@^2.0.0": - version "2.7.2" - resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.2.tgz#6c2324641cc4ba050a8c710b2b251b377581fbf0" - integrity sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg== + version "2.7.3" + resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== "@types/prop-types@*": - version "15.7.5" - resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf" - integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + version "15.7.10" + resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.10.tgz#892afc9332c4d62a5ea7e897fe48ed2085bbb08a" + integrity sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A== "@types/react-native@0.68.7": version "0.68.7" @@ -2128,141 +2242,152 @@ "@types/react" "^17" "@types/react@^16.9.19": - version "16.14.34" - resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.34.tgz#d129324ffda312044e1c47aab18696e4ed493282" - integrity sha512-b99nWeGGReLh6aKBppghVqp93dFJtgtDOzc8NXM6hewD8PQ2zZG5kBLgbx+VJr7Q7WBMjHxaIl3dwpwwPIUgyA== + version "16.14.51" + resolved "https://registry.yarnpkg.com/@types/react/-/react-16.14.51.tgz#2bf66518ee13947bb5074de6c14e6b3ac343cfe0" + integrity sha512-4T/wsDXStA5OUGTj6w2INze3ZCz22IwQiWcApgqqNRU2A6vNUIPXpNkjAMUFxx6diYPVkvz+d7gEtU7AZ+0Xqg== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/react@^17": - version "17.0.52" - resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.52.tgz#10d8b907b5c563ac014a541f289ae8eaa9bf2e9b" - integrity sha512-vwk8QqVODi0VaZZpDXQCmEmiOuyjEFPY7Ttaw5vjM112LOq37yz1CDJGrRJwA1fYEq4Iitd5rnjd1yWAc/bT+A== + version "17.0.70" + resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.70.tgz#35301a9cb94ba1a65dc306b7ce169a2c4fda1986" + integrity sha512-yqYMK49/cnqw+T8R9/C+RNjRddYmPDGI5lKHi3bOYceQCBAh8X2ngSbZP0gnVeyvHr0T7wEgIIGKT1usNol08w== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" csstype "^3.0.2" "@types/scheduler@*": - version "0.16.2" - resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.2.tgz#1a62f89525723dde24ba1b01b092bf5df8ad4d39" - integrity sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew== + version "0.16.6" + resolved "https://registry.yarnpkg.com/@types/scheduler/-/scheduler-0.16.6.tgz#eb26db6780c513de59bee0b869ef289ad3068711" + integrity sha512-Vlktnchmkylvc9SnwwwozTv04L/e1NykF5vgoQ0XTmI8DD+wxfjQuHuvHS3p0r2jz2x2ghPs2h1FVeDirIteWA== "@types/semver@^7.3.12": - version "7.3.13" - resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91" - integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw== + version "7.5.5" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.5.tgz#deed5ab7019756c9c90ea86139106b0346223f35" + integrity sha512-+d+WYC1BxJ6yVOgUgzK8gWvp5qF8ssV5r4nsDcZWKRWcDQLQ619tvWAxJQYGgBrO1MnLJC7a5GtiYsAoQ47dJg== "@types/stack-utils@^2.0.0": - version "2.0.1" - resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" - integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + version "2.0.3" + resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" + integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== "@types/yargs-parser@*": - version "21.0.0" - resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.0.tgz#0c60e537fa790f5f9472ed2776c2b71ec117351b" - integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== "@types/yargs@^15.0.0": - version "15.0.14" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.14.tgz#26d821ddb89e70492160b66d10a0eb6df8f6fb06" - integrity sha512-yEJzHoxf6SyQGhBhIYGXQDSCkJjB6HohDShto7m8vaKg9Yp0Yn8+71J9eakh2bnPg6BfsH9PRMhiRTZnd4eXGQ== + version "15.0.18" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-15.0.18.tgz#b7dda4339f4dde367ffe99650e18967108cea321" + integrity sha512-DDi2KmvAnNsT/EvU8jp1UR7pOJojBtJ3GLZ/uw1MUq4VbbESppPWoHUY4h0OB4BbEbGJiyEsmUcuZDZtoR+ZwQ== dependencies: "@types/yargs-parser" "*" "@types/yargs@^16.0.0": - version "16.0.4" - resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.4.tgz#26aad98dd2c2a38e421086ea9ad42b9e51642977" - integrity sha512-T8Yc9wt/5LbJyCaLiHPReJa0kApcIgJ7Bn735GjItUfh08Z1pJvu8QZqb9s+mMvKV6WUQRV7K2R46YbjMXTTJw== + version "16.0.8" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-16.0.8.tgz#0d57a5a491d85ae75d372a32e657b1779b86c65d" + integrity sha512-1GwLEkmFafeb/HbE6pC7tFlgYSQ4Iqh2qlWCq8xN+Qfaiaxr2PcLfuhfRFRYqI6XJyeFoLYyKnhFbNsst9FMtQ== dependencies: "@types/yargs-parser" "*" "@typescript-eslint/eslint-plugin@^5.30.5": - version "5.47.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.47.0.tgz#dadb79df3b0499699b155839fd6792f16897d910" - integrity sha512-AHZtlXAMGkDmyLuLZsRpH3p4G/1iARIwc/T0vIem2YB+xW6pZaXYXzCBnZSF/5fdM97R9QqZWZ+h3iW10XgevQ== - dependencies: - "@typescript-eslint/scope-manager" "5.47.0" - "@typescript-eslint/type-utils" "5.47.0" - "@typescript-eslint/utils" "5.47.0" + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" + graphemer "^1.4.0" ignore "^5.2.0" natural-compare-lite "^1.4.0" - regexpp "^3.2.0" semver "^7.3.7" tsutils "^3.21.0" "@typescript-eslint/parser@^5.30.5": - version "5.47.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.47.0.tgz#62e83de93499bf4b500528f74bf2e0554e3a6c8d" - integrity sha512-udPU4ckK+R1JWCGdQC4Qa27NtBg7w020ffHqGyAK8pAgOVuNw7YaKXGChk+udh+iiGIJf6/E/0xhVXyPAbsczw== + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.62.0.tgz#1b63d082d849a2fcae8a569248fbe2ee1b8a56c7" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== dependencies: - "@typescript-eslint/scope-manager" "5.47.0" - "@typescript-eslint/types" "5.47.0" - "@typescript-eslint/typescript-estree" "5.47.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" debug "^4.3.4" -"@typescript-eslint/scope-manager@5.47.0": - version "5.47.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.47.0.tgz#f58144a6b0ff58b996f92172c488813aee9b09df" - integrity sha512-dvJab4bFf7JVvjPuh3sfBUWsiD73aiftKBpWSfi3sUkysDQ4W8x+ZcFpNp7Kgv0weldhpmMOZBjx1wKN8uWvAw== +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz#d9457ccc6a0b8d6b37d0eb252a23022478c5460c" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== dependencies: - "@typescript-eslint/types" "5.47.0" - "@typescript-eslint/visitor-keys" "5.47.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/type-utils@5.47.0": - version "5.47.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.47.0.tgz#2b440979c574e317d3473225ae781f292c99e55d" - integrity sha512-1J+DFFrYoDUXQE1b7QjrNGARZE6uVhBqIvdaXTe5IN+NmEyD68qXR1qX1g2u4voA+nCaelQyG8w30SAOihhEYg== +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz#286f0389c41681376cdad96b309cedd17d70346a" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== dependencies: - "@typescript-eslint/typescript-estree" "5.47.0" - "@typescript-eslint/utils" "5.47.0" + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" debug "^4.3.4" tsutils "^3.21.0" -"@typescript-eslint/types@5.47.0": - version "5.47.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.47.0.tgz#67490def406eaa023dbbd8da42ee0d0c9b5229d3" - integrity sha512-eslFG0Qy8wpGzDdYKu58CEr3WLkjwC5Usa6XbuV89ce/yN5RITLe1O8e+WFEuxnfftHiJImkkOBADj58ahRxSg== +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/typescript-estree@5.47.0": - version "5.47.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.47.0.tgz#ed971a11c5c928646d6ba7fc9dfdd6e997649aca" - integrity sha512-LxfKCG4bsRGq60Sqqu+34QT5qT2TEAHvSCCJ321uBWywgE2dS0LKcu5u+3sMGo+Vy9UmLOhdTw5JHzePV/1y4Q== +"@typescript-eslint/typescript-estree@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz#7d17794b77fabcac615d6a48fb143330d962eb9b" + integrity sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA== dependencies: - "@typescript-eslint/types" "5.47.0" - "@typescript-eslint/visitor-keys" "5.47.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/utils@5.47.0", "@typescript-eslint/utils@^5.10.0": - version "5.47.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.47.0.tgz#b5005f7d2696769a1fdc1e00897005a25b3a0ec7" - integrity sha512-U9xcc0N7xINrCdGVPwABjbAKqx4GK67xuMV87toI+HUqgXj26m6RBp9UshEXcTrgCkdGYFzgKLt8kxu49RilDw== +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.62.0.tgz#141e809c71636e4a75daa39faed2fb5f4b10df86" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== dependencies: + "@eslint-community/eslint-utils" "^4.2.0" "@types/json-schema" "^7.0.9" "@types/semver" "^7.3.12" - "@typescript-eslint/scope-manager" "5.47.0" - "@typescript-eslint/types" "5.47.0" - "@typescript-eslint/typescript-estree" "5.47.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" eslint-scope "^5.1.1" - eslint-utils "^3.0.0" semver "^7.3.7" -"@typescript-eslint/visitor-keys@5.47.0": - version "5.47.0" - resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.47.0.tgz#4aca4efbdf6209c154df1f7599852d571b80bb45" - integrity sha512-ByPi5iMa6QqDXe/GmT/hR6MZtVPi0SqMQPDx15FczCBXJo/7M8T88xReOALAfpBLm+zxpPfmhuEvPb577JRAEg== +"@typescript-eslint/visitor-keys@5.62.0": + version "5.62.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz#2174011917ce582875954ffe2f6912d5931e353e" + integrity sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw== dependencies: - "@typescript-eslint/types" "5.47.0" + "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -JSONStream@^1.0.4: +"@ungap/structured-clone@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" + integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== + +"@xmldom/xmldom@^0.8.8": + version "0.8.10" + resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz#a1337ca426aa61cef9fe15b5b28e340a72f6fa99" + integrity sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw== + +JSONStream@^1.0.4, JSONStream@^1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" integrity sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ== @@ -2314,32 +2439,39 @@ acorn-walk@^7.1.1: integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn-walk@^8.1.1, acorn-walk@^8.2.0: - version "8.2.0" - resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.2.0.tgz#741210f2e2426454508853a2f44d0ab83b7f69c1" - integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + version "8.3.0" + resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.0.tgz#2097665af50fd0cf7a2dfccd2b9368964e66540f" + integrity sha512-FS7hV565M5l1R08MXqo8odwMTB02C2UqzB17RVgu9EyuYFBqJZ3/ZY97sQD5FewVu1UyDFc1yztUDrAwT0EypA== acorn@^7.1.1: version "7.4.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.0, acorn@^8.8.0: - version "8.8.1" - resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.1.tgz#0a3f9cbecc4ec3bea6f0a80b66ae8dd2da250b73" - integrity sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA== +acorn@^8.2.4, acorn@^8.4.1, acorn@^8.7.0, acorn@^8.9.0: + version "8.11.2" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" + integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== add-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/add-stream/-/add-stream-1.0.0.tgz#6a7990437ca736d5e1288db92bd3266d5f5cb2aa" integrity sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ== -agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: +agent-base@6: version "6.0.2" resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77" integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== dependencies: debug "4" +agent-base@^7.0.2, agent-base@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.0.tgz#536802b76bc0b34aa50195eb2442276d613e3434" + integrity sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg== + dependencies: + debug "^4.3.4" + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a" @@ -2348,7 +2480,7 @@ aggregate-error@^3.0.0: clean-stack "^2.0.0" indent-string "^4.0.0" -ajv@^6.10.0, ajv@^6.12.4: +ajv@^6.12.4: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2359,9 +2491,9 @@ ajv@^6.10.0, ajv@^6.12.4: uri-js "^4.2.2" ajv@^8.11.0: - version "8.11.2" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.2.tgz#aecb20b50607acf2569b6382167b65a96008bb78" - integrity sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg== + version "8.12.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.12.0.tgz#d1a0527323e22f53562c567c00991577dfbe19d1" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== dependencies: fast-deep-equal "^3.1.1" json-schema-traverse "^1.0.0" @@ -2380,20 +2512,13 @@ ansi-align@^3.0.1: dependencies: string-width "^4.1.0" -ansi-escapes@^4.2.1: +ansi-escapes@^4.2.1, ansi-escapes@^4.3.2: version "4.3.2" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" -ansi-escapes@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-6.0.0.tgz#68c580e87a489f6df3d761028bb93093fde6bd8a" - integrity sha512-IG23inYII3dWlU2EyiAiGj6Bwal5GzsgPMwjYGvc1HPE2dgbj4ZB5ToWBKSquKw74nB3TIuOwaI6/jSULzfgrw== - dependencies: - type-fest "^3.0.0" - ansi-fragments@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" @@ -2490,20 +2615,28 @@ arr-union@^3.1.0: resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz#fabe8bc193fea865f317fe7807085ee0dee5aead" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + array-ify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece" integrity sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng== -array-includes@^3.1.5, array-includes@^3.1.6: - version "3.1.6" - resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.6.tgz#9e9e720e194f198266ba9e18c29e6a9b0e4b225f" - integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== +array-includes@^3.1.6: + version "3.1.7" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.1.7.tgz#8cd2e01b26f7a3086cbc87271593fe921c62abda" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" is-string "^1.0.7" array-union@^2.1.0: @@ -2516,37 +2649,60 @@ array-unique@^0.3.2: resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" integrity sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ== +array.prototype.flat@^1.3.1: + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz#1476217df8cff17d72ee8f3ba06738db5b387d18" + integrity sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + array.prototype.flatmap@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz#1aae7903c2100433cb8261cd4ed310aab5c4a183" - integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + version "1.3.2" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz#c9a7c6831db8e719d6ce639190146c24bbd3e527" + integrity sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" array.prototype.map@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.5.tgz#6e43c2fee6c0fb5e4806da2dc92eb00970809e55" - integrity sha512-gfaKntvwqYIuC7mLLyv2wzZIJqrRhn5PZ9EfFejSx6a78sV7iDsGpG9P+3oUPtm1Rerqm6nrKS4FYuTIvWfo3g== + version "1.0.6" + resolved "https://registry.yarnpkg.com/array.prototype.map/-/array.prototype.map-1.0.6.tgz#6a3d23f7192b2066eb97666ccc34118cb8163950" + integrity sha512-nK1psgF2cXqP3wSyCSq0Hc7zwNq3sfljQqaG27r/7a7ooNUnn5nGq6yYWyks9jMO5EoFQ0ax80hSg6oXSRNXaw== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" es-array-method-boxes-properly "^1.0.0" is-string "^1.0.7" array.prototype.tosorted@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz#ccf44738aa2b5ac56578ffda97c03fd3e23dd532" - integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + version "1.1.2" + resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.2.tgz#620eff7442503d66c799d95503f82b475745cefd" + integrity sha512-HuQCHOlk1Weat5jzStICBCd83NxiIMwqDg/dHEsoefabn/hJRj5pVdWcPUSpRrwhwxZOsQassMpgN/xRYFBMIg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +arraybuffer.prototype.slice@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz#98bd561953e3e74bb34938e77647179dfe6e9f12" + integrity sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw== dependencies: + array-buffer-byte-length "^1.0.0" call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - es-shim-unscopables "^1.0.0" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" arrify@^1.0.1: version "1.0.1" @@ -2570,7 +2726,7 @@ ast-types@0.14.2: dependencies: tslib "^2.0.1" -ast-types@^0.13.2: +ast-types@^0.13.4: version "0.13.4" resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782" integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w== @@ -2601,6 +2757,13 @@ async@^2.4.0: dependencies: lodash "^4.17.14" +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz#8c5df0514936cdd133604dfcc9d3fb93f09b2b62" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -2611,6 +2774,11 @@ atob@^2.1.2: resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + babel-core@^7.0.0-bridge.0: version "7.0.0-bridge.0" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-7.0.0-bridge.0.tgz#95a492ddd90f9b4e9a4a1da14eb335b87b634ece" @@ -2651,29 +2819,29 @@ babel-plugin-jest-hoist@^26.6.2: "@types/babel__core" "^7.0.0" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.3.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" - integrity sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q== +babel-plugin-polyfill-corejs2@^0.4.6: + version "0.4.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.6.tgz#b2df0251d8e99f229a8e60fc4efa9a68b41c8313" + integrity sha512-jhHiWVZIlnPbEUKSSNb9YoWcQGdlTLq7z1GHL4AjFxaoOUMuuEVJ+Y4pAaQUGOGk93YsVCKPbqbfw3m0SM6H8Q== dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-define-polyfill-provider" "^0.3.3" - semver "^6.1.1" + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.3" + semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz#56ad88237137eade485a71b52f72dbed57c6230a" - integrity sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA== +babel-plugin-polyfill-corejs3@^0.8.5: + version "0.8.6" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf" + integrity sha512-leDIc4l4tUgU7str5BWLS2h8q2N4Nf6lGZP6UrNDxdtfF2g69eJ5L0H7S8A5Ln/arfFAfHor5InAdZuIOwZdgQ== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" - core-js-compat "^3.25.1" + "@babel/helper-define-polyfill-provider" "^0.4.3" + core-js-compat "^3.33.1" -babel-plugin-polyfill-regenerator@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz#390f91c38d90473592ed43351e801a9d3e0fd747" - integrity sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw== +babel-plugin-polyfill-regenerator@^0.5.3: + version "0.5.3" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5" + integrity sha512-8sHeDOmXC8csczMrYEOf0UTNa4yE2SxV5JGeT/LP1n0OYVDUUFPxG9vdk2AlDlIit4t+Kf0xCtpgXPBwnn/9pw== dependencies: - "@babel/helper-define-polyfill-provider" "^0.3.3" + "@babel/helper-define-polyfill-provider" "^0.4.3" babel-plugin-syntax-trailing-function-commas@^7.0.0-beta.0: version "7.0.0-beta.0" @@ -2762,12 +2930,17 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +basic-ftp@^5.0.2: + version "5.0.3" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.3.tgz#b14c0fe8111ce001ec913686434fe0c2fb461228" + integrity sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g== + before-after-hook@^2.2.0: version "2.2.3" resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.2.3.tgz#c51e809c81a4e354084422b9b26bad88249c517c" integrity sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ== -big-integer@1.6.x: +big-integer@1.6.x, big-integer@^1.6.44: version "1.6.51" resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686" integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg== @@ -2791,18 +2964,18 @@ bl@^5.0.0: readable-stream "^3.4.0" boxen@^7.0.0: - version "7.0.1" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.0.1.tgz#cd84db4364a8bae65f1f016ce94a21ec2c832c16" - integrity sha512-8k2eH6SRAK00NDl1iX5q17RJ8rfl53TajdYxE3ssMLehbg487dEVgsad4pIsZb/QqBgYWIl6JOauMTLGX2Kpkw== + version "7.1.1" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-7.1.1.tgz#f9ba525413c2fec9cdb88987d835c4f7cad9c8f4" + integrity sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog== dependencies: ansi-align "^3.0.1" - camelcase "^7.0.0" - chalk "^5.0.1" + camelcase "^7.0.1" + chalk "^5.2.0" cli-boxes "^3.0.0" string-width "^5.1.2" type-fest "^2.13.0" widest-line "^4.0.1" - wrap-ansi "^8.0.1" + wrap-ansi "^8.1.0" bplist-creator@0.1.0: version "0.1.0" @@ -2818,6 +2991,13 @@ bplist-parser@0.3.1: dependencies: big-integer "1.6.x" +bplist-parser@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e" + integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw== + dependencies: + big-integer "^1.6.44" + brace-expansion@^1.1.7: version "1.1.11" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" @@ -2861,15 +3041,15 @@ browser-process-hrtime@^1.0.0: resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz#3c9b4b7d782c8121e56f10106d84c0d0ffc94626" integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== -browserslist@^4.20.4, browserslist@^4.21.3, browserslist@^4.21.4: - version "4.21.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" - integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== +browserslist@^4.20.4, browserslist@^4.21.9, browserslist@^4.22.1: + version "4.22.1" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.1.tgz#ba91958d1a59b87dab6fed8dfbcb3da5e2e9c619" + integrity sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ== dependencies: - caniuse-lite "^1.0.30001400" - electron-to-chromium "^1.4.251" - node-releases "^2.0.6" - update-browserslist-db "^1.0.9" + caniuse-lite "^1.0.30001541" + electron-to-chromium "^1.4.535" + node-releases "^2.0.13" + update-browserslist-db "^1.0.13" bser@2.1.1: version "2.1.1" @@ -2899,16 +3079,18 @@ buffer@^6.0.3: base64-js "^1.3.1" ieee754 "^1.2.1" +bundle-name@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a" + integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw== + dependencies: + run-applescript "^5.0.0" + bytes@3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== -bytes@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" - integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== - cache-base@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" @@ -2929,26 +3111,27 @@ cacheable-lookup@^7.0.0: resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-7.0.0.tgz#3476a8215d046e5a3202a9209dd13fec1f933a27" integrity sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w== -cacheable-request@^10.2.1: - version "10.2.7" - resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.7.tgz#8bb8da66338f321b3cbbc34a71ac231178171bcc" - integrity sha512-I4SA6mKgDxcxVbSt/UmIkb9Ny8qSkg6ReBHtAAXnZHk7KOSx5g3DTiAOaYzcHCs6oOdHn+bip9T48E6tMvK9hw== +cacheable-request@^10.2.8: + version "10.2.14" + resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-10.2.14.tgz#eb915b665fda41b79652782df3f553449c406b9d" + integrity sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ== dependencies: - "@types/http-cache-semantics" "^4.0.1" + "@types/http-cache-semantics" "^4.0.2" get-stream "^6.0.1" http-cache-semantics "^4.1.1" - keyv "^4.5.2" + keyv "^4.5.3" mimic-response "^4.0.0" normalize-url "^8.0.0" responselike "^3.0.0" -call-bind@^1.0.0, call-bind@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c" - integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== +call-bind@^1.0.0, call-bind@^1.0.2, call-bind@^1.0.4, call-bind@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.5.tgz#6fa2b7845ce0ea49bf4d8b9ef64727a2c2e2e513" + integrity sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ== dependencies: - function-bind "^1.1.1" - get-intrinsic "^1.0.2" + function-bind "^1.1.2" + get-intrinsic "^1.2.1" + set-function-length "^1.1.1" caller-callsite@^2.0.0: version "2.0.0" @@ -2993,15 +3176,15 @@ camelcase@^6.0.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a" integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== -camelcase@^7.0.0: +camelcase@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-7.0.1.tgz#f02e50af9fd7782bc8b88a3558c32fd3a388f048" integrity sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw== -caniuse-lite@^1.0.30001400: - version "1.0.30001439" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001439.tgz#ab7371faeb4adff4b74dad1718a6fd122e45d9cb" - integrity sha512-1MgUzEkoMO6gKfXflStpYgZDlFM7M/ck/bgfVCACO5vnAf0fXoNVHdWtqGU+MYca+4bL9Z5bpOVmR33cWW9G2A== +caniuse-lite@^1.0.30001541: + version "1.0.30001561" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001561.tgz#752f21f56f96f1b1a52e97aae98c57c562d5d9da" + integrity sha512-NTt0DNoKe958Q0BE0j0c1V9jbUzhBxHIEJy7asmGrpE0yG63KTV7PLHPnK2E1O9RsQrQ081I3NLuXGS6zht3cw== capture-exit@^2.0.0: version "2.0.0" @@ -3010,12 +3193,12 @@ capture-exit@^2.0.0: dependencies: rsvp "^4.8.4" -chalk@5.1.2: - version "5.1.2" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.1.2.tgz#d957f370038b75ac572471e83be4c5ca9f8e8c45" - integrity sha512-E5CkT4jWURs1Vy5qGJye+XwCkNj7Od3Af7CP6SujMetSMkLs8Do2RWJK5yx1wamHV/op8Rz+9rltjaTQWDnEFQ== +chalk@5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" + integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== -chalk@^2.0.0, chalk@^2.0.1, chalk@^2.4.2: +chalk@^2.0.1, chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3032,10 +3215,10 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^5.0.0, chalk@^5.0.1, chalk@^5.1.2: - version "5.2.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.2.0.tgz#249623b7d66869c673699fb66d65723e54dfcfb3" - integrity sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA== +chalk@^5.0.0, chalk@^5.0.1, chalk@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== char-regex@^1.0.2: version "1.0.2" @@ -3053,9 +3236,9 @@ ci-info@^2.0.0: integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== ci-info@^3.2.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.7.0.tgz#6d01b3696c59915b6ce057e4aa4adfc2fa25f5ef" - integrity sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog== + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== cjs-module-lexer@^0.6.0: version "0.6.0" @@ -3104,14 +3287,14 @@ cli-cursor@^4.0.0: restore-cursor "^4.0.0" cli-spinners@^2.0.0, cli-spinners@^2.5.0, cli-spinners@^2.6.1: - version "2.7.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.7.0.tgz#f815fd30b5f9eaac02db604c7a231ed7cb2f797a" - integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== + version "2.9.1" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.1.tgz#9c0b9dad69a6d47cbb4333c14319b060ed395a35" + integrity sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ== cli-width@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.0.0.tgz#a5622f6a3b0a9e3e711a25f099bf2399f608caf6" - integrity sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw== + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== cliui@^6.0.0: version "6.0.0" @@ -3160,9 +3343,9 @@ co@^4.6.0: integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== collect-v8-coverage@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" - integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== + version "1.0.2" + resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz#c0b29bcd33bcd0779a1344c2136051e6afd3d9e9" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== collection-visit@^1.0.0: version "1.0.0" @@ -3224,12 +3407,12 @@ commander@~2.13.0: integrity sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA== commitlint@^17.3.0: - version "17.3.0" - resolved "https://registry.yarnpkg.com/commitlint/-/commitlint-17.3.0.tgz#325f3786e2f765d96fd1d7a18f8e78362e959385" - integrity sha512-jKytr2eesn2HpRZrr/37O1AQkDsR4VTIVRoAe4oJF3Eg22jp8gaIMvC0/YDoLzNPQEH5VXNhP/uvco70ritGEA== + version "17.8.1" + resolved "https://registry.yarnpkg.com/commitlint/-/commitlint-17.8.1.tgz#0a0b9b952f34d9718f06502ee8496785bf3dd8a3" + integrity sha512-X+VPJwZsQDeGj/DG1NsxhZEl+oMHKNC+1myZ/zauNDoo+7OuLHfTOUU1C1a4CjKW4b6T7NuoFcYfK0kRCjCtbA== dependencies: - "@commitlint/cli" "^17.3.0" - "@commitlint/types" "^17.0.0" + "@commitlint/cli" "^17.8.1" + "@commitlint/types" "^17.8.1" commondir@^1.0.1: version "1.0.1" @@ -3326,7 +3509,7 @@ connect@^3.6.5: parseurl "~1.3.3" utils-merge "1.0.1" -conventional-changelog-angular@^5.0.11, conventional-changelog-angular@^5.0.12: +conventional-changelog-angular@^5.0.12: version "5.0.13" resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-5.0.13.tgz#896885d63b914a70d4934b59d2fe7bde1832b28c" integrity sha512-i/gipMxs7s8L/QeuavPF2hLnJgH6pEZAttySB6aiQLWcX3puWDL3ACVmvBhJGxnAy52Qc15ua26BufY6KpmrVA== @@ -3334,6 +3517,13 @@ conventional-changelog-angular@^5.0.11, conventional-changelog-angular@^5.0.12: compare-func "^2.0.0" q "^1.5.1" +conventional-changelog-angular@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/conventional-changelog-angular/-/conventional-changelog-angular-6.0.0.tgz#a9a9494c28b7165889144fd5b91573c4aa9ca541" + integrity sha512-6qLgrBF4gueoC7AFVHu51nHL9pF9FRjXrH+ceVf7WmAfH3gs+gEYOkvxhjMPjZu57I4AGUGoNTY8V7Hrgf1uqg== + dependencies: + compare-func "^2.0.0" + conventional-changelog-atom@^2.0.8: version "2.0.8" resolved "https://registry.yarnpkg.com/conventional-changelog-atom/-/conventional-changelog-atom-2.0.8.tgz#a759ec61c22d1c1196925fca88fe3ae89fd7d8de" @@ -3467,7 +3657,7 @@ conventional-commits-filter@^2.0.7: lodash.ismatch "^4.4.0" modify-values "^1.0.0" -conventional-commits-parser@^3.2.0, conventional-commits-parser@^3.2.2: +conventional-commits-parser@^3.2.0: version "3.2.4" resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-3.2.4.tgz#a7d3b77758a202a9b2293d2112a8d8052c740972" integrity sha512-nK7sAtfi+QXbxHCYfhpZsfRtaitZLIA6889kFIouLvz6repszQDgxBu7wf2WbU+Dco7sAnNCJYERCwt54WPC2Q== @@ -3479,6 +3669,16 @@ conventional-commits-parser@^3.2.0, conventional-commits-parser@^3.2.2: split2 "^3.0.0" through2 "^4.0.0" +conventional-commits-parser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/conventional-commits-parser/-/conventional-commits-parser-4.0.0.tgz#02ae1178a381304839bce7cea9da5f1b549ae505" + integrity sha512-WRv5j1FsVM5FISJkoYMR6tPk07fkKT0UodruX4je86V4owk451yjXAKzKAPOs9l7y59E2viHUS9eQ+dfUA9NSg== + dependencies: + JSONStream "^1.3.5" + is-text-path "^1.0.1" + meow "^8.1.2" + split2 "^3.2.2" + conventional-recommended-bump@^6.1.0: version "6.1.0" resolved "https://registry.yarnpkg.com/conventional-recommended-bump/-/conventional-recommended-bump-6.1.0.tgz#cfa623285d1de554012f2ffde70d9c8a22231f55" @@ -3493,22 +3693,27 @@ conventional-recommended-bump@^6.1.0: meow "^8.0.0" q "^1.5.1" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.6.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + copy-descriptor@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" integrity sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw== -core-js-compat@^3.25.1: - version "3.26.1" - resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.26.1.tgz#0e710b09ebf689d719545ac36e49041850f943df" - integrity sha512-622/KzTudvXCDLRw70iHW4KKs1aGpcRcowGWyYJr2DEBfRrd6hNJybxSWJFuZYD4ma86xhrwDDHxmDaIq4EA8A== +core-js-compat@^3.31.0, core-js-compat@^3.33.1: + version "3.33.2" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.33.2.tgz#3ea4563bfd015ad4e4b52442865b02c62aba5085" + integrity sha512-axfo+wxFVxnqf8RvxTzoAlzW4gRoacrHeoFlc9n0x50+7BEyZL/Rt3hicaED1/CEd7I6tPCPVUYcJwCMO5XUYw== dependencies: - browserslist "^4.21.4" + browserslist "^4.22.1" core-util-is@~1.0.0: version "1.0.3" @@ -3516,14 +3721,14 @@ core-util-is@~1.0.0: integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== cosmiconfig-typescript-loader@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.3.0.tgz#c4259ce474c9df0f32274ed162c0447c951ef073" - integrity sha512-NTxV1MFfZDLPiBMjxbHRwSh5LaLcPMwNdCutmnHJCKoVnlvldPWlllonKwrsRJ5pYZBIBGRWWU2tfvzxgeSW5Q== + version "4.4.0" + resolved "https://registry.yarnpkg.com/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz#f3feae459ea090f131df5474ce4b1222912319f9" + integrity sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw== -cosmiconfig@8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.0.0.tgz#e9feae014eab580f858f8a0288f38997a7bebe97" - integrity sha512-da1EafcpH6b/TD8vDRaWV7xFINlHlF6zKsGwS1TsuVJTZRkquaS5HTMq7uq6h31619QjbsYl21gVDOm32KM1vQ== +cosmiconfig@8.1.3: + version "8.1.3" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.1.3.tgz#0e614a118fcc2d9e5afc2f87d53cd09931015689" + integrity sha512-/UkO2JKI18b5jVMJUp0lvKFMpa/Gye+ZgZjKD+DGEN9y7NRcf/nK1A0sp67ONmKtnDCNMS44E6jrk0Yc3bDuUw== dependencies: import-fresh "^3.2.1" js-yaml "^4.1.0" @@ -3551,6 +3756,16 @@ cosmiconfig@^7.0.0, cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^8.0.0: + version "8.3.6" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-8.3.6.tgz#060a2b871d66dba6c8538ea1118ba1ac16f5fae3" + integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -3601,24 +3816,24 @@ cssstyle@^2.3.0: cssom "~0.3.6" csstype@^3.0.2: - version "3.1.1" - resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.1.tgz#841b532c45c758ee546a11d5bd7b7b473c8c30b9" - integrity sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw== + version "3.1.2" + resolved "https://registry.yarnpkg.com/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== dargs@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-7.0.0.tgz#04015c41de0bcb69ec84050f3d9be0caf8d6d5cc" integrity sha512-2iy1EkLdlBzQGvbweYRFxmFath8+K7+AKB0TlhHWkNuH+TmovaMH/Wp7V7R4u7f4SnX3OgLsU9t1NI9ioDnUpg== -data-uri-to-buffer@3: - version "3.0.1" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-3.0.1.tgz#594b8973938c5bc2c33046535785341abc4f3636" - integrity sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og== - data-uri-to-buffer@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.0.tgz#b5db46aea50f6176428ac05b73be39a57701a64b" - integrity sha512-Vr3mLBA8qWmcuschSLAOogKgQ/Jwxulv3RNE4FXnYWRGujzrRWQI4m12fQqRkwX06C0KanhLr4hK+GydchZsaA== + version "4.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" + integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== + +data-uri-to-buffer@^6.0.0: + version "6.0.1" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.1.tgz#540bd4c8753a25ee129035aebdedf63b078703c7" + integrity sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg== data-urls@^2.0.0: version "2.0.0" @@ -3635,9 +3850,9 @@ dateformat@^3.0.0: integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q== dayjs@^1.8.15: - version "1.11.7" - resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.7.tgz#4b296922642f70999544d1144a2c25730fce63e2" - integrity sha512-+Yw9U6YO5TQohxLcIkrXBeY73WP3ejHWVvx8XCk3gxvQDCTEmS48ZrSZCKciI7Bhl/uCMyxYtE9UqRILmFphkQ== + version "1.11.10" + resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.10.tgz#68acea85317a6e164457d6d6947564029a6a16a0" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== debug@2.6.9, debug@^2.2.0, debug@^2.3.3: version "2.6.9" @@ -3704,9 +3919,27 @@ deepmerge@^3.2.0: integrity sha512-GRQOafGHwMHpjPx9iCvTgpu9NojZ49q794EEL94JVEw6VaeA8XTUyBKvAkOOjBX9oJNiV6G3P+T+tihFjo2TqA== deepmerge@^4.2.2: - version "4.2.2" - resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955" - integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg== + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-browser-id@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c" + integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA== + dependencies: + bplist-parser "^0.2.0" + untildify "^4.0.0" + +default-browser@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da" + integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA== + dependencies: + bundle-name "^3.0.0" + default-browser-id "^3.0.0" + execa "^7.1.1" + titleize "^3.0.0" defaults@^1.0.3: version "1.0.4" @@ -3720,16 +3953,26 @@ defer-to-connect@^2.0.1: resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587" integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg== -define-lazy-prop@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f" - integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== +define-data-property@^1.0.1, define-data-property@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.1.tgz#c35f7cd0ab09883480d12ac5cb213715587800b3" + integrity sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ== + dependencies: + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" -define-properties@^1.1.3, define-properties@^1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1" - integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA== +define-lazy-prop@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f" + integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0, define-properties@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c" + integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg== dependencies: + define-data-property "^1.0.1" has-property-descriptors "^1.0.0" object-keys "^1.1.1" @@ -3755,15 +3998,15 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" -degenerator@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-3.0.2.tgz#6a61fcc42a702d6e50ff6023fe17bff435f68235" - integrity sha512-c0mef3SNQo56t6urUU6tdQAs+ThoD0o9B9MJ8HEt7NQcGEILCRFqQb7ZbP9JAv+QF1Ky5plydhMR/IrqWDm+TQ== +degenerator@^4.0.4: + version "4.0.4" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-4.0.4.tgz#dbeeb602c64ce543c1f17e2c681d1d0cc9d4a0ac" + integrity sha512-MTZdZsuNxSBL92rsjx3VFWe57OpRlikyLbcx2B5Dmdv6oScqpMrvpY7zHLMymrUxo3U5+suPUMsNgW/+SZB1lg== dependencies: - ast-types "^0.13.2" - escodegen "^1.8.1" - esprima "^4.0.0" - vm2 "^3.9.8" + ast-types "^0.13.4" + escodegen "^1.14.3" + esprima "^4.0.1" + vm2 "^3.9.19" del@^6.1.1: version "6.1.1" @@ -3803,7 +4046,7 @@ deprecated-react-native-prop-types@^2.3.0: invariant "*" prop-types "*" -deprecation@^2.0.0, deprecation@^2.3.1: +deprecation@^2.0.0: version "2.3.1" resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919" integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ== @@ -3887,10 +4130,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== -electron-to-chromium@^1.4.251: - version "1.4.284" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" - integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== +electron-to-chromium@^1.4.535: + version "1.4.581" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.581.tgz#23b684c67bf56d4284e95598c05a5d266653b6d8" + integrity sha512-6uhqWBIapTJUxgPTCHH9sqdbxIMPt7oXl0VcAL1kOtlU6aECdcMncCrX5Z7sHQ/invtrC9jUQUef7+HhO8vVFw== emittery@^0.7.1: version "0.7.2" @@ -3920,9 +4163,9 @@ end-of-stream@^1.1.0: once "^1.4.0" envinfo@^7.7.2: - version "7.8.1" - resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" - integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== + version "7.11.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.11.0.tgz#c3793f44284a55ff8c82faf1ffd91bc6478ea01f" + integrity sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg== error-ex@^1.3.1: version "1.3.2" @@ -3946,36 +4189,50 @@ errorhandler@^1.5.0: accepts "~1.3.7" escape-html "~1.0.3" -es-abstract@^1.19.0, es-abstract@^1.20.4: - version "1.20.5" - resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.20.5.tgz#e6dc99177be37cacda5988e692c3fa8b218e95d2" - integrity sha512-7h8MM2EQhsCA7pU/Nv78qOXFpD8Rhqd12gYiSJVkrH9+e8VuA8JlPJK/hQjjlLv6pJvx/z1iRFKzYb0XT/RuAQ== +es-abstract@^1.20.4, es-abstract@^1.22.1: + version "1.22.3" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.22.3.tgz#48e79f5573198de6dee3589195727f4f74bc4f32" + integrity sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA== dependencies: - call-bind "^1.0.2" + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.2" + available-typed-arrays "^1.0.5" + call-bind "^1.0.5" + es-set-tostringtag "^2.0.1" es-to-primitive "^1.2.1" - function-bind "^1.1.1" - function.prototype.name "^1.1.5" - get-intrinsic "^1.1.3" + function.prototype.name "^1.1.6" + get-intrinsic "^1.2.2" get-symbol-description "^1.0.0" + globalthis "^1.0.3" gopd "^1.0.1" - has "^1.0.3" has-property-descriptors "^1.0.0" + has-proto "^1.0.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" + hasown "^2.0.0" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" is-callable "^1.2.7" is-negative-zero "^2.0.2" is-regex "^1.1.4" is-shared-array-buffer "^1.0.2" is-string "^1.0.7" + is-typed-array "^1.1.12" is-weakref "^1.0.2" - object-inspect "^1.12.2" + object-inspect "^1.13.1" object-keys "^1.1.1" object.assign "^4.1.4" - regexp.prototype.flags "^1.4.3" + regexp.prototype.flags "^1.5.1" + safe-array-concat "^1.0.1" safe-regex-test "^1.0.0" - string.prototype.trimend "^1.0.6" - string.prototype.trimstart "^1.0.6" + string.prototype.trim "^1.2.8" + string.prototype.trimend "^1.0.7" + string.prototype.trimstart "^1.0.7" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" unbox-primitive "^1.0.2" + which-typed-array "^1.1.13" es-array-method-boxes-properly@^1.0.0: version "1.0.0" @@ -3983,25 +4240,55 @@ es-array-method-boxes-properly@^1.0.0: integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== es-get-iterator@^1.0.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.2.tgz#9234c54aba713486d7ebde0220864af5e2b283f7" - integrity sha512-+DTO8GYwbMCwbywjimwZMHp8AuYXOS2JZFWoi2AlPOS3ebnII9w/NLpNZtA7A0YLaVDw+O7KFCeoIV7OPvM7hQ== + version "1.1.3" + resolved "https://registry.yarnpkg.com/es-get-iterator/-/es-get-iterator-1.1.3.tgz#3ef87523c5d464d41084b2c3c9c214f1199763d6" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== dependencies: call-bind "^1.0.2" - get-intrinsic "^1.1.0" - has-symbols "^1.0.1" - is-arguments "^1.1.0" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" is-map "^2.0.2" is-set "^2.0.2" - is-string "^1.0.5" + is-string "^1.0.7" isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-iterator-helpers@^1.0.12: + version "1.0.15" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.15.tgz#bd81d275ac766431d19305923707c3efd9f1ae40" + integrity sha512-GhoY8uYqd6iwUl2kgjTm4CZAf6oo5mHK7BPqx3rKgx893YSsy0LGHV6gfqqQvZt/8xM8xeOnfXBCfqclMKkJ5g== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.1" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.2" + safe-array-concat "^1.0.1" + +es-set-tostringtag@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz#11f7cc9f63376930a5f20be4915834f4bc74f9c9" + integrity sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q== + dependencies: + get-intrinsic "^1.2.2" + has-tostringtag "^1.0.0" + hasown "^2.0.0" es-shim-unscopables@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241" - integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + version "1.0.2" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz#1f6942e71ecc7835ed1c8a83006d8771a63a3763" + integrity sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw== dependencies: - has "^1.0.3" + hasown "^2.0.0" es-to-primitive@^1.2.1: version "1.2.1" @@ -4047,7 +4334,7 @@ escape-string-regexp@^5.0.0: resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz#4683126b500b61762f2dbebace1806e8be31b1c8" integrity sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw== -escodegen@^1.8.1: +escodegen@^1.14.3: version "1.14.3" resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-1.14.3.tgz#4e7b81fba61581dc97582ed78cab7f0e8d63f503" integrity sha512-qFcX0XJkdg+PB3xjZZG/wKSuT1PnQWx57+TVSjIMmILd2yC/6ByYElPwJnslDsuWuSAp4AwJGumarAAmJch5Kw== @@ -4060,14 +4347,13 @@ escodegen@^1.8.1: source-map "~0.6.1" escodegen@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.0.0.tgz#5e32b12833e8aa8fa35e1bf0befa89380484c7dd" - integrity sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw== + version "2.1.0" + resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== dependencies: esprima "^4.0.1" estraverse "^5.2.0" esutils "^2.0.2" - optionator "^0.8.1" optionalDependencies: source-map "~0.6.1" @@ -4079,9 +4365,9 @@ eslint-config-prettier@^6.11.0: get-stdin "^6.0.0" eslint-config-prettier@^8.5.0: - version "8.5.0" - resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1" - integrity sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q== + version "8.10.0" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz#3a06a662130807e2502fc3ff8b4143d8a0658e11" + integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== eslint-plugin-eslint-comments@^3.2.0: version "3.2.0" @@ -4131,22 +4417,22 @@ eslint-plugin-react-native-globals@^0.1.1: integrity sha512-9aEPf1JEpiTjcFAmmyw8eiIXmcNZOqaZyHO77wgm0/dWfT/oxC1SrIq8ET38pMxHYrcB6Uew+TzUVsBeczF88g== eslint-plugin-react-native@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.0.0.tgz#eec41984abe4970bdd7c6082dff7a98a5e34d0bb" - integrity sha512-kMmdxrSY7A1WgdqaGC+rY/28rh7kBGNBRsk48ovqkQmdg5j4K+DaFmegENDzMrdLkoufKGRNkKX6bgSwQTCAxQ== + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-native/-/eslint-plugin-react-native-4.1.0.tgz#5343acd3b2246bc1b857ac38be708f070d18809f" + integrity sha512-QLo7rzTBOl43FvVqDdq5Ql9IoElIuTdjrz9SKAXCvULvBoRZ44JGSkx9z4999ZusCsb4rK3gjS8gOGyeYqZv2Q== dependencies: - "@babel/traverse" "^7.7.4" eslint-plugin-react-native-globals "^0.1.1" eslint-plugin-react@^7.30.1: - version "7.31.11" - resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.31.11.tgz#011521d2b16dcf95795df688a4770b4eaab364c8" - integrity sha512-TTvq5JsT5v56wPa9OYHzsrOlHzKZKjV+aLgS+55NJP/cuzdiQPC7PfYoUjMoxlffKtvijpk7vA/jmuqRb9nohw== + version "7.33.2" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz#69ee09443ffc583927eafe86ffebb470ee737608" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== dependencies: array-includes "^3.1.6" array.prototype.flatmap "^1.3.1" array.prototype.tosorted "^1.1.1" doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" estraverse "^5.3.0" jsx-ast-utils "^2.4.1 || ^3.0.0" minimatch "^3.1.2" @@ -4155,8 +4441,8 @@ eslint-plugin-react@^7.30.1: object.hasown "^1.1.2" object.values "^1.1.6" prop-types "^15.8.1" - resolve "^2.0.0-next.3" - semver "^6.3.0" + resolve "^2.0.0-next.4" + semver "^6.3.1" string.prototype.matchall "^4.0.8" eslint-scope@5.1.1, eslint-scope@^5.1.1: @@ -4167,94 +4453,86 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.1.1.tgz#fff34894c2f65e5226d3041ac480b4513a163642" - integrity sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" -eslint-utils@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-3.0.0.tgz#8aebaface7345bb33559db0a1f13a1d2d48c3672" - integrity sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA== - dependencies: - eslint-visitor-keys "^2.0.0" - -eslint-visitor-keys@^2.0.0, eslint-visitor-keys@^2.1.0: +eslint-visitor-keys@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== -eslint-visitor-keys@^3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826" - integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== eslint@^8.28.0: - version "8.30.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.30.0.tgz#83a506125d089eef7c5b5910eeea824273a33f50" - integrity sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ== - dependencies: - "@eslint/eslintrc" "^1.4.0" - "@humanwhocodes/config-array" "^0.11.8" + version "8.53.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.53.0.tgz#14f2c8244298fcae1f46945459577413ba2697ce" + integrity sha512-N4VuiPjXDUa4xVeV/GC/RV3hQW9Nw+Y463lkWaKKXKYMvmRiRDAtfpuPFLN+E1/6ZhyR8J2ig+eVREnYgUsiag== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.3" + "@eslint/js" "8.53.0" + "@humanwhocodes/config-array" "^0.11.13" "@humanwhocodes/module-importer" "^1.0.1" "@nodelib/fs.walk" "^1.2.8" - ajv "^6.10.0" + "@ungap/structured-clone" "^1.2.0" + ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.1.1" - eslint-utils "^3.0.0" - eslint-visitor-keys "^3.3.0" - espree "^9.4.0" - esquery "^1.4.0" + eslint-scope "^7.2.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + esquery "^1.4.2" esutils "^2.0.2" fast-deep-equal "^3.1.3" file-entry-cache "^6.0.1" find-up "^5.0.0" glob-parent "^6.0.2" globals "^13.19.0" - grapheme-splitter "^1.0.4" + graphemer "^1.4.0" ignore "^5.2.0" - import-fresh "^3.0.0" imurmurhash "^0.1.4" is-glob "^4.0.0" is-path-inside "^3.0.3" - js-sdsl "^4.1.4" js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" - optionator "^0.9.1" - regexpp "^3.2.0" + optionator "^0.9.3" strip-ansi "^6.0.1" - strip-json-comments "^3.1.0" text-table "^0.2.0" -espree@^9.4.0: - version "9.4.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-9.4.1.tgz#51d6092615567a2c2cff7833445e37c28c0065bd" - integrity sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg== +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== dependencies: - acorn "^8.8.0" + acorn "^8.9.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.3.0" + eslint-visitor-keys "^3.4.1" esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" - integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== dependencies: estraverse "^5.1.0" @@ -4295,14 +4573,14 @@ exec-sh@^0.3.2: resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.6.tgz#ff264f9e325519a60cb5e273692943483cca63bc" integrity sha512-nQn+hI3yp+oD0huYhKwvYI32+JFeq+XkNcD1GAo3Y/MjxsfVGmrrzrnzjWiNY6f+pUCP440fThsFh5gZrRAU/w== -execa@6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-6.1.0.tgz#cea16dee211ff011246556388effa0818394fb20" - integrity sha512-QVWlX2e50heYJcCPG0iWtf8r0xjEYfz/OYLGDYH+IyjWezzPNxz63qNFOu0l4YftGWuizFVZHHs8PrLU5p2IDA== +execa@7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43" + integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q== dependencies: cross-spawn "^7.0.3" get-stream "^6.0.1" - human-signals "^3.0.1" + human-signals "^4.3.0" is-stream "^3.0.0" merge-stream "^2.0.0" npm-run-path "^5.1.0" @@ -4353,6 +4631,21 @@ execa@^5.0.0, execa@^5.1.1: signal-exit "^3.0.3" strip-final-newline "^2.0.0" +execa@^7.1.1: + version "7.2.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-7.2.0.tgz#657e75ba984f42a70f38928cedc87d6f2d4fe4e9" + integrity sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.1" + human-signals "^4.3.0" + is-stream "^3.0.0" + merge-stream "^2.0.0" + npm-run-path "^5.1.0" + onetime "^6.0.0" + signal-exit "^3.0.7" + strip-final-newline "^3.0.0" + exit@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -4427,14 +4720,14 @@ fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== fast-diff@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" - integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== + version "1.3.0" + resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== fast-glob@^3.2.11, fast-glob@^3.2.9: - version "3.2.12" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80" - integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w== + version "3.3.2" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" + integrity sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow== dependencies: "@nodelib/fs.stat" "^2.0.2" "@nodelib/fs.walk" "^1.2.3" @@ -4453,9 +4746,9 @@ fast-levenshtein@^2.0.6, fast-levenshtein@~2.0.6: integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== fastq@^1.6.0: - version "1.14.0" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.14.0.tgz#107f69d7295b11e0fccc264e1fc6389f623731ce" - integrity sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg== + version "1.15.0" + resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.15.0.tgz#d04d07c6a2a68fe4599fea8d2e103a937fae6b3a" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== dependencies: reusify "^1.0.4" @@ -4489,11 +4782,6 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" -file-uri-to-path@2: - version "2.0.0" - resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-2.0.0.tgz#7b415aeba227d575851e0a5b0c640d7656403fba" - integrity sha512-hjPFI8oE/2iQPVe4gbrJ73Pp+Xfub2+WI2LlXDbsaJBwT5wuMh35WNWVYYTpnz895shtwfyutMFLFywpQAFdLg== - fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -4571,28 +4859,36 @@ find-versions@^4.0.0: semver-regex "^3.1.2" flat-cache@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" - integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + version "3.1.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.1.1.tgz#a02a15fdec25a8f844ff7cc658f03dd99eb4609b" + integrity sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q== dependencies: - flatted "^3.1.0" + flatted "^3.2.9" + keyv "^4.5.3" rimraf "^3.0.2" -flatted@^3.1.0: - version "3.2.7" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.7.tgz#609f39207cb614b89d0765b477cb2d437fbf9787" - integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== +flatted@^3.2.9: + version "3.2.9" + resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.9.tgz#7eb4c67ca1ba34232ca9d2d93e9886e611ad7daf" + integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== flow-parser@0.*: - version "0.196.1" - resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.196.1.tgz#3c31f102454518f0c68eeb99f57501c2a0c9bff0" - integrity sha512-V3yaKHyBWhl+LF6sxgbfqxMlwoFKs8UKh2DYTrGj1AHi9ST7Zyp+9ToF4l9eoL6l/DxdFwCNF3MAJ1vCVrgJmw== + version "0.221.0" + resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.221.0.tgz#e11d7b7d19fb4ce08c3e54461476af4111a62fd0" + integrity sha512-i+GzdLcKYy5bxhx1N+FIcR1bTqssuVWTJcuytMhwqLAxifz46g4BSNicWXGrtzT0HibJUBIzZOYA3FveJucTPg== flow-parser@^0.121.0: version "0.121.0" resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.121.0.tgz#9f9898eaec91a9f7c323e9e992d81ab5c58e618f" integrity sha512-1gIBiWJNR0tKUNv8gZuk7l9rVX06OuLzY9AoGio7y/JT4V1IZErEMEq2TJS+PFcw/y0RshZ1J/27VfK1UQzYVg== +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.3.tgz#69b447e88a0a5d32c3e7084f3f1710034b21376e" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + for-in@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" @@ -4603,15 +4899,6 @@ form-data-encoder@^2.1.2: resolved "https://registry.yarnpkg.com/form-data-encoder/-/form-data-encoder-2.1.4.tgz#261ea35d2a70d48d30ec7a9603130fa5515e9cd5" integrity sha512-yDYSgNMraqvnxiEXO4hi88+YZxaHC6QKzb5N84iRCTDeRO7ZALpir/lVmf/uXUhnwUr2O4HU8s/n6x+yNjQkHw== -form-data@4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" - integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - form-data@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" @@ -4649,7 +4936,7 @@ fs-extra@^1.0.0: jsonfile "^2.1.0" klaw "^1.0.0" -fs-extra@^10.0.0, fs-extra@^10.1.0: +fs-extra@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.1.0.tgz#02873cfbc4084dde127eaa5f9905eef2325d1abf" integrity sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ== @@ -4658,6 +4945,15 @@ fs-extra@^10.0.0, fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.0.0: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-8.1.0.tgz#49d43c45a88cd9677668cb7be1b46efdb8d2e1c0" @@ -4673,34 +4969,26 @@ fs.realpath@^1.0.0: integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== fsevents@^2.1.2, fsevents@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - -ftp@^0.3.10: - version "0.3.10" - resolved "https://registry.yarnpkg.com/ftp/-/ftp-0.3.10.tgz#9197d861ad8142f3e63d5a83bfe4c59f7330885d" - integrity sha512-faFVML1aBx2UoDStmLwv2Wptt4vw5x03xxX172nhA5Y5HBshW5JweqQ2W4xL4dezQTG8inJsuYcpPHHU3X5OTQ== - dependencies: - readable-stream "1.1.x" - xregexp "2.0.0" + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -function-bind@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" - integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== +function-bind@^1.1.1, function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== -function.prototype.name@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621" - integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== +function.prototype.name@^1.1.5, function.prototype.name@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd" + integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - es-abstract "^1.19.0" - functions-have-names "^1.2.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" -functions-have-names@^1.2.2: +functions-have-names@^1.2.3: version "1.2.3" resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== @@ -4715,14 +5003,15 @@ get-caller-file@^2.0.1, get-caller-file@^2.0.5: resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.1.3.tgz#063c84329ad93e83893c7f4f243ef63ffa351385" - integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A== +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1, get-intrinsic@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.2.2.tgz#281b7622971123e1ef4b3c90fd7539306da93f3b" + integrity sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA== dependencies: - function-bind "^1.1.1" - has "^1.0.3" + function-bind "^1.1.2" + has-proto "^1.0.1" has-symbols "^1.0.3" + hasown "^2.0.0" get-package-type@^0.1.0: version "0.1.0" @@ -4771,24 +5060,22 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-uri@3: - version "3.0.2" - resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-3.0.2.tgz#f0ef1356faabc70e1f9404fa3b66b2ba9bfc725c" - integrity sha512-+5s0SJbGoyiJTZZ2JTpFPLMPSch72KEqGOTvQsBqg0RBWvwhWUSYZFAtz3TPW0GXJuLBJPts1E241iHg+VRfhg== +get-uri@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.2.tgz#e019521646f4a8ff6d291fbaea2c46da204bb75b" + integrity sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw== dependencies: - "@tootallnate/once" "1" - data-uri-to-buffer "3" - debug "4" - file-uri-to-path "2" + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.0" + debug "^4.3.4" fs-extra "^8.1.0" - ftp "^0.3.10" 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" integrity sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA== -git-raw-commits@^2.0.0, git-raw-commits@^2.0.8: +git-raw-commits@^2.0.11, git-raw-commits@^2.0.8: version "2.0.11" resolved "https://registry.yarnpkg.com/git-raw-commits/-/git-raw-commits-2.0.11.tgz#bc3576638071d18655e1cc60d7f524920008d723" integrity sha512-VnctFhw+xfj8Va1xtfEqCUD2XDrbAPSJx+hSrE5K7fGdjZruW7XV+QOrN7LF/RJyvspRiD2I0asWsxFp0ya26A== @@ -4864,9 +5151,9 @@ glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4: path-is-absolute "^1.0.0" glob@^8.0.3: - version "8.0.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-8.0.3.tgz#415c6eb2deed9e502c68fa44a272e6da6eeca42e" - integrity sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ== + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== dependencies: fs.realpath "^1.0.0" inflight "^1.0.4" @@ -4894,16 +5181,23 @@ globals@^11.1.0: integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== globals@^13.19.0: - version "13.19.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-13.19.0.tgz#7a42de8e6ad4f7242fbcca27ea5b23aca367b5c8" - integrity sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ== + version "13.23.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.23.0.tgz#ef31673c926a0976e1f61dab4dca57e0c0a8af02" + integrity sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA== dependencies: type-fest "^0.20.2" -globby@13.1.2: - version "13.1.2" - resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.2.tgz#29047105582427ab6eca4f905200667b056da515" - integrity sha512-LKSDZXToac40u8Q1PQtZihbNdTYSNMuWe+K5l+oa6KgDzSvVrHXlJy40hUP522RjAIoNLJYBJi7ow+rbFpIhHQ== +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.3.tgz#5852882a52b80dc301b0660273e1ed082f0b6ccf" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@13.1.4: + version "13.1.4" + resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317" + integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g== dependencies: dir-glob "^3.0.1" fast-glob "^3.2.11" @@ -4930,15 +5224,15 @@ gopd@^1.0.1: dependencies: get-intrinsic "^1.1.3" -got@12.5.3, got@^12.1.0: - version "12.5.3" - resolved "https://registry.yarnpkg.com/got/-/got-12.5.3.tgz#82bdca2dd61258a02e24d668ea6e7abb70ac3598" - integrity sha512-8wKnb9MGU8IPGRIo+/ukTy9XLJBwDiCpIf5TVzQ9Cpol50eMTpBq2GAuDsuDIz7hTYmZgMgC1e9ydr6kSDWs3w== +got@12.6.1, got@^12.1.0: + version "12.6.1" + resolved "https://registry.yarnpkg.com/got/-/got-12.6.1.tgz#8869560d1383353204b5a9435f782df9c091f549" + integrity sha512-mThBblvlAF1d4O5oqyvN+ZxLAYwIJK7bpMxgYqPD9okW0C3qm5FFn7k811QrcuEBwaogR3ngOFoCfs6mRv7teQ== dependencies: "@sindresorhus/is" "^5.2.0" "@szmarczak/http-timer" "^5.0.1" cacheable-lookup "^7.0.0" - cacheable-request "^10.2.1" + cacheable-request "^10.2.8" decompress-response "^6.0.0" form-data-encoder "^2.1.2" get-stream "^6.0.1" @@ -4947,15 +5241,20 @@ got@12.5.3, got@^12.1.0: p-cancelable "^3.0.0" responselike "^3.0.0" -graceful-fs@4.2.10, graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: +graceful-fs@4.2.10: version "4.2.10" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c" integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA== -grapheme-splitter@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" - integrity sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ== +graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.3, graceful-fs@^4.1.6, graceful-fs@^4.1.9, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== growly@^1.3.0: version "1.3.0" @@ -4963,12 +5262,12 @@ growly@^1.3.0: integrity sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw== handlebars@^4.7.7: - version "4.7.7" - resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.7.tgz#9ce33416aad02dbd6c8fafa8240d5d98004945a1" - integrity sha512-aAcXm5OAfE/8IXkcZvCepKU3VzW1/39Fb5ZuqMtgI/hT8X2YgoMvBY5dLhq/cpOvw7Lk1nK/UF71aLG/ZnVYRA== + version "4.7.8" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.8.tgz#41c42c18b1be2365439188c77c6afae71c0cd9e9" + integrity sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ== dependencies: minimist "^1.2.5" - neo-async "^2.6.0" + neo-async "^2.6.2" source-map "^0.6.1" wordwrap "^1.0.0" optionalDependencies: @@ -4995,13 +5294,18 @@ has-flag@^4.0.0: integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== has-property-descriptors@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz#610708600606d36961ed04c196193b6a607fa861" - integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" + integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== dependencies: - get-intrinsic "^1.1.1" + get-intrinsic "^1.2.2" -has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.0.1.tgz#1885c1305538958aff469fef37937c22795408e0" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8" integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== @@ -5049,12 +5353,12 @@ has-yarn@^3.0.0: resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-3.0.0.tgz#c3c21e559730d1d3b57e28af1f30d06fac38147d" integrity sha512-IrsVwUHhEULx3R8f/aA8AHuEzAorplsab/v8HBzEiIukwq5i/EC+xmOW+HfP1OaDP+2JkgT1yILHN2O3UFIbcA== -has@^1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz#722d7cbfc1f6aa8241f16dd814e011e1f41e8796" - integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== +hasown@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.0.tgz#f4c513d454a57b7c7e1650778de226b11700546c" + integrity sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA== dependencies: - function-bind "^1.1.1" + function-bind "^1.1.2" hermes-engine@~0.11.0: version "0.11.0" @@ -5120,7 +5424,7 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" -http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: +http-proxy-agent@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz#8a8c8ef7f5932ccf953c296ca8291b95aa74aa3a" integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== @@ -5129,15 +5433,23 @@ http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1: agent-base "6" debug "4" +http-proxy-agent@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.0.tgz#e9096c5afd071a3fce56e6252bb321583c124673" + integrity sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + http2-wrapper@^2.1.10: - version "2.2.0" - resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.0.tgz#b80ad199d216b7d3680195077bd7b9060fa9d7f3" - integrity sha512-kZB0wxMo0sh1PehyjJUWRFEd99KC5TLjZ2cULC4f9iqJBAmKQQXEICjxl5iPJRwP40dpeHFqqhm7tYCvODpqpQ== + version "2.2.1" + resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-2.2.1.tgz#310968153dcdedb160d8b72114363ef5fce1f64a" + integrity sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ== dependencies: quick-lru "^5.1.1" resolve-alpn "^1.2.0" -https-proxy-agent@5, https-proxy-agent@^5.0.0: +https-proxy-agent@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz#c59ef224a04fe8b754f3db0063a25ea30d0005d6" integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== @@ -5145,6 +5457,14 @@ https-proxy-agent@5, https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.2.tgz#e2645b846b90e96c6e6f347fb5b2e41f1590b09b" + integrity sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA== + dependencies: + agent-base "^7.0.2" + debug "4" + human-signals@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3" @@ -5155,10 +5475,10 @@ human-signals@^2.1.0: resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -human-signals@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-3.0.1.tgz#c740920859dafa50e5a3222da9d3bf4bb0e5eef5" - integrity sha512-rQLskxnM/5OCldHo+wNXbpVgDn5A17CUoKX+7Sokwaknlq7CdSnphy0W39GU8dw59XiCXmFXDg4fRuckQRKewQ== +human-signals@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2" + integrity sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ== husky@^4.2.5: version "4.3.8" @@ -5206,7 +5526,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.0.0, import-fresh@^3.2.1: +import-fresh@^3.0.0, import-fresh@^3.2.1, import-fresh@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.3.0.tgz#37162c25fcb9ebaa2e6e53d5b4d88ce17d9e0c2b" integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== @@ -5245,7 +5565,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3: +inherits@2, inherits@2.0.4, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -5260,34 +5580,34 @@ ini@^1.3.2, ini@^1.3.4, ini@~1.3.0: resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@9.1.4: - version "9.1.4" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.1.4.tgz#482da8803670a64bd942bc5166a9547a19d41474" - integrity sha512-9hiJxE5gkK/cM2d1mTEnuurGTAoHebbkX0BYl3h7iEg7FYfuNIom+nDfBCSWtvSnoSrWCeBxqqBZu26xdlJlXA== +inquirer@9.2.6: + version "9.2.6" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-9.2.6.tgz#802a61ee3eefbf1cb82a7fb6c2ae95a106050e01" + integrity sha512-y71l237eJJKS4rl7sQcEUiMhrR0pB/ZnRMMTxLpjJhWL4hdWCT03a6jJnC1w6qIPSRZWEozuieGt3v7XaEJYFw== dependencies: - ansi-escapes "^6.0.0" - chalk "^5.1.2" - cli-cursor "^4.0.0" + ansi-escapes "^4.3.2" + chalk "^5.2.0" + cli-cursor "^3.1.0" cli-width "^4.0.0" external-editor "^3.0.3" figures "^5.0.0" lodash "^4.17.21" - mute-stream "0.0.8" - ora "^6.1.2" - run-async "^2.4.0" - rxjs "^7.5.7" - string-width "^5.1.2" - strip-ansi "^7.0.1" + mute-stream "1.0.0" + ora "^5.4.1" + run-async "^3.0.0" + rxjs "^7.8.1" + string-width "^4.2.3" + strip-ansi "^6.0.1" through "^2.3.6" - wrap-ansi "^8.0.1" + wrap-ansi "^6.0.1" -internal-slot@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.4.tgz#8551e7baf74a7a6ba5f749cfb16aa60722f0d6f3" - integrity sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ== +internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.6.tgz#37e756098c4911c5e912b8edbf71ed3aa116f930" + integrity sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg== dependencies: - get-intrinsic "^1.1.3" - has "^1.0.3" + get-intrinsic "^1.2.2" + hasown "^2.0.0" side-channel "^1.0.4" interpret@^1.0.0: @@ -5302,7 +5622,7 @@ invariant@*, invariant@^2.2.4: dependencies: loose-envify "^1.0.0" -ip@^1.1.5: +ip@^1.1.5, ip@^1.1.8: version "1.1.8" resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.8.tgz#ae05948f6b075435ed3307acce04629da8cdbf48" integrity sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg== @@ -5320,21 +5640,14 @@ is-absolute@^1.0.0: is-relative "^1.0.0" is-windows "^1.0.1" -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha512-e1BM1qnDbMRG3ll2U9dSK0UMHuWOs3pY3AtcFsmvwPtKL3MML/Q86i+GilLfvqEs4GW+ExB91tQ3Ig9noDIZ+A== - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== +is-accessor-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz#3223b10628354644b86260db29b3e693f5ceedd4" + integrity sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA== dependencies: - kind-of "^6.0.0" + hasown "^2.0.0" -is-arguments@^1.1.0: +is-arguments@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.1.1.tgz#15b3f88fda01f2a97fec84ca761a560f123efa9b" integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== @@ -5342,11 +5655,27 @@ is-arguments@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.2.tgz#f2653ced8412081638ecb0ebbd0c41c6e0aecbbe" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + is-bigint@^1.0.1: version "1.0.4" resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3" @@ -5367,7 +5696,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.4, is-callable@^1.2.7: +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055" integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== @@ -5386,28 +5715,21 @@ is-ci@^2.0.0: dependencies: ci-info "^2.0.0" -is-core-module@^2.5.0, is-core-module@^2.9.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.11.0.tgz#ad4cb3e3863e814523c96f3f58d26cc570ff0144" - integrity sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw== - dependencies: - has "^1.0.3" - -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha512-+w9D5ulSoBNlmw9OHn3U2v51SyoCd0he+bB3xMl62oijhrspxowjU+AIcDY0N3iEJbUEkB15IlMASQsxYigvXg== +is-core-module@^2.13.0, is-core-module@^2.5.0: + version "2.13.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.13.1.tgz#ad0d7532c6fea9da1ebdc82742d74525c6273384" + integrity sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw== dependencies: - kind-of "^3.0.2" + hasown "^2.0.0" -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== +is-data-descriptor@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz#2109164426166d32ea38c405c1e0945d9e6a4eeb" + integrity sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw== dependencies: - kind-of "^6.0.0" + hasown "^2.0.0" -is-date-object@^1.0.1: +is-date-object@^1.0.1, is-date-object@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== @@ -5415,33 +5737,36 @@ is-date-object@^1.0.1: has-tostringtag "^1.0.0" is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== + version "0.1.7" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.7.tgz#2727eb61fd789dcd5bdf0ed4569f551d2fe3be33" + integrity sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg== dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.3.tgz#92d27cb3cd311c4977a4db47df457234a13cb306" + integrity sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw== dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" + is-accessor-descriptor "^1.0.1" + is-data-descriptor "^1.0.1" is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" integrity sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw== -is-docker@^2.0.0, is-docker@^2.1.1: +is-docker@^2.0.0: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== +is-docker@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200" + integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ== + is-extendable@^0.1.0, is-extendable@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" @@ -5459,6 +5784,13 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz#c8749b65f17c133313e661b1289b95ad3dbd62e6" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + is-fullwidth-code-point@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" @@ -5474,10 +5806,17 @@ is-generator-fn@^2.0.0: resolved "https://registry.yarnpkg.com/is-generator-fn/-/is-generator-fn-2.1.0.tgz#7d140adc389aaf3011a8f2a2a4cfa6faadffb118" integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.0.10.tgz#f1558baf1ac17e0deea7c0415c438351ff2b3c72" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + is-git-dirty@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-git-dirty/-/is-git-dirty-2.0.1.tgz#29ca82fb0924ccbeaa0bae08de217546df593012" - integrity sha512-zn3CNLDbSR+y7+VDDw7/SwTRRuECn4OpAyelo5MDN+gVxdzM8SUDd51ZwPIOxhljED44Riu0jiiNtC8w0bcLdA== + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-git-dirty/-/is-git-dirty-2.0.2.tgz#696fe5a7e60710de75a1b7d2ae8c7ee9cc0bc57b" + integrity sha512-U3YCo+GKR/rDsY7r0v/LBICbQwsx859tDQnAT+v0E/zCDeWbQ1TUt1FtyExeyik7VIJlYOLHCIifLdz71HDalg== dependencies: execa "^4.0.3" is-git-repository "^2.0.0" @@ -5495,7 +5834,14 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3: resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== dependencies: - is-extglob "^2.1.1" + is-extglob "^2.1.1" + +is-inside-container@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4" + integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA== + dependencies: + is-docker "^3.0.0" is-installed-globally@^0.4.0: version "0.4.0" @@ -5515,7 +5861,7 @@ is-interactive@^2.0.0: resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-2.0.0.tgz#40c57614593826da1100ade6059778d597f16e90" integrity sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ== -is-map@^2.0.2: +is-map@^2.0.1, is-map@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127" integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== @@ -5606,7 +5952,7 @@ is-relative@^1.0.0: dependencies: is-unc-path "^1.0.0" -is-set@^2.0.2: +is-set@^2.0.1, is-set@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.2.tgz#90755fa4c2562dc1c5d4024760d6119b94ca18ec" integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== @@ -5661,6 +6007,13 @@ is-text-path@^1.0.1: dependencies: text-extensions "^1.0.0" +is-typed-array@^1.1.10, is-typed-array@^1.1.12, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.12.tgz#d0bab5686ef4a76f7a73097b95470ab199c57d4a" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + is-typedarray@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -5683,6 +6036,11 @@ is-unicode-supported@^1.1.0, is-unicode-supported@^1.2.0: resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz#d824984b616c292a2e198207d4a609983842f714" integrity sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ== +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.1.tgz#5008b59bdc43b698201d18f62b37b2ca243e8cf2" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + is-weakref@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2" @@ -5690,6 +6048,14 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.2.tgz#4569d67a747a1ce5a994dfd4ef6dcea76e7c0a1d" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + 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" @@ -5712,11 +6078,6 @@ is-yarn-global@^0.4.0: resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.4.1.tgz#b312d902b313f81e4eaf98b6361ba2b45cd694bb" integrity sha512-/kppl+R+LO5VmhYSEWARUFjodS25D68gvj8W7z0I7OWhUla5xWu8KL6CtB2V0R6yqhnRgbcaREMr4EEM6htLPQ== -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isarray@1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" @@ -5744,10 +6105,21 @@ isobject@^3.0.0, isobject@^3.0.1: resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== +issue-parser@6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-6.0.0.tgz#b1edd06315d4f2044a9755daf85fdafde9b4014a" + integrity sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA== + dependencies: + lodash.capitalize "^4.2.1" + lodash.escaperegexp "^4.1.2" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.uniqby "^4.7.0" + istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz#189e7909d0a39fa5a3dfad5b03f71947770191d3" - integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + version "3.2.2" + resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz#2d166c4b0644d43a39f04bf6c2edd1e585f31756" + integrity sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg== istanbul-lib-instrument@^4.0.3: version "4.0.3" @@ -5771,12 +6143,12 @@ istanbul-lib-instrument@^5.0.4: semver "^6.3.0" istanbul-lib-report@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz#7518fe52ea44de372f460a76b5ecda9ffb73d8a6" - integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + version "3.0.1" + resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz#908305bac9a5bd175ac6a74489eafd0fc2445a7d" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== dependencies: istanbul-lib-coverage "^3.0.0" - make-dir "^3.0.0" + make-dir "^4.0.0" supports-color "^7.1.0" istanbul-lib-source-maps@^4.0.0: @@ -5789,9 +6161,9 @@ istanbul-lib-source-maps@^4.0.0: source-map "^0.6.1" istanbul-reports@^3.0.2: - version "3.1.5" - resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.5.tgz#cc9a6ab25cb25659810e4785ed9d9fb742578bae" - integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + version "3.1.6" + resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-3.1.6.tgz#2544bcab4768154281a2f0870471902704ccaa1a" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== dependencies: html-escaper "^2.0.0" istanbul-lib-report "^3.0.0" @@ -5809,6 +6181,17 @@ iterate-value@^1.0.2: es-get-iterator "^1.0.2" iterate-iterator "^1.0.1" +iterator.prototype@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0" + integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w== + dependencies: + define-properties "^1.2.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.4" + set-function-name "^2.0.1" + jest-changed-files@^26.6.2: version "26.6.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-26.6.2.tgz#f6198479e1cc66f22f9ae1e22acaa0b429c042d0" @@ -6247,21 +6630,16 @@ jetifier@^2.0.0: integrity sha512-J4Au9KuT74te+PCCCHKgAjyLlEa+2VyIAEPNCdE5aNkAJ6FAJcAqcdzEkSnzNksIa9NkGmC4tPiClk2e7tCJuQ== joi@^17.2.1: - version "17.7.0" - resolved "https://registry.yarnpkg.com/joi/-/joi-17.7.0.tgz#591a33b1fe1aca2bc27f290bcad9b9c1c570a6b3" - integrity sha512-1/ugc8djfn93rTE3WRKdCzGGt/EtiYKxITMO4Wiv6q5JL1gl9ePt4kBsl1S499nbosspfctIQTpYIhSmHA3WAg== + version "17.11.0" + resolved "https://registry.yarnpkg.com/joi/-/joi-17.11.0.tgz#aa9da753578ec7720e6f0ca2c7046996ed04fc1a" + integrity sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ== dependencies: "@hapi/hoek" "^9.0.0" "@hapi/topo" "^5.0.0" "@sideway/address" "^4.1.3" - "@sideway/formula" "^3.0.0" + "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" -js-sdsl@^4.1.4: - version "4.2.0" - resolved "https://registry.yarnpkg.com/js-sdsl/-/js-sdsl-4.2.0.tgz#278e98b7bea589b8baaf048c20aeb19eb7ad09d0" - integrity sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -6390,10 +6768,10 @@ json-stringify-safe@^5.0.1: resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA== -json5@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.2.tgz#64471c5bdcc564c18f7c1d4df2e2297f2457c5ab" - integrity sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ== +json5@^2.2.1, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== jsonfile@^2.1.0: version "2.4.0" @@ -6424,17 +6802,19 @@ jsonparse@^1.2.0: integrity sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg== "jsx-ast-utils@^2.4.1 || ^3.0.0": - version "3.3.3" - resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz#76b3e6e6cece5c69d49a5792c3d01bd1a0cdc7ea" - integrity sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw== + version "3.3.5" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== dependencies: - array-includes "^3.1.5" - object.assign "^4.1.3" + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" -keyv@^4.5.2: - version "4.5.2" - resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.2.tgz#0e310ce73bf7851ec702f2eaf46ec4e3805cce56" - integrity sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g== +keyv@^4.5.3: + version "4.5.4" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" + integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -6452,12 +6832,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2, kind-of@^6.0.3: +kind-of@^6.0.2, kind-of@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -6557,11 +6932,21 @@ lodash.camelcase@^4.3.0: resolved "https://registry.yarnpkg.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6" integrity sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA== +lodash.capitalize@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" + integrity sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw== + lodash.debounce@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw== + lodash.isfunction@^3.0.9: version "3.0.9" resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051" @@ -6577,6 +6962,11 @@ lodash.isplainobject@^4.0.6: resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" integrity sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA== +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw== + lodash.kebabcase@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz#8489b1cb0d29ff88195cceca448ff6d6cc295c36" @@ -6612,6 +7002,11 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== + lodash.upperfirst@^4.3.1: version "4.3.1" resolved "https://registry.yarnpkg.com/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" @@ -6680,10 +7075,15 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" -macos-release@^3.0.1: - version "3.1.0" - resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-3.1.0.tgz#6165bb0736ae567ed6649e36ce6a24d87cbb7aca" - integrity sha512-/M/R0gCDgM+Cv1IuBG1XGdfTFnMEG6PZeT+KGWHO/OG+imqmaD9CH5vHBTycEM3+Kc4uG2Il+tFAuUWLqQOeUA== +lru-cache@^7.14.1: + version "7.18.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89" + integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA== + +macos-release@^3.1.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-3.2.0.tgz#dcee82b6a4932971b1538dbf6f3aabc4a903b613" + integrity sha512-fSErXALFNsnowREYZ49XCdOHF8wOPWuFOGQrAhP7x5J/BqQv+B02cNsTykGpDgRVx43EKg++6ANmTaGTtW+hUA== make-dir@^2.0.0, make-dir@^2.1.0: version "2.1.0" @@ -6693,12 +7093,12 @@ make-dir@^2.0.0, make-dir@^2.1.0: pify "^4.0.1" semver "^5.6.0" -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== +make-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-4.0.0.tgz#c3c2307a771277cd9638305f915c29ae741b614e" + integrity sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw== dependencies: - semver "^6.0.0" + semver "^7.5.3" make-error@^1.1.1: version "1.3.6" @@ -6734,7 +7134,7 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -meow@^8.0.0: +meow@^8.0.0, meow@^8.1.2: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" integrity sha512-r85E3NdZ+mpYk1C6RjPFEMSE+s1iZMuHtsHAqY0DT3jZczl0diWUZ8g6oU7h0M9cD2EL+PzaYghhCLzR0ZNn5Q== @@ -7099,9 +7499,9 @@ minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatc brace-expansion "^1.1.7" minimatch@^5.0.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.2.tgz#0939d7d6f0898acbd1508abe534d1929368a8fff" - integrity sha512-bNH9mmM9qsJ2X4r2Nat1B//1dJVcn3+iBLa3IgqJ7EbGaDNepL9QSHOxN4ng33s52VMMhhIfgCYDk3C4ZmlDAg== + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== dependencies: brace-expansion "^2.0.1" @@ -7115,9 +7515,9 @@ minimist-options@4.1.0: kind-of "^6.0.3" minimist@^1.1.1, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6: - version "1.2.7" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" - integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== + version "1.2.8" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== mixin-deep@^1.2.0: version "1.3.2" @@ -7159,10 +7559,10 @@ ms@2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== nanomatch@^1.2.9: version "1.2.13" @@ -7201,7 +7601,7 @@ negotiator@0.6.3: resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== -neo-async@^2.5.0, neo-async@^2.6.0: +neo-async@^2.5.0, neo-async@^2.6.2: version "2.6.2" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== @@ -7240,19 +7640,19 @@ node-domexception@^1.0.0: resolved "https://registry.yarnpkg.com/node-domexception/-/node-domexception-1.0.0.tgz#6888db46a1f71c0b76b3f7555016b63fe64766e5" integrity sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ== -node-fetch@3.3.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.0.tgz#37e71db4ecc257057af828d523a7243d651d91e4" - integrity sha512-BKwRP/O0UvoMKp7GNdwPlObhYGB5DQqwhEDQlNKuoqwVYSxkSZCSbHjnFFmUEtwSKRPU4kNK8PbDYYitwaE3QA== +node-fetch@3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-3.3.1.tgz#b3eea7b54b3a48020e46f4f88b9c5a7430d20b2e" + integrity sha512-cRVc/kyto/7E5shrWca1Wsea4y6tL9iYJE5FBCius3JQfb/4P4I295PfhgbJQBLTx6lATE4z+wK0rPM4VS2uow== dependencies: data-uri-to-buffer "^4.0.0" fetch-blob "^3.1.4" formdata-polyfill "^4.0.10" node-fetch@^2.2.0, node-fetch@^2.6.0, node-fetch@^2.6.7: - version "2.6.7" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" - integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + version "2.7.0" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.7.0.tgz#d0f0fa6e3e2dc1d27efcd8ad99d550bda94d187d" + integrity sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A== dependencies: whatwg-url "^5.0.0" @@ -7273,10 +7673,10 @@ node-notifier@^8.0.0: uuid "^8.3.0" which "^2.0.2" -node-releases@^2.0.6: - version "2.0.8" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.8.tgz#0f349cdc8fcfa39a92ac0be9bc48b7706292b9ae" - integrity sha512-dFSmB8fFHEH/s81Xi+Y/15DQY6VHW81nXRj86EMSL3lmuTmK1e+aT4wrFCkTbm+gSwkw4KpX+rT/pMM2c1mF+A== +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== node-stream-zip@^1.9.1: version "1.15.0" @@ -7347,9 +7747,9 @@ nullthrows@^1.1.1: integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw== nwsapi@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.2.tgz#e5418863e7905df67d51ec95938d67bf801f0bb0" - integrity sha512-90yv+6538zuvUMnN+zCr8LuV6bPFdq50304114vJYJ8RDyK8D5O9Phpbd6SZWgI7PwzmmfN1upeOJlvybDSgCw== + version "2.2.7" + resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.7.tgz#738e0707d3128cb750dddcfe90e4610482df0f30" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== ob1@0.67.0: version "0.67.0" @@ -7370,10 +7770,10 @@ object-copy@^0.1.0: define-property "^0.2.5" kind-of "^3.0.3" -object-inspect@^1.12.2, object-inspect@^1.9.0: - version "1.12.2" - resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea" - integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ== +object-inspect@^1.13.1, object-inspect@^1.9.0: + version "1.13.1" + resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.1.tgz#b96c6109324ccfef6b12216a956ca4dc2ff94bc2" + integrity sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ== object-keys@^1.1.1: version "1.1.1" @@ -7387,7 +7787,7 @@ object-visit@^1.0.0: dependencies: isobject "^3.0.0" -object.assign@^4.1.3, object.assign@^4.1.4: +object.assign@^4.1.4: version "4.1.4" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.4.tgz#9673c7c7c351ab8c4d0b516f4343ebf4dfb7799f" integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== @@ -7398,30 +7798,30 @@ object.assign@^4.1.3, object.assign@^4.1.4: object-keys "^1.1.1" object.entries@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.6.tgz#9737d0e5b8291edd340a3e3264bb8a3b00d5fa23" - integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.7.tgz#2b47760e2a2e3a752f39dd874655c61a7f03c131" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.fromentries@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.6.tgz#cdb04da08c539cffa912dcd368b886e0904bfa73" - integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + version "2.0.7" + resolved "https://registry.yarnpkg.com/object.fromentries/-/object.fromentries-2.0.7.tgz#71e95f441e9a0ea6baf682ecaaf37fa2a8d7e616" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.hasown@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.2.tgz#f919e21fad4eb38a57bc6345b3afd496515c3f92" - integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + version "1.1.3" + resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.3.tgz#6a5f2897bb4d3668b8e79364f98ccf971bda55ae" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== dependencies: - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" object.pick@^1.3.0: version "1.3.0" @@ -7431,13 +7831,13 @@ object.pick@^1.3.0: isobject "^3.0.1" object.values@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.6.tgz#4abbaa71eba47d63589d402856f908243eea9b1d" - integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + version "1.1.7" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.7.tgz#617ed13272e7e1071b43973aa1655d9291b8442a" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" on-finished@2.4.1: version "2.4.1" @@ -7486,13 +7886,14 @@ onetime@^6.0.0: dependencies: mimic-fn "^4.0.0" -open@8.4.0: - version "8.4.0" - resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8" - integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q== +open@9.1.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6" + integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg== dependencies: - define-lazy-prop "^2.0.0" - is-docker "^2.1.1" + default-browser "^4.0.0" + define-lazy-prop "^3.0.0" + is-inside-container "^1.0.0" is-wsl "^2.2.0" open@^6.2.0: @@ -7519,30 +7920,30 @@ optionator@^0.8.1: type-check "~0.3.2" word-wrap "~1.2.3" -optionator@^0.9.1: - version "0.9.1" - resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz#4f236a6373dae0566a6d43e1326674f50c291499" - integrity sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw== +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" deep-is "^0.1.3" fast-levenshtein "^2.0.6" levn "^0.4.1" prelude-ls "^1.2.1" type-check "^0.4.0" - word-wrap "^1.2.3" -ora@6.1.2, ora@^6.1.2: - version "6.1.2" - resolved "https://registry.yarnpkg.com/ora/-/ora-6.1.2.tgz#7b3c1356b42fd90fb1dad043d5dbe649388a0bf5" - integrity sha512-EJQ3NiP5Xo94wJXIzAyOtSb0QEIAUu7m8t6UZ9krbz0vAJqr92JpcK/lEXg91q6B9pEGqrykkd2EQplnifDSBw== +ora@6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/ora/-/ora-6.3.1.tgz#a4e9e5c2cf5ee73c259e8b410273e706a2ad3ed6" + integrity sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ== dependencies: - bl "^5.0.0" chalk "^5.0.0" cli-cursor "^4.0.0" cli-spinners "^2.6.1" is-interactive "^2.0.0" is-unicode-supported "^1.1.0" log-symbols "^5.1.0" + stdin-discarder "^0.1.0" strip-ansi "^7.0.1" wcwidth "^1.0.1" @@ -7573,12 +7974,12 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" -os-name@5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/os-name/-/os-name-5.0.1.tgz#acb4f996ec5bd86c41755fef9d6d31905c47172e" - integrity sha512-0EQpaHUHq7olp2/YFUr+0vZi9tMpDTblHGz+Ch5RntKxiRXOAY0JOz1UlxhSjMSksHvkm13eD6elJj3M8Ht/kw== +os-name@5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/os-name/-/os-name-5.1.0.tgz#4f5ab5edfa6938b590112714f1570fe79f1d957a" + integrity sha512-YEIoAnM6zFmzw3PQ201gCVCIWbXNyKObGlVvpAVvraAeOHnlYVKFssbA/riRX5R40WA6kKrZ7Dr7dWzO3nKSeQ== dependencies: - macos-release "^3.0.1" + macos-release "^3.1.0" windows-release "^5.0.1" os-tmpdir@^1.0.0, os-tmpdir@~1.0.2: @@ -7667,34 +8068,32 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== -pac-proxy-agent@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-5.0.0.tgz#b718f76475a6a5415c2efbe256c1c971c84f635e" - integrity sha512-CcFG3ZtnxO8McDigozwE3AqAw15zDvGH+OjXO4kzf7IkEKkQ4gxQ+3sdF50WmhQ4P/bVusXcqNE2S3XrNURwzQ== +pac-proxy-agent@^6.0.3: + version "6.0.4" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-6.0.4.tgz#f90d066808974cd6813dfcdac69a2aa483b18ba1" + integrity sha512-FbJYeusBOZNe6bmrC2/+r/HljwExryon16lNKEU82gWiwIPMCEktUPSEAcTkO9K3jd/YPGuX/azZel1ltmo6nQ== dependencies: - "@tootallnate/once" "1" - agent-base "6" - debug "4" - get-uri "3" - http-proxy-agent "^4.0.1" - https-proxy-agent "5" - pac-resolver "^5.0.0" - raw-body "^2.2.0" - socks-proxy-agent "5" + agent-base "^7.0.2" + debug "^4.3.4" + get-uri "^6.0.1" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + pac-resolver "^6.0.1" + socks-proxy-agent "^8.0.1" -pac-resolver@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-5.0.1.tgz#c91efa3a9af9f669104fa2f51102839d01cde8e7" - integrity sha512-cy7u00ko2KVgBAjuhevqpPeHIkCIqPe1v24cydhWjmeuzaBfmUWFCZJ1iAh5TuVzVZoUzXIW7K8sMYOZ84uZ9Q== +pac-resolver@^6.0.1: + version "6.0.2" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-6.0.2.tgz#742ef24d2805b18c0a684ac02bcb0b5ce9644648" + integrity sha512-EQpuJ2ifOjpZY5sg1Q1ZeAxvtLwR7Mj3RgY8cysPGbsRu3RBXyJFWxnMus9PScjxya/0LzvVDxNh/gl0eXBU4w== dependencies: - degenerator "^3.0.2" - ip "^1.1.5" + degenerator "^4.0.4" + ip "^1.1.8" netmask "^2.0.2" package-json@^8.1.0: - version "8.1.0" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.0.tgz#2a22806f1ed7c786c8e6ff26cfe20003bf4c6850" - integrity sha512-hySwcV8RAWeAfPsXb9/HGSPn8lwDnv6fabH+obUZKX169QknRkRhPxd1yMubpKDskLFATkl3jHpNtVtDPFA0Wg== + version "8.1.1" + resolved "https://registry.yarnpkg.com/package-json/-/package-json-8.1.1.tgz#3e9948e43df40d1e8e78a85485f1070bf8f03dc8" + integrity sha512-cbH9IAIJHNj9uXi196JVsRlt7cHKak6u/e6AkL/bkRelZ7rlL3X1YKxsZwa36xipOEKAsdtmaG6aAJoM1fx2zA== dependencies: got "^12.1.0" registry-auth-token "^5.0.1" @@ -7716,7 +8115,7 @@ parse-json@^4.0.0: error-ex "^1.3.1" json-parse-better-errors "^1.0.1" -parse-json@^5.0.0: +parse-json@^5.0.0, parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== @@ -7828,9 +8227,9 @@ pify@^4.0.1: integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== pirates@^4.0.1, pirates@^4.0.5: - version "4.0.5" - resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.5.tgz#feec352ea5c3268fb23a37c702ab1699f35a5f3b" - integrity sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ== + version "4.0.6" + resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== pkg-dir@^3.0.0: version "3.0.0" @@ -7861,17 +8260,18 @@ please-upgrade-node@^3.2.0: semver-compare "^1.0.0" plist@^3.0.2, plist@^3.0.5: - version "3.0.6" - resolved "https://registry.yarnpkg.com/plist/-/plist-3.0.6.tgz#7cfb68a856a7834bca6dbfe3218eb9c7740145d3" - integrity sha512-WiIVYyrp8TD4w8yCvyeIr+lkmrGRd5u0VbRnU+tP/aRLxP/YadJUYOMZJ/6hIa3oUyVCsycXvtNRgd5XBJIbiA== + version "3.1.0" + resolved "https://registry.yarnpkg.com/plist/-/plist-3.1.0.tgz#797a516a93e62f5bde55e0b9cc9c967f860893c9" + integrity sha512-uysumyrvkUX0rX/dEVqt8gC3sTBzd4zoWfLeS29nb53imdaXVvLINYXTI2GNqzaMuvacNx4uJQ8+b3zXR0pkgQ== dependencies: + "@xmldom/xmldom" "^0.8.8" base64-js "^1.5.1" xmlbuilder "^15.1.1" pod-install@^0.1.0: - version "0.1.38" - resolved "https://registry.yarnpkg.com/pod-install/-/pod-install-0.1.38.tgz#1c16a800a5fc1abea0cafcc0e190f376368c76ab" - integrity sha512-NeDWGigjJRriOIKBOvpW2/tK2tYLfyUT7ia6C6L+oarCAhBNP+IGODWdU+GEAqvfsseqOApcFclpXAJTL0UPzA== + version "0.1.39" + resolved "https://registry.yarnpkg.com/pod-install/-/pod-install-0.1.39.tgz#853a0585bafbd332c2ca6543854fd4919958cfb3" + integrity sha512-0kVvdLYe0CtfJEr+ISvTMxAEB0UF4JMRToPjuu9xAAq1mEqA2Ql5u7uLWX1m45BMM+7NfU4LnBbnfNjmQE9GCw== posix-character-classes@^0.1.0: version "0.1.1" @@ -7896,9 +8296,9 @@ prettier-linter-helpers@^1.0.0: fast-diff "^1.1.2" prettier@^2.0.5: - version "2.8.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.1.tgz#4e1fd11c34e2421bc1da9aea9bd8127cd0a35efc" - integrity sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg== + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== pretty-format@^26.0.0, pretty-format@^26.5.2, pretty-format@^26.6.2: version "26.6.2" @@ -7961,21 +8361,21 @@ protocols@^2.0.0, protocols@^2.0.1: resolved "https://registry.yarnpkg.com/protocols/-/protocols-2.0.1.tgz#8f155da3fc0f32644e83c5782c8e8212ccf70a86" integrity sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q== -proxy-agent@5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-5.0.0.tgz#d31405c10d6e8431fde96cba7a0c027ce01d633b" - integrity sha512-gkH7BkvLVkSfX9Dk27W6TyNOWWZWRilRfk1XxGNWOYJ2TuedAv1yFpCaU9QSBmBe716XOTNpYNOzhysyw8xn7g== +proxy-agent@6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.2.1.tgz#062df6609a4012fd1c108974865599b61e77abde" + integrity sha512-OIbBKlRAT+ycCm6wAYIzMwPejzRtjy8F3QiDX0eKOA3e4pe3U9F/IvzcHP42bmgQxVv97juG+J8/gx+JIeCX/Q== dependencies: - agent-base "^6.0.0" - debug "4" - http-proxy-agent "^4.0.0" - https-proxy-agent "^5.0.0" - lru-cache "^5.1.1" - pac-proxy-agent "^5.0.0" - proxy-from-env "^1.0.0" - socks-proxy-agent "^5.0.0" - -proxy-from-env@^1.0.0: + agent-base "^7.0.2" + debug "^4.3.4" + http-proxy-agent "^7.0.0" + https-proxy-agent "^7.0.0" + lru-cache "^7.14.1" + pac-proxy-agent "^6.0.3" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.1" + +proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== @@ -7994,9 +8394,9 @@ pump@^3.0.0: once "^1.3.1" punycode@^2.1.0, punycode@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" - integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== pupa@^3.1.0: version "3.1.0" @@ -8035,16 +8435,6 @@ range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@^2.2.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" - integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== - dependencies: - bytes "3.1.2" - http-errors "2.0.0" - iconv-lite "0.4.24" - unpipe "1.0.0" - rc@1.2.8: version "1.2.8" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed" @@ -8056,9 +8446,9 @@ rc@1.2.8: strip-json-comments "~2.0.1" react-devtools-core@^4.23.0: - version "4.27.1" - resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.27.1.tgz#167aa174383c65786cbb7e965a5b39c702f0a2d3" - integrity sha512-qXhcxxDWiFmFAOq48jts9YQYe1+wVoUXzJTlY4jbaATzyio6dd6CUGu3dXBhREeVgpZ+y4kg6vFJzIOZh6vY2w== + version "4.28.5" + resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-4.28.5.tgz#c8442b91f068cdf0c899c543907f7f27d79c2508" + integrity sha512-cq/o30z9W2Wb4rzBefjv5fBalHU0rJGZCHAkf/RHSBWSSYwh8PlQTqqOJmgIIbBtpj27T6FIPXeomIjZtCNVqA== dependencies: shell-quote "^1.6.1" ws "^7" @@ -8210,29 +8600,19 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@1.1.x: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - readable-stream@3, readable-stream@^3.0.0, readable-stream@^3.0.2, readable-stream@^3.4.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== + version "3.6.2" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== dependencies: inherits "^2.0.3" string_decoder "^1.1.1" util-deprecate "^1.0.1" readable-stream@~2.3.6: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== + version "2.3.8" + resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.8.tgz#91125e8042bba1b9887f49345f6277027ce8be9b" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== dependencies: core-util-is "~1.0.0" inherits "~2.0.3" @@ -8272,10 +8652,22 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +reflect.getprototypeof@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz#aaccbf41aca3821b87bb71d9dcbc7ad0ba50a3f3" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + regenerate-unicode-properties@^10.1.0: - version "10.1.0" - resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" - integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + version "10.1.1" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480" + integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q== dependencies: regenerate "^1.4.2" @@ -8284,15 +8676,20 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.2: +regenerator-runtime@^0.13.2: version "0.13.11" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz#f6dca3e7ceec20590d07ada785636a90cdca17f9" integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== -regenerator-transform@^0.15.1: - version "0.15.1" - resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.1.tgz#f6c4e99fc1b4591f780db2586328e4d9a9d8dc56" - integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz#5e19d68eb12d486f797e15a3c6a918f7cec5eb45" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== dependencies: "@babel/runtime" "^7.8.4" @@ -8304,38 +8701,33 @@ regex-not@^1.0.0, regex-not@^1.0.2: extend-shallow "^3.0.2" safe-regex "^1.1.0" -regexp.prototype.flags@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz#87cab30f80f66660181a3bb7bf5981a872b367ac" - integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA== +regexp.prototype.flags@^1.5.0, regexp.prototype.flags@^1.5.1: + version "1.5.1" + resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz#90ce989138db209f81492edd734183ce99f9677e" + integrity sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg== dependencies: call-bind "^1.0.2" - define-properties "^1.1.3" - functions-have-names "^1.2.2" - -regexpp@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" - integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg== + define-properties "^1.2.0" + set-function-name "^2.0.0" -regexpu-core@^5.2.1: - version "5.2.2" - resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.2.2.tgz#3e4e5d12103b64748711c3aad69934d7718e75fc" - integrity sha512-T0+1Zp2wjF/juXMrMxHxidqGYn8U4R+zleSJhX9tQ1PUsS8a9UtYfbsF9LdiVgNX3kiX8RNaKM42nfSgvFJjmw== +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== dependencies: + "@babel/regjsgen" "^0.8.0" regenerate "^1.4.2" regenerate-unicode-properties "^10.1.0" - regjsgen "^0.7.1" regjsparser "^0.9.1" unicode-match-property-ecmascript "^2.0.0" unicode-match-property-value-ecmascript "^2.1.0" registry-auth-token@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.1.tgz#5e6cd106e6c251135a046650c58476fc03e92833" - integrity sha512-UfxVOj8seK1yaIOiieV4FIP01vfBDLsY0H9sQzi9EbbUdJiuuBjJgLa1DpImXMNPnVkBD4eVxTEXcrZA6kfpJA== + version "5.0.2" + resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-5.0.2.tgz#8b026cc507c8552ebbe06724136267e63302f756" + integrity sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ== dependencies: - "@pnpm/npm-conf" "^1.0.4" + "@pnpm/npm-conf" "^2.1.0" registry-url@^6.0.0: version "6.0.1" @@ -8344,11 +8736,6 @@ registry-url@^6.0.0: dependencies: rc "1.2.8" -regjsgen@^0.7.1: - version "0.7.1" - resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.7.1.tgz#ee5ef30e18d3f09b7c369b76e7c2373ed25546f6" - integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA== - regjsparser@^0.9.1: version "0.9.1" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709" @@ -8357,32 +8744,32 @@ regjsparser@^0.9.1: jsesc "~0.5.0" release-it@^15.4.1: - version "15.5.1" - resolved "https://registry.yarnpkg.com/release-it/-/release-it-15.5.1.tgz#bce504bef6fefd42bf54c84320ed1145f72a2681" - integrity sha512-1X1oyqay/amJh/V+xkSU9zN6LqGmLQJ0Q40+FaHE6+Pu6QCmgX9HbrpHxvF0HZeXkB5cdhHjmYsPbHnUQLRnYg== + version "15.11.0" + resolved "https://registry.yarnpkg.com/release-it/-/release-it-15.11.0.tgz#389cf1e8f367b51f3f3bc4dc3e01046b6bdb166c" + integrity sha512-lZwoGEnKYKwGnfxxlA7vtR7vvozPrOSsIgQaHO4bgQ5ARbG3IA6Dmo0IVusv6nR1KmnjH70QIeNAgsWs6Ji/tw== dependencies: "@iarna/toml" "2.2.5" - "@octokit/rest" "19.0.5" + "@octokit/rest" "19.0.11" async-retry "1.3.3" - chalk "5.1.2" - cosmiconfig "8.0.0" - execa "6.1.0" - form-data "4.0.0" + chalk "5.2.0" + cosmiconfig "8.1.3" + execa "7.1.1" git-url-parse "13.1.0" - globby "13.1.2" - got "12.5.3" - inquirer "9.1.4" + globby "13.1.4" + got "12.6.1" + inquirer "9.2.6" is-ci "3.0.1" + issue-parser "6.0.0" lodash "4.17.21" mime-types "2.1.35" new-github-release-url "2.0.0" - node-fetch "3.3.0" - open "8.4.0" - ora "6.1.2" - os-name "5.0.1" + node-fetch "3.3.1" + open "9.1.0" + ora "6.3.1" + os-name "5.1.0" promise.allsettled "1.0.6" - proxy-agent "5.0.0" - semver "7.3.8" + proxy-agent "6.2.1" + semver "7.5.1" shelljs "0.8.5" update-notifier "6.0.2" url-join "5.0.0" @@ -8464,20 +8851,20 @@ resolve-url@^0.2.1: integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg== resolve@^1.1.6, resolve@^1.10.0, resolve@^1.14.2, resolve@^1.18.1: - version "1.22.1" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" - integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== + version "1.22.8" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d" + integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" -resolve@^2.0.0-next.3: - version "2.0.0-next.4" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660" - integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== +resolve@^2.0.0-next.4: + version "2.0.0-next.5" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.5.tgz#6b0ec3107e671e52b68cd068ef327173b90dc03c" + integrity sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA== dependencies: - is-core-module "^2.9.0" + is-core-module "^2.13.0" path-parse "^1.0.7" supports-preserve-symlinks-flag "^1.0.0" @@ -8558,10 +8945,17 @@ rsvp@^4.8.4: resolved "https://registry.yarnpkg.com/rsvp/-/rsvp-4.8.5.tgz#c8f155311d167f68f21e168df71ec5b083113734" integrity sha512-nfMOlASu9OnRJo1mbEk2cz0D56a1MBNrJ7orjRZQG10XDyuvwksKbuXNp6qa+kbn839HwjwhBzhFmdsaEAfauA== -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== +run-applescript@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c" + integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg== + dependencies: + execa "^5.0.0" + +run-async@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/run-async/-/run-async-3.0.0.tgz#42a432f6d76c689522058984384df28be379daad" + integrity sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q== run-parallel@^1.1.9: version "1.2.0" @@ -8570,13 +8964,23 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^7.5.7: - version "7.8.0" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.0.tgz#90a938862a82888ff4c7359811a595e14e1e09a4" - integrity sha512-F2+gxDshqmIub1KdvZkaEfGDwLNpPvk9Fs6LD/MyQxNgMds/WH9OdDDXOmxUZpME+iSK3rQCctkL0DYyytUqMg== +rxjs@^7.8.1: + version "7.8.1" + resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-7.8.1.tgz#6f6f3d99ea8044291efd92e7c7fcf562c4057543" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== dependencies: tslib "^2.1.0" +safe-array-concat@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" + integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + isarray "^2.0.5" + safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: version "5.1.2" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" @@ -8624,9 +9028,9 @@ sane@^4.0.3: walker "~1.0.5" sax@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" - integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + version "1.3.0" + resolved "https://registry.yarnpkg.com/sax/-/sax-1.3.0.tgz#a5dbe77db3be05c9d1ee7785dbd3ea9de51593d0" + integrity sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA== saxes@^5.0.1: version "5.0.1" @@ -8665,13 +9069,6 @@ semver-regex@^3.1.2: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@7.3.7: - version "7.3.7" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.7.tgz#12c5b649afdbf9049707796e22a4028814ce523f" - integrity sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g== - dependencies: - lru-cache "^6.0.0" - semver@7.3.8: version "7.3.8" resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" @@ -8679,18 +9076,25 @@ semver@7.3.8: dependencies: lru-cache "^6.0.0" -semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0: - version "6.3.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== +semver@7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.1.tgz#c90c4d631cf74720e46b21c1d37ea07edfab91ec" + integrity sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw== + dependencies: + lru-cache "^6.0.0" -semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7: +semver@7.5.4, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.3: version "7.5.4" resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== dependencies: lru-cache "^6.0.0" +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + send@0.18.0: version "0.18.0" resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" @@ -8730,6 +9134,25 @@ set-blocking@^2.0.0: resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== +set-function-length@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" + integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + dependencies: + define-data-property "^1.1.1" + get-intrinsic "^1.2.1" + gopd "^1.0.1" + has-property-descriptors "^1.0.0" + +set-function-name@^2.0.0, set-function-name@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.1.tgz#12ce38b7954310b9f61faa12701620a0c882793a" + integrity sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA== + dependencies: + define-data-property "^1.0.1" + functions-have-names "^1.2.3" + has-property-descriptors "^1.0.0" + set-value@^2.0.0, set-value@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" @@ -8777,9 +9200,9 @@ shebang-regex@^3.0.0: integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== shell-quote@^1.6.1, shell-quote@^1.7.3: - version "1.7.4" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.4.tgz#33fe15dee71ab2a81fcbd3a52106c5cfb9fb75d8" - integrity sha512-8o/QEhSSRb1a5i7TFR0iM4G16Z0vYB2OQVs4G3aAFXjn3T6yEx8AZxy1PgDF7I00LZHYA3WxaSYIf5e5sAX8Rw== + version "1.8.1" + resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.1.tgz#6dbf4db75515ad5bac63b4f1894c3a154c766680" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== shelljs@0.8.5: version "0.8.5" @@ -8877,16 +9300,16 @@ snapdragon@^0.8.1: source-map-resolve "^0.5.0" use "^3.1.0" -socks-proxy-agent@5, socks-proxy-agent@^5.0.0: - version "5.0.1" - resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-5.0.1.tgz#032fb583048a29ebffec2e6a73fca0761f48177e" - integrity sha512-vZdmnjb9a2Tz6WEQVIurybSwElwPxMZaIc7PzqbJTrezcKNznv6giT7J7tZDZ1BojVaa1jvO/UiUdhDVB0ACoQ== +socks-proxy-agent@^8.0.1: + version "8.0.2" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.2.tgz#5acbd7be7baf18c46a3f293a840109a430a640ad" + integrity sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g== dependencies: - agent-base "^6.0.2" - debug "4" - socks "^2.3.3" + agent-base "^7.0.2" + debug "^4.3.4" + socks "^2.7.1" -socks@^2.3.3: +socks@^2.7.1: version "2.7.1" resolved "https://registry.yarnpkg.com/socks/-/socks-2.7.1.tgz#d8e651247178fde79c0663043e07240196857d55" integrity sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ== @@ -8934,9 +9357,9 @@ source-map@^0.7.3: integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== spdx-correct@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz#dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9" - integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w== + version "3.2.0" + resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.2.0.tgz#4f5ab0668f0059e34f9c00dce331784a12de4e9c" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== dependencies: spdx-expression-parse "^3.0.0" spdx-license-ids "^3.0.0" @@ -8955,9 +9378,9 @@ spdx-expression-parse@^3.0.0: spdx-license-ids "^3.0.0" spdx-license-ids@^3.0.0: - version "3.0.12" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz#69077835abe2710b65f03969898b6637b505a779" - integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA== + version "3.0.16" + resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz#a14f64e0954f6e25cc6587bd4f392522db0d998f" + integrity sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw== split-string@^3.0.1, split-string@^3.0.2: version "3.1.0" @@ -8966,7 +9389,7 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" -split2@^3.0.0: +split2@^3.0.0, split2@^3.2.2: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" integrity sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg== @@ -9022,6 +9445,20 @@ statuses@~1.5.0: resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== +stdin-discarder@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/stdin-discarder/-/stdin-discarder-0.1.0.tgz#22b3e400393a8e28ebf53f9958f3880622efde21" + integrity sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ== + dependencies: + bl "^5.0.0" + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz#6a60be0b4ee757d1ed5254858ec66b10c49285e4" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + stream-buffers@2.2.x: version "2.2.0" resolved "https://registry.yarnpkg.com/stream-buffers/-/stream-buffers-2.2.0.tgz#91d5f5130d1cef96dcfa7f726945188741d09ee4" @@ -9059,36 +9496,46 @@ string-width@^5.0.1, string-width@^5.1.2: strip-ansi "^7.0.1" string.prototype.matchall@^4.0.8: - version "4.0.8" - resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" - integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + version "4.0.10" + resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.10.tgz#a1553eb532221d4180c51581d6072cd65d1ee100" + integrity sha512-rGXbGmOEosIQi6Qva94HUjgPs9vKW+dkG7Y8Q5O2OYkWL6wFaTRZO8zM4mhP94uX55wgyrXzfS2aGtGzUL7EJQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" - get-intrinsic "^1.1.3" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" has-symbols "^1.0.3" - internal-slot "^1.0.3" - regexp.prototype.flags "^1.4.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + set-function-name "^2.0.0" side-channel "^1.0.4" -string.prototype.trimend@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz#c4a27fa026d979d79c04f17397f250a462944533" - integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== +string.prototype.trim@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz#f9ac6f8af4bd55ddfa8895e6aea92a96395393bd" + integrity sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" -string.prototype.trimstart@^1.0.6: - version "1.0.6" - resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz#e90ab66aa8e4007d92ef591bbf3cd422c56bdcf4" - integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== +string.prototype.trimend@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz#1bb3afc5008661d73e2dc015cd4853732d6c471e" + integrity sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA== dependencies: call-bind "^1.0.2" - define-properties "^1.1.4" - es-abstract "^1.20.4" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string.prototype.trimstart@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz#d4cdb44b83a4737ffbac2d406e405d43d0184298" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" string_decoder@^1.1.1: version "1.3.0" @@ -9097,11 +9544,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string_decoder@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" @@ -9124,9 +9566,9 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1: ansi-regex "^5.0.1" strip-ansi@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.0.1.tgz#61740a08ce36b61e50e65653f07060d000975fb2" - integrity sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw== + version "7.1.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.1.0.tgz#d5b6568ca689d8561370b0707685d22434faff45" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== dependencies: ansi-regex "^6.0.1" @@ -9162,7 +9604,7 @@ strip-indent@^3.0.0: dependencies: min-indent "^1.0.0" -strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -9283,6 +9725,11 @@ through@2, "through@>=2.2.7 <3", through@^2.3.6: resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== +titleize@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53" + integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ== + tmp@^0.0.33: version "0.0.33" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" @@ -9389,9 +9836,9 @@ tslib@^1.8.1: integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== tslib@^2.0.1, tslib@^2.1.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.1.tgz#0d0bfbaac2880b91e22df0768e55be9753a5b17e" - integrity sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA== + version "2.6.2" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== tsutils@^3.21.0: version "3.21.0" @@ -9459,10 +9906,44 @@ type-fest@^2.13.0, type-fest@^2.5.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== -type-fest@^3.0.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.4.0.tgz#64a35b7748ab4a96b3e0c324475ea66643c5f9df" - integrity sha512-PEPg6RHlB9cFwoTMNENNrQFL0cXX04voWr2UPwQBJ3pVs7Mt8Y1oLWdUeMdGEwZE8HFFlujq8gS9enmyiQ8pLg== +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz#18de3e7ed7974b0a729d3feecb94338d1472cd60" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz#d787a24a995711611fb2b87a4052799517b230d0" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz#cbbe89b51fdef9cd6aaf07ad4707340abbc4ea0b" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.4.tgz#89d83785e5c4098bec72e08b319651f0eac9c1bb" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" typedarray-to-buffer@^3.1.5: version "3.1.5" @@ -9476,10 +9957,15 @@ typedarray@^0.0.6: resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -typescript@^4.6.4, typescript@^4.9.3: - version "4.9.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.4.tgz#a2a3d2756c079abda241d75f149df9d561091e78" - integrity sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg== +"typescript@^4.6.4 || ^5.2.2": + version "5.2.2" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.2.2.tgz#5ebb5e5a5b75f085f22bc3f8460fba308310fa78" + integrity sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w== + +typescript@^4.9.3: + version "4.9.5" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a" + integrity sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g== uglify-es@^3.1.9: version "3.3.9" @@ -9509,6 +9995,11 @@ unc-path-regex@^0.1.2: resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" integrity sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg== +undici-types@~5.26.4: + version "5.26.5" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" + integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== + unicode-canonical-property-names-ecmascript@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc" @@ -9550,9 +10041,9 @@ unique-string@^3.0.0: crypto-random-string "^4.0.0" universal-user-agent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" - integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + version "6.0.1" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.1.tgz#15f20f55da3c930c57bddbf1734c6654d5fd35aa" + integrity sha512-yCzhz6FN2wU1NiiQRogkTQszlQSlpWaw8SvVegAc+bDxbzHgh1vX8uIe8OYyMH6DwH+sdTJsgMl36+mSMdRJIQ== universalify@^0.1.0: version "0.1.2" @@ -9565,11 +10056,11 @@ universalify@^0.2.0: integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== universalify@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" - integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + version "2.0.1" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" + integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@1.0.0, unpipe@~1.0.0: +unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -9582,10 +10073,15 @@ unset-value@^1.0.0: has-value "^0.3.1" isobject "^3.0.0" -update-browserslist-db@^1.0.9: - version "1.0.10" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" - integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== +untildify@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b" + integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw== + +update-browserslist-db@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz#3c5e4f5c083661bd38ef64b6328c26ed6c8248c4" + integrity sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -9699,7 +10195,7 @@ vlq@^1.0.0: resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.1.tgz#c003f6e7c0b4c1edd623fd6ee50bbc0d6a1de468" integrity sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w== -vm2@^3.9.8: +vm2@^3.9.19: version "3.9.19" resolved "https://registry.yarnpkg.com/vm2/-/vm2-3.9.19.tgz#be1e1d7a106122c6c492b4d51c2e8b93d3ed6a4a" integrity sha512-J637XF0DHDMV57R6JyVsTak7nIL8gy5KH4r1HiwWLf/4GBbb5MKL5y7LpmF4A8E2nR6XmzpmMFQ7V7ppPTmUQg== @@ -9763,9 +10259,9 @@ whatwg-encoding@^1.0.5: iconv-lite "0.4.24" whatwg-fetch@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz#dced24f37f2624ed0281725d51d0e2e3fe677f8c" - integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + version "3.6.19" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-3.6.19.tgz#caefd92ae630b91c07345537e67f8354db470973" + integrity sha512-d67JP4dHSbm2TrpFj8AbO8DnL1JXL5J9u0Kq2xW6d0TFDbCA3Muhdt8orXC22utleTVj7Prqt82baN6RBvnEgw== whatwg-mimetype@^2.3.0: version "2.3.0" @@ -9800,16 +10296,55 @@ which-boxed-primitive@^1.0.2: is-string "^1.0.5" is-symbol "^1.0.3" +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.1.tgz#70eab71ebbbd2aefaf32f917082fc62cdcb70906" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + which-module@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz#d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a" - integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q== + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== which-pm-runs@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/which-pm-runs/-/which-pm-runs-1.1.0.tgz#35ccf7b1a0fce87bd8b92a478c9d045785d3bf35" integrity sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA== +which-typed-array@^1.1.11, which-typed-array@^1.1.13, which-typed-array@^1.1.9: + version "1.1.13" + resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.13.tgz#870cd5be06ddb616f504e7b039c4c24898184d36" + integrity sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.4" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + which@^1.2.9: version "1.3.1" resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" @@ -9837,23 +10372,23 @@ wildcard-match@5.1.2: integrity sha512-qNXwI591Z88c8bWxp+yjV60Ch4F8Riawe3iGxbzquhy8Xs9m+0+SLFBGb/0yCTIDElawtaImC37fYZ+dr32KqQ== windows-release@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-5.0.1.tgz#d1f7cd1f25660ba05cac6359711844dce909a8ed" - integrity sha512-y1xFdFvdMiDXI3xiOhMbJwt1Y7dUxidha0CWPs1NgjZIjZANTcX7+7bMqNjuezhzb8s5JGEiBAbQjQQYYy7ulw== + version "5.1.1" + resolved "https://registry.yarnpkg.com/windows-release/-/windows-release-5.1.1.tgz#7ac7019f9baeaea6c00ec889b11824f46c12ee8d" + integrity sha512-NMD00arvqcq2nwqc5Q6KtrSRHK+fVD31erE5FEMahAw5PmVCgD7MUXodq3pdZSUkqA9Cda2iWx6s1XYwiJWRmw== dependencies: execa "^5.1.1" -word-wrap@^1.2.3, word-wrap@~1.2.3: - version "1.2.4" - resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.4.tgz#cb4b50ec9aca570abd1f52f33cd45b6c61739a9f" - integrity sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA== +word-wrap@~1.2.3: + version "1.2.5" + resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34" + integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== wordwrap@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -wrap-ansi@^6.2.0: +wrap-ansi@^6.0.1, wrap-ansi@^6.2.0: version "6.2.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53" integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA== @@ -9871,10 +10406,10 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1: - version "8.0.1" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.0.1.tgz#2101e861777fec527d0ea90c57c6b03aac56a5b3" - integrity sha512-QFF+ufAqhoYHvoHdajT/Po7KoXVBPXS2bgjIam5isfWJPfIOnQZ50JtUiVvCv/sjgacf3yRrt2ZKUZ/V4itN4g== +wrap-ansi@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214" + integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== dependencies: ansi-styles "^6.1.0" string-width "^5.0.1" @@ -9945,17 +10480,12 @@ xmlchars@^2.2.0: integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== xmldoc@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.2.0.tgz#7554371bfd8c138287cff01841ae4566d26e5541" - integrity sha512-2eN8QhjBsMW2uVj7JHLHkMytpvGHLHxKXBy4J3fAT/HujsEtM6yU84iGjpESYGHg6XwK0Vu4l+KgqQ2dv2cCqg== + version "1.3.0" + resolved "https://registry.yarnpkg.com/xmldoc/-/xmldoc-1.3.0.tgz#7823225b096c74036347c9ec5924d06b6a3cebab" + integrity sha512-y7IRWW6PvEnYQZNZFMRLNJw+p3pezM4nKYPfr15g4OOW9i8VpeydycFuipE2297OvZnh3jSb2pxOt9QpkZUVng== dependencies: sax "^1.2.4" -xregexp@2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/xregexp/-/xregexp-2.0.0.tgz#52a63e56ca0b84a7f3a5f3d61872f126ad7a5943" - integrity sha512-xl/50/Cf32VsGq/1R8jJE5ajH1yMCQkpmoS10QbFZWl2Oor4H0Me64Pu2yxvsRWK3m6soJbmGfzSR7BYmDcWAA== - xtend@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" @@ -10035,9 +10565,9 @@ yargs@^16.2.0: yargs-parser "^20.2.2" yargs@^17.0.0, yargs@^17.5.1: - version "17.6.2" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.6.2.tgz#2e23f2944e976339a1ee00f18c77fedee8332541" - integrity sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw== + version "17.7.2" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== dependencies: cliui "^8.0.1" escalade "^3.1.1" diff --git a/binding/react/cypress/support/commands.ts b/binding/react/cypress/support/commands.ts index 3d8ae700..0f35bcc0 100644 --- a/binding/react/cypress/support/commands.ts +++ b/binding/react/cypress/support/commands.ts @@ -1,6 +1,8 @@ import { WebVoiceProcessor } from '@picovoice/web-voice-processor'; import { act } from '@testing-library/react-hooks/dom'; +const WAV_HEADER_SIZE = 44; + Cypress.Commands.add('wrapHook', (fn: () => Promise) => cy.wrap(null).then(async () => { await act(async () => { @@ -15,7 +17,7 @@ Cypress.Commands.add('getFileObj', (path: string) => { .then(blob => new File([blob], 'test_audio')); }); -Cypress.Commands.add('mockRecording', (path: string, delayMs = 1000) => { +Cypress.Commands.add('mockRecording', (path: string) => { // @ts-ignore const instance = WebVoiceProcessor.instance(); @@ -26,12 +28,12 @@ Cypress.Commands.add('mockRecording', (path: string, delayMs = 1000) => { cy.fixture(path, 'base64') .then(Cypress.Blob.base64StringToBlob) .then(async blob => { - const data = new Int16Array(await blob.arrayBuffer()); + let data = new Int16Array(await blob.arrayBuffer()); + data = data.slice(WAV_HEADER_SIZE / Int16Array.BYTES_PER_ELEMENT); for (let i = 0; i < data.length; i += 512) { instance.recorderCallback(data.slice(i, i + 512)); } - }) - .wait(delayMs); + }); instance._microphoneStream?.getAudioTracks().forEach((track: any) => { track.enabled = true; diff --git a/binding/react/cypress/support/index.ts b/binding/react/cypress/support/index.ts index 904b6543..7ff62d3e 100644 --- a/binding/react/cypress/support/index.ts +++ b/binding/react/cypress/support/index.ts @@ -5,7 +5,7 @@ declare global { interface Chainable { wrapHook(fn: () => Promise): Chainable; getFileObj(path: string): Chainable; - mockRecording(path: string, delayMs?: number): Chainable; + mockRecording(path: string): Chainable; } } } diff --git a/binding/react/package.json b/binding/react/package.json index 9665b657..67a1205c 100644 --- a/binding/react/package.json +++ b/binding/react/package.json @@ -1,6 +1,6 @@ { "name": "@picovoice/leopard-react", - "version": "1.2.0", + "version": "2.0.0", "description": "React hook for Leopard Web SDK", "entry": "src/index.ts", "module": "dist/esm/index.js", @@ -35,7 +35,7 @@ "test": "cypress run --component" }, "dependencies": { - "@picovoice/leopard-web": "=1.2.2" + "@picovoice/leopard-web": "=2.0.0" }, "devDependencies": { "@babel/core": "^7.21.3", diff --git a/binding/react/test/use_leopard.test.ts b/binding/react/test/use_leopard.test.ts index 008bafb9..be204df0 100644 --- a/binding/react/test/use_leopard.test.ts +++ b/binding/react/test/use_leopard.test.ts @@ -1,5 +1,5 @@ import { renderHook } from '@testing-library/react-hooks/dom'; - +import { LeopardWord } from '@picovoice/leopard-web'; import { useLeopard } from '../src'; // @ts-ignore @@ -10,6 +10,124 @@ import testData from './test_data.json'; const ACCESS_KEY = Cypress.env('ACCESS_KEY'); +const levenshteinDistance = (words1: string[], words2: string[]) => { + const res = Array.from( + Array(words1.length + 1), + () => new Array(words2.length + 1) + ); + for (let i = 0; i <= words1.length; i++) { + res[i][0] = i; + } + for (let j = 0; j <= words2.length; j++) { + res[0][j] = j; + } + for (let i = 1; i <= words1.length; i++) { + for (let j = 1; j <= words2.length; j++) { + res[i][j] = Math.min( + res[i - 1][j] + 1, + res[i][j - 1] + 1, + res[i - 1][j - 1] + + (words1[i - 1].toUpperCase() === words2[j - 1].toUpperCase() ? 0 : 1) + ); + } + } + return res[words1.length][words2.length]; +}; + +const wordErrorRate = ( + reference: string, + hypothesis: string, + useCER = false +): number => { + const splitter = useCER ? '' : ' '; + const ed = levenshteinDistance( + reference.split(splitter), + hypothesis.split(splitter) + ); + return ed / reference.length; +}; + +const validateMetadata = ( + words: LeopardWord[], + expectedWords: LeopardWord[], + enableDiarization: boolean +) => { + expect(words.length).to.be.eq(expectedWords.length); + for (let i = 0; i < words.length; i += 1) { + expect(words[i].word).to.be.eq(expectedWords[i].word); + expect(words[i].startSec).to.be.closeTo(expectedWords[i].startSec, 0.1); + expect(words[i].endSec).to.be.closeTo(expectedWords[i].endSec, 0.1); + expect(words[i].confidence).to.be.closeTo(expectedWords[i].confidence, 0.1); + if (enableDiarization) { + expect(words[i].speakerTag).to.be.eq(expectedWords[i].speakerTag); + } else { + expect(words[i].speakerTag).to.be.eq(-1); + } + } +}; + +const runProcTest = async ( + file: File, + expectedTranscript: string, + expectedWords: Record[], + expectedErrorRate: number, + params: { + accessKey?: string; + model?: Record; + enableAutomaticPunctuation?: boolean; + enableDiarization?: boolean; + useCER?: boolean; + } = {} +) => { + const { + accessKey = ACCESS_KEY, + model = { publicPath: '/test/leopard_params.pv', forceWrite: true }, + enableAutomaticPunctuation = false, + enableDiarization = false, + useCER = false, + } = params; + const { result } = renderHook(() => useLeopard()); + + cy.wrapHook(() => + result.current.init(accessKey, model, { + enableAutomaticPunctuation: enableAutomaticPunctuation, + enableDiarization: enableDiarization, + }) + ).then(() => { + expect( + result.current.isLoaded, + `Failed to load '${model.publicPath}' with ${result.current.error}` + ).to.be.true; + }); + + cy.wrapHook(() => result.current.processFile(file)).then(() => { + const transcript = result.current.result!.transcript; + expect(transcript).to.eq(expectedTranscript); + + validateMetadata( + result.current.result!.words, + expectedWords.map((w: any) => ({ + word: w.word, + startSec: w.start_sec, + endSec: w.end_sec, + confidence: w.confidence, + speakerTag: w.speaker_tag, + })), + enableDiarization + ); + + const errorRate = wordErrorRate(transcript, expectedTranscript, useCER); + expect(errorRate).to.be.lt(expectedErrorRate); + }); + + cy.wrapHook(result.current.release).then(() => { + expect( + result.current.isLoaded, + `Failed to release leopard with ${result.current.error}` + ).to.be.false; + }); +}; + describe('Leopard binding', () => { it('should be able to init via public path', () => { const { result } = renderHook(() => useLeopard()); @@ -25,13 +143,6 @@ describe('Leopard binding', () => { `Failed to load 'leopard_params.pv' with ${result.current.error}` ).to.be.true; }); - - cy.wrapHook(result.current.release).then(() => { - expect( - result.current.isLoaded, - `Failed to release leopard with ${result.current.error}` - ).to.be.false; - }); }); it('should be able to init via base64', () => { @@ -80,51 +191,130 @@ describe('Leopard binding', () => { }); }); - for (const testInfo of testData.tests.parameters) { - it(`should be able to process audio file (${testInfo.language})`, () => { + for (const testParam of testData.tests.language_tests) { + const suffix = testParam.language === 'en' ? '' : `_${testParam.language}`; + + it(`should be able to process (${testParam.language})`, () => { + cy.getFileObj(`audio_samples/${testParam.audio_file}`).then( + async file => { + await runProcTest( + file, + testParam.transcript, + testParam.words, + testParam.error_rate, + { + model: { + publicPath: `/test/leopard_params${suffix}.pv`, + forceWrite: true, + }, + } + ); + } + ); + }); + + it(`should be able to process with punctuation (${testParam.language})`, () => { + cy.getFileObj(`audio_samples/${testParam.audio_file}`).then( + async file => { + await runProcTest( + file, + testParam.transcript_with_punctuation, + testParam.words, + testParam.error_rate, + { + enableAutomaticPunctuation: true, + model: { + publicPath: `/test/leopard_params${suffix}.pv`, + forceWrite: true, + }, + } + ); + } + ); + }); + + it(`should be able to process with diarization (${testParam.language})`, () => { + cy.getFileObj(`audio_samples/${testParam.audio_file}`).then( + async file => { + await runProcTest( + file, + testParam.transcript, + testParam.words, + testParam.error_rate, + { + enableDiarization: true, + model: { + publicPath: `/test/leopard_params${suffix}.pv`, + forceWrite: true, + }, + } + ); + } + ); + }); + + it(`should be able to process audio recording (${testParam.language})`, () => { const { result } = renderHook(() => useLeopard()); cy.wrapHook(() => - result.current.init( - ACCESS_KEY, - { - publicPath: - testInfo.language === 'en' - ? `/test/leopard_params.pv` - : `/test/leopard_params_${testInfo.language}.pv`, - forceWrite: true, - }, - { - enableAutomaticPunctuation: true, - } - ) + result.current.init(ACCESS_KEY, { + publicPath: + testParam.language === 'en' + ? `/test/leopard_params.pv` + : `/test/leopard_params_${testParam.language}.pv`, + forceWrite: true, + }) ).then(() => { expect( result.current.isLoaded, - `Failed to load ${testInfo.audio_file} (${testInfo.language}) with ${result.current.error}` + `Failed to load ${testParam.audio_file} (${testParam.language}) with ${result.current.error}` ).to.be.true; }); - cy.getFileObj(`audio_samples/${testInfo.audio_file}`).then(file => { - cy.wrapHook(() => result.current.processFile(file)).then(() => { - const transcript = result.current.result?.transcript; - expect(transcript).to.be.eq(testInfo.transcript); - result.current.result?.words.forEach( - ({ word, startSec, endSec, confidence }) => { - const wordRegex = new RegExp(`${word}`, 'i'); - expect(transcript).to.match(wordRegex); - expect(startSec).to.be.gt(0); - expect(endSec).to.be.gt(0); - expect(confidence).to.be.gt(0).and.lt(1); - } + cy.wrapHook(result.current.startRecording).then(() => { + expect(result.current.isRecording).to.be.true; + }); + + cy.mockRecording(`audio_samples/${testParam.audio_file}`).then(() => { + cy.wrapHook(result.current.stopRecording).then(() => { + expect(result.current.isRecording).to.be.false; + + const { + transcript: expectedTranscript, + words: expectedWords, + error_rate: expectedErrorRate, + language, + } = testParam; + const useCER = language === 'ja'; + + const transcript = result.current.result!.transcript; + expect(transcript).to.eq(expectedTranscript); + + validateMetadata( + result.current.result!.words, + expectedWords.map((w: any) => ({ + word: w.word, + startSec: w.start_sec, + endSec: w.end_sec, + confidence: w.confidence, + speakerTag: w.speaker_tag, + })), + false ); + + const errorRate = wordErrorRate( + transcript, + expectedTranscript, + useCER + ); + expect(errorRate).to.be.lt(expectedErrorRate); }); }); }); } - for (const testInfo of testData.tests.parameters) { - it(`should be able to process audio recording (${testInfo.language})`, () => { + for (const testParam of testData.tests.diarization_tests) { + it(`should be able to process diarization multiple speakers (${testParam.language})`, () => { const { result } = renderHook(() => useLeopard()); cy.wrapHook(() => @@ -132,40 +322,28 @@ describe('Leopard binding', () => { ACCESS_KEY, { publicPath: - testInfo.language === 'en' + testParam.language === 'en' ? `/test/leopard_params.pv` - : `/test/leopard_params_${testInfo.language}.pv`, + : `/test/leopard_params_${testParam.language}.pv`, forceWrite: true, }, - { - enableAutomaticPunctuation: true, - } + { enableDiarization: true } ) ).then(() => { expect( result.current.isLoaded, - `Failed to load ${testInfo.audio_file} (${testInfo.language}) with ${result.current.error}` + `Failed to load ${testParam.audio_file} (${testParam.language}) with ${result.current.error}` ).to.be.true; }); - cy.wrapHook(result.current.startRecording).then(() => { - expect(result.current.isRecording).to.be.true; - }); - - cy.mockRecording(`audio_samples/${testInfo.audio_file}`).then(() => { - cy.wrapHook(result.current.stopRecording).then(() => { - const transcript = result.current.result?.transcript; - expect(transcript).to.be.eq(testInfo.transcript); - expect(result.current.isRecording).to.be.false; - result.current.result?.words.forEach( - ({ word, startSec, endSec, confidence }) => { - const wordRegex = new RegExp(`${word}`, 'i'); - expect(transcript).to.match(wordRegex); - expect(startSec).to.be.gt(0); - expect(endSec).to.be.gt(0); - expect(confidence).to.be.gt(0).and.lt(1); - } - ); + cy.getFileObj(`audio_samples/${testParam.audio_file}`).then(file => { + cy.wrapHook(() => result.current.processFile(file)).then(() => { + const words = result.current.result!.words; + expect(words.length).to.eq(testParam.words.length); + for (let i = 0; i < words.length; i++) { + expect(words[i].word).to.eq(testParam.words[i].word); + expect(words[i].speakerTag).to.eq(testParam.words[i].speaker_tag); + } }); }); }); diff --git a/binding/react/yarn.lock b/binding/react/yarn.lock index 5dd16d7f..18f87aa0 100644 --- a/binding/react/yarn.lock +++ b/binding/react/yarn.lock @@ -1110,10 +1110,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@picovoice/leopard-web@=1.2.2": - version "1.2.2" - resolved "https://registry.npmjs.org/@picovoice/leopard-web/-/leopard-web-1.2.2.tgz" - integrity sha512-/YzFi5O+j+qx4+3vVXPA8hpjaN/Z3ozUkv50GN2NgmVb7VXaLqrAs3Yr+zgFRzejJSzJ8Uu8edn6f4GHp6+n7g== +"@picovoice/leopard-web@=2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@picovoice/leopard-web/-/leopard-web-2.0.0.tgz#6452d1e49f983542db73a3c8cdf24208c30af234" + integrity sha512-kfJtUCopyvmN028wiaH6hdEHEhOx7QTruiaL5ykVZcpMq1lV/O02hwr29i3U7FqoH6VQQYZl7pRIvlPjDaj+eg== dependencies: "@picovoice/web-utils" "=1.3.1" diff --git a/binding/rust/Cargo.toml b/binding/rust/Cargo.toml index 4fde2d34..1e805b77 100644 --- a/binding/rust/Cargo.toml +++ b/binding/rust/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pv_leopard" -version = "1.2.0" +version = "2.0.0" edition = "2018" description = "The Rust bindings for Picovoice's Leopard library" license = "Apache-2.0" @@ -27,10 +27,11 @@ crate_type = ["lib"] [dependencies] libc = "0.2" -libloading = "0.7" +libloading = "0.8" [dev-dependencies] distance = "0.4.0" -itertools = "0.10" -rodio = "0.15" -serde_json = "1.0.91" +itertools = "0.11" +rodio = "0.17" +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } \ No newline at end of file diff --git a/binding/rust/src/leopard.rs b/binding/rust/src/leopard.rs index 71067166..600716e8 100644 --- a/binding/rust/src/leopard.rs +++ b/binding/rust/src/leopard.rs @@ -26,7 +26,11 @@ use libloading::{Library, Symbol}; use crate::util::{pathbuf_to_cstring, pv_library_path, pv_model_path}; #[repr(C)] -struct CLeopard {} +struct CLeopard { + // Fields suggested by the Rustonomicon: https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs + _data: [u8; 0], + _marker: core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>, +} #[repr(C)] struct CLeopardWord { @@ -34,6 +38,7 @@ struct CLeopardWord { start_sec: f32, end_sec: f32, confidence: f32, + speaker_tag: i32, } #[repr(C)] @@ -58,6 +63,7 @@ type PvLeopardInitFn = unsafe extern "C" fn( access_key: *const c_char, model_path: *const c_char, enable_automatic_punctuation: bool, + enable_diarization: bool, object: *mut *mut CLeopard, ) -> PvStatus; type PvSampleRateFn = unsafe extern "C" fn() -> i32; @@ -80,6 +86,12 @@ type PvLeopardProcessFileFn = unsafe extern "C" fn( type PvLeopardDeleteFn = unsafe extern "C" fn(object: *mut CLeopard); type PvLeopardTranscriptDeleteFn = unsafe extern "C" fn(transcript: *mut c_char); type PvLeopardWordsDeleteFn = unsafe extern "C" fn(words: *mut CLeopardWord); +type PvGetErrorStackFn = unsafe extern "C" fn( + message_stack: *mut *mut *mut c_char, + message_stack_depth: *mut i32 +) -> PvStatus; +type PvFreeErrorStackFn = unsafe extern "C" fn(message_stack: *mut *mut c_char); +type PvSetSdkFn = unsafe extern "C" fn(sdk: *const c_char); #[derive(Clone, Debug)] pub enum LeopardErrorStatus { @@ -91,8 +103,9 @@ pub enum LeopardErrorStatus { #[derive(Clone, Debug)] pub struct LeopardError { - status: LeopardErrorStatus, - message: String, + pub status: LeopardErrorStatus, + pub message: String, + pub message_stack: Vec, } impl LeopardError { @@ -100,13 +113,35 @@ impl LeopardError { Self { status, message: message.into(), + message_stack: Vec::new() + } + } + + pub fn new_with_stack( + status: LeopardErrorStatus, + message: impl Into, + message_stack: impl Into> + ) -> Self { + Self { + status, + message: message.into(), + message_stack: message_stack.into(), } } } impl std::fmt::Display for LeopardError { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "{}: {:?}", self.message, self.status) + let mut message_string = String::new(); + message_string.push_str(&format!("{} with status '{:?}'", self.message, self.status)); + + if !self.message_stack.is_empty() { + message_string.push(':'); + for x in 0..self.message_stack.len() { + message_string.push_str(&format!(" [{}] {}\n", x, self.message_stack[x])) + }; + } + write!(f, "{}", message_string) } } @@ -117,6 +152,7 @@ pub struct LeopardBuilder { model_path: PathBuf, library_path: PathBuf, enable_automatic_punctuation: bool, + enable_diarization: bool, } impl Default for LeopardBuilder { @@ -127,6 +163,7 @@ impl Default for LeopardBuilder { impl LeopardBuilder { const DEFAULT_ENABLE_AUTOMATIC_PUNCTUATION: bool = false; + const DEFAULT_ENABLE_DIARIZATION: bool = false; pub fn new() -> Self { Self { @@ -134,6 +171,7 @@ impl LeopardBuilder { model_path: pv_model_path(), library_path: pv_library_path(), enable_automatic_punctuation: Self::DEFAULT_ENABLE_AUTOMATIC_PUNCTUATION, + enable_diarization: Self::DEFAULT_ENABLE_DIARIZATION, } } @@ -160,12 +198,22 @@ impl LeopardBuilder { self } + pub fn enable_diarization( + &mut self, + enable_diarization: bool, + ) -> &mut Self { + self.enable_diarization = enable_diarization; + self + } + + pub fn init(&self) -> Result { let inner = LeopardInner::init( &self.access_key, &self.model_path, &self.library_path, self.enable_automatic_punctuation, + self.enable_diarization, ); match inner { Ok(inner) => Ok(Leopard { @@ -182,6 +230,7 @@ pub struct LeopardWord { pub start_sec: f32, pub end_sec: f32, pub confidence: f32, + pub speaker_tag: i32, } impl From<&CLeopardWord> for Result { @@ -200,6 +249,7 @@ impl From<&CLeopardWord> for Result { start_sec: c_leopard_word.start_sec, end_sec: c_leopard_word.end_sec, confidence: c_leopard_word.confidence, + speaker_tag: c_leopard_word.speaker_tag, }) } } @@ -254,23 +304,60 @@ unsafe fn load_library_fn( }) } -fn check_fn_call_status(status: PvStatus, function_name: &str) -> Result<(), LeopardError> { +fn check_fn_call_status( + vtable: &LeopardInnerVTable, + status: PvStatus, + function_name: &str +) -> Result<(), LeopardError> { match status { PvStatus::SUCCESS => Ok(()), - _ => Err(LeopardError::new( - LeopardErrorStatus::LibraryError(status), - format!("Function '{}' in the leopard library failed", function_name), - )), + _ => unsafe { + let mut message_stack_ptr: *mut c_char = std::ptr::null_mut(); + let mut message_stack_ptr_ptr = addr_of_mut!(message_stack_ptr); + + let mut message_stack_depth: i32 = 0; + let err_status = (vtable.pv_get_error_stack)( + addr_of_mut!(message_stack_ptr_ptr), + addr_of_mut!(message_stack_depth), + ); + + if err_status != PvStatus::SUCCESS { + return Err(LeopardError::new( + LeopardErrorStatus::LibraryError(err_status), + "Unable to get Leopard error state.", + )) + } + + let mut message_stack = Vec::new(); + for i in 0..message_stack_depth as usize { + let message = CStr::from_ptr(*message_stack_ptr_ptr.add(i)); + let message = message.to_string_lossy().into_owned(); + message_stack.push(message); + } + + (vtable.pv_free_error_stack)(message_stack_ptr_ptr); + + Err(LeopardError::new_with_stack( + LeopardErrorStatus::LibraryError(status), + format!("'{function_name}' failed"), + message_stack, + )) + }, } } struct LeopardInnerVTable { + pv_leopard_init: RawSymbol, pv_leopard_process: RawSymbol, pv_leopard_process_file: RawSymbol, pv_leopard_delete: RawSymbol, pv_leopard_transcript_delete: RawSymbol, pv_leopard_words_delete: RawSymbol, - + pv_leopard_version: RawSymbol, + pv_sample_rate: RawSymbol, + pv_get_error_stack: RawSymbol, + pv_free_error_stack: RawSymbol, + pv_set_sdk: RawSymbol, _lib_guard: Library, } @@ -279,6 +366,7 @@ impl LeopardInnerVTable { // SAFETY: the library will be hold by this struct and therefore the symbols can't outlive the library unsafe { Ok(Self { + pv_leopard_init: load_library_fn(&lib, b"pv_leopard_init")?, pv_leopard_process: load_library_fn(&lib, b"pv_leopard_process")?, pv_leopard_process_file: load_library_fn(&lib, b"pv_leopard_process_file")?, pv_leopard_delete: load_library_fn(&lib, b"pv_leopard_delete")?, @@ -287,6 +375,12 @@ impl LeopardInnerVTable { b"pv_leopard_transcript_delete", )?, pv_leopard_words_delete: load_library_fn(&lib, b"pv_leopard_words_delete")?, + pv_leopard_version: load_library_fn(&lib, b"pv_leopard_version")?, + pv_sample_rate: load_library_fn(&lib, b"pv_sample_rate")?, + + pv_get_error_stack: load_library_fn(&lib, b"pv_get_error_stack")?, + pv_free_error_stack: load_library_fn(&lib, b"pv_free_error_stack")?, + pv_set_sdk: load_library_fn(&lib, b"pv_set_sdk")?, _lib_guard: lib, }) @@ -311,6 +405,7 @@ impl LeopardInner { model_path: P, library_path: P, enable_automatic_punctuation: bool, + enable_diarization: bool, ) -> Result { if access_key.is_empty() { return Err(LeopardError::new( @@ -346,6 +441,18 @@ impl LeopardInner { ) })?; + let vtable = LeopardInnerVTable::new(lib)?; + + let sdk_string = match CString::new("rust") { + Ok(sdk_string) => sdk_string, + Err(err) => { + return Err(LeopardError::new( + LeopardErrorStatus::ArgumentError, + format!("sdk_string is not a valid C string {err}"), + )) + } + }; + let access_key = match CString::new(access_key) { Ok(access_key) => access_key, Err(err) => { @@ -362,37 +469,32 @@ impl LeopardInner { // safe, because we don't use the raw symbols after this function // anymore. let (sample_rate, version) = unsafe { - let pv_leopard_init = load_library_fn::(&lib, b"pv_leopard_init")?; - let pv_sample_rate = load_library_fn::(&lib, b"pv_sample_rate")?; - let pv_leopard_version = - load_library_fn::(&lib, b"pv_leopard_version")?; + (vtable.pv_set_sdk)(sdk_string.as_ptr()); - let status = pv_leopard_init( + let status = (vtable.pv_leopard_init)( access_key.as_ptr(), pv_model_path.as_ptr(), enable_automatic_punctuation, + enable_diarization, addr_of_mut!(cleopard), ); - check_fn_call_status(status, "pv_leopard_init")?; + check_fn_call_status(&vtable, status, "pv_leopard_init")?; - let version = match CStr::from_ptr(pv_leopard_version()).to_str() { - Ok(string) => string.to_string(), - Err(err) => { - return Err(LeopardError::new( - LeopardErrorStatus::LibraryLoadError, - format!("Failed to get version info from Leopard Library: {}", err), - )) - } - }; + let version = CStr::from_ptr((vtable.pv_leopard_version)()) + .to_string_lossy() + .into_owned(); - (pv_sample_rate(), version) + ( + (vtable.pv_sample_rate)(), + version + ) }; Ok(Self { cleopard, sample_rate, version, - vtable: LeopardInnerVTable::new(lib)?, + vtable, }) } @@ -418,7 +520,7 @@ impl LeopardInner { addr_of_mut!(words_ptr), ); - check_fn_call_status(status, "pv_leopard_process")?; + check_fn_call_status(&self.vtable, status, "pv_leopard_process")?; let transcript = String::from(CStr::from_ptr(transcript_ptr).to_str().map_err(|_| { @@ -486,7 +588,7 @@ impl LeopardInner { )); } - check_fn_call_status(status, "pv_leopard_process_file")?; + check_fn_call_status(&self.vtable, status, "pv_leopard_process_file")?; } let transcript = @@ -521,3 +623,39 @@ impl Drop for LeopardInner { } } } + +#[cfg(test)] +mod tests { + use std::env; + + use crate::util::{pv_library_path, pv_model_path}; + use crate::leopard::{LeopardInner}; + + #[test] + fn test_process_error_stack() { + let access_key = env::var("PV_ACCESS_KEY") + .expect("Pass the AccessKey in using the PV_ACCESS_KEY env variable"); + + let mut inner = LeopardInner::init( + &access_key.as_str(), + pv_model_path(), + pv_library_path(), + false, + false + ).expect("Unable to create Leopard"); + + let test_pcm = vec![0; 1024]; + let address = inner.cleopard; + inner.cleopard = std::ptr::null_mut(); + + let res = inner.process(&test_pcm); + + inner.cleopard = address; + if let Err(err) = res { + assert!(err.message_stack.len() > 0); + assert!(err.message_stack.len() < 8); + } else { + assert_eq!(res.unwrap().transcript, ""); + } + } +} \ No newline at end of file diff --git a/binding/rust/tests/leopard_tests.rs b/binding/rust/tests/leopard_tests.rs index d946ec3d..015543b9 100644 --- a/binding/rust/tests/leopard_tests.rs +++ b/binding/rust/tests/leopard_tests.rs @@ -14,12 +14,49 @@ mod tests { use distance::*; use itertools::Itertools; use rodio::{source::Source, Decoder}; - use serde_json::Value; + use serde::Deserialize; use std::env; use std::fs::{read_to_string, File}; use std::io::BufReader; - use leopard::{LeopardBuilder, LeopardTranscript}; + use leopard::{LeopardBuilder, LeopardWord}; + + #[derive(Debug, Deserialize)] + struct WordJson { + word: String, + start_sec: Option, + end_sec: Option, + confidence: Option, + speaker_tag: i32, + } + + #[derive(Debug, Deserialize)] + struct LanguageTestJson { + language: String, + audio_file: String, + transcript: String, + transcript_with_punctuation: String, + error_rate: f32, + words: Vec, + } + + #[derive(Debug, Deserialize)] + struct DiarizationTestJson { + language: String, + audio_file: String, + words: Vec, + } + + #[derive(Debug, Deserialize)] + struct TestsJson { + language_tests: Vec, + diarization_tests: Vec, + } + + #[derive(Debug, Deserialize)] + struct RootJson { + tests: TestsJson, + } fn append_lang(path: &str, language: &str) -> String { if language == "en" { @@ -29,7 +66,7 @@ mod tests { } } - fn load_test_data() -> Value { + fn load_test_data() -> TestsJson { let test_json_path = format!( "{}{}", env!("CARGO_MANIFEST_DIR"), @@ -37,9 +74,8 @@ mod tests { ); let contents: String = read_to_string(test_json_path).expect("Unable to read test_data.json"); - let test_json: Value = - serde_json::from_str(&contents).expect("Unable to parse test_data.json"); - test_json + let root: RootJson = serde_json::from_str(&contents).expect("Failed to parse JSON"); + root.tests } fn model_path_by_language(language: &str) -> String { @@ -56,30 +92,30 @@ mod tests { return distance as f32 / expected_transcript.len() as f32; } - fn validate_metadata(leopard_transcript: LeopardTranscript, audio_length: f32) { - let norm_transcript = leopard_transcript.transcript.to_uppercase(); - for i in 0..leopard_transcript.words.len() { - let leopard_word = leopard_transcript.words.get(i).unwrap().clone(); - - assert!(norm_transcript.contains(&leopard_word.word.to_uppercase())); - assert!(leopard_word.start_sec > 0.0); - assert!(leopard_word.start_sec <= leopard_word.end_sec); - if i < (leopard_transcript.words.len() - 1) { - let next_leopard_word = leopard_transcript.words.get(i + 1).unwrap().clone(); - assert!(leopard_word.end_sec <= next_leopard_word.start_sec); + fn validate_metadata(words: Vec, reference_words: Vec, enable_diarization: bool) { + for i in 0..words.len() { + let leopard_word = words.get(i).unwrap().clone(); + let reference_word = reference_words.get(i).unwrap().clone(); + assert!(&leopard_word.word.to_uppercase() == &reference_word.word.to_uppercase()); + assert!((leopard_word.start_sec-reference_word.start_sec.unwrap()).abs() <= 0.1); + assert!((leopard_word.end_sec-reference_word.end_sec.unwrap()).abs() <= 0.1); + assert!((leopard_word.confidence-reference_word.confidence.unwrap()).abs() <= 0.1); + if enable_diarization { + assert!(leopard_word.speaker_tag == reference_word.speaker_tag); + } else { + assert!(leopard_word.speaker_tag == -1); } - assert!(leopard_word.end_sec <= audio_length); - assert!(leopard_word.confidence >= 0.0 && leopard_word.confidence <= 1.0); } } fn run_test_process( language: &str, transcript: &str, - punctuations: Vec<&str>, - test_punctuation: bool, + enable_automatic_punctuation: bool, + enable_diarization: bool, error_rate: f32, test_audio: &str, + words: Vec ) { let access_key = env::var("PV_ACCESS_KEY") .expect("Pass the AccessKey in using the PV_ACCESS_KEY env variable"); @@ -93,38 +129,32 @@ mod tests { test_audio ); - let mut norm_transcript = transcript.to_string(); - if !test_punctuation { - punctuations.iter().for_each(|p| { - norm_transcript = norm_transcript.replace(p, ""); - }); - } - let audio_file = BufReader::new(File::open(&audio_path).expect(&audio_path)); let source = Decoder::new(audio_file).unwrap(); let leopard = LeopardBuilder::new() .access_key(access_key) .model_path(model_path) - .enable_automatic_punctuation(test_punctuation) + .enable_automatic_punctuation(enable_automatic_punctuation) + .enable_diarization(enable_diarization) .init() .expect("Unable to create Leopard"); assert_eq!(leopard.sample_rate(), source.sample_rate()); - let audio_file_duration = source.total_duration().unwrap().as_secs_f32(); let result = leopard.process(&source.collect_vec()).unwrap(); - assert!(character_error_rate(&result.transcript, &norm_transcript) < error_rate); - validate_metadata(result, audio_file_duration); + assert!(character_error_rate(&result.transcript, &transcript) < error_rate); + validate_metadata(result.words, words, enable_diarization); } fn run_test_process_file( language: &str, transcript: &str, - punctuations: Vec<&str>, - test_punctuation: bool, + enable_automatic_punctuation: bool, + enable_diarization: bool, error_rate: f32, test_audio: &str, + words: Vec ) { let access_key = env::var("PV_ACCESS_KEY") .expect("Pass the AccessKey in using the PV_ACCESS_KEY env variable"); @@ -138,147 +168,166 @@ mod tests { test_audio ); - let mut norm_transcript = transcript.to_string(); - if !test_punctuation { - punctuations.iter().for_each(|p| { - norm_transcript = norm_transcript.replace(p, ""); - }); - } + let leopard = LeopardBuilder::new() + .access_key(access_key) + .model_path(model_path) + .enable_automatic_punctuation(enable_automatic_punctuation) + .enable_diarization(enable_diarization) + .init() + .expect("Unable to create Leopard"); - let audio_file = BufReader::new(File::open(&audio_path).expect(&audio_path)); - let source = Decoder::new(audio_file).unwrap(); + let result = leopard.process_file(audio_path).unwrap(); + + assert!(character_error_rate(&result.transcript, &transcript) < error_rate); + validate_metadata(result.words, words, enable_diarization); + } + + fn run_test_diarization( + language: &str, + test_audio: &str, + reference_words: Vec + ) { + let access_key = env::var("PV_ACCESS_KEY") + .expect("Pass the AccessKey in using the PV_ACCESS_KEY env variable"); + + let model_path = model_path_by_language(language); + + let audio_path = format!( + "{}{}{}", + env!("CARGO_MANIFEST_DIR"), + "/../../resources/audio_samples/", + test_audio + ); let leopard = LeopardBuilder::new() .access_key(access_key) .model_path(model_path) - .enable_automatic_punctuation(test_punctuation) + .enable_diarization(true) .init() .expect("Unable to create Leopard"); - assert_eq!(leopard.sample_rate(), source.sample_rate()); - let audio_file_duration = source.total_duration().unwrap().as_secs_f32(); let result = leopard.process_file(audio_path).unwrap(); - assert!(character_error_rate(&result.transcript, &norm_transcript) < error_rate); - validate_metadata(result, audio_file_duration); + for i in 0..result.words.len() { + let leopard_word = result.words.get(i).unwrap().clone(); + let reference_word = reference_words.get(i).unwrap().clone(); + assert!(&leopard_word.word.to_uppercase() == &reference_word.word.to_uppercase()); + assert!(leopard_word.speaker_tag == reference_word.speaker_tag); + } } #[test] fn test_process() -> Result<(), String> { - let test_json: Value = load_test_data(); - - for t in test_json["tests"]["parameters"].as_array().unwrap() { - let language = t["language"].as_str().unwrap(); - let transcript = t["transcript"].as_str().unwrap(); - let punctuations = t["punctuations"] - .as_array() - .unwrap() - .iter() - .map(|v| v.as_str().unwrap()) - .collect_vec(); - let error_rate = t["error_rate"].as_f64().unwrap() as f32; - - let test_audio = t["audio_file"].as_str().unwrap(); + let test_json: TestsJson = load_test_data(); + for t in test_json.language_tests { run_test_process( - language, - transcript, - punctuations, + &t.language, + &t.transcript, false, - error_rate, - &test_audio, + false, + t.error_rate, + &t.audio_file, + t.words ); } Ok(()) } #[test] - fn test_process_punctuation() -> Result<(), String> { - let test_json: Value = load_test_data(); - - for t in test_json["tests"]["parameters"].as_array().unwrap() { - let language = t["language"].as_str().unwrap(); - let transcript = t["transcript"].as_str().unwrap(); - let punctuations = t["punctuations"] - .as_array() - .unwrap() - .iter() - .map(|v| v.as_str().unwrap()) - .collect_vec(); - let error_rate = t["error_rate"].as_f64().unwrap() as f32; - - let test_audio = t["audio_file"].as_str().unwrap(); + fn test_process_file() -> Result<(), String> { + let test_json: TestsJson = load_test_data(); - run_test_process( - language, - transcript, - punctuations, - true, - error_rate, - &test_audio, + for t in test_json.language_tests { + run_test_process_file( + &t.language, + &t.transcript, + false, + false, + t.error_rate, + &t.audio_file, + t.words ); } Ok(()) } - #[test] - fn test_process_file() -> Result<(), String> { - let test_json: Value = load_test_data(); - - for t in test_json["tests"]["parameters"].as_array().unwrap() { - let language = t["language"].as_str().unwrap(); - let transcript = t["transcript"].as_str().unwrap(); - let punctuations = t["punctuations"] - .as_array() - .unwrap() - .iter() - .map(|v| v.as_str().unwrap()) - .collect_vec(); - let error_rate = t["error_rate"].as_f64().unwrap() as f32; - let test_audio = t["audio_file"].as_str().unwrap(); + #[test] + fn test_process_file_punctuation() -> Result<(), String> { + let test_json: TestsJson = load_test_data(); + for t in test_json.language_tests { run_test_process_file( - language, - transcript, - punctuations, + &t.language, + &t.transcript_with_punctuation, + true, false, - error_rate, - &test_audio, + t.error_rate, + &t.audio_file, + t.words ); } Ok(()) } #[test] - fn test_process_file_punctuation() -> Result<(), String> { - let test_json: Value = load_test_data(); - - for t in test_json["tests"]["parameters"].as_array().unwrap() { - let language = t["language"].as_str().unwrap(); - let transcript = t["transcript"].as_str().unwrap(); - let punctuations = t["punctuations"] - .as_array() - .unwrap() - .iter() - .map(|v| v.as_str().unwrap()) - .collect_vec(); - let error_rate = t["error_rate"].as_f64().unwrap() as f32; - - let test_audio = t["audio_file"].as_str().unwrap(); + fn test_process_file_diarization() -> Result<(), String> { + let test_json: TestsJson = load_test_data(); + for t in test_json.language_tests { run_test_process_file( - language, - transcript, - punctuations, + &t.language, + &t.transcript, + false, true, - error_rate, - &test_audio, + t.error_rate, + &t.audio_file, + t.words + ); + } + Ok(()) + } + + #[test] + fn test_diarization() -> Result<(), String> { + let test_json: TestsJson = load_test_data(); + + for t in test_json.diarization_tests { + run_test_diarization( + &t.language, + &t.audio_file, + t.words ); } Ok(()) } + #[test] + fn test_error_stack() { + let mut error_stack = Vec::new(); + + let res = LeopardBuilder::new() + .access_key("invalid") + .init(); + + if let Err(err) = res { + error_stack = err.message_stack + } + + assert!(0 < error_stack.len() && error_stack.len() <= 8); + + let res = LeopardBuilder::new() + .access_key("invalid") + .init(); + if let Err(err) = res { + assert_eq!(error_stack.len(), err.message_stack.len()); + for i in 0..error_stack.len() { + assert_eq!(error_stack[i], err.message_stack[i]) + } + } + } + #[test] fn test_version() { let access_key = env::var("PV_ACCESS_KEY") @@ -291,4 +340,4 @@ mod tests { assert_ne!(leopard.version(), "") } -} +} \ No newline at end of file diff --git a/binding/web/.eslintignore b/binding/web/.eslintignore new file mode 100644 index 00000000..8af52383 --- /dev/null +++ b/binding/web/.eslintignore @@ -0,0 +1,5 @@ +node_modules +dist +lib +rollup.config.js +.eslintrc.js diff --git a/binding/web/.eslintrc.js b/binding/web/.eslintrc.js index 112ad3c9..d56caec5 100644 --- a/binding/web/.eslintrc.js +++ b/binding/web/.eslintrc.js @@ -34,7 +34,8 @@ module.exports = { ignoreParameters: true, ignoreProperties: true } - ] + ], + '@typescript-eslint/no-shadow': 2 } }, { @@ -143,7 +144,7 @@ module.exports = { // disallow use of arguments.caller or arguments.callee 'no-caller': 2, // disallow lexical declarations in case clauses - 'no-case-declarations': 2, + 'no-case-declarations': 0, // disallow division operators explicitly at beginning of regular expression 'no-div-regex': 2, // disallow else after a return in an if @@ -257,7 +258,7 @@ module.exports = { // disallow shadowing of names such as arguments 'no-shadow-restricted-names': 2, // disallow declaration of variables already declared in the outer scope - 'no-shadow': 2, + 'no-shadow': 0, // disallow use of undefined when initializing variables 'no-undef-init': 0, // disallow use of undeclared variables unless mentioned in a /*global */ block diff --git a/binding/web/.npmignore b/binding/web/.npmignore index a8e94ffc..07977eba 100644 --- a/binding/web/.npmignore +++ b/binding/web/.npmignore @@ -3,3 +3,7 @@ node_modules .DS_Store test lib +cypress +cypress.config.ts +scripts +test diff --git a/binding/web/cypress.config.ts b/binding/web/cypress.config.ts index b0d789f3..1a597253 100644 --- a/binding/web/cypress.config.ts +++ b/binding/web/cypress.config.ts @@ -1,15 +1,15 @@ -import { defineConfig } from "cypress"; +import { defineConfig } from 'cypress'; export default defineConfig({ env: { - "NUM_TEST_ITERATIONS": 15, - "INIT_PERFORMANCE_THRESHOLD_SEC": 4.5, - "PROC_PERFORMANCE_THRESHOLD_SEC": 0.3 + NUM_TEST_ITERATIONS: 15, + INIT_PERFORMANCE_THRESHOLD_SEC: 4.5, + PROC_PERFORMANCE_THRESHOLD_SEC: 0.3, }, e2e: { defaultCommandTimeout: 30000, - supportFile: "cypress/support/index.ts", - specPattern: "test/*.test.{js,jsx,ts,tsx}", + supportFile: 'cypress/support/index.ts', + specPattern: 'test/*.test.{js,jsx,ts,tsx}', video: false, screenshotOnRunFailure: false, }, diff --git a/binding/web/package.json b/binding/web/package.json index 7ca32194..a4a59c28 100644 --- a/binding/web/package.json +++ b/binding/web/package.json @@ -3,7 +3,7 @@ "description": "Leopard Speech-to-Text engine for web browsers (via WebAssembly)", "author": "Picovoice Inc", "license": "Apache-2.0", - "version": "1.2.2", + "version": "2.0.0", "keywords": [ "leopard", "web", @@ -64,6 +64,6 @@ "wasm-feature-detect": "^1.5.0" }, "engines": { - "node": ">=14" + "node": ">=16" } } diff --git a/binding/web/src/index.ts b/binding/web/src/index.ts index 6ab10d2b..f8ff2b33 100644 --- a/binding/web/src/index.ts +++ b/binding/web/src/index.ts @@ -1,5 +1,6 @@ import { Leopard } from './leopard'; import { LeopardWorker } from './leopard_worker'; +import * as LeopardErrors from './leopard_errors'; import { LeopardModel, @@ -27,6 +28,7 @@ LeopardWorker.setWasmSimd(leopardWasmSimd); export { Leopard, + LeopardErrors, LeopardModel, LeopardOptions, LeopardWord, diff --git a/binding/web/src/leopard.ts b/binding/web/src/leopard.ts index 2072e8ec..79080509 100644 --- a/binding/web/src/leopard.ts +++ b/binding/web/src/leopard.ts @@ -22,23 +22,50 @@ import { arrayBufferToStringAtIndex, isAccessKeyValid, loadModel, - PvError + PvError, } from '@picovoice/web-utils'; -import { LeopardModel, LeopardOptions, LeopardTranscript, LeopardWord } from './types'; +import { + LeopardModel, + LeopardOptions, + LeopardTranscript, + LeopardWord, + PvStatus, +} from './types'; +import { pvStatusToException } from './leopard_errors'; +import * as LeopardErrors from './leopard_errors'; /** * WebAssembly function types */ -type pv_leopard_init_type = (accessKey: number, modelPath: number, enableAutomaticPunctuation: number, object: number) => Promise; -type pv_leopard_process_type = (object: number, pcm: number, numSamples: number, transcript: number, numWords: number, words: number) => Promise; +type pv_leopard_init_type = ( + accessKey: number, + modelPath: number, + enableAutomaticPunctuation: number, + enableDiarization: number, + object: number +) => Promise; +type pv_leopard_process_type = ( + object: number, + pcm: number, + numSamples: number, + transcript: number, + numWords: number, + words: number +) => Promise; type pv_leopard_delete_type = (object: number) => Promise; type pv_leopard_transcript_delete_type = (transcript: number) => Promise; type pv_leopard_words_delete_type = (words: number) => Promise; -type pv_status_to_string_type = (status: number) => Promise +type pv_status_to_string_type = (status: number) => Promise; type pv_sample_rate_type = () => Promise; type pv_leopard_version_type = () => Promise; +type pv_set_sdk_type = (sdk: number) => Promise; +type pv_get_error_stack_type = ( + messageStack: number, + messageStackDepth: number +) => Promise; +type pv_free_error_stack_type = (messageStack: number) => Promise; /** * JavaScript/WebAssembly Binding for Leopard @@ -48,21 +75,27 @@ type LeopardWasmOutput = { aligned_alloc: aligned_alloc_type; memory: WebAssembly.Memory; pvFree: pv_free_type; + objectAddress: number; + transcriptAddressAddress: number; + numWordsAddress: number; + wordsAddressAddress: number; + messageStackAddressAddressAddress: number; + messageStackDepthAddress: number; + pvLeopardDelete: pv_leopard_delete_type; pvLeopardTranscriptDelete: pv_leopard_transcript_delete_type; pvLeopardWordsDelete: pv_leopard_words_delete_type; pvLeopardProcess: pv_leopard_process_type; pvStatusToString: pv_status_to_string_type; + pvGetErrorStack: pv_get_error_stack_type; + pvFreeErrorStack: pv_free_error_stack_type; + sampleRate: number; version: string; - transcriptAddressAddress: number; - numWordsAddress: number; - wordsAddressAddress: number; pvError: PvError; }; -const PV_STATUS_SUCCESS = 10000; const MAX_PCM_LENGTH_SEC = 60 * 15; export class Leopard { @@ -70,10 +103,11 @@ export class Leopard { private readonly _pvLeopardTranscriptDelete: pv_leopard_transcript_delete_type; private readonly _pvLeopardWordsDelete: pv_leopard_words_delete_type; private readonly _pvLeopardProcess: pv_leopard_process_type; - private readonly _pvStatusToString: pv_status_to_string_type; + private readonly _pvGetErrorStack: pv_get_error_stack_type; + private readonly _pvFreeErrorStack: pv_free_error_stack_type; private _wasmMemory?: WebAssembly.Memory; - private _pvFree: pv_free_type; + private readonly _pvFree: pv_free_type; private readonly _processMutex: Mutex; private readonly _objectAddress: number; @@ -81,25 +115,27 @@ export class Leopard { private readonly _transcriptAddressAddress: number; private readonly _numWordsAddress: number; private readonly _wordsAddressAddress: number; + private readonly _messageStackAddressAddressAddress: number; + private readonly _messageStackDepthAddress: number; private static _sampleRate: number; private static _version: string; private static _wasm: string; private static _wasmSimd: string; + private static _sdk: string = 'web'; private static _leopardMutex = new Mutex(); - private readonly _pvError; - private constructor(handleWasm: LeopardWasmOutput) { Leopard._sampleRate = handleWasm.sampleRate; Leopard._version = handleWasm.version; this._pvLeopardDelete = handleWasm.pvLeopardDelete; this._pvLeopardProcess = handleWasm.pvLeopardProcess; - this._pvStatusToString = handleWasm.pvStatusToString; this._pvLeopardTranscriptDelete = handleWasm.pvLeopardTranscriptDelete; this._pvLeopardWordsDelete = handleWasm.pvLeopardWordsDelete; + this._pvGetErrorStack = handleWasm.pvGetErrorStack; + this._pvFreeErrorStack = handleWasm.pvFreeErrorStack; this._wasmMemory = handleWasm.memory; this._pvFree = handleWasm.pvFree; @@ -108,10 +144,11 @@ export class Leopard { this._transcriptAddressAddress = handleWasm.transcriptAddressAddress; this._numWordsAddress = handleWasm.numWordsAddress; this._wordsAddressAddress = handleWasm.wordsAddressAddress; + this._messageStackAddressAddressAddress = + handleWasm.messageStackAddressAddressAddress; + this._messageStackDepthAddress = handleWasm.messageStackDepthAddress; this._processMutex = new Mutex(); - - this._pvError = handleWasm.pvError; } /** @@ -148,6 +185,10 @@ export class Leopard { } } + public static setSdk(sdk: string): void { + Leopard._sdk = sdk; + } + /** * Creates an instance of the Picovoice Leopard Speech-to-Text engine. * Behind the scenes, it requires the WebAssembly code to load and initialize before @@ -163,30 +204,43 @@ export class Leopard { * @param model.version Version of the model file. Increment to update the model file in storage. * @param options Optional arguments. * @param options.enableAutomaticPunctuation Flag to enable automatic punctuation insertion. + * @param options.enableDiarization Flag to enable speaker diarization, which allows Leopard to differentiate speakers + * as part of the transcription process. Word metadata will include a `speakerTag` to identify unique speakers. * * @returns An instance of the Leopard engine. */ - public static async create(accessKey: string, model: LeopardModel, options: LeopardOptions = {}): Promise { - const customWritePath = (model.customWritePath) ? model.customWritePath : 'leopard_model'; + public static async create( + accessKey: string, + model: LeopardModel, + options: LeopardOptions = {} + ): Promise { + const customWritePath = model.customWritePath + ? model.customWritePath + : 'leopard_model'; const modelPath = await loadModel({ ...model, customWritePath }); - return await this._init(accessKey, modelPath, options); + return await Leopard._init(accessKey, modelPath, options); } public static _init( accessKey: string, modelPath: string, - options: LeopardOptions = {}, + options: LeopardOptions = {} ): Promise { if (!isAccessKeyValid(accessKey)) { - throw new Error('Invalid AccessKey'); + throw new LeopardErrors.LeopardInvalidArgumentError('Invalid AccessKey'); } return new Promise((resolve, reject) => { Leopard._leopardMutex .runExclusive(async () => { const isSimd = await simd(); - const wasmOutput = await Leopard.initWasm(accessKey.trim(), (isSimd) ? this._wasmSimd : this._wasm, modelPath, options); + const wasmOutput = await Leopard.initWasm( + accessKey.trim(), + isSimd ? this._wasmSimd : this._wasm, + modelPath, + options + ); return new Leopard(wasmOutput); }) .then((result: Leopard) => { @@ -207,35 +261,42 @@ export class Leopard { */ public async process(pcm: Int16Array): Promise { if (!(pcm instanceof Int16Array)) { - throw new Error('The argument \'pcm\' must be provided as an Int16Array'); + throw new LeopardErrors.LeopardInvalidArgumentError( + "The argument 'pcm' must be provided as an Int16Array" + ); } const maxSize = MAX_PCM_LENGTH_SEC * Leopard._sampleRate; if (pcm.length > maxSize) { - throw new Error(`'pcm' size must be smaller than ${maxSize}`); + throw new LeopardErrors.LeopardInvalidArgumentError( + `'pcm' size must be smaller than ${maxSize}` + ); } - const returnPromise = new Promise((resolve, reject) => { + return new Promise((resolve, reject) => { this._processMutex .runExclusive(async () => { if (this._wasmMemory === undefined) { - throw new Error('Attempted to call Leopard process after release.'); + throw new LeopardErrors.LeopardInvalidStateError( + 'Attempted to call Leopard process after release.' + ); } const inputBufferAddress = await this._alignedAlloc( Int16Array.BYTES_PER_ELEMENT, - pcm.length * Int16Array.BYTES_PER_ELEMENT, + pcm.length * Int16Array.BYTES_PER_ELEMENT ); if (inputBufferAddress === 0) { - throw new Error('malloc failed: Cannot allocate memory'); + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); } - const memoryBuffer = new Int16Array(this._wasmMemory.buffer); memoryBuffer.set( pcm, - inputBufferAddress / Int16Array.BYTES_PER_ELEMENT, + inputBufferAddress / Int16Array.BYTES_PER_ELEMENT ); const status = await this._pvLeopardProcess( this._objectAddress, @@ -243,41 +304,53 @@ export class Leopard { pcm.length, this._transcriptAddressAddress, this._numWordsAddress, - this._wordsAddressAddress, + this._wordsAddressAddress ); + await this._pvFree(inputBufferAddress); const memoryBufferUint8 = new Uint8Array(this._wasmMemory.buffer); const memoryBufferView = new DataView(this._wasmMemory.buffer); - if (status !== PV_STATUS_SUCCESS) { - const msg = `process failed with status ${arrayBufferToStringAtIndex( - memoryBufferUint8, - await this._pvStatusToString(status), - )}`; - - throw new Error( - `${msg}\nDetails: ${this._pvError.getErrorString()}` + if (status !== PvStatus.SUCCESS) { + const messageStack = await Leopard.getMessageStack( + this._pvGetErrorStack, + this._pvFreeErrorStack, + this._messageStackAddressAddressAddress, + this._messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 ); + + throw pvStatusToException(status, 'Process failed', messageStack); } const transcriptAddress = memoryBufferView.getInt32( this._transcriptAddressAddress, - true, + true ); const transcript = arrayBufferToStringAtIndex( memoryBufferUint8, - transcriptAddress, + transcriptAddress ); - const numWords = memoryBufferView.getInt32(this._numWordsAddress, true); - const wordsAddress = memoryBufferView.getInt32(this._wordsAddressAddress, true); + const numWords = memoryBufferView.getInt32( + this._numWordsAddress, + true + ); + const wordsAddress = memoryBufferView.getInt32( + this._wordsAddressAddress, + true + ); let ptr = wordsAddress; const words: LeopardWord[] = []; for (let i = 0; i < numWords; i++) { const wordAddress = memoryBufferView.getInt32(ptr, true); - const word = arrayBufferToStringAtIndex(memoryBufferUint8, wordAddress); + const word = arrayBufferToStringAtIndex( + memoryBufferUint8, + wordAddress + ); ptr += Uint32Array.BYTES_PER_ELEMENT; const startSec = memoryBufferView.getFloat32(ptr, true); ptr += Uint32Array.BYTES_PER_ELEMENT; @@ -285,24 +358,23 @@ export class Leopard { ptr += Uint32Array.BYTES_PER_ELEMENT; const confidence = memoryBufferView.getFloat32(ptr, true); ptr += Uint32Array.BYTES_PER_ELEMENT; - words.push({ word, startSec, endSec, confidence }); + const speakerTag = memoryBufferView.getInt32(ptr, true); + ptr += Uint32Array.BYTES_PER_ELEMENT; + words.push({ word, startSec, endSec, confidence, speakerTag }); } await this._pvLeopardTranscriptDelete(transcriptAddress); await this._pvLeopardWordsDelete(wordsAddress); - await this._pvFree(inputBufferAddress); return { transcript, words }; }) .then((result: LeopardTranscript) => { resolve(result); }) - .catch(async (error: any) => { + .catch((error: any) => { reject(error); }); }); - - return returnPromise; } /** @@ -310,12 +382,23 @@ export class Leopard { */ public async release(): Promise { await this._pvLeopardDelete(this._objectAddress); + await this._pvFree(this._transcriptAddressAddress); + await this._pvFree(this._numWordsAddress); + await this._pvFree(this._wordsAddressAddress); + await this._pvFree(this._messageStackAddressAddressAddress); + await this._pvFree(this._messageStackDepthAddress); delete this._wasmMemory; this._wasmMemory = undefined; } - private static async initWasm(accessKey: string, wasmBase64: string, modelPath: string, options: LeopardOptions): Promise { - const { enableAutomaticPunctuation = false } = options; + private static async initWasm( + accessKey: string, + wasmBase64: string, + modelPath: string, + options: LeopardOptions + ): Promise { + const { enableAutomaticPunctuation = false, enableDiarization = false } = + options; // A WebAssembly page has a constant size of 64KiB. -> 1MiB ~= 16 pages const memory = new WebAssembly.Memory({ initial: 11500 }); @@ -327,55 +410,73 @@ export class Leopard { const exports = await buildWasm(memory, wasmBase64, pvError); const aligned_alloc = exports.aligned_alloc as aligned_alloc_type; const pv_free = exports.pv_free as pv_free_type; - const pv_leopard_version = exports.pv_leopard_version as pv_leopard_version_type; - const pv_leopard_process = exports.pv_leopard_process as pv_leopard_process_type; - const pv_leopard_delete = exports.pv_leopard_delete as pv_leopard_delete_type; - const pv_leopard_transcript_delete = exports.pv_leopard_transcript_delete as pv_leopard_transcript_delete_type; - const pv_leopard_words_delete = exports.pv_leopard_words_delete as pv_leopard_words_delete_type; + const pv_leopard_version = + exports.pv_leopard_version as pv_leopard_version_type; + const pv_leopard_process = + exports.pv_leopard_process as pv_leopard_process_type; + const pv_leopard_delete = + exports.pv_leopard_delete as pv_leopard_delete_type; + const pv_leopard_transcript_delete = + exports.pv_leopard_transcript_delete as pv_leopard_transcript_delete_type; + const pv_leopard_words_delete = + exports.pv_leopard_words_delete as pv_leopard_words_delete_type; const pv_leopard_init = exports.pv_leopard_init as pv_leopard_init_type; - const pv_status_to_string = exports.pv_status_to_string as pv_status_to_string_type; const pv_sample_rate = exports.pv_sample_rate as pv_sample_rate_type; + const pv_set_sdk = exports.pv_set_sdk as pv_set_sdk_type; + const pv_get_error_stack = + exports.pv_get_error_stack as pv_get_error_stack_type; + const pv_free_error_stack = + exports.pv_free_error_stack as pv_free_error_stack_type; const transcriptAddressAddress = await aligned_alloc( Int32Array.BYTES_PER_ELEMENT, - Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT ); if (transcriptAddressAddress === 0) { - throw new Error('malloc failed: Cannot allocate memory'); + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); } const numWordsAddress = await aligned_alloc( Int32Array.BYTES_PER_ELEMENT, - Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT ); if (numWordsAddress === 0) { - throw new Error('malloc failed: Cannot allocate memory'); + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); } const wordsAddressAddress = await aligned_alloc( Int32Array.BYTES_PER_ELEMENT, - Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT ); if (wordsAddressAddress === 0) { - throw new Error('malloc failed: Cannot allocate memory'); + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); } - const objectAddressAddress = await aligned_alloc( Int32Array.BYTES_PER_ELEMENT, - Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT ); if (objectAddressAddress === 0) { - throw new Error('malloc failed: Cannot allocate memory'); + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); } const accessKeyAddress = await aligned_alloc( Uint8Array.BYTES_PER_ELEMENT, - (accessKey.length + 1) * Uint8Array.BYTES_PER_ELEMENT, + (accessKey.length + 1) * Uint8Array.BYTES_PER_ELEMENT ); if (accessKeyAddress === 0) { - throw new Error('malloc failed: Cannot allocate memory'); + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); } for (let i = 0; i < accessKey.length; i++) { @@ -386,53 +487,155 @@ export class Leopard { const modelPathEncoded = new TextEncoder().encode(modelPath); const modelPathAddress = await aligned_alloc( Uint8Array.BYTES_PER_ELEMENT, - (modelPathEncoded.length + 1) * Uint8Array.BYTES_PER_ELEMENT, + (modelPathEncoded.length + 1) * Uint8Array.BYTES_PER_ELEMENT ); if (modelPathAddress === 0) { - throw new Error('malloc failed: Cannot allocate memory'); + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); } memoryBufferUint8.set(modelPathEncoded, modelPathAddress); memoryBufferUint8[modelPathAddress + modelPathEncoded.length] = 0; - const status = await pv_leopard_init(accessKeyAddress, modelPathAddress, (enableAutomaticPunctuation) ? 1 : 0, objectAddressAddress); - if (status !== PV_STATUS_SUCCESS) { - const msg = `'pv_leopard_init' failed with status ${arrayBufferToStringAtIndex( - memoryBufferUint8, - await pv_status_to_string(status), - )}`; + const sdkEncoded = new TextEncoder().encode(this._sdk); + const sdkAddress = await aligned_alloc( + Uint8Array.BYTES_PER_ELEMENT, + (sdkEncoded.length + 1) * Uint8Array.BYTES_PER_ELEMENT + ); + if (!sdkAddress) { + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + memoryBufferUint8.set(sdkEncoded, sdkAddress); + memoryBufferUint8[sdkAddress + sdkEncoded.length] = 0; + await pv_set_sdk(sdkAddress); + await pv_free(sdkAddress); - throw new Error( - `${msg}\nDetails: ${pvError.getErrorString()}` + const messageStackDepthAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (!messageStackDepthAddress) { + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' ); } + + const messageStackAddressAddressAddress = await aligned_alloc( + Int32Array.BYTES_PER_ELEMENT, + Int32Array.BYTES_PER_ELEMENT + ); + if (!messageStackAddressAddressAddress) { + throw new LeopardErrors.LeopardOutOfMemoryError( + 'malloc failed: Cannot allocate memory' + ); + } + const memoryBufferView = new DataView(memory.buffer); + + const status = await pv_leopard_init( + accessKeyAddress, + modelPathAddress, + enableAutomaticPunctuation ? 1 : 0, + enableDiarization ? 1 : 0, + objectAddressAddress + ); + await pv_free(accessKeyAddress); + await pv_free(modelPathAddress); + if (status !== PvStatus.SUCCESS) { + const messageStack = await Leopard.getMessageStack( + pv_get_error_stack, + pv_free_error_stack, + messageStackAddressAddressAddress, + messageStackDepthAddress, + memoryBufferView, + memoryBufferUint8 + ); + + throw pvStatusToException( + status, + 'Initialization failed', + messageStack, + pvError + ); + } const objectAddress = memoryBufferView.getInt32(objectAddressAddress, true); const sampleRate = await pv_sample_rate(); const versionAddress = await pv_leopard_version(); const version = arrayBufferToStringAtIndex( memoryBufferUint8, - versionAddress, + versionAddress ); return { aligned_alloc, memory: memory, pvFree: pv_free, + objectAddress: objectAddress, + transcriptAddressAddress: transcriptAddressAddress, + numWordsAddress: numWordsAddress, + wordsAddressAddress: wordsAddressAddress, + messageStackAddressAddressAddress: messageStackAddressAddressAddress, + messageStackDepthAddress: messageStackDepthAddress, + pvLeopardDelete: pv_leopard_delete, pvLeopardTranscriptDelete: pv_leopard_transcript_delete, pvLeopardWordsDelete: pv_leopard_words_delete, pvLeopardProcess: pv_leopard_process, - pvStatusToString: pv_status_to_string, + pvGetErrorStack: pv_get_error_stack, + pvFreeErrorStack: pv_free_error_stack, + sampleRate: sampleRate, version: version, - transcriptAddressAddress: transcriptAddressAddress, - numWordsAddress: numWordsAddress, - wordsAddressAddress: wordsAddressAddress, pvError: pvError, }; } + + private static async getMessageStack( + pv_get_error_stack: pv_get_error_stack_type, + pv_free_error_stack: pv_free_error_stack_type, + messageStackAddressAddressAddress: number, + messageStackDepthAddress: number, + memoryBufferView: DataView, + memoryBufferUint8: Uint8Array + ): Promise { + const status = await pv_get_error_stack( + messageStackAddressAddressAddress, + messageStackDepthAddress + ); + if (status !== PvStatus.SUCCESS) { + throw pvStatusToException(status, 'Unable to get Leopard error state'); + } + + const messageStackAddressAddress = memoryBufferView.getInt32( + messageStackAddressAddressAddress, + true + ); + + const messageStackDepth = memoryBufferView.getInt32( + messageStackDepthAddress, + true + ); + const messageStack: string[] = []; + for (let i = 0; i < messageStackDepth; i++) { + const messageStackAddress = memoryBufferView.getInt32( + messageStackAddressAddress + i * Int32Array.BYTES_PER_ELEMENT, + true + ); + const message = arrayBufferToStringAtIndex( + memoryBufferUint8, + messageStackAddress + ); + messageStack.push(message); + } + + await pv_free_error_stack(messageStackAddressAddress); + + return messageStack; + } } diff --git a/binding/web/src/leopard_errors.ts b/binding/web/src/leopard_errors.ts new file mode 100644 index 00000000..f9520978 --- /dev/null +++ b/binding/web/src/leopard_errors.ts @@ -0,0 +1,256 @@ +// +// Copyright 2023 Picovoice Inc. +// +// You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" +// file accompanying this source. +// +// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on +// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the +// specific language governing permissions and limitations under the License. +// + +import { PvError } from '@picovoice/web-utils'; +import { PvStatus } from './types'; + +class LeopardError extends Error { + private readonly _status: PvStatus; + private readonly _shortMessage: string; + private readonly _messageStack: string[]; + + constructor( + status: PvStatus, + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(LeopardError.errorToString(message, messageStack, pvError)); + this._status = status; + this.name = 'LeopardError'; + this._shortMessage = message; + this._messageStack = messageStack; + } + + get status(): PvStatus { + return this._status; + } + + get shortMessage(): string { + return this._shortMessage; + } + + get messageStack(): string[] { + return this._messageStack; + } + + private static errorToString( + initial: string, + messageStack: string[], + pvError: PvError | null = null + ): string { + let msg = initial; + + if (pvError) { + const pvErrorMessage = pvError.getErrorString(); + if (pvErrorMessage.length > 0) { + msg += `\nDetails: ${pvErrorMessage}`; + } + } + + if (messageStack.length > 0) { + msg += `: ${messageStack.reduce( + (acc, value, index) => acc + '\n [' + index + '] ' + value, + '' + )}`; + } + + return msg; + } +} + +class LeopardOutOfMemoryError extends LeopardError { + constructor( + message: string, + messageStack?: string[], + pvError: PvError | null = null + ) { + super(PvStatus.OUT_OF_MEMORY, message, messageStack, pvError); + this.name = 'LeopardOutOfMemoryError'; + } +} + +class LeopardIOError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.IO_ERROR, message, messageStack, pvError); + this.name = 'LeopardIOError'; + } +} + +class LeopardInvalidArgumentError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.INVALID_ARGUMENT, message, messageStack, pvError); + this.name = 'LeopardInvalidArgumentError'; + } +} + +class LeopardStopIterationError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.STOP_ITERATION, message, messageStack, pvError); + this.name = 'LeopardStopIterationError'; + } +} + +class LeopardKeyError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.KEY_ERROR, message, messageStack, pvError); + this.name = 'LeopardKeyError'; + } +} + +class LeopardInvalidStateError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.INVALID_STATE, message, messageStack, pvError); + this.name = 'LeopardInvalidStateError'; + } +} + +class LeopardRuntimeError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.RUNTIME_ERROR, message, messageStack, pvError); + this.name = 'LeopardRuntimeError'; + } +} + +class LeopardActivationError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.ACTIVATION_ERROR, message, messageStack, pvError); + this.name = 'LeopardActivationError'; + } +} + +class LeopardActivationLimitReachedError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.ACTIVATION_LIMIT_REACHED, message, messageStack, pvError); + this.name = 'LeopardActivationLimitReachedError'; + } +} + +class LeopardActivationThrottledError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.ACTIVATION_THROTTLED, message, messageStack, pvError); + this.name = 'LeopardActivationThrottledError'; + } +} + +class LeopardActivationRefusedError extends LeopardError { + constructor( + message: string, + messageStack: string[] = [], + pvError: PvError | null = null + ) { + super(PvStatus.ACTIVATION_REFUSED, message, messageStack, pvError); + this.name = 'LeopardActivationRefusedError'; + } +} + +export { + LeopardError, + LeopardOutOfMemoryError, + LeopardIOError, + LeopardInvalidArgumentError, + LeopardStopIterationError, + LeopardKeyError, + LeopardInvalidStateError, + LeopardRuntimeError, + LeopardActivationError, + LeopardActivationLimitReachedError, + LeopardActivationThrottledError, + LeopardActivationRefusedError, +}; + +export function pvStatusToException( + pvStatus: PvStatus, + errorMessage: string, + messageStack: string[] = [], + pvError: PvError | null = null +): LeopardError { + switch (pvStatus) { + case PvStatus.OUT_OF_MEMORY: + return new LeopardOutOfMemoryError(errorMessage, messageStack, pvError); + case PvStatus.IO_ERROR: + return new LeopardIOError(errorMessage, messageStack, pvError); + case PvStatus.INVALID_ARGUMENT: + return new LeopardInvalidArgumentError( + errorMessage, + messageStack, + pvError + ); + case PvStatus.STOP_ITERATION: + return new LeopardStopIterationError(errorMessage, messageStack, pvError); + case PvStatus.KEY_ERROR: + return new LeopardKeyError(errorMessage, messageStack, pvError); + case PvStatus.INVALID_STATE: + return new LeopardInvalidStateError(errorMessage, messageStack, pvError); + case PvStatus.RUNTIME_ERROR: + return new LeopardRuntimeError(errorMessage, messageStack, pvError); + case PvStatus.ACTIVATION_ERROR: + return new LeopardActivationError(errorMessage, messageStack, pvError); + case PvStatus.ACTIVATION_LIMIT_REACHED: + return new LeopardActivationLimitReachedError( + errorMessage, + messageStack, + pvError + ); + case PvStatus.ACTIVATION_THROTTLED: + return new LeopardActivationThrottledError( + errorMessage, + messageStack, + pvError + ); + case PvStatus.ACTIVATION_REFUSED: + return new LeopardActivationRefusedError( + errorMessage, + messageStack, + pvError + ); + default: + // eslint-disable-next-line no-console + console.warn(`Unmapped error code: ${pvStatus}`); + return new LeopardError(pvStatus, errorMessage); + } +} diff --git a/binding/web/src/leopard_worker.ts b/binding/web/src/leopard_worker.ts index 91a8ce51..280d1b14 100644 --- a/binding/web/src/leopard_worker.ts +++ b/binding/web/src/leopard_worker.ts @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -18,8 +18,10 @@ import { LeopardWorkerInitResponse, LeopardWorkerProcessResponse, LeopardWorkerReleaseResponse, + PvStatus, } from './types'; import { loadModel } from '@picovoice/web-utils'; +import { pvStatusToException } from './leopard_errors'; export class LeopardWorker { private readonly _worker: Worker; @@ -28,6 +30,7 @@ export class LeopardWorker { private static _wasm: string; private static _wasmSimd: string; + private static _sdk: string = 'web'; private constructor(worker: Worker, version: string, sampleRate: number) { this._worker = worker; @@ -76,6 +79,10 @@ export class LeopardWorker { } } + public static setSdk(sdk: string): void { + LeopardWorker._sdk = sdk; + } + /** * Creates a worker instance of the Picovoice Leopard Speech-to-Text engine. * Behind the scenes, it requires the WebAssembly code to load and initialize before @@ -91,32 +98,61 @@ export class LeopardWorker { * @param model.version Version of the model file. Increment to update the model file in storage. * @param options Optional arguments. * @param options.enableAutomaticPunctuation Flag to enable automatic punctuation insertion. + * @param options.enableDiarization Flag to enable speaker diarization, which allows Leopard to differentiate speakers + * as part of the transcription process. Word metadata will include a `speakerTag` to identify unique speakers. * * @returns An instance of LeopardWorker. */ - public static async create(accessKey: string, model: LeopardModel, options: LeopardOptions = {}): Promise { - const customWritePath = (model.customWritePath) ? model.customWritePath : 'leopard_model'; + public static async create( + accessKey: string, + model: LeopardModel, + options: LeopardOptions = {} + ): Promise { + const customWritePath = model.customWritePath + ? model.customWritePath + : 'leopard_model'; const modelPath = await loadModel({ ...model, customWritePath }); const worker = new PvWorker(); - const returnPromise: Promise = new Promise((resolve, reject) => { - // @ts-ignore - block from GC - this.worker = worker; - worker.onmessage = (event: MessageEvent): void => { - switch (event.data.command) { - case 'ok': - resolve(new LeopardWorker(worker, event.data.version, event.data.sampleRate)); - break; - case 'failed': - case 'error': - reject(event.data.message); - break; - default: - // @ts-ignore - reject(`Unrecognized command: ${event.data.command}`); - } - }; - }); + const returnPromise: Promise = new Promise( + (resolve, reject) => { + // @ts-ignore - block from GC + this.worker = worker; + worker.onmessage = ( + event: MessageEvent + ): void => { + switch (event.data.command) { + case 'ok': + resolve( + new LeopardWorker( + worker, + event.data.version, + event.data.sampleRate + ) + ); + break; + case 'failed': + case 'error': + reject( + pvStatusToException( + event.data.status, + event.data.shortMessage, + event.data.messageStack + ) + ); + break; + default: + reject( + pvStatusToException( + PvStatus.RUNTIME_ERROR, + // @ts-ignore + `Unrecognized command: ${event.data.command}` + ) + ); + } + }; + } + ); worker.postMessage({ command: 'init', @@ -125,6 +161,7 @@ export class LeopardWorker { options: options, wasm: this._wasm, wasmSimd: this._wasmSimd, + sdk: this._sdk, }); return returnPromise; @@ -140,41 +177,63 @@ export class LeopardWorker { * input buffer array will be transferred to the worker. * @param options.transferCallback Optional callback containing a new Int16Array with contents from 'pcm'. Use this callback * to get the input pcm when using transfer. - * @return The transcript. + * + * @return A transcript object. */ public process( pcm: Int16Array, - options: { transfer?: boolean, transferCallback?: (data: Int16Array) => void } = {}, + options: { + transfer?: boolean; + transferCallback?: (data: Int16Array) => void; + } = {} ): Promise { const { transfer = false, transferCallback } = options; - const returnPromise: Promise = new Promise((resolve, reject) => { - this._worker.onmessage = (event: MessageEvent): void => { - if (transfer && transferCallback && event.data.inputFrame) { - transferCallback(new Int16Array(event.data.inputFrame.buffer)); - } - switch (event.data.command) { - case 'ok': - resolve(event.data.result); - break; - case 'failed': - case 'error': - reject(event.data.message); - break; - default: - // @ts-ignore - reject(`Unrecognized command: ${event.data.command}`); - } - }; - }); + const returnPromise: Promise = new Promise( + (resolve, reject) => { + this._worker.onmessage = ( + event: MessageEvent + ): void => { + switch (event.data.command) { + case 'ok': + if (transfer && transferCallback && event.data.inputFrame) { + transferCallback(new Int16Array(event.data.inputFrame.buffer)); + } + resolve(event.data.result); + break; + case 'failed': + case 'error': + reject( + pvStatusToException( + event.data.status, + event.data.shortMessage, + event.data.messageStack + ) + ); + break; + default: + reject( + pvStatusToException( + PvStatus.RUNTIME_ERROR, + // @ts-ignore + `Unrecognized command: ${event.data.command}` + ) + ); + } + }; + } + ); - const transferable = (transfer) ? [pcm.buffer] : []; + const transferable = transfer ? [pcm.buffer] : []; - this._worker.postMessage({ - command: 'process', - inputFrame: pcm, - transfer: transfer, - }, transferable); + this._worker.postMessage( + { + command: 'process', + inputFrame: pcm, + transfer: transfer, + }, + transferable + ); return returnPromise; } @@ -184,18 +243,31 @@ export class LeopardWorker { */ public release(): Promise { const returnPromise: Promise = new Promise((resolve, reject) => { - this._worker.onmessage = (event: MessageEvent): void => { + this._worker.onmessage = ( + event: MessageEvent + ): void => { switch (event.data.command) { case 'ok': resolve(); break; case 'failed': case 'error': - reject(event.data.message); + reject( + pvStatusToException( + event.data.status, + event.data.shortMessage, + event.data.messageStack + ) + ); break; default: - // @ts-ignore - reject(`Unrecognized command: ${event.data.command}`); + reject( + pvStatusToException( + PvStatus.RUNTIME_ERROR, + // @ts-ignore + `Unrecognized command: ${event.data.command}` + ) + ); } }; }); diff --git a/binding/web/src/leopard_worker_handler.ts b/binding/web/src/leopard_worker_handler.ts index 6d20e5aa..d67ea398 100644 --- a/binding/web/src/leopard_worker_handler.ts +++ b/binding/web/src/leopard_worker_handler.ts @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -13,80 +13,125 @@ /// import { Leopard } from './leopard'; -import { LeopardWorkerRequest } from './types'; +import { + LeopardWorkerInitRequest, + LeopardWorkerProcessRequest, + LeopardWorkerRequest, + PvStatus, +} from './types'; +import { LeopardError } from './leopard_errors'; + +let leopard: Leopard | null = null; + +const initRequest = async (request: LeopardWorkerInitRequest): Promise => { + if (leopard !== null) { + return { + command: 'error', + status: PvStatus.INVALID_STATE, + shortMessage: 'Leopard already initialized', + }; + } + try { + Leopard.setWasm(request.wasm); + Leopard.setWasmSimd(request.wasmSimd); + Leopard.setSdk(request.sdk); + leopard = await Leopard._init( + request.accessKey, + request.modelPath, + request.options + ); + return { + command: 'ok', + version: leopard.version, + sampleRate: leopard.sampleRate, + }; + } catch (e: any) { + if (e instanceof LeopardError) { + return { + command: 'error', + status: e.status, + shortMessage: e.shortMessage, + messageStack: e.messageStack, + }; + } + return { + command: 'error', + status: PvStatus.RUNTIME_ERROR, + shortMessage: e.message, + }; + } +}; + +const processRequest = async ( + request: LeopardWorkerProcessRequest +): Promise => { + if (leopard === null) { + return { + command: 'error', + status: PvStatus.INVALID_STATE, + shortMessage: 'Leopard not initialized', + inputFrame: request.inputFrame, + }; + } + try { + return { + command: 'ok', + result: await leopard.process(request.inputFrame), + inputFrame: request.transfer ? request.inputFrame : undefined, + }; + } catch (e: any) { + if (e instanceof LeopardError) { + return { + command: 'error', + status: e.status, + shortMessage: e.shortMessage, + messageStack: e.messageStack, + }; + } + return { + command: 'error', + status: PvStatus.RUNTIME_ERROR, + shortMessage: e.message, + }; + } +}; + +const releaseRequest = async (): Promise => { + if (leopard !== null) { + await leopard.release(); + leopard = null; + close(); + } + return { + command: 'ok', + }; +}; /** * Leopard worker handler. */ -let leopard: Leopard | null = null; -self.onmessage = async function( - event: MessageEvent, +self.onmessage = async function ( + event: MessageEvent ): Promise { switch (event.data.command) { case 'init': - if (leopard !== null) { - self.postMessage({ - command: 'error', - message: 'Leopard already initialized', - }); - return; - } - try { - Leopard.setWasm(event.data.wasm); - Leopard.setWasmSimd(event.data.wasmSimd); - leopard = await Leopard._init(event.data.accessKey, event.data.modelPath, event.data.options); - self.postMessage({ - command: 'ok', - version: leopard.version, - sampleRate: leopard.sampleRate, - }); - } catch (e: any) { - self.postMessage({ - command: 'error', - message: e.message, - }); - } + self.postMessage(await initRequest(event.data)); break; case 'process': - // eslint-disable-next-line no-case-declarations - const transferable = (event.data.transfer) ? [event.data.inputFrame.buffer] : []; - if (leopard === null) { - self.postMessage({ - command: 'error', - message: 'Leopard not initialized', - inputFrame: event.data.inputFrame, - }, transferable); - return; - } - try { - self.postMessage({ - command: 'ok', - result: await leopard.process(event.data.inputFrame), - inputFrame: (event.data.transfer) ? event.data.inputFrame : undefined, - }, transferable); - } catch (e: any) { - self.postMessage({ - command: 'error', - message: e.message, - inputFrame: event.data.inputFrame, - }, transferable); - } + self.postMessage( + await processRequest(event.data), + event.data.transfer ? [event.data.inputFrame.buffer] : [] + ); break; case 'release': - if (leopard !== null) { - await leopard.release(); - leopard = null; - close(); - } - self.postMessage({ - command: 'ok', - }); + self.postMessage(await releaseRequest()); break; default: self.postMessage({ command: 'failed', + status: PvStatus.RUNTIME_ERROR, // @ts-ignore - message: `Unrecognized command: ${event.data.command}`, + shortMessage: `Unrecognized command: ${event.data.command}`, }); } }; diff --git a/binding/web/src/types.ts b/binding/web/src/types.ts index 718740f3..c312785f 100644 --- a/binding/web/src/types.ts +++ b/binding/web/src/types.ts @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -11,6 +11,21 @@ import { PvModel } from '@picovoice/web-utils'; +export enum PvStatus { + SUCCESS = 10000, + OUT_OF_MEMORY, + IO_ERROR, + INVALID_ARGUMENT, + STOP_ITERATION, + KEY_ERROR, + INVALID_STATE, + RUNTIME_ERROR, + ACTIVATION_ERROR, + ACTIVATION_LIMIT_REACHED, + ACTIVATION_THROTTLED, + ACTIVATION_REFUSED, +} + /** * LeopardModel types */ @@ -19,19 +34,29 @@ export type LeopardModel = PvModel; export type LeopardOptions = { /** @defaultValue false */ enableAutomaticPunctuation?: boolean; + /** @defaultValue false */ + enableDiarization?: boolean; }; export type LeopardWord = { + /** Transcribed word. */ word: string; + /** Start of word in seconds. */ startSec: number; + /** End of word in seconds. */ endSec: number; + /** Transcription confidence. It is a number within [0, 1]. */ confidence: number; -} + /** The speaker tag is `-1` if diarization is not enabled during initialization; + * otherwise, it's a non-negative integer identifying unique speakers, with `0` reserved for + * unknown speakers. */ + speakerTag: number; +}; export type LeopardTranscript = { transcript: string; words: LeopardWord[]; -} +}; export type LeopardWorkerInitRequest = { command: 'init'; @@ -40,6 +65,7 @@ export type LeopardWorkerInitRequest = { options: LeopardOptions; wasm: string; wasmSimd: string; + sdk: string; }; export type LeopardWorkerProcessRequest = { @@ -53,33 +79,40 @@ export type LeopardWorkerReleaseRequest = { }; export type LeopardWorkerRequest = - LeopardWorkerInitRequest | - LeopardWorkerProcessRequest | - LeopardWorkerReleaseRequest; + | LeopardWorkerInitRequest + | LeopardWorkerProcessRequest + | LeopardWorkerReleaseRequest; export type LeopardWorkerFailureResponse = { command: 'failed' | 'error'; - message: string; - inputFrame?: Int16Array; -}; - -export type LeopardWorkerInitResponse = LeopardWorkerFailureResponse | { - command: 'ok'; - sampleRate: number; - version: string; + status: PvStatus; + shortMessage: string; + messageStack: string[]; }; -export type LeopardWorkerProcessResponse = LeopardWorkerFailureResponse | { - command: 'ok'; - result: LeopardTranscript; - inputFrame?: Int16Array; -}; - -export type LeopardWorkerReleaseResponse = LeopardWorkerFailureResponse | { - command: 'ok'; -}; +export type LeopardWorkerInitResponse = + | LeopardWorkerFailureResponse + | { + command: 'ok'; + sampleRate: number; + version: string; + }; + +export type LeopardWorkerProcessResponse = + | LeopardWorkerFailureResponse + | { + command: 'ok'; + result: LeopardTranscript; + inputFrame?: Int16Array; + }; + +export type LeopardWorkerReleaseResponse = + | LeopardWorkerFailureResponse + | { + command: 'ok'; + }; export type LeopardWorkerResponse = - LeopardWorkerInitResponse | - LeopardWorkerProcessResponse | - LeopardWorkerReleaseResponse; + | LeopardWorkerInitResponse + | LeopardWorkerProcessResponse + | LeopardWorkerReleaseResponse; diff --git a/binding/web/test/leopard.test.ts b/binding/web/test/leopard.test.ts index 4cc39216..969df335 100644 --- a/binding/web/test/leopard.test.ts +++ b/binding/web/test/leopard.test.ts @@ -1,15 +1,19 @@ -import { Leopard, LeopardWorker } from "../"; -import testData from "./test_data.json"; +import { Leopard, LeopardWorker } from '../'; +import testData from './test_data.json'; // @ts-ignore -import leopardParams from "./leopard_params"; +import leopardParams from './leopard_params'; import { PvModel } from '@picovoice/web-utils'; import { LeopardWord } from '../src'; +import { LeopardError } from '../src/leopard_errors'; -const ACCESS_KEY: string = Cypress.env("ACCESS_KEY"); +const ACCESS_KEY: string = Cypress.env('ACCESS_KEY'); const levenshteinDistance = (words1: string[], words2: string[]) => { - const res = Array.from(Array(words1.length + 1), () => new Array(words2.length + 1)); + const res = Array.from( + Array(words1.length + 1), + () => new Array(words2.length + 1) + ); for (let i = 0; i <= words1.length; i++) { res[i][0] = i; } @@ -21,40 +25,52 @@ const levenshteinDistance = (words1: string[], words2: string[]) => { res[i][j] = Math.min( res[i - 1][j] + 1, res[i][j - 1] + 1, - res[i - 1][j - 1] + (words1[i - 1].toUpperCase() === words2[j - 1].toUpperCase() ? 0 : 1), + res[i - 1][j - 1] + + (words1[i - 1].toUpperCase() === words2[j - 1].toUpperCase() ? 0 : 1) ); } } return res[words1.length][words2.length]; }; -const wordErrorRate = (reference: string, hypothesis: string, useCER = false): number => { - const splitter = (useCER) ? '' : ' '; - const ed = levenshteinDistance(reference.split(splitter), hypothesis.split(splitter)); +const wordErrorRate = ( + reference: string, + hypothesis: string, + useCER = false +): number => { + const splitter = useCER ? '' : ' '; + const ed = levenshteinDistance( + reference.split(splitter), + hypothesis.split(splitter) + ); return ed / reference.length; }; -const validateMetadata = (words: LeopardWord[], transcript: string, audioLength: number) => { - const normTranscript = transcript.toUpperCase(); - for (let i = 0; i < words.length; i++) { - expect(normTranscript).to.include(words[i].word.toUpperCase()); - expect(words[i].startSec).to.be.gt(0); - expect(words[i].startSec).to.be.lte(words[i].endSec); - if (i < words.length - 1) { - expect(words[i].endSec).to.be.lte(words[i + 1].startSec); +const validateMetadata = ( + words: LeopardWord[], + expectedWords: LeopardWord[], + enableDiarization: boolean +) => { + expect(words.length).to.be.eq(expectedWords.length); + for (let i = 0; i < words.length; i += 1) { + expect(words[i].word).to.be.eq(expectedWords[i].word); + expect(words[i].startSec).to.be.closeTo(expectedWords[i].startSec, 0.1); + expect(words[i].endSec).to.be.closeTo(expectedWords[i].endSec, 0.1); + expect(words[i].confidence).to.be.closeTo(expectedWords[i].confidence, 0.1); + if (enableDiarization) { + expect(words[i].speakerTag).to.be.eq(expectedWords[i].speakerTag); } else { - expect(words[i].endSec).to.be.lte(audioLength); + expect(words[i].speakerTag).to.be.eq(-1); } - expect(words[i].confidence >= 0 && words[i].confidence <= 1).to.be.true; } }; const runInitTest = async ( instance: typeof Leopard | typeof LeopardWorker, params: { - accessKey?: string, - model?: PvModel, - expectFailure?: boolean, + accessKey?: string; + model?: PvModel; + expectFailure?: boolean; } = {} ) => { const { @@ -92,40 +108,36 @@ const runInitTest = async ( const runProcTest = async ( instance: typeof Leopard | typeof LeopardWorker, inputPcm: Int16Array, - punctuations: string[], expectedTranscript: string, expectedErrorRate: number, + expectedWords: LeopardWord[], params: { - accessKey?: string, - model?: PvModel, - enablePunctuation?: boolean, - useCER?: boolean, + accessKey?: string; + model?: PvModel; + enablePunctuation?: boolean; + enableDiarization?: boolean; + useCER?: boolean; } = {} ) => { const { accessKey = ACCESS_KEY, model = { publicPath: '/test/leopard_params.pv', forceWrite: true }, - enablePunctuation = true, - useCER = false + enablePunctuation = false, + enableDiarization = false, + useCER = false, } = params; - let normalizedTranscript = expectedTranscript; - if (!enablePunctuation) { - for (const punctuation of punctuations) { - normalizedTranscript = normalizedTranscript.replaceAll(punctuation, ''); - } - } - try { const leopard = await instance.create(accessKey, model, { - enableAutomaticPunctuation: enablePunctuation + enableAutomaticPunctuation: enablePunctuation, + enableDiarization: enableDiarization, }); const { transcript, words } = await leopard.process(inputPcm); - const errorRate = wordErrorRate(normalizedTranscript, transcript, useCER); + const errorRate = wordErrorRate(expectedTranscript, transcript, useCER); expect(errorRate).to.be.lt(expectedErrorRate); - validateMetadata(words, transcript, inputPcm.length / leopard.sampleRate); + validateMetadata(words, expectedWords, enableDiarization); if (leopard instanceof LeopardWorker) { leopard.terminate(); @@ -137,9 +149,66 @@ const runProcTest = async ( } }; -describe("Leopard Binding", function () { +describe('Leopard Binding', function () { + it(`should return process error message stack`, async () => { + let error: LeopardError | null = null; + + const leopard = await Leopard.create(ACCESS_KEY, { + publicPath: '/test/leopard_params.pv', + forceWrite: true, + }); + const testPcm = new Int16Array(512); + // @ts-ignore + const objectAddress = leopard._objectAddress; + + // @ts-ignore + leopard._objectAddress = 0; + + try { + await leopard.process(testPcm); + } catch (e) { + error = e as LeopardError; + } + + // @ts-ignore + leopard._objectAddress = objectAddress; + await leopard.release(); + + expect(error).to.not.be.null; + if (error) { + expect((error as LeopardError).messageStack.length).to.be.gt(0); + expect((error as LeopardError).messageStack.length).to.be.lte(8); + } + }); + for (const instance of [Leopard, LeopardWorker]) { - const instanceString = (instance === LeopardWorker) ? 'worker' : 'main'; + const instanceString = instance === LeopardWorker ? 'worker' : 'main'; + + it(`should return correct error message stack (${instanceString})`, async () => { + let messageStack = []; + try { + const leopard = await instance.create('invalidAccessKey', { + publicPath: '/test/leopard_params.pv', + forceWrite: true, + }); + expect(leopard).to.be.undefined; + } catch (e: any) { + messageStack = e.messageStack; + } + + expect(messageStack.length).to.be.gt(0); + expect(messageStack.length).to.be.lte(8); + + try { + const leopard = await instance.create('invalidAccessKey', { + publicPath: '/test/leopard_params.pv', + forceWrite: true, + }); + expect(leopard).to.be.undefined; + } catch (e: any) { + expect(messageStack.length).to.be.eq(e.messageStack.length); + } + }); it(`should be able to init with public path (${instanceString})`, () => { cy.wrap(null).then(async () => { @@ -150,7 +219,7 @@ describe("Leopard Binding", function () { it(`should be able to init with base64 (${instanceString})`, () => { cy.wrap(null).then(async () => { await runInitTest(instance, { - model: { base64: leopardParams, forceWrite: true } + model: { base64: leopardParams, forceWrite: true }, }); }); }); @@ -158,7 +227,11 @@ describe("Leopard Binding", function () { it(`should be able to handle UTF-8 public path (${instanceString})`, () => { cy.wrap(null).then(async () => { await runInitTest(instance, { - model: { publicPath: '/test/leopard_params.pv', forceWrite: true, customWritePath: '테스트' } + model: { + publicPath: '/test/leopard_params.pv', + forceWrite: true, + customWritePath: '테스트', + }, }); }); }); @@ -167,7 +240,7 @@ describe("Leopard Binding", function () { cy.wrap(null).then(async () => { await runInitTest(instance, { model: { publicPath: 'invalid', forceWrite: true }, - expectFailure: true + expectFailure: true, }); }); }); @@ -176,7 +249,7 @@ describe("Leopard Binding", function () { cy.wrap(null).then(async () => { await runInitTest(instance, { model: { base64: 'invalid', forceWrite: true }, - expectFailure: true + expectFailure: true, }); }); }); @@ -185,28 +258,40 @@ describe("Leopard Binding", function () { cy.wrap(null).then(async () => { await runInitTest(instance, { accessKey: 'invalid', - expectFailure: true + expectFailure: true, }); }); }); - for (const testParam of testData.tests.parameters) { + for (const testParam of testData.tests.language_tests) { it(`should be able to process (${testParam.language}) (${instanceString})`, () => { try { - cy.getFramesFromFile(`audio_samples/${testParam.audio_file}`).then( async pcm => { - const suffix = (testParam.language === 'en') ? '' : `_${testParam.language}`; - await runProcTest( - instance, - pcm, - testParam.punctuations, - testParam.transcript, - testParam.error_rate, - { - model: { publicPath: `/test/leopard_params${suffix}.pv`, forceWrite: true }, - enablePunctuation: false, - useCER: (testParam.language === 'ja') - }); - }); + cy.getFramesFromFile(`audio_samples/${testParam.audio_file}`).then( + async pcm => { + const suffix = + testParam.language === 'en' ? '' : `_${testParam.language}`; + await runProcTest( + instance, + pcm, + testParam.transcript, + testParam.error_rate, + testParam.words.map((w: any) => ({ + word: w.word, + startSec: w.start_sec, + endSec: w.end_sec, + confidence: w.confidence, + speakerTag: w.speaker_tag, + })), + { + model: { + publicPath: `/test/leopard_params${suffix}.pv`, + forceWrite: true, + }, + useCER: testParam.language === 'ja', + } + ); + } + ); } catch (e) { expect(e).to.be.undefined; } @@ -214,44 +299,140 @@ describe("Leopard Binding", function () { it(`should be able to process with punctuation (${testParam.language}) (${instanceString})`, () => { try { - cy.getFramesFromFile(`audio_samples/${testParam.audio_file}`).then( async pcm => { - const suffix = (testParam.language === 'en') ? '' : `_${testParam.language}`; - await runProcTest( - instance, - pcm, - testParam.punctuations, - testParam.transcript, - testParam.error_rate, - { - model: { publicPath: `/test/leopard_params${suffix}.pv`, forceWrite: true }, - useCER: (testParam.language === 'ja') - }); - }); + cy.getFramesFromFile(`audio_samples/${testParam.audio_file}`).then( + async pcm => { + const suffix = + testParam.language === 'en' ? '' : `_${testParam.language}`; + await runProcTest( + instance, + pcm, + testParam.transcript_with_punctuation, + testParam.error_rate, + testParam.words.map((w: any) => ({ + word: w.word, + startSec: w.start_sec, + endSec: w.end_sec, + confidence: w.confidence, + speakerTag: w.speaker_tag, + })), + { + model: { + publicPath: `/test/leopard_params${suffix}.pv`, + forceWrite: true, + }, + enablePunctuation: true, + useCER: testParam.language === 'ja', + } + ); + } + ); + } catch (e) { + expect(e).to.be.undefined; + } + }); + + it(`should be able to process with diarization (${testParam.language}) (${instanceString})`, () => { + try { + cy.getFramesFromFile(`audio_samples/${testParam.audio_file}`).then( + async pcm => { + const suffix = + testParam.language === 'en' ? '' : `_${testParam.language}`; + await runProcTest( + instance, + pcm, + testParam.transcript, + testParam.error_rate, + testParam.words.map((w: any) => ({ + word: w.word, + startSec: w.start_sec, + endSec: w.end_sec, + confidence: w.confidence, + speakerTag: w.speaker_tag, + })), + { + model: { + publicPath: `/test/leopard_params${suffix}.pv`, + forceWrite: true, + }, + enableDiarization: true, + useCER: testParam.language === 'ja', + } + ); + } + ); } catch (e) { expect(e).to.be.undefined; } }); } - } - it(`should be able to transfer buffer`, () => { - try { - cy.getFramesFromFile(`audio_samples/test.wav`).then( async pcm => { - const leopard = await LeopardWorker.create( - ACCESS_KEY, - { publicPath: '/test/leopard_params.pv', forceWrite: true }, - { enableAutomaticPunctuation: false } - ); - - let copy = new Int16Array(pcm.length); - copy.set(pcm); - await leopard.process(copy, {transfer: true, transferCallback: data => { copy = data; } }); - leopard.terminate(); - - expect(copy).to.deep.eq(pcm); + for (const testParam of testData.tests.diarization_tests) { + it(`should be able to process diarization multiple speakers (${testParam.language}) (${instanceString})`, () => { + try { + cy.getFramesFromFile(`audio_samples/${testParam.audio_file}`).then( + async pcm => { + const suffix = + testParam.language === 'en' ? '' : `_${testParam.language}`; + + const leopard = await instance.create( + ACCESS_KEY, + { + publicPath: `/test/leopard_params${suffix}.pv`, + forceWrite: true, + }, + { + enableDiarization: true, + } + ); + + const { words } = await leopard.process(pcm); + + expect(words.length).to.eq(testParam.words.length); + + for (let i = 0; i < words.length; i++) { + expect(words[i].word).to.eq(testParam.words[i].word); + expect(words[i].speakerTag).to.eq( + testParam.words[i].speaker_tag + ); + } + + if (leopard instanceof Leopard) { + await leopard.release(); + } else { + leopard.terminate(); + } + } + ); + } catch (e) { + expect(e).to.be.undefined; + } }); - } catch (e) { - expect(e).to.be.undefined; } - }); + + it(`should be able to transfer buffer`, () => { + try { + cy.getFramesFromFile(`audio_samples/test.wav`).then(async pcm => { + const leopard = await LeopardWorker.create( + ACCESS_KEY, + { publicPath: '/test/leopard_params.pv', forceWrite: true }, + { enableAutomaticPunctuation: false } + ); + + let copy = new Int16Array(pcm.length); + copy.set(pcm); + await leopard.process(copy, { + transfer: true, + transferCallback: data => { + copy = data; + }, + }); + leopard.terminate(); + + expect(copy).to.deep.eq(pcm); + }); + } catch (e) { + expect(e).to.be.undefined; + } + }); + } }); diff --git a/binding/web/test/leopard_perf.test.ts b/binding/web/test/leopard_perf.test.ts index d4090a99..f874befa 100644 --- a/binding/web/test/leopard_perf.test.ts +++ b/binding/web/test/leopard_perf.test.ts @@ -48,7 +48,7 @@ async function testPerformance( } describe('Leopard binding performance test', () => { - Cypress.config('defaultCommandTimeout', 120000); + Cypress.config('defaultCommandTimeout', 160000); for (const instance of [Leopard, LeopardWorker]) { const instanceString = (instance === LeopardWorker) ? 'worker' : 'main'; diff --git a/demo/android/LeopardDemo/leopard-demo-app/build.gradle b/demo/android/LeopardDemo/leopard-demo-app/build.gradle index ebcfe30c..a9187e36 100644 --- a/demo/android/LeopardDemo/leopard-demo-app/build.gradle +++ b/demo/android/LeopardDemo/leopard-demo-app/build.gradle @@ -70,7 +70,7 @@ dependencies { implementation 'androidx.appcompat:appcompat:1.6.1' implementation 'com.google.android.material:material:1.8.0' implementation 'androidx.constraintlayout:constraintlayout:2.1.4' - implementation 'ai.picovoice:leopard-android:1.2.1' + implementation 'ai.picovoice:leopard-android:2.0.0' implementation 'ai.picovoice:android-voice-processor:1.0.2' } diff --git a/demo/android/LeopardDemo/leopard-demo-app/src/main/java/ai/picovoice/leoparddemo/MainActivity.java b/demo/android/LeopardDemo/leopard-demo-app/src/main/java/ai/picovoice/leoparddemo/MainActivity.java index 56d910f5..aafa26b0 100644 --- a/demo/android/LeopardDemo/leopard-demo-app/src/main/java/ai/picovoice/leoparddemo/MainActivity.java +++ b/demo/android/LeopardDemo/leopard-demo-app/src/main/java/ai/picovoice/leoparddemo/MainActivity.java @@ -108,7 +108,8 @@ protected void onCreate(Bundle savedInstanceState) { try { Leopard.Builder builder = new Leopard.Builder() .setAccessKey(ACCESS_KEY) - .setEnableAutomaticPunctuation(true); + .setEnableAutomaticPunctuation(true) + .setEnableDiarization(true); String model; if (Objects.equals(BuildConfig.FLAVOR, "en")) { @@ -120,7 +121,7 @@ protected void onCreate(Bundle savedInstanceState) { leopard = builder.build(getApplicationContext()); } catch (LeopardInvalidArgumentException e) { - displayError(String.format("%s\nEnsure your AccessKey '%s' is valid", e.getMessage(), ACCESS_KEY)); + displayError(e.getMessage()); } catch (LeopardActivationException e) { displayError("AccessKey activation error"); } catch (LeopardActivationLimitException e) { @@ -321,6 +322,7 @@ public void onBindViewHolder(ViewHolder holder, int position) { holder.startSec.setText(String.format("%.2fs", word.getStartSec())); holder.endSec.setText(String.format("%.2fs", word.getEndSec())); holder.confidence.setText(String.format("%.0f%%", word.getConfidence() * 100)); + holder.speakerTag.setText(String.format("%d", word.getSpeakerTag())); } @Override @@ -333,6 +335,7 @@ public static class ViewHolder extends RecyclerView.ViewHolder { TextView startSec; TextView endSec; TextView confidence; + TextView speakerTag; ViewHolder(View itemView) { super(itemView); @@ -340,6 +343,7 @@ public static class ViewHolder extends RecyclerView.ViewHolder { startSec = itemView.findViewById(R.id.startSec); endSec = itemView.findViewById(R.id.endSec); confidence = itemView.findViewById(R.id.confidence); + speakerTag = itemView.findViewById(R.id.speakerTag); } } } diff --git a/demo/android/LeopardDemo/leopard-demo-app/src/main/res/layout/leopard_demo.xml b/demo/android/LeopardDemo/leopard-demo-app/src/main/res/layout/leopard_demo.xml index 036a3f88..0db5c6b7 100644 --- a/demo/android/LeopardDemo/leopard-demo-app/src/main/res/layout/leopard_demo.xml +++ b/demo/android/LeopardDemo/leopard-demo-app/src/main/res/layout/leopard_demo.xml @@ -70,11 +70,11 @@ android:id="@+id/verboseResultsHeader" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_marginBottom="5dp" + android:layout_margin="5dp" android:orientation="horizontal"> + + + + 0) { + fprintf(stderr, ":\n"); + print_error_message(message_stack, message_stack_depth); + } else { + fprintf(stderr, ".\n"); + } + + pv_free_error_stack_func(message_stack); + exit(1); } + struct timeval after; gettimeofday(&after, NULL); - proc_sec += ((double)(after.tv_sec - before.tv_sec) + - ((double)(after.tv_usec - before.tv_usec)) * 1e-6); - - fprintf(stdout, "%s\n", transcript); - pv_leopard_transcript_delete_func(transcript); - - if (show_metadata) { - for (int32_t j = 0; j < num_words; j++) { - fprintf(stdout, - "[%s]\t.start_sec = %.1f .end_sec = %.1f .confidence = %.2f\n", - words[j].word, words[j].start_sec, words[j].end_sec, - words[j].confidence); - } - printf("\n"); + double init_sec = ((double) (after.tv_sec - before.tv_sec) + + ((double) (after.tv_usec - before.tv_usec)) * 1e-6); + fprintf(stdout, "init took %.1f sec\n", init_sec); + + double proc_sec = 0.; + + for (int32_t i = optind; i < argc; i++) { + gettimeofday(&before, NULL); + + char *transcript = NULL; + int32_t num_words = 0; + pv_word_t *words = NULL; + status = pv_leopard_process_file_func( + leopard, + argv[i], + &transcript, + &num_words, &words); + if (status != PV_STATUS_SUCCESS) { + fprintf( + stderr, + "failed to process with `%s`", + pv_status_to_string_func(status)); + error_status = pv_get_error_stack_func(&message_stack, &message_stack_depth); + if (error_status != PV_STATUS_SUCCESS) { + fprintf( + stderr, + ".\nUnable to get Leopard error state with '%s'.\n", + pv_status_to_string_func(error_status)); + exit(1); + } + + if (message_stack_depth > 0) { + fprintf(stderr, ":\n"); + print_error_message(message_stack, message_stack_depth); + } else { + fprintf(stderr, ".\n"); + } + + pv_free_error_stack_func(message_stack); + exit(1); + } + + gettimeofday(&after, NULL); + + proc_sec += ((double) (after.tv_sec - before.tv_sec) + + ((double) (after.tv_usec - before.tv_usec)) * 1e-6); + + fprintf(stdout, "%s\n", transcript); + pv_leopard_transcript_delete_func(transcript); + + if (show_metadata) { + for (int32_t j = 0; j < num_words; j++) { + fprintf( + stdout, + "[%s]\t.start_sec = %.1f .end_sec = %.1f .confidence = %.2f .speaker_tag = %d\n", + words[j].word, + words[j].start_sec, + words[j].end_sec, + words[j].confidence, + words[j].speaker_tag); + } + printf("\n"); + } + pv_leopard_words_delete_func(words); } - pv_leopard_words_delete_func(words); - } - fprintf(stdout, "proc took %.2f sec\n", proc_sec); + fprintf(stdout, "proc took %.2f sec\n", proc_sec); - pv_leopard_delete_func(leopard); - close_dl(dl_handle); + pv_leopard_delete_func(leopard); + close_dl(dl_handle); - return 0; + return 0; } int main(int argc, char *argv[]) { @@ -246,43 +333,43 @@ int main(int argc, char *argv[]) { #define UTF8_COMPOSITION_FLAG (0) #define NULL_TERMINATED (-1) - LPWSTR *wargv = CommandLineToArgvW(GetCommandLineW(), &argc); - if (wargv == NULL) { - fprintf(stderr, "CommandLineToArgvW failed\n"); - exit(1); - } - - char *utf8_argv[argc]; - - for (int i = 0; i < argc; ++i) { - // WideCharToMultiByte: - // https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-widechartomultibyte - int arg_chars_num = - WideCharToMultiByte(CP_UTF8, UTF8_COMPOSITION_FLAG, wargv[i], - NULL_TERMINATED, NULL, 0, NULL, NULL); - utf8_argv[i] = (char *)malloc(arg_chars_num * sizeof(char)); - if (!utf8_argv[i]) { - fprintf(stderr, "failed to to allocate memory for converting args"); + LPWSTR *wargv = CommandLineToArgvW(GetCommandLineW(), &argc); + if (wargv == NULL) { + fprintf(stderr, "CommandLineToArgvW failed\n"); + exit(1); + } + + char *utf8_argv[argc]; + + for (int i = 0; i < argc; ++i) { + // WideCharToMultiByte: + // https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-widechartomultibyte + int arg_chars_num = + WideCharToMultiByte(CP_UTF8, UTF8_COMPOSITION_FLAG, wargv[i], + NULL_TERMINATED, NULL, 0, NULL, NULL); + utf8_argv[i] = (char *)malloc(arg_chars_num * sizeof(char)); + if (!utf8_argv[i]) { + fprintf(stderr, "failed to to allocate memory for converting args"); + } + WideCharToMultiByte(CP_UTF8, UTF8_COMPOSITION_FLAG, wargv[i], + NULL_TERMINATED, utf8_argv[i], arg_chars_num, NULL, + NULL); } - WideCharToMultiByte(CP_UTF8, UTF8_COMPOSITION_FLAG, wargv[i], - NULL_TERMINATED, utf8_argv[i], arg_chars_num, NULL, - NULL); - } - LocalFree(wargv); - argv = utf8_argv; + LocalFree(wargv); + argv = utf8_argv; #endif - int result = picovoice_main(argc, argv); + int result = picovoice_main(argc, argv); #if defined(_WIN32) || defined(_WIN64) - for (int i = 0; i < argc; ++i) { - free(utf8_argv[i]); - } + for (int i = 0; i < argc; ++i) { + free(utf8_argv[i]); + } #endif - return result; + return result; } diff --git a/demo/c/test/test_leopard_c.py b/demo/c/test/test_leopard_c.py index fb5afda8..473d7531 100644 --- a/demo/c/test/test_leopard_c.py +++ b/demo/c/test/test_leopard_c.py @@ -19,7 +19,7 @@ from test_util import * -test_parameters = load_test_data() +language_tests = load_languages_test_data() class PorcupineCTestCase(unittest.TestCase): @@ -44,8 +44,13 @@ def _get_model_path_by_language(self, language): model_path_subdir = append_language('lib/common/leopard_params', language) return os.path.join(self._root_dir, '%s.pv' % model_path_subdir) - @parameterized.expand(test_parameters) - def test_leopard(self, language, audio_file_name, ground_truth, error_rate): + @parameterized.expand(language_tests) + def test_leopard( + self, + language, + audio_file_name, + ground_truth, + error_rate): args = [ os.path.join(os.path.dirname(__file__), "../build/leopard_demo"), "-a", self._access_key, diff --git a/demo/c/test/test_util.py b/demo/c/test/test_util.py index 4972fd98..2b0d0823 100644 --- a/demo/c/test/test_util.py +++ b/demo/c/test/test_util.py @@ -28,14 +28,19 @@ def append_language(s, language): return "%s_%s" % (s, language) -def load_test_data(): +def load_languages_test_data(): data_file_path = os.path.join(os.path.dirname(__file__), "../../../resources/.test/test_data.json") with open(data_file_path, encoding="utf8") as data_file: json_test_data = data_file.read() - test_data = json.loads(json_test_data)['tests']['parameters'] + test_data = json.loads(json_test_data)['tests']['language_tests'] test_parameters = [ - (t['language'], t['audio_file'], t['transcript'], t['error_rate']) + ( + t['language'], + t['audio_file'], + t['transcript_with_punctuation'], + t['error_rate'] + ) for t in test_data] return test_parameters diff --git a/demo/dotnet/LeopardDemo/FileDemo.cs b/demo/dotnet/LeopardDemo/FileDemo.cs index a729a0eb..f4800d8e 100644 --- a/demo/dotnet/LeopardDemo/FileDemo.cs +++ b/demo/dotnet/LeopardDemo/FileDemo.cs @@ -17,7 +17,8 @@ specific language governing permissions and limitations under the License. namespace LeopardDemo { /// - /// File Demo for Leopard Speech-to-Text engine. The demo takes an input audio file and returns prints the the transcription. + /// File Demo for Leopard Speech-to-Text engine. + /// The demo takes an input audio file and processes it with Leopard. /// public class FileDemo { @@ -26,28 +27,36 @@ public class FileDemo /// Reads through input file and prints the transcription returned by Leopard. /// /// Required argument. Absolute path to input audio file. - /// AccessKey obtained from Picovoice Console (https://console.picovoice.ai/). - /// Absolute path to the file containing model parameters. If not set it will be set to the default location. + /// + /// AccessKey obtained from Picovoice Console (https://console.picovoice.ai/). + /// + /// + /// Absolute path to the file containing model parameters. + /// If not set it will be set to the default location. /// /// Set to `true` to enable automatic punctuation insertion. /// + /// + /// Set to `true` to enable speaker diarization, which allows Leopard to differentiate speakers as + /// part of the transcription process. Word metadata will include a `SpeakerTag` to identify unique speakers. + /// /// /// Enable verbose logging. /// - /// public static void RunDemo( string accessKey, string inputAudioPath, string modelPath, bool enableAutomaticPunctuation, - bool verbose - ) + bool enableDiarization, + bool verbose) { // init Leopard speech-to-text engine using (Leopard leopard = Leopard.Create( accessKey: accessKey, modelPath: modelPath, - enableAutomaticPunctuation: enableAutomaticPunctuation)) + enableAutomaticPunctuation: enableAutomaticPunctuation, + enableDiarization: enableDiarization)) { try @@ -56,11 +65,25 @@ bool verbose Console.WriteLine(result.TranscriptString); if (verbose) { - Console.WriteLine(String.Format("\n|{0,-15}|{1,-10:0.00}|{2,-10:0.00}|{3,-10:0.00}|\n", "word", "Confidence", "StartSec", "EndSec")); + Console.WriteLine( + string.Format( + "\n|{0,-15}|{1,11:0.00}|{2,10:0.00}|{3,10:0.00}|{4,11}|\n", + "Word", + "Confidence", + "StartSec", + "EndSec", + "SpeakerTag")); for (int i = 0; i < result.WordArray.Length; i++) { LeopardWord word = result.WordArray[i]; - Console.WriteLine(String.Format("|{0,-15}|{1,10:0.00}|{2,10:0.00}|{3,10:0.00}|", word.Word, word.Confidence, word.StartSec, word.EndSec)); + Console.WriteLine( + string.Format( + "|{0,-15}|{1,11:0.00}|{2,10:0.00}|{3,10:0.00}|{4,11}|", + word.Word, + word.Confidence, + word.StartSec, + word.EndSec, + word.SpeakerTag)); } } } @@ -85,7 +108,8 @@ public static void Main(string[] args) string accessKey = null; string modelPath = null; bool enableAutomaticPunctuation = true; - bool verbose = true; + bool enableDiarization = true; + bool verbose = false; bool showHelp = false; // parse command line arguments @@ -118,6 +142,11 @@ public static void Main(string[] args) enableAutomaticPunctuation = false; argIndex++; } + else if (args[argIndex] == "--disable_speaker_diarization") + { + enableDiarization = false; + argIndex++; + } else if (args[argIndex] == "--verbose") { verbose = true; @@ -149,7 +178,9 @@ public static void Main(string[] args) } if (!File.Exists(inputAudioPath)) { - throw new ArgumentException($"Audio file at path {inputAudioPath} does not exist", "--input_audio_path"); + throw new ArgumentException( + $"Audio file at path {inputAudioPath} does not exist", + "input_audio_path"); } RunDemo( @@ -157,6 +188,7 @@ public static void Main(string[] args) inputAudioPath, modelPath, enableAutomaticPunctuation, + enableDiarization, verbose); } @@ -172,6 +204,7 @@ private static void OnUnhandledException(object sender, UnhandledExceptionEventA "\t--access_key (required): AccessKey obtained from Picovoice Console (https://console.picovoice.ai/)\n" + "\t--model_path: Absolute path to the file containing model parameters.\n" + "\t--disable_automatic_punctuation: Disable automatic punctuation.\n" + - "\t--verbose: Enable verbose logging"; + "\t--disable_speaker_diarization: Disable speaker diarization.\n" + + "\t--verbose: Enable verbose output. Prints Leopard word metadata."; } } \ No newline at end of file diff --git a/demo/dotnet/LeopardDemo/LeopardDemo.csproj b/demo/dotnet/LeopardDemo/LeopardDemo.csproj index 46b5c85b..eaa9f092 100644 --- a/demo/dotnet/LeopardDemo/LeopardDemo.csproj +++ b/demo/dotnet/LeopardDemo/LeopardDemo.csproj @@ -20,6 +20,6 @@ - + diff --git a/demo/dotnet/LeopardDemo/MicDemo.cs b/demo/dotnet/LeopardDemo/MicDemo.cs index 4e1df02e..6fb481d0 100644 --- a/demo/dotnet/LeopardDemo/MicDemo.cs +++ b/demo/dotnet/LeopardDemo/MicDemo.cs @@ -19,38 +19,49 @@ specific language governing permissions and limitations under the License. namespace LeopardDemo { /// - /// Microphone Demo for Leopard Speech-to-Text engine. It creates an input audio stream from a microphone. + /// Microphone Demo for Leopard Speech-to-Text engine. + /// It creates an input audio stream from a microphone and processes it with Leopard. /// public class MicDemo { - private static readonly int PV_RECORDER_FRAME_LENGTH = 2048; /// /// Creates an input audio stream and instantiates an instance of Leopard object. /// - /// AccessKey obtained from Picovoice Console (https://console.picovoice.ai/). - /// Absolute path to the file containing model parameters. If not set it will be set to the default location. + /// + /// AccessKey obtained from Picovoice Console (https://console.picovoice.ai/). + /// + /// + /// Absolute path to the file containing model parameters. + /// If not set it will be set to the default location. + /// /// /// Set to `true` to enable automatic punctuation insertion. /// - /// - /// Enable verbose logging. + /// + /// Set to `true` to enable speaker diarization, which allows Leopard to differentiate speakers as + /// part of the transcription process. Word metadata will include a `SpeakerTag` to identify unique speakers. + /// + /// Enable verbose logging. + /// + /// Optional argument. If provided, audio is recorded from this input device. + /// Otherwise, the default audio input device is used. /// - /// Optional argument. If provided, audio is recorded from this input device. Otherwise, the default audio input device is used. - public static void RunDemo( + private static void RunDemo( string accessKey, string modelPath, bool enableAutomaticPunctuation, + bool enableDiarization, bool verbose, int audioDeviceIndex) { using (Leopard leopard = Leopard.Create( accessKey: accessKey, modelPath: modelPath, - enableAutomaticPunctuation: enableAutomaticPunctuation)) + enableAutomaticPunctuation: enableAutomaticPunctuation, + enableDiarization: enableDiarization)) { - using (PvRecorder recorder = PvRecorder.Create(PV_RECORDER_FRAME_LENGTH, audioDeviceIndex)) { Console.WriteLine($"Using device: {recorder.SelectedDevice}"); @@ -98,11 +109,25 @@ public static void RunDemo( Console.WriteLine(result.TranscriptString); if (verbose) { - Console.WriteLine(string.Format("\n|{0,-15}|{1,-10:0.00}|{2,-10:0.00}|{3,-10:0.00}|\n", "word", "Confidence", "StartSec", "EndSec")); + Console.WriteLine( + string.Format( + "\n|{0,-15}|{1,11:0.00}|{2,10:0.00}|{3,10:0.00}|{4,11}|\n", + "Word", + "Confidence", + "StartSec", + "EndSec", + "SpeakerTag")); for (int i = 0; i < result.WordArray.Length; i++) { LeopardWord word = result.WordArray[i]; - Console.WriteLine(string.Format("|{0,-15}|{1,10:0.00}|{2,10:0.00}|{3,10:0.00}|", word.Word, word.Confidence, word.StartSec, word.EndSec)); + Console.WriteLine( + string.Format( + "|{0,-15}|{1,11:0.00}|{2,10:0.00}|{3,10:0.00}|{4,11}|", + word.Word, + word.Confidence, + word.StartSec, + word.EndSec, + word.SpeakerTag)); } Console.WriteLine(); } @@ -119,7 +144,7 @@ public static void RunDemo( /// /// Lists available audio input devices. /// - public static void ShowAudioDevices() + private static void ShowAudioDevices() { string[] devices = PvRecorder.GetAvailableDevices(); for (int i = 0; i < devices.Length; i++) @@ -141,7 +166,8 @@ public static void Main(string[] args) string accessKey = null; string modelPath = null; bool enableAutomaticPunctuation = true; - bool verbose = true; + bool enableDiarization = true; + bool verbose = false; int audioDeviceIndex = -1; bool showAudioDevices = false; bool showHelp = false; @@ -169,6 +195,11 @@ public static void Main(string[] args) enableAutomaticPunctuation = false; argIndex++; } + else if (args[argIndex] == "--disable_speaker_diarization") + { + enableDiarization = false; + argIndex++; + } else if (args[argIndex] == "--verbose") { verbose = true; @@ -219,6 +250,7 @@ public static void Main(string[] args) accessKey, modelPath, enableAutomaticPunctuation, + enableDiarization, verbose, audioDeviceIndex); } @@ -236,6 +268,7 @@ private static void OnUnhandledException(object sender, UnhandledExceptionEventA "\t--audio_device_index: Index of input audio device.\n" + "\t--show_audio_devices: Print available recording devices.\n" + "\t--disable_automatic_punctuation: Disable automatic punctuation.\n" + - "\t--verbose: Enable verbose logging"; + "\t--disable_speaker_diarization: Disable speaker diarization.\n" + + "\t--verbose: Enable verbose output. Prints Leopard word metadata."; } } \ No newline at end of file diff --git a/demo/flutter/integration_test/app_test.dart b/demo/flutter/integration_test/app_test.dart index 064e698b..140ae40e 100644 --- a/demo/flutter/integration_test/app_test.dart +++ b/demo/flutter/integration_test/app_test.dart @@ -95,21 +95,20 @@ void main() { } Future validateMetadata( - List words, String transcript, double audioLength) async { - String normTranscript = transcript.toUpperCase(); + List words, + List expectedWords, + bool enableDiarization) async { + expect(words.length, expectedWords.length); for (var i = 0; i < words.length; i++) { - LeopardWord word = words[i]; - expect(normTranscript, contains(word.word.toUpperCase())); - expect(word.startSec, greaterThan(0)); - expect(word.startSec, lessThanOrEqualTo(word.endSec)); - if (i < (words.length - 1)) { - LeopardWord nextWord = words[i + 1]; - expect(word.endSec, lessThanOrEqualTo(nextWord.startSec)); + expect(words[i].word, expectedWords[i]["word"]); + expect(words[i].startSec, closeTo(expectedWords[i]["start_sec"], 0.01)); + expect(words[i].endSec, closeTo(expectedWords[i]["end_sec"], 0.01)); + expect(words[i].confidence, closeTo(expectedWords[i]["confidence"], 0.01)); + if (enableDiarization) { + expect(words[i].speakerTag, expectedWords[i]["speaker_tag"]); + } else { + expect(words[i].speakerTag, -1); } - expect(word.endSec, lessThanOrEqualTo(audioLength)); - - expect(word.confidence, greaterThanOrEqualTo(0)); - expect(word.confidence, lessThanOrEqualTo(1)); } } @@ -124,143 +123,142 @@ void main() { Future runLeopardProcess( String language, - String transcript, - List punctuations, - bool testPunctuations, + String expectedTranscript, + List expectedWords, double errorRate, - String audioFile) async { + String audioFile, + { + bool asFile = false, + bool enableAutomaticPunctuation = false, + bool enableDiarization = false + }) async { String modelPath = getModelPath(language); - String normTranscript = transcript; - if (!testPunctuations) { - for (var p in punctuations) { - normTranscript = normTranscript.replaceAll(p, ""); - } - } - Leopard leopard; try { - leopard = await Leopard.create(accessKey, modelPath, - enableAutomaticPunctuation: testPunctuations); + leopard = await Leopard.create(accessKey, + modelPath, + enableAutomaticPunctuation: enableAutomaticPunctuation, + enableDiarization: enableDiarization + ); } on LeopardException catch (ex) { expect(ex, equals(null), - reason: "Failed to initialize Leopard for $language: $ex"); + reason: "Failed to initialize Leopard for $language: ${ex.message}"); return; } - List pcm = await loadAudioFile(audioFile); - LeopardTranscript res = await leopard.process(pcm); - - leopard.delete(); - - expect(characterErrorRate(res.transcript, normTranscript), - lessThanOrEqualTo(errorRate), - reason: "Character error rate for $language was incorrect"); - await validateMetadata( - res.words, res.transcript, pcm.length / leopard.sampleRate); - } - - Future runLeopardProcessFile( - String language, - String transcript, - List punctuations, - bool testPunctuations, - double errorRate, - String audioFile) async { - String modelPath = getModelPath(language); - - String normTranscript = transcript; - if (!testPunctuations) { - for (var p in punctuations) { - normTranscript = normTranscript.replaceAll(p, ""); - } + LeopardTranscript res; + if (asFile) { + String audioPath = await extractAudioFile(audioFile); + res = await leopard.processFile(audioPath); + } else { + List pcm = await loadAudioFile(audioFile); + res = await leopard.process(pcm); } - Leopard leopard; - try { - leopard = await Leopard.create(accessKey, modelPath, - enableAutomaticPunctuation: testPunctuations); - } on LeopardException catch (ex) { - expect(ex, equals(null), - reason: "Failed to initialize Leopard for $language: $ex"); - return; - } - - String audioPath = await extractAudioFile(audioFile); - LeopardTranscript res = await leopard.processFile(audioPath); - leopard.delete(); - List pcm = await loadAudioFile(audioFile); - expect(characterErrorRate(res.transcript, normTranscript), + expect(characterErrorRate(res.transcript, expectedTranscript), lessThanOrEqualTo(errorRate), reason: "Character error rate for $language was incorrect"); - await validateMetadata( - res.words, res.transcript, pcm.length / leopard.sampleRate); + await validateMetadata(res.words, expectedWords, enableDiarization); } testWidgets('Test process all languages', (tester) async { - for (int t = 0; t < testData['tests']['parameters'].length; t++) { - String language = testData['tests']['parameters'][t]['language']; - String transcript = testData['tests']['parameters'][t]['transcript']; - List punctuationsRaw = - testData['tests']['parameters'][t]['punctuations']; - List punctuations = - punctuationsRaw.map((p) => p.toString()).toList(); - double errorRate = testData['tests']['parameters'][t]['error_rate']; - String audioFile = testData['tests']['parameters'][t]['audio_file']; + for (int t = 0; t < testData['tests']['language_tests'].length; t++) { + String language = testData['tests']['language_tests'][t]['language']; + String transcript = testData['tests']['language_tests'][t]['transcript']; + List expectedWords = testData['tests']['language_tests'][t]['words']; + double errorRate = testData['tests']['language_tests'][t]['error_rate']; + String audioFile = testData['tests']['language_tests'][t]['audio_file']; await runLeopardProcess( - language, transcript, punctuations, false, errorRate, audioFile); + language, transcript, expectedWords, errorRate, audioFile); } }); testWidgets('Test process all languages with punctuation', (tester) async { - for (int t = 0; t < testData['tests']['parameters'].length; t++) { - String language = testData['tests']['parameters'][t]['language']; - String transcript = testData['tests']['parameters'][t]['transcript']; - List punctuationsRaw = - testData['tests']['parameters'][t]['punctuations']; - List punctuations = - punctuationsRaw.map((p) => p.toString()).toList(); - double errorRate = testData['tests']['parameters'][t]['error_rate']; - String audioFile = testData['tests']['parameters'][t]['audio_file']; + for (int t = 0; t < testData['tests']['language_tests'].length; t++) { + String language = testData['tests']['language_tests'][t]['language']; + String transcriptWithPunctuation = testData['tests']['language_tests'][t]['transcript_with_punctuation']; + List expectedWords = testData['tests']['language_tests'][t]['words']; + double errorRate = testData['tests']['language_tests'][t]['error_rate']; + String audioFile = testData['tests']['language_tests'][t]['audio_file']; await runLeopardProcess( - language, transcript, punctuations, true, errorRate, audioFile); + language, + transcriptWithPunctuation, + expectedWords, + errorRate, + audioFile, + enableAutomaticPunctuation: true); } }); testWidgets('Test process file all languages', (tester) async { - for (int t = 0; t < testData['tests']['parameters'].length; t++) { - String language = testData['tests']['parameters'][t]['language']; - String transcript = testData['tests']['parameters'][t]['transcript']; - List punctuationsRaw = - testData['tests']['parameters'][t]['punctuations']; - List punctuations = - punctuationsRaw.map((p) => p.toString()).toList(); - double errorRate = testData['tests']['parameters'][t]['error_rate']; - String audioFile = testData['tests']['parameters'][t]['audio_file']; - - await runLeopardProcessFile( - language, transcript, punctuations, false, errorRate, audioFile); + for (int t = 0; t < testData['tests']['language_tests'].length; t++) { + String language = testData['tests']['language_tests'][t]['language']; + String transcript = testData['tests']['language_tests'][t]['transcript']; + List expectedWords = testData['tests']['language_tests'][t]['words']; + double errorRate = testData['tests']['language_tests'][t]['error_rate']; + String audioFile = testData['tests']['language_tests'][t]['audio_file']; + + await runLeopardProcess( + language, + transcript, + expectedWords, + errorRate, + audioFile, + asFile: true); } }); - testWidgets('Test process file all languages with punctuation', - (tester) async { - for (int t = 0; t < testData['tests']['parameters'].length; t++) { - String language = testData['tests']['parameters'][t]['language']; - String transcript = testData['tests']['parameters'][t]['transcript']; - List punctuationsRaw = - testData['tests']['parameters'][t]['punctuations']; - List punctuations = - punctuationsRaw.map((p) => p.toString()).toList(); - double errorRate = testData['tests']['parameters'][t]['error_rate']; - String audioFile = testData['tests']['parameters'][t]['audio_file']; - - await runLeopardProcessFile( - language, transcript, punctuations, true, errorRate, audioFile); + testWidgets('Test process file all languages with diarization', (tester) async { + for (int t = 0; t < testData['tests']['language_tests'].length; t++) { + String language = testData['tests']['language_tests'][t]['language']; + String transcript = testData['tests']['language_tests'][t]['transcript']; + List expectedWords = testData['tests']['language_tests'][t]['words']; + double errorRate = testData['tests']['language_tests'][t]['error_rate']; + String audioFile = testData['tests']['language_tests'][t]['audio_file']; + + await runLeopardProcess( + language, + transcript, + expectedWords, + errorRate, + audioFile, + enableDiarization: true); + } + }); + + testWidgets('Test diarization with multiple speakers', (tester) async { + for (int t = 0; t < testData['tests']['diarization_tests'].length; t++) { + String language = testData['tests']['diarization_tests'][t]['language']; + List expectedWords = testData['tests']['diarization_tests'][t]['words']; + String audioFile = testData['tests']['diarization_tests'][t]['audio_file']; + + String modelPath = getModelPath(language); + Leopard leopard; + try { + leopard = await Leopard.create(accessKey, + modelPath, + enableDiarization: true + ); + } on LeopardException catch (ex) { + expect(ex, equals(null), + reason: "Failed to initialize Leopard for $language: ${ex.message}"); + return; + } + + String audioPath = await extractAudioFile(audioFile); + LeopardTranscript res = await leopard.processFile(audioPath); + leopard.delete(); + + expect(res.words.length, expectedWords.length); + for (var i = 0; i < res.words.length; i++) { + expect(res.words[i].word, expectedWords[i]["word"]); + expect(res.words[i].speakerTag, expectedWords[i]["speaker_tag"]); + } } }); }); diff --git a/demo/flutter/ios/Podfile b/demo/flutter/ios/Podfile index 313ea4a1..a6d680e8 100644 --- a/demo/flutter/ios/Podfile +++ b/demo/flutter/ios/Podfile @@ -1,5 +1,5 @@ # Uncomment this line to define a global platform for your project -platform :ios, '11.0' +platform :ios, '13.0' # CocoaPods analytics sends network stats synchronously affecting flutter build latency. ENV['COCOAPODS_DISABLE_STATS'] = 'true' @@ -28,6 +28,8 @@ require File.expand_path(File.join('packages', 'flutter_tools', 'bin', 'podhelpe flutter_ios_podfile_setup target 'Runner' do + pod 'Leopard-iOS', '~> 2.0.0' + use_frameworks! use_modular_headers! diff --git a/demo/flutter/ios/Podfile.lock b/demo/flutter/ios/Podfile.lock index fbd788bc..82ca11c8 100644 --- a/demo/flutter/ios/Podfile.lock +++ b/demo/flutter/ios/Podfile.lock @@ -6,20 +6,20 @@ PODS: - integration_test (0.0.1): - Flutter - ios-voice-processor (1.1.0) - - Leopard-iOS (1.2.0) - - leopard_flutter (1.2.1): + - Leopard-iOS (2.0.0) + - leopard_flutter (2.0.0): - Flutter - - Leopard-iOS (~> 1.2.0) - - path_provider_foundation (0.0.1): + - Leopard-iOS (~> 2.0.0) + - path_provider_ios (0.0.1): - Flutter - - FlutterMacOS DEPENDENCIES: - Flutter (from `Flutter`) - flutter_voice_processor (from `.symlinks/plugins/flutter_voice_processor/ios`) - integration_test (from `.symlinks/plugins/integration_test/ios`) + - Leopard-iOS (~> 2.0.0) - leopard_flutter (from `.symlinks/plugins/leopard_flutter/ios`) - - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`) + - path_provider_ios (from `.symlinks/plugins/path_provider_ios/ios`) SPEC REPOS: trunk: @@ -35,18 +35,18 @@ EXTERNAL SOURCES: :path: ".symlinks/plugins/integration_test/ios" leopard_flutter: :path: ".symlinks/plugins/leopard_flutter/ios" - path_provider_foundation: - :path: ".symlinks/plugins/path_provider_foundation/ios" + path_provider_ios: + :path: ".symlinks/plugins/path_provider_ios/ios" SPEC CHECKSUMS: - Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 flutter_voice_processor: 53afbf59ad3feb82f4a379fea9ed8dc98495210f - integration_test: a1e7d09bd98eca2fc37aefd79d4f41ad37bdbbe5 + integration_test: 13825b8a9334a850581300559b8839134b124670 ios-voice-processor: 8e32d7f980a06d392d128ef1cd19cf6ddcaca3c1 - Leopard-iOS: 993bdc6fbdaabfdaa0ddc5def9bd4405abb59bef - leopard_flutter: ff034f74398123f3ac16ea21cd4b77dc81b92341 - path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9 + Leopard-iOS: ba60cf23fb79ffc01bbefbbd4e063cb2a102f352 + leopard_flutter: 7e55a7ee805767993c1a619bb42d9ea27cc0e557 + path_provider_ios: 14f3d2fd28c4fdb42f44e0f751d12861c43cee02 -PODFILE CHECKSUM: 7368163408c647b7eb699d0d788ba6718e18fb8d +PODFILE CHECKSUM: 6ed218c2faead9ce1b148555a3a1ee47d8258622 COCOAPODS: 1.11.3 diff --git a/demo/flutter/lib/main.dart b/demo/flutter/lib/main.dart index e3bd3f23..bf50d7e9 100644 --- a/demo/flutter/lib/main.dart +++ b/demo/flutter/lib/main.dart @@ -81,8 +81,10 @@ class _MyAppState extends State { final String modelPath = "assets/models/leopard_params$suffix.pv"; try { - _leopard = await Leopard.create(accessKey, modelPath, - enableAutomaticPunctuation: true); + _leopard = await Leopard.create(accessKey, + modelPath, + enableAutomaticPunctuation: true, + enableDiarization: true); _micRecorder = await MicRecorder.create( _leopard!.sampleRate, recordedCallback, errorCallback); setState(() { @@ -90,9 +92,6 @@ class _MyAppState extends State { "Press START to start recording some audio to transcribe"; isButtonDisabled = false; }); - } on LeopardInvalidArgumentException catch (ex) { - errorCallback(LeopardInvalidArgumentException( - "${ex.message}\nEnsure your accessKey '$accessKey' is a valid access key.")); } on LeopardActivationException { errorCallback(LeopardActivationException("AccessKey activation error.")); } on LeopardActivationLimitException { @@ -276,6 +275,10 @@ class _MyAppState extends State { Text('${(leopardWord.confidence * 100).toStringAsFixed(0)}%', style: TextStyle(color: Colors.white)) ]), + Column(children: [ + Text('${leopardWord.speakerTag}', + style: TextStyle(color: Colors.white)) + ]), ]); }).toList(); @@ -295,6 +298,7 @@ class _MyAppState extends State { Column(children: [Text("Start")]), Column(children: [Text("End")]), Column(children: [Text("Confidence")]), + Column(children: [Text("Tag")]), ]) ])), Flexible( diff --git a/demo/flutter/pubspec.lock b/demo/flutter/pubspec.lock index 8b7a3bc2..d556c0e5 100644 --- a/demo/flutter/pubspec.lock +++ b/demo/flutter/pubspec.lock @@ -1,83 +1,70 @@ # Generated by pub # See https://dart.dev/tools/pub/glossary#lockfile packages: - archive: - dependency: transitive - description: - name: archive - url: "https://pub.dartlang.org" - source: hosted - version: "3.1.11" async: dependency: transitive description: name: async - url: "https://pub.dartlang.org" + sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" + url: "https://pub.dev" source: hosted - version: "2.8.2" + version: "2.11.0" boolean_selector: dependency: transitive description: name: boolean_selector - url: "https://pub.dartlang.org" + sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" characters: dependency: transitive description: name: characters - url: "https://pub.dartlang.org" - source: hosted - version: "1.2.0" - charcode: - dependency: transitive - description: - name: charcode - url: "https://pub.dartlang.org" + sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" + url: "https://pub.dev" source: hosted - version: "1.3.1" + version: "1.3.0" clock: dependency: transitive description: name: clock - url: "https://pub.dartlang.org" + sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" collection: dependency: transitive description: name: collection - url: "https://pub.dartlang.org" - source: hosted - version: "1.16.0" - crypto: - dependency: transitive - description: - name: crypto - url: "https://pub.dartlang.org" + sha256: "4a07be6cb69c84d677a6c3096fcf960cc3285a8330b4603e0d463d15d9bd934c" + url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "1.17.1" fake_async: dependency: transitive description: name: fake_async - url: "https://pub.dartlang.org" + sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "1.3.1" ffi: dependency: transitive description: name: ffi - url: "https://pub.dartlang.org" + sha256: "13a6ccf6a459a125b3fcdb6ec73bd5ff90822e071207c663bfd1f70062d51d18" + url: "https://pub.dev" source: hosted - version: "2.0.1" + version: "1.2.1" file: dependency: transitive description: name: file - url: "https://pub.dartlang.org" + sha256: "1b92bec4fc2a72f59a8e15af5f52cd441e4a7860b49499d69dfa817af20e925d" + url: "https://pub.dev" source: hosted - version: "6.1.2" + version: "6.1.4" flutter: dependency: "direct main" description: flutter @@ -97,7 +84,8 @@ packages: dependency: "direct main" description: name: flutter_voice_processor - url: "https://pub.dartlang.org" + sha256: fb511a2f0ca9540c4b7c6715515389d27b5bbd332138ab3a300078fb243a0caf + url: "https://pub.dev" source: hosted version: "1.1.0" fuchsia_remote_debug_protocol: @@ -110,109 +98,140 @@ packages: description: flutter source: sdk version: "0.0.0" + js: + dependency: transitive + description: + name: js + sha256: f2c445dce49627136094980615a031419f7f3eb393237e4ecd97ac15dea343f3 + url: "https://pub.dev" + source: hosted + version: "0.6.7" leopard_flutter: dependency: "direct main" description: name: leopard_flutter - url: "https://pub.dartlang.org" + sha256: "663317479ca5ad59502dce320fc438164502fb3f4b54559afe30ec149692a62e" + url: "https://pub.dev" source: hosted - version: "1.2.1" + version: "2.0.0" lints: dependency: "direct dev" description: name: lints - url: "https://pub.dartlang.org" + sha256: a2c3d198cb5ea2e179926622d433331d8b58374ab8f29cdda6e863bd62fd369c + url: "https://pub.dev" source: hosted version: "1.0.1" matcher: dependency: transitive description: name: matcher - url: "https://pub.dartlang.org" + sha256: "6501fbd55da300384b768785b83e5ce66991266cec21af89ab9ae7f5ce1c4cbb" + url: "https://pub.dev" source: hosted - version: "0.12.11" + version: "0.12.15" material_color_utilities: dependency: transitive description: name: material_color_utilities - url: "https://pub.dartlang.org" + sha256: d92141dc6fe1dad30722f9aa826c7fbc896d021d792f80678280601aff8cf724 + url: "https://pub.dev" source: hosted - version: "0.1.4" + version: "0.2.0" meta: dependency: transitive description: name: meta - url: "https://pub.dartlang.org" + sha256: "3c74dbf8763d36539f114c799d8a2d87343b5067e9d796ca22b5eb8437090ee3" + url: "https://pub.dev" source: hosted - version: "1.7.0" + version: "1.9.1" path: dependency: transitive description: name: path - url: "https://pub.dartlang.org" + sha256: "8829d8a55c13fc0e37127c29fedf290c102f4e40ae94ada574091fe0ff96c917" + url: "https://pub.dev" source: hosted - version: "1.8.1" + version: "1.8.3" path_provider: dependency: "direct main" description: name: path_provider - url: "https://pub.dartlang.org" + sha256: "050e8e85e4b7fecdf2bb3682c1c64c4887a183720c802d323de8a5fd76d372dd" + url: "https://pub.dev" source: hosted - version: "2.0.14" + version: "2.0.11" path_provider_android: dependency: transitive description: name: path_provider_android - url: "https://pub.dartlang.org" + sha256: "4d5542667150f5b779ba411dd5dc0b674a85d1355e45bda2877e0e82f4ad08d8" + url: "https://pub.dev" source: hosted - version: "2.0.16" - path_provider_foundation: + version: "2.0.20" + path_provider_ios: dependency: transitive description: - name: path_provider_foundation - url: "https://pub.dartlang.org" + name: path_provider_ios + sha256: "03d639406f5343478352433f00d3c4394d52dac8df3d847869c5e2333e0bbce8" + url: "https://pub.dev" source: hosted - version: "2.2.0" + version: "2.0.11" path_provider_linux: dependency: transitive description: name: path_provider_linux - url: "https://pub.dartlang.org" + sha256: ab0987bf95bc591da42dffb38c77398fc43309f0b9b894dcc5d6f40c4b26c379 + url: "https://pub.dev" source: hosted version: "2.1.7" + path_provider_macos: + dependency: transitive + description: + name: path_provider_macos + sha256: "2a97e7fbb7ae9dcd0dfc1220a78e9ec3e71da691912e617e8715ff2a13086ae8" + url: "https://pub.dev" + source: hosted + version: "2.0.6" path_provider_platform_interface: dependency: transitive description: name: path_provider_platform_interface - url: "https://pub.dartlang.org" + sha256: "27dc7a224fcd07444cb5e0e60423ccacea3e13cf00fc5282ac2c918132da931d" + url: "https://pub.dev" source: hosted version: "2.0.4" path_provider_windows: dependency: transitive description: name: path_provider_windows - url: "https://pub.dartlang.org" + sha256: a34ecd7fb548f8e57321fd8e50d865d266941b54e6c3b7758cf8f37c24116905 + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.0.7" platform: dependency: transitive description: name: platform - url: "https://pub.dartlang.org" + sha256: "4a451831508d7d6ca779f7ac6e212b4023dd5a7d08a27a63da33756410e32b76" + url: "https://pub.dev" source: hosted version: "3.1.0" plugin_platform_interface: dependency: transitive description: name: plugin_platform_interface - url: "https://pub.dartlang.org" + sha256: "075f927ebbab4262ace8d0b283929ac5410c0ac4e7fc123c76429564facfb757" + url: "https://pub.dev" source: hosted version: "2.1.2" process: dependency: transitive description: name: process - url: "https://pub.dartlang.org" + sha256: "53fd8db9cec1d37b0574e12f07520d582019cb6c44abf5479a01505099a34a09" + url: "https://pub.dev" source: hosted version: "4.2.4" sky_engine: @@ -224,93 +243,98 @@ packages: dependency: transitive description: name: source_span - url: "https://pub.dartlang.org" + sha256: dd904f795d4b4f3b870833847c461801f6750a9fa8e61ea5ac53f9422b31f250 + url: "https://pub.dev" source: hosted - version: "1.8.2" + version: "1.9.1" stack_trace: dependency: transitive description: name: stack_trace - url: "https://pub.dartlang.org" + sha256: c3c7d8edb15bee7f0f74debd4b9c5f3c2ea86766fe4178eb2a18eb30a0bdaed5 + url: "https://pub.dev" source: hosted - version: "1.10.0" + version: "1.11.0" stream_channel: dependency: transitive description: name: stream_channel - url: "https://pub.dartlang.org" + sha256: "83615bee9045c1d322bbbd1ba209b7a749c2cbcdcb3fdd1df8eb488b3279c1c8" + url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - url: "https://pub.dartlang.org" + sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" sync_http: dependency: transitive description: name: sync_http - url: "https://pub.dartlang.org" + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" source: hosted - version: "0.3.0" + version: "0.3.1" term_glyph: dependency: transitive description: name: term_glyph - url: "https://pub.dartlang.org" + sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 + url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.2.1" test_api: dependency: transitive description: name: test_api - url: "https://pub.dartlang.org" - source: hosted - version: "0.4.9" - typed_data: - dependency: transitive - description: - name: typed_data - url: "https://pub.dartlang.org" + sha256: eb6ac1540b26de412b3403a163d919ba86f6a973fe6cc50ae3541b80092fdcfb + url: "https://pub.dev" source: hosted - version: "1.3.0" + version: "0.5.1" vector_math: dependency: transitive description: name: vector_math - url: "https://pub.dartlang.org" + sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" + url: "https://pub.dev" source: hosted - version: "2.1.2" + version: "2.1.4" vm_service: dependency: transitive description: name: vm_service - url: "https://pub.dartlang.org" + sha256: f6deed8ed625c52864792459709183da231ebf66ff0cf09e69b573227c377efe + url: "https://pub.dev" source: hosted - version: "8.2.2" + version: "11.3.0" webdriver: dependency: transitive description: name: webdriver - url: "https://pub.dartlang.org" + sha256: "3c923e918918feeb90c4c9fdf1fe39220fa4c0e8e2c0fffaded174498ef86c49" + url: "https://pub.dev" source: hosted - version: "3.0.0" + version: "3.0.2" win32: dependency: transitive description: name: win32 - url: "https://pub.dartlang.org" + sha256: "4658d864d83cdaedcbf3e65ad93b71880a3e8c9ee1ff15d855f88fb2da66cb8a" + url: "https://pub.dev" source: hosted - version: "2.7.0" + version: "2.5.2" xdg_directories: dependency: transitive description: name: xdg_directories - url: "https://pub.dartlang.org" + sha256: "060b6e1c891d956f72b5ac9463466c37cce3fa962a921532fc001e86fe93438e" + url: "https://pub.dev" source: hosted version: "0.2.0+1" sdks: - dart: ">=2.17.0 <3.0.0" - flutter: ">=3.0.0" + dart: ">=3.0.0-0 <4.0.0" + flutter: ">=2.8.1" diff --git a/demo/flutter/pubspec.yaml b/demo/flutter/pubspec.yaml index 46399904..f8d05ee9 100644 --- a/demo/flutter/pubspec.yaml +++ b/demo/flutter/pubspec.yaml @@ -15,7 +15,7 @@ dependencies: path_provider: ^2.0.9 flutter_voice_processor: ^1.1.0 - leopard_flutter: ^1.2.1 + leopard_flutter: ^2.0.0 dev_dependencies: integration_test: diff --git a/demo/flutter/scripts/prepare_demo.dart b/demo/flutter/scripts/prepare_demo.dart index c369ab62..8728d57f 100644 --- a/demo/flutter/scripts/prepare_demo.dart +++ b/demo/flutter/scripts/prepare_demo.dart @@ -21,7 +21,7 @@ Future readJsonFile(String filePath) async { void main(List arguments) async { var testData = await readJsonFile(testDataPath); List availableLanguages = List.from( - testData["tests"]["parameters"].map((x) => x["language"]).toList()); + testData["tests"]["language_tests"].map((x) => x["language"]).toList()); if (arguments.isEmpty) { print( diff --git a/demo/go-grpc/go.mod b/demo/go-grpc/go.mod index cca6ac35..ba8cbe37 100644 --- a/demo/go-grpc/go.mod +++ b/demo/go-grpc/go.mod @@ -3,7 +3,7 @@ module leopardgogrpc go 1.18 require ( - github.com/Picovoice/leopard/binding/go v1.2.0 + github.com/Picovoice/leopard/binding/go/v2 v2.0.0 github.com/golang/protobuf v1.5.2 github.com/google/uuid v1.3.0 google.golang.org/grpc v1.53.0 diff --git a/demo/go-grpc/go.sum b/demo/go-grpc/go.sum index 893bdf4f..bae7f867 100644 --- a/demo/go-grpc/go.sum +++ b/demo/go-grpc/go.sum @@ -1,5 +1,5 @@ -github.com/Picovoice/leopard/binding/go v1.2.0 h1:NbUW+Fni5UydvcFlMx8RZtk2pccFaRJFG14kGaUa4CA= -github.com/Picovoice/leopard/binding/go v1.2.0/go.mod h1:5kaEg9ZcH2dLkrX/H1xMVF6QFM7l3vd9GKxeXSanA8s= +github.com/Picovoice/leopard/binding/go/v2 v2.0.0 h1:aP85gpRWgPsTifbKk1FueqLNKYcKa5EqasZLsNylaqE= +github.com/Picovoice/leopard/binding/go/v2 v2.0.0/go.mod h1:/rYUeRDH4xBgtwBe9D8BwHIauPJ+M7czqLfyeJQJu7c= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= diff --git a/demo/go-grpc/server.go b/demo/go-grpc/server.go index b8bd77ee..3f58f970 100644 --- a/demo/go-grpc/server.go +++ b/demo/go-grpc/server.go @@ -3,7 +3,7 @@ package main import ( "flag" "fmt" - leopard "github.com/Picovoice/leopard/binding/go" + leopard "github.com/Picovoice/leopard/binding/go/v2" "github.com/google/uuid" "google.golang.org/grpc" "io" diff --git a/demo/go/filedemo/leopard_file_demo.go b/demo/go/filedemo/leopard_file_demo.go index 7e3fef2e..0e1cd392 100644 --- a/demo/go/filedemo/leopard_file_demo.go +++ b/demo/go/filedemo/leopard_file_demo.go @@ -17,7 +17,7 @@ import ( "os" "path/filepath" - leopard "github.com/Picovoice/leopard/binding/go" + leopard "github.com/Picovoice/leopard/binding/go/v2" ) func main() { @@ -25,8 +25,9 @@ func main() { modelPathArg := flag.String("model_path", "", "Path to Leopard model file") libraryPathArg := flag.String("library_path", "", "Path to Leopard's dynamic library file") disableAutomaticPunctuationArg := flag.Bool("disable_automatic_punctuation", false, "Disable automatic punctuation") + disableSpeakerDiarizationArg := flag.Bool("disable_speaker_diarization", false, "Disable speaker diarization") verboseArg := flag.Bool("verbose", false, "Enable verbose logging") - inputAudioPathArg := flag.String("input_audio_path", "", "Path to input audio file (mono, valid: `3gp (AMR)`, `FLAC`, `MP3`, `MP4/m4a (AAC)`, `Ogg`, `WAV`, `WebM`, 16-bit)") + inputAudioPathArg := flag.String("input_audio_path", "", "Path to input audio file (mono, 16-bit, valid formats: 3gp (AMR), FLAC, MP3, MP4/m4a (AAC), Ogg, WAV, WebM)") flag.Parse() @@ -43,6 +44,8 @@ func main() { l := leopard.NewLeopard(*accessKeyArg) l.EnableAutomaticPunctuation = !*disableAutomaticPunctuationArg + l.EnableDiarization = !*disableSpeakerDiarizationArg + defer func() { err := l.Delete() if err != nil { @@ -84,9 +87,9 @@ func main() { fmt.Println(transcript) if *verboseArg { - fmt.Printf("|%10s | %15s | %15s | %10s|\n", "word", "Start in Sec", "End in Sec", "Confidence") + fmt.Printf("|%10s | %10s | %10s | %10s | %10s|\n", "Word", "Start (s)", "End (s)", "Confidence", "Speaker Tag") for _, word := range words { - fmt.Printf("|%10s | %15.2f | %15.2f | %10.2f|\n", word.Word, word.StartSec, word.EndSec, word.Confidence) + fmt.Printf("|%10s | %10.2f | %10.2f | %10.2f | %11d|\n", word.Word, word.StartSec, word.EndSec, word.Confidence, word.SpeakerTag) } } } diff --git a/demo/go/go.mod b/demo/go/go.mod index 972a87a7..cfeb398c 100644 --- a/demo/go/go.mod +++ b/demo/go/go.mod @@ -3,7 +3,7 @@ module leoparddemo go 1.16 require ( - github.com/Picovoice/leopard/binding/go v1.2.0 + github.com/Picovoice/leopard/binding/go/v2 v2.0.0 github.com/Picovoice/pvrecorder/binding/go v1.2.1 github.com/agnivade/levenshtein v1.1.1 // indirect ) diff --git a/demo/go/go.sum b/demo/go/go.sum index 54fffd8b..e68d1e43 100644 --- a/demo/go/go.sum +++ b/demo/go/go.sum @@ -1,5 +1,5 @@ -github.com/Picovoice/leopard/binding/go v1.2.0 h1:NbUW+Fni5UydvcFlMx8RZtk2pccFaRJFG14kGaUa4CA= -github.com/Picovoice/leopard/binding/go v1.2.0/go.mod h1:5kaEg9ZcH2dLkrX/H1xMVF6QFM7l3vd9GKxeXSanA8s= +github.com/Picovoice/leopard/binding/go/v2 v2.0.0 h1:aP85gpRWgPsTifbKk1FueqLNKYcKa5EqasZLsNylaqE= +github.com/Picovoice/leopard/binding/go/v2 v2.0.0/go.mod h1:/rYUeRDH4xBgtwBe9D8BwHIauPJ+M7czqLfyeJQJu7c= github.com/Picovoice/pvrecorder/binding/go v1.2.1 h1:p99fkYMFbTS4g4WwbhSPkT9PHvlEoVYGaNoqxCITiEo= github.com/Picovoice/pvrecorder/binding/go v1.2.1/go.mod h1:gQdvBAjoKmRxMFh8W9cVKWcqHsWvu+d13sCPVFm7dhg= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= diff --git a/demo/go/micdemo/leopard_mic_demo.go b/demo/go/micdemo/leopard_mic_demo.go index b12069a0..e3fd6d56 100644 --- a/demo/go/micdemo/leopard_mic_demo.go +++ b/demo/go/micdemo/leopard_mic_demo.go @@ -19,7 +19,7 @@ import ( "os/signal" "path/filepath" - leopard "github.com/Picovoice/leopard/binding/go" + leopard "github.com/Picovoice/leopard/binding/go/v2" pvrecorder "github.com/Picovoice/pvrecorder/binding/go" ) @@ -44,6 +44,7 @@ func main() { modelPathArg := flag.String("model_path", "", "Path to Leopard model file") libraryPathArg := flag.String("library_path", "", "Path to Leopard's dynamic library file") disableAutomaticPunctuationArg := flag.Bool("disable_automatic_punctuation", false, "Disable automatic punctuation") + disableSpeakerDiarizationArg := flag.Bool("disable_speaker_diarization", false, "Disable speaker diarization") verboseArg := flag.Bool("verbose", false, "Enable verbose logging") audioDeviceIndex := flag.Int("audio_device_index", -1, "Index of capture device to use.") showAudioDevices := flag.Bool("show_audio_devices", false, "Display all available capture devices") @@ -56,6 +57,7 @@ func main() { l := leopard.NewLeopard(*accessKeyArg) l.EnableAutomaticPunctuation = !*disableAutomaticPunctuationArg + l.EnableDiarization = !*disableSpeakerDiarizationArg // validate library path if *libraryPathArg != "" { @@ -139,9 +141,9 @@ func main() { fmt.Printf("%s\n\n", transcript) if *verboseArg { - fmt.Printf("|%10s | %15s | %15s | %10s|\n", "word", "Start in Sec", "End in Sec", "Confidence") + fmt.Printf("|%10s | %10s | %10s | %10s | %10s|\n", "Word", "Start (s)", "End (s)", "Confidence", "Speaker Tag") for _, word := range words { - fmt.Printf("|%10s | %15.2f | %15.2f | %10.2f|\n", word.Word, word.StartSec, word.EndSec, word.Confidence) + fmt.Printf("|%10s | %10.2f | %10.2f | %10.2f | %11d|\n", word.Word, word.StartSec, word.EndSec, word.Confidence, word.SpeakerTag) } } } else { diff --git a/demo/ios/LeopardDemo/LeopardDemo/ContentView.swift b/demo/ios/LeopardDemo/LeopardDemo/ContentView.swift index 0114c326..c43db34b 100644 --- a/demo/ios/LeopardDemo/LeopardDemo/ContentView.swift +++ b/demo/ios/LeopardDemo/LeopardDemo/ContentView.swift @@ -44,6 +44,9 @@ struct ContentView: View { .font(.system(size: 14.0)) .frame(minWidth: metrics.size.width * 0.15, alignment: .center) Text("Confidence") + .font(.system(size: 14.0)) + .frame(minWidth: metrics.size.width * 0.2, alignment: .center) + Text("Tag") .font(.system(size: 14.0)) .frame(minWidth: metrics.size.width * 0.15, alignment: .center) } @@ -58,22 +61,22 @@ struct ContentView: View { .frame(minWidth: metrics.size.width * 0.3, alignment: .center) .foregroundColor(.white) .font(.system(size: 14.0)) - .padding(6) Text(String(format: "%.1fs", word.startSec)) .frame(minWidth: metrics.size.width * 0.15, alignment: .center) .foregroundColor(.white) .font(.system(size: 14.0)) - .padding(6) Text(String(format: "%.1fs", word.endSec)) .frame(minWidth: metrics.size.width * 0.15, alignment: .center) .foregroundColor(.white) .font(.system(size: 14.0)) - .padding(6) Text(String(format: "%.0f%%", word.confidence * 100)) + .frame(minWidth: metrics.size.width * 0.2, alignment: .center) + .foregroundColor(.white) + .font(.system(size: 14.0)) + Text(String(format: "%d", word.speakerTag)) .frame(minWidth: metrics.size.width * 0.15, alignment: .center) .foregroundColor(.white) .font(.system(size: 14.0)) - .padding(6) } .background( Color(red: 0, green: 229 / 255, blue: 195 / 255, opacity: 0.1) diff --git a/demo/ios/LeopardDemo/LeopardDemo/ViewModel.swift b/demo/ios/LeopardDemo/LeopardDemo/ViewModel.swift index 87540f40..d31ffc48 100644 --- a/demo/ios/LeopardDemo/LeopardDemo/ViewModel.swift +++ b/demo/ios/LeopardDemo/LeopardDemo/ViewModel.swift @@ -1,5 +1,5 @@ // -// Copyright 2022 Picovoice Inc. +// Copyright 2022-2023 Picovoice Inc. // You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" // file accompanying this source. // Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on @@ -56,8 +56,7 @@ class ViewModel: ObservableObject { modelPath: modelPath, enableAutomaticPunctuation: true) state = UIState.READY - } catch let error as LeopardInvalidArgumentError { - errorMessage = "\(error.localizedDescription)\nEnsure your AccessKey '\(ACCESS_KEY)' is valid." + return } catch is LeopardActivationError { errorMessage = "ACCESS_KEY activation error" } catch is LeopardActivationRefusedError { @@ -67,8 +66,10 @@ class ViewModel: ObservableObject { } catch is LeopardActivationThrottledError { errorMessage = "ACCESS_KEY is throttled" } catch { - errorMessage = "\(error)" + errorMessage = "\(error.localizedDescription)" } + + state = UIState.ERROR } public func destroy() { diff --git a/demo/ios/LeopardDemo/Podfile b/demo/ios/LeopardDemo/Podfile index e0146671..41ada9de 100644 --- a/demo/ios/LeopardDemo/Podfile +++ b/demo/ios/LeopardDemo/Podfile @@ -1,6 +1,6 @@ source 'https://cdn.cocoapods.org/' -platform :ios, '11.0' +platform :ios, '13.0' target 'LeopardDemo' do - pod 'Leopard-iOS', '~> 1.2.0' + pod 'Leopard-iOS', '~> 2.0.0' end diff --git a/demo/ios/LeopardDemo/Podfile.lock b/demo/ios/LeopardDemo/Podfile.lock index 7e1fbe79..4e27ba10 100644 --- a/demo/ios/LeopardDemo/Podfile.lock +++ b/demo/ios/LeopardDemo/Podfile.lock @@ -1,16 +1,16 @@ PODS: - - Leopard-iOS (1.2.0) + - Leopard-iOS (2.0.0) DEPENDENCIES: - - Leopard-iOS (~> 1.2.0) + - Leopard-iOS (~> 2.0.0) SPEC REPOS: trunk: - Leopard-iOS SPEC CHECKSUMS: - Leopard-iOS: 993bdc6fbdaabfdaa0ddc5def9bd4405abb59bef + Leopard-iOS: ba60cf23fb79ffc01bbefbbd4e063cb2a102f352 -PODFILE CHECKSUM: d96123892aa862388df5042453c1e919dc04e171 +PODFILE CHECKSUM: cbf82c7f761f1b961b38ca393957fe444f1a7ab1 -COCOAPODS: 1.11.2 +COCOAPODS: 1.11.3 diff --git a/demo/java/README.md b/demo/java/README.md index 77cf138c..95302033 100644 --- a/demo/java/README.md +++ b/demo/java/README.md @@ -10,10 +10,10 @@ Leopard is an on-device speech-to-text engine. Leopard is: - Accurate [[1]](https://picovoice.ai/docs/benchmark/stt/#results) - Compact and Computationally-Efficient [[2]](https://github.com/Picovoice/speech-to-text-benchmark#rtf) - Cross-Platform: - - Linux (x86_64), macOS (x86_64, arm64), and Windows (x86_64) - - Android and iOS - - Chrome, Safari, Firefox, and Edge - - Raspberry Pi (4, 3) and NVIDIA Jetson Nano + - Linux (x86_64), macOS (x86_64, arm64), and Windows (x86_64) + - Android and iOS + - Chrome, Safari, Firefox, and Edge + - Raspberry Pi (4, 3) and NVIDIA Jetson Nano ## Compatibility @@ -23,6 +23,7 @@ Leopard is an on-device speech-to-text engine. Leopard is: ## Installation Build the demo jars with Gradle: + ```console cd leopard/demo/java ./gradlew build @@ -30,7 +31,8 @@ cd leopard/demo/java ## AccessKey -Leopard requires a valid Picovoice `AccessKey` at initialization. `AccessKey` acts as your credentials when using Leopard SDKs. +Leopard requires a valid Picovoice `AccessKey` at initialization. `AccessKey` acts as your credentials when using +Leopard SDKs. You can get your `AccessKey` for free. Make sure to keep your `AccessKey` secret. Signup or Login to [Picovoice Console](https://console.picovoice.ai/) to get your `AccessKey`. @@ -52,13 +54,15 @@ java -jar leopard-file-demo.jar -a ${ACCESS_KEY} -i ${AUDIO_PATH} ### Microphone Demo -The microphone demo opens an audio stream from a microphone, records audio and performs speech-to-text transcription from the recorded audio: +The microphone demo opens an audio stream from a microphone, records audio and performs speech-to-text transcription +from the recorded audio: ```console java -jar leopard-mic-demo.jar -a ${ACCESS_KEY} ``` -It is possible that the default audio input device is not the one you wish to use. There are a couple of debugging facilities baked into the demo application to solve this. First, type the following into the console: +It is possible that the default audio input device is not the one you wish to use. There are a couple of debugging +facilities baked into the demo application to solve this. First, type the following into the console: ```console java -jar leopard-mic-demo.jar -sd @@ -73,7 +77,8 @@ Available input devices: Device 1: Microphone Headset USB ``` -You can use the device index to specify which microphone to use for the demo. For instance, if you want to use the Headset microphone in the above example, you can invoke the demo application as below: +You can use the device index to specify which microphone to use for the demo. For instance, if you want to use the +Headset microphone in the above example, you can invoke the demo application as below: ```console java -jar leopard-mic-demo.jar -a ${ACCESS_KEY} -di 1 diff --git a/demo/java/build.gradle b/demo/java/build.gradle index 663d5486..c1ee8c29 100644 --- a/demo/java/build.gradle +++ b/demo/java/build.gradle @@ -15,14 +15,14 @@ sourceSets { } dependencies { - implementation 'ai.picovoice:leopard-java:1.2.0' + implementation 'ai.picovoice:leopard-java:2.0.0' implementation 'commons-cli:commons-cli:1.4' } jar { manifest { attributes "Main-Class": "ai.picovoice.leoparddemo.MicDemo", - "Class-Path": "leopard-1.2.0.jar;commons-cli-1.4.jar" + "Class-Path": "leopard-2.0.0.jar;commons-cli-1.4.jar" } from sourceSets.main.output exclude "**/FileDemo.class" @@ -33,7 +33,7 @@ jar { task fileDemoJar(type: Jar) { manifest { attributes "Main-Class": "ai.picovoice.leoparddemo.FileDemo", - "Class-Path": "leopard-1.2.0.jar;commons-cli-1.4.jar" + "Class-Path": "leopard-2.0.0.jar;commons-cli-1.4.jar" } from sourceSets.main.output exclude "**/MicDemo.class" diff --git a/demo/java/gradle/wrapper/gradle-wrapper.properties b/demo/java/gradle/wrapper/gradle-wrapper.properties index d2880ba8..774fae87 100644 --- a/demo/java/gradle/wrapper/gradle-wrapper.properties +++ b/demo/java/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/demo/java/src/ai/picovoice/leoparddemo/FileDemo.java b/demo/java/src/ai/picovoice/leoparddemo/FileDemo.java index 01cc665c..f6dcfef2 100644 --- a/demo/java/src/ai/picovoice/leoparddemo/FileDemo.java +++ b/demo/java/src/ai/picovoice/leoparddemo/FileDemo.java @@ -25,6 +25,7 @@ public static void runDemo( String modelPath, String libraryPath, boolean enableAutomaticPunctuation, + boolean enableDiarization, boolean verbose, File inputAudioFile) { Leopard leopard = null; @@ -34,21 +35,29 @@ public static void runDemo( .setLibraryPath(libraryPath) .setModelPath(modelPath) .setEnableAutomaticPunctuation(enableAutomaticPunctuation) + .setEnableDiarization(enableDiarization) .build(); LeopardTranscript transcript = leopard.processFile(inputAudioFile.getPath()); System.out.println(transcript.getTranscriptString()); if (verbose) { LeopardTranscript.Word[] words = transcript.getWordArray(); - System.out.format("%14s - %5s - %5s - %5s\n", "word", "start", "end", "confidence"); + System.out.format( + "%14s | %5s | %5s | %10s | %11s\n", + "word", + "start", + "end", + "confidence", + "speaker tag"); for (int i = 0; i < words.length; i++) { System.out.format( - "%2d: %10s - %5.2f - %5.2f - %5.2f\n", + "%2d: %10s | %5.2f | %5.2f | %10.2f | %11d\n", i, words[i].getWord(), words[i].getStartSec(), words[i].getEndSec(), - words[i].getConfidence()); + words[i].getConfidence(), + words[i].getSpeakerTag()); } } @@ -85,6 +94,7 @@ public static void main(String[] args) { String modelPath = cmd.getOptionValue("model_path"); String libraryPath = cmd.getOptionValue("library_path"); boolean enableAutomaticPunctuation = !cmd.hasOption("disable_automatic_punctuation"); + boolean enableDiarization = !cmd.hasOption("disable_speaker_diarization"); boolean verbose = cmd.hasOption("verbose"); String inputAudioPath = cmd.getOptionValue("input_audio_path"); @@ -113,6 +123,7 @@ public static void main(String[] args) { modelPath, libraryPath, enableAutomaticPunctuation, + enableDiarization, verbose, inputAudioFile); } @@ -138,11 +149,16 @@ private static Options buildCommandLineOptions() { .desc("Absolute path to the Leopard native runtime library.") .build()); - options.addOption(Option.builder("d") + options.addOption(Option.builder("dp") .longOpt("disable_automatic_punctuation") .desc("Disable automatic punctuation.") .build()); + options.addOption(Option.builder("dd") + .longOpt("disable_speaker_diarization") + .desc("Disable speaker diarization.") + .build()); + options.addOption(Option.builder("i") .longOpt("input_audio_path") .hasArg(true) diff --git a/demo/java/src/ai/picovoice/leoparddemo/MicDemo.java b/demo/java/src/ai/picovoice/leoparddemo/MicDemo.java index b8a8af29..8ad3319d 100644 --- a/demo/java/src/ai/picovoice/leoparddemo/MicDemo.java +++ b/demo/java/src/ai/picovoice/leoparddemo/MicDemo.java @@ -20,14 +20,13 @@ import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.util.ArrayList; -import java.util.List; import java.util.Scanner; class Recorder extends Thread { private TargetDataLine micDataLine = null; private boolean stop = false; private boolean isRecording = false; - private List pcmBuffer = null; + private ArrayList pcmBuffer = null; public Recorder(int audioDeviceIndex) { AudioFormat format = new AudioFormat(16000f, 16, 1, true, false); @@ -46,7 +45,7 @@ public Recorder(int audioDeviceIndex) { this.micDataLine = micDataLine; this.stop = false; this.isRecording = false; - this.pcmBuffer = new ArrayList(); + this.pcmBuffer = new ArrayList<>(); } private static TargetDataLine getDefaultCaptureDevice(DataLine.Info dataLineInfo) throws LineUnavailableException { @@ -93,8 +92,8 @@ public void run() { while (!stop) { micDataLine.read(captureBuffer.array(), 0, captureBuffer.capacity()); captureBuffer.asShortBuffer().get(shortBuffer); - for (int i = 0; i < shortBuffer.length; ++i) { - this.pcmBuffer.add(shortBuffer[i]); + for (short value : shortBuffer) { + this.pcmBuffer.add(value); } } } @@ -106,7 +105,7 @@ public void end() { public short[] getPCM() { short[] pcm = new short[this.pcmBuffer.size()]; for (int i = 0; i < this.pcmBuffer.size(); ++i) { - pcm[i] = (short) this.pcmBuffer.get(i); + pcm[i] = this.pcmBuffer.get(i); } return pcm; } @@ -118,6 +117,7 @@ public static void runDemo( String modelPath, String libraryPath, boolean enableAutomaticPunctuation, + boolean enableDiarization, boolean verbose, int audioDeviceIndex) { Leopard leopard = null; @@ -127,6 +127,7 @@ public static void runDemo( .setModelPath(modelPath) .setLibraryPath(libraryPath) .setEnableAutomaticPunctuation(enableAutomaticPunctuation) + .setEnableDiarization(enableDiarization) .build(); System.out.println("Leopard version : " + leopard.getVersion()); @@ -148,15 +149,22 @@ public static void runDemo( System.out.println(transcript.getTranscriptString() + "\n"); if (verbose) { LeopardTranscript.Word[] words = transcript.getWordArray(); - System.out.format("%14s - %5s - %5s - %5s\n", "word", "start", "end", "confidence"); + System.out.format( + "%14s | %5s | %5s | %10s | %11s\n", + "word", + "start", + "end", + "confidence", + "speaker tag"); for (int i = 0; i < words.length; i++) { System.out.format( - "%2d: %10s - %5.2f - %5.2f - %5.2f\n", + "%2d: %10s | %5.2f | %5.2f | %10.2f | %11d\n", i, words[i].getWord(), words[i].getStartSec(), words[i].getEndSec(), - words[i].getConfidence()); + words[i].getConfidence(), + words[i].getSpeakerTag()); } } recorder = null; @@ -222,6 +230,7 @@ public static void main(String[] args) { String modelPath = cmd.getOptionValue("model_path"); String libraryPath = cmd.getOptionValue("library_path"); boolean enableAutomaticPunctuation = !cmd.hasOption("disable_automatic_punctuation"); + boolean enableDiarization = !cmd.hasOption("disable_speaker_diarization"); boolean verbose = cmd.hasOption("verbose"); String audioDeviceIndexStr = cmd.getOptionValue("audio_device_index"); @@ -256,6 +265,7 @@ public static void main(String[] args) { modelPath, libraryPath, enableAutomaticPunctuation, + enableDiarization, verbose, audioDeviceIndex); } @@ -281,11 +291,16 @@ private static Options buildCommandLineOptions() { .desc("Absolute path to the Leopard native runtime library.") .build()); - options.addOption(Option.builder("d") + options.addOption(Option.builder("dp") .longOpt("disable_automatic_punctuation") .desc("Disable automatic punctuation.") .build()); + options.addOption(Option.builder("dd") + .longOpt("disable_speaker_diarization") + .desc("Disable speaker diarization.") + .build()); + options.addOption(Option.builder("di") .longOpt("audio_device_index") .hasArg(true) diff --git a/demo/nodejs/file.js b/demo/nodejs/file.js index ab317f19..a643498b 100755 --- a/demo/nodejs/file.js +++ b/demo/nodejs/file.js @@ -1,6 +1,6 @@ #! /usr/bin/env node // -// Copyright 2020 Picovoice Inc. +// Copyright 2022-2023 Picovoice Inc. // // You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" // file accompanying this source. @@ -31,7 +31,8 @@ program "absolute path to leopard dynamic library" ) .option("-m, --model_file_path ", "absolute path to leopard model") - .option("-d, --disable_automatic_punctuation", "disable automatic punctuation") + .option("-p, --disable_automatic_punctuation", "disable automatic punctuation") + .option("-d, --disable_speaker_diarization", "disable speaker diarization") .option("-v, --verbose", "verbose mode, prints metadata"); @@ -46,6 +47,7 @@ function fileDemo() { let libraryFilePath = program["library_file_path"]; let modelFilePath = program["model_file_path"]; let disableAutomaticPunctuation = program["disable_automatic_punctuation"]; + let disableSpeakerDiarization = program["disable_speaker_diarization"]; let verbose = program["verbose"]; let engineInstance = new Leopard( @@ -53,7 +55,8 @@ function fileDemo() { { 'modelPath': modelFilePath, 'libraryPath': libraryFilePath, - 'enableAutomaticPunctuation': !disableAutomaticPunctuation + 'enableAutomaticPunctuation': !disableAutomaticPunctuation, + 'enableDiarization': !disableSpeakerDiarization } ); @@ -69,10 +72,11 @@ function fileDemo() { console.table( res.words.map(word => { return { - "word": word.word, - "Start time in Sec": word.startSec.toFixed(2), - "End time in Sec": word.endSec.toFixed(2), - "Confidence": word.confidence.toFixed(2) + "Word": word.word, + "Start time (s)": word.startSec.toFixed(2), + "End time (s)": word.endSec.toFixed(2), + "Confidence": word.confidence.toFixed(2), + "Speaker Tag": word.speakerTag }; }) ); diff --git a/demo/nodejs/mic.js b/demo/nodejs/mic.js index 6a0206e0..e8ed9656 100755 --- a/demo/nodejs/mic.js +++ b/demo/nodejs/mic.js @@ -35,7 +35,8 @@ program -1 ) .option("-s, --show_audio_devices", "show the list of available devices") - .option("-d, --disable_automatic_punctuation", "disable automatic punctuation") + .option("-p, --disable_automatic_punctuation", "disable automatic punctuation") + .option("-d, --disable_speaker_diarization", "disable speaker diarization") .option("-v, --verbose", "verbose mode, prints metadata"); if (process.argv.length < 1) { @@ -52,6 +53,7 @@ async function micDemo() { let audioDeviceIndex = program["audio_device_index"]; let showAudioDevices = program["show_audio_devices"]; let disableAutomaticPunctuation = program["disable_automatic_punctuation"]; + let disableSpeakerDiarization = program["disable_speaker_diarization"]; let verbose = program["verbose"]; let showAudioDevicesDefined = showAudioDevices !== undefined; @@ -74,7 +76,8 @@ async function micDemo() { { 'modelPath': modelFilePath, 'libraryPath': libraryFilePath, - 'enableAutomaticPunctuation': !disableAutomaticPunctuation + 'enableAutomaticPunctuation': !disableAutomaticPunctuation, + 'enableDiarization': !disableSpeakerDiarization }); const recorder = new PvRecorder(PV_RECORDER_FRAME_LENGTH, audioDeviceIndex); @@ -112,7 +115,17 @@ async function micDemo() { const res = engineInstance.process(audioFrameInt16) console.log(res.transcript); if (verbose) { - console.table(res.words); + console.table( + res.words.map(word => { + return { + "Word": word.word, + "Start time (s)": word.startSec.toFixed(2), + "End time (s)": word.endSec.toFixed(2), + "Confidence": word.confidence.toFixed(2), + "Speaker Tag": word.speakerTag + }; + }) + ); } } catch (err) { if (err instanceof LeopardActivationLimitReached) { diff --git a/demo/nodejs/package.json b/demo/nodejs/package.json index 174199de..00c8f39b 100644 --- a/demo/nodejs/package.json +++ b/demo/nodejs/package.json @@ -1,6 +1,6 @@ { "name": "@picovoice/leopard-node-demo", - "version": "1.2.2", + "version": "2.0.0", "description": "Picovoice Leopard Node.js file-based and microphone demos", "scripts": { "file": "node file.js", @@ -16,11 +16,12 @@ "author": "Picovoice Inc.", "license": "Apache-2.0", "dependencies": { - "@picovoice/leopard-node": "=1.2.0", + "@picovoice/leopard-node": "=2.0.0", "@picovoice/pvrecorder-node": "=1.2.1", "commander": "^6.1.0", "readline": "^1.3.0", - "wavefile": "^11.0.0" + "wavefile": "^11.0.0", + "prettier": "^2.6.2" }, "devDependencies": {}, "homepage": "https://picovoice.ai/products/leopard/", @@ -30,7 +31,7 @@ "directory": "demo/nodejs" }, "engines": { - "node": ">=12.0.0" + "node": ">=16.0.0" }, "cpu": [ "!ia32", diff --git a/demo/nodejs/yarn.lock b/demo/nodejs/yarn.lock index 74bbc218..9d20d2fe 100644 --- a/demo/nodejs/yarn.lock +++ b/demo/nodejs/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@picovoice/leopard-node@=1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@picovoice/leopard-node/-/leopard-node-1.2.0.tgz#2e210926ede28f61ba1322a1e5ab2a0e794d53e4" - integrity sha512-h86O/mrnv3WvgR1zwF4hoEdLXqpysm1PBnoNm6w0Q5u42AXdJ9KHN8bfClZA+fp8J6Yt/RE+nqNOVqeEIY1kjQ== +"@picovoice/leopard-node@=2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@picovoice/leopard-node/-/leopard-node-2.0.0.tgz#ac29fcfb60ec8a626f1e23145f0a487f7aa45298" + integrity sha512-JQwSrY49EJW0hy4NYh/DXp1hEMJ2MV0BGMCK6uhwzt7rlXODzMxWLYwNGrrkzzzoOy8nd2fgjCXpaye2VbcOCQ== "@picovoice/pvrecorder-node@=1.2.1": version "1.2.1" @@ -17,6 +17,11 @@ commander@^6.1.0: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== +prettier@^2.6.2: + version "2.8.8" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + readline@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/readline/-/readline-1.3.0.tgz#c580d77ef2cfc8752b132498060dc9793a7ac01c" diff --git a/demo/python-subtitle/requirements.txt b/demo/python-subtitle/requirements.txt index a06e5083..7c65fdd2 100644 --- a/demo/python-subtitle/requirements.txt +++ b/demo/python-subtitle/requirements.txt @@ -1,2 +1,2 @@ -pvleopard==1.2.1 +pvleopard==2.0.0 yt-dlp \ No newline at end of file diff --git a/demo/python-youtube/requirements.txt b/demo/python-youtube/requirements.txt index a06e5083..7c65fdd2 100644 --- a/demo/python-youtube/requirements.txt +++ b/demo/python-youtube/requirements.txt @@ -1,2 +1,2 @@ -pvleopard==1.2.1 +pvleopard==2.0.0 yt-dlp \ No newline at end of file diff --git a/demo/python/leopard_demo_file.py b/demo/python/leopard_demo_file.py index 131203e6..132647a6 100644 --- a/demo/python/leopard_demo_file.py +++ b/demo/python/leopard_demo_file.py @@ -31,6 +31,10 @@ def main(): '--disable_automatic_punctuation', action='store_true', help='Disable insertion of automatic punctuation') + parser.add_argument( + '--disable_speaker_diarization', + action='store_true', + help='Disable identification of unique speakers') parser.add_argument( '--verbose', action='store_true', @@ -47,14 +51,18 @@ def main(): access_key=args.access_key, model_path=args.model_path, library_path=args.library_path, - enable_automatic_punctuation=not args.disable_automatic_punctuation) + enable_automatic_punctuation=not args.disable_automatic_punctuation, + enable_diarization=not args.disable_speaker_diarization) try: for wav_path in args.wav_paths: transcript, words = o.process_file(wav_path) print(transcript) if args.verbose: - print(tabulate(words, headers=['word', 'start_sec', 'end_sec', 'confidence'], floatfmt='.2f')) + print(tabulate( + words, + headers=['word', 'start_sec', 'end_sec', 'confidence', 'speaker_tag'], + floatfmt='.2f')) except LeopardActivationLimitError: print('AccessKey has reached its processing limit.') diff --git a/demo/python/leopard_demo_mic.py b/demo/python/leopard_demo_mic.py index a5c33894..c7f5ab62 100644 --- a/demo/python/leopard_demo_mic.py +++ b/demo/python/leopard_demo_mic.py @@ -66,6 +66,10 @@ def main(): '--disable_automatic_punctuation', action='store_true', help='Disable insertion of automatic punctuation') + parser.add_argument( + '--disable_speaker_diarization', + action='store_true', + help='Disable identification of unique speakers') parser.add_argument( '--verbose', action='store_true', @@ -100,7 +104,8 @@ def main(): access_key=args.access_key, model_path=args.model_path, library_path=args.library_path, - enable_automatic_punctuation=not args.disable_automatic_punctuation) + enable_automatic_punctuation=not args.disable_automatic_punctuation, + enable_diarization=not args.disable_speaker_diarization) recorder = None @@ -124,7 +129,10 @@ def on_exit(_, __): transcript, words = leopard.process(recorder.stop()) print(transcript) if args.verbose: - print(tabulate(words, headers=['word', 'start_sec', 'end_sec', 'confidence'], floatfmt='.2f')) + print(tabulate( + words, + headers=['word', 'start_sec', 'end_sec', 'confidence', 'speaker_tag'], + floatfmt='.2f')) except LeopardActivationLimitError: print('AccessKey has reached its processing limit.') print() diff --git a/demo/python/requirements.txt b/demo/python/requirements.txt index db607dcd..ad4b9794 100644 --- a/demo/python/requirements.txt +++ b/demo/python/requirements.txt @@ -1,3 +1,3 @@ -pvleopard==1.2.2 +pvleopard==2.0.0 pvrecorder==1.2.1 tabulate==0.8.10 diff --git a/demo/python/setup.py b/demo/python/setup.py index 4e5d7461..72ac941c 100644 --- a/demo/python/setup.py +++ b/demo/python/setup.py @@ -28,7 +28,7 @@ setuptools.setup( name="pvleoparddemo", - version="1.2.4", + version="2.0.0", author="Picovoice", author_email="hello@picovoice.ai", description="Leopard speech-to-text engine demos", @@ -36,7 +36,7 @@ long_description_content_type="text/markdown", url="https://github.com/Picovoice/leopard", packages=["pvleoparddemo"], - install_requires=["pvleopard==1.2.2", "pvrecorder==1.2.1", "tabulate==0.8.10"], + install_requires=["pvleopard==2.0.0", "pvrecorder==1.2.1", "tabulate==0.8.10"], include_package_data=True, classifiers=[ "Development Status :: 5 - Production/Stable", diff --git a/demo/react-native/ios/LeopardDemo.xcodeproj/project.pbxproj b/demo/react-native/ios/LeopardDemo.xcodeproj/project.pbxproj index cadd6dd3..f3a5608a 100644 --- a/demo/react-native/ios/LeopardDemo.xcodeproj/project.pbxproj +++ b/demo/react-native/ios/LeopardDemo.xcodeproj/project.pbxproj @@ -295,7 +295,7 @@ DEVELOPMENT_TEAM = 65723695GD; ENABLE_BITCODE = NO; INFOPLIST_FILE = LeopardDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", @@ -320,7 +320,7 @@ CURRENT_PROJECT_VERSION = 1; DEVELOPMENT_TEAM = 65723695GD; INFOPLIST_FILE = LeopardDemo/Info.plist; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; OTHER_LDFLAGS = ( "$(inherited)", @@ -382,7 +382,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", @@ -434,7 +434,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 10.0; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; LD_RUNPATH_SEARCH_PATHS = "/usr/lib/swift $(inherited)"; LIBRARY_SEARCH_PATHS = ( "\"$(TOOLCHAIN_DIR)/usr/lib/swift/$(PLATFORM_NAME)\"", diff --git a/demo/react-native/ios/Podfile b/demo/react-native/ios/Podfile index 40157a5a..e5f616fc 100644 --- a/demo/react-native/ios/Podfile +++ b/demo/react-native/ios/Podfile @@ -1,9 +1,10 @@ require_relative '../node_modules/react-native/scripts/react_native_pods' require_relative '../node_modules/@react-native-community/cli-platform-ios/native_modules' -platform :ios, '11.0' +platform :ios, '13.0' target 'LeopardDemo' do config = use_native_modules! + pod 'Leopard-iOS', '~> 2.0.0' use_react_native!(:path => config["reactNativePath"]) end diff --git a/demo/react-native/ios/Podfile.lock b/demo/react-native/ios/Podfile.lock index 014e5ade..e143907a 100644 --- a/demo/react-native/ios/Podfile.lock +++ b/demo/react-native/ios/Podfile.lock @@ -12,9 +12,9 @@ PODS: - fmt (6.2.1) - glog (0.3.5) - ios-voice-processor (1.1.0) - - Leopard-iOS (1.2.0) - - leopard-react-native (1.2.1): - - Leopard-iOS (~> 1.2.0) + - Leopard-iOS (2.0.0) + - leopard-react-native (2.0.0): + - Leopard-iOS (~> 2.0.0) - React - RCT-Folly (2021.06.28.00-v2): - boost @@ -303,6 +303,7 @@ DEPENDENCIES: - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) - FBReactNativeSpec (from `../node_modules/react-native/React/FBReactNativeSpec`) - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - Leopard-iOS (~> 2.0.0) - "leopard-react-native (from `../node_modules/@picovoice/leopard-react-native`)" - RCT-Folly (from `../node_modules/react-native/third-party-podspecs/RCT-Folly.podspec`) - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) @@ -422,8 +423,8 @@ SPEC CHECKSUMS: fmt: ff9d55029c625d3757ed641535fd4a75fedc7ce9 glog: 476ee3e89abb49e07f822b48323c51c57124b572 ios-voice-processor: 8e32d7f980a06d392d128ef1cd19cf6ddcaca3c1 - Leopard-iOS: 993bdc6fbdaabfdaa0ddc5def9bd4405abb59bef - leopard-react-native: 699784c0e888435c265237ef7b8797a731d709b2 + Leopard-iOS: ba60cf23fb79ffc01bbefbbd4e063cb2a102f352 + leopard-react-native: b49c92e652221204b081795393f208e994030d95 RCT-Folly: 4d8508a426467c48885f1151029bc15fa5d7b3b8 RCTRequired: 530916cd48c5f7cf1fc16966ad5ea01638ca4799 RCTTypeSafety: 5fb4cb3080efd582e5563c3e9a0e459fc51396c5 @@ -454,6 +455,6 @@ SPEC CHECKSUMS: RNFS: 4ac0f0ea233904cb798630b3c077808c06931688 Yoga: 0bc4b37c3b8a345336ff601e2cf7d9704bab7e93 -PODFILE CHECKSUM: 92c7729d4fbd6069d1b7e28fea6481738446a185 +PODFILE CHECKSUM: 28c52d83e112f7d1b9c8721ad688775a5ff695d9 COCOAPODS: 1.11.3 diff --git a/demo/react-native/package.json b/demo/react-native/package.json index e38cc009..af1c06fd 100644 --- a/demo/react-native/package.json +++ b/demo/react-native/package.json @@ -1,6 +1,6 @@ { "name": "leopard-react-native-demo", - "version": "1.0.0", + "version": "2.0.0", "private": true, "scripts": { "start": "react-native start", @@ -14,7 +14,7 @@ "ios-bundle": "node scripts/run_demo.js bundle --dev false --platform ios --entry-file index.js --bundle-output ios/app.jsbundle" }, "dependencies": { - "@picovoice/leopard-react-native": "~1.2.1", + "@picovoice/leopard-react-native": "~2.0.0", "@picovoice/react-native-voice-processor": "~1.2.0", "@react-native-picker/picker": "^1.9.2", "react": "^17.0.2", diff --git a/demo/react-native/scripts/run_demo.js b/demo/react-native/scripts/run_demo.js index ab38f834..ec9626ff 100644 --- a/demo/react-native/scripts/run_demo.js +++ b/demo/react-native/scripts/run_demo.js @@ -3,7 +3,7 @@ const fs = require('fs'); const path = require('path'); const testData = require('../../../resources/.test/test_data.json'); -const availableLanguages = testData.tests.parameters.map((x) => x.language); +const availableLanguages = testData.tests.language_tests.map((x) => x.language); const commands = process.argv.slice(2, -1); const language = process.argv.slice(-1)[0]; diff --git a/demo/react-native/src/App.tsx b/demo/react-native/src/App.tsx index 2800b94e..ae16c36f 100644 --- a/demo/react-native/src/App.tsx +++ b/demo/react-native/src/App.tsx @@ -96,7 +96,10 @@ export default class App extends Component { this._leopard = await Leopard.create( this._accessKey, `models/leopard_params${suffix}.pv`, - { enableAutomaticPunctuation: true }, + { + enableAutomaticPunctuation: true, + enableDiarization: true + }, ); } catch (err: any) { this.handleError(err); @@ -132,9 +135,7 @@ export default class App extends Component { handleError(err: any) { let errorMessage = ''; - if (err instanceof LeopardErrors.LeopardInvalidArgumentError) { - errorMessage = `${err.message}\nPlease make sure accessKey ${this._accessKey} is a valid access key.`; - } else if (err instanceof LeopardErrors.LeopardActivationError) { + if (err instanceof LeopardErrors.LeopardActivationError) { errorMessage = 'AccessKey activation error'; } else if (err instanceof LeopardErrors.LeopardActivationLimitError) { errorMessage = 'AccessKey reached its device limit'; @@ -142,6 +143,8 @@ export default class App extends Component { errorMessage = 'AccessKey refused'; } else if (err instanceof LeopardErrors.LeopardActivationThrottledError) { errorMessage = 'AccessKey has been throttled'; + } else if (err instanceof LeopardErrors.LeopardError) { + errorMessage = err.message; } else { errorMessage = err.toString(); } @@ -225,6 +228,7 @@ export default class App extends Component { {`${(word.confidence * 100).toFixed( 0, )}%`} + {word.speakerTag} ); } @@ -260,6 +264,7 @@ export default class App extends Component { Start End Confidence + Tag {this.state.words.map((word: LeopardWord, index: number) => diff --git a/demo/react-native/yarn.lock b/demo/react-native/yarn.lock index b41d4fbe..504c69ea 100644 --- a/demo/react-native/yarn.lock +++ b/demo/react-native/yarn.lock @@ -852,10 +852,10 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@picovoice/leopard-react-native@~1.2.1": - version "1.2.1" - resolved "https://registry.yarnpkg.com/@picovoice/leopard-react-native/-/leopard-react-native-1.2.1.tgz#2f6d3c282cd7f83126aa06da8baaa589ac95d75a" - integrity sha512-0rLvqP+wRVQ8AsbiWGnkCVhRQAL+BuucWo22n1id5NrebUcfm5fsQp1YuB8E0ZSJgLUwhWPko9LYBnZOn4l/8A== +"@picovoice/leopard-react-native@~2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@picovoice/leopard-react-native/-/leopard-react-native-2.0.0.tgz#7a6c15193d6f6876accffec66b9837f5c05efdc6" + integrity sha512-SU8gMcrXeFUscFshRcoO9pOv8AXM1EePFcZdushiabatg7OmAF/GyadVK7EzJWRh7+9xJik6lgg2vRsLIiD3+g== "@picovoice/react-native-voice-processor@~1.2.0": version "1.2.0" diff --git a/demo/react/package.json b/demo/react/package.json index 003ac05f..bc1f64a3 100644 --- a/demo/react/package.json +++ b/demo/react/package.json @@ -1,10 +1,10 @@ { "name": "leopard-react-demo", - "version": "1.0.0", + "version": "2.0.0", "private": true, "description": "Leopard React demo (made with Create React App)", "dependencies": { - "@picovoice/leopard-react": "~1.2.0", + "@picovoice/leopard-react": "~2.0.0", "@picovoice/web-voice-processor": "~4.0.8", "@types/node": "^18.11.9", "@types/react": "^18.0.17", diff --git a/demo/react/scripts/run_demo.js b/demo/react/scripts/run_demo.js index 126acc8c..90b9a563 100644 --- a/demo/react/scripts/run_demo.js +++ b/demo/react/scripts/run_demo.js @@ -3,7 +3,7 @@ const fs = require("fs"); const path = require("path"); const testData = require("../../../resources/.test/test_data.json"); -const availableLanguages = testData["tests"]["parameters"].map( +const availableLanguages = testData["tests"]["language_tests"].map( (x) => x["language"] ); diff --git a/demo/react/src/VoiceWidget.tsx b/demo/react/src/VoiceWidget.tsx index 38993e68..5c17c4ee 100644 --- a/demo/react/src/VoiceWidget.tsx +++ b/demo/react/src/VoiceWidget.tsx @@ -26,13 +26,10 @@ export default function VoiceWidget() { } setIsBusy(true); - await init( - accessKeyRef.current, - leopardModel, - { - enableAutomaticPunctuation: true, - } - ); + await init(accessKeyRef.current, leopardModel, { + enableAutomaticPunctuation: true, + enableDiarization: true, + }); setIsBusy(false); }, [init]); @@ -106,7 +103,11 @@ export default function VoiceWidget() { {recordingElapsedSec}s

-

Transcript:

@@ -119,6 +120,7 @@ export default function VoiceWidget() { startSec endSec confidence + speakerTag @@ -128,6 +130,7 @@ export default function VoiceWidget() { {obj.startSec.toFixed(3)} {obj.endSec.toFixed(3)} {obj.confidence.toFixed(3)} + {obj.speakerTag} ))} diff --git a/demo/react/yarn.lock b/demo/react/yarn.lock index cd10dd57..43294ea2 100644 --- a/demo/react/yarn.lock +++ b/demo/react/yarn.lock @@ -1608,17 +1608,17 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@picovoice/leopard-react@~1.2.0": - version "1.2.0" - resolved "https://registry.yarnpkg.com/@picovoice/leopard-react/-/leopard-react-1.2.0.tgz#2c6319cf0d3d62453a3ea2cf9207f237a799ffcb" - integrity sha512-OPmFGF+XMVoGIl7FAbYWnz8ZJC1KX/0Ly7WFzjBSN5K6XOJ1mh8qf5OUauiyVm52ldsjos2IH9sGr3+59vhZaA== +"@picovoice/leopard-react@~2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@picovoice/leopard-react/-/leopard-react-2.0.0.tgz#695be0692da3033fbc2e11f219b93db121ef731e" + integrity sha512-7JIASezZUWT9spKllsFMdWwWxkMg5s2R5Q4wFtqW4+xVavHboIbNsIorDjo1E5+YWXefFelLktFpFg5MojAoHg== dependencies: - "@picovoice/leopard-web" "=1.2.2" + "@picovoice/leopard-web" "=2.0.0" -"@picovoice/leopard-web@=1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@picovoice/leopard-web/-/leopard-web-1.2.2.tgz#6759ca4333a28d356b6a9fa4cb7c964bd8928363" - integrity sha512-/YzFi5O+j+qx4+3vVXPA8hpjaN/Z3ozUkv50GN2NgmVb7VXaLqrAs3Yr+zgFRzejJSzJ8Uu8edn6f4GHp6+n7g== +"@picovoice/leopard-web@=2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@picovoice/leopard-web/-/leopard-web-2.0.0.tgz#6452d1e49f983542db73a3c8cdf24208c30af234" + integrity sha512-kfJtUCopyvmN028wiaH6hdEHEhOx7QTruiaL5ykVZcpMq1lV/O02hwr29i3U7FqoH6VQQYZl7pRIvlPjDaj+eg== dependencies: "@picovoice/web-utils" "=1.3.1" diff --git a/demo/rust/filedemo/Cargo.lock b/demo/rust/filedemo/Cargo.lock index a2ca5a5f..ac3f1f8d 100644 --- a/demo/rust/filedemo/Cargo.lock +++ b/demo/rust/filedemo/Cargo.lock @@ -138,12 +138,12 @@ checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790" [[package]] name = "libloading" -version = "0.7.0" +version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f84d96438c15fcd6c3f244c8fce01d1e2b9c6b5623e9c711dc9286d8fc92d6a" +checksum = "c571b676ddfc9a8c12f1f3d3085a7b163966a8fd8098a90640953ce5f6170161" dependencies = [ "cfg-if", - "winapi", + "windows-sys", ] [[package]] @@ -197,9 +197,9 @@ dependencies = [ [[package]] name = "pv_leopard" -version = "1.2.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d920fcd9bda7cf20f70083cbb85000321a78ef9638ec8418fc6f0a1f0d30b3fc" +checksum = "c6dd04f60bdc4e53a46b6541da6771a3825951a818221d28fb32cd38d2bf8a56" dependencies = [ "libc", "libloading", @@ -207,7 +207,7 @@ dependencies = [ [[package]] name = "pv_leopard_filedemo" -version = "1.1.1" +version = "2.0.0" dependencies = [ "chrono", "clap", @@ -380,3 +380,69 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" diff --git a/demo/rust/filedemo/Cargo.toml b/demo/rust/filedemo/Cargo.toml index a9e6cc0a..bf9b6f43 100644 --- a/demo/rust/filedemo/Cargo.toml +++ b/demo/rust/filedemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pv_leopard_filedemo" -version = "1.1.1" +version = "2.0.0" edition = "2018" [dependencies] @@ -8,5 +8,5 @@ chrono = "0.4.20" clap = "3.2.16" hound = "3.4.0" itertools = "0.10.3" -pv_leopard = "=1.2.0" +pv_leopard = "=2.0.0" tabwriter = "1.2.1" diff --git a/demo/rust/filedemo/src/main.rs b/demo/rust/filedemo/src/main.rs index ff8bf42d..005da8d2 100644 --- a/demo/rust/filedemo/src/main.rs +++ b/demo/rust/filedemo/src/main.rs @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -21,6 +21,7 @@ fn leopard_demo( access_key: &str, model_path: Option<&str>, enable_automatic_punctuation: bool, + enable_diarization: bool, verbose: bool, ) { let mut leopard_builder = LeopardBuilder::new(); @@ -31,6 +32,7 @@ fn leopard_demo( let leopard = leopard_builder .enable_automatic_punctuation(enable_automatic_punctuation) + .enable_diarization(enable_diarization) .access_key(access_key) .init() .expect("Failed to create Leopard"); @@ -40,13 +42,13 @@ fn leopard_demo( if verbose { println!(); let mut tw = TabWriter::new(vec![]); - writeln!(&mut tw, "Word\tStart Sec\tEnd Sec\tConfidence").unwrap(); - writeln!(&mut tw, "----\t---------\t-------\t----------").unwrap(); + writeln!(&mut tw, "Word\tStart Sec\tEnd Sec\tConfidence\tSpeaker Tag").unwrap(); + writeln!(&mut tw, "----\t---------\t-------\t----------\t-----------").unwrap(); leopard_transcript.words.iter().for_each(|word| { writeln!( &mut tw, - "{}\t{:.2}\t{:.2}\t{:.2}", - word.word, word.start_sec, word.end_sec, word.confidence + "{}\t{:.2}\t{:.2}\t{:.2}\t{}", + word.word, word.start_sec, word.end_sec, word.confidence, word.speaker_tag ) .unwrap(); }); @@ -86,9 +88,15 @@ fn main() { .arg( Arg::with_name("disable_automatic_punctuation") .long("disable_automatic_punctuation") - .short('d') + .short('p') .help("Set to disable automatic punctuation insertion."), ) + .arg( + Arg::with_name("disable_speaker_diarization") + .long("disable_speaker_diarization") + .short('d') + .help("Set to disable speaker diarization."), + ) .arg( Arg::with_name("verbose") .long("verbose") @@ -106,6 +114,7 @@ fn main() { let model_path = matches.value_of("model_path"); let enable_automatic_punctuation = !matches.contains_id("disable_automatic_punctuation"); + let enable_diarization = !matches.contains_id("disable_speaker_diarization"); let verbose = matches.contains_id("verbose"); @@ -114,6 +123,7 @@ fn main() { access_key, model_path, enable_automatic_punctuation, + enable_diarization, verbose, ); } diff --git a/demo/rust/micdemo/Cargo.lock b/demo/rust/micdemo/Cargo.lock index 9670b109..7a511953 100644 --- a/demo/rust/micdemo/Cargo.lock +++ b/demo/rust/micdemo/Cargo.lock @@ -197,16 +197,6 @@ version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" -[[package]] -name = "libloading" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" -dependencies = [ - "cfg-if", - "winapi", -] - [[package]] name = "libloading" version = "0.8.0" @@ -267,17 +257,17 @@ dependencies = [ [[package]] name = "pv_leopard" -version = "1.2.0" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d920fcd9bda7cf20f70083cbb85000321a78ef9638ec8418fc6f0a1f0d30b3fc" +checksum = "c6dd04f60bdc4e53a46b6541da6771a3825951a818221d28fb32cd38d2bf8a56" dependencies = [ "libc", - "libloading 0.7.4", + "libloading", ] [[package]] name = "pv_leopard_micdemo" -version = "1.1.1" +version = "2.0.0" dependencies = [ "chrono", "clap", @@ -296,7 +286,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40be1d15bef993d0b923720589479d4d2e93e9fb6286328e2551f0fdbf45de31" dependencies = [ "libc", - "libloading 0.8.0", + "libloading", ] [[package]] diff --git a/demo/rust/micdemo/Cargo.toml b/demo/rust/micdemo/Cargo.toml index d6e02264..c02f43b2 100644 --- a/demo/rust/micdemo/Cargo.toml +++ b/demo/rust/micdemo/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pv_leopard_micdemo" -version = "1.1.1" +version = "2.0.0" edition = "2018" [dependencies] @@ -9,6 +9,6 @@ clap = "3.2.16" ctrlc = "3.2.2" hound = "3.4.0" itertools = "0.10.3" -pv_leopard = "=1.2.0" +pv_leopard = "=2.0.0" pv_recorder = "=1.2.1" tabwriter = "1.2.1" diff --git a/demo/rust/micdemo/src/main.rs b/demo/rust/micdemo/src/main.rs index 4bdc2963..0beb0e3f 100644 --- a/demo/rust/micdemo/src/main.rs +++ b/demo/rust/micdemo/src/main.rs @@ -1,5 +1,5 @@ /* - Copyright 2022 Picovoice Inc. + Copyright 2022-2023 Picovoice Inc. You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" file accompanying this source. @@ -26,6 +26,7 @@ fn leopard_demo( access_key: &str, model_path: Option<&str>, enable_automatic_punctuation: bool, + enable_diarization: bool, verbose: bool, ) { let mut leopard_builder = LeopardBuilder::new(); @@ -36,6 +37,7 @@ fn leopard_demo( let leopard = leopard_builder .enable_automatic_punctuation(enable_automatic_punctuation) + .enable_diarization(enable_diarization) .access_key(access_key) .init() .expect("Failed to create Leopard"); @@ -89,13 +91,13 @@ fn leopard_demo( if verbose { println!(); let mut tw = TabWriter::new(vec![]); - writeln!(&mut tw, "Word\tStart Sec\tEnd Sec\tConfidence").unwrap(); - writeln!(&mut tw, "----\t---------\t-------\t----------").unwrap(); + writeln!(&mut tw, "Word\tStart Sec\tEnd Sec\tConfidence\tSpeaker Tag").unwrap(); + writeln!(&mut tw, "----\t---------\t-------\t----------\t-----------").unwrap(); leopard_transcript.words.iter().for_each(|word| { writeln!( &mut tw, - "{}\t{:.2}\t{:.2}\t{:.2}", - word.word, word.start_sec, word.end_sec, word.confidence + "{}\t{:.2}\t{:.2}\t{:.2}\t{}", + word.word, word.start_sec, word.end_sec, word.confidence, word.speaker_tag ) .unwrap(); }); @@ -145,9 +147,15 @@ fn main() { .arg( Arg::with_name("disable_automatic_punctuation") .long("disable_automatic_punctuation") - .short('d') + .short('p') .help("Set to disable automatic punctuation insertion."), ) + .arg( + Arg::with_name("disable_speaker_diarization") + .long("disable_speaker_diarization") + .short('d') + .help("Set to disable speaker diarization."), + ) .arg( Arg::with_name("verbose") .long("verbose") @@ -187,6 +195,7 @@ fn main() { let model_path = matches.value_of("model_path"); let enable_automatic_punctuation = !matches.contains_id("disable_automatic_punctuation"); + let enable_diarization = !matches.contains_id("disable_speaker_diarization"); let verbose = matches.contains_id("verbose"); @@ -195,6 +204,7 @@ fn main() { access_key, model_path, enable_automatic_punctuation, + enable_diarization, verbose, ); } diff --git a/demo/web/index.html b/demo/web/index.html index a82492f8..eed42df3 100644 --- a/demo/web/index.html +++ b/demo/web/index.html @@ -119,6 +119,7 @@ startSec endSec confidence + speaker tag `; words.forEach(obj => { @@ -128,6 +129,7 @@ ${obj.startSec.toFixed(3)} ${obj.endSec.toFixed(3)} ${obj.confidence.toFixed(3)} + ${obj.speakerTag} ` }); @@ -140,7 +142,10 @@ leopard = await LeopardWeb.LeopardWorker.create( accessKey, leopardModel, - {enableAutomaticPunctuation: true} + { + enableAutomaticPunctuation: true, + enableDiarization: true + } ); document.getElementById("control").style.display = "block"; writeMessage("Leopard worker ready!"); @@ -186,7 +191,7 @@

Leopard Web Demo


-
+


diff --git a/demo/web/package.json b/demo/web/package.json index 7b4e5f61..98943f5f 100644 --- a/demo/web/package.json +++ b/demo/web/package.json @@ -1,6 +1,6 @@ { "name": "leopard-web-demo", - "version": "1.0.0", + "version": "2.0.0", "description": "A basic demo to show how to use Leopard for web browsers, using the IIFE version of the library", "main": "index.js", "private": true, @@ -17,7 +17,7 @@ "author": "Picovoice Inc", "license": "Apache-2.0", "dependencies": { - "@picovoice/leopard-web": "~1.2.2", + "@picovoice/leopard-web": "~2.0.0", "@picovoice/web-voice-processor": "~4.0.8" }, "devDependencies": { diff --git a/demo/web/scripts/run_demo.js b/demo/web/scripts/run_demo.js index 5b52b954..8ef4096a 100644 --- a/demo/web/scripts/run_demo.js +++ b/demo/web/scripts/run_demo.js @@ -3,7 +3,7 @@ const fs = require("fs"); const path = require("path"); const testData = require("../../../resources/.test/test_data.json"); -availableLanguages = testData["tests"]["parameters"].map((x) => x["language"]); +availableLanguages = testData["tests"]["language_tests"].map((x) => x["language"]); const language = process.argv.slice(2)[0]; if (!language) { diff --git a/demo/web/yarn.lock b/demo/web/yarn.lock index a1777599..38f34c00 100644 --- a/demo/web/yarn.lock +++ b/demo/web/yarn.lock @@ -2,10 +2,10 @@ # yarn lockfile v1 -"@picovoice/leopard-web@~1.2.2": - version "1.2.2" - resolved "https://registry.yarnpkg.com/@picovoice/leopard-web/-/leopard-web-1.2.2.tgz#6759ca4333a28d356b6a9fa4cb7c964bd8928363" - integrity sha512-/YzFi5O+j+qx4+3vVXPA8hpjaN/Z3ozUkv50GN2NgmVb7VXaLqrAs3Yr+zgFRzejJSzJ8Uu8edn6f4GHp6+n7g== +"@picovoice/leopard-web@~2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@picovoice/leopard-web/-/leopard-web-2.0.0.tgz#6452d1e49f983542db73a3c8cdf24208c30af234" + integrity sha512-kfJtUCopyvmN028wiaH6hdEHEhOx7QTruiaL5ykVZcpMq1lV/O02hwr29i3U7FqoH6VQQYZl7pRIvlPjDaj+eg== dependencies: "@picovoice/web-utils" "=1.3.1" diff --git a/include/picovoice.h b/include/picovoice.h index 7ddd85ca..7fb3b434 100644 --- a/include/picovoice.h +++ b/include/picovoice.h @@ -1,14 +1,12 @@ /* Copyright 2018-2023 Picovoice Inc. - You may not use this file except in compliance with the license. A copy of - the license is located in the "LICENSE" file accompanying this source. - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - License for the specific language governing permissions and limitations under - the License. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" + file accompanying this source. + + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + specific language governing permissions and limitations under the License. */ #ifndef PICOVOICE_H @@ -33,18 +31,18 @@ PV_API int32_t pv_sample_rate(void); * Status codes. */ typedef enum { - PV_STATUS_SUCCESS = 0, - PV_STATUS_OUT_OF_MEMORY, - PV_STATUS_IO_ERROR, - PV_STATUS_INVALID_ARGUMENT, - PV_STATUS_STOP_ITERATION, - PV_STATUS_KEY_ERROR, - PV_STATUS_INVALID_STATE, - PV_STATUS_RUNTIME_ERROR, - PV_STATUS_ACTIVATION_ERROR, - PV_STATUS_ACTIVATION_LIMIT_REACHED, - PV_STATUS_ACTIVATION_THROTTLED, - PV_STATUS_ACTIVATION_REFUSED + PV_STATUS_SUCCESS = 0, + PV_STATUS_OUT_OF_MEMORY, + PV_STATUS_IO_ERROR, + PV_STATUS_INVALID_ARGUMENT, + PV_STATUS_STOP_ITERATION, + PV_STATUS_KEY_ERROR, + PV_STATUS_INVALID_STATE, + PV_STATUS_RUNTIME_ERROR, + PV_STATUS_ACTIVATION_ERROR, + PV_STATUS_ACTIVATION_LIMIT_REACHED, + PV_STATUS_ACTIVATION_THROTTLED, + PV_STATUS_ACTIVATION_REFUSED } pv_status_t; /** @@ -55,7 +53,32 @@ typedef enum { */ PV_API const char *pv_status_to_string(pv_status_t status); +/** + * If a function returns a failure (any pv_status_t other than PV_STATUS_SUCCESS), this function can be called + * to get a series of error messages related to the failure. This function can only be called only once per + * failure status on another function. The memory for `message_stack` must be freed using `pv_free_error_stack`. + * + * Regardless of the return status of this function, if `message_stack` is not `NULL`, then `message_stack` + * contains valid memory. However, a failure status on this function indicates that future error messages + * may not be reported. + * + * @param[out] message_stack Array of messages relating to the failure. Messages are NULL terminated strings. + * The array and messages must be freed using `pv_free_error_stack`. + * @param[out] message_stack_depth The number of messages in the `message_stack` array. + */ +PV_API pv_status_t pv_get_error_stack( + char ***message_stack, + int32_t *message_stack_depth); + +/** + * This function frees the memory used by error messages allocated by `pv_get_error_stack`. + * + * @param message_stack Array of messages relating to the failure, allocated from `pv_get_error_stack`. + */ +PV_API void pv_free_error_stack(char **message_stack); + #ifdef __cplusplus + } #endif diff --git a/include/pv_leopard.h b/include/pv_leopard.h index 8e77ff5c..7e942666 100644 --- a/include/pv_leopard.h +++ b/include/pv_leopard.h @@ -1,14 +1,12 @@ /* Copyright 2019-2023 Picovoice Inc. - You may not use this file except in compliance with the license. A copy of - the license is located in the "LICENSE" file accompanying this source. - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - License for the specific language governing permissions and limitations under - the License. + You may not use this file except in compliance with the license. A copy of the license is located in the "LICENSE" + file accompanying this source. + + Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on + an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the + specific language governing permissions and limitations under the License. */ #ifndef PV_LEOPARD_H @@ -33,22 +31,22 @@ typedef struct pv_leopard pv_leopard_t; /** * Constructor. * - * @param access_key AccessKey obtained from Picovoice Console - * (https://console.picovoice.ai/) + * @param access_key AccessKey obtained from Picovoice Console (https://console.picovoice.ai/) * @param model_path Absolute path to the file containing model parameters. - * @param enable_automatic_punctuation Set to `true` to enable automatic - * punctuation insertion. + * @param enable_automatic_punctuation Set to `true` to enable automatic punctuation insertion. + * @param enable_diarization Set to `true` to enable speaker diarization, which allows Leopard to differentiate speakers + * as part of the transcription process. Word metadata will include a `speaker_tag` to identify unique speakers. * @param[out] object Constructed instance of Leopard. - * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, - * `PV_STATUS_INVALID_ARGUMENT`, `PV_STATUS_RUNTIME_ERROR`, - * `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, - * `PV_STATUS_ACTIVATION_THROTTLED`, or `PV_STATUS_ACTIVATION_REFUSED` on - * failure. + * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, `PV_STATUS_INVALID_ARGUMENT`, + * `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, + * `PV_STATUS_ACTIVATION_THROTTLED`, or `PV_STATUS_ACTIVATION_REFUSED` on failure. */ -PV_API pv_status_t pv_leopard_init(const char *access_key, - const char *model_path, - bool enable_automatic_punctuation, - pv_leopard_t **object); +PV_API pv_status_t pv_leopard_init( + const char *access_key, + const char *model_path, + bool enable_automatic_punctuation, + bool enable_diarization, + pv_leopard_t **object); /** * Destructor. @@ -61,75 +59,72 @@ PV_API void pv_leopard_delete(pv_leopard_t *object); * A transcribed word and its associated metadata. */ typedef struct { - const char *word; /** Transcribed word. */ - float start_sec; /** Start of word in seconds. */ - float end_sec; /** End of word in seconds. */ - float - confidence; /** Transcription confidence. It is a number within [0, 1]. */ + const char *word; /** Transcribed word. */ + float start_sec; /** Start of word in seconds. */ + float end_sec; /** End of word in seconds. */ + float confidence; /** Transcription confidence. It is a number within [0, 1]. */ + int32_t speaker_tag; /** The speaker tag is `-1` if diarization is not enabled during initialization; + * otherwise, it's a non-negative integer identifying unique speakers, with `0` reserved for + * unknown speakers. + */ } pv_word_t; /** - * Processes a given audio data and returns its transcription. The caller is - * responsible for freeing the transcription buffer. + * Processes a given audio data and returns its transcription. The caller is responsible for freeing the transcription + * buffer. * * @param object Leopard object. - * @param pcm Audio data. The audio needs to have a sample rate equal to - * `pv_sample_rate()` and be 16-bit linearly-encoded. This function operates on - * single-channel audio. + * @param pcm Audio data. The audio needs to have a sample rate equal to `pv_sample_rate()` and be 16-bit + * linearly-encoded. This function operates on single-channel audio. * @param num_samples Number of audio samples to process. * @param[out] transcript Inferred transcription. * @param[out] num_words Number of transcribed words * @param[out] words Transcribed words and their associated metadata. - * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, - * `PV_STATUS_INVALID_ARGUMENT`, `PV_STATUS_RUNTIME_ERROR`, - * `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, - * `PV_STATUS_ACTIVATION_THROTTLED`, or `PV_STATUS_ACTIVATION_REFUSED` on - * failure + * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, `PV_STATUS_INVALID_ARGUMENT`, + * `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, + * `PV_STATUS_ACTIVATION_THROTTLED`, or `PV_STATUS_ACTIVATION_REFUSED` on failure */ -PV_API pv_status_t pv_leopard_process(pv_leopard_t *object, const int16_t *pcm, - int32_t num_samples, char **transcript, - int32_t *num_words, pv_word_t **words); +PV_API pv_status_t pv_leopard_process( + pv_leopard_t *object, + const int16_t *pcm, + int32_t num_samples, + char **transcript, + int32_t *num_words, + pv_word_t **words); /** - * Processes a given audio file and returns its transcription. The caller is - * responsible for freeing the transcription buffer. + * Processes a given audio file and returns its transcription. The caller is responsible for freeing the transcription + * buffer. * * @param object Leopard object. - * @param audio_path Absolute path to the audio file. The file needs to have a - * sample rate equal to or greater than `pv_sample_rate()`. The supported - * formats are: `3gp (AMR)`, `FLAC`, `MP3`, `MP4/m4a (AAC)`, `Ogg`, `WAV`, - * `WebM`. Files with stereo audio are mixed into a single mono channel and then - * processed. + * @param audio_path Absolute path to the audio file. The file needs to have a sample rate equal to or greater than + * `pv_sample_rate()`. The supported formats are: `3gp (AMR)`, `FLAC`, `MP3`, `MP4/m4a (AAC)`, `Ogg`, `WAV`, `WebM`. + * Files with stereo audio are mixed into a single mono channel and then processed. * @param[out] transcript Inferred transcription. * @param[out] num_words Number of transcribed words * @param[out] words Transcribed words and their associated metadata. - * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, - * `PV_STATUS_INVALID_ARGUMENT`, `PV_STATUS_RUNTIME_ERROR`, - * `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, - * `PV_STATUS_ACTIVATION_THROTTLED`, or `PV_STATUS_ACTIVATION_REFUSED` on - * failure + * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, `PV_STATUS_INVALID_ARGUMENT`, + * `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, + * `PV_STATUS_ACTIVATION_THROTTLED`, or `PV_STATUS_ACTIVATION_REFUSED` on failure */ -PV_API pv_status_t pv_leopard_process_file(pv_leopard_t *object, - const char *audio_path, - char **transcript, - int32_t *num_words, - pv_word_t **words); +PV_API pv_status_t pv_leopard_process_file( + pv_leopard_t *object, + const char *audio_path, + char **transcript, + int32_t *num_words, + pv_word_t **words); /** - * Deletes transcript returned from `pv_leopard_process()` or - * `pv_leopard_process_file()` + * Deletes transcript returned from `pv_leopard_process()` or `pv_leopard_process_file()` * - * @param transcript transcription string returned from `pv_leopard_process()` - * or `pv_leopard_process_file()` + * @param transcript transcription string returned from `pv_leopard_process()` or `pv_leopard_process_file()` */ PV_API void pv_leopard_transcript_delete(char *transcript); /** - * Deletes words returned from `pv_leopard_process()` or - * `pv_leopard_process_file()` + * Deletes words returned from `pv_leopard_process()` or `pv_leopard_process_file()` * - * @param words transcribed words returned from `pv_leopard_process()` or - * `pv_leopard_process_file()` + * @param words transcribed words returned from `pv_leopard_process()` or `pv_leopard_process_file()` */ PV_API void pv_leopard_words_delete(pv_word_t *words); @@ -141,6 +136,7 @@ PV_API void pv_leopard_words_delete(pv_word_t *words); PV_API const char *pv_leopard_version(void); #ifdef __cplusplus + } #endif diff --git a/lib/android/arm64-v8a/libpv_leopard.so b/lib/android/arm64-v8a/libpv_leopard.so index f03ddcf9..43be39cf 100755 Binary files a/lib/android/arm64-v8a/libpv_leopard.so and b/lib/android/arm64-v8a/libpv_leopard.so differ diff --git a/lib/android/armeabi-v7a/libpv_leopard.so b/lib/android/armeabi-v7a/libpv_leopard.so index 7df65d91..ef0025ed 100755 Binary files a/lib/android/armeabi-v7a/libpv_leopard.so and b/lib/android/armeabi-v7a/libpv_leopard.so differ diff --git a/lib/android/x86/libpv_leopard.so b/lib/android/x86/libpv_leopard.so index 222e259c..bb6a88fb 100755 Binary files a/lib/android/x86/libpv_leopard.so and b/lib/android/x86/libpv_leopard.so differ diff --git a/lib/android/x86_64/libpv_leopard.so b/lib/android/x86_64/libpv_leopard.so index 01648c74..6e89d964 100755 Binary files a/lib/android/x86_64/libpv_leopard.so and b/lib/android/x86_64/libpv_leopard.so differ diff --git a/lib/common/leopard_params.pv b/lib/common/leopard_params.pv index d87cb150..2a490dfd 100644 Binary files a/lib/common/leopard_params.pv and b/lib/common/leopard_params.pv differ diff --git a/lib/common/leopard_params_de.pv b/lib/common/leopard_params_de.pv index 6e343091..dd4f68b8 100644 Binary files a/lib/common/leopard_params_de.pv and b/lib/common/leopard_params_de.pv differ diff --git a/lib/common/leopard_params_es.pv b/lib/common/leopard_params_es.pv index e0b2a518..ff6b41be 100644 Binary files a/lib/common/leopard_params_es.pv and b/lib/common/leopard_params_es.pv differ diff --git a/lib/common/leopard_params_fr.pv b/lib/common/leopard_params_fr.pv index 15ae5780..f415b340 100644 Binary files a/lib/common/leopard_params_fr.pv and b/lib/common/leopard_params_fr.pv differ diff --git a/lib/common/leopard_params_it.pv b/lib/common/leopard_params_it.pv index 1b1b4bf5..7e596bf9 100644 Binary files a/lib/common/leopard_params_it.pv and b/lib/common/leopard_params_it.pv differ diff --git a/lib/common/leopard_params_ja.pv b/lib/common/leopard_params_ja.pv index 3c5bbb19..1c765f32 100644 Binary files a/lib/common/leopard_params_ja.pv and b/lib/common/leopard_params_ja.pv differ diff --git a/lib/common/leopard_params_ko.pv b/lib/common/leopard_params_ko.pv index a17aaf19..dfaf2234 100644 Binary files a/lib/common/leopard_params_ko.pv and b/lib/common/leopard_params_ko.pv differ diff --git a/lib/common/leopard_params_pt.pv b/lib/common/leopard_params_pt.pv index d6b4d9d0..bb9fc32d 100644 Binary files a/lib/common/leopard_params_pt.pv and b/lib/common/leopard_params_pt.pv differ diff --git a/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Headers/picovoice.h b/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Headers/picovoice.h index 76fae981..3f13d705 100644 --- a/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Headers/picovoice.h +++ b/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Headers/picovoice.h @@ -53,6 +53,32 @@ typedef enum { */ PV_API const char *pv_status_to_string(pv_status_t status); +/** + * If a function returns a failure (any pv_status_t other than PV_STATUS_SUCCESS), this function can be called + * to get a series of error messages related to the failure. This function can only be called only once per + * failure status on another function. The memory for `message_stack` must be freed using `pv_free_error_stack`. + * + * Regardless of the return status of this function, if `message_stack` is not `NULL`, then `message_stack` + * contains valid memory. However, a failure status on this function indicates that future error messages + * may not be reported. + * + * @param[out] message_stack Array of messages relating to the failure. Messages are NULL terminated strings. + * The array and messages must be freed using `pv_free_error_stack`. + * @param[out] message_stack_depth The number of messages in the `message_stack` array. + */ +PV_API pv_status_t pv_get_error_stack( + char ***message_stack, + int32_t *message_stack_depth); + +/** + * This function frees the memory used by error messages allocated by `pv_get_error_stack`. + * + * @param message_stack Array of messages relating to the failure, allocated from `pv_get_error_stack`. + */ +PV_API void pv_free_error_stack(char **message_stack); + +PV_API void pv_set_sdk(const char *sdk); + #ifdef __cplusplus } diff --git a/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Headers/pv_leopard.h b/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Headers/pv_leopard.h index 0a9fa27d..4e80dcff 100644 --- a/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Headers/pv_leopard.h +++ b/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Headers/pv_leopard.h @@ -34,6 +34,8 @@ typedef struct pv_leopard pv_leopard_t; * @param access_key AccessKey obtained from Picovoice Console (https://console.picovoice.ai/) * @param model_path Absolute path to the file containing model parameters. * @param enable_automatic_punctuation Set to `true` to enable automatic punctuation insertion. + * @param enable_diarization Set to `true` to enable speaker diarization, which allows Leopard to differentiate speakers + * as part of the transcription process. Word metadata will include a `speaker_tag` to identify unique speakers. * @param[out] object Constructed instance of Leopard. * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, `PV_STATUS_INVALID_ARGUMENT`, * `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, @@ -43,6 +45,7 @@ PV_API pv_status_t pv_leopard_init( const char *access_key, const char *model_path, bool enable_automatic_punctuation, + bool enable_diarization, pv_leopard_t **object); /** @@ -60,6 +63,10 @@ typedef struct { float start_sec; /** Start of word in seconds. */ float end_sec; /** End of word in seconds. */ float confidence; /** Transcription confidence. It is a number within [0, 1]. */ + int32_t speaker_tag; /** The speaker tag is `-1` if diarization is not enabled during initialization; + * otherwise, it's a non-negative integer identifying unique speakers, with `0` reserved for + * unknown speakers. + */ } pv_word_t; /** diff --git a/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Info.plist b/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Info.plist index 30f64500..a03c6dd1 100644 Binary files a/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Info.plist and b/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/Info.plist differ diff --git a/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/PvLeopard b/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/PvLeopard index c00bbf76..4becd305 100755 Binary files a/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/PvLeopard and b/lib/ios/PvLeopard.xcframework/ios-arm64/PvLeopard.framework/PvLeopard differ diff --git a/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Headers/picovoice.h b/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Headers/picovoice.h index 76fae981..3f13d705 100644 --- a/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Headers/picovoice.h +++ b/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Headers/picovoice.h @@ -53,6 +53,32 @@ typedef enum { */ PV_API const char *pv_status_to_string(pv_status_t status); +/** + * If a function returns a failure (any pv_status_t other than PV_STATUS_SUCCESS), this function can be called + * to get a series of error messages related to the failure. This function can only be called only once per + * failure status on another function. The memory for `message_stack` must be freed using `pv_free_error_stack`. + * + * Regardless of the return status of this function, if `message_stack` is not `NULL`, then `message_stack` + * contains valid memory. However, a failure status on this function indicates that future error messages + * may not be reported. + * + * @param[out] message_stack Array of messages relating to the failure. Messages are NULL terminated strings. + * The array and messages must be freed using `pv_free_error_stack`. + * @param[out] message_stack_depth The number of messages in the `message_stack` array. + */ +PV_API pv_status_t pv_get_error_stack( + char ***message_stack, + int32_t *message_stack_depth); + +/** + * This function frees the memory used by error messages allocated by `pv_get_error_stack`. + * + * @param message_stack Array of messages relating to the failure, allocated from `pv_get_error_stack`. + */ +PV_API void pv_free_error_stack(char **message_stack); + +PV_API void pv_set_sdk(const char *sdk); + #ifdef __cplusplus } diff --git a/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Headers/pv_leopard.h b/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Headers/pv_leopard.h index 0a9fa27d..4e80dcff 100644 --- a/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Headers/pv_leopard.h +++ b/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Headers/pv_leopard.h @@ -34,6 +34,8 @@ typedef struct pv_leopard pv_leopard_t; * @param access_key AccessKey obtained from Picovoice Console (https://console.picovoice.ai/) * @param model_path Absolute path to the file containing model parameters. * @param enable_automatic_punctuation Set to `true` to enable automatic punctuation insertion. + * @param enable_diarization Set to `true` to enable speaker diarization, which allows Leopard to differentiate speakers + * as part of the transcription process. Word metadata will include a `speaker_tag` to identify unique speakers. * @param[out] object Constructed instance of Leopard. * @return Status code. Returns `PV_STATUS_OUT_OF_MEMORY`, `PV_STATUS_IO_ERROR`, `PV_STATUS_INVALID_ARGUMENT`, * `PV_STATUS_RUNTIME_ERROR`, `PV_STATUS_ACTIVATION_ERROR`, `PV_STATUS_ACTIVATION_LIMIT_REACHED`, @@ -43,6 +45,7 @@ PV_API pv_status_t pv_leopard_init( const char *access_key, const char *model_path, bool enable_automatic_punctuation, + bool enable_diarization, pv_leopard_t **object); /** @@ -60,6 +63,10 @@ typedef struct { float start_sec; /** Start of word in seconds. */ float end_sec; /** End of word in seconds. */ float confidence; /** Transcription confidence. It is a number within [0, 1]. */ + int32_t speaker_tag; /** The speaker tag is `-1` if diarization is not enabled during initialization; + * otherwise, it's a non-negative integer identifying unique speakers, with `0` reserved for + * unknown speakers. + */ } pv_word_t; /** diff --git a/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Info.plist b/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Info.plist index 315b98be..fd7d56c4 100644 Binary files a/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Info.plist and b/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/Info.plist differ diff --git a/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/PvLeopard b/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/PvLeopard index 0048dd15..174938bf 100755 Binary files a/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/PvLeopard and b/lib/ios/PvLeopard.xcframework/ios-arm64_x86_64-simulator/PvLeopard.framework/PvLeopard differ diff --git a/lib/java/jetson/cortex-a57-aarch64/libpv_leopard_jni.so b/lib/java/jetson/cortex-a57-aarch64/libpv_leopard_jni.so index 7ccf3115..a1a45748 100755 Binary files a/lib/java/jetson/cortex-a57-aarch64/libpv_leopard_jni.so and b/lib/java/jetson/cortex-a57-aarch64/libpv_leopard_jni.so differ diff --git a/lib/java/linux/x86_64/libpv_leopard_jni.so b/lib/java/linux/x86_64/libpv_leopard_jni.so index 0b26147f..4e833b10 100755 Binary files a/lib/java/linux/x86_64/libpv_leopard_jni.so and b/lib/java/linux/x86_64/libpv_leopard_jni.so differ diff --git a/lib/java/mac/arm64/libpv_leopard_jni.dylib b/lib/java/mac/arm64/libpv_leopard_jni.dylib index d41395f3..ccd41462 100755 Binary files a/lib/java/mac/arm64/libpv_leopard_jni.dylib and b/lib/java/mac/arm64/libpv_leopard_jni.dylib differ diff --git a/lib/java/mac/x86_64/libpv_leopard_jni.dylib b/lib/java/mac/x86_64/libpv_leopard_jni.dylib index 5c10d6d7..071e59da 100755 Binary files a/lib/java/mac/x86_64/libpv_leopard_jni.dylib and b/lib/java/mac/x86_64/libpv_leopard_jni.dylib differ diff --git a/lib/java/raspberry-pi/cortex-a53-aarch64/libpv_leopard_jni.so b/lib/java/raspberry-pi/cortex-a53-aarch64/libpv_leopard_jni.so index 4bebcf02..15139eeb 100755 Binary files a/lib/java/raspberry-pi/cortex-a53-aarch64/libpv_leopard_jni.so and b/lib/java/raspberry-pi/cortex-a53-aarch64/libpv_leopard_jni.so differ diff --git a/lib/java/raspberry-pi/cortex-a53/libpv_leopard_jni.so b/lib/java/raspberry-pi/cortex-a53/libpv_leopard_jni.so index 5025dc0a..0e915eaa 100755 Binary files a/lib/java/raspberry-pi/cortex-a53/libpv_leopard_jni.so and b/lib/java/raspberry-pi/cortex-a53/libpv_leopard_jni.so differ diff --git a/lib/java/raspberry-pi/cortex-a72-aarch64/libpv_leopard_jni.so b/lib/java/raspberry-pi/cortex-a72-aarch64/libpv_leopard_jni.so index 554ce36e..66a35a9f 100755 Binary files a/lib/java/raspberry-pi/cortex-a72-aarch64/libpv_leopard_jni.so and b/lib/java/raspberry-pi/cortex-a72-aarch64/libpv_leopard_jni.so differ diff --git a/lib/java/raspberry-pi/cortex-a72/libpv_leopard_jni.so b/lib/java/raspberry-pi/cortex-a72/libpv_leopard_jni.so index d1b4e1bf..b6d09d01 100755 Binary files a/lib/java/raspberry-pi/cortex-a72/libpv_leopard_jni.so and b/lib/java/raspberry-pi/cortex-a72/libpv_leopard_jni.so differ diff --git a/lib/java/windows/amd64/libpv_leopard_jni.dll b/lib/java/windows/amd64/libpv_leopard_jni.dll index 6294a051..374372dc 100644 Binary files a/lib/java/windows/amd64/libpv_leopard_jni.dll and b/lib/java/windows/amd64/libpv_leopard_jni.dll differ diff --git a/lib/jetson/cortex-a57-aarch64/libpv_leopard.so b/lib/jetson/cortex-a57-aarch64/libpv_leopard.so index eedbbab6..157800d4 100755 Binary files a/lib/jetson/cortex-a57-aarch64/libpv_leopard.so and b/lib/jetson/cortex-a57-aarch64/libpv_leopard.so differ diff --git a/lib/linux/x86_64/libpv_leopard.so b/lib/linux/x86_64/libpv_leopard.so index fd6cce7d..d3f6cd6e 100755 Binary files a/lib/linux/x86_64/libpv_leopard.so and b/lib/linux/x86_64/libpv_leopard.so differ diff --git a/lib/mac/arm64/libpv_leopard.dylib b/lib/mac/arm64/libpv_leopard.dylib index 02ab786b..e5def7ed 100755 Binary files a/lib/mac/arm64/libpv_leopard.dylib and b/lib/mac/arm64/libpv_leopard.dylib differ diff --git a/lib/mac/x86_64/libpv_leopard.dylib b/lib/mac/x86_64/libpv_leopard.dylib index 70307891..4f6b398a 100755 Binary files a/lib/mac/x86_64/libpv_leopard.dylib and b/lib/mac/x86_64/libpv_leopard.dylib differ diff --git a/lib/node/jetson/cortex-a57-aarch64/pv_leopard.node b/lib/node/jetson/cortex-a57-aarch64/pv_leopard.node index 275b0947..9cc6b336 100755 Binary files a/lib/node/jetson/cortex-a57-aarch64/pv_leopard.node and b/lib/node/jetson/cortex-a57-aarch64/pv_leopard.node differ diff --git a/lib/node/linux/x86_64/pv_leopard.node b/lib/node/linux/x86_64/pv_leopard.node index cc245ed1..8085c271 100755 Binary files a/lib/node/linux/x86_64/pv_leopard.node and b/lib/node/linux/x86_64/pv_leopard.node differ diff --git a/lib/node/mac/arm64/pv_leopard.node b/lib/node/mac/arm64/pv_leopard.node index 9eaa7bca..75cae15f 100755 Binary files a/lib/node/mac/arm64/pv_leopard.node and b/lib/node/mac/arm64/pv_leopard.node differ diff --git a/lib/node/mac/x86_64/pv_leopard.node b/lib/node/mac/x86_64/pv_leopard.node index 33f5c1d9..dd4204f9 100755 Binary files a/lib/node/mac/x86_64/pv_leopard.node and b/lib/node/mac/x86_64/pv_leopard.node differ diff --git a/lib/node/raspberry-pi/cortex-a53-aarch64/pv_leopard.node b/lib/node/raspberry-pi/cortex-a53-aarch64/pv_leopard.node index 7b1c0633..9f3631c5 100755 Binary files a/lib/node/raspberry-pi/cortex-a53-aarch64/pv_leopard.node and b/lib/node/raspberry-pi/cortex-a53-aarch64/pv_leopard.node differ diff --git a/lib/node/raspberry-pi/cortex-a53/pv_leopard.node b/lib/node/raspberry-pi/cortex-a53/pv_leopard.node index ba00dbdb..fab86843 100755 Binary files a/lib/node/raspberry-pi/cortex-a53/pv_leopard.node and b/lib/node/raspberry-pi/cortex-a53/pv_leopard.node differ diff --git a/lib/node/raspberry-pi/cortex-a72-aarch64/pv_leopard.node b/lib/node/raspberry-pi/cortex-a72-aarch64/pv_leopard.node index d450487c..c75a4088 100755 Binary files a/lib/node/raspberry-pi/cortex-a72-aarch64/pv_leopard.node and b/lib/node/raspberry-pi/cortex-a72-aarch64/pv_leopard.node differ diff --git a/lib/node/raspberry-pi/cortex-a72/pv_leopard.node b/lib/node/raspberry-pi/cortex-a72/pv_leopard.node index ef2cd63b..40d14c95 100755 Binary files a/lib/node/raspberry-pi/cortex-a72/pv_leopard.node and b/lib/node/raspberry-pi/cortex-a72/pv_leopard.node differ diff --git a/lib/node/windows/amd64/pv_leopard.node b/lib/node/windows/amd64/pv_leopard.node index a7fff2de..4aac6cd4 100644 Binary files a/lib/node/windows/amd64/pv_leopard.node and b/lib/node/windows/amd64/pv_leopard.node differ diff --git a/lib/raspberry-pi/cortex-a53-aarch64/libpv_leopard.so b/lib/raspberry-pi/cortex-a53-aarch64/libpv_leopard.so index b2e2e082..7e14cfb4 100755 Binary files a/lib/raspberry-pi/cortex-a53-aarch64/libpv_leopard.so and b/lib/raspberry-pi/cortex-a53-aarch64/libpv_leopard.so differ diff --git a/lib/raspberry-pi/cortex-a53/libpv_leopard.so b/lib/raspberry-pi/cortex-a53/libpv_leopard.so index 60feba42..0f2d84cf 100755 Binary files a/lib/raspberry-pi/cortex-a53/libpv_leopard.so and b/lib/raspberry-pi/cortex-a53/libpv_leopard.so differ diff --git a/lib/raspberry-pi/cortex-a72-aarch64/libpv_leopard.so b/lib/raspberry-pi/cortex-a72-aarch64/libpv_leopard.so index 80d9804c..546e1c07 100755 Binary files a/lib/raspberry-pi/cortex-a72-aarch64/libpv_leopard.so and b/lib/raspberry-pi/cortex-a72-aarch64/libpv_leopard.so differ diff --git a/lib/raspberry-pi/cortex-a72/libpv_leopard.so b/lib/raspberry-pi/cortex-a72/libpv_leopard.so index 7432d4df..bb3946b6 100755 Binary files a/lib/raspberry-pi/cortex-a72/libpv_leopard.so and b/lib/raspberry-pi/cortex-a72/libpv_leopard.so differ diff --git a/lib/wasm/pv_leopard.wasm b/lib/wasm/pv_leopard.wasm index 8ab6072e..36aa220d 100755 Binary files a/lib/wasm/pv_leopard.wasm and b/lib/wasm/pv_leopard.wasm differ diff --git a/lib/wasm/pv_leopard_simd.wasm b/lib/wasm/pv_leopard_simd.wasm index fa090a96..f1e2be8d 100755 Binary files a/lib/wasm/pv_leopard_simd.wasm and b/lib/wasm/pv_leopard_simd.wasm differ diff --git a/lib/windows/amd64/libpv_leopard.dll b/lib/windows/amd64/libpv_leopard.dll index be8a3dd1..b175080e 100644 Binary files a/lib/windows/amd64/libpv_leopard.dll and b/lib/windows/amd64/libpv_leopard.dll differ diff --git a/resources/.lint/java/suppress.xml b/resources/.lint/java/suppress.xml index 6cef7966..82463156 100644 --- a/resources/.lint/java/suppress.xml +++ b/resources/.lint/java/suppress.xml @@ -9,7 +9,7 @@ - + diff --git a/resources/.lint/swift/.swiftlint.yml b/resources/.lint/swift/.swiftlint.yml index 1b32beb7..3948b5be 100644 --- a/resources/.lint/swift/.swiftlint.yml +++ b/resources/.lint/swift/.swiftlint.yml @@ -5,6 +5,8 @@ disabled_rules: - implicit_getter - cyclomatic_complexity - function_parameter_count + - file_length + - type_body_length excluded: - ${PWD}/**/Pods - ${PWD}/**/node_modules diff --git a/resources/.test/test_data.json b/resources/.test/test_data.json index 8f688003..22300a8b 100644 --- a/resources/.test/test_data.json +++ b/resources/.test/test_data.json @@ -1,61 +1,211 @@ { "tests": { - "parameters": [ + "language_tests": [ { "language": "en", "audio_file": "test.wav", - "transcript": "Mr. Quilter is the apostle of the middle classes and we are glad to welcome his gospel.", - "punctuations": ["."], - "error_rate": 0.025 + "transcript": "Mr quilter is the apostle of the middle classes and we are glad to welcome his gospel", + "transcript_with_punctuation": "Mr. Quilter is the apostle of the middle classes and we are glad to welcome his gospel.", + "error_rate": 0.025, + "words": [ + {"word": "Mr", "start_sec": 0.54, "end_sec": 0.8, "confidence": 0.86, "speaker_tag": 1}, + {"word": "quilter", "start_sec": 0.86, "end_sec": 1.18, "confidence": 0.8, "speaker_tag": 1}, + {"word": "is", "start_sec": 1.31, "end_sec": 1.38, "confidence": 0.96, "speaker_tag": 1}, + {"word": "the", "start_sec": 1.44, "end_sec": 1.5, "confidence": 0.97, "speaker_tag": 1}, + {"word": "apostle", "start_sec": 1.57, "end_sec": 2.05, "confidence": 0.9, "speaker_tag": 1}, + {"word": "of", "start_sec": 2.18, "end_sec": 2.24, "confidence": 0.98, "speaker_tag": 1}, + {"word": "the", "start_sec": 2.3, "end_sec": 2.34, "confidence": 0.98, "speaker_tag": 1}, + {"word": "middle", "start_sec": 2.4, "end_sec": 2.59, "confidence": 0.97, "speaker_tag": 1}, + {"word": "classes", "start_sec": 2.69, "end_sec": 3.17, "confidence": 0.98, "speaker_tag": 1}, + {"word": "and", "start_sec": 3.33, "end_sec": 3.42, "confidence": 0.98, "speaker_tag": 1}, + {"word": "we", "start_sec": 3.52, "end_sec": 3.55, "confidence": 0.95, "speaker_tag": 1}, + {"word": "are", "start_sec": 3.65, "end_sec": 3.65, "confidence": 0.94, "speaker_tag": 1}, + {"word": "glad", "start_sec": 3.71, "end_sec": 4.03, "confidence": 0.83, "speaker_tag": 1}, + {"word": "to", "start_sec": 4.1, "end_sec": 4.16, "confidence": 0.95, "speaker_tag": 1}, + {"word": "welcome", "start_sec": 4.26, "end_sec": 4.54, "confidence": 0.93, "speaker_tag": 1}, + {"word": "his", "start_sec": 4.67, "end_sec": 4.8, "confidence": 0.97, "speaker_tag": 1}, + {"word": "gospel", "start_sec": 4.93, "end_sec": 5.34, "confidence": 0.84, "speaker_tag": 1} + ] }, { "language": "es", "audio_file": "test_es.wav", - "transcript": "Las arenas son blanquecinas de grano medio y tiene muy poca asistencia.", - "punctuations": ["."], - "error_rate": 0.025 + "transcript": "Las arenas son blanquecinas de grano medio y tiene muy poca asistencia", + "transcript_with_punctuation": "Las arenas son blanquecinas de grano medio y tiene muy poca asistencia.", + "error_rate": 0.025, + "words": [ + {"word": "las", "start_sec": 0.96, "end_sec": 1.09, "confidence": 0.96, "speaker_tag": 1}, + {"word": "arenas", "start_sec": 1.15, "end_sec": 1.57, "confidence": 0.89, "speaker_tag": 1}, + {"word": "son", "start_sec": 1.66, "end_sec": 1.86, "confidence": 0.93, "speaker_tag": 1}, + {"word": "blanquecinas", "start_sec": 1.92, "end_sec": 2.91, "confidence": 0.72, "speaker_tag": 1}, + {"word": "de", "start_sec": 3.62, "end_sec": 3.71, "confidence": 0.97, "speaker_tag": 1}, + {"word": "grano", "start_sec": 3.78, "end_sec": 4.1, "confidence": 0.75, "speaker_tag": 1}, + {"word": "medio", "start_sec": 4.22, "end_sec": 4.61, "confidence": 0.93, "speaker_tag": 1}, + {"word": "y", "start_sec": 5.63, "end_sec": 5.63, "confidence": 0.96, "speaker_tag": 1}, + {"word": "tiene", "start_sec": 5.73, "end_sec": 5.98, "confidence": 0.96, "speaker_tag": 1}, + {"word": "muy", "start_sec": 6.14, "end_sec": 6.34, "confidence": 0.89, "speaker_tag": 1}, + {"word": "poca", "start_sec": 6.46, "end_sec": 6.69, "confidence": 0.97, "speaker_tag": 1}, + {"word": "asistencia", "start_sec": 6.72, "end_sec": 7.62, "confidence": 0.94, "speaker_tag": 1} + ] }, { "language": "de", "audio_file": "test_de.wav", - "transcript": "Der hinter diesem Portal liegenden Raum wurde als Leichenhalle genutzt.", - "punctuations": ["."], - "error_rate": 0.025 + "transcript": "Der hinter diesem Portal liegenden Raum wurde als Leichenhalle genutzt", + "transcript_with_punctuation": "Der hinter diesem Portal liegenden Raum wurde als Leichenhalle genutzt.", + "error_rate": 0.025, + "words": [ + {"word": "der", "start_sec": 0.77, "end_sec": 0.9, "confidence": 0.68, "speaker_tag": 1}, + {"word": "hinter", "start_sec": 0.99, "end_sec": 1.22, "confidence": 0.68, "speaker_tag": 1}, + {"word": "diesem", "start_sec": 1.28, "end_sec": 1.44, "confidence": 0.82, "speaker_tag": 1}, + {"word": "Portal", "start_sec": 1.54, "end_sec": 1.92, "confidence": 0.57, "speaker_tag": 1}, + {"word": "liegenden", "start_sec": 1.98, "end_sec": 2.27, "confidence": 0.19, "speaker_tag": 1}, + {"word": "Raum", "start_sec": 2.34, "end_sec": 2.56, "confidence": 0.78, "speaker_tag": 1}, + {"word": "wurde", "start_sec": 2.91, "end_sec": 3.1, "confidence": 0.83, "speaker_tag": 1}, + {"word": "als", "start_sec": 3.2, "end_sec": 3.33, "confidence": 0.79, "speaker_tag": 1}, + {"word": "Leichenhalle", "start_sec": 3.46, "end_sec": 4.03, "confidence": 0.15, "speaker_tag": 1}, + {"word": "genutzt", "start_sec": 4.13, "end_sec": 4.54, "confidence": 0.58, "speaker_tag": 1} + ] }, { "language": "fr", "audio_file": "test_fr.wav", - "transcript": "Sous le consulat il devient conservateur des eaux et forêts et conseiller général.", - "punctuations": ["."], - "error_rate": 0.025 + "transcript": "Sous le consulat il devient conservateur des eaux et forêts et conseiller général", + "transcript_with_punctuation": "Sous le consulat il devient conservateur des eaux et forêts et conseiller général.", + "error_rate": 0.025, + "words": [ + {"word": "sous", "start_sec": 1.12, "end_sec": 1.22, "confidence": 0.87, "speaker_tag": 1}, + {"word": "le", "start_sec": 1.28, "end_sec": 1.31, "confidence": 0.98, "speaker_tag": 1}, + {"word": "consulat", "start_sec": 1.38, "end_sec": 1.79, "confidence": 0.83, "speaker_tag": 1}, + {"word": "il", "start_sec": 1.98, "end_sec": 2.05, "confidence": 0.92, "speaker_tag": 1}, + {"word": "devient", "start_sec": 2.11, "end_sec": 2.34, "confidence": 0.95, "speaker_tag": 1}, + {"word": "conservateur", "start_sec": 2.4, "end_sec": 3.1, "confidence": 0.95, "speaker_tag": 1}, + {"word": "des", "start_sec": 3.2, "end_sec": 3.3, "confidence": 0.97, "speaker_tag": 1}, + {"word": "eaux", "start_sec": 3.55, "end_sec": 3.55, "confidence": 0.8, "speaker_tag": 1}, + {"word": "et", "start_sec": 3.74, "end_sec": 3.74, "confidence": 0.96, "speaker_tag": 1}, + {"word": "forêts", "start_sec": 3.87, "end_sec": 4.16, "confidence": 0.99, "speaker_tag": 1}, + {"word": "et", "start_sec": 4.38, "end_sec": 4.38, "confidence": 0.97, "speaker_tag": 1}, + {"word": "conseiller", "start_sec": 4.54, "end_sec": 4.99, "confidence": 0.93, "speaker_tag": 1}, + {"word": "général", "start_sec": 5.12, "end_sec": 5.57, "confidence": 0.99, "speaker_tag": 1} + ] }, { "language": "it", "audio_file": "test_it.wav", - "transcript": "Sempre alla radio nacquero anche alcune sue canzoni o meglio ritmi.", - "punctuations": ["."], - "error_rate": 0.025 + "transcript": "Sempre alla radio nacquero anche alcune sue canzoni o meglio ritmi", + "transcript_with_punctuation": "Sempre alla radio nacquero anche alcune sue canzoni o meglio ritmi.", + "error_rate": 0.025, + "words": [ + {"word": "sempre", "start_sec": 0.77, "end_sec": 1.12, "confidence": 0.73, "speaker_tag": 1}, + {"word": "alla", "start_sec": 1.15, "end_sec": 1.31, "confidence": 0.23, "speaker_tag": 1}, + {"word": "radio", "start_sec": 1.38, "end_sec": 1.73, "confidence": 0.54, "speaker_tag": 1}, + {"word": "nacquero", "start_sec": 1.92, "end_sec": 2.37, "confidence": 0.35, "speaker_tag": 1}, + {"word": "anche", "start_sec": 2.43, "end_sec": 2.59, "confidence": 0.68, "speaker_tag": 1}, + {"word": "alcune", "start_sec": 2.66, "end_sec": 2.98, "confidence": 0.66, "speaker_tag": 1}, + {"word": "sue", "start_sec": 3.07, "end_sec": 3.17, "confidence": 0.66, "speaker_tag": 1}, + {"word": "canzoni", "start_sec": 3.26, "end_sec": 3.78, "confidence": 0.83, "speaker_tag": 1}, + {"word": "o", "start_sec": 4.03, "end_sec": 4.03, "confidence": 0.52, "speaker_tag": 1}, + {"word": "meglio", "start_sec": 4.19, "end_sec": 4.51, "confidence": 0.69, "speaker_tag": 1}, + {"word": "ritmi", "start_sec": 4.64, "end_sec": 5.06, "confidence": 0.41, "speaker_tag": 1} + ] }, { "language": "ja", "audio_file": "test_ja.wav", - "transcript": "客観的実在の判断的知識が成立するのである。", - "punctuations": ["。"], - "error_rate": 0.025 + "transcript": "客観的実在の判断的知識が成立するのである", + "transcript_with_punctuation": "客観的実在の判断的知識が成立するのである。", + "error_rate": 0.025, + "words": [ + {"word": "客観", "start_sec": 0.8, "end_sec": 1.22, "confidence": 0.92, "speaker_tag": 1}, + {"word": "的", "start_sec": 1.31, "end_sec": 1.5, "confidence": 0.99, "speaker_tag": 1}, + {"word": "実在", "start_sec": 1.6, "end_sec": 2.05, "confidence": 0.77, "speaker_tag": 1}, + {"word": "の", "start_sec": 2.14, "end_sec": 2.18, "confidence": 0.98, "speaker_tag": 1}, + {"word": "判断", "start_sec": 2.34, "end_sec": 2.72, "confidence": 0.95, "speaker_tag": 1}, + {"word": "的", "start_sec": 2.82, "end_sec": 2.98, "confidence": 0.89, "speaker_tag": 1}, + {"word": "知識", "start_sec": 3.07, "end_sec": 3.36, "confidence": 0.97, "speaker_tag": 1}, + {"word": "が", "start_sec": 3.46, "end_sec": 3.49, "confidence": 0.98, "speaker_tag": 1}, + {"word": "成立", "start_sec": 3.62, "end_sec": 4.0, "confidence": 0.89, "speaker_tag": 1}, + {"word": "する", "start_sec": 4.03, "end_sec": 4.16, "confidence": 0.98, "speaker_tag": 1}, + {"word": "の", "start_sec": 4.26, "end_sec": 4.29, "confidence": 0.98, "speaker_tag": 1}, + {"word": "で", "start_sec": 4.38, "end_sec": 4.42, "confidence": 0.98, "speaker_tag": 1}, + {"word": "ある", "start_sec": 4.51, "end_sec": 4.67, "confidence": 0.97, "speaker_tag": 1} + ] }, { "language": "ko", "audio_file": "test_ko.wav", - "transcript": "그는 이리저리 피하면서 길 한 옆으로 걸어갔다.", - "punctuations": ["."], - "error_rate": 0.025 + "transcript": "그는 이리저리 피하면서 길 한 옆으로 걸어갔다", + "transcript_with_punctuation": "그는 이리저리 피하면서 길 한 옆으로 걸어갔다.", + "error_rate": 0.025, + "words": [ + {"word": "그는", "start_sec": 0.67, "end_sec": 0.9, "confidence": 0.96, "speaker_tag": 1}, + {"word": "이리저리", "start_sec": 1.06, "end_sec": 1.34, "confidence": 0.93, "speaker_tag": 1}, + {"word": "피하면서", "start_sec": 1.44, "end_sec": 1.86, "confidence": 0.91, "speaker_tag": 1}, + {"word": "길", "start_sec": 2.11, "end_sec": 2.24, "confidence": 0.86, "speaker_tag": 1}, + {"word": "한", "start_sec": 2.34, "end_sec": 2.4, "confidence": 0.95, "speaker_tag": 1}, + {"word": "옆으로", "start_sec": 2.5, "end_sec": 2.75, "confidence": 0.86, "speaker_tag": 1}, + {"word": "걸어갔다", "start_sec": 2.85, "end_sec": 3.23, "confidence": 0.92, "speaker_tag": 1} + ] }, { "language": "pt", "audio_file": "test_pt.wav", - "transcript": "Uma raposa velha não consegue aprender nenhum ofício.", - "punctuations": ["."], - "error_rate": 0.025 + "transcript": "Uma raposa velha não consegue aprender nenhum ofício", + "transcript_with_punctuation": "Uma raposa velha não consegue aprender nenhum ofício.", + "error_rate": 0.025, + "words": [ + {"word": "uma", "start_sec": 0.48, "end_sec": 0.64, "confidence": 0.18, "speaker_tag": 1}, + {"word": "raposa", "start_sec": 0.7, "end_sec": 1.12, "confidence": 0.34, "speaker_tag": 1}, + {"word": "velha", "start_sec": 1.18, "end_sec": 1.47, "confidence": 0.44, "speaker_tag": 1}, + {"word": "não", "start_sec": 1.63, "end_sec": 1.76, "confidence": 0.56, "speaker_tag": 1}, + {"word": "consegue", "start_sec": 1.82, "end_sec": 2.21, "confidence": 0.84, "speaker_tag": 1}, + {"word": "aprender", "start_sec": 2.34, "end_sec": 2.72, "confidence": 0.85, "speaker_tag": 1}, + {"word": "nenhum", "start_sec": 2.82, "end_sec": 3.04, "confidence": 0.38, "speaker_tag": 1}, + {"word": "ofício", "start_sec": 3.17, "end_sec": 3.62, "confidence": 0.36, "speaker_tag": 1} + ] + } + ], + "diarization_tests": [ + { + "language": "en", + "audio_file": "diarization_test.wav", + "words": [ + {"word": "and", "speaker_tag": 1}, + {"word": "so", "speaker_tag": 1}, + {"word": "it", "speaker_tag": 1}, + {"word": "begins", "speaker_tag": 1}, + {"word": "this", "speaker_tag": 2}, + {"word": "is", "speaker_tag": 2}, + {"word": "what", "speaker_tag": 2}, + {"word": "a", "speaker_tag": 2}, + {"word": "crocodile", "speaker_tag": 2}, + {"word": "sounds", "speaker_tag": 2}, + {"word": "like", "speaker_tag": 2}, + {"word": "it's", "speaker_tag": 2}, + {"word": "like", "speaker_tag": 2}, + {"word": "meditating", "speaker_tag": 2}, + {"word": "in", "speaker_tag": 2}, + {"word": "the", "speaker_tag": 2}, + {"word": "water", "speaker_tag": 2}, + {"word": "and", "speaker_tag": 2}, + {"word": "it's", "speaker_tag": 2}, + {"word": "like", "speaker_tag": 2}, + {"word": "ladies", "speaker_tag": 3}, + {"word": "and", "speaker_tag": 3}, + {"word": "gentlemen", "speaker_tag": 3}, + {"word": "please", "speaker_tag": 3}, + {"word": "fasten", "speaker_tag": 3}, + {"word": "your", "speaker_tag": 3}, + {"word": "seat", "speaker_tag": 3}, + {"word": "belts", "speaker_tag": 3}, + {"word": "we", "speaker_tag": 3}, + {"word": "are", "speaker_tag": 3}, + {"word": "expecting", "speaker_tag": 3}, + {"word": "some", "speaker_tag": 3}, + {"word": "turbulence", "speaker_tag": 3}, + {"word": "thank", "speaker_tag": 3}, + {"word": "you", "speaker_tag": 3} + ] } ] } diff --git a/resources/audio_samples/diarization_test.wav b/resources/audio_samples/diarization_test.wav new file mode 100644 index 00000000..38dce571 Binary files /dev/null and b/resources/audio_samples/diarization_test.wav differ diff --git a/resources/spell-check/dict.txt b/resources/spell-check/dict.txt index 9f4f6ab7..896773de 100644 --- a/resources/spell-check/dict.txt +++ b/resources/spell-check/dict.txt @@ -17,8 +17,8 @@ calcsize camelcase Cdecl checkstyle -CHECKSTYLE Checkstyle +CHECKSTYLE cleopard cmake cocoapod @@ -35,6 +35,8 @@ cstring cword devient dgryski +diarization +Diarization diesem dlfcn dlopen @@ -52,11 +54,11 @@ flac floatfmt forêts fprintf +général genutzt gradlew grano gzipped -général HMODULE iife instanceof @@ -125,6 +127,7 @@ ritmi RNFS rodio RTLD +Rustonomicon Sameline Signup sizecache @@ -154,8 +157,8 @@ webfonts webm wurde xcodeproj -xcshareddata xcscheme xcschemes +xcshareddata xcworkspace -ytdlp +ytdlp \ No newline at end of file