diff --git a/.github/workflows/android-e2e.yml b/.github/workflows/android-e2e.yml new file mode 100644 index 00000000..4f2e2413 --- /dev/null +++ b/.github/workflows/android-e2e.yml @@ -0,0 +1,120 @@ +name: Test Android e2e +on: + pull_request: + paths: + - '.github/workflows/android-e2e-test.yml' + - 'apps/examples/**' + - 'example/**' + - 'android/**' + - 'src/**' + - 'e2e/**' + - 'package.json' + # push: + # branches: + # - main + workflow_dispatch: +jobs: + test: + runs-on: macos-12 + timeout-minutes: 60 + env: + WORKING_DIRECTORY: example + API_LEVEL: 34 + SYSTEM_IMAGES: system-images;android-34;google_apis;x86_64 + AVD_NAME: rn-svg-avd + concurrency: + group: android-e2e-example-${{ github.ref }} + cancel-in-progress: true + steps: + - name: checkout + uses: actions/checkout@v3 + with: + submodules: recursive + - uses: actions/setup-node@v3 + with: + node-version: 18 + cache: 'yarn' + - name: Set up JDK 17 + uses: actions/setup-java@v2 + with: + java-version: '17' + distribution: 'zulu' + cache: 'gradle' + - name: Install NDK + uses: nttld/setup-ndk@v1 + id: setup-ndk + with: + ndk-version: r26d + local-cache: true + - name: Set ANDROID_NDK + run: echo "ANDROID_NDK=$ANDROID_HOME/ndk-bundle" >> $GITHUB_ENV + - name: Cache SDK image + id: cache-sdk-img + uses: actions/cache@v3 + with: + path: $ANDROID_HOME/system-images/ + key: ${{ runner.os }}-build-system-images-${{ env.SYSTEM_IMAGES }} + - name: SKDs - download required images + if: ${{ steps.cache-sdd-img.outputs.cache-hit != 'true' }} + run: $ANDROID_HOME/cmdline-tools/latest/bin/sdkmanager "system-images;android-34;google_apis;x86_64" + - name: Cache AVD + id: cache-avd + uses: actions/cache@v3 + with: + path: ~/.android/avd/${{ env.AVD_NAME }}.avd + key: ${{ runner.os }}-avd-images-${{ env.SYSTEM_IMAGES }}-${{ env.AVD_NAME }} + - name: Emulator - Create + if: ${{ steps.cache-avd.outputs.cache-hit != 'true' }} + run: $ANDROID_HOME/cmdline-tools/latest/bin/avdmanager create avd -n ${{ env.AVD_NAME }} --device 28 --package "${{ env.SYSTEM_IMAGES }}" --sdcard 512M + - name: Emulator - Set screen settings + if: ${{ steps.cache-avd.outputs.cache-hit != 'true' }} + run: | + echo "AVD config path: $HOME/.android/avd/${{ env.AVD_NAME }}.avd/config.ini" + sed -i '' 's/.*hw\.lcd\.density.*/hw\.lcd\.density = 480/g' $HOME/.android/avd/${{ env.AVD_NAME }}.avd/config.ini + sed -i '' 's/.*hw\.lcd\.width.*/hw\.lcd\.width = 1344/g' $HOME/.android/avd/${{ env.AVD_NAME }}.avd/config.ini + sed -i '' 's/.*hw\.lcd\.height.*/hw\.lcd\.height = 2992/g' $HOME/.android/avd/${{ env.AVD_NAME }}.avd/config.ini + - name: Emulator - Boot + run: $ANDROID_HOME/emulator/emulator -memory 4096 -avd ${{ env.AVD_NAME }} -no-window -gpu swiftshader_indirect -no-snapshot -noaudio -no-boot-anim & + + - name: ADB Wait For Device + run: adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done;' + timeout-minutes: 10 + + - name: Reverse TCP + working-directory: ${{ env.WORKING_DIRECTORY }} + run: adb devices | grep '\t' | awk '{print $1}' | sed 's/\\s//g' | xargs -I {} adb -s {} reverse tcp:8081 tcp:8081 + + - name: Install root node dependencies + run: yarn + + - name: Install example app node dependencies + run: yarn + working-directory: ${{ env.WORKING_DIRECTORY }} + + - name: Build Android app + working-directory: ${{ env.WORKING_DIRECTORY }}/android + run: ./gradlew assembleDebug + + - name: Start Metro server + working-directory: ${{ env.WORKING_DIRECTORY }} + run: E2E=true yarn start &> output.log & + + - name: Install APK + run: adb install -r ${{ env.WORKING_DIRECTORY }}/android/app/build/outputs/apk/debug/app-debug.apk + + - name: Launch APK + run: 'while ! (adb shell monkey -p com.example 1 | grep -q "Events injected: 1"); do sleep 1; echo "Retrying due to errors in previous run..."; done' + + - name: Run e2e Tests + run: E2E=true yarn e2e + + - name: Upload test report + uses: actions/upload-artifact@v4 + with: + name: report + path: | + report.html + jest-html-reporters-attach/ + + - name: Kill emulator (so it can be cached safely) + run: adb devices | grep emulator | cut -f1 | while read line; do adb -s $line emu kill; done diff --git a/.github/workflows/ios-e2e.yml b/.github/workflows/ios-e2e.yml new file mode 100644 index 00000000..61cc6f24 --- /dev/null +++ b/.github/workflows/ios-e2e.yml @@ -0,0 +1,93 @@ +name: Test iOS e2e +on: + pull_request: + paths: + - '.github/workflows/android-e2e-test.yml' + - 'apps/examples/**' + - 'example/**' + - 'apple/**' + - 'src/**' + - 'e2e/**' + - 'package.json' + push: + branches: + - main + workflow_dispatch: +jobs: + test: + runs-on: macos-14 + timeout-minutes: 60 + env: + WORKING_DIRECTORY: example + DEVICE: iPhone 14 Pro + XCODE_VERSION: latest-stable + concurrency: + group: ios-e2e-example-${{ github.ref }} + cancel-in-progress: true + steps: + - name: checkout + uses: actions/checkout@v3 + with: + submodules: recursive + - name: Use latest stable Xcode + uses: maxim-lobanov/setup-xcode@v1 + with: + xcode-version: ${{ env.XCODE_VERSION }} + + - name: Restore react-native-svg node_modules from cache + uses: actions/cache@v3 + with: + path: node_modules + key: ${{ runner.os }}-node-modules-svg-${{ hashFiles('yarn.lock') }} + restore-keys: ${{ runner.os }}-node-modules-svg- + + - name: Install react-native-svg node_modules + run: yarn install --frozen-lockfile + + - name: Restore app node_modules from cache + uses: actions/cache@v3 + with: + path: ${{ env.WORKING_DIRECTORY }}/node_modules + key: ${{ runner.os }}-node-modules-${{ env.WORKING_DIRECTORY }}-${{ hashFiles(format('{0}/yarn.lock', env.WORKING_DIRECTORY)) }} + restore-keys: ${{ runner.os }}-node-modules-${{ env.WORKING_DIRECTORY }}- + + - name: Install app node_modules + working-directory: ${{ env.WORKING_DIRECTORY }} + run: yarn install --frozen-lockfile + + - name: Restore Pods from cache + uses: actions/cache@v3 + with: + path: | + ${{ env.WORKING_DIRECTORY }}/ios/Pods + ~/Library/Caches/CocoaPods + ~/.cocoapods + key: ${{ runner.os }}-pods-${{ env.WORKING_DIRECTORY }}-${{ hashFiles(format('{0}/ios/Podfile.lock', env.WORKING_DIRECTORY)) }} + + - name: Install Pods + working-directory: ${{ env.WORKING_DIRECTORY }}/ios + run: pod install + + - name: Restore build artifacts from cache + uses: actions/cache@v3 + with: + path: ~/Library/Developer/Xcode/DerivedData + key: ${{ runner.os }}-ios-derived-data-${{ env.WORKING_DIRECTORY }}-${{ hashFiles(format('{0}/ios/Podfile.lock', env.WORKING_DIRECTORY)) }} + - name: Start Metro server + working-directory: ${{ env.WORKING_DIRECTORY }} + run: E2E=true yarn start &> output.log & + + - name: Build app + working-directory: ${{ env.WORKING_DIRECTORY }} + run: E2E=true npx react-native@latest run-ios --simulator="${{ env.DEVICE }}" --mode Debug --verbose + + - name: Run e2e Tests + run: E2E=true yarn e2e + + - name: Upload test report + uses: actions/upload-artifact@v4 + with: + name: report + path: | + report.html + jest-html-reporters-attach/ diff --git a/.github/workflows/windows-build-test.yml b/.github/workflows/windows-build-test.yml index a9160177..e0ace47b 100644 --- a/.github/workflows/windows-build-test.yml +++ b/.github/workflows/windows-build-test.yml @@ -57,4 +57,4 @@ jobs: - name: Build app working-directory: ${{ matrix.working-directory }}/windows - run: npx react-native run-windows --logging --no-packager --no-deploy \ No newline at end of file + run: npx react-native run-windows --logging --no-packager --no-deploy --no-autolink diff --git a/.gitignore b/.gitignore index 85569792..984257db 100644 --- a/.gitignore +++ b/.gitignore @@ -50,3 +50,6 @@ experimental/ # VS Code .vscode/ + +jest-html-reporters-attach/ +report.html diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2ed3f034..4bfc519d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,7 +1,8 @@ # Contributing to React Native Svg Thank you for helping out with react-native-svg! -We'd like to make contributions as pleasant as possible, so here's a small guide of how we see it. Happy to hear your feedback about anything, so please let us know. +We'd like to make contributions as pleasant as possible, so here's a small guide of how we see it. Happy to hear your +feedback about anything, so please let us know. ### Modifying react-native-svg @@ -13,24 +14,51 @@ We'd like to make contributions as pleasant as possible, so here's a small guide ### Testing your changes -Add test example in [tests-example](https://github.com/react-native-svg/react-native-svg/tree/main/tests-example) concerning your change following the convention of `TestX.tsx` where `X` is your PR number. +Add test example in [tests-example](https://github.com/react-native-svg/react-native-svg/tree/main/tests-example) +concerning your change following the convention of `TestX.tsx` where `X` is your PR number. ## Tests -We use `typescript` for type checks, `eslint` with `prettier` for linting/formatting. All tests are run by github actions for all opened pull requests. +We use `typescript` for type checks, `eslint` with `prettier` for linting/formatting. All tests are run by github +actions for all opened pull requests. - `yarn test`: Run all tests, except for e2e (see note below). - `yarn lint`: Run `eslint` check. - `yarn tsc`: Run `typescript` check. - `yarn jest`: Run `jest` type check. +- `yarn e2e`: Run E2E tests (see section below) -Currently e2e tests exist here: https://github.com/msand/react-native-svg-e2e/ +### Running E2E tests: + +> [!WARNING] +> Reference images in this repository are generated with [pixel ratio](https://reactnative.dev/docs/pixelratio) = `3`. +> Make sure to run tests on a device that also has pixel ratio equal 3. Otherwise tests will fail. +> In order to use device with different pixel ratio, adjust it in `e2e/generateRefereces.ts` viewport and regenerate +> references. + +1. Navigate to the example application's directory and initiate the Metro server using the yarn start command. +2. To run the example application on your preferred platform (note: currently only Android and iOS are supported), + execute the command `yarn android` or `yarn ios` within the example app's directory. +3. Start the Jest server by running `yarn e2e` in the project's root directory. +4. In the example application, select the E2E tab. +5. Allow the tests to complete. +6. The test results, along with any differences (i.e. the actual rendered svg versus the reference image), can be viewed + in the `e2e/diffs` directory. + +### To add new E2E test cases, proceed as follows: + +1. Put an SVG file of your selection into the `e2e/cases` directory. +2. Execute `yarn generateE2eRefrences`. This action launches a headless Chrome browser via Puppeteer, capturing + snapshots of all rendered SVGs as .png files. These files will serve as a reference during testing. +3. Check the `e2e/references` directory to observe newly created .png files. +4. When you rerun the E2E tests, the new test case(s) you've added will be incorporated. ## Sending a pull request When you're sending a pull request: -- Communication is a key. If you want fix/add something, please consider either opening a new issue or finding an existing one so we can further discuss it. +- Communication is a key. If you want fix/add something, please consider either opening a new issue or finding an + existing one so we can further discuss it. - We prefer small pull requests focused on one change, as those are easier to test/check. - Please make sure that all tests are passing on your local machine. - Follow the template when opening a PR. @@ -43,7 +71,8 @@ Most notably prefixes you'll see: - **fix**: Bug fixes - **feat**: New feature implemented -- **chore**: Changes that are not affecting end user (CI config changes, scripts, ["grunt work"](https://stackoverflow.com/a/26944812/3510245)) +- **chore**: Changes that are not affecting end user (CI config changes, + scripts, ["grunt work"](https://stackoverflow.com/a/26944812/3510245)) - **docs**: Documentation changes. - **perf**: A code change that improves performance. - **refactor**: A code change that neither fixes a bug nor adds a feature. @@ -55,7 +84,8 @@ We use [release-it](https://github.com/release-it/release-it) to release new ver ## Reporting issues -You can report issues on our [bug tracker](https://github.com/react-native-community/react-native-svg/issues). Please search for existing issues and follow the issue template when opening one. +You can report issues on our [bug tracker](https://github.com/react-native-community/react-native-svg/issues). Please +search for existing issues and follow the issue template when opening one. ## License diff --git a/__tests__/e2e/GeneralSvgRenderingTest.spec.tsx b/__tests__/e2e/GeneralSvgRenderingTest.spec.tsx new file mode 100644 index 00000000..38a1513f --- /dev/null +++ b/__tests__/e2e/GeneralSvgRenderingTest.spec.tsx @@ -0,0 +1,94 @@ +import { SvgFromXml } from 'react-native-svg'; +import * as fs from 'node:fs'; +import { compareImages, sendToDeviceAndReceive } from '../../e2e/helpers'; +import { HandshakeMessageData, RenderResponse } from '../../e2e/types'; +import path from 'path'; +import { + addAttach as attachImageToReport, + addMsg as addMessageToReport, +} from 'jest-html-reporters/helper'; +import { PNG } from 'pngjs'; +import failedCases from '../../e2e/failedCases.json'; +import { verifyComparisons } from '../../e2e/matchTestCases'; +import { height, targetPixelRatio, width } from '../../e2e/env'; + +const testCases = fs.readdirSync(path.resolve('e2e', 'cases')); +testCases.forEach((testCase) => { + jest.setTimeout(90_000); + test(`Web browser rendered SVG should have less than 0.05% differences between device rendered SVG (${testCase})`, async () => { + await addMessageToReport({ + message: JSON.stringify({ + os: global.os, + arch: global.arch, + }), + }); + const testCaseSvg = path.resolve('e2e', 'cases', testCase); + + const svgXml = fs.readFileSync(testCaseSvg).toString('utf-8'); + const response = await sendToDeviceAndReceive({ + type: 'renderRequest', + data: , + height, + width, + }); + + const referenceFilePath = path.resolve( + 'e2e', + 'references', + testCase.replace('.svg', '.png') + ); + const renderedFilePath = path.resolve( + 'e2e', + 'rendered', + `${testCase.replace('.svg', '')}-${global.os}-${global.arch}-rendered.png` + ); + const diffFilePath = path.resolve( + 'e2e', + 'diffs', + `${testCase.replace('.svg', '')}-${global.os}-${global.arch}-diff.png` + ); + const referenceFileBuffer = fs.readFileSync(referenceFilePath); + const renderedDataBuffer = Buffer.from(response.data, 'base64'); + + // We use await everywhere instead Promise.all as we need to maintain order for ease of inspecting tests + // Adding reference & rendered before comparison in case compareImages fails, so we can see why it failed + await attachImageToReport({ + attach: fs.readFileSync(referenceFilePath), + description: 'Reference image', + bufferFormat: 'png', + }); + await attachImageToReport({ + attach: PNG.sync.write(PNG.sync.read(renderedDataBuffer)), + description: 'Actual rendered image', + bufferFormat: 'png', + }); + + // Compare reference file (from /e2e/references) with SVG rendered on actual device. + // Reference files can be generated off of /e2e/cases with `yarn generateE2eReferences`. + const amountOfDifferentPixels = compareImages( + referenceFileBuffer, + renderedDataBuffer, + { + width, + height, + pixelRatio: targetPixelRatio, + diffFilePath, + renderedFilePath, + } + ); + + await attachImageToReport({ + attach: fs.readFileSync(diffFilePath), + description: 'Differences', + bufferFormat: 'png', + }); + + // Check if there is more than 0.5% different pixels in whole snapshot + verifyComparisons( + amountOfDifferentPixels, + failedCases, + global as unknown as HandshakeMessageData, + testCase + ); + }); +}); diff --git a/apps/examples/index.tsx b/apps/examples/index.tsx index 086a108f..35ea3814 100644 --- a/apps/examples/index.tsx +++ b/apps/examples/index.tsx @@ -7,45 +7,22 @@ import React, {Component} from 'react'; import { Dimensions, + Modal, + Platform, + SafeAreaView, + ScrollView, StyleSheet, Text, - View, - ScrollView, TouchableHighlight, TouchableOpacity, - SafeAreaView, + View, } from 'react-native'; -import {Modal, Platform} from 'react-native'; -import {Svg, Circle, Line} from 'react-native-svg'; +import {Circle, Line, Svg} from 'react-native-svg'; -import * as examples from './src/examples'; import {commonStyles} from './src/commonStyles'; - -const names: (keyof typeof examples)[] = [ - 'Svg', - 'Stroking', - 'Path', - 'Line', - 'Rect', - 'Polygon', - 'Polyline', - 'Circle', - 'Ellipse', - 'G', - 'Text', - 'Gradients', - 'Clipping', - 'Image', - 'TouchEvents', - 'PanResponder', - 'Reusable', - 'Reanimated', - 'Transforms', - 'Markers', - 'Mask', - 'Filters', - 'FilterImage', -]; +import E2eTestingView from './src/e2e'; +import * as examples from './src/examples'; +import {names} from './utils/names'; const initialState = { modal: false, @@ -88,25 +65,30 @@ export default class SvgExample extends Component { }; getExamples = () => { - return names.map(name => { - var icon; - let example = examples[name]; - if (example) { - icon = example.icon; - } - return ( - this.show(name)}> - - {icon} - {name} - - - ); - }); + return names + .filter(el => { + if (el !== 'E2E') return true; + return Platform.OS === 'android' || Platform.OS === 'ios'; + }) + .map(name => { + var icon; + let example = examples[name as keyof typeof examples]; + if (example) { + icon = example.icon; + } + return ( + this.show(name as keyof typeof examples)}> + + {icon} + {name} + + + ); + }); }; modalContent = () => ( @@ -132,6 +114,12 @@ export default class SvgExample extends Component { ); render() { + if (process.env.E2E) { + console.log( + 'Opening E2E example, as E2E env is set to ' + process.env.E2E, + ); + return ; + } return ( SVG library for React Apps diff --git a/apps/examples/src/e2e/TestingView.tsx b/apps/examples/src/e2e/TestingView.tsx new file mode 100644 index 00000000..5ca086b8 --- /dev/null +++ b/apps/examples/src/e2e/TestingView.tsx @@ -0,0 +1,158 @@ +import React, { + Component, + useCallback, + useEffect, + useRef, + useState, +} from 'react'; +import {Platform, Text, View} from 'react-native'; +import * as RNSVG from 'react-native-svg'; +import ViewShot from 'react-native-view-shot'; + +const address = ['ios', 'web'].includes(Platform.OS) ? 'localhost' : '10.0.2.2'; +const wsUri = `ws://${address}:7123`; + +const TestingView = () => { + const wrapperRef = useRef(null); + const [wsClient, setWsClient] = useState(null); + const [renderedContent, setRenderedContent] = + useState(); + const [readyToSnapshot, setReadyToSnapshot] = useState(false); + const [resolution, setResolution] = useState([0, 0]); // placeholder value, later updated by incoming render requests + const [message, setMessage] = useState('⏳ Connecting to Jest server...'); + + const connect = useCallback(() => { + const client = new WebSocket(wsUri); + setWsClient(client); + setMessage('⏳ Connecting to Jest server...'); + client.onopen = () => { + client.send( + JSON.stringify({ + os: Platform.OS, + version: Platform.Version, + arch: isFabric() ? 'fabric' : 'paper', + connectionTime: new Date(), + }), + ); + setMessage('✅ Connected to Jest server. Waiting for render requests.'); + }; + client.onerror = (err: any) => { + if (!err.message) { + return; + } + console.error( + `Error while connecting to E2E WebSocket server at ${wsUri}: ${err.message}. Will retry in 3 seconds.`, + ); + setMessage( + `🚨 Failed to connect to Jest server at ${wsUri}: ${err.message}! Will retry in 3 seconds.`, + ); + setTimeout(() => { + connect(); + }, 3000); + }; + client.onmessage = ({data: rawMessage}) => { + const message = JSON.parse(rawMessage); + if (message.type == 'renderRequest') { + setMessage(`✅ Rendering tests, please don't close this tab.`); + setResolution([message.width, message.height]); + setRenderedContent( + createElementFromObject( + message.data.type || 'SvgFromXml', + message.data.props, + ), + ); + setReadyToSnapshot(true); + } + }; + client.onclose = event => { + if (event.code == 1006 && event.reason) { + // this is an error, let error handler take care of it + return; + } + setMessage( + `✅ Connection to Jest server has been closed. You can close this tab safely. (${event.code})`, + ); + }; + }, [wsClient]); + + // Create initial connection when rendering the view + useEffect(connect, []); + + // Whenever new content is rendered, send renderResponse with snapshot view + useEffect(() => { + if (!readyToSnapshot || !wrapperRef.current) { + return; + } + wrapperRef.current.capture?.().then((value: string) => { + wsClient?.send( + JSON.stringify({ + type: 'renderResponse', + data: value, + }), + ); + setReadyToSnapshot(false); + }); + }, [wrapperRef, readyToSnapshot]); + + return ( + + {message} + + {renderedContent} + + + ); +}; + +class TestingViewWrapper extends Component { + static title = 'E2E Testing'; + + render() { + return ; + } +} + +const samples = [TestingViewWrapper]; +const icon = ( + + + +); + +function isFabric(): boolean { + // @ts-expect-error nativeFabricUIManager is not yet included in the RN types + return !!global?.nativeFabricUIManager; +} + +export {samples, icon}; + +const createElementFromObject = ( + element: keyof typeof RNSVG, + props: any, +): React.ReactElement => { + const children: any[] = []; + if (props.children) { + if (Array.isArray(props.children)) { + props?.children.forEach((child: {type: any; props: any}) => + children.push(createElementFromObject(child.type, child?.props)), + ); + } else if (typeof props.children === 'object') { + children.push( + createElementFromObject(props.children.type, props.children?.props), + ); + } else { + children.push(props.children); + } + } + return React.createElement(RNSVG[element] as any, {...props, children}); +}; diff --git a/apps/examples/src/e2e/index.macos.tsx b/apps/examples/src/e2e/index.macos.tsx new file mode 100644 index 00000000..dc37d27e --- /dev/null +++ b/apps/examples/src/e2e/index.macos.tsx @@ -0,0 +1,3 @@ +export default function () { + return null; +} diff --git a/apps/examples/src/e2e/index.tsx b/apps/examples/src/e2e/index.tsx new file mode 100644 index 00000000..1cfc0097 --- /dev/null +++ b/apps/examples/src/e2e/index.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import {SafeAreaView} from 'react-native'; +import {samples} from './TestingView'; + +export default function () { + const e2eTab = React.createElement(samples[0]); + return {e2eTab}; +} diff --git a/apps/examples/src/e2e/index.web.tsx b/apps/examples/src/e2e/index.web.tsx new file mode 100644 index 00000000..dc37d27e --- /dev/null +++ b/apps/examples/src/e2e/index.web.tsx @@ -0,0 +1,3 @@ +export default function () { + return null; +} diff --git a/apps/examples/src/examples.macos.tsx b/apps/examples/src/examples.macos.tsx new file mode 100644 index 00000000..b5567a9d --- /dev/null +++ b/apps/examples/src/examples.macos.tsx @@ -0,0 +1,49 @@ +import * as Svg from './examples/Svg'; +import * as Rect from './examples/Rect'; +import * as Circle from './examples/Circle'; +import * as Ellipse from './examples/Ellipse'; +import * as Line from './examples/Line'; +import * as Polygon from './examples/Polygon'; +import * as Polyline from './examples/Polyline'; +import * as Path from './examples/Path'; +import * as Text from './examples/Text'; +import * as G from './examples/G'; +import * as Stroking from './examples/Stroking'; +import * as Gradients from './examples/Gradients'; +import * as Clipping from './examples/Clipping'; +import * as Image from './examples/Image'; +import * as Reusable from './examples/Reusable'; +import * as TouchEvents from './examples/TouchEvents'; +import * as PanResponder from './examples/PanResponder'; +import * as Reanimated from './examples/Reanimated'; +import * as Transforms from './examples/Transforms'; +import * as Markers from './examples/Markers'; +import * as Mask from './examples/Mask'; +import * as Filters from './examples/Filters'; +import * as FilterImage from './examples/FilterImage'; + +export { + Svg, + Rect, + Circle, + Ellipse, + Line, + Polygon, + Polyline, + Path, + Text, + Stroking, + G, + Gradients, + Clipping, + Image, + TouchEvents, + Reusable, + PanResponder, + Reanimated, + Transforms, + Markers, + Mask, + Filters, + FilterImage, +}; diff --git a/apps/examples/src/examples.tsx b/apps/examples/src/examples.tsx index b5567a9d..046e2bb1 100644 --- a/apps/examples/src/examples.tsx +++ b/apps/examples/src/examples.tsx @@ -19,6 +19,7 @@ import * as Reanimated from './examples/Reanimated'; import * as Transforms from './examples/Transforms'; import * as Markers from './examples/Markers'; import * as Mask from './examples/Mask'; +import * as E2E from './e2e/TestingView'; import * as Filters from './examples/Filters'; import * as FilterImage from './examples/FilterImage'; @@ -44,6 +45,7 @@ export { Transforms, Markers, Mask, + E2E, Filters, FilterImage, }; diff --git a/apps/examples/tsconfig.json b/apps/examples/tsconfig.json index 19aefad2..1ca4a89a 100644 --- a/apps/examples/tsconfig.json +++ b/apps/examples/tsconfig.json @@ -1,4 +1,7 @@ { + "compilerOptions": { + "moduleSuffixes": [".macos", ""] + }, "extends": "../../tsconfig.json", "include": ["**/*.ts", "**/*.tsx", "**/*.js"] } diff --git a/apps/examples/utils/names.ts b/apps/examples/utils/names.ts new file mode 100644 index 00000000..9380caaa --- /dev/null +++ b/apps/examples/utils/names.ts @@ -0,0 +1,28 @@ +import {ExamplesKey} from './type'; + +export const names: ExamplesKey[] = [ + 'Svg', + 'Stroking', + 'Path', + 'Line', + 'Rect', + 'Polygon', + 'Polyline', + 'Circle', + 'Ellipse', + 'G', + 'Text', + 'Gradients', + 'Clipping', + 'Image', + 'TouchEvents', + 'PanResponder', + 'Reusable', + 'Reanimated', + 'Transforms', + 'Markers', + 'Mask', + 'E2E', + 'Filters', + 'FilterImage', +]; diff --git a/apps/examples/utils/type.ts b/apps/examples/utils/type.ts new file mode 100644 index 00000000..98a1f7b6 --- /dev/null +++ b/apps/examples/utils/type.ts @@ -0,0 +1,3 @@ +import * as examples from '../src/examples'; + +export type ExamplesKey = keyof typeof examples | 'E2E'; diff --git a/e2e/cases/1.svg b/e2e/cases/1.svg new file mode 100644 index 00000000..a36cea7e --- /dev/null +++ b/e2e/cases/1.svg @@ -0,0 +1 @@ + diff --git a/e2e/cases/2.svg b/e2e/cases/2.svg new file mode 100644 index 00000000..4f3f6bf0 --- /dev/null +++ b/e2e/cases/2.svg @@ -0,0 +1,10 @@ + + + + + + + + + SVG + diff --git a/e2e/cases/3.svg b/e2e/cases/3.svg new file mode 100644 index 00000000..b398be2a --- /dev/null +++ b/e2e/cases/3.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/e2e/diffs/.gitignore b/e2e/diffs/.gitignore new file mode 100644 index 00000000..568233f6 --- /dev/null +++ b/e2e/diffs/.gitignore @@ -0,0 +1,2 @@ +# This directory will contain difference images for each test after the tests are ran. Do not commit those. +** diff --git a/e2e/env.ts b/e2e/env.ts new file mode 100644 index 00000000..103634f9 --- /dev/null +++ b/e2e/env.ts @@ -0,0 +1,4 @@ +export const width = 200; +export const height = 200; +export const maxPixelDiff = width * height * 0.005; +export const targetPixelRatio = 3.0; diff --git a/e2e/failedCases.json b/e2e/failedCases.json new file mode 100644 index 00000000..e2f2a75b --- /dev/null +++ b/e2e/failedCases.json @@ -0,0 +1,10 @@ +{ + "ios": { + "paper": [], + "fabric": [] + }, + "android": { + "paper": ["2"], + "fabric": ["2"] + } +} diff --git a/e2e/generateReferences.ts b/e2e/generateReferences.ts new file mode 100644 index 00000000..85b56a26 --- /dev/null +++ b/e2e/generateReferences.ts @@ -0,0 +1,35 @@ +const path = require('path'); +const puppeteer = require('puppeteer'); +const fs = require('fs'); + +const main = async () => { + const browser = await puppeteer.launch(); + const page = await browser.newPage(); + await page.setViewport({ + height: 200, + width: 200, + // This is hardcoded value which makes it possible to use only devices with pixel ratio = 3. You can change it + // and regenerate reference images if you want to use device with different pixel ratio + // see: https://reactnative.dev/docs/pixelratio + deviceScaleFactor: 3, + }); + const casesPath = path.resolve('e2e', 'cases'); + const referencesPath = path.resolve('e2e', 'references'); + const cases = fs.readdirSync(casesPath); + for (const testCase of cases) { + const svgPath = path.resolve(casesPath, testCase); + await page.goto(`file://${svgPath}`); + await page.$eval('svg', (ev: Element) => { + ev.setAttribute('width', '200'); + ev.setAttribute('height', '200'); + }); + const svg = await page.waitForSelector('svg'); + await svg.screenshot({ + path: path.resolve(referencesPath, testCase.replace('.svg', '.png')), + }); + } + + await browser.close(); +}; + +main(); diff --git a/e2e/globals.d.ts b/e2e/globals.d.ts new file mode 100644 index 00000000..f50d864c --- /dev/null +++ b/e2e/globals.d.ts @@ -0,0 +1,12 @@ +/* eslint-disable no-var */ +import { WebSocket as WsWebSocket, WebSocketServer } from 'ws'; + +declare global { + namespace globalThis { + // Leave it as var, changing to let will cause it not to work + var server: WebSocketServer; + var client: WsWebSocket; + var os: string; + var arch: string; + } +} diff --git a/e2e/helpers.ts b/e2e/helpers.ts new file mode 100644 index 00000000..7760b065 --- /dev/null +++ b/e2e/helpers.ts @@ -0,0 +1,57 @@ +import { E2EMessage } from './types'; +import { PNG } from 'pngjs'; +import fs from 'node:fs'; +import pixelmatch from 'pixelmatch'; + +const replacer = (key: string, value: any) => { + if (key === 'type' && typeof value !== 'string') return value.displayName; + return value; +}; + +export const sendToDeviceAndReceive = (message: E2EMessage) => + new Promise((resolve) => { + global.client.once('message', (message) => { + const parsedMessage: E2EMessage = JSON.parse(message.toString('utf-8')); + resolve(parsedMessage as R); + }); + global.client.send(JSON.stringify(message, replacer)); + }); + +export const compareImages = ( + image1: Buffer, + image2: Buffer, + opts: { + width: number; + height: number; + pixelRatio: number; + diffFilePath?: string; + renderedFilePath?: string; + } +) => { + const referencePng = PNG.sync.read(image1); + const responsePng = PNG.sync.read(image2); + + const diffPng = new PNG({ + height: referencePng.height, + width: referencePng.width, + }); + + const pixelDiff = pixelmatch( + referencePng.data, + responsePng.data, + diffPng.data, + opts.width * opts.pixelRatio, + opts.height * opts.pixelRatio, + { + // That #5f00a0 is the color of the diff pixels + diffColor: [95, 0, 160], + } + ); + if (opts.renderedFilePath) { + fs.writeFileSync(opts.renderedFilePath, PNG.sync.write(responsePng)); + } + if (opts.diffFilePath) { + fs.writeFileSync(opts.diffFilePath, PNG.sync.write(diffPng)); + } + return pixelDiff; +}; diff --git a/e2e/matchTestCases.ts b/e2e/matchTestCases.ts new file mode 100644 index 00000000..4e5482d5 --- /dev/null +++ b/e2e/matchTestCases.ts @@ -0,0 +1,30 @@ +import { maxPixelDiff, targetPixelRatio } from './env'; +// import { storeFailedResult } from './readFailedCases'; +import { FailedResults, HandshakeMessageData } from './types'; + +const extractSvgNumber = (testCase: string) => { + const match = testCase.match(/(\d+)\.svg$/)!; + return parseInt(match[1], 10).toString(); +}; + +export function verifyComparisons( + amountOfDifferentPixels: number, + failedCases: FailedResults, + global: HandshakeMessageData, + testCase: string +) { + // if (amountOfDifferentPixels > maxPixelDiff * targetPixelRatio) { + // storeFailedResult(global.os, global.arch, matchTestCase(testCase)); + // } + if ( + failedCases[global.os][global.arch].includes(extractSvgNumber(testCase)) + ) { + expect(amountOfDifferentPixels).toBeGreaterThan( + maxPixelDiff * targetPixelRatio + ); + } else { + expect(amountOfDifferentPixels).toBeLessThan( + maxPixelDiff * targetPixelRatio + ); + } +} diff --git a/e2e/readFailedCases.ts b/e2e/readFailedCases.ts new file mode 100644 index 00000000..541cef3a --- /dev/null +++ b/e2e/readFailedCases.ts @@ -0,0 +1,56 @@ +import { Arch, OS } from './types'; +import path from 'path'; +import fs from 'fs'; + +const filePath = path.join(__dirname, 'failedCases.json'); + +function readFileOrCreateIfNotExists(filePath: string): object { + try { + if (fs.existsSync(filePath)) { + const data = fs.readFileSync(filePath, 'utf8'); + return JSON.parse(data); + } else { + const emptyObject = {}; + fs.writeFileSync(filePath, JSON.stringify(emptyObject, null, 2), 'utf8'); + return emptyObject; + } + } catch (error) { + console.error('Error occurred:', error); + return {}; + } +} + +interface UpdateFailedResults { + ios?: { + paper?: string[]; + fabric?: string[]; + }; + android?: { paper?: string[]; fabric?: string[] }; +} + +export function storeFailedResult( + platform: OS, + architecture: Arch, + value: string +): void { + try { + const data = readFileOrCreateIfNotExists(filePath) as UpdateFailedResults; + + if (!data[platform]) { + data[platform] = {}; + } + + if (!data[platform]?.[architecture]) { + data[platform]![architecture] = []; + } + + if (!data[platform]?.[architecture]?.includes(value)) { + data[platform]?.[architecture]?.push(value); + } + + fs.writeFileSync(filePath, JSON.stringify(data, null, 2), 'utf8'); + console.log('Data updated successfully:', data); + } catch (error) { + console.error('Error occurred while updating the file:', error); + } +} diff --git a/e2e/references/1.png b/e2e/references/1.png new file mode 100644 index 00000000..8b034a50 Binary files /dev/null and b/e2e/references/1.png differ diff --git a/e2e/references/2.png b/e2e/references/2.png new file mode 100644 index 00000000..f1db4384 Binary files /dev/null and b/e2e/references/2.png differ diff --git a/e2e/references/3.png b/e2e/references/3.png new file mode 100644 index 00000000..2724d2ea Binary files /dev/null and b/e2e/references/3.png differ diff --git a/e2e/rendered/.gitignore b/e2e/rendered/.gitignore new file mode 100644 index 00000000..51fd3c5d --- /dev/null +++ b/e2e/rendered/.gitignore @@ -0,0 +1,3 @@ +# This directory will contain rendered images for each test after the tests are ran. Do not commit those. +!.gitignore +** diff --git a/e2e/setupJest.ts b/e2e/setupJest.ts new file mode 100644 index 00000000..8330f44b --- /dev/null +++ b/e2e/setupJest.ts @@ -0,0 +1,35 @@ +import { WebSocketServer } from 'ws'; + +// This is little hack, we don't use syntax sugar with `async` here as we need to manually resolve promise +// whenever a client connects using resolve callback. In result the Jest will wait until some device connects, +// so it can be used to render test cases. +const setupJest = () => + new Promise((resolve) => { + const wsServer = new WebSocketServer({ port: 7123 }); + wsServer.on('connection', (client) => { + global.client = client; + + // Add handler for one-time handshake message that confirms the client has connected properly + client.once('message', (message) => { + const parsedMessage = JSON.parse(message.toString('utf-8')); + console.log( + `[react-native-svg] Received handshake from a test client: ${JSON.stringify( + parsedMessage + )}` + ); + + global.os = parsedMessage.os; + global.arch = parsedMessage.arch; + + console.log(`[react-native-svg] Running E2E test suites...\n`); + resolve(); + }); + }); + + console.log( + '\n\n[react-native-svg] E2E WebSocket server is running, waiting for client connection. Run example app and select E2E from examples list.\n' + ); + global.server = wsServer; + }); + +export default setupJest; diff --git a/e2e/teardownJest.ts b/e2e/teardownJest.ts new file mode 100644 index 00000000..68d08ab7 --- /dev/null +++ b/e2e/teardownJest.ts @@ -0,0 +1,4 @@ +export default () => { + global.server.clients.forEach((client) => client.close(1000)) + global.server.close() +}; diff --git a/e2e/types.ts b/e2e/types.ts new file mode 100644 index 00000000..7a056a96 --- /dev/null +++ b/e2e/types.ts @@ -0,0 +1,38 @@ +export type E2EMessage = HandshakeMessage | RenderRequest | RenderResponse; + +export interface HandshakeMessage { + type: 'handshake'; + data: { + os: string; + arch: 'paper' | 'fabric'; + platformVersion: string; + }; +} + +export type OS = 'ios' | 'android'; +export type Arch = 'paper' | 'fabric'; +export interface HandshakeMessageData { + os: OS; + arch: Arch; + platformVersion: string; +} + +export interface RenderRequest { + type: 'renderRequest'; + data: any; + width: number; + height: number; +} + +export interface RenderResponse { + type: 'renderResponse'; + data: string; // as base64 +} + +export interface FailedResults { + ios: { + paper: string[]; + fabric: string[]; + }; + android: { paper: string[]; fabric: string[] }; +} diff --git a/example/babel.config.js b/example/babel.config.js index 950d3b2e..bd798c39 100644 --- a/example/babel.config.js +++ b/example/babel.config.js @@ -2,6 +2,7 @@ module.exports = { presets: ['module:@react-native/babel-preset'], plugins: [ '@babel/plugin-proposal-export-namespace-from', + 'module:react-native-dotenv', 'react-native-reanimated/plugin', ], }; diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 63b3f625..ccbb7925 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -935,6 +935,8 @@ PODS: - React-Mapbuffer (0.74.2): - glog - React-debug + - react-native-view-shot (4.0.0-alpha.2): + - React-Core - React-nativeconfig (0.74.2) - React-NativeModulesApple (0.74.2): - glog @@ -1185,7 +1187,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNSVG (15.5.0): + - RNSVG (15.6.0): - React-Core - SocketRocket (0.7.0) - Yoga (0.0.0) @@ -1223,6 +1225,7 @@ DEPENDENCIES: - React-jsitracing (from `../node_modules/react-native/ReactCommon/hermes/executor/`) - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) + - react-native-view-shot (from `../node_modules/react-native-view-shot`) - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) @@ -1316,6 +1319,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon/logger" React-Mapbuffer: :path: "../node_modules/react-native/ReactCommon" + react-native-view-shot: + :path: "../node_modules/react-native-view-shot" React-nativeconfig: :path: "../node_modules/react-native/ReactCommon" React-NativeModulesApple: @@ -1374,9 +1379,9 @@ SPEC CHECKSUMS: DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5 FBLazyVector: 4bc164e5b5e6cfc288d2b5ff28643ea15fa1a589 fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 - glog: c5d68082e772fa1c511173d6b30a9de2c05a69a2 + glog: fdfdfe5479092de0c4bdbebedd9056951f092c4f hermes-engine: 01d3e052018c2a13937aca1860fbedbccd4a41b7 - RCT-Folly: 045d6ecaa59d826c5736dfba0b2f4083ff8d79df + RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47 RCTDeprecation: b03c35057846b685b3ccadc9bfe43e349989cdb2 RCTRequired: 194626909cfa8d39ca6663138c417bc6c431648c RCTTypeSafety: 552aff5b8e8341660594db00e53ac889682bc120 @@ -1400,6 +1405,7 @@ SPEC CHECKSUMS: React-jsitracing: 0fa7f78d8fdda794667cb2e6f19c874c1cf31d7e React-logger: 29fa3e048f5f67fe396bc08af7606426d9bd7b5d React-Mapbuffer: bf56147c9775491e53122a94c423ac201417e326 + react-native-view-shot: 8ffbe24e3b5207d66816afb5b3c2ca82731ab636 React-nativeconfig: 9f223cd321823afdecf59ed00861ab2d69ee0fc1 React-NativeModulesApple: ff7efaff7098639db5631236cfd91d60abff04c0 React-perflogger: 32ed45d9cee02cf6639acae34251590dccd30994 @@ -1424,7 +1430,7 @@ SPEC CHECKSUMS: React-utils: 4476b7fcbbd95cfd002f3e778616155241d86e31 ReactCommon: ecad995f26e0d1e24061f60f4e5d74782f003f12 RNReanimated: 9c213184c27dc4a2ed7e9ff41a4b0b9258bb54f0 - RNSVG: b986585e367f4a49d8aa43065066cc9c290b3d9b + RNSVG: 5da7a24f31968ec74f0b091e3440080f347e279b SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Yoga: 2f71ecf38d934aecb366e686278102a51679c308 diff --git a/example/package.json b/example/package.json index 4364c9f0..d67c425e 100644 --- a/example/package.json +++ b/example/package.json @@ -18,6 +18,7 @@ "react-native": "0.74.2", "react-native-reanimated": "3.13.0", "react-native-svg": "link:../", + "react-native-view-shot": "4.0.0-alpha.2", "react-native-windows": "0.74.9" }, "devDependencies": { @@ -40,6 +41,7 @@ "patch-package": "^8.0.0", "postinstall-postinstall": "^2.1.0", "prettier": "2.8.8", + "react-native-dotenv": "^3.4.11", "react-test-renderer": "18.2.0", "typescript": "5.0.4" }, diff --git a/example/patches/react-native-view-shot+4.0.0-alpha.2.patch b/example/patches/react-native-view-shot+4.0.0-alpha.2.patch new file mode 100644 index 00000000..0caa5602 --- /dev/null +++ b/example/patches/react-native-view-shot+4.0.0-alpha.2.patch @@ -0,0 +1,51 @@ +diff --git a/node_modules/react-native-view-shot/ios/RNViewShot.m b/node_modules/react-native-view-shot/ios/RNViewShot.m +index bd55b92..6a20e9d 100644 +--- a/node_modules/react-native-view-shot/ios/RNViewShot.m ++++ b/node_modules/react-native-view-shot/ios/RNViewShot.m +@@ -106,7 +106,7 @@ - (dispatch_queue_t)methodQueue + scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height); + } + +- UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:size]; ++ UIGraphicsBeginImageContextWithOptions(size, NO, 0); + + if (renderInContext) { + // this comes with some trade-offs such as inability to capture gradients or scrollview's content in full but it works for large views +@@ -117,8 +117,8 @@ - (dispatch_queue_t)methodQueue + // this doesn't work for large views and reports incorrect success even though the image is blank + success = [rendered drawViewHierarchyInRect:(CGRect){CGPointZero, size} afterScreenUpdates:YES]; + } +- +- UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) {}]; ++ UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); ++ UIGraphicsEndImageContext(); + + if (snapshotContentContainer) { + // Restore scroll & frame +@@ -152,11 +152,11 @@ - (dispatch_queue_t)methodQueue + NSString *res = nil; + if ([result isEqualToString:@"base64"]) { + // Return as a base64 raw string +- res = [data base64EncodedStringWithOptions: 0]; ++ res = [data base64EncodedStringWithOptions: NSDataBase64EncodingEndLineWithLineFeed]; + } + else if ([result isEqualToString:@"data-uri"]) { + // Return as a base64 data uri string +- NSString *base64 = [data base64EncodedStringWithOptions: 0]; ++ NSString *base64 = [data base64EncodedStringWithOptions: NSDataBase64EncodingEndLineWithLineFeed]; + NSString *imageFormat = ([format isEqualToString:@"jpg"]) ? @"jpeg" : format; + res = [NSString stringWithFormat:@"data:image/%@;base64,%@", imageFormat, base64]; + } +diff --git a/node_modules/react-native-view-shot/src/specs/NativeRNViewShot.ts b/node_modules/react-native-view-shot/src/specs/NativeRNViewShot.ts +index a6f4c00..1e9e6ce 100644 +--- a/node_modules/react-native-view-shot/src/specs/NativeRNViewShot.ts ++++ b/node_modules/react-native-view-shot/src/specs/NativeRNViewShot.ts +@@ -2,7 +2,7 @@ import type { TurboModule } from 'react-native'; + import { TurboModuleRegistry } from 'react-native'; + + export interface Spec extends TurboModule { +- releaseCapture: () => string; ++ releaseCapture: (uri: string) => void; + captureRef: (tag: number, options: Object) => Promise + captureScreen: (options: Object) => Promise; + } \ No newline at end of file diff --git a/example/yarn.lock b/example/yarn.lock index 82d07ac5..1fec35ae 100644 --- a/example/yarn.lock +++ b/example/yarn.lock @@ -3217,6 +3217,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -3641,6 +3646,13 @@ cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +css-line-break@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" + integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== + dependencies: + utrie "^1.0.2" + css-select@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" @@ -3841,6 +3853,11 @@ domutils@^3.0.1: domelementtype "^2.3.0" domhandler "^5.0.3" +dotenv@^16.4.5: + version "16.4.5" + resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-16.4.5.tgz#cdd3b3b604cb327e286b4762e13502f717cb099f" + integrity sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg== + ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" @@ -4757,6 +4774,14 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html2canvas@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" + integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== + dependencies: + css-line-break "^2.1.0" + text-segmentation "^1.0.3" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -7060,6 +7085,13 @@ react-is@^17.0.1: resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== +react-native-dotenv@^3.4.11: + version "3.4.11" + resolved "https://registry.yarnpkg.com/react-native-dotenv/-/react-native-dotenv-3.4.11.tgz#2e6c4eabd55d5f1bf109b3dd9141dadf9c55cdd4" + integrity sha512-6vnIE+WHABSeHCaYP6l3O1BOEhWxKH6nHAdV7n/wKn/sciZ64zPPp2NUdEUf1m7g4uuzlLbjgr+6uDt89q2DOg== + dependencies: + dotenv "^16.4.5" + react-native-reanimated@3.13.0: version "3.13.0" resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.13.0.tgz#723687cd6ff4ce674800299c6917e4a3b088d89e" @@ -7078,6 +7110,13 @@ react-native-reanimated@3.13.0: version "0.0.0" uid "" +react-native-view-shot@4.0.0-alpha.2: + version "4.0.0-alpha.2" + resolved "https://registry.yarnpkg.com/react-native-view-shot/-/react-native-view-shot-4.0.0-alpha.2.tgz#389f5323722c3acad1c002bf4f0f0539fd2508c9" + integrity sha512-BNQ+FoOUrB2Y6zxwhSZtZMMXVLewN2Ic8y5gS+5Y7hdgphqWmlHZIGbcLn/NmJS+soz0Pe3WO1sM5vX6u7h6VQ== + dependencies: + html2canvas "^1.4.1" + react-native-windows@0.74.9: version "0.74.9" resolved "https://registry.yarnpkg.com/react-native-windows/-/react-native-windows-0.74.9.tgz#2abcc8eb99a4ce0ce80dfe2dea8ce249b8e21469" @@ -7937,6 +7976,13 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-segmentation@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" + integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== + dependencies: + utrie "^1.0.2" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -8173,6 +8219,13 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +utrie@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" + integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== + dependencies: + base64-arraybuffer "^1.0.2" + uuid@^3.3.2: version "3.4.0" resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" diff --git a/fabric-example/ios/Podfile.lock b/fabric-example/ios/Podfile.lock index 02655332..93b354ef 100644 --- a/fabric-example/ios/Podfile.lock +++ b/fabric-example/ios/Podfile.lock @@ -1237,6 +1237,8 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga + - react-native-view-shot (4.0.0-alpha.2): + - React-Core - React-nativeconfig (0.75.1) - React-NativeModulesApple (0.75.1): - glog @@ -1562,7 +1564,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNSVG (15.5.0): + - RNSVG (15.6.0): - DoubleConversion - glog - hermes-engine @@ -1582,9 +1584,9 @@ PODS: - ReactCodegen - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNSVG/common (= 15.5.0) + - RNSVG/common (= 15.6.0) - Yoga - - RNSVG/common (15.5.0): + - RNSVG/common (15.6.0): - DoubleConversion - glog - hermes-engine @@ -1646,6 +1648,7 @@ DEPENDENCIES: - React-logger (from `../node_modules/react-native/ReactCommon/logger`) - React-Mapbuffer (from `../node_modules/react-native/ReactCommon`) - React-microtasksnativemodule (from `../node_modules/react-native/ReactCommon/react/nativemodule/microtasks`) + - react-native-view-shot (from `../node_modules/react-native-view-shot`) - React-nativeconfig (from `../node_modules/react-native/ReactCommon`) - React-NativeModulesApple (from `../node_modules/react-native/ReactCommon/react/nativemodule/core/platform/ios`) - React-perflogger (from `../node_modules/react-native/ReactCommon/reactperflogger`) @@ -1752,6 +1755,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native/ReactCommon" React-microtasksnativemodule: :path: "../node_modules/react-native/ReactCommon/react/nativemodule/microtasks" + react-native-view-shot: + :path: "../node_modules/react-native-view-shot" React-nativeconfig: :path: "../node_modules/react-native/ReactCommon" React-NativeModulesApple: @@ -1847,6 +1852,7 @@ SPEC CHECKSUMS: React-logger: 0a81d1a40650bbdafb255fe4616edb83feed0ee9 React-Mapbuffer: b758bec0d9994c10a2841dfd5ec70673665fd3e2 React-microtasksnativemodule: 988e6ed065c061554ec09fdbc47c1f7c7f6478fe + react-native-view-shot: 8ffbe24e3b5207d66816afb5b3c2ca82731ab636 React-nativeconfig: 7af2ccce165f86b233a9f9d63295f6207e62640e React-NativeModulesApple: db1c1ee9dda26c9e58d824b4100fed83add82ae9 React-perflogger: 7c4e97b47d8bc58c03fad1a6b97d96181b59aa41 @@ -1874,10 +1880,10 @@ SPEC CHECKSUMS: ReactCodegen: e9156d86a166f3e10dc8fb6160764048df3528bc ReactCommon: 3ae48fa4cfa7052a270c2150ececfc94e541fb8a RNReanimated: 070deccceef093bec96ac3f87ef8c7f361caf754 - RNSVG: 811ae7bc0e07e20acd704638214b0c5fad40f802 + RNSVG: 1079f96b39a35753d481a20e30603fd6fc4f6fa9 SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d - Yoga: 06fc4b2c3664ae0e278964b8fbcb0ee9d21f0a5a + Yoga: d36331de5ab7fb61bc9d91fbbd76307464418323 PODFILE CHECKSUM: 313328930c1300de5979bee64deca30459b8453a -COCOAPODS: 1.14.3 +COCOAPODS: 1.15.2 diff --git a/fabric-example/package.json b/fabric-example/package.json index ccad78b6..162e7e0c 100644 --- a/fabric-example/package.json +++ b/fabric-example/package.json @@ -7,13 +7,15 @@ "ios": "react-native run-ios", "lint": "eslint .", "start": "react-native start", - "test": "jest" + "test": "jest", + "postinstall": "patch-package" }, "dependencies": { "react": "18.3.1", "react-native": "0.75.1", "react-native-reanimated": "3.15.0", - "react-native-svg": "link:../" + "react-native-svg": "link:../", + "react-native-view-shot": "4.0.0-alpha.2" }, "devDependencies": { "@babel/core": "^7.20.0", @@ -29,6 +31,7 @@ "eslint": "^8.19.0", "jest": "^29.6.3", "prettier": "2.8.8", + "patch-package": "^8.0.0", "react-test-renderer": "18.3.1", "typescript": "5.0.4" }, diff --git a/fabric-example/patches/react-native-view-shot+4.0.0-alpha.2.patch b/fabric-example/patches/react-native-view-shot+4.0.0-alpha.2.patch new file mode 100644 index 00000000..0caa5602 --- /dev/null +++ b/fabric-example/patches/react-native-view-shot+4.0.0-alpha.2.patch @@ -0,0 +1,51 @@ +diff --git a/node_modules/react-native-view-shot/ios/RNViewShot.m b/node_modules/react-native-view-shot/ios/RNViewShot.m +index bd55b92..6a20e9d 100644 +--- a/node_modules/react-native-view-shot/ios/RNViewShot.m ++++ b/node_modules/react-native-view-shot/ios/RNViewShot.m +@@ -106,7 +106,7 @@ - (dispatch_queue_t)methodQueue + scrollView.frame = CGRectMake(0, 0, scrollView.contentSize.width, scrollView.contentSize.height); + } + +- UIGraphicsImageRenderer *renderer = [[UIGraphicsImageRenderer alloc] initWithSize:size]; ++ UIGraphicsBeginImageContextWithOptions(size, NO, 0); + + if (renderInContext) { + // this comes with some trade-offs such as inability to capture gradients or scrollview's content in full but it works for large views +@@ -117,8 +117,8 @@ - (dispatch_queue_t)methodQueue + // this doesn't work for large views and reports incorrect success even though the image is blank + success = [rendered drawViewHierarchyInRect:(CGRect){CGPointZero, size} afterScreenUpdates:YES]; + } +- +- UIImage *image = [renderer imageWithActions:^(UIGraphicsImageRendererContext * _Nonnull rendererContext) {}]; ++ UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); ++ UIGraphicsEndImageContext(); + + if (snapshotContentContainer) { + // Restore scroll & frame +@@ -152,11 +152,11 @@ - (dispatch_queue_t)methodQueue + NSString *res = nil; + if ([result isEqualToString:@"base64"]) { + // Return as a base64 raw string +- res = [data base64EncodedStringWithOptions: 0]; ++ res = [data base64EncodedStringWithOptions: NSDataBase64EncodingEndLineWithLineFeed]; + } + else if ([result isEqualToString:@"data-uri"]) { + // Return as a base64 data uri string +- NSString *base64 = [data base64EncodedStringWithOptions: 0]; ++ NSString *base64 = [data base64EncodedStringWithOptions: NSDataBase64EncodingEndLineWithLineFeed]; + NSString *imageFormat = ([format isEqualToString:@"jpg"]) ? @"jpeg" : format; + res = [NSString stringWithFormat:@"data:image/%@;base64,%@", imageFormat, base64]; + } +diff --git a/node_modules/react-native-view-shot/src/specs/NativeRNViewShot.ts b/node_modules/react-native-view-shot/src/specs/NativeRNViewShot.ts +index a6f4c00..1e9e6ce 100644 +--- a/node_modules/react-native-view-shot/src/specs/NativeRNViewShot.ts ++++ b/node_modules/react-native-view-shot/src/specs/NativeRNViewShot.ts +@@ -2,7 +2,7 @@ import type { TurboModule } from 'react-native'; + import { TurboModuleRegistry } from 'react-native'; + + export interface Spec extends TurboModule { +- releaseCapture: () => string; ++ releaseCapture: (uri: string) => void; + captureRef: (tag: number, options: Object) => Promise + captureScreen: (options: Object) => Promise; + } \ No newline at end of file diff --git a/fabric-example/yarn.lock b/fabric-example/yarn.lock index 7fbb8530..134c97d1 100644 --- a/fabric-example/yarn.lock +++ b/fabric-example/yarn.lock @@ -2624,6 +2624,11 @@ resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz#756641adb587851b5ccb3e095daf27ae581c8406" integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392" @@ -2848,6 +2853,11 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + available-typed-arrays@^1.0.7: version "1.0.7" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846" @@ -2956,6 +2966,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -2997,6 +3012,13 @@ braces@^3.0.2: dependencies: fill-range "^7.0.1" +braces@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + browserslist@^4.22.2, browserslist@^4.23.0: version "4.23.0" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.0.tgz#8f3acc2bbe73af7213399430890f86c63a5674ab" @@ -3146,7 +3168,7 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.2.0: +ci-info@^3.2.0, ci-info@^3.7.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -3353,6 +3375,13 @@ cross-spawn@^7.0.2, cross-spawn@^7.0.3: shebang-command "^2.0.0" which "^2.0.1" +css-line-break@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" + integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== + dependencies: + utrie "^1.0.2" + css-select@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" @@ -4041,6 +4070,13 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + finalhandler@1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" @@ -4086,6 +4122,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" +find-yarn-workspace-root@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" + integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== + dependencies: + micromatch "^4.0.2" + flat-cache@^3.0.4: version "3.2.0" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.2.0.tgz#2c0c2d5040c99b1632771a9d105725c0115363ee" @@ -4131,6 +4174,16 @@ fs-extra@^8.1.0: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs.realpath@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" @@ -4350,6 +4403,14 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html2canvas@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" + integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== + dependencies: + css-line-break "^2.1.0" + text-segmentation "^1.0.3" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -5218,6 +5279,16 @@ json-stable-stringify-without-jsonify@^1.0.1: resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== +json-stable-stringify@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" + integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== + dependencies: + call-bind "^1.0.5" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -5230,6 +5301,20 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.3.5" resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz#4766bd05a8e2a11af222becd19e15575e52a853a" @@ -5252,6 +5337,13 @@ kind-of@^6.0.2: resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -5594,6 +5686,14 @@ metro@0.80.8, metro@^0.80.3: ws "^7.5.1" yargs "^17.6.2" +micromatch@^4.0.2: + version "4.0.7" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5" + integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q== + dependencies: + braces "^3.0.3" + picomatch "^2.3.1" + micromatch@^4.0.4: version "4.0.5" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" @@ -5870,7 +5970,7 @@ open@^6.2.0: dependencies: is-wsl "^1.1.0" -open@^7.0.3: +open@^7.0.3, open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== @@ -5905,6 +6005,11 @@ ora@^5.4.1: strip-ansi "^6.0.0" wcwidth "^1.0.1" +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -5975,6 +6080,27 @@ parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +patch-package@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -6183,6 +6309,13 @@ react-native-reanimated@3.15.0: version "0.0.0" uid "" +react-native-view-shot@4.0.0-alpha.2: + version "4.0.0-alpha.2" + resolved "https://registry.yarnpkg.com/react-native-view-shot/-/react-native-view-shot-4.0.0-alpha.2.tgz#389f5323722c3acad1c002bf4f0f0539fd2508c9" + integrity sha512-BNQ+FoOUrB2Y6zxwhSZtZMMXVLewN2Ic8y5gS+5Y7hdgphqWmlHZIGbcLn/NmJS+soz0Pe3WO1sM5vX6u7h6VQ== + dependencies: + html2canvas "^1.4.1" + react-native@0.75.1: version "0.75.1" resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.75.1.tgz#0b7738bbfa44afe5895b1c02ec737c9d1bc19dcb" @@ -6432,6 +6565,13 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + rimraf@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a" @@ -6636,6 +6776,11 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -6883,6 +7028,13 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-segmentation@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" + integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== + dependencies: + utrie "^1.0.2" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -6901,6 +7053,13 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== + dependencies: + os-tmpdir "~1.0.2" + tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -7069,6 +7228,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + 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: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" @@ -7107,6 +7271,13 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +utrie@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" + integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== + dependencies: + base64-arraybuffer "^1.0.2" + v8-to-istanbul@^9.0.1: version "9.2.0" resolved "https://registry.yarnpkg.com/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz#2ed7644a245cddd83d4e087b9b33b3e62dfd10ad" @@ -7314,6 +7485,11 @@ yaml@^2.2.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.1.tgz#2e57e0b5e995292c25c75d2658f0664765210eed" integrity sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg== +yaml@^2.2.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" + integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" diff --git a/fabric-macos-example/macos/Podfile.lock b/fabric-macos-example/macos/Podfile.lock index 7f10112a..48a38eb9 100644 --- a/fabric-macos-example/macos/Podfile.lock +++ b/fabric-macos-example/macos/Podfile.lock @@ -1066,7 +1066,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNSVG (15.5.0): + - RNSVG (15.6.0): - glog - RCT-Folly (= 2022.05.16.00) - RCTRequired @@ -1084,9 +1084,9 @@ PODS: - React-utils - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - - RNSVG/common (= 15.5.0) + - RNSVG/common (= 15.6.0) - Yoga - - RNSVG/common (15.5.0): + - RNSVG/common (15.6.0): - glog - RCT-Folly (= 2022.05.16.00) - RCTRequired @@ -1325,7 +1325,7 @@ SPEC CHECKSUMS: React-utils: f0bb613a2b0a7f8011bdafb8ac098e30d4825256 ReactCommon: 4afd22a8615d591e925c67434b6d947b9ae24ca8 RNReanimated: 096c06ec3b073d0bb04f6dd1c99e40fad2d2fb31 - RNSVG: d0638e8b3bff721b712b4c128af78cda17b6165c + RNSVG: 99ccf6fc927760cb39709ec16748c3a03b055597 SocketRocket: f6c6249082c011e6de2de60ed641ef8bbe0cfac9 Yoga: 35603207c576afc16e93625844f6d469ae6d5f03 diff --git a/jest.config.ts b/jest.config.ts index 60db5611..7df13396 100644 --- a/jest.config.ts +++ b/jest.config.ts @@ -9,6 +9,21 @@ const config: Config.InitialOptions = { ], preset: 'react-native', verbose: true, + globalSetup: '/e2e/setupJest.ts', + globalTeardown: '/e2e/teardownJest.ts', + modulePathIgnorePatterns: [ + 'lib/typescript', + 'helpers.ts|globals.d.ts|setupJest.ts|teardownJest.ts', + ], + reporters: [ + 'default', + [ + 'jest-html-reporters', + { + filename: 'report.html', + }, + ], + ], }; export default config; diff --git a/package.json b/package.json index a0a468f4..4e6694a6 100644 --- a/package.json +++ b/package.json @@ -58,6 +58,8 @@ "release": "npm login && release-it", "test": "npm run lint && npm run tsc", "tsc": "tsc --noEmit", + "e2e": "jest e2e", + "generateE2eReferences": "ts-node e2e/generateReferences.ts", "check-archs-consistency": "node ./scripts/codegen-check-consistency.js", "sync-archs": "node ./scripts/codegen-sync-archs.js" }, @@ -78,7 +80,10 @@ "@types/css-tree": "^1.0.3", "@types/jest": "^27.5.2", "@types/node": "*", + "@types/pixelmatch": "^5.2.0", + "@types/pngjs": "^6.0.5", "@types/react": "^18.2.18", + "@types/ws": "^8.5.10", "@typescript-eslint/eslint-plugin": "^5.11.0", "@typescript-eslint/parser": "^5.11.0", "babel-eslint": "^10.1.0", @@ -96,18 +101,23 @@ "eslint-plugin-standard": "^5.0.0", "husky": "^8.0.1", "jest": "^28.1.0", + "jest-html-reporters": "^3.1.7", "lint-staged": "^13.0.3", "peggy": "4.0.3", "pegjs": "^0.10.0", + "pixelmatch": "5.3.0", + "pngjs": "^7.0.0", "prettier": "3.0.1", + "puppeteer": "^22.12.1", "react": "^18.2.0", "react-native": "^0.72.3", "react-native-builder-bob": "^0.20.4", "react-native-windows": "^0.72.4", "react-test-renderer": "^18.2.0", "release-it": "^14.12.5", - "ts-node": "^10.8.0", - "typescript": "^5.1.6" + "ts-node": "^10.9.2", + "typescript": "^5.1.6", + "ws": "^8.18.0" }, "lint-staged": { "{src,Example}/**/*.{js,ts,tsx}": "yarn format-js", diff --git a/paper-macos-example/macos/Podfile.lock b/paper-macos-example/macos/Podfile.lock index 717de5e1..660a1afb 100644 --- a/paper-macos-example/macos/Podfile.lock +++ b/paper-macos-example/macos/Podfile.lock @@ -1070,7 +1070,7 @@ PODS: - RCT-Folly (= 2022.05.16.00) - React-Core - ReactCommon/turbomodule/core - - RNSVG (15.5.0): + - RNSVG (15.6.0): - React-Core - SocketRocket (0.7.0) - Yoga (1.14.0) @@ -1294,7 +1294,7 @@ SPEC CHECKSUMS: React-utils: f0bb613a2b0a7f8011bdafb8ac098e30d4825256 ReactCommon: cd9602a38f340d44b1cca3ad06d6f13106a46dd0 RNReanimated: ba95f6d26ca4b8a8f7f2b15f62a3513750762f6b - RNSVG: b986585e367f4a49d8aa43065066cc9c290b3d9b + RNSVG: 5da7a24f31968ec74f0b091e3440080f347e279b SocketRocket: f6c6249082c011e6de2de60ed641ef8bbe0cfac9 Yoga: 35603207c576afc16e93625844f6d469ae6d5f03 diff --git a/tests-example/ios/Podfile.lock b/tests-example/ios/Podfile.lock index 3de92b0e..cbb2ebdb 100644 --- a/tests-example/ios/Podfile.lock +++ b/tests-example/ios/Podfile.lock @@ -1058,7 +1058,7 @@ PODS: - RCT-Folly (= 2022.05.16.00) - React-Core - ReactCommon/turbomodule/core - - RNSVG (15.3.0): + - RNSVG (15.6.0): - React-Core - SocketRocket (0.6.1) - Yoga (1.14.0) @@ -1278,10 +1278,10 @@ SPEC CHECKSUMS: React-utils: debda2c206770ee2785bdebb7f16d8db9f18838a ReactCommon: ddb128564dcbfa0287d3d1a2d10f8c7457c971f6 RNReanimated: 2fb8bf314df48f4968d9080aec46c47eb44a446a - RNSVG: a48668fd382115bc89761ce291a81c4ca5f2fd2e + RNSVG: 5da7a24f31968ec74f0b091e3440080f347e279b SocketRocket: f32cd54efbe0f095c4d7594881e52619cfe80b17 Yoga: 2b33a7ac96c58cdaa7b810948fc6a2a76ed2d108 -PODFILE CHECKSUM: 0ddaec8b74c24b39086422661a8aeb46f68d0382 +PODFILE CHECKSUM: 867081623c4821048817e3d8ade1e288af6d41a7 COCOAPODS: 1.15.2 diff --git a/tsconfig.json b/tsconfig.json index e47cd830..062849b5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -21,5 +21,5 @@ "resolveJsonModule": true, "isolatedModules": true }, - "include": ["src"] + "include": ["src", "e2e", "__tests__/e2e/GeneralSvgRenderingTest.spec.tsx"] } diff --git a/web-example/package.json b/web-example/package.json index 03c1337e..2c58ed5d 100644 --- a/web-example/package.json +++ b/web-example/package.json @@ -22,6 +22,7 @@ "react-native-reanimated": "3.13.0", "react-native-svg": "link:../", "react-native-svg-transformer": "^1.4.0", + "react-native-view-shot": "3.8.0", "react-native-web": "0.19.11" }, "devDependencies": { @@ -33,6 +34,7 @@ "@types/react-test-renderer": "^18.0.7", "jest": "^29.2.1", "jest-expo": "~51.0.3", + "patch-package": "^8.0.0", "react-test-renderer": "18.2.0", "typescript": "~5.3.3" }, diff --git a/web-example/yarn.lock b/web-example/yarn.lock index 2b6e7162..f51d3862 100644 --- a/web-example/yarn.lock +++ b/web-example/yarn.lock @@ -2358,6 +2358,11 @@ resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.13.tgz#ff34942667a4e19a9f4a0996a76814daac364cf3" integrity sha512-lm2GW5PkosIzccsaZIz7tp8cPADSIlIHWDFTR1N0SzfinhhYgeIQjFMz4rYzanCScr3DqQLeomUDArp6MWKm+g== +"@yarnpkg/lockfile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz#e77a97fbd345b76d83245edcd17d393b1b41fb31" + integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== + abab@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/abab/-/abab-2.0.6.tgz#41b80f2c871d19686216b82309231cfd3cb3d291" @@ -2719,6 +2724,11 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +base64-arraybuffer@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz#1c37589a7c4b0746e34bd1feb951da2df01c1bdc" + integrity sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ== + base64-js@^1.2.3, base64-js@^1.3.1, base64-js@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" @@ -2986,7 +2996,7 @@ ci-info@^2.0.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" integrity sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ== -ci-info@^3.2.0, ci-info@^3.3.0: +ci-info@^3.2.0, ci-info@^3.3.0, ci-info@^3.7.0: version "3.9.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== @@ -3272,6 +3282,13 @@ css-in-js-utils@^3.1.0: dependencies: hyphenate-style-name "^1.0.3" +css-line-break@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/css-line-break/-/css-line-break-2.1.0.tgz#bfef660dfa6f5397ea54116bb3cb4873edbc4fa0" + integrity sha512-FHcKFCZcAha3LwfVBhCQbW2nCNbkZXn7KVUJcsT5/P8YmfsVja0FMPJr0B903j/E69HUphKiV9iQArX8SDYA4w== + dependencies: + utrie "^1.0.2" + css-select@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" @@ -4079,7 +4096,7 @@ find-up@^5.0.0, find-up@~5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -find-yarn-workspace-root@~2.0.0: +find-yarn-workspace-root@^2.0.0, find-yarn-workspace-root@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd" integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ== @@ -4473,6 +4490,14 @@ html-escaper@^2.0.0: resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453" integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== +html2canvas@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/html2canvas/-/html2canvas-1.4.1.tgz#7cef1888311b5011d507794a066041b14669a543" + integrity sha512-fPU6BHNpsyIhr8yyMpTLLxAbkaK8ArIBcmZIRiBLiDhjeqvXolaEmDGmELFuX9I4xDcaKKcJl+TKZLqruBbmWA== + dependencies: + css-line-break "^2.1.0" + text-segmentation "^1.0.3" + http-errors@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" @@ -5501,6 +5526,16 @@ json-schema-deref-sync@^0.13.0: traverse "~0.6.6" valid-url "~1.0.9" +json-stable-stringify@^1.0.2: + version "1.1.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.1.1.tgz#52d4361b47d49168bcc4e564189a42e5a7439454" + integrity sha512-SU/971Kt5qVQfJpyDveVhQ/vya+5hvrjClFOcr8c0Fq5aODJjMwutrOfCU+eCnVD5gpx1Q3fEqkyom77zH1iIg== + dependencies: + call-bind "^1.0.5" + isarray "^2.0.5" + jsonify "^0.0.1" + object-keys "^1.1.1" + json5@^2.2.2, json5@^2.2.3: version "2.2.3" resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" @@ -5522,11 +5557,23 @@ jsonfile@^6.0.1: optionalDependencies: graceful-fs "^4.1.6" +jsonify@^0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978" + integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg== + kind-of@^6.0.2: 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== +klaw-sync@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c" + integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ== + dependencies: + graceful-fs "^4.1.11" + kleur@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/kleur/-/kleur-3.0.3.tgz#a79c9ecc86ee1ce3fa6206d1216c501f147fc07e" @@ -6341,7 +6388,7 @@ open@^6.2.0: dependencies: is-wsl "^1.1.0" -open@^7.0.3: +open@^7.0.3, open@^7.4.2: version "7.4.2" resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321" integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q== @@ -6512,6 +6559,27 @@ password-prompt@^1.0.4: ansi-escapes "^4.3.2" cross-spawn "^7.0.3" +patch-package@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61" + integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + chalk "^4.1.2" + ci-info "^3.7.0" + cross-spawn "^7.0.3" + find-yarn-workspace-root "^2.0.0" + fs-extra "^9.0.0" + json-stable-stringify "^1.0.2" + klaw-sync "^6.0.0" + minimist "^1.2.6" + open "^7.4.2" + rimraf "^2.6.3" + semver "^7.5.3" + slash "^2.0.0" + tmp "^0.0.33" + yaml "^2.2.2" + path-dirname@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" @@ -6841,6 +6909,13 @@ react-native-svg-transformer@^1.4.0: version "0.0.0" uid "" +react-native-view-shot@3.8.0: + version "3.8.0" + resolved "https://registry.yarnpkg.com/react-native-view-shot/-/react-native-view-shot-3.8.0.tgz#1aa1905f0e79428ca32bf80c16fd4abc719c600b" + integrity sha512-4cU8SOhMn3YQIrskh+5Q8VvVRxQOu8/s1M9NAL4z5BY1Rm0HXMWkQJ4N0XsZ42+Yca+y86ISF3LC5qdLPvPuiA== + dependencies: + html2canvas "^1.4.1" + react-native-web@0.19.11: version "0.19.11" resolved "https://registry.yarnpkg.com/react-native-web/-/react-native-web-0.19.11.tgz#1b96ac3cea9af4e1280fd5fa3b606b471f66edc3" @@ -7113,7 +7188,7 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rimraf@^2.6.2: +rimraf@^2.6.2, rimraf@^2.6.3: version "2.7.1" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec" integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== @@ -7377,6 +7452,11 @@ sisteransi@^1.0.5: resolved "https://registry.yarnpkg.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== +slash@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44" + integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A== + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -7851,6 +7931,13 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-segmentation@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/text-segmentation/-/text-segmentation-1.0.3.tgz#52a388159efffe746b24a63ba311b6ac9f2d7943" + integrity sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw== + dependencies: + utrie "^1.0.2" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -8181,6 +8268,13 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== +utrie@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/utrie/-/utrie-1.0.2.tgz#d42fe44de9bc0119c25de7f564a6ed1b2c87a645" + integrity sha512-1MLa5ouZiOmQzUbjbu9VmjLzn1QLXBhwpUa7kdLUQK+KQ5KA9I1vk5U4YHe/X2Ch7PYnJfWuWT+VbuxbGwljhw== + dependencies: + base64-arraybuffer "^1.0.2" + uuid@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-7.0.3.tgz#c5c9f2c8cf25dc0a372c4df1441c41f5bd0c680b" @@ -8502,6 +8596,11 @@ yaml@^2.2.1: resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e" integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg== +yaml@^2.2.2: + version "2.5.0" + resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.0.tgz#c6165a721cf8000e91c36490a41d7be25176cf5d" + integrity sha512-2wWLbGbYDiSqqIKoPjar3MPgB94ErzCtrNE1FdqGuaO0pi2JGjmE8aW8TDZwzU7vuxcGRdL/4gPQwQ7hD5AMSw== + yargs-parser@^18.1.2: version "18.1.3" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz#be68c4975c6b2abf469236b0c870362fab09a7b0" diff --git a/yarn.lock b/yarn.lock index 9407b833..7a12b4a2 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1853,6 +1853,20 @@ dependencies: semver "7.6.0" +"@puppeteer/browsers@2.3.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.3.0.tgz#791ea7d80450fea24eb19fb1d70c367ad4e08cae" + integrity sha512-ioXoq9gPxkss4MYhD+SFaU9p1IHFUX0ILAWFPyjGaBdjLsYAlZw6j1iLA0N/m12uVHLFDfSYNF7EQccjinIMDA== + dependencies: + debug "^4.3.5" + extract-zip "^2.0.1" + progress "^2.0.3" + proxy-agent "^6.4.0" + semver "^7.6.3" + tar-fs "^3.0.6" + unbzip2-stream "^1.4.3" + yargs "^17.7.2" + "@react-native-community/cli-clean@11.4.1": version "11.4.1" resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-11.4.1.tgz#0155a02e4158c8a61ba3d7a2b08f3ebebed81906" @@ -2271,6 +2285,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@tootallnate/quickjs-emscripten@^0.23.0": + version "0.23.0" + resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c" + integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA== + "@tsconfig/node10@^1.0.7": version "1.0.11" resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2" @@ -2385,6 +2404,20 @@ resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.2.tgz#5950e50960793055845e956c427fc2b0d70c5239" integrity sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw== +"@types/pixelmatch@^5.2.0": + version "5.2.6" + resolved "https://registry.yarnpkg.com/@types/pixelmatch/-/pixelmatch-5.2.6.tgz#fba6de304ac958495f27d85989f5c6bb7499a686" + integrity sha512-wC83uexE5KGuUODn6zkm9gMzTwdY5L0chiK+VrKcDfEjzxh1uadlWTvOmAbCpnM9zx/Ww3f8uKlYQVnO/TrqVg== + dependencies: + "@types/node" "*" + +"@types/pngjs@^6.0.5": + version "6.0.5" + resolved "https://registry.yarnpkg.com/@types/pngjs/-/pngjs-6.0.5.tgz#6dec2f7eb8284543ca4e423f3c09b119fa939ea3" + integrity sha512-0k5eKfrA83JOZPppLtS2C7OUtyNAl2wKNxfyYl9Q5g9lPkgBl/9hNyAu6HuEH2J4XmIv2znEpkDd0SaZVxW6iQ== + dependencies: + "@types/node" "*" + "@types/prettier@^2.1.5": version "2.7.3" resolved "https://registry.yarnpkg.com/@types/prettier/-/prettier-2.7.3.tgz#3e51a17e291d01d17d3fc61422015a933af7a08f" @@ -2418,6 +2451,13 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/ws@^8.5.10": + version "8.5.12" + resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.12.tgz#619475fe98f35ccca2a2f6c137702d85ec247b7e" + integrity sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ== + dependencies: + "@types/node" "*" + "@types/yargs-parser@*": version "21.0.3" resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" @@ -2444,6 +2484,13 @@ dependencies: "@types/yargs-parser" "*" +"@types/yauzl@^2.9.1": + version "2.10.3" + resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999" + integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q== + dependencies: + "@types/node" "*" + "@typescript-eslint/eslint-plugin@^5.11.0", "@typescript-eslint/eslint-plugin@^5.30.5": version "5.62.0" resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz#aeef0328d172b9e37d9bab6dbc13b87ed88977db" @@ -2582,6 +2629,13 @@ agent-base@6, agent-base@^6.0.0, agent-base@^6.0.2: dependencies: debug "4" +agent-base@^7.0.2, agent-base@^7.1.0, agent-base@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317" + integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA== + 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" @@ -2853,7 +2907,7 @@ ast-types@0.15.2: dependencies: tslib "^2.0.1" -ast-types@^0.13.2: +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== @@ -2909,6 +2963,11 @@ available-typed-arrays@^1.0.7: dependencies: possible-typed-array-names "^1.0.0" +b4a@^1.6.4: + version "1.6.6" + resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba" + integrity sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg== + 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" @@ -3071,11 +3130,49 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +bare-events@^2.0.0, bare-events@^2.2.0: + version "2.4.2" + resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.4.2.tgz#3140cca7a0e11d49b3edc5041ab560659fd8e1f8" + integrity sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q== + +bare-fs@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-2.3.1.tgz#cdbd63dac7a552dfb2b87d18c822298d1efd213d" + integrity sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA== + dependencies: + bare-events "^2.0.0" + bare-path "^2.0.0" + bare-stream "^2.0.0" + +bare-os@^2.1.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/bare-os/-/bare-os-2.4.0.tgz#5de5e3ba7704f459c9656629edca7cc736e06608" + integrity sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg== + +bare-path@^2.0.0, bare-path@^2.1.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-2.1.3.tgz#594104c829ef660e43b5589ec8daef7df6cedb3e" + integrity sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA== + dependencies: + bare-os "^2.1.0" + +bare-stream@^2.0.0: + version "2.1.3" + resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.1.3.tgz#070b69919963a437cc9e20554ede079ce0a129b2" + integrity sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ== + dependencies: + streamx "^2.18.0" + base64-js@^1.1.2, base64-js@^1.3.1: version "1.5.1" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a" integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== +basic-ftp@^5.0.2: + version "5.0.5" + resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.0.5.tgz#14a474f5fffecca1f4f406f1c26b18f800225ac0" + integrity sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg== + 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" @@ -3148,12 +3245,17 @@ bser@2.1.1: dependencies: node-int64 "^0.4.0" +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + buffer-from@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== -buffer@^5.5.0: +buffer@^5.2.1, buffer@^5.5.0: version "5.7.1" resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0" integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== @@ -3278,6 +3380,15 @@ chardet@^0.7.0: resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== +chromium-bidi@0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-0.6.2.tgz#91f9daa20984833b52221084480fbe0465b29c67" + integrity sha512-4WVBa6ijmUTVr9cZD4eicQD8Mdy/HCX3bzEIYYpmk0glqYLoWH+LqQEvV9RpDRzoQSbY1KJHloYXbDMXMbDPhg== + dependencies: + mitt "3.0.1" + urlpattern-polyfill "10.0.0" + zod "3.23.8" + ci-info@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-2.0.0.tgz#67a9e964be31a51e15e5010d58e6f12834002f46" @@ -3603,6 +3714,16 @@ cosmiconfig@^7.0.1: path-type "^4.0.0" yaml "^1.10.0" +cosmiconfig@^9.0.0: + version "9.0.0" + resolved "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-9.0.0.tgz#34c3fc58287b915f3ae905ab6dc3de258b55ad9d" + integrity sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg== + dependencies: + env-paths "^2.2.1" + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + create-require@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" @@ -3667,6 +3788,11 @@ data-uri-to-buffer@3: 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@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b" + integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw== + data-view-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.1.tgz#8ea6326efec17a2e42620696e671d7d5a8bc66b2" @@ -3785,6 +3911,11 @@ define-data-property@^1.0.1, define-data-property@^1.1.4: es-errors "^1.3.0" gopd "^1.0.1" +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-properties@^1.1.3, 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" @@ -3804,6 +3935,15 @@ degenerator@^3.0.2: esprima "^4.0.0" vm2 "^3.9.17" +degenerator@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5" + integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ== + dependencies: + ast-types "^0.13.4" + escodegen "^2.1.0" + esprima "^4.0.1" + del@^6.1.1: version "6.1.1" resolved "https://registry.yarnpkg.com/del/-/del-6.1.1.tgz#3b70314f1ec0aa325c6b14eb36b95786671edb7a" @@ -3857,6 +3997,11 @@ detect-newline@^3.0.0: resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== +devtools-protocol@0.0.1312386: + version "0.0.1312386" + resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz#5ab824d6f1669ec6c6eb0fba047e73601d969052" + integrity sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA== + diagnostic-channel-publishers@1.0.6: version "1.0.6" resolved "https://registry.yarnpkg.com/diagnostic-channel-publishers/-/diagnostic-channel-publishers-1.0.6.tgz#0e236cb4b7c4c81904b2e3741d0b16eff453dc5a" @@ -4008,6 +4153,11 @@ entities@^4.2.0: resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== +env-paths@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2" + integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A== + envinfo@^7.5.0, envinfo@^7.7.2, envinfo@^7.8.1: version "7.13.0" resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31" @@ -4213,6 +4363,17 @@ escodegen@^1.8.1: optionalDependencies: source-map "~0.6.1" +escodegen@^2.1.0: + 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" + optionalDependencies: + source-map "~0.6.1" + eslint-compat-utils@^0.5.1: version "0.5.1" resolved "https://registry.yarnpkg.com/eslint-compat-utils/-/eslint-compat-utils-0.5.1.tgz#7fc92b776d185a70c4070d03fd26fde3d59652e4" @@ -4600,6 +4761,17 @@ external-editor@^3.0.3: iconv-lite "^0.4.24" tmp "^0.0.33" +extract-zip@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -4610,6 +4782,11 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.3.0.tgz#ece407fa550a64d638536cd727e129c61616e0f0" integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== +fast-fifo@^1.2.0, fast-fifo@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c" + integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ== + fast-glob@^3.1.1, fast-glob@^3.2.9: version "3.3.2" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.2.tgz#a904501e57cfdd2ffcded45e99a54fef55e46129" @@ -4652,6 +4829,13 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + figures@^3.0.0: version "3.2.0" resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" @@ -4791,7 +4975,7 @@ fresh@0.5.2: resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== -fs-extra@^10.1.0: +fs-extra@^10.0.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== @@ -4800,6 +4984,15 @@ fs-extra@^10.1.0: jsonfile "^6.0.1" universalify "^2.0.0" +fs-extra@^11.2.0: + version "11.2.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.2.0.tgz#e70e17dfad64232287d01929399e0ea7c86b0e5b" + integrity sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw== + 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" @@ -4928,6 +5121,16 @@ get-uri@3: fs-extra "^8.1.0" ftp "^0.3.10" +get-uri@^6.0.1: + version "6.0.3" + resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.3.tgz#0d26697bc13cf91092e519aa63aa60ee5b6f385a" + integrity sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw== + dependencies: + basic-ftp "^5.0.2" + data-uri-to-buffer "^6.0.2" + debug "^4.3.4" + fs-extra "^11.2.0" + git-up@^4.0.0: version "4.0.5" resolved "https://registry.yarnpkg.com/git-up/-/git-up-4.0.5.tgz#e7bb70981a37ea2fb8fe049669800a1f9a01d759" @@ -5196,6 +5399,14 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" +http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e" + integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig== + dependencies: + agent-base "^7.1.0" + debug "^4.3.4" + https-proxy-agent@5, 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" @@ -5204,6 +5415,14 @@ https-proxy-agent@5, https-proxy-agent@^5.0.0: agent-base "6" debug "4" +https-proxy-agent@^7.0.3, https-proxy-agent@^7.0.5: + version "7.0.5" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2" + integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw== + 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" @@ -5268,7 +5487,7 @@ import-fresh@^2.0.0: caller-path "^2.0.0" resolve-from "^3.0.0" -import-fresh@^3.2.1: +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== @@ -5501,7 +5720,7 @@ is-directory@^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.0.0, is-docker@^2.1.1: version "2.2.1" resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa" integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== @@ -5752,7 +5971,7 @@ is-wsl@^1.1.0: resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d" integrity sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw== -is-wsl@^2.1.1: +is-wsl@^2.1.1, is-wsl@^2.2.0: version "2.2.0" resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271" integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== @@ -6030,6 +6249,14 @@ jest-haste-map@^28.1.3: optionalDependencies: fsevents "^2.3.2" +jest-html-reporters@^3.1.7: + version "3.1.7" + resolved "https://registry.yarnpkg.com/jest-html-reporters/-/jest-html-reporters-3.1.7.tgz#d8cb6f5d15fd518e601841f90165f37765e7ff34" + integrity sha512-GTmjqK6muQ0S0Mnksf9QkL9X9z2FGIpNSxC52E0PHDzjPQ1XDu2+XTI3B3FS43ZiUzD1f354/5FfwbNIBzT7ew== + dependencies: + fs-extra "^10.0.0" + open "^8.0.3" + jest-leak-detector@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-28.1.3.tgz#a6685d9b074be99e3adee816ce84fd30795e654d" @@ -6708,6 +6935,11 @@ lru-cache@^6.0.0: dependencies: yallist "^4.0.0" +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@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/macos-release/-/macos-release-2.5.1.tgz#bccac4a8f7b93163a8d163b8ebf385b3c5f55bf9" @@ -7157,6 +7389,11 @@ minipass@^4.2.4: resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.2.tgz#93a9626ce5e5e66bd4db86849e7515e92340a707" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== +mitt@3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1" + integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== + mkdirp@^0.5.1: version "0.5.6" resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6" @@ -7447,6 +7684,15 @@ open@^6.2.0: dependencies: is-wsl "^1.1.0" +open@^8.0.3: + version "8.4.2" + resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" @@ -7602,6 +7848,20 @@ pac-proxy-agent@^5.0.0: raw-body "^2.2.0" socks-proxy-agent "5" +pac-proxy-agent@^7.0.1: + version "7.0.2" + resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz#0fb02496bd9fb8ae7eb11cfd98386daaac442f58" + integrity sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg== + dependencies: + "@tootallnate/quickjs-emscripten" "^0.23.0" + 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.5" + pac-resolver "^7.0.1" + socks-proxy-agent "^8.0.4" + pac-resolver@^5.0.0: version "5.0.1" resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-5.0.1.tgz#c91efa3a9af9f669104fa2f51102839d01cde8e7" @@ -7611,6 +7871,14 @@ pac-resolver@^5.0.0: ip "^1.1.5" netmask "^2.0.2" +pac-resolver@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6" + integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg== + dependencies: + degenerator "^5.0.0" + netmask "^2.0.2" + package-json@^6.3.0: version "6.5.0" resolved "https://registry.yarnpkg.com/package-json/-/package-json-6.5.0.tgz#6feedaca35e75725876d0b0e64974697fed145b0" @@ -7740,6 +8008,11 @@ pegjs@^0.10.0: resolved "https://registry.yarnpkg.com/pegjs/-/pegjs-0.10.0.tgz#cf8bafae6eddff4b5a7efb185269eaaf4610ddbd" integrity sha512-qI5+oFNEGi3L5HAxDwN2LA4Gg7irF70Zs25edhjld9QemOgp0CbvMtbFcMvFtEo1OityPrcCzkQFB8JP/hxgow== +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + picocolors@^1.0.0, picocolors@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1" @@ -7770,6 +8043,13 @@ pirates@^4.0.4, pirates@^4.0.6: resolved "https://registry.yarnpkg.com/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== +pixelmatch@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/pixelmatch/-/pixelmatch-5.3.0.tgz#5e5321a7abedfb7962d60dbf345deda87cb9560a" + integrity sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q== + dependencies: + pngjs "^6.0.0" + pkg-dir@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz#2749020f239ed990881b1f71210d51eb6523bea3" @@ -7791,6 +8071,16 @@ pkg-up@^3.1.0: dependencies: find-up "^3.0.0" +pngjs@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-6.0.0.tgz#ca9e5d2aa48db0228a52c419c3308e87720da821" + integrity sha512-TRzzuFRRmEoSW/p1KVAmiOgPco2Irlah+bGFCeNfJXxxYGwSw7YwAOAcd7X28K/m5bjBWKsC29KyoMfHbypayg== + +pngjs@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-7.0.0.tgz#a8b7446020ebbc6ac739db6c5415a65d17090e26" + integrity sha512-LKWqWJRhstyYo9pGvgor/ivk2w94eSjE3RGVuzLGlr3NmD8bf7RcYGze1mNdEHRP6TRP6rMuDHk5t44hnTRyow== + possible-typed-array-names@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz#89bb63c6fada2c3e90adc4a647beeeb39cc7bf8f" @@ -7866,6 +8156,11 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== +progress@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + promise.allsettled@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/promise.allsettled/-/promise.allsettled-1.0.5.tgz#2443f3d4b2aa8dfa560f6ac2aa6c4ea999d75f53" @@ -7926,7 +8221,21 @@ proxy-agent@5.0.0: proxy-from-env "^1.0.0" socks-proxy-agent "^5.0.0" -proxy-from-env@^1.0.0: +proxy-agent@^6.4.0: + version "6.4.0" + resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.4.0.tgz#b4e2dd51dee2b377748aef8d45604c2d7608652d" + integrity sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ== + dependencies: + agent-base "^7.0.2" + debug "^4.3.4" + http-proxy-agent "^7.0.1" + https-proxy-agent "^7.0.3" + lru-cache "^7.14.1" + pac-proxy-agent "^7.0.1" + proxy-from-env "^1.1.0" + socks-proxy-agent "^8.0.2" + +proxy-from-env@^1.0.0, 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== @@ -7951,6 +8260,27 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" +puppeteer-core@22.14.0: + version "22.14.0" + resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-22.14.0.tgz#5bb466adba725c966b0a86f0337a476d4c68ebec" + integrity sha512-rl4tOY5LcA3e374GAlsGGHc05HL3eGNf5rZ+uxkl6id9zVZKcwcp1Z+Nd6byb6WPiPeecT/dwz8f/iUm+AZQSw== + dependencies: + "@puppeteer/browsers" "2.3.0" + chromium-bidi "0.6.2" + debug "^4.3.5" + devtools-protocol "0.0.1312386" + ws "^8.18.0" + +puppeteer@^22.12.1: + version "22.14.0" + resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-22.14.0.tgz#11697c929f5d9d7eac5a3438a0ff12dc65aedcbe" + integrity sha512-MGTR6/pM8zmWbTdazb6FKnwIihzsSEXBPH49mFFU96DNZpQOevCAZMnjBZGlZRGRzRK6aADCavR6SQtrbv5dQw== + dependencies: + "@puppeteer/browsers" "2.3.0" + cosmiconfig "^9.0.0" + devtools-protocol "0.0.1312386" + puppeteer-core "22.14.0" + qs@^6.9.4: version "6.12.3" resolved "https://registry.yarnpkg.com/qs/-/qs-6.12.3.tgz#e43ce03c8521b9c7fd7f1f13e514e5ca37727754" @@ -7973,6 +8303,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +queue-tick@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/queue-tick/-/queue-tick-1.0.1.tgz#f6f07ac82c1fd60f82e098b417a80e52f1f4c142" + integrity sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag== + queue@6.0.2: version "6.0.2" resolved "https://registry.yarnpkg.com/queue/-/queue-6.0.2.tgz#b91525283e2315c7553d2efa18d83e76432fed65" @@ -8592,7 +8927,7 @@ semver@^6.0.0, semver@^6.2.0, semver@^6.3.0, semver@^6.3.1: resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.1, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4: +semver@^7.0.0, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.5.1, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3: version "7.6.3" resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -8774,7 +9109,16 @@ socks-proxy-agent@5, socks-proxy-agent@^5.0.0: debug "4" socks "^2.3.3" -socks@^2.3.3: +socks-proxy-agent@^8.0.2, socks-proxy-agent@^8.0.4: + version "8.0.4" + resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz#9071dca17af95f483300316f4b063578fa0db08c" + integrity sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw== + dependencies: + agent-base "^7.1.1" + debug "^4.3.4" + socks "^2.8.3" + +socks@^2.3.3, socks@^2.8.3: version "2.8.3" resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.3.tgz#1ebd0f09c52ba95a09750afe3f3f9f724a800cb5" integrity sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw== @@ -8874,6 +9218,17 @@ stop-iteration-iterator@^1.0.0: dependencies: internal-slot "^1.0.4" +streamx@^2.15.0, streamx@^2.18.0: + version "2.18.0" + resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.18.0.tgz#5bc1a51eb412a667ebfdcd4e6cf6a6fc65721ac7" + integrity sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ== + dependencies: + fast-fifo "^1.3.2" + queue-tick "^1.0.1" + text-decoder "^1.1.0" + optionalDependencies: + bare-events "^2.2.0" + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -9088,6 +9443,26 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== +tar-fs@^3.0.6: + version "3.0.6" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.0.6.tgz#eaccd3a67d5672f09ca8e8f9c3d2b89fa173f217" + integrity sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w== + dependencies: + pump "^3.0.0" + tar-stream "^3.1.5" + optionalDependencies: + bare-fs "^2.1.1" + bare-path "^2.1.0" + +tar-stream@^3.1.5: + version "3.1.7" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.1.7.tgz#24b3fb5eabada19fe7338ed6d26e5f7c482e792b" + integrity sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ== + dependencies: + b4a "^1.6.4" + fast-fifo "^1.2.0" + streamx "^2.15.0" + temp@^0.8.4: version "0.8.4" resolved "https://registry.yarnpkg.com/temp/-/temp-0.8.4.tgz#8c97a33a4770072e0a05f919396c7665a7dd59f2" @@ -9122,6 +9497,13 @@ test-exclude@^6.0.0: glob "^7.1.4" minimatch "^3.0.4" +text-decoder@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.1.1.tgz#5df9c224cebac4a7977720b9f083f9efa1aefde8" + integrity sha512-8zll7REEv4GDD3x4/0pW+ppIxSNs7H1J10IKFZsuOMscumCdM2a+toDGLPA3T+1+fLBql4zbt5z83GEQGGV5VA== + dependencies: + b4a "^1.6.4" + text-table@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" @@ -9140,7 +9522,7 @@ through2@^2.0.1: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: +through@^2.3.6, through@^2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== @@ -9184,7 +9566,7 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== -ts-node@^10.8.0: +ts-node@^10.9.2: version "10.9.2" resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f" integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ== @@ -9348,6 +9730,14 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" +unbzip2-stream@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz#b0da04c4371311df771cdc215e87f2130991ace7" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + unc-path-regex@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" @@ -9455,6 +9845,11 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" +urlpattern-polyfill@10.0.0: + version "10.0.0" + resolved "https://registry.yarnpkg.com/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz#f0a03a97bfb03cdf33553e5e79a2aadd22cac8ec" + integrity sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg== + use-sync-external-store@^1.0.0: version "1.2.2" resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz#c3b6390f3a30eba13200d2302dcdf1e7b57b2ef9" @@ -9721,6 +10116,11 @@ ws@^7, ws@^7.5.1: resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9" integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== +ws@^8.18.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc" + integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw== + xdg-basedir@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-4.0.0.tgz#4bc8d9984403696225ef83a1573cbbcb4e79db13" @@ -9843,7 +10243,7 @@ yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" -yargs@^17.3.1, yargs@^17.5.1, yargs@^17.6.2: +yargs@^17.3.1, yargs@^17.5.1, yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -9856,6 +10256,14 @@ yargs@^17.3.1, yargs@^17.5.1, yargs@^17.6.2: y18n "^5.0.5" yargs-parser "^21.1.1" +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + yn@3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" @@ -9865,3 +10273,8 @@ yocto-queue@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +zod@3.23.8: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==