-
Notifications
You must be signed in to change notification settings - Fork 4
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Repo improvement #66
Repo improvement #66
Conversation
WalkthroughThe changes in this pull request primarily involve updates to various Dart package references in the Changes
Possibly related PRs
Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media? 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 4
🧹 Outside diff range and nitpick comments (3)
.github/workflows/android_deploy.yml (3)
Line range hint
29-36
: Enhance security for sensitive file handlingWhile the secret handling is comprehensive, consider adding validation and cleanup steps for sensitive files.
Add validation and cleanup:
run: | cd app echo $FIREBASE_OPTIONS_BASE64 | base64 -di > lib/firebase_options.dart + [ -s lib/firebase_options.dart ] || exit 1 # Validate file exists and is not empty echo $GOOGLE_SERVICES_JSON_BASE64 | base64 -di > android/app/google-services.json + [ -s android/app/google-services.json ] || exit 1 echo $FIREBASE_JSON_BASE64 | base64 --decode > firebase.json + [ -s firebase.json ] || exit 1 cd ../data echo $APP_SECRETS_BASE64 | base64 --decode > lib/apis/network/secrets.dart + [ -s lib/apis/network/secrets.dart ] || exit 1And at the end of the workflow:
bundle exec fastlane upload_internal versionName:$buildName versionCode:$buildNumber +# Cleanup sensitive files +rm -f lib/firebase_options.dart android/app/google-services.json firebase.json ../data/lib/apis/network/secrets.dart ../../release.keystore google_play_api_key.jsonAlso applies to: 64-68
Line range hint
71-82
: Improve version handling robustnessThe current version handling lacks validation and error handling which could lead to deployment failures.
Add validation and error handling:
cd app -file='VERSION' -fileData=`cat $file` -IFS='.' -read -a versionValue <<< "$fileData" -buildNumber=$(( ${versionValue[0]} * 1000000 + ${versionValue[1]} * 10000 + ${{ github.run_number }} )) -IFS='' -buildName="${versionValue[0]}.${versionValue[1]}.${{ github.run_number }}" +VERSION_FILE='VERSION' +if [ ! -f "$VERSION_FILE" ]; then + echo "Error: VERSION file not found" + exit 1 +fi + +# Validate version format (expecting X.Y format) +if ! grep -qE '^[0-9]+\.[0-9]+$' "$VERSION_FILE"; then + echo "Error: Invalid version format in VERSION file. Expected format: X.Y" + exit 1 +fi + +fileData=$(cat "$VERSION_FILE") +IFS='.' read -r major minor <<< "$fileData" + +# Validate number ranges +if [ "$major" -gt 999 ] || [ "$minor" -gt 999 ] || [ ${{ github.run_number }} -gt 9999 ]; then + echo "Error: Version numbers exceed maximum allowed values" + exit 1 +fi + +buildNumber=$(( major * 1000000 + minor * 10000 + ${{ github.run_number }} )) +buildName="${major}.${minor}.${{ github.run_number }}"
Line range hint
56-63
: Optimize workflow performance and reliabilityThe current sequential package preparation could be optimized for better performance and reliability.
Consider these improvements:
- Use GitHub Actions' built-in retry mechanism for network operations:
- name: Install dependencies uses: nick-fields/retry@v2 with: timeout_minutes: 10 max_attempts: 3 command: | cd app && flutter clean && flutter pub get cd ../data && flutter clean && flutter pub get cd ../style && flutter clean && flutter pub get
- Consider using a composite action to reduce duplication:
# .github/actions/flutter-setup/action.yml name: 'Setup Flutter Package' inputs: package-path: required: true runs: using: 'composite' steps: - run: | cd ${{ inputs.package-path }} flutter clean flutter pub get shell: bashThis would make the workflow more maintainable and reliable.
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (4)
.github/workflows/android_deploy.yml
(1 hunks).idea/libraries/Dart_Packages.xml
(0 hunks)app/lib/ui/flow/media_preview/components/network_image_preview/network_image_preview_view_model.dart
(1 hunks)data/lib/repositories/media_process_repository.dart
(1 hunks)
💤 Files with no reviewable changes (1)
- .idea/libraries/Dart_Packages.xml
.github/workflows/android_deploy.yml
Outdated
branches: | ||
- main | ||
workflow_dispatch: | ||
on: push |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Restrict workflow trigger to production branches only
The current trigger configuration will run the Play Store deployment on any push to any branch, which could lead to unintended deployments. For production deployments, it's crucial to have controlled triggers.
Consider using this more restrictive configuration:
-on: push
+on:
+ push:
+ branches:
+ - main # or your production branch
+ - release/* # for release branches if applicable
+ workflow_dispatch: # for manual triggers when needed
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
on: push | |
on: | |
push: | |
branches: | |
- main # or your production branch | |
- release/* # for release branches if applicable | |
workflow_dispatch: # for manual triggers when needed |
void dispose() async { | ||
if (tempFile != null && await tempFile!.exists()) { | ||
await tempFile!.delete(); | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Consider calling super.dispose() first
While the async file cleanup is a good improvement, calling super.dispose()
after async operations can be problematic as the parent class might be disposed while operations are still pending.
Consider this refactor:
-void dispose() async {
+@override
+Future<void> dispose() async {
+ super.dispose();
if (tempFile != null && await tempFile!.exists()) {
await tempFile!.delete();
}
cancelToken?.cancel();
- super.dispose();
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
void dispose() async { | |
if (tempFile != null && await tempFile!.exists()) { | |
await tempFile!.delete(); | |
} | |
@override | |
Future<void> dispose() async { | |
super.dispose(); | |
if (tempFile != null && await tempFile!.exists()) { | |
await tempFile!.delete(); | |
} | |
cancelToken?.cancel(); | |
} |
rethrow; | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🛠️ Refactor suggestion
Maintain consistent error handling across providers
The error handling differs between Google Drive and Dropbox downloads. While Google Drive rethrows the error, Dropbox silently handles it. This inconsistency could lead to different behavior depending on the provider.
Consider applying the same error handling pattern to both providers. Either:
- Add rethrow to Dropbox download (if errors need to be handled by callers)
- Remove rethrow from Google Drive download (if errors should be handled locally)
The choice depends on whether the calling code needs to handle these errors.
Fix error handling flow
The rethrow
statement is placed before the error notification and status update, which means these important error handling steps will never execute. This could leave the UI in an inconsistent state and the user uninformed about the failure.
Consider this fix:
} catch (error) {
if (error is DioException && error.type == DioExceptionType.cancel) {
showNotification('Download from Google Drive cancelled');
return;
}
- rethrow;
-
showNotification('Failed to download from Google Drive');
await updateDownloadProcessStatus(
status: MediaQueueProcessStatus.failed,
id: process.id,
);
+ rethrow;
}
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
rethrow; | |
if (error is DioException && error.type == DioExceptionType.cancel) { | |
showNotification('Download from Google Drive cancelled'); | |
return; | |
} | |
showNotification('Failed to download from Google Drive'); | |
await updateDownloadProcessStatus( | |
status: MediaQueueProcessStatus.failed, | |
id: process.id, | |
); | |
rethrow; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
🧹 Outside diff range and nitpick comments (2)
.github/workflows/ios_deploy.yml (2)
Line range hint
82-91
: Consider implementing semantic versioning checksThe current version management reads from a VERSION file and constructs the build number using a formula. While functional, it could benefit from additional validation and semantic versioning enforcement.
Consider adding version validation before deployment:
run: | cd app file='VERSION' fileData=`cat $file` + # Validate semantic versioning format + if ! [[ $fileData =~ ^[0-9]+\.[0-9]+$ ]]; then + echo "Error: VERSION file must contain semantic version (X.Y)" + exit 1 + fi IFS='.' read -a versionValue <<< "$fileData" buildNumber=$(( ${versionValue[0]} * 1000000 + ${versionValue[1]} * 10000 + ${{ github.run_number }} ))
Line range hint
93-96
: Add post-deployment notification stepFor better visibility and tracking of deployments, consider adding a notification step after successful deployment.
Add a notification step after the publish step:
- name: Notify deployment status if: always() run: | VERSION=$(cat app/VERSION) BUILD_NUMBER=${{ github.run_number }} if [ "${{ job.status }}" = "success" ]; then echo "Successfully deployed version $VERSION (build $BUILD_NUMBER) to App Store Connect" else echo "Failed to deploy version $VERSION (build $BUILD_NUMBER) to App Store Connect" fi
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
.github/workflows/ios_deploy.yml
(1 hunks)
🔇 Additional comments (1)
.github/workflows/ios_deploy.yml (1)
Line range hint 31-41
: Verify the security of secret handling
The workflow handles multiple sensitive base64-encoded secrets. Let's verify their security configuration.
✅ Verification successful
Let me try another verification approach to check the security configuration of these secrets.
Secrets handling follows secure practices
The verification shows that:
- All secrets are properly referenced using GitHub's secure
${{ secrets.* }}
syntax - Secrets are only used for their intended purpose of decoding base64 content into configuration files
- No secrets are exposed in conditions or debug outputs
- Base64 decoding is done directly to files without intermediate storage
- The same secure pattern is consistently used across all workflow files
🏁 Scripts executed
The following scripts were executed for the analysis:
Script:
#!/bin/bash
# Description: Check if secrets are properly configured and not exposed in workflow runs
# Check if the repository has the required secrets configured
gh api repos/canopas/cloud-gallery/actions/secrets | jq -r '.secrets[] | select(.name | match("FIREBASE_|APP_STORE_|DIST_")) | .name' || echo "Failed to fetch secrets"
# Check recent workflow runs for any exposed secrets
gh run list --workflow=ios_deploy.yml --json conclusion,databaseId --jq '.[] | select(.conclusion=="success") | .databaseId' | head -n 5 | while read -r run_id; do
gh run view "$run_id" --log | grep -i "warning about secrets" || true
done
Length of output: 910
Script:
#!/bin/bash
# Check the workflow file for proper secret handling practices
rg -U "secrets\." .github/workflows/ios_deploy.yml
# Check if secrets are used in conditions or exposed in debug/output commands
rg "if.*secrets\.|echo.*secrets\." .github/workflows/
# Check for any direct base64 output or debug steps
rg "base64.*>" .github/workflows/
Length of output: 4407
branches: | ||
- main | ||
workflow_dispatch: | ||
on: push |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Critical: Restrict deployment triggers to production-ready branches
The current trigger configuration will run the deployment workflow on any push to any branch, which could lead to unintended deployments to App Store Connect. This is particularly risky for a production deployment workflow.
Consider restricting the workflow to run only on production-ready branches and tags:
-on: push
+on:
+ push:
+ branches:
+ - main
+ - release/*
+ tags:
+ - 'v*'
+ workflow_dispatch: # Allow manual triggers for flexibility
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
on: push | |
on: | |
push: | |
branches: | |
- main | |
- release/* | |
tags: | |
- 'v*' | |
workflow_dispatch: # Allow manual triggers for flexibility |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (5)
app/lib/ui/flow/home/home_screen_view_model.dart
(2 hunks)data/.flutter-plugins
(1 hunks)data/.flutter-plugins-dependencies
(1 hunks)data/lib/repositories/media_process_repository.dart
(2 hunks)data/pubspec.yaml
(1 hunks)
✅ Files skipped from review due to trivial changes (1)
- data/.flutter-plugins
🚧 Files skipped from review as they are similar to previous changes (1)
- data/lib/repositories/media_process_repository.dart
🔇 Additional comments (3)
data/pubspec.yaml (1)
22-22
: Ensure firebase_crashlytics
dependency version is up-to-date
Please verify that the specified version ^4.2.0
of firebase_crashlytics
is the latest stable version and is compatible with your project's dependencies. This helps avoid potential conflicts and ensures you have the latest features and security updates.
app/lib/ui/flow/home/home_screen_view_model.dart (2)
12-12
: Import statement correctly added
The import for firebase_crashlytics
is added appropriately.
520-520
:
Ensure no sensitive data is sent to Crashlytics
When recording errors using FirebaseCrashlytics.instance.recordError(e, s);
, please ensure that e
and s
do not contain any personally identifiable information (PII) or sensitive user data to comply with privacy regulations.
{"info":"This is a generated file; do not edit or check into version control.","plugins":{"ios":[{"name":"firebase_core","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/firebase_core-3.8.1/","native_build":true,"dependencies":[]},{"name":"firebase_crashlytics","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/firebase_crashlytics-4.2.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"flutter_local_notifications","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/flutter_local_notifications-18.0.1/","native_build":true,"dependencies":[]},{"name":"google_sign_in_ios","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/google_sign_in_ios-5.7.8/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/package_info_plus-8.1.1/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.0/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"photo_manager","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/photo_manager-3.6.2/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"sqflite_darwin","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.1/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_ios","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/url_launcher_ios-6.3.2/","native_build":true,"dependencies":[]}],"android":[{"name":"firebase_core","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/firebase_core-3.8.1/","native_build":true,"dependencies":[]},{"name":"firebase_crashlytics","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/firebase_crashlytics-4.2.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"flutter_local_notifications","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/flutter_local_notifications-18.0.1/","native_build":true,"dependencies":[]},{"name":"google_sign_in_android","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/google_sign_in_android-6.1.33/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/package_info_plus-8.1.1/","native_build":true,"dependencies":[]},{"name":"path_provider_android","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/path_provider_android-2.2.12/","native_build":true,"dependencies":[]},{"name":"photo_manager","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/photo_manager-3.6.2/","native_build":true,"dependencies":[]},{"name":"shared_preferences_android","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/shared_preferences_android-2.3.3/","native_build":true,"dependencies":[]},{"name":"sqflite_android","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/sqflite_android-2.4.0/","native_build":true,"dependencies":[]},{"name":"url_launcher_android","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/url_launcher_android-6.3.14/","native_build":true,"dependencies":[]}],"macos":[{"name":"firebase_core","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/firebase_core-3.8.1/","native_build":true,"dependencies":[]},{"name":"firebase_crashlytics","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/firebase_crashlytics-4.2.0/","native_build":true,"dependencies":["firebase_core"]},{"name":"flutter_local_notifications","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/flutter_local_notifications-18.0.1/","native_build":true,"dependencies":[]},{"name":"google_sign_in_ios","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/google_sign_in_ios-5.7.8/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/package_info_plus-8.1.1/","native_build":true,"dependencies":[]},{"name":"path_provider_foundation","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/path_provider_foundation-2.4.0/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"photo_manager","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/photo_manager-3.6.2/","native_build":true,"dependencies":[]},{"name":"shared_preferences_foundation","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/shared_preferences_foundation-2.5.3/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"sqflite_darwin","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/sqflite_darwin-2.4.1/","shared_darwin_source":true,"native_build":true,"dependencies":[]},{"name":"url_launcher_macos","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/url_launcher_macos-3.2.2/","native_build":true,"dependencies":[]}],"linux":[{"name":"flutter_local_notifications_linux","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/flutter_local_notifications_linux-5.0.0/","native_build":false,"dependencies":[]},{"name":"package_info_plus","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/package_info_plus-8.1.1/","native_build":false,"dependencies":[]},{"name":"path_provider_linux","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/path_provider_linux-2.2.1/","native_build":false,"dependencies":[]},{"name":"shared_preferences_linux","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/shared_preferences_linux-2.4.1/","native_build":false,"dependencies":["path_provider_linux"]},{"name":"url_launcher_linux","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/url_launcher_linux-3.2.1/","native_build":true,"dependencies":[]}],"windows":[{"name":"firebase_core","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/firebase_core-3.8.1/","native_build":true,"dependencies":[]},{"name":"package_info_plus","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/package_info_plus-8.1.1/","native_build":false,"dependencies":[]},{"name":"path_provider_windows","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/path_provider_windows-2.3.0/","native_build":false,"dependencies":[]},{"name":"shared_preferences_windows","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/shared_preferences_windows-2.4.1/","native_build":false,"dependencies":["path_provider_windows"]},{"name":"url_launcher_windows","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/url_launcher_windows-3.1.3/","native_build":true,"dependencies":[]}],"web":[{"name":"firebase_core_web","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/firebase_core_web-2.18.2/","dependencies":[]},{"name":"google_sign_in_web","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/google_sign_in_web-0.12.4+3/","dependencies":[]},{"name":"package_info_plus","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/package_info_plus-8.1.1/","dependencies":[]},{"name":"shared_preferences_web","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/shared_preferences_web-2.4.2/","dependencies":[]},{"name":"url_launcher_web","path":"/Users/pratikcanopas/.pub-cache/hosted/pub.dev/url_launcher_web-2.3.3/","dependencies":[]}]},"dependencyGraph":[{"name":"firebase_core","dependencies":["firebase_core_web"]},{"name":"firebase_core_web","dependencies":[]},{"name":"firebase_crashlytics","dependencies":["firebase_core"]},{"name":"flutter_local_notifications","dependencies":["flutter_local_notifications_linux"]},{"name":"flutter_local_notifications_linux","dependencies":[]},{"name":"google_sign_in","dependencies":["google_sign_in_android","google_sign_in_ios","google_sign_in_web"]},{"name":"google_sign_in_android","dependencies":[]},{"name":"google_sign_in_ios","dependencies":[]},{"name":"google_sign_in_web","dependencies":[]},{"name":"package_info_plus","dependencies":[]},{"name":"path_provider","dependencies":["path_provider_android","path_provider_foundation","path_provider_linux","path_provider_windows"]},{"name":"path_provider_android","dependencies":[]},{"name":"path_provider_foundation","dependencies":[]},{"name":"path_provider_linux","dependencies":[]},{"name":"path_provider_windows","dependencies":[]},{"name":"photo_manager","dependencies":[]},{"name":"shared_preferences","dependencies":["shared_preferences_android","shared_preferences_foundation","shared_preferences_linux","shared_preferences_web","shared_preferences_windows"]},{"name":"shared_preferences_android","dependencies":[]},{"name":"shared_preferences_foundation","dependencies":[]},{"name":"shared_preferences_linux","dependencies":["path_provider_linux"]},{"name":"shared_preferences_web","dependencies":[]},{"name":"shared_preferences_windows","dependencies":["path_provider_windows"]},{"name":"sqflite","dependencies":["sqflite_android","sqflite_darwin"]},{"name":"sqflite_android","dependencies":[]},{"name":"sqflite_darwin","dependencies":[]},{"name":"url_launcher","dependencies":["url_launcher_android","url_launcher_ios","url_launcher_linux","url_launcher_macos","url_launcher_web","url_launcher_windows"]},{"name":"url_launcher_android","dependencies":[]},{"name":"url_launcher_ios","dependencies":[]},{"name":"url_launcher_linux","dependencies":[]},{"name":"url_launcher_macos","dependencies":[]},{"name":"url_launcher_web","dependencies":[]},{"name":"url_launcher_windows","dependencies":[]}],"date_created":"2024-12-13 10:25:09.114027","version":"3.27.0","swift_package_manager_enabled":false} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Do not commit generated files to version control
This file is auto-generated and includes the notice: "This is a generated file; do not edit or check into version control." Committing this file may lead to merge conflicts and unnecessary diffs.
Summary by CodeRabbit