From 58a4b05bf16f1ceb73a9a7011f3823fef21fe327 Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 14:13:22 +0300 Subject: [PATCH 1/6] ci: rewrok CI to build on all platforms, use flutter analyze commenter, omit emojis, separate main.yml into checks.yml and tests.yml --- .github/workflows/build.yml | 105 ++++++++++++++---- .github/workflows/changelog.yml | 6 +- .github/workflows/checks.yml | 58 ++++++++++ .github/workflows/main.yml | 71 ------------ .github/workflows/pr-checks.yml | 40 +++++++ .github/workflows/publish.yml | 31 +++--- .github/workflows/tests.yml | 44 ++++++++ .../flutter_quill_integration_test.dart | 8 ++ example/pubspec.lock | 55 +++++++++ example/pubspec.yaml | 2 + .../test/flutter_quill_test_test.dart | 5 + 11 files changed, 313 insertions(+), 112 deletions(-) create mode 100644 .github/workflows/checks.yml delete mode 100644 .github/workflows/main.yml create mode 100644 .github/workflows/pr-checks.yml create mode 100644 .github/workflows/tests.yml create mode 100644 example/integration_test/flutter_quill_integration_test.dart create mode 100644 flutter_quill_test/test/flutter_quill_test_test.dart diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 921f632fd..e2fb3862e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,46 +1,107 @@ -# TODO: Update the workflow to build on Android, iOS, desktop (macOS and Windows) instead of just Linux and Web - -name: ๐Ÿ—๏ธ Build the example +name: Build the example on: pull_request: branches: [master, dev] jobs: - build_linux: - name: ๐Ÿง Build Linux and Web Apps + # Build the Linux, Android and web apps on Linux + linux-web-android: + name: Linux, Android and Web Apps runs-on: ubuntu-latest steps: - - name: ๐Ÿ“ฆ Checkout repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: stable + cache: true + + - name: Verify Flutter installation + run: flutter --version + + - name: Install flutter_quill dependencies + run: flutter pub get + + - name: Install example dependencies + run: flutter pub get -C example + + - name: Build the Web app + run: flutter build web --release --dart-define=CI=true + working-directory: ./example + + - name: Build the Web app with WebAssembly + run: flutter build web --release --wasm --dart-define=CI=true + working-directory: ./example + + - name: Install Linux dependencies + run: | + sudo apt-get update -y + sudo apt-get install -y curl git unzip xz-utils zip libglu1-mesa + sudo apt-get install -y clang cmake ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev + + - name: Build the Linux app + run: flutter build linux --release --dart-define=CI=true + working-directory: ./example + + - name: Build the Android app + run: flutter build appbundle --release --dart-define=CI=true + working-directory: ./example + + macos: + name: iOS and macOS apps + runs-on: macos-latest + + steps: + - uses: actions/checkout@v4 - - name: ๐Ÿ› ๏ธ Set up Flutter + - name: Set up Flutter uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: stable cache: true - - name: ๐Ÿ” Verify Flutter installation + - name: Verify Flutter installation run: flutter --version - - name: ๐Ÿ“ฅ Install Flutter dependencies + - name: Install flutter_quill dependencies run: flutter pub get - - name: ๐ŸŒ Build Flutter Web Application - run: flutter build web --release --verbose --dart-define=CI=true + - name: Install example dependencies + run: flutter pub get -C example + + - name: Build the iOS app + run: flutter build ios --no-codesign --release --dart-define=CI=true + working-directory: ./example + + - name: Build the macOS app + run: flutter build macos --release --dart-define=CI=true working-directory: ./example - # TODO: Update the CI to not upgrade all the packages to save some time - - name: ๐Ÿ”„ Update and Upgrade APT Packages - run: sudo apt update -y && sudo apt upgrade -y + windows: + name: Windows app + runs-on: windows-latest - - name: ๐Ÿ› ๏ธ Install Flutter Linux Prerequisites - run: sudo apt install -y curl git unzip xz-utils zip libglu1-mesa + steps: + - uses: actions/checkout@v4 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: stable + cache: true + + - name: Verify Flutter installation + run: flutter --version + + - name: Install flutter_quill dependencies + run: flutter pub get - - name: ๐Ÿงฉ Install Flutter Linux Desktop Dependencies - run: sudo apt install -y clang cmake git ninja-build pkg-config libgtk-3-dev liblzma-dev libstdc++-12-dev + - name: Install example dependencies + run: flutter pub get -C example - - name: ๐Ÿง Build Flutter Linux Desktop Application - run: flutter build linux --release --verbose --dart-define=CI=true + - name: Build the Windows app + run: flutter build windows --release --dart-define=CI=true working-directory: ./example diff --git a/.github/workflows/changelog.yml b/.github/workflows/changelog.yml index ab076ca23..0301bc1d9 100644 --- a/.github/workflows/changelog.yml +++ b/.github/workflows/changelog.yml @@ -1,4 +1,4 @@ -name: ๐Ÿ“ Changelog File Check +name: Changelog File Check # This workflow only validates if the CHANGELOG.md file was updated and doesn't validate the format. @@ -10,10 +10,10 @@ on: jobs: changelog: - name: ๐Ÿ” Verify Changelog Modification + name: Verify Changelog Modification runs-on: ubuntu-latest steps: - - name: โœ… Check if CHANGELOG.md was modified + - name: Check if CHANGELOG.md was modified uses: tarides/changelog-check-action@v2 with: changelog: CHANGELOG.md diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml new file mode 100644 index 000000000..caec71b7f --- /dev/null +++ b/.github/workflows/checks.yml @@ -0,0 +1,58 @@ +name: Code Quality Checks + +on: + push: + branches: [master, dev] + pull_request: + branches: [master, dev] + +jobs: + tests: + name: Code Quality and Formatting Verification + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: stable + cache: true + + - name: Verify Flutter installation + run: flutter --version + + - name: Install Flutter dependencies + run: flutter pub get + + - name: Install flutter_quill_extensions dependencies + run: flutter pub get -C flutter_quill_extensions + + - name: Install flutter_quill_test dependencies + run: flutter pub get -C flutter_quill_test + + - name: Perform Flutter Analysis + run: flutter analyze + + - name: Check Dart code formatting + run: dart format --set-exit-if-changed . + + - name: Preview Dart proposed changes + run: dart fix --dry-run + + - name: Check if the flutter_quill package is ready for publishing + run: flutter pub publish --dry-run + + - name: Check if the flutter_quill_extensions is ready for publishing + run: flutter pub publish --dry-run -C flutter_quill_extensions + + - name: Check the translations + run: dart ./scripts/translations_check.dart + + - name: Install cider + run: dart pub global activate cider + + # TODO: Need a more strict way to validate the format that uses https://keepachangelog.com/en/1.1.0/ + - name: Validate CHANGELOG.md format + run: $HOME/.pub-cache/bin/cider list CHANGELOG.md diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index b79a6cdcd..000000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: ๐Ÿงช Run Tests - -# TODO: Split the tests into tests.yml and quality checks into checks.yml once start using https://pub.dev/packages/melos - -on: - push: - branches: [master, dev] - pull_request: - branches: [master, dev] - -jobs: - tests: - name: Check lints and tests - runs-on: ubuntu-latest - - steps: - - name: ๐Ÿ“ฆ Checkout repository - uses: actions/checkout@v4 - - - name: ๐Ÿ› ๏ธ Set up Flutter - uses: subosito/flutter-action@v2 - with: - channel: 'stable' - cache: true - - - name: ๐Ÿ” Verify Flutter installation - run: flutter --version - - - name: ๐Ÿ“ฅ Install Flutter dependencies - run: flutter pub get - - - name: ๐Ÿ“ฆ Install flutter_quill_extensions dependencies - run: flutter pub get -C flutter_quill_extensions - - - name: ๐Ÿ“ฆ Install flutter_quill_test dependencies - run: flutter pub get -C flutter_quill_test - - - name: ๐ŸŽจ Perform Flutter Analysis - run: flutter analyze --write=flutter_analyze.log - - - if: ${{ !cancelled() }} - uses: yorifuji/flutter-analyze-commenter@v1 - with: - analyze-log: flutter_analyze.log - verbose: false - - - name: ๐Ÿงน Check Dart code formatting - run: dart format --set-exit-if-changed . - - - name: ๐Ÿ” Preview Dart proposed changes - run: dart fix --dry-run - - - name: ๐Ÿ“ฆ Check if package is ready for publishing - run: flutter pub publish --dry-run - - - name: ๐Ÿงช Run flutter_quill tests - run: flutter test - - - name: ๐Ÿงช Run flutter_quill_extensions tests - run: flutter test - working-directory: flutter_quill_extensions - - - name: ๐Ÿ” Check the translations - run: dart ./scripts/translations_check.dart - - - name: ๐Ÿ“ฅ Install cider - run: dart pub global activate cider - - # TODO: Need a more strict way to validate the format that uses https://keepachangelog.com/en/1.1.0/ - - name: ๐Ÿ” Validate CHANGELOG.md format - run: $HOME/.pub-cache/bin/cider list CHANGELOG.md diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml new file mode 100644 index 000000000..601c3fbaa --- /dev/null +++ b/.github/workflows/pr-checks.yml @@ -0,0 +1,40 @@ +name: PR Checks + +on: + pull_request: + branches: [master, dev] + +jobs: + tests: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: stable + cache: true + + - name: Verify Flutter installation + run: flutter --version + + - name: Install Flutter dependencies + run: flutter pub get + + - name: Install flutter_quill_extensions dependencies + run: flutter pub get -C flutter_quill_extensions + + - name: Install flutter_quill_test dependencies + run: flutter pub get -C flutter_quill_test + + - name: Perform Flutter Analysis + run: flutter analyze --write=flutter_analyze.log + + - if: ${{ !cancelled() }} + name: Run Flutter Analyze Commenter + uses: yorifuji/flutter-analyze-commenter@v1 + with: + analyze-log: flutter_analyze.log + verbose: false \ No newline at end of file diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index cfb17e35b..23006db79 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,4 +1,4 @@ -name: ๐Ÿš€ Publish to pub.dev +name: Publish # Note: This workflow only publishes flutter_quill package, the flutter_quill_extensions # need to be manually published. @@ -10,59 +10,58 @@ on: jobs: publish: - name: Publish the flutter_quill package + name: Publish the flutter_quill package to pub.dev permissions: id-token: write # Required for authentication using OIDC to publish to pub.dev contents: write # Required for creating a GitHub release and uploading the LICENSE file runs-on: ubuntu-latest steps: - - name: ๐Ÿ“ฆ Checkout repository - uses: actions/checkout@v4 + - uses: actions/checkout@v4 - - name: ๐Ÿ› ๏ธ Set up Flutter + - name: Set up Flutter uses: subosito/flutter-action@v2 with: - channel: 'stable' + channel: stable cache: true - - name: ๐Ÿ” Verify Flutter installation + - name: Verify Flutter installation run: flutter --version - - name: ๐Ÿ“ฅ Install Flutter dependencies + - name: Install Flutter dependencies run: flutter pub get # This is needed in order for the authentication to success # dart pub token add https://pub.dev --env-var PUB_TOKEN # Requests to "https://pub.dev" will now be authenticated using the secret token stored in the environment variable "PUB_TOKEN". - - name: ๐Ÿ—๏ธ Set up Dart environment + - name: Set up Dart environment uses: dart-lang/setup-dart@v1 ## dart-lang/setup-dart/.github/workflows/publish.yml@v1 # - name: Update the authorization requests to "https://pub.dev" to use the environment variable "PUB_TOKEN". # run: dart pub token add https://pub.dev --env-var PUB_TOKEN # Extract version from the tag (handles the 'v' prefix) - - name: ๐Ÿท๏ธ Extract version from tag as pubspec.yaml version + - name: Extract version from tag as pubspec.yaml version id: extract_version run: | version=$(echo ${GITHUB_REF} | sed 's/^refs\/tags\/v\(.*\)$/\1/') echo "VERSION=${version}" >> $GITHUB_OUTPUT - - name: ๐Ÿ” Validate extracted version format (should be pubspec.yaml valid version) + - name: Validate extracted version format (should be pubspec.yaml valid version) run: | version=${{ steps.extract_version.outputs.VERSION }} if [[ ! $version =~ ^[0-9]+\.[0-9]+\.[0-9]+(-[0-9A-Za-z.-]+)?(\+[0-9A-Za-z.-]+)?$ ]]; then - echo "โŒ Invalid version format: $version. The version must be a valid pubspec.yaml version" + echo "Invalid version format: $version. The version must be a valid pubspec.yaml version" exit 1 fi - - name: โœ‚๏ธ Extract Release Notes from CHANGELOG.md + - name: Extract Release Notes from CHANGELOG.md id: extract-release-notes uses: ffurrer2/extract-release-notes@v2 with: changelog_file: CHANGELOG.md release_notes_file: RELEASE_NOTES.md - - name: ๐Ÿš€ Create a GitHub Release + - name: Create a GitHub Release uses: ncipollo/release-action@v1 with: artifacts: "LICENSE" @@ -70,8 +69,8 @@ jobs: tag: ${{ github.ref_name }} prerelease: ${{ contains(github.ref_name, '-') }} - - name: ๐Ÿ”„ Check if package is ready for publishing + - name: Check if package is ready for publishing run: flutter pub publish --dry-run - - name: ๐Ÿ“ค Publish flutter_quill + - name: Publish flutter_quill run: flutter pub publish --force diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml new file mode 100644 index 000000000..9d9a85592 --- /dev/null +++ b/.github/workflows/tests.yml @@ -0,0 +1,44 @@ +name: Run Tests + +on: + push: + branches: [master, dev] + pull_request: + branches: [master, dev] + +jobs: + tests: + name: Check lints and tests + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - name: Set up Flutter + uses: subosito/flutter-action@v2 + with: + channel: stable + cache: true + + - name: Verify Flutter installation + run: flutter --version + + - name: Install Flutter dependencies + run: flutter pub get + + - name: Install flutter_quill_extensions dependencies + run: flutter pub get -C flutter_quill_extensions + + - name: Install flutter_quill_test dependencies + run: flutter pub get -C flutter_quill_test + + - name: Run flutter_quill tests + run: flutter test + + - name: Run flutter_quill_extensions tests + run: flutter test + working-directory: flutter_quill_extensions + + - name: Run flutter_quill_test tests + run: flutter test + working-directory: flutter_quill_test diff --git a/example/integration_test/flutter_quill_integration_test.dart b/example/integration_test/flutter_quill_integration_test.dart new file mode 100644 index 000000000..90de8de86 --- /dev/null +++ b/example/integration_test/flutter_quill_integration_test.dart @@ -0,0 +1,8 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:integration_test/integration_test.dart'; + +void main() { + IntegrationTestWidgetsFlutterBinding.ensureInitialized(); + + testWidgets('placeholder test', (tester) async {}); +} diff --git a/example/pubspec.lock b/example/pubspec.lock index 061190ffb..85124ec63 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -105,6 +105,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.3" + file: + dependency: transitive + description: + name: file + sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" + url: "https://pub.dev" + source: hosted + version: "7.0.0" file_selector_linux: dependency: transitive description: @@ -150,6 +158,11 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + flutter_driver: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" flutter_keyboard_visibility_linux: dependency: transitive description: @@ -250,6 +263,11 @@ packages: description: flutter source: sdk version: "0.0.0" + fuchsia_remote_debug_protocol: + dependency: transitive + description: flutter + source: sdk + version: "0.0.0" html: dependency: transitive description: @@ -338,6 +356,11 @@ packages: url: "https://pub.dev" source: hosted version: "0.2.1+1" + integration_test: + dependency: "direct dev" + description: flutter + source: sdk + version: "0.0.0" intl: dependency: transitive description: @@ -434,6 +457,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.15.0" + platform: + dependency: transitive + description: + name: platform + sha256: "9b71283fc13df574056616011fb138fd3b793ea47cc509c189a6c3fa5f8a1a65" + url: "https://pub.dev" + source: hosted + version: "3.1.5" plugin_platform_interface: dependency: transitive description: @@ -442,6 +473,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.8" + process: + dependency: transitive + description: + name: process + sha256: "21e54fd2faf1b5bdd5102afd25012184a6793927648ea81eea80552ac9405b32" + url: "https://pub.dev" + source: hosted + version: "5.0.2" quill_native_bridge: dependency: transitive description: @@ -551,6 +590,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.0" + sync_http: + dependency: transitive + description: + name: sync_http + sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" + url: "https://pub.dev" + source: hosted + version: "0.3.1" term_glyph: dependency: transitive description: @@ -719,6 +766,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.1.0" + webdriver: + dependency: transitive + description: + name: webdriver + sha256: "3d773670966f02a646319410766d3b5e1037efb7f07cc68f844d5e06cd4d61c8" + url: "https://pub.dev" + source: hosted + version: "3.0.4" win32: dependency: transitive description: diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 8148153c4..ac5083005 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -22,6 +22,8 @@ dev_dependencies: sdk: flutter flutter_lints: ^5.0.0 flutter_quill_test: ^11.0.0-dev.2 + integration_test: + sdk: flutter dependency_overrides: flutter_quill: diff --git a/flutter_quill_test/test/flutter_quill_test_test.dart b/flutter_quill_test/test/flutter_quill_test_test.dart new file mode 100644 index 000000000..616e3df89 --- /dev/null +++ b/flutter_quill_test/test/flutter_quill_test_test.dart @@ -0,0 +1,5 @@ +import 'package:flutter_test/flutter_test.dart'; + +void main() { + test('placeholder test', () {}); +} From 6460184dbaffce6033afd3d4abf97beb6e826eda Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 14:59:17 +0300 Subject: [PATCH 2/6] fix: replace universal_html with web for flutter_quill_extensions, minor changes to CI step names --- .github/workflows/checks.yml | 1 - .github/workflows/tests.yml | 1 - analysis_options.yaml | 1 + example/lib/main.dart | 35 +++++------ example/pubspec.lock | 60 +++++++++---------- flutter_quill_extensions/CHANGELOG.md | 4 ++ .../analysis_options.yaml | 33 ---------- .../lib/src/common/utils/web/web.dart | 1 + .../lib/src/common/utils/web/web_real.dart | 46 ++++++++++++++ .../lib/src/common/utils/web/web_stub.dart | 19 ++++++ .../lib/src/editor/image/image_web_embed.dart | 21 +++---- .../lib/src/editor/video/video_web_embed.dart | 21 +++---- flutter_quill_extensions/pubspec.yaml | 2 +- 13 files changed, 135 insertions(+), 110 deletions(-) delete mode 100644 flutter_quill_extensions/analysis_options.yaml create mode 100644 flutter_quill_extensions/lib/src/common/utils/web/web.dart create mode 100644 flutter_quill_extensions/lib/src/common/utils/web/web_real.dart create mode 100644 flutter_quill_extensions/lib/src/common/utils/web/web_stub.dart diff --git a/.github/workflows/checks.yml b/.github/workflows/checks.yml index caec71b7f..439d80dc0 100644 --- a/.github/workflows/checks.yml +++ b/.github/workflows/checks.yml @@ -8,7 +8,6 @@ on: jobs: tests: - name: Code Quality and Formatting Verification runs-on: ubuntu-latest steps: diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index 9d9a85592..01869a634 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,7 +8,6 @@ on: jobs: tests: - name: Check lints and tests runs-on: ubuntu-latest steps: diff --git a/analysis_options.yaml b/analysis_options.yaml index b6065426f..abdbd96fc 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -30,3 +30,4 @@ linter: unnecessary_parenthesis: true unnecessary_string_interpolations: true avoid_web_libraries_in_flutter: true + conditional_uri_does_not_exist: true diff --git a/example/lib/main.dart b/example/lib/main.dart index 715dc81c2..841726bd0 100644 --- a/example/lib/main.dart +++ b/example/lib/main.dart @@ -147,23 +147,24 @@ class _HomePageState extends State { placeholder: 'Start writing your notes...', padding: const EdgeInsets.all(16), embedBuilders: [ - ...FlutterQuillEmbeds.editorBuilders( - imageEmbedConfig: QuillEditorImageEmbedConfig( - imageProviderBuilder: (context, imageUrl) { - // https://pub.dev/packages/flutter_quill_extensions#-image-assets - if (imageUrl.startsWith('assets/')) { - return AssetImage(imageUrl); - } - return null; - }, - ), - videoEmbedConfig: QuillEditorVideoEmbedConfig( - customVideoBuilder: (videoUrl, readOnly) { - // To load YouTube videos https://github.com/singerdmx/flutter-quill/releases/tag/v10.8.0 - return null; - }, - ), - ), + // ...FlutterQuillEmbeds.editorBuilders( + // imageEmbedConfig: QuillEditorImageEmbedConfig( + // imageProviderBuilder: (context, imageUrl) { + // // https://pub.dev/packages/flutter_quill_extensions#-image-assets + // if (imageUrl.startsWith('assets/')) { + // return AssetImage(imageUrl); + // } + // return null; + // }, + // ), + // videoEmbedConfig: QuillEditorVideoEmbedConfig( + // customVideoBuilder: (videoUrl, readOnly) { + // // To load YouTube videos https://github.com/singerdmx/flutter-quill/releases/tag/v10.8.0 + // return null; + // }, + // ), + // ), + ...FlutterQuillEmbeds.editorWebBuilders(), TimeStampEmbedBuilder(), ], ), diff --git a/example/pubspec.lock b/example/pubspec.lock index 85124ec63..02f36f9c5 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -220,10 +220,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398" + sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" url: "https://pub.dev" source: hosted - version: "2.0.23" + version: "2.0.24" flutter_quill: dependency: "direct main" description: @@ -235,10 +235,10 @@ packages: dependency: transitive description: name: flutter_quill_delta_from_html - sha256: "63873b5391b56daa999ce8fa7dd23dfd7d0417a70e00a647ba450f4a8988afd0" + sha256: "79405765612016de9de2361be86383360b0b43a6bf88b818c079a953583f1849" url: "https://pub.dev" source: hosted - version: "1.4.3" + version: "1.5.0" flutter_quill_extensions: dependency: "direct main" description: @@ -288,10 +288,10 @@ packages: dependency: transitive description: name: http_parser - sha256: "76d306a1c3afb33fe82e2bbacad62a61f409b5634c915fceb0d799de1a913360" + sha256: "178d74305e7866013777bab2c3d8726205dc5a4dd935297175b19a23a2e66571" url: "https://pub.dev" source: hosted - version: "4.1.1" + version: "4.1.2" image_picker: dependency: transitive description: @@ -304,10 +304,10 @@ packages: dependency: transitive description: name: image_picker_android - sha256: fa8141602fde3f7e2f81dbf043613eb44dfa325fa0bcf93c0f142c9f7a2c193e + sha256: b62d34a506e12bb965e824b6db4fbf709ee4589cf5d3e99b45ab2287b008ee0c url: "https://pub.dev" source: hosted - version: "0.8.12+18" + version: "0.8.12+20" image_picker_for_web: dependency: transitive description: @@ -320,10 +320,10 @@ packages: dependency: transitive description: name: image_picker_ios - sha256: "4f0568120c6fcc0aaa04511cb9f9f4d29fc3d0139884b1d06be88dcec7641d6b" + sha256: "05da758e67bc7839e886b3959848aa6b44ff123ab4b28f67891008afe8ef9100" url: "https://pub.dev" source: hosted - version: "0.8.12+1" + version: "0.8.12+2" image_picker_linux: dependency: transitive description: @@ -344,10 +344,10 @@ packages: dependency: transitive description: name: image_picker_platform_interface - sha256: "9ec26d410ff46f483c5519c29c02ef0e02e13a543f882b152d4bfd2f06802f80" + sha256: "886d57f0be73c4b140004e78b9f28a8914a09e50c2d816bdd0520051a71236a0" url: "https://pub.dev" source: hosted - version: "2.10.0" + version: "2.10.1" image_picker_windows: dependency: transitive description: @@ -397,18 +397,18 @@ packages: dependency: transitive description: name: lints - sha256: "4a16b3f03741e1252fda5de3ce712666d010ba2122f8e912c94f9f7b90e1a4c3" + sha256: c35bb79562d980e9a453fc715854e1ed39e24e7d0297a880ef54e17f9874a9d7 url: "https://pub.dev" source: hosted - version: "5.1.0" + version: "5.1.1" markdown: dependency: transitive description: name: markdown - sha256: ef2a1298144e3f985cc736b22e0ccdaf188b5b3970648f2d9dc13efd1d9df051 + sha256: "935e23e1ff3bc02d390bad4d4be001208ee92cc217cb5b5a6c19bc14aaa318c1" url: "https://pub.dev" source: hosted - version: "7.2.2" + version: "7.3.0" matcher: dependency: transitive description: @@ -525,10 +525,10 @@ packages: dependency: transitive description: name: quill_native_bridge_platform_interface - sha256: "2d71b6c5106db0a4b1d788640d1b949ccdd0e570b5a5e0384f7b28be9630a94a" + sha256: ea48bd12bf426741747ec8a575b122350971f338a75049099b349c63447582a2 url: "https://pub.dev" source: hosted - version: "0.0.1" + version: "0.0.1+1" quill_native_bridge_web: dependency: transitive description: @@ -690,18 +690,18 @@ packages: dependency: transitive description: name: url_launcher_web - sha256: "772638d3b34c779ede05ba3d38af34657a05ac55b06279ea6edd409e323dca8e" + sha256: "3ba963161bd0fe395917ba881d320b9c4f6dd3c4a233da62ab18a5025c85f1e9" url: "https://pub.dev" source: hosted - version: "2.3.3" + version: "2.4.0" url_launcher_windows: dependency: transitive description: name: url_launcher_windows - sha256: "44cf3aabcedde30f2dba119a9dea3b0f2672fbe6fa96e85536251d678216b3c4" + sha256: "3284b6d2ac454cf34f114e1d3319866fdd1e19cdc329999057e44ffe936cfa77" url: "https://pub.dev" source: hosted - version: "3.1.3" + version: "3.1.4" vector_math: dependency: transitive description: @@ -722,18 +722,18 @@ packages: dependency: transitive description: name: video_player_android - sha256: "391e092ba4abe2f93b3e625bd6b6a6ec7d7414279462c1c0ee42b5ab8d0a0898" + sha256: "7018dbcb395e2bca0b9a898e73989e67c0c4a5db269528e1b036ca38bcca0d0b" url: "https://pub.dev" source: hosted - version: "2.7.16" + version: "2.7.17" video_player_avfoundation: dependency: transitive description: name: video_player_avfoundation - sha256: "33224c19775fd244be2d6e3dbd8e1826ab162877bd61123bf71890772119a2b7" + sha256: "8a4e73a3faf2b13512978a43cf1cdda66feeeb900a0527f1fbfd7b19cf3458d3" url: "https://pub.dev" source: hosted - version: "2.6.5" + version: "2.6.7" video_player_platform_interface: dependency: transitive description: @@ -778,10 +778,10 @@ packages: dependency: transitive description: name: win32 - sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69" + sha256: "154360849a56b7b67331c21f09a386562d88903f90a1099c5987afc1912e1f29" url: "https://pub.dev" source: hosted - version: "5.9.0" + version: "5.10.0" sdks: - dart: ">=3.6.0-0 <4.0.0" - flutter: ">=3.24.0" + dart: ">=3.6.0 <4.0.0" + flutter: ">=3.27.0" diff --git a/flutter_quill_extensions/CHANGELOG.md b/flutter_quill_extensions/CHANGELOG.md index 8cfce1354..d62b17a71 100644 --- a/flutter_quill_extensions/CHANGELOG.md +++ b/flutter_quill_extensions/CHANGELOG.md @@ -10,6 +10,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +### Fixed + +- Replace the dependency [`universal_html`](https://pub.dev/packages/universal_html) with [`web`](https://pub.dev/packages/web) to avoid WASM compilation issues. + ## [11.0.0-dev.7] - 2024-12-13 ### Changed diff --git a/flutter_quill_extensions/analysis_options.yaml b/flutter_quill_extensions/analysis_options.yaml deleted file mode 100644 index 42a46376c..000000000 --- a/flutter_quill_extensions/analysis_options.yaml +++ /dev/null @@ -1,33 +0,0 @@ -include: package:flutter_lints/flutter.yaml - -linter: - rules: - always_declare_return_types: true - always_put_required_named_parameters_first: true - annotate_overrides: true - avoid_empty_else: true - avoid_escaping_inner_quotes: true - avoid_print: true - avoid_redundant_argument_values: true - avoid_types_on_closure_parameters: true - avoid_void_async: true - cascade_invocations: true - directives_ordering: true - omit_local_variable_types: true - prefer_const_constructors: true - prefer_const_constructors_in_immutables: true - prefer_const_declarations: true - prefer_final_fields: true - prefer_final_in_for_each: true - prefer_final_locals: true - prefer_initializing_formals: true - prefer_int_literals: true - prefer_interpolation_to_compose_strings: true - prefer_relative_imports: true - prefer_single_quotes: true - sort_constructors_first: true - sort_unnamed_constructors_first: true - unnecessary_lambdas: true - unnecessary_parenthesis: true - unnecessary_string_interpolations: true - avoid_web_libraries_in_flutter: true diff --git a/flutter_quill_extensions/lib/src/common/utils/web/web.dart b/flutter_quill_extensions/lib/src/common/utils/web/web.dart new file mode 100644 index 000000000..d16e54b20 --- /dev/null +++ b/flutter_quill_extensions/lib/src/common/utils/web/web.dart @@ -0,0 +1 @@ +export './web_stub.dart' if (dart.library.js_interop) './web_real.dart'; diff --git a/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart b/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart new file mode 100644 index 000000000..da3119b39 --- /dev/null +++ b/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart @@ -0,0 +1,46 @@ +import 'package:web/web.dart'; +import '../dart_ui/dart_ui_fake.dart' + if (dart.library.js_interop) '../dart_ui/dart_ui_real.dart' as ui; + +void main(List args) { + HTMLImageElement; +} + +void createHtmlImageElement({ + required String src, + required String height, + required String width, + required String margin, + required String alignSelf, +}) { + ui.PlatformViewRegistry().registerViewFactory(src, (viewId) { + return createHtmlImageElement( + src: src, + alignSelf: alignSelf, + width: width, + height: height, + margin: margin, + ); + }); +} + +void createHtmlIFrameElement({ + required String src, + required String height, + required String width, + required String margin, + required String alignSelf, +}) { + ui.PlatformViewRegistry().registerViewFactory( + src, + (id) { + return HTMLIFrameElement() + ..style.width = width + ..style.height = height + ..src = src + ..style.border = 'none' + ..style.margin = margin + ..style.alignSelf = alignSelf; + }, + ); +} diff --git a/flutter_quill_extensions/lib/src/common/utils/web/web_stub.dart b/flutter_quill_extensions/lib/src/common/utils/web/web_stub.dart new file mode 100644 index 000000000..dac6a97be --- /dev/null +++ b/flutter_quill_extensions/lib/src/common/utils/web/web_stub.dart @@ -0,0 +1,19 @@ +void createHtmlImageElement({ + required String src, + required String height, + required String width, + required String margin, + required String alignSelf, +}) => + throw UnimplementedError( + 'A stub method is called, createHtmlImageElement is for web platforms only.'); + +void createHtmlIFrameElement({ + required String src, + required String height, + required String width, + required String margin, + required String alignSelf, +}) => + throw UnimplementedError( + 'A stub method is called, createHtmlIFrameElement is for web platforms only.'); diff --git a/flutter_quill_extensions/lib/src/editor/image/image_web_embed.dart b/flutter_quill_extensions/lib/src/editor/image/image_web_embed.dart index 862b532f7..1b2102265 100644 --- a/flutter_quill_extensions/lib/src/editor/image/image_web_embed.dart +++ b/flutter_quill_extensions/lib/src/editor/image/image_web_embed.dart @@ -1,13 +1,10 @@ import 'package:flutter/foundation.dart' show kIsWeb; import 'package:flutter/widgets.dart'; import 'package:flutter_quill/flutter_quill.dart'; -import 'package:universal_html/html.dart' as html; -import '../../common/utils/dart_ui/dart_ui_fake.dart' - if (dart.library.js_interop) '../../common/utils/dart_ui/dart_ui_real.dart' - as ui; import '../../common/utils/element_utils/element_web_utils.dart'; import '../../common/utils/utils.dart'; +import '../../common/utils/web/web.dart'; import 'config/image_web_config.dart'; class QuillEditorWebImageEmbedBuilder extends EmbedBuilder { @@ -48,15 +45,13 @@ class QuillEditorWebImageEmbedBuilder extends EmbedBuilder { } } - ui.PlatformViewRegistry().registerViewFactory(imageSource, (viewId) { - return html.ImageElement() - ..src = imageSource - ..style.height = height - ..style.width = width - ..style.margin = margin - ..style.alignSelf = alignment - ..attributes['loading'] = 'lazy'; - }); + createHtmlImageElement( + src: imageSource, + alignSelf: alignment, + width: width, + height: height, + margin: margin, + ); return ConstrainedBox( constraints: diff --git a/flutter_quill_extensions/lib/src/editor/video/video_web_embed.dart b/flutter_quill_extensions/lib/src/editor/video/video_web_embed.dart index ea104dce9..f38ceae88 100644 --- a/flutter_quill_extensions/lib/src/editor/video/video_web_embed.dart +++ b/flutter_quill_extensions/lib/src/editor/video/video_web_embed.dart @@ -1,12 +1,9 @@ import 'package:flutter/widgets.dart'; import 'package:flutter_quill/flutter_quill.dart'; -import 'package:universal_html/html.dart' as html; -import '../../common/utils/dart_ui/dart_ui_fake.dart' - if (dart.library.js_interop) '../../common/utils/dart_ui/dart_ui_real.dart' - as ui; import '../../common/utils/element_utils/element_web_utils.dart'; import '../../common/utils/utils.dart'; +import '../../common/utils/web/web.dart'; import 'config/video_web_config.dart'; import 'youtube_video_url.dart'; @@ -40,16 +37,12 @@ class QuillEditorWebVideoEmbedBuilder extends EmbedBuilder { final (height, width, margin, alignment) = getWebElementAttributes(embedContext.node); - ui.PlatformViewRegistry().registerViewFactory( - videoUrl, - (id) => html.IFrameElement() - ..style.width = width - ..style.height = height - ..src = videoUrl - ..style.border = 'none' - ..style.margin = margin - ..style.alignSelf = alignment - ..attributes['loading'] = 'lazy', + createHtmlIFrameElement( + src: videoUrl, + width: width, + height: height, + margin: margin, + alignSelf: alignment, ); return SizedBox( diff --git a/flutter_quill_extensions/pubspec.yaml b/flutter_quill_extensions/pubspec.yaml index 2485be14c..516a6d234 100644 --- a/flutter_quill_extensions/pubspec.yaml +++ b/flutter_quill_extensions/pubspec.yaml @@ -33,7 +33,7 @@ dependencies: # Dart Packages meta: ^1.7.0 - universal_html: ^2.2.4 + web: ">=0.5.0 <2.0.0" path: ^1.8.0 flutter_quill: ^11.0.0-dev.15 From bb94667a62e70f7b682084d936bc4457dbdb4015 Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 15:02:02 +0300 Subject: [PATCH 3/6] chore(example): remove universal_html and universal_io transitive dependencies --- example/pubspec.lock | 16 ---------------- 1 file changed, 16 deletions(-) diff --git a/example/pubspec.lock b/example/pubspec.lock index 02f36f9c5..33f07ebd7 100644 --- a/example/pubspec.lock +++ b/example/pubspec.lock @@ -622,22 +622,6 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" - universal_html: - dependency: transitive - description: - name: universal_html - sha256: "56536254004e24d9d8cfdb7dbbf09b74cf8df96729f38a2f5c238163e3d58971" - url: "https://pub.dev" - source: hosted - version: "2.2.4" - universal_io: - dependency: transitive - description: - name: universal_io - sha256: "1722b2dcc462b4b2f3ee7d188dad008b6eb4c40bbd03a3de451d82c78bba9aad" - url: "https://pub.dev" - source: hosted - version: "2.2.2" url_launcher: dependency: transitive description: From ab0ae3aa11c3b23ff53c69e1b7c3e746f015864b Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 15:04:04 +0300 Subject: [PATCH 4/6] ci: introduce rule violation to test the CI --- flutter_quill_extensions/lib/src/common/utils/web/web_real.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart b/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart index da3119b39..71249ef09 100644 --- a/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart +++ b/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart @@ -13,6 +13,7 @@ void createHtmlImageElement({ required String margin, required String alignSelf, }) { + print('Hello, World'); // Introduce linting issue for testing the new CI. ui.PlatformViewRegistry().registerViewFactory(src, (viewId) { return createHtmlImageElement( src: src, From 425f87d19bb2fe074f7ff6d8b795ed1a956c6f91 Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 15:06:31 +0300 Subject: [PATCH 5/6] revert: introduce rule violation to test the CI This reverts commit ab0ae3aa11c3b23ff53c69e1b7c3e746f015864b. --- flutter_quill_extensions/lib/src/common/utils/web/web_real.dart | 1 - 1 file changed, 1 deletion(-) diff --git a/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart b/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart index 71249ef09..da3119b39 100644 --- a/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart +++ b/flutter_quill_extensions/lib/src/common/utils/web/web_real.dart @@ -13,7 +13,6 @@ void createHtmlImageElement({ required String margin, required String alignSelf, }) { - print('Hello, World'); // Introduce linting issue for testing the new CI. ui.PlatformViewRegistry().registerViewFactory(src, (viewId) { return createHtmlImageElement( src: src, From e666724340ad107582b81212a3ca47051d0dc3ff Mon Sep 17 00:00:00 2001 From: Ellet Date: Sat, 18 Jan 2025 15:19:40 +0300 Subject: [PATCH 6/6] ci: upload Android APK to GitHub releases --- .github/workflows/publish.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 23006db79..b775049c0 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -61,10 +61,14 @@ jobs: changelog_file: CHANGELOG.md release_notes_file: RELEASE_NOTES.md + - name: Build example APK for GitHub release + run: flutter build apk --release --obfuscate --split-debug-info=./build/app/outputs/flutter-apk/debug-info/ + working-directory: ./example + - name: Create a GitHub Release uses: ncipollo/release-action@v1 with: - artifacts: "LICENSE" + artifacts: "LICENSE,./example/build/app/outputs/flutter-apk/app-release.apk " bodyFile: "RELEASE_NOTES.md" tag: ${{ github.ref_name }} prerelease: ${{ contains(github.ref_name, '-') }}