diff --git a/.github/workflows/my_plugin.yaml b/.github/workflows/my_plugin.yaml index 2644386..fa3bc1b 100644 --- a/.github/workflows/my_plugin.yaml +++ b/.github/workflows/my_plugin.yaml @@ -20,95 +20,6 @@ jobs: flutter_version: 2.10.1 working_directory: src/my_plugin - linux: - runs-on: ubuntu-18.04 - - defaults: - run: - working-directory: src/my_plugin/example - - steps: - - uses: actions/checkout@v2 - - - uses: subosito/flutter-action@v2 - - - name: Install Dependencies - run: | - sudo apt-get update - sudo apt-get install -y libgtk-3-dev libx11-dev pkg-config cmake ninja-build libblkid-dev liblzma-dev - - - name: Enable desktop support - run: flutter config --enable-linux-desktop - - - name: Flutter Doctor - run: flutter doctor -v - - - name: Integration Tests - run: xvfb-run flutter test integration_test -d linux - - windows: - runs-on: windows-2019 - - defaults: - run: - working-directory: src/my_plugin/example - - steps: - - uses: actions/checkout@v2 - - - uses: subosito/flutter-action@v2 - - - name: Enable desktop support - run: flutter config --enable-windows-desktop - - - name: Flutter Doctor - run: flutter doctor -v - - - name: Integration Tests - run: flutter test integration_test -d windows - - macos: - runs-on: macos-10.15 - - defaults: - run: - working-directory: src/my_plugin/example - - steps: - - uses: actions/checkout@v2 - - - uses: subosito/flutter-action@v2 - - - name: Enable desktop support - run: flutter config --enable-macos-desktop - - - name: Flutter Doctor - run: flutter doctor -v - - - name: Integration Tests - run: flutter test integration_test -d macos - - ios: - runs-on: macos-10.15 - - defaults: - run: - working-directory: src/my_plugin/example - - steps: - - uses: actions/checkout@v2 - - - uses: subosito/flutter-action@v2 - - - name: Flutter Doctor - run: flutter doctor -v - - - name: Start Simulator - run: open -a Simulator.app - - - name: Integration Tests - run: flutter test integration_test -d iPhone - android: runs-on: macos-10.15 @@ -153,3 +64,118 @@ jobs: api-level: 29 script: flutter test integration_test working-directory: src/my_plugin/example + + ios: + runs-on: macos-10.15 + + defaults: + run: + working-directory: src/my_plugin/example + + steps: + - uses: actions/checkout@v2 + + - uses: subosito/flutter-action@v2 + + - name: Flutter Doctor + run: flutter doctor -v + + - name: Start Simulator + run: open -a Simulator.app + + - name: Integration Tests + run: flutter test integration_test -d iPhone + + linux: + runs-on: ubuntu-18.04 + + defaults: + run: + working-directory: src/my_plugin/example + + steps: + - uses: actions/checkout@v2 + + - uses: subosito/flutter-action@v2 + + - name: Install Dependencies + run: | + sudo apt-get update + sudo apt-get install -y libgtk-3-dev libx11-dev pkg-config cmake ninja-build libblkid-dev liblzma-dev + + - name: Enable desktop support + run: flutter config --enable-linux-desktop + + - name: Flutter Doctor + run: flutter doctor -v + + - name: Integration Tests + run: xvfb-run flutter test integration_test -d linux + + macos: + runs-on: macos-10.15 + + defaults: + run: + working-directory: src/my_plugin/example + + steps: + - uses: actions/checkout@v2 + + - uses: subosito/flutter-action@v2 + + - name: Enable desktop support + run: flutter config --enable-macos-desktop + + - name: Flutter Doctor + run: flutter doctor -v + + - name: Integration Tests + run: flutter test integration_test -d macos + + web: + runs-on: macos-10.15 + + defaults: + run: + working-directory: src/my_plugin/example + + steps: + - uses: actions/checkout@v2 + + - uses: subosito/flutter-action@v2 + + - name: Flutter Doctor + run: flutter doctor -v + + - name: Run Chromedriver + run: | + git clone https://github.com/felangel/web_installers + cd web_installers/packages/web_drivers + dart pub get + dart lib/web_driver_installer.dart chromedriver --install-only + ./chromedriver/chromedriver --port=4444 & + + - name: Integration Tests + run: flutter drive --driver test_driver/integration_test.dart --target integration_test/app_test.dart -d web-server --browser-name=chrome + + windows: + runs-on: windows-2019 + + defaults: + run: + working-directory: src/my_plugin/example + + steps: + - uses: actions/checkout@v2 + + - uses: subosito/flutter-action@v2 + + - name: Enable desktop support + run: flutter config --enable-windows-desktop + + - name: Flutter Doctor + run: flutter doctor -v + + - name: Integration Tests + run: flutter test integration_test -d windows diff --git a/.github/workflows/my_plugin_web.yaml b/.github/workflows/my_plugin_web.yaml new file mode 100644 index 0000000..0a0ee40 --- /dev/null +++ b/.github/workflows/my_plugin_web.yaml @@ -0,0 +1,21 @@ +name: my_plugin_web + +on: + pull_request: + paths: + - ".github/workflows/my_plugin_web.yaml" + - "src/my_plugin_web/**" + push: + branches: + - main + paths: + - ".github/workflows/my_plugin_web.yaml" + - "src/my_plugin_web/**" + +jobs: + build: + uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1 + with: + flutter_channel: stable + flutter_version: 2.10.1 + working_directory: src/my_plugin_web diff --git a/src/my_plugin/example/integration_test/app_test.dart b/src/my_plugin/example/integration_test/app_test.dart index 8266ed1..3fdeb1d 100644 --- a/src/my_plugin/example/integration_test/app_test.dart +++ b/src/my_plugin/example/integration_test/app_test.dart @@ -21,6 +21,7 @@ void main() { } String expectedPlatformName() { + if (isWeb) return 'Web'; if (Platform.isAndroid) return 'Android'; if (Platform.isIOS) return 'iOS'; if (Platform.isLinux) return 'Linux'; @@ -28,3 +29,5 @@ String expectedPlatformName() { if (Platform.isWindows) return 'Windows'; throw UnsupportedError('Unsupported platform ${Platform.operatingSystem}'); } + +bool get isWeb => identical(0, 0.0); diff --git a/src/my_plugin/example/pubspec.yaml b/src/my_plugin/example/pubspec.yaml index f00c28b..e991c56 100644 --- a/src/my_plugin/example/pubspec.yaml +++ b/src/my_plugin/example/pubspec.yaml @@ -4,8 +4,8 @@ version: 0.1.0+1 publish_to: none environment: - sdk: ">=2.14.0 <3.0.0" - flutter: ">=2.5.0" + sdk: ">=2.16.0 <3.0.0" + flutter: ">=2.10.0" dependencies: flutter: @@ -19,6 +19,8 @@ dependencies: path: ../ dev_dependencies: + flutter_driver: + sdk: flutter flutter_test: sdk: flutter integration_test: diff --git a/src/my_plugin/example/test_driver/integration_test.dart b/src/my_plugin/example/test_driver/integration_test.dart new file mode 100644 index 0000000..b38629c --- /dev/null +++ b/src/my_plugin/example/test_driver/integration_test.dart @@ -0,0 +1,3 @@ +import 'package:integration_test/integration_test_driver.dart'; + +Future main() => integrationDriver(); diff --git a/src/my_plugin/example/web/favicon.png b/src/my_plugin/example/web/favicon.png new file mode 100644 index 0000000..8aaa46a Binary files /dev/null and b/src/my_plugin/example/web/favicon.png differ diff --git a/src/my_plugin/example/web/icons/Icon-192.png b/src/my_plugin/example/web/icons/Icon-192.png new file mode 100644 index 0000000..b749bfe Binary files /dev/null and b/src/my_plugin/example/web/icons/Icon-192.png differ diff --git a/src/my_plugin/example/web/icons/Icon-512.png b/src/my_plugin/example/web/icons/Icon-512.png new file mode 100644 index 0000000..88cfd48 Binary files /dev/null and b/src/my_plugin/example/web/icons/Icon-512.png differ diff --git a/src/my_plugin/example/web/icons/Icon-maskable-192.png b/src/my_plugin/example/web/icons/Icon-maskable-192.png new file mode 100644 index 0000000..eb9b4d7 Binary files /dev/null and b/src/my_plugin/example/web/icons/Icon-maskable-192.png differ diff --git a/src/my_plugin/example/web/icons/Icon-maskable-512.png b/src/my_plugin/example/web/icons/Icon-maskable-512.png new file mode 100644 index 0000000..d69c566 Binary files /dev/null and b/src/my_plugin/example/web/icons/Icon-maskable-512.png differ diff --git a/src/my_plugin/example/web/index.html b/src/my_plugin/example/web/index.html new file mode 100644 index 0000000..b6b9dd2 --- /dev/null +++ b/src/my_plugin/example/web/index.html @@ -0,0 +1,104 @@ + + + + + + + + + + + + + + + + + + + + example + + + + + + + diff --git a/src/my_plugin/example/web/manifest.json b/src/my_plugin/example/web/manifest.json new file mode 100644 index 0000000..096edf8 --- /dev/null +++ b/src/my_plugin/example/web/manifest.json @@ -0,0 +1,35 @@ +{ + "name": "example", + "short_name": "example", + "start_url": ".", + "display": "standalone", + "background_color": "#0175C2", + "theme_color": "#0175C2", + "description": "A new Flutter project.", + "orientation": "portrait-primary", + "prefer_related_applications": false, + "icons": [ + { + "src": "icons/Icon-192.png", + "sizes": "192x192", + "type": "image/png" + }, + { + "src": "icons/Icon-512.png", + "sizes": "512x512", + "type": "image/png" + }, + { + "src": "icons/Icon-maskable-192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "icons/Icon-maskable-512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ] +} diff --git a/src/my_plugin/pubspec.yaml b/src/my_plugin/pubspec.yaml index 95a4ec4..6622819 100644 --- a/src/my_plugin/pubspec.yaml +++ b/src/my_plugin/pubspec.yaml @@ -18,6 +18,8 @@ flutter: default_package: my_plugin_macos linux: default_package: my_plugin_linux + web: + default_package: my_plugin_web windows: default_package: my_plugin_windows @@ -34,6 +36,8 @@ dependencies: path: ../my_plugin_macos my_plugin_platform_interface: path: ../my_plugin_platform_interface + my_plugin_web: + path: ../my_plugin_web my_plugin_windows: path: ../my_plugin_windows diff --git a/src/my_plugin_web/.gitignore b/src/my_plugin_web/.gitignore new file mode 100644 index 0000000..53e92cc --- /dev/null +++ b/src/my_plugin_web/.gitignore @@ -0,0 +1,3 @@ +.packages +.flutter-plugins +pubspec.lock diff --git a/src/my_plugin_web/CHANGELOG.md b/src/my_plugin_web/CHANGELOG.md new file mode 100644 index 0000000..1455983 --- /dev/null +++ b/src/my_plugin_web/CHANGELOG.md @@ -0,0 +1,3 @@ +# 0.1.0+1 + +- Initial release of this plugin. \ No newline at end of file diff --git a/src/my_plugin_web/LICENSE b/src/my_plugin_web/LICENSE new file mode 100644 index 0000000..bba8e50 --- /dev/null +++ b/src/my_plugin_web/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Very Good Ventures + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/src/my_plugin_web/README.md b/src/my_plugin_web/README.md new file mode 100644 index 0000000..d54b182 --- /dev/null +++ b/src/my_plugin_web/README.md @@ -0,0 +1,14 @@ +# my_plugin_web + +[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link] + +The web implementation of `my_plugin`. + +## Usage + +This package is [endorsed][endorsed_link], which means you can simply use `my_plugin` +normally. This package will be automatically included in your app when you do. + +[endorsed_link]: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin +[very_good_analysis_badge]: https://img.shields.io/badge/style-very_good_analysis-B22C89.svg +[very_good_analysis_link]: https://pub.dev/packages/very_good_analysis diff --git a/src/my_plugin_web/analysis_options.yaml b/src/my_plugin_web/analysis_options.yaml new file mode 100644 index 0000000..44aef9a --- /dev/null +++ b/src/my_plugin_web/analysis_options.yaml @@ -0,0 +1 @@ +include: package:very_good_analysis/analysis_options.2.4.0.yaml diff --git a/src/my_plugin_web/lib/my_plugin_web.dart b/src/my_plugin_web/lib/my_plugin_web.dart new file mode 100644 index 0000000..7813c0c --- /dev/null +++ b/src/my_plugin_web/lib/my_plugin_web.dart @@ -0,0 +1,12 @@ +import 'package:my_plugin_platform_interface/my_plugin_platform_interface.dart'; + +/// The Web implementation of [MyPluginPlatform]. +class MyPluginWeb extends MyPluginPlatform { + /// Registers this class as the default instance of [MyPluginPlatform] + static void registerWith([Object? registrar]) { + MyPluginPlatform.instance = MyPluginWeb(); + } + + @override + Future getPlatformName() async => 'Web'; +} diff --git a/src/my_plugin_web/pubspec.yaml b/src/my_plugin_web/pubspec.yaml new file mode 100644 index 0000000..66a1677 --- /dev/null +++ b/src/my_plugin_web/pubspec.yaml @@ -0,0 +1,29 @@ +name: my_plugin_web +description: Web implementation of the my_plugin plugin +version: 0.1.0+1 +publish_to: none + +environment: + sdk: ">=2.16.0 <3.0.0" + flutter: ">=2.10.0" + +flutter: + plugin: + implements: my_plugin + platforms: + web: + pluginClass: MyPluginWeb + fileName: my_plugin_web.dart + +dependencies: + flutter: + sdk: flutter + flutter_web_plugins: + sdk: flutter + my_plugin_platform_interface: + path: ../my_plugin_platform_interface + +dev_dependencies: + flutter_test: + sdk: flutter + very_good_analysis: ^2.4.0 diff --git a/src/my_plugin_web/test/my_plugin_web_test.dart b/src/my_plugin_web/test/my_plugin_web_test.dart new file mode 100644 index 0000000..c663fd7 --- /dev/null +++ b/src/my_plugin_web/test/my_plugin_web_test.dart @@ -0,0 +1,26 @@ +import 'package:flutter_test/flutter_test.dart'; +import 'package:my_plugin_platform_interface/my_plugin_platform_interface.dart'; +import 'package:my_plugin_web/my_plugin_web.dart'; + +void main() { + TestWidgetsFlutterBinding.ensureInitialized(); + + group('MyPluginWeb', () { + const kPlatformName = 'Web'; + late MyPluginWeb myPlugin; + + setUp(() async { + myPlugin = MyPluginWeb(); + }); + + test('can be registered', () { + MyPluginWeb.registerWith(); + expect(MyPluginPlatform.instance, isA()); + }); + + test('getPlatformName returns correct name', () async { + final name = await myPlugin.getPlatformName(); + expect(name, equals(kPlatformName)); + }); + }); +}