diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml
index ff7a3619..ad11cce2 100644
--- a/.github/ISSUE_TEMPLATE/bug-report.yml
+++ b/.github/ISSUE_TEMPLATE/bug-report.yml
@@ -74,7 +74,7 @@ body:
- type: input
id: reproduction-repo
attributes:
- label: Reproduction
+ label: Reproduction Link
description: Provide a link to a repository with a reproduction of the bug, this is optional but it will make us to fix the bug faster
placeholder: Reproduction Repository
value: "repository link"
diff --git a/.github/ISSUE_TEMPLATE/feature-request.yml b/.github/ISSUE_TEMPLATE/feature-request.yml
index 371d1a9b..7d5cbb8e 100644
--- a/.github/ISSUE_TEMPLATE/feature-request.yml
+++ b/.github/ISSUE_TEMPLATE/feature-request.yml
@@ -7,7 +7,7 @@ body:
- type: markdown
attributes:
value: Thanks for taking the time to fill out this feature report!
-
+
- type: textarea
id: description
attributes:
@@ -17,7 +17,7 @@ body:
value: "Very cool idea!"
validations:
required: true
-
+
- type: textarea
id: why-it-is-needed
attributes:
@@ -49,4 +49,11 @@ body:
validations:
required: false
-
\ No newline at end of file
+ - type: markdown
+ attributes:
+ value: |
+ ## Support
+
+ If this functionality is important to you and you need it, contact [TheWidlarzGroup](https://www.thewidlarzgroup.com/?utm_source=rnv&utm_medium=feature-request#Contact) - [`hi@thewidlarzgroup.com`](mailto:hi@thewidlarzgroup.com)
+
+
diff --git a/.github/scripts/validate.js b/.github/scripts/validate.js
new file mode 100644
index 00000000..36de83d7
--- /dev/null
+++ b/.github/scripts/validate.js
@@ -0,0 +1,293 @@
+const FIELD_MAPPINGS = {
+ Platform: 'What platforms are you having the problem on?',
+ Version: 'Version',
+ SystemVersion: 'System Version',
+ DeviceType: 'On what device are you experiencing the issue?',
+ Architecture: 'Architecture',
+ Description: 'What happened?',
+ ReproductionLink: 'Reproduction Link',
+ Reproduction: 'Reproduction',
+};
+
+const PLATFORM_LABELS = {
+ iOS: 'Platform: iOS',
+ visionOS: 'Platform: iOS',
+ 'Apple tvOS': 'Platform: iOS',
+ Android: 'Platform: Android',
+ 'Android TV': 'Platform: Android',
+ Windows: 'Platform: Windows',
+ web: 'Platform: Web',
+};
+
+const BOT_LABELS = [
+ 'Missing Info',
+ 'Repro Provided',
+ 'Missing Repro',
+ 'Waiting for Review',
+ 'Newer Version Available',
+ ...Object.values(PLATFORM_LABELS),
+];
+
+const SKIP_LABEL = 'No Validation';
+
+const MESSAGE = {
+ FEATURE_REQUEST: `Thank you for your feature request. We will review it and get back to you if we need more information.`,
+ BUG_REPORT: `Thank you for your bug report. We will review it and get back to you if we need more information.`,
+ MISSING_INFO: (missingFields) => {
+ return `Thank you for your issue report. Please note that the following information is missing or incomplete:\n\n${missingFields
+ .map((field) => `- ${field.replace('missing-', '')}`)
+ .join(
+ '\n',
+ )}\n\nPlease update your issue with this information to help us address it more effectively.
+ \n > Note: issues without complete information have a lower priority`;
+ },
+ OUTDATED_VERSION: (issueVersion, latestVersion) => {
+ return (
+ `There is a newer version of the library available. ` +
+ `You are using version ${issueVersion}, while the latest stable version is ${latestVersion}. ` +
+ `Please update to the latest version and check if the issue still exists.` +
+ `\n > Note: If the issue still exists, please update the issue report with the latest information.`
+ );
+ },
+};
+
+const checkLatestVersion = async () => {
+ try {
+ const response = await fetch(
+ 'https://registry.npmjs.org/react-native-video/latest',
+ );
+ const data = await response.json();
+ return data.version;
+ } catch (error) {
+ console.error('Error checking latest version:', error);
+ return null;
+ }
+};
+
+const getFieldValue = (body, field) => {
+ if (!FIELD_MAPPINGS[field]) {
+ console.warn('Field not supported:', field);
+ return '';
+ }
+
+ const fieldValue = FIELD_MAPPINGS[field];
+
+ const sections = body.split('###');
+ const section = sections.find((section) => {
+ // Find the section that contains the field
+ // For Reproduction, we need to make sure that we don't match Reproduction Link
+ if (field === 'Reproduction') {
+ return (
+ section.includes(fieldValue) && !section.includes('Reproduction Link')
+ );
+ }
+
+ return section.includes(fieldValue);
+ });
+
+ return section ? section.replace(fieldValue, '').trim() : '';
+};
+
+const validateBugReport = async (body, labels) => {
+ const selectedPlatforms = getFieldValue(body, 'Platform')
+ .split(',')
+ .map((p) => p.trim());
+
+ if (selectedPlatforms.length === 0) {
+ labels.add('missing-platform');
+ } else {
+ selectedPlatforms.forEach((platform) => {
+ const label = PLATFORM_LABELS[platform];
+ if (label) {
+ labels.add(label);
+ } else {
+ console.warn('Platform not supported', platform);
+ }
+ });
+ }
+
+ const version = getFieldValue(body, 'Version');
+ if (version) {
+ const words = version.split(' ');
+ const versionPattern = /\d+\.\d+\.\d+/;
+ const isVersionValid = words.some((word) => versionPattern.test(word));
+
+ if (!isVersionValid) {
+ labels.add('missing-version');
+ }
+
+ const latestVersion = await checkLatestVersion();
+ if (latestVersion && latestVersion !== version) {
+ labels.add(`outdated-version-${version}-${latestVersion}`);
+ }
+ }
+
+ const fields = [
+ {
+ name: 'SystemVersion',
+ invalidValue:
+ 'What version of the system is using device that you are experiencing the issue?',
+ },
+ {name: 'DeviceType'},
+ {name: 'Architecture'},
+ {name: 'Description', invalidValue: 'A bug happened!'},
+ {name: 'Reproduction', invalidValue: 'Step to reproduce this bug are:'},
+ {name: 'ReproductionLink', invalidValue: 'repository link'},
+ ];
+
+ fields.forEach(({name, invalidValue}) => {
+ const value = getFieldValue(body, name);
+ if (!value || value === invalidValue) {
+ const fieldName = FIELD_MAPPINGS[name];
+ labels.add(`missing-${fieldName.toLowerCase()}`);
+ }
+ });
+};
+
+const validateFeatureRequest = (body, labels) => {
+ // Implement feature request validation logic here
+};
+
+const handleIssue = async ({github, context}) => {
+ const {issue} = context.payload;
+ const {body} = issue;
+ const labels = new Set(issue.labels.map((label) => label.name));
+
+ if (labels.has(SKIP_LABEL)) {
+ console.log('Skiping Issue Validation');
+ return;
+ }
+
+ // Clear out labels that are added by the bot
+ BOT_LABELS.forEach((label) => labels.delete(label));
+
+ const isBug = labels.has('bug');
+ const isFeature = labels.has('feature');
+
+ if (isFeature) {
+ await handleFeatureRequest({github, context, body, labels});
+ } else if (isBug) {
+ await handleBugReport({github, context, body, labels});
+ } else {
+ console.warn('Issue is not a bug or feature request');
+ }
+
+ await updateIssueLabels({github, context, labels});
+};
+
+const handleFeatureRequest = async ({github, context, body, labels}) => {
+ validateFeatureRequest(body, labels);
+
+ const comment = MESSAGE.FEATURE_REQUEST;
+ await createComment({github, context, body: comment});
+};
+
+const handleBugReport = async ({github, context, body, labels}) => {
+ await validateBugReport(body, labels);
+
+ if (Array.from(labels).some((label) => label.startsWith('missing-'))) {
+ await handleMissingInformation({github, context, labels});
+ } else {
+ await handleValidReport({github, context, labels});
+ }
+};
+
+const handleMissingInformation = async ({github, context, labels}) => {
+ const missingFields = Array.from(labels).filter((label) =>
+ label.startsWith('missing-'),
+ );
+
+ const outdatedVersionLabel = Array.from(labels).find((label) =>
+ label.startsWith('outdated-version'),
+ );
+
+ if (missingFields.length > 0) {
+ let comment = MESSAGE.MISSING_INFO(missingFields);
+
+ if (outdatedVersionLabel) {
+ const [, , issueVersion, latestVersion] = outdatedVersionLabel.split('-');
+ comment += `\n\n ${MESSAGE.OUTDATED_VERSION(
+ issueVersion,
+ latestVersion,
+ )}`;
+ }
+
+ await hidePreviousComments({github, context});
+ await createComment({github, context, body: comment});
+ }
+
+ updateLabelsForMissingInfo(labels);
+};
+
+const handleValidReport = async ({github, context, labels}) => {
+ let comment = MESSAGE.BUG_REPORT;
+
+ const outdatedVersionLabel = Array.from(labels).find((label) =>
+ label.startsWith('outdated-version'),
+ );
+
+ if (outdatedVersionLabel) {
+ const [, , issueVersion, latestVersion] = outdatedVersionLabel.split('-');
+ comment += `\n\n ${MESSAGE.OUTDATED_VERSION(issueVersion, latestVersion)}`;
+ labels.add('Newer Version Available');
+ }
+
+ await hidePreviousComments({github, context});
+ await createComment({github, context, body: comment});
+ labels.add('Repro Provided');
+ labels.add('Waiting for Review');
+};
+
+const createComment = async ({github, context, body}) => {
+ await github.rest.issues.createComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.payload.issue.number,
+ body,
+ });
+};
+
+const updateIssueLabels = async ({github, context, labels}) => {
+ const labelsToAdd = Array.from(labels).filter(
+ (label) => !label.startsWith('missing-') && !label.startsWith('outdated-'),
+ );
+
+ await github.rest.issues.update({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.payload.issue.number,
+ labels: labelsToAdd,
+ });
+};
+
+const hidePreviousComments = async ({github, context}) => {
+ const comments = await github.rest.issues.listComments({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ issue_number: context.payload.issue.number,
+ });
+
+ const botComments = comments.data.filter(
+ (comment) => comment.user.type === 'Bot',
+ );
+
+ for (const comment of botComments) {
+ // Don't format string - it will broke the markdown
+ const hiddenBody = `
+
+Previous bot comment (click to expand)
+
+${comment.body}
+
+ `;
+
+ await github.rest.issues.updateComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ comment_id: comment.id,
+ body: hiddenBody,
+ });
+ }
+};
+
+module.exports = handleIssue;
diff --git a/.github/stale.yml b/.github/stale.yml
deleted file mode 100644
index 3179b082..00000000
--- a/.github/stale.yml
+++ /dev/null
@@ -1,60 +0,0 @@
-# Configuration for probot-stale - https://github.com/probot/stale
-
-# Number of days of inactivity before an Issue or Pull Request becomes stale
-daysUntilStale: 60
-
-# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
-# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
-daysUntilClose: 3
-
-# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
-onlyLabels: []
-
-# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
-exemptLabels:
- - pinned
- - security
-
-# Set to true to ignore issues in a project (defaults to false)
-exemptProjects: true
-
-# Set to true to ignore issues in a milestone (defaults to false)
-exemptMilestones: true
-
-# Set to true to ignore issues with an assignee (defaults to false)
-exemptAssignees: true
-
-# Label to use when marking as stale
-staleLabel: stale
-
-# Comment to post when marking as stale. Set to `false` to disable
-markComment: >
- This issue has been automatically marked as stale because it has not had
- recent activity. It will be closed if no further activity occurs. Thank you
- for your contributions. If you are having a similar problem, please open a
- new issue and reference this one instead of commenting on a stale or closed
- issue.
-
-# Comment to post when removing the stale label.
-unmarkComment: false
-
-# Comment to post when closing a stale Issue or Pull Request.
-closeComment: false
-
-# Limit the number of actions per hour, from 1-30. Default is 30
-limitPerRun: 50
-
-# Limit to only `issues` or `pulls`
-only: issues
-
-# Optionally, specify configuration settings that are specific to just 'issues' or 'pulls':
-# pulls:
-# daysUntilStale: 30
-# markComment: >
-# This pull request has been automatically marked as stale because it has not had
-# recent activity. It will be closed if no further activity occurs. Thank you
-# for your contributions.
-
-# issues:
-# exemptLabels:
-# - confirmed
diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml
new file mode 100644
index 00000000..d084767f
--- /dev/null
+++ b/.github/workflows/stale.yml
@@ -0,0 +1,24 @@
+name: Close inactive issues
+on:
+ schedule:
+ - cron: "30 1 * * *"
+ workflow_dispatch:
+
+jobs:
+ close-issues:
+ runs-on: ubuntu-latest
+ permissions:
+ issues: write
+ pull-requests: write
+ steps:
+ - uses: actions/stale@v5
+ with:
+ days-before-issue-stale: 30
+ days-before-issue-close: 14
+ stale-issue-label: "stale"
+ stale-issue-message: "This issue is stale because it has been open for 30 days with no activity. If there won't be any activity in the next 14 days, this issue will be closed automatically."
+ close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
+ days-before-pr-stale: -1
+ days-before-pr-close: -1
+ exempt-issue-labels: "feature,Accepted,good first issue"
+ repo-token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.github/workflows/validate-issue.yml b/.github/workflows/validate-issue.yml
new file mode 100644
index 00000000..8e6c12ab
--- /dev/null
+++ b/.github/workflows/validate-issue.yml
@@ -0,0 +1,19 @@
+name: Issue Validator and Labeler
+
+on:
+ issues:
+ types: [opened, edited]
+
+jobs:
+ validate-and-label:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: Validate Issue Template and Add Labels
+ uses: actions/github-script@v7
+ with:
+ github-token: ${{secrets.GITHUB_TOKEN}}
+ script: |
+ const script = require('./.github/scripts/validate.js')
+ await script({github, context})
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 23c99389..0e2180b5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,125 @@
+## [6.6.4](https://github.com/TheWidlarzGroup/react-native-video/compare/v6.6.3...v6.6.4) (2024-10-03)
+
+
+### Features
+
+* **android:** add live video label configuration ([#4190](https://github.com/TheWidlarzGroup/react-native-video/issues/4190)) ([149924f](https://github.com/TheWidlarzGroup/react-native-video/commit/149924ffcb0cbdeaa8c671ebb4b3b6115920131a))
+
+## [6.6.3](https://github.com/TheWidlarzGroup/react-native-video/compare/v6.6.2...v6.6.3) (2024-09-29)
+
+
+### Bug Fixes
+
+* **android:** bad rotation handling ([#4205](https://github.com/TheWidlarzGroup/react-native-video/issues/4205)) ([3ecf324](https://github.com/TheWidlarzGroup/react-native-video/commit/3ecf324bb30208ab8efbf00958ebd4590ddf8d39))
+* **docs:** invalid URLs in updating section ([#4201](https://github.com/TheWidlarzGroup/react-native-video/issues/4201)) ([c81eea5](https://github.com/TheWidlarzGroup/react-native-video/commit/c81eea54d8291c5131fd59a93f198e0fd5f3673c))
+* **ios:** Add safety checks and remove some of the ! in types declaration ([#4182](https://github.com/TheWidlarzGroup/react-native-video/issues/4182)) ([ae82c83](https://github.com/TheWidlarzGroup/react-native-video/commit/ae82c83eef2fc7c383fd844c7471613e4ac1c7ee))
+* **tvos:** typo ([#4204](https://github.com/TheWidlarzGroup/react-native-video/issues/4204)) ([b11f05f](https://github.com/TheWidlarzGroup/react-native-video/commit/b11f05f1753a4cb963b94d1e1d8d1f6c37af2a9d))
+
+
+### Features
+
+* **android:** allow to hide specific controls ([#4183](https://github.com/TheWidlarzGroup/react-native-video/issues/4183)) ([279cc0e](https://github.com/TheWidlarzGroup/react-native-video/commit/279cc0e5ed712488fc3c153c62b14f13048103f2))
+
+## [6.6.2](https://github.com/TheWidlarzGroup/react-native-video/compare/v6.6.1...v6.6.2) (2024-09-20)
+
+
+### Features
+
+* **iOS:** rewrite DRM Module ([#4136](https://github.com/TheWidlarzGroup/react-native-video/issues/4136)) ([0e4c95d](https://github.com/TheWidlarzGroup/react-native-video/commit/0e4c95def968a4091fdd18d07215ba592eec99cb))
+
+## [6.6.1](https://github.com/TheWidlarzGroup/react-native-video/compare/v6.6.0...v6.6.1) (2024-09-18)
+
+
+### Bug Fixes
+
+* **ios:** fix side loaded text track management ([#4180](https://github.com/TheWidlarzGroup/react-native-video/issues/4180)) ([7d43d5d](https://github.com/TheWidlarzGroup/react-native-video/commit/7d43d5d3da72495e94468756be21442f96cc7a89))
+
+# [6.6.0](https://github.com/TheWidlarzGroup/react-native-video/compare/v6.5.0...v6.6.0) (2024-09-18)
+
+
+### Bug Fixes
+
+* **android:** ensure maxbitrate & selectedVideoTrack interact correctly ([#4155](https://github.com/TheWidlarzGroup/react-native-video/issues/4155)) ([7f6b500](https://github.com/TheWidlarzGroup/react-native-video/commit/7f6b500c82122325c326b6dcacaf7af8039b2b33))
+* **android:** ensure pause is well tken in account after onEnd ([#4147](https://github.com/TheWidlarzGroup/react-native-video/issues/4147)) ([b2fd8d6](https://github.com/TheWidlarzGroup/react-native-video/commit/b2fd8d62a10ee64e6208b43120ca9231008309c2))
+* **expo-plugin:** add check for existing service in AndroidManifest for notification controls ([#4172](https://github.com/TheWidlarzGroup/react-native-video/issues/4172)) ([0538b3b](https://github.com/TheWidlarzGroup/react-native-video/commit/0538b3b46801a535c76cf52db28cee76f2aeb0c5))
+* **ios:** ensure onBandwidthUpdate is reported only when value change ([#4149](https://github.com/TheWidlarzGroup/react-native-video/issues/4149)) ([809a730](https://github.com/TheWidlarzGroup/react-native-video/commit/809a73019836f95385891c2bba5c72b0610ffcb1))
+* **ios:** losing subtitle selection on foreground ([#3707](https://github.com/TheWidlarzGroup/react-native-video/issues/3707)) ([bee4123](https://github.com/TheWidlarzGroup/react-native-video/commit/bee4123402f4bc08dd2eb19ab0011ffdc795d0e3))
+* **JS:** improve loader api to allow function call instead of component ([#4171](https://github.com/TheWidlarzGroup/react-native-video/issues/4171)) ([835186a](https://github.com/TheWidlarzGroup/react-native-video/commit/835186a321e1940932a045a59e26e43a040fa334))
+* refactor side loaded text tracks management ([#4158](https://github.com/TheWidlarzGroup/react-native-video/issues/4158)) ([84a27f3](https://github.com/TheWidlarzGroup/react-native-video/commit/84a27f3d9f90624af3c5c3cbff50d754bab9baa4))
+* **sample:** remove warning on ios with NavigationBar ([#4148](https://github.com/TheWidlarzGroup/react-native-video/issues/4148)) ([e18769a](https://github.com/TheWidlarzGroup/react-native-video/commit/e18769ab3a6a7f4ebc459ab550f105f4d18f8201))
+* **visionOS:** remove unsupported apis ([#4154](https://github.com/TheWidlarzGroup/react-native-video/issues/4154)) ([2c1fc96](https://github.com/TheWidlarzGroup/react-native-video/commit/2c1fc964bf2cb97624c8cc37ff8138465619fc61))
+
+
+### Features
+
+* **android:** upgrade dependencies / media3 1.4.1 / androidxCore to 1.13.1 / androidxActivity 1.8.2 ([#4173](https://github.com/TheWidlarzGroup/react-native-video/issues/4173)) ([e57c7bd](https://github.com/TheWidlarzGroup/react-native-video/commit/e57c7bda5df7d624d90b20620859b8a4eb3f76b7))
+
+# [6.5.0](https://github.com/TheWidlarzGroup/react-native-video/compare/v6.4.5...v6.5.0) (2024-09-04)
+
+
+### Bug Fixes
+
+* **android:** show the status bar and navigation bar after exiting full-screen mode ([#4112](https://github.com/TheWidlarzGroup/react-native-video/issues/4112)) ([8b8ebe9](https://github.com/TheWidlarzGroup/react-native-video/commit/8b8ebe9410e95085e5602393c2ce3de814df4a96))
+* **android:** add subtitleStyle.subtitlesFollowVideo prop to control subtitles positionning ([#4133](https://github.com/TheWidlarzGroup/react-native-video/issues/4133)) ([2fa6c43](https://github.com/TheWidlarzGroup/react-native-video/commit/2fa6c43615c1bc0a3bbcb5f472ffaeb8ae16a1af))
+* **android:** hide surfaceView for loading time when shutter is hidden ([#4060](https://github.com/TheWidlarzGroup/react-native-video/issues/4060)) ([65faba3](https://github.com/TheWidlarzGroup/react-native-video/commit/65faba312d23de981972d2b6ffecefbc87ecac61))
+* **expo-plugin:** adding bg mode if none exist yet ([#4126](https://github.com/TheWidlarzGroup/react-native-video/issues/4126)) ([451806c](https://github.com/TheWidlarzGroup/react-native-video/commit/451806c547591fbe5714b133e704ffac9efb05d8))
+* **ios:** Add handler for Earpods play/pause command ([#4116](https://github.com/TheWidlarzGroup/react-native-video/issues/4116)) ([9c38d9f](https://github.com/TheWidlarzGroup/react-native-video/commit/9c38d9f4ef42c3e275ee39a08aa227e6b976fdb2))
+* **ios:** build fail due to an unwrapped value ([#4101](https://github.com/TheWidlarzGroup/react-native-video/issues/4101)) ([0a1085c](https://github.com/TheWidlarzGroup/react-native-video/commit/0a1085ce03152d58d98da408dbe79e76fa5ebc1a))
+* **ios:** ensure behavior is correct with empty text track list ([#4123](https://github.com/TheWidlarzGroup/react-native-video/issues/4123)) ([3a32d67](https://github.com/TheWidlarzGroup/react-native-video/commit/3a32d67087c39bcf7904043d15a2fdba65307f4e))
+* **ios:** ensure we don't disable tracks when not necessary (causes black screen) ([#4130](https://github.com/TheWidlarzGroup/react-native-video/issues/4130)) ([89df9d6](https://github.com/TheWidlarzGroup/react-native-video/commit/89df9d69ff96f7d6ff3d493bf1a3eb9c3da51c3c))
+* **ios:** fix onBandwidth update event (old ios api is deprecated and doens't work) ([#4140](https://github.com/TheWidlarzGroup/react-native-video/issues/4140)) ([d6bae3c](https://github.com/TheWidlarzGroup/react-native-video/commit/d6bae3cd076018f07556ab27af2779479bc7ff7d))
+* **sample:** update dependencies to fix local asset playback ([#4121](https://github.com/TheWidlarzGroup/react-native-video/issues/4121)) ([7a2b401](https://github.com/TheWidlarzGroup/react-native-video/commit/7a2b4014f40758a025fcd6b388448d3559ec6a4a))
+* set does not have `find` method ([#4110](https://github.com/TheWidlarzGroup/react-native-video/issues/4110)) ([7db7024](https://github.com/TheWidlarzGroup/react-native-video/commit/7db7024cb36ea34289fddf5c7f66e7b4d7827146))
+* **tvos:** fix build (and update sample) ([#4134](https://github.com/TheWidlarzGroup/react-native-video/issues/4134)) ([688d98d](https://github.com/TheWidlarzGroup/react-native-video/commit/688d98d68f888a59bde1ee33aa844ac63c9026a5))
+* **VisionOS:** do not access to isExternalPlaybackActive on VisionOS ([#4109](https://github.com/TheWidlarzGroup/react-native-video/issues/4109)) ([0576eac](https://github.com/TheWidlarzGroup/react-native-video/commit/0576eacfddb32c4dcc072b6fd3cbf74cf25946a4))
+
+
+### Features
+
+* add ads localize ([#4113](https://github.com/TheWidlarzGroup/react-native-video/issues/4113)) ([703ed43](https://github.com/TheWidlarzGroup/react-native-video/commit/703ed4399667e0142704d19686563dd62fb4883d))
+* **android:** Support Common Media Client Data (CMCD) ([#4034](https://github.com/TheWidlarzGroup/react-native-video/issues/4034)) ([ca795f2](https://github.com/TheWidlarzGroup/react-native-video/commit/ca795f298a99a183b81561ef7e09d8d1e8addaf5))
+* **android:** support hiding Exoplayer video duration on android ([#4090](https://github.com/TheWidlarzGroup/react-native-video/issues/4090)) ([41e2bed](https://github.com/TheWidlarzGroup/react-native-video/commit/41e2bed6b36f74a28d7dd640414c6d5ccbec0399))
+* Correct isBehindLiveWindow Error Handling ([#4143](https://github.com/TheWidlarzGroup/react-native-video/issues/4143)) ([22c21ad](https://github.com/TheWidlarzGroup/react-native-video/commit/22c21ad249879fe4ff8fb119384ebc82766106c3))
+
+## [6.4.5](https://github.com/TheWidlarzGroup/react-native-video/compare/v6.4.4...v6.4.5) (2024-08-17)
+
+
+### Bug Fixes
+
+* **android:** resolve a release issue with DefaultDashChunkSource ([#4097](https://github.com/TheWidlarzGroup/react-native-video/issues/4097)) ([7e222e8](https://github.com/TheWidlarzGroup/react-native-video/commit/7e222e8fc4f3c47a1c9cd2fbf5ff012bcbe98a7f))
+
+* refactor(android): migrate DefaultDashChunkSource to Kotlin (#4078) (b7d1cabf)
+* fix(ios): remove resume logic in notification seek closure (#4068) (c6ae17e4)
+* chore(doc): update document (props & method) (#4072) (cd41a1b2)
+* fix(android): build warnings (#4058) (899bb822)
+* infra: update feature request form (#4065) (6c03d0a7)
+* fix(ios): override source metadata with custom metadata (#4050) (38aa2b05)
+* fix(android): return the value as a float for the getCurrentPosition function (#4054) (af0302b1)
+* refactor(android): migrate ReactExoplayerViewManager to Kotlin (#4011) (74c6dd62)
+* fix(android): viewType is ignored when its value is ViewType.TEXTURE (#4031) (22cfd6ce)
+* fix(ios): metadata update race (#4033) (08a57a3b)
+* fix(ios): updated getLicense call to work with new syntax, and fixed spelling error (#4014) (#4042) (2348c5e4)
+
+## [6.4.3](https://github.com/TheWidlarzGroup/react-native-video/compare/v6.4.2...v6.4.3) (2024-07-24)
+
+
+### Bug Fixes
+
+* **android:** app crash at boot with old arch ([#4022](https://github.com/TheWidlarzGroup/react-native-video/issues/4022)) ([1ee5811](https://github.com/TheWidlarzGroup/react-native-video/commit/1ee5811c8e0ecfc2486f5120b575b57c6396e0f8)), closes [#3875](https://github.com/TheWidlarzGroup/react-native-video/issues/3875)
+* **android:** fix backward compatibility ([#4020](https://github.com/TheWidlarzGroup/react-native-video/issues/4020)) ([ab7e02e](https://github.com/TheWidlarzGroup/react-native-video/commit/ab7e02e4538c97340f13fb052b1cad94408b48fa))
+* **android:** resize mode cover calculation ([#4010](https://github.com/TheWidlarzGroup/react-native-video/issues/4010)) ([9f38216](https://github.com/TheWidlarzGroup/react-native-video/commit/9f382163d83c3331518e2784b335da28179ac91d))
+* index of the selected track ([#4012](https://github.com/TheWidlarzGroup/react-native-video/issues/4012)) ([fb1d6bd](https://github.com/TheWidlarzGroup/react-native-video/commit/fb1d6bdef7210d43f9e34f673691a9a17b95424e))
+* **sample:** boot failure on emulator ([#4016](https://github.com/TheWidlarzGroup/react-native-video/issues/4016)) ([ffbc977](https://github.com/TheWidlarzGroup/react-native-video/commit/ffbc977ff90248aeb270626620f5c3553f955617))
+
+
+### Features
+
+* add ability to define `poster` props as Image type and render poster as custom component ([#3972](https://github.com/TheWidlarzGroup/react-native-video/issues/3972)) ([adbd06e](https://github.com/TheWidlarzGroup/react-native-video/commit/adbd06e2df557b22b8a3a19073a2de1cbb964833))
+* **android:** add error handling for Kotlin version ([#4018](https://github.com/TheWidlarzGroup/react-native-video/issues/4018)) ([6189080](https://github.com/TheWidlarzGroup/react-native-video/commit/6189080c9aac89aa3d2a4e60049999d8880bc971))
+* **android:** set originalFitsSystemWindows on fullscreen open ([#4013](https://github.com/TheWidlarzGroup/react-native-video/issues/4013)) ([2f70c02](https://github.com/TheWidlarzGroup/react-native-video/commit/2f70c02cdcf6488338df197feb61eeb10ed3281f))
+
## [6.4.2](https://github.com/TheWidlarzGroup/react-native-video/compare/v6.4.1...v6.4.2) (2024-07-15)
diff --git a/README.md b/README.md
index 3d6605ff..bd216d42 100644
--- a/README.md
+++ b/README.md
@@ -51,9 +51,9 @@ We have an discord server where you can ask questions and get help. [Join the di
## Enterprise Support
- 📱 react-native-video is provided as it is . For enterprise support or other business inquiries, please contact us 🤝 . We can help you with the integration, customization and maintenance. We are providing both free and commercial support for this project. let's build something awesome together! 🚀
+ 📱 react-native-video is provided as it is . For enterprise support or other business inquiries, please contact us 🤝 . We can help you with the integration, customization and maintenance. We are providing both free and commercial support for this project. let's build something awesome together! 🚀
-
+
diff --git a/android/build.gradle b/android/build.gradle
index 7920bf65..d153c936 100644
--- a/android/build.gradle
+++ b/android/build.gradle
@@ -5,6 +5,21 @@ apply plugin: 'kotlin-android'
buildscript {
def kotlin_version = rootProject.ext.has('kotlinVersion') ? rootProject.ext.get('kotlinVersion') : project.properties['RNVideo_kotlinVersion']
+ def requiredKotlinVersion = project.properties['RNVideo_kotlinVersion']
+
+ def isVersionAtLeast = { version, requiredVersion ->
+ def (v1, v2) = [version, requiredVersion].collect { it.tokenize('.')*.toInteger() }
+ for (int i = 0; i < Math.max(v1.size(), v2.size()); i++) {
+ int val1 = i < v1.size() ? v1[i] : 0
+ int val2 = i < v2.size() ? v2[i] : 0
+ if (val1 < val2) {
+ return false
+ } else if (val1 > val2) {
+ return true
+ }
+ }
+ return true
+ }
repositories {
mavenCentral()
@@ -13,9 +28,17 @@ buildscript {
dependencies {
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version")
}
+
+ ext {
+ if (!isVersionAtLeast(kotlin_version, requiredKotlinVersion)) {
+ throw new GradleException("Kotlin version mismatch: Project is using Kotlin version $kotlin_version, but it must be at least $requiredKotlinVersion. Please update the Kotlin version.")
+ } else {
+ println("Kotlin version is correct: $kotlin_version")
+ }
+ }
}
-// This looks funny but it's necessary to keep backwards compatibility (:
+// This looks funny but it's necessary to keep backwards compatibility (:
def safeExtGet(prop) {
return rootProject.ext.has(prop) ?
rootProject.ext.get(prop) : rootProject.ext.has("RNVideo_" + prop) ?
@@ -184,7 +207,6 @@ repositories {
}
def media3_version = safeExtGet('media3Version')
-def kotlin_version = safeExtGet('kotlinVersion')
def androidxCore_version = safeExtGet('androidxCoreVersion')
def androidxActivity_version = safeExtGet('androidxActivityVersion')
@@ -194,7 +216,7 @@ dependencies {
//noinspection GradleDynamicVersion
implementation "com.facebook.react:react-native:+"
- implementation "androidx.core:core:$androidxCore_version"
+ implementation "androidx.core:core-ktx:$androidxCore_version"
implementation "androidx.activity:activity-ktx:$androidxActivity_version"
// For media playback using ExoPlayer
@@ -239,7 +261,7 @@ dependencies {
implementation "androidx.media3:media3-exoplayer-rtsp:$media3_version"
}
}
-
+
// For ad insertion using the Interactive Media Ads SDK with ExoPlayer
if (ExoplayerDependencies["useExoplayerIMA"]) {
if (media3_buildFromSource) {
@@ -280,5 +302,4 @@ dependencies {
// Common functionality used across multiple media libraries
implementation "androidx.media3:media3-common:$media3_version"
}
- implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
-}
+}
\ No newline at end of file
diff --git a/android/gradle.properties b/android/gradle.properties
index d4b23166..b474349b 100644
--- a/android/gradle.properties
+++ b/android/gradle.properties
@@ -1,15 +1,15 @@
-RNVideo_kotlinVersion=1.7.0
+RNVideo_kotlinVersion=1.8.0
RNVideo_minSdkVersion=23
RNVideo_targetSdkVersion=34
RNVideo_compileSdkVersion=34
RNVideo_ndkversion=26.1.10909125
RNVideo_buildToolsVersion=34.0.0
-RNVideo_media3Version=1.3.1
+RNVideo_media3Version=1.4.1
RNVideo_useExoplayerIMA=false
RNVideo_useExoplayerRtsp=false
RNVideo_useExoplayerSmoothStreaming=true
RNVideo_useExoplayerDash=true
RNVideo_useExoplayerHls=true
-RNVideo_androidxCoreVersion=1.9.0
-RNVideo_androidxActivityVersion=1.7.0
+RNVideo_androidxCoreVersion=1.13.1
+RNVideo_androidxActivityVersion=1.8.2
RNVideo_buildFromMedia3Source=false
diff --git a/android/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java b/android/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java
index 95026f07..b5e2d349 100644
--- a/android/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java
+++ b/android/src/main/java/androidx/media3/exoplayer/dash/DefaultDashChunkSource.java
@@ -7,4 +7,4 @@ public class DefaultDashChunkSource {
public Factory(DataSource.Factory mediaDataSourceFactory) {
}
}
-}
+}
\ No newline at end of file
diff --git a/android/src/main/java/androidx/media3/exoplayer/ima/ImaAdsLoader.java b/android/src/main/java/androidx/media3/exoplayer/ima/ImaAdsLoader.java
index 8d30b2b1..8fadc334 100644
--- a/android/src/main/java/androidx/media3/exoplayer/ima/ImaAdsLoader.java
+++ b/android/src/main/java/androidx/media3/exoplayer/ima/ImaAdsLoader.java
@@ -11,9 +11,17 @@ import androidx.media3.exoplayer.ExoPlayer;
import androidx.media3.exoplayer.source.ads.AdsLoader;
import androidx.media3.exoplayer.source.ads.AdsMediaSource;
+import com.google.ads.interactivemedia.v3.api.ImaSdkSettings;
+
import java.io.IOException;
public class ImaAdsLoader implements AdsLoader {
+ private final ImaSdkSettings imaSdkSettings;
+
+ public ImaAdsLoader(ImaSdkSettings imaSdkSettings) {
+ this.imaSdkSettings = imaSdkSettings;
+ }
+
public void setPlayer(ExoPlayer ignoredPlayer) {
}
@@ -45,6 +53,7 @@ public class ImaAdsLoader implements AdsLoader {
}
public static class Builder {
+ private ImaSdkSettings imaSdkSettings;
public Builder(Context ignoredThemedReactContext) {
}
@@ -56,6 +65,11 @@ public class ImaAdsLoader implements AdsLoader {
return this;
}
+ public Builder setImaSdkSettings(ImaSdkSettings imaSdkSettings) {
+ this.imaSdkSettings = imaSdkSettings;
+ return this;
+ }
+
public ImaAdsLoader build() {
return null;
}
diff --git a/android/src/main/java/com/brentvatne/common/api/AdsProps.kt b/android/src/main/java/com/brentvatne/common/api/AdsProps.kt
new file mode 100644
index 00000000..9443d537
--- /dev/null
+++ b/android/src/main/java/com/brentvatne/common/api/AdsProps.kt
@@ -0,0 +1,46 @@
+package com.brentvatne.common.api
+
+import android.net.Uri
+import android.text.TextUtils
+import com.brentvatne.common.toolbox.DebugLog
+import com.brentvatne.common.toolbox.ReactBridgeUtils
+import com.facebook.react.bridge.ReadableMap
+
+class AdsProps {
+ var adTagUrl: Uri? = null
+ var adLanguage: String? = null
+
+ /** return true if this and src are equals */
+ override fun equals(other: Any?): Boolean {
+ if (other == null || other !is AdsProps) return false
+ return (
+ adTagUrl == other.adTagUrl &&
+ adLanguage == other.adLanguage
+ )
+ }
+
+ companion object {
+ private const val PROP_AD_TAG_URL = "adTagUrl"
+ private const val PROP_AD_LANGUAGE = "adLanguage"
+
+ @JvmStatic
+ fun parse(src: ReadableMap?): AdsProps {
+ val adsProps = AdsProps()
+ DebugLog.w("olivier", "uri: parse AdsProps")
+
+ if (src != null) {
+ val uriString = ReactBridgeUtils.safeGetString(src, PROP_AD_TAG_URL)
+ if (TextUtils.isEmpty(uriString)) {
+ adsProps.adTagUrl = null
+ } else {
+ adsProps.adTagUrl = Uri.parse(uriString)
+ }
+ val languageString = ReactBridgeUtils.safeGetString(src, PROP_AD_LANGUAGE)
+ if (!TextUtils.isEmpty(languageString)) {
+ adsProps.adLanguage = languageString
+ }
+ }
+ return adsProps
+ }
+ }
+}
diff --git a/android/src/main/java/com/brentvatne/common/api/CMCDProps.kt b/android/src/main/java/com/brentvatne/common/api/CMCDProps.kt
new file mode 100644
index 00000000..76bcefa1
--- /dev/null
+++ b/android/src/main/java/com/brentvatne/common/api/CMCDProps.kt
@@ -0,0 +1,51 @@
+package com.brentvatne.common.api
+
+import com.brentvatne.common.toolbox.ReactBridgeUtils.safeGetInt
+import com.facebook.react.bridge.ReadableArray
+import com.facebook.react.bridge.ReadableMap
+import com.facebook.react.bridge.ReadableType
+
+data class CMCDProps(
+ val cmcdObject: List> = emptyList(),
+ val cmcdRequest: List> = emptyList(),
+ val cmcdSession: List> = emptyList(),
+ val cmcdStatus: List> = emptyList(),
+ val mode: Int = 1
+) {
+ companion object {
+ private const val PROP_CMCD_OBJECT = "object"
+ private const val PROP_CMCD_REQUEST = "request"
+ private const val PROP_CMCD_SESSION = "session"
+ private const val PROP_CMCD_STATUS = "status"
+ private const val PROP_CMCD_MODE = "mode"
+
+ @JvmStatic
+ fun parse(src: ReadableMap?): CMCDProps? {
+ if (src == null) return null
+
+ return CMCDProps(
+ cmcdObject = parseKeyValuePairs(src.getArray(PROP_CMCD_OBJECT)),
+ cmcdRequest = parseKeyValuePairs(src.getArray(PROP_CMCD_REQUEST)),
+ cmcdSession = parseKeyValuePairs(src.getArray(PROP_CMCD_SESSION)),
+ cmcdStatus = parseKeyValuePairs(src.getArray(PROP_CMCD_STATUS)),
+ mode = safeGetInt(src, PROP_CMCD_MODE, 1)
+ )
+ }
+
+ private fun parseKeyValuePairs(array: ReadableArray?): List> {
+ if (array == null) return emptyList()
+
+ return (0 until array.size()).mapNotNull { i ->
+ val item = array.getMap(i)
+ val key = item?.getString("key")
+ val value = when (item?.getType("value")) {
+ ReadableType.Number -> item.getDouble("value")
+ ReadableType.String -> item.getString("value")
+ else -> null
+ }
+
+ if (key != null && value != null) Pair(key, value) else null
+ }
+ }
+ }
+}
diff --git a/android/src/main/java/com/brentvatne/common/api/ControlsConfig.kt b/android/src/main/java/com/brentvatne/common/api/ControlsConfig.kt
index e03e5d41..8ea70014 100644
--- a/android/src/main/java/com/brentvatne/common/api/ControlsConfig.kt
+++ b/android/src/main/java/com/brentvatne/common/api/ControlsConfig.kt
@@ -5,18 +5,42 @@ import com.facebook.react.bridge.ReadableMap
class ControlsConfig {
var hideSeekBar: Boolean = false
+ var hideDuration: Boolean = false
+ var hidePosition: Boolean = false
+ var hidePlayPause: Boolean = false
+ var hideForward: Boolean = false
+ var hideRewind: Boolean = false
+ var hideNext: Boolean = false
+ var hidePrevious: Boolean = false
+ var hideFullscreen: Boolean = false
+ var hideNavigationBarOnFullScreenMode: Boolean = true
+ var hideNotificationBarOnFullScreenMode: Boolean = true
+ var liveLabel: String? = null
+ var hideSettingButton: Boolean = true
+
var seekIncrementMS: Int = 10000
companion object {
@JvmStatic
- fun parse(src: ReadableMap?): ControlsConfig {
+ fun parse(controlsConfig: ReadableMap?): ControlsConfig {
val config = ControlsConfig()
- if (src != null) {
- config.hideSeekBar = ReactBridgeUtils.safeGetBool(src, "hideSeekBar", false)
- config.seekIncrementMS = ReactBridgeUtils.safeGetInt(src, "seekIncrementMS", 10000)
+ if (controlsConfig != null) {
+ config.hideSeekBar = ReactBridgeUtils.safeGetBool(controlsConfig, "hideSeekBar", false)
+ config.hideDuration = ReactBridgeUtils.safeGetBool(controlsConfig, "hideDuration", false)
+ config.hidePosition = ReactBridgeUtils.safeGetBool(controlsConfig, "hidePosition", false)
+ config.hidePlayPause = ReactBridgeUtils.safeGetBool(controlsConfig, "hidePlayPause", false)
+ config.hideForward = ReactBridgeUtils.safeGetBool(controlsConfig, "hideForward", false)
+ config.hideRewind = ReactBridgeUtils.safeGetBool(controlsConfig, "hideRewind", false)
+ config.hideNext = ReactBridgeUtils.safeGetBool(controlsConfig, "hideNext", false)
+ config.hidePrevious = ReactBridgeUtils.safeGetBool(controlsConfig, "hidePrevious", false)
+ config.hideFullscreen = ReactBridgeUtils.safeGetBool(controlsConfig, "hideFullscreen", false)
+ config.seekIncrementMS = ReactBridgeUtils.safeGetInt(controlsConfig, "seekIncrementMS", 10000)
+ config.hideNavigationBarOnFullScreenMode = ReactBridgeUtils.safeGetBool(controlsConfig, "hideNavigationBarOnFullScreenMode", true)
+ config.hideNotificationBarOnFullScreenMode = ReactBridgeUtils.safeGetBool(controlsConfig, "hideNotificationBarOnFullScreenMode", true)
+ config.liveLabel = ReactBridgeUtils.safeGetString(controlsConfig, "liveLabel", null)
+ config.hideSettingButton = ReactBridgeUtils.safeGetBool(controlsConfig, "hideSettingButton", true)
}
-
return config
}
}
diff --git a/android/src/main/java/com/brentvatne/common/api/ResizeMode.kt b/android/src/main/java/com/brentvatne/common/api/ResizeMode.kt
index c873a04e..18f35d94 100644
--- a/android/src/main/java/com/brentvatne/common/api/ResizeMode.kt
+++ b/android/src/main/java/com/brentvatne/common/api/ResizeMode.kt
@@ -1,8 +1,7 @@
package com.brentvatne.common.api
import androidx.annotation.IntDef
-import java.lang.annotation.Retention
-import java.lang.annotation.RetentionPolicy
+import kotlin.annotation.Retention
internal object ResizeMode {
/**
@@ -42,7 +41,7 @@ internal object ResizeMode {
else -> RESIZE_MODE_FIT
}
- @Retention(RetentionPolicy.SOURCE)
+ @Retention(AnnotationRetention.SOURCE)
@IntDef(
RESIZE_MODE_FIT,
RESIZE_MODE_FIXED_WIDTH,
diff --git a/android/src/main/java/com/brentvatne/common/api/SideLoadedTextTrackList.kt b/android/src/main/java/com/brentvatne/common/api/SideLoadedTextTrackList.kt
index e3d519c4..494facdc 100644
--- a/android/src/main/java/com/brentvatne/common/api/SideLoadedTextTrackList.kt
+++ b/android/src/main/java/com/brentvatne/common/api/SideLoadedTextTrackList.kt
@@ -11,12 +11,18 @@ import com.facebook.react.bridge.ReadableMap
class SideLoadedTextTrackList {
var tracks = ArrayList()
+ /** return true if this and src are equals */
+ override fun equals(other: Any?): Boolean {
+ if (other == null || other !is SideLoadedTextTrackList) return false
+ return tracks == other.tracks
+ }
+
companion object {
fun parse(src: ReadableArray?): SideLoadedTextTrackList? {
if (src == null) {
return null
}
- var sideLoadedTextTrackList = SideLoadedTextTrackList()
+ val sideLoadedTextTrackList = SideLoadedTextTrackList()
for (i in 0 until src.size()) {
val textTrack: ReadableMap = src.getMap(i)
sideLoadedTextTrackList.tracks.add(SideLoadedTextTrack.parse(textTrack))
diff --git a/android/src/main/java/com/brentvatne/common/api/Source.kt b/android/src/main/java/com/brentvatne/common/api/Source.kt
index ba4f8496..4437f668 100644
--- a/android/src/main/java/com/brentvatne/common/api/Source.kt
+++ b/android/src/main/java/com/brentvatne/common/api/Source.kt
@@ -14,6 +14,7 @@ import com.brentvatne.common.toolbox.ReactBridgeUtils.safeGetBool
import com.brentvatne.common.toolbox.ReactBridgeUtils.safeGetInt
import com.brentvatne.common.toolbox.ReactBridgeUtils.safeGetMap
import com.brentvatne.common.toolbox.ReactBridgeUtils.safeGetString
+import com.brentvatne.react.BuildConfig
import com.facebook.react.bridge.ReadableMap
import java.util.Locale
import java.util.Objects
@@ -38,6 +39,9 @@ class Source {
/** Will crop content end at specified position */
var cropEndMs: Int = -1
+ /** Will virtually consider that content before contentStartTime is a preroll ad */
+ var contentStartTime: Int = -1
+
/** Allow to force stream content, necessary when uri doesn't contain content type (.mlp4, .m3u, ...) */
var extension: String? = null
@@ -57,6 +61,21 @@ class Source {
*/
var textTracksAllowChunklessPreparation: Boolean = false
+ /**
+ * CMCD properties linked to the source
+ */
+ var cmcdProps: CMCDProps? = null
+
+ /**
+ * Ads playback properties
+ */
+ var adsProps: AdsProps? = null
+
+ /**
+ * The list of sideLoaded text tracks
+ */
+ var sideLoadedTextTracks: SideLoadedTextTrackList? = null
+
override fun hashCode(): Int = Objects.hash(uriString, uri, startPositionMs, cropStartMs, cropEndMs, extension, metadata, headers)
/** return true if this and src are equals */
@@ -68,7 +87,11 @@ class Source {
cropEndMs == other.cropEndMs &&
startPositionMs == other.startPositionMs &&
extension == other.extension &&
- drmProps == other.drmProps
+ drmProps == other.drmProps &&
+ contentStartTime == other.contentStartTime &&
+ cmcdProps == other.cmcdProps &&
+ sideLoadedTextTracks == other.sideLoadedTextTracks &&
+ adsProps == other.adsProps
)
}
@@ -127,11 +150,15 @@ class Source {
private const val PROP_SRC_START_POSITION = "startPosition"
private const val PROP_SRC_CROP_START = "cropStart"
private const val PROP_SRC_CROP_END = "cropEnd"
+ private const val PROP_SRC_CONTENT_START_TIME = "contentStartTime"
private const val PROP_SRC_TYPE = "type"
private const val PROP_SRC_METADATA = "metadata"
private const val PROP_SRC_HEADERS = "requestHeaders"
private const val PROP_SRC_DRM = "drm"
+ private const val PROP_SRC_CMCD = "cmcd"
+ private const val PROP_SRC_ADS = "ad"
private const val PROP_SRC_TEXT_TRACKS_ALLOW_CHUNKLESS_PREPARATION = "textTracksAllowChunklessPreparation"
+ private const val PROP_SRC_TEXT_TRACKS = "textTracks"
@SuppressLint("DiscouragedApi")
private fun getUriFromAssetId(context: Context, uriString: String): Uri? {
@@ -187,9 +214,15 @@ class Source {
source.startPositionMs = safeGetInt(src, PROP_SRC_START_POSITION, -1)
source.cropStartMs = safeGetInt(src, PROP_SRC_CROP_START, -1)
source.cropEndMs = safeGetInt(src, PROP_SRC_CROP_END, -1)
+ source.contentStartTime = safeGetInt(src, PROP_SRC_CONTENT_START_TIME, -1)
source.extension = safeGetString(src, PROP_SRC_TYPE, null)
source.drmProps = parse(safeGetMap(src, PROP_SRC_DRM))
+ source.cmcdProps = CMCDProps.parse(safeGetMap(src, PROP_SRC_CMCD))
+ if (BuildConfig.USE_EXOPLAYER_IMA) {
+ source.adsProps = AdsProps.parse(safeGetMap(src, PROP_SRC_ADS))
+ }
source.textTracksAllowChunklessPreparation = safeGetBool(src, PROP_SRC_TEXT_TRACKS_ALLOW_CHUNKLESS_PREPARATION, true)
+ source.sideLoadedTextTracks = SideLoadedTextTrackList.parse(safeGetArray(src, PROP_SRC_TEXT_TRACKS))
val propSrcHeadersArray = safeGetArray(src, PROP_SRC_HEADERS)
if (propSrcHeadersArray != null) {
diff --git a/android/src/main/java/com/brentvatne/common/api/SubtitleStyle.kt b/android/src/main/java/com/brentvatne/common/api/SubtitleStyle.kt
index efb4da0a..1ac0fd03 100644
--- a/android/src/main/java/com/brentvatne/common/api/SubtitleStyle.kt
+++ b/android/src/main/java/com/brentvatne/common/api/SubtitleStyle.kt
@@ -6,7 +6,7 @@ import com.facebook.react.bridge.ReadableMap
/**
* Helper file to parse SubtitleStyle prop and build a dedicated class
*/
-class SubtitleStyle private constructor() {
+class SubtitleStyle public constructor() {
var fontSize = -1
private set
var paddingLeft = 0
@@ -19,6 +19,8 @@ class SubtitleStyle private constructor() {
private set
var opacity = 1f
private set
+ var subtitlesFollowVideo = true
+ private set
companion object {
private const val PROP_FONT_SIZE_TRACK = "fontSize"
@@ -27,6 +29,7 @@ class SubtitleStyle private constructor() {
private const val PROP_PADDING_LEFT = "paddingLeft"
private const val PROP_PADDING_RIGHT = "paddingRight"
private const val PROP_OPACITY = "opacity"
+ private const val PROP_SUBTITLES_FOLLOW_VIDEO = "subtitlesFollowVideo"
@JvmStatic
fun parse(src: ReadableMap?): SubtitleStyle {
@@ -37,6 +40,7 @@ class SubtitleStyle private constructor() {
subtitleStyle.paddingLeft = ReactBridgeUtils.safeGetInt(src, PROP_PADDING_LEFT, 0)
subtitleStyle.paddingRight = ReactBridgeUtils.safeGetInt(src, PROP_PADDING_RIGHT, 0)
subtitleStyle.opacity = ReactBridgeUtils.safeGetFloat(src, PROP_OPACITY, 1f)
+ subtitleStyle.subtitlesFollowVideo = ReactBridgeUtils.safeGetBool(src, PROP_SUBTITLES_FOLLOW_VIDEO, true)
return subtitleStyle
}
}
diff --git a/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt b/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt
index 8f29779a..a7be7058 100644
--- a/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt
+++ b/android/src/main/java/com/brentvatne/common/react/VideoEventEmitter.kt
@@ -48,7 +48,7 @@ enum class EventTypes(val eventName: String) {
fun toMap() =
mutableMapOf().apply {
EventTypes.values().toList().forEach { eventType ->
- put("top${eventType.eventName.removePrefix("on")}", mapOf("registrationName" to eventType.eventName))
+ put("top${eventType.eventName.removePrefix("on")}", hashMapOf("registrationName" to eventType.eventName))
}
}
}
@@ -64,11 +64,11 @@ class VideoEventEmitter {
audioTracks: ArrayList,
textTracks: ArrayList,
videoTracks: ArrayList,
- trackId: String
+ trackId: String?
) -> Unit
lateinit var onVideoError: (errorString: String, exception: Exception, errorCode: String) -> Unit
lateinit var onVideoProgress: (currentPosition: Long, bufferedDuration: Long, seekableDuration: Long, currentPlaybackTime: Double) -> Unit
- lateinit var onVideoBandwidthUpdate: (bitRateEstimate: Long, height: Int, width: Int, trackId: String) -> Unit
+ lateinit var onVideoBandwidthUpdate: (bitRateEstimate: Long, height: Int, width: Int, trackId: String?) -> Unit
lateinit var onVideoPlaybackStateChanged: (isPlaying: Boolean, isSeeking: Boolean) -> Unit
lateinit var onVideoSeek: (currentPosition: Long, seekTime: Long) -> Unit
lateinit var onVideoEnd: () -> Unit
@@ -108,7 +108,7 @@ class VideoEventEmitter {
val naturalSize: WritableMap = aspectRatioToNaturalSize(videoWidth, videoHeight)
putMap("naturalSize", naturalSize)
- putString("trackId", trackId)
+ trackId?.let { putString("trackId", it) }
putArray("videoTracks", videoTracksToArray(videoTracks))
putArray("audioTracks", audioTracksToArray(audioTracks))
putArray("textTracks", textTracksToArray(textTracks))
@@ -153,9 +153,13 @@ class VideoEventEmitter {
onVideoBandwidthUpdate = { bitRateEstimate, height, width, trackId ->
event.dispatch(EventTypes.EVENT_BANDWIDTH) {
putDouble("bitrate", bitRateEstimate.toDouble())
- putInt("width", width)
- putInt("height", height)
- putString("trackId", trackId)
+ if (width > 0) {
+ putInt("width", width)
+ }
+ if (height > 0) {
+ putInt("height", height)
+ }
+ trackId?.let { putString("trackId", it) }
}
}
onVideoPlaybackStateChanged = { isPlaying, isSeeking ->
@@ -209,7 +213,7 @@ class VideoEventEmitter {
putArray(
"metadata",
Arguments.createArray().apply {
- metadataArrayList.forEachIndexed { i, metadata ->
+ metadataArrayList.forEachIndexed { _, metadata ->
pushMap(
Arguments.createMap().apply {
putString("identifier", metadata.identifier)
@@ -303,7 +307,7 @@ class VideoEventEmitter {
private fun videoTracksToArray(videoTracks: java.util.ArrayList?): WritableArray =
Arguments.createArray().apply {
- videoTracks?.forEachIndexed { i, vTrack ->
+ videoTracks?.forEachIndexed { _, vTrack ->
pushMap(
Arguments.createMap().apply {
putInt("width", vTrack.width)
@@ -336,15 +340,19 @@ class VideoEventEmitter {
private fun aspectRatioToNaturalSize(videoWidth: Int, videoHeight: Int): WritableMap =
Arguments.createMap().apply {
- putInt("width", videoWidth)
- putInt("height", videoHeight)
- val orientation = if (videoWidth > videoHeight) {
- "landscape"
- } else if (videoWidth < videoHeight) {
- "portrait"
- } else {
- "square"
+ if (videoWidth > 0) {
+ putInt("width", videoWidth)
}
+ if (videoHeight > 0) {
+ putInt("height", videoHeight)
+ }
+
+ val orientation = when {
+ videoWidth > videoHeight -> "landscape"
+ videoWidth < videoHeight -> "portrait"
+ else -> "square"
+ }
+
putString("orientation", orientation)
}
}
diff --git a/android/src/main/java/com/brentvatne/common/toolbox/ReactBridgeUtils.kt b/android/src/main/java/com/brentvatne/common/toolbox/ReactBridgeUtils.kt
index 10f4752a..b4cce426 100644
--- a/android/src/main/java/com/brentvatne/common/toolbox/ReactBridgeUtils.kt
+++ b/android/src/main/java/com/brentvatne/common/toolbox/ReactBridgeUtils.kt
@@ -3,7 +3,6 @@ package com.brentvatne.common.toolbox
import com.facebook.react.bridge.Dynamic
import com.facebook.react.bridge.ReadableArray
import com.facebook.react.bridge.ReadableMap
-import java.util.HashMap
/*
* Toolbox to safe parsing of videoAspectRatio = if (format.width == 0) 1f else (format.height * format.pixelWidthHeightRatio) / format.width
+ else -> videoAspectRatio = if (format.height == 0) 1f else (format.width * format.pixelWidthHeightRatio) / format.height
+ }
+ }
}
diff --git a/android/src/main/java/com/brentvatne/exoplayer/CMCDConfig.kt b/android/src/main/java/com/brentvatne/exoplayer/CMCDConfig.kt
new file mode 100644
index 00000000..60d9d598
--- /dev/null
+++ b/android/src/main/java/com/brentvatne/exoplayer/CMCDConfig.kt
@@ -0,0 +1,41 @@
+package com.brentvatne.exoplayer
+
+import androidx.media3.common.MediaItem
+import androidx.media3.exoplayer.upstream.CmcdConfiguration
+import com.brentvatne.common.api.CMCDProps
+import com.google.common.collect.ImmutableListMultimap
+
+class CMCDConfig(private val props: CMCDProps) {
+ fun toCmcdConfigurationFactory(): CmcdConfiguration.Factory = CmcdConfiguration.Factory(::createCmcdConfiguration)
+
+ private fun createCmcdConfiguration(mediaItem: MediaItem): CmcdConfiguration =
+ CmcdConfiguration(
+ java.util.UUID.randomUUID().toString(),
+ mediaItem.mediaId,
+ object : CmcdConfiguration.RequestConfig {
+ override fun getCustomData(): ImmutableListMultimap = buildCustomData()
+ },
+ props.mode
+ )
+
+ private fun buildCustomData(): ImmutableListMultimap =
+ ImmutableListMultimap.builder().apply {
+ addFormattedData(this, CmcdConfiguration.KEY_CMCD_OBJECT, props.cmcdObject)
+ addFormattedData(this, CmcdConfiguration.KEY_CMCD_REQUEST, props.cmcdRequest)
+ addFormattedData(this, CmcdConfiguration.KEY_CMCD_SESSION, props.cmcdSession)
+ addFormattedData(this, CmcdConfiguration.KEY_CMCD_STATUS, props.cmcdStatus)
+ }.build()
+
+ private fun addFormattedData(builder: ImmutableListMultimap.Builder, key: String, dataList: List>) {
+ dataList.forEach { (dataKey, dataValue) ->
+ builder.put(key, formatKeyValue(dataKey, dataValue))
+ }
+ }
+
+ private fun formatKeyValue(key: String, value: Any): String =
+ when (value) {
+ is String -> "$key=\"$value\""
+ is Number -> "$key=$value"
+ else -> throw IllegalArgumentException("Unsupported value type: ${value::class.java}")
+ }
+}
diff --git a/android/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java
deleted file mode 100644
index d1ac5227..00000000
--- a/android/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java
+++ /dev/null
@@ -1,293 +0,0 @@
-package com.brentvatne.exoplayer;
-
-import android.annotation.SuppressLint;
-import android.content.Context;
-
-import androidx.annotation.NonNull;
-import androidx.core.content.ContextCompat;
-import androidx.media3.common.AdViewProvider;
-import androidx.media3.common.C;
-import androidx.media3.common.Format;
-import androidx.media3.common.Player;
-import androidx.media3.common.Tracks;
-import androidx.media3.common.VideoSize;
-import androidx.media3.common.text.Cue;
-import androidx.media3.common.util.Assertions;
-import androidx.media3.exoplayer.ExoPlayer;
-import androidx.media3.ui.SubtitleView;
-
-import android.util.TypedValue;
-import android.view.Gravity;
-import android.view.SurfaceView;
-import android.view.TextureView;
-import android.view.View;
-import android.view.ViewGroup;
-import android.widget.FrameLayout;
-
-import com.brentvatne.common.api.ResizeMode;
-import com.brentvatne.common.api.SubtitleStyle;
-import com.brentvatne.common.api.ViewType;
-import com.brentvatne.common.toolbox.DebugLog;
-import com.google.common.collect.ImmutableList;
-
-import java.util.List;
-
-@SuppressLint("ViewConstructor")
-public final class ExoPlayerView extends FrameLayout implements AdViewProvider {
- private final static String TAG = "ExoPlayerView";
- private View surfaceView;
- private final View shutterView;
- private final SubtitleView subtitleLayout;
- private final AspectRatioFrameLayout layout;
- private final ComponentListener componentListener;
- private ExoPlayer player;
- private final Context context;
- private final ViewGroup.LayoutParams layoutParams;
- private final FrameLayout adOverlayFrameLayout;
-
- private @ViewType.ViewType int viewType = ViewType.VIEW_TYPE_SURFACE;
- private boolean hideShutterView = false;
-
- public ExoPlayerView(Context context) {
- super(context, null, 0);
-
- this.context = context;
-
- layoutParams = new ViewGroup.LayoutParams(
- ViewGroup.LayoutParams.MATCH_PARENT,
- ViewGroup.LayoutParams.MATCH_PARENT);
-
- componentListener = new ComponentListener();
-
- FrameLayout.LayoutParams aspectRatioParams = new FrameLayout.LayoutParams(
- FrameLayout.LayoutParams.MATCH_PARENT,
- FrameLayout.LayoutParams.MATCH_PARENT);
- aspectRatioParams.gravity = Gravity.CENTER;
- layout = new AspectRatioFrameLayout(context);
- layout.setLayoutParams(aspectRatioParams);
-
- shutterView = new View(getContext());
- shutterView.setLayoutParams(layoutParams);
- shutterView.setBackgroundColor(ContextCompat.getColor(context, android.R.color.black));
-
- subtitleLayout = new SubtitleView(context);
- subtitleLayout.setLayoutParams(layoutParams);
- subtitleLayout.setUserDefaultStyle();
- subtitleLayout.setUserDefaultTextSize();
-
- updateSurfaceView(viewType);
-
- adOverlayFrameLayout = new FrameLayout(context);
-
- layout.addView(shutterView, 1, layoutParams);
- layout.addView(adOverlayFrameLayout, 2, layoutParams);
-
- addViewInLayout(layout, 0, aspectRatioParams);
- addViewInLayout(subtitleLayout, 1, layoutParams);
- }
-
- private void clearVideoView() {
- if (surfaceView instanceof TextureView) {
- player.clearVideoTextureView((TextureView) surfaceView);
- } else if (surfaceView instanceof SurfaceView) {
- player.clearVideoSurfaceView((SurfaceView) surfaceView);
- }
- }
-
- private void setVideoView() {
- if (surfaceView instanceof TextureView) {
- player.setVideoTextureView((TextureView) surfaceView);
- } else if (surfaceView instanceof SurfaceView) {
- player.setVideoSurfaceView((SurfaceView) surfaceView);
- }
- }
-
- public boolean isPlaying() {
- return player != null && player.isPlaying();
- }
-
- public void setSubtitleStyle(SubtitleStyle style) {
- // ensure we reset subtile style before reapplying it
- subtitleLayout.setUserDefaultStyle();
- subtitleLayout.setUserDefaultTextSize();
-
- if (style.getFontSize() > 0) {
- subtitleLayout.setFixedTextSize(TypedValue.COMPLEX_UNIT_SP, style.getFontSize());
- }
- subtitleLayout.setPadding(style.getPaddingLeft(), style.getPaddingTop(), style.getPaddingRight(), style.getPaddingBottom());
- if (style.getOpacity() != 0) {
- subtitleLayout.setAlpha(style.getOpacity());
- subtitleLayout.setVisibility(View.VISIBLE);
- } else {
- subtitleLayout.setVisibility(View.GONE);
- }
-
- }
-
- public void setShutterColor(Integer color) {
- shutterView.setBackgroundColor(color);
- }
-
- public void updateSurfaceView(@ViewType.ViewType int viewType) {
- this.viewType = viewType;
- boolean viewNeedRefresh = false;
- if (viewType == ViewType.VIEW_TYPE_SURFACE || viewType == ViewType.VIEW_TYPE_SURFACE_SECURE) {
- if (!(surfaceView instanceof SurfaceView)) {
- surfaceView = new SurfaceView(context);
- viewNeedRefresh = true;
- }
- ((SurfaceView)surfaceView).setSecure(viewType == ViewType.VIEW_TYPE_SURFACE_SECURE);
- } else if (viewType == ViewType.VIEW_TYPE_TEXTURE) {
- if (!(surfaceView instanceof TextureView)) {
- surfaceView = new TextureView(context);
- viewNeedRefresh = true;
- }
- // Support opacity properly:
- ((TextureView) surfaceView).setOpaque(false);
- } else {
- DebugLog.wtf(TAG, "wtf is this texture " + viewType);
- }
- if (viewNeedRefresh) {
- surfaceView.setLayoutParams(layoutParams);
-
- if (layout.getChildAt(0) != null) {
- layout.removeViewAt(0);
- }
- layout.addView(surfaceView, 0, layoutParams);
-
- if (this.player != null) {
- setVideoView();
- }
- }
- }
-
- private void updateShutterViewVisibility() {
- shutterView.setVisibility(this.hideShutterView ? View.INVISIBLE : View.VISIBLE);
- }
-
- @Override
- public void requestLayout() {
- super.requestLayout();
- post(measureAndLayout);
- }
-
- // AdsLoader.AdViewProvider implementation.
-
- @Override
- public ViewGroup getAdViewGroup() {
- return Assertions.checkNotNull(adOverlayFrameLayout, "exo_ad_overlay must be present for ad playback");
- }
-
- /**
- * Set the {@link ExoPlayer} to use. The {@link ExoPlayer#addListener} method of the
- * player will be called and previous
- * assignments are overridden.
- *
- * @param player The {@link ExoPlayer} to use.
- */
- public void setPlayer(ExoPlayer player) {
- if (this.player == player) {
- return;
- }
- if (this.player != null) {
- this.player.removeListener(componentListener);
- clearVideoView();
- }
- this.player = player;
- shutterView.setVisibility(this.hideShutterView ? View.INVISIBLE : View.VISIBLE);
- if (player != null) {
- setVideoView();
- player.addListener(componentListener);
- }
- }
-
- /**
- * Sets the resize mode which can be of value {@link ResizeMode.Mode}
- *
- * @param resizeMode The resize mode.
- */
- public void setResizeMode(@ResizeMode.Mode int resizeMode) {
- if (layout != null && layout.getResizeMode() != resizeMode) {
- layout.setResizeMode(resizeMode);
- post(measureAndLayout);
- }
- }
-
- public void setHideShutterView(boolean hideShutterView) {
- this.hideShutterView = hideShutterView;
- updateShutterViewVisibility();
- }
-
- private final Runnable measureAndLayout = () -> {
- measure(
- MeasureSpec.makeMeasureSpec(getWidth(), MeasureSpec.EXACTLY),
- MeasureSpec.makeMeasureSpec(getHeight(), MeasureSpec.EXACTLY));
- layout(getLeft(), getTop(), getRight(), getBottom());
- };
-
- private void updateForCurrentTrackSelections(Tracks tracks) {
- if (tracks == null) {
- return;
- }
- ImmutableList groups = tracks.getGroups();
- for (Tracks.Group group: groups) {
- if (group.getType() == C.TRACK_TYPE_VIDEO && group.length > 0) {
- // get the first track of the group to identify aspect ratio
- Format format = group.getTrackFormat(0);
-
- // There are weird cases when video height and width did not change with rotation so we need change aspect ration to fix it
- switch (format.rotationDegrees) {
- // update aspect ratio !
- case 90, 270 -> {
- layout.setVideoAspectRatio(format.width == 0 ? 1 : (format.height * format.pixelWidthHeightRatio) / format.width);
- }
- default -> {
- layout.setVideoAspectRatio(format.height == 0 ? 1 : (format.width * format.pixelWidthHeightRatio) / format.height);
- }
- }
- return;
- }
- }
- // no video tracks, in that case refresh shutterView visibility
- shutterView.setVisibility(this.hideShutterView ? View.INVISIBLE : View.VISIBLE);
- }
-
- public void invalidateAspectRatio() {
- // Resetting aspect ratio will force layout refresh on next video size changed
- layout.invalidateAspectRatio();
- }
-
- private final class ComponentListener implements Player.Listener {
-
- @Override
- public void onCues(@NonNull List cues) {
- subtitleLayout.setCues(cues);
- }
-
- @Override
- public void onVideoSizeChanged(VideoSize videoSize) {
- boolean isInitialRatio = layout.getVideoAspectRatio() == 0;
- if (videoSize.height == 0 || videoSize.width == 0) {
- // When changing video track we receive an ghost state with height / width = 0
- // No need to resize the view in that case
- return;
- }
- layout.setVideoAspectRatio((videoSize.width * videoSize.pixelWidthHeightRatio) / videoSize.height);
-
- // React native workaround for measuring and layout on initial load.
- if (isInitialRatio) {
- post(measureAndLayout);
- }
- }
-
- @Override
- public void onRenderedFirstFrame() {
- shutterView.setVisibility(INVISIBLE);
- }
-
- @Override
- public void onTracksChanged(@NonNull Tracks tracks) {
- updateForCurrentTrackSelections(tracks);
- }
- }
-}
diff --git a/android/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.kt b/android/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.kt
new file mode 100644
index 00000000..98f2d0a5
--- /dev/null
+++ b/android/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.kt
@@ -0,0 +1,338 @@
+package com.brentvatne.exoplayer
+
+import android.content.Context
+import android.util.Log
+import android.util.TypedValue
+import android.view.Gravity
+import android.view.SurfaceView
+import android.view.TextureView
+import android.view.View
+import android.view.ViewGroup
+import android.widget.FrameLayout
+import androidx.core.content.ContextCompat
+import androidx.media3.common.AdViewProvider
+import androidx.media3.common.C
+import androidx.media3.common.Player
+import androidx.media3.common.Tracks
+import androidx.media3.common.VideoSize
+import androidx.media3.common.text.Cue
+import androidx.media3.common.util.Assertions
+import androidx.media3.common.util.UnstableApi
+import androidx.media3.exoplayer.ExoPlayer
+import androidx.media3.ui.SubtitleView
+import com.brentvatne.common.api.ResizeMode
+import com.brentvatne.common.api.SubtitleStyle
+import com.brentvatne.common.api.ViewType
+import com.brentvatne.common.toolbox.DebugLog
+
+@UnstableApi
+class ExoPlayerView(private val context: Context) :
+ FrameLayout(context, null, 0),
+ AdViewProvider {
+
+ private var surfaceView: View? = null
+ private var shutterView: View
+ private var subtitleLayout: SubtitleView
+ private var layout: AspectRatioFrameLayout
+ private var componentListener: ComponentListener
+ private var player: ExoPlayer? = null
+ private var layoutParams: ViewGroup.LayoutParams = ViewGroup.LayoutParams(
+ ViewGroup.LayoutParams.MATCH_PARENT,
+ ViewGroup.LayoutParams.MATCH_PARENT
+ )
+ private var adOverlayFrameLayout: FrameLayout
+ val isPlaying: Boolean
+ get() = player != null && player?.isPlaying == true
+
+ @ViewType.ViewType
+ private var viewType = ViewType.VIEW_TYPE_SURFACE
+ private var hideShutterView = false
+
+ private var localStyle = SubtitleStyle()
+
+ init {
+ componentListener = ComponentListener()
+
+ val aspectRatioParams = LayoutParams(
+ LayoutParams.MATCH_PARENT,
+ LayoutParams.MATCH_PARENT
+ )
+ aspectRatioParams.gravity = Gravity.CENTER
+ layout = AspectRatioFrameLayout(context)
+ layout.layoutParams = aspectRatioParams
+
+ shutterView = View(context)
+ shutterView.layoutParams = layoutParams
+ shutterView.setBackgroundColor(ContextCompat.getColor(context, android.R.color.black))
+
+ subtitleLayout = SubtitleView(context)
+ subtitleLayout.layoutParams = layoutParams
+ subtitleLayout.setUserDefaultStyle()
+ subtitleLayout.setUserDefaultTextSize()
+
+ updateSurfaceView(viewType)
+
+ adOverlayFrameLayout = FrameLayout(context)
+
+ layout.addView(shutterView, 1, layoutParams)
+ if (localStyle.subtitlesFollowVideo) {
+ layout.addView(subtitleLayout, layoutParams)
+ layout.addView(adOverlayFrameLayout, layoutParams)
+ }
+
+ addViewInLayout(layout, 0, aspectRatioParams)
+ if (!localStyle.subtitlesFollowVideo) {
+ addViewInLayout(subtitleLayout, 1, layoutParams)
+ }
+ }
+
+ private fun clearVideoView() {
+ when (val view = surfaceView) {
+ is TextureView -> player?.clearVideoTextureView(view)
+
+ is SurfaceView -> player?.clearVideoSurfaceView(view)
+
+ else -> {
+ Log.w(
+ "clearVideoView",
+ "Unexpected surfaceView type: ${surfaceView?.javaClass?.name}"
+ )
+ }
+ }
+ }
+
+ private fun setVideoView() {
+ when (val view = surfaceView) {
+ is TextureView -> player?.setVideoTextureView(view)
+
+ is SurfaceView -> player?.setVideoSurfaceView(view)
+
+ else -> {
+ Log.w(
+ "setVideoView",
+ "Unexpected surfaceView type: ${surfaceView?.javaClass?.name}"
+ )
+ }
+ }
+ }
+
+ fun setSubtitleStyle(style: SubtitleStyle) {
+ // ensure we reset subtitle style before reapplying it
+ subtitleLayout.setUserDefaultStyle()
+ subtitleLayout.setUserDefaultTextSize()
+
+ if (style.fontSize > 0) {
+ subtitleLayout.setFixedTextSize(TypedValue.COMPLEX_UNIT_SP, style.fontSize.toFloat())
+ }
+ subtitleLayout.setPadding(
+ style.paddingLeft,
+ style.paddingTop,
+ style.paddingTop,
+ style.paddingBottom
+ )
+ if (style.opacity != 0.0f) {
+ subtitleLayout.alpha = style.opacity
+ subtitleLayout.visibility = View.VISIBLE
+ } else {
+ subtitleLayout.visibility = View.GONE
+ }
+ if (localStyle.subtitlesFollowVideo != style.subtitlesFollowVideo) {
+ // No need to manipulate layout if value didn't change
+ if (style.subtitlesFollowVideo) {
+ removeViewInLayout(subtitleLayout)
+ layout.addView(subtitleLayout, layoutParams)
+ } else {
+ layout.removeViewInLayout(subtitleLayout)
+ addViewInLayout(subtitleLayout, 1, layoutParams, false)
+ }
+ requestLayout()
+ }
+ localStyle = style
+ }
+
+ fun setShutterColor(color: Int) {
+ shutterView.setBackgroundColor(color)
+ }
+
+ fun updateSurfaceView(@ViewType.ViewType viewType: Int) {
+ this.viewType = viewType
+ var viewNeedRefresh = false
+ when (viewType) {
+ ViewType.VIEW_TYPE_SURFACE, ViewType.VIEW_TYPE_SURFACE_SECURE -> {
+ if (surfaceView !is SurfaceView) {
+ surfaceView = SurfaceView(context)
+ viewNeedRefresh = true
+ }
+ (surfaceView as SurfaceView).setSecure(viewType == ViewType.VIEW_TYPE_SURFACE_SECURE)
+ }
+
+ ViewType.VIEW_TYPE_TEXTURE -> {
+ if (surfaceView !is TextureView) {
+ surfaceView = TextureView(context)
+ viewNeedRefresh = true
+ }
+ // Support opacity properly:
+ (surfaceView as TextureView).isOpaque = false
+ }
+
+ else -> {
+ DebugLog.wtf(TAG, "Unexpected texture view type: $viewType")
+ }
+ }
+
+ if (viewNeedRefresh) {
+ surfaceView?.layoutParams = layoutParams
+
+ if (layout.getChildAt(0) != null) {
+ layout.removeViewAt(0)
+ }
+ layout.addView(surfaceView, 0, layoutParams)
+
+ if (this.player != null) {
+ setVideoView()
+ }
+ }
+ }
+
+ private fun hideShutterView() {
+ shutterView.setVisibility(INVISIBLE)
+ surfaceView?.setAlpha(1f)
+ }
+
+ private fun showShutterView() {
+ shutterView.setVisibility(VISIBLE)
+ surfaceView?.setAlpha(0f)
+ }
+
+ fun showAds() {
+ adOverlayFrameLayout.setVisibility(View.VISIBLE)
+ }
+
+ fun hideAds() {
+ adOverlayFrameLayout.setVisibility(View.GONE)
+ }
+
+ fun updateShutterViewVisibility() {
+ shutterView.visibility = if (this.hideShutterView) {
+ View.INVISIBLE
+ } else {
+ View.VISIBLE
+ }
+ }
+
+ override fun requestLayout() {
+ super.requestLayout()
+ post(measureAndLayout)
+ }
+
+ // AdsLoader.AdViewProvider implementation.
+ override fun getAdViewGroup(): ViewGroup =
+ Assertions.checkNotNull(
+ adOverlayFrameLayout,
+ "exo_ad_overlay must be present for ad playback"
+ )
+
+ /**
+ * Set the {@link ExoPlayer} to use. The {@link ExoPlayer#addListener} method of the
+ * player will be called and previous
+ * assignments are overridden.
+ *
+ * @param player The {@link ExoPlayer} to use.
+ */
+ fun setPlayer(player: ExoPlayer?) {
+ if (this.player == player) {
+ return
+ }
+ if (this.player != null) {
+ this.player!!.removeListener(componentListener)
+ clearVideoView()
+ }
+ this.player = player
+
+ updateShutterViewVisibility()
+ if (player != null) {
+ setVideoView()
+ player.addListener(componentListener)
+ }
+ }
+
+ /**
+ * Sets the resize mode which can be of value {@link ResizeMode.Mode}
+ *
+ * @param resizeMode The resize mode.
+ */
+ fun setResizeMode(@ResizeMode.Mode resizeMode: Int) {
+ if (layout.resizeMode != resizeMode) {
+ layout.resizeMode = resizeMode
+ post(measureAndLayout)
+ }
+ }
+
+ fun setHideShutterView(hideShutterView: Boolean) {
+ this.hideShutterView = hideShutterView
+ updateShutterViewVisibility()
+ }
+
+ private val measureAndLayout: Runnable = Runnable {
+ measure(
+ MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY),
+ MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)
+ )
+ layout(left, top, right, bottom)
+ }
+
+ private fun updateForCurrentTrackSelections(tracks: Tracks?) {
+ if (tracks == null) {
+ return
+ }
+ val groups = tracks.groups
+
+ for (group in groups) {
+ if (group.type == C.TRACK_TYPE_VIDEO && group.length > 0) {
+ // get the first track of the group to identify aspect ratio
+ val format = group.getTrackFormat(0)
+ layout.updateAspectRatio(format)
+ return
+ }
+ }
+ // no video tracks, in that case refresh shutterView visibility
+ updateShutterViewVisibility()
+ }
+
+ fun invalidateAspectRatio() {
+ // Resetting aspect ratio will force layout refresh on next video size changed
+ layout.invalidateAspectRatio()
+ }
+
+ private inner class ComponentListener : Player.Listener {
+ override fun onCues(cues: List) {
+ subtitleLayout.setCues(cues)
+ }
+
+ override fun onVideoSizeChanged(videoSize: VideoSize) {
+ if (videoSize.height == 0 || videoSize.width == 0) {
+ // When changing video track we receive an ghost state with height / width = 0
+ // No need to resize the view in that case
+ return
+ }
+ // Here we use updateForCurrentTrackSelections to have a consistent behavior.
+ // according to: https://github.com/androidx/media/issues/1207
+ // sometimes media3 send bad Video size information
+ player?.let {
+ updateForCurrentTrackSelections(it.currentTracks)
+ }
+ }
+
+ override fun onRenderedFirstFrame() {
+ shutterView.visibility = INVISIBLE
+ }
+
+ override fun onTracksChanged(tracks: Tracks) {
+ updateForCurrentTrackSelections(tracks)
+ }
+ }
+
+ companion object {
+ private const val TAG = "ExoPlayerView"
+ }
+}
diff --git a/android/src/main/java/com/brentvatne/exoplayer/FullScreenPlayerView.kt b/android/src/main/java/com/brentvatne/exoplayer/FullScreenPlayerView.kt
index b66c1e88..9eff62dd 100644
--- a/android/src/main/java/com/brentvatne/exoplayer/FullScreenPlayerView.kt
+++ b/android/src/main/java/com/brentvatne/exoplayer/FullScreenPlayerView.kt
@@ -6,11 +6,17 @@ import android.content.Context
import android.os.Handler
import android.os.Looper
import android.view.ViewGroup
+import android.view.Window
import android.view.WindowManager
import android.widget.FrameLayout
import android.widget.ImageButton
+import android.widget.LinearLayout
import androidx.activity.OnBackPressedCallback
+import androidx.core.view.ViewCompat
+import androidx.core.view.WindowInsetsCompat
+import androidx.core.view.WindowInsetsControllerCompat
import androidx.media3.ui.LegacyPlayerControlView
+import com.brentvatne.common.api.ControlsConfig
import com.brentvatne.common.toolbox.DebugLog
import java.lang.ref.WeakReference
@@ -20,14 +26,22 @@ class FullScreenPlayerView(
private val exoPlayerView: ExoPlayerView,
private val reactExoplayerView: ReactExoplayerView,
private val playerControlView: LegacyPlayerControlView?,
- private val onBackPressedCallback: OnBackPressedCallback
-) : Dialog(context, android.R.style.Theme_Black_NoTitleBar_Fullscreen) {
+ private val onBackPressedCallback: OnBackPressedCallback,
+ private val controlsConfig: ControlsConfig
+) : Dialog(context, android.R.style.Theme_Black_NoTitleBar) {
private var parent: ViewGroup? = null
private val containerView = FrameLayout(context)
private val mKeepScreenOnHandler = Handler(Looper.getMainLooper())
private val mKeepScreenOnUpdater = KeepScreenOnUpdater(this)
+ // As this view is fullscreen we need to save initial state and restore it afterward
+ // Following variables save UI state when open the view
+ // restoreUIState, will reapply these values
+ private var initialSystemBarsBehavior: Int? = null
+ private var initialNavigationBarIsVisible: Boolean? = null
+ private var initialNotificationBarIsVisible: Boolean? = null
+
private class KeepScreenOnUpdater(fullScreenPlayerView: FullScreenPlayerView) : Runnable {
private val mFullscreenPlayer = WeakReference(fullScreenPlayerView)
@@ -59,10 +73,15 @@ class FullScreenPlayerView(
init {
setContentView(containerView, generateDefaultLayoutParams())
- }
- override fun onBackPressed() {
- super.onBackPressed()
- onBackPressedCallback.handleOnBackPressed()
+
+ window?.let {
+ val inset = WindowInsetsControllerCompat(it, it.decorView)
+ initialSystemBarsBehavior = inset.systemBarsBehavior
+ initialNavigationBarIsVisible = ViewCompat.getRootWindowInsets(it.decorView)
+ ?.isVisible(WindowInsetsCompat.Type.navigationBars()) == true
+ initialNotificationBarIsVisible = ViewCompat.getRootWindowInsets(it.decorView)
+ ?.isVisible(WindowInsetsCompat.Type.statusBars()) == true
+ }
}
override fun onStart() {
@@ -75,6 +94,7 @@ class FullScreenPlayerView(
parent?.removeView(it)
containerView.addView(it, generateDefaultLayoutParams())
}
+ updateNavigationBarVisibility()
}
override fun onStop() {
@@ -89,15 +109,28 @@ class FullScreenPlayerView(
}
parent?.requestLayout()
parent = null
+ onBackPressedCallback.handleOnBackPressed()
+ restoreSystemUI()
}
- private fun getFullscreenIconResource(isFullscreen: Boolean): Int {
- return if (isFullscreen) {
+ // restore system UI state
+ private fun restoreSystemUI() {
+ window?.let {
+ updateNavigationBarVisibility(
+ it,
+ initialNavigationBarIsVisible,
+ initialNotificationBarIsVisible,
+ initialSystemBarsBehavior
+ )
+ }
+ }
+
+ private fun getFullscreenIconResource(isFullscreen: Boolean): Int =
+ if (isFullscreen) {
androidx.media3.ui.R.drawable.exo_icon_fullscreen_exit
} else {
androidx.media3.ui.R.drawable.exo_icon_fullscreen_enter
}
- }
private fun updateFullscreenButton(playerControlView: LegacyPlayerControlView, isFullscreen: Boolean) {
val imageButton = playerControlView.findViewById(com.brentvatne.react.R.id.exo_fullscreen)
@@ -128,4 +161,69 @@ class FullScreenPlayerView(
layoutParams.setMargins(0, 0, 0, 0)
return layoutParams
}
+
+ private fun updateBarVisibility(
+ inset: WindowInsetsControllerCompat,
+ type: Int,
+ shouldHide: Boolean?,
+ initialVisibility: Boolean?,
+ systemBarsBehavior: Int? = null
+ ) {
+ shouldHide?.takeIf { it != initialVisibility }?.let {
+ if (it) {
+ inset.hide(type)
+ systemBarsBehavior?.let { behavior -> inset.systemBarsBehavior = behavior }
+ } else {
+ inset.show(type)
+ }
+ }
+ }
+
+ // Move the UI to fullscreen.
+ // if you change this code, remember to check that the UI is well restored in restoreUIState
+ private fun updateNavigationBarVisibility(
+ window: Window,
+ hideNavigationBarOnFullScreenMode: Boolean?,
+ hideNotificationBarOnFullScreenMode: Boolean?,
+ systemBarsBehavior: Int?
+ ) {
+ // Configure the behavior of the hidden system bars.
+ val inset = WindowInsetsControllerCompat(window, window.decorView)
+
+ // Update navigation bar visibility and apply systemBarsBehavior if hiding
+ updateBarVisibility(
+ inset,
+ WindowInsetsCompat.Type.navigationBars(),
+ hideNavigationBarOnFullScreenMode,
+ initialNavigationBarIsVisible,
+ systemBarsBehavior
+ )
+
+ // Update notification bar visibility (no need for systemBarsBehavior here)
+ updateBarVisibility(
+ inset,
+ WindowInsetsCompat.Type.statusBars(),
+ hideNotificationBarOnFullScreenMode,
+ initialNotificationBarIsVisible
+ )
+ }
+
+ private fun updateNavigationBarVisibility() {
+ window?.let {
+ updateNavigationBarVisibility(
+ it,
+ controlsConfig.hideNavigationBarOnFullScreenMode,
+ controlsConfig.hideNotificationBarOnFullScreenMode,
+ WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
+ )
+ }
+ if (controlsConfig.hideNotificationBarOnFullScreenMode) {
+ val liveContainer = playerControlView?.findViewById(com.brentvatne.react.R.id.exo_live_container)
+ liveContainer?.let {
+ val layoutParams = it.layoutParams as LinearLayout.LayoutParams
+ layoutParams.topMargin = 40
+ it.layoutParams = layoutParams
+ }
+ }
+ }
}
diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
index 4841d5c0..8fefa34c 100644
--- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
+++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java
@@ -7,10 +7,10 @@ import static androidx.media3.common.C.CONTENT_TYPE_RTSP;
import static androidx.media3.common.C.CONTENT_TYPE_SS;
import static androidx.media3.common.C.TIME_END_OF_SOURCE;
-
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
+import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
@@ -24,7 +24,6 @@ import android.os.Looper;
import android.os.Message;
import android.text.TextUtils;
import android.view.View;
-import android.view.Window;
import android.view.accessibility.CaptioningManager;
import android.widget.FrameLayout;
import android.widget.ImageButton;
@@ -33,10 +32,8 @@ import android.widget.TextView;
import androidx.activity.OnBackPressedCallback;
import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
-import androidx.core.view.WindowCompat;
-import androidx.core.view.WindowInsetsCompat;
-import androidx.core.view.WindowInsetsControllerCompat;
import androidx.media3.common.AudioAttributes;
import androidx.media3.common.C;
import androidx.media3.common.Format;
@@ -96,6 +93,7 @@ import androidx.media3.exoplayer.trackselection.MappingTrackSelector;
import androidx.media3.exoplayer.trackselection.TrackSelection;
import androidx.media3.exoplayer.trackselection.TrackSelectionArray;
import androidx.media3.exoplayer.upstream.BandwidthMeter;
+import androidx.media3.exoplayer.upstream.CmcdConfiguration;
import androidx.media3.exoplayer.upstream.DefaultAllocator;
import androidx.media3.exoplayer.upstream.DefaultBandwidthMeter;
import androidx.media3.exoplayer.util.EventLogger;
@@ -103,16 +101,15 @@ import androidx.media3.extractor.metadata.emsg.EventMessage;
import androidx.media3.extractor.metadata.id3.Id3Frame;
import androidx.media3.extractor.metadata.id3.TextInformationFrame;
import androidx.media3.session.MediaSessionService;
-import androidx.media3.ui.DefaultTimeBar;
import androidx.media3.ui.LegacyPlayerControlView;
+import com.brentvatne.common.api.AdsProps;
import com.brentvatne.common.api.BufferConfig;
import com.brentvatne.common.api.BufferingStrategy;
import com.brentvatne.common.api.ControlsConfig;
import com.brentvatne.common.api.DRMProps;
import com.brentvatne.common.api.ResizeMode;
import com.brentvatne.common.api.SideLoadedTextTrack;
-import com.brentvatne.common.api.SideLoadedTextTrackList;
import com.brentvatne.common.api.Source;
import com.brentvatne.common.api.SubtitleStyle;
import com.brentvatne.common.api.TimedMetadata;
@@ -120,6 +117,7 @@ import com.brentvatne.common.api.Track;
import com.brentvatne.common.api.VideoTrack;
import com.brentvatne.common.react.VideoEventEmitter;
import com.brentvatne.common.toolbox.DebugLog;
+import com.brentvatne.common.toolbox.ReactBridgeUtils;
import com.brentvatne.react.BuildConfig;
import com.brentvatne.react.R;
import com.brentvatne.react.ReactNativeVideoManager;
@@ -130,16 +128,17 @@ import com.facebook.react.bridge.Promise;
import com.facebook.react.bridge.UiThreadUtil;
import com.facebook.react.uimanager.ThemedReactContext;
import com.google.ads.interactivemedia.v3.api.AdError;
-import com.google.ads.interactivemedia.v3.api.AdEvent;
import com.google.ads.interactivemedia.v3.api.AdErrorEvent;
+import com.google.ads.interactivemedia.v3.api.AdEvent;
+import com.google.ads.interactivemedia.v3.api.ImaSdkFactory;
+import com.google.ads.interactivemedia.v3.api.ImaSdkSettings;
import com.google.common.collect.ImmutableList;
import java.net.CookieHandler;
import java.net.CookieManager;
import java.net.CookiePolicy;
-import java.lang.Math;
-import java.util.List;
import java.util.ArrayList;
+import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
@@ -188,8 +187,6 @@ public class ReactExoplayerView extends FrameLayout implements
private ExoPlayer player;
private DefaultTrackSelector trackSelector;
private boolean playerNeedsSource;
- private MediaMetadata customMetadata;
-
private ServiceConnection playbackServiceConnection;
private PlaybackServiceBinder playbackServiceBinder;
@@ -235,20 +232,17 @@ public class ReactExoplayerView extends FrameLayout implements
private String audioTrackValue;
private String videoTrackType;
private String videoTrackValue;
- private String textTrackType;
+ private String textTrackType = "disabled";
private String textTrackValue;
- private SideLoadedTextTrackList textTracks;
private boolean disableFocus;
private boolean focusable = true;
private BufferingStrategy.BufferingStrategyEnum bufferingStrategy;
- private long contentStartTime = -1L;
private boolean disableDisconnectError;
private boolean preventsDisplaySleepDuringVideoPlayback = true;
private float mProgressUpdateInterval = 250.0f;
private boolean playInBackground = false;
private boolean mReportBandwidth = false;
private boolean controls;
- private Uri adTagUrl;
private boolean showNotificationControls = false;
// \ End props
@@ -265,8 +259,15 @@ public class ReactExoplayerView extends FrameLayout implements
private long lastDuration = -1;
private boolean viewHasDropped = false;
+ private int selectedSpeedIndex = 1; // Default is 1.0x
- private String instanceId = String.valueOf(UUID.randomUUID());
+ private final String instanceId = String.valueOf(UUID.randomUUID());
+
+ private CmcdConfiguration.Factory cmcdConfigurationFactory;
+
+ public void setCmcdConfigurationFactory(CmcdConfiguration.Factory factory) {
+ this.cmcdConfigurationFactory = factory;
+ }
private void updateProgress() {
if (player != null) {
@@ -385,12 +386,13 @@ public class ReactExoplayerView extends FrameLayout implements
public void onBandwidthSample(int elapsedMs, long bytes, long bitrate) {
if (mReportBandwidth) {
if (player == null) {
- eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, 0, 0, "-1");
+ eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, 0, 0, null);
} else {
Format videoFormat = player.getVideoFormat();
- int width = videoFormat != null ? videoFormat.width : 0;
- int height = videoFormat != null ? videoFormat.height : 0;
- String trackId = videoFormat != null ? videoFormat.id : "-1";
+ boolean isRotatedContent = videoFormat != null && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270);
+ int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0;
+ int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0;
+ String trackId = videoFormat != null ? videoFormat.id : null;
eventEmitter.onVideoBandwidthUpdate.invoke(bitrate, height, width, trackId);
}
}
@@ -425,15 +427,6 @@ public class ReactExoplayerView extends FrameLayout implements
});
}
- if (fullScreenPlayerView == null) {
- fullScreenPlayerView = new FullScreenPlayerView(getContext(), exoPlayerView, this, playerControlView, new OnBackPressedCallback(true) {
- @Override
- public void handleOnBackPressed() {
- setFullscreen(false);
- }
- });
- }
-
// Setting the player for the playerControlView
playerControlView.setPlayer(player);
playPauseControlContainer = playerControlView.findViewById(R.id.exo_play_pause_container);
@@ -447,6 +440,7 @@ public class ReactExoplayerView extends FrameLayout implements
//Handling the playButton click event
ImageButton playButton = playerControlView.findViewById(R.id.exo_play);
+
playButton.setOnClickListener((View v) -> {
if (player != null && player.getPlaybackState() == Player.STATE_ENDED) {
player.seekTo(0);
@@ -471,11 +465,15 @@ public class ReactExoplayerView extends FrameLayout implements
setPausedModifier(true)
);
+ //Handling the settingButton click event
+ final ImageButton settingButton = playerControlView.findViewById(R.id.exo_settings);
+ settingButton.setOnClickListener(v -> openSettings());
+
//Handling the fullScreenButton click event
final ImageButton fullScreenButton = playerControlView.findViewById(R.id.exo_fullscreen);
fullScreenButton.setOnClickListener(v -> setFullscreen(!isFullscreen));
updateFullScreenButtonVisibility();
- refreshProgressBarVisibility();
+ refreshControlsStyles();
// Invoking onPlaybackStateChanged and onPlayWhenReadyChanged events for Player
eventListener = new Player.Listener() {
@@ -489,6 +487,7 @@ public class ReactExoplayerView extends FrameLayout implements
if (pauseButton != null && pauseButton.getVisibility() == GONE) {
pauseButton.setVisibility(INVISIBLE);
}
+
reLayout(playPauseControlContainer);
//Remove this eventListener once its executed. since UI will work fine once after the reLayout is done
player.removeListener(eventListener);
@@ -503,6 +502,35 @@ public class ReactExoplayerView extends FrameLayout implements
};
player.addListener(eventListener);
}
+ private void openSettings() {
+ AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext);
+ builder.setTitle(R.string.settings);
+ String[] settingsOptions = {themedReactContext.getString(R.string.playback_speed)};
+ builder.setItems(settingsOptions, (dialog, which) -> {
+ if (which == 0) {
+ showPlaybackSpeedOptions();
+ }
+ });
+ builder.show();
+ }
+
+ private void showPlaybackSpeedOptions() {
+ String[] speedOptions = {"0.5x", "1.0x", "1.5x", "2.0x"};
+ AlertDialog.Builder builder = new AlertDialog.Builder(themedReactContext);
+ builder.setTitle(R.string.select_playback_speed);
+
+ builder.setSingleChoiceItems(speedOptions, selectedSpeedIndex, (dialog, which) -> {
+ selectedSpeedIndex = which;
+ float speed = switch (which) {
+ case 0 -> 0.5f;
+ case 2 -> 1.5f;
+ case 3 -> 2.0f;
+ default -> 1.0f;
+ };
+ setRateModifier(speed);
+ });
+ builder.show();
+ }
/**
* Adding Player control to the frame layout
@@ -534,40 +562,89 @@ public class ReactExoplayerView extends FrameLayout implements
view.layout(view.getLeft(), view.getTop(), view.getMeasuredWidth(), view.getMeasuredHeight());
}
- private void refreshProgressBarVisibility (){
- if(playerControlView == null) return;
- DefaultTimeBar exoProgress;
- TextView exoDuration;
- TextView exoPosition;
- exoProgress = playerControlView.findViewById(R.id.exo_progress);
- exoDuration = playerControlView.findViewById(R.id.exo_duration);
- exoPosition = playerControlView.findViewById(R.id.exo_position);
- if(controlsConfig.getHideSeekBar()){
- LinearLayout.LayoutParams param = new LinearLayout.LayoutParams(
- LayoutParams.MATCH_PARENT,
- LayoutParams.MATCH_PARENT,
- 1.0f
- );
- exoProgress.setVisibility(GONE);
- exoDuration.setVisibility(GONE);
- exoPosition.setLayoutParams(param);
- }else{
- exoProgress.setVisibility(VISIBLE);
- exoDuration.setVisibility(VISIBLE);
- // Reset the layout parameters of exoPosition to their default state
- LinearLayout.LayoutParams defaultParam = new LinearLayout.LayoutParams(
- LayoutParams.WRAP_CONTENT,
- LayoutParams.WRAP_CONTENT
- );
- exoPosition.setLayoutParams(defaultParam);
+ private void refreshControlsStyles() {
+ if (playerControlView == null || player == null || !controls) return;
+ updateLiveContent();
+ updatePlayPauseButtons();
+ updateButtonVisibility(controlsConfig.getHideForward(), R.id.exo_ffwd);
+ updateButtonVisibility(controlsConfig.getHideRewind(), R.id.exo_rew);
+ updateButtonVisibility(controlsConfig.getHideNext(), R.id.exo_next);
+ updateButtonVisibility(controlsConfig.getHidePrevious(), R.id.exo_prev);
+ updateViewVisibility(playerControlView.findViewById(R.id.exo_fullscreen), controlsConfig.getHideFullscreen(), GONE);
+ updateViewVisibility(playerControlView.findViewById(R.id.exo_position), controlsConfig.getHidePosition(), GONE);
+ updateViewVisibility(playerControlView.findViewById(R.id.exo_progress), controlsConfig.getHideSeekBar(), INVISIBLE);
+ updateViewVisibility(playerControlView.findViewById(R.id.exo_duration), controlsConfig.getHideDuration(), GONE);
+ updateViewVisibility(playerControlView.findViewById(R.id.exo_settings), controlsConfig.getHideSettingButton(), GONE );
+ }
+
+ private void updateLiveContent() {
+ LinearLayout exoLiveContainer = playerControlView.findViewById(R.id.exo_live_container);
+ TextView exoLiveLabel = playerControlView.findViewById(R.id.exo_live_label);
+
+ boolean isLive = false;
+ Timeline timeline = player.getCurrentTimeline();
+
+ // Determine if the content is live
+ if (!timeline.isEmpty()) {
+ Timeline.Window window = new Timeline.Window();
+ timeline.getWindow(player.getCurrentMediaItemIndex(), window);
+ isLive = window.isLive();
+ }
+
+ if (isLive && controlsConfig.getLiveLabel() != null) {
+ exoLiveLabel.setText(controlsConfig.getLiveLabel());
+ exoLiveContainer.setVisibility(VISIBLE);
+ } else {
+ exoLiveContainer.setVisibility(GONE);
}
}
+ private void updatePlayPauseButtons() {
+ final ImageButton playButton = playerControlView.findViewById(R.id.exo_play);
+ final ImageButton pauseButton = playerControlView.findViewById(R.id.exo_pause);
+
+ if (controlsConfig.getHidePlayPause()) {
+ playPauseControlContainer.setAlpha(0);
+ playButton.setClickable(false);
+ pauseButton.setClickable(false);
+ } else {
+ playPauseControlContainer.setAlpha(1.0f);
+ playButton.setClickable(true);
+ pauseButton.setClickable(true);
+ }
+ }
+
+ private void updateButtonVisibility(boolean hide, int buttonID) {
+ ImageButton button = playerControlView.findViewById(buttonID);
+ if (hide) {
+ button.setImageAlpha(0);
+ button.setClickable(false);
+ } else {
+ button.setImageAlpha(255);
+ button.setClickable(true);
+ }
+ }
+
+ private void updateViewVisibility(View view, boolean hide, int hideVisibility) {
+ if (hide) {
+ view.setVisibility(hideVisibility);
+ } else if (view.getVisibility() == hideVisibility) {
+ view.setVisibility(VISIBLE);
+ }
+ }
+
+
+
private void reLayoutControls() {
reLayout(exoPlayerView);
reLayout(playerControlView);
}
+ /// returns true is adaptive bitrate shall be used
+ public boolean isUsingVideoABR() {
+ return videoTrackType == null || "auto".equals(videoTrackType);
+ }
+
public void setDebug(boolean enableDebug) {
this.enableDebug = enableDebug;
refreshDebugState();
@@ -659,22 +736,28 @@ public class ReactExoplayerView extends FrameLayout implements
ReactExoplayerView self = this;
Activity activity = themedReactContext.getCurrentActivity();
// This ensures all props have been settled, to avoid async racing conditions.
+ Source runningSource = source;
mainRunnable = () -> {
- if (viewHasDropped) {
+ if (viewHasDropped && runningSource == source) {
return;
}
try {
+ if (runningSource.getUri() == null) {
+ return;
+ }
if (player == null) {
// Initialize core configuration and listeners
initializePlayerCore(self);
}
- if (playerNeedsSource && source.getUri() != null) {
+ if (playerNeedsSource) {
+ // Will force display of shutter view if needed
+ exoPlayerView.updateShutterViewVisibility();
exoPlayerView.invalidateAspectRatio();
// DRM session manager creation must be done on a different thread to prevent crashes so we start a new thread
ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(() -> {
// DRM initialization must run on a different thread
- if (viewHasDropped) {
+ if (viewHasDropped && runningSource == source) {
return;
}
if (activity == null) {
@@ -685,12 +768,12 @@ public class ReactExoplayerView extends FrameLayout implements
// Initialize handler to run on the main thread
activity.runOnUiThread(() -> {
- if (viewHasDropped) {
+ if (viewHasDropped && runningSource == source) {
return;
}
try {
// Source initialization must run on the main thread
- initializePlayerSource();
+ initializePlayerSource(runningSource);
} catch (Exception ex) {
self.playerNeedsSource = true;
DebugLog.e(TAG, "Failed to initialize Player! 1");
@@ -700,8 +783,8 @@ public class ReactExoplayerView extends FrameLayout implements
}
});
});
- } else if (source.getUri() != null) {
- initializePlayerSource();
+ } else if (runningSource == source) {
+ initializePlayerSource(runningSource);
}
} catch (Exception ex) {
self.playerNeedsSource = true;
@@ -716,7 +799,7 @@ public class ReactExoplayerView extends FrameLayout implements
public void getCurrentPosition(Promise promise) {
if (player != null) {
- double currentPosition = player.getCurrentPosition() / 1000;
+ float currentPosition = player.getCurrentPosition() / 1000.0f;
promise.resolve(currentPosition);
} else {
promise.reject("PLAYER_NOT_AVAILABLE", "Player is not initialized.");
@@ -740,21 +823,30 @@ public class ReactExoplayerView extends FrameLayout implements
.setEnableDecoderFallback(true)
.forceEnableMediaCodecAsynchronousQueueing();
- // Create an AdsLoader.
- adsLoader = new ImaAdsLoader
- .Builder(themedReactContext)
- .setAdEventListener(this)
- .setAdErrorListener(this)
- .build();
DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(mediaDataSourceFactory);
if (useCache) {
mediaSourceFactory.setDataSourceFactory(RNVSimpleCache.INSTANCE.getCacheFactory(buildHttpDataSourceFactory(true)));
}
- if (adsLoader != null) {
- mediaSourceFactory.setLocalAdInsertionComponents(unusedAdTagUri -> adsLoader, exoPlayerView);
+ if (BuildConfig.USE_EXOPLAYER_IMA) {
+ AdsProps adProps = source.getAdsProps();
+
+ // Create an AdsLoader.
+ ImaAdsLoader.Builder imaLoaderBuilder = new ImaAdsLoader
+ .Builder(themedReactContext)
+ .setAdEventListener(this)
+ .setAdErrorListener(this);
+
+ if (adProps != null && adProps.getAdLanguage() != null) {
+ ImaSdkSettings imaSdkSettings = ImaSdkFactory.getInstance().createImaSdkSettings();
+ imaSdkSettings.setLanguage(adProps.getAdLanguage());
+ imaLoaderBuilder.setImaSdkSettings(imaSdkSettings);
+ }
+ adsLoader = imaLoaderBuilder.build();
}
+ mediaSourceFactory.setLocalAdInsertionComponents(unusedAdTagUri -> adsLoader, exoPlayerView);
+
player = new ExoPlayer.Builder(getContext(), renderersFactory)
.setTrackSelector(self.trackSelector)
.setBandwidthMeter(bandwidthMeter)
@@ -766,6 +858,7 @@ public class ReactExoplayerView extends FrameLayout implements
player.addListener(self);
player.setVolume(muted ? 0.f : audioVolume * 1);
exoPlayerView.setPlayer(player);
+
if (adsLoader != null) {
adsLoader.setPlayer(player);
}
@@ -804,49 +897,45 @@ public class ReactExoplayerView extends FrameLayout implements
return drmSessionManager;
}
- private void initializePlayerSource() {
- if (source.getUri() == null) {
+ private void initializePlayerSource(Source runningSource) {
+ if (runningSource.getUri() == null) {
return;
}
/// init DRM
DrmSessionManager drmSessionManager = initializePlayerDrm();
- if (drmSessionManager == null && source.getDrmProps() != null && source.getDrmProps().getDrmType() != null) {
+ if (drmSessionManager == null && runningSource.getDrmProps() != null && runningSource.getDrmProps().getDrmType() != null) {
// Failed to initialize DRM session manager - cannot continue
DebugLog.e(TAG, "Failed to initialize DRM Session Manager Framework!");
return;
}
// init source to manage ads and external text tracks
- ArrayList mediaSourceList = buildTextSources();
- MediaSource videoSource = buildMediaSource(source.getUri(), source.getExtension(), drmSessionManager, source.getCropStartMs(), source.getCropEndMs());
+ MediaSource subtitlesSource = buildTextSource();
+ MediaSource videoSource = buildMediaSource(runningSource.getUri(), runningSource.getExtension(), drmSessionManager, runningSource.getCropStartMs(), runningSource.getCropEndMs());
MediaSource mediaSourceWithAds = null;
+ Uri adTagUrl = null;
+ if (source.getAdsProps() != null) {
+ adTagUrl = source.getAdsProps().getAdTagUrl();
+ }
if (adTagUrl != null && adsLoader != null) {
DefaultMediaSourceFactory mediaSourceFactory = new DefaultMediaSourceFactory(mediaDataSourceFactory)
.setLocalAdInsertionComponents(unusedAdTagUri -> adsLoader, exoPlayerView);
DataSpec adTagDataSpec = new DataSpec(adTagUrl);
- mediaSourceWithAds = new AdsMediaSource(videoSource, adTagDataSpec, ImmutableList.of(source.getUri(), adTagUrl), mediaSourceFactory, adsLoader, exoPlayerView);
- } else {
- if (adTagUrl == null && adsLoader != null) {
- adsLoader.release();
- adsLoader = null;
- }
+ DebugLog.w(TAG, "ads " + adTagUrl);
+ mediaSourceWithAds = new AdsMediaSource(videoSource, adTagDataSpec, ImmutableList.of(runningSource.getUri(), adTagUrl), mediaSourceFactory, adsLoader, exoPlayerView);
+ exoPlayerView.showAds();
}
MediaSource mediaSource;
- if (mediaSourceList.isEmpty()) {
- if (mediaSourceWithAds != null) {
- mediaSource = mediaSourceWithAds;
- } else {
- mediaSource = videoSource;
- }
+ if (subtitlesSource == null) {
+ mediaSource = Objects.requireNonNullElse(mediaSourceWithAds, videoSource);
} else {
- if (mediaSourceWithAds != null) {
- mediaSourceList.add(0, mediaSourceWithAds);
- } else {
- mediaSourceList.add(0, videoSource);
- }
- MediaSource[] textSourceArray = mediaSourceList.toArray(
+ ArrayList mediaSourceList = new ArrayList<>();
+ mediaSourceList.add(subtitlesSource);
+ mediaSourceList.add(0, Objects.requireNonNullElse(mediaSourceWithAds, videoSource));
+ MediaSource[] mediaSourceArray = mediaSourceList.toArray(
new MediaSource[mediaSourceList.size()]
);
- mediaSource = new MergingMediaSource(textSourceArray);
+
+ mediaSource = new MergingMediaSource(mediaSourceArray);
}
// wait for player to be set
@@ -863,8 +952,8 @@ public class ReactExoplayerView extends FrameLayout implements
if (haveResumePosition) {
player.seekTo(resumeWindow, resumePosition);
player.setMediaSource(mediaSource, false);
- } else if (source.getStartPositionMs() > 0) {
- player.setMediaSource(mediaSource, source.getStartPositionMs());
+ } else if (runningSource.getStartPositionMs() > 0) {
+ player.setMediaSource(mediaSource, runningSource.getStartPositionMs());
} else {
player.setMediaSource(mediaSource, true);
}
@@ -897,17 +986,25 @@ public class ReactExoplayerView extends FrameLayout implements
playbackServiceBinder = (PlaybackServiceBinder) service;
try {
- playbackServiceBinder.getService().registerPlayer(player,
- Objects.requireNonNull((Class) (themedReactContext.getCurrentActivity()).getClass()));
+ Activity currentActivity = themedReactContext.getCurrentActivity();
+ if (currentActivity != null) {
+ playbackServiceBinder.getService().registerPlayer(player,
+ (Class) currentActivity.getClass());
+ } else {
+ // Handle the case where currentActivity is null
+ DebugLog.w(TAG, "Could not register ExoPlayer: currentActivity is null");
+ }
} catch (Exception e) {
- DebugLog.e(TAG, "Cloud not register ExoPlayer");
+ DebugLog.e(TAG, "Could not register ExoPlayer: " + e.getMessage());
}
}
@Override
public void onServiceDisconnected(ComponentName name) {
try {
- playbackServiceBinder.getService().unregisterPlayer(player);
+ if (playbackServiceBinder != null) {
+ playbackServiceBinder.getService().unregisterPlayer(player);
+ }
} catch (Exception ignored) {}
playbackServiceBinder = null;
@@ -915,14 +1012,18 @@ public class ReactExoplayerView extends FrameLayout implements
@Override
public void onNullBinding(ComponentName name) {
- DebugLog.e(TAG, "Cloud not register ExoPlayer");
+ DebugLog.e(TAG, "Could not register ExoPlayer");
}
};
Intent intent = new Intent(themedReactContext, VideoPlaybackService.class);
intent.setAction(MediaSessionService.SERVICE_INTERFACE);
- themedReactContext.startService(intent);
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ themedReactContext.startForegroundService(intent);
+ } else {
+ themedReactContext.startService(intent);
+ }
int flags;
if (Build.VERSION.SDK_INT >= 29) {
@@ -1007,15 +1108,17 @@ public class ReactExoplayerView extends FrameLayout implements
.setUri(uri);
// refresh custom Metadata
- customMetadata = ConfigurationUtils.buildCustomMetadata(source.getMetadata());
+ MediaMetadata customMetadata = ConfigurationUtils.buildCustomMetadata(source.getMetadata());
if (customMetadata != null) {
mediaItemBuilder.setMediaMetadata(customMetadata);
}
-
- if (adTagUrl != null) {
- mediaItemBuilder.setAdsConfiguration(
- new MediaItem.AdsConfiguration.Builder(adTagUrl).build()
- );
+ if (source.getAdsProps() != null) {
+ Uri adTagUrl = source.getAdsProps().getAdTagUrl();
+ if (adTagUrl != null) {
+ mediaItemBuilder.setAdsConfiguration(
+ new MediaItem.AdsConfiguration.Builder(adTagUrl).build()
+ );
+ }
}
MediaItem.LiveConfiguration.Builder liveConfiguration = ConfigurationUtils.getLiveConfiguration(bufferConfig);
@@ -1096,6 +1199,12 @@ public class ReactExoplayerView extends FrameLayout implements
}
}
+ if (cmcdConfigurationFactory != null) {
+ mediaSourceFactory = mediaSourceFactory.setCmcdConfigurationFactory(
+ cmcdConfigurationFactory::createCmcdConfiguration
+ );
+ }
+
MediaItem mediaItem = mediaItemBuilder.setStreamKeys(streamKeys).build();
MediaSource mediaSource = mediaSourceFactory
.setDrmSessionManagerProvider(drmProvider)
@@ -1115,40 +1224,34 @@ public class ReactExoplayerView extends FrameLayout implements
return mediaSource;
}
- private ArrayList buildTextSources() {
- ArrayList textSources = new ArrayList<>();
- if (textTracks == null) {
- return textSources;
+ @Nullable
+ private MediaSource buildTextSource() {
+ if (source.getSideLoadedTextTracks() == null) {
+ return null;
}
- for (SideLoadedTextTrack track : textTracks.getTracks()) {
- MediaSource textSource = buildTextSource(track.getTitle(),
- track.getUri(),
- track.getType(),
- track.getLanguage());
- textSources.add(textSource);
- }
- return textSources;
- }
+ List subtitleConfigurations = new ArrayList<>();
- private MediaSource buildTextSource(String title, Uri uri, String mimeType, String language) {
- MediaItem.SubtitleConfiguration subtitleConfiguration = new MediaItem.SubtitleConfiguration.Builder(uri)
- .setMimeType(mimeType)
- .setLanguage(language)
+ for (SideLoadedTextTrack track : source.getSideLoadedTextTracks().getTracks()) {
+ MediaItem.SubtitleConfiguration subtitleConfiguration = new MediaItem.SubtitleConfiguration.Builder(track.getUri())
+ .setMimeType(track.getType())
+ .setLanguage(track.getLanguage())
.setSelectionFlags(C.SELECTION_FLAG_DEFAULT)
.setRoleFlags(C.ROLE_FLAG_SUBTITLE)
- .setLabel(title)
+ .setLabel(track.getTitle())
.build();
- return new SingleSampleMediaSource.Factory(mediaDataSourceFactory)
- .createMediaSource(subtitleConfiguration, C.TIME_UNSET);
+ subtitleConfigurations.add(subtitleConfiguration);
+ }
+
+ MediaItem subtitlesMediaItem = new MediaItem.Builder()
+ .setUri(source.getUri())
+ .setSubtitleConfigurations(subtitleConfigurations).build();
+
+ return new DefaultMediaSourceFactory(mediaDataSourceFactory).createMediaSource(subtitlesMediaItem);
}
private void releasePlayer() {
if (player != null) {
- if (adsLoader != null) {
- adsLoader.setPlayer(null);
- }
-
if(playbackServiceBinder != null) {
playbackServiceBinder.getService().unregisterPlayer(player);
themedReactContext.unbindService(playbackServiceConnection);
@@ -1165,8 +1268,8 @@ public class ReactExoplayerView extends FrameLayout implements
if (adsLoader != null) {
adsLoader.release();
+ adsLoader = null;
}
- adsLoader = null;
progressHandler.removeMessages(SHOW_PROGRESS);
audioBecomingNoisyReceiver.removeListener();
bandwidthMeter.removeEventListener(this);
@@ -1252,10 +1355,7 @@ public class ReactExoplayerView extends FrameLayout implements
player.setPlayWhenReady(true);
}
} else {
- // ensure playback is not ENDED, else it will trigger another ended event
- if (player.getPlaybackState() != Player.STATE_ENDED) {
- player.setPlayWhenReady(false);
- }
+ player.setPlayWhenReady(false);
}
}
@@ -1415,7 +1515,7 @@ public class ReactExoplayerView extends FrameLayout implements
boolean isRotatedContent = videoFormat != null && (videoFormat.rotationDegrees == 90 || videoFormat.rotationDegrees == 270);
int width = videoFormat != null ? (isRotatedContent ? videoFormat.height : videoFormat.width) : 0;
int height = videoFormat != null ? (isRotatedContent ? videoFormat.width : videoFormat.height) : 0;
- String trackId = videoFormat != null ? videoFormat.id : "-1";
+ String trackId = videoFormat != null ? videoFormat.id : null;
// Properties that must be accessed on the main thread
long duration = player.getDuration();
@@ -1423,7 +1523,7 @@ public class ReactExoplayerView extends FrameLayout implements
ArrayList audioTracks = getAudioTrackInfo();
ArrayList textTracks = getTextTrackInfo();
- if (this.contentStartTime != -1L) {
+ if (source.getContentStartTime() != -1) {
ExecutorService es = Executors.newSingleThreadExecutor();
es.execute(() -> {
// To prevent ANRs caused by getVideoTrackInfo we run this on a different thread and notify the player only when we're done
@@ -1442,6 +1542,7 @@ public class ReactExoplayerView extends FrameLayout implements
eventEmitter.onVideoLoad.invoke(duration, currentPosition, width, height,
audioTracks, textTracks, videoTracks, trackId);
+ refreshControlsStyles();
}
}
@@ -1526,7 +1627,7 @@ public class ReactExoplayerView extends FrameLayout implements
ExecutorService es = Executors.newSingleThreadExecutor();
final DataSource dataSource = this.mediaDataSourceFactory.createDataSource();
final Uri sourceUri = source.getUri();
- final long startTime = this.contentStartTime * 1000 - 100; // s -> ms with 100ms offset
+ final long startTime = source.getContentStartTime() * 1000 - 100; // s -> ms with 100ms offset
Future> result = es.submit(new Callable() {
final DataSource ds = dataSource;
@@ -1590,7 +1691,7 @@ public class ReactExoplayerView extends FrameLayout implements
if (format.sampleMimeType != null) track.setMimeType(format.sampleMimeType);
if (format.language != null) track.setLanguage(format.language);
if (format.label != null) track.setTitle(format.label);
- track.setSelected(isTrackSelected(selection, group, 0));
+ track.setSelected(isTrackSelected(selection, group, trackIndex));
return track;
}
@@ -1691,7 +1792,7 @@ public class ReactExoplayerView extends FrameLayout implements
}
eventEmitter.onVideoPlaybackStateChanged.invoke(isPlaying, isSeeking);
-
+
if (isPlaying) {
isSeeking = false;
}
@@ -1724,7 +1825,10 @@ public class ReactExoplayerView extends FrameLayout implements
playerNeedsSource = true;
if (isBehindLiveWindow(e)) {
clearResumePosition();
- initializePlayer();
+ if (player != null) {
+ player.seekToDefaultPosition();
+ player.prepare();
+ }
} else {
updateResumePosition();
}
@@ -1793,22 +1897,32 @@ public class ReactExoplayerView extends FrameLayout implements
DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, bandwidthMeter,
source.getHeaders());
+ if (source.getCmcdProps() != null) {
+ CMCDConfig cmcdConfig = new CMCDConfig(source.getCmcdProps());
+ CmcdConfiguration.Factory factory = cmcdConfig.toCmcdConfigurationFactory();
+ this.setCmcdConfigurationFactory(factory);
+ } else {
+ this.setCmcdConfigurationFactory(null);
+ }
+
if (!isSourceEqual) {
reloadSource();
}
+ } else {
+ clearSrc();
}
}
-
public void clearSrc() {
if (source.getUri() != null) {
if (player != null) {
player.stop();
player.clearMediaItems();
}
- this.source = new Source();
- this.mediaDataSourceFactory = null;
- clearResumePosition();
}
+ exoPlayerView.hideAds();
+ this.source = new Source();
+ this.mediaDataSourceFactory = null;
+ clearResumePosition();
}
public void setProgressUpdateInterval(final float progressUpdateInterval) {
@@ -1819,15 +1933,6 @@ public class ReactExoplayerView extends FrameLayout implements
mReportBandwidth = reportBandwidth;
}
- public void setAdTagUrl(final Uri uri) {
- adTagUrl = uri;
- }
-
- public void setTextTracks(SideLoadedTextTrackList textTracks) {
- this.textTracks = textTracks;
- reloadSource(); // FIXME Shall be moved inside source
- }
-
private void reloadSource() {
playerNeedsSource = true;
initializePlayer();
@@ -1901,70 +2006,73 @@ public class ReactExoplayerView extends FrameLayout implements
} else if ("title".equals(type)) {
for (int i = 0; i < groups.length; ++i) {
Format format = groups.get(i).getFormat(0);
- if (format.id != null && format.id.equals(value)) {
+ if (format.label != null && format.label.equals(value)) {
groupIndex = i;
break;
}
}
} else if ("index".equals(type)) {
- int iValue = Integer.parseInt(value);
-
- if (trackType == C.TRACK_TYPE_VIDEO && groups.length == 1) {
- groupIndex = 0;
- if (iValue < groups.get(groupIndex).length) {
- tracks.set(0, iValue);
+ int iValue = ReactBridgeUtils.safeParseInt(value, -1);
+ if (iValue != -1) {
+ if (trackType == C.TRACK_TYPE_VIDEO && groups.length == 1) {
+ groupIndex = 0;
+ if (iValue < groups.get(groupIndex).length) {
+ tracks.set(0, iValue);
+ }
+ } else if (iValue < groups.length) {
+ groupIndex = iValue;
}
- } else if (iValue < groups.length) {
- groupIndex = iValue;
}
} else if ("resolution".equals(type)) {
- int height = Integer.parseInt(value);
- for (int i = 0; i < groups.length; ++i) { // Search for the exact height
- TrackGroup group = groups.get(i);
- Format closestFormat = null;
- int closestTrackIndex = -1;
- boolean usingExactMatch = false;
- for (int j = 0; j < group.length; j++) {
- Format format = group.getFormat(j);
- if (format.height == height) {
- groupIndex = i;
- tracks.set(0, j);
- closestFormat = null;
- closestTrackIndex = -1;
- usingExactMatch = true;
- break;
- } else if (isUsingContentResolution) {
- // When using content resolution rather than ads, we need to try and find the closest match if there is no exact match
- if (closestFormat != null) {
- if ((format.bitrate > closestFormat.bitrate || format.height > closestFormat.height) && format.height < height) {
- // Higher quality match
+ int height = ReactBridgeUtils.safeParseInt(value, -1);
+ if (height != -1) {
+ for (int i = 0; i < groups.length; ++i) { // Search for the exact height
+ TrackGroup group = groups.get(i);
+ Format closestFormat = null;
+ int closestTrackIndex = -1;
+ boolean usingExactMatch = false;
+ for (int j = 0; j < group.length; j++) {
+ Format format = group.getFormat(j);
+ if (format.height == height) {
+ groupIndex = i;
+ tracks.set(0, j);
+ closestFormat = null;
+ closestTrackIndex = -1;
+ usingExactMatch = true;
+ break;
+ } else if (isUsingContentResolution) {
+ // When using content resolution rather than ads, we need to try and find the closest match if there is no exact match
+ if (closestFormat != null) {
+ if ((format.bitrate > closestFormat.bitrate || format.height > closestFormat.height) && format.height < height) {
+ // Higher quality match
+ closestFormat = format;
+ closestTrackIndex = j;
+ }
+ } else if (format.height < height) {
closestFormat = format;
closestTrackIndex = j;
}
- } else if(format.height < height) {
- closestFormat = format;
- closestTrackIndex = j;
}
}
- }
- // This is a fallback if the new period contains only higher resolutions than the user has selected
- if (closestFormat == null && isUsingContentResolution && !usingExactMatch) {
- // No close match found - so we pick the lowest quality
- int minHeight = Integer.MAX_VALUE;
- for (int j = 0; j < group.length; j++) {
- Format format = group.getFormat(j);
- if (format.height < minHeight) {
- minHeight = format.height;
- groupIndex = i;
- tracks.set(0, j);
+ // This is a fallback if the new period contains only higher resolutions than the user has selected
+ if (closestFormat == null && isUsingContentResolution && !usingExactMatch) {
+ // No close match found - so we pick the lowest quality
+ int minHeight = Integer.MAX_VALUE;
+ for (int j = 0; j < group.length; j++) {
+ Format format = group.getFormat(j);
+ if (format.height < minHeight) {
+ minHeight = format.height;
+ groupIndex = i;
+ tracks.set(0, j);
+ }
}
}
- }
- // Selecting the closest match found
- if (closestFormat != null && closestTrackIndex != -1) {
- // We found the closest match instead of an exact one
- groupIndex = i;
- tracks.set(0, closestTrackIndex);
+ // Selecting the closest match found
+ if (closestFormat != null && closestTrackIndex != -1) {
+ // We found the closest match instead of an exact one
+ groupIndex = i;
+ tracks.set(0, closestTrackIndex);
+ }
}
}
} else if (trackType == C.TRACK_TYPE_TEXT && Util.SDK_INT > 18) { // Text default
@@ -2016,16 +2124,21 @@ public class ReactExoplayerView extends FrameLayout implements
TrackSelectionOverride selectionOverride = new TrackSelectionOverride(groups.get(groupIndex), tracks);
- DefaultTrackSelector.Parameters selectionParameters = trackSelector.getParameters()
+ DefaultTrackSelector.Parameters.Builder selectionParameters = trackSelector.getParameters()
.buildUpon()
.setExceedAudioConstraintsIfNecessary(true)
.setExceedRendererCapabilitiesIfNecessary(true)
.setExceedVideoConstraintsIfNecessary(true)
.setRendererDisabled(rendererIndex, false)
- .clearOverridesOfType(selectionOverride.getType())
- .addOverride(selectionOverride)
- .build();
- trackSelector.setParameters(selectionParameters);
+ .clearOverridesOfType(selectionOverride.getType());
+
+ if (trackType == C.TRACK_TYPE_VIDEO && isUsingVideoABR()) {
+ selectionParameters.setMaxVideoBitrate(maxBitRate == 0 ? Integer.MAX_VALUE : maxBitRate);
+ } else {
+ selectionParameters.addOverride(selectionOverride);
+ }
+
+ trackSelector.setParameters(selectionParameters.build());
}
private boolean isFormatSupported(Format format) {
@@ -2156,7 +2269,8 @@ public class ReactExoplayerView extends FrameLayout implements
public void setMaxBitRateModifier(int newMaxBitRate) {
maxBitRate = newMaxBitRate;
- if (player != null) {
+ if (player != null && isUsingVideoABR()) {
+ // do not apply yet if not auto
trackSelector.setParameters(trackSelector.buildUponParameters()
.setMaxVideoBitrate(maxBitRate == 0 ? Integer.MAX_VALUE : maxBitRate));
}
@@ -2181,10 +2295,6 @@ public class ReactExoplayerView extends FrameLayout implements
exoPlayerView.setFocusable(this.focusable);
}
- public void setContentStartTime(int contentStartTime) {
- this.contentStartTime = contentStartTime;
- }
-
public void setShowNotificationControls(boolean showNotificationControls) {
this.showNotificationControls = showNotificationControls;
@@ -2230,17 +2340,18 @@ public class ReactExoplayerView extends FrameLayout implements
return;
}
- Window window = activity.getWindow();
- WindowInsetsControllerCompat controller = new WindowInsetsControllerCompat(window, window.getDecorView());
if (isFullscreen) {
+ fullScreenPlayerView = new FullScreenPlayerView(getContext(), exoPlayerView, this, playerControlView, new OnBackPressedCallback(true) {
+ @Override
+ public void handleOnBackPressed() {
+ setFullscreen(false);
+ }
+ }, controlsConfig);
eventEmitter.onVideoFullscreenPlayerWillPresent.invoke();
if (fullScreenPlayerView != null) {
fullScreenPlayerView.show();
}
UiThreadUtil.runOnUiThread(() -> {
- WindowCompat.setDecorFitsSystemWindows(window, false);
- controller.hide(WindowInsetsCompat.Type.systemBars());
- controller.setSystemBarsBehavior(WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE);
eventEmitter.onVideoFullscreenPlayerDidPresent.invoke();
});
} else {
@@ -2251,8 +2362,6 @@ public class ReactExoplayerView extends FrameLayout implements
setControls(controls);
}
UiThreadUtil.runOnUiThread(() -> {
- WindowCompat.setDecorFitsSystemWindows(window, true);
- controller.show(WindowInsetsCompat.Type.systemBars());
eventEmitter.onVideoFullscreenPlayerDidDismiss.invoke();
});
}
@@ -2326,6 +2435,7 @@ public class ReactExoplayerView extends FrameLayout implements
removeViewAt(indexOfPC);
}
}
+ refreshControlsStyles();
}
public void setSubtitleStyle(SubtitleStyle style) {
@@ -2358,6 +2468,6 @@ public class ReactExoplayerView extends FrameLayout implements
public void setControlsStyles(ControlsConfig controlsStyles) {
controlsConfig = controlsStyles;
- refreshProgressBarVisibility();
+ refreshControlsStyles();
}
}
diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java
deleted file mode 100644
index e9ae70bc..00000000
--- a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java
+++ /dev/null
@@ -1,346 +0,0 @@
-package com.brentvatne.exoplayer;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.net.Uri;
-import android.text.TextUtils;
-import android.util.Log;
-
-import androidx.annotation.NonNull;
-
-import com.brentvatne.common.api.BufferConfig;
-import com.brentvatne.common.api.BufferingStrategy;
-import com.brentvatne.common.api.ControlsConfig;
-import com.brentvatne.common.api.DRMProps;
-import com.brentvatne.common.api.ResizeMode;
-import com.brentvatne.common.api.SideLoadedTextTrackList;
-import com.brentvatne.common.api.Source;
-import com.brentvatne.common.api.SubtitleStyle;
-import com.brentvatne.common.api.ViewType;
-import com.brentvatne.common.react.EventTypes;
-import com.brentvatne.common.toolbox.DebugLog;
-import com.brentvatne.common.toolbox.ReactBridgeUtils;
-import com.brentvatne.react.ReactNativeVideoManager;
-import com.facebook.react.bridge.ReadableArray;
-import com.facebook.react.bridge.ReadableMap;
-import com.facebook.react.uimanager.ThemedReactContext;
-import com.facebook.react.uimanager.ViewGroupManager;
-import com.facebook.react.uimanager.annotations.ReactProp;
-
-import java.util.Map;
-
-import javax.annotation.Nullable;
-
-public class ReactExoplayerViewManager extends ViewGroupManager {
-
- private static final String TAG = "ExoViewManager";
- private static final String REACT_CLASS = "RCTVideo";
- private static final String PROP_SRC = "src";
- private static final String PROP_AD_TAG_URL = "adTagUrl";
- private static final String PROP_RESIZE_MODE = "resizeMode";
- private static final String PROP_REPEAT = "repeat";
- private static final String PROP_SELECTED_AUDIO_TRACK = "selectedAudioTrack";
- private static final String PROP_SELECTED_AUDIO_TRACK_TYPE = "type";
- private static final String PROP_SELECTED_AUDIO_TRACK_VALUE = "value";
- private static final String PROP_SELECTED_TEXT_TRACK = "selectedTextTrack";
- private static final String PROP_SELECTED_TEXT_TRACK_TYPE = "type";
- private static final String PROP_SELECTED_TEXT_TRACK_VALUE = "value";
- private static final String PROP_TEXT_TRACKS = "textTracks";
- private static final String PROP_PAUSED = "paused";
- private static final String PROP_MUTED = "muted";
- private static final String PROP_AUDIO_OUTPUT = "audioOutput";
- private static final String PROP_VOLUME = "volume";
- private static final String PROP_BUFFER_CONFIG = "bufferConfig";
- private static final String PROP_PREVENTS_DISPLAY_SLEEP_DURING_VIDEO_PLAYBACK = "preventsDisplaySleepDuringVideoPlayback";
- private static final String PROP_PROGRESS_UPDATE_INTERVAL = "progressUpdateInterval";
- private static final String PROP_REPORT_BANDWIDTH = "reportBandwidth";
- private static final String PROP_RATE = "rate";
- private static final String PROP_MIN_LOAD_RETRY_COUNT = "minLoadRetryCount";
- private static final String PROP_MAXIMUM_BIT_RATE = "maxBitRate";
- private static final String PROP_PLAY_IN_BACKGROUND = "playInBackground";
- private static final String PROP_CONTENT_START_TIME = "contentStartTime";
- private static final String PROP_DISABLE_FOCUS = "disableFocus";
- private static final String PROP_BUFFERING_STRATEGY = "bufferingStrategy";
- private static final String PROP_DISABLE_DISCONNECT_ERROR = "disableDisconnectError";
- private static final String PROP_FOCUSABLE = "focusable";
- private static final String PROP_FULLSCREEN = "fullscreen";
- private static final String PROP_VIEW_TYPE = "viewType";
- private static final String PROP_SELECTED_VIDEO_TRACK = "selectedVideoTrack";
- private static final String PROP_SELECTED_VIDEO_TRACK_TYPE = "type";
- private static final String PROP_SELECTED_VIDEO_TRACK_VALUE = "value";
- private static final String PROP_HIDE_SHUTTER_VIEW = "hideShutterView";
- private static final String PROP_CONTROLS = "controls";
- private static final String PROP_SUBTITLE_STYLE = "subtitleStyle";
- private static final String PROP_SHUTTER_COLOR = "shutterColor";
- private static final String PROP_SHOW_NOTIFICATION_CONTROLS = "showNotificationControls";
- private static final String PROP_DEBUG = "debug";
- private static final String PROP_CONTROLS_STYLES = "controlsStyles";
-
- private final ReactExoplayerConfig config;
-
- public ReactExoplayerViewManager(ReactExoplayerConfig config) {
- this.config = config;
- }
-
- @NonNull
- @Override
- public String getName() {
- return REACT_CLASS;
- }
-
- @NonNull
- @Override
- protected ReactExoplayerView createViewInstance(@NonNull ThemedReactContext themedReactContext) {
- ReactNativeVideoManager.Companion.getInstance().registerView(this);
- return new ReactExoplayerView(themedReactContext, config);
- }
-
- @Override
- public void onDropViewInstance(ReactExoplayerView view) {
- view.cleanUpResources();
- ReactNativeVideoManager.Companion.getInstance().unregisterView(this);
- }
-
- @Override
- public @Nullable Map getExportedCustomDirectEventTypeConstants() {
- return EventTypes.Companion.toMap();
- }
-
- @Override
- public void addEventEmitters(@NonNull ThemedReactContext reactContext, @NonNull ReactExoplayerView view) {
- super.addEventEmitters(reactContext, view);
- view.eventEmitter.addEventEmitters(reactContext, view);
- }
-
- @ReactProp(name = PROP_SRC)
- public void setSrc(final ReactExoplayerView videoView, @Nullable ReadableMap src) {
- Context context = videoView.getContext().getApplicationContext();
- Source source = Source.parse(src, context);
- if (source.getUri() == null) {
- videoView.clearSrc();
- } else {
- videoView.setSrc(source);
- }
- }
-
- @ReactProp(name = PROP_AD_TAG_URL)
- public void setAdTagUrl(final ReactExoplayerView videoView, final String uriString) {
- if (TextUtils.isEmpty(uriString)) {
- videoView.setAdTagUrl(null);
- return;
- }
-
- Uri adTagUrl = Uri.parse(uriString);
-
- videoView.setAdTagUrl(adTagUrl);
- }
-
- @ReactProp(name = PROP_RESIZE_MODE)
- public void setResizeMode(final ReactExoplayerView videoView, final String resizeMode) {
- switch (resizeMode) {
- case "none":
- case "contain":
- videoView.setResizeModeModifier(ResizeMode.RESIZE_MODE_FIT);
- break;
- case "cover":
- videoView.setResizeModeModifier(ResizeMode.RESIZE_MODE_CENTER_CROP);
- break;
- case "stretch":
- videoView.setResizeModeModifier(ResizeMode.RESIZE_MODE_FILL);
- break;
- default:
- DebugLog.w(TAG, "Unsupported resize mode: " + resizeMode + " - falling back to fit");
- videoView.setResizeModeModifier(ResizeMode.RESIZE_MODE_FIT);
- break;
- }
- }
-
- @ReactProp(name = PROP_REPEAT, defaultBoolean = false)
- public void setRepeat(final ReactExoplayerView videoView, final boolean repeat) {
- videoView.setRepeatModifier(repeat);
- }
-
- @ReactProp(name = PROP_PREVENTS_DISPLAY_SLEEP_DURING_VIDEO_PLAYBACK, defaultBoolean = false)
- public void setPreventsDisplaySleepDuringVideoPlayback(final ReactExoplayerView videoView, final boolean preventsSleep) {
- videoView.setPreventsDisplaySleepDuringVideoPlayback(preventsSleep);
- }
-
- @ReactProp(name = PROP_SELECTED_VIDEO_TRACK)
- public void setSelectedVideoTrack(final ReactExoplayerView videoView,
- @Nullable ReadableMap selectedVideoTrack) {
- String typeString = null;
- String value = null;
- if (selectedVideoTrack != null) {
- typeString = ReactBridgeUtils.safeGetString(selectedVideoTrack, PROP_SELECTED_VIDEO_TRACK_TYPE);
- value = ReactBridgeUtils.safeGetString(selectedVideoTrack, PROP_SELECTED_VIDEO_TRACK_VALUE);
- }
- videoView.setSelectedVideoTrack(typeString, value);
- }
-
- @ReactProp(name = PROP_SELECTED_AUDIO_TRACK)
- public void setSelectedAudioTrack(final ReactExoplayerView videoView,
- @Nullable ReadableMap selectedAudioTrack) {
- String typeString = null;
- String value = null;
- if (selectedAudioTrack != null) {
- typeString = ReactBridgeUtils.safeGetString(selectedAudioTrack, PROP_SELECTED_AUDIO_TRACK_TYPE);
- value = ReactBridgeUtils.safeGetString(selectedAudioTrack, PROP_SELECTED_AUDIO_TRACK_VALUE);
- }
- videoView.setSelectedAudioTrack(typeString, value);
- }
-
- @ReactProp(name = PROP_SELECTED_TEXT_TRACK)
- public void setSelectedTextTrack(final ReactExoplayerView videoView,
- @Nullable ReadableMap selectedTextTrack) {
- String typeString = null;
- String value = null;
- if (selectedTextTrack != null) {
- typeString = ReactBridgeUtils.safeGetString(selectedTextTrack, PROP_SELECTED_TEXT_TRACK_TYPE);
- value = ReactBridgeUtils.safeGetString(selectedTextTrack, PROP_SELECTED_TEXT_TRACK_VALUE);
- }
- videoView.setSelectedTextTrack(typeString, value);
- }
-
- @ReactProp(name = PROP_TEXT_TRACKS)
- public void setTextTracks(final ReactExoplayerView videoView,
- @Nullable ReadableArray textTracks) {
- SideLoadedTextTrackList sideLoadedTextTracks = SideLoadedTextTrackList.Companion.parse(textTracks);
- videoView.setTextTracks(sideLoadedTextTracks);
- }
-
- @ReactProp(name = PROP_PAUSED, defaultBoolean = false)
- public void setPaused(final ReactExoplayerView videoView, final boolean paused) {
- videoView.setPausedModifier(paused);
- }
-
- @ReactProp(name = PROP_MUTED, defaultBoolean = false)
- public void setMuted(final ReactExoplayerView videoView, final boolean muted) {
- videoView.setMutedModifier(muted);
- }
-
- @ReactProp(name = PROP_AUDIO_OUTPUT)
- public void setAudioOutput(final ReactExoplayerView videoView, final String audioOutput) {
- videoView.setAudioOutput(AudioOutput.get(audioOutput));
- }
-
- @ReactProp(name = PROP_VOLUME, defaultFloat = 1.0f)
- public void setVolume(final ReactExoplayerView videoView, final float volume) {
- videoView.setVolumeModifier(volume);
- }
-
- @ReactProp(name = PROP_PROGRESS_UPDATE_INTERVAL, defaultFloat = 250.0f)
- public void setProgressUpdateInterval(final ReactExoplayerView videoView, final float progressUpdateInterval) {
- videoView.setProgressUpdateInterval(progressUpdateInterval);
- }
-
- @ReactProp(name = PROP_REPORT_BANDWIDTH, defaultBoolean = false)
- public void setReportBandwidth(final ReactExoplayerView videoView, final boolean reportBandwidth) {
- videoView.setReportBandwidth(reportBandwidth);
- }
-
- @ReactProp(name = PROP_RATE)
- public void setRate(final ReactExoplayerView videoView, final float rate) {
- videoView.setRateModifier(rate);
- }
-
- @ReactProp(name = PROP_MAXIMUM_BIT_RATE)
- public void setMaxBitRate(final ReactExoplayerView videoView, final float maxBitRate) {
- videoView.setMaxBitRateModifier((int)maxBitRate);
- }
-
- @ReactProp(name = PROP_MIN_LOAD_RETRY_COUNT)
- public void setMinLoadRetryCount(final ReactExoplayerView videoView, final int minLoadRetryCount) {
- videoView.setMinLoadRetryCountModifier(minLoadRetryCount);
- }
-
- @ReactProp(name = PROP_PLAY_IN_BACKGROUND, defaultBoolean = false)
- public void setPlayInBackground(final ReactExoplayerView videoView, final boolean playInBackground) {
- videoView.setPlayInBackground(playInBackground);
- }
-
- @ReactProp(name = PROP_DISABLE_FOCUS, defaultBoolean = false)
- public void setDisableFocus(final ReactExoplayerView videoView, final boolean disableFocus) {
- videoView.setDisableFocus(disableFocus);
- }
-
- @ReactProp(name = PROP_FOCUSABLE, defaultBoolean = true)
- public void setFocusable(final ReactExoplayerView videoView, final boolean focusable) {
- videoView.setFocusable(focusable);
- }
-
- @ReactProp(name = PROP_CONTENT_START_TIME, defaultInt = -1)
- public void setContentStartTime(final ReactExoplayerView videoView, final int contentStartTime) {
- videoView.setContentStartTime(contentStartTime);
- }
-
- @ReactProp(name = PROP_BUFFERING_STRATEGY)
- public void setBufferingStrategy(final ReactExoplayerView videoView, final String bufferingStrategy) {
- BufferingStrategy.BufferingStrategyEnum strategy = BufferingStrategy.Companion.parse(bufferingStrategy);
- videoView.setBufferingStrategy(strategy);
- }
-
- @ReactProp(name = PROP_DISABLE_DISCONNECT_ERROR, defaultBoolean = false)
- public void setDisableDisconnectError(final ReactExoplayerView videoView, final boolean disableDisconnectError) {
- videoView.setDisableDisconnectError(disableDisconnectError);
- }
-
- @ReactProp(name = PROP_FULLSCREEN, defaultBoolean = false)
- public void setFullscreen(final ReactExoplayerView videoView, final boolean fullscreen) {
- videoView.setFullscreen(fullscreen);
- }
-
- @ReactProp(name = PROP_VIEW_TYPE, defaultInt = ViewType.VIEW_TYPE_SURFACE)
- public void setViewType(final ReactExoplayerView videoView, final int viewType) {
- videoView.setViewType(viewType);
- }
-
- @ReactProp(name = PROP_HIDE_SHUTTER_VIEW, defaultBoolean = false)
- public void setHideShutterView(final ReactExoplayerView videoView, final boolean hideShutterView) {
- videoView.setHideShutterView(hideShutterView);
- }
-
- @ReactProp(name = PROP_CONTROLS, defaultBoolean = false)
- public void setControls(final ReactExoplayerView videoView, final boolean controls) {
- videoView.setControls(controls);
- }
-
- @ReactProp(name = PROP_SUBTITLE_STYLE)
- public void setSubtitleStyle(final ReactExoplayerView videoView, @Nullable final ReadableMap src) {
- videoView.setSubtitleStyle(SubtitleStyle.parse(src));
- }
-
- @ReactProp(name = PROP_SHUTTER_COLOR, defaultInt = 0)
- public void setShutterColor(final ReactExoplayerView videoView, final int color) {
- videoView.setShutterColor(color == 0 ? Color.BLACK : color);
- }
-
- @ReactProp(name = PROP_BUFFER_CONFIG)
- public void setBufferConfig(final ReactExoplayerView videoView, @Nullable ReadableMap bufferConfig) {
- BufferConfig config = BufferConfig.parse(bufferConfig);
- videoView.setBufferConfig(config);
- }
-
- @ReactProp(name = PROP_SHOW_NOTIFICATION_CONTROLS)
- public void setShowNotificationControls(final ReactExoplayerView videoView, final boolean showNotificationControls) {
- videoView.setShowNotificationControls(showNotificationControls);
- }
-
- @ReactProp(name = PROP_DEBUG, defaultBoolean = false)
- public void setDebug(final ReactExoplayerView videoView,
- @Nullable final ReadableMap debugConfig) {
- boolean enableDebug = ReactBridgeUtils.safeGetBool(debugConfig, "enable", false);
- boolean enableThreadDebug = ReactBridgeUtils.safeGetBool(debugConfig, "thread", false);
- if (enableDebug) {
- DebugLog.setConfig(Log.VERBOSE, enableThreadDebug);
- } else {
- DebugLog.setConfig(Log.WARN, enableThreadDebug);
- }
- videoView.setDebug(enableDebug);
- }
-
- @ReactProp(name = PROP_CONTROLS_STYLES)
- public void setControlsStyles(final ReactExoplayerView videoView, @Nullable ReadableMap controlsStyles) {
- ControlsConfig controlsConfig = ControlsConfig.parse(controlsStyles);
- videoView.setControlsStyles(controlsConfig);
- }
-}
\ No newline at end of file
diff --git a/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.kt b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.kt
new file mode 100644
index 00000000..967da9ff
--- /dev/null
+++ b/android/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.kt
@@ -0,0 +1,279 @@
+package com.brentvatne.exoplayer
+
+import android.graphics.Color
+import android.util.Log
+import com.brentvatne.common.api.BufferConfig
+import com.brentvatne.common.api.BufferingStrategy
+import com.brentvatne.common.api.ControlsConfig
+import com.brentvatne.common.api.ResizeMode
+import com.brentvatne.common.api.Source
+import com.brentvatne.common.api.SubtitleStyle
+import com.brentvatne.common.api.ViewType
+import com.brentvatne.common.react.EventTypes
+import com.brentvatne.common.toolbox.DebugLog
+import com.brentvatne.common.toolbox.ReactBridgeUtils
+import com.brentvatne.react.ReactNativeVideoManager
+import com.facebook.react.bridge.ReadableMap
+import com.facebook.react.uimanager.ThemedReactContext
+import com.facebook.react.uimanager.ViewGroupManager
+import com.facebook.react.uimanager.annotations.ReactProp
+
+class ReactExoplayerViewManager(private val config: ReactExoplayerConfig) : ViewGroupManager() {
+
+ companion object {
+ private const val TAG = "ExoViewManager"
+ private const val REACT_CLASS = "RCTVideo"
+ private const val PROP_SRC = "src"
+ private const val PROP_RESIZE_MODE = "resizeMode"
+ private const val PROP_REPEAT = "repeat"
+ private const val PROP_SELECTED_AUDIO_TRACK = "selectedAudioTrack"
+ private const val PROP_SELECTED_AUDIO_TRACK_TYPE = "type"
+ private const val PROP_SELECTED_AUDIO_TRACK_VALUE = "value"
+ private const val PROP_SELECTED_TEXT_TRACK = "selectedTextTrack"
+ private const val PROP_SELECTED_TEXT_TRACK_TYPE = "type"
+ private const val PROP_SELECTED_TEXT_TRACK_VALUE = "value"
+ private const val PROP_PAUSED = "paused"
+ private const val PROP_MUTED = "muted"
+ private const val PROP_AUDIO_OUTPUT = "audioOutput"
+ private const val PROP_VOLUME = "volume"
+ private const val PROP_BUFFER_CONFIG = "bufferConfig"
+ private const val PROP_PREVENTS_DISPLAY_SLEEP_DURING_VIDEO_PLAYBACK =
+ "preventsDisplaySleepDuringVideoPlayback"
+ private const val PROP_PROGRESS_UPDATE_INTERVAL = "progressUpdateInterval"
+ private const val PROP_REPORT_BANDWIDTH = "reportBandwidth"
+ private const val PROP_RATE = "rate"
+ private const val PROP_MIN_LOAD_RETRY_COUNT = "minLoadRetryCount"
+ private const val PROP_MAXIMUM_BIT_RATE = "maxBitRate"
+ private const val PROP_PLAY_IN_BACKGROUND = "playInBackground"
+ private const val PROP_DISABLE_FOCUS = "disableFocus"
+ private const val PROP_BUFFERING_STRATEGY = "bufferingStrategy"
+ private const val PROP_DISABLE_DISCONNECT_ERROR = "disableDisconnectError"
+ private const val PROP_FOCUSABLE = "focusable"
+ private const val PROP_FULLSCREEN = "fullscreen"
+ private const val PROP_VIEW_TYPE = "viewType"
+ private const val PROP_SELECTED_VIDEO_TRACK = "selectedVideoTrack"
+ private const val PROP_SELECTED_VIDEO_TRACK_TYPE = "type"
+ private const val PROP_SELECTED_VIDEO_TRACK_VALUE = "value"
+ private const val PROP_HIDE_SHUTTER_VIEW = "hideShutterView"
+ private const val PROP_CONTROLS = "controls"
+ private const val PROP_SUBTITLE_STYLE = "subtitleStyle"
+ private const val PROP_SHUTTER_COLOR = "shutterColor"
+ private const val PROP_SHOW_NOTIFICATION_CONTROLS = "showNotificationControls"
+ private const val PROP_DEBUG = "debug"
+ private const val PROP_CONTROLS_STYLES = "controlsStyles"
+ }
+
+ override fun getName(): String = REACT_CLASS
+
+ override fun createViewInstance(themedReactContext: ThemedReactContext): ReactExoplayerView {
+ ReactNativeVideoManager.getInstance().registerView(this)
+ return ReactExoplayerView(themedReactContext, config)
+ }
+
+ override fun onDropViewInstance(view: ReactExoplayerView) {
+ view.cleanUpResources()
+ ReactNativeVideoManager.getInstance().unregisterView(this)
+ }
+
+ override fun getExportedCustomDirectEventTypeConstants(): Map = EventTypes.toMap()
+
+ override fun addEventEmitters(reactContext: ThemedReactContext, view: ReactExoplayerView) {
+ super.addEventEmitters(reactContext, view)
+ view.eventEmitter.addEventEmitters(reactContext, view)
+ }
+
+ @ReactProp(name = PROP_SRC)
+ fun setSrc(videoView: ReactExoplayerView, src: ReadableMap?) {
+ val context = videoView.context.applicationContext
+ videoView.setSrc(Source.parse(src, context))
+ }
+
+ @ReactProp(name = PROP_RESIZE_MODE)
+ fun setResizeMode(videoView: ReactExoplayerView, resizeMode: String) {
+ when (resizeMode) {
+ "none", "contain" -> videoView.setResizeModeModifier(ResizeMode.RESIZE_MODE_FIT)
+
+ "cover" -> videoView.setResizeModeModifier(ResizeMode.RESIZE_MODE_CENTER_CROP)
+
+ "stretch" -> videoView.setResizeModeModifier(ResizeMode.RESIZE_MODE_FILL)
+
+ else -> {
+ DebugLog.w(TAG, "Unsupported resize mode: $resizeMode - falling back to fit")
+ videoView.setResizeModeModifier(ResizeMode.RESIZE_MODE_FIT)
+ }
+ }
+ }
+
+ @ReactProp(name = PROP_REPEAT, defaultBoolean = false)
+ fun setRepeat(videoView: ReactExoplayerView, repeat: Boolean) {
+ videoView.setRepeatModifier(repeat)
+ }
+
+ @ReactProp(name = PROP_PREVENTS_DISPLAY_SLEEP_DURING_VIDEO_PLAYBACK, defaultBoolean = false)
+ fun setPreventsDisplaySleepDuringVideoPlayback(videoView: ReactExoplayerView, preventsSleep: Boolean) {
+ videoView.preventsDisplaySleepDuringVideoPlayback = preventsSleep
+ }
+
+ @ReactProp(name = PROP_SELECTED_VIDEO_TRACK)
+ fun setSelectedVideoTrack(videoView: ReactExoplayerView, selectedVideoTrack: ReadableMap?) {
+ var typeString: String? = null
+ var value: String? = null
+ if (selectedVideoTrack != null) {
+ typeString = ReactBridgeUtils.safeGetString(selectedVideoTrack, PROP_SELECTED_VIDEO_TRACK_TYPE)
+ value = ReactBridgeUtils.safeGetString(selectedVideoTrack, PROP_SELECTED_VIDEO_TRACK_VALUE)
+ }
+ videoView.setSelectedVideoTrack(typeString, value)
+ }
+
+ @ReactProp(name = PROP_SELECTED_AUDIO_TRACK)
+ fun setSelectedAudioTrack(videoView: ReactExoplayerView, selectedAudioTrack: ReadableMap?) {
+ var typeString: String? = null
+ var value: String? = null
+ if (selectedAudioTrack != null) {
+ typeString = ReactBridgeUtils.safeGetString(selectedAudioTrack, PROP_SELECTED_AUDIO_TRACK_TYPE)
+ value = ReactBridgeUtils.safeGetString(selectedAudioTrack, PROP_SELECTED_AUDIO_TRACK_VALUE)
+ }
+ videoView.setSelectedAudioTrack(typeString, value)
+ }
+
+ @ReactProp(name = PROP_SELECTED_TEXT_TRACK)
+ fun setSelectedTextTrack(videoView: ReactExoplayerView, selectedTextTrack: ReadableMap?) {
+ var typeString: String? = null
+ var value: String? = null
+ if (selectedTextTrack != null) {
+ typeString = ReactBridgeUtils.safeGetString(selectedTextTrack, PROP_SELECTED_TEXT_TRACK_TYPE)
+ value = ReactBridgeUtils.safeGetString(selectedTextTrack, PROP_SELECTED_TEXT_TRACK_VALUE)
+ }
+ videoView.setSelectedTextTrack(typeString, value)
+ }
+
+ @ReactProp(name = PROP_PAUSED, defaultBoolean = false)
+ fun setPaused(videoView: ReactExoplayerView, paused: Boolean) {
+ videoView.setPausedModifier(paused)
+ }
+
+ @ReactProp(name = PROP_MUTED, defaultBoolean = false)
+ fun setMuted(videoView: ReactExoplayerView, muted: Boolean) {
+ videoView.setMutedModifier(muted)
+ }
+
+ @ReactProp(name = PROP_AUDIO_OUTPUT)
+ fun setAudioOutput(videoView: ReactExoplayerView, audioOutput: String) {
+ videoView.setAudioOutput(AudioOutput.get(audioOutput))
+ }
+
+ @ReactProp(name = PROP_VOLUME, defaultFloat = 1.0f)
+ fun setVolume(videoView: ReactExoplayerView, volume: Float) {
+ videoView.setVolumeModifier(volume)
+ }
+
+ @ReactProp(name = PROP_PROGRESS_UPDATE_INTERVAL, defaultFloat = 250.0f)
+ fun setProgressUpdateInterval(videoView: ReactExoplayerView, progressUpdateInterval: Float) {
+ videoView.setProgressUpdateInterval(progressUpdateInterval)
+ }
+
+ @ReactProp(name = PROP_REPORT_BANDWIDTH, defaultBoolean = false)
+ fun setReportBandwidth(videoView: ReactExoplayerView, reportBandwidth: Boolean) {
+ videoView.setReportBandwidth(reportBandwidth)
+ }
+
+ @ReactProp(name = PROP_RATE)
+ fun setRate(videoView: ReactExoplayerView, rate: Float) {
+ videoView.setRateModifier(rate)
+ }
+
+ @ReactProp(name = PROP_MAXIMUM_BIT_RATE)
+ fun setMaxBitRate(videoView: ReactExoplayerView, maxBitRate: Float) {
+ videoView.setMaxBitRateModifier(maxBitRate.toInt())
+ }
+
+ @ReactProp(name = PROP_MIN_LOAD_RETRY_COUNT)
+ fun setMinLoadRetryCount(videoView: ReactExoplayerView, minLoadRetryCount: Int) {
+ videoView.setMinLoadRetryCountModifier(minLoadRetryCount)
+ }
+
+ @ReactProp(name = PROP_PLAY_IN_BACKGROUND, defaultBoolean = false)
+ fun setPlayInBackground(videoView: ReactExoplayerView, playInBackground: Boolean) {
+ videoView.setPlayInBackground(playInBackground)
+ }
+
+ @ReactProp(name = PROP_DISABLE_FOCUS, defaultBoolean = false)
+ fun setDisableFocus(videoView: ReactExoplayerView, disableFocus: Boolean) {
+ videoView.setDisableFocus(disableFocus)
+ }
+
+ @ReactProp(name = PROP_FOCUSABLE, defaultBoolean = true)
+ fun setFocusable(videoView: ReactExoplayerView, focusable: Boolean) {
+ videoView.setFocusable(focusable)
+ }
+
+ @ReactProp(name = PROP_BUFFERING_STRATEGY)
+ fun setBufferingStrategy(videoView: ReactExoplayerView, bufferingStrategy: String) {
+ val strategy = BufferingStrategy.parse(bufferingStrategy)
+ videoView.setBufferingStrategy(strategy)
+ }
+
+ @ReactProp(name = PROP_DISABLE_DISCONNECT_ERROR, defaultBoolean = false)
+ fun setDisableDisconnectError(videoView: ReactExoplayerView, disableDisconnectError: Boolean) {
+ videoView.setDisableDisconnectError(disableDisconnectError)
+ }
+
+ @ReactProp(name = PROP_FULLSCREEN, defaultBoolean = false)
+ fun setFullscreen(videoView: ReactExoplayerView, fullscreen: Boolean) {
+ videoView.setFullscreen(fullscreen)
+ }
+
+ @ReactProp(name = PROP_VIEW_TYPE, defaultInt = ViewType.VIEW_TYPE_SURFACE)
+ fun setViewType(videoView: ReactExoplayerView, viewType: Int) {
+ videoView.setViewType(viewType)
+ }
+
+ @ReactProp(name = PROP_HIDE_SHUTTER_VIEW, defaultBoolean = false)
+ fun setHideShutterView(videoView: ReactExoplayerView, hideShutterView: Boolean) {
+ videoView.setHideShutterView(hideShutterView)
+ }
+
+ @ReactProp(name = PROP_CONTROLS, defaultBoolean = false)
+ fun setControls(videoView: ReactExoplayerView, controls: Boolean) {
+ videoView.setControls(controls)
+ }
+
+ @ReactProp(name = PROP_SUBTITLE_STYLE)
+ fun setSubtitleStyle(videoView: ReactExoplayerView, src: ReadableMap?) {
+ videoView.setSubtitleStyle(SubtitleStyle.parse(src))
+ }
+
+ @ReactProp(name = PROP_SHUTTER_COLOR, defaultInt = Color.BLACK)
+ fun setShutterColor(videoView: ReactExoplayerView, color: Int) {
+ videoView.setShutterColor(color)
+ }
+
+ @ReactProp(name = PROP_BUFFER_CONFIG)
+ fun setBufferConfig(videoView: ReactExoplayerView, bufferConfig: ReadableMap?) {
+ val config = BufferConfig.parse(bufferConfig)
+ videoView.setBufferConfig(config)
+ }
+
+ @ReactProp(name = PROP_SHOW_NOTIFICATION_CONTROLS)
+ fun setShowNotificationControls(videoView: ReactExoplayerView, showNotificationControls: Boolean) {
+ videoView.setShowNotificationControls(showNotificationControls)
+ }
+
+ @ReactProp(name = PROP_DEBUG, defaultBoolean = false)
+ fun setDebug(videoView: ReactExoplayerView, debugConfig: ReadableMap?) {
+ val enableDebug = ReactBridgeUtils.safeGetBool(debugConfig, "enable", false)
+ val enableThreadDebug = ReactBridgeUtils.safeGetBool(debugConfig, "thread", false)
+ if (enableDebug) {
+ DebugLog.setConfig(Log.VERBOSE, enableThreadDebug)
+ } else {
+ DebugLog.setConfig(Log.WARN, enableThreadDebug)
+ }
+ videoView.setDebug(enableDebug)
+ }
+
+ @ReactProp(name = PROP_CONTROLS_STYLES)
+ fun setControlsStyles(videoView: ReactExoplayerView, controlsStyles: ReadableMap?) {
+ val controlsConfig = ControlsConfig.parse(controlsStyles)
+ videoView.setControlsStyles(controlsConfig)
+ }
+}
diff --git a/android/src/main/java/com/brentvatne/exoplayer/VideoPlaybackService.kt b/android/src/main/java/com/brentvatne/exoplayer/VideoPlaybackService.kt
index 6cf6f7d2..b60df6fa 100644
--- a/android/src/main/java/com/brentvatne/exoplayer/VideoPlaybackService.kt
+++ b/android/src/main/java/com/brentvatne/exoplayer/VideoPlaybackService.kt
@@ -63,6 +63,7 @@ class VideoPlaybackService : MediaSessionService() {
mediaSessionsList[player] = mediaSession
addSession(mediaSession)
+ startForeground(mediaSession.player.hashCode(), buildNotification(mediaSession))
}
fun unregisterPlayer(player: ExoPlayer) {
@@ -95,6 +96,10 @@ class VideoPlaybackService : MediaSessionService() {
override fun onDestroy() {
cleanup()
+ val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
+ notificationManager.deleteNotificationChannel(NOTIFICATION_CHANEL_ID)
+ }
super.onDestroy()
}
@@ -121,7 +126,7 @@ class VideoPlaybackService : MediaSessionService() {
}
private fun buildNotification(session: MediaSession): Notification {
- val returnToPlayer = Intent(this, sourceActivity).apply {
+ val returnToPlayer = Intent(this, sourceActivity ?: this.javaClass).apply {
flags = Intent.FLAG_ACTIVITY_SINGLE_TOP or Intent.FLAG_ACTIVITY_CLEAR_TOP
}
@@ -179,17 +184,17 @@ class VideoPlaybackService : MediaSessionService() {
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setSmallIcon(androidx.media3.session.R.drawable.media3_icon_circular_play)
// Add media control buttons that invoke intents in your media service
- .addAction(androidx.media3.session.R.drawable.media3_notification_seek_back, "Seek Backward", seekBackwardPendingIntent) // #0
+ .addAction(androidx.media3.session.R.drawable.media3_icon_rewind, "Seek Backward", seekBackwardPendingIntent) // #0
.addAction(
if (session.player.isPlaying) {
- androidx.media3.session.R.drawable.media3_notification_pause
+ androidx.media3.session.R.drawable.media3_icon_pause
} else {
- androidx.media3.session.R.drawable.media3_notification_play
+ androidx.media3.session.R.drawable.media3_icon_play
},
"Toggle Play",
togglePlayPendingIntent
) // #1
- .addAction(androidx.media3.session.R.drawable.media3_notification_seek_forward, "Seek Forward", seekForwardPendingIntent) // #2
+ .addAction(androidx.media3.session.R.drawable.media3_icon_fast_forward, "Seek Forward", seekForwardPendingIntent) // #2
// Apply the media style template
.setStyle(MediaStyleNotificationHelper.MediaStyle(session).setShowActionsInCompactView(0, 1, 2))
.setContentTitle(session.player.mediaMetadata.title)
@@ -209,9 +214,6 @@ class VideoPlaybackService : MediaSessionService() {
private fun hideAllNotifications() {
val notificationManager: NotificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
notificationManager.cancelAll()
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
- notificationManager.deleteNotificationChannel(NOTIFICATION_CHANEL_ID)
- }
}
private fun cleanup() {
diff --git a/android/src/main/java/com/brentvatne/react/ReactNativeVideoManager.kt b/android/src/main/java/com/brentvatne/react/ReactNativeVideoManager.kt
index d2792643..73a4f10c 100644
--- a/android/src/main/java/com/brentvatne/react/ReactNativeVideoManager.kt
+++ b/android/src/main/java/com/brentvatne/react/ReactNativeVideoManager.kt
@@ -29,21 +29,19 @@ class ReactNativeVideoManager : RNVPlugin {
/**
* register a new ReactExoplayerViewManager in the managed list
*/
- fun registerView(newInstance: ReactExoplayerViewManager): () -> Boolean =
- {
- if (instanceList.size > 2) {
- DebugLog.d(TAG, "multiple Video displayed ?")
- }
- instanceList.add(newInstance)
+ fun registerView(newInstance: ReactExoplayerViewManager) {
+ if (instanceList.size > 2) {
+ DebugLog.d(TAG, "multiple Video displayed ?")
}
+ instanceList.add(newInstance)
+ }
/**
* unregister existing ReactExoplayerViewManager in the managed list
*/
- fun unregisterView(newInstance: ReactExoplayerViewManager): () -> Boolean =
- {
- instanceList.remove(newInstance)
- }
+ fun unregisterView(newInstance: ReactExoplayerViewManager) {
+ instanceList.remove(newInstance)
+ }
/**
* register a new plugin in the managed list
diff --git a/android/src/main/java/com/brentvatne/react/VideoManagerModule.kt b/android/src/main/java/com/brentvatne/react/VideoManagerModule.kt
index 1e624e7c..d3968276 100644
--- a/android/src/main/java/com/brentvatne/react/VideoManagerModule.kt
+++ b/android/src/main/java/com/brentvatne/react/VideoManagerModule.kt
@@ -1,10 +1,12 @@
package com.brentvatne.react
+import com.brentvatne.common.api.Source
import com.brentvatne.exoplayer.ReactExoplayerView
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
import com.facebook.react.bridge.ReactMethod
+import com.facebook.react.bridge.ReadableMap
import com.facebook.react.bridge.UiThreadUtil
import com.facebook.react.uimanager.UIManagerHelper
import com.facebook.react.uimanager.common.UIManagerType
@@ -42,6 +44,7 @@ class VideoManagerModule(reactContext: ReactApplicationContext?) : ReactContextB
}
@ReactMethod
+ @Suppress("UNUSED_PARAMETER") // codegen compatibility
fun seekCmd(reactTag: Int, time: Float, tolerance: Float) {
performOnPlayerView(reactTag) {
it?.seekTo((time * 1000f).roundToInt().toLong())
@@ -62,6 +65,13 @@ class VideoManagerModule(reactContext: ReactApplicationContext?) : ReactContextB
}
}
+ @ReactMethod
+ fun setSourceCmd(reactTag: Int, source: ReadableMap?) {
+ performOnPlayerView(reactTag) {
+ it?.setSrc(Source.parse(source, reactApplicationContext))
+ }
+ }
+
@ReactMethod
fun getCurrentPosition(reactTag: Int, promise: Promise) {
performOnPlayerView(reactTag) {
diff --git a/android/src/main/java/com/brentvatne/receiver/BecomingNoisyListener.java b/android/src/main/java/com/brentvatne/receiver/BecomingNoisyListener.java
deleted file mode 100644
index 6a5d37d8..00000000
--- a/android/src/main/java/com/brentvatne/receiver/BecomingNoisyListener.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package com.brentvatne.receiver;
-
-public interface BecomingNoisyListener {
-
- BecomingNoisyListener NO_OP = new BecomingNoisyListener() {
- @Override public void onAudioBecomingNoisy() {
- // NO_OP
- }
- };
-
- void onAudioBecomingNoisy();
-
-}
diff --git a/android/src/main/java/com/brentvatne/receiver/BecomingNoisyListener.kt b/android/src/main/java/com/brentvatne/receiver/BecomingNoisyListener.kt
new file mode 100644
index 00000000..d967fc9d
--- /dev/null
+++ b/android/src/main/java/com/brentvatne/receiver/BecomingNoisyListener.kt
@@ -0,0 +1,12 @@
+package com.brentvatne.receiver
+
+interface BecomingNoisyListener {
+ companion object {
+ val NO_OP = object : BecomingNoisyListener {
+ override fun onAudioBecomingNoisy() {
+ // NO_OP
+ }
+ }
+ }
+ fun onAudioBecomingNoisy()
+}
diff --git a/android/src/main/java/com/google/ads/interactivemedia/v3/api/ImaSdkFactory.java b/android/src/main/java/com/google/ads/interactivemedia/v3/api/ImaSdkFactory.java
new file mode 100644
index 00000000..6580b4ff
--- /dev/null
+++ b/android/src/main/java/com/google/ads/interactivemedia/v3/api/ImaSdkFactory.java
@@ -0,0 +1,22 @@
+package com.google.ads.interactivemedia.v3.api;
+
+public abstract class ImaSdkFactory {
+ private static ImaSdkFactory instance;
+
+ public abstract ImaSdkSettings createImaSdkSettings();
+
+ public static ImaSdkFactory getInstance() {
+ if (instance == null) {
+ instance = new ConcreteImaSdkFactory();
+ }
+ return instance;
+ }
+}
+
+class ConcreteImaSdkFactory extends ImaSdkFactory {
+
+ @Override
+ public ImaSdkSettings createImaSdkSettings() {
+ return new ConcreteImaSdkSettings();
+ }
+}
\ No newline at end of file
diff --git a/android/src/main/java/com/google/ads/interactivemedia/v3/api/ImaSdkSettings.java b/android/src/main/java/com/google/ads/interactivemedia/v3/api/ImaSdkSettings.java
new file mode 100644
index 00000000..82887395
--- /dev/null
+++ b/android/src/main/java/com/google/ads/interactivemedia/v3/api/ImaSdkSettings.java
@@ -0,0 +1,24 @@
+package com.google.ads.interactivemedia.v3.api;
+
+import androidx.annotation.InspectableProperty;
+
+public abstract class ImaSdkSettings {
+ public abstract String getLanguage();
+ public abstract void setLanguage(String language);
+}
+
+// Concrete Implementation
+class ConcreteImaSdkSettings extends ImaSdkSettings {
+
+ private String language;
+
+ @Override
+ public String getLanguage() {
+ return language;
+ }
+
+ @Override
+ public void setLanguage(String language) {
+ this.language = language;
+ }
+}
diff --git a/android/src/main/res/drawable/circle.xml b/android/src/main/res/drawable/circle.xml
new file mode 100644
index 00000000..9f06d7c7
--- /dev/null
+++ b/android/src/main/res/drawable/circle.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
diff --git a/android/src/main/res/layout/exo_legacy_player_control_view.xml b/android/src/main/res/layout/exo_legacy_player_control_view.xml
index 50ef45b2..61b84733 100644
--- a/android/src/main/res/layout/exo_legacy_player_control_view.xml
+++ b/android/src/main/res/layout/exo_legacy_player_control_view.xml
@@ -1,17 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
#FFBEBEBE
#CC000000
+ #FFFFFF
+ #FF0000
\ No newline at end of file
diff --git a/android/src/main/res/values/dimens.xml b/android/src/main/res/values/dimens.xml
index 218dca64..4336a34c 100644
--- a/android/src/main/res/values/dimens.xml
+++ b/android/src/main/res/values/dimens.xml
@@ -3,6 +3,7 @@
4dp
4dp
+ 12dp
4dp
4dp
diff --git a/android/src/main/res/values/strings.xml b/android/src/main/res/values/strings.xml
index 1f037779..a4c134f0 100644
--- a/android/src/main/res/values/strings.xml
+++ b/android/src/main/res/values/strings.xml
@@ -16,4 +16,10 @@
This device does not support the required DRM scheme
An unknown DRM error occurred
+
+ Settings
+
+ Playback Speed
+
+ Select Playback Speed
diff --git a/docs/pages/component/ads.md b/docs/pages/component/ads.md
index d9804baf..5b5f1857 100644
--- a/docs/pages/component/ads.md
+++ b/docs/pages/component/ads.md
@@ -23,3 +23,16 @@ Example:
onReceiveAdEvent={event => console.log(event)}
...
```
+
+### Localization
+To change the language of the IMA SDK, you need to pass `adLanguage` prop to `Video` component. List of supported languages, you can find [here](https://developers.google.com/interactive-media-ads/docs/sdks/android/client-side/localization#locale-codes)
+
+By default, ios will use system language and android will use `en`
+
+Example:
+
+```jsx
+...
+adLanguage="fr"
+...
+```
diff --git a/docs/pages/component/drm.mdx b/docs/pages/component/drm.mdx
index 6e7fa0aa..da9074d5 100644
--- a/docs/pages/component/drm.mdx
+++ b/docs/pages/component/drm.mdx
@@ -137,6 +137,20 @@ You can specify the DRM type, either by string or using the exported DRMType enu
Valid values are, for Android: DRMType.WIDEVINE / DRMType.PLAYREADY / DRMType.CLEARKEY.
for iOS: DRMType.FAIRPLAY
+### `localSourceEncryptionKeyScheme`
+
+
+
+Set the url scheme for stream encryption key for local assets
+
+Type: String
+
+Example:
+
+```
+localSourceEncryptionKeyScheme="my-offline-key"
+```
+
## Common Usage Scenarios
### Send cookies to license server
diff --git a/docs/pages/component/events.mdx b/docs/pages/component/events.mdx
index 0f26b4b6..6e0c1498 100644
--- a/docs/pages/component/events.mdx
+++ b/docs/pages/component/events.mdx
@@ -67,7 +67,7 @@ Example:
### `onBandwidthUpdate`
-
+
Callback function that is called when the available bandwidth changes.
@@ -225,13 +225,14 @@ NOTE: tracks (`audioTracks`, `textTracks` & `videoTracks`) are not available on
Payload:
| Property | Type | Description |
-| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+|-------------|--------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| currentTime | number | Time in seconds where the media will start |
| duration | number | Length of the media in seconds |
| naturalSize | object | Properties: _ width - Width in pixels that the video was encoded at _ height - Height in pixels that the video was encoded at \* orientation - "portrait", "landscape" or "square" |
| audioTracks | array | An array of audio track info objects with the following properties: _ index - Index number _ title - Description of the track _ language - 2 letter [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) or 3 letter [ISO639-2](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes) language code _ type - Mime type of track |
| textTracks | array | An array of text track info objects with the following properties: _ index - Index number _ title - Description of the track _ language - 2 letter [ISO 639-1](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) or 3 letter [ISO 639-2](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes) language code _ type - Mime type of track |
| videoTracks | array | An array of video track info objects with the following properties: _ trackId - ID for the track _ bitrate - Bit rate in bits per second _ codecs - Comma separated list of codecs _ height - Height of the video \* width - Width of the video |
+| trackId | string | Provide key information about the video track, typically including: `Resolution`, `Bitrate`. |
Example:
@@ -263,7 +264,8 @@ Example:
{ index: 0, bitrate: 3987904, codecs: "avc1.640028", height: 720, trackId: "f1-v1-x3", width: 1280 },
{ index: 1, bitrate: 7981888, codecs: "avc1.640028", height: 1080, trackId: "f2-v1-x3", width: 1920 },
{ index: 2, bitrate: 1994979, codecs: "avc1.4d401f", height: 480, trackId: "f3-v1-x3", width: 848 }
- ]
+ ],
+ trackId: "720p 2400kbps"
}
```
diff --git a/docs/pages/component/methods.mdx b/docs/pages/component/methods.mdx
index 8105b9f3..b3d89a04 100644
--- a/docs/pages/component/methods.mdx
+++ b/docs/pages/component/methods.mdx
@@ -115,6 +115,16 @@ This function will change the volume exactly like [volume](./props#volume) prope
This function retrieves and returns the precise current position of the video playback, measured in seconds.
This function will throw an error if player is not initialized.
+
+### `setSource`
+
+
+
+`setSource(source: ReactVideoSource): Promise`
+
+This function will change the source exactly like [source](./props#source) property.
+Changing source with this function will overide source provided as props.
+
### `setFullScreen`
@@ -148,9 +158,9 @@ const someCoolFunctions = async () => {
videoRef.current.presentFullscreenPlayer();
videoRef.current.dismissFullscreenPlayer();
- // pause or play the video
- videoRef.current.play();
+ // pause or resume the video
videoRef.current.pause();
+ videoRef.current.resume();
// save video to your Photos with current filter prop
const response = await videoRef.current.save();
diff --git a/docs/pages/component/props.mdx b/docs/pages/component/props.mdx
index cc197c68..b1f1b966 100644
--- a/docs/pages/component/props.mdx
+++ b/docs/pages/component/props.mdx
@@ -8,6 +8,9 @@ This page shows the list of available properties to configure player
### `adTagUrl`
+> [!WARNING]
+> Deprecated, use source.ad.adTagUrl instead
+
Sets the VAST uri to play AVOD ads.
@@ -135,8 +138,7 @@ Determines whether to show player controls.
- **false (default)** - Don't show player controls
- **true** - Show player controls
-Note on iOS, controls are always shown when in fullscreen mode.
-Note on Android, native controls are available by default.
+Controls are always shown in fullscreen mode, even when `controls={false}`.
If needed, you can also add your controls or use a package like [react-native-video-controls](https://github.com/itsnubix/react-native-video-controls) or [react-native-media-console](https://github.com/criszz77/react-native-media-console), see [Useful Side Project](/projects).
### `controlsStyles`
@@ -145,25 +147,53 @@ If needed, you can also add your controls or use a package like [react-native-vi
Adjust the control styles. This prop is need only if `controls={true}` and is an object. See the list of prop supported below.
-| Property | Type | Description |
-|-----------------|---------|-----------------------------------------------------------------------------------------|
-| hideSeekBar | boolean | The default value is `false`, allowing you to hide the seek bar for live broadcasts. |
-| seekIncrementMS | number | The default value is `10000`. You can change the value to increment forward and rewind. |
+| Property | Type | Description |
+|-------------------------------------|---------|---------------------------------------------------------------------------------------------|
+| hidePosition | boolean | Hides the position indicator. Default is `false`. |
+| hidePlayPause | boolean | Hides the play/pause button. Default is `false`. |
+| hideForward | boolean | Hides the forward button. Default is `false`. |
+| hideRewind | boolean | Hides the rewind button. Default is `false`. |
+| hideNext | boolean | Hides the next button. Default is `false`. |
+| hidePrevious | boolean | Hides the previous button. Default is `false`. |
+| hideFullscreen | boolean | Hides the fullscreen button. Default is `false`. |
+| hideSeekBar | boolean | The default value is `false`, allowing you to hide the seek bar for live broadcasts. |
+| hideDuration | boolean | The default value is `false`, allowing you to hide the duration. |
+| hideNavigationBarOnFullScreenMode | boolean | The default value is `true`, allowing you to hide the navigation bar on full-screen mode. |
+| hideNotificationBarOnFullScreenMode | boolean | The default value is `true`, allowing you to hide the notification bar on full-screen mode. |
+| hideSettingButton | boolean | The default value is `true`, allowing you to hide the setting button. |
+| seekIncrementMS | number | The default value is `10000`. You can change the value to increment forward and rewind. |
+| liveLabel | string | Allowing you to set a label for live video. |
Example with default values:
```javascript
controlsStyles={{
+ hidePosition: false,
+ hidePlayPause: false,
+ hideForward: false,
+ hideRewind: false,
+ hideNext: false,
+ hidePrevious: false,
+ hideFullscreen: false,
hideSeekBar: false,
+ hideDuration: false,
+ hideNavigationBarOnFullScreenMode: true,
+ hideNotificationBarOnFullScreenMode: true,
+ hideSettingButton: true,
seekIncrementMS: 10000,
+ liveLabel: "LIVE"
}}
```
### `contentStartTime`
+> [!WARNING]
+> Deprecated, use source.contentStartTime instead
+
The start time in ms for SSAI content. This determines at what time to load the video info like resolutions. Use this only when you have SSAI stream where ads resolution is not the same as content resolution.
+Note: This feature only works on DASH streams
### `debug`
@@ -330,19 +360,6 @@ Controls the iOS silent switch behavior
- **"ignore"** - Play audio even if the silent switch is set
- **"obey"** - Don't play audio if the silent switch is set
-### `localSourceEncryptionKeyScheme`
-
-
-
-Set the url scheme for stream encryption key for local assets
-
-Type: String
-
-Example:
-
-```
-localSourceEncryptionKeyScheme="my-offline-key"
-```
### `maxBitRate`
@@ -352,6 +369,9 @@ Sets the desired limit, in bits per second, of network bandwidth consumption whe
Default: 0. Don't limit the maxBitRate.
+Note: This property can interact with selectedVideoTrack.
+To use `maxBitrate`, selectedVideoTrack shall be undefined or `{type: SelectedVideoTrackType.AUTO}`.
+
Example:
```javascript
@@ -437,13 +457,26 @@ Determine whether the media should continue playing when notifications or the Co
### `poster`
+> [!WARNING]
+> Value: string with a URL for the poster is deprecated, use `poster` as object instead
An image to display while the video is loading
-Value: string with a URL for the poster, e.g. "https://baconmockup.com/300/200/"
+Value: Props for the `Image` component. The poster is visible when the source attribute is provided.
+
+```javascript
+
+ poster={{
+ source: { uri: "https://baconmockup.com/300/200/" },
+ resizeMode: "cover",
+ // ...
+ }}
+
+````
### `posterResizeMode`
-
+> [!WARNING]
+> deprecated, use `poster` with `resizeMode` key instead
Determines how to resize the poster image when the frame doesn't match the raw video dimensions.
@@ -489,6 +522,37 @@ Speed at which the media should play.
- **1.0** - Play at normal speed (default)
- **Other values** - Slow down or speed up playback
+### `renderLoader`
+
+
+
+Allows you to create custom components to display while the video is loading.
+If `renderLoader` is provided, `poster` and `posterResizeMode` will be ignored.
+renderLoader is either a component or a function returning a component.
+It is recommended to use the function for optimization matter.
+
+`renderLoader` function be called with parameters of type `ReactVideoRenderLoaderProps` to be able to adapt loader
+
+```typescript
+interface ReactVideoRenderLoaderProps {
+ source?: ReactVideoSource; /// source of the video
+ style?: StyleProp; /// style to apply
+ resizeMode?: EnumValues; /// resizeMode provided to the video component
+}
+````
+
+Sample:
+
+```javascript
+
+ renderLoader={() => (
+
+ Custom Loader
+ )
+ }
+
+````
+
### `repeat`
@@ -735,7 +799,7 @@ The following other types are supported on some platforms, but aren't fully docu
#### Using DRM content
-
+
To setup DRM please follow [this guide](/component/drm)
@@ -753,8 +817,6 @@ Example:
},
```
-> ⚠️ DRM is not supported on visionOS yet
-
#### Start playback at a specific point in time
@@ -801,6 +863,33 @@ source={{
}}
```
+### `ad`
+
+
+
+Sets the ad configuration.
+
+Example:
+
+```
+ad: {
+ adTagUrl="https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/vmap_ad_samples&sz=640x480&cust_params=sample_ar%3Dpremidpostoptimizedpodbumper&ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&env=vp&impl=s&cmsid=496&vid=short_onecue&correlator="
+ adLanguage="fr"
+}
+```
+
+See: [./ads.md] for more informations
+
+Note: You need enable IMA SDK in gradle or pod file - [enable client side ads insertion](/installation)
+
+
+#### `contentStartTime`
+
+
+
+The start time in ms for SSAI content. This determines at what time to load the video info like resolutions. Use this only when you have SSAI stream where ads resolution is not the same as content resolution.
+Note: This feature only works on DASH streams
+
#### `textTracksAllowChunklessPreparation`
@@ -816,37 +905,19 @@ source={{
}}
```
-### `subtitleStyle`
-
-| Property | Description | Platforms |
-| ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
-| fontSize | Adjust the font size of the subtitles. Default: font size of the device | Android |
-| paddingTop | Adjust the top padding of the subtitles. Default: 0 | Android |
-| paddingBottom | Adjust the bottom padding of the subtitles. Default: 0 | Android |
-| paddingLeft | Adjust the left padding of the subtitles. Default: 0 | Android |
-| paddingRight | Adjust the right padding of the subtitles. Default: 0 | Android |
-| opacity | Adjust the visibility of subtitles with 0 hiding and 1 fully showing them. Android supports float values between 0 and 1 for varying opacity levels, whereas iOS supports only 0 or 1. Default: 1. | Android, iOS |
-
-Example:
-
-```javascript
-subtitleStyle={{ paddingBottom: 50, fontSize: 20, opacity: 0 }}
-```
-
-### `textTracks`
-
+#### `textTracks`
Load one or more "sidecar" text tracks. This takes an array of objects representing each track. Each object should have the format:
> ⚠️ This feature does not work with HLS playlists (e.g m3u8) on iOS
-| Property | Description |
-| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| title | Descriptive name for the track |
-| language | 2 letter [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) representing the language |
-| type | Mime type of the track _ TextTrackType.SRT - SubRip (.srt) _ TextTrackType.TTML - TTML (.ttml) \* TextTrackType.VTT - WebVTT (.vtt)iOS only supports VTT, Android supports all 3 |
-| uri | URL for the text track. Currently, only tracks hosted on a webserver are supported |
+| Property | Description |
+|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| title | Descriptive name for the track |
+| language | 2 letter [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) representing the language |
+| type | Mime type of the track _ TextTrackType.SUBRIP - SubRip (.srt) _ TextTrackType.TTML - TTML (.ttml) \* TextTrackType.VTT - WebVTT (.vtt)iOS only supports VTT, Android supports all 3 |
+| uri | URL for the text track. Currently, only tracks hosted on a webserver are supported |
On iOS, sidecar text tracks are only supported for individual files, not HLS playlists. For HLS, you should include the text tracks as part of the playlist.
@@ -867,7 +938,92 @@ textTracks={[
{
title: "Spanish Subtitles",
language: "es",
- type: TextTrackType.SRT, // "application/x-subrip"
+ type: TextTrackType.SUBRIP, // "application/x-subrip"
+ uri: "https://durian.blender.org/wp-content/content/subtitles/sintel_es.srt"
+ }
+]}
+```
+
+### `subtitleStyle`
+
+
+
+| Property | Platform | Description | Platforms |
+| ------------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
+| fontSize | Android | Adjust the font size of the subtitles. Default: font size of the device | Android |
+| paddingTop | Android | Adjust the top padding of the subtitles. Default: 0 | Android |
+| paddingBottom | Android | Adjust the bottom padding of the subtitles. Default: 0 | Android |
+| paddingLeft | Android | Adjust the left padding of the subtitles. Default: 0 | Android |
+| paddingRight | Android | Adjust the right padding of the subtitles. Default: 0 | Android |
+| opacity | Android, iOS | Adjust the visibility of subtitles with 0 hiding and 1 fully showing them. Android supports float values between 0 and 1 for varying opacity levels, whereas iOS supports only 0 or 1. Default: 1. | Android, iOS |
+| subtitlesFollowVideo | Android | Boolean to adjust position of subtitles. Default: true |
+
+
+Example:
+
+```javascript
+subtitleStyle={{ paddingBottom: 50, fontSize: 20, opacity: 0 }}
+```
+
+Note for `subtitlesFollowVideo`
+
+`subtitlesFollowVideo` helps to determine how the subtitles are positionned.
+To understand this prop you need to understand how views management works.
+The main View style passed to react native video is the position reserved to display the video component.
+It may not match exactly the real video size.
+For exemple, you can pass a 4:3 video view and render a 16:9 video inside.
+So there is a second view, the video view.
+
+Subtitles are managed in a third view.
+
+First react-native-video resize the video to keep aspect ratio (depending on `resizeMode` property) and put it in main view.
+
+* When putting subtitlesFollowVideo to true, the subtitle view will be adapt to the video view.
+It means that if the video is displayed out of screen, the subtitles may also be displayed out of screen.
+
+* When putting subtitlesFollowVideo to false, the subtitle view will keep adapting to the main view.
+It means that if the video is displayed out of screen, the subtitles may also be displayed out of screen.
+
+This prop can be changed on runtime.
+
+### `textTracks`
+
+> [!WARNING]
+> deprecated, use source.textTracks instead. changing text tracks will restart playback
+
+
+
+Load one or more "sidecar" text tracks. This takes an array of objects representing each track. Each object should have the format:
+
+> ⚠️ This feature does not work with HLS playlists (e.g m3u8) on iOS
+
+| Property | Description |
+|----------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| title | Descriptive name for the track |
+| language | 2 letter [ISO 639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) representing the language |
+| type | Mime type of the track _ TextTrackType.SUBRIP - SubRip (.srt) _ TextTrackType.TTML - TTML (.ttml) \* TextTrackType.VTT - WebVTT (.vtt)iOS only supports VTT, Android supports all 3 |
+| uri | URL for the text track. Currently, only tracks hosted on a webserver are supported |
+
+On iOS, sidecar text tracks are only supported for individual files, not HLS playlists. For HLS, you should include the text tracks as part of the playlist.
+
+Note: Due to iOS limitations, sidecar text tracks are not compatible with Airplay. If textTracks are specified, AirPlay support will be automatically disabled.
+
+Example:
+
+```javascript
+import { TextTrackType }, Video from 'react-native-video';
+
+textTracks={[
+ {
+ title: "English CC",
+ language: "en",
+ type: TextTrackType.VTT, // "text/vtt"
+ uri: "https://bitdash-a.akamaihd.net/content/sintel/subtitles/subtitles_en.vtt"
+ },
+ {
+ title: "Spanish Subtitles",
+ language: "es",
+ type: TextTrackType.SUBRIP, // "application/x-subrip"
uri: "https://durian.blender.org/wp-content/content/subtitles/sintel_es.srt"
}
]}
@@ -972,3 +1128,68 @@ Adjust the volume.
- **1.0 (default)** - Play at full volume
- **0.0** - Mute the audio
- **Other values** - Reduce volume
+
+### `cmcd`
+
+
+
+Configure CMCD (Common Media Client Data) parameters. CMCD is a standard for conveying client-side metrics and capabilities to servers, which can help improve streaming quality and performance.
+
+For detailed information about CMCD, please refer to the [CTA-5004 Final Specification](https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf).
+
+- **false (default)** - Don't use CMCD
+- **true** - Use default CMCD configuration
+- **object** - Use custom CMCD configuration
+
+When providing an object, you can configure the following properties:
+
+| Property | Type | Description |
+|----------|-------------------------|----------------------------------------------------|
+| `mode` | `CmcdMode` | The mode for sending CMCD data |
+| `request` | `CmcdData` | Custom key-value pairs for the request object |
+| `session` | `CmcdData` | Custom key-value pairs for the session object |
+| `object` | `CmcdData` | Custom key-value pairs for the object metadata |
+| `status` | `CmcdData` | Custom key-value pairs for the status information |
+
+Note: The `mode` property defaults to `CmcdMode.MODE_QUERY_PARAMETER` if not specified.
+
+#### `CmcdMode`
+CmcdMode is an enum that defines how CMCD data should be sent:
+- `CmcdMode.MODE_REQUEST_HEADER` (0) - Send CMCD data in the HTTP request headers.
+- `CmcdMode.MODE_QUERY_PARAMETER` (1) - Send CMCD data as query parameters in the URL.
+
+#### `CmcdData`
+CmcdData is a type representing custom key-value pairs for CMCD data. It's defined as:
+
+```typescript
+type CmcdData = Record<`${string}-${string}`, string | number>;
+```
+
+Custom key names MUST include a hyphenated prefix to prevent namespace collisions. It's recommended to use a reverse-DNS syntax for custom prefixes.
+
+Example:
+
+```javascript
+
+```
diff --git a/docs/pages/installation.md b/docs/pages/installation.md
index 94293bc8..a1c078ba 100644
--- a/docs/pages/installation.md
+++ b/docs/pages/installation.md
@@ -57,12 +57,14 @@ $RNVideoUseGoogleIMA=true
## Android
-From version >= 6.0.0, your application needs to have kotlin version >= 1.7.0
+From version >= 6.0.0, your application needs to have kotlin version >= 1.8.0
```:
buildscript {
...
- ext.kotlinVersion = '1.7.0'
+ ext.kotlinVersion = '1.8.0',
+ ext.compileSdkVersion = 34
+ ext.targetSdkVersion = 34
...
}
```
diff --git a/docs/pages/other/debug.md b/docs/pages/other/debug.md
index 74c8bfd1..51fa11d0 100644
--- a/docs/pages/other/debug.md
+++ b/docs/pages/other/debug.md
@@ -86,11 +86,6 @@ buildscript {
}
```
-### Desugaring
-to be able to link you may also need to enable coreLibraryDesugaringEnabled in your app.
-
-See: https://developer.android.com/studio/write/java8-support?hl=fr#library-desugaring for more informations.
-
## It's still not working
-You can try to open a ticket now !
+You can try to open a ticket or contact us for [premium support](https://www.thewidlarzgroup.com/?utm_source=rnv&utm_medium=docs#Contact)!
diff --git a/docs/pages/updating.md b/docs/pages/updating.md
index a35e0775..ba829082 100644
--- a/docs/pages/updating.md
+++ b/docs/pages/updating.md
@@ -22,7 +22,7 @@ In your project Podfile add support for static dependency linking. This is requi
Add `use_frameworks! :linkage => :static` just under `platform :ios` in your ios project Podfile.
-[See the example ios project for reference](examples/basic/ios/Podfile#L5)
+[See the example ios project for reference](https://github.com/TheWidlarzGroup/react-native-video/blob/master/examples/basic/ios/Podfile#L5)
##### podspec
@@ -34,7 +34,7 @@ You can remove following lines from your podfile as they are not necessary anymo
- `pod 'react-native-video/VideoCaching', :path => '../node_modules/react-native-video/react-native-video.podspec'`
```
-If you were previously using VideoCaching, you should $RNVideoUseVideoCaching flag in your podspec, see: [installation section](https://react-native-video.github.io/react-native-video/installation#video-caching)
+If you were previously using VideoCaching, you should $RNVideoUseVideoCaching flag in your podspec, see: [installation section](https://thewidlarzgroup.github.io/react-native-video/installation#video-caching)
#### Android
@@ -66,4 +66,4 @@ allprojects {
}
}
```
-If you encounter an error `Could not find com.android.support:support-annotations:27.0.0.` reinstall your Android Support Repository.
\ No newline at end of file
+If you encounter an error `Could not find com.android.support:support-annotations:27.0.0.` reinstall your Android Support Repository.
diff --git a/docs/theme.config.jsx b/docs/theme.config.jsx
index 076d07d8..ad93b863 100644
--- a/docs/theme.config.jsx
+++ b/docs/theme.config.jsx
@@ -52,6 +52,62 @@ export default {
),
},
+ toc: {
+ extraContent: (
+ <>
+
+
+ >
+ ),
+ },
+
useNextSeoProps() {
return {
titleTemplate: '%s – Video',
diff --git a/examples/basic/android/app/build.gradle b/examples/basic/android/app/build.gradle
index fa4d074b..8234f548 100644
--- a/examples/basic/android/app/build.gradle
+++ b/examples/basic/android/app/build.gradle
@@ -83,8 +83,6 @@ android {
namespace "com.videoplayer"
compileOptions {
- // These options are necessary to be able to build fro source
- coreLibraryDesugaringEnabled true
sourceCompatibility JavaVersion.VERSION_11
targetCompatibility JavaVersion.VERSION_11
}
@@ -155,8 +153,6 @@ dependencies {
because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
}
}
- // coreLibraryDesugaring is mandatory to be able to build exoplayer from source
- coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4'
}
apply from: file("../../node_modules/@react-native-community/cli-platform-android/native_modules.gradle"); applyNativeModulesAppBuildGradle(project)
diff --git a/examples/basic/ios/Podfile.lock b/examples/basic/ios/Podfile.lock
index b3681ae4..124bb1a6 100644
--- a/examples/basic/ios/Podfile.lock
+++ b/examples/basic/ios/Podfile.lock
@@ -3,15 +3,15 @@ PODS:
- DoubleConversion (1.1.6)
- EXConstants (16.0.2):
- ExpoModulesCore
- - Expo (51.0.17):
+ - Expo (51.0.32):
- ExpoModulesCore
- ExpoAsset (10.0.10):
- ExpoModulesCore
- ExpoFileSystem (17.0.1):
- ExpoModulesCore
- - ExpoFont (12.0.7):
+ - ExpoFont (12.0.10):
- ExpoModulesCore
- - ExpoImage (1.12.12):
+ - ExpoImage (1.12.15):
- ExpoModulesCore
- libavif/libdav1d
- SDWebImage (~> 5.19.1)
@@ -20,7 +20,7 @@ PODS:
- SDWebImageWebPCoder (~> 0.14.6)
- ExpoKeepAwake (13.0.2):
- ExpoModulesCore
- - ExpoModulesCore (1.12.18):
+ - ExpoModulesCore (1.12.24):
- DoubleConversion
- glog
- hermes-engine
@@ -43,12 +43,12 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- - FBLazyVector (0.74.3)
+ - FBLazyVector (0.74.5)
- fmt (9.1.0)
- glog (0.3.5)
- - hermes-engine (0.74.3):
- - hermes-engine/Pre-built (= 0.74.3)
- - hermes-engine/Pre-built (0.74.3)
+ - hermes-engine (0.74.5):
+ - hermes-engine/Pre-built (= 0.74.5)
+ - hermes-engine/Pre-built (0.74.5)
- libavif/core (0.11.1)
- libavif/libdav1d (0.11.1):
- libavif/core
@@ -82,27 +82,27 @@ PODS:
- DoubleConversion
- fmt (= 9.1.0)
- glog
- - RCTDeprecation (0.74.3)
- - RCTRequired (0.74.3)
- - RCTTypeSafety (0.74.3):
- - FBLazyVector (= 0.74.3)
- - RCTRequired (= 0.74.3)
- - React-Core (= 0.74.3)
- - React (0.74.3):
- - React-Core (= 0.74.3)
- - React-Core/DevSupport (= 0.74.3)
- - React-Core/RCTWebSocket (= 0.74.3)
- - React-RCTActionSheet (= 0.74.3)
- - React-RCTAnimation (= 0.74.3)
- - React-RCTBlob (= 0.74.3)
- - React-RCTImage (= 0.74.3)
- - React-RCTLinking (= 0.74.3)
- - React-RCTNetwork (= 0.74.3)
- - React-RCTSettings (= 0.74.3)
- - React-RCTText (= 0.74.3)
- - React-RCTVibration (= 0.74.3)
- - React-callinvoker (0.74.3)
- - React-Codegen (0.74.3):
+ - RCTDeprecation (0.74.5)
+ - RCTRequired (0.74.5)
+ - RCTTypeSafety (0.74.5):
+ - FBLazyVector (= 0.74.5)
+ - RCTRequired (= 0.74.5)
+ - React-Core (= 0.74.5)
+ - React (0.74.5):
+ - React-Core (= 0.74.5)
+ - React-Core/DevSupport (= 0.74.5)
+ - React-Core/RCTWebSocket (= 0.74.5)
+ - React-RCTActionSheet (= 0.74.5)
+ - React-RCTAnimation (= 0.74.5)
+ - React-RCTBlob (= 0.74.5)
+ - React-RCTImage (= 0.74.5)
+ - React-RCTLinking (= 0.74.5)
+ - React-RCTNetwork (= 0.74.5)
+ - React-RCTSettings (= 0.74.5)
+ - React-RCTText (= 0.74.5)
+ - React-RCTVibration (= 0.74.5)
+ - React-callinvoker (0.74.5)
+ - React-Codegen (0.74.5):
- DoubleConversion
- glog
- hermes-engine
@@ -122,12 +122,12 @@ PODS:
- React-utils
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- - React-Core (0.74.3):
+ - React-Core (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- RCTDeprecation
- - React-Core/Default (= 0.74.3)
+ - React-Core/Default (= 0.74.5)
- React-cxxreact
- React-featureflags
- React-hermes
@@ -139,7 +139,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/CoreModulesHeaders (0.74.3):
+ - React-Core/CoreModulesHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -156,7 +156,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/Default (0.74.3):
+ - React-Core/Default (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -172,13 +172,13 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/DevSupport (0.74.3):
+ - React-Core/DevSupport (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- RCTDeprecation
- - React-Core/Default (= 0.74.3)
- - React-Core/RCTWebSocket (= 0.74.3)
+ - React-Core/Default (= 0.74.5)
+ - React-Core/RCTWebSocket (= 0.74.5)
- React-cxxreact
- React-featureflags
- React-hermes
@@ -190,7 +190,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTActionSheetHeaders (0.74.3):
+ - React-Core/RCTActionSheetHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -207,7 +207,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTAnimationHeaders (0.74.3):
+ - React-Core/RCTAnimationHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -224,7 +224,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTBlobHeaders (0.74.3):
+ - React-Core/RCTBlobHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -241,7 +241,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTImageHeaders (0.74.3):
+ - React-Core/RCTImageHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -258,7 +258,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTLinkingHeaders (0.74.3):
+ - React-Core/RCTLinkingHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -275,7 +275,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTNetworkHeaders (0.74.3):
+ - React-Core/RCTNetworkHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -292,7 +292,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTSettingsHeaders (0.74.3):
+ - React-Core/RCTSettingsHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -309,7 +309,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTTextHeaders (0.74.3):
+ - React-Core/RCTTextHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -326,7 +326,7 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTVibrationHeaders (0.74.3):
+ - React-Core/RCTVibrationHeaders (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -343,12 +343,12 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-Core/RCTWebSocket (0.74.3):
+ - React-Core/RCTWebSocket (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- RCTDeprecation
- - React-Core/Default (= 0.74.3)
+ - React-Core/Default (= 0.74.5)
- React-cxxreact
- React-featureflags
- React-hermes
@@ -360,36 +360,36 @@ PODS:
- React-utils
- SocketRocket (= 0.7.0)
- Yoga
- - React-CoreModules (0.74.3):
+ - React-CoreModules (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- RCT-Folly (= 2024.01.01.00)
- - RCTTypeSafety (= 0.74.3)
+ - RCTTypeSafety (= 0.74.5)
- React-Codegen
- - React-Core/CoreModulesHeaders (= 0.74.3)
- - React-jsi (= 0.74.3)
+ - React-Core/CoreModulesHeaders (= 0.74.5)
+ - React-jsi (= 0.74.5)
- React-jsinspector
- React-NativeModulesApple
- React-RCTBlob
- - React-RCTImage (= 0.74.3)
+ - React-RCTImage (= 0.74.5)
- ReactCommon
- SocketRocket (= 0.7.0)
- - React-cxxreact (0.74.3):
+ - React-cxxreact (0.74.5):
- boost (= 1.83.0)
- DoubleConversion
- fmt (= 9.1.0)
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- - React-callinvoker (= 0.74.3)
- - React-debug (= 0.74.3)
- - React-jsi (= 0.74.3)
+ - React-callinvoker (= 0.74.5)
+ - React-debug (= 0.74.5)
+ - React-jsi (= 0.74.5)
- React-jsinspector
- - React-logger (= 0.74.3)
- - React-perflogger (= 0.74.3)
- - React-runtimeexecutor (= 0.74.3)
- - React-debug (0.74.3)
- - React-Fabric (0.74.3):
+ - React-logger (= 0.74.5)
+ - React-perflogger (= 0.74.5)
+ - React-runtimeexecutor (= 0.74.5)
+ - React-debug (0.74.5)
+ - React-Fabric (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -400,20 +400,20 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/animations (= 0.74.3)
- - React-Fabric/attributedstring (= 0.74.3)
- - React-Fabric/componentregistry (= 0.74.3)
- - React-Fabric/componentregistrynative (= 0.74.3)
- - React-Fabric/components (= 0.74.3)
- - React-Fabric/core (= 0.74.3)
- - React-Fabric/imagemanager (= 0.74.3)
- - React-Fabric/leakchecker (= 0.74.3)
- - React-Fabric/mounting (= 0.74.3)
- - React-Fabric/scheduler (= 0.74.3)
- - React-Fabric/telemetry (= 0.74.3)
- - React-Fabric/templateprocessor (= 0.74.3)
- - React-Fabric/textlayoutmanager (= 0.74.3)
- - React-Fabric/uimanager (= 0.74.3)
+ - React-Fabric/animations (= 0.74.5)
+ - React-Fabric/attributedstring (= 0.74.5)
+ - React-Fabric/componentregistry (= 0.74.5)
+ - React-Fabric/componentregistrynative (= 0.74.5)
+ - React-Fabric/components (= 0.74.5)
+ - React-Fabric/core (= 0.74.5)
+ - React-Fabric/imagemanager (= 0.74.5)
+ - React-Fabric/leakchecker (= 0.74.5)
+ - React-Fabric/mounting (= 0.74.5)
+ - React-Fabric/scheduler (= 0.74.5)
+ - React-Fabric/telemetry (= 0.74.5)
+ - React-Fabric/templateprocessor (= 0.74.5)
+ - React-Fabric/textlayoutmanager (= 0.74.5)
+ - React-Fabric/uimanager (= 0.74.5)
- React-graphics
- React-jsi
- React-jsiexecutor
@@ -422,7 +422,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/animations (0.74.3):
+ - React-Fabric/animations (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -441,7 +441,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/attributedstring (0.74.3):
+ - React-Fabric/attributedstring (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -460,7 +460,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/componentregistry (0.74.3):
+ - React-Fabric/componentregistry (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -479,7 +479,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/componentregistrynative (0.74.3):
+ - React-Fabric/componentregistrynative (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -498,7 +498,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components (0.74.3):
+ - React-Fabric/components (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -509,17 +509,17 @@ PODS:
- React-Core
- React-cxxreact
- React-debug
- - React-Fabric/components/inputaccessory (= 0.74.3)
- - React-Fabric/components/legacyviewmanagerinterop (= 0.74.3)
- - React-Fabric/components/modal (= 0.74.3)
- - React-Fabric/components/rncore (= 0.74.3)
- - React-Fabric/components/root (= 0.74.3)
- - React-Fabric/components/safeareaview (= 0.74.3)
- - React-Fabric/components/scrollview (= 0.74.3)
- - React-Fabric/components/text (= 0.74.3)
- - React-Fabric/components/textinput (= 0.74.3)
- - React-Fabric/components/unimplementedview (= 0.74.3)
- - React-Fabric/components/view (= 0.74.3)
+ - React-Fabric/components/inputaccessory (= 0.74.5)
+ - React-Fabric/components/legacyviewmanagerinterop (= 0.74.5)
+ - React-Fabric/components/modal (= 0.74.5)
+ - React-Fabric/components/rncore (= 0.74.5)
+ - React-Fabric/components/root (= 0.74.5)
+ - React-Fabric/components/safeareaview (= 0.74.5)
+ - React-Fabric/components/scrollview (= 0.74.5)
+ - React-Fabric/components/text (= 0.74.5)
+ - React-Fabric/components/textinput (= 0.74.5)
+ - React-Fabric/components/unimplementedview (= 0.74.5)
+ - React-Fabric/components/view (= 0.74.5)
- React-graphics
- React-jsi
- React-jsiexecutor
@@ -528,7 +528,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/inputaccessory (0.74.3):
+ - React-Fabric/components/inputaccessory (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -547,7 +547,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/legacyviewmanagerinterop (0.74.3):
+ - React-Fabric/components/legacyviewmanagerinterop (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -566,7 +566,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/modal (0.74.3):
+ - React-Fabric/components/modal (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -585,7 +585,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/rncore (0.74.3):
+ - React-Fabric/components/rncore (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -604,7 +604,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/root (0.74.3):
+ - React-Fabric/components/root (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -623,7 +623,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/safeareaview (0.74.3):
+ - React-Fabric/components/safeareaview (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -642,7 +642,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/scrollview (0.74.3):
+ - React-Fabric/components/scrollview (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -661,7 +661,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/text (0.74.3):
+ - React-Fabric/components/text (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -680,7 +680,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/textinput (0.74.3):
+ - React-Fabric/components/textinput (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -699,7 +699,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/unimplementedview (0.74.3):
+ - React-Fabric/components/unimplementedview (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -718,7 +718,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/components/view (0.74.3):
+ - React-Fabric/components/view (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -738,7 +738,7 @@ PODS:
- React-utils
- ReactCommon/turbomodule/core
- Yoga
- - React-Fabric/core (0.74.3):
+ - React-Fabric/core (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -757,7 +757,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/imagemanager (0.74.3):
+ - React-Fabric/imagemanager (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -776,7 +776,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/leakchecker (0.74.3):
+ - React-Fabric/leakchecker (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -795,7 +795,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/mounting (0.74.3):
+ - React-Fabric/mounting (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -814,7 +814,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/scheduler (0.74.3):
+ - React-Fabric/scheduler (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -833,7 +833,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/telemetry (0.74.3):
+ - React-Fabric/telemetry (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -852,7 +852,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/templateprocessor (0.74.3):
+ - React-Fabric/templateprocessor (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -871,7 +871,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/textlayoutmanager (0.74.3):
+ - React-Fabric/textlayoutmanager (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -891,7 +891,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-Fabric/uimanager (0.74.3):
+ - React-Fabric/uimanager (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
@@ -910,45 +910,45 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon/turbomodule/core
- - React-FabricImage (0.74.3):
+ - React-FabricImage (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
- hermes-engine
- RCT-Folly/Fabric (= 2024.01.01.00)
- - RCTRequired (= 0.74.3)
- - RCTTypeSafety (= 0.74.3)
+ - RCTRequired (= 0.74.5)
+ - RCTTypeSafety (= 0.74.5)
- React-Fabric
- React-graphics
- React-ImageManager
- React-jsi
- - React-jsiexecutor (= 0.74.3)
+ - React-jsiexecutor (= 0.74.5)
- React-logger
- React-rendererdebug
- React-utils
- ReactCommon
- Yoga
- - React-featureflags (0.74.3)
- - React-graphics (0.74.3):
+ - React-featureflags (0.74.5)
+ - React-graphics (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
- RCT-Folly/Fabric (= 2024.01.01.00)
- - React-Core/Default (= 0.74.3)
+ - React-Core/Default (= 0.74.5)
- React-utils
- - React-hermes (0.74.3):
+ - React-hermes (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- - React-cxxreact (= 0.74.3)
+ - React-cxxreact (= 0.74.5)
- React-jsi
- - React-jsiexecutor (= 0.74.3)
+ - React-jsiexecutor (= 0.74.5)
- React-jsinspector
- - React-perflogger (= 0.74.3)
+ - React-perflogger (= 0.74.5)
- React-runtimeexecutor
- - React-ImageManager (0.74.3):
+ - React-ImageManager (0.74.5):
- glog
- RCT-Folly/Fabric
- React-Core/Default
@@ -957,44 +957,44 @@ PODS:
- React-graphics
- React-rendererdebug
- React-utils
- - React-jserrorhandler (0.74.3):
+ - React-jserrorhandler (0.74.5):
- RCT-Folly/Fabric (= 2024.01.01.00)
- React-debug
- React-jsi
- React-Mapbuffer
- - React-jsi (0.74.3):
+ - React-jsi (0.74.5):
- boost (= 1.83.0)
- DoubleConversion
- fmt (= 9.1.0)
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- - React-jsiexecutor (0.74.3):
+ - React-jsiexecutor (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- - React-cxxreact (= 0.74.3)
- - React-jsi (= 0.74.3)
+ - React-cxxreact (= 0.74.5)
+ - React-jsi (= 0.74.5)
- React-jsinspector
- - React-perflogger (= 0.74.3)
- - React-jsinspector (0.74.3):
+ - React-perflogger (= 0.74.5)
+ - React-jsinspector (0.74.5):
- DoubleConversion
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- React-featureflags
- React-jsi
- - React-runtimeexecutor (= 0.74.3)
- - React-jsitracing (0.74.3):
+ - React-runtimeexecutor (= 0.74.5)
+ - React-jsitracing (0.74.5):
- React-jsi
- - React-logger (0.74.3):
+ - React-logger (0.74.5):
- glog
- - React-Mapbuffer (0.74.3):
+ - React-Mapbuffer (0.74.5):
- glog
- React-debug
- - react-native-video (6.3.0):
+ - react-native-video (6.6.2):
- DoubleConversion
- glog
- hermes-engine
@@ -1008,7 +1008,7 @@ PODS:
- React-featureflags
- React-graphics
- React-ImageManager
- - react-native-video/Video (= 6.3.0)
+ - react-native-video/Video (= 6.6.2)
- React-NativeModulesApple
- React-RCTFabric
- React-rendererdebug
@@ -1038,7 +1038,7 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- - react-native-video/Video (6.3.0):
+ - react-native-video/Video (6.6.2):
- DoubleConversion
- glog
- hermes-engine
@@ -1059,8 +1059,8 @@ PODS:
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- Yoga
- - React-nativeconfig (0.74.3)
- - React-NativeModulesApple (0.74.3):
+ - React-nativeconfig (0.74.5)
+ - React-NativeModulesApple (0.74.5):
- glog
- hermes-engine
- React-callinvoker
@@ -1071,10 +1071,10 @@ PODS:
- React-runtimeexecutor
- ReactCommon/turbomodule/bridging
- ReactCommon/turbomodule/core
- - React-perflogger (0.74.3)
- - React-RCTActionSheet (0.74.3):
- - React-Core/RCTActionSheetHeaders (= 0.74.3)
- - React-RCTAnimation (0.74.3):
+ - React-perflogger (0.74.5)
+ - React-RCTActionSheet (0.74.5):
+ - React-Core/RCTActionSheetHeaders (= 0.74.5)
+ - React-RCTAnimation (0.74.5):
- RCT-Folly (= 2024.01.01.00)
- RCTTypeSafety
- React-Codegen
@@ -1082,7 +1082,7 @@ PODS:
- React-jsi
- React-NativeModulesApple
- ReactCommon
- - React-RCTAppDelegate (0.74.3):
+ - React-RCTAppDelegate (0.74.5):
- RCT-Folly (= 2024.01.01.00)
- RCTRequired
- RCTTypeSafety
@@ -1106,7 +1106,7 @@ PODS:
- React-runtimescheduler
- React-utils
- ReactCommon
- - React-RCTBlob (0.74.3):
+ - React-RCTBlob (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- hermes-engine
@@ -1119,7 +1119,7 @@ PODS:
- React-NativeModulesApple
- React-RCTNetwork
- ReactCommon
- - React-RCTFabric (0.74.3):
+ - React-RCTFabric (0.74.5):
- glog
- hermes-engine
- RCT-Folly/Fabric (= 2024.01.01.00)
@@ -1139,7 +1139,7 @@ PODS:
- React-runtimescheduler
- React-utils
- Yoga
- - React-RCTImage (0.74.3):
+ - React-RCTImage (0.74.5):
- RCT-Folly (= 2024.01.01.00)
- RCTTypeSafety
- React-Codegen
@@ -1148,14 +1148,14 @@ PODS:
- React-NativeModulesApple
- React-RCTNetwork
- ReactCommon
- - React-RCTLinking (0.74.3):
+ - React-RCTLinking (0.74.5):
- React-Codegen
- - React-Core/RCTLinkingHeaders (= 0.74.3)
- - React-jsi (= 0.74.3)
+ - React-Core/RCTLinkingHeaders (= 0.74.5)
+ - React-jsi (= 0.74.5)
- React-NativeModulesApple
- ReactCommon
- - ReactCommon/turbomodule/core (= 0.74.3)
- - React-RCTNetwork (0.74.3):
+ - ReactCommon/turbomodule/core (= 0.74.5)
+ - React-RCTNetwork (0.74.5):
- RCT-Folly (= 2024.01.01.00)
- RCTTypeSafety
- React-Codegen
@@ -1163,7 +1163,7 @@ PODS:
- React-jsi
- React-NativeModulesApple
- ReactCommon
- - React-RCTSettings (0.74.3):
+ - React-RCTSettings (0.74.5):
- RCT-Folly (= 2024.01.01.00)
- RCTTypeSafety
- React-Codegen
@@ -1171,23 +1171,23 @@ PODS:
- React-jsi
- React-NativeModulesApple
- ReactCommon
- - React-RCTText (0.74.3):
- - React-Core/RCTTextHeaders (= 0.74.3)
+ - React-RCTText (0.74.5):
+ - React-Core/RCTTextHeaders (= 0.74.5)
- Yoga
- - React-RCTVibration (0.74.3):
+ - React-RCTVibration (0.74.5):
- RCT-Folly (= 2024.01.01.00)
- React-Codegen
- React-Core/RCTVibrationHeaders
- React-jsi
- React-NativeModulesApple
- ReactCommon
- - React-rendererdebug (0.74.3):
+ - React-rendererdebug (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- RCT-Folly (= 2024.01.01.00)
- React-debug
- - React-rncore (0.74.3)
- - React-RuntimeApple (0.74.3):
+ - React-rncore (0.74.5)
+ - React-RuntimeApple (0.74.5):
- hermes-engine
- RCT-Folly/Fabric (= 2024.01.01.00)
- React-callinvoker
@@ -1205,7 +1205,7 @@ PODS:
- React-runtimeexecutor
- React-RuntimeHermes
- React-utils
- - React-RuntimeCore (0.74.3):
+ - React-RuntimeCore (0.74.5):
- glog
- hermes-engine
- RCT-Folly/Fabric (= 2024.01.01.00)
@@ -1218,9 +1218,9 @@ PODS:
- React-runtimeexecutor
- React-runtimescheduler
- React-utils
- - React-runtimeexecutor (0.74.3):
- - React-jsi (= 0.74.3)
- - React-RuntimeHermes (0.74.3):
+ - React-runtimeexecutor (0.74.5):
+ - React-jsi (= 0.74.5)
+ - React-RuntimeHermes (0.74.5):
- hermes-engine
- RCT-Folly/Fabric (= 2024.01.01.00)
- React-featureflags
@@ -1231,7 +1231,7 @@ PODS:
- React-nativeconfig
- React-RuntimeCore
- React-utils
- - React-runtimescheduler (0.74.3):
+ - React-runtimescheduler (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
@@ -1243,56 +1243,56 @@ PODS:
- React-rendererdebug
- React-runtimeexecutor
- React-utils
- - React-utils (0.74.3):
+ - React-utils (0.74.5):
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- React-debug
- - React-jsi (= 0.74.3)
- - ReactCommon (0.74.3):
- - ReactCommon/turbomodule (= 0.74.3)
- - ReactCommon/turbomodule (0.74.3):
+ - React-jsi (= 0.74.5)
+ - ReactCommon (0.74.5):
+ - ReactCommon/turbomodule (= 0.74.5)
+ - ReactCommon/turbomodule (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- - React-callinvoker (= 0.74.3)
- - React-cxxreact (= 0.74.3)
- - React-jsi (= 0.74.3)
- - React-logger (= 0.74.3)
- - React-perflogger (= 0.74.3)
- - ReactCommon/turbomodule/bridging (= 0.74.3)
- - ReactCommon/turbomodule/core (= 0.74.3)
- - ReactCommon/turbomodule/bridging (0.74.3):
+ - React-callinvoker (= 0.74.5)
+ - React-cxxreact (= 0.74.5)
+ - React-jsi (= 0.74.5)
+ - React-logger (= 0.74.5)
+ - React-perflogger (= 0.74.5)
+ - ReactCommon/turbomodule/bridging (= 0.74.5)
+ - ReactCommon/turbomodule/core (= 0.74.5)
+ - ReactCommon/turbomodule/bridging (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- - React-callinvoker (= 0.74.3)
- - React-cxxreact (= 0.74.3)
- - React-jsi (= 0.74.3)
- - React-logger (= 0.74.3)
- - React-perflogger (= 0.74.3)
- - ReactCommon/turbomodule/core (0.74.3):
+ - React-callinvoker (= 0.74.5)
+ - React-cxxreact (= 0.74.5)
+ - React-jsi (= 0.74.5)
+ - React-logger (= 0.74.5)
+ - React-perflogger (= 0.74.5)
+ - ReactCommon/turbomodule/core (0.74.5):
- DoubleConversion
- fmt (= 9.1.0)
- glog
- hermes-engine
- RCT-Folly (= 2024.01.01.00)
- - React-callinvoker (= 0.74.3)
- - React-cxxreact (= 0.74.3)
- - React-debug (= 0.74.3)
- - React-jsi (= 0.74.3)
- - React-logger (= 0.74.3)
- - React-perflogger (= 0.74.3)
- - React-utils (= 0.74.3)
+ - React-callinvoker (= 0.74.5)
+ - React-cxxreact (= 0.74.5)
+ - React-debug (= 0.74.5)
+ - React-jsi (= 0.74.5)
+ - React-logger (= 0.74.5)
+ - React-perflogger (= 0.74.5)
+ - React-utils (= 0.74.5)
- RNCPicker (2.7.5):
- React-Core
- - SDWebImage (5.19.2):
- - SDWebImage/Core (= 5.19.2)
- - SDWebImage/Core (5.19.2)
+ - SDWebImage (5.19.7):
+ - SDWebImage/Core (= 5.19.7)
+ - SDWebImage/Core (5.19.7)
- SDWebImageAVIFCoder (0.11.0):
- libavif/core (>= 0.11.0)
- SDWebImage (~> 5.10)
@@ -1521,76 +1521,76 @@ SPEC CHECKSUMS:
boost: d3f49c53809116a5d38da093a8aa78bf551aed09
DoubleConversion: 76ab83afb40bddeeee456813d9c04f67f78771b5
EXConstants: 409690fbfd5afea964e5e9d6c4eb2c2b59222c59
- Expo: 675a5642b5860771507237259da50b921c03a9f3
+ Expo: 33132a667698a3259a4e6c0af1b4936388e5fa33
ExpoAsset: 323700f291684f110fb55f0d4022a3362ea9f875
ExpoFileSystem: 80bfe850b1f9922c16905822ecbf97acd711dc51
- ExpoFont: 43b69559cef3d773db57c7ae7edd3cb0aa0dc610
- ExpoImage: 2ccccff1219ebc765e344f3338f2430af2df4824
+ ExpoFont: 00756e6c796d8f7ee8d211e29c8b619e75cbf238
+ ExpoImage: f77df382153d716f332f974438a803c4527f60b0
ExpoKeepAwake: 3b8815d9dd1d419ee474df004021c69fdd316d08
- ExpoModulesCore: b2fa8cc3c12f0ba45a9ae125c0e3bcad04f3fb7b
- FBLazyVector: 7e977dd099937dc5458851233141583abba49ff2
+ ExpoModulesCore: db3e31e694684f08223d713e89f7648c6d3e04d0
+ FBLazyVector: ac12dc084d1c8ec4cc4d7b3cf1b0ebda6dab85af
fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120
glog: fdfdfe5479092de0c4bdbebedd9056951f092c4f
- hermes-engine: 1f547997900dd0752dc0cc0ae6dd16173c49e09b
+ hermes-engine: 8c1577f3fdb849cbe7729c2e7b5abc4b845e88f8
libavif: 84bbb62fb232c3018d6f1bab79beea87e35de7b7
libdav1d: 23581a4d8ec811ff171ed5e2e05cd27bad64c39f
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
RCT-Folly: 02617c592a293bd6d418e0a88ff4ee1f88329b47
- RCTDeprecation: 4c7eeb42be0b2e95195563c49be08d0b839d22b4
- RCTRequired: d530a0f489699c8500e944fde963102c42dcd0c2
- RCTTypeSafety: b20878506b094fa3d9007d7b9e4be0faa3562499
- React: 2f9da0177233f60fa3462d83fcccde245759f81a
- React-callinvoker: d0205f0dcebf72ec27263ab41e3a5ad827ed503f
- React-Codegen: 27212e14727ad7d6d9fd1b1967fbf21929e4ce29
- React-Core: 690ebbbf8f8dcfba6686ce8927731d3f025c3114
- React-CoreModules: 185da31f5eb2e6043c3d19b10c64c4661322ed6a
- React-cxxreact: c53d2ac9246235351086b8c588feaf775b4ec7f7
- React-debug: 40caf8ab4c0fd3afe831912e3d4d0e7303eecc5d
- React-Fabric: 51ccb4f7e45df5837e796f339d602737063c463e
- React-FabricImage: 376b7a81bfe64102e7da5fc85cd1775638584c92
- React-featureflags: 0d0576ae8306801a8a660b36afcdbda04dd7cc12
- React-graphics: e0e6b8fbb1c5968c70d3584dccec42544b769b60
- React-hermes: 917b7ab4c3cb9204c2ad020d74f313830097148b
- React-ImageManager: 5cebcc0136f3b309c7f5189b96e6c0ebd0ec8192
- React-jserrorhandler: 5dc7e036cba3b7d167380c02afabf818ad0b2f98
- React-jsi: 024b933267079f80c30a5cae97bf5ce521217505
- React-jsiexecutor: 45cb079c87db3f514da3acfc686387a0e01de5c5
- React-jsinspector: c9551971f1298163c93e2bfb082c2b4245618fc6
- React-jsitracing: 1aa5681c353b41573b03e0e480a5adf5fa1c56d8
- React-logger: fa92ba4d3a5d39ac450f59be2a3cec7b099f0304
- React-Mapbuffer: 70da5955150a58732e9336a0c7e71cd49e909f25
- react-native-video: c44719c9a5261ad54fdad49e6dd0e98439e0e1b3
+ RCTDeprecation: 3afceddffa65aee666dafd6f0116f1d975db1584
+ RCTRequired: ec1239bc9d8bf63e10fb92bd8b26171a9258e0c1
+ RCTTypeSafety: f5ecbc86c5c5fa163c05acb7a1c5012e15b5f994
+ React: fc9fa7258eff606f44d58c5b233a82dc9cf09018
+ React-callinvoker: e3fab14d69607fb7e8e3a57e5a415aed863d3599
+ React-Codegen: bd1a15f54af401efee5f439aa6fd420b10550125
+ React-Core: 3a5fd9e781cecf87803e5b091496a606a3df774a
+ React-CoreModules: cbf4707dafab8f9f826ac0c63a07d0bf5d01e256
+ React-cxxreact: 7b188556271e3c7fdf22a04819f6a6225045b9dd
+ React-debug: 2d6f912c0c4c91a9fde617d8425088af7315c10b
+ React-Fabric: 47ff62e0c7f017606585327f6016190625295c5e
+ React-FabricImage: 823627aa521b4ecc896334f0dbf2bc8376edbf1e
+ React-featureflags: 2a4555681de0d4b683d98d7e9fd7bdf9e9ce1aa2
+ React-graphics: edbd2a6c018b2e2d541ab8cb886cc31babf14646
+ React-hermes: a7054fbcbda3957e3c5eaad06ef9bf79998d535a
+ React-ImageManager: 314824c4bb6f152699724dc9eb3ce544b87048bd
+ React-jserrorhandler: fffe10523886a352161ef492af2063651721c8ee
+ React-jsi: f3ce1dd2e950b6ad12b65ea3ef89168f1b94c584
+ React-jsiexecutor: b4df3a27973d82f9abf3c4bd0f88e042cda25f16
+ React-jsinspector: 2ea90b8e53970a1fea1449fb8e6419e21ca79867
+ React-jsitracing: c83efb63c8e9e1dff72a3c56e88ae1c530a87795
+ React-logger: 257858bd55f3a4e1bc0cf07ddc8fb9faba6f8c7c
+ React-Mapbuffer: dce508662b995ffefd29e278a16b78217039d43d
+ react-native-video: b52a7473fd467d8c18032535ec5f332b81f9bdf0
react-native-video-plugin-sample: d3a93b7ad777cad7fa2c30473de75a2635ce5feb
- React-nativeconfig: 84806b820491db30175afbf027e99e8415dc63f0
- React-NativeModulesApple: 7b79212f8cf496ab554e0b7b09acbd4aa4690260
- React-perflogger: 7bb9ba49435ff66b666e7966ee10082508a203e8
- React-RCTActionSheet: a2816ae2b5c8523c2bc18a8f874a724a096e6d97
- React-RCTAnimation: e78f52d7422bac13e1213e25e9bcbf99be872e1a
- React-RCTAppDelegate: 24f46de486cfa3a9f46e4b0786eaf17d92e1e0c6
- React-RCTBlob: 9f9d6599d1b00690704dadc4a4bc33a7e76938be
- React-RCTFabric: 416d20a24b117a7ec7d32088fc8f359b5e558fa7
- React-RCTImage: 39dd5aee6b92213845e1e7a7c41865801dc33493
- React-RCTLinking: 35d742a982f901f9ea416d772763e2da65c2dc7d
- React-RCTNetwork: b078576c0c896c71905f841716b9f9f5922111dc
- React-RCTSettings: 900aab52b5b1212f247c2944d88f4defbf6146f2
- React-RCTText: a3895ab4e5df4a5fd41b6f059eed484a0c7016d1
- React-RCTVibration: ab4912e1427d8de00ef89e9e6582094c4c25dc05
- React-rendererdebug: 8ea55aebb8cba804db2a8449a2f0c80ccfe0ce5a
- React-rncore: 1f725aee4e00c317e51cb4d37aca7f6a47da9a11
- React-RuntimeApple: c1833d8e82f7c5314c001d61d289849c75217944
- React-RuntimeCore: 0a5b37b50737af3505b5801376ae5788532c013e
- React-runtimeexecutor: 69cab8ddf409de6d6a855a71c8af9e7290c4e55b
- React-RuntimeHermes: 44847ba3e8a9394b9829d9a9abde7590624f32d0
- React-runtimescheduler: e4ad653e1d2f5ff40ba047446cacde009694f0ed
- React-utils: 6f7ac39d9a0de447d4334bb25d144a28c0c5d8c9
- ReactCommon: 4a09c7d8a06e93c1e2e988a3b9f3db3d2449f2fc
+ React-nativeconfig: f326487bc61eba3f0e328da6efb2711533dcac46
+ React-NativeModulesApple: d89733f5baed8b9249ca5a8e497d63c550097312
+ React-perflogger: ed4e0c65781521e0424f2e5e40b40cc7879d737e
+ React-RCTActionSheet: 49d53ff03bb5688ca4606c55859053a0cd129ea5
+ React-RCTAnimation: 07b4923885c52c397c4ec103924bf6e53b42c73e
+ React-RCTAppDelegate: 316e295076734baf9bdf1bfac7d92ab647aed930
+ React-RCTBlob: 85c57b0d5e667ff8a472163ba3af0628171a64bb
+ React-RCTFabric: 62695e345da7c451b05a131f0c6ba80367dbd5c3
+ React-RCTImage: b965c85bec820e2a9c154b1fb00a2ecdd59a9c92
+ React-RCTLinking: 75f04a5f27c26c4e73a39c50df470820d219df79
+ React-RCTNetwork: c1a9143f4d5778efc92da40d83969d03912ccc24
+ React-RCTSettings: c6800f91c0ecd48868cd5db754b0b0a7f5ffe039
+ React-RCTText: b923e24f9b7250bc4f7ab154c4168ad9f8d8fc9d
+ React-RCTVibration: 08c4f0c917c435b3619386c25a94ee5d64c250f0
+ React-rendererdebug: fac75dc155e1202cfc187485a6e4f6e842fcc5c7
+ React-rncore: 12dc32f08f195e573e9d969a348b976a3d057bbc
+ React-RuntimeApple: 5c7591dd19de1c7fefe8e61cf934d8f8f9fc0409
+ React-RuntimeCore: ec3c8be706ca2e4607eb8c675d32512352501f9e
+ React-runtimeexecutor: 0e688aefc14c6bc8601f4968d8d01c3fb6446844
+ React-RuntimeHermes: df243bd7c8d4ba3bd237ce6ded22031e02d37908
+ React-runtimescheduler: db7189185a2e5912b0d17194302e501f801a381e
+ React-utils: 3f1fcffc14893afb9a7e5b7c736353873cc5fc95
+ ReactCommon: f79ae672224dc1e6c2d932062176883c98eebd57
RNCPicker: 3e2c37a8328f368ce14da050cdc8231deb5fc9f9
- SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a
+ SDWebImage: 8a6b7b160b4d710e2a22b6900e25301075c34cb3
SDWebImageAVIFCoder: 00310d246aab3232ce77f1d8f0076f8c4b021d90
SDWebImageSVGCoder: 15a300a97ec1c8ac958f009c02220ac0402e936c
SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d
- Yoga: eed50599a85bd9f6882a9938d118aed6a397db9c
+ Yoga: 1ab23c1835475da69cf14e211a560e73aab24cb0
PODFILE CHECKSUM: a73d485df51877001f2b04a5a4379cfa5a3ba8fa
diff --git a/examples/basic/package.json b/examples/basic/package.json
index 2843b526..d3e5cf21 100644
--- a/examples/basic/package.json
+++ b/examples/basic/package.json
@@ -16,14 +16,15 @@
"dependencies": {
"@expo/metro-runtime": "~3.2.1",
"@react-native-picker/picker": "2.7.5",
- "expo": "^51.0.17",
- "expo-asset": "^10.0.9",
- "expo-image": "^1.12.12",
+ "expo": "^51.0.32",
+ "expo-asset": "~10.0.10",
+ "expo-image": "^1.12.15",
+ "expo-navigation-bar": "~3.0.7",
"react": "18.2.0",
- "react-native": "0.74.3",
+ "react-native": "0.74.5",
"react-dom": "18.2.0",
"react-native-web": "~0.19.10",
- "react-native-windows": "0.74.1"
+ "react-native-windows": "0.74.19"
},
"devDependencies": {
"@babel/core": "^7.24.0",
diff --git a/examples/basic/src/VideoPlayer.tsx b/examples/basic/src/VideoPlayer.tsx
index 76d7c65c..dfe2552f 100644
--- a/examples/basic/src/VideoPlayer.tsx
+++ b/examples/basic/src/VideoPlayer.tsx
@@ -1,8 +1,8 @@
'use strict';
-import React, {type FC, useCallback, useRef, useState} from 'react';
+import React, {type FC, useCallback, useRef, useState, useEffect} from 'react';
-import {Platform, TouchableOpacity, View} from 'react-native';
+import {Platform, TouchableOpacity, View, StatusBar} from 'react-native';
import Video, {
VideoRef,
@@ -26,23 +26,24 @@ import Video, {
type OnPlaybackRateChangeData,
type OnVideoTracksData,
type ReactVideoSource,
- type TextTracks,
type VideoTrack,
type SelectedTrack,
type SelectedVideoTrack,
type EnumValues,
+ OnBandwidthUpdateData,
+ ControlsStyles,
} from 'react-native-video';
import styles from './styles';
import {type AdditionalSourceInfo} from './types';
-import {bufferConfig, srcList, textTracksSelectionBy} from './constants';
-import {Overlay, toast} from './components';
-
-type AdditionnalSourceInfo = {
- textTracks: TextTracks;
- adTagUrl: string;
- description: string;
- noView: boolean;
-};
+import {
+ bufferConfig,
+ isAndroid,
+ srcList,
+ textTracksSelectionBy,
+ audioTracksSelectionBy,
+} from './constants';
+import {Overlay, toast, VideoLoader} from './components';
+import * as NavigationBar from 'expo-navigation-bar';
type Props = NonNullable;
@@ -76,7 +77,7 @@ const VideoPlayer: FC = ({}) => {
const [repeat, setRepeat] = useState(false);
const [controls, setControls] = useState(false);
const [useCache, setUseCache] = useState(false);
- const [poster, setPoster] = useState(undefined);
+ const [showPoster, setShowPoster] = useState(false);
const [showNotificationControls, setShowNotificationControls] =
useState(false);
const [isSeeking, setIsSeeking] = useState(false);
@@ -111,19 +112,30 @@ const VideoPlayer: FC = ({}) => {
goToChannel((srcListId + srcList.length - 1) % srcList.length);
}, [goToChannel, srcListId]);
+ useEffect(() => {
+ if (isAndroid) {
+ NavigationBar.setVisibilityAsync('visible');
+ }
+ }, []);
+
const onAudioTracks = (data: OnAudioTracksData) => {
+ console.log('onAudioTracks', data);
const selectedTrack = data.audioTracks?.find((x: AudioTrack) => {
return x.selected;
});
- if (selectedTrack?.index) {
- setAudioTracks(data.audioTracks);
- setSelectedAudioTrack({
- type: SelectedTrackType.INDEX,
- value: selectedTrack.index,
- });
- } else {
- setAudioTracks(data.audioTracks);
+ let value;
+ if (audioTracksSelectionBy === SelectedTrackType.INDEX) {
+ value = selectedTrack?.index;
+ } else if (audioTracksSelectionBy === SelectedTrackType.LANGUAGE) {
+ value = selectedTrack?.language;
+ } else if (audioTracksSelectionBy === SelectedTrackType.TITLE) {
+ value = selectedTrack?.title;
}
+ setAudioTracks(data.audioTracks);
+ setSelectedAudioTrack({
+ type: audioTracksSelectionBy,
+ value: value,
+ });
};
const onVideoTracks = (data: OnVideoTracksData) => {
@@ -136,22 +148,19 @@ const VideoPlayer: FC = ({}) => {
return x?.selected;
});
- if (selectedTrack?.language) {
- setTextTracks(data.textTracks);
- if (textTracksSelectionBy === 'index') {
- setSelectedTextTrack({
- type: SelectedTrackType.INDEX,
- value: selectedTrack?.index,
- });
- } else {
- setSelectedTextTrack({
- type: SelectedTrackType.LANGUAGE,
- value: selectedTrack?.language,
- });
- }
- } else {
- setTextTracks(data.textTracks);
+ setTextTracks(data.textTracks);
+ let value;
+ if (textTracksSelectionBy === SelectedTrackType.INDEX) {
+ value = selectedTrack?.index;
+ } else if (textTracksSelectionBy === SelectedTrackType.LANGUAGE) {
+ value = selectedTrack?.language;
+ } else if (textTracksSelectionBy === SelectedTrackType.TITLE) {
+ value = selectedTrack?.title;
}
+ setSelectedTextTrack({
+ type: textTracksSelectionBy,
+ value: value,
+ });
};
const onLoad = (data: OnLoadData) => {
@@ -221,28 +230,48 @@ const VideoPlayer: FC = ({}) => {
console.log('onPlaybackStateChanged', data);
};
+ const onVideoBandwidthUpdate = (data: OnBandwidthUpdateData) => {
+ console.log('onVideoBandwidthUpdate', data);
+ };
+
const onFullScreenExit = () => {
// iOS pauses video on exit from full screen
Platform.OS === 'ios' && setPaused(true);
};
+ const _renderLoader = showPoster ? () => : undefined;
+
+ const _subtitleStyle = {subtitlesFollowVideo: true};
+ const _controlsStyles : ControlsStyles = {
+ hideNavigationBarOnFullScreenMode: true,
+ hideNotificationBarOnFullScreenMode: true,
+ liveLabel: "LIVE"
+ };
+ const _bufferConfig = {
+ ...bufferConfig,
+ cacheSizeMB: useCache ? 200 : 0,
+ };
+
+ useEffect(() => {
+ videoRef.current?.setSource(currentSrc)
+ }, [currentSrc])
+
return (
+
+
{(srcList[srcListId] as AdditionalSourceInfo)?.noView ? null : (
= ({}) => {
onAspectRatio={onAspectRatio}
onReadyForDisplay={onReadyForDisplay}
onBuffer={onVideoBuffer}
+ onBandwidthUpdate={onVideoBandwidthUpdate}
onSeek={onSeek}
repeat={repeat}
selectedTextTrack={selectedTextTrack}
selectedAudioTrack={selectedAudioTrack}
selectedVideoTrack={selectedVideoTrack}
playInBackground={false}
- bufferConfig={{
- ...bufferConfig,
- cacheSizeMB: useCache ? 200 : 0,
- }}
+ bufferConfig={_bufferConfig}
preventsDisplaySleepDuringVideoPlayback={true}
- poster={poster}
+ renderLoader={_renderLoader}
onPlaybackRateChange={onPlaybackRateChange}
onPlaybackStateChanged={onPlaybackStateChanged}
bufferingStrategy={BufferingStrategyType.DEFAULT}
debug={{enable: true, thread: true}}
+ subtitleStyle={_subtitleStyle}
+ controlsStyles={_controlsStyles}
/>
)}
@@ -302,7 +331,7 @@ const VideoPlayer: FC = ({}) => {
paused={paused}
volume={volume}
setControls={setControls}
- poster={poster}
+ showPoster={showPoster}
rate={rate}
setFullscreen={setFullscreen}
setPaused={setPaused}
@@ -311,7 +340,7 @@ const VideoPlayer: FC = ({}) => {
setIsSeeking={setIsSeeking}
repeat={repeat}
setRepeat={setRepeat}
- setPoster={setPoster}
+ setShowPoster={setShowPoster}
setRate={setRate}
setResizeMode={setResizeMode}
setShowNotificationControls={setShowNotificationControls}
diff --git a/examples/basic/src/components/AudioTracksSelector.tsx b/examples/basic/src/components/AudioTracksSelector.tsx
index 02b72f54..d0e10059 100644
--- a/examples/basic/src/components/AudioTracksSelector.tsx
+++ b/examples/basic/src/components/AudioTracksSelector.tsx
@@ -1,19 +1,25 @@
import {Picker} from '@react-native-picker/picker';
import {Text} from 'react-native';
-import type {AudioTrack, SelectedTrack} from 'react-native-video';
+import {
+ SelectedTrackType,
+ type AudioTrack,
+ type SelectedTrack,
+} from 'react-native-video';
import styles from '../styles';
import React from 'react';
export interface AudioTrackSelectorType {
audioTracks: Array;
selectedAudioTrack: SelectedTrack | undefined;
- onValueChange: (arg0: string) => void;
+ onValueChange: (arg0: string | number) => void;
+ audioTracksSelectionBy: SelectedTrackType;
}
export const AudioTrackSelector = ({
audioTracks,
selectedAudioTrack,
onValueChange,
+ audioTracksSelectionBy,
}: AudioTrackSelectorType) => {
return (
<>
@@ -25,7 +31,7 @@ export const AudioTrackSelector = ({
onValueChange={itemValue => {
if (itemValue !== 'empty') {
console.log('on audio value change ' + itemValue);
- onValueChange(`${itemValue}`);
+ onValueChange(itemValue);
}
}}>
{audioTracks?.length <= 0 ? (
@@ -37,11 +43,19 @@ export const AudioTrackSelector = ({
if (!track) {
return;
}
+ let value;
+ if (audioTracksSelectionBy === SelectedTrackType.INDEX) {
+ value = track.index;
+ } else if (audioTracksSelectionBy === SelectedTrackType.LANGUAGE) {
+ value = track.language;
+ } else if (audioTracksSelectionBy === SelectedTrackType.TITLE) {
+ value = track.title;
+ }
return (
);
})}
diff --git a/examples/basic/src/components/Indicator.tsx b/examples/basic/src/components/Indicator.tsx
index 50b781a2..68691672 100644
--- a/examples/basic/src/components/Indicator.tsx
+++ b/examples/basic/src/components/Indicator.tsx
@@ -1,22 +1,8 @@
-import React, {FC, memo} from 'react';
-import {ActivityIndicator, View} from 'react-native';
-import styles from '../styles.tsx';
+import React, {memo} from 'react';
+import {ActivityIndicator} from 'react-native';
-type Props = {
- isLoading: boolean;
-};
-
-const _Indicator: FC = ({isLoading}) => {
- if (!isLoading) {
- return ;
- }
- return (
-
- );
+const _Indicator = () => {
+ return ;
};
export const Indicator = memo(_Indicator);
diff --git a/examples/basic/src/MultiValueControl.tsx b/examples/basic/src/components/MultiValueControl.tsx
similarity index 95%
rename from examples/basic/src/MultiValueControl.tsx
rename to examples/basic/src/components/MultiValueControl.tsx
index d9298ec3..99195b8d 100644
--- a/examples/basic/src/MultiValueControl.tsx
+++ b/examples/basic/src/components/MultiValueControl.tsx
@@ -21,7 +21,7 @@ interface MultiValueControlType {
onPress: (arg: T) => void;
}
-const MultiValueControl = ({
+export const MultiValueControl = ({
values,
selected,
onPress,
diff --git a/examples/basic/src/components/Overlay.tsx b/examples/basic/src/components/Overlay.tsx
index d8c4da02..8af4d7a7 100644
--- a/examples/basic/src/components/Overlay.tsx
+++ b/examples/basic/src/components/Overlay.tsx
@@ -5,19 +5,14 @@ import React, {
type Dispatch,
type SetStateAction,
} from 'react';
-import {Indicator} from './Indicator.tsx';
import {View} from 'react-native';
import styles from '../styles.tsx';
-import ToggleControl from '../ToggleControl.tsx';
import {
isAndroid,
isIos,
- samplePoster,
textTracksSelectionBy,
+ audioTracksSelectionBy,
} from '../constants';
-import MultiValueControl, {
- type MultiValueControlPropType,
-} from '../MultiValueControl.tsx';
import {
ResizeMode,
VideoRef,
@@ -31,14 +26,15 @@ import {
type VideoTrack,
type AudioTrack,
} from 'react-native-video';
-import {
- toast,
- Seeker,
- AudioTrackSelector,
- TextTrackSelector,
- VideoTrackSelector,
- TopControl,
-} from '../components';
+
+import {toast} from './Toast';
+import {Seeker} from './Seeker';
+import {AudioTrackSelector} from './AudioTracksSelector';
+import {VideoTrackSelector} from './VideoTracksSelector';
+import {TextTrackSelector} from './TextTracksSelector';
+import {TopControl} from './TopControl';
+import {ToggleControl} from './ToggleControl';
+import {MultiValueControl} from './MultiValueControl';
type Props = {
channelDown: () => void;
@@ -69,8 +65,8 @@ type Props = {
setPaused: Dispatch>;
repeat: boolean;
setRepeat: Dispatch>;
- poster: string | undefined;
- setPoster: Dispatch>;
+ showPoster: boolean;
+ setShowPoster: Dispatch>;
muted: boolean;
setMuted: Dispatch>;
currentTime: number;
@@ -108,8 +104,8 @@ const _Overlay = forwardRef((props, ref) => {
setPaused,
setRepeat,
repeat,
- setPoster,
- poster,
+ setShowPoster,
+ showPoster,
setMuted,
muted,
duration,
@@ -157,27 +153,20 @@ const _Overlay = forwardRef((props, ref) => {
setShowNotificationControls(prev => !prev);
};
- const onSelectedAudioTrackChange = (itemValue: string) => {
+ const onSelectedAudioTrackChange = (itemValue: string | number) => {
console.log('on audio value change ' + itemValue);
if (itemValue === 'none') {
setSelectedAudioTrack({
type: SelectedTrackType.DISABLED,
});
} else {
- setSelectedAudioTrack({
- type: SelectedTrackType.INDEX,
- value: itemValue,
- });
+ setSelectedAudioTrack({type: audioTracksSelectionBy, value: itemValue});
}
};
const onSelectedTextTrackChange = (itemValue: string) => {
console.log('on value change ' + itemValue);
- const type =
- textTracksSelectionBy === 'index'
- ? SelectedTrackType.INDEX
- : SelectedTrackType.LANGUAGE;
- setSelectedTextTrack({type, value: itemValue});
+ setSelectedTextTrack({type: textTracksSelectionBy, value: itemValue});
};
const onSelectedVideoTrackChange = (itemValue: string) => {
@@ -217,14 +206,12 @@ const _Overlay = forwardRef((props, ref) => {
const toggleRepeat = () => setRepeat(prev => !prev);
- const togglePoster = () =>
- setPoster(prev => (prev ? undefined : samplePoster));
+ const togglePoster = () => setShowPoster(prev => !prev);
const toggleMuted = () => setMuted(prev => !prev);
return (
<>
-
((props, ref) => {
((props, ref) => {
audioTracks={audioTracks}
selectedAudioTrack={selectedAudioTrack}
onValueChange={onSelectedAudioTrackChange}
+ audioTracksSelectionBy={audioTracksSelectionBy}
/>
- );
- } else {
- return (
-
- );
+ let value;
+ if (textTracksSelectionBy === SelectedTrackType.INDEX) {
+ value = track.index;
+ } else if (textTracksSelectionBy === SelectedTrackType.LANGUAGE) {
+ value = track.language;
+ } else if (textTracksSelectionBy === SelectedTrackType.TITLE) {
+ value = track.title;
}
+ return ;
})}
>
diff --git a/examples/basic/src/ToggleControl.tsx b/examples/basic/src/components/ToggleControl.tsx
similarity index 97%
rename from examples/basic/src/ToggleControl.tsx
rename to examples/basic/src/components/ToggleControl.tsx
index fd5f83a5..3757f155 100644
--- a/examples/basic/src/ToggleControl.tsx
+++ b/examples/basic/src/components/ToggleControl.tsx
@@ -25,7 +25,7 @@ interface ToggleControlType {
onPress: () => void;
}
-const ToggleControl = ({
+export const ToggleControl = ({
isSelected,
selectedText,
unselectedText,
diff --git a/examples/basic/src/components/VideoLoader.tsx b/examples/basic/src/components/VideoLoader.tsx
new file mode 100644
index 00000000..9071c707
--- /dev/null
+++ b/examples/basic/src/components/VideoLoader.tsx
@@ -0,0 +1,15 @@
+import {Text, View} from 'react-native';
+import {Indicator} from './Indicator.tsx';
+import React, {memo} from 'react';
+import styles from '../styles.tsx';
+
+const _VideoLoader = () => {
+ return (
+
+ Loading...
+
+
+ );
+};
+
+export const VideoLoader = memo(_VideoLoader);
diff --git a/examples/basic/src/components/index.ts b/examples/basic/src/components/index.ts
index c4ac83b5..70b755d4 100644
--- a/examples/basic/src/components/index.ts
+++ b/examples/basic/src/components/index.ts
@@ -1,3 +1,4 @@
+export * from './VideoLoader';
export * from './Indicator';
export * from './Seeker';
export * from './AudioTracksSelector';
@@ -6,3 +7,5 @@ export * from './TextTracksSelector';
export * from './Overlay';
export * from './TopControl';
export * from './Toast';
+export * from './ToggleControl';
+export * from './MultiValueControl';
diff --git a/examples/basic/src/constants/general.ts b/examples/basic/src/constants/general.ts
index 4eb82228..3db84749 100644
--- a/examples/basic/src/constants/general.ts
+++ b/examples/basic/src/constants/general.ts
@@ -2,13 +2,19 @@ import {
BufferConfig,
DRMType,
ISO639_1,
+ SelectedTrackType,
TextTrackType,
} from 'react-native-video';
import {SampleVideoSource} from '../types';
import {localeVideo} from '../assets';
import {Platform} from 'react-native';
-export const textTracksSelectionBy = 'index';
+// This constant allows to change how the sample behaves regarding to audio and texts selection.
+// You can change it to change how selector will use tracks information.
+// by default, index will be displayed and index will be applied to selected tracks.
+// You can also use LANGUAGE or TITLE
+export const textTracksSelectionBy = SelectedTrackType.INDEX;
+export const audioTracksSelectionBy = SelectedTrackType.INDEX;
export const isIos = Platform.OS === 'ios';
@@ -25,6 +31,10 @@ export const srcAllPlatformList = [
cropStart: 3000,
cropEnd: 10000,
},
+ {
+ description: 'video with 90° rotation',
+ uri: 'https://bn-dev.fra1.digitaloceanspaces.com/km-tournament/uploads/rn_image_picker_lib_temp_2ee86a27_9312_4548_84af_7fd75d9ad4dd_ad8b20587a.mp4',
+ },
{
description: 'local file portrait',
uri: localeVideo.portrait,
@@ -86,6 +96,11 @@ export const srcAllPlatformList = [
uri: 'https://bitmovin-a.akamaihd.net/content/sintel/hls/playlist.m3u8',
startPosition: 50000,
},
+ {
+ description: 'mp3 with texttrack',
+ uri: 'https://traffic.libsyn.com/democracynow/wx2024-0702_SOT_DeadCalm-LucileSmith-FULL-V2.mxf-audio.mp3', // an mp3 file
+ textTracks: [], // empty text track list
+ },
{
description: 'BigBugBunny sideLoaded subtitles',
// sideloaded subtitles wont work for streaming like HLS on ios
@@ -100,11 +115,19 @@ export const srcAllPlatformList = [
},
],
},
+ {
+ description: '(mp4) big buck bunny With Ads',
+ ad: {
+ adTagUrl:
+ 'https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/vmap_ad_samples&sz=640x480&cust_params=sample_ar%3Dpremidpostoptimizedpodbumper&ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&env=vp&impl=s&cmsid=496&vid=short_onecue&correlator=',
+ },
+ uri: 'https://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4',
+ },
];
-export const srcIosList = [];
+export const srcIosList: SampleVideoSource[] = [];
-export const srcAndroidList = [
+export const srcAndroidList: SampleVideoSource[] = [
{
description: 'Another live sample',
uri: 'https://live.forstreet.cl/live/livestream.m3u8',
@@ -126,12 +149,6 @@ export const srcAndroidList = [
uri: 'http://www.youtube.com/api/manifest/dash/id/bf5bb2419360daf1/source/youtube?as=fmp4_audio_clear,fmp4_sd_hd_clear&sparams=ip,ipbits,expire,source,id,as&ip=0.0.0.0&ipbits=0&expire=19000000000&signature=51AF5F39AB0CEC3E5497CD9C900EBFEAECCCB5C7.8506521BFC350652163895D4C26DEE124209AA9E&key=ik0',
type: 'mpd',
},
- {
- description: '(mp4) big buck bunny With Ads',
- adTagUrl:
- 'https://pubads.g.doubleclick.net/gampad/ads?iu=/21775744923/external/vmap_ad_samples&sz=640x480&cust_params=sample_ar%3Dpremidpostoptimizedpodbumper&ciu_szs=300x250&gdfp_req=1&ad_rule=1&output=vmap&unviewed_position_start=1&env=vp&impl=s&cmsid=496&vid=short_onecue&correlator=',
- uri: 'http://d23dyxeqlo5psv.cloudfront.net/big_buck_bunny.mp4',
- },
{
description: 'WV: Secure SD & HD (cbcs,MP4,H264)',
uri: 'https://storage.googleapis.com/wvmedia/cbcs/h264/tears/tears_aes_cbcs.mpd',
@@ -157,13 +174,12 @@ export const srcAndroidList = [
},
];
-// poster which can be displayed
-export const samplePoster =
- 'https://upload.wikimedia.org/wikipedia/commons/1/18/React_Native_Logo.png';
+const platformSrc: SampleVideoSource[] = isAndroid
+ ? srcAndroidList
+ : srcIosList;
-export const srcList: SampleVideoSource[] = srcAllPlatformList.concat(
- isAndroid ? srcAndroidList : srcIosList,
-);
+export const srcList: SampleVideoSource[] =
+ platformSrc.concat(srcAllPlatformList);
export const bufferConfig: BufferConfig = {
minBufferMs: 15000,
diff --git a/examples/basic/src/styles.tsx b/examples/basic/src/styles.tsx
index 0dd72390..61453b77 100644
--- a/examples/basic/src/styles.tsx
+++ b/examples/basic/src/styles.tsx
@@ -102,9 +102,15 @@ const styles = StyleSheet.create({
borderWidth: 1,
borderColor: 'red',
},
- IndicatorStyle: {
- flex: 1,
+ indicatorContainer: {
justifyContent: 'center',
+ alignItems: 'center',
+ gap: 10,
+ width: '100%',
+ height: '100%',
+ },
+ indicatorText: {
+ color: 'white',
},
seekbarContainer: {
flex: 1,
diff --git a/examples/basic/src/types/types.ts b/examples/basic/src/types/types.ts
index 7df4ead8..c9735c02 100644
--- a/examples/basic/src/types/types.ts
+++ b/examples/basic/src/types/types.ts
@@ -1,11 +1,11 @@
import {Drm, ReactVideoSource, TextTracks} from 'react-native-video';
export type AdditionalSourceInfo = {
- textTracks: TextTracks;
- adTagUrl: string;
- description: string;
- drm: Drm;
- noView: boolean;
+ textTracks?: TextTracks;
+ adTagUrl?: string;
+ description?: string;
+ drm?: Drm;
+ noView?: boolean;
};
export type SampleVideoSource = ReactVideoSource | AdditionalSourceInfo;
diff --git a/examples/basic/yarn.lock b/examples/basic/yarn.lock
index df07fcd0..bcdf9662 100644
--- a/examples/basic/yarn.lock
+++ b/examples/basic/yarn.lock
@@ -3,9 +3,9 @@
"@0no-co/graphql.web@^1.0.5":
- version "1.0.7"
- resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.7.tgz#c7a762c887b3482a79ffa68f63de5e96059a62e4"
- integrity sha512-E3Qku4mTzdrlwVWGPxklDnME5ANrEGetvYw4i2GCRlppWXXE4QD66j7pwb8HelZwS6LnqEChhrSOGCXpbiu6MQ==
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@0no-co/graphql.web/-/graphql.web-1.0.8.tgz#20682c7839b0b5b7728ad944a8602ca46d983e75"
+ integrity sha512-8BG6woLtDMvXB9Ajb/uE+Zr/U7y4qJ3upXi0JQHZmsKUJa7HjF/gFvmL2f3/mSmfZoQGRr9VoY97LCX2uaFMzA==
"@ampproject/remapping@^2.2.0":
version "2.3.0"
@@ -39,9 +39,9 @@
tslib "^2.2.0"
"@azure/core-auth@^1.4.0", "@azure/core-auth@^1.5.0":
- version "1.7.2"
- resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.7.2.tgz#558b7cb7dd12b00beec07ae5df5907d74df1ebd9"
- integrity sha512-Igm/S3fDYmnMq1uKS38Ae1/m37B3zigdlZw+kocwEhh5GjyKjPrXKO2J6rzpC1wAxrNil/jX9BJRqBshyjnF3g==
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/@azure/core-auth/-/core-auth-1.8.0.tgz#281b4a6d3309c3e7b15bcd967f01d4c79ae4a1d6"
+ integrity sha512-YvFMowkXzLbXNM11yZtVLhUCmuG0ex7JKOH366ipjmHBhL3vpDcPAeWF+jf0X+jVXwFqo3UhsWUq4kH0ZPdu/g==
dependencies:
"@azure/abort-controller" "^2.0.0"
"@azure/core-util" "^1.1.0"
@@ -63,10 +63,10 @@
tslib "^2.2.0"
uuid "^8.3.0"
-"@azure/core-tracing@^1.0.0", "@azure/core-tracing@^1.0.1":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.1.2.tgz#065dab4e093fb61899988a1cdbc827d9ad90b4ee"
- integrity sha512-dawW9ifvWAWmUm9/h+/UQ2jrdvjCJ7VJEuCJ6XVNudzcOwm53BFZH4Q845vjfgoUAM8ZxokvVNxNxAITc502YA==
+"@azure/core-tracing@^1.0.1", "@azure/core-tracing@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@azure/core-tracing/-/core-tracing-1.2.0.tgz#7be5d53c3522d639cf19042cbcdb19f71bc35ab2"
+ integrity sha512-UKTiEJPkWcESPYJz3X5uKRYyOcJD+4nYph+KpfdPRnQJVrZfk0KJgdnaAWKfhsBBtAf/D58Az4AvCJEmWgIBAg==
dependencies:
tslib "^2.6.2"
@@ -79,31 +79,31 @@
tslib "^2.2.0"
"@azure/core-util@^1.0.0", "@azure/core-util@^1.1.0":
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.9.0.tgz#469afd7e6452d5388b189f90d33f7756b0b210d1"
- integrity sha512-AfalUQ1ZppaKuxPPMsFEUdX6GZPB3d9paR9d/TTL7Ow2De8cJaC7ibi7kWVlFAVPCYo31OcnGymc0R89DX8Oaw==
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/@azure/core-util/-/core-util-1.10.0.tgz#cf3163382d40343972848c914869864df5d44bdb"
+ integrity sha512-dqLWQsh9Nro1YQU+405POVtXnwrIVqPyfUzc4zXCbThTg7+vNNaiMkwbX9AMXKyoFYFClxmB3s25ZFr3+jZkww==
dependencies:
"@azure/abort-controller" "^2.0.0"
tslib "^2.6.2"
"@azure/logger@^1.0.0":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.1.2.tgz#3f4b876cefad328dc14aff8b850d63b611e249dc"
- integrity sha512-l170uE7bsKpIU6B/giRc9i4NI0Mj+tANMMMxf7Zi/5cKzEqPayP7+X1WPrG7e+91JgY8N+7K7nF2WOi7iVhXvg==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/@azure/logger/-/logger-1.1.4.tgz#223cbf2b424dfa66478ce9a4f575f59c6f379768"
+ integrity sha512-4IXXzcCdLdlXuCG+8UKEwLA1T1NHqUfanhXYHiQTn+6sfWCZXduqbtXDGceg3Ce5QxTGo7EqmbV6Bi+aqKuClQ==
dependencies:
tslib "^2.6.2"
"@azure/opentelemetry-instrumentation-azure-sdk@^1.0.0-beta.5":
- version "1.0.0-beta.5"
- resolved "https://registry.yarnpkg.com/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.5.tgz#78809e6c005d08450701e5d37f087f6fce2f86eb"
- integrity sha512-fsUarKQDvjhmBO4nIfaZkfNSApm1hZBzcvpNbSrXdcUBxu7lRvKsV5DnwszX7cnhLyVOW9yl1uigtRQ1yDANjA==
+ version "1.0.0-beta.7"
+ resolved "https://registry.yarnpkg.com/@azure/opentelemetry-instrumentation-azure-sdk/-/opentelemetry-instrumentation-azure-sdk-1.0.0-beta.7.tgz#db55c80a7778371312f8ff95a7b854a14e88dd76"
+ integrity sha512-boG33EDRcbw0Jo2cRgB6bccSirKOzYdYFMdcSsnOajLCLfJ8WIve3vxUMi7YZKxM8txZX/0cwzUU6crXmYxXZg==
dependencies:
- "@azure/core-tracing" "^1.0.0"
+ "@azure/core-tracing" "^1.2.0"
"@azure/logger" "^1.0.0"
- "@opentelemetry/api" "^1.4.1"
- "@opentelemetry/core" "^1.15.2"
- "@opentelemetry/instrumentation" "^0.41.2"
- tslib "^2.2.0"
+ "@opentelemetry/api" "^1.9.0"
+ "@opentelemetry/core" "^1.26.0"
+ "@opentelemetry/instrumentation" "^0.53.0"
+ tslib "^2.7.0"
"@babel/code-frame@7.10.4", "@babel/code-frame@~7.10.4":
version "7.10.4"
@@ -112,34 +112,34 @@
dependencies:
"@babel/highlight" "^7.10.4"
-"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.24.7.tgz#882fd9e09e8ee324e496bd040401c6f046ef4465"
- integrity sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==
+"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.25.7.tgz#438f2c524071531d643c6f0188e1e28f130cebc7"
+ integrity sha512-0xZJFNE5XMpENsgfHYTw8FbX4kv53mFLn2i3XPoq69LyhYSCBJtitaHx9QnsVTrsogI4Z3+HtEfZ2/GFPOtf5g==
dependencies:
- "@babel/highlight" "^7.24.7"
+ "@babel/highlight" "^7.25.7"
picocolors "^1.0.0"
-"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.24.7.tgz#d23bbea508c3883ba8251fb4164982c36ea577ed"
- integrity sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==
+"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.25.7", "@babel/compat-data@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.25.8.tgz#0376e83df5ab0eb0da18885c0140041f0747a402"
+ integrity sha512-ZsysZyXY4Tlx+Q53XdnOFmqwfB9QDTHYxaZYajWRoBLuLEAwI2UIbtxOjWh/cFaa9IKUlcB+DDuoskLuKu56JA==
"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.13.16", "@babel/core@^7.20.0", "@babel/core@^7.23.9", "@babel/core@^7.24.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.24.7.tgz#b676450141e0b52a3d43bc91da86aa608f950ac4"
- integrity sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.25.8.tgz#a57137d2a51bbcffcfaeba43cb4dd33ae3e0e1c6"
+ integrity sha512-Oixnb+DzmRT30qu9d3tJSQkxuygWm32DFykT4bRoORPa9hZ/L4KhVB/XiRm6KG+roIEM7DBQlmg27kw2HZkdZg==
dependencies:
"@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.24.7"
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helpers" "^7.24.7"
- "@babel/parser" "^7.24.7"
- "@babel/template" "^7.24.7"
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/code-frame" "^7.25.7"
+ "@babel/generator" "^7.25.7"
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helpers" "^7.25.7"
+ "@babel/parser" "^7.25.8"
+ "@babel/template" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.8"
convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
@@ -147,9 +147,9 @@
semver "^6.3.1"
"@babel/eslint-parser@^7.20.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.24.7.tgz#27ebab1a1ec21f48ae191a8aaac5b82baf80d9c7"
- integrity sha512-SO5E3bVxDuxyNxM5agFv480YA2HO6ohZbGxbazZdIk3KQOPOGVNw6q78I9/lbviIf95eq6tPozeYnJLbjnC8IA==
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.25.8.tgz#0119dec46be547d7a339978dedb9d29e517c2443"
+ integrity sha512-Po3VLMN7fJtv0nsOjBDSbO1J71UhzShE9MuOSkWEV9IZQXzhZklYtzKZ8ZD/Ij3a0JBv1AG3Ny2L3jvAHQVOGg==
dependencies:
"@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
eslint-visitor-keys "^2.1.0"
@@ -166,67 +166,65 @@
source-map "^0.5.0"
trim-right "^1.0.1"
-"@babel/generator@^7.20.0", "@babel/generator@^7.20.5", "@babel/generator@^7.24.7", "@babel/generator@^7.7.2":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.24.7.tgz#1654d01de20ad66b4b4d99c135471bc654c55e6d"
- integrity sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==
+"@babel/generator@^7.20.0", "@babel/generator@^7.20.5", "@babel/generator@^7.25.7", "@babel/generator@^7.7.2":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.25.7.tgz#de86acbeb975a3e11ee92dd52223e6b03b479c56"
+ integrity sha512-5Dqpl5fyV9pIAD62yK9P7fcA768uVPUyrQmqpqstHWgMma4feF1x/oFysBCVZLY5wJ2GkMUCdsNDnGZrPoR6rA==
dependencies:
- "@babel/types" "^7.24.7"
+ "@babel/types" "^7.25.7"
"@jridgewell/gen-mapping" "^0.3.5"
"@jridgewell/trace-mapping" "^0.3.25"
- jsesc "^2.5.1"
+ jsesc "^3.0.2"
-"@babel/helper-annotate-as-pure@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz#5373c7bc8366b12a033b4be1ac13a206c6656aab"
- integrity sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==
+"@babel/helper-annotate-as-pure@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.7.tgz#63f02dbfa1f7cb75a9bdb832f300582f30bb8972"
+ integrity sha512-4xwU8StnqnlIhhioZf1tqnVWeQ9pvH/ujS8hRfw/WOza+/a+1qv69BWNy+oY231maTCWgKWhfBU7kDpsds6zAA==
dependencies:
- "@babel/types" "^7.24.7"
+ "@babel/types" "^7.25.7"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz#37d66feb012024f2422b762b9b2a7cfe27c7fba3"
- integrity sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.7.tgz#d721650c1f595371e0a23ee816f1c3c488c0d622"
+ integrity sha512-12xfNeKNH7jubQNm7PAkzlLwEmCs1tfuX3UjIw6vP6QXi+leKh6+LyC/+Ed4EIQermwd58wsyh070yjDHFlNGg==
dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
-"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz#4eb6c4a80d6ffeac25ab8cd9a21b5dfa48d503a9"
- integrity sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==
+"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.7.tgz#11260ac3322dda0ef53edfae6e97b961449f5fa4"
+ integrity sha512-DniTEax0sv6isaw6qSQSfV4gVRNtw2rte8HHM45t9ZR0xILaufBRNkpMifCRiAPyvL4ACD6v0gfCwCmtOQaV4A==
dependencies:
- "@babel/compat-data" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- browserslist "^4.22.2"
+ "@babel/compat-data" "^7.25.7"
+ "@babel/helper-validator-option" "^7.25.7"
+ browserslist "^4.24.0"
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz#2eaed36b3a1c11c53bdf80d53838b293c52f5b3b"
- integrity sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.7.tgz#5d65074c76cae75607421c00d6bd517fe1892d6b"
+ integrity sha512-bD4WQhbkx80mAyj/WCm4ZHcF4rDxkoLFO6ph8/5/mQ3z4vAzltQXAmbc7GvVJx5H+lk5Mi5EmbTeox5nMGCsbw==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-function-name" "^7.24.7"
- "@babel/helper-member-expression-to-functions" "^7.24.7"
- "@babel/helper-optimise-call-expression" "^7.24.7"
- "@babel/helper-replace-supers" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/helper-split-export-declaration" "^7.24.7"
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-member-expression-to-functions" "^7.25.7"
+ "@babel/helper-optimise-call-expression" "^7.25.7"
+ "@babel/helper-replace-supers" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
semver "^6.3.1"
-"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz#be4f435a80dc2b053c76eeb4b7d16dd22cfc89da"
- integrity sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.7.tgz#dcb464f0e2cdfe0c25cc2a0a59c37ab940ce894e"
+ integrity sha512-byHhumTj/X47wJ6C6eLpK7wW/WBEcnUeb7D0FNc/jFQnQVw7DOso3Zz5u9x/zLrFVkHa89ZGDbkAa1D54NdrCQ==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- regexpu-core "^5.3.1"
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ regexpu-core "^6.1.1"
semver "^6.3.1"
-"@babel/helper-define-polyfill-provider@^0.6.1", "@babel/helper-define-polyfill-provider@^0.6.2":
+"@babel/helper-define-polyfill-provider@^0.6.2":
version "0.6.2"
resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz#18594f789c3594acb24cfdb4a7f7b7d2e8bd912d"
integrity sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==
@@ -237,187 +235,172 @@
lodash.debounce "^4.0.8"
resolve "^1.14.2"
-"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.24.7":
+"@babel/helper-environment-visitor@^7.18.9":
version "7.24.7"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz#4b31ba9551d1f90781ba83491dd59cf9b269f7d9"
integrity sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==
dependencies:
"@babel/types" "^7.24.7"
-"@babel/helper-function-name@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz#75f1e1725742f39ac6584ee0b16d94513da38dd2"
- integrity sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==
+"@babel/helper-member-expression-to-functions@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.7.tgz#541a33b071f0355a63a0fa4bdf9ac360116b8574"
+ integrity sha512-O31Ssjd5K6lPbTX9AAYpSKrZmLeagt9uwschJd+Ixo6QiRyfpvgtVQp8qrDR9UNFjZ8+DO34ZkdrN+BnPXemeA==
dependencies:
- "@babel/template" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
-"@babel/helper-hoist-variables@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz#b4ede1cde2fd89436397f30dc9376ee06b0f25ee"
- integrity sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==
+"@babel/helper-module-imports@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.7.tgz#dba00d9523539152906ba49263e36d7261040472"
+ integrity sha512-o0xCgpNmRohmnoWKQ0Ij8IdddjyBFE4T2kagL/x6M3+4zUgc+4qTOUBoNe4XxDskt1HPKO007ZPiMgLDq2s7Kw==
dependencies:
- "@babel/types" "^7.24.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
-"@babel/helper-member-expression-to-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz#67613d068615a70e4ed5101099affc7a41c5225f"
- integrity sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==
+"@babel/helper-module-transforms@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.25.7.tgz#2ac9372c5e001b19bc62f1fe7d96a18cb0901d1a"
+ integrity sha512-k/6f8dKG3yDz/qCwSM+RKovjMix563SLxQFo0UhRNo239SP6n9u5/eLtKD6EAjwta2JHJ49CsD8pms2HdNiMMQ==
dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-simple-access" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
-"@babel/helper-module-imports@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz#f2f980392de5b84c3328fc71d38bd81bbb83042b"
- integrity sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==
+"@babel/helper-optimise-call-expression@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.7.tgz#1de1b99688e987af723eed44fa7fc0ee7b97d77a"
+ integrity sha512-VAwcwuYhv/AT+Vfr28c9y6SHzTan1ryqrydSTFGjU0uDJHw3uZ+PduI8plCLkRsDnqK2DMEDmwrOQRsK/Ykjng==
dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/types" "^7.25.7"
-"@babel/helper-module-transforms@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz#31b6c9a2930679498db65b685b1698bfd6c7daf8"
- integrity sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.7", "@babel/helper-plugin-utils@^7.8.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.7.tgz#8ec5b21812d992e1ef88a9b068260537b6f0e36c"
+ integrity sha512-eaPZai0PiqCi09pPs3pAFfl/zYgGaE6IdXtYvmf0qlcDTd3WCtO7JWCcRd64e0EQrcYgiHibEZnOGsSY4QSgaw==
+
+"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.7.tgz#9efdc39df5f489bcd15533c912b6c723a0a65021"
+ integrity sha512-kRGE89hLnPfcz6fTrlNU+uhgcwv0mBE4Gv3P9Ke9kLVJYpi4AMVVEElXvB5CabrPZW4nCM8P8UyyjrzCM0O2sw==
dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-simple-access" "^7.24.7"
- "@babel/helper-split-export-declaration" "^7.24.7"
- "@babel/helper-validator-identifier" "^7.24.7"
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-wrap-function" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
-"@babel/helper-optimise-call-expression@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz#8b0a0456c92f6b323d27cfd00d1d664e76692a0f"
- integrity sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==
+"@babel/helper-replace-supers@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.25.7.tgz#38cfda3b6e990879c71d08d0fef9236b62bd75f5"
+ integrity sha512-iy8JhqlUW9PtZkd4pHM96v6BdJ66Ba9yWSE4z0W4TvSZwLBPkyDsiIU3ENe4SmrzRBs76F7rQXTy1lYC49n6Lw==
dependencies:
- "@babel/types" "^7.24.7"
+ "@babel/helper-member-expression-to-functions" "^7.25.7"
+ "@babel/helper-optimise-call-expression" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
-"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.24.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz#98c84fe6fe3d0d3ae7bfc3a5e166a46844feb2a0"
- integrity sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==
-
-"@babel/helper-remap-async-to-generator@^7.18.9", "@babel/helper-remap-async-to-generator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz#b3f0f203628522713849d49403f1a414468be4c7"
- integrity sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==
+"@babel/helper-simple-access@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.25.7.tgz#5eb9f6a60c5d6b2e0f76057004f8dacbddfae1c0"
+ integrity sha512-FPGAkJmyoChQeM+ruBGIDyrT2tKfZJO8NcxdC+CWNJi7N8/rZpSxK7yvBJ5O/nF1gfu5KzN7VKG3YVSLFfRSxQ==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-wrap-function" "^7.24.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
-"@babel/helper-replace-supers@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz#f933b7eed81a1c0265740edc91491ce51250f765"
- integrity sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==
+"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.7.tgz#382831c91038b1a6d32643f5f49505b8442cb87c"
+ integrity sha512-pPbNbchZBkPMD50K0p3JGcFMNLVUCuU/ABybm/PGNj4JiHrpmNyqqCphBk4i19xXtNV0JhldQJJtbSW5aUvbyA==
dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-member-expression-to-functions" "^7.24.7"
- "@babel/helper-optimise-call-expression" "^7.24.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
-"@babel/helper-simple-access@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz#bcade8da3aec8ed16b9c4953b74e506b51b5edb3"
- integrity sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==
+"@babel/helper-string-parser@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz#d50e8d37b1176207b4fe9acedec386c565a44a54"
+ integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g==
+
+"@babel/helper-validator-identifier@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz#77b7f60c40b15c97df735b38a66ba1d7c3e93da5"
+ integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg==
+
+"@babel/helper-validator-option@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.7.tgz#97d1d684448228b30b506d90cace495d6f492729"
+ integrity sha512-ytbPLsm+GjArDYXJ8Ydr1c/KJuutjF2besPNbIZnZ6MKUxi/uTA22t2ymmA4WFjZFpjiAMO0xuuJPqK2nvDVfQ==
+
+"@babel/helper-wrap-function@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.7.tgz#9f6021dd1c4fdf4ad515c809967fc4bac9a70fe7"
+ integrity sha512-MA0roW3JF2bD1ptAaJnvcabsVlNQShUaThyJbCDD4bCp8NEgiFvpoqRI2YS22hHlc2thjO/fTg2ShLMC3jygAg==
dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/template" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
+ "@babel/types" "^7.25.7"
-"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz#5f8fa83b69ed5c27adc56044f8be2b3ea96669d9"
- integrity sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==
+"@babel/helpers@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.25.7.tgz#091b52cb697a171fe0136ab62e54e407211f09c2"
+ integrity sha512-Sv6pASx7Esm38KQpF/U/OXLwPPrdGHNKoeblRxgZRLXnAtnkEe4ptJPDtAZM7fBLadbc1Q07kQpSiGQ0Jg6tRA==
dependencies:
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/template" "^7.25.7"
+ "@babel/types" "^7.25.7"
-"@babel/helper-split-export-declaration@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz#83949436890e07fa3d6873c61a96e3bbf692d856"
- integrity sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==
+"@babel/highlight@^7.10.4", "@babel/highlight@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.25.7.tgz#20383b5f442aa606e7b5e3043b0b1aafe9f37de5"
+ integrity sha512-iYyACpW3iW8Fw+ZybQK+drQre+ns/tKpXbNESfrhNnPLIklLbXr7MYJ6gPEd0iETGLOK+SxMjVvKb/ffmk+FEw==
dependencies:
- "@babel/types" "^7.24.7"
-
-"@babel/helper-string-parser@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz#4d2d0f14820ede3b9807ea5fc36dfc8cd7da07f2"
- integrity sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==
-
-"@babel/helper-validator-identifier@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz#75b889cfaf9e35c2aaf42cf0d72c8e91719251db"
- integrity sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==
-
-"@babel/helper-validator-option@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz#24c3bb77c7a425d1742eec8fb433b5a1b38e62f6"
- integrity sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==
-
-"@babel/helper-wrap-function@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz#52d893af7e42edca7c6d2c6764549826336aae1f"
- integrity sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==
- dependencies:
- "@babel/helper-function-name" "^7.24.7"
- "@babel/template" "^7.24.7"
- "@babel/traverse" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/helpers@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.24.7.tgz#aa2ccda29f62185acb5d42fb4a3a1b1082107416"
- integrity sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==
- dependencies:
- "@babel/template" "^7.24.7"
- "@babel/types" "^7.24.7"
-
-"@babel/highlight@^7.10.4", "@babel/highlight@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.24.7.tgz#a05ab1df134b286558aae0ed41e6c5f731bf409d"
- integrity sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==
- dependencies:
- "@babel/helper-validator-identifier" "^7.24.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
chalk "^2.4.2"
js-tokens "^4.0.0"
picocolors "^1.0.0"
-"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.24.7.tgz#9a5226f92f0c5c8ead550b750f5608e766c8ce85"
- integrity sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==
-
-"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz#fd059fd27b184ea2b4c7e646868a9a381bbc3055"
- integrity sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==
+"@babel/parser@^7.1.0", "@babel/parser@^7.13.16", "@babel/parser@^7.14.7", "@babel/parser@^7.20.0", "@babel/parser@^7.20.7", "@babel/parser@^7.23.9", "@babel/parser@^7.25.7", "@babel/parser@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.25.8.tgz#f6aaf38e80c36129460c1657c0762db584c9d5e2"
+ integrity sha512-HcttkxzdPucv3nNFmfOOMfFf64KgdJVqm1KaCm25dPGMLElo9nsLvXeJECQg8UzPuBGLyTSA0ZzqCtDSzKTEoQ==
dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/types" "^7.25.8"
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz#468096ca44bbcbe8fcc570574e12eb1950e18107"
- integrity sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==
+"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.7.tgz#93969ac50ef4d68b2504b01b758af714e4cbdd64"
+ integrity sha512-UV9Lg53zyebzD1DwQoT9mzkEKa922LNUp5YkTJ6Uta0RbyXaQNUgcvSt7qIu1PpPzVb6rd10OVNTzkyBGeVmxQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz#e4eabdd5109acc399b38d7999b2ef66fc2022f89"
- integrity sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==
+"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.7.tgz#a338d611adb9dcd599b8b1efa200c88ebeffe046"
+ integrity sha512-GDDWeVLNxRIkQTnJn2pDOM1pkCgYdSqPeT1a9vh9yIqu2uzzgw1zcqEb+IJOhy+dTBMlNdThrDIksr2o09qrrQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/plugin-transform-optional-chaining" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz#71b21bb0286d5810e63a1538aa901c58e87375ec"
- integrity sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.7.tgz#c5f755e911dfac7ef6957300c0f9c4a8c18c06f4"
+ integrity sha512-wxyWg2RYaSUYgmd9MR0FyRGyeOMQE/Uzr1wzd/g5cf5bwi9A4v6HFdDm7y1MgDtod/fLOSTZY6jDgV0xU9d5bA==
dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.7.tgz#3b7ea04492ded990978b6deaa1dfca120ad4455a"
+ integrity sha512-Xwg6tZpLxc4iQjorYsyGMyfJE7nP5MV8t/Ka58BgiA7Jw0fRqQNcANlLfdJ/yvBt9z9LD2We+BEkT7vLqZRWng==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+ "@babel/plugin-transform-optional-chaining" "^7.25.7"
+
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.7.tgz#9622b1d597a703aa3a921e6f58c9c2d9a028d2c5"
+ integrity sha512-UVATLMidXrnH+GMUIuxq55nejlj02HP7F5ETyBONzP6G87fPBogG4CH6kxrSrdIuAjdwNO9VzyaYsrZPscWUrw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
"@babel/plugin-proposal-async-generator-functions@^7.0.0":
version "7.20.7"
@@ -438,21 +421,20 @@
"@babel/helper-plugin-utils" "^7.18.6"
"@babel/plugin-proposal-decorators@^7.12.9":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.24.7.tgz#7e2dcfeda4a42596b57c4c9de1f5176bbfc532e3"
- integrity sha512-RL9GR0pUG5Kc8BUWLNDm2T5OpYwSX15r98I0IkgmRQTXuELq/OynH8xtMTMvTJFjXbMWFVTKtYkTaYQsuAwQlQ==
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.7.tgz#dabfd82df5dff3a8fc61a434233bf8227c88402c"
+ integrity sha512-q1mqqqH0e1lhmsEQHV5U8OmdueBC2y0RFr2oUzZoFRtN3MvPmt2fsFRcNQAoGLTSNdHBFUYGnlgcRFhkBbKjPw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-decorators" "^7.24.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/plugin-syntax-decorators" "^7.25.7"
"@babel/plugin-proposal-export-default-from@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.24.7.tgz#0b539c46b8ac804f694e338f803c8354c0f788b6"
- integrity sha512-CcmFwUJ3tKhLjPdt4NP+SHMshebytF8ZTYOv5ZDpkzq2sin80Wb5vJrGt8fhPrORQCfoSa0LAxC/DW+GAC5+Hw==
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.25.8.tgz#fa22151caa240683c3659796037237813767f348"
+ integrity sha512-5SLPHA/Gk7lNdaymtSVS9jH77Cs7yuHTR3dYj+9q+M7R7tNLXhNuvnmOfafRIzpWL+dtMibuu1I4ofrc768Gkw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-export-default-from" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
"@babel/plugin-proposal-logical-assignment-operators@^7.18.0":
version "7.20.7"
@@ -525,7 +507,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3":
+"@babel/plugin-syntax-class-properties@^7.12.13":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz#b5c987274c4a3a82b89714796931a6b53544ae10"
integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
@@ -539,56 +521,49 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-decorators@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.24.7.tgz#e4f8a0a8778ccec669611cd5aed1ed8e6e3a6fcf"
- integrity sha512-Ui4uLJJrRV1lb38zg1yYTmRKmiZLiftDEvZN2iq3kd9kUFU+PttmzTbAFC2ucRk/XJmtek6G23gPsuZbhrT8fQ==
+"@babel/plugin-syntax-decorators@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.7.tgz#cf26fdde4e750688e133c0e33ead2506377e88f7"
+ integrity sha512-oXduHo642ZhstLVYTe2z2GSJIruU0c/W3/Ghr6A5yGMsVrvdnxO1z+3pbTcT7f3/Clnt+1z8D/w1r1f1SHaCHw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-syntax-dynamic-import@^7.8.0", "@babel/plugin-syntax-dynamic-import@^7.8.3":
+"@babel/plugin-syntax-dynamic-import@^7.8.0":
version "7.8.3"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz#62bf98b2da3cd21d626154fc96ee5b3cb68eacb3"
integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-export-default-from@^7.0.0", "@babel/plugin-syntax-export-default-from@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.24.7.tgz#85dae9098933573aae137fb52141dd3ca52ae7ac"
- integrity sha512-bTPz4/635WQ9WhwsyPdxUJDVpsi/X9BMmy/8Rf/UAlOO4jSql4CxUCjWI5PiM+jG+c4LVPTScoTw80geFj9+Bw==
+"@babel/plugin-syntax-export-default-from@^7.0.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-default-from/-/plugin-syntax-export-default-from-7.25.7.tgz#3e05205c62303fe088f6b7073e5c143a669c26f4"
+ integrity sha512-LRUCsC0YucSjabsmxx6yly8+Q/5mxKdp9gemlpR9ro3bfpcOQOXx/CHivs7QCbjgygd6uQ2GcRfHu1FVax/hgg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-syntax-export-namespace-from@^7.8.3":
- version "7.8.3"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz#028964a9ba80dbc094c915c487ad7c4e7a66465a"
- integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+"@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.25.7.tgz#7d1255201b55d7644c57e0eb354aaf9f8b8d2d02"
+ integrity sha512-fyoj6/YdVtlv2ROig/J0fP7hh/wNO1MJGm1NR70Pg7jbkF+jOUL9joorqaCOQh06Y+LfgTagHzC8KqZ3MF782w==
dependencies:
- "@babel/helper-plugin-utils" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-syntax-flow@^7.12.1", "@babel/plugin-syntax-flow@^7.18.0", "@babel/plugin-syntax-flow@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.24.7.tgz#d1759e84dd4b437cf9fae69b4c06c41d7625bfb7"
- integrity sha512-9G8GYT/dxn/D1IIKOUBmGX0mnmj46mGH9NnZyJLwtCpgh5f7D2VbuKodb+2s9m1Yavh1s7ASQN8lf0eqrb1LTw==
+"@babel/plugin-syntax-import-assertions@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.7.tgz#8ce248f9f4ed4b7ed4cb2e0eb4ed9efd9f52921f"
+ integrity sha512-ZvZQRmME0zfJnDQnVBKYzHxXT7lYBB3Revz1GuS7oLXWMgqUPX4G+DDbT30ICClht9WKV34QVrZhSw6WdklwZQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-syntax-import-assertions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz#2a0b406b5871a20a841240586b1300ce2088a778"
- integrity sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==
+"@babel/plugin-syntax-import-attributes@^7.24.7", "@babel/plugin-syntax-import-attributes@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.7.tgz#d78dd0499d30df19a598e63ab895e21b909bc43f"
+ integrity sha512-AqVo+dguCgmpi/3mYBdu9lkngOBlQ2w2vnNpa6gfiCxQZLzV4ZbhsXitJ2Yblkoe1VQwtHSaNmIaGll/26YWRw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-syntax-import-attributes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz#b4f9ea95a79e6912480c4b626739f86a076624ca"
- integrity sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==
- dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
-
-"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3":
+"@babel/plugin-syntax-import-meta@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz#ee601348c370fa334d2207be158777496521fd51"
integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==
@@ -602,14 +577,14 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-jsx@^7.24.7", "@babel/plugin-syntax-jsx@^7.7.2":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.24.7.tgz#39a1fa4a7e3d3d7f34e2acc6be585b718d30e02d"
- integrity sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==
+"@babel/plugin-syntax-jsx@^7.25.7", "@babel/plugin-syntax-jsx@^7.7.2":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.7.tgz#5352d398d11ea5e7ef330c854dea1dae0bf18165"
+ integrity sha512-ruZOnKO+ajVL/MVx+PwNBPOkrnXTXoWMtte1MBpegfCArhqOe3Bj52avVj1huLLxNKYKXYaSxZ2F+woK1ekXfw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3":
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699"
integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
@@ -623,7 +598,7 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.0"
-"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3":
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
version "7.10.4"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz#b9b070b3e33570cd9fd07ba7fa91c0dd37b9af97"
integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
@@ -658,19 +633,19 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3":
+"@babel/plugin-syntax-top-level-await@^7.14.5":
version "7.14.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz#c1cfdadc35a646240001f06138247b741c34d94c"
integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-typescript@^7.24.7", "@babel/plugin-syntax-typescript@^7.7.2":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.24.7.tgz#58d458271b4d3b6bb27ee6ac9525acbb259bad1c"
- integrity sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==
+"@babel/plugin-syntax-typescript@^7.25.7", "@babel/plugin-syntax-typescript@^7.7.2":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.7.tgz#bfc05b0cc31ebd8af09964650cee723bb228108b"
+ integrity sha512-rR+5FDjpCHqqZN2bzZm18bVYGaejGq5ZkpVCJLXor/+zlSrSoc4KWcHI0URVWjl/68Dyr1uwZUz/1njycEAv9g==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
"@babel/plugin-syntax-unicode-sets-regex@^7.18.6":
version "7.18.6"
@@ -680,565 +655,547 @@
"@babel/helper-create-regexp-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz#4f6886c11e423bd69f3ce51dbf42424a5f275514"
- integrity sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==
+"@babel/plugin-transform-arrow-functions@^7.0.0", "@babel/plugin-transform-arrow-functions@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.7.tgz#1b9ed22e6890a0e9ff470371c73b8c749bcec386"
+ integrity sha512-EJN2mKxDwfOUCPxMO6MUI58RN3ganiRAG/MS/S3HfB6QFNjroAMelQo/gybyYq97WerCBAZoyrAoW8Tzdq2jWg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-async-generator-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz#7330a5c50e05181ca52351b8fd01642000c96cfd"
- integrity sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==
+"@babel/plugin-transform-async-generator-functions@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.8.tgz#3331de02f52cc1f2c75b396bec52188c85b0b1ec"
+ integrity sha512-9ypqkozyzpG+HxlH4o4gdctalFGIjjdufzo7I2XPda0iBnZ6a+FO0rIEQcdSPXp02CkvGsII1exJhmROPQd5oA==
dependencies:
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-remap-async-to-generator" "^7.24.7"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-remap-async-to-generator" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
-"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.24.7.tgz#72a3af6c451d575842a7e9b5a02863414355bdcc"
- integrity sha512-SQY01PcJfmQ+4Ash7NE+rpbLFbmqA2GPIgqzxfFTL4t1FKRq4zTms/7htKpoCUI9OcFYgzqfmCdH53s6/jn5fA==
+"@babel/plugin-transform-async-to-generator@^7.20.0", "@babel/plugin-transform-async-to-generator@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.7.tgz#a44c7323f8d4285a6c568dd43c5c361d6367ec52"
+ integrity sha512-ZUCjAavsh5CESCmi/xCpX1qcCaAglzs/7tmuvoFnJgA1dM7gQplsguljoTg+Ru8WENpX89cQyAtWoaE0I3X3Pg==
dependencies:
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-remap-async-to-generator" "^7.24.7"
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-remap-async-to-generator" "^7.25.7"
-"@babel/plugin-transform-block-scoped-functions@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz#a4251d98ea0c0f399dafe1a35801eaba455bbf1f"
- integrity sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==
+"@babel/plugin-transform-block-scoped-functions@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.7.tgz#e0b8843d5571719a2f1bf7e284117a3379fcc17c"
+ integrity sha512-xHttvIM9fvqW+0a3tZlYcZYSBpSWzGBFIt/sYG3tcdSzBB8ZeVgz2gBP7Df+sM0N1850jrviYSSeUuc+135dmQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz#42063e4deb850c7bd7c55e626bf4e7ab48e6ce02"
- integrity sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==
+"@babel/plugin-transform-block-scoping@^7.0.0", "@babel/plugin-transform-block-scoping@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.7.tgz#6dab95e98adf780ceef1b1c3ab0e55cd20dd410a"
+ integrity sha512-ZEPJSkVZaeTFG/m2PARwLZQ+OG0vFIhPlKHK/JdIMy8DbRJ/htz6LRrTFtdzxi9EHmcwbNPAKDnadpNSIW+Aow==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-class-properties@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz#256879467b57b0b68c7ddfc5b76584f398cd6834"
- integrity sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==
+"@babel/plugin-transform-class-properties@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.7.tgz#a389cfca7a10ac80e3ff4c75fca08bd097ad1523"
+ integrity sha512-mhyfEW4gufjIqYFo9krXHJ3ElbFLIze5IDp+wQTxoPd+mwFb1NxatNAwmv8Q8Iuxv7Zc+q8EkiMQwc9IhyGf4g==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-class-static-block@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz#c82027ebb7010bc33c116d4b5044fbbf8c05484d"
- integrity sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==
+"@babel/plugin-transform-class-static-block@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.25.8.tgz#a8af22028920fe404668031eceb4c3aadccb5262"
+ integrity sha512-e82gl3TCorath6YLf9xUwFehVvjvfqFhdOo4+0iVIVju+6XOi5XHkqB3P2AXnSwoeTX0HBoXq5gJFtvotJzFnQ==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz#4ae6ef43a12492134138c1e45913f7c46c41b4bf"
- integrity sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==
+"@babel/plugin-transform-classes@^7.0.0", "@babel/plugin-transform-classes@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.7.tgz#5103206cf80d02283bbbd044509ea3b65d0906bb"
+ integrity sha512-9j9rnl+YCQY0IGoeipXvnk3niWicIB6kCsWRGLwX241qSXpbA4MKxtp/EdvFxsc4zI5vqfLxzOd0twIJ7I99zg==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-function-name" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-replace-supers" "^7.24.7"
- "@babel/helper-split-export-declaration" "^7.24.7"
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-replace-supers" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz#4cab3214e80bc71fae3853238d13d097b004c707"
- integrity sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==
+"@babel/plugin-transform-computed-properties@^7.0.0", "@babel/plugin-transform-computed-properties@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.7.tgz#7f621f0aa1354b5348a935ab12e3903842466f65"
+ integrity sha512-QIv+imtM+EtNxg/XBKL3hiWjgdLjMOmZ+XzQwSgmBfKbfxUjBzGgVPklUuE55eq5/uVoh8gg3dqlrwR/jw3ZeA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/template" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/template" "^7.25.7"
-"@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz#a097f25292defb6e6cc16d6333a4cfc1e3c72d9e"
- integrity sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==
+"@babel/plugin-transform-destructuring@^7.20.0", "@babel/plugin-transform-destructuring@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.7.tgz#f6f26a9feefb5aa41fd45b6f5838901b5333d560"
+ integrity sha512-xKcfLTlJYUczdaM1+epcdh1UGewJqr9zATgrNHcLBcV2QmfvPPEixo/sK/syql9cEmbr7ulu5HMFG5vbbt/sEA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-dotall-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz#5f8bf8a680f2116a7207e16288a5f974ad47a7a0"
- integrity sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==
+"@babel/plugin-transform-dotall-regex@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.7.tgz#9d775c4a3ff1aea64045300fcd4309b4a610ef02"
+ integrity sha512-kXzXMMRzAtJdDEgQBLF4oaiT6ZCU3oWHgpARnTKDAqPkDJ+bs3NrZb310YYevR5QlRo3Kn7dzzIdHbZm1VzJdQ==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-duplicate-keys@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz#dd20102897c9a2324e5adfffb67ff3610359a8ee"
- integrity sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==
+"@babel/plugin-transform-duplicate-keys@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.7.tgz#fbba7d1155eab76bd4f2a038cbd5d65883bd7a93"
+ integrity sha512-by+v2CjoL3aMnWDOyCIg+yxU9KXSRa9tN6MbqggH5xvymmr9p4AMjYkNlQy4brMceBnUyHZ9G8RnpvT8wP7Cfg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-dynamic-import@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz#4d8b95e3bae2b037673091aa09cd33fecd6419f4"
- integrity sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==
+"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.7.tgz#102b31608dcc22c08fbca1894e104686029dc141"
+ integrity sha512-HvS6JF66xSS5rNKXLqkk7L9c/jZ/cdIVIcoPVrnl8IsVpLggTjXs8OWekbLHs/VtYDDh5WXnQyeE3PPUGm22MA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-exponentiation-operator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz#b629ee22645f412024297d5245bce425c31f9b0d"
- integrity sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==
+"@babel/plugin-transform-dynamic-import@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.8.tgz#f1edbe75b248cf44c70c8ca8ed3818a668753aaa"
+ integrity sha512-gznWY+mr4ZQL/EWPcbBQUP3BXS5FwZp8RUOw06BaRn8tQLzN4XLIxXejpHN9Qo8x8jjBmAAKp6FoS51AgkSA/A==
dependencies:
- "@babel/helper-builder-binary-assignment-operator-visitor" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-export-namespace-from@^7.22.11", "@babel/plugin-transform-export-namespace-from@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz#176d52d8d8ed516aeae7013ee9556d540c53f197"
- integrity sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==
+"@babel/plugin-transform-exponentiation-operator@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.7.tgz#5961a3a23a398faccd6cddb34a2182807d75fb5f"
+ integrity sha512-yjqtpstPfZ0h/y40fAXRv2snciYr0OAoMXY/0ClC7tm4C/nG5NJKmIItlaYlLbIVAWNfrYuy9dq1bE0SbX0PEg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.24.7.tgz#ae454e62219288fbb734541ab00389bfb13c063e"
- integrity sha512-cjRKJ7FobOH2eakx7Ja+KpJRj8+y+/SiB3ooYm/n2UJfxu0oEaOoxOinitkJcPqv9KxS0kxTGPUaR7L2XcXDXA==
+"@babel/plugin-transform-export-namespace-from@^7.22.11", "@babel/plugin-transform-export-namespace-from@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.8.tgz#d1988c3019a380b417e0516418b02804d3858145"
+ integrity sha512-sPtYrduWINTQTW7FtOy99VCTWp4H23UX7vYcut7S4CIMEXU+54zKX9uCoGkLsWXteyaMXzVHgzWbLfQ1w4GZgw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-flow" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-for-of@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz#f25b33f72df1d8be76399e1b8f3f9d366eb5bc70"
- integrity sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==
+"@babel/plugin-transform-flow-strip-types@^7.20.0", "@babel/plugin-transform-flow-strip-types@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.25.7.tgz#32be871a80e10bbe6d8b1c8a7eeedbbc896d5e80"
+ integrity sha512-q8Td2PPc6/6I73g96SreSUCKEcwMXCwcXSIAVTyTTN6CpJe0dMj8coxu1fg1T9vfBLi6Rsi6a4ECcFBbKabS5w==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/plugin-syntax-flow" "^7.25.7"
-"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz#6d8601fbffe665c894440ab4470bc721dd9131d6"
- integrity sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==
+"@babel/plugin-transform-for-of@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.7.tgz#0acfea0f27aa290818b5b48a5a44b3f03fc13669"
+ integrity sha512-n/TaiBGJxYFWvpJDfsxSj9lEEE44BFM1EPGz4KEiTipTgkoFVVcCmzAL3qA7fdQU96dpo4gGf5HBx/KnDvqiHw==
dependencies:
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-function-name" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
-"@babel/plugin-transform-json-strings@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz#f3e9c37c0a373fee86e36880d45b3664cedaf73a"
- integrity sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==
+"@babel/plugin-transform-function-name@^7.0.0", "@babel/plugin-transform-function-name@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.7.tgz#7e394ccea3693902a8b50ded8b6ae1fa7b8519fd"
+ integrity sha512-5MCTNcjCMxQ63Tdu9rxyN6cAWurqfrDZ76qvVPrGYdBxIj+EawuuxTu/+dgJlhK5eRz3v1gLwp6XwS8XaX2NiQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
-"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz#36b505c1e655151a9d7607799a9988fc5467d06c"
- integrity sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==
+"@babel/plugin-transform-json-strings@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.8.tgz#6fb3ec383a2ea92652289fdba653e3f9de722694"
+ integrity sha512-4OMNv7eHTmJ2YXs3tvxAfa/I43di+VcF+M4Wt66c88EAED1RoGaf1D64cL5FkRpNL+Vx9Hds84lksWvd/wMIdA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-logical-assignment-operators@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz#a58fb6eda16c9dc8f9ff1c7b1ba6deb7f4694cb0"
- integrity sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==
+"@babel/plugin-transform-literals@^7.0.0", "@babel/plugin-transform-literals@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.7.tgz#70cbdc742f2cfdb1a63ea2cbd018d12a60b213c3"
+ integrity sha512-fwzkLrSu2fESR/cm4t6vqd7ebNIopz2QHGtjoU+dswQo/P6lwAG04Q98lliE3jkz/XqnbGFLnUcE0q0CVUf92w==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-member-expression-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz#3b4454fb0e302e18ba4945ba3246acb1248315df"
- integrity sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==
+"@babel/plugin-transform-logical-assignment-operators@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.8.tgz#01868ff92daa9e525b4c7902aa51979082a05710"
+ integrity sha512-f5W0AhSbbI+yY6VakT04jmxdxz+WsID0neG7+kQZbCOjuyJNdL5Nn4WIBm4hRpKnUcO9lP0eipUhFN12JpoH8g==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-modules-amd@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz#65090ed493c4a834976a3ca1cde776e6ccff32d7"
- integrity sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==
+"@babel/plugin-transform-member-expression-literals@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.7.tgz#0a36c3fbd450cc9e6485c507f005fa3d1bc8fca5"
+ integrity sha512-Std3kXwpXfRV0QtQy5JJcRpkqP8/wG4XL7hSKZmGlxPlDqmpXtEPRmhF7ztnlTCtUN3eXRUJp+sBEZjaIBVYaw==
dependencies:
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz#9fd5f7fdadee9085886b183f1ad13d1ab260f4ab"
- integrity sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==
+"@babel/plugin-transform-modules-amd@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.7.tgz#bb4e543b5611f6c8c685a2fd485408713a3adf3d"
+ integrity sha512-CgselSGCGzjQvKzghCvDTxKHP3iooenLpJDO842ehn5D2G5fJB222ptnDwQho0WjEvg7zyoxb9P+wiYxiJX5yA==
dependencies:
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-simple-access" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-modules-systemjs@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz#f8012316c5098f6e8dee6ecd58e2bc6f003d0ce7"
- integrity sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==
+"@babel/plugin-transform-modules-commonjs@^7.0.0", "@babel/plugin-transform-modules-commonjs@^7.13.8", "@babel/plugin-transform-modules-commonjs@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.7.tgz#173f0c791bb7407c092ce6d77ee90eb3f2d1d2fd"
+ integrity sha512-L9Gcahi0kKFYXvweO6n0wc3ZG1ChpSFdgG+eV1WYZ3/dGbJK7vvk91FgGgak8YwRgrCuihF8tE/Xg07EkL5COg==
dependencies:
- "@babel/helper-hoist-variables" "^7.24.7"
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-identifier" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-simple-access" "^7.25.7"
-"@babel/plugin-transform-modules-umd@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz#edd9f43ec549099620df7df24e7ba13b5c76efc8"
- integrity sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==
+"@babel/plugin-transform-modules-systemjs@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.7.tgz#8b14d319a177cc9c85ef8b0512afd429d9e2e60b"
+ integrity sha512-t9jZIvBmOXJsiuyOwhrIGs8dVcD6jDyg2icw1VL4A/g+FnWyJKwUfSSU2nwJuMV2Zqui856El9u+ElB+j9fV1g==
dependencies:
- "@babel/helper-module-transforms" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
+ "@babel/traverse" "^7.25.7"
-"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz#9042e9b856bc6b3688c0c2e4060e9e10b1460923"
- integrity sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==
+"@babel/plugin-transform-modules-umd@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.7.tgz#00ee7a7e124289549381bfb0e24d87fd7f848367"
+ integrity sha512-p88Jg6QqsaPh+EB7I9GJrIqi1Zt4ZBHUQtjw3z1bzEXcLh6GfPqzZJ6G+G1HBGKUNukT58MnKG7EN7zXQBCODw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-module-transforms" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-new-target@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz#31ff54c4e0555cc549d5816e4ab39241dfb6ab00"
- integrity sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==
+"@babel/plugin-transform-named-capturing-groups-regex@^7.0.0", "@babel/plugin-transform-named-capturing-groups-regex@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.7.tgz#a2f3f6d7f38693b462542951748f0a72a34d196d"
+ integrity sha512-BtAT9LzCISKG3Dsdw5uso4oV1+v2NlVXIIomKJgQybotJY3OwCwJmkongjHgwGKoZXd0qG5UZ12JUlDQ07W6Ow==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-nullish-coalescing-operator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz#1de4534c590af9596f53d67f52a92f12db984120"
- integrity sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==
+"@babel/plugin-transform-new-target@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.7.tgz#52b2bde523b76c548749f38dc3054f1f45e82bc9"
+ integrity sha512-CfCS2jDsbcZaVYxRFo2qtavW8SpdzmBXC2LOI4oO0rP+JSRDxxF3inF4GcPsLgfb5FjkhXG5/yR/lxuRs2pySA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-numeric-separator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz#bea62b538c80605d8a0fac9b40f48e97efa7de63"
- integrity sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==
+"@babel/plugin-transform-nullish-coalescing-operator@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.8.tgz#befb4900c130bd52fccf2b926314557987f1b552"
+ integrity sha512-Z7WJJWdQc8yCWgAmjI3hyC+5PXIubH9yRKzkl9ZEG647O9szl9zvmKLzpbItlijBnVhTUf1cpyWBsZ3+2wjWPQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-object-rest-spread@^7.12.13", "@babel/plugin-transform-object-rest-spread@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz#d13a2b93435aeb8a197e115221cab266ba6e55d6"
- integrity sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==
+"@babel/plugin-transform-numeric-separator@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.8.tgz#91e370486371637bd42161052f2602c701386891"
+ integrity sha512-rm9a5iEFPS4iMIy+/A/PiS0QN0UyjPIeVvbU5EMZFKJZHt8vQnasbpo3T3EFcxzCeYO0BHfc4RqooCZc51J86Q==
dependencies:
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-object-super@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz#66eeaff7830bba945dd8989b632a40c04ed625be"
- integrity sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==
+"@babel/plugin-transform-object-rest-spread@^7.12.13", "@babel/plugin-transform-object-rest-spread@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.8.tgz#0904ac16bcce41df4db12d915d6780f85c7fb04b"
+ integrity sha512-LkUu0O2hnUKHKE7/zYOIjByMa4VRaV2CD/cdGz0AxU9we+VA3kDDggKEzI0Oz1IroG+6gUP6UmWEHBMWZU316g==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-replace-supers" "^7.24.7"
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/plugin-transform-parameters" "^7.25.7"
-"@babel/plugin-transform-optional-catch-binding@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz#00eabd883d0dd6a60c1c557548785919b6e717b4"
- integrity sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==
+"@babel/plugin-transform-object-super@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.7.tgz#582a9cea8cf0a1e02732be5b5a703a38dedf5661"
+ integrity sha512-pWT6UXCEW3u1t2tcAGtE15ornCBvopHj9Bps9D2DsH15APgNVOTwwczGckX+WkAvBmuoYKRCFa4DK+jM8vh5AA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-replace-supers" "^7.25.7"
-"@babel/plugin-transform-optional-chaining@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz#b8f6848a80cf2da98a8a204429bec04756c6d454"
- integrity sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==
+"@babel/plugin-transform-optional-catch-binding@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.8.tgz#2649b86a3bb202c6894ec81a6ddf41b94d8f3103"
+ integrity sha512-EbQYweoMAHOn7iJ9GgZo14ghhb9tTjgOc88xFgYngifx7Z9u580cENCV159M4xDh3q/irbhSjZVpuhpC2gKBbg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.15", "@babel/plugin-transform-parameters@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz#5881f0ae21018400e320fc7eb817e529d1254b68"
- integrity sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==
+"@babel/plugin-transform-optional-chaining@^7.25.7", "@babel/plugin-transform-optional-chaining@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.8.tgz#f46283b78adcc5b6ab988a952f989e7dce70653f"
+ integrity sha512-q05Bk7gXOxpTHoQ8RSzGSh/LHVB9JEIkKnk3myAWwZHnYiTGYtbdrYkIsS8Xyh4ltKf7GNUSgzs/6P2bJtBAQg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
-"@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz#e6318746b2ae70a59d023d5cc1344a2ba7a75f5e"
- integrity sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==
+"@babel/plugin-transform-parameters@^7.0.0", "@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.15", "@babel/plugin-transform-parameters@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.7.tgz#80c38b03ef580f6d6bffe1c5254bb35986859ac7"
+ integrity sha512-FYiTvku63me9+1Nz7TOx4YMtW3tWXzfANZtrzHhUZrz4d47EEtMQhzFoZWESfXuAMMT5mwzD4+y1N8ONAX6lMQ==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-private-property-in-object@^7.22.11", "@babel/plugin-transform-private-property-in-object@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz#4eec6bc701288c1fab5f72e6a4bbc9d67faca061"
- integrity sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==
+"@babel/plugin-transform-private-methods@^7.22.5", "@babel/plugin-transform-private-methods@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.7.tgz#c790a04f837b4bd61d6b0317b43aa11ff67dce80"
+ integrity sha512-KY0hh2FluNxMLwOCHbxVOKfdB5sjWG4M183885FmaqWWiGMhRZq4DQRKH6mHdEucbJnyDyYiZNwNG424RymJjA==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-property-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz#f0d2ed8380dfbed949c42d4d790266525d63bbdc"
- integrity sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==
+"@babel/plugin-transform-private-property-in-object@^7.22.11", "@babel/plugin-transform-private-property-in-object@^7.25.8":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.8.tgz#1234f856ce85e061f9688764194e51ea7577c434"
+ integrity sha512-8Uh966svuB4V8RHHg0QJOB32QK287NBksJOByoKmHMp1TAobNniNalIkI2i5IPj5+S9NYCG4VIjbEuiSN8r+ow==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.24.7.tgz#9caff79836803bc666bcfe210aeb6626230c293b"
- integrity sha512-H/Snz9PFxKsS1JLI4dJLtnJgCJRoo0AUm3chP6NYr+9En1JMKloheEiLIhlp5MDVznWo+H3AAC1Mc8lmUEpsgg==
+"@babel/plugin-transform-property-literals@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.7.tgz#a8612b4ea4e10430f00012ecf0155662c7d6550d"
+ integrity sha512-lQEeetGKfFi0wHbt8ClQrUSUMfEeI3MMm74Z73T9/kuz990yYVtfofjf3NuA42Jy3auFOpbjDyCSiIkTs1VIYw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-react-jsx-development@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.24.7.tgz#eaee12f15a93f6496d852509a850085e6361470b"
- integrity sha512-QG9EnzoGn+Qar7rxuW+ZOsbWOt56FvvI93xInqsZDC5fsekx1AlIO4KIJ5M+D0p0SqSH156EpmZyXq630B8OlQ==
+"@babel/plugin-transform-react-display-name@^7.0.0", "@babel/plugin-transform-react-display-name@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.7.tgz#2753e875a1b702fb1d806c4f5d4c194d64cadd88"
+ integrity sha512-r0QY7NVU8OnrwE+w2IWiRom0wwsTbjx4+xH2RTd7AVdof3uurXOF+/mXHQDRk+2jIvWgSaCHKMgggfvM4dyUGA==
dependencies:
- "@babel/plugin-transform-react-jsx" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+
+"@babel/plugin-transform-react-jsx-development@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.7.tgz#2fbd77887b8fa2942d7cb61edf1029ea1b048554"
+ integrity sha512-5yd3lH1PWxzW6IZj+p+Y4OLQzz0/LzlOG8vGqonHfVR3euf1vyzyMUJk9Ac+m97BH46mFc/98t9PmYLyvgL3qg==
+ dependencies:
+ "@babel/plugin-transform-react-jsx" "^7.25.7"
"@babel/plugin-transform-react-jsx-self@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.7.tgz#66bff0248ea0b549972e733516ffad577477bdab"
- integrity sha512-fOPQYbGSgH0HUp4UJO4sMBFjY6DuWq+2i8rixyUMb3CdGixs/gccURvYOAhajBdKDoGajFr3mUq5rH3phtkGzw==
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.25.7.tgz#3d11df143131fd8f5486a1f7d3839890f88f8c85"
+ integrity sha512-JD9MUnLbPL0WdVK8AWC7F7tTG2OS6u/AKKnsK+NdRhUiVdnzyR1S3kKQCaRLOiaULvUiqK6Z4JQE635VgtCFeg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
"@babel/plugin-transform-react-jsx-source@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.7.tgz#1198aab2548ad19582013815c938d3ebd8291ee3"
- integrity sha512-J2z+MWzZHVOemyLweMqngXrgGC42jQ//R0KdxqkIz/OrbVIIlhFI3WigZ5fO+nwFvBlncr4MGapd8vTyc7RPNQ==
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.25.7.tgz#a0d8372310d5ea5b0447dfa03a8485f960eff7be"
+ integrity sha512-S/JXG/KrbIY06iyJPKfxr0qRxnhNOdkNXYBl/rmwgDd72cQLH9tEGkDm/yJPGvcSIUoikzfjMios9i+xT/uv9w==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.24.7.tgz#17cd06b75a9f0e2bd076503400e7c4b99beedac4"
- integrity sha512-+Dj06GDZEFRYvclU6k4bme55GKBEWUmByM/eoKuqg4zTNQHiApWRhQph5fxQB2wAEFvRzL1tOEj1RJ19wJrhoA==
+"@babel/plugin-transform-react-jsx@^7.0.0", "@babel/plugin-transform-react-jsx@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz#f5e2af6020a562fe048dd343e571c4428e6c5632"
+ integrity sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-jsx" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/plugin-syntax-jsx" "^7.25.7"
+ "@babel/types" "^7.25.7"
-"@babel/plugin-transform-react-pure-annotations@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.24.7.tgz#bdd9d140d1c318b4f28b29a00fb94f97ecab1595"
- integrity sha512-PLgBVk3fzbmEjBJ/u8kFzOqS9tUeDjiaWud/rRym/yjCo/M9cASPlnrd2ZmmZpQT40fOOrvR8jh+n8jikrOhNA==
+"@babel/plugin-transform-react-pure-annotations@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.7.tgz#6d0b8dadb2d3c5cbb8ade68c5efd49470b0d65f7"
+ integrity sha512-6YTHJ7yjjgYqGc8S+CbEXhLICODk0Tn92j+vNJo07HFk9t3bjFgAKxPLFhHwF2NjmQVSI1zBRfBWUeVBa2osfA==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-regenerator@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz#021562de4534d8b4b1851759fd7af4e05d2c47f8"
- integrity sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==
+"@babel/plugin-transform-regenerator@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.7.tgz#6eb006e6d26f627bc2f7844a9f19770721ad6f3e"
+ integrity sha512-mgDoQCRjrY3XK95UuV60tZlFCQGXEtMg8H+IsW72ldw1ih1jZhzYXbJvghmAEpg5UVhhnCeia1CkGttUvCkiMQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
regenerator-transform "^0.15.2"
-"@babel/plugin-transform-reserved-words@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz#80037fe4fbf031fc1125022178ff3938bb3743a4"
- integrity sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==
+"@babel/plugin-transform-reserved-words@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.7.tgz#dc56b25e02afaabef3ce0c5b06b0916e8523e995"
+ integrity sha512-3OfyfRRqiGeOvIWSagcwUTVk2hXBsr/ww7bLn6TRTuXnexA+Udov2icFOxFX9abaj4l96ooYkcNN1qi2Zvqwng==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
"@babel/plugin-transform-runtime@^7.0.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.24.7.tgz#00a5bfaf8c43cf5c8703a8a6e82b59d9c58f38ca"
- integrity sha512-YqXjrk4C+a1kZjewqt+Mmu2UuV1s07y8kqcUf4qYLnoqemhR4gRQikhdAhSVJioMjVTu6Mo6pAbaypEA3jY6fw==
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz#435a4fab67273f00047dc806e05069c9c6344e12"
+ integrity sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==
dependencies:
- "@babel/helper-module-imports" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-module-imports" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
babel-plugin-polyfill-corejs2 "^0.4.10"
- babel-plugin-polyfill-corejs3 "^0.10.1"
+ babel-plugin-polyfill-corejs3 "^0.10.6"
babel-plugin-polyfill-regenerator "^0.6.1"
semver "^6.3.1"
-"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz#85448c6b996e122fa9e289746140aaa99da64e73"
- integrity sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==
+"@babel/plugin-transform-shorthand-properties@^7.0.0", "@babel/plugin-transform-shorthand-properties@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.7.tgz#92690a9c671915602d91533c278cc8f6bf12275f"
+ integrity sha512-uBbxNwimHi5Bv3hUccmOFlUy3ATO6WagTApenHz9KzoIdn0XeACdB12ZJ4cjhuB2WSi80Ez2FWzJnarccriJeA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz#e8a38c0fde7882e0fb8f160378f74bd885cc7bb3"
- integrity sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==
+"@babel/plugin-transform-spread@^7.0.0", "@babel/plugin-transform-spread@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.7.tgz#df83e899a9fc66284ee601a7b738568435b92998"
+ integrity sha512-Mm6aeymI0PBh44xNIv/qvo8nmbkpZze1KvR8MkEqbIREDxoiWTi18Zr2jryfRMwDfVZF9foKh060fWgni44luw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-skip-transparent-expression-wrappers" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
-"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz#96ae80d7a7e5251f657b5cf18f1ea6bf926f5feb"
- integrity sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==
+"@babel/plugin-transform-sticky-regex@^7.0.0", "@babel/plugin-transform-sticky-regex@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.7.tgz#341c7002bef7f29037be7fb9684e374442dd0d17"
+ integrity sha512-ZFAeNkpGuLnAQ/NCsXJ6xik7Id+tHuS+NT+ue/2+rn/31zcdnupCdmunOizEaP0JsUmTFSTOPoQY7PkK2pttXw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-template-literals@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz#a05debb4a9072ae8f985bcf77f3f215434c8f8c8"
- integrity sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==
+"@babel/plugin-transform-template-literals@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.7.tgz#e566c581bb16d8541dd8701093bb3457adfce16b"
+ integrity sha512-SI274k0nUsFFmyQupiO7+wKATAmMFf8iFgq2O+vVFXZ0SV9lNfT1NGzBEhjquFmD8I9sqHLguH+gZVN3vww2AA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-typeof-symbol@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz#f074be466580d47d6e6b27473a840c9f9ca08fb0"
- integrity sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==
+"@babel/plugin-transform-typeof-symbol@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.7.tgz#debb1287182efd20488f126be343328c679b66eb"
+ integrity sha512-OmWmQtTHnO8RSUbL0NTdtpbZHeNTnm68Gj5pA4Y2blFNh+V4iZR68V1qL9cI37J21ZN7AaCnkfdHtLExQPf2uA==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-typescript@^7.24.7", "@babel/plugin-transform-typescript@^7.5.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.24.7.tgz#b006b3e0094bf0813d505e0c5485679eeaf4a881"
- integrity sha512-iLD3UNkgx2n/HrjBesVbYX6j0yqn/sJktvbtKKgcaLIQ4bTTQ8obAypc1VpyHPD2y4Phh9zHOaAt8e/L14wCpw==
+"@babel/plugin-transform-typescript@^7.25.7", "@babel/plugin-transform-typescript@^7.5.0":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.7.tgz#8fc7c3d28ddd36bce45b9b48594129d0e560cfbe"
+ integrity sha512-VKlgy2vBzj8AmEzunocMun2fF06bsSWV+FvVXohtL6FGve/+L217qhHxRTVGHEDO/YR8IANcjzgJsd04J8ge5Q==
dependencies:
- "@babel/helper-annotate-as-pure" "^7.24.7"
- "@babel/helper-create-class-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/plugin-syntax-typescript" "^7.24.7"
+ "@babel/helper-annotate-as-pure" "^7.25.7"
+ "@babel/helper-create-class-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.25.7"
+ "@babel/plugin-syntax-typescript" "^7.25.7"
-"@babel/plugin-transform-unicode-escapes@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz#2023a82ced1fb4971630a2e079764502c4148e0e"
- integrity sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==
+"@babel/plugin-transform-unicode-escapes@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.7.tgz#973592b6d13a914794e1de8cf1383e50e0f87f81"
+ integrity sha512-BN87D7KpbdiABA+t3HbVqHzKWUDN3dymLaTnPFAMyc8lV+KN3+YzNhVRNdinaCPA4AUqx7ubXbQ9shRjYBl3SQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-unicode-property-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz#9073a4cd13b86ea71c3264659590ac086605bbcd"
- integrity sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==
+"@babel/plugin-transform-unicode-property-regex@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.7.tgz#25349197cce964b1343f74fa7cfdf791a1b1919e"
+ integrity sha512-IWfR89zcEPQGB/iB408uGtSPlQd3Jpq11Im86vUgcmSTcoWAiQMCTOa2K2yNNqFJEBVICKhayctee65Ka8OB0w==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz#dfc3d4a51127108099b19817c0963be6a2adf19f"
- integrity sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==
+"@babel/plugin-transform-unicode-regex@^7.0.0", "@babel/plugin-transform-unicode-regex@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.7.tgz#f93a93441baf61f713b6d5552aaa856bfab34809"
+ integrity sha512-8JKfg/hiuA3qXnlLx8qtv5HWRbgyFx2hMMtpDDuU2rTckpKkGu4ycK5yYHwuEa16/quXfoxHBIApEsNyMWnt0g==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
-"@babel/plugin-transform-unicode-sets-regex@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz#d40705d67523803a576e29c63cef6e516b858ed9"
- integrity sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==
+"@babel/plugin-transform-unicode-sets-regex@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.7.tgz#d1b3295d29e0f8f4df76abc909ad1ebee919560c"
+ integrity sha512-YRW8o9vzImwmh4Q3Rffd09bH5/hvY0pxg+1H1i0f7APoUeg12G7+HhLj9ZFNIrYkgBXhIijPJ+IXypN0hLTIbw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
+ "@babel/helper-create-regexp-features-plugin" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
"@babel/preset-env@^7.22.10":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.24.7.tgz#ff067b4e30ba4a72f225f12f123173e77b987f37"
- integrity sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.25.8.tgz#dc6b719627fb29cd9cccbbbe041802fd575b524c"
+ integrity sha512-58T2yulDHMN8YMUxiLq5YmWUnlDCyY1FsHM+v12VMx+1/FlrUj5tY50iDCpofFQEM8fMYOaY9YRvym2jcjn1Dg==
dependencies:
- "@babel/compat-data" "^7.24.7"
- "@babel/helper-compilation-targets" "^7.24.7"
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.24.7"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.24.7"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.24.7"
- "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.24.7"
+ "@babel/compat-data" "^7.25.8"
+ "@babel/helper-compilation-targets" "^7.25.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-validator-option" "^7.25.7"
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.7"
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.7"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.7"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.7"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.7"
"@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
- "@babel/plugin-syntax-async-generators" "^7.8.4"
- "@babel/plugin-syntax-class-properties" "^7.12.13"
- "@babel/plugin-syntax-class-static-block" "^7.14.5"
- "@babel/plugin-syntax-dynamic-import" "^7.8.3"
- "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
- "@babel/plugin-syntax-import-assertions" "^7.24.7"
- "@babel/plugin-syntax-import-attributes" "^7.24.7"
- "@babel/plugin-syntax-import-meta" "^7.10.4"
- "@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.10.4"
- "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
- "@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
- "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-syntax-import-assertions" "^7.25.7"
+ "@babel/plugin-syntax-import-attributes" "^7.25.7"
"@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
- "@babel/plugin-transform-arrow-functions" "^7.24.7"
- "@babel/plugin-transform-async-generator-functions" "^7.24.7"
- "@babel/plugin-transform-async-to-generator" "^7.24.7"
- "@babel/plugin-transform-block-scoped-functions" "^7.24.7"
- "@babel/plugin-transform-block-scoping" "^7.24.7"
- "@babel/plugin-transform-class-properties" "^7.24.7"
- "@babel/plugin-transform-class-static-block" "^7.24.7"
- "@babel/plugin-transform-classes" "^7.24.7"
- "@babel/plugin-transform-computed-properties" "^7.24.7"
- "@babel/plugin-transform-destructuring" "^7.24.7"
- "@babel/plugin-transform-dotall-regex" "^7.24.7"
- "@babel/plugin-transform-duplicate-keys" "^7.24.7"
- "@babel/plugin-transform-dynamic-import" "^7.24.7"
- "@babel/plugin-transform-exponentiation-operator" "^7.24.7"
- "@babel/plugin-transform-export-namespace-from" "^7.24.7"
- "@babel/plugin-transform-for-of" "^7.24.7"
- "@babel/plugin-transform-function-name" "^7.24.7"
- "@babel/plugin-transform-json-strings" "^7.24.7"
- "@babel/plugin-transform-literals" "^7.24.7"
- "@babel/plugin-transform-logical-assignment-operators" "^7.24.7"
- "@babel/plugin-transform-member-expression-literals" "^7.24.7"
- "@babel/plugin-transform-modules-amd" "^7.24.7"
- "@babel/plugin-transform-modules-commonjs" "^7.24.7"
- "@babel/plugin-transform-modules-systemjs" "^7.24.7"
- "@babel/plugin-transform-modules-umd" "^7.24.7"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.24.7"
- "@babel/plugin-transform-new-target" "^7.24.7"
- "@babel/plugin-transform-nullish-coalescing-operator" "^7.24.7"
- "@babel/plugin-transform-numeric-separator" "^7.24.7"
- "@babel/plugin-transform-object-rest-spread" "^7.24.7"
- "@babel/plugin-transform-object-super" "^7.24.7"
- "@babel/plugin-transform-optional-catch-binding" "^7.24.7"
- "@babel/plugin-transform-optional-chaining" "^7.24.7"
- "@babel/plugin-transform-parameters" "^7.24.7"
- "@babel/plugin-transform-private-methods" "^7.24.7"
- "@babel/plugin-transform-private-property-in-object" "^7.24.7"
- "@babel/plugin-transform-property-literals" "^7.24.7"
- "@babel/plugin-transform-regenerator" "^7.24.7"
- "@babel/plugin-transform-reserved-words" "^7.24.7"
- "@babel/plugin-transform-shorthand-properties" "^7.24.7"
- "@babel/plugin-transform-spread" "^7.24.7"
- "@babel/plugin-transform-sticky-regex" "^7.24.7"
- "@babel/plugin-transform-template-literals" "^7.24.7"
- "@babel/plugin-transform-typeof-symbol" "^7.24.7"
- "@babel/plugin-transform-unicode-escapes" "^7.24.7"
- "@babel/plugin-transform-unicode-property-regex" "^7.24.7"
- "@babel/plugin-transform-unicode-regex" "^7.24.7"
- "@babel/plugin-transform-unicode-sets-regex" "^7.24.7"
+ "@babel/plugin-transform-arrow-functions" "^7.25.7"
+ "@babel/plugin-transform-async-generator-functions" "^7.25.8"
+ "@babel/plugin-transform-async-to-generator" "^7.25.7"
+ "@babel/plugin-transform-block-scoped-functions" "^7.25.7"
+ "@babel/plugin-transform-block-scoping" "^7.25.7"
+ "@babel/plugin-transform-class-properties" "^7.25.7"
+ "@babel/plugin-transform-class-static-block" "^7.25.8"
+ "@babel/plugin-transform-classes" "^7.25.7"
+ "@babel/plugin-transform-computed-properties" "^7.25.7"
+ "@babel/plugin-transform-destructuring" "^7.25.7"
+ "@babel/plugin-transform-dotall-regex" "^7.25.7"
+ "@babel/plugin-transform-duplicate-keys" "^7.25.7"
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.7"
+ "@babel/plugin-transform-dynamic-import" "^7.25.8"
+ "@babel/plugin-transform-exponentiation-operator" "^7.25.7"
+ "@babel/plugin-transform-export-namespace-from" "^7.25.8"
+ "@babel/plugin-transform-for-of" "^7.25.7"
+ "@babel/plugin-transform-function-name" "^7.25.7"
+ "@babel/plugin-transform-json-strings" "^7.25.8"
+ "@babel/plugin-transform-literals" "^7.25.7"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.25.8"
+ "@babel/plugin-transform-member-expression-literals" "^7.25.7"
+ "@babel/plugin-transform-modules-amd" "^7.25.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.25.7"
+ "@babel/plugin-transform-modules-systemjs" "^7.25.7"
+ "@babel/plugin-transform-modules-umd" "^7.25.7"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.7"
+ "@babel/plugin-transform-new-target" "^7.25.7"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.25.8"
+ "@babel/plugin-transform-numeric-separator" "^7.25.8"
+ "@babel/plugin-transform-object-rest-spread" "^7.25.8"
+ "@babel/plugin-transform-object-super" "^7.25.7"
+ "@babel/plugin-transform-optional-catch-binding" "^7.25.8"
+ "@babel/plugin-transform-optional-chaining" "^7.25.8"
+ "@babel/plugin-transform-parameters" "^7.25.7"
+ "@babel/plugin-transform-private-methods" "^7.25.7"
+ "@babel/plugin-transform-private-property-in-object" "^7.25.8"
+ "@babel/plugin-transform-property-literals" "^7.25.7"
+ "@babel/plugin-transform-regenerator" "^7.25.7"
+ "@babel/plugin-transform-reserved-words" "^7.25.7"
+ "@babel/plugin-transform-shorthand-properties" "^7.25.7"
+ "@babel/plugin-transform-spread" "^7.25.7"
+ "@babel/plugin-transform-sticky-regex" "^7.25.7"
+ "@babel/plugin-transform-template-literals" "^7.25.7"
+ "@babel/plugin-transform-typeof-symbol" "^7.25.7"
+ "@babel/plugin-transform-unicode-escapes" "^7.25.7"
+ "@babel/plugin-transform-unicode-property-regex" "^7.25.7"
+ "@babel/plugin-transform-unicode-regex" "^7.25.7"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.25.7"
"@babel/preset-modules" "0.1.6-no-external-plugins"
babel-plugin-polyfill-corejs2 "^0.4.10"
- babel-plugin-polyfill-corejs3 "^0.10.4"
+ babel-plugin-polyfill-corejs3 "^0.10.6"
babel-plugin-polyfill-regenerator "^0.6.1"
- core-js-compat "^3.31.0"
+ core-js-compat "^3.38.1"
semver "^6.3.1"
"@babel/preset-flow@^7.13.13":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.24.7.tgz#eef5cb8e05e97a448fc50c16826f5612fe512c06"
- integrity sha512-NL3Lo0NorCU607zU3NwRyJbpaB6E3t0xtd3LfAQKDfkeX4/ggcDXvkmkW42QWT5owUeW/jAe4hn+2qvkV1IbfQ==
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.25.7.tgz#a9460677c182c2e105c32567a036d360c86668a9"
+ integrity sha512-q2x3g0YHzo/Ohsr51KOYS/BtZMsvkzVd8qEyhZAyTatYdobfgXCuyppTqTuIhdq5kR/P3nyyVvZ6H5dMc4PnCQ==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- "@babel/plugin-transform-flow-strip-types" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-validator-option" "^7.25.7"
+ "@babel/plugin-transform-flow-strip-types" "^7.25.7"
"@babel/preset-modules@0.1.6-no-external-plugins":
version "0.1.6-no-external-plugins"
@@ -1250,32 +1207,32 @@
esutils "^2.0.2"
"@babel/preset-react@^7.22.15":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.24.7.tgz#480aeb389b2a798880bf1f889199e3641cbb22dc"
- integrity sha512-AAH4lEkpmzFWrGVlHaxJB7RLH21uPQ9+He+eFLWHmF9IuFQVugz8eAsamaW0DXRrTfco5zj1wWtpdcXJUOfsag==
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.25.7.tgz#081cbe1dea363b732764d06a0fdda67ffa17735d"
+ integrity sha512-GjV0/mUEEXpi1U5ZgDprMRRgajGMRW3G5FjMr5KLKD8nT2fTG8+h/klV3+6Dm5739QE+K5+2e91qFKAYI3pmRg==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- "@babel/plugin-transform-react-display-name" "^7.24.7"
- "@babel/plugin-transform-react-jsx" "^7.24.7"
- "@babel/plugin-transform-react-jsx-development" "^7.24.7"
- "@babel/plugin-transform-react-pure-annotations" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-validator-option" "^7.25.7"
+ "@babel/plugin-transform-react-display-name" "^7.25.7"
+ "@babel/plugin-transform-react-jsx" "^7.25.7"
+ "@babel/plugin-transform-react-jsx-development" "^7.25.7"
+ "@babel/plugin-transform-react-pure-annotations" "^7.25.7"
"@babel/preset-typescript@^7.13.0", "@babel/preset-typescript@^7.23.0":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.24.7.tgz#66cd86ea8f8c014855671d5ea9a737139cbbfef1"
- integrity sha512-SyXRe3OdWwIwalxDg5UtJnJQO+YPcTfwiIY2B0Xlddh9o7jpWLvv8X1RthIeDOxQ+O1ML5BLPCONToObyVQVuQ==
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz#43c5b68eccb856ae5b52274b77b1c3c413cde1b7"
+ integrity sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==
dependencies:
- "@babel/helper-plugin-utils" "^7.24.7"
- "@babel/helper-validator-option" "^7.24.7"
- "@babel/plugin-syntax-jsx" "^7.24.7"
- "@babel/plugin-transform-modules-commonjs" "^7.24.7"
- "@babel/plugin-transform-typescript" "^7.24.7"
+ "@babel/helper-plugin-utils" "^7.25.7"
+ "@babel/helper-validator-option" "^7.25.7"
+ "@babel/plugin-syntax-jsx" "^7.25.7"
+ "@babel/plugin-transform-modules-commonjs" "^7.25.7"
+ "@babel/plugin-transform-typescript" "^7.25.7"
"@babel/register@^7.13.16":
- version "7.24.6"
- resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.24.6.tgz#59e21dcc79e1d04eed5377633b0f88029a6bef9e"
- integrity sha512-WSuFCc2wCqMeXkz/i3yfAAsxwWflEgbVkZzivgAmXl/MxrXeoYFZOOPllbC8R8WTF7u61wSRQtDVZ1879cdu6w==
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/register/-/register-7.25.7.tgz#75ec0d3a8f843d344c51bf2f18fcc03f3a4c9117"
+ integrity sha512-qHTd2Rhn/rKhSUwdY6+n98FmwXN+N+zxSVx3zWqRe9INyvTpv+aQ5gDV2+43ACd3VtMBzPPljbb0gZb8u5ma6Q==
dependencies:
clone-deep "^4.0.1"
find-cache-dir "^2.0.0"
@@ -1283,50 +1240,42 @@
pirates "^4.0.6"
source-map-support "^0.5.16"
-"@babel/regjsgen@^0.8.0":
- version "0.8.0"
- resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
- integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-
-"@babel/runtime@^7.0.0", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.22.10", "@babel/runtime@^7.8.4":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.24.7.tgz#f4f0d5530e8dbdf59b3451b9b3e594b6ba082e12"
- integrity sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==
+"@babel/runtime@^7.0.0", "@babel/runtime@^7.18.6", "@babel/runtime@^7.20.0", "@babel/runtime@^7.22.10", "@babel/runtime@^7.25.0", "@babel/runtime@^7.8.4":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.25.7.tgz#7ffb53c37a8f247c8c4d335e89cdf16a2e0d0fb6"
+ integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==
dependencies:
regenerator-runtime "^0.14.0"
-"@babel/template@^7.0.0", "@babel/template@^7.24.7", "@babel/template@^7.3.3":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.24.7.tgz#02efcee317d0609d2c07117cb70ef8fb17ab7315"
- integrity sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==
+"@babel/template@^7.0.0", "@babel/template@^7.25.7", "@babel/template@^7.3.3":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.25.7.tgz#27f69ce382855d915b14ab0fe5fb4cbf88fa0769"
+ integrity sha512-wRwtAgI3bAS+JGU2upWNL9lSlDcRCqD05BZ1n3X2ONLH1WilFP6O1otQjeMK/1g0pvYcXC7b/qVUB1keofjtZA==
dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/parser" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/code-frame" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/types" "^7.25.7"
-"@babel/traverse@^7.20.0", "@babel/traverse@^7.24.7":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.24.7.tgz#de2b900163fa741721ba382163fe46a936c40cf5"
- integrity sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==
+"@babel/traverse@^7.20.0", "@babel/traverse@^7.25.7":
+ version "7.25.7"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.25.7.tgz#83e367619be1cab8e4f2892ef30ba04c26a40fa8"
+ integrity sha512-jatJPT1Zjqvh/1FyJs6qAHL+Dzb7sTb+xr7Q+gM1b+1oBsMsQQ4FkVKb6dFlJvLlVssqkRzV05Jzervt9yhnzg==
dependencies:
- "@babel/code-frame" "^7.24.7"
- "@babel/generator" "^7.24.7"
- "@babel/helper-environment-visitor" "^7.24.7"
- "@babel/helper-function-name" "^7.24.7"
- "@babel/helper-hoist-variables" "^7.24.7"
- "@babel/helper-split-export-declaration" "^7.24.7"
- "@babel/parser" "^7.24.7"
- "@babel/types" "^7.24.7"
+ "@babel/code-frame" "^7.25.7"
+ "@babel/generator" "^7.25.7"
+ "@babel/parser" "^7.25.7"
+ "@babel/template" "^7.25.7"
+ "@babel/types" "^7.25.7"
debug "^4.3.1"
globals "^11.1.0"
-"@babel/types@^7.0.0", "@babel/types@^7.19.0", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
- version "7.24.7"
- resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.24.7.tgz#6027fe12bc1aa724cd32ab113fb7f1988f1f66f2"
- integrity sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==
+"@babel/types@^7.0.0", "@babel/types@^7.19.0", "@babel/types@^7.2.0", "@babel/types@^7.20.0", "@babel/types@^7.20.7", "@babel/types@^7.24.7", "@babel/types@^7.25.7", "@babel/types@^7.25.8", "@babel/types@^7.3.3", "@babel/types@^7.4.4":
+ version "7.25.8"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.25.8.tgz#5cf6037258e8a9bcad533f4979025140cb9993e1"
+ integrity sha512-JWtuCu8VQsMladxVz/P4HzHUGCAwpuqacmowgXFs5XjxIgKuNjnLokQzuVjlTvIzODaDmpjT3oxcC48vyk9EWg==
dependencies:
- "@babel/helper-string-parser" "^7.24.7"
- "@babel/helper-validator-identifier" "^7.24.7"
+ "@babel/helper-string-parser" "^7.25.7"
+ "@babel/helper-validator-identifier" "^7.25.7"
to-fast-properties "^2.0.0"
"@bcoe/v8-coverage@^0.2.3":
@@ -1342,9 +1291,9 @@
eslint-visitor-keys "^3.3.0"
"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.6.1":
- version "4.11.0"
- resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae"
- integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A==
+ version "4.11.1"
+ resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.1.tgz#a547badfc719eb3e5f4b556325e542fbe9d7a18f"
+ integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==
"@eslint/eslintrc@^2.1.4":
version "2.1.4"
@@ -1361,39 +1310,36 @@
minimatch "^3.1.2"
strip-json-comments "^3.1.1"
-"@eslint/js@8.57.0":
- version "8.57.0"
- resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.0.tgz#a5417ae8427873f1dd08b70b3574b453e67b5f7f"
- integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==
+"@eslint/js@8.57.1":
+ version "8.57.1"
+ resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.57.1.tgz#de633db3ec2ef6a3c89e2f19038063e8a122e2c2"
+ integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==
"@expo/bunyan@^4.0.0":
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/@expo/bunyan/-/bunyan-4.0.0.tgz#be0c1de943c7987a9fbd309ea0b1acd605890c7b"
- integrity sha512-Ydf4LidRB/EBI+YrB+cVLqIseiRfjUI/AeHBgjGMtq3GroraDu81OV7zqophRgupngoL3iS3JUMDMnxO7g39qA==
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@expo/bunyan/-/bunyan-4.0.1.tgz#ab9e17e36c71c704a0ce72168378a487368da736"
+ integrity sha512-+Lla7nYSiHZirgK+U/uYzsLv/X+HaJienbD5AKX1UQZHYfWaP+9uuQluRB4GrEVWF0GZ7vEVp/jzaOT9k/SQlg==
dependencies:
uuid "^8.0.0"
- optionalDependencies:
- mv "~2"
- safe-json-stringify "~1"
-"@expo/cli@0.18.22":
- version "0.18.22"
- resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.18.22.tgz#29251bd439bae59324cad77d34d80afcb6231a32"
- integrity sha512-s2VM+QvgjdDHIRskQj2ER6gKK3/rybiEA0snfKJZ7iXHN5sqiUzY7G/+i5wses842hsLQefCjwo/x6tzWNrF2A==
+"@expo/cli@0.18.30":
+ version "0.18.30"
+ resolved "https://registry.yarnpkg.com/@expo/cli/-/cli-0.18.30.tgz#0cb4829aa11e98ae350a5c15958b9816e9a1d2f0"
+ integrity sha512-V90TUJh9Ly8stYo8nwqIqNWCsYjE28GlVFWEhAFCUOp99foiQr8HSTpiiX5GIrprcPoWmlGoY+J5fQA29R4lFg==
dependencies:
"@babel/runtime" "^7.20.0"
"@expo/code-signing-certificates" "0.0.5"
"@expo/config" "~9.0.0-beta.0"
- "@expo/config-plugins" "~8.0.0-beta.0"
+ "@expo/config-plugins" "~8.0.8"
"@expo/devcert" "^1.0.0"
"@expo/env" "~0.3.0"
"@expo/image-utils" "^0.5.0"
"@expo/json-file" "^8.3.0"
- "@expo/metro-config" "~0.18.6"
+ "@expo/metro-config" "0.18.11"
"@expo/osascript" "^2.0.31"
"@expo/package-manager" "^1.5.0"
"@expo/plist" "^0.1.0"
- "@expo/prebuild-config" "7.0.7"
+ "@expo/prebuild-config" "7.0.9"
"@expo/rudder-sdk-node" "1.1.1"
"@expo/spawn-async" "^1.7.2"
"@expo/xcpretty" "^4.3.0"
@@ -1467,12 +1413,12 @@
node-forge "^1.2.1"
nullthrows "^1.1.1"
-"@expo/config-plugins@8.0.7", "@expo/config-plugins@~8.0.0", "@expo/config-plugins@~8.0.0-beta.0":
- version "8.0.7"
- resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.7.tgz#6cc3a9bd05ff7d522a5ec1c83e28cab5ed431dc5"
- integrity sha512-7xZCWTRA3SFjbLSCx4Rge8gvgaGbkduETrZx+l4r1hiUdFcG5BAt1CwcOYvTYrOy1nkvloIYJxeU/9AwADeevA==
+"@expo/config-plugins@8.0.10", "@expo/config-plugins@~8.0.8":
+ version "8.0.10"
+ resolved "https://registry.yarnpkg.com/@expo/config-plugins/-/config-plugins-8.0.10.tgz#5cda076f38bc04675cb42d8acdd23d6e460a62de"
+ integrity sha512-KG1fnSKRmsudPU9BWkl59PyE0byrE2HTnqbOrgwr2FAhqh7tfr9nRs6A9oLS/ntpGzmFxccTEcsV0L4apsuxxg==
dependencies:
- "@expo/config-types" "^51.0.0-unreleased"
+ "@expo/config-types" "^51.0.3"
"@expo/json-file" "~8.3.0"
"@expo/plist" "^0.1.0"
"@expo/sdk-runtime-versions" "^1.0.0"
@@ -1488,36 +1434,19 @@
xcode "^3.0.1"
xml2js "0.6.0"
-"@expo/config-types@^51.0.0-unreleased":
- version "51.0.2"
- resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-51.0.2.tgz#7385451b180d34d8f2a4eeb5feabe1fe3c5d4f32"
- integrity sha512-IglkIoiDwJMY01lYkF/ZSBoe/5cR+O3+Gx6fpLFjLfgZGBTdyPkKa1g8NWoWQCk+D3cKL2MDbszT2DyRRB0YqQ==
+"@expo/config-types@^51.0.3":
+ version "51.0.3"
+ resolved "https://registry.yarnpkg.com/@expo/config-types/-/config-types-51.0.3.tgz#520bdce5fd75f9d234fd81bd0347443086419450"
+ integrity sha512-hMfuq++b8VySb+m9uNNrlpbvGxYc8OcFCUX9yTmi9tlx6A4k8SDabWFBgmnr4ao3wEArvWrtUQIfQCVtPRdpKA==
-"@expo/config@9.0.1":
- version "9.0.1"
- resolved "https://registry.yarnpkg.com/@expo/config/-/config-9.0.1.tgz#e7b79de5af29d5ab2a98a62c3cda31f03bd75827"
- integrity sha512-0tjaXBstTbXmD4z+UMFBkh2SZFwilizSQhW6DlaTMnPG5ezuw93zSFEWAuEC3YzkpVtNQTmYzxAYjxwh6seOGg==
+"@expo/config@9.0.4", "@expo/config@~9.0.0", "@expo/config@~9.0.0-beta.0":
+ version "9.0.4"
+ resolved "https://registry.yarnpkg.com/@expo/config/-/config-9.0.4.tgz#52f0a94edd0e2c36dfb5e284cc1a6d99d9d2af97"
+ integrity sha512-g5ns5u1JSKudHYhjo1zaSfkJ/iZIcWmUmIQptMJZ6ag1C0ShL2sj8qdfU8MmAMuKLOgcIfSaiWlQnm4X3VJVkg==
dependencies:
"@babel/code-frame" "~7.10.4"
- "@expo/config-plugins" "~8.0.0-beta.0"
- "@expo/config-types" "^51.0.0-unreleased"
- "@expo/json-file" "^8.3.0"
- getenv "^1.0.0"
- glob "7.1.6"
- require-from-string "^2.0.2"
- resolve-from "^5.0.0"
- semver "^7.6.0"
- slugify "^1.3.4"
- sucrase "3.34.0"
-
-"@expo/config@~9.0.0", "@expo/config@~9.0.0-beta.0":
- version "9.0.2"
- resolved "https://registry.yarnpkg.com/@expo/config/-/config-9.0.2.tgz#112b93436dbca8aa3da73a46329e5b58fdd435d2"
- integrity sha512-BKQ4/qBf3OLT8hHp5kjObk2vxwoRQ1yYQBbG/OM9Jdz32yYtrU8opTbKRAxfZEWH5i3ZHdLrPdC1rO0I6WxtTw==
- dependencies:
- "@babel/code-frame" "~7.10.4"
- "@expo/config-plugins" "~8.0.0"
- "@expo/config-types" "^51.0.0-unreleased"
+ "@expo/config-plugins" "~8.0.8"
+ "@expo/config-types" "^51.0.3"
"@expo/json-file" "^8.3.0"
getenv "^1.0.0"
glob "7.1.6"
@@ -1528,20 +1457,19 @@
sucrase "3.34.0"
"@expo/devcert@^1.0.0":
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/@expo/devcert/-/devcert-1.1.2.tgz#a4923b8ea5b34fde31d6e006a40d0f594096a0ed"
- integrity sha512-FyWghLu7rUaZEZSTLt/XNRukm0c9GFfwP0iFaswoDWpV6alvVg+zRAfCLdIVQEz1SVcQ3zo1hMZFDrnKGvkCuQ==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/@expo/devcert/-/devcert-1.1.4.tgz#d98807802a541847cc42791a606bfdc26e641277"
+ integrity sha512-fqBODr8c72+gBSX5Ty3SIzaY4bXainlpab78+vEYEKL3fXmsOswMLf0+KE36mUEAa36BYabX7K3EiXOXX5OPMw==
dependencies:
application-config-path "^0.1.0"
command-exists "^1.2.4"
debug "^3.1.0"
eol "^0.9.1"
get-port "^3.2.0"
- glob "^7.1.2"
+ glob "^10.4.2"
lodash "^4.17.21"
mkdirp "^0.5.1"
password-prompt "^1.0.4"
- rimraf "^2.6.2"
sudo-prompt "^8.2.0"
tmp "^0.0.33"
tslib "^2.4.0"
@@ -1582,10 +1510,10 @@
json5 "^2.2.2"
write-file-atomic "^2.3.0"
-"@expo/metro-config@0.18.8", "@expo/metro-config@~0.18.6":
- version "0.18.8"
- resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-0.18.8.tgz#2902bfdb864876da3cf5b1822a554bbb011e4a77"
- integrity sha512-YGpTlVc1/6EPzPbt0LZt92Bwrpjngulup6uHSTRbwn/heMPfFaVv1Y4VE3GAUkx7/Qwu+dTVIV0Kys4pLOAIiw==
+"@expo/metro-config@0.18.11":
+ version "0.18.11"
+ resolved "https://registry.yarnpkg.com/@expo/metro-config/-/metro-config-0.18.11.tgz#22e82d92fb9d94ac760cc8b3bff48e6f32b4f032"
+ integrity sha512-/uOq55VbSf9yMbUO1BudkUM2SsGW1c5hr9BnhIqYqcsFv0Jp5D3DtJ4rljDKaUeNLbwr6m7pqIrkSMq5NrYf4Q==
dependencies:
"@babel/core" "^7.20.0"
"@babel/generator" "^7.20.5"
@@ -1607,9 +1535,9 @@
resolve-from "^5.0.0"
"@expo/metro-runtime@~3.2.1":
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/@expo/metro-runtime/-/metro-runtime-3.2.1.tgz#bbab2ca9d0c8d256172eb4688123af6be67c7674"
- integrity sha512-L7xNo5SmK+rcuXDm/+VBBImpA7FZsVB+m/rNr3fNl5or+1+yrZe99ViF7LZ8DOoVqAqcb4aCAXvGrP2JNYo1/Q==
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/@expo/metro-runtime/-/metro-runtime-3.2.3.tgz#e074c28084f30725f8d0d0eeee4fcd6074797d2d"
+ integrity sha512-v5ji+fAGi7B9YavrxvekuF8gXEV/5fz0+PhaED5AaFDnbGB4IJIbpaiqK9nqZV1axjGZNQSw6Q8TsnFetCR3bQ==
"@expo/osascript@^2.0.31":
version "2.1.3"
@@ -1646,14 +1574,14 @@
base64-js "^1.2.3"
xmlbuilder "^14.0.0"
-"@expo/prebuild-config@7.0.7":
- version "7.0.7"
- resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-7.0.7.tgz#5ba088c7166a721ca16c7a0ad524110c0512a003"
- integrity sha512-yN7rSINZrBVu7VfFJk0G4U/cAEjCiiyPfXmXsToHVFxWtxn8jrxyyA1JfQH3xMHJs++sqpKR9yVRtb6ZgUNeJA==
+"@expo/prebuild-config@7.0.9":
+ version "7.0.9"
+ resolved "https://registry.yarnpkg.com/@expo/prebuild-config/-/prebuild-config-7.0.9.tgz#7abd489e18ed6514a0c9cd214eb34c0d5efda799"
+ integrity sha512-9i6Cg7jInpnGEHN0jxnW0P+0BexnePiBzmbUvzSbRXpdXihYUX2AKMu73jgzxn5P1hXOSkzNS7umaY+BZ+aBag==
dependencies:
"@expo/config" "~9.0.0-beta.0"
- "@expo/config-plugins" "~8.0.0-beta.0"
- "@expo/config-types" "^51.0.0-unreleased"
+ "@expo/config-plugins" "~8.0.8"
+ "@expo/config-types" "^51.0.3"
"@expo/image-utils" "^0.5.0"
"@expo/json-file" "^8.3.0"
"@react-native/normalize-colors" "0.74.85"
@@ -1688,10 +1616,10 @@
dependencies:
cross-spawn "^7.0.3"
-"@expo/vector-icons@^14.0.0":
- version "14.0.2"
- resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-14.0.2.tgz#f7f6c4cb5ef356d1171d2b4e059217556738fd3b"
- integrity sha512-70LpmXQu4xa8cMxjp1fydgRPsalefnHaXLzIwaHMEzcZhnyjw2acZz8azRrZOslPVAWlxItOa2Dd7WtD/kI+CA==
+"@expo/vector-icons@^14.0.3":
+ version "14.0.4"
+ resolved "https://registry.yarnpkg.com/@expo/vector-icons/-/vector-icons-14.0.4.tgz#fa9d4351877312badf91a806598b2f0bab16039a"
+ integrity sha512-+yKshcbpDfbV4zoXOgHxCwh7lkE9VVTT5T03OUlBsqfze1PLy6Hi4jp1vSb1GVbY6eskvMIivGVc9SKzIv0oEQ==
dependencies:
prop-types "^15.8.1"
@@ -1722,12 +1650,12 @@
dependencies:
"@hapi/hoek" "^9.0.0"
-"@humanwhocodes/config-array@^0.11.14":
- version "0.11.14"
- resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz#d78e481a039f7566ecc9660b4ea7fe6b1fec442b"
- integrity sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==
+"@humanwhocodes/config-array@^0.13.0":
+ version "0.13.0"
+ resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.13.0.tgz#fb907624df3256d04b9aa2df50d7aa97ec648748"
+ integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==
dependencies:
- "@humanwhocodes/object-schema" "^2.0.2"
+ "@humanwhocodes/object-schema" "^2.0.3"
debug "^4.3.1"
minimatch "^3.0.5"
@@ -1736,7 +1664,7 @@
resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c"
integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==
-"@humanwhocodes/object-schema@^2.0.2":
+"@humanwhocodes/object-schema@^2.0.3":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3"
integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==
@@ -2021,9 +1949,9 @@
"@jridgewell/trace-mapping" "^0.3.25"
"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14":
- version "1.4.15"
- resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
- integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
+ integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
version "0.3.25"
@@ -2034,9 +1962,9 @@
"@jridgewell/sourcemap-codec" "^1.4.14"
"@microsoft/applicationinsights-web-snippet@^1.0.1":
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.2.0.tgz#2c1b3761e008f1e16ae84974b37523d709af5dd8"
- integrity sha512-KpJzrC+VYOKSNVOlk0vIxsQ6ZmZOswdNXvkv+nVBsz6tzRI86fKW2qKTCzKcd80f3xOa6dxg6OfEljQPcelQ7g==
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/@microsoft/applicationinsights-web-snippet/-/applicationinsights-web-snippet-1.2.1.tgz#c158081f8c40ea9ad94475abac15f67182768882"
+ integrity sha512-+Cy9zFqdQgdAbMK1dpm7B+3DUnrByai0Tq6XG9v737HJpW6G1EiNNbTuFeXdPWyGaq6FIx9jxm/SUcxA6/Rxxg==
"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1":
version "5.1.1-v1"
@@ -2073,66 +2001,64 @@
dependencies:
semver "^7.3.5"
-"@opentelemetry/api@^1.4.1":
+"@opentelemetry/api-logs@0.53.0":
+ version "0.53.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.53.0.tgz#c478cbd8120ec2547b64edfa03a552cfe42170be"
+ integrity sha512-8HArjKx+RaAI8uEIgcORbZIPklyh1YLjPSBus8hjRmvLi6DeFzgOcdZ7KwPabKj8mXF8dX0hyfAyGfycz0DbFw==
+ dependencies:
+ "@opentelemetry/api" "^1.0.0"
+
+"@opentelemetry/api@^1.0.0", "@opentelemetry/api@^1.4.1", "@opentelemetry/api@^1.9.0":
version "1.9.0"
resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.0.tgz#d03eba68273dc0f7509e2a3d5cba21eae10379fe"
integrity sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==
-"@opentelemetry/core@1.25.1", "@opentelemetry/core@^1.15.2":
- version "1.25.1"
- resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.25.1.tgz#ff667d939d128adfc7c793edae2f6bca177f829d"
- integrity sha512-GeT/l6rBYWVQ4XArluLVB6WWQ8flHbdb6r2FCHC3smtdOAbrJBIv35tpV/yp9bmYUJf+xmZpu9DRTIeJVhFbEQ==
+"@opentelemetry/core@1.26.0", "@opentelemetry/core@^1.15.2", "@opentelemetry/core@^1.26.0":
+ version "1.26.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.26.0.tgz#7d84265aaa850ed0ca5813f97d831155be42b328"
+ integrity sha512-1iKxXXE8415Cdv0yjG3G6hQnB5eVEsJce3QaawX8SjDn0mAS0ZM8fAbZZJD4ajvhC15cePvosSCut404KrIIvQ==
dependencies:
- "@opentelemetry/semantic-conventions" "1.25.1"
+ "@opentelemetry/semantic-conventions" "1.27.0"
-"@opentelemetry/instrumentation@^0.41.2":
- version "0.41.2"
- resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.41.2.tgz#cae11fa64485dcf03dae331f35b315b64bc6189f"
- integrity sha512-rxU72E0pKNH6ae2w5+xgVYZLzc5mlxAbGzF4shxMVK8YC2QQsfN38B2GPbj0jvrKWWNUElfclQ+YTykkNg/grw==
+"@opentelemetry/instrumentation@^0.53.0":
+ version "0.53.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.53.0.tgz#e6369e4015eb5112468a4d45d38dcada7dad892d"
+ integrity sha512-DMwg0hy4wzf7K73JJtl95m/e0boSoWhH07rfvHvYzQtBD3Bmv0Wc1x733vyZBqmFm8OjJD0/pfiUg1W3JjFX0A==
dependencies:
- "@types/shimmer" "^1.0.2"
- import-in-the-middle "1.4.2"
+ "@opentelemetry/api-logs" "0.53.0"
+ "@types/shimmer" "^1.2.0"
+ import-in-the-middle "^1.8.1"
require-in-the-middle "^7.1.1"
- semver "^7.5.1"
+ semver "^7.5.2"
shimmer "^1.2.1"
-"@opentelemetry/resources@1.25.1":
- version "1.25.1"
- resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.25.1.tgz#bb9a674af25a1a6c30840b755bc69da2796fefbb"
- integrity sha512-pkZT+iFYIZsVn6+GzM0kSX+u3MSLCY9md+lIJOoKl/P+gJFfxJte/60Usdp8Ce4rOs8GduUpSPNe1ddGyDT1sQ==
+"@opentelemetry/resources@1.26.0":
+ version "1.26.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.26.0.tgz#da4c7366018bd8add1f3aa9c91c6ac59fd503cef"
+ integrity sha512-CPNYchBE7MBecCSVy0HKpUISEeJOniWqcHaAHpmasZ3j9o6V3AyBzhRc90jdmemq0HOxDr6ylhUbDhBqqPpeNw==
dependencies:
- "@opentelemetry/core" "1.25.1"
- "@opentelemetry/semantic-conventions" "1.25.1"
+ "@opentelemetry/core" "1.26.0"
+ "@opentelemetry/semantic-conventions" "1.27.0"
"@opentelemetry/sdk-trace-base@^1.15.2":
- version "1.25.1"
- resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.25.1.tgz#cbc1e60af255655d2020aa14cde17b37bd13df37"
- integrity sha512-C8k4hnEbc5FamuZQ92nTOp8X/diCY56XUTnMiv9UTuJitCzaNNHAVsdm5+HLCdI8SLQsLWIrG38tddMxLVoftw==
+ version "1.26.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.26.0.tgz#0c913bc6d2cfafd901de330e4540952269ae579c"
+ integrity sha512-olWQldtvbK4v22ymrKLbIcBi9L2SpMO84sCPY54IVsJhP9fRsxJT194C/AVaAuJzLE30EdhhM1VmvVYR7az+cw==
dependencies:
- "@opentelemetry/core" "1.25.1"
- "@opentelemetry/resources" "1.25.1"
- "@opentelemetry/semantic-conventions" "1.25.1"
+ "@opentelemetry/core" "1.26.0"
+ "@opentelemetry/resources" "1.26.0"
+ "@opentelemetry/semantic-conventions" "1.27.0"
-"@opentelemetry/semantic-conventions@1.25.1", "@opentelemetry/semantic-conventions@^1.15.2":
- version "1.25.1"
- resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.25.1.tgz#0deecb386197c5e9c2c28f2f89f51fb8ae9f145e"
- integrity sha512-ZDjMJJQRlyk8A1KZFCc+bCbsyrn1wTwdNt56F7twdfUfnHUZUq77/WfONCj8p72NZOyP7pNTdUWSTYC3GTbuuQ==
+"@opentelemetry/semantic-conventions@1.27.0", "@opentelemetry/semantic-conventions@^1.15.2":
+ version "1.27.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.27.0.tgz#1a857dcc95a5ab30122e04417148211e6f945e6c"
+ integrity sha512-sAay1RrB+ONOem0OZanAR1ZI/k7yDpnOQSQmTMuGImUQb2y8EbSaCJ94FQluM74xoU03vlb2d2U90hZluL6nQg==
"@pkgjs/parseargs@^0.11.0":
version "0.11.0"
resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
-"@react-native-community/cli-clean@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-13.6.4.tgz#53c07c6f2834a971dc40eab290edcf8ccc5d1e00"
- integrity sha512-nS1BJ+2Z+aLmqePxB4AYgJ+C/bgQt02xAgSYtCUv+lneRBGhL2tHRrK8/Iolp0y+yQoUtHHf4txYi90zGXLVfw==
- dependencies:
- "@react-native-community/cli-tools" "13.6.4"
- chalk "^4.1.2"
- execa "^5.0.0"
- fast-glob "^3.3.2"
-
"@react-native-community/cli-clean@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-clean/-/cli-clean-13.6.9.tgz#b6754f39c2b877c9d730feb848945150e1d52209"
@@ -2143,18 +2069,6 @@
execa "^5.0.0"
fast-glob "^3.3.2"
-"@react-native-community/cli-config@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-13.6.4.tgz#3004c7bca55cb384b3a99c38c1a48dad24533237"
- integrity sha512-GGK415WoTx1R9FXtfb/cTnan9JIWwSm+a5UCuFd6+suzS0oIt1Md1vCzjNh6W1CK3b43rZC2e+3ZU7Ljd7YtyQ==
- dependencies:
- "@react-native-community/cli-tools" "13.6.4"
- chalk "^4.1.2"
- cosmiconfig "^5.1.0"
- deepmerge "^4.3.0"
- fast-glob "^3.3.2"
- joi "^17.2.1"
-
"@react-native-community/cli-config@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-config/-/cli-config-13.6.9.tgz#d609a64d40a173c89bd7d24e31807bb7dcba69f9"
@@ -2167,13 +2081,6 @@
fast-glob "^3.3.2"
joi "^17.2.1"
-"@react-native-community/cli-debugger-ui@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.4.tgz#3881b9cfe14e66b3ee827a84f19ca9d0283fd764"
- integrity sha512-9Gs31s6tA1kuEo69ay9qLgM3x2gsN/RI994DCUKnFSW+qSusQJyyrmfllR2mGU3Wl1W09/nYpIg87W9JPf5y4A==
- dependencies:
- serve-static "^1.13.1"
-
"@react-native-community/cli-debugger-ui@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-13.6.9.tgz#bc5727c51964206a00d417e5148b46331a81d5a5"
@@ -2181,29 +2088,6 @@
dependencies:
serve-static "^1.13.1"
-"@react-native-community/cli-doctor@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-13.6.4.tgz#07e5c2f163807e61ce0ba12901903e591177e3d3"
- integrity sha512-lWOXCISH/cHtLvO0cWTr+IPSzA54FewVOw7MoCMEvWusH+1n7c3hXTAve78mLozGQ7iuUufkHFWwKf3dzOkflQ==
- dependencies:
- "@react-native-community/cli-config" "13.6.4"
- "@react-native-community/cli-platform-android" "13.6.4"
- "@react-native-community/cli-platform-apple" "13.6.4"
- "@react-native-community/cli-platform-ios" "13.6.4"
- "@react-native-community/cli-tools" "13.6.4"
- chalk "^4.1.2"
- command-exists "^1.2.8"
- deepmerge "^4.3.0"
- envinfo "^7.10.0"
- execa "^5.0.0"
- hermes-profile-transformer "^0.0.6"
- node-stream-zip "^1.9.1"
- ora "^5.4.1"
- semver "^7.5.2"
- strip-ansi "^5.2.0"
- wcwidth "^1.0.1"
- yaml "^2.2.1"
-
"@react-native-community/cli-doctor@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-doctor/-/cli-doctor-13.6.9.tgz#f1d4eeff427ddc8a9d19851042621c10939c35cb"
@@ -2227,16 +2111,6 @@
wcwidth "^1.0.1"
yaml "^2.2.1"
-"@react-native-community/cli-hermes@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-13.6.4.tgz#6d3e9b5c251461e9bb35b04110544db8a4f5968f"
- integrity sha512-VIAufA/2wTccbMYBT9o+mQs9baOEpTxCiIdWeVdkPWKzIwtKsLpDZJlUqj4r4rI66mwjFyQ60PhwSzEJ2ApFeQ==
- dependencies:
- "@react-native-community/cli-platform-android" "13.6.4"
- "@react-native-community/cli-tools" "13.6.4"
- chalk "^4.1.2"
- hermes-profile-transformer "^0.0.6"
-
"@react-native-community/cli-hermes@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-hermes/-/cli-hermes-13.6.9.tgz#88c8dfe936a0d4272efc54429eda9ccc3fca3ad8"
@@ -2247,18 +2121,6 @@
chalk "^4.1.2"
hermes-profile-transformer "^0.0.6"
-"@react-native-community/cli-platform-android@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.4.tgz#78ab4c840f4f1f5252ad2fcc5a55f7681ec458cb"
- integrity sha512-WhknYwIobKKCqaGCN3BzZEQHTbaZTDiGvcXzevvN867ldfaGdtbH0DVqNunbPoV1RNzeV9qKoQHFdWBkg83tpg==
- dependencies:
- "@react-native-community/cli-tools" "13.6.4"
- chalk "^4.1.2"
- execa "^5.0.0"
- fast-glob "^3.3.2"
- fast-xml-parser "^4.2.4"
- logkitty "^0.7.1"
-
"@react-native-community/cli-platform-android@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-13.6.9.tgz#b175b9b11334fc90da3f395432678bd53c30fae4"
@@ -2271,18 +2133,6 @@
fast-xml-parser "^4.2.4"
logkitty "^0.7.1"
-"@react-native-community/cli-platform-apple@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.4.tgz#4912eaf519800a957745192718822b94655c8119"
- integrity sha512-TLBiotdIz0veLbmvNQIdUv9fkBx7m34ANGYqr5nH7TFxdmey+Z+omoBqG/HGpvyR7d0AY+kZzzV4k+HkYHM/aQ==
- dependencies:
- "@react-native-community/cli-tools" "13.6.4"
- chalk "^4.1.2"
- execa "^5.0.0"
- fast-glob "^3.3.2"
- fast-xml-parser "^4.0.12"
- ora "^5.4.1"
-
"@react-native-community/cli-platform-apple@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-apple/-/cli-platform-apple-13.6.9.tgz#02fb5dc47d62acd85f4d7a852e93216927a772fa"
@@ -2295,13 +2145,6 @@
fast-xml-parser "^4.0.12"
ora "^5.4.1"
-"@react-native-community/cli-platform-ios@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.4.tgz#96ec915c6df23b2b7b7e0d8cb3db7368e448d620"
- integrity sha512-8Dlva8RY+MY5nhWAj6V7voG3+JOEzDTJmD0FHqL+4p0srvr9v7IEVcxfw5lKBDIUNd0OMAHNevGA+cyz1J60jg==
- dependencies:
- "@react-native-community/cli-platform-apple" "13.6.4"
-
"@react-native-community/cli-platform-ios@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-13.6.9.tgz#f37ceab41c2302e8f0d4bcbd3bf58b3353db4306"
@@ -2309,21 +2152,6 @@
dependencies:
"@react-native-community/cli-platform-apple" "13.6.9"
-"@react-native-community/cli-server-api@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-13.6.4.tgz#6bcec7ae387fc3aeb3e78f62561a91962e6fadf7"
- integrity sha512-D2qSuYCFwrrUJUM0SDc9l3lEhU02yjf+9Peri/xhspzAhALnsf6Z/H7BCjddMV42g9/eY33LqiGyN5chr83a+g==
- dependencies:
- "@react-native-community/cli-debugger-ui" "13.6.4"
- "@react-native-community/cli-tools" "13.6.4"
- compression "^1.7.1"
- connect "^3.6.5"
- errorhandler "^1.5.1"
- nocache "^3.0.1"
- pretty-format "^26.6.2"
- serve-static "^1.13.1"
- ws "^7.5.1"
-
"@react-native-community/cli-server-api@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-server-api/-/cli-server-api-13.6.9.tgz#269e666bc26e9d0b2f42c7f6099559b5f9259e9d"
@@ -2339,23 +2167,6 @@
serve-static "^1.13.1"
ws "^6.2.2"
-"@react-native-community/cli-tools@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-13.6.4.tgz#ab396604b6dcf215790807fe89656e779b11f0ec"
- integrity sha512-N4oHLLbeTdg8opqJozjClmuTfazo1Mt+oxU7mr7m45VCsFgBqTF70Uwad289TM/3l44PP679NRMAHVYqpIRYtQ==
- dependencies:
- appdirsjs "^1.2.4"
- chalk "^4.1.2"
- execa "^5.0.0"
- find-up "^5.0.0"
- mime "^2.4.1"
- node-fetch "^2.6.0"
- open "^6.2.0"
- ora "^5.4.1"
- semver "^7.5.2"
- shell-quote "^1.7.3"
- sudo-prompt "^9.0.0"
-
"@react-native-community/cli-tools@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-13.6.9.tgz#2baee279358ba1a863e737b2fa9f45659ad91929"
@@ -2373,13 +2184,6 @@
shell-quote "^1.7.3"
sudo-prompt "^9.0.0"
-"@react-native-community/cli-types@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-13.6.4.tgz#e499a3691ee597aa4b93196ff182a4782fae7afb"
- integrity sha512-NxGCNs4eYtVC8x0wj0jJ/MZLRy8C+B9l8lY8kShuAcvWTv5JXRqmXjg8uK1aA+xikPh0maq4cc/zLw1roroY/A==
- dependencies:
- joi "^17.2.1"
-
"@react-native-community/cli-types@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-13.6.9.tgz#08bfb796eacf0daeb31e2de516e81e78a36a1a55"
@@ -2387,29 +2191,6 @@
dependencies:
joi "^17.2.1"
-"@react-native-community/cli@13.6.4":
- version "13.6.4"
- resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-13.6.4.tgz#dabe2749470a34533e18aada51d97c94b3568307"
- integrity sha512-V7rt2N5JY7M4dJFgdNfR164r3hZdR/Z7V54dv85TFQHRbdwF4QrkG+GeagAU54qrkK/OU8OH3AF2+mKuiNWpGA==
- dependencies:
- "@react-native-community/cli-clean" "13.6.4"
- "@react-native-community/cli-config" "13.6.4"
- "@react-native-community/cli-debugger-ui" "13.6.4"
- "@react-native-community/cli-doctor" "13.6.4"
- "@react-native-community/cli-hermes" "13.6.4"
- "@react-native-community/cli-server-api" "13.6.4"
- "@react-native-community/cli-tools" "13.6.4"
- "@react-native-community/cli-types" "13.6.4"
- chalk "^4.1.2"
- commander "^9.4.1"
- deepmerge "^4.3.0"
- execa "^5.0.0"
- find-up "^4.1.0"
- fs-extra "^8.1.0"
- graceful-fs "^4.1.3"
- prompts "^2.4.2"
- semver "^7.5.2"
-
"@react-native-community/cli@13.6.9":
version "13.6.9"
resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-13.6.9.tgz#ba6360b94e0aba9c4001bda256cf7e57e2ecb02c"
@@ -2438,15 +2219,15 @@
resolved "https://registry.yarnpkg.com/@react-native-picker/picker/-/picker-2.7.5.tgz#e43fcd65f260fa4f23e974ccb9fb7c1f7a9ff94a"
integrity sha512-vhMaOLkXSUb+YKVbukMJToU4g+89VMhBG2U9+cLYF8X8HtFRidrHjohGqT8/OyesDuKIXeLIP+UFYI9Q9CRA9Q==
-"@react-native-windows/cli@0.74.0":
- version "0.74.0"
- resolved "https://registry.yarnpkg.com/@react-native-windows/cli/-/cli-0.74.0.tgz#da85c0f8d7f96a761080fae27323fe257560e22d"
- integrity sha512-grOp6b/Pfa4T+n+oWmoo18BXI97CKZPbRKTlCg2Ne5Hsq2rj4Ewg8tnRFKFOMthy5dZcPWLqsphkT0J/sQBHXw==
+"@react-native-windows/cli@0.74.3":
+ version "0.74.3"
+ resolved "https://registry.yarnpkg.com/@react-native-windows/cli/-/cli-0.74.3.tgz#ef1abf6f709cf5a0a5d5e45bbe6937b8d7af8c0e"
+ integrity sha512-1HkQkWYbY1CzVc9G/MP68xWNLutBNRPalx1KtImyACggUkWXadWK46Wi1IbyDtSMlY5cIpCTHL03cdHHsXAkaQ==
dependencies:
- "@react-native-windows/codegen" "0.74.0"
- "@react-native-windows/fs" "0.74.0"
- "@react-native-windows/package-utils" "0.74.0"
- "@react-native-windows/telemetry" "0.74.0"
+ "@react-native-windows/codegen" "0.74.2"
+ "@react-native-windows/fs" "0.74.1"
+ "@react-native-windows/package-utils" "0.74.1"
+ "@react-native-windows/telemetry" "0.74.1"
"@xmldom/xmldom" "^0.7.7"
chalk "^4.1.0"
cli-spinners "^2.2.0"
@@ -2465,50 +2246,50 @@
xml-parser "^1.2.1"
xpath "^0.0.27"
-"@react-native-windows/codegen@0.74.0":
- version "0.74.0"
- resolved "https://registry.yarnpkg.com/@react-native-windows/codegen/-/codegen-0.74.0.tgz#9024ba6e871088e42356f94eb126697e6268487b"
- integrity sha512-jSN5PZQKZIuaukoUJU9LOyHs2Y/KmG5xsLtSGRUcjG8wTrzP+xXxj3115hHdk9vreL80o+pup5o1UNfyLfvGIA==
+"@react-native-windows/codegen@0.74.2":
+ version "0.74.2"
+ resolved "https://registry.yarnpkg.com/@react-native-windows/codegen/-/codegen-0.74.2.tgz#04053553067d8affdce04a449426672bcec58c47"
+ integrity sha512-KJ2wOeF+QFXx8d1T4sph0tDLCCMZdPvkNz1pRzMPmnvbTksx9krulCY3ZwxK0ZbDfn03VOfpSeMI4Ru47RJWuA==
dependencies:
- "@react-native-windows/fs" "0.74.0"
+ "@react-native-windows/fs" "0.74.1"
chalk "^4.1.0"
- globby "^11.0.4"
+ globby "^11.1.0"
mustache "^4.0.1"
source-map-support "^0.5.19"
yargs "^16.2.0"
-"@react-native-windows/find-repo-root@0.74.0":
- version "0.74.0"
- resolved "https://registry.yarnpkg.com/@react-native-windows/find-repo-root/-/find-repo-root-0.74.0.tgz#687819c76825d3f7c58401a9d96c2c748774506f"
- integrity sha512-6dxkKX+mtT+yXuTDUf7A+ZQnyX57WlYk3fDNeNTpI66xBR4QuRwPdzTNamZxvX6JEMSe4lm4PqXWlfAKYzPENw==
+"@react-native-windows/find-repo-root@0.74.1":
+ version "0.74.1"
+ resolved "https://registry.yarnpkg.com/@react-native-windows/find-repo-root/-/find-repo-root-0.74.1.tgz#bf2f10545c29ffcdb76b9179fce346f84e15c5ab"
+ integrity sha512-k+Hk16/NmPhxsQYGCRtAfcQqCDCJvAxC74FLzFOO6+c/VDM0U05kEcJsJzI1dh/0kZh+YSZQo3w1RrA1z1S2gw==
dependencies:
- "@react-native-windows/fs" "0.74.0"
+ "@react-native-windows/fs" "0.74.1"
find-up "^4.1.0"
-"@react-native-windows/fs@0.74.0":
- version "0.74.0"
- resolved "https://registry.yarnpkg.com/@react-native-windows/fs/-/fs-0.74.0.tgz#bbef312e6c9541292a69e607c1e5fbc47e2a665c"
- integrity sha512-YK8CkNHSwskU3PPCPTw1DPen3/QXS7qP7rAp+FNK4LfyOgiO1V9TiIyz3DcvqOsD+iwriXoEl/3Bvo/8HmlTbQ==
+"@react-native-windows/fs@0.74.1":
+ version "0.74.1"
+ resolved "https://registry.yarnpkg.com/@react-native-windows/fs/-/fs-0.74.1.tgz#2c6ade1f937adc6056b1a6b052b7b85acb725a14"
+ integrity sha512-Qepr2KyMvCKugOwIXKXtgMqww5P3yI5HTtxIUWytBCoIPEk1lJdpx/sFjTGmir0QXaLlZxXbdrxpLLnN7eq3Tg==
dependencies:
graceful-fs "^4.2.8"
-"@react-native-windows/package-utils@0.74.0":
- version "0.74.0"
- resolved "https://registry.yarnpkg.com/@react-native-windows/package-utils/-/package-utils-0.74.0.tgz#bdcd18f993d899a6f9914365863bde7ee4eee509"
- integrity sha512-b7c2/DycLM3MK7K6Y4XVuKFBTLvyg0DSP7++f/yZsBWyCysFycAS5gCrlVbXk6Kez3CIEspSS7op+GJMduMp8g==
+"@react-native-windows/package-utils@0.74.1":
+ version "0.74.1"
+ resolved "https://registry.yarnpkg.com/@react-native-windows/package-utils/-/package-utils-0.74.1.tgz#18e49bb5b2ed967f279605223eae65a3ea55112f"
+ integrity sha512-nzKo1H991npbRx2EJT0wkniGkngEw7ND5+oz6jhbNFQ3UCKIUBCLc2bPBBX1Z5jp40R+qoVbgnQP2fuAN5y9tA==
dependencies:
- "@react-native-windows/find-repo-root" "0.74.0"
- "@react-native-windows/fs" "0.74.0"
+ "@react-native-windows/find-repo-root" "0.74.1"
+ "@react-native-windows/fs" "0.74.1"
get-monorepo-packages "^1.2.0"
lodash "^4.17.15"
-"@react-native-windows/telemetry@0.74.0":
- version "0.74.0"
- resolved "https://registry.yarnpkg.com/@react-native-windows/telemetry/-/telemetry-0.74.0.tgz#e050312998d6c64f50f368bcb3299e9e3138fd10"
- integrity sha512-80vMPWXLJpa3v+vAafXjCQM0GFE3Iq8breRkrwzmbANAfCEXoJdOI0Aju0sOqDyiE68OUekjU9lwWbIyFEQGJQ==
+"@react-native-windows/telemetry@0.74.1":
+ version "0.74.1"
+ resolved "https://registry.yarnpkg.com/@react-native-windows/telemetry/-/telemetry-0.74.1.tgz#ecc53e608f64f9e976952a92216e7b2328437523"
+ integrity sha512-9xdXJ77AQ4f5PXEHBCXd7N1HyXX22moxbTZHMShb4JPVellSWCLNPlqxUuXTDEjjn6rlIsS2ToiT0owQ1nZszA==
dependencies:
"@azure/core-auth" "1.5.0"
- "@react-native-windows/fs" "0.74.0"
+ "@react-native-windows/fs" "0.74.1"
"@xmldom/xmldom" "^0.7.7"
applicationinsights "2.9.1"
ci-info "^3.2.0"
@@ -2517,28 +2298,16 @@
os-locale "^5.0.0"
xpath "^0.0.27"
-"@react-native/assets-registry@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.81.tgz#76b17f8f79b366ec4f18a0f4e99b7cd466aa5aa7"
- integrity sha512-ms+D6pJ6l30epm53pwnAislW79LEUHJxWfe1Cu0LWyTTBlg1OFoqXfB3eIbpe4WyH3nrlkQAh0yyk4huT2mCvw==
-
-"@react-native/assets-registry@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.85.tgz#ae903c0c25f4d6a751d53d63245d5612c81edd98"
- integrity sha512-59YmIQxfGDw4aP9S/nAM+sjSFdW8fUP6fsqczCcXgL2YVEjyER9XCaUT0J1K+PdHep8pi05KUgIKUds8P3jbmA==
+"@react-native/assets-registry@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/assets-registry/-/assets-registry-0.74.87.tgz#7dda64e48db14597e19e15f679e31abbb1c1fb4d"
+ integrity sha512-1XmRhqQchN+pXPKEKYdpJlwESxVomJOxtEnIkbo7GAlaN2sym84fHEGDXAjLilih5GVPpcpSmFzTy8jx3LtaFg==
"@react-native/assets@1.0.0":
version "1.0.0"
resolved "https://registry.yarnpkg.com/@react-native/assets/-/assets-1.0.0.tgz#c6f9bf63d274bafc8e970628de24986b30a55c8e"
integrity sha512-KrwSpS1tKI70wuKl68DwJZYEvXktDHdZMG0k2AXD/rJVSlB23/X2CB2cutVR0HwNMJIal9HOUOBB2rVfa6UGtQ==
-"@react-native/babel-plugin-codegen@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.81.tgz#80484fb9029038694a92193ae2653529e44aab64"
- integrity sha512-Bj6g5/xkLMBAdC6665TbD3uCKCQSmLQpGv3gyqya/ydZpv3dDmDXfkGmO4fqTwEMunzu09Sk55st2ipmuXAaAg==
- dependencies:
- "@react-native/codegen" "0.74.81"
-
"@react-native/babel-plugin-codegen@0.74.85":
version "0.74.85"
resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.85.tgz#067224bf5099ee2679babd700c7115822a747004"
@@ -2546,54 +2315,12 @@
dependencies:
"@react-native/codegen" "0.74.85"
-"@react-native/babel-preset@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.74.81.tgz#80d0b96eef35d671f97eaf223c4d770170d7f23f"
- integrity sha512-H80B3Y3lBBVC4x9tceTEQq/04lx01gW6ajWCcVbd7sHvGEAxfMFEZUmVZr0451Cafn02wVnDJ8psto1F+0w5lw==
+"@react-native/babel-plugin-codegen@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.74.87.tgz#44457f4de69911f37a6ac308a7783203a757574a"
+ integrity sha512-+vJYpMnENFrwtgvDfUj+CtVJRJuUnzAUYT0/Pb68Sq9RfcZ5xdcCuUgyf7JO+akW2VTBoJY427wkcxU30qrWWw==
dependencies:
- "@babel/core" "^7.20.0"
- "@babel/plugin-proposal-async-generator-functions" "^7.0.0"
- "@babel/plugin-proposal-class-properties" "^7.18.0"
- "@babel/plugin-proposal-export-default-from" "^7.0.0"
- "@babel/plugin-proposal-logical-assignment-operators" "^7.18.0"
- "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0"
- "@babel/plugin-proposal-numeric-separator" "^7.0.0"
- "@babel/plugin-proposal-object-rest-spread" "^7.20.0"
- "@babel/plugin-proposal-optional-catch-binding" "^7.0.0"
- "@babel/plugin-proposal-optional-chaining" "^7.20.0"
- "@babel/plugin-syntax-dynamic-import" "^7.8.0"
- "@babel/plugin-syntax-export-default-from" "^7.0.0"
- "@babel/plugin-syntax-flow" "^7.18.0"
- "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0"
- "@babel/plugin-syntax-optional-chaining" "^7.0.0"
- "@babel/plugin-transform-arrow-functions" "^7.0.0"
- "@babel/plugin-transform-async-to-generator" "^7.20.0"
- "@babel/plugin-transform-block-scoping" "^7.0.0"
- "@babel/plugin-transform-classes" "^7.0.0"
- "@babel/plugin-transform-computed-properties" "^7.0.0"
- "@babel/plugin-transform-destructuring" "^7.20.0"
- "@babel/plugin-transform-flow-strip-types" "^7.20.0"
- "@babel/plugin-transform-function-name" "^7.0.0"
- "@babel/plugin-transform-literals" "^7.0.0"
- "@babel/plugin-transform-modules-commonjs" "^7.0.0"
- "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0"
- "@babel/plugin-transform-parameters" "^7.0.0"
- "@babel/plugin-transform-private-methods" "^7.22.5"
- "@babel/plugin-transform-private-property-in-object" "^7.22.11"
- "@babel/plugin-transform-react-display-name" "^7.0.0"
- "@babel/plugin-transform-react-jsx" "^7.0.0"
- "@babel/plugin-transform-react-jsx-self" "^7.0.0"
- "@babel/plugin-transform-react-jsx-source" "^7.0.0"
- "@babel/plugin-transform-runtime" "^7.0.0"
- "@babel/plugin-transform-shorthand-properties" "^7.0.0"
- "@babel/plugin-transform-spread" "^7.0.0"
- "@babel/plugin-transform-sticky-regex" "^7.0.0"
- "@babel/plugin-transform-typescript" "^7.5.0"
- "@babel/plugin-transform-unicode-regex" "^7.0.0"
- "@babel/template" "^7.0.0"
- "@react-native/babel-plugin-codegen" "0.74.81"
- babel-plugin-transform-flow-enums "^0.0.2"
- react-refresh "^0.14.0"
+ "@react-native/codegen" "0.74.87"
"@react-native/babel-preset@0.74.85":
version "0.74.85"
@@ -2644,18 +2371,54 @@
babel-plugin-transform-flow-enums "^0.0.2"
react-refresh "^0.14.0"
-"@react-native/codegen@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.74.81.tgz#1025ffd41f2b4710fd700c9e8e85210b9651a7c4"
- integrity sha512-hhXo4ccv2lYWaJrZDsdbRTZ5SzSOdyZ0MY6YXwf3xEFLuSunbUMu17Rz5LXemKXlpVx4KEgJ/TDc2pPVaRPZgA==
+"@react-native/babel-preset@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/babel-preset/-/babel-preset-0.74.87.tgz#3d74517d2ea8898f83b5106027033607d5bda50d"
+ integrity sha512-hyKpfqzN2nxZmYYJ0tQIHG99FQO0OWXp/gVggAfEUgiT+yNKas1C60LuofUsK7cd+2o9jrpqgqW4WzEDZoBlTg==
dependencies:
- "@babel/parser" "^7.20.0"
- glob "^7.1.1"
- hermes-parser "0.19.1"
- invariant "^2.2.4"
- jscodeshift "^0.14.0"
- mkdirp "^0.5.1"
- nullthrows "^1.1.1"
+ "@babel/core" "^7.20.0"
+ "@babel/plugin-proposal-async-generator-functions" "^7.0.0"
+ "@babel/plugin-proposal-class-properties" "^7.18.0"
+ "@babel/plugin-proposal-export-default-from" "^7.0.0"
+ "@babel/plugin-proposal-logical-assignment-operators" "^7.18.0"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.0"
+ "@babel/plugin-proposal-numeric-separator" "^7.0.0"
+ "@babel/plugin-proposal-object-rest-spread" "^7.20.0"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.0.0"
+ "@babel/plugin-proposal-optional-chaining" "^7.20.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.0"
+ "@babel/plugin-syntax-export-default-from" "^7.0.0"
+ "@babel/plugin-syntax-flow" "^7.18.0"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.0.0"
+ "@babel/plugin-syntax-optional-chaining" "^7.0.0"
+ "@babel/plugin-transform-arrow-functions" "^7.0.0"
+ "@babel/plugin-transform-async-to-generator" "^7.20.0"
+ "@babel/plugin-transform-block-scoping" "^7.0.0"
+ "@babel/plugin-transform-classes" "^7.0.0"
+ "@babel/plugin-transform-computed-properties" "^7.0.0"
+ "@babel/plugin-transform-destructuring" "^7.20.0"
+ "@babel/plugin-transform-flow-strip-types" "^7.20.0"
+ "@babel/plugin-transform-function-name" "^7.0.0"
+ "@babel/plugin-transform-literals" "^7.0.0"
+ "@babel/plugin-transform-modules-commonjs" "^7.0.0"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.0.0"
+ "@babel/plugin-transform-parameters" "^7.0.0"
+ "@babel/plugin-transform-private-methods" "^7.22.5"
+ "@babel/plugin-transform-private-property-in-object" "^7.22.11"
+ "@babel/plugin-transform-react-display-name" "^7.0.0"
+ "@babel/plugin-transform-react-jsx" "^7.0.0"
+ "@babel/plugin-transform-react-jsx-self" "^7.0.0"
+ "@babel/plugin-transform-react-jsx-source" "^7.0.0"
+ "@babel/plugin-transform-runtime" "^7.0.0"
+ "@babel/plugin-transform-shorthand-properties" "^7.0.0"
+ "@babel/plugin-transform-spread" "^7.0.0"
+ "@babel/plugin-transform-sticky-regex" "^7.0.0"
+ "@babel/plugin-transform-typescript" "^7.5.0"
+ "@babel/plugin-transform-unicode-regex" "^7.0.0"
+ "@babel/template" "^7.0.0"
+ "@react-native/babel-plugin-codegen" "0.74.87"
+ babel-plugin-transform-flow-enums "^0.0.2"
+ react-refresh "^0.14.0"
"@react-native/codegen@0.74.85":
version "0.74.85"
@@ -2670,33 +2433,28 @@
mkdirp "^0.5.1"
nullthrows "^1.1.1"
-"@react-native/community-cli-plugin@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.81.tgz#4177207374942c52a86ad52c8c915f46729305ab"
- integrity sha512-ezPOwPxbDgrBZLJJMcXryXJXjv3VWt+Mt4jRZiEtvy6pAoi2owSH0b178T5cEZaWsxQN0BbyJ7F/xJsNiF4z0Q==
+"@react-native/codegen@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/codegen/-/codegen-0.74.87.tgz#47f07a627d0294c8270a03aee098991ed91f8ae9"
+ integrity sha512-GMSYDiD+86zLKgMMgz9z0k6FxmRn+z6cimYZKkucW4soGbxWsbjUAZoZ56sJwt2FJ3XVRgXCrnOCgXoH/Bkhcg==
dependencies:
- "@react-native-community/cli-server-api" "13.6.4"
- "@react-native-community/cli-tools" "13.6.4"
- "@react-native/dev-middleware" "0.74.81"
- "@react-native/metro-babel-transformer" "0.74.81"
- chalk "^4.0.0"
- execa "^5.1.1"
- metro "^0.80.3"
- metro-config "^0.80.3"
- metro-core "^0.80.3"
- node-fetch "^2.2.0"
- querystring "^0.2.1"
- readline "^1.3.0"
+ "@babel/parser" "^7.20.0"
+ glob "^7.1.1"
+ hermes-parser "0.19.1"
+ invariant "^2.2.4"
+ jscodeshift "^0.14.0"
+ mkdirp "^0.5.1"
+ nullthrows "^1.1.1"
-"@react-native/community-cli-plugin@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.85.tgz#5bf95599166fd2b8bf10612250006e282053f6c4"
- integrity sha512-ODzND33eA2owAY3g9jgCdqB+BjAh8qJ7dvmSotXgrgDYr3MJMpd8gvHTIPe2fg4Kab+wk8uipRhrE0i0RYMwtQ==
+"@react-native/community-cli-plugin@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/community-cli-plugin/-/community-cli-plugin-0.74.87.tgz#4d9798d51381912f3771acded9b6b2804987e952"
+ integrity sha512-EgJG9lSr8x3X67dHQKQvU6EkO+3ksVlJHYIVv6U/AmW9dN80BEFxgYbSJ7icXS4wri7m4kHdgeq2PQ7/3vvrTQ==
dependencies:
"@react-native-community/cli-server-api" "13.6.9"
"@react-native-community/cli-tools" "13.6.9"
- "@react-native/dev-middleware" "0.74.85"
- "@react-native/metro-babel-transformer" "0.74.85"
+ "@react-native/dev-middleware" "0.74.87"
+ "@react-native/metro-babel-transformer" "0.74.87"
chalk "^4.0.0"
execa "^5.1.1"
metro "^0.80.3"
@@ -2706,23 +2464,23 @@
querystring "^0.2.1"
readline "^1.3.0"
-"@react-native/debugger-frontend@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.74.81.tgz#17cefe2b3ff485071bd30d819995867fd145da27"
- integrity sha512-HCYF1/88AfixG75558HkNh9wcvGweRaSZGBA71KoZj03umXM8XJy0/ZpacGOml2Fwiqpil72gi6uU+rypcc/vw==
-
"@react-native/debugger-frontend@0.74.85":
version "0.74.85"
resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.74.85.tgz#a7af94a7b81cb59f241fd1771d1b083445329700"
integrity sha512-gUIhhpsYLUTYWlWw4vGztyHaX/kNlgVspSvKe2XaPA7o3jYKUoNLc3Ov7u70u/MBWfKdcEffWq44eSe3j3s5JQ==
-"@react-native/dev-middleware@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.81.tgz#120ab62982a48cba90c7724d099ddaa50184c200"
- integrity sha512-x2IpvUJN1LJE0WmPsSfQIbQaa9xwH+2VDFOUrzuO9cbQap8rNfZpcvVNbrZgrlKbgS4LXbbsj6VSL8b6SnMKMA==
+"@react-native/debugger-frontend@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/debugger-frontend/-/debugger-frontend-0.74.87.tgz#0bb4f4f54365d04fc975349d5f635cb575f6a5d8"
+ integrity sha512-MN95DJLYTv4EqJc+9JajA3AJZSBYJz2QEJ3uWlHrOky2vKrbbRVaW1ityTmaZa2OXIvNc6CZwSRSE7xCoHbXhQ==
+
+"@react-native/dev-middleware@0.74.85":
+ version "0.74.85"
+ resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz#eca35aceb882b1111385f7c20f1aad7a33a2734e"
+ integrity sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==
dependencies:
"@isaacs/ttlcache" "^1.4.1"
- "@react-native/debugger-frontend" "0.74.81"
+ "@react-native/debugger-frontend" "0.74.85"
"@rnx-kit/chromium-edge-launcher" "^1.0.0"
chrome-launcher "^0.15.2"
connect "^3.6.5"
@@ -2735,13 +2493,13 @@
temp-dir "^2.0.0"
ws "^6.2.2"
-"@react-native/dev-middleware@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.85.tgz#eca35aceb882b1111385f7c20f1aad7a33a2734e"
- integrity sha512-BRmgCK5vnMmHaKRO+h8PKJmHHH3E6JFuerrcfE3wG2eZ1bcSr+QTu8DAlpxsDWvJvHpCi8tRJGauxd+Ssj/c7w==
+"@react-native/dev-middleware@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/dev-middleware/-/dev-middleware-0.74.87.tgz#254807b579a3015ced659a14c374dbf029a9c04e"
+ integrity sha512-7TmZ3hTHwooYgIHqc/z87BMe1ryrIqAUi+AF7vsD+EHCGxHFdMjSpf1BZ2SUPXuLnF2cTiTfV2RwhbPzx0tYIA==
dependencies:
"@isaacs/ttlcache" "^1.4.1"
- "@react-native/debugger-frontend" "0.74.85"
+ "@react-native/debugger-frontend" "0.74.87"
"@rnx-kit/chromium-edge-launcher" "^1.0.0"
chrome-launcher "^0.15.2"
connect "^3.6.5"
@@ -2778,35 +2536,20 @@
resolved "https://registry.yarnpkg.com/@react-native/eslint-plugin/-/eslint-plugin-0.74.85.tgz#9e028ccf97ad6d3d661d796eb614951343be5a1f"
integrity sha512-FtyfgL8EOTddxm+DyjfsInqMtjmU0PWQIRdyET/uob8i6sCxS+HmBzhbtEVZUKwld2kNG1JGgdNLndcEejC81Q==
-"@react-native/gradle-plugin@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.74.81.tgz#aac01999b1005bba3213f504deee7efaadb62c1e"
- integrity sha512-7YQ4TLnqfe2kplWWzBWO6k0rPSrWEbuEiRXSJNZQCtCk+t2YX985G62p/9jWm3sGLN4UTcpDXaFNTTPBvlycoQ==
-
-"@react-native/gradle-plugin@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.74.85.tgz#7c7d16655a4c15da87402ae3f7d6566466aea723"
- integrity sha512-1VQSLukJzaVMn1MYcs8Weo1nUW8xCas2XU1KuoV7OJPk6xPnEBFJmapmEGP5mWeEy7kcTXJmddEgy1wwW0tcig==
-
-"@react-native/js-polyfills@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.74.81.tgz#64780497be4ecbff1b27076294e3ebd7df1ba485"
- integrity sha512-o4MiR+/kkHoeoQ/zPwt81LnTm6pqdg0wOhU7S7vIZUqzJ7YUpnpaAvF+/z7HzUOPudnavoCN0wvcZPe/AMEyCA==
+"@react-native/gradle-plugin@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/gradle-plugin/-/gradle-plugin-0.74.87.tgz#a66c01fda7a938a116dc27447f0ccce285796b2a"
+ integrity sha512-T+VX0N1qP+U9V4oAtn7FTX7pfsoVkd1ocyw9swYXgJqU2fK7hC9famW7b3s3ZiufPGPr1VPJe2TVGtSopBjL6A==
"@react-native/js-polyfills@0.74.85":
version "0.74.85"
resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.74.85.tgz#1abfeeaec5ff24b6a1b3e2296e760359fce47739"
integrity sha512-gp4Rg9le3lVZeW7Cie6qLfekvRKZuhJ3LKgi1SFB4N154z1wIclypAJXVXgWBsy8JKJfTwRI+sffC4qZDlvzrg==
-"@react-native/metro-babel-transformer@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.81.tgz#f724eab91e6de82f8d098e6de57f25bb7501d2d6"
- integrity sha512-PVcMjj23poAK6Uemflz4MIJdEpONpjqF7JASNqqQkY6wfDdaIiZSNk8EBCWKb0t7nKqhMvtTq11DMzYJ0JFITg==
- dependencies:
- "@babel/core" "^7.20.0"
- "@react-native/babel-preset" "0.74.81"
- hermes-parser "0.19.1"
- nullthrows "^1.1.1"
+"@react-native/js-polyfills@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/js-polyfills/-/js-polyfills-0.74.87.tgz#d28090a4dae417a2e9ad14e065fcf8cf52cc482c"
+ integrity sha512-M5Evdn76CuVEF0GsaXiGi95CBZ4IWubHqwXxV9vG9CC9kq0PSkoM2Pn7Lx7dgyp4vT7ccJ8a3IwHbe+5KJRnpw==
"@react-native/metro-babel-transformer@0.74.85":
version "0.74.85"
@@ -2818,6 +2561,16 @@
hermes-parser "0.19.1"
nullthrows "^1.1.1"
+"@react-native/metro-babel-transformer@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.74.87.tgz#f60958f5e7eb39008a2c01dc5248ab60240bdc01"
+ integrity sha512-UsJCO24sNax2NSPBmV1zLEVVNkS88kcgAiYrZHtYSwSjpl4WZ656tIeedBfiySdJ94Hr3kQmBYLipV5zk0NI1A==
+ dependencies:
+ "@babel/core" "^7.20.0"
+ "@react-native/babel-preset" "0.74.87"
+ hermes-parser "0.19.1"
+ nullthrows "^1.1.1"
+
"@react-native/metro-config@0.74.85":
version "0.74.85"
resolved "https://registry.yarnpkg.com/@react-native/metro-config/-/metro-config-0.74.85.tgz#41d14320dc78f62c03eb32cf3091f78bb619012a"
@@ -2828,33 +2581,30 @@
metro-config "^0.80.3"
metro-runtime "^0.80.3"
-"@react-native/normalize-colors@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.81.tgz#0b7c440b6e126f79036cbe74a88791aba72b9fcf"
- integrity sha512-g3YvkLO7UsSWiDfYAU+gLhRHtEpUyz732lZB+N8IlLXc5MnfXHC8GKneDGY3Mh52I3gBrs20o37D5viQX9E1CA==
-
-"@react-native/normalize-colors@0.74.85", "@react-native/normalize-colors@^0.74.1":
+"@react-native/normalize-colors@0.74.85":
version "0.74.85"
resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.85.tgz#62bcb9ab1b10b822ca0278fdfdf23d3b18e125da"
integrity sha512-pcE4i0X7y3hsAE0SpIl7t6dUc0B0NZLd1yv7ssm4FrLhWG+CGyIq4eFDXpmPU1XHmL5PPySxTAjEMiwv6tAmOw==
+"@react-native/normalize-colors@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.87.tgz#a814169d0ce4ce13ffebcda0a3a5a3f780ccd772"
+ integrity sha512-Xh7Nyk/MPefkb0Itl5Z+3oOobeG9lfLb7ZOY2DKpFnoCE1TzBmib9vMNdFaLdSxLIP+Ec6icgKtdzYg8QUPYzA==
+
+"@react-native/normalize-colors@^0.74.1":
+ version "0.74.88"
+ resolved "https://registry.yarnpkg.com/@react-native/normalize-colors/-/normalize-colors-0.74.88.tgz#46f4c7270c8e6853281d7dd966e0eb362068e41a"
+ integrity sha512-He5oTwPBxvXrxJ91dZzpxR7P+VYmc9IkJfhuH8zUiU50ckrt+xWNjtVugPdUv4LuVjmZ36Vk2EX8bl1gVn2dVA==
+
"@react-native/typescript-config@0.74.85":
version "0.74.85"
resolved "https://registry.yarnpkg.com/@react-native/typescript-config/-/typescript-config-0.74.85.tgz#42f9e73c6801cd86baa3023838a1a9e0b9c257b0"
integrity sha512-FiMIWSRPCEW6yobrzAL2GR4a5PMyRpJEUsKkN7h5J2dpM/f33FLZdDon/ljIK2iPB4XOt6m1opUxep9ZqjToDg==
-"@react-native/virtualized-lists@0.74.81":
- version "0.74.81"
- resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.74.81.tgz#8e43d4c72ec561754491eae731f40877f03d05fb"
- integrity sha512-5jF9S10Ug2Wl+L/0+O8WmbC726sMMX8jk/1JrvDDK+0DRLMobfjLc1L26fONlVBF7lE5ctqvKZ9TlKdhPTNOZg==
- dependencies:
- invariant "^2.2.4"
- nullthrows "^1.1.1"
-
-"@react-native/virtualized-lists@0.74.85":
- version "0.74.85"
- resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.74.85.tgz#a6178c7168953807b3b610c9f8d208a6f758407d"
- integrity sha512-jx2Zw0qlZteoQ+0KxRc7s4drsljLBEP534FaNZ950e9+CN9nVkLsV6rigcTjDR8wjKMSBWhKf0C0C3egYz7Ehg==
+"@react-native/virtualized-lists@0.74.87":
+ version "0.74.87"
+ resolved "https://registry.yarnpkg.com/@react-native/virtualized-lists/-/virtualized-lists-0.74.87.tgz#31bc44d62617df7d893df22c4c57094f576677a0"
+ integrity sha512-lsGxoFMb0lyK/MiplNKJpD+A1EoEUumkLrCjH4Ht+ZlG8S0BfCxmskLZ6qXn3BiDSkLjfjI/qyZ3pnxNBvkXpQ==
dependencies:
invariant "^2.2.4"
nullthrows "^1.1.1"
@@ -3000,23 +2750,23 @@
"@types/node" "*"
"@types/node@*":
- version "20.14.10"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-20.14.10.tgz#a1a218290f1b6428682e3af044785e5874db469a"
- integrity sha512-MdiXf+nDuMvY0gJKxyfZ7/6UFsETO7mGKF54MVD/ekJS6HdFtpZFBgrh6Pseu64XTb2MLyFPlbW6hj8HYRQNOQ==
+ version "22.7.5"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-22.7.5.tgz#cfde981727a7ab3611a481510b473ae54442b92b"
+ integrity sha512-jML7s2NAzMWc//QSJ1a3prpk78cOPchGvXJsC3C6R6PSMoooztvRVQEz89gmBTBY1SPMaqo5teB4uNHPdetShQ==
dependencies:
- undici-types "~5.26.4"
+ undici-types "~6.19.2"
"@types/node@^18.0.0":
- version "18.19.39"
- resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.39.tgz#c316340a5b4adca3aee9dcbf05de385978590593"
- integrity sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==
+ version "18.19.55"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-18.19.55.tgz#29c3f8e1485a92ec96636957ddec55aabc6e856e"
+ integrity sha512-zzw5Vw52205Zr/nmErSEkN5FLqXPuKX/k5d1D7RKHATGqU7y6YfX9QxZraUzUrFGqH6XzOzG196BC35ltJC4Cw==
dependencies:
undici-types "~5.26.4"
"@types/prop-types@*":
- version "15.7.12"
- resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.12.tgz#12bb1e2be27293c1406acb6af1c3f3a1481d98c6"
- integrity sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==
+ version "15.7.13"
+ resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.13.tgz#2af91918ee12d9d32914feb13f5326658461b451"
+ integrity sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==
"@types/react-test-renderer@^18.0.0":
version "18.3.0"
@@ -3026,9 +2776,9 @@
"@types/react" "*"
"@types/react@*", "@types/react@^18.0.24":
- version "18.3.3"
- resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.3.tgz#9679020895318b0915d7a3ab004d92d33375c45f"
- integrity sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==
+ version "18.3.11"
+ resolved "https://registry.yarnpkg.com/@types/react/-/react-18.3.11.tgz#9d530601ff843ee0d7030d4227ea4360236bd537"
+ integrity sha512-r6QZ069rFTjrEYgFdOck1gK7FLVsgJE7tTz0pQBczlBNUhBNk0MQH4UbnFSwjpQLMkLzgqvBBa+qGpLje16eTQ==
dependencies:
"@types/prop-types" "*"
csstype "^3.0.2"
@@ -3046,7 +2796,7 @@
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.8.tgz#8268a8c57a3e4abd25c165ecd36237db7948a55e"
integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==
-"@types/shimmer@^1.0.2":
+"@types/shimmer@^1.2.0":
version "1.2.0"
resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.2.0.tgz#9b706af96fa06416828842397a70dfbbf1c14ded"
integrity sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==
@@ -3076,36 +2826,36 @@
"@types/yargs-parser" "*"
"@types/yargs@^17.0.8":
- version "17.0.32"
- resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.32.tgz#030774723a2f7faafebf645f4e5a48371dca6229"
- integrity sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==
+ version "17.0.33"
+ resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d"
+ integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==
dependencies:
"@types/yargs-parser" "*"
"@typescript-eslint/eslint-plugin@^7.1.1":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.16.0.tgz#b3563927341eca15124a18c6f94215f779f5c02a"
- integrity sha512-py1miT6iQpJcs1BiJjm54AMzeuMPBSPuKPlnT8HlfudbcS5rYeX5jajpLf3mrdRh9dA/Ec2FVUY0ifeVNDIhZw==
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz#b16d3cf3ee76bf572fdf511e79c248bdec619ea3"
+ integrity sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==
dependencies:
"@eslint-community/regexpp" "^4.10.0"
- "@typescript-eslint/scope-manager" "7.16.0"
- "@typescript-eslint/type-utils" "7.16.0"
- "@typescript-eslint/utils" "7.16.0"
- "@typescript-eslint/visitor-keys" "7.16.0"
+ "@typescript-eslint/scope-manager" "7.18.0"
+ "@typescript-eslint/type-utils" "7.18.0"
+ "@typescript-eslint/utils" "7.18.0"
+ "@typescript-eslint/visitor-keys" "7.18.0"
graphemer "^1.4.0"
ignore "^5.3.1"
natural-compare "^1.4.0"
ts-api-utils "^1.3.0"
"@typescript-eslint/parser@^7.1.1":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.16.0.tgz#53fae8112f8c912024aea7b499cf7374487af6d8"
- integrity sha512-ar9E+k7CU8rWi2e5ErzQiC93KKEFAXA2Kky0scAlPcxYblLt8+XZuHUZwlyfXILyQa95P6lQg+eZgh/dDs3+Vw==
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-7.18.0.tgz#83928d0f1b7f4afa974098c64b5ce6f9051f96a0"
+ integrity sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==
dependencies:
- "@typescript-eslint/scope-manager" "7.16.0"
- "@typescript-eslint/types" "7.16.0"
- "@typescript-eslint/typescript-estree" "7.16.0"
- "@typescript-eslint/visitor-keys" "7.16.0"
+ "@typescript-eslint/scope-manager" "7.18.0"
+ "@typescript-eslint/types" "7.18.0"
+ "@typescript-eslint/typescript-estree" "7.18.0"
+ "@typescript-eslint/visitor-keys" "7.18.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@5.62.0":
@@ -3116,21 +2866,21 @@
"@typescript-eslint/types" "5.62.0"
"@typescript-eslint/visitor-keys" "5.62.0"
-"@typescript-eslint/scope-manager@7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.16.0.tgz#eb0757af5720c9c53c8010d7a0355ae27e17b7e5"
- integrity sha512-8gVv3kW6n01Q6TrI1cmTZ9YMFi3ucDT7i7aI5lEikk2ebk1AEjrwX8MDTdaX5D7fPXMBLvnsaa0IFTAu+jcfOw==
+"@typescript-eslint/scope-manager@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz#c928e7a9fc2c0b3ed92ab3112c614d6bd9951c83"
+ integrity sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==
dependencies:
- "@typescript-eslint/types" "7.16.0"
- "@typescript-eslint/visitor-keys" "7.16.0"
+ "@typescript-eslint/types" "7.18.0"
+ "@typescript-eslint/visitor-keys" "7.18.0"
-"@typescript-eslint/type-utils@7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.16.0.tgz#ec52b1932b8fb44a15a3e20208e0bd49d0b6bd00"
- integrity sha512-j0fuUswUjDHfqV/UdW6mLtOQQseORqfdmoBNDFOqs9rvNVR2e+cmu6zJu/Ku4SDuqiJko6YnhwcL8x45r8Oqxg==
+"@typescript-eslint/type-utils@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz#2165ffaee00b1fbbdd2d40aa85232dab6998f53b"
+ integrity sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==
dependencies:
- "@typescript-eslint/typescript-estree" "7.16.0"
- "@typescript-eslint/utils" "7.16.0"
+ "@typescript-eslint/typescript-estree" "7.18.0"
+ "@typescript-eslint/utils" "7.18.0"
debug "^4.3.4"
ts-api-utils "^1.3.0"
@@ -3139,10 +2889,10 @@
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f"
integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==
-"@typescript-eslint/types@7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.16.0.tgz#60a19d7e7a6b1caa2c06fac860829d162a036ed2"
- integrity sha512-fecuH15Y+TzlUutvUl9Cc2XJxqdLr7+93SQIbcZfd4XRGGKoxyljK27b+kxKamjRkU7FYC6RrbSCg0ALcZn/xw==
+"@typescript-eslint/types@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9"
+ integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==
"@typescript-eslint/typescript-estree@5.62.0":
version "5.62.0"
@@ -3157,13 +2907,13 @@
semver "^7.3.7"
tsutils "^3.21.0"
-"@typescript-eslint/typescript-estree@7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.16.0.tgz#98ac779d526fab2a781e5619c9250f3e33867c09"
- integrity sha512-a5NTvk51ZndFuOLCh5OaJBELYc2O3Zqxfl3Js78VFE1zE46J2AaVuW+rEbVkQznjkmlzWsUI15BG5tQMixzZLw==
+"@typescript-eslint/typescript-estree@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz#b5868d486c51ce8f312309ba79bdb9f331b37931"
+ integrity sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==
dependencies:
- "@typescript-eslint/types" "7.16.0"
- "@typescript-eslint/visitor-keys" "7.16.0"
+ "@typescript-eslint/types" "7.18.0"
+ "@typescript-eslint/visitor-keys" "7.18.0"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
@@ -3171,15 +2921,15 @@
semver "^7.6.0"
ts-api-utils "^1.3.0"
-"@typescript-eslint/utils@7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.16.0.tgz#b38dc0ce1778e8182e227c98d91d3418449aa17f"
- integrity sha512-PqP4kP3hb4r7Jav+NiRCntlVzhxBNWq6ZQ+zQwII1y/G/1gdIPeYDCKr2+dH6049yJQsWZiHU6RlwvIFBXXGNA==
+"@typescript-eslint/utils@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-7.18.0.tgz#bca01cde77f95fc6a8d5b0dbcbfb3d6ca4be451f"
+ integrity sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==
dependencies:
"@eslint-community/eslint-utils" "^4.4.0"
- "@typescript-eslint/scope-manager" "7.16.0"
- "@typescript-eslint/types" "7.16.0"
- "@typescript-eslint/typescript-estree" "7.16.0"
+ "@typescript-eslint/scope-manager" "7.18.0"
+ "@typescript-eslint/types" "7.18.0"
+ "@typescript-eslint/typescript-estree" "7.18.0"
"@typescript-eslint/utils@^5.10.0":
version "5.62.0"
@@ -3203,12 +2953,12 @@
"@typescript-eslint/types" "5.62.0"
eslint-visitor-keys "^3.3.0"
-"@typescript-eslint/visitor-keys@7.16.0":
- version "7.16.0"
- resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.16.0.tgz#a1d99fa7a3787962d6e0efd436575ef840e23b06"
- integrity sha512-rMo01uPy9C7XxG7AFsxa8zLnWXTF8N3PYclekWSrurvhwiw1eW88mrKiAYe6s53AUY57nTRz8dJsuuXdkAhzCg==
+"@typescript-eslint/visitor-keys@7.18.0":
+ version "7.18.0"
+ resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz#0564629b6124d67607378d0f0332a0495b25e7d7"
+ integrity sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==
dependencies:
- "@typescript-eslint/types" "7.16.0"
+ "@typescript-eslint/types" "7.18.0"
eslint-visitor-keys "^3.4.3"
"@ungap/structured-clone@^1.2.0":
@@ -3225,9 +2975,9 @@
wonka "^4.0.14"
"@urql/core@>=2.3.1":
- version "5.0.4"
- resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.0.4.tgz#e5d0e185d0833ebf277be58bd6603fd53e48e07f"
- integrity sha512-gl86J6B6gWXvvkx5omZ+CaGiPQ0chCUGM0jBsm0zTtkDQPRqufv0NSUN6sp2JhGGtTOB0NR6Pd+w7XAVGGyUOA==
+ version "5.0.6"
+ resolved "https://registry.yarnpkg.com/@urql/core/-/core-5.0.6.tgz#0d6624e30084f9137f78dc6c5bb8a599cba7f9dc"
+ integrity sha512-38rgSDqVNihFDauw1Pm9V7XLWIKuK8V9CKgrUF7/xEKinze8ENKP1ZeBhkG+dxWzJan7CHK+SLl46kAdvZwIlA==
dependencies:
"@0no-co/graphql.web" "^1.0.5"
wonka "^6.3.2"
@@ -3265,10 +3015,10 @@ accepts@^1.3.7, accepts@^1.3.8, accepts@~1.3.5, accepts@~1.3.7:
mime-types "~2.1.34"
negotiator "0.6.3"
-acorn-import-assertions@^1.9.0:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz#507276249d684797c84e0734ef84860334cfb1ac"
- integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==
+acorn-import-attributes@^1.9.5:
+ version "1.9.5"
+ resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef"
+ integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==
acorn-jsx@^5.3.2:
version "5.3.2"
@@ -3337,9 +3087,9 @@ ansi-regex@^5.0.0, ansi-regex@^5.0.1:
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
ansi-regex@^6.0.1:
- version "6.0.1"
- resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.0.1.tgz#3183e38fae9a65d7cb5e53945cd5897d0260a06a"
- integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.1.0.tgz#95ec409c69619d6cb1b8b34f14b660ef28ebd654"
+ integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==
ansi-styles@^3.2.0, ansi-styles@^3.2.1:
version "3.2.1"
@@ -3493,16 +3243,6 @@ array.prototype.flatmap@^1.3.2:
es-abstract "^1.22.1"
es-shim-unscopables "^1.0.0"
-array.prototype.toreversed@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/array.prototype.toreversed/-/array.prototype.toreversed-1.1.2.tgz#b989a6bf35c4c5051e1dc0325151bf8088954eba"
- integrity sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==
- dependencies:
- call-bind "^1.0.2"
- define-properties "^1.2.0"
- es-abstract "^1.22.1"
- es-shim-unscopables "^1.0.0"
-
array.prototype.tosorted@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz#fe954678ff53034e717ea3352a03f0b0b86f7ffc"
@@ -3641,13 +3381,13 @@ babel-plugin-polyfill-corejs2@^0.4.10:
"@babel/helper-define-polyfill-provider" "^0.6.2"
semver "^6.3.1"
-babel-plugin-polyfill-corejs3@^0.10.1, babel-plugin-polyfill-corejs3@^0.10.4:
- version "0.10.4"
- resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz#789ac82405ad664c20476d0233b485281deb9c77"
- integrity sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==
+babel-plugin-polyfill-corejs3@^0.10.6:
+ version "0.10.6"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz#2deda57caef50f59c525aeb4964d3b2f867710c7"
+ integrity sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==
dependencies:
- "@babel/helper-define-polyfill-provider" "^0.6.1"
- core-js-compat "^3.36.1"
+ "@babel/helper-define-polyfill-provider" "^0.6.2"
+ core-js-compat "^3.38.0"
babel-plugin-polyfill-regenerator@^0.6.1:
version "0.6.2"
@@ -3656,10 +3396,10 @@ babel-plugin-polyfill-regenerator@^0.6.1:
dependencies:
"@babel/helper-define-polyfill-provider" "^0.6.2"
-babel-plugin-react-compiler@^0.0.0-experimental-592953e-20240517:
- version "0.0.0-experimental-696af53-20240625"
- resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-696af53-20240625.tgz#ebf18487ce3fa795a7af78443be0a9f274df8df1"
- integrity sha512-OUDKms8qmcm5bX0D+sJWC1YcKcd7AZ2aJ7eY6gkR+Xr7PDfkXLbqAld4Qs9B0ntjVbUMEtW/PjlQrxDtY4raHg==
+babel-plugin-react-compiler@0.0.0-experimental-592953e-20240517:
+ version "0.0.0-experimental-592953e-20240517"
+ resolved "https://registry.yarnpkg.com/babel-plugin-react-compiler/-/babel-plugin-react-compiler-0.0.0-experimental-592953e-20240517.tgz#e800fa1550d03573cd5637218dc711f12f642249"
+ integrity sha512-OjG1SVaeQZaJrqkMFJatg8W/MTow8Ak5rx2SI0ETQBO1XvOk/XZGMbltNCPdFJLKghBYoBjC+Y3Ap/Xr7B01mA==
dependencies:
"@babel/generator" "7.2.0"
"@babel/types" "^7.19.0"
@@ -3682,27 +3422,30 @@ babel-plugin-transform-flow-enums@^0.0.2:
"@babel/plugin-syntax-flow" "^7.12.1"
babel-preset-current-node-syntax@^1.0.0:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz#b4399239b89b2a011f9ddbe3e4f401fc40cff73b"
- integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz#9a929eafece419612ef4ae4f60b1862ebad8ef30"
+ integrity sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==
dependencies:
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-bigint" "^7.8.3"
- "@babel/plugin-syntax-class-properties" "^7.8.3"
- "@babel/plugin-syntax-import-meta" "^7.8.3"
+ "@babel/plugin-syntax-class-properties" "^7.12.13"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+ "@babel/plugin-syntax-import-attributes" "^7.24.7"
+ "@babel/plugin-syntax-import-meta" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.3"
- "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
- "@babel/plugin-syntax-numeric-separator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
- "@babel/plugin-syntax-top-level-await" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
-babel-preset-expo@~11.0.12:
- version "11.0.12"
- resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-11.0.12.tgz#633f13f547860df3a9b540bf55d2a1033a913d2d"
- integrity sha512-hUuKdzSo8+H1oXQvKvlHRMHTxl+nN6YhFGlKiIxPa0E+gYfMEp8FnnStc/2Hwmip5rgJzQs6KF63KKRUc75xAg==
+babel-preset-expo@~11.0.15:
+ version "11.0.15"
+ resolved "https://registry.yarnpkg.com/babel-preset-expo/-/babel-preset-expo-11.0.15.tgz#f29b1ac1f59f8739f63c80515906186586c24d3c"
+ integrity sha512-rgiMTYwqIPULaO7iZdqyL7aAff9QLOX6OWUtLZBlOrOTreGY1yHah/5+l8MvI6NVc/8Zj5LY4Y5uMSnJIuzTLw==
dependencies:
"@babel/plugin-proposal-decorators" "^7.12.9"
"@babel/plugin-transform-export-namespace-from" "^7.22.11"
@@ -3710,8 +3453,8 @@ babel-preset-expo@~11.0.12:
"@babel/plugin-transform-parameters" "^7.22.15"
"@babel/preset-react" "^7.22.15"
"@babel/preset-typescript" "^7.23.0"
- "@react-native/babel-preset" "0.74.85"
- babel-plugin-react-compiler "^0.0.0-experimental-592953e-20240517"
+ "@react-native/babel-preset" "0.74.87"
+ babel-plugin-react-compiler "0.0.0-experimental-592953e-20240517"
babel-plugin-react-native-web "~0.19.10"
react-refresh "^0.14.2"
@@ -3804,15 +3547,15 @@ braces@^3.0.3:
dependencies:
fill-range "^7.1.1"
-browserslist@^4.22.2, browserslist@^4.23.0:
- version "4.23.1"
- resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.23.1.tgz#ce4af0534b3d37db5c1a4ca98b9080f985041e96"
- integrity sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==
+browserslist@^4.23.3, browserslist@^4.24.0:
+ version "4.24.0"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.0.tgz#a1325fe4bc80b64fda169629fc01b3d6cecd38d4"
+ integrity sha512-Rmb62sR1Zpjql25eSanFGEhAxcFwfA1K0GuQcLoaJBAcENegrQut3hYdhXFF1obQfiDyqIW/cLM5HSJ/9k884A==
dependencies:
- caniuse-lite "^1.0.30001629"
- electron-to-chromium "^1.4.796"
- node-releases "^2.0.14"
- update-browserslist-db "^1.0.16"
+ caniuse-lite "^1.0.30001663"
+ electron-to-chromium "^1.5.28"
+ node-releases "^2.0.18"
+ update-browserslist-db "^1.1.0"
bser@2.1.1:
version "2.1.1"
@@ -3863,9 +3606,9 @@ bytes@3.0.0:
integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
cacache@^18.0.2:
- version "18.0.3"
- resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.3.tgz#864e2c18414e1e141ae8763f31e46c2cb96d1b21"
- integrity sha512-qXCd4rh6I07cnDqh8V48/94Tc/WSfj+o3Gn6NZ0aZovS255bUx8O13uKxRFd2eWG0xgsco7+YItQNPaa5E85hg==
+ version "18.0.4"
+ resolved "https://registry.yarnpkg.com/cacache/-/cacache-18.0.4.tgz#4601d7578dadb59c66044e157d02a3314682d6a5"
+ integrity sha512-B+L5iIa9mgcjLbliir2th36yEwPftrzteHYujzsx3dFP/31GCHcIeS8f5MGd80odLOjaOvSpU3EEAmRQptkxLQ==
dependencies:
"@npmcli/fs" "^3.1.0"
fs-minipass "^3.0.0"
@@ -3925,10 +3668,10 @@ camelcase@^6.2.0:
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
-caniuse-lite@^1.0.30001629:
- version "1.0.30001640"
- resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001640.tgz#32c467d4bf1f1a0faa63fc793c2ba81169e7652f"
- integrity sha512-lA4VMpW0PSUrFnkmVuEKBUovSWKhj7puyCg8StBChgu298N1AtuF1sKWEvfDuimSEDbhlb/KqPKC3fs1HbuQUA==
+caniuse-lite@^1.0.30001663:
+ version "1.0.30001668"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001668.tgz#98e214455329f54bf7a4d70b49c9794f0fbedbed"
+ integrity sha512-nWLrdxqCdblixUO+27JtGJJE/txpJlyUy5YN1u53wLZkP0emYCo5zgS6QYft7VUYR42LGgi/S5hdLZTrnyIddw==
chalk@4, chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2:
version "4.1.2"
@@ -3983,9 +3726,9 @@ ci-info@^3.2.0, ci-info@^3.3.0:
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
cjs-module-lexer@^1.0.0, cjs-module-lexer@^1.2.2:
- version "1.3.1"
- resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.3.1.tgz#c485341ae8fd999ca4ee5af2d7a1c9ae01e0099c"
- integrity sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz#707413784dbb3a72aa11c2f2b042a0bef4004170"
+ integrity sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==
clean-stack@^2.0.0:
version "2.2.0"
@@ -4195,12 +3938,12 @@ convert-source-map@^2.0.0:
resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a"
integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==
-core-js-compat@^3.31.0, core-js-compat@^3.36.1:
- version "3.37.1"
- resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.37.1.tgz#c844310c7852f4bdf49b8d339730b97e17ff09ee"
- integrity sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==
+core-js-compat@^3.38.0, core-js-compat@^3.38.1:
+ version "3.38.1"
+ resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.38.1.tgz#2bc7a298746ca5a7bcb9c164bcb120f2ebc09a09"
+ integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==
dependencies:
- browserslist "^4.23.0"
+ browserslist "^4.23.3"
core-util-is@~1.0.0:
version "1.0.3"
@@ -4317,9 +4060,9 @@ data-view-byte-offset@^1.0.0:
is-data-view "^1.0.1"
dayjs@^1.8.15:
- version "1.11.11"
- resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e"
- integrity sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==
+ version "1.11.13"
+ resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
+ integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
debug@2.6.9, debug@^2.2.0, debug@^2.6.9:
version "2.6.9"
@@ -4328,12 +4071,12 @@ debug@2.6.9, debug@^2.2.0, debug@^2.6.9:
dependencies:
ms "2.0.0"
-debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
- version "4.3.5"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.5.tgz#e83444eceb9fedd4a1da56d671ae2446a01a6e1e"
- integrity sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==
+debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5:
+ version "4.3.7"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.7.tgz#87945b4151a011d76d95a198d7111c865c360a52"
+ integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==
dependencies:
- ms "2.1.2"
+ ms "^2.1.3"
debug@^3.1.0:
version "3.2.7"
@@ -4396,7 +4139,7 @@ define-lazy-prop@^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.2.0, define-properties@^1.2.1:
+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"
integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
@@ -4516,10 +4259,10 @@ ee-first@1.1.1:
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
-electron-to-chromium@^1.4.796:
- version "1.4.820"
- resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.820.tgz#1195660c157535392a09442540a08ee63fea8c40"
- integrity sha512-kK/4O/YunacfboFEk/BDf7VO1HoPmDudLTJAU9NmXIOSjsV7qVIX3OrI4REZo0VmdqhcpUcncQc6N8Q3aEXlHg==
+electron-to-chromium@^1.5.28:
+ version "1.5.36"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.36.tgz#ec41047f0e1446ec5dce78ed5970116533139b88"
+ integrity sha512-HYTX8tKge/VNp6FGO+f/uVDmUkq+cEfcxYhKf15Akc4M5yxt5YmorwlAitKWjWhWQnKcDRBAQKXkhqqXMqcrjw==
emitter-listener@^1.0.1, emitter-listener@^1.1.1:
version "1.1.2"
@@ -4548,6 +4291,11 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+encodeurl@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+ integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
end-of-stream@^1.1.0:
version "1.4.4"
resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz#5ae64a5f45057baf3626ec14da0ca5e4b2431eb0"
@@ -4561,9 +4309,9 @@ env-editor@^0.4.1:
integrity sha512-ObFo8v4rQJAE59M69QzwloxPZtd33TpYEIjtKD1rrFDcM1Gd7IkDxEBU+HriziN6HSHQnBJi8Dmy+JWkav5HKA==
envinfo@^7.10.0, envinfo@^7.5.0, envinfo@^7.8.1:
- version "7.13.0"
- resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.13.0.tgz#81fbb81e5da35d74e814941aeab7c325a606fb31"
- integrity sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==
+ version "7.14.0"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae"
+ integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==
eol@^0.9.1:
version "0.9.1"
@@ -4592,7 +4340,7 @@ errorhandler@^1.5.1:
accepts "~1.3.7"
escape-html "~1.0.3"
-es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3:
+es-abstract@^1.17.5, es-abstract@^1.22.1, es-abstract@^1.22.3, es-abstract@^1.23.0, es-abstract@^1.23.1, es-abstract@^1.23.2, es-abstract@^1.23.3:
version "1.23.3"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.23.3.tgz#8f0c5a35cd215312573c5a27c87dfd6c881a0aa0"
integrity sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==
@@ -4657,9 +4405,9 @@ es-errors@^1.2.1, es-errors@^1.3.0:
integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
es-iterator-helpers@^1.0.19:
- version "1.0.19"
- resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.0.19.tgz#117003d0e5fec237b4b5c08aded722e0c6d50ca8"
- integrity sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.1.0.tgz#f6d745d342aea214fe09497e7152170dc333a7a6"
+ integrity sha512-/SurEfycdyssORP/E+bj4sEu1CWw4EmLDsHynHwSXQ7utgbrMRWW195pTrCjFgFCddf/UkYm3oqKPRq5i8bJbw==
dependencies:
call-bind "^1.0.7"
define-properties "^1.2.1"
@@ -4668,12 +4416,12 @@ es-iterator-helpers@^1.0.19:
es-set-tostringtag "^2.0.3"
function-bind "^1.1.2"
get-intrinsic "^1.2.4"
- globalthis "^1.0.3"
+ globalthis "^1.0.4"
has-property-descriptors "^1.0.2"
has-proto "^1.0.3"
has-symbols "^1.0.3"
internal-slot "^1.0.7"
- iterator.prototype "^1.1.2"
+ iterator.prototype "^1.1.3"
safe-array-concat "^1.1.2"
es-object-atoms@^1.0.0:
@@ -4708,10 +4456,10 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
-escalade@^3.1.1, escalade@^3.1.2:
- version "3.1.2"
- resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.2.tgz#54076e9ab29ea5bf3d8f1ed62acffbb88272df27"
- integrity sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==
+escalade@^3.1.1, escalade@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5"
+ integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==
escape-html@~1.0.3:
version "1.0.3"
@@ -4786,28 +4534,28 @@ eslint-plugin-react-native@^4.0.0:
eslint-plugin-react-native-globals "^0.1.1"
eslint-plugin-react@^7.30.1:
- version "7.34.3"
- resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.34.3.tgz#9965f27bd1250a787b5d4cfcc765e5a5d58dcb7b"
- integrity sha512-aoW4MV891jkUulwDApQbPYTVZmeuSyFrudpbTAQuj5Fv8VL+o6df2xIGpw8B0hPjAaih1/Fb0om9grCdyFYemA==
+ version "7.37.1"
+ resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd"
+ integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg==
dependencies:
array-includes "^3.1.8"
array.prototype.findlast "^1.2.5"
array.prototype.flatmap "^1.3.2"
- array.prototype.toreversed "^1.1.2"
array.prototype.tosorted "^1.1.4"
doctrine "^2.1.0"
es-iterator-helpers "^1.0.19"
estraverse "^5.3.0"
+ hasown "^2.0.2"
jsx-ast-utils "^2.4.1 || ^3.0.0"
minimatch "^3.1.2"
object.entries "^1.1.8"
object.fromentries "^2.0.8"
- object.hasown "^1.1.4"
object.values "^1.2.0"
prop-types "^15.8.1"
resolve "^2.0.0-next.5"
semver "^6.3.1"
string.prototype.matchall "^4.0.11"
+ string.prototype.repeat "^1.0.0"
eslint-scope@5.1.1, eslint-scope@^5.1.1:
version "5.1.1"
@@ -4836,15 +4584,15 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4
integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==
eslint@^8.19.0:
- version "8.57.0"
- resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.0.tgz#c786a6fd0e0b68941aaf624596fb987089195668"
- integrity sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==
+ version "8.57.1"
+ resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.57.1.tgz#7df109654aba7e3bbe5c8eae533c5e461d3c6ca9"
+ integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@eslint-community/regexpp" "^4.6.1"
"@eslint/eslintrc" "^2.1.4"
- "@eslint/js" "8.57.0"
- "@humanwhocodes/config-array" "^0.11.14"
+ "@eslint/js" "8.57.1"
+ "@humanwhocodes/config-array" "^0.13.0"
"@humanwhocodes/module-importer" "^1.0.1"
"@nodelib/fs.walk" "^1.2.8"
"@ungap/structured-clone" "^1.2.0"
@@ -4996,7 +4744,7 @@ expect@^29.7.0:
jest-message-util "^29.7.0"
jest-util "^29.7.0"
-expo-asset@^10.0.9, expo-asset@~10.0.10:
+expo-asset@~10.0.10:
version "10.0.10"
resolved "https://registry.yarnpkg.com/expo-asset/-/expo-asset-10.0.10.tgz#9e6e02c1a6ec3d19b50d5e615e4dd8e5cc30e857"
integrity sha512-0qoTIihB79k+wGus9wy0JMKq7DdenziVx3iUkGvMAy2azscSgWH6bd2gJ9CGnhC6JRd3qTMFBL0ou/fx7WZl7A==
@@ -5018,62 +4766,77 @@ expo-file-system@~17.0.1:
resolved "https://registry.yarnpkg.com/expo-file-system/-/expo-file-system-17.0.1.tgz#b9f8af8c1c06ec71d96fd7a0d2567fa9e1c88f15"
integrity sha512-dYpnZJqTGj6HCYJyXAgpFkQWsiCH3HY1ek2cFZVHFoEc5tLz9gmdEgTF6nFHurvmvfmXqxi7a5CXyVm0aFYJBw==
-expo-font@~12.0.7:
- version "12.0.7"
- resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-12.0.7.tgz#4e81a90c72262f64d8a18ecc2f7a0da4446048bb"
- integrity sha512-rbSdpjtT/A3M+u9xchR9tdD+5VGSxptUis7ngX5zfAVp3O5atOcPNSA82Jeo15HkrQE+w/upfFBOvi56lsGdsQ==
+expo-font@~12.0.10:
+ version "12.0.10"
+ resolved "https://registry.yarnpkg.com/expo-font/-/expo-font-12.0.10.tgz#62deaf1f46159d7839f01305f44079268781b1db"
+ integrity sha512-Q1i2NuYri3jy32zdnBaHHCya1wH1yMAsI+3CCmj9zlQzlhsS9Bdwcj2W3c5eU5FvH2hsNQy4O+O1NnM6o/pDaQ==
dependencies:
fontfaceobserver "^2.1.0"
-expo-image@^1.12.12:
- version "1.12.12"
- resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-1.12.12.tgz#b6422a07da0f6dddcea154d2857f617086a527cc"
- integrity sha512-zZutUhKYqcqTH12o87pGCVLsuQeRK2vaNwxa8beznbDnmWevm3dmbOTCxaOhGgjyDxwcdwDa483Q4IKCXL6tBw==
+expo-image@^1.12.15:
+ version "1.13.0"
+ resolved "https://registry.yarnpkg.com/expo-image/-/expo-image-1.13.0.tgz#f0ad585ecf57f6df2d8524f5e9275cb12b349836"
+ integrity sha512-0NLDcFmEn4Nh1sXeRvNzDHT+Fl6FXtTol6ki6kYYH0/iDeSFWyIy/Fek6kzDDYAmhipSMR7buPf7VVoHseTbAA==
expo-keep-awake@~13.0.2:
version "13.0.2"
resolved "https://registry.yarnpkg.com/expo-keep-awake/-/expo-keep-awake-13.0.2.tgz#5ef31311a339671eec9921b934fdd90ab9652b0e"
integrity sha512-kKiwkVg/bY0AJ5q1Pxnm/GvpeB6hbNJhcFsoOWDh2NlpibhCLaHL826KHUM+WsnJRbVRxJ+K9vbPRHEMvFpVyw==
-expo-modules-autolinking@1.11.1:
- version "1.11.1"
- resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-1.11.1.tgz#4a867f727d9dfde07de8dde14b333a3cbf82ce3c"
- integrity sha512-2dy3lTz76adOl7QUvbreMCrXyzUiF8lygI7iFJLjgIQIVH+43KnFWE5zBumpPbkiaq0f0uaFpN9U0RGQbnKiMw==
+expo-modules-autolinking@1.11.3:
+ version "1.11.3"
+ resolved "https://registry.yarnpkg.com/expo-modules-autolinking/-/expo-modules-autolinking-1.11.3.tgz#bc64d278c04015014bb5802e3cfcd942d7c07168"
+ integrity sha512-oYh8EZEvYF5TYppxEKUTTJmbr8j7eRRnrIxzZtMvxLTXoujThVPMFS/cbnSnf2bFm1lq50TdDNABhmEi7z0ngQ==
dependencies:
chalk "^4.1.0"
commander "^7.2.0"
fast-glob "^3.2.5"
find-up "^5.0.0"
fs-extra "^9.1.0"
+ require-from-string "^2.0.2"
+ resolve-from "^5.0.0"
-expo-modules-core@1.12.18:
- version "1.12.18"
- resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-1.12.18.tgz#fd086c3177b42df979db912f8a2389494ef98483"
- integrity sha512-YhIOJsMNjPvP0tmTbC1MRlxl5q7l21uQQDr1rlXEWHNmI2AEMW0gfr2wXrlB2Tz/oOIx8YqREsj3i0VsYXEaCA==
+expo-modules-core@1.12.25:
+ version "1.12.25"
+ resolved "https://registry.yarnpkg.com/expo-modules-core/-/expo-modules-core-1.12.25.tgz#9ec8d8762da92d961ab1044817da033ae617c9f4"
+ integrity sha512-HB2LS2LEM41Xq1bG+Jtzqm6XgPaa+mM9BAvCdX1lDGMQ9Ay9vMTL/GVEs2gpsINPofICopjBRwD+wftyCbVrzg==
dependencies:
invariant "^2.2.4"
-expo@^51.0.17:
- version "51.0.18"
- resolved "https://registry.yarnpkg.com/expo/-/expo-51.0.18.tgz#dc80bcd6c5fb2ede4b8c9b8b8fdc58f78376a1a0"
- integrity sha512-QiaNq2XXjfDk009qbyBFd/5CNikcQ0ZucGlOB3ebNf3z9Q9wrfL1A9E4NqPh6sgm0VG486AYT9mNKwAfcOVCIA==
+expo-navigation-bar@~3.0.7:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/expo-navigation-bar/-/expo-navigation-bar-3.0.7.tgz#1830a302a89fa5c26cb27ce4cf6ac6c1d22907ff"
+ integrity sha512-KCNHyZ58zoN4xdy7D1lUdJvveCYNVQHGSX4M6xO/SZypvI6GZbLzKSN6Lx4GDGEFxG6Kb+EAckZl48tSiNeGYQ==
+ dependencies:
+ "@react-native/normalize-colors" "0.74.85"
+ debug "^4.3.2"
+
+expo@^51.0.32:
+ version "51.0.37"
+ resolved "https://registry.yarnpkg.com/expo/-/expo-51.0.37.tgz#a19b05b722d7ad445757b82a63185295508d2d4d"
+ integrity sha512-zMdfTiGNgNWG0HOOFA3zRreS94iQ7fDxxgEIR6wdQCbncTpbeYj+5mscTAlHE9JJ+oBkcNyJXrLSjE/YVbFERg==
dependencies:
"@babel/runtime" "^7.20.0"
- "@expo/cli" "0.18.22"
- "@expo/config" "9.0.1"
- "@expo/config-plugins" "8.0.7"
- "@expo/metro-config" "0.18.8"
- "@expo/vector-icons" "^14.0.0"
- babel-preset-expo "~11.0.12"
+ "@expo/cli" "0.18.30"
+ "@expo/config" "9.0.4"
+ "@expo/config-plugins" "8.0.10"
+ "@expo/metro-config" "0.18.11"
+ "@expo/vector-icons" "^14.0.3"
+ babel-preset-expo "~11.0.15"
expo-asset "~10.0.10"
expo-file-system "~17.0.1"
- expo-font "~12.0.7"
+ expo-font "~12.0.10"
expo-keep-awake "~13.0.2"
- expo-modules-autolinking "1.11.1"
- expo-modules-core "1.12.18"
+ expo-modules-autolinking "1.11.3"
+ expo-modules-core "1.12.25"
fbemitter "^3.0.0"
whatwg-url-without-unicode "8.0.0-3"
+exponential-backoff@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6"
+ integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==
+
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"
@@ -5111,9 +4874,9 @@ fast-loops@^1.1.3:
integrity sha512-8dbd3XWoKCTms18ize6JmQF1SFnnfj5s0B7rRry22EofgMu7B6LKHVh+XfFqFGsqnbH54xgeO83PzpKI+ODhlg==
fast-xml-parser@^4.0.12, fast-xml-parser@^4.2.4:
- version "4.4.0"
- resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.4.0.tgz#341cc98de71e9ba9e651a67f41f1752d1441a501"
- integrity sha512-kLY3jFlwIYwBNDojclKsNAC12sfD6NwW74QB2CoNGPvtVxjliYehVunB3HYyNi+n4Tt1dAcgwYvmKF/Z18flqg==
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz#2882b7d01a6825dfdf909638f2de0256351def37"
+ integrity sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==
dependencies:
strnum "^1.0.5"
@@ -5189,12 +4952,11 @@ finalhandler@1.1.2:
unpipe "~1.0.0"
find-babel-config@^2.0.0:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-2.1.1.tgz#93703fc8e068db5e4c57592900c5715dd04b7e5b"
- integrity sha512-5Ji+EAysHGe1OipH7GN4qDjok5Z1uw5KAwDCbicU/4wyTZY7CqOCzcWbG7J5ad9mazq67k89fXlbc1MuIfl9uA==
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/find-babel-config/-/find-babel-config-2.1.2.tgz#2841b1bfbbbcdb971e1e39df8cbc43dafa901716"
+ integrity sha512-ZfZp1rQyp4gyuxqt1ZqjFGVeVBvmpURMqdIWXbPRfB97Bf6BzdK/xSIbylEINzQ0kB5tlDQfn9HkNXXWsqTqLg==
dependencies:
json5 "^2.2.3"
- path-exists "^4.0.0"
find-cache-dir@^2.0.0:
version "2.1.0"
@@ -5255,9 +5017,9 @@ flow-enums-runtime@^0.0.6:
integrity sha512-3PYnM29RFXwvAN6Pc/scUfkI7RwhQ/xqyLUyPNlXUp9S40zI8nup9tUSrTLSVnWGBN38FNiGWbwZOB6uR4OGdw==
flow-parser@0.*:
- version "0.239.1"
- resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.239.1.tgz#45cfc79bbcc54332cffeb13293b82a7c7358cd1c"
- integrity sha512-topOrETNxJ6T2gAnQiWqAlzGPj8uI2wtmNOlDIMNB+qyvGJZ6R++STbUOTAYmvPhOMz2gXnXPH0hOvURYmrBow==
+ version "0.248.1"
+ resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.248.1.tgz#0de3af63d27970d145a02d2c9e0e7e698fb6e92d"
+ integrity sha512-fkCfVPelbTzSVp+jVwSvEyc+I4WG8MNhRG/EWSZZTlgHAMEdhXJaFEbfErXxMktboMhVGchvEFhWxkzNGM1m2A==
fontfaceobserver@^2.1.0:
version "2.3.0"
@@ -5272,26 +5034,26 @@ for-each@^0.3.3:
is-callable "^1.1.3"
foreground-child@^3.1.0:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.2.1.tgz#767004ccf3a5b30df39bed90718bab43fe0a59f7"
- integrity sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77"
+ integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==
dependencies:
cross-spawn "^7.0.0"
signal-exit "^4.0.1"
form-data@^3.0.1:
- version "3.0.1"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f"
- integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.2.tgz#83ad9ced7c03feaad97e293d6f6091011e1659c8"
+ integrity sha512-sJe+TQb2vIaIyO783qN6BlMYWMw3WBOHA1Ay2qxsnjuafEOQFJ2JakedOQirT6D5XPRxDvS7AHYyem9fTpb4LQ==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
mime-types "^2.1.12"
form-data@^4.0.0:
- version "4.0.0"
- resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
- integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.1.tgz#ba1076daaaa5bfd7e99c1a6cb02aa0a5cff90d48"
+ integrity sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==
dependencies:
asynckit "^0.4.0"
combined-stream "^1.0.8"
@@ -5365,7 +5127,7 @@ function-bind@^1.1.2:
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
-function.prototype.name@^1.1.5, function.prototype.name@^1.1.6:
+function.prototype.name@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.6.tgz#cdf315b7d90ee77a4c6ee216c3c3362da07533fd"
integrity sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==
@@ -5478,10 +5240,10 @@ glob@7.1.6:
once "^1.3.0"
path-is-absolute "^1.0.0"
-glob@^10.2.2:
- version "10.4.4"
- resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.4.tgz#d60943feb6f8140522117e6576a923b715718380"
- integrity sha512-XsOKvHsu38Xe19ZQupE6N/HENeHQBA05o3hV8labZZT2zYDg1+emxWHnc/Bm9AcCMPXfD6jt+QC7zC5JSFyumw==
+glob@^10.2.2, glob@^10.4.2:
+ version "10.4.5"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-10.4.5.tgz#f4d9f0b90ffdbab09c9d77f5f29b4262517b0956"
+ integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==
dependencies:
foreground-child "^3.1.0"
jackspeak "^3.1.2"
@@ -5490,17 +5252,6 @@ glob@^10.2.2:
package-json-from-dist "^1.0.0"
path-scurry "^1.11.1"
-glob@^6.0.1:
- version "6.0.4"
- resolved "https://registry.yarnpkg.com/glob/-/glob-6.0.4.tgz#0f08860f6a155127b2fadd4f9ce24b1aab6e4d22"
- integrity sha512-MKZeRNyYZAVVVG1oZeLaWie1uweH40m9AZwIwxyPbTSX4hHrVYSzLg0Ro5Z5R7XKkIX+Cc6oD1rqeDJnwsB8/A==
- dependencies:
- inflight "^1.0.4"
- inherits "2"
- minimatch "2 || 3"
- once "^1.3.0"
- path-is-absolute "^1.0.0"
-
glob@^7.0.0, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.7, glob@^7.2.3:
version "7.2.3"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b"
@@ -5536,7 +5287,7 @@ globals@^13.19.0:
dependencies:
type-fest "^0.20.2"
-globalthis@^1.0.3:
+globalthis@^1.0.3, globalthis@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
@@ -5544,7 +5295,7 @@ globalthis@^1.0.3:
define-properties "^1.2.1"
gopd "^1.0.1"
-globby@^11.0.1, globby@^11.0.4, globby@^11.1.0:
+globby@^11.0.1, globby@^11.1.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==
@@ -5648,10 +5399,10 @@ hermes-estree@0.19.1:
resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.19.1.tgz#d5924f5fac2bf0532547ae9f506d6db8f3c96392"
integrity sha512-daLGV3Q2MKk8w4evNMKwS8zBE/rcpA800nu1Q5kM08IKijoSnPe9Uo1iIxzPKRkn95IxxsgBMPeYHt3VG4ej2g==
-hermes-estree@0.20.1:
- version "0.20.1"
- resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.20.1.tgz#0b9a544cf883a779a8e1444b915fa365bef7f72d"
- integrity sha512-SQpZK4BzR48kuOg0v4pb3EAGNclzIlqMj3Opu/mu7bbAoFw6oig6cEt/RAi0zTFW/iW6Iz9X9ggGuZTAZ/yZHg==
+hermes-estree@0.23.1:
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.23.1.tgz#d0bac369a030188120ee7024926aabe5a9f84fdb"
+ integrity sha512-eT5MU3f5aVhTqsfIReZ6n41X5sYn4IdQL0nvz6yO+MMlPxw49aSARHLg/MSehQftyjnrE8X6bYregzSumqc6cg==
hermes-parser@0.19.1:
version "0.19.1"
@@ -5660,12 +5411,12 @@ hermes-parser@0.19.1:
dependencies:
hermes-estree "0.19.1"
-hermes-parser@0.20.1:
- version "0.20.1"
- resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.20.1.tgz#ad10597b99f718b91e283f81cbe636c50c3cff92"
- integrity sha512-BL5P83cwCogI8D7rrDCgsFY0tdYUtmFP9XaXtl2IQjC+2Xo+4okjfXintlTxcIwl4qeGddEl28Z11kbVIw0aNA==
+hermes-parser@0.23.1:
+ version "0.23.1"
+ resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.23.1.tgz#e5de648e664f3b3d84d01b48fc7ab164f4b68205"
+ integrity sha512-oxl5h2DkFW83hT4DAUJorpah8ou4yvmweUzLJmmr6YV2cezduCdlil1AvU/a/xSsAFo4WUcNA4GoV5Bvq6JffA==
dependencies:
- hermes-estree "0.20.1"
+ hermes-estree "0.23.1"
hermes-profile-transformer@^0.0.6:
version "0.0.6"
@@ -5740,9 +5491,9 @@ ignore@^3.3.5:
integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
ignore@^5.0.5, ignore@^5.2.0, ignore@^5.3.1:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.1.tgz#5073e554cd42c5b33b394375f538b8593e34d4ef"
- integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
image-size@^1.0.2:
version "1.1.1"
@@ -5767,20 +5518,20 @@ import-fresh@^3.2.1:
parent-module "^1.0.0"
resolve-from "^4.0.0"
-import-in-the-middle@1.4.2:
- version "1.4.2"
- resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.4.2.tgz#2a266676e3495e72c04bbaa5ec14756ba168391b"
- integrity sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==
+import-in-the-middle@^1.8.1:
+ version "1.11.2"
+ resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.11.2.tgz#dd848e72b63ca6cd7c34df8b8d97fc9baee6174f"
+ integrity sha512-gK6Rr6EykBcc6cVWRSBR5TWf8nn6hZMYSRYqCcHa0l0d1fPK7JSYo6+Mlmck76jIX9aL/IZ71c06U2VpFwl1zA==
dependencies:
acorn "^8.8.2"
- acorn-import-assertions "^1.9.0"
+ acorn-import-attributes "^1.9.5"
cjs-module-lexer "^1.2.2"
module-details-from-path "^1.0.3"
import-local@^3.0.2:
- version "3.1.0"
- resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
- integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260"
+ integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==
dependencies:
pkg-dir "^4.2.0"
resolve-cwd "^3.0.0"
@@ -5911,9 +5662,9 @@ is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7:
integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
is-core-module@^2.13.0:
- version "2.14.0"
- resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.14.0.tgz#43b8ef9f46a6a08888db67b1ffd4ec9e3dfd59d1"
- integrity sha512-a5dFJih5ZLYlRtDc0dZWP7RiKr6xIKzmn/oAYCDvdLThadVgyJwlaoQPmRtMSpz+rk0OGAgIu+TcM9HUF0fk1A==
+ version "2.15.1"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.15.1.tgz#a7363a25bee942fefab0de13bf6aa372c82dcc37"
+ integrity sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==
dependencies:
hasown "^2.0.2"
@@ -6213,10 +5964,10 @@ istanbul-reports@^3.1.3:
html-escaper "^2.0.0"
istanbul-lib-report "^3.0.0"
-iterator.prototype@^1.1.2:
- version "1.1.2"
- resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.2.tgz#5e29c8924f01916cb9335f1ff80619dcff22b0c0"
- integrity sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==
+iterator.prototype@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.3.tgz#016c2abe0be3bbdb8319852884f60908ac62bf9c"
+ integrity sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==
dependencies:
define-properties "^1.2.1"
get-intrinsic "^1.2.1"
@@ -6225,9 +5976,9 @@ iterator.prototype@^1.1.2:
set-function-name "^2.0.1"
jackspeak@^3.1.2:
- version "3.4.2"
- resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.2.tgz#c3d1e00071d52dba8b0dac17cd2a12d0187d2989"
- integrity sha512-qH3nOSj8q/8+Eg8LUPOq3C+6HWkpUioIjDsq1+D4zY91oZvpPttw8GwtF1nReRYKXl+1AORyFqtm2f5Q1SB6/Q==
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
+ integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
dependencies:
"@isaacs/cliui" "^8.0.2"
optionalDependencies:
@@ -6672,10 +6423,10 @@ jsesc@^2.5.1:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz#80564d2e483dacf6e8ef209650a67df3f0c283a4"
integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
-jsesc@~0.5.0:
- version "0.5.0"
- resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
- integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+jsesc@^3.0.2, jsesc@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e"
+ integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==
json-buffer@3.0.1:
version "3.0.1"
@@ -6937,9 +6688,9 @@ loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
js-tokens "^3.0.0 || ^4.0.0"
lru-cache@^10.0.1, lru-cache@^10.2.0:
- version "10.4.2"
- resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.2.tgz#78c38f194b747174cff90e60afabcae40c3619f2"
- integrity sha512-voV4dDrdVZVNz84n39LFKDaRzfwhdzJ7akpyXfTMxCgRUp07U3lcJUXRlhTKP17rgt09sUzLi5iCitpEAr+6ug==
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
lru-cache@^5.1.1:
version "5.1.1"
@@ -7062,57 +6813,64 @@ merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
-metro-babel-transformer@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.9.tgz#7051ba377b7d2140abd23f4846bbbb1e81fea99b"
- integrity sha512-d76BSm64KZam1nifRZlNJmtwIgAeZhZG3fi3K+EmPOlrR8rDtBxQHDSN3fSGeNB9CirdTyabTMQCkCup6BXFSQ==
+metro-babel-transformer@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.80.12.tgz#ad02ade921dd4ced27b26b18ff31eb60608e3f56"
+ integrity sha512-YZziRs0MgA3pzCkkvOoQRXjIoVjvrpi/yRlJnObyIvMP6lFdtyG4nUGIwGY9VXnBvxmXD6mPY2e+NSw6JAyiRg==
dependencies:
"@babel/core" "^7.20.0"
- hermes-parser "0.20.1"
+ flow-enums-runtime "^0.0.6"
+ hermes-parser "0.23.1"
nullthrows "^1.1.1"
-metro-cache-key@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.9.tgz#a04cbb0a7828509bb10dde9789ef761c0c60bc3d"
- integrity sha512-hRcYGhEiWIdM87hU0fBlcGr+tHDEAT+7LYNCW89p5JhErFt/QaAkVx4fb5bW3YtXGv5BTV7AspWPERoIb99CXg==
-
-metro-cache@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.9.tgz#b914318a90dbcd51b4c27836184519c441ba5123"
- integrity sha512-ujEdSI43QwI+Dj2xuNax8LMo8UgKuXJEdxJkzGPU6iIx42nYa1byQ+aADv/iPh5sh5a//h5FopraW5voXSgm2w==
+metro-cache-key@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-cache-key/-/metro-cache-key-0.80.12.tgz#52f5de698b85866503ace45d0ad76f75aaec92a4"
+ integrity sha512-o4BspKnugg/pE45ei0LGHVuBJXwRgruW7oSFAeSZvBKA/sGr0UhOGY3uycOgWInnS3v5yTTfiBA9lHlNRhsvGA==
dependencies:
- metro-core "0.80.9"
- rimraf "^3.0.2"
+ flow-enums-runtime "^0.0.6"
-metro-config@0.80.9, metro-config@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.9.tgz#4eb6948b0ddc7c38d9d4ba8ddf22a67ca1c2bc06"
- integrity sha512-28wW7CqS3eJrunRGnsibWldqgwRP9ywBEf7kg+uzUHkSFJNKPM1K3UNSngHmH0EZjomizqQA2Zi6/y6VdZMolg==
+metro-cache@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.80.12.tgz#bd81af02c4f17b5aeab19bb030566b14147cee8b"
+ integrity sha512-p5kNHh2KJ0pbQI/H7ZBPCEwkyNcSz7OUkslzsiIWBMPQGFJ/xArMwkV7I+GJcWh+b4m6zbLxE5fk6fqbVK1xGA==
+ dependencies:
+ exponential-backoff "^3.1.1"
+ flow-enums-runtime "^0.0.6"
+ metro-core "0.80.12"
+
+metro-config@0.80.12, metro-config@^0.80.3:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.80.12.tgz#1543009f37f7ad26352ffc493fc6305d38bdf1c0"
+ integrity sha512-4rwOWwrhm62LjB12ytiuR5NgK1ZBNr24/He8mqCsC+HXZ+ATbrewLNztzbAZHtFsrxP4D4GLTGgh96pCpYLSAQ==
dependencies:
connect "^3.6.5"
cosmiconfig "^5.0.5"
+ flow-enums-runtime "^0.0.6"
jest-validate "^29.6.3"
- metro "0.80.9"
- metro-cache "0.80.9"
- metro-core "0.80.9"
- metro-runtime "0.80.9"
+ metro "0.80.12"
+ metro-cache "0.80.12"
+ metro-core "0.80.12"
+ metro-runtime "0.80.12"
-metro-core@0.80.9, metro-core@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.9.tgz#3af21d0b09d71ec9c0840f028bffb36bc3619727"
- integrity sha512-tbltWQn+XTdULkGdzHIxlxk4SdnKxttvQQV3wpqqFbHDteR4gwCyTR2RyYJvxgU7HELfHtrVbqgqAdlPByUSbg==
+metro-core@0.80.12, metro-core@^0.80.3:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.80.12.tgz#5ae337923ab19ff524077efa1aeacdf4480cfa28"
+ integrity sha512-QqdJ/yAK+IpPs2HU/h5v2pKEdANBagSsc6DRSjnwSyJsCoHlmyJKCaCJ7KhWGx+N4OHxh37hoA8fc2CuZbx0Fw==
dependencies:
+ flow-enums-runtime "^0.0.6"
lodash.throttle "^4.1.1"
- metro-resolver "0.80.9"
+ metro-resolver "0.80.12"
-metro-file-map@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.9.tgz#ed8783f6e35dfc005794344c2a9fcd6e914885aa"
- integrity sha512-sBUjVtQMHagItJH/wGU9sn3k2u0nrCl0CdR4SFMO1tksXLKbkigyQx4cbpcyPVOAmGTVuy3jyvBlELaGCAhplQ==
+metro-file-map@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-file-map/-/metro-file-map-0.80.12.tgz#b03240166a68aa16c5a168c26e190d9da547eefb"
+ integrity sha512-sYdemWSlk66bWzW2wp79kcPMzwuG32x1ZF3otI0QZTmrnTaaTiGyhE66P1z6KR4n2Eu5QXiABa6EWbAQv0r8bw==
dependencies:
anymatch "^3.0.3"
debug "^2.2.0"
fb-watchman "^2.0.0"
+ flow-enums-runtime "^0.0.6"
graceful-fs "^4.2.4"
invariant "^2.2.4"
jest-worker "^29.6.3"
@@ -7123,84 +6881,92 @@ metro-file-map@0.80.9:
optionalDependencies:
fsevents "^2.3.2"
-metro-minify-terser@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.9.tgz#2b7798cba2bd4bd69cc5ce05a45bf66291542f83"
- integrity sha512-FEeCeFbkvvPuhjixZ1FYrXtO0araTpV6UbcnGgDUpH7s7eR5FG/PiJz3TsuuPP/HwCK19cZtQydcA2QrCw446A==
+metro-minify-terser@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-minify-terser/-/metro-minify-terser-0.80.12.tgz#9951030e3bc52d7f3ac8664ce5862401c673e3c6"
+ integrity sha512-muWzUw3y5k+9083ZoX9VaJLWEV2Jcgi+Oan0Mmb/fBNMPqP9xVDuy4pOMn/HOiGndgfh/MK7s4bsjkyLJKMnXQ==
dependencies:
+ flow-enums-runtime "^0.0.6"
terser "^5.15.0"
-metro-resolver@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.9.tgz#bae9120a0553e0cb59da6429e83a7e97465cc1a8"
- integrity sha512-wAPIjkN59BQN6gocVsAvvpZ1+LQkkqUaswlT++cJafE/e54GoVkMNCmrR4BsgQHr9DknZ5Um/nKueeN7kaEz9w==
-
-metro-runtime@0.80.9, metro-runtime@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.9.tgz#665312bd4e4d38fea921b3153d6ab47846eb4f08"
- integrity sha512-8PTVIgrVcyU+X/rVCy/9yxNlvXsBCk5JwwkbAm/Dm+Abo6NBGtNjWF0M1Xo/NWCb4phamNWcD7cHdR91HhbJvg==
+metro-resolver@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.80.12.tgz#e3815914c21315b04db200032c3243a4cc22dfb6"
+ integrity sha512-PR24gYRZnYHM3xT9pg6BdbrGbM/Cu1TcyIFBVlAk7qDAuHkUNQ1nMzWumWs+kwSvtd9eZGzHoucGJpTUEeLZAw==
dependencies:
- "@babel/runtime" "^7.0.0"
+ flow-enums-runtime "^0.0.6"
-metro-source-map@0.80.9, metro-source-map@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.9.tgz#df8f673137548f37ab9f9dcfa771b354a452cfab"
- integrity sha512-RMn+XS4VTJIwMPOUSj61xlxgBvPeY4G6s5uIn6kt6HB6A/k9ekhr65UkkDD7WzHYs3a9o869qU8tvOZvqeQzgw==
+metro-runtime@0.80.12, metro-runtime@^0.80.3:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-runtime/-/metro-runtime-0.80.12.tgz#a68af3a2a013f5372d3b8cee234fdd467455550b"
+ integrity sha512-LIx7+92p5rpI0i6iB4S4GBvvLxStNt6fF0oPMaUd1Weku7jZdfkCZzmrtDD9CSQ6EPb0T9NUZoyXIxlBa3wOCw==
+ dependencies:
+ "@babel/runtime" "^7.25.0"
+ flow-enums-runtime "^0.0.6"
+
+metro-source-map@0.80.12, metro-source-map@^0.80.3:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.80.12.tgz#36a2768c880f8c459d6d758e2d0975e36479f49c"
+ integrity sha512-o+AXmE7hpvM8r8MKsx7TI21/eerYYy2DCDkWfoBkv+jNkl61khvDHlQn0cXZa6lrcNZiZkl9oHSMcwLLIrFmpw==
dependencies:
"@babel/traverse" "^7.20.0"
"@babel/types" "^7.20.0"
+ flow-enums-runtime "^0.0.6"
invariant "^2.2.4"
- metro-symbolicate "0.80.9"
+ metro-symbolicate "0.80.12"
nullthrows "^1.1.1"
- ob1 "0.80.9"
+ ob1 "0.80.12"
source-map "^0.5.6"
vlq "^1.0.0"
-metro-symbolicate@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.9.tgz#8d1d19d26ebb36b9d13dbd29814fdd71d6009db7"
- integrity sha512-Ykae12rdqSs98hg41RKEToojuIW85wNdmSe/eHUgMkzbvCFNVgcC0w3dKZEhSsqQOXapXRlLtHkaHLil0UD/EA==
+metro-symbolicate@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.80.12.tgz#3a6aa783c6e494e2879342d88d5379fab69d1ed2"
+ integrity sha512-/dIpNdHksXkGHZXARZpL7doUzHqSNxgQ8+kQGxwpJuHnDhGkENxB5PS2QBaTDdEcmyTMjS53CN1rl9n1gR6fmw==
dependencies:
+ flow-enums-runtime "^0.0.6"
invariant "^2.2.4"
- metro-source-map "0.80.9"
+ metro-source-map "0.80.12"
nullthrows "^1.1.1"
source-map "^0.5.6"
through2 "^2.0.1"
vlq "^1.0.0"
-metro-transform-plugins@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.9.tgz#473a2c0a9e48043210547abe61cdeedb77725422"
- integrity sha512-UlDk/uc8UdfLNJhPbF3tvwajyuuygBcyp+yBuS/q0z3QSuN/EbLllY3rK8OTD9n4h00qZ/qgxGv/lMFJkwP4vg==
+metro-transform-plugins@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-transform-plugins/-/metro-transform-plugins-0.80.12.tgz#4a3853630ad0f36cc2bffd53bae659ee171a389c"
+ integrity sha512-WQWp00AcZvXuQdbjQbx1LzFR31IInlkCDYJNRs6gtEtAyhwpMMlL2KcHmdY+wjDO9RPcliZ+Xl1riOuBecVlPA==
dependencies:
"@babel/core" "^7.20.0"
"@babel/generator" "^7.20.0"
"@babel/template" "^7.0.0"
"@babel/traverse" "^7.20.0"
+ flow-enums-runtime "^0.0.6"
nullthrows "^1.1.1"
-metro-transform-worker@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.9.tgz#f1d8ef4f77228bb7e1d20d3c06934166e8ee3b28"
- integrity sha512-c/IrzMUVnI0hSVVit4TXzt3A1GiUltGVlzCmLJWxNrBGHGrJhvgePj38+GXl1Xf4Fd4vx6qLUkKMQ3ux73bFLQ==
+metro-transform-worker@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro-transform-worker/-/metro-transform-worker-0.80.12.tgz#80be8a185b7deb93402b682f58a1dd6724317ad1"
+ integrity sha512-KAPFN1y3eVqEbKLx1I8WOarHPqDMUa8WelWxaJCNKO/yHCP26zELeqTJvhsQup+8uwB6EYi/sp0b6TGoh6lOEA==
dependencies:
"@babel/core" "^7.20.0"
"@babel/generator" "^7.20.0"
"@babel/parser" "^7.20.0"
"@babel/types" "^7.20.0"
- metro "0.80.9"
- metro-babel-transformer "0.80.9"
- metro-cache "0.80.9"
- metro-cache-key "0.80.9"
- metro-minify-terser "0.80.9"
- metro-source-map "0.80.9"
- metro-transform-plugins "0.80.9"
+ flow-enums-runtime "^0.0.6"
+ metro "0.80.12"
+ metro-babel-transformer "0.80.12"
+ metro-cache "0.80.12"
+ metro-cache-key "0.80.12"
+ metro-minify-terser "0.80.12"
+ metro-source-map "0.80.12"
+ metro-transform-plugins "0.80.12"
nullthrows "^1.1.1"
-metro@0.80.9, metro@^0.80.3:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.9.tgz#de3c2011df62036520d51d040d2dde0d015aecb6"
- integrity sha512-Bc57Xf3GO2Xe4UWQsBj/oW6YfLPABEu8jfDVDiNmJvoQW4CO34oDPuYKe4KlXzXhcuNsqOtSxpbjCRRVjhhREg==
+metro@0.80.12, metro@^0.80.3:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/metro/-/metro-0.80.12.tgz#29a61fb83581a71e50c4d8d5d8458270edfe34cc"
+ integrity sha512-1UsH5FzJd9quUsD1qY+zUG4JY3jo3YEMxbMYH9jT6NK3j4iORhlwTK8fYTfAUBhDKjgLfKjAh7aoazNE23oIRA==
dependencies:
"@babel/code-frame" "^7.0.0"
"@babel/core" "^7.20.0"
@@ -7216,49 +6982,53 @@ metro@0.80.9, metro@^0.80.3:
debug "^2.2.0"
denodeify "^1.2.1"
error-stack-parser "^2.0.6"
+ flow-enums-runtime "^0.0.6"
graceful-fs "^4.2.4"
- hermes-parser "0.20.1"
+ hermes-parser "0.23.1"
image-size "^1.0.2"
invariant "^2.2.4"
jest-worker "^29.6.3"
jsc-safe-url "^0.2.2"
lodash.throttle "^4.1.1"
- metro-babel-transformer "0.80.9"
- metro-cache "0.80.9"
- metro-cache-key "0.80.9"
- metro-config "0.80.9"
- metro-core "0.80.9"
- metro-file-map "0.80.9"
- metro-resolver "0.80.9"
- metro-runtime "0.80.9"
- metro-source-map "0.80.9"
- metro-symbolicate "0.80.9"
- metro-transform-plugins "0.80.9"
- metro-transform-worker "0.80.9"
+ metro-babel-transformer "0.80.12"
+ metro-cache "0.80.12"
+ metro-cache-key "0.80.12"
+ metro-config "0.80.12"
+ metro-core "0.80.12"
+ metro-file-map "0.80.12"
+ metro-resolver "0.80.12"
+ metro-runtime "0.80.12"
+ metro-source-map "0.80.12"
+ metro-symbolicate "0.80.12"
+ metro-transform-plugins "0.80.12"
+ metro-transform-worker "0.80.12"
mime-types "^2.1.27"
- node-fetch "^2.2.0"
nullthrows "^1.1.1"
- rimraf "^3.0.2"
serialize-error "^2.1.0"
source-map "^0.5.6"
strip-ansi "^6.0.0"
throat "^5.0.0"
- ws "^7.5.1"
+ ws "^7.5.10"
yargs "^17.6.2"
micromatch@^4.0.2, micromatch@^4.0.4:
- version "4.0.7"
- resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.7.tgz#33e8190d9fe474a9895525f5618eee136d46c2e5"
- integrity sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==
+ version "4.0.8"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+ integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
dependencies:
braces "^3.0.3"
picomatch "^2.3.1"
-mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
+mime-db@1.52.0:
version "1.52.0"
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+"mime-db@>= 1.43.0 < 2":
+ version "1.53.0"
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.53.0.tgz#3cb63cd820fc29896d9d4e8c32ab4fcd74ccb447"
+ integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg==
+
mime-types@^2.1.12, mime-types@^2.1.27, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
@@ -7286,7 +7056,7 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
-"minimatch@2 || 3", minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
+minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b"
integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
@@ -7358,7 +7128,7 @@ minizlib@^2.1.1:
minipass "^3.0.0"
yallist "^4.0.0"
-mkdirp@^0.5.1, mkdirp@~0.5.1:
+mkdirp@^0.5.1:
version "0.5.6"
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.6.tgz#7def03d2432dcae4ba1d611445c48396062255f6"
integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
@@ -7380,12 +7150,7 @@ ms@2.0.0:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
-ms@2.1.2:
- version "2.1.2"
- resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
- integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-
-ms@2.1.3, ms@^2.1.1:
+ms@2.1.3, ms@^2.1.1, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
@@ -7395,15 +7160,6 @@ mustache@^4.0.1:
resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64"
integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==
-mv@~2:
- version "2.1.1"
- resolved "https://registry.yarnpkg.com/mv/-/mv-2.1.1.tgz#ae6ce0d6f6d5e0a4f7d893798d03c1ea9559b6a2"
- integrity sha512-at/ZndSy3xEGJ8i0ygALh8ru9qy7gWW1cmkaqBN29JmMlIvM//MEO9y1sk/avxuwnPcfhkejkLsuPxH81BrkSg==
- dependencies:
- mkdirp "~0.5.1"
- ncp "~2.0.0"
- rimraf "~2.4.0"
-
mz@^2.7.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
@@ -7423,11 +7179,6 @@ natural-compare@^1.4.0:
resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
-ncp@~2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3"
- integrity sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==
-
negotiator@0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
@@ -7482,10 +7233,10 @@ node-int64@^0.4.0:
resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b"
integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==
-node-releases@^2.0.14:
- version "2.0.14"
- resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
- integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+node-releases@^2.0.18:
+ version "2.0.18"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.18.tgz#f010e8d35e2fe8d6b2944f03f70213ecedc4ca3f"
+ integrity sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==
node-stream-zip@^1.9.1:
version "1.15.0"
@@ -7526,10 +7277,12 @@ nullthrows@^1.1.1:
resolved "https://registry.yarnpkg.com/nullthrows/-/nullthrows-1.1.1.tgz#7818258843856ae971eae4208ad7d7eb19a431b1"
integrity sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==
-ob1@0.80.9:
- version "0.80.9"
- resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.9.tgz#4ae3edd807536097674ff943509089f5d4e0649f"
- integrity sha512-v9yOxowkZbxWhKOaaTyLjIm1aLy4ebMNcSn4NYJKOAI/Qv+SkfEfszpLr2GIxsccmb2Y2HA9qtsqiIJ80ucpVA==
+ob1@0.80.12:
+ version "0.80.12"
+ resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.80.12.tgz#0451944ba6e5be225cc9751d8cd0d7309d2d1537"
+ integrity sha512-VMArClVT6LkhUGpnuEoBuyjG9rzUyEzg4PDkav6wK1cLhOK02gPCYFxoiB4mqVnrMhDpIzJcrGNAMVi9P+hXrw==
+ dependencies:
+ flow-enums-runtime "^0.0.6"
object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
@@ -7575,15 +7328,6 @@ object.fromentries@^2.0.8:
es-abstract "^1.23.2"
es-object-atoms "^1.0.0"
-object.hasown@^1.1.4:
- version "1.1.4"
- resolved "https://registry.yarnpkg.com/object.hasown/-/object.hasown-1.1.4.tgz#e270ae377e4c120cdcb7656ce66884a6218283dc"
- integrity sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==
- dependencies:
- define-properties "^1.2.1"
- es-abstract "^1.23.2"
- es-object-atoms "^1.0.0"
-
object.values@^1.1.6, object.values@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.0.tgz#65405a9d92cee68ac2d303002e0b8470a4d9ab1b"
@@ -7786,9 +7530,9 @@ p-try@^2.0.0:
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
package-json-from-dist@^1.0.0:
- version "1.0.0"
- resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz#e501cd3094b278495eb4258d4c9f6d5ac3019f00"
- integrity sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
+ integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
parent-module@^1.0.0:
version "1.0.1"
@@ -7885,10 +7629,10 @@ path-type@^4.0.0:
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
-picocolors@^1.0.0, picocolors@^1.0.1:
- version "1.0.1"
- resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
- integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
+picocolors@^1.0.0, picocolors@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59"
+ integrity sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==
picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1:
version "2.3.1"
@@ -7961,13 +7705,13 @@ postcss-value-parser@^4.2.0:
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
postcss@~8.4.32:
- version "8.4.39"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.39.tgz#aa3c94998b61d3a9c259efa51db4b392e1bde0e3"
- integrity sha512-0vzE+lAiG7hZl1/9I8yzKLx3aR9Xbof3fBHKunvMfOCYAtMhrsnccJY2iTURb9EZd5+pLuiNV9/c/GZJOHsgIw==
+ version "8.4.47"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365"
+ integrity sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==
dependencies:
nanoid "^3.3.7"
- picocolors "^1.0.1"
- source-map-js "^1.2.0"
+ picocolors "^1.1.0"
+ source-map-js "^1.2.1"
prelude-ls@^1.2.1:
version "1.2.1"
@@ -8062,9 +7806,9 @@ prop-types@^15.8.1:
react-is "^16.13.1"
pump@^3.0.0:
- version "3.0.0"
- resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
- integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/pump/-/pump-3.0.2.tgz#836f3edd6bc2ee599256c924ffe0d88573ddcbf8"
+ integrity sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==
dependencies:
end-of-stream "^1.1.0"
once "^1.3.1"
@@ -8117,9 +7861,9 @@ rc@~1.2.7:
strip-json-comments "~2.0.1"
react-devtools-core@^5.0.0:
- version "5.3.1"
- resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.3.1.tgz#d57f5b8f74f16e622bd6a7bc270161e4ba162666"
- integrity sha512-7FSb9meX0btdBQLwdFOwt6bGqvRPabmVMMslv8fgoSPqXyuGpgQe36kx8gR86XPw7aV1yVouTp6fyZ0EH+NfUw==
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-5.3.2.tgz#d5df92f8ef2a587986d094ef2c47d84cf4ae46ec"
+ integrity sha512-crr9HkVrDiJ0A4zot89oS0Cgv0Oa4OG1Em4jit3P3ZxZSKPMYyMjfwMqgcJna9o625g8oN87rBm8SWWrSTBZxg==
dependencies:
shell-quote "^1.6.1"
ws "^7"
@@ -8161,25 +7905,25 @@ react-native-web@~0.19.10:
postcss-value-parser "^4.2.0"
styleq "^0.1.3"
-react-native-windows@0.74.1:
- version "0.74.1"
- resolved "https://registry.yarnpkg.com/react-native-windows/-/react-native-windows-0.74.1.tgz#86b01160413f5e8d6526349c8c224d8735a341a8"
- integrity sha512-/nvfCVqzmCdZ6BD0X4mU5oIB8xFkDliT7ll1jJq9ryqdD/wtxunx7vNqe7Fm+XKHBJdsyA9Wd9MamrOtHqXQng==
+react-native-windows@0.74.19:
+ version "0.74.19"
+ resolved "https://registry.yarnpkg.com/react-native-windows/-/react-native-windows-0.74.19.tgz#06dce7b5d0332eb2869b953ba9ac1e121e683996"
+ integrity sha512-9JmehsvlfkQSSKFhEcyIbQzTQWCF81KM836vScwEbyRYhkCC8BIShOl4wmYcMGDFZVDQ24aV/k8wbVQRXvseYw==
dependencies:
"@babel/runtime" "^7.0.0"
"@jest/create-cache-key-function" "^29.6.3"
- "@react-native-community/cli" "13.6.4"
- "@react-native-community/cli-platform-android" "13.6.4"
- "@react-native-community/cli-platform-ios" "13.6.4"
- "@react-native-windows/cli" "0.74.0"
+ "@react-native-community/cli" "13.6.9"
+ "@react-native-community/cli-platform-android" "13.6.9"
+ "@react-native-community/cli-platform-ios" "13.6.9"
+ "@react-native-windows/cli" "0.74.3"
"@react-native/assets" "1.0.0"
- "@react-native/assets-registry" "0.74.81"
- "@react-native/codegen" "0.74.81"
- "@react-native/community-cli-plugin" "0.74.81"
- "@react-native/gradle-plugin" "0.74.81"
- "@react-native/js-polyfills" "0.74.81"
- "@react-native/normalize-colors" "0.74.81"
- "@react-native/virtualized-lists" "0.74.81"
+ "@react-native/assets-registry" "0.74.87"
+ "@react-native/codegen" "0.74.87"
+ "@react-native/community-cli-plugin" "0.74.87"
+ "@react-native/gradle-plugin" "0.74.87"
+ "@react-native/js-polyfills" "0.74.87"
+ "@react-native/normalize-colors" "0.74.87"
+ "@react-native/virtualized-lists" "0.74.87"
abort-controller "^3.0.0"
anser "^1.4.9"
ansi-regex "^5.0.0"
@@ -8208,22 +7952,22 @@ react-native-windows@0.74.1:
ws "^6.2.2"
yargs "^17.6.2"
-react-native@0.74.3:
- version "0.74.3"
- resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.74.3.tgz#eef32cd10afb1f4b26f75b79eefd6b220c63953c"
- integrity sha512-UFutCC6WEw6HkxlcpQ2BemKqi0JkwrgDchYB5Svi8Sp4Xwt4HA6LGEjNQgZ+3KM44bjyFRpofQym0uh0jACGng==
+react-native@0.74.5:
+ version "0.74.5"
+ resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.74.5.tgz#80e556690fc2583d46714d5618ecd30d93c24e81"
+ integrity sha512-Bgg2WvxaGODukJMTZFTZBNMKVaROHLwSb8VAGEdrlvKwfb1hHg/3aXTUICYk7dwgAnb+INbGMwnF8yeAgIUmqw==
dependencies:
"@jest/create-cache-key-function" "^29.6.3"
"@react-native-community/cli" "13.6.9"
"@react-native-community/cli-platform-android" "13.6.9"
"@react-native-community/cli-platform-ios" "13.6.9"
- "@react-native/assets-registry" "0.74.85"
- "@react-native/codegen" "0.74.85"
- "@react-native/community-cli-plugin" "0.74.85"
- "@react-native/gradle-plugin" "0.74.85"
- "@react-native/js-polyfills" "0.74.85"
- "@react-native/normalize-colors" "0.74.85"
- "@react-native/virtualized-lists" "0.74.85"
+ "@react-native/assets-registry" "0.74.87"
+ "@react-native/codegen" "0.74.87"
+ "@react-native/community-cli-plugin" "0.74.87"
+ "@react-native/gradle-plugin" "0.74.87"
+ "@react-native/js-polyfills" "0.74.87"
+ "@react-native/normalize-colors" "0.74.87"
+ "@react-native/virtualized-lists" "0.74.87"
abort-controller "^3.0.0"
anser "^1.4.9"
ansi-regex "^5.0.0"
@@ -8328,10 +8072,10 @@ reflect.getprototypeof@^1.0.4:
globalthis "^1.0.3"
which-builtin-type "^1.1.3"
-regenerate-unicode-properties@^10.1.0:
- version "10.1.1"
- resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz#6b0e05489d9076b04c436f318d9b067bba459480"
- integrity sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==
+regenerate-unicode-properties@^10.2.0:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0"
+ integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==
dependencies:
regenerate "^1.4.2"
@@ -8358,33 +8102,38 @@ regenerator-transform@^0.15.2:
"@babel/runtime" "^7.8.4"
regexp.prototype.flags@^1.5.2:
- version "1.5.2"
- resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz#138f644a3350f981a858c44f6bb1a61ff59be334"
- integrity sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==
+ version "1.5.3"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz#b3ae40b1d2499b8350ab2c3fe6ef3845d3a96f42"
+ integrity sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==
dependencies:
- call-bind "^1.0.6"
+ call-bind "^1.0.7"
define-properties "^1.2.1"
es-errors "^1.3.0"
- set-function-name "^2.0.1"
+ set-function-name "^2.0.2"
-regexpu-core@^5.3.1:
- version "5.3.2"
- resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-5.3.2.tgz#11a2b06884f3527aec3e93dbbf4a3b958a95546b"
- integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==
+regexpu-core@^6.1.1:
+ version "6.1.1"
+ resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.1.1.tgz#b469b245594cb2d088ceebc6369dceb8c00becac"
+ integrity sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==
dependencies:
- "@babel/regjsgen" "^0.8.0"
regenerate "^1.4.2"
- regenerate-unicode-properties "^10.1.0"
- regjsparser "^0.9.1"
+ regenerate-unicode-properties "^10.2.0"
+ regjsgen "^0.8.0"
+ regjsparser "^0.11.0"
unicode-match-property-ecmascript "^2.0.0"
unicode-match-property-value-ecmascript "^2.1.0"
-regjsparser@^0.9.1:
- version "0.9.1"
- resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.9.1.tgz#272d05aa10c7c1f67095b1ff0addae8442fc5709"
- integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==
+regjsgen@^0.8.0:
+ version "0.8.0"
+ resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab"
+ integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==
+
+regjsparser@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.11.1.tgz#ae55c74f646db0c8fcb922d4da635e33da405149"
+ integrity sha512-1DHODs4B8p/mQHU9kr+jv8+wIC9mtG4eBHxWxIq5mhjE3D5oORhCc6deRKzTjs9DcfRFmj9BHSDguZklqCGFWQ==
dependencies:
- jsesc "~0.5.0"
+ jsesc "~3.0.2"
remove-trailing-slash@^0.1.0:
version "0.1.1"
@@ -8402,13 +8151,13 @@ require-from-string@^2.0.2:
integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
require-in-the-middle@^7.1.1:
- version "7.3.0"
- resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.3.0.tgz#ce64a1083647dc07b3273b348357efac8a9945c9"
- integrity sha512-nQFEv9gRw6SJAwWD2LrL0NmQvAcO7FBwJbwmr2ttPAacfy0xuiOjE5zt+zM4xDyuyvUaxBi/9gb2SoCyNEVJcw==
+ version "7.4.0"
+ resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.4.0.tgz#606977820d4b5f9be75e5a108ce34cfed25b3bb4"
+ integrity sha512-X34iHADNbNDfr6OTStIAHWSAvvKQRYgLO6duASaVf7J2VA3lvmNYboAHOuLC2huav1IwgZJtyEcJCKVzFxOSMQ==
dependencies:
- debug "^4.1.1"
+ debug "^4.3.5"
module-details-from-path "^1.0.3"
- resolve "^1.22.1"
+ resolve "^1.22.8"
require-main-filename@^2.0.0:
version "2.0.0"
@@ -8456,7 +8205,7 @@ resolve.exports@^2.0.0, resolve.exports@^2.0.2:
resolved "https://registry.yarnpkg.com/resolve.exports/-/resolve.exports-2.0.2.tgz#f8c934b8e6a13f539e38b7098e2e36134f01e800"
integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==
-resolve@^1.1.6, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2:
+resolve@^1.1.6, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2, resolve@^1.22.8:
version "1.22.8"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.8.tgz#b6c87a9f2aa06dfab52e3d70ac8cde321fa5a48d"
integrity sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==
@@ -8502,13 +8251,6 @@ 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:
- 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"
@@ -8516,13 +8258,6 @@ rimraf@^3.0.2:
dependencies:
glob "^7.1.3"
-rimraf@~2.4.0:
- version "2.4.5"
- resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.4.5.tgz#ee710ce5d93a8fdb856fb5ea8ff0e2d75934b2da"
- integrity sha512-J5xnxTyqaiw06JjMftq7L9ouA448dw/E7dKghkP9WpKNuwmARNNg+Gk8/u5ryb9N/Yo2+z3MCwuqFK/+qPOPfQ==
- dependencies:
- glob "^6.0.1"
-
rimraf@~2.6.2:
version "2.6.3"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab"
@@ -8557,11 +8292,6 @@ safe-buffer@~5.2.0:
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
-safe-json-stringify@~1:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz#356e44bc98f1f93ce45df14bcd7c01cda86e0afd"
- integrity sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==
-
safe-regex-test@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.0.3.tgz#a5b4c0f06e0ab50ea2c395c14d8371232924c377"
@@ -8608,12 +8338,31 @@ 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.3.2, 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.0:
- version "7.6.2"
- resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.2.tgz#1e3b34759f896e8f14d6134732ce798aeb0c6e13"
- integrity sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==
+semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0:
+ version "7.6.3"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.6.3.tgz#980f7b5550bc175fb4dc09403085627f9eb33143"
+ integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==
-send@0.18.0, send@^0.18.0:
+send@0.19.0:
+ version "0.19.0"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.19.0.tgz#bbc5a388c8ea6c048967049dbeac0e4a3f09d7f8"
+ integrity sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+send@^0.18.0:
version "0.18.0"
resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be"
integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
@@ -8638,14 +8387,14 @@ serialize-error@^2.1.0:
integrity sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==
serve-static@^1.13.1:
- version "1.15.0"
- resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540"
- integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+ version "1.16.2"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.2.tgz#b6a5343da47f6bdd2673848bf45754941e803296"
+ integrity sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==
dependencies:
- encodeurl "~1.0.2"
+ encodeurl "~2.0.0"
escape-html "~1.0.3"
parseurl "~1.3.3"
- send "0.18.0"
+ send "0.19.0"
set-blocking@^2.0.0:
version "2.0.0"
@@ -8792,10 +8541,10 @@ slugify@^1.3.4, slugify@^1.6.6:
resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b"
integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==
-source-map-js@^1.2.0:
- version "1.2.0"
- resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.0.tgz#16b809c162517b5b8c3e7dcd315a2a5c2612b2af"
- integrity sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==
+source-map-js@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
+ integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
source-map-support@0.5.13:
version "0.5.13"
@@ -8944,6 +8693,14 @@ string.prototype.matchall@^4.0.11:
set-function-name "^2.0.2"
side-channel "^1.0.6"
+string.prototype.repeat@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz#e90872ee0308b29435aa26275f6e1b762daee01a"
+ integrity sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==
+ dependencies:
+ define-properties "^1.1.3"
+ es-abstract "^1.17.5"
+
string.prototype.trim@^1.2.9:
version "1.2.9"
resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz#b6fa326d72d2c78b6df02f7759c73f8f6274faa4"
@@ -9179,9 +8936,9 @@ terminal-link@^2.1.1:
supports-hyperlinks "^2.0.0"
terser@^5.15.0:
- version "5.31.1"
- resolved "https://registry.yarnpkg.com/terser/-/terser-5.31.1.tgz#735de3c987dd671e95190e6b98cfe2f07f3cf0d4"
- integrity sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==
+ version "5.34.1"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.34.1.tgz#af40386bdbe54af0d063e0670afd55c3105abeb6"
+ integrity sha512-FsJZ7iZLd/BXkz+4xrRTGJ26o/6VTjQytUk8b8OxkwcD2I+79VPJlz7qss1+zE7h8GNIScFqXcDyJ/KqBYZFVA==
dependencies:
"@jridgewell/source-map" "^0.3.3"
acorn "^8.8.2"
@@ -9269,9 +9026,9 @@ tr46@~0.0.3:
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
traverse@~0.6.6:
- version "0.6.9"
- resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.9.tgz#76cfdbacf06382d460b76f8b735a44a6209d8b81"
- integrity sha512-7bBrcF+/LQzSgFmT0X5YclVqQxtv7TDJ1f8Wj7ibBu/U6BMLeOpUxuZjV7rMc44UtKxlnMFigdhFAIszSX1DMg==
+ version "0.6.10"
+ resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.10.tgz#4c93482381d794dee046882c036f3c4eee481324"
+ integrity sha512-hN4uFRxbK+PX56DxYiGHsTn2dME3TVr9vbNqlQGcGcPhJAn+tdP126iA+TArMpI4YSgnTkMWyoLl5bf81Hi5TA==
dependencies:
gopd "^1.0.1"
typedarray.prototype.slice "^1.0.3"
@@ -9297,10 +9054,10 @@ tslib@^1.8.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
-tslib@^2.0.1, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.4.0, tslib@^2.6.2:
- version "2.6.3"
- resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.3.tgz#0438f810ad7a9edcde7a241c3d80db693c8cbfe0"
- integrity sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==
+tslib@^2.0.1, tslib@^2.1.0, tslib@^2.2.0, tslib@^2.4.0, tslib@^2.6.2, tslib@^2.7.0:
+ version "2.7.0"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.7.0.tgz#d9b40c5c40ab59e8738f297df3087bf1a2690c01"
+ integrity sha512-gLXCKdN1/j47AiHiOkJN69hJmcbGTHI0ImLmbYLHykhgeN0jVGola9yVjFgzCUklsZQMW55o+dW7IXv3RCXDzA==
tsutils@^3.21.0:
version "3.21.0"
@@ -9408,9 +9165,9 @@ typescript@~5.3.3:
integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==
ua-parser-js@^1.0.35:
- version "1.0.38"
- resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.38.tgz#66bb0c4c0e322fe48edfe6d446df6042e62f25e2"
- integrity sha512-Aq5ppTOfvrCMgAPneW1HfWj66Xi7XL+/mIy996R1/CLS/rcyJQm6QZdsKrUeivDFQ+Oc9Wyuwor8Ze8peEoUoQ==
+ version "1.0.39"
+ resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-1.0.39.tgz#bfc07f361549bf249bd8f4589a4cccec18fd2018"
+ integrity sha512-k24RCVWlEcjkdOxYmVJgeD/0a1TiSpqLg+ZalVGV9lsnr4yqu0w7tX/x2xX6G4zpkgQnRf89lxuZ1wsbjXM8lw==
unbox-primitive@^1.0.2:
version "1.0.2"
@@ -9427,10 +9184,15 @@ undici-types@~5.26.4:
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+undici-types@~6.19.2:
+ version "6.19.8"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02"
+ integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==
+
unicode-canonical-property-names-ecmascript@^2.0.0:
- version "2.0.0"
- resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
- integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2"
+ integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==
unicode-match-property-ecmascript@^2.0.0:
version "2.0.0"
@@ -9441,9 +9203,9 @@ unicode-match-property-ecmascript@^2.0.0:
unicode-property-aliases-ecmascript "^2.0.0"
unicode-match-property-value-ecmascript@^2.1.0:
- version "2.1.0"
- resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz#cb5fffdcd16a05124f5a4b0bf7c3770208acbbe0"
- integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71"
+ integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==
unicode-property-aliases-ecmascript@^2.0.0:
version "2.1.0"
@@ -9498,13 +9260,13 @@ unpipe@~1.0.0:
resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
-update-browserslist-db@^1.0.16:
- version "1.1.0"
- resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz#7ca61c0d8650766090728046e416a8cde682859e"
- integrity sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==
+update-browserslist-db@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz#80846fba1d79e82547fb661f8d141e0945755fe5"
+ integrity sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==
dependencies:
- escalade "^3.1.2"
- picocolors "^1.0.1"
+ escalade "^3.2.0"
+ picocolors "^1.1.0"
uri-js@^4.2.2:
version "4.4.1"
@@ -9640,12 +9402,12 @@ which-boxed-primitive@^1.0.2:
is-symbol "^1.0.3"
which-builtin-type@^1.1.3:
- version "1.1.3"
- resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.3.tgz#b1b8443707cc58b6e9bf98d32110ff0c2cbd029b"
- integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.1.4.tgz#592796260602fc3514a1b5ee7fa29319b72380c3"
+ integrity sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==
dependencies:
- function.prototype.name "^1.1.5"
- has-tostringtag "^1.0.0"
+ function.prototype.name "^1.1.6"
+ has-tostringtag "^1.0.2"
is-async-function "^2.0.0"
is-date-object "^1.0.5"
is-finalizationregistry "^1.0.2"
@@ -9654,10 +9416,10 @@ which-builtin-type@^1.1.3:
is-weakref "^1.0.2"
isarray "^2.0.5"
which-boxed-primitive "^1.0.2"
- which-collection "^1.0.1"
- which-typed-array "^1.1.9"
+ which-collection "^1.0.2"
+ which-typed-array "^1.1.15"
-which-collection@^1.0.1:
+which-collection@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
@@ -9672,7 +9434,7 @@ which-module@^2.0.0:
resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409"
integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==
-which-typed-array@^1.1.14, which-typed-array@^1.1.15, which-typed-array@^1.1.9:
+which-typed-array@^1.1.14, which-typed-array@^1.1.15:
version "1.1.15"
resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.15.tgz#264859e9b11a649b388bfaaf4f767df1f779b38d"
integrity sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==
@@ -9777,7 +9539,7 @@ ws@^6.2.2:
dependencies:
async-limiter "~1.0.0"
-ws@^7, ws@^7.5.1:
+ws@^7, ws@^7.5.10:
version "7.5.10"
resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.10.tgz#58b5c20dc281633f6c19113f39b349bd8bd558d9"
integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==
@@ -9868,9 +9630,9 @@ yallist@^4.0.0:
integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
yaml@^2.2.1:
- version "2.4.5"
- resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.4.5.tgz#60630b206dd6d84df97003d33fc1ddf6296cca5e"
- integrity sha512-aBx2bnqDzVOyNKfsysjA2ms5ZlnjSAW2eG3/L5G/CSujfjLJTJsEw1bGw8kCf04KodQWk1pxlGnZ56CRxiawmg==
+ version "2.5.1"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.5.1.tgz#c9772aacf62cb7494a95b0c4f1fb065b563db130"
+ integrity sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==
yargs-parser@^18.1.2:
version "18.1.3"
diff --git a/examples/exampletvOS/ios/Podfile.lock b/examples/exampletvOS/ios/Podfile.lock
index 41c5f3da..e9a24dc5 100644
--- a/examples/exampletvOS/ios/Podfile.lock
+++ b/examples/exampletvOS/ios/Podfile.lock
@@ -316,11 +316,11 @@ PODS:
- React-jsinspector (0.71.12-0)
- React-logger (0.71.12-0):
- glog
- - react-native-video (6.0.0):
+ - react-native-video (6.6.2):
- RCT-Folly (= 2021.07.22.00)
- React-Core
- - react-native-video/Video (= 6.0.0)
- - react-native-video/Video (6.0.0):
+ - react-native-video/Video (= 6.6.2)
+ - react-native-video/Video (6.6.2):
- RCT-Folly (= 2021.07.22.00)
- React-Core
- React-perflogger (0.71.12-0)
@@ -592,7 +592,7 @@ SPEC CHECKSUMS:
React-jsiexecutor: 0c8c5e8b2171be52295f59097923babf84d1cf66
React-jsinspector: f8e6919523047a9bd1270ade75b4eca0108963b4
React-logger: 16c56636d4209cc204d06c5ba347cee21b960012
- react-native-video: fc60911540a69935cc7950829163f6f41259cb0d
+ react-native-video: 5d1e10262d6986e1ce911634a3b8d8f32f2dd97e
React-perflogger: 355109dc9d6f34e35bc35dabb32310f8ed2d29a2
React-RCTActionSheet: 9d1be4d43972f2aae4b31d9e53ffb030115fa445
React-RCTAnimation: aab7e1ecd325db67e1f2a947d85a52adf86594b7
@@ -609,6 +609,6 @@ SPEC CHECKSUMS:
Yoga: 8b8c06e142662150974d1c70b4c5ffb08eb468db
YogaKit: 1e22bf2228b3a5ac8cc88965153061ae92c494b5
-PODFILE CHECKSUM: 26d254806a611a4bc6b6c39cff790dd08f770ccf
+PODFILE CHECKSUM: e20830ba1d59fa52a9075c08861e37e5f2ac113c
COCOAPODS: 1.15.2
diff --git a/examples/react-native-video-plugin-sample/ios/VideoPluginSample.swift b/examples/react-native-video-plugin-sample/ios/VideoPluginSample.swift
index 87ade70d..082f307e 100644
--- a/examples/react-native-video-plugin-sample/ios/VideoPluginSample.swift
+++ b/examples/react-native-video-plugin-sample/ios/VideoPluginSample.swift
@@ -48,7 +48,7 @@ class VideoPluginSample: NSObject, RNVPlugin {
* custom functions to be able to track AVPlayer state change
*/
func handlePlaybackRateChange(player: AVPlayer, change: NSKeyValueObservedChange) {
- NSLog("plugin: handlePlaybackRateChange \(change.oldValue)")
+ NSLog("plugin: handlePlaybackRateChange \(String(describing: change.oldValue))")
}
func handlePlayerItemStatusChange(playerItem: AVPlayerItem, change _: NSKeyValueObservedChange) {
@@ -56,7 +56,7 @@ class VideoPluginSample: NSObject, RNVPlugin {
}
func handleCurrentItemChange(player: AVPlayer, change: NSKeyValueObservedChange) {
- NSLog("plugin: handleCurrentItemChange \(player.currentItem)")
+ NSLog("plugin: handleCurrentItemChange \(String(describing: player.currentItem))")
guard let playerItem = player.currentItem else {
_playerItemStatusObserver?.invalidate()
return
diff --git a/ios/Video/DataStructures/AdParams.swift b/ios/Video/DataStructures/AdParams.swift
new file mode 100644
index 00000000..be97fe0a
--- /dev/null
+++ b/ios/Video/DataStructures/AdParams.swift
@@ -0,0 +1,18 @@
+struct AdParams {
+ let adTagUrl: String?
+ let adLanguage: String?
+
+ let json: NSDictionary?
+
+ init(_ json: NSDictionary!) {
+ guard json != nil else {
+ self.json = nil
+ adTagUrl = nil
+ adLanguage = nil
+ return
+ }
+ self.json = json
+ adTagUrl = json["adTagUrl"] as? String
+ adLanguage = json["adLanguage"] as? String
+ }
+}
diff --git a/ios/Video/DataStructures/DRMParams.swift b/ios/Video/DataStructures/DRMParams.swift
index ce91d4dc..bf8a4d2a 100644
--- a/ios/Video/DataStructures/DRMParams.swift
+++ b/ios/Video/DataStructures/DRMParams.swift
@@ -5,6 +5,7 @@ struct DRMParams {
let contentId: String?
let certificateUrl: String?
let base64Certificate: Bool?
+ let localSourceEncryptionKeyScheme: String?
let json: NSDictionary?
@@ -17,6 +18,7 @@ struct DRMParams {
self.certificateUrl = nil
self.base64Certificate = nil
self.headers = nil
+ self.localSourceEncryptionKeyScheme = nil
return
}
self.json = json
@@ -36,5 +38,6 @@ struct DRMParams {
} else {
self.headers = nil
}
+ localSourceEncryptionKeyScheme = json["localSourceEncryptionKeyScheme"] as? String
}
}
diff --git a/ios/Video/DataStructures/SelectedTrackCriteria.swift b/ios/Video/DataStructures/SelectedTrackCriteria.swift
index b4217817..2c0ddef7 100644
--- a/ios/Video/DataStructures/SelectedTrackCriteria.swift
+++ b/ios/Video/DataStructures/SelectedTrackCriteria.swift
@@ -15,4 +15,8 @@ struct SelectedTrackCriteria {
self.type = json["type"] as? String ?? ""
self.value = json["value"] as? String
}
+
+ static func none() -> SelectedTrackCriteria {
+ return SelectedTrackCriteria(["type": "none", "value": ""])
+ }
}
diff --git a/ios/Video/DataStructures/VideoSource.swift b/ios/Video/DataStructures/VideoSource.swift
index b23d8ede..1f367149 100644
--- a/ios/Video/DataStructures/VideoSource.swift
+++ b/ios/Video/DataStructures/VideoSource.swift
@@ -10,7 +10,9 @@ struct VideoSource {
let cropEnd: Int64?
let customMetadata: CustomMetadata?
/* DRM */
- let drm: DRMParams?
+ let drm: DRMParams
+ var textTracks: [TextTrack] = []
+ let adParams: AdParams
let json: NSDictionary?
@@ -27,7 +29,8 @@ struct VideoSource {
self.cropStart = nil
self.cropEnd = nil
self.customMetadata = nil
- self.drm = nil
+ self.drm = DRMParams(nil)
+ adParams = AdParams(nil)
return
}
self.json = json
@@ -52,5 +55,9 @@ struct VideoSource {
self.cropEnd = (json["cropEnd"] as? Float64).flatMap { Int64(round($0)) }
self.customMetadata = CustomMetadata(json["metadata"] as? NSDictionary)
self.drm = DRMParams(json["drm"] as? NSDictionary)
+ self.textTracks = (json["textTracks"] as? NSArray)?.map { trackDict in
+ return TextTrack(trackDict as? NSDictionary)
+ } ?? []
+ adParams = AdParams(json["ad"] as? NSDictionary)
}
}
diff --git a/ios/Video/Features/DRMManager+AVContentKeySessionDelegate.swift b/ios/Video/Features/DRMManager+AVContentKeySessionDelegate.swift
new file mode 100644
index 00000000..f8d31fd0
--- /dev/null
+++ b/ios/Video/Features/DRMManager+AVContentKeySessionDelegate.swift
@@ -0,0 +1,41 @@
+//
+// DRMManager+AVContentKeySessionDelegate.swift
+// react-native-video
+//
+// Created by Krzysztof Moch on 14/08/2024.
+//
+
+import AVFoundation
+
+extension DRMManager: AVContentKeySessionDelegate {
+ func contentKeySession(_: AVContentKeySession, didProvide keyRequest: AVContentKeyRequest) {
+ handleContentKeyRequest(keyRequest: keyRequest)
+ }
+
+ func contentKeySession(_: AVContentKeySession, didProvideRenewingContentKeyRequest keyRequest: AVContentKeyRequest) {
+ handleContentKeyRequest(keyRequest: keyRequest)
+ }
+
+ func contentKeySession(_: AVContentKeySession, shouldRetry _: AVContentKeyRequest, reason retryReason: AVContentKeyRequest.RetryReason) -> Bool {
+ let retryReasons: [AVContentKeyRequest.RetryReason] = [
+ .timedOut,
+ .receivedResponseWithExpiredLease,
+ .receivedObsoleteContentKey,
+ ]
+ return retryReasons.contains(retryReason)
+ }
+
+ func contentKeySession(_: AVContentKeySession, didProvide keyRequest: AVPersistableContentKeyRequest) {
+ Task {
+ do {
+ try await handlePersistableKeyRequest(keyRequest: keyRequest)
+ } catch {
+ handleError(error, for: keyRequest)
+ }
+ }
+ }
+
+ func contentKeySession(_: AVContentKeySession, contentKeyRequest _: AVContentKeyRequest, didFailWithError error: Error) {
+ DebugLog(String(describing: error))
+ }
+}
diff --git a/ios/Video/Features/DRMManager+OnGetLicense.swift b/ios/Video/Features/DRMManager+OnGetLicense.swift
new file mode 100644
index 00000000..90b1c38c
--- /dev/null
+++ b/ios/Video/Features/DRMManager+OnGetLicense.swift
@@ -0,0 +1,68 @@
+//
+// DRMManager+OnGetLicense.swift
+// react-native-video
+//
+// Created by Krzysztof Moch on 14/08/2024.
+//
+
+import AVFoundation
+
+extension DRMManager {
+ func requestLicenseFromJS(spcData: Data, assetId: String, keyRequest: AVContentKeyRequest) async throws {
+ guard let onGetLicense else {
+ throw RCTVideoError.noDataFromLicenseRequest
+ }
+
+ guard let licenseServerUrl = drmParams?.licenseServer, !licenseServerUrl.isEmpty else {
+ throw RCTVideoError.noLicenseServerURL
+ }
+
+ guard let loadedLicenseUrl = keyRequest.identifier as? String else {
+ throw RCTVideoError.invalidContentId
+ }
+
+ pendingLicenses[loadedLicenseUrl] = keyRequest
+
+ DispatchQueue.main.async { [weak self] in
+ onGetLicense([
+ "licenseUrl": licenseServerUrl,
+ "loadedLicenseUrl": loadedLicenseUrl,
+ "contentId": assetId,
+ "spcBase64": spcData.base64EncodedString(),
+ "target": self?.reactTag as Any,
+ ])
+ }
+ }
+
+ func setJSLicenseResult(license: String, licenseUrl: String) {
+ guard let keyContentRequest = pendingLicenses[licenseUrl] else {
+ setJSLicenseError(error: "Loading request for licenseUrl \(licenseUrl) not found", licenseUrl: licenseUrl)
+ return
+ }
+
+ guard let responseData = Data(base64Encoded: license) else {
+ setJSLicenseError(error: "Invalid license data", licenseUrl: licenseUrl)
+ return
+ }
+
+ do {
+ try finishProcessingContentKeyRequest(keyRequest: keyContentRequest, license: responseData)
+ pendingLicenses.removeValue(forKey: licenseUrl)
+ } catch {
+ handleError(error, for: keyContentRequest)
+ }
+ }
+
+ func setJSLicenseError(error: String, licenseUrl: String) {
+ let rctError = RCTVideoError.fromJSPart(error)
+
+ DispatchQueue.main.async { [weak self] in
+ self?.onVideoError?([
+ "error": RCTVideoErrorHandler.createError(from: rctError),
+ "target": self?.reactTag as Any,
+ ])
+ }
+
+ pendingLicenses.removeValue(forKey: licenseUrl)
+ }
+}
diff --git a/ios/Video/Features/DRMManager+Persitable.swift b/ios/Video/Features/DRMManager+Persitable.swift
new file mode 100644
index 00000000..022743d8
--- /dev/null
+++ b/ios/Video/Features/DRMManager+Persitable.swift
@@ -0,0 +1,34 @@
+//
+// DRMManager+Persitable.swift
+// react-native-video
+//
+// Created by Krzysztof Moch on 19/08/2024.
+//
+
+import AVFoundation
+
+extension DRMManager {
+ func handlePersistableKeyRequest(keyRequest: AVPersistableContentKeyRequest) async throws {
+ if let localSourceEncryptionKeyScheme = drmParams?.localSourceEncryptionKeyScheme {
+ try handleEmbeddedKey(keyRequest: keyRequest, scheme: localSourceEncryptionKeyScheme)
+ } else {
+ // Offline DRM is not supported yet - if you need it please check out the following issue:
+ // https://github.com/TheWidlarzGroup/react-native-video/issues/3539
+ throw RCTVideoError.offlineDRMNotSupported
+ }
+ }
+
+ private func handleEmbeddedKey(keyRequest: AVPersistableContentKeyRequest, scheme: String) throws {
+ guard let uri = keyRequest.identifier as? String,
+ let url = URL(string: uri) else {
+ throw RCTVideoError.invalidContentId
+ }
+
+ guard let persistentKeyData = RCTVideoUtils.extractDataFromCustomSchemeUrl(from: url, scheme: scheme) else {
+ throw RCTVideoError.embeddedKeyExtractionFailed
+ }
+
+ let persistentKey = try keyRequest.persistableContentKey(fromKeyVendorResponse: persistentKeyData)
+ try finishProcessingContentKeyRequest(keyRequest: keyRequest, license: persistentKey)
+ }
+}
diff --git a/ios/Video/Features/DRMManager.swift b/ios/Video/Features/DRMManager.swift
new file mode 100644
index 00000000..0b3facd3
--- /dev/null
+++ b/ios/Video/Features/DRMManager.swift
@@ -0,0 +1,213 @@
+//
+// DRMManager.swift
+// react-native-video
+//
+// Created by Krzysztof Moch on 13/08/2024.
+//
+
+import AVFoundation
+
+class DRMManager: NSObject {
+ static let queue = DispatchQueue(label: "RNVideoContentKeyDelegateQueue")
+ let contentKeySession: AVContentKeySession?
+
+ var drmParams: DRMParams?
+ var reactTag: NSNumber?
+ var onVideoError: RCTDirectEventBlock?
+ var onGetLicense: RCTDirectEventBlock?
+
+ // Licenses handled by onGetLicense (from JS side)
+ var pendingLicenses: [String: AVContentKeyRequest] = [:]
+
+ override init() {
+ #if targetEnvironment(simulator)
+ contentKeySession = nil
+ super.init()
+ #else
+ contentKeySession = AVContentKeySession(keySystem: .fairPlayStreaming)
+ super.init()
+
+ contentKeySession?.setDelegate(self, queue: DRMManager.queue)
+ #endif
+ }
+
+ func createContentKeyRequest(
+ asset: AVContentKeyRecipient,
+ drmParams: DRMParams?,
+ reactTag: NSNumber?,
+ onVideoError: RCTDirectEventBlock?,
+ onGetLicense: RCTDirectEventBlock?
+ ) {
+ self.reactTag = reactTag
+ self.onVideoError = onVideoError
+ self.onGetLicense = onGetLicense
+ self.drmParams = drmParams
+
+ if drmParams?.type != "fairplay" {
+ self.onVideoError?([
+ "error": RCTVideoErrorHandler.createError(from: RCTVideoError.unsupportedDRMType),
+ "target": self.reactTag as Any,
+ ])
+ return
+ }
+
+ #if targetEnvironment(simulator)
+ DebugLog("Simulator is not supported for FairPlay DRM.")
+ self.onVideoError?([
+ "error": RCTVideoErrorHandler.createError(from: RCTVideoError.simulatorDRMNotSupported),
+ "target": self.reactTag as Any,
+ ])
+ #endif
+
+ contentKeySession?.addContentKeyRecipient(asset)
+ }
+
+ // MARK: - Internal
+
+ func handleContentKeyRequest(keyRequest: AVContentKeyRequest) {
+ Task {
+ do {
+ if drmParams?.localSourceEncryptionKeyScheme != nil {
+ #if os(iOS)
+ try keyRequest.respondByRequestingPersistableContentKeyRequestAndReturnError()
+ return
+ #else
+ throw RCTVideoError.offlineDRMNotSupported
+ #endif
+ }
+
+ try await processContentKeyRequest(keyRequest: keyRequest)
+ } catch {
+ handleError(error, for: keyRequest)
+ }
+ }
+ }
+
+ func finishProcessingContentKeyRequest(keyRequest: AVContentKeyRequest, license: Data) throws {
+ let keyResponse = AVContentKeyResponse(fairPlayStreamingKeyResponseData: license)
+ keyRequest.processContentKeyResponse(keyResponse)
+ }
+
+ func handleError(_ error: Error, for keyRequest: AVContentKeyRequest) {
+ let rctError: RCTVideoError
+ if let videoError = error as? RCTVideoError {
+ // handle RCTVideoError errors
+ rctError = videoError
+
+ DispatchQueue.main.async { [weak self] in
+ self?.onVideoError?([
+ "error": RCTVideoErrorHandler.createError(from: rctError),
+ "target": self?.reactTag as Any,
+ ])
+ }
+ } else {
+ let err = error as NSError
+
+ // handle Other errors
+ DispatchQueue.main.async { [weak self] in
+ self?.onVideoError?([
+ "error": [
+ "code": err.code,
+ "localizedDescription": err.localizedDescription,
+ "localizedFailureReason": err.localizedFailureReason ?? "",
+ "localizedRecoverySuggestion": err.localizedRecoverySuggestion ?? "",
+ "domain": err.domain,
+ ],
+ "target": self?.reactTag as Any,
+ ])
+ }
+ }
+
+ keyRequest.processContentKeyResponseError(error)
+ contentKeySession?.expire()
+ }
+
+ // MARK: - Private
+
+ private func processContentKeyRequest(keyRequest: AVContentKeyRequest) async throws {
+ guard let assetId = getAssetId(keyRequest: keyRequest),
+ let assetIdData = assetId.data(using: .utf8) else {
+ throw RCTVideoError.invalidContentId
+ }
+
+ let appCertificate = try await requestApplicationCertificate()
+ let spcData = try await keyRequest.makeStreamingContentKeyRequestData(forApp: appCertificate, contentIdentifier: assetIdData)
+
+ if onGetLicense != nil {
+ try await requestLicenseFromJS(spcData: spcData, assetId: assetId, keyRequest: keyRequest)
+ } else {
+ let license = try await requestLicense(spcData: spcData)
+ try finishProcessingContentKeyRequest(keyRequest: keyRequest, license: license)
+ }
+ }
+
+ private func requestApplicationCertificate() async throws -> Data {
+ guard let urlString = drmParams?.certificateUrl,
+ let url = URL(string: urlString) else {
+ throw RCTVideoError.noCertificateURL
+ }
+
+ let (data, response) = try await URLSession.shared.data(from: url)
+
+ guard let httpResponse = response as? HTTPURLResponse,
+ httpResponse.statusCode == 200 else {
+ throw RCTVideoError.noCertificateData
+ }
+
+ if drmParams?.base64Certificate == true {
+ guard let certData = Data(base64Encoded: data) else {
+ throw RCTVideoError.noCertificateData
+ }
+ return certData
+ }
+
+ return data
+ }
+
+ private func requestLicense(spcData: Data) async throws -> Data {
+ guard let licenseServerUrlString = drmParams?.licenseServer,
+ let licenseServerUrl = URL(string: licenseServerUrlString) else {
+ throw RCTVideoError.noLicenseServerURL
+ }
+
+ var request = URLRequest(url: licenseServerUrl)
+ request.httpMethod = "POST"
+ request.httpBody = spcData
+
+ if let headers = drmParams?.headers {
+ for (key, value) in headers {
+ if let stringValue = value as? String {
+ request.setValue(stringValue, forHTTPHeaderField: key)
+ }
+ }
+ }
+
+ let (data, response) = try await URLSession.shared.data(for: request)
+
+ guard let httpResponse = response as? HTTPURLResponse else {
+ throw RCTVideoError.licenseRequestFailed(0)
+ }
+
+ guard httpResponse.statusCode == 200 else {
+ throw RCTVideoError.licenseRequestFailed(httpResponse.statusCode)
+ }
+
+ guard !data.isEmpty else {
+ throw RCTVideoError.noDataFromLicenseRequest
+ }
+
+ return data
+ }
+
+ private func getAssetId(keyRequest: AVContentKeyRequest) -> String? {
+ if let assetId = drmParams?.contentId {
+ return assetId
+ }
+
+ if let url = keyRequest.identifier as? String {
+ return url.replacingOccurrences(of: "skd://", with: "")
+ }
+
+ return nil
+ }
+}
diff --git a/ios/Video/Features/RCTIMAAdsManager.swift b/ios/Video/Features/RCTIMAAdsManager.swift
index 26c6213e..a6548f3f 100644
--- a/ios/Video/Features/RCTIMAAdsManager.swift
+++ b/ios/Video/Features/RCTIMAAdsManager.swift
@@ -19,7 +19,12 @@
}
func setUpAdsLoader() {
- adsLoader = IMAAdsLoader(settings: nil)
+ guard let _video else { return }
+ let settings = IMASettings()
+ if let adLanguage = _video.getAdLanguage() {
+ settings.language = adLanguage
+ }
+ adsLoader = IMAAdsLoader(settings: settings)
adsLoader.delegate = self
}
diff --git a/ios/Video/Features/RCTPlayerObserver.swift b/ios/Video/Features/RCTPlayerObserver.swift
index 4f88b23d..6f73cfb9 100644
--- a/ios/Video/Features/RCTPlayerObserver.swift
+++ b/ios/Video/Features/RCTPlayerObserver.swift
@@ -234,10 +234,9 @@ class RCTPlayerObserver: NSObject, AVPlayerItemMetadataOutputPushDelegate, AVPla
/* Cancels the previously registered time observer. */
func removePlayerTimeObserver() {
- if _timeObserver != nil {
- player?.removeTimeObserver(_timeObserver)
- _timeObserver = nil
- }
+ guard let timeObserver = _timeObserver else { return }
+ player?.removeTimeObserver(timeObserver)
+ _timeObserver = nil
}
func addTimeObserverIfNotSet() {
@@ -284,11 +283,11 @@ class RCTPlayerObserver: NSObject, AVPlayerItemMetadataOutputPushDelegate, AVPla
name: NSNotification.Name.AVPlayerItemFailedToPlayToEndTime,
object: nil)
- NotificationCenter.default.removeObserver(_handlers, name: NSNotification.Name.AVPlayerItemNewAccessLogEntry, object: player?.currentItem)
+ NotificationCenter.default.removeObserver(_handlers, name: AVPlayerItem.newAccessLogEntryNotification, object: player?.currentItem)
NotificationCenter.default.addObserver(_handlers,
selector: #selector(RCTPlayerObserverHandlerObjc.handleAVPlayerAccess(notification:)),
- name: NSNotification.Name.AVPlayerItemNewAccessLogEntry,
+ name: AVPlayerItem.newAccessLogEntryNotification,
object: player?.currentItem)
}
diff --git a/ios/Video/Features/RCTPlayerOperations.swift b/ios/Video/Features/RCTPlayerOperations.swift
index 9c80c85f..d1ca88a9 100644
--- a/ios/Video/Features/RCTPlayerOperations.swift
+++ b/ios/Video/Features/RCTPlayerOperations.swift
@@ -15,11 +15,15 @@ enum RCTPlayerOperations {
let trackCount: Int! = player?.currentItem?.tracks.count ?? 0
// The first few tracks will be audio & video track
- var firstTextIndex = 0
+ var firstTextIndex = -1
for i in 0 ..< trackCount where player?.currentItem?.tracks[i].assetTrack?.hasMediaCharacteristic(.legible) ?? false {
firstTextIndex = i
break
}
+ if firstTextIndex == -1 {
+ // no sideLoaded text track available (can happen with invalid vtt url)
+ return
+ }
var selectedTrackIndex: Int = RCTVideoUnset
diff --git a/ios/Video/Features/RCTResourceLoaderDelegate.swift b/ios/Video/Features/RCTResourceLoaderDelegate.swift
deleted file mode 100644
index 3f3eab27..00000000
--- a/ios/Video/Features/RCTResourceLoaderDelegate.swift
+++ /dev/null
@@ -1,186 +0,0 @@
-import AVFoundation
-
-class RCTResourceLoaderDelegate: NSObject, AVAssetResourceLoaderDelegate, URLSessionDelegate {
- private var _loadingRequests: [String: AVAssetResourceLoadingRequest?] = [:]
- private var _requestingCertificate = false
- private var _requestingCertificateErrored = false
- private var _drm: DRMParams?
- private var _localSourceEncryptionKeyScheme: String?
- private var _reactTag: NSNumber?
- private var _onVideoError: RCTDirectEventBlock?
- private var _onGetLicense: RCTDirectEventBlock?
-
- init(
- asset: AVURLAsset,
- drm: DRMParams?,
- localSourceEncryptionKeyScheme: String?,
- onVideoError: RCTDirectEventBlock?,
- onGetLicense: RCTDirectEventBlock?,
- reactTag: NSNumber
- ) {
- super.init()
- let queue = DispatchQueue(label: "assetQueue")
- asset.resourceLoader.setDelegate(self, queue: queue)
- _reactTag = reactTag
- _onVideoError = onVideoError
- _onGetLicense = onGetLicense
- _drm = drm
- _localSourceEncryptionKeyScheme = localSourceEncryptionKeyScheme
- }
-
- deinit {
- for request in _loadingRequests.values {
- request?.finishLoading()
- }
- }
-
- func resourceLoader(_: AVAssetResourceLoader, shouldWaitForRenewalOfRequestedResource renewalRequest: AVAssetResourceRenewalRequest) -> Bool {
- return loadingRequestHandling(renewalRequest)
- }
-
- func resourceLoader(_: AVAssetResourceLoader, shouldWaitForLoadingOfRequestedResource loadingRequest: AVAssetResourceLoadingRequest) -> Bool {
- return loadingRequestHandling(loadingRequest)
- }
-
- func resourceLoader(_: AVAssetResourceLoader, didCancel _: AVAssetResourceLoadingRequest) {
- RCTLog("didCancelLoadingRequest")
- }
-
- func setLicenseResult(_ license: String!, _ licenseUrl: String!) {
- // Check if the loading request exists in _loadingRequests based on licenseUrl
- guard let loadingRequest = _loadingRequests[licenseUrl] else {
- setLicenseResultError("Loading request for licenseUrl \(licenseUrl) not found", licenseUrl)
- return
- }
-
- // Check if the license data is valid
- guard let respondData = RCTVideoUtils.base64DataFromBase64String(base64String: license) else {
- setLicenseResultError("No data from JS license response", licenseUrl)
- return
- }
-
- let dataRequest: AVAssetResourceLoadingDataRequest! = loadingRequest?.dataRequest
- dataRequest.respond(with: respondData)
- loadingRequest!.finishLoading()
- _loadingRequests.removeValue(forKey: licenseUrl)
- }
-
- func setLicenseResultError(_ error: String!, _ licenseUrl: String!) {
- // Check if the loading request exists in _loadingRequests based on licenseUrl
- guard let loadingRequest = _loadingRequests[licenseUrl] else {
- print("Loading request for licenseUrl \(licenseUrl) not found. Error: \(error)")
- return
- }
-
- self.finishLoadingWithError(error: RCTVideoErrorHandler.fromJSPart(error), licenseUrl: licenseUrl)
- }
-
- func finishLoadingWithError(error: Error!, licenseUrl: String!) -> Bool {
- // Check if the loading request exists in _loadingRequests based on licenseUrl
- guard let loadingRequest = _loadingRequests[licenseUrl], let error = error as NSError? else {
- // Handle the case where the loading request is not found or error is nil
- return false
- }
-
- loadingRequest!.finishLoading(with: error)
- _loadingRequests.removeValue(forKey: licenseUrl)
- _onVideoError?([
- "error": [
- "code": NSNumber(value: error.code),
- "localizedDescription": error.localizedDescription ?? "",
- "localizedFailureReason": error.localizedFailureReason ?? "",
- "localizedRecoverySuggestion": error.localizedRecoverySuggestion ?? "",
- "domain": error.domain,
- ],
- "target": _reactTag,
- ])
-
- return false
- }
-
- func loadingRequestHandling(_ loadingRequest: AVAssetResourceLoadingRequest!) -> Bool {
- if handleEmbeddedKey(loadingRequest) {
- return true
- }
-
- if _drm != nil {
- return handleDrm(loadingRequest)
- }
-
- return false
- }
-
- func handleEmbeddedKey(_ loadingRequest: AVAssetResourceLoadingRequest!) -> Bool {
- guard let url = loadingRequest.request.url,
- let _localSourceEncryptionKeyScheme,
- let persistentKeyData = RCTVideoUtils.extractDataFromCustomSchemeUrl(from: url, scheme: _localSourceEncryptionKeyScheme)
- else {
- return false
- }
-
- loadingRequest.contentInformationRequest?.contentType = AVStreamingKeyDeliveryPersistentContentKeyType
- loadingRequest.contentInformationRequest?.isByteRangeAccessSupported = true
- loadingRequest.contentInformationRequest?.contentLength = Int64(persistentKeyData.count)
- loadingRequest.dataRequest?.respond(with: persistentKeyData)
- loadingRequest.finishLoading()
-
- return true
- }
-
- func handleDrm(_ loadingRequest: AVAssetResourceLoadingRequest!) -> Bool {
- if _requestingCertificate {
- return true
- } else if _requestingCertificateErrored {
- return false
- }
-
- let requestKey: String = loadingRequest.request.url?.absoluteString ?? ""
-
- _loadingRequests[requestKey] = loadingRequest
-
- guard let _drm, let drmType = _drm.type, drmType == "fairplay" else {
- return finishLoadingWithError(error: RCTVideoErrorHandler.noDRMData, licenseUrl: requestKey)
- }
-
- Task {
- do {
- if _onGetLicense != nil {
- let contentId = _drm.contentId ?? loadingRequest.request.url?.host
- let spcData = try await RCTVideoDRM.handleWithOnGetLicense(
- loadingRequest: loadingRequest,
- contentId: contentId,
- certificateUrl: _drm.certificateUrl,
- base64Certificate: _drm.base64Certificate
- )
-
- self._requestingCertificate = true
- self._onGetLicense?(["licenseUrl": self._drm?.licenseServer ?? "",
- "loadedLicenseUrl": loadingRequest.request.url?.absoluteString ?? "",
- "contentId": contentId ?? "",
- "spcBase64": spcData.base64EncodedString(options: []),
- "target": self._reactTag])
- } else {
- let data = try await RCTVideoDRM.handleInternalGetLicense(
- loadingRequest: loadingRequest,
- contentId: _drm.contentId,
- licenseServer: _drm.licenseServer,
- certificateUrl: _drm.certificateUrl,
- base64Certificate: _drm.base64Certificate,
- headers: _drm.headers
- )
-
- guard let dataRequest = loadingRequest.dataRequest else {
- throw RCTVideoErrorHandler.noCertificateData
- }
- dataRequest.respond(with: data)
- loadingRequest.finishLoading()
- }
- } catch {
- self.finishLoadingWithError(error: error, licenseUrl: requestKey)
- self._requestingCertificateErrored = true
- }
- }
-
- return true
- }
-}
diff --git a/ios/Video/Features/RCTVideoDRM.swift b/ios/Video/Features/RCTVideoDRM.swift
deleted file mode 100644
index bc73d48d..00000000
--- a/ios/Video/Features/RCTVideoDRM.swift
+++ /dev/null
@@ -1,161 +0,0 @@
-import AVFoundation
-
-enum RCTVideoDRM {
- static func fetchLicense(
- licenseServer: String,
- spcData: Data?,
- contentId: String,
- headers: [String: Any]?
- ) async throws -> Data {
- let request = createLicenseRequest(licenseServer: licenseServer, spcData: spcData, contentId: contentId, headers: headers)
-
- let (data, response) = try await URLSession.shared.data(from: request)
-
- guard let httpResponse = response as? HTTPURLResponse else {
- throw RCTVideoErrorHandler.noDataFromLicenseRequest
- }
-
- if httpResponse.statusCode != 200 {
- print("Error getting license from \(licenseServer), HTTP status code \(httpResponse.statusCode)")
- throw RCTVideoErrorHandler.licenseRequestNotOk(httpResponse.statusCode)
- }
-
- guard let decodedData = Data(base64Encoded: data, options: []) else {
- throw RCTVideoErrorHandler.noDataFromLicenseRequest
- }
-
- return decodedData
- }
-
- static func createLicenseRequest(
- licenseServer: String,
- spcData: Data?,
- contentId: String,
- headers: [String: Any]?
- ) -> URLRequest {
- var request = URLRequest(url: URL(string: licenseServer)!)
- request.httpMethod = "POST"
-
- if let headers {
- for item in headers {
- guard let key = item.key as? String, let value = item.value as? String else {
- continue
- }
- request.setValue(value, forHTTPHeaderField: key)
- }
- }
-
- let spcEncoded = spcData?.base64EncodedString(options: [])
- let spcUrlEncoded = CFURLCreateStringByAddingPercentEscapes(
- kCFAllocatorDefault,
- spcEncoded as? CFString? as! CFString,
- nil,
- "?=&+" as CFString,
- CFStringBuiltInEncodings.UTF8.rawValue
- ) as? String
- let post = String(format: "spc=%@&%@", spcUrlEncoded as! CVarArg, contentId)
- let postData = post.data(using: String.Encoding.utf8, allowLossyConversion: true)
- request.httpBody = postData
-
- return request
- }
-
- static func fetchSpcData(
- loadingRequest: AVAssetResourceLoadingRequest,
- certificateData: Data,
- contentIdData: Data
- ) throws -> Data {
- #if os(visionOS)
- // TODO: DRM is not supported yet on visionOS. See #3467
- throw NSError(domain: "DRM is not supported yet on visionOS", code: 0, userInfo: nil)
- #else
- guard let spcData = try? loadingRequest.streamingContentKeyRequestData(
- forApp: certificateData,
- contentIdentifier: contentIdData as Data,
- options: nil
- ) else {
- throw RCTVideoErrorHandler.noSPC
- }
-
- return spcData
- #endif
- }
-
- static func createCertificateData(certificateStringUrl: String?, base64Certificate: Bool?) throws -> Data {
- guard let certificateStringUrl,
- let certificateURL = URL(string: certificateStringUrl.addingPercentEncoding(withAllowedCharacters: .urlFragmentAllowed) ?? "") else {
- throw RCTVideoErrorHandler.noCertificateURL
- }
-
- var certificateData: Data?
- do {
- certificateData = try Data(contentsOf: certificateURL)
- if base64Certificate != nil {
- certificateData = Data(base64Encoded: certificateData! as Data, options: .ignoreUnknownCharacters)
- }
- } catch {}
-
- guard let certificateData else {
- throw RCTVideoErrorHandler.noCertificateData
- }
-
- return certificateData
- }
-
- static func handleWithOnGetLicense(loadingRequest: AVAssetResourceLoadingRequest, contentId: String?, certificateUrl: String?,
- base64Certificate: Bool?) throws -> Data {
- let contentIdData = contentId?.data(using: .utf8)
-
- let certificateData = try? RCTVideoDRM.createCertificateData(certificateStringUrl: certificateUrl, base64Certificate: base64Certificate)
-
- guard let contentIdData else {
- throw RCTVideoError.invalidContentId as! Error
- }
-
- guard let certificateData else {
- throw RCTVideoError.noCertificateData as! Error
- }
-
- return try RCTVideoDRM.fetchSpcData(
- loadingRequest: loadingRequest,
- certificateData: certificateData,
- contentIdData: contentIdData
- )
- }
-
- static func handleInternalGetLicense(
- loadingRequest: AVAssetResourceLoadingRequest,
- contentId: String?,
- licenseServer: String?,
- certificateUrl: String?,
- base64Certificate: Bool?,
- headers: [String: Any]?
- ) async throws -> Data {
- let url = loadingRequest.request.url
-
- let parsedContentId = contentId != nil && !contentId!.isEmpty ? contentId : nil
-
- guard let contentId = parsedContentId ?? url?.absoluteString.replacingOccurrences(of: "skd://", with: "") else {
- throw RCTVideoError.invalidContentId as! Error
- }
-
- let contentIdData = NSData(bytes: contentId.cString(using: String.Encoding.utf8), length: contentId.lengthOfBytes(using: String.Encoding.utf8)) as Data
- let certificateData = try RCTVideoDRM.createCertificateData(certificateStringUrl: certificateUrl, base64Certificate: base64Certificate)
- let spcData = try RCTVideoDRM.fetchSpcData(
- loadingRequest: loadingRequest,
- certificateData: certificateData,
- contentIdData: contentIdData
- )
-
- guard let licenseServer else {
- throw RCTVideoError.noLicenseServerURL as! Error
- }
-
- return try await RCTVideoDRM.fetchLicense(
- licenseServer: licenseServer,
- spcData: spcData,
- contentId: contentId,
- headers: headers
- )
- }
-}
diff --git a/ios/Video/Features/RCTVideoErrorHandling.swift b/ios/Video/Features/RCTVideoErrorHandling.swift
index 7dc68783..b06031cf 100644
--- a/ios/Video/Features/RCTVideoErrorHandling.swift
+++ b/ios/Video/Features/RCTVideoErrorHandling.swift
@@ -1,114 +1,188 @@
+import Foundation
+
// MARK: - RCTVideoError
-enum RCTVideoError: Int {
- case fromJSPart
+enum RCTVideoError: Error, Hashable {
+ case fromJSPart(String)
case noLicenseServerURL
- case licenseRequestNotOk
+ case licenseRequestFailed(Int)
case noDataFromLicenseRequest
case noSPC
- case noDataRequest
case noCertificateData
case noCertificateURL
- case noFairplayDRM
case noDRMData
case invalidContentId
+ case invalidAppCert
+ case keyRequestCreationFailed
+ case persistableKeyRequestFailed
+ case embeddedKeyExtractionFailed
+ case offlineDRMNotSupported
+ case unsupportedDRMType
+ case simulatorDRMNotSupported
+
+ var errorCode: Int {
+ switch self {
+ case .fromJSPart:
+ return 1000
+ case .noLicenseServerURL:
+ return 1001
+ case .licenseRequestFailed:
+ return 1002
+ case .noDataFromLicenseRequest:
+ return 1003
+ case .noSPC:
+ return 1004
+ case .noCertificateData:
+ return 1005
+ case .noCertificateURL:
+ return 1006
+ case .noDRMData:
+ return 1007
+ case .invalidContentId:
+ return 1008
+ case .invalidAppCert:
+ return 1009
+ case .keyRequestCreationFailed:
+ return 1010
+ case .persistableKeyRequestFailed:
+ return 1011
+ case .embeddedKeyExtractionFailed:
+ return 1012
+ case .offlineDRMNotSupported:
+ return 1013
+ case .unsupportedDRMType:
+ return 1014
+ case .simulatorDRMNotSupported:
+ return 1015
+ }
+ }
+}
+
+// MARK: LocalizedError
+
+extension RCTVideoError: LocalizedError {
+ var errorDescription: String? {
+ switch self {
+ case let .fromJSPart(error):
+ return NSLocalizedString("Error from JavaScript: \(error)", comment: "")
+ case .noLicenseServerURL:
+ return NSLocalizedString("No license server URL provided", comment: "")
+ case let .licenseRequestFailed(statusCode):
+ return NSLocalizedString("License request failed with status code: \(statusCode)", comment: "")
+ case .noDataFromLicenseRequest:
+ return NSLocalizedString("No data received from license server", comment: "")
+ case .noSPC:
+ return NSLocalizedString("Failed to create Server Playback Context (SPC)", comment: "")
+ case .noCertificateData:
+ return NSLocalizedString("No certificate data obtained", comment: "")
+ case .noCertificateURL:
+ return NSLocalizedString("No certificate URL provided", comment: "")
+ case .noDRMData:
+ return NSLocalizedString("No DRM data available", comment: "")
+ case .invalidContentId:
+ return NSLocalizedString("Invalid content ID", comment: "")
+ case .invalidAppCert:
+ return NSLocalizedString("Invalid application certificate", comment: "")
+ case .keyRequestCreationFailed:
+ return NSLocalizedString("Failed to create content key request", comment: "")
+ case .persistableKeyRequestFailed:
+ return NSLocalizedString("Failed to create persistable content key request", comment: "")
+ case .embeddedKeyExtractionFailed:
+ return NSLocalizedString("Failed to extract embedded key", comment: "")
+ case .offlineDRMNotSupported:
+ return NSLocalizedString("Offline DRM is not supported, see https://github.com/TheWidlarzGroup/react-native-video/issues/3539", comment: "")
+ case .unsupportedDRMType:
+ return NSLocalizedString("Unsupported DRM type", comment: "")
+ case .simulatorDRMNotSupported:
+ return NSLocalizedString("DRM on simulators is not supported", comment: "")
+ }
+ }
+
+ var failureReason: String? {
+ switch self {
+ case .fromJSPart:
+ return NSLocalizedString("An error occurred in the JavaScript part of the application.", comment: "")
+ case .noLicenseServerURL:
+ return NSLocalizedString("The license server URL is missing in the DRM configuration.", comment: "")
+ case .licenseRequestFailed:
+ return NSLocalizedString("The license server responded with an error status code.", comment: "")
+ case .noDataFromLicenseRequest:
+ return NSLocalizedString("The license server did not return any data.", comment: "")
+ case .noSPC:
+ return NSLocalizedString("Failed to generate the Server Playback Context (SPC) for the content.", comment: "")
+ case .noCertificateData:
+ return NSLocalizedString("Unable to retrieve certificate data from the specified URL.", comment: "")
+ case .noCertificateURL:
+ return NSLocalizedString("The certificate URL is missing in the DRM configuration.", comment: "")
+ case .noDRMData:
+ return NSLocalizedString("The required DRM data is not available or is invalid.", comment: "")
+ case .invalidContentId:
+ return NSLocalizedString("The content ID provided is not valid or recognized.", comment: "")
+ case .invalidAppCert:
+ return NSLocalizedString("The application certificate is invalid or not recognized.", comment: "")
+ case .keyRequestCreationFailed:
+ return NSLocalizedString("Unable to create a content key request for DRM.", comment: "")
+ case .persistableKeyRequestFailed:
+ return NSLocalizedString("Failed to create a persistable content key request for offline playback.", comment: "")
+ case .embeddedKeyExtractionFailed:
+ return NSLocalizedString("Unable to extract the embedded key from the custom scheme URL.", comment: "")
+ case .offlineDRMNotSupported:
+ return NSLocalizedString("You tried to use Offline DRM but it is not supported yet", comment: "")
+ case .unsupportedDRMType:
+ return NSLocalizedString("You tried to use unsupported DRM type", comment: "")
+ case .simulatorDRMNotSupported:
+ return NSLocalizedString("You tried to DRM on a simulator", comment: "")
+ }
+ }
+
+ var recoverySuggestion: String? {
+ switch self {
+ case .fromJSPart:
+ return NSLocalizedString("Check the JavaScript logs for more details and fix any issues in the JS code.", comment: "")
+ case .noLicenseServerURL:
+ return NSLocalizedString("Ensure that you have specified the 'licenseServer' property in the DRM configuration.", comment: "")
+ case .licenseRequestFailed:
+ return NSLocalizedString("Verify that the license server is functioning correctly and that you're sending the correct data.", comment: "")
+ case .noDataFromLicenseRequest:
+ return NSLocalizedString("Check if the license server is operational and responding with the expected data.", comment: "")
+ case .noSPC:
+ return NSLocalizedString("Verify that the content key request is properly configured and that the DRM setup is correct.", comment: "")
+ case .noCertificateData:
+ return NSLocalizedString("Check if the certificate URL is correct and accessible, and that it returns valid certificate data.", comment: "")
+ case .noCertificateURL:
+ return NSLocalizedString("Make sure you have specified the 'certificateUrl' property in the DRM configuration.", comment: "")
+ case .noDRMData:
+ return NSLocalizedString("Ensure that you have provided all necessary DRM-related data in the configuration.", comment: "")
+ case .invalidContentId:
+ return NSLocalizedString("Verify that the content ID is correct and matches the expected format for your DRM system.", comment: "")
+ case .invalidAppCert:
+ return NSLocalizedString("Check if the application certificate is valid and properly formatted for your DRM system.", comment: "")
+ case .keyRequestCreationFailed:
+ return NSLocalizedString("Review your DRM configuration and ensure all required parameters are correctly set.", comment: "")
+ case .persistableKeyRequestFailed:
+ return NSLocalizedString("Verify that offline playback is supported and properly configured for your content.", comment: "")
+ case .embeddedKeyExtractionFailed:
+ return NSLocalizedString("Check if the embedded key is present in the URL and the custom scheme is correctly implemented.", comment: "")
+ case .offlineDRMNotSupported:
+ return NSLocalizedString("Check if localSourceEncryptionKeyScheme is set", comment: "")
+ case .unsupportedDRMType:
+ return NSLocalizedString("Verify that you are using fairplay (on Apple devices)", comment: "")
+ case .simulatorDRMNotSupported:
+ return NSLocalizedString("You need to test DRM content on real device", comment: "")
+ }
+ }
}
// MARK: - RCTVideoErrorHandler
enum RCTVideoErrorHandler {
- static let noDRMData = NSError(
- domain: "RCTVideo",
- code: RCTVideoError.noDRMData.rawValue,
- userInfo: [
- NSLocalizedDescriptionKey: "Error obtaining DRM license.",
- NSLocalizedFailureReasonErrorKey: "No drm object found.",
- NSLocalizedRecoverySuggestionErrorKey: "Have you specified the 'drm' prop?",
+ static func createError(from error: RCTVideoError) -> [String: Any] {
+ return [
+ "code": error.errorCode,
+ "localizedDescription": error.localizedDescription,
+ "localizedFailureReason": error.failureReason ?? "",
+ "localizedRecoverySuggestion": error.recoverySuggestion ?? "",
+ "domain": "RCTVideo",
]
- )
-
- static let noCertificateURL = NSError(
- domain: "RCTVideo",
- code: RCTVideoError.noCertificateURL.rawValue,
- userInfo: [
- NSLocalizedDescriptionKey: "Error obtaining DRM License.",
- NSLocalizedFailureReasonErrorKey: "No certificate URL has been found.",
- NSLocalizedRecoverySuggestionErrorKey: "Did you specified the prop certificateUrl?",
- ]
- )
-
- static let noCertificateData = NSError(
- domain: "RCTVideo",
- code: RCTVideoError.noCertificateData.rawValue,
- userInfo: [
- NSLocalizedDescriptionKey: "Error obtaining DRM license.",
- NSLocalizedFailureReasonErrorKey: "No certificate data obtained from the specificied url.",
- NSLocalizedRecoverySuggestionErrorKey: "Have you specified a valid 'certificateUrl'?",
- ]
- )
-
- static let noSPC = NSError(
- domain: "RCTVideo",
- code: RCTVideoError.noSPC.rawValue,
- userInfo: [
- NSLocalizedDescriptionKey: "Error obtaining license.",
- NSLocalizedFailureReasonErrorKey: "No spc received.",
- NSLocalizedRecoverySuggestionErrorKey: "Check your DRM config.",
- ]
- )
-
- static let noLicenseServerURL = NSError(
- domain: "RCTVideo",
- code: RCTVideoError.noLicenseServerURL.rawValue,
- userInfo: [
- NSLocalizedDescriptionKey: "Error obtaining DRM License.",
- NSLocalizedFailureReasonErrorKey: "No license server URL has been found.",
- NSLocalizedRecoverySuggestionErrorKey: "Did you specified the prop licenseServer?",
- ]
- )
-
- static let noDataFromLicenseRequest = NSError(
- domain: "RCTVideo",
- code: RCTVideoError.noDataFromLicenseRequest.rawValue,
- userInfo: [
- NSLocalizedDescriptionKey: "Error obtaining DRM license.",
- NSLocalizedFailureReasonErrorKey: "No data received from the license server.",
- NSLocalizedRecoverySuggestionErrorKey: "Is the licenseServer ok?",
- ]
- )
-
- static func licenseRequestNotOk(_ statusCode: Int) -> NSError {
- return NSError(
- domain: "RCTVideo",
- code: RCTVideoError.licenseRequestNotOk.rawValue,
- userInfo: [
- NSLocalizedDescriptionKey: "Error obtaining license.",
- NSLocalizedFailureReasonErrorKey: String(
- format: "License server responded with status code %li",
- statusCode
- ),
- NSLocalizedRecoverySuggestionErrorKey: "Did you send the correct data to the license Server? Is the server ok?",
- ]
- )
}
-
- static func fromJSPart(_ error: String) -> NSError {
- return NSError(domain: "RCTVideo",
- code: RCTVideoError.fromJSPart.rawValue,
- userInfo: [
- NSLocalizedDescriptionKey: error,
- NSLocalizedFailureReasonErrorKey: error,
- NSLocalizedRecoverySuggestionErrorKey: error,
- ])
- }
-
- static let invalidContentId = NSError(
- domain: "RCTVideo",
- code: RCTVideoError.invalidContentId.rawValue,
- userInfo: [
- NSLocalizedDescriptionKey: "Error obtaining DRM license.",
- NSLocalizedFailureReasonErrorKey: "No valide content Id received",
- NSLocalizedRecoverySuggestionErrorKey: "Is the contentId and url ok?",
- ]
- )
}
diff --git a/ios/Video/Features/RCTVideoSave.swift b/ios/Video/Features/RCTVideoSave.swift
index 76fc2901..cdf1fdf9 100644
--- a/ios/Video/Features/RCTVideoSave.swift
+++ b/ios/Video/Features/RCTVideoSave.swift
@@ -19,26 +19,32 @@ enum RCTVideoSave {
reject("ERROR_COULD_NOT_CREATE_EXPORT_SESSION", "Could not create export session", nil)
return
}
- var path: String!
- path = RCTVideoSave.generatePathInDirectory(
- directory: URL(fileURLWithPath: RCTVideoSave.cacheDirectoryPath() ?? "").appendingPathComponent("Videos").path,
- withExtension: ".mp4"
- )
- let url: NSURL! = NSURL.fileURL(withPath: path) as NSURL
- exportSession.outputFileType = AVFileType.mp4
- exportSession.outputURL = url as URL?
- exportSession.videoComposition = playerItem?.videoComposition
- exportSession.shouldOptimizeForNetworkUse = true
- exportSession.exportAsynchronously(completionHandler: {
- switch exportSession.status {
- case .failed:
- reject("ERROR_COULD_NOT_EXPORT_VIDEO", "Could not export video", exportSession.error)
- case .cancelled:
- reject("ERROR_EXPORT_SESSION_CANCELLED", "Export session was cancelled", exportSession.error)
- default:
- resolve(["uri": url.absoluteString])
- }
- })
+
+ #if !os(visionOS)
+ var path: String!
+ path = RCTVideoSave.generatePathInDirectory(
+ directory: URL(fileURLWithPath: RCTVideoSave.cacheDirectoryPath() ?? "").appendingPathComponent("Videos").path,
+ withExtension: ".mp4"
+ )
+ let url: NSURL! = NSURL.fileURL(withPath: path) as NSURL
+ exportSession.outputFileType = .mp4
+ exportSession.outputFileType = AVFileType.mp4
+ exportSession.outputURL = url as URL?
+ exportSession.videoComposition = playerItem?.videoComposition
+ exportSession.shouldOptimizeForNetworkUse = true
+ exportSession.exportAsynchronously(completionHandler: {
+ switch exportSession.status {
+ case .failed:
+ reject("ERROR_COULD_NOT_EXPORT_VIDEO", "Could not export video", exportSession.error)
+ case .cancelled:
+ reject("ERROR_EXPORT_SESSION_CANCELLED", "Export session was cancelled", exportSession.error)
+ default:
+ resolve(["uri": url.absoluteString])
+ }
+ })
+ #else
+ reject("ERROR_EXPORT_SESSION_CANCELLED", "this function is not supported on visionOS", nil)
+ #endif
}
static func generatePathInDirectory(directory: String?, withExtension extension: String?) -> String? {
@@ -54,13 +60,11 @@ enum RCTVideoSave {
static func ensureDirExists(withPath path: String?) -> Bool {
var isDir: ObjCBool = false
- var error: Error?
let exists = FileManager.default.fileExists(atPath: path ?? "", isDirectory: &isDir)
if !(exists && isDir.boolValue) {
do {
try FileManager.default.createDirectory(atPath: path ?? "", withIntermediateDirectories: true, attributes: nil)
- } catch {}
- if error != nil {
+ } catch {
return false
}
}
diff --git a/ios/Video/Features/RCTVideoUtils.swift b/ios/Video/Features/RCTVideoUtils.swift
index c13c4d94..329b26ff 100644
--- a/ios/Video/Features/RCTVideoUtils.swift
+++ b/ios/Video/Features/RCTVideoUtils.swift
@@ -9,7 +9,15 @@ enum RCTVideoAssetsUtils {
for mediaCharacteristic: AVMediaCharacteristic
) async -> AVMediaSelectionGroup? {
if #available(iOS 15, tvOS 15, visionOS 1.0, *) {
- return try? await asset?.loadMediaSelectionGroup(for: mediaCharacteristic)
+ do {
+ guard let asset else {
+ return nil
+ }
+
+ return try await asset.loadMediaSelectionGroup(for: mediaCharacteristic)
+ } catch {
+ return nil
+ }
} else {
#if !os(visionOS)
return asset?.mediaSelectionGroup(forMediaCharacteristic: mediaCharacteristic)
@@ -73,22 +81,25 @@ enum RCTVideoUtils {
return 0
}
- static func urlFilePath(filepath: NSString!, searchPath: FileManager.SearchPathDirectory) -> NSURL! {
- if filepath.contains("file://") {
- return NSURL(string: filepath as String)
+ static func urlFilePath(filepath: NSString?, searchPath: FileManager.SearchPathDirectory) -> NSURL! {
+ guard let _filepath = filepath else { return nil }
+
+ if _filepath.contains("file://") {
+ return NSURL(string: _filepath as String)
}
// if no file found, check if the file exists in the Document directory
- let paths: [String]! = NSSearchPathForDirectoriesInDomains(searchPath, .userDomainMask, true)
- var relativeFilePath: String! = filepath.lastPathComponent
+ let paths: [String] = NSSearchPathForDirectoriesInDomains(searchPath, .userDomainMask, true)
+ var relativeFilePath: String = _filepath.lastPathComponent
// the file may be multiple levels below the documents directory
- let directoryString: String! = searchPath == .cachesDirectory ? "Library/Caches/" : "Documents"
- let fileComponents: [String]! = filepath.components(separatedBy: directoryString)
+ let directoryString: String = searchPath == .cachesDirectory ? "Library/Caches/" : "Documents"
+ let fileComponents: [String] = _filepath.components(separatedBy: directoryString)
if fileComponents.count > 1 {
relativeFilePath = fileComponents[1]
}
- let path: String! = (paths.first! as NSString).appendingPathComponent(relativeFilePath)
+ guard let _pathFirst = paths.first else { return nil }
+ let path: String = (_pathFirst as NSString).appendingPathComponent(relativeFilePath)
if FileManager.default.fileExists(atPath: path) {
return NSURL.fileURL(withPath: path) as NSURL
}
@@ -127,7 +138,7 @@ enum RCTVideoUtils {
return []
}
- let audioTracks: NSMutableArray! = NSMutableArray()
+ let audioTracks = NSMutableArray()
let group = await RCTVideoAssetsUtils.getMediaSelectionGroup(asset: asset, for: .audible)
@@ -138,14 +149,14 @@ enum RCTVideoUtils {
if (values?.count ?? 0) > 0, let value = values?[0] {
title = value as! String
}
- let language: String! = currentOption?.extendedLanguageTag ?? ""
+ let language: String = currentOption?.extendedLanguageTag ?? ""
let selectedOption: AVMediaSelectionOption? = player.currentItem?.currentMediaSelection.selectedMediaOption(in: group!)
let audioTrack = [
"index": NSNumber(value: i),
"title": title,
- "language": language ?? "",
+ "language": language,
"selected": currentOption?.displayName == selectedOption?.displayName,
] as [String: Any]
audioTracks.add(audioTrack)
@@ -170,13 +181,12 @@ enum RCTVideoUtils {
if (values?.count ?? 0) > 0, let value = values?[0] {
title = value as! String
}
- let language: String! = currentOption?.extendedLanguageTag ?? ""
- let selectedOpt = player.currentItem?.currentMediaSelection
+ let language: String = currentOption?.extendedLanguageTag ?? ""
let selectedOption: AVMediaSelectionOption? = player.currentItem?.currentMediaSelection.selectedMediaOption(in: group!)
let textTrack = TextTrack([
"index": NSNumber(value: i),
"title": title,
- "language": language,
+ "language": language as Any,
"selected": currentOption?.displayName == selectedOption?.displayName,
])
textTracks.append(textTrack)
@@ -356,10 +366,11 @@ enum RCTVideoUtils {
static func prepareAsset(source: VideoSource) -> (asset: AVURLAsset?, assetOptions: NSMutableDictionary?)? {
guard let sourceUri = source.uri, sourceUri != "" else { return nil }
var asset: AVURLAsset!
- let bundlePath = Bundle.main.path(forResource: source.uri, ofType: source.type) ?? ""
- let url = source.isNetwork || source.isAsset
- ? URL(string: source.uri ?? "")
- : URL(fileURLWithPath: bundlePath)
+ let bundlePath = Bundle.main.path(forResource: sourceUri, ofType: source.type) ?? ""
+ guard let url = source.isNetwork || source.isAsset
+ ? URL(string: sourceUri)
+ : URL(fileURLWithPath: bundlePath) else { return nil }
+
let assetOptions: NSMutableDictionary! = NSMutableDictionary()
if source.isNetwork {
@@ -367,10 +378,10 @@ enum RCTVideoUtils {
assetOptions.setObject(headers, forKey: "AVURLAssetHTTPHeaderFieldsKey" as NSCopying)
}
let cookies: [AnyObject]! = HTTPCookieStorage.shared.cookies
- assetOptions.setObject(cookies, forKey: AVURLAssetHTTPCookiesKey as NSCopying)
- asset = AVURLAsset(url: url!, options: assetOptions as! [String: Any])
+ assetOptions.setObject(cookies as Any, forKey: AVURLAssetHTTPCookiesKey as NSCopying)
+ asset = AVURLAsset(url: url, options: assetOptions as? [String: Any])
} else {
- asset = AVURLAsset(url: url!)
+ asset = AVURLAsset(url: url)
}
return (asset, assetOptions)
}
@@ -423,14 +434,10 @@ enum RCTVideoUtils {
return try? await AVVideoComposition.videoComposition(
with: asset,
applyingCIFiltersWithHandler: { (request: AVAsynchronousCIImageFilteringRequest) in
- if filter == nil {
- request.finish(with: request.sourceImage, context: nil)
- } else {
- let image: CIImage! = request.sourceImage.clampedToExtent()
- filter.setValue(image, forKey: kCIInputImageKey)
- let output: CIImage! = filter.outputImage?.cropped(to: request.sourceImage.extent)
- request.finish(with: output, context: nil)
- }
+ let image: CIImage! = request.sourceImage.clampedToExtent()
+ filter.setValue(image, forKey: kCIInputImageKey)
+ let output: CIImage! = filter.outputImage?.cropped(to: request.sourceImage.extent)
+ request.finish(with: output, context: nil)
}
)
} else {
@@ -438,14 +445,10 @@ enum RCTVideoUtils {
return AVVideoComposition(
asset: asset,
applyingCIFiltersWithHandler: { (request: AVAsynchronousCIImageFilteringRequest) in
- if filter == nil {
- request.finish(with: request.sourceImage, context: nil)
- } else {
- let image: CIImage! = request.sourceImage.clampedToExtent()
- filter.setValue(image, forKey: kCIInputImageKey)
- let output: CIImage! = filter.outputImage?.cropped(to: request.sourceImage.extent)
- request.finish(with: output, context: nil)
- }
+ let image: CIImage! = request.sourceImage.clampedToExtent()
+ filter.setValue(image, forKey: kCIInputImageKey)
+ let output: CIImage! = filter.outputImage?.cropped(to: request.sourceImage.extent)
+ request.finish(with: output, context: nil)
}
)
#endif
diff --git a/ios/Video/NowPlayingInfoCenterManager.swift b/ios/Video/NowPlayingInfoCenterManager.swift
index 36bfe8eb..153a5daf 100644
--- a/ios/Video/NowPlayingInfoCenterManager.swift
+++ b/ios/Video/NowPlayingInfoCenterManager.swift
@@ -18,6 +18,7 @@ class NowPlayingInfoCenterManager {
private var skipBackwardTarget: Any?
private var playbackPositionTarget: Any?
private var seekTarget: Any?
+ private var togglePlayPauseTarget: Any?
private let remoteCommandCenter = MPRemoteCommandCenter.shared()
@@ -72,7 +73,7 @@ class NowPlayingInfoCenterManager {
if currentPlayer == player {
currentPlayer = nil
- updateMetadata()
+ updateNowPlayingInfo()
}
if players.allObjects.isEmpty {
@@ -106,14 +107,12 @@ class NowPlayingInfoCenterManager {
currentPlayer = player
registerCommandTargets()
- updateMetadata()
-
- // one second observer
+ updateNowPlayingInfo()
playbackObserver = player.addPeriodicTimeObserver(
forInterval: CMTime(value: 1, timescale: 4),
queue: .global(),
using: { [weak self] _ in
- self?.updatePlaybackInfo()
+ self?.updateNowPlayingInfo()
}
)
}
@@ -169,13 +168,26 @@ class NowPlayingInfoCenterManager {
return .commandFailed
}
if let event = event as? MPChangePlaybackPositionCommandEvent {
- player.seek(to: CMTime(seconds: event.positionTime, preferredTimescale: .max)) { _ in
- player.play()
- }
+ player.seek(to: CMTime(seconds: event.positionTime, preferredTimescale: .max))
return .success
}
return .commandFailed
}
+
+ // Handler for togglePlayPauseCommand, sent by Apple's Earpods wired headphones
+ togglePlayPauseTarget = remoteCommandCenter.togglePlayPauseCommand.addTarget { [weak self] _ in
+ guard let self, let player = self.currentPlayer else {
+ return .commandFailed
+ }
+
+ if player.rate == 0 {
+ player.play()
+ } else {
+ player.pause()
+ }
+
+ return .success
+ }
}
private func invalidateCommandTargets() {
@@ -184,9 +196,10 @@ class NowPlayingInfoCenterManager {
remoteCommandCenter.skipForwardCommand.removeTarget(skipForwardTarget)
remoteCommandCenter.skipBackwardCommand.removeTarget(skipBackwardTarget)
remoteCommandCenter.changePlaybackPositionCommand.removeTarget(playbackPositionTarget)
+ remoteCommandCenter.togglePlayPauseCommand.removeTarget(togglePlayPauseTarget)
}
- public func updateMetadata() {
+ public func updateNowPlayingInfo() {
guard let player = currentPlayer, let currentItem = player.currentItem else {
invalidateCommandTargets()
MPNowPlayingInfoCenter.default().nowPlayingInfo = [:]
@@ -194,7 +207,12 @@ class NowPlayingInfoCenterManager {
}
// commonMetadata is metadata from asset, externalMetadata is custom metadata set by user
- let metadata = currentItem.asset.commonMetadata + currentItem.externalMetadata
+ // externalMetadata should override commonMetadata to allow override metadata from source
+ let metadata = {
+ let common = Dictionary(uniqueKeysWithValues: currentItem.asset.commonMetadata.map { ($0.identifier, $0) })
+ let external = Dictionary(uniqueKeysWithValues: currentItem.externalMetadata.map { ($0.identifier, $0) })
+ return Array((common.merging(external) { _, new in new }).values)
+ }()
let titleItem = AVMetadataItem.metadataItems(from: metadata, filteredByIdentifier: .commonIdentifierTitle).first?.stringValue ?? ""
@@ -206,7 +224,7 @@ class NowPlayingInfoCenterManager {
let image = imgData.flatMap { UIImage(data: $0) } ?? UIImage()
let artworkItem = MPMediaItemArtwork(boundsSize: image.size) { _ in image }
- let nowPlayingInfo: [String: Any] = [
+ let newNowPlayingInfo: [String: Any] = [
MPMediaItemPropertyTitle: titleItem,
MPMediaItemPropertyArtist: artistItem,
MPMediaItemPropertyArtwork: artworkItem,
@@ -215,28 +233,9 @@ class NowPlayingInfoCenterManager {
MPNowPlayingInfoPropertyPlaybackRate: player.rate,
MPNowPlayingInfoPropertyIsLiveStream: CMTIME_IS_INDEFINITE(currentItem.asset.duration),
]
+ let currentNowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo ?? [:]
- MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
- }
-
- private func updatePlaybackInfo() {
- guard let player = currentPlayer, let currentItem = player.currentItem else {
- return
- }
-
- // We dont want to update playback if we did not set metadata yet
- if var nowPlayingInfo = MPNowPlayingInfoCenter.default().nowPlayingInfo {
- let newNowPlayingInfo: [String: Any] = [
- MPMediaItemPropertyPlaybackDuration: currentItem.duration.seconds,
- MPNowPlayingInfoPropertyElapsedPlaybackTime: currentItem.currentTime().seconds.rounded(),
- MPNowPlayingInfoPropertyPlaybackRate: player.rate,
- MPNowPlayingInfoPropertyIsLiveStream: CMTIME_IS_INDEFINITE(currentItem.asset.duration),
- ]
-
- nowPlayingInfo.merge(newNowPlayingInfo) { _, v in v }
-
- MPNowPlayingInfoCenter.default().nowPlayingInfo = nowPlayingInfo
- }
+ MPNowPlayingInfoCenter.default().nowPlayingInfo = currentNowPlayingInfo.merging(newNowPlayingInfo) { _, new in new }
}
private func findNewCurrentPlayer() {
diff --git a/ios/Video/RCTVideo.swift b/ios/Video/RCTVideo.swift
index c4f4e99a..0701067f 100644
--- a/ios/Video/RCTVideo.swift
+++ b/ios/Video/RCTVideo.swift
@@ -17,7 +17,6 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
private var _playerViewController: RCTVideoPlayerViewController?
private var _videoURL: NSURL?
- private var _localSourceEncryptionKeyScheme: String?
/* Required to publish events */
private var _eventDispatcher: RCTEventDispatcher?
@@ -42,20 +41,19 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
private var _repeat = false
private var _isPlaying = false
private var _allowsExternalPlayback = true
- private var _textTracks: [TextTrack]?
- private var _selectedTextTrackCriteria: SelectedTrackCriteria?
- private var _selectedAudioTrackCriteria: SelectedTrackCriteria?
+ private var _selectedTextTrackCriteria: SelectedTrackCriteria = .none()
+ private var _selectedAudioTrackCriteria: SelectedTrackCriteria = .none()
private var _playbackStalled = false
private var _playInBackground = false
private var _preventsDisplaySleepDuringVideoPlayback = true
private var _preferredForwardBufferDuration: Float = 0.0
private var _playWhenInactive = false
- private var _ignoreSilentSwitch: String! = "inherit" // inherit, ignore, obey
- private var _mixWithOthers: String! = "inherit" // inherit, mix, duck
- private var _resizeMode: String! = "cover"
+ private var _ignoreSilentSwitch: String = "inherit" // inherit, ignore, obey
+ private var _mixWithOthers: String = "inherit" // inherit, mix, duck
+ private var _resizeMode: String = "cover"
private var _fullscreen = false
private var _fullscreenAutorotate = true
- private var _fullscreenOrientation: String! = "all"
+ private var _fullscreenOrientation: String = "all"
private var _fullscreenPlayerPresented = false
private var _fullscreenUncontrolPlayerPresented = false // to call events switching full screen mode from player controls
private var _filterName: String!
@@ -63,6 +61,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
private var _presentingViewController: UIViewController?
private var _startPosition: Float64 = -1
private var _showNotificationControls = false
+ // Buffer last bitrate value received. Initialized to -2 to ensure -1 (sometimes reported by AVPlayer) is not missed
+ private var _lastBitrate = -2.0
private var _pictureInPictureEnabled = false {
didSet {
#if os(iOS)
@@ -86,7 +86,6 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
/* IMA Ads */
- private var _adTagUrl: String?
#if USE_GOOGLE_IMA
private var _imaAdsManager: RCTIMAAdsManager!
/* Playhead used by the SDK to track content video progress and insert mid-rolls. */
@@ -95,7 +94,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
private var _didRequestAds = false
private var _adPlaying = false
- private var _resouceLoaderDelegate: RCTResourceLoaderDelegate?
+ private lazy var _drmManager: DRMManager? = DRMManager()
private var _playerObserver: RCTPlayerObserver = .init()
#if USE_VIDEO_CACHING
@@ -284,9 +283,18 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
// MARK: - App lifecycle handlers
+ func getIsExternalPlaybackActive() -> Bool {
+ #if os(visionOS)
+ let isExternalPlaybackActive = false
+ #else
+ let isExternalPlaybackActive = _player?.isExternalPlaybackActive ?? false
+ #endif
+ return isExternalPlaybackActive
+ }
+
@objc
func applicationWillResignActive(notification _: NSNotification!) {
- let isExternalPlaybackActive = _player?.isExternalPlaybackActive ?? false
+ let isExternalPlaybackActive = getIsExternalPlaybackActive()
if _playInBackground || _playWhenInactive || !_isPlaying || isExternalPlaybackActive { return }
_player?.pause()
@@ -295,7 +303,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc
func applicationDidBecomeActive(notification _: NSNotification!) {
- let isExternalPlaybackActive = _player?.isExternalPlaybackActive ?? false
+ let isExternalPlaybackActive = getIsExternalPlaybackActive()
if _playInBackground || _playWhenInactive || !_isPlaying || isExternalPlaybackActive { return }
// Resume the player or any other tasks that should continue when the app becomes active.
@@ -305,7 +313,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc
func applicationDidEnterBackground(notification _: NSNotification!) {
- let isExternalPlaybackActive = _player?.isExternalPlaybackActive ?? false
+ let isExternalPlaybackActive = getIsExternalPlaybackActive()
if !_playInBackground || isExternalPlaybackActive || isPipActive() { return }
// Needed to play sound in background. See https://developer.apple.com/library/ios/qa/qa1668/_index.html
_playerLayer?.player = nil
@@ -341,7 +349,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
#endif
if let video = _player?.currentItem,
- video == nil || video.status != AVPlayerItem.Status.readyToPlay {
+ video.status != AVPlayerItem.Status.readyToPlay {
return
}
@@ -364,7 +372,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
if currentTimeSecs >= 0 {
#if USE_GOOGLE_IMA
- if !_didRequestAds && currentTimeSecs >= 0.0001 && _adTagUrl != nil {
+ if !_didRequestAds && currentTimeSecs >= 0.0001 && _source?.adParams.adTagUrl != nil {
_imaAdsManager.requestAds()
_didRequestAds = true
}
@@ -374,7 +382,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
"playableDuration": RCTVideoUtils.calculatePlayableDuration(_player, withSource: _source),
"atValue": currentTime?.value ?? .zero,
"currentPlaybackTime": NSNumber(value: Double(currentPlaybackTime?.timeIntervalSince1970 ?? 0 * 1000)).int64Value,
- "target": reactTag,
+ "target": reactTag as Any,
"seekableDuration": RCTVideoUtils.calculateSeekableDuration(_player),
])
}
@@ -406,17 +414,17 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
// Perform on next run loop, otherwise onVideoLoadStart is nil
onVideoLoadStart?([
"src": [
- "uri": _source?.uri ?? NSNull(),
+ "uri": _source?.uri ?? NSNull() as Any,
"type": _source?.type ?? NSNull(),
"isNetwork": NSNumber(value: _source?.isNetwork ?? false),
],
- "drm": source.drm?.json ?? NSNull(),
- "target": reactTag,
+ "drm": source.drm.json ?? NSNull(),
+ "target": reactTag as Any,
])
if let uri = source.uri, uri.starts(with: "ph://") {
let photoAsset = await RCTVideoUtils.preparePHAsset(uri: uri)
- return await playerItemPrepareText(asset: photoAsset, assetOptions: nil, uri: source.uri ?? "")
+ return await playerItemPrepareText(source: source, asset: photoAsset, assetOptions: nil, uri: source.uri ?? "")
}
guard let assetResult = RCTVideoUtils.prepareAsset(source: source),
@@ -442,23 +450,26 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
#if USE_VIDEO_CACHING
- if _videoCache.shouldCache(source: source, textTracks: _textTracks) {
- return try await _videoCache.playerItemForSourceUsingCache(uri: source.uri, assetOptions: assetOptions)
+ if _videoCache.shouldCache(source: source) {
+ return try await _videoCache.playerItemForSourceUsingCache(source: source, assetOptions: assetOptions)
}
#endif
- if source.drm != nil || _localSourceEncryptionKeyScheme != nil {
- _resouceLoaderDelegate = RCTResourceLoaderDelegate(
+ if source.drm.json != nil {
+ if _drmManager == nil {
+ _drmManager = DRMManager()
+ }
+
+ _drmManager?.createContentKeyRequest(
asset: asset,
- drm: source.drm,
- localSourceEncryptionKeyScheme: _localSourceEncryptionKeyScheme,
+ drmParams: source.drm,
+ reactTag: reactTag,
onVideoError: onVideoError,
- onGetLicense: onGetLicense,
- reactTag: reactTag
+ onGetLicense: onGetLicense
)
}
- return await playerItemPrepareText(asset: asset, assetOptions: assetOptions, uri: source.uri ?? "")
+ return await playerItemPrepareText(source: source, asset: asset, assetOptions: assetOptions, uri: source.uri ?? "")
}
func setupPlayer(playerItem: AVPlayerItem) async throws {
@@ -479,7 +490,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
if _player == nil {
_player = AVPlayer()
- ReactNativeVideoManager.shared.onInstanceCreated(id: instanceId, player: _player)
+ ReactNativeVideoManager.shared.onInstanceCreated(id: instanceId, player: _player as Any)
_player!.replaceCurrentItem(with: playerItem)
@@ -488,10 +499,21 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
NowPlayingInfoCenterManager.shared.registerPlayer(player: _player!)
}
} else {
+ #if !os(tvOS) && !os(visionOS)
+ if #available(iOS 16.0, *) {
+ // This feature caused crashes, if the app was put in bg, before the source change
+ // https://github.com/TheWidlarzGroup/react-native-video/issues/3900
+ self._playerViewController?.allowsVideoFrameAnalysis = false
+ }
+ #endif
_player?.replaceCurrentItem(with: playerItem)
-
- // later we can just call "updateMetadata:
- NowPlayingInfoCenterManager.shared.updateMetadata()
+ #if !os(tvOS) && !os(visionOS)
+ if #available(iOS 16.0, *) {
+ self._playerViewController?.allowsVideoFrameAnalysis = true
+ }
+ #endif
+ // later we can just call "updateNowPlayingInfo:
+ NowPlayingInfoCenterManager.shared.updateNowPlayingInfo()
}
_playerObserver.player = _player
@@ -503,7 +525,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
#if USE_GOOGLE_IMA
- if _adTagUrl != nil {
+ if _source?.adParams.adTagUrl != nil {
// Set up your content playhead and contentComplete callback.
_contentPlayhead = IMAAVPlayerContentPlayhead(avPlayer: _player!)
@@ -540,7 +562,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
self.removePlayerLayer()
self._playerObserver.player = nil
- self._resouceLoaderDelegate = nil
+ self._drmManager = nil
self._playerObserver.playerItem = nil
// perform on next run loop, otherwise other passed react-props may not be set
@@ -572,13 +594,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
DispatchQueue.global(qos: .default).async(execute: initializeSource)
}
- @objc
- func setLocalSourceEncryptionKeyScheme(_ keyScheme: String) {
- _localSourceEncryptionKeyScheme = keyScheme
- }
-
- func playerItemPrepareText(asset: AVAsset!, assetOptions: NSDictionary?, uri: String) async -> AVPlayerItem {
- if (self._textTracks == nil) || self._textTracks?.isEmpty == true || (uri.hasSuffix(".m3u8")) {
+ func playerItemPrepareText(source: VideoSource, asset: AVAsset!, assetOptions: NSDictionary?, uri: String) async -> AVPlayerItem {
+ if source.textTracks.isEmpty == true || uri.hasSuffix(".m3u8") {
return await self.playerItemPropegateMetadata(AVPlayerItem(asset: asset))
}
@@ -589,11 +606,15 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
asset: asset,
assetOptions: assetOptions,
mixComposition: mixComposition,
- textTracks: self._textTracks
+ textTracks: source.textTracks
)
- if validTextTracks.count != self._textTracks?.count {
- self.setTextTracks(validTextTracks)
+ if validTextTracks.isEmpty {
+ DebugLog("Strange state, not valid textTrack")
+ }
+
+ if validTextTracks.count != source.textTracks.count {
+ setSelectedTextTrack(_selectedTextTrackCriteria)
}
return await self.playerItemPropegateMetadata(AVPlayerItem(asset: mixComposition))
@@ -718,14 +739,14 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc
func setIgnoreSilentSwitch(_ ignoreSilentSwitch: String?) {
- _ignoreSilentSwitch = ignoreSilentSwitch
+ _ignoreSilentSwitch = ignoreSilentSwitch ?? "inherit"
RCTPlayerOperations.configureAudio(ignoreSilentSwitch: _ignoreSilentSwitch, mixWithOthers: _mixWithOthers, audioOutput: _audioOutput)
applyModifiers()
}
@objc
func setMixWithOthers(_ mixWithOthers: String?) {
- _mixWithOthers = mixWithOthers
+ _mixWithOthers = mixWithOthers ?? "inherit"
applyModifiers()
}
@@ -785,7 +806,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
self.setPaused(self._paused)
self.onVideoSeek?(["currentTime": NSNumber(value: Float(CMTimeGetSeconds(item.currentTime()))),
"seekTime": time,
- "target": self.reactTag])
+ "target": self.reactTag as Any])
}
_pendingSeek = false
@@ -883,7 +904,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
func applyModifiers() {
if let video = _player?.currentItem,
- video == nil || video.status != AVPlayerItem.Status.readyToPlay {
+ video.status != AVPlayerItem.Status.readyToPlay {
return
}
if _muted {
@@ -908,9 +929,9 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
setMaxBitRate(_maxBitRate)
}
+ setSelectedTextTrack(_selectedTextTrackCriteria)
setAudioOutput(_audioOutput)
setSelectedAudioTrack(_selectedAudioTrackCriteria)
- setSelectedTextTrack(_selectedTextTrackCriteria)
setResizeMode(_resizeMode)
setRepeat(_repeat)
setControls(_controls)
@@ -929,7 +950,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
func setSelectedAudioTrack(_ selectedAudioTrack: SelectedTrackCriteria?) {
- _selectedAudioTrackCriteria = selectedAudioTrack
+ _selectedAudioTrackCriteria = selectedAudioTrack ?? SelectedTrackCriteria.none()
Task {
await RCTPlayerOperations.setMediaSelectionTrackForCharacteristic(player: _player, characteristic: AVMediaCharacteristic.audible,
criteria: _selectedAudioTrackCriteria)
@@ -942,9 +963,10 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
func setSelectedTextTrack(_ selectedTextTrack: SelectedTrackCriteria?) {
- _selectedTextTrackCriteria = selectedTextTrack
- if _textTracks != nil { // sideloaded text tracks
- RCTPlayerOperations.setSideloadedText(player: _player, textTracks: _textTracks!, criteria: _selectedTextTrackCriteria)
+ _selectedTextTrackCriteria = selectedTextTrack ?? SelectedTrackCriteria.none()
+ guard let source = _source else { return }
+ if !source.textTracks.isEmpty { // sideloaded text tracks
+ RCTPlayerOperations.setSideloadedText(player: _player, textTracks: source.textTracks, criteria: _selectedTextTrackCriteria)
} else { // text tracks included in the HLS playlist§
Task {
await RCTPlayerOperations.setMediaSelectionTrackForCharacteristic(player: _player, characteristic: AVMediaCharacteristic.legible,
@@ -953,18 +975,6 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
}
- @objc
- func setTextTracks(_ textTracks: [NSDictionary]?) {
- setTextTracks(textTracks?.map { TextTrack($0) })
- }
-
- func setTextTracks(_ textTracks: [TextTrack]?) {
- _textTracks = textTracks
-
- // in case textTracks was set after selectedTextTrack
- if _selectedTextTrackCriteria != nil { setSelectedTextTrack(_selectedTextTrackCriteria) }
- }
-
@objc
func setChapters(_ chapters: [NSDictionary]?) {
setChapters(chapters?.map { Chapter($0) })
@@ -976,7 +986,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc
func setFullscreen(_ fullscreen: Bool) {
- var alreadyFullscreenPresented = _presentingViewController?.presentedViewController != nil
+ let alreadyFullscreenPresented = _presentingViewController?.presentedViewController != nil
if fullscreen && !_fullscreenPlayerPresented && _player != nil && !alreadyFullscreenPresented {
// Ensure player view controller is not null
// Controls will be displayed even if it is disabled in configuration
@@ -1015,7 +1025,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
self._fullscreenPlayerPresented = fullscreen
self._playerViewController?.autorotate = self._fullscreenAutorotate
- self.onVideoFullscreenPlayerDidPresent?(["target": self.reactTag])
+ self.onVideoFullscreenPlayerDidPresent?(["target": self.reactTag as Any])
})
}
}
@@ -1038,9 +1048,9 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
@objc
func setFullscreenOrientation(_ orientation: String?) {
- _fullscreenOrientation = orientation
+ _fullscreenOrientation = orientation ?? "all"
if _fullscreenPlayerPresented {
- _playerViewController?.preferredOrientation = orientation
+ _playerViewController?.preferredOrientation = _fullscreenOrientation
}
}
@@ -1203,13 +1213,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
// MARK: - RCTIMAAdsManager
- func getAdTagUrl() -> String? {
- return _adTagUrl
+ func getAdLanguage() -> String? {
+ return _source?.adParams.adLanguage
}
- @objc
- func setAdTagUrl(_ adTagUrl: String!) {
- _adTagUrl = adTagUrl
+ func getAdTagUrl() -> String? {
+ return _source?.adParams.adTagUrl
}
#if USE_GOOGLE_IMA
@@ -1270,14 +1279,13 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
_playerItem = nil
_source = nil
_chapters = nil
- _textTracks = nil
- _selectedTextTrackCriteria = nil
- _selectedAudioTrackCriteria = nil
+ _selectedTextTrackCriteria = SelectedTrackCriteria.none()
+ _selectedAudioTrackCriteria = SelectedTrackCriteria.none()
_presentingViewController = nil
- ReactNativeVideoManager.shared.onInstanceRemoved(id: instanceId, player: _player)
+ ReactNativeVideoManager.shared.onInstanceRemoved(id: instanceId, player: _player as Any)
_player = nil
- _resouceLoaderDelegate = nil
+ _drmManager = nil
_playerObserver.clearPlayer()
self.removePlayerLayer()
@@ -1310,12 +1318,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
)
}
- func setLicenseResult(_ license: String!, _ licenseUrl: String!) {
- _resouceLoaderDelegate?.setLicenseResult(license, licenseUrl)
+ func setLicenseResult(_ license: String, _ licenseUrl: String) {
+ _drmManager?.setJSLicenseResult(license: license, licenseUrl: licenseUrl)
}
- func setLicenseResultError(_ error: String!, _ licenseUrl: String!) {
- _resouceLoaderDelegate?.setLicenseResultError(error, licenseUrl)
+ func setLicenseResultError(_ error: String, _ licenseUrl: String) {
+ _drmManager?.setJSLicenseError(error: error, licenseUrl: licenseUrl)
}
// MARK: - RCTPlayerObserverHandler
@@ -1329,7 +1337,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
_isBuffering = false
}
onReadyForDisplay?([
- "target": reactTag,
+ "target": reactTag as Any,
])
}
@@ -1348,7 +1356,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
onTimedMetadata?([
- "target": reactTag,
+ "target": reactTag as Any,
"metadata": metadata,
])
}
@@ -1366,9 +1374,23 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
}
+ func extractJsonWithIndex(from tracks: [TextTrack]) -> [NSDictionary]? {
+ if tracks.isEmpty {
+ // No tracks, need to return nil to handle
+ return nil
+ }
+ // Map each enumerated pair to include the index in the json dictionary
+ let mappedTracks = tracks.enumerated().compactMap { index, track -> NSDictionary? in
+ guard let json = track.json?.mutableCopy() as? NSMutableDictionary else { return nil }
+ json["index"] = index // Insert the index into the json dictionary
+ return json
+ }
+ return mappedTracks
+ }
+
func handleReadyToPlay() {
guard let _playerItem else { return }
-
+ guard let source = _source else { return }
Task {
if self._pendingSeek {
self.setSeek(NSNumber(value: self._pendingSeekTime), NSNumber(value: 100))
@@ -1397,7 +1419,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
var orientation = "undefined"
let tracks = await RCTVideoAssetsUtils.getTracks(asset: _playerItem.asset, withMediaType: .video)
- var presentationSize = _playerItem.presentationSize
+ let presentationSize = _playerItem.presentationSize
if presentationSize.height != 0.0 {
width = Float(presentationSize.width)
height = Float(presentationSize.height)
@@ -1424,7 +1446,7 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
"orientation": orientation,
],
"audioTracks": audioTracks,
- "textTracks": self._textTracks?.compactMap { $0.json } ?? textTracks.map(\.json),
+ "textTracks": extractJsonWithIndex(from: source.textTracks) ?? textTracks.map(\.json),
"target": self.reactTag as Any])
}
@@ -1444,14 +1466,14 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
[
"error": [
"code": NSNumber(value: (_playerItem.error! as NSError).code),
- "localizedDescription": _playerItem.error?.localizedDescription == nil ? "" : _playerItem.error?.localizedDescription,
+ "localizedDescription": _playerItem.error?.localizedDescription == nil ? "" : _playerItem.error?.localizedDescription as Any,
"localizedFailureReason": ((_playerItem.error! as NSError).localizedFailureReason == nil ?
"" : (_playerItem.error! as NSError).localizedFailureReason) ?? "",
"localizedRecoverySuggestion": ((_playerItem.error! as NSError).localizedRecoverySuggestion == nil ?
"" : (_playerItem.error! as NSError).localizedRecoverySuggestion) ?? "",
"domain": (_playerItem.error as! NSError).domain,
],
- "target": reactTag,
+ "target": reactTag as Any,
]
)
}
@@ -1564,12 +1586,12 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
[
"error": [
"code": NSNumber(value: (error as NSError).code),
- "localizedDescription": error.localizedDescription ?? "",
+ "localizedDescription": error.localizedDescription,
"localizedFailureReason": (error as NSError).localizedFailureReason ?? "",
"localizedRecoverySuggestion": (error as NSError).localizedRecoverySuggestion ?? "",
"domain": (error as NSError).domain,
],
- "target": reactTag,
+ "target": reactTag as Any,
]
)
}
@@ -1602,7 +1624,8 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
}
)
} else {
- _playerObserver.removePlayerTimeObserver()
+ _player?.pause()
+ _player?.rate = 0.0
}
}
@@ -1613,16 +1636,19 @@ class RCTVideo: UIView, RCTVideoPlayerViewControllerDelegate, RCTPlayerObserverH
guard let accessLog = (notification.object as? AVPlayerItem)?.accessLog() else {
return
}
-
guard let lastEvent = accessLog.events.last else { return }
- onVideoBandwidthUpdate?(["bitrate": lastEvent.observedBitrate, "target": reactTag])
+ if lastEvent.indicatedBitrate != _lastBitrate {
+ _lastBitrate = lastEvent.indicatedBitrate
+ onVideoBandwidthUpdate?(["bitrate": _lastBitrate, "target": reactTag as Any])
+ }
}
func handleTracksChange(playerItem _: AVPlayerItem, change _: NSKeyValueObservedChange<[AVPlayerItemTrack]>) {
+ guard let source = _source else { return }
if onTextTracks != nil {
Task {
let textTracks = await RCTVideoUtils.getTextTrackInfo(self._player)
- self.onTextTracks?(["textTracks": self._textTracks?.compactMap { $0.json } ?? textTracks.compactMap(\.json)])
+ self.onTextTracks?(["textTracks": extractJsonWithIndex(from: source.textTracks) ?? textTracks.compactMap(\.json)])
}
}
diff --git a/ios/Video/RCTVideoManager.m b/ios/Video/RCTVideoManager.m
index 2693d36e..2a3b14e8 100644
--- a/ios/Video/RCTVideoManager.m
+++ b/ios/Video/RCTVideoManager.m
@@ -5,7 +5,6 @@
RCT_EXPORT_VIEW_PROPERTY(src, NSDictionary);
RCT_EXPORT_VIEW_PROPERTY(drm, NSDictionary);
-RCT_EXPORT_VIEW_PROPERTY(adTagUrl, NSString);
RCT_EXPORT_VIEW_PROPERTY(maxBitRate, float);
RCT_EXPORT_VIEW_PROPERTY(resizeMode, NSString);
RCT_EXPORT_VIEW_PROPERTY(repeat, BOOL);
@@ -69,11 +68,12 @@ RCT_EXPORT_VIEW_PROPERTY(onAudioTracks, RCTDirectEventBlock);
RCT_EXPORT_VIEW_PROPERTY(onTextTrackDataChanged, RCTDirectEventBlock);
RCT_EXTERN_METHOD(seekCmd : (nonnull NSNumber*)reactTag time : (nonnull NSNumber*)time tolerance : (nonnull NSNumber*)tolerance)
-RCT_EXTERN_METHOD(setLicenseResultCmd : (nonnull NSNumber*)reactTag lisence : (NSString*)license licenseUrl : (NSString*)licenseUrl)
+RCT_EXTERN_METHOD(setLicenseResultCmd : (nonnull NSNumber*)reactTag license : (NSString*)license licenseUrl : (NSString*)licenseUrl)
RCT_EXTERN_METHOD(setLicenseResultErrorCmd : (nonnull NSNumber*)reactTag error : (NSString*)error licenseUrl : (NSString*)licenseUrl)
RCT_EXTERN_METHOD(setPlayerPauseStateCmd : (nonnull NSNumber*)reactTag paused : (nonnull BOOL)paused)
RCT_EXTERN_METHOD(setVolumeCmd : (nonnull NSNumber*)reactTag volume : (nonnull float*)volume)
RCT_EXTERN_METHOD(setFullScreenCmd : (nonnull NSNumber*)reactTag fullscreen : (nonnull BOOL)fullScreen)
+RCT_EXTERN_METHOD(setSourceCmd : (nonnull NSNumber*)reactTag source : (NSDictionary*)source)
RCT_EXTERN_METHOD(save
: (nonnull NSNumber*)reactTag options
diff --git a/ios/Video/RCTVideoManager.swift b/ios/Video/RCTVideoManager.swift
index 26d40edd..dbe83ba0 100644
--- a/ios/Video/RCTVideoManager.swift
+++ b/ios/Video/RCTVideoManager.swift
@@ -72,6 +72,13 @@ class RCTVideoManager: RCTViewManager {
})
}
+ @objc(setSourceCmd:source:)
+ func setSourceCmd(_ reactTag: NSNumber, source: NSDictionary) {
+ performOnVideoView(withReactTag: reactTag, callback: { videoView in
+ videoView?.setSrc(source)
+ })
+ }
+
@objc(save:options:resolve:reject:)
func save(_ reactTag: NSNumber, options: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, reject: @escaping RCTPromiseRejectBlock) {
performOnVideoView(withReactTag: reactTag, callback: { videoView in
diff --git a/ios/Video/RCTVideoPlayerViewControllerDelegate.swift b/ios/Video/RCTVideoPlayerViewControllerDelegate.swift
index 2f9fec3f..acce37e4 100644
--- a/ios/Video/RCTVideoPlayerViewControllerDelegate.swift
+++ b/ios/Video/RCTVideoPlayerViewControllerDelegate.swift
@@ -1,7 +1,7 @@
import AVKit
import Foundation
-protocol RCTVideoPlayerViewControllerDelegate: class {
+protocol RCTVideoPlayerViewControllerDelegate: AnyObject {
func videoPlayerViewControllerWillDismiss(playerViewController: AVPlayerViewController)
func videoPlayerViewControllerDidDismiss(playerViewController: AVPlayerViewController)
}
diff --git a/ios/VideoCaching/RCTVideoCachingHandler.swift b/ios/VideoCaching/RCTVideoCachingHandler.swift
index aeab331a..061230d5 100644
--- a/ios/VideoCaching/RCTVideoCachingHandler.swift
+++ b/ios/VideoCaching/RCTVideoCachingHandler.swift
@@ -4,20 +4,20 @@ import Foundation
class RCTVideoCachingHandler: NSObject, DVAssetLoaderDelegatesDelegate {
private var _videoCache: RCTVideoCache! = RCTVideoCache.sharedInstance()
- var playerItemPrepareText: ((AVAsset?, NSDictionary?, String) async -> AVPlayerItem)?
+ var playerItemPrepareText: ((VideoSource, AVAsset?, NSDictionary?, String) async -> AVPlayerItem)?
override init() {
super.init()
}
- func shouldCache(source: VideoSource, textTracks: [TextTrack]?) -> Bool {
- if source.isNetwork && source.shouldCache && ((textTracks == nil) || (textTracks!.isEmpty)) {
+ func shouldCache(source: VideoSource) -> Bool {
+ if source.isNetwork && source.shouldCache && source.textTracks.isEmpty {
/* The DVURLAsset created by cache doesn't have a tracksWithMediaType property, so trying
* to bring in the text track code will crash. I suspect this is because the asset hasn't fully loaded.
* Until this is fixed, we need to bypass caching when text tracks are specified.
*/
DebugLog("""
- Caching is not supported for uri '\(source.uri)' because text tracks are not compatible with the cache.
+ Caching is not supported for uri '\(source.uri ?? "NO URI")' because text tracks are not compatible with the cache.
Checkout https://github.com/react-native-community/react-native-video/blob/master/docs/caching.md
""")
return true
@@ -25,7 +25,8 @@ class RCTVideoCachingHandler: NSObject, DVAssetLoaderDelegatesDelegate {
return false
}
- func playerItemForSourceUsingCache(uri: String!, assetOptions options: NSDictionary!) async throws -> AVPlayerItem {
+ func playerItemForSourceUsingCache(source: VideoSource, assetOptions options: NSDictionary) async throws -> AVPlayerItem {
+ let uri = source.uri!
let url = URL(string: uri)
let (videoCacheStatus, cachedAsset) = await getItemForUri(uri)
@@ -36,33 +37,33 @@ class RCTVideoCachingHandler: NSObject, DVAssetLoaderDelegatesDelegate {
switch videoCacheStatus {
case .missingFileExtension:
DebugLog("""
- Could not generate cache key for uri '\(uri ?? "NO_URI")'.
+ Could not generate cache key for uri '\(uri)'.
It is currently not supported to cache urls that do not include a file extension.
The video file will not be cached.
Checkout https://github.com/react-native-community/react-native-video/blob/master/docs/caching.md
""")
- let asset: AVURLAsset! = AVURLAsset(url: url!, options: options as! [String: Any])
- return await playerItemPrepareText(asset, options, "")
+ let asset: AVURLAsset! = AVURLAsset(url: url!, options: options as? [String: Any])
+ return await playerItemPrepareText(source, asset, options, "")
case .unsupportedFileExtension:
DebugLog("""
- Could not generate cache key for uri '\(uri ?? "NO_URI")'.
+ Could not generate cache key for uri '\(uri)'.
The file extension of that uri is currently not supported.
The video file will not be cached.
Checkout https://github.com/react-native-community/react-native-video/blob/master/docs/caching.md
""")
- let asset: AVURLAsset! = AVURLAsset(url: url!, options: options as! [String: Any])
- return await playerItemPrepareText(asset, options, "")
+ let asset: AVURLAsset! = AVURLAsset(url: url!, options: options as? [String: Any])
+ return await playerItemPrepareText(source, asset, options, "")
default:
if let cachedAsset {
- DebugLog("Playing back uri '\(uri ?? "NO_URI")' from cache")
+ DebugLog("Playing back uri '\(uri)' from cache")
// See note in playerItemForSource about not being able to support text tracks & caching
return AVPlayerItem(asset: cachedAsset)
}
}
- let asset: DVURLAsset! = DVURLAsset(url: url, options: options as! [String: Any], networkTimeout: 10000)
+ let asset: DVURLAsset! = DVURLAsset(url: url, options: options as? [String: Any], networkTimeout: 10000)
asset.loaderDelegate = self
/* More granular code to have control over the DVURLAsset
diff --git a/package.json b/package.json
index 8a9b5073..900ffd3c 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "react-native-video",
- "version": "6.4.2",
+ "version": "6.6.4",
"description": "A element for react-native",
"main": "lib/index",
"source": "src/index.ts",
diff --git a/src/Video.tsx b/src/Video.tsx
index b88aecbc..1da0bdb1 100644
--- a/src/Video.tsx
+++ b/src/Video.tsx
@@ -8,9 +8,17 @@ import React, {
} from 'react';
import type {ElementRef} from 'react';
import {View, StyleSheet, Image, Platform, processColor} from 'react-native';
-import type {StyleProp, ImageStyle, NativeSyntheticEvent} from 'react-native';
+import type {
+ StyleProp,
+ ImageStyle,
+ NativeSyntheticEvent,
+ ViewStyle,
+ ImageResizeMode,
+} from 'react-native';
-import NativeVideoComponent from './specs/VideoNativeComponent';
+import NativeVideoComponent, {
+ NativeCmcdConfiguration,
+} from './specs/VideoNativeComponent';
import type {
OnAudioFocusChangedData,
OnAudioTracksData,
@@ -37,12 +45,14 @@ import {
resolveAssetSourceForVideo,
} from './utils';
import NativeVideoManager from './specs/NativeVideoManager';
-import {ViewType, type VideoSaveData} from './types';
+import {type VideoSaveData, CmcdMode, ViewType} from './types';
import type {
OnLoadData,
OnTextTracksData,
OnReceiveAdEventData,
ReactVideoProps,
+ CmcdData,
+ ReactVideoSource,
} from './types';
export interface VideoRef {
@@ -56,6 +66,7 @@ export interface VideoRef {
) => void;
setVolume: (volume: number) => void;
setFullScreen: (fullScreen: boolean) => void;
+ setSource: (source?: ReactVideoSource) => void;
save: (options: object) => Promise | void;
getCurrentPosition: () => Promise;
}
@@ -66,8 +77,10 @@ const Video = forwardRef(
source,
style,
resizeMode,
- posterResizeMode,
poster,
+ posterResizeMode,
+ renderLoader,
+ contentStartTime,
drm,
textTracks,
selectedVideoTrack,
@@ -77,6 +90,8 @@ const Video = forwardRef(
useSecureView,
viewType,
shutterColor,
+ adTagUrl,
+ adLanguage,
onLoadStart,
onLoad,
onError,
@@ -107,82 +122,152 @@ const Video = forwardRef(
onTextTrackDataChanged,
onVideoTracks,
onAspectRatio,
+ localSourceEncryptionKeyScheme,
...rest
},
ref,
) => {
const nativeRef = useRef>(null);
- const [showPoster, setShowPoster] = useState(!!poster);
+
+ const isPosterDeprecated = typeof poster === 'string';
+
+ const _renderLoader = useMemo(
+ () =>
+ !renderLoader
+ ? undefined
+ : renderLoader instanceof Function
+ ? renderLoader
+ : () => renderLoader,
+ [renderLoader],
+ );
+
+ const hasPoster = useMemo(() => {
+ if (_renderLoader) {
+ return true;
+ }
+
+ if (isPosterDeprecated) {
+ return !!poster;
+ }
+
+ return !!poster?.source;
+ }, [isPosterDeprecated, poster, _renderLoader]);
+
+ const [showPoster, setShowPoster] = useState(hasPoster);
+
const [
_restoreUserInterfaceForPIPStopCompletionHandler,
setRestoreUserInterfaceForPIPStopCompletionHandler,
] = useState();
- const hasPoster = !!poster;
+ const sourceToUnternalSource = useCallback(
+ (_source?: ReactVideoSource) => {
+ if (!_source) {
+ return undefined;
+ }
+ const resolvedSource = resolveAssetSourceForVideo(_source);
+ let uri = resolvedSource.uri || '';
+ if (uri && uri.match(/^\//)) {
+ uri = `file://${uri}`;
+ }
+ if (!uri) {
+ console.log('Trying to load empty source');
+ }
+ const isNetwork = !!(uri && uri.match(/^(rtp|rtsp|http|https):/));
+ const isAsset = !!(
+ uri &&
+ uri.match(
+ /^(assets-library|ipod-library|file|content|ms-appx|ms-appdata):/,
+ )
+ );
- const posterStyle = useMemo>(
- () => ({
- ...StyleSheet.absoluteFillObject,
- resizeMode:
- posterResizeMode && posterResizeMode !== 'none'
- ? posterResizeMode
- : 'contain',
- }),
- [posterResizeMode],
+ const selectedDrm = _source.drm || drm;
+ const _textTracks = _source.textTracks || textTracks;
+ const _drm = !selectedDrm
+ ? undefined
+ : {
+ type: selectedDrm.type,
+ licenseServer: selectedDrm.licenseServer,
+ headers: generateHeaderForNative(selectedDrm.headers),
+ contentId: selectedDrm.contentId,
+ certificateUrl: selectedDrm.certificateUrl,
+ base64Certificate: selectedDrm.base64Certificate,
+ useExternalGetLicense: !!selectedDrm.getLicense,
+ multiDrm: selectedDrm.multiDrm,
+ localSourceEncryptionKeyScheme:
+ selectedDrm.localSourceEncryptionKeyScheme ||
+ localSourceEncryptionKeyScheme,
+ };
+
+ let _cmcd: NativeCmcdConfiguration | undefined;
+ if (Platform.OS === 'android' && source?.cmcd) {
+ const cmcd = source.cmcd;
+
+ if (typeof cmcd === 'boolean') {
+ _cmcd = cmcd ? {mode: CmcdMode.MODE_QUERY_PARAMETER} : undefined;
+ } else if (typeof cmcd === 'object' && !Array.isArray(cmcd)) {
+ const createCmcdHeader = (property?: CmcdData) =>
+ property ? generateHeaderForNative(property) : undefined;
+
+ _cmcd = {
+ mode: cmcd.mode ?? CmcdMode.MODE_QUERY_PARAMETER,
+ request: createCmcdHeader(cmcd.request),
+ session: createCmcdHeader(cmcd.session),
+ object: createCmcdHeader(cmcd.object),
+ status: createCmcdHeader(cmcd.status),
+ };
+ } else {
+ throw new Error(
+ 'Invalid CMCD configuration: Expected a boolean or an object.',
+ );
+ }
+ }
+
+ const selectedContentStartTime =
+ _source.contentStartTime || contentStartTime;
+
+ const _ad =
+ _source.ad ||
+ (adTagUrl || adLanguage
+ ? {adTagUrl: adTagUrl, adLanguage: adLanguage}
+ : undefined);
+
+ return {
+ uri,
+ isNetwork,
+ isAsset,
+ shouldCache: resolvedSource.shouldCache || false,
+ type: resolvedSource.type || '',
+ mainVer: resolvedSource.mainVer || 0,
+ patchVer: resolvedSource.patchVer || 0,
+ requestHeaders: generateHeaderForNative(resolvedSource.headers),
+ startPosition: resolvedSource.startPosition ?? -1,
+ cropStart: resolvedSource.cropStart || 0,
+ cropEnd: resolvedSource.cropEnd,
+ contentStartTime: selectedContentStartTime,
+ metadata: resolvedSource.metadata,
+ drm: _drm,
+ ad: _ad,
+ cmcd: _cmcd,
+ textTracks: _textTracks,
+ textTracksAllowChunklessPreparation:
+ resolvedSource.textTracksAllowChunklessPreparation,
+ };
+ },
+ [
+ adLanguage,
+ adTagUrl,
+ contentStartTime,
+ drm,
+ localSourceEncryptionKeyScheme,
+ source?.cmcd,
+ textTracks,
+ ],
);
const src = useMemo(() => {
- if (!source) {
- return undefined;
- }
- const resolvedSource = resolveAssetSourceForVideo(source);
- let uri = resolvedSource.uri || '';
- if (uri && uri.match(/^\//)) {
- uri = `file://${uri}`;
- }
- if (!uri) {
- console.log('Trying to load empty source');
- }
- const isNetwork = !!(uri && uri.match(/^(rtp|rtsp|http|https):/));
- const isAsset = !!(
- uri &&
- uri.match(
- /^(assets-library|ipod-library|file|content|ms-appx|ms-appdata):/,
- )
- );
-
- const selectedDrm = source.drm || drm;
- const _drm = !selectedDrm
- ? undefined
- : {
- type: selectedDrm.type,
- licenseServer: selectedDrm.licenseServer,
- headers: generateHeaderForNative(selectedDrm.headers),
- contentId: selectedDrm.contentId,
- certificateUrl: selectedDrm.certificateUrl,
- base64Certificate: selectedDrm.base64Certificate,
- useExternalGetLicense: !!selectedDrm.getLicense,
- multiDrm: selectedDrm.multiDrm,
- };
-
- return {
- uri,
- isNetwork,
- isAsset,
- shouldCache: resolvedSource.shouldCache || false,
- type: resolvedSource.type || '',
- mainVer: resolvedSource.mainVer || 0,
- patchVer: resolvedSource.patchVer || 0,
- requestHeaders: generateHeaderForNative(resolvedSource.headers),
- startPosition: resolvedSource.startPosition ?? -1,
- cropStart: resolvedSource.cropStart || 0,
- cropEnd: resolvedSource.cropEnd,
- metadata: resolvedSource.metadata,
- drm: _drm,
- textTracksAllowChunklessPreparation:
- resolvedSource.textTracksAllowChunklessPreparation,
- };
- }, [drm, source]);
+ return sourceToUnternalSource(source);
+ }, [sourceToUnternalSource, source]);
const _selectedTextTrack = useMemo(() => {
if (!selectedTextTrack) {
@@ -304,6 +389,16 @@ const Video = forwardRef(
);
}, []);
+ const setSource = useCallback(
+ (_source?: ReactVideoSource) => {
+ return NativeVideoManager.setSourceCmd(
+ getReactTag(nativeRef),
+ sourceToUnternalSource(_source),
+ );
+ },
+ [sourceToUnternalSource],
+ );
+
const presentFullscreenPlayer = useCallback(
() => setFullScreen(true),
[setFullScreen],
@@ -501,7 +596,8 @@ const Video = forwardRef(
[onControlsVisibilityChange],
);
- const usingExternalGetLicense = drm?.getLicense instanceof Function;
+ const selectedDrm = source?.drm || drm;
+ const usingExternalGetLicense = selectedDrm?.getLicense instanceof Function;
const onGetLicense = useCallback(
async (event: NativeSyntheticEvent) => {
@@ -509,33 +605,43 @@ const Video = forwardRef(
return;
}
const data = event.nativeEvent;
- let result;
- if (data?.spcBase64) {
- try {
- // Handles both scenarios, getLicenseOverride being a promise and not.
- const license = await drm.getLicense(
+ try {
+ if (!data?.spcBase64) {
+ throw new Error('No spc received');
+ }
+ // Handles both scenarios, getLicenseOverride being a promise and not.
+ const license = await Promise.resolve(
+ selectedDrm.getLicense(
data.spcBase64,
data.contentId,
data.licenseUrl,
data.loadedLicenseUrl,
- );
- result =
- typeof license === 'string' ? license : 'Empty license result';
- } catch {
- result = 'fetch error';
+ ),
+ ).catch(() => {
+ throw new Error('fetch error');
+ });
+ if (typeof license !== 'string') {
+ throw Error('Empty license result');
+ }
+ if (nativeRef.current) {
+ NativeVideoManager.setLicenseResultCmd(
+ getReactTag(nativeRef),
+ license,
+ data.loadedLicenseUrl,
+ );
+ }
+ } catch (e) {
+ const msg = e instanceof Error ? e.message : 'fetch error';
+ if (nativeRef.current) {
+ NativeVideoManager.setLicenseResultErrorCmd(
+ getReactTag(nativeRef),
+ msg,
+ data.loadedLicenseUrl,
+ );
}
- } else {
- result = 'No spc received';
- }
- if (nativeRef.current) {
- NativeVideoManager.setLicenseResultErrorCmd(
- getReactTag(nativeRef),
- result,
- data.loadedLicenseUrl,
- );
}
},
- [drm, usingExternalGetLicense],
+ [selectedDrm, usingExternalGetLicense],
);
useImperativeHandle(
@@ -551,6 +657,7 @@ const Video = forwardRef(
setVolume,
getCurrentPosition,
setFullScreen,
+ setSource,
}),
[
seek,
@@ -563,6 +670,7 @@ const Video = forwardRef(
setVolume,
getCurrentPosition,
setFullScreen,
+ setSource,
],
);
@@ -573,42 +681,120 @@ const Video = forwardRef(
const shallForceViewType =
hasValidDrmProp && (viewType === ViewType.TEXTURE || useTextureView);
- if (shallForceViewType) {
- console.warn(
- 'cannot use DRM on texture view. please set useTextureView={false}',
- );
- }
if (useSecureView && useTextureView) {
console.warn(
'cannot use SecureView on texture view. please set useTextureView={false}',
);
}
- return shallForceViewType
- ? useSecureView
- ? ViewType.SURFACE_SECURE
- : ViewType.SURFACE // check if we should force the type to Surface due to DRM
- : viewType
- ? viewType // else use ViewType from source
- : useSecureView // else infer view type from useSecureView and useTextureView
- ? ViewType.SURFACE_SECURE
- : useTextureView
- ? ViewType.TEXTURE
- : ViewType.SURFACE;
+ if (shallForceViewType) {
+ console.warn(
+ 'cannot use DRM on texture view. please set useTextureView={false}',
+ );
+ return useSecureView ? ViewType.SURFACE_SECURE : ViewType.SURFACE;
+ }
+
+ if (viewType !== undefined && viewType !== null) {
+ return viewType;
+ }
+
+ if (useSecureView) {
+ return ViewType.SURFACE_SECURE;
+ }
+
+ if (useTextureView) {
+ return ViewType.TEXTURE;
+ }
+
+ return ViewType.SURFACE;
}, [drm, useSecureView, useTextureView, viewType]);
+ const _renderPoster = useCallback(() => {
+ if (!hasPoster || !showPoster) {
+ return null;
+ }
+
+ // poster resize mode
+ let _posterResizeMode: ImageResizeMode = 'contain';
+
+ if (!isPosterDeprecated && poster?.resizeMode) {
+ _posterResizeMode = poster.resizeMode;
+ } else if (posterResizeMode && posterResizeMode !== 'none') {
+ _posterResizeMode = posterResizeMode;
+ }
+
+ // poster style
+ const baseStyle: StyleProp = {
+ ...StyleSheet.absoluteFillObject,
+ resizeMode: _posterResizeMode,
+ };
+
+ let posterStyle: StyleProp = baseStyle;
+
+ if (!isPosterDeprecated && poster?.style) {
+ const styles = Array.isArray(poster.style)
+ ? poster.style
+ : [poster.style];
+ posterStyle = [baseStyle, ...styles];
+ }
+
+ // render poster
+ if (_renderLoader && (poster || posterResizeMode)) {
+ console.warn(
+ 'You provided both `renderLoader` and `poster` or `posterResizeMode` props. `renderLoader` will be used.',
+ );
+ }
+
+ // render loader
+ if (_renderLoader) {
+ return (
+
+ {_renderLoader({
+ source: source,
+ style: posterStyle,
+ resizeMode: resizeMode,
+ })}
+
+ );
+ }
+
+ return (
+
+ );
+ }, [
+ hasPoster,
+ isPosterDeprecated,
+ poster,
+ posterResizeMode,
+ _renderLoader,
+ showPoster,
+ source,
+ resizeMode,
+ ]);
+
+ const _style: StyleProp = useMemo(
+ () => ({
+ ...StyleSheet.absoluteFillObject,
+ ...(showPoster ? {display: 'none'} : {}),
+ }),
+ [showPoster],
+ );
+
return (
(
}
viewType={_viewType}
/>
- {hasPoster && showPoster ? (
-
- ) : null}
+ {_renderPoster()}
);
},
diff --git a/src/Video.web.tsx b/src/Video.web.tsx
index 85f71a92..ca37e049 100644
--- a/src/Video.web.tsx
+++ b/src/Video.web.tsx
@@ -236,6 +236,7 @@ const Video = forwardRef(
controls={controls}
loop={repeat}
playsInline
+ //@ts-ignore
poster={poster}
onCanPlay={() => onBuffer?.({isBuffering: false})}
onWaiting={() => onBuffer?.({isBuffering: true})}
diff --git a/src/expo-plugins/withBackgroundAudio.ts b/src/expo-plugins/withBackgroundAudio.ts
index abaf8e5d..fe9a6121 100644
--- a/src/expo-plugins/withBackgroundAudio.ts
+++ b/src/expo-plugins/withBackgroundAudio.ts
@@ -13,7 +13,7 @@ export const withBackgroundAudio: ConfigPlugin = (
if (enableBackgroundAudio) {
if (!modes.includes('audio')) {
- modes.push('audio');
+ config.modResults.UIBackgroundModes = [...modes, 'audio'];
}
} else {
config.modResults.UIBackgroundModes = modes.filter(
diff --git a/src/expo-plugins/withNotificationControls.ts b/src/expo-plugins/withNotificationControls.ts
index 8c76f814..df204eeb 100644
--- a/src/expo-plugins/withNotificationControls.ts
+++ b/src/expo-plugins/withNotificationControls.ts
@@ -24,6 +24,19 @@ export const withNotificationControls: ConfigPlugin = (
application.service = [];
}
+ // We check if the VideoPlaybackService is already defined in the AndroidManifest.xml
+ // to prevent adding duplicate service entries. If the service exists, we will remove
+ // it before adding the updated configuration to ensure there are no conflicts or redundant
+ // service declarations in the manifest.
+ const existingServiceIndex = application.service.findIndex(
+ (service) =>
+ service?.$?.['android:name'] ===
+ 'com.brentvatne.exoplayer.VideoPlaybackService',
+ );
+ if (existingServiceIndex !== -1) {
+ application.service.splice(existingServiceIndex, 1);
+ }
+
application.service.push({
$: {
'android:name': 'com.brentvatne.exoplayer.VideoPlaybackService',
diff --git a/src/index.ts b/src/index.ts
index 0975a390..0a70f0f5 100644
--- a/src/index.ts
+++ b/src/index.ts
@@ -1,4 +1,5 @@
import Video from './Video';
export {VideoDecoderProperties} from './VideoDecoderProperties';
export * from './types';
+export {Video};
export default Video;
diff --git a/src/specs/NativeVideoManager.ts b/src/specs/NativeVideoManager.ts
index e508ac7f..a7dde175 100644
--- a/src/specs/NativeVideoManager.ts
+++ b/src/specs/NativeVideoManager.ts
@@ -21,6 +21,7 @@ export interface VideoManagerType {
licenseUrl: string,
) => Promise;
setFullScreenCmd: (reactTag: Int32, fullScreen: boolean) => Promise;
+ setSourceCmd: (reactTag: Int32, source?: UnsafeObject) => Promise;
setVolumeCmd: (reactTag: Int32, volume: number) => Promise;
save: (reactTag: Int32, option: UnsafeObject) => Promise;
getCurrentPosition: (reactTag: Int32) => Promise;
diff --git a/src/specs/VideoNativeComponent.ts b/src/specs/VideoNativeComponent.ts
index 29831c00..0600b9da 100644
--- a/src/specs/VideoNativeComponent.ts
+++ b/src/specs/VideoNativeComponent.ts
@@ -26,6 +26,11 @@ type VideoMetadata = Readonly<{
imageUri?: string;
}>;
+export type AdsConfig = Readonly<{
+ adTagUrl?: string;
+ adLanguage?: string;
+}>;
+
export type VideoSrc = Readonly<{
uri?: string;
isNetwork?: boolean;
@@ -38,9 +43,13 @@ export type VideoSrc = Readonly<{
startPosition?: Float;
cropStart?: Float;
cropEnd?: Float;
+ contentStartTime?: Int32; // Android
metadata?: VideoMetadata;
drm?: Drm;
+ cmcd?: NativeCmcdConfiguration; // android
textTracksAllowChunklessPreparation?: boolean; // android
+ textTracks?: TextTracks;
+ ad?: AdsConfig;
}>;
type DRMType = WithDefault;
@@ -59,6 +68,16 @@ type Drm = Readonly<{
base64Certificate?: boolean; // ios default: false
useExternalGetLicense?: boolean; // ios
multiDrm?: WithDefault; // android
+ localSourceEncryptionKeyScheme?: string; // ios
+}>;
+
+type CmcdMode = WithDefault;
+export type NativeCmcdConfiguration = Readonly<{
+ mode?: CmcdMode; // default: MODE_QUERY_PARAMETER
+ request?: Headers;
+ session?: Headers;
+ object?: Headers;
+ status?: Headers;
}>;
type TextTracks = ReadonlyArray<
@@ -121,6 +140,7 @@ type SubtitleStyle = Readonly<{
paddingLeft?: WithDefault;
paddingRight?: WithDefault;
opacity?: WithDefault;
+ subtitlesFollowVideo?: WithDefault;
}>;
type OnLoadData = Readonly<{
@@ -283,8 +303,20 @@ export type OnAudioFocusChangedData = Readonly<{
}>;
type ControlsStyles = Readonly<{
- hideSeekBar?: boolean;
+ hidePosition?: WithDefault;
+ hidePlayPause?: WithDefault;
+ hideForward?: WithDefault;
+ hideRewind?: WithDefault;
+ hideNext?: WithDefault;
+ hidePrevious?: WithDefault;
+ hideFullscreen?: WithDefault;
+ hideSeekBar?: WithDefault;
+ hideDuration?: WithDefault;
+ hideNavigationBarOnFullScreenMode?: WithDefault;
+ hideNotificationBarOnFullScreenMode?: WithDefault;
+ hideSettingButton?: WithDefault;
seekIncrementMS?: Int32;
+ liveLabel?: string;
}>;
export type OnControlsVisibilityChange = Readonly<{
@@ -293,7 +325,6 @@ export type OnControlsVisibilityChange = Readonly<{
export interface VideoNativeProps extends ViewProps {
src?: VideoSrc;
- adTagUrl?: string;
allowsExternalPlayback?: boolean; // ios, true
disableFocus?: boolean; // android
maxBitRate?: Float;
@@ -302,7 +333,6 @@ export interface VideoNativeProps extends ViewProps {
automaticallyWaitsToMinimizeStalling?: boolean;
shutterColor?: Int32;
audioOutput?: WithDefault;
- textTracks?: TextTracks;
selectedTextTrack?: SelectedTextTrack;
selectedAudioTrack?: SelectedAudioTrack;
selectedVideoTrack?: SelectedVideoTrack; // android
@@ -325,11 +355,9 @@ export interface VideoNativeProps extends ViewProps {
fullscreenOrientation?: WithDefault;
progressUpdateInterval?: Float;
restoreUserInterfaceForPIPStopCompletionHandler?: boolean;
- localSourceEncryptionKeyScheme?: string;
debug?: DebugConfig;
showNotificationControls?: WithDefault; // Android, iOS
bufferConfig?: BufferConfig; // Android
- contentStartTime?: Int32; // Android
currentPlaybackTime?: Double; // Android
disableDisconnectError?: boolean; // Android
focusable?: boolean; // Android
diff --git a/src/types/video.ts b/src/types/video.ts
index 1dbdc9f1..ff965bc5 100644
--- a/src/types/video.ts
+++ b/src/types/video.ts
@@ -1,6 +1,15 @@
import type {ISO639_1} from './language';
import type {ReactVideoEvents} from './events';
-import type {StyleProp, ViewProps, ViewStyle} from 'react-native';
+import type {
+ ImageProps,
+ StyleProp,
+ ViewProps,
+ ViewStyle,
+ ImageRequireSource,
+ ImageURISource,
+ ImageStyle,
+} from 'react-native';
+import type {ReactNode} from 'react';
import type VideoResizeMode from './ResizeMode';
import type FilterType from './FilterType';
import type ViewType from './ViewType';
@@ -23,9 +32,13 @@ export type ReactVideoSourceProperties = {
startPosition?: number;
cropStart?: number;
cropEnd?: number;
+ contentStartTime?: number; // Android
metadata?: VideoMetadata;
drm?: Drm;
+ cmcd?: Cmcd; // android
textTracksAllowChunklessPreparation?: boolean;
+ textTracks?: TextTracks;
+ ad?: AdConfig;
};
export type ReactVideoSource = Readonly<
@@ -34,6 +47,13 @@ export type ReactVideoSource = Readonly<
}
>;
+export type ReactVideoPosterSource = ImageURISource | ImageRequireSource;
+
+export type ReactVideoPoster = Omit & {
+ // prevents giving source in the array
+ source?: ReactVideoPosterSource;
+};
+
export type VideoMetadata = Readonly<{
title?: string;
subtitle?: string;
@@ -54,6 +74,11 @@ export enum DRMType {
FAIRPLAY = 'fairplay',
}
+export type AdConfig = Readonly<{
+ adTagUrl?: string;
+ adLanguage?: ISO639_1;
+}>;
+
export type Drm = Readonly<{
type?: DRMType;
licenseServer?: string;
@@ -62,6 +87,7 @@ export type Drm = Readonly<{
certificateUrl?: string; // ios
base64Certificate?: boolean; // ios default: false
multiDrm?: boolean; // android
+ localSourceEncryptionKeyScheme?: string; // ios
/* eslint-disable @typescript-eslint/no-unused-vars */
getLicense?: (
spcBase64: string,
@@ -72,6 +98,27 @@ export type Drm = Readonly<{
/* eslint-enable @typescript-eslint/no-unused-vars */
}>;
+export enum CmcdMode {
+ MODE_REQUEST_HEADER = 0,
+ MODE_QUERY_PARAMETER = 1,
+}
+/**
+ * Custom key names MUST carry a hyphenated prefix to ensure that there will not be a
+ * namespace collision with future revisions to this specification. Clients SHOULD
+ * use a reverse-DNS syntax when defining their own prefix.
+ *
+ * @see https://cdn.cta.tech/cta/media/media/resources/standards/pdfs/cta-5004-final.pdf CTA-5004 Specification (Page 6, Section 3.1)
+ */
+export type CmcdData = Record<`${string}-${string}`, string | number>;
+export type CmcdConfiguration = Readonly<{
+ mode?: CmcdMode; // default: MODE_QUERY_PARAMETER
+ request?: CmcdData;
+ session?: CmcdData;
+ object?: CmcdData;
+ status?: CmcdData;
+}>;
+export type Cmcd = boolean | CmcdConfiguration;
+
export enum BufferingStrategyType {
DEFAULT = 'Default',
DISABLE_BUFFERING = 'DisableBuffering',
@@ -131,6 +178,7 @@ export type SubtitleStyle = {
paddingLeft?: number;
paddingRight?: number;
opacity?: number;
+ subtitlesFollowVideo?: boolean;
};
export enum TextTrackType {
@@ -208,20 +256,42 @@ export type AudioOutput = 'speaker' | 'earpiece';
export type ControlsStyles = {
hideSeekBar?: boolean;
+ hideDuration?: boolean;
+ hidePosition?: boolean;
+ hidePlayPause?: boolean;
+ hideForward?: boolean;
+ hideRewind?: boolean;
+ hideNext?: boolean;
+ hidePrevious?: boolean;
+ hideFullscreen?: boolean;
+ hideNavigationBarOnFullScreenMode?: boolean;
+ hideNotificationBarOnFullScreenMode?: boolean;
+ hideSettingButton?: boolean;
seekIncrementMS?: number;
+ liveLabel?: string;
};
+export interface ReactVideoRenderLoaderProps {
+ source?: ReactVideoSource;
+ style?: StyleProp;
+ resizeMode?: EnumValues;
+}
+
export interface ReactVideoProps extends ReactVideoEvents, ViewProps {
source?: ReactVideoSource;
- /** @deprecated */
+ /** @deprecated Use source.drm */
drm?: Drm;
style?: StyleProp;
+ /** @deprecated Use source.ad.adTagUrl */
adTagUrl?: string;
+ /** @deprecated Use source.ad.adLanguage */
+ adLanguage?: ISO639_1;
audioOutput?: AudioOutput; // Mobile
automaticallyWaitsToMinimizeStalling?: boolean; // iOS
bufferConfig?: BufferConfig; // Android
bufferingStrategy?: BufferingStrategyType;
chapters?: Chapters[]; // iOS
+ /** @deprecated Use source.contentStartTime */
contentStartTime?: number; // Android
controls?: boolean;
currentPlaybackTime?: number; // Android
@@ -243,12 +313,14 @@ export interface ReactVideoProps extends ReactVideoEvents, ViewProps {
pictureInPicture?: boolean; // iOS
playInBackground?: boolean;
playWhenInactive?: boolean; // iOS
- poster?: string;
+ poster?: string | ReactVideoPoster; // string is deprecated
+ /** @deprecated use **resizeMode** key in **poster** props instead */
posterResizeMode?: EnumValues;
preferredForwardBufferDuration?: number; // iOS
preventsDisplaySleepDuringVideoPlayback?: boolean;
progressUpdateInterval?: number;
rate?: number;
+ renderLoader?: ReactNode | ((arg0: ReactVideoRenderLoaderProps) => ReactNode);
repeat?: boolean;
reportBandwidth?: boolean; //Android
resizeMode?: EnumValues;
@@ -258,14 +330,16 @@ export interface ReactVideoProps extends ReactVideoEvents, ViewProps {
selectedVideoTrack?: SelectedVideoTrack; // android
subtitleStyle?: SubtitleStyle; // android
shutterColor?: string; // Android
+ /** @deprecated Use source.textTracks */
textTracks?: TextTracks;
testID?: string;
viewType?: ViewType;
- /** @deprecated */
+ /** @deprecated Use viewType */
useTextureView?: boolean; // Android
- /** @deprecated */
+ /** @deprecated Use viewType*/
useSecureView?: boolean; // Android
volume?: number;
+ /** @deprecated use **localSourceEncryptionKeyScheme** key in **drm** props instead */
localSourceEncryptionKeyScheme?: string;
debug?: DebugConfig;
allowsExternalPlayback?: boolean; // iOS