diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index 1d8ef3c..e9fd454 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1,3 +1,3 @@
# Every request must be reviewed and accepted by:
-* @VeryGoodOpenSource/codeowners
+- @VeryGoodOpenSource/codeowners
diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml
index 399ad7e..cfc4271 100644
--- a/.github/dependabot.yaml
+++ b/.github/dependabot.yaml
@@ -20,3 +20,7 @@ updates:
directory: "/very_good_wear_app/e2e"
schedule:
interval: "daily"
+ - package-ecosystem: "pub"
+ directory: "/very_good_flutter_plugin/hooks"
+ schedule:
+ interval: "daily"
diff --git a/.github/workflows/very_good_flutter_plugin.yaml b/.github/workflows/very_good_flutter_plugin.yaml
new file mode 100644
index 0000000..3181880
--- /dev/null
+++ b/.github/workflows/very_good_flutter_plugin.yaml
@@ -0,0 +1,85 @@
+name: very_good_flutter_plugin
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+on:
+ push:
+ paths:
+ - .github/workflows/very_good_flutter_plugin.yaml
+ - "very_good_flutter_plugin/**"
+ branches:
+ - main
+ pull_request:
+ paths:
+ - .github/workflows/very_good_flutter_plugin.yaml
+ - "very_good_flutter_plugin/**"
+ branches:
+ - main
+
+jobs:
+ brick:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ flutter-version:
+ # The version of Flutter to use should use the minimum Dart SDK version supported by the package,
+ # refer to https://docs.flutter.dev/development/tools/sdk/releases.
+ - "3.13.0"
+ - "any"
+ platform:
+ - android
+ - ios
+ - linux
+ - macos
+ - web
+ - windows
+
+ steps:
+ - name: ๐ Git Checkout
+ uses: actions/checkout@v4
+
+ - name: ๐ฆ Setup Flutter
+ uses: subosito/flutter-action@v2
+ with:
+ flutter-version: ${{ matrix.flutter-version }}
+
+ - name: ๐งฑ Mason Make
+ run: |
+ dart pub global activate mason_cli
+ dart pub global activate very_good_cli
+ mason get
+ mason make very_good_flutter_plugin -c very_good_flutter_plugin/config.json -o output --on-conflict overwrite --platforms ${{ matrix.platform }}
+
+ - name: ๐ฆ Install Dependencies
+ run: very_good packages get --recursive output
+
+ - name: โจ Check Formatting
+ if: false
+ run: dart format --set-exit-if-changed output
+
+ - name: ๐ต๏ธ Analyze
+ if: false
+ run: dart analyze --fatal-infos --fatal-warnings output
+
+ - name: ๐งช Run Tests
+ run: |
+ cd output
+ very_good test -j 4 --recursive --optimization --coverage --test-randomize-ordering-seed random
+
+ - name: ๐ Combine Code Coverage
+ run: |
+ sudo apt-get -y install lcov
+ very_good packages get --recursive very_good_flutter_plugin/tool/merge_coverage
+ cd output
+ dart run ../very_good_flutter_plugin/tool/merge_coverage/merge_coverage.dart
+
+ - name: ๐ Check Code Coverage
+ uses: VeryGoodOpenSource/very_good_coverage@v2
+ with:
+ path: output/coverage/lcov.info
+ # TODO(alestiago): Remove once the following is solved:
+ # https://github.com/VeryGoodOpenSource/very_good_flutter_plugin/issues/158
+ min_coverage: 86
diff --git a/mason.yaml b/mason.yaml
index 2f36c90..ff702cf 100644
--- a/mason.yaml
+++ b/mason.yaml
@@ -12,4 +12,6 @@ bricks:
very_good_docs_site:
path: very_good_docs_site
very_good_flame_game:
- path: very_good_flame_game
\ No newline at end of file
+ path: very_good_flame_game
+ very_good_flutter_plugin:
+ path: very_good_flutter_plugin
\ No newline at end of file
diff --git a/very_good_flutter_plugin/.gitignore b/very_good_flutter_plugin/.gitignore
new file mode 100644
index 0000000..d0cbe67
--- /dev/null
+++ b/very_good_flutter_plugin/.gitignore
@@ -0,0 +1,55 @@
+.atom/
+.idea/
+.vscode/
+
+.packages
+.pub/
+.dart_tool/
+pubspec.lock
+flutter_export_environment.sh
+coverage/
+
+Podfile.lock
+Pods/
+.symlinks/
+**/Flutter/App.framework/
+**/Flutter/ephemeral/
+**/Flutter/Flutter.podspec
+**/Flutter/Flutter.framework/
+**/Flutter/Generated.xcconfig
+**/Flutter/flutter_assets/
+
+ServiceDefinitions.json
+xcuserdata/
+**/DerivedData/
+
+local.properties
+keystore.properties
+.gradle/
+gradlew
+gradlew.bat
+gradle-wrapper.jar
+.flutter-plugins-dependencies
+*.iml
+
+generated_plugin_registrant.cc
+generated_plugin_registrant.h
+generated_plugin_registrant.dart
+GeneratedPluginRegistrant.java
+GeneratedPluginRegistrant.h
+GeneratedPluginRegistrant.m
+GeneratedPluginRegistrant.swift
+build/
+.flutter-plugins
+
+.project
+.classpath
+.settings
+
+# Files and directories created by mason
+.mason/
+mason-lock.json
+output/
+
+# Files and directories created by MacOS
+.DS_Store
\ No newline at end of file
diff --git a/very_good_flutter_plugin/CHANGELOG.md b/very_good_flutter_plugin/CHANGELOG.md
new file mode 100644
index 0000000..65851ea
--- /dev/null
+++ b/very_good_flutter_plugin/CHANGELOG.md
@@ -0,0 +1,72 @@
+# 0.6.0
+
+- fix: flaky integrated tests
+- feat: upgrade to `very_good_analysis ^5.1.0`
+- feat: add fluttium test workflow
+- docs: add docs for integration tests
+
+# 0.5.0
+
+- feat!: bump min Dart SDK to 3.0.0
+
+# 0.4.0
+
+- feat!: bump min Dart SDK to 2.19.0
+
+# 0.3.3
+
+- chore: fix generator run
+- fix: updated regex matching
+- chore: support dart sdk 2.18.0
+
+# 0.3.2
+
+- feat: update workflows, dependabot generation, add spellcheck
+- fix: integration tests
+- feat: use swift in iOS plugin
+
+# 0.3.1
+
+- feat: upgrade to `very_good_analysis 4.0.0`
+
+# 0.3.0
+
+- feat: upgrade to flutter 3.7.1
+
+# 0.2.1
+
+- fix: windows path resolution
+- feat: add ci concurrency group to workflow
+
+# 0.2.0
+
+- **BREAKING** feat: add `publishable` flag (defaults to `false`)
+
+# 0.1.2
+
+- docs: remove copyright header and license from generated code
+
+# 0.1.1
+
+- feat: upgrade to Flutter 3.3.2
+- feat: upgrade to very_good_analysis 3.1.0
+
+# 0.1.0+1
+
+- docs: minor README updates
+ - add dependabot integration
+ - fix broken link to very_good_analysis
+
+# 0.1.0
+
+- feat: upgrade to Flutter 3.3.1
+- feat: upgrade to very_good_analysis 3.0.2
+- fix: dependabot integration
+
+# 0.0.1+1
+
+- chore: remove duplicate images from README
+
+# 0.0.1
+
+- feat: initial release ๐
diff --git a/very_good_flutter_plugin/LICENSE b/very_good_flutter_plugin/LICENSE
new file mode 100644
index 0000000..bba8e50
--- /dev/null
+++ b/very_good_flutter_plugin/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/very_good_flutter_plugin/README.md b/very_good_flutter_plugin/README.md
new file mode 100644
index 0000000..3d451b3
--- /dev/null
+++ b/very_good_flutter_plugin/README.md
@@ -0,0 +1,78 @@
+# Very Good Flutter Plugin
+
+[![Very Good Ventures][logo_white]][very_good_ventures_link]
+
+Developed with ๐ by [Very Good Ventures][very_good_ventures_link] ๐ฆ
+
+[![License: MIT][license_badge]][license_link]
+[![Powered by Mason](https://img.shields.io/endpoint?url=https%3A%2F%2Ftinyurl.com%2Fmason-badge)](https://github.com/felangel/mason)
+
+A Very Good federated Flutter plugin created by Very Good Ventures ๐ฆ.
+
+## What's Included โจ
+
+- โ
Federated Plugin Architecture
+- โ
Configurable Platforms (Android, iOS, MacOS, Linux, Web, Windows)
+- โ
GitHub Workflow powered by [Very Good Workflows][very_good_workflows_link]
+- โ
Strict lint rules powered by [Very Good Analysis][very_good_analysis_link]
+- โ
Pull Request Template
+- โ
Issue Templates
+- โ
Dependabot Integration
+- โ
100% Test Coverage
+- โ
Fully Documented Public API
+- โ
MIT License
+
+## Output ๐ฆ
+
+```
+โโโ .github
+โย ย โโโ ISSUE_TEMPLATE
+โย ย โโโ workflows
+โโโ my_plugin
+โย ย โโโ example
+โย ย โย ย โโโ android
+โย ย โย ย โโโ integration_test
+โย ย โย ย โโโ ios
+โย ย โย ย โโโ lib
+โย ย โย ย โโโ linux
+โย ย โย ย โโโ macos
+โย ย โย ย โโโ test_driver
+โย ย โย ย โโโ web
+โย ย โย ย โโโ windows
+โย ย โโโ lib
+โย ย โโโ test
+โโโ my_plugin_android
+โย ย โโโ android
+โย ย โโโ lib
+โย ย โโโ test
+โโโ my_plugin_ios
+โย ย โโโ ios
+โย ย โโโ lib
+โย ย โโโ test
+โโโ my_plugin_linux
+โย ย โโโ lib
+โย ย โโโ linux
+โย ย โโโ test
+โโโ my_plugin_macos
+โย ย โโโ lib
+โย ย โโโ macos
+โย ย โโโ test
+โโโ my_plugin_platform_interface
+โย ย โโโ lib
+โย ย โโโ test
+โโโ my_plugin_web
+โย ย โโโ lib
+โย ย โโโ test
+โโโ my_plugin_windows
+ โโโ lib
+ โโโ test
+ โโโ windows
+```
+
+[license_badge]: https://img.shields.io/badge/license-MIT-blue.svg
+[license_link]: https://opensource.org/licenses/MIT
+[logo_white]: https://raw.githubusercontent.com/VGVentures/very_good_brand/main/styles/README/vgv_logo_white.png
+[mason_link]: https://github.com/felangel/mason
+[very_good_analysis_link]: https://pub.dev/packages/very_good_analysis
+[very_good_ventures_link]: https://verygood.ventures
+[very_good_workflows_link]: https://github.com/VeryGoodOpenSource/very_good_workflows
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/bug_report.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/bug_report.md
new file mode 100644
index 0000000..50a4c7b
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/bug_report.md
@@ -0,0 +1,29 @@
+---
+name: Bug Report
+about: Create a report to help us improve
+title: "fix: "
+labels: bug
+---
+
+**Description**
+
+A clear and concise description of what the bug is.
+
+**Steps To Reproduce**
+
+1. Go to '...'
+2. Click on '....'
+3. Scroll down to '....'
+4. See error
+
+**Expected Behavior**
+
+A clear and concise description of what you expected to happen.
+
+**Screenshots**
+
+If applicable, add screenshots to help explain your problem.
+
+**Additional Context**
+
+Add any other context about the problem here.
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/build.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/build.md
new file mode 100644
index 0000000..0cf8e62
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/build.md
@@ -0,0 +1,14 @@
+---
+name: Build System
+about: Changes that affect the build system or external dependencies
+title: "build: "
+labels: build
+---
+
+**Description**
+
+Describe what changes need to be done to the build system and why.
+
+**Requirements**
+
+- [ ] The build system is passing
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/chore.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/chore.md
new file mode 100644
index 0000000..498ebfd
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/chore.md
@@ -0,0 +1,14 @@
+---
+name: Chore
+about: Other changes that don't modify src or test files
+title: "chore: "
+labels: chore
+---
+
+**Description**
+
+Clearly describe what change is needed and why. If this changes code then please use another issue type.
+
+**Requirements**
+
+- [ ] No functional changes to the code
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/ci.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/ci.md
new file mode 100644
index 0000000..fa2dd9e
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/ci.md
@@ -0,0 +1,14 @@
+---
+name: Continuous Integration
+about: Changes to the CI configuration files and scripts
+title: "ci: "
+labels: ci
+---
+
+**Description**
+
+Describe what changes need to be done to the ci/cd system and why.
+
+**Requirements**
+
+- [ ] The ci system is passing
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/config.yml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/config.yml
new file mode 100644
index 0000000..ec4bb38
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/config.yml
@@ -0,0 +1 @@
+blank_issues_enabled: false
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/documentation.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/documentation.md
new file mode 100644
index 0000000..f494a4d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/documentation.md
@@ -0,0 +1,14 @@
+---
+name: Documentation
+about: Improve the documentation so all collaborators have a common understanding
+title: "docs: "
+labels: documentation
+---
+
+**Description**
+
+Clearly describe what documentation you are looking to add or improve.
+
+**Requirements**
+
+- [ ] Requirements go here
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/feature_request.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/feature_request.md
new file mode 100644
index 0000000..ddd2fcc
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/feature_request.md
@@ -0,0 +1,18 @@
+---
+name: Feature Request
+about: A new feature to be added to the project
+title: "feat: "
+labels: feature
+---
+
+**Description**
+
+Clearly describe what you are looking to add. The more context the better.
+
+**Requirements**
+
+- [ ] Checklist of requirements to be fulfilled
+
+**Additional Context**
+
+Add any other context or screenshots about the feature request go here.
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/performance.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/performance.md
new file mode 100644
index 0000000..699b8d4
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/performance.md
@@ -0,0 +1,14 @@
+---
+name: Performance Update
+about: A code change that improves performance
+title: "perf: "
+labels: performance
+---
+
+**Description**
+
+Clearly describe what code needs to be changed and what the performance impact is going to be. Bonus point's if you can tie this directly to user experience.
+
+**Requirements**
+
+- [ ] There is no drop in test coverage.
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/refactor.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/refactor.md
new file mode 100644
index 0000000..1626c57
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/refactor.md
@@ -0,0 +1,14 @@
+---
+name: Refactor
+about: A code change that neither fixes a bug nor adds a feature
+title: "refactor: "
+labels: refactor
+---
+
+**Description**
+
+Clearly describe what needs to be refactored and why. Please provide links to related issues (bugs or upcoming features) in order to help prioritize.
+
+**Requirements**
+
+- [ ] There is no drop in test coverage.
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/revert.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/revert.md
new file mode 100644
index 0000000..9d121dc
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/revert.md
@@ -0,0 +1,16 @@
+---
+name: Revert Commit
+about: Reverts a previous commit
+title: "revert: "
+labels: revert
+---
+
+**Description**
+
+Provide a link to a PR/Commit that you are looking to revert and why.
+
+**Requirements**
+
+- [ ] Change has been reverted
+- [ ] No change in test coverage has happened
+- [ ] A new ticket is created for any follow on work that needs to happen
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/style.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/style.md
new file mode 100644
index 0000000..02244a7
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/style.md
@@ -0,0 +1,14 @@
+---
+name: Style Changes
+about: Changes that do not affect the meaning of the code (white space, formatting, missing semi-colons, etc)
+title: "style: "
+labels: style
+---
+
+**Description**
+
+Clearly describe what you are looking to change and why.
+
+**Requirements**
+
+- [ ] There is no drop in test coverage.
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/test.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/test.md
new file mode 100644
index 0000000..431a7ea
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/ISSUE_TEMPLATE/test.md
@@ -0,0 +1,14 @@
+---
+name: Test
+about: Adding missing tests or correcting existing tests
+title: "test: "
+labels: test
+---
+
+**Description**
+
+List out the tests that need to be added or changed. Please also include any information as to why this was not covered in the past.
+
+**Requirements**
+
+- [ ] There is no drop in test coverage.
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/PULL_REQUEST_TEMPLATE.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..6b9372e
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,23 @@
+
+
+## Description
+
+
+
+## Type of Change
+
+
+
+- [ ] โจ New feature (non-breaking change which adds functionality)
+- [ ] ๐ ๏ธ Bug fix (non-breaking change which fixes an issue)
+- [ ] โ Breaking change (fix or feature that would cause existing functionality to change)
+- [ ] ๐งน Code refactor
+- [ ] โ
Build configuration change
+- [ ] ๐ Documentation
+- [ ] ๐๏ธ Chore
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/cspell.json b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/cspell.json
new file mode 100644
index 0000000..bdf826f
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/cspell.json
@@ -0,0 +1,21 @@
+{
+ "version": "0.2",
+ "$schema": "https://raw.githubusercontent.com/streetsidesoftware/cspell/main/cspell.schema.json",
+ "dictionaries": ["vgv_allowed", "vgv_forbidden"],
+ "dictionaryDefinitions": [
+ {
+ "name": "vgv_allowed",
+ "path": "https://raw.githubusercontent.com/verygoodopensource/very_good_dictionaries/main/allowed.txt",
+ "description": "Allowed VGV Spellings"
+ },
+ {
+ "name": "vgv_forbidden",
+ "path": "https://raw.githubusercontent.com/verygoodopensource/very_good_dictionaries/main/forbidden.txt",
+ "description": "Forbidden VGV Spellings"
+ }
+ ],
+ "useGitignore": true,
+ "words": [
+ "fluttium"
+ ]
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/dependabot.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/dependabot.yaml
new file mode 100644
index 0000000..7258993
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/dependabot.yaml
@@ -0,0 +1,43 @@
+version: 2
+enable-beta-ecosystems: true
+updates:
+ - package-ecosystem: "github-actions"
+ directory: "/"
+ schedule:
+ interval: "daily"
+ - package-ecosystem: "pub"
+ directory: "/{{project_name.snakeCase()}}"
+ schedule:
+ interval: "daily"
+ - package-ecosystem: "pub"
+ directory: "/{{project_name.snakeCase()}}/example"
+ schedule:
+ interval: "daily"
+ - package-ecosystem: "pub"
+ directory: "/{{project_name.snakeCase()}}_platform_interface"
+ schedule:
+ interval: "daily"{{#android}}
+ - package-ecosystem: "pub"
+ directory: "/{{project_name.snakeCase()}}_android"
+ schedule:
+ interval: "daily"{{/android}}{{#ios}}
+ - package-ecosystem: "pub"
+ directory: "/{{project_name.snakeCase()}}_ios"
+ schedule:
+ interval: "daily"{{/ios}}{{#linux}}
+ - package-ecosystem: "pub"
+ directory: "/{{project_name.snakeCase()}}_linux"
+ schedule:
+ interval: "daily"{{/linux}}{{#macos}}
+ - package-ecosystem: "pub"
+ directory: "/{{project_name.snakeCase()}}_macos"
+ schedule:
+ interval: "daily"{{/macos}}{{#web}}
+ - package-ecosystem: "pub"
+ directory: "/{{project_name.snakeCase()}}_web"
+ schedule:
+ interval: "daily"{{/web}}{{#windows}}
+ - package-ecosystem: "pub"
+ directory: "/{{project_name.snakeCase()}}_windows"
+ schedule:
+ interval: "daily"{{/windows}}
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/ci.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/ci.yaml
new file mode 100644
index 0000000..112f425
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/ci.yaml
@@ -0,0 +1,10 @@
+name: ci
+
+on:
+ pull_request:
+ branches:
+ - main
+
+jobs:
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/semantic_pull_request.yml@v1
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#android}}{{project_name.snakeCase()}}_android.yaml{{/android}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#android}}{{project_name.snakeCase()}}_android.yaml{{/android}}
new file mode 100644
index 0000000..51ea2c2
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#android}}{{project_name.snakeCase()}}_android.yaml{{/android}}
@@ -0,0 +1,29 @@
+name: {{project_name.snakeCase()}}_android
+
+concurrency:
+ group: ${{#mustacheCase}}github.workflow{{/mustacheCase}}-${{#mustacheCase}}github.ref{{/mustacheCase}}
+ cancel-in-progress: true
+
+on:
+ pull_request:
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_android.yaml"
+ - "{{project_name.snakeCase()}}_android/**"
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_android.yaml"
+ - "{{project_name.snakeCase()}}_android/**"
+
+jobs:
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
+ with:
+ flutter_channel: stable
+ flutter_version: 3.13.2
+ working_directory: {{project_name.snakeCase()}}_android
+{{#publishable}}
+ pana:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/pana.yml@v1
+{{/publishable}}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#ios}}{{project_name.snakeCase()}}_ios.yaml{{/ios}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#ios}}{{project_name.snakeCase()}}_ios.yaml{{/ios}}
new file mode 100644
index 0000000..426dce7
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#ios}}{{project_name.snakeCase()}}_ios.yaml{{/ios}}
@@ -0,0 +1,29 @@
+name: {{project_name.snakeCase()}}_ios
+
+concurrency:
+ group: ${{#mustacheCase}}github.workflow{{/mustacheCase}}-${{#mustacheCase}}github.ref{{/mustacheCase}}
+ cancel-in-progress: true
+
+on:
+ pull_request:
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_ios.yaml"
+ - "{{project_name.snakeCase()}}_ios/**"
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_ios.yaml"
+ - "{{project_name.snakeCase()}}_ios/**"
+
+jobs:
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
+ with:
+ flutter_channel: stable
+ flutter_version: 3.13.2
+ working_directory: {{project_name.snakeCase()}}_ios
+{{#publishable}}
+ pana:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/pana.yml@v1
+{{/publishable}}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#linux}}{{project_name.snakeCase()}}_linux.yaml{{/linux}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#linux}}{{project_name.snakeCase()}}_linux.yaml{{/linux}}
new file mode 100644
index 0000000..30ae37b
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#linux}}{{project_name.snakeCase()}}_linux.yaml{{/linux}}
@@ -0,0 +1,29 @@
+name: {{project_name.snakeCase()}}_linux
+
+concurrency:
+ group: ${{#mustacheCase}}github.workflow{{/mustacheCase}}-${{#mustacheCase}}github.ref{{/mustacheCase}}
+ cancel-in-progress: true
+
+on:
+ pull_request:
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_linux.yaml"
+ - "{{project_name.snakeCase()}}_linux/**"
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_linux.yaml"
+ - "{{project_name.snakeCase()}}_linux/**"
+
+jobs:
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
+ with:
+ flutter_channel: stable
+ flutter_version: 3.13.2
+ working_directory: {{project_name.snakeCase()}}_linux
+{{#publishable}}
+ pana:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/pana.yml@v1
+{{/publishable}}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#macos}}{{project_name.snakeCase()}}_macos.yaml{{/macos}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#macos}}{{project_name.snakeCase()}}_macos.yaml{{/macos}}
new file mode 100644
index 0000000..93703a3
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#macos}}{{project_name.snakeCase()}}_macos.yaml{{/macos}}
@@ -0,0 +1,29 @@
+name: {{project_name.snakeCase()}}_macos
+
+concurrency:
+ group: ${{#mustacheCase}}github.workflow{{/mustacheCase}}-${{#mustacheCase}}github.ref{{/mustacheCase}}
+ cancel-in-progress: true
+
+on:
+ pull_request:
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_macos.yaml"
+ - "{{project_name.snakeCase()}}_macos/**"
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_macos.yaml"
+ - "{{project_name.snakeCase()}}_macos/**"
+
+jobs:
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
+ with:
+ flutter_channel: stable
+ flutter_version: 3.13.2
+ working_directory: {{project_name.snakeCase()}}_macos
+{{#publishable}}
+ pana:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/pana.yml@v1
+{{/publishable}}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#web}}{{project_name.snakeCase()}}_web.yaml{{/web}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#web}}{{project_name.snakeCase()}}_web.yaml{{/web}}
new file mode 100644
index 0000000..4d1537c
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#web}}{{project_name.snakeCase()}}_web.yaml{{/web}}
@@ -0,0 +1,29 @@
+name: {{project_name.snakeCase()}}_web
+
+concurrency:
+ group: ${{#mustacheCase}}github.workflow{{/mustacheCase}}-${{#mustacheCase}}github.ref{{/mustacheCase}}
+ cancel-in-progress: true
+
+on:
+ pull_request:
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_web.yaml"
+ - "{{project_name.snakeCase()}}_web/**"
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_web.yaml"
+ - "{{project_name.snakeCase()}}_web/**"
+
+jobs:
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
+ with:
+ flutter_channel: stable
+ flutter_version: 3.13.2
+ working_directory: {{project_name.snakeCase()}}_web
+{{#publishable}}
+ pana:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/pana.yml@v1
+{{/publishable}}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#windows}}{{project_name.snakeCase()}}_windows.yaml{{/windows}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#windows}}{{project_name.snakeCase()}}_windows.yaml{{/windows}}
new file mode 100644
index 0000000..41ca1ee
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{#windows}}{{project_name.snakeCase()}}_windows.yaml{{/windows}}
@@ -0,0 +1,29 @@
+name: {{project_name.snakeCase()}}_windows
+
+concurrency:
+ group: ${{#mustacheCase}}github.workflow{{/mustacheCase}}-${{#mustacheCase}}github.ref{{/mustacheCase}}
+ cancel-in-progress: true
+
+on:
+ pull_request:
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_windows.yaml"
+ - "{{project_name.snakeCase()}}_windows/**"
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_windows.yaml"
+ - "{{project_name.snakeCase()}}_windows/**"
+
+jobs:
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
+ with:
+ flutter_channel: stable
+ flutter_version: 3.13.2
+ working_directory: {{project_name.snakeCase()}}_windows
+{{#publishable}}
+ pana:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/pana.yml@v1
+{{/publishable}}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{project_name.snakeCase()}}.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{project_name.snakeCase()}}.yaml
new file mode 100644
index 0000000..30561e6
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{project_name.snakeCase()}}.yaml
@@ -0,0 +1,185 @@
+name: {{project_name.snakeCase()}}
+
+concurrency:
+ group: ${{#mustacheCase}}github.workflow{{/mustacheCase}}-${{#mustacheCase}}github.ref{{/mustacheCase}}
+ cancel-in-progress: true
+
+on:
+ pull_request:
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}.yaml"
+ - "{{project_name.snakeCase()}}/**"
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}.yaml"
+ - "{{project_name.snakeCase()}}/**"
+
+jobs:
+ spell-check:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/spell_check.yml@v1
+ with:
+ includes: |
+ **/*.md
+ !brick/**/*.md
+ .*/**/*.md
+ modified_files_only: false
+
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
+ with:
+ flutter_channel: stable
+ flutter_version: 3.13.2
+ working_directory: {{project_name.snakeCase()}}
+{{#publishable}}
+ pana:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/pana.yml@v1
+{{/publishable}}
+
+ android:
+ runs-on: macos-latest
+
+ defaults:
+ run:
+ working-directory: {{project_name.snakeCase()}}/example
+
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/setup-java@v3
+ with:
+ distribution: "temurin"
+ java-version: "11"
+
+ - uses: subosito/flutter-action@v2
+
+ - name: Install Fluttium
+ run: flutter pub global activate fluttium_cli
+
+ - name: AVD Cache
+ uses: actions/cache@v3
+ id: avd-cache
+ with:
+ path: |
+ ~/.android/avd/*
+ ~/.android/adb*
+ key: avd-29
+
+ - name: Cache AVD Snapshot
+ if: steps.avd-cache.outputs.cache-hit != 'true'
+ uses: reactivecircus/android-emulator-runner@v2
+ with:
+ api-level: 29
+ force-avd-creation: false
+ emulator-options: -no-window -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
+ disable-animations: false
+ script: echo "Generated AVD snapshot for caching."
+
+ - name: E2E Tests
+ uses: reactivecircus/android-emulator-runner@v2
+ with:
+ api-level: 29
+ script: fluttium test flows/test_platform_name.yaml -d android
+ working-directory: {{project_name.snakeCase()}}/example
+
+ ios:
+ runs-on: macos-latest
+
+ defaults:
+ run:
+ working-directory: {{project_name.snakeCase()}}/example
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: subosito/flutter-action@v2
+
+ - name: Install Fluttium
+ run: flutter pub global activate fluttium_cli
+
+ - name: Start Simulator
+ # Start an iPhone simulator
+ run: |
+ UDID=$(xcrun xctrace list devices | grep "^iPhone" | awk '{gsub(/[()]/,""); print $NF}' | head -n 1)
+ echo $UDID
+ xcrun simctl boot "${UDID:?No Simulator with this name found}"
+
+ - name: E2E Tests
+ run: fluttium test flows/test_platform_name.yaml -d iPhone
+
+ linux:
+ runs-on: ubuntu-latest
+ if: false # todo(renancaraujo): https://github.com/wolfenrain/fluttium/issues/345
+ defaults:
+ run:
+ working-directory: {{project_name.snakeCase()}}/example
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - 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: Install Fluttium
+ run: flutter pub global activate fluttium_cli
+
+ - name: E2E Tests
+ run: xvfb-run fluttium test flows/test_platform_name.yaml -d linux
+
+ macos:
+ runs-on: macos-13
+
+ defaults:
+ run:
+ working-directory: {{project_name.snakeCase()}}/example
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: subosito/flutter-action@v2
+
+ - name: Install Fluttium
+ run: flutter pub global activate fluttium_cli
+
+ - name: E2E Tests
+ run: fluttium test flows/test_platform_name.yaml -d macos
+
+ web:
+ runs-on: ubuntu-latest
+
+ defaults:
+ run:
+ working-directory: {{project_name.snakeCase()}}/example
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: subosito/flutter-action@v2
+
+ - name: Install Fluttium
+ run: flutter pub global activate fluttium_cli
+
+ - name: E2E Tests
+ run: xvfb-run fluttium test flows/test_platform_name.yaml -d chrome
+
+ windows:
+ runs-on: windows-2019
+
+ defaults:
+ run:
+ working-directory: {{project_name.snakeCase()}}/example
+
+ steps:
+ - uses: actions/checkout@v4
+
+ - uses: subosito/flutter-action@v2
+
+ - name: Install Fluttium
+ run: flutter pub global activate fluttium_cli
+
+ - name: E2E Tests
+ run: fluttium test flows/test_platform_name.yaml -d windows
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{project_name.snakeCase()}}_platform_interface.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{project_name.snakeCase()}}_platform_interface.yaml
new file mode 100644
index 0000000..7b93bdf
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.github/workflows/{{project_name.snakeCase()}}_platform_interface.yaml
@@ -0,0 +1,29 @@
+name: {{project_name.snakeCase()}}_platform_interface
+
+concurrency:
+ group: ${{#mustacheCase}}github.workflow{{/mustacheCase}}-${{#mustacheCase}}github.ref{{/mustacheCase}}
+ cancel-in-progress: true
+
+on:
+ pull_request:
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_platform_interface.yaml"
+ - "{{project_name.snakeCase()}}_platform_interface/**"
+ push:
+ branches:
+ - main
+ paths:
+ - ".github/workflows/{{project_name.snakeCase()}}_platform_interface.yaml"
+ - "{{project_name.snakeCase()}}_platform_interface/**"
+
+jobs:
+ build:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/flutter_package.yml@v1
+ with:
+ flutter_channel: stable
+ flutter_version: 3.13.2
+ working_directory: {{project_name.snakeCase()}}_platform_interface
+{{#publishable}}
+ pana:
+ uses: VeryGoodOpenSource/very_good_workflows/.github/workflows/pana.yml@v1
+{{/publishable}}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.gitignore b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.gitignore
new file mode 100644
index 0000000..4aa0df8
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/.gitignore
@@ -0,0 +1,48 @@
+.DS_Store
+.atom/
+.idea/
+.vscode/
+
+.packages
+.pub/
+.dart_tool/
+pubspec.lock
+flutter_export_environment.sh
+coverage/
+
+Podfile.lock
+Pods/
+.symlinks/
+**/Flutter/App.framework/
+**/Flutter/ephemeral/
+**/Flutter/Flutter.podspec
+**/Flutter/Flutter.framework/
+**/Flutter/Generated.xcconfig
+**/Flutter/flutter_assets/
+
+ServiceDefinitions.json
+xcuserdata/
+**/DerivedData/
+
+local.properties
+keystore.properties
+.gradle/
+gradlew
+gradlew.bat
+gradle-wrapper.jar
+.flutter-plugins-dependencies
+*.iml
+
+generated_plugin_registrant.cc
+generated_plugin_registrant.h
+generated_plugin_registrant.dart
+GeneratedPluginRegistrant.java
+GeneratedPluginRegistrant.h
+GeneratedPluginRegistrant.m
+GeneratedPluginRegistrant.swift
+build/
+.flutter-plugins
+
+.project
+.classpath
+.settings
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/README.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/README.md
new file mode 100644
index 0000000..16773d5
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/README.md
@@ -0,0 +1,43 @@
+# {{project_name.snakeCase()}}
+
+[![Very Good Ventures][logo_white]][very_good_ventures_link_dark]
+[![Very Good Ventures][logo_black]][very_good_ventures_link_light]
+
+Developed with ๐ by [Very Good Ventures][very_good_ventures_link] ๐ฆ
+
+![coverage][coverage_badge]
+[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
+[![License: MIT][license_badge]][license_link]
+
+A Very Good Flutter Federated Plugin created by the [Very Good Ventures Team][very_good_ventures_link].
+
+Generated by the [Very Good CLI][very_good_cli_link] ๐ค
+
+
+### Integration tests ๐งช
+
+Very Good Flutter Plugin uses [fluttium][fluttium_link] for integration tests. Those tests are located
+in the front facing package `{{project_name.snakeCase()}}` example.
+
+**โ In order to run the integration tests, you need to have the `fluttium_cli` installed. [See how][fluttium_install].**
+
+To run the integration tests, run the following command from the root of the project:
+
+```sh
+cd {{project_name.snakeCase()}}/example
+fluttium test flows/test_platform_name.yaml
+```
+
+[coverage_badge]: {{project_name.snakeCase()}}/coverage_badge.svg
+[license_badge]: https://img.shields.io/badge/license-MIT-blue.svg
+[license_link]: https://opensource.org/licenses/MIT
+[logo_black]: https://raw.githubusercontent.com/VGVentures/very_good_brand/main/styles/README/vgv_logo_black.png#gh-light-mode-only
+[logo_white]: https://raw.githubusercontent.com/VGVentures/very_good_brand/main/styles/README/vgv_logo_white.png#gh-dark-mode-only
+[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
+[very_good_cli_link]: https://github.com/VeryGoodOpenSource/very_good_cli
+[very_good_ventures_link]: https://verygood.ventures/?utm_source=github&utm_medium=banner&utm_campaign=core
+[very_good_ventures_link_dark]: https://verygood.ventures/?utm_source=github&utm_medium=banner&utm_campaign=core#gh-dark-mode-only
+[very_good_ventures_link_light]: https://verygood.ventures/?utm_source=github&utm_medium=banner&utm_campaign=core#gh-light-mode-only
+[fluttium_link]: https://fluttium.dev/
+[fluttium_install]: https://fluttium.dev/docs/getting-started/installing-cli
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/README.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/README.md
new file mode 100644
index 0000000..6ae10bf
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/README.md
@@ -0,0 +1,14 @@
+# {{project_name.snakeCase()}}_android
+
+[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
+
+The Android implementation of `{{project_name.snakeCase()}}`.
+
+## Usage
+
+This package is [endorsed][endorsed_link], which means you can simply use `{{project_name.snakeCase()}}`
+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
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/analysis_options.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/analysis_options.yaml
new file mode 100644
index 0000000..799268d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:very_good_analysis/analysis_options.5.1.0.yaml
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/.gitignore b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/.gitignore
new file mode 100644
index 0000000..2665975
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/.gitignore
@@ -0,0 +1,8 @@
+*.iml
+.gradle
+/local.properties
+/.idea/workspace.xml
+/.idea/libraries
+.DS_Store
+/build
+/captures
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/build.gradle b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/build.gradle
new file mode 100644
index 0000000..ede4656
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/build.gradle
@@ -0,0 +1,50 @@
+group '{{org_name.dotCase()}}'
+version '1.0-SNAPSHOT'
+
+buildscript {
+ ext.kotlin_version = '1.3.50'
+ repositories {
+ google()
+ mavenCentral()
+ }
+
+ dependencies {
+ classpath 'com.android.tools.build:gradle:4.1.0'
+ classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+ }
+}
+
+rootProject.allprojects {
+ repositories {
+ google()
+ mavenCentral()
+ }
+}
+
+apply plugin: 'com.android.library'
+apply plugin: 'kotlin-android'
+
+android {
+ compileSdkVersion 30
+
+ compileOptions {
+ sourceCompatibility JavaVersion.VERSION_1_8
+ targetCompatibility JavaVersion.VERSION_1_8
+ }
+
+ kotlinOptions {
+ jvmTarget = '1.8'
+ }
+
+ sourceSets {
+ main.java.srcDirs += 'src/main/kotlin'
+ }
+
+ defaultConfig {
+ minSdkVersion 16
+ }
+}
+
+dependencies {
+ implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+}
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/settings.gradle b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/settings.gradle
new file mode 100644
index 0000000..492fba4
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/settings.gradle
@@ -0,0 +1 @@
+rootProject.name = '{{project_name.snakeCase()}}_android'
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/src/main/AndroidManifest.xml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..5271e49
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/src/main/AndroidManifest.xml
@@ -0,0 +1,3 @@
+
+
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/src/main/kotlin/{{org_name.pathCase()}}/{{project_name.pascalCase()}}Plugin.kt b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/src/main/kotlin/{{org_name.pathCase()}}/{{project_name.pascalCase()}}Plugin.kt
new file mode 100644
index 0000000..43ce513
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/android/src/main/kotlin/{{org_name.pathCase()}}/{{project_name.pascalCase()}}Plugin.kt
@@ -0,0 +1,34 @@
+package {{org_name.dotCase()}}
+
+import android.content.Context
+import androidx.annotation.NonNull
+
+import io.flutter.embedding.engine.plugins.FlutterPlugin
+import io.flutter.plugin.common.MethodCall
+import io.flutter.plugin.common.MethodChannel
+import io.flutter.plugin.common.MethodChannel.MethodCallHandler
+import io.flutter.plugin.common.MethodChannel.Result
+
+class {{project_name.pascalCase()}}Plugin : FlutterPlugin, MethodCallHandler {
+ private lateinit var channel: MethodChannel
+ private var context: Context? = null
+
+ override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
+ channel = MethodChannel(flutterPluginBinding.binaryMessenger, "{{project_name.snakeCase()}}_android")
+ channel.setMethodCallHandler(this)
+ context = flutterPluginBinding.applicationContext
+ }
+
+ override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: Result) {
+ if (call.method == "getPlatformName") {
+ result.success("Android")
+ } else {
+ result.notImplemented()
+ }
+ }
+
+ override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
+ channel.setMethodCallHandler(null)
+ context = null
+ }
+}
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/lib/{{project_name.snakeCase()}}_android.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/lib/{{project_name.snakeCase()}}_android.dart
new file mode 100644
index 0000000..8acdb78
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/lib/{{project_name.snakeCase()}}_android.dart
@@ -0,0 +1,20 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+/// The Android implementation of [{{project_name.pascalCase()}}Platform].
+class {{project_name.pascalCase()}}Android extends {{project_name.pascalCase()}}Platform {
+ /// The method channel used to interact with the native platform.
+ @visibleForTesting
+ final methodChannel = const MethodChannel('{{project_name.snakeCase()}}_android');
+
+ /// Registers this class as the default instance of [{{project_name.pascalCase()}}Platform]
+ static void registerWith() {
+ {{project_name.pascalCase()}}Platform.instance = {{project_name.pascalCase()}}Android();
+ }
+
+ @override
+ Future getPlatformName() {
+ return methodChannel.invokeMethod('getPlatformName');
+ }
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/pubspec.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/pubspec.yaml
new file mode 100644
index 0000000..5093057
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/pubspec.yaml
@@ -0,0 +1,28 @@
+name: {{project_name.snakeCase()}}_android
+description: Android implementation of the {{project_name.snakeCase()}} plugin
+version: 0.1.0+1
+{{^publishable}}publish_to: none{{/publishable}}
+
+environment:
+ sdk: ">=3.0.0 <4.0.0"
+
+flutter:
+ plugin:
+ implements: {{project_name.snakeCase()}}
+ platforms:
+ android:
+ package: {{org_name.dotCase()}}
+ pluginClass: {{project_name.pascalCase()}}Plugin
+ dartPluginClass: {{project_name.pascalCase()}}Android
+
+dependencies:
+ flutter:
+ sdk: flutter
+ {{project_name.snakeCase()}}_platform_interface:
+ path: ../{{project_name.snakeCase()}}_platform_interface
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ plugin_platform_interface: ^2.0.0
+ very_good_analysis: ^5.1.0
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/test/{{project_name.snakeCase()}}_android_test.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/test/{{project_name.snakeCase()}}_android_test.dart
new file mode 100644
index 0000000..fea8422
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/test/{{project_name.snakeCase()}}_android_test.dart
@@ -0,0 +1,44 @@
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:{{project_name.snakeCase()}}_android/{{project_name.snakeCase()}}_android.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+void main() {
+ TestWidgetsFlutterBinding.ensureInitialized();
+
+ group('{{project_name.pascalCase()}}Android', () {
+ const kPlatformName = 'Android';
+ late {{project_name.pascalCase()}}Android {{project_name.camelCase()}};
+ late List log;
+
+ setUp(() async {
+ {{project_name.camelCase()}} = {{project_name.pascalCase()}}Android();
+
+ log = [];
+ TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
+ .setMockMethodCallHandler({{project_name.camelCase()}}.methodChannel, (methodCall) async {
+ log.add(methodCall);
+ switch (methodCall.method) {
+ case 'getPlatformName':
+ return kPlatformName;
+ default:
+ return null;
+ }
+ });
+ });
+
+ test('can be registered', () {
+ {{project_name.pascalCase()}}Android.registerWith();
+ expect({{project_name.pascalCase()}}Platform.instance, isA<{{project_name.pascalCase()}}Android>());
+ });
+
+ test('getPlatformName returns correct name', () async {
+ final name = await {{project_name.camelCase()}}.getPlatformName();
+ expect(
+ log,
+ [isMethodCall('getPlatformName', arguments: null)],
+ );
+ expect(name, equals(kPlatformName));
+ });
+ });
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/{{#publishable}}CHANGELOG.md{{/publishable}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/{{#publishable}}CHANGELOG.md{{/publishable}}
new file mode 100644
index 0000000..1455983
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#android}}{{project_name.snakeCase()}}_android{{/android}}/{{#publishable}}CHANGELOG.md{{/publishable}}
@@ -0,0 +1,3 @@
+# 0.1.0+1
+
+- Initial release of this plugin.
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/README.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/README.md
new file mode 100644
index 0000000..bb0a783
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/README.md
@@ -0,0 +1,14 @@
+# {{project_name.snakeCase()}}_ios
+
+[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
+
+The ios implementation of `{{project_name.snakeCase()}}`.
+
+## Usage
+
+This package is [endorsed][endorsed_link], which means you can simply use `{{project_name.snakeCase()}}`
+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
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/analysis_options.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/analysis_options.yaml
new file mode 100644
index 0000000..799268d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:very_good_analysis/analysis_options.5.1.0.yaml
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/ios/Classes/{{project_name.pascalCase()}}Plugin.swift b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/ios/Classes/{{project_name.pascalCase()}}Plugin.swift
new file mode 100644
index 0000000..40605ee
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/ios/Classes/{{project_name.pascalCase()}}Plugin.swift
@@ -0,0 +1,14 @@
+import Flutter
+import UIKit
+
+public class {{project_name.pascalCase()}}Plugin: NSObject, FlutterPlugin {
+ public static func register(with registrar: FlutterPluginRegistrar) {
+ let channel = FlutterMethodChannel(name: "{{project_name.snakeCase()}}_ios", binaryMessenger: registrar.messenger())
+ let instance = {{project_name.pascalCase()}}Plugin()
+ registrar.addMethodCallDelegate(instance, channel: channel)
+ }
+
+ public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
+ result("iOS")
+ }
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/ios/{{project_name.snakeCase()}}_ios.podspec b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/ios/{{project_name.snakeCase()}}_ios.podspec
new file mode 100644
index 0000000..4a38075
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/ios/{{project_name.snakeCase()}}_ios.podspec
@@ -0,0 +1,22 @@
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
+#
+Pod::Spec.new do |s|
+ s.name = '{{project_name.snakeCase()}}_ios'
+ s.version = '0.0.1'
+ s.summary = 'An iOS implementation of the {{project_name.snakeCase()}} plugin.'
+ s.description = <<-DESC
+ An iOS implementation of the {{project_name.snakeCase()}} plugin.
+ DESC
+ s.homepage = 'http://example.com'
+ s.license = { :type => 'BSD', :file => '../LICENSE' }
+ s.author = { 'Your Company' => 'email@example.com' }
+ s.source = { :path => '.' }
+ s.source_files = 'Classes/**/*'
+ s.dependency 'Flutter'
+ s.platform = :ios, '9.0'
+
+ # Flutter.framework does not contain a i386 slice.
+ s.pod_target_xcconfig = { 'DEFINES_MODULE' => 'YES', 'EXCLUDED_ARCHS[sdk=iphonesimulator*]' => 'i386' }
+ s.swift_version = '5.0'
+end
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/lib/{{project_name.snakeCase()}}_ios.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/lib/{{project_name.snakeCase()}}_ios.dart
new file mode 100644
index 0000000..480639c
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/lib/{{project_name.snakeCase()}}_ios.dart
@@ -0,0 +1,20 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+/// The iOS implementation of [{{project_name.pascalCase()}}Platform].
+class {{project_name.pascalCase()}}IOS extends {{project_name.pascalCase()}}Platform {
+ /// The method channel used to interact with the native platform.
+ @visibleForTesting
+ final methodChannel = const MethodChannel('{{project_name.snakeCase()}}_ios');
+
+ /// Registers this class as the default instance of [{{project_name.pascalCase()}}Platform]
+ static void registerWith() {
+ {{project_name.pascalCase()}}Platform.instance = {{project_name.pascalCase()}}IOS();
+ }
+
+ @override
+ Future getPlatformName() {
+ return methodChannel.invokeMethod('getPlatformName');
+ }
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/pubspec.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/pubspec.yaml
new file mode 100644
index 0000000..53af2d3
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/pubspec.yaml
@@ -0,0 +1,27 @@
+name: {{project_name.snakeCase()}}_ios
+description: iOS implementation of the {{project_name.snakeCase()}} plugin
+version: 0.1.0+1
+{{^publishable}}publish_to: none{{/publishable}}
+
+environment:
+ sdk: ">=3.0.0 <4.0.0"
+
+flutter:
+ plugin:
+ implements: {{project_name.snakeCase()}}
+ platforms:
+ ios:
+ pluginClass: {{project_name.pascalCase()}}Plugin
+ dartPluginClass: {{project_name.pascalCase()}}IOS
+
+dependencies:
+ flutter:
+ sdk: flutter
+ {{project_name.snakeCase()}}_platform_interface:
+ path: ../{{project_name.snakeCase()}}_platform_interface
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ plugin_platform_interface: ^2.0.0
+ very_good_analysis: ^5.1.0
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/test/{{project_name.snakeCase()}}_ios_test.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/test/{{project_name.snakeCase()}}_ios_test.dart
new file mode 100644
index 0000000..c82ad31
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/test/{{project_name.snakeCase()}}_ios_test.dart
@@ -0,0 +1,44 @@
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:{{project_name.snakeCase()}}_ios/{{project_name.snakeCase()}}_ios.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+void main() {
+ TestWidgetsFlutterBinding.ensureInitialized();
+
+ group('{{project_name.pascalCase()}}IOS', () {
+ const kPlatformName = 'iOS';
+ late {{project_name.pascalCase()}}IOS {{project_name.camelCase()}};
+ late List log;
+
+ setUp(() async {
+ {{project_name.camelCase()}} = {{project_name.pascalCase()}}IOS();
+
+ log = [];
+ TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
+ .setMockMethodCallHandler({{project_name.camelCase()}}.methodChannel, (methodCall) async {
+ log.add(methodCall);
+ switch (methodCall.method) {
+ case 'getPlatformName':
+ return kPlatformName;
+ default:
+ return null;
+ }
+ });
+ });
+
+ test('can be registered', () {
+ {{project_name.pascalCase()}}IOS.registerWith();
+ expect({{project_name.pascalCase()}}Platform.instance, isA<{{project_name.pascalCase()}}IOS>());
+ });
+
+ test('getPlatformName returns correct name', () async {
+ final name = await {{project_name.camelCase()}}.getPlatformName();
+ expect(
+ log,
+ [isMethodCall('getPlatformName', arguments: null)],
+ );
+ expect(name, equals(kPlatformName));
+ });
+ });
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/{{#publishable}}CHANGELOG.md{{/publishable}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/{{#publishable}}CHANGELOG.md{{/publishable}}
new file mode 100644
index 0000000..1455983
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#ios}}{{project_name.snakeCase()}}_ios{{/ios}}/{{#publishable}}CHANGELOG.md{{/publishable}}
@@ -0,0 +1,3 @@
+# 0.1.0+1
+
+- Initial release of this plugin.
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/.gitignore b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/.gitignore
new file mode 100644
index 0000000..e9dc58d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/.gitignore
@@ -0,0 +1,7 @@
+.DS_Store
+.dart_tool/
+
+.packages
+.pub/
+
+build/
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/README.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/README.md
new file mode 100644
index 0000000..5199445
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/README.md
@@ -0,0 +1,14 @@
+# {{project_name.snakeCase()}}_linux
+
+[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
+
+The linux implementation of `{{project_name.snakeCase()}}`.
+
+## Usage
+
+This package is [endorsed][endorsed_link], which means you can simply use `{{project_name.snakeCase()}}`
+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/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/analysis_options.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/analysis_options.yaml
new file mode 100644
index 0000000..799268d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:very_good_analysis/analysis_options.5.1.0.yaml
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/lib/src/{{project_name.snakeCase()}}_linux.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/lib/src/{{project_name.snakeCase()}}_linux.dart
new file mode 100644
index 0000000..c41ca99
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/lib/src/{{project_name.snakeCase()}}_linux.dart
@@ -0,0 +1,20 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+/// The Linux implementation of [{{project_name.pascalCase()}}Platform].
+class {{project_name.pascalCase()}}Linux extends {{project_name.pascalCase()}}Platform {
+ /// The method channel used to interact with the native platform.
+ @visibleForTesting
+ final methodChannel = const MethodChannel('{{project_name.snakeCase()}}_linux');
+
+ /// Registers this class as the default instance of [{{project_name.pascalCase()}}Platform]
+ static void registerWith() {
+ {{project_name.pascalCase()}}Platform.instance = {{project_name.pascalCase()}}Linux();
+ }
+
+ @override
+ Future getPlatformName() {
+ return methodChannel.invokeMethod('getPlatformName');
+ }
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/lib/{{project_name.snakeCase()}}_linux.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/lib/{{project_name.snakeCase()}}_linux.dart
new file mode 100644
index 0000000..340c99d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/lib/{{project_name.snakeCase()}}_linux.dart
@@ -0,0 +1 @@
+export 'src/{{project_name.snakeCase()}}_linux.dart';
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/.gitignore b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/.gitignore
new file mode 100644
index 0000000..b3eb2be
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/.gitignore
@@ -0,0 +1,17 @@
+flutter/
+
+# Visual Studio user-specific files.
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# Visual Studio build-related files.
+x64/
+x86/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/CMakeLists.txt b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/CMakeLists.txt
new file mode 100644
index 0000000..dac6105
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/CMakeLists.txt
@@ -0,0 +1,21 @@
+cmake_minimum_required(VERSION 3.10)
+set(PROJECT_NAME "{{project_name.snakeCase()}}_linux")
+project(${PROJECT_NAME} LANGUAGES CXX)
+
+set(PLUGIN_NAME "${PROJECT_NAME}_plugin")
+
+list(APPEND PLUGIN_SOURCES
+ "{{project_name.snakeCase()}}_linux_plugin.cc"
+)
+
+add_library(${PLUGIN_NAME} SHARED
+ ${PLUGIN_SOURCES}
+)
+apply_standard_settings(${PLUGIN_NAME})
+set_target_properties(${PLUGIN_NAME} PROPERTIES
+ CXX_VISIBILITY_PRESET hidden)
+target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
+target_include_directories(${PLUGIN_NAME} INTERFACE
+ "${CMAKE_CURRENT_SOURCE_DIR}/include")
+target_link_libraries(${PLUGIN_NAME} PRIVATE flutter)
+target_link_libraries(${PLUGIN_NAME} PRIVATE PkgConfig::GTK)
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/include/{{project_name.snakeCase()}}_linux/{{project_name.snakeCase()}}_plugin.h b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/include/{{project_name.snakeCase()}}_linux/{{project_name.snakeCase()}}_plugin.h
new file mode 100644
index 0000000..5e56202
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/include/{{project_name.snakeCase()}}_linux/{{project_name.snakeCase()}}_plugin.h
@@ -0,0 +1,25 @@
+#ifndef FLUTTER_PLUGIN_{{project_name.constantCase()}}_LINUX_PLUGIN_H_
+#define FLUTTER_PLUGIN_{{project_name.constantCase()}}_LINUX_PLUGIN_H_
+
+#include
+
+G_BEGIN_DECLS
+
+#ifdef FLUTTER_PLUGIN_IMPL
+#define FLUTTER_PLUGIN_EXPORT __attribute__((visibility("default")))
+#else
+#define FLUTTER_PLUGIN_EXPORT
+#endif
+
+G_DECLARE_FINAL_TYPE(Fl{{project_name.pascalCase()}}Plugin, fl_{{project_name.snakeCase()}}_plugin, FL,
+ {{project_name.constantCase()}}_PLUGIN, GObject)
+
+FLUTTER_PLUGIN_EXPORT Fl{{project_name.pascalCase()}}Plugin* fl_{{project_name.snakeCase()}}_plugin_new(
+ FlPluginRegistrar* registrar);
+
+FLUTTER_PLUGIN_EXPORT void {{project_name.snakeCase()}}_plugin_register_with_registrar(
+ FlPluginRegistrar* registrar);
+
+G_END_DECLS
+
+#endif // FLUTTER_PLUGIN_{{project_name.constantCase()}}_LINUX_PLUGIN_H_
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/{{project_name.snakeCase()}}_linux_plugin.cc b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/{{project_name.snakeCase()}}_linux_plugin.cc
new file mode 100644
index 0000000..968995c
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/linux/{{project_name.snakeCase()}}_linux_plugin.cc
@@ -0,0 +1,68 @@
+#include "include/{{project_name.snakeCase()}}_linux/{{project_name.snakeCase()}}_plugin.h"
+
+#include
+#include
+#include
+
+#include
+
+const char kChannelName[] = "{{project_name.snakeCase()}}_linux";
+const char kGetPlatformName[] = "getPlatformName";
+
+struct _Fl{{project_name.pascalCase()}}Plugin {
+ GObject parent_instance;
+
+ FlPluginRegistrar* registrar;
+
+ // Connection to Flutter engine.
+ FlMethodChannel* channel;
+};
+
+G_DEFINE_TYPE(Fl{{project_name.pascalCase()}}Plugin, fl_{{project_name.snakeCase()}}_plugin, g_object_get_type())
+
+// Called when a method call is received from Flutter.
+static void method_call_cb(FlMethodChannel* channel, FlMethodCall* method_call,
+ gpointer user_data) {
+ const gchar* method = fl_method_call_get_name(method_call);
+
+ g_autoptr(FlMethodResponse) response = nullptr;
+ if (strcmp(method, kGetPlatformName) == 0)
+ response = FL_METHOD_RESPONSE(fl_method_success_response_new(fl_value_new_string("Linux")));
+ else
+ response = FL_METHOD_RESPONSE(fl_method_not_implemented_response_new());
+
+ g_autoptr(GError) error = nullptr;
+ if (!fl_method_call_respond(method_call, response, &error))
+ g_warning("Failed to send method call response: %s", error->message);
+}
+
+static void fl_{{project_name.snakeCase()}}_plugin_dispose(GObject* object) {
+ G_OBJECT_CLASS(fl_{{project_name.snakeCase()}}_plugin_parent_class)->dispose(object);
+}
+
+static void fl_{{project_name.snakeCase()}}_plugin_class_init(Fl{{project_name.pascalCase()}}PluginClass* klass) {
+ G_OBJECT_CLASS(klass)->dispose = fl_{{project_name.snakeCase()}}_plugin_dispose;
+}
+
+Fl{{project_name.pascalCase()}}Plugin* fl_{{project_name.snakeCase()}}_plugin_new(FlPluginRegistrar* registrar) {
+ Fl{{project_name.pascalCase()}}Plugin* self = FL_{{project_name.constantCase()}}_PLUGIN(
+ g_object_new(fl_{{project_name.snakeCase()}}_plugin_get_type(), nullptr));
+
+ self->registrar = FL_PLUGIN_REGISTRAR(g_object_ref(registrar));
+
+ g_autoptr(FlStandardMethodCodec) codec = fl_standard_method_codec_new();
+ self->channel =
+ fl_method_channel_new(fl_plugin_registrar_get_messenger(registrar),
+ kChannelName, FL_METHOD_CODEC(codec));
+ fl_method_channel_set_method_call_handler(self->channel, method_call_cb,
+ g_object_ref(self), g_object_unref);
+
+ return self;
+}
+
+static void fl_{{project_name.snakeCase()}}_plugin_init(Fl{{project_name.pascalCase()}}Plugin* self) {}
+
+void {{project_name.snakeCase()}}_plugin_register_with_registrar(FlPluginRegistrar* registrar) {
+ Fl{{project_name.pascalCase()}}Plugin* plugin = fl_{{project_name.snakeCase()}}_plugin_new(registrar);
+ g_object_unref(plugin);
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/pubspec.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/pubspec.yaml
new file mode 100644
index 0000000..134a184
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/pubspec.yaml
@@ -0,0 +1,26 @@
+name: {{project_name.snakeCase()}}_linux
+description: Linux implementation of the {{project_name.snakeCase()}} plugin
+version: 0.1.0+1
+{{^publishable}}publish_to: none{{/publishable}}
+
+environment:
+ sdk: ">=3.0.0 <4.0.0"
+
+flutter:
+ plugin:
+ implements: {{project_name.snakeCase()}}
+ platforms:
+ linux:
+ pluginClass: {{project_name.pascalCase()}}Plugin
+ dartPluginClass: {{project_name.pascalCase()}}Linux
+
+dependencies:
+ flutter:
+ sdk: flutter
+ {{project_name.snakeCase()}}_platform_interface:
+ path: ../{{project_name.snakeCase()}}_platform_interface
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ very_good_analysis: ^5.1.0
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/test/{{project_name.snakeCase()}}_linux_test.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/test/{{project_name.snakeCase()}}_linux_test.dart
new file mode 100644
index 0000000..3eaa84f
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/test/{{project_name.snakeCase()}}_linux_test.dart
@@ -0,0 +1,44 @@
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:{{project_name.snakeCase()}}_linux/{{project_name.snakeCase()}}_linux.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+void main() {
+ TestWidgetsFlutterBinding.ensureInitialized();
+
+ group('{{project_name.pascalCase()}}Linux', () {
+ const kPlatformName = 'Linux';
+ late {{project_name.pascalCase()}}Linux {{project_name.camelCase()}};
+ late List log;
+
+ setUp(() async {
+ {{project_name.camelCase()}} = {{project_name.pascalCase()}}Linux();
+
+ log = [];
+ TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
+ .setMockMethodCallHandler({{project_name.camelCase()}}.methodChannel, (methodCall) async {
+ log.add(methodCall);
+ switch (methodCall.method) {
+ case 'getPlatformName':
+ return kPlatformName;
+ default:
+ return null;
+ }
+ });
+ });
+
+ test('can be registered', () {
+ {{project_name.pascalCase()}}Linux.registerWith();
+ expect({{project_name.pascalCase()}}Platform.instance, isA<{{project_name.pascalCase()}}Linux>());
+ });
+
+ test('getPlatformName returns correct name', () async {
+ final name = await {{project_name.camelCase()}}.getPlatformName();
+ expect(
+ log,
+ [isMethodCall('getPlatformName', arguments: null)],
+ );
+ expect(name, equals(kPlatformName));
+ });
+ });
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/{{#publishable}}CHANGELOG.md{{/publishable}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/{{#publishable}}CHANGELOG.md{{/publishable}}
new file mode 100644
index 0000000..1455983
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#linux}}{{project_name.snakeCase()}}_linux{{/linux}}/{{#publishable}}CHANGELOG.md{{/publishable}}
@@ -0,0 +1,3 @@
+# 0.1.0+1
+
+- Initial release of this plugin.
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/.gitignore b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/.gitignore
new file mode 100644
index 0000000..53e92cc
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/.gitignore
@@ -0,0 +1,3 @@
+.packages
+.flutter-plugins
+pubspec.lock
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/README.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/README.md
new file mode 100644
index 0000000..9252f21
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/README.md
@@ -0,0 +1,14 @@
+# {{project_name.snakeCase()}}_macos
+
+[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
+
+The macos implementation of `{{project_name.snakeCase()}}`.
+
+## Usage
+
+This package is [endorsed][endorsed_link], which means you can simply use `{{project_name.snakeCase()}}`
+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/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/analysis_options.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/analysis_options.yaml
new file mode 100644
index 0000000..799268d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:very_good_analysis/analysis_options.5.1.0.yaml
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/lib/{{project_name.snakeCase()}}_macos.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/lib/{{project_name.snakeCase()}}_macos.dart
new file mode 100644
index 0000000..01744fc
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/lib/{{project_name.snakeCase()}}_macos.dart
@@ -0,0 +1,20 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+/// The MacOS implementation of [{{project_name.pascalCase()}}Platform].
+class {{project_name.pascalCase()}}MacOS extends {{project_name.pascalCase()}}Platform {
+ /// The method channel used to interact with the native platform.
+ @visibleForTesting
+ final methodChannel = const MethodChannel('{{project_name.snakeCase()}}_macos');
+
+ /// Registers this class as the default instance of [{{project_name.pascalCase()}}Platform]
+ static void registerWith() {
+ {{project_name.pascalCase()}}Platform.instance = {{project_name.pascalCase()}}MacOS();
+ }
+
+ @override
+ Future getPlatformName() {
+ return methodChannel.invokeMethod('getPlatformName');
+ }
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/macos/Classes/{{project_name.pascalCase()}}Plugin.swift b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/macos/Classes/{{project_name.pascalCase()}}Plugin.swift
new file mode 100644
index 0000000..447997d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/macos/Classes/{{project_name.pascalCase()}}Plugin.swift
@@ -0,0 +1,21 @@
+import FlutterMacOS
+import Foundation
+
+public class {{project_name.pascalCase()}}Plugin: NSObject, FlutterPlugin {
+ public static func register(with registrar: FlutterPluginRegistrar) {
+ let channel = FlutterMethodChannel(
+ name: "{{project_name.snakeCase()}}_macos",
+ binaryMessenger: registrar.messenger)
+ let instance = {{project_name.pascalCase()}}Plugin()
+ registrar.addMethodCallDelegate(instance, channel: channel)
+ }
+
+ public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) {
+ switch call.method {
+ case "getPlatformName":
+ result("MacOS")
+ default:
+ result(FlutterMethodNotImplemented)
+ }
+ }
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/macos/{{project_name.snakeCase()}}_macos.podspec b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/macos/{{project_name.snakeCase()}}_macos.podspec
new file mode 100644
index 0000000..fc794b4
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/macos/{{project_name.snakeCase()}}_macos.podspec
@@ -0,0 +1,22 @@
+#
+# To learn more about a Podspec see http://guides.cocoapods.org/syntax/podspec.html
+#
+Pod::Spec.new do |s|
+ s.name = '{{project_name.snakeCase()}}_macos'
+ s.version = '0.0.1'
+ s.summary = 'A macOS implementation of the {{project_name.snakeCase()}} plugin.'
+ s.description = <<-DESC
+ A macOS implementation of the {{project_name.snakeCase()}} plugin.
+ DESC
+ s.homepage = 'http://example.com'
+ s.license = { :type => 'BSD', :file => '../LICENSE' }
+ s.author = { 'Your Company' => 'email@example.com' }
+ s.source = { :path => '.' }
+ s.source_files = 'Classes/**/*'
+ s.dependency 'FlutterMacOS'
+
+ s.platform = :osx
+ s.osx.deployment_target = '10.11'
+ s.swift_version = '5.0'
+end
+
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/pubspec.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/pubspec.yaml
new file mode 100644
index 0000000..753dfa8
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/pubspec.yaml
@@ -0,0 +1,26 @@
+name: {{project_name.snakeCase()}}_macos
+description: MacOS implementation of the {{project_name.snakeCase()}} plugin
+version: 0.1.0+1
+{{^publishable}}publish_to: none{{/publishable}}
+
+environment:
+ sdk: ">=3.0.0 <4.0.0"
+
+flutter:
+ plugin:
+ implements: {{project_name.snakeCase()}}
+ platforms:
+ macos:
+ pluginClass: {{project_name.pascalCase()}}Plugin
+ dartPluginClass: {{project_name.pascalCase()}}MacOS
+
+dependencies:
+ flutter:
+ sdk: flutter
+ {{project_name.snakeCase()}}_platform_interface:
+ path: ../{{project_name.snakeCase()}}_platform_interface
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ very_good_analysis: ^5.1.0
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/test/{{project_name.snakeCase()}}_macos_test.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/test/{{project_name.snakeCase()}}_macos_test.dart
new file mode 100644
index 0000000..38a6ab1
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/test/{{project_name.snakeCase()}}_macos_test.dart
@@ -0,0 +1,44 @@
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:{{project_name.snakeCase()}}_macos/{{project_name.snakeCase()}}_macos.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+void main() {
+ TestWidgetsFlutterBinding.ensureInitialized();
+
+ group('{{project_name.pascalCase()}}MacOS', () {
+ const kPlatformName = 'MacOS';
+ late {{project_name.pascalCase()}}MacOS {{project_name.camelCase()}};
+ late List log;
+
+ setUp(() async {
+ {{project_name.camelCase()}} = {{project_name.pascalCase()}}MacOS();
+
+ log = [];
+ TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
+ .setMockMethodCallHandler({{project_name.camelCase()}}.methodChannel, (methodCall) async {
+ log.add(methodCall);
+ switch (methodCall.method) {
+ case 'getPlatformName':
+ return kPlatformName;
+ default:
+ return null;
+ }
+ });
+ });
+
+ test('can be registered', () {
+ {{project_name.pascalCase()}}MacOS.registerWith();
+ expect({{project_name.pascalCase()}}Platform.instance, isA<{{project_name.pascalCase()}}MacOS>());
+ });
+
+ test('getPlatformName returns correct name', () async {
+ final name = await {{project_name.camelCase()}}.getPlatformName();
+ expect(
+ log,
+ [isMethodCall('getPlatformName', arguments: null)],
+ );
+ expect(name, equals(kPlatformName));
+ });
+ });
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/{{#publishable}}CHANGELOG.md{{/publishable}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/{{#publishable}}CHANGELOG.md{{/publishable}}
new file mode 100644
index 0000000..1455983
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#macos}}{{project_name.snakeCase()}}_macos{{/macos}}/{{#publishable}}CHANGELOG.md{{/publishable}}
@@ -0,0 +1,3 @@
+# 0.1.0+1
+
+- Initial release of this plugin.
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/.gitignore b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/.gitignore
new file mode 100644
index 0000000..53e92cc
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/.gitignore
@@ -0,0 +1,3 @@
+.packages
+.flutter-plugins
+pubspec.lock
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/README.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/README.md
new file mode 100644
index 0000000..564d9cf
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/README.md
@@ -0,0 +1,14 @@
+# {{project_name.snakeCase()}}_web
+
+[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
+
+The web implementation of `{{project_name.snakeCase()}}`.
+
+## Usage
+
+This package is [endorsed][endorsed_link], which means you can simply use `{{project_name.snakeCase()}}`
+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/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/analysis_options.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/analysis_options.yaml
new file mode 100644
index 0000000..799268d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:very_good_analysis/analysis_options.5.1.0.yaml
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/lib/{{project_name.snakeCase()}}_web.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/lib/{{project_name.snakeCase()}}_web.dart
new file mode 100644
index 0000000..0d69c42
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/lib/{{project_name.snakeCase()}}_web.dart
@@ -0,0 +1,12 @@
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+/// The Web implementation of [{{project_name.pascalCase()}}Platform].
+class {{project_name.pascalCase()}}Web extends {{project_name.pascalCase()}}Platform {
+ /// Registers this class as the default instance of [{{project_name.pascalCase()}}Platform]
+ static void registerWith([Object? registrar]) {
+ {{project_name.pascalCase()}}Platform.instance = {{project_name.pascalCase()}}Web();
+ }
+
+ @override
+ Future getPlatformName() async => 'Web';
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/pubspec.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/pubspec.yaml
new file mode 100644
index 0000000..6024051
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/pubspec.yaml
@@ -0,0 +1,28 @@
+name: {{project_name.snakeCase()}}_web
+description: Web implementation of the {{project_name.snakeCase()}} plugin
+version: 0.1.0+1
+{{^publishable}}publish_to: none{{/publishable}}
+
+environment:
+ sdk: ">=3.0.0 <4.0.0"
+
+flutter:
+ plugin:
+ implements: {{project_name.snakeCase()}}
+ platforms:
+ web:
+ pluginClass: {{project_name.pascalCase()}}Web
+ fileName: {{project_name.snakeCase()}}_web.dart
+
+dependencies:
+ flutter:
+ sdk: flutter
+ flutter_web_plugins:
+ sdk: flutter
+ {{project_name.snakeCase()}}_platform_interface:
+ path: ../{{project_name.snakeCase()}}_platform_interface
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ very_good_analysis: ^5.1.0
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/test/{{project_name.snakeCase()}}_web_test.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/test/{{project_name.snakeCase()}}_web_test.dart
new file mode 100644
index 0000000..c9fdeae
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/test/{{project_name.snakeCase()}}_web_test.dart
@@ -0,0 +1,26 @@
+import 'package:flutter_test/flutter_test.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+import 'package:{{project_name.snakeCase()}}_web/{{project_name.snakeCase()}}_web.dart';
+
+void main() {
+ TestWidgetsFlutterBinding.ensureInitialized();
+
+ group('{{project_name.pascalCase()}}Web', () {
+ const kPlatformName = 'Web';
+ late {{project_name.pascalCase()}}Web {{project_name.camelCase()}};
+
+ setUp(() async {
+ {{project_name.camelCase()}} = {{project_name.pascalCase()}}Web();
+ });
+
+ test('can be registered', () {
+ {{project_name.pascalCase()}}Web.registerWith();
+ expect({{project_name.pascalCase()}}Platform.instance, isA<{{project_name.pascalCase()}}Web>());
+ });
+
+ test('getPlatformName returns correct name', () async {
+ final name = await {{project_name.camelCase()}}.getPlatformName();
+ expect(name, equals(kPlatformName));
+ });
+ });
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/{{#publishable}}CHANGELOG.md{{/publishable}} b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/{{#publishable}}CHANGELOG.md{{/publishable}}
new file mode 100644
index 0000000..1455983
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#web}}{{project_name.snakeCase()}}_web{{/web}}/{{#publishable}}CHANGELOG.md{{/publishable}}
@@ -0,0 +1,3 @@
+# 0.1.0+1
+
+- Initial release of this plugin.
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/.gitignore b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/.gitignore
new file mode 100644
index 0000000..9be145f
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/.gitignore
@@ -0,0 +1,29 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+# Libraries should not include pubspec.lock, per https://dart.dev/guides/libraries/private-files#pubspeclock.
+/pubspec.lock
+**/doc/api/
+.dart_tool/
+.packages
+build/
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/.metadata b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/.metadata
new file mode 100644
index 0000000..8c15ad7
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/.metadata
@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+ revision: 77d935af4db863f6abd0b9c31c7e6df2a13de57b
+ channel: stable
+
+project_type: plugin
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/README.md b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/README.md
new file mode 100644
index 0000000..a77d92b
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/README.md
@@ -0,0 +1,14 @@
+# {{project_name.snakeCase()}}_windows
+
+[![style: very good analysis][very_good_analysis_badge]][very_good_analysis_link]
+
+The windows implementation of `{{project_name.snakeCase()}}`.
+
+## Usage
+
+This package is [endorsed][endorsed_link], which means you can simply use `{{project_name.snakeCase()}}`
+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/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/analysis_options.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/analysis_options.yaml
new file mode 100644
index 0000000..799268d
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/analysis_options.yaml
@@ -0,0 +1 @@
+include: package:very_good_analysis/analysis_options.5.1.0.yaml
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/lib/{{project_name.snakeCase()}}_windows.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/lib/{{project_name.snakeCase()}}_windows.dart
new file mode 100644
index 0000000..80ec5a0
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/lib/{{project_name.snakeCase()}}_windows.dart
@@ -0,0 +1,20 @@
+import 'package:flutter/foundation.dart';
+import 'package:flutter/services.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+
+/// The Windows implementation of [{{project_name.pascalCase()}}Platform].
+class {{project_name.pascalCase()}}Windows extends {{project_name.pascalCase()}}Platform {
+ /// The method channel used to interact with the native platform.
+ @visibleForTesting
+ final methodChannel = const MethodChannel('{{project_name.snakeCase()}}_windows');
+
+ /// Registers this class as the default instance of [{{project_name.pascalCase()}}Platform]
+ static void registerWith() {
+ {{project_name.pascalCase()}}Platform.instance = {{project_name.pascalCase()}}Windows();
+ }
+
+ @override
+ Future getPlatformName() {
+ return methodChannel.invokeMethod('getPlatformName');
+ }
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/pubspec.yaml b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/pubspec.yaml
new file mode 100644
index 0000000..19f514f
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/pubspec.yaml
@@ -0,0 +1,26 @@
+name: {{project_name.snakeCase()}}_windows
+description: Windows implementation of the {{project_name.snakeCase()}} plugin
+version: 0.1.0+1
+{{^publishable}}publish_to: none{{/publishable}}
+
+environment:
+ sdk: ">=3.0.0 <4.0.0"
+
+flutter:
+ plugin:
+ implements: {{project_name.snakeCase()}}
+ platforms:
+ windows:
+ pluginClass: {{project_name.pascalCase()}}Windows
+ dartPluginClass: {{project_name.pascalCase()}}Windows
+
+dependencies:
+ flutter:
+ sdk: flutter
+ {{project_name.snakeCase()}}_platform_interface:
+ path: ../{{project_name.snakeCase()}}_platform_interface
+
+dev_dependencies:
+ flutter_test:
+ sdk: flutter
+ very_good_analysis: ^5.1.0
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/test/{{project_name.snakeCase()}}_windows_test.dart b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/test/{{project_name.snakeCase()}}_windows_test.dart
new file mode 100644
index 0000000..fc580af
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/test/{{project_name.snakeCase()}}_windows_test.dart
@@ -0,0 +1,44 @@
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:{{project_name.snakeCase()}}_platform_interface/{{project_name.snakeCase()}}_platform_interface.dart';
+import 'package:{{project_name.snakeCase()}}_windows/{{project_name.snakeCase()}}_windows.dart';
+
+void main() {
+ TestWidgetsFlutterBinding.ensureInitialized();
+
+ group('{{project_name.pascalCase()}}Windows', () {
+ const kPlatformName = 'Windows';
+ late {{project_name.pascalCase()}}Windows {{project_name.camelCase()}};
+ late List log;
+
+ setUp(() async {
+ {{project_name.camelCase()}} = {{project_name.pascalCase()}}Windows();
+
+ log = [];
+ TestDefaultBinaryMessengerBinding.instance.defaultBinaryMessenger
+ .setMockMethodCallHandler({{project_name.camelCase()}}.methodChannel, (methodCall) async {
+ log.add(methodCall);
+ switch (methodCall.method) {
+ case 'getPlatformName':
+ return kPlatformName;
+ default:
+ return null;
+ }
+ });
+ });
+
+ test('can be registered', () {
+ {{project_name.pascalCase()}}Windows.registerWith();
+ expect({{project_name.pascalCase()}}Platform.instance, isA<{{project_name.pascalCase()}}Windows>());
+ });
+
+ test('getPlatformName returns correct name', () async {
+ final name = await {{project_name.camelCase()}}.getPlatformName();
+ expect(
+ log,
+ [isMethodCall('getPlatformName', arguments: null)],
+ );
+ expect(name, equals(kPlatformName));
+ });
+ });
+}
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/.gitignore b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/.gitignore
new file mode 100644
index 0000000..b3eb2be
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/.gitignore
@@ -0,0 +1,17 @@
+flutter/
+
+# Visual Studio user-specific files.
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# Visual Studio build-related files.
+x64/
+x86/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/CMakeLists.txt b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/CMakeLists.txt
new file mode 100644
index 0000000..c72cdba
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/CMakeLists.txt
@@ -0,0 +1,22 @@
+cmake_minimum_required(VERSION 3.14)
+set(PROJECT_NAME "{{project_name.snakeCase()}}_windows")
+project(${PROJECT_NAME} LANGUAGES CXX)
+
+set(PLUGIN_NAME "${PROJECT_NAME}_plugin")
+
+add_library(${PLUGIN_NAME} SHARED
+ "{{project_name.snakeCase()}}_windows_plugin.cpp"
+ "include/{{project_name.snakeCase()}}_windows/{{project_name.snakeCase()}}_windows.h"
+)
+apply_standard_settings(${PLUGIN_NAME})
+set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden)
+target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
+target_include_directories(${PLUGIN_NAME} INTERFACE
+ "${CMAKE_CURRENT_SOURCE_DIR}/include")
+target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin)
+
+# List of absolute paths to libraries that should be bundled with the plugin
+set({{project_name.snakeCase()}}_bundled_libraries
+ ""
+ PARENT_SCOPE
+)
\ No newline at end of file
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/include/{{project_name.snakeCase()}}_windows/{{project_name.snakeCase()}}_windows.h b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/include/{{project_name.snakeCase()}}_windows/{{project_name.snakeCase()}}_windows.h
new file mode 100644
index 0000000..9d625d3
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/include/{{project_name.snakeCase()}}_windows/{{project_name.snakeCase()}}_windows.h
@@ -0,0 +1,23 @@
+#ifndef FLUTTER_PLUGIN_{{project_name.constantCase()}}_WINDOWS_PLUGIN_H_
+#define FLUTTER_PLUGIN_{{project_name.constantCase()}}_WINDOWS_PLUGIN_H_
+
+#include
+
+#ifdef FLUTTER_PLUGIN_IMPL
+#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport)
+#else
+#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport)
+#endif
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+FLUTTER_PLUGIN_EXPORT void {{project_name.pascalCase()}}WindowsRegisterWithRegistrar(
+ FlutterDesktopPluginRegistrarRef registrar);
+
+#if defined(__cplusplus)
+} // extern "C"
+#endif
+
+#endif // FLUTTER_PLUGIN_{{project_name.constantCase()}}_WINDOWS_PLUGIN_H_
diff --git a/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/{{project_name.snakeCase()}}_windows_plugin.cpp b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/{{project_name.snakeCase()}}_windows_plugin.cpp
new file mode 100644
index 0000000..8c999d8
--- /dev/null
+++ b/very_good_flutter_plugin/__brick__/{{project_name.snakeCase()}}/{{#windows}}{{project_name.snakeCase()}}_windows{{/windows}}/windows/{{project_name.snakeCase()}}_windows_plugin.cpp
@@ -0,0 +1,72 @@
+#include "include/{{project_name.snakeCase()}}_windows/{{project_name.snakeCase()}}_windows.h"
+
+// This must be included before many other Windows headers.
+#include
+
+#include
+#include
+#include
+
+#include