From 8ca3434e0c826ae95619d6dac872e9a29adb6016 Mon Sep 17 00:00:00 2001 From: jcesarmobile Date: Mon, 9 Feb 2026 16:42:19 +0100 Subject: [PATCH] chore: remove e2e-tests and add example-app --- .../e2e-tests => example-app}/.env.example | 0 {plugin/e2e-tests => example-app}/.gitignore | 4 - {plugin/e2e-tests => example-app}/.npmrc | 0 example-app/CHANGELOG.md | 5 + .../android/.gitignore | 0 .../android/app/.gitignore | 0 .../android/app/build.gradle | 26 ++- .../android/app/capacitor.build.gradle | 0 .../android/app/proguard-rules.pro | 0 .../myapp/ExampleInstrumentedTest.java | 0 .../android/app/src/main/AndroidManifest.xml | 10 +- .../com/capacitorjs/maps}/MainActivity.java | 2 +- .../main/res/drawable-land-hdpi/splash.png | Bin .../main/res/drawable-land-mdpi/splash.png | Bin .../main/res/drawable-land-xhdpi/splash.png | Bin .../main/res/drawable-land-xxhdpi/splash.png | Bin .../main/res/drawable-land-xxxhdpi/splash.png | Bin .../main/res/drawable-port-hdpi/splash.png | Bin .../main/res/drawable-port-mdpi/splash.png | Bin .../main/res/drawable-port-xhdpi/splash.png | Bin .../main/res/drawable-port-xxhdpi/splash.png | Bin .../main/res/drawable-port-xxxhdpi/splash.png | Bin .../drawable-v24/ic_launcher_foreground.xml | 0 .../res/drawable/ic_launcher_background.xml | 0 .../app/src/main/res/drawable/splash.png | Bin .../app/src/main/res/layout/activity_main.xml | 0 .../res/mipmap-anydpi-v26/ic_launcher.xml | 0 .../mipmap-anydpi-v26/ic_launcher_round.xml | 0 .../src/main/res/mipmap-hdpi/ic_launcher.png | Bin .../mipmap-hdpi/ic_launcher_foreground.png | Bin .../res/mipmap-hdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-mdpi/ic_launcher.png | Bin .../mipmap-mdpi/ic_launcher_foreground.png | Bin .../res/mipmap-mdpi/ic_launcher_round.png | Bin .../src/main/res/mipmap-xhdpi/ic_launcher.png | Bin .../mipmap-xhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxhdpi/ic_launcher.png | Bin .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxhdpi/ic_launcher_round.png | Bin .../main/res/mipmap-xxxhdpi/ic_launcher.png | Bin .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin .../res/mipmap-xxxhdpi/ic_launcher_round.png | Bin .../res/values/ic_launcher_background.xml | 0 .../app/src/main/res/values/strings.xml | 7 + .../app/src/main/res/values/styles.xml | 0 .../app/src/main/res/xml/file_paths.xml | 0 .../getcapacitor/myapp/ExampleUnitTest.java | 0 .../android/build.gradle | 5 +- example-app/android/capacitor.settings.gradle | 18 ++ .../android/gradle.properties | 1 - .../android/gradle/wrapper/gradle-wrapper.jar | Bin 0 -> 43764 bytes .../gradle/wrapper/gradle-wrapper.properties | 2 +- .../e2e-tests => example-app}/android/gradlew | 9 +- .../android/gradlew.bat | 4 +- .../android/settings.gradle | 0 example-app/android/variables.gradle | 16 ++ example-app/capacitor.config.json | 5 + .../ionic.config.json | 2 +- .../e2e-tests => example-app}/ios/.gitignore | 4 + .../ios/App/App.xcodeproj/project.pbxproj | 14 +- .../App.xcworkspace/contents.xcworkspacedata | 0 .../xcshareddata/IDEWorkspaceChecks.plist | 0 .../ios/App/App/AppDelegate.swift | 11 -- .../AppIcon.appiconset/AppIcon-512@2x.png | Bin .../AppIcon.appiconset/Contents.json | 14 ++ .../ios/App/App/Assets.xcassets/Contents.json | 0 .../Splash.imageset/Contents.json | 0 .../Splash.imageset/splash-2732x2732-1.png | Bin .../Splash.imageset/splash-2732x2732-2.png | Bin .../Splash.imageset/splash-2732x2732.png | Bin .../App/Base.lproj/LaunchScreen.storyboard | 0 .../ios/App/App/Base.lproj/Main.storyboard | 0 .../ios/App/App/Info.plist | 11 +- example-app/ios/App/Podfile | 28 +++ example-app/package.json | 75 ++++++++ .../public/assets/icon/favicon.png | Bin .../public/assets/icon/icon.png | Bin .../public/assets/icon/marker.svg | 0 .../public/assets/icon/pin.png | Bin .../public/assets/shapes.svg | 0 .../public/index.html | 0 .../public/manifest.json | 0 .../src/App.test.tsx | 0 {plugin/e2e-tests => example-app}/src/App.tsx | 0 .../src/components/BaseTestingPage.tsx | 0 .../src/components/Menu.css | 0 .../src/components/Menu.tsx | 0 example-app/src/custom-elements.d.ts | 12 ++ .../e2e-tests => example-app}/src/index.tsx | 17 +- .../src/pages/Drawing/Circles.tsx | 1 + .../src/pages/Drawing/Polygons.tsx | 0 .../src/pages/Drawing/Polylines.tsx | 0 .../src/pages/Home.tsx | 0 .../src/pages/Map/Bounds.tsx | 0 .../src/pages/Map/ConfigMap.tsx | 0 .../src/pages/Map/CreateAndDestroyMap.tsx | 0 .../src/pages/Map/Localization.tsx | 0 .../src/pages/Map/ResizeMap.tsx | 0 .../src/pages/Markers/AddAndRemoveMarkers.tsx | 0 .../pages/Markers/MarkerCustomizations.tsx | 0 .../src/pages/Markers/MultipleMarkers.tsx | 0 .../src/pages/Scrolling/SimpleScrolling.tsx | 0 example-app/src/react-app-env.d.ts | 11 ++ example-app/src/reportWebVitals.ts | 13 ++ .../e2e-tests => example-app}/src/routes.ts | 0 .../src/service-worker.ts | 0 .../src/serviceWorkerRegistration.ts | 0 .../src/setupTests.ts | 0 .../src/theme/variables.css | 0 .../e2e-tests => example-app}/tsconfig.json | 3 +- plugin/e2e-tests/.ionic/e2e.env | 9 - plugin/e2e-tests/.ionic/wdio.config.ts | 174 ------------------ .../app/src/main/res/values/strings.xml | 7 - .../android/capacitor.settings.gradle | 18 -- .../android/gradle/wrapper/gradle-wrapper.jar | Bin 43583 -> 0 bytes plugin/e2e-tests/android/variables.gradle | 16 -- plugin/e2e-tests/capacitor.config.json | 6 - plugin/e2e-tests/ionic.e2e.config.ts | 36 ---- .../contents.xcworkspacedata | 7 - .../AppIcon.appiconset/Contents.json | 14 -- .../ios/App/App/capacitor.config.json | 13 -- plugin/e2e-tests/ios/App/App/config.xml | 6 - plugin/e2e-tests/ios/App/Podfile | 22 --- plugin/e2e-tests/package.json | 86 --------- .../e2e-tests/scripts/build_local_package.sh | 4 - plugin/e2e-tests/scripts/create_E2E_AVD.sh | 55 ------ plugin/e2e-tests/scripts/run_Android_E2E.sh | 63 ------- plugin/e2e-tests/src/react-app-env.d.ts | 1 - plugin/e2e-tests/src/reportWebVitals.ts | 15 -- .../pageobjects/basic-echo/basic-echo.page.ts | 14 -- .../map/create-and-destroy.page.ts | 17 -- .../markers/add-and-remove.page.ts | 21 --- .../markers/marker-customization.page.ts | 39 ---- .../markers/multiple-markers.page.ts | 26 --- plugin/e2e-tests/tests/pageobjects/page.ts | 23 --- .../tests/specs/basic-echo/basic-echo.spec.ts | 33 ---- .../specs/map/create-and-destroy.spec.ts | 55 ------ .../specs/markers/add-and-remove.spec.ts | 67 ------- .../markers/marker-customization.spec.ts | 125 ------------- .../specs/markers/multiple-markers.spec.ts | 71 ------- plugin/eslint.config.cjs | 2 +- plugin/package.json | 2 +- pnpm-lock.yaml | 156 +++++++++++++++- pnpm-workspace.yaml | 1 + 145 files changed, 413 insertions(+), 1121 deletions(-) rename {plugin/e2e-tests => example-app}/.env.example (100%) rename {plugin/e2e-tests => example-app}/.gitignore (88%) rename {plugin/e2e-tests => example-app}/.npmrc (100%) create mode 100644 example-app/CHANGELOG.md rename {plugin/e2e-tests => example-app}/android/.gitignore (100%) rename {plugin/e2e-tests => example-app}/android/app/.gitignore (100%) rename {plugin/e2e-tests => example-app}/android/app/build.gradle (77%) rename {plugin/e2e-tests => example-app}/android/app/capacitor.build.gradle (100%) rename {plugin/e2e-tests => example-app}/android/app/proguard-rules.pro (100%) rename {plugin/e2e-tests => example-app}/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/AndroidManifest.xml (95%) rename {plugin/e2e-tests/android/app/src/main/java/io/ionic/starter => example-app/android/app/src/main/java/com/capacitorjs/maps}/MainActivity.java (75%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-land-hdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-land-mdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-land-xhdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-land-xxhdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-land-xxxhdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-port-hdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-port-mdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-port-xhdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-port-xxhdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-port-xxxhdpi/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable/ic_launcher_background.xml (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/drawable/splash.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/layout/activity_main.xml (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-hdpi/ic_launcher.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-hdpi/ic_launcher_foreground.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-mdpi/ic_launcher.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-mdpi/ic_launcher_foreground.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_foreground.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_foreground.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_foreground.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/values/ic_launcher_background.xml (100%) create mode 100644 example-app/android/app/src/main/res/values/strings.xml rename {plugin/e2e-tests => example-app}/android/app/src/main/res/values/styles.xml (100%) rename {plugin/e2e-tests => example-app}/android/app/src/main/res/xml/file_paths.xml (100%) rename {plugin/e2e-tests => example-app}/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java (100%) rename {plugin/e2e-tests => example-app}/android/build.gradle (84%) create mode 100644 example-app/android/capacitor.settings.gradle rename {plugin/e2e-tests => example-app}/android/gradle.properties (99%) create mode 100644 example-app/android/gradle/wrapper/gradle-wrapper.jar rename {plugin/e2e-tests => example-app}/android/gradle/wrapper/gradle-wrapper.properties (93%) rename {plugin/e2e-tests => example-app}/android/gradlew (96%) rename {plugin/e2e-tests => example-app}/android/gradlew.bat (91%) rename {plugin/e2e-tests => example-app}/android/settings.gradle (100%) create mode 100644 example-app/android/variables.gradle create mode 100644 example-app/capacitor.config.json rename {plugin/e2e-tests => example-app}/ionic.config.json (72%) rename {plugin/e2e-tests => example-app}/ios/.gitignore (58%) rename {plugin/e2e-tests => example-app}/ios/App/App.xcodeproj/project.pbxproj (97%) rename {plugin/e2e-tests => example-app}/ios/App/App.xcworkspace/contents.xcworkspacedata (100%) rename {plugin/e2e-tests => example-app}/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist (100%) rename {plugin/e2e-tests => example-app}/ios/App/App/AppDelegate.swift (87%) rename {plugin/e2e-tests => example-app}/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png (100%) create mode 100644 example-app/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json rename {plugin/e2e-tests => example-app}/ios/App/App/Assets.xcassets/Contents.json (100%) rename {plugin/e2e-tests => example-app}/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json (100%) rename {plugin/e2e-tests => example-app}/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png (100%) rename {plugin/e2e-tests => example-app}/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png (100%) rename {plugin/e2e-tests => example-app}/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png (100%) rename {plugin/e2e-tests => example-app}/ios/App/App/Base.lproj/LaunchScreen.storyboard (100%) rename {plugin/e2e-tests => example-app}/ios/App/App/Base.lproj/Main.storyboard (100%) rename {plugin/e2e-tests => example-app}/ios/App/App/Info.plist (90%) create mode 100644 example-app/ios/App/Podfile create mode 100644 example-app/package.json rename {plugin/e2e-tests => example-app}/public/assets/icon/favicon.png (100%) rename {plugin/e2e-tests => example-app}/public/assets/icon/icon.png (100%) rename {plugin/e2e-tests => example-app}/public/assets/icon/marker.svg (100%) rename {plugin/e2e-tests => example-app}/public/assets/icon/pin.png (100%) rename {plugin/e2e-tests => example-app}/public/assets/shapes.svg (100%) rename {plugin/e2e-tests => example-app}/public/index.html (100%) rename {plugin/e2e-tests => example-app}/public/manifest.json (100%) rename {plugin/e2e-tests => example-app}/src/App.test.tsx (100%) rename {plugin/e2e-tests => example-app}/src/App.tsx (100%) rename {plugin/e2e-tests => example-app}/src/components/BaseTestingPage.tsx (100%) rename {plugin/e2e-tests => example-app}/src/components/Menu.css (100%) rename {plugin/e2e-tests => example-app}/src/components/Menu.tsx (100%) create mode 100644 example-app/src/custom-elements.d.ts rename {plugin/e2e-tests => example-app}/src/index.tsx (73%) rename {plugin/e2e-tests => example-app}/src/pages/Drawing/Circles.tsx (99%) rename {plugin/e2e-tests => example-app}/src/pages/Drawing/Polygons.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Drawing/Polylines.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Home.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Map/Bounds.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Map/ConfigMap.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Map/CreateAndDestroyMap.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Map/Localization.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Map/ResizeMap.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Markers/AddAndRemoveMarkers.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Markers/MarkerCustomizations.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Markers/MultipleMarkers.tsx (100%) rename {plugin/e2e-tests => example-app}/src/pages/Scrolling/SimpleScrolling.tsx (100%) create mode 100644 example-app/src/react-app-env.d.ts create mode 100644 example-app/src/reportWebVitals.ts rename {plugin/e2e-tests => example-app}/src/routes.ts (100%) rename {plugin/e2e-tests => example-app}/src/service-worker.ts (100%) rename {plugin/e2e-tests => example-app}/src/serviceWorkerRegistration.ts (100%) rename {plugin/e2e-tests => example-app}/src/setupTests.ts (100%) rename {plugin/e2e-tests => example-app}/src/theme/variables.css (100%) rename {plugin/e2e-tests => example-app}/tsconfig.json (94%) delete mode 100644 plugin/e2e-tests/.ionic/e2e.env delete mode 100644 plugin/e2e-tests/.ionic/wdio.config.ts delete mode 100644 plugin/e2e-tests/android/app/src/main/res/values/strings.xml delete mode 100644 plugin/e2e-tests/android/capacitor.settings.gradle delete mode 100644 plugin/e2e-tests/android/gradle/wrapper/gradle-wrapper.jar delete mode 100644 plugin/e2e-tests/android/variables.gradle delete mode 100644 plugin/e2e-tests/capacitor.config.json delete mode 100644 plugin/e2e-tests/ionic.e2e.config.ts delete mode 100644 plugin/e2e-tests/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata delete mode 100644 plugin/e2e-tests/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json delete mode 100644 plugin/e2e-tests/ios/App/App/capacitor.config.json delete mode 100644 plugin/e2e-tests/ios/App/App/config.xml delete mode 100644 plugin/e2e-tests/ios/App/Podfile delete mode 100644 plugin/e2e-tests/package.json delete mode 100755 plugin/e2e-tests/scripts/build_local_package.sh delete mode 100755 plugin/e2e-tests/scripts/create_E2E_AVD.sh delete mode 100755 plugin/e2e-tests/scripts/run_Android_E2E.sh delete mode 100644 plugin/e2e-tests/src/react-app-env.d.ts delete mode 100644 plugin/e2e-tests/src/reportWebVitals.ts delete mode 100644 plugin/e2e-tests/tests/pageobjects/basic-echo/basic-echo.page.ts delete mode 100644 plugin/e2e-tests/tests/pageobjects/map/create-and-destroy.page.ts delete mode 100644 plugin/e2e-tests/tests/pageobjects/markers/add-and-remove.page.ts delete mode 100644 plugin/e2e-tests/tests/pageobjects/markers/marker-customization.page.ts delete mode 100644 plugin/e2e-tests/tests/pageobjects/markers/multiple-markers.page.ts delete mode 100644 plugin/e2e-tests/tests/pageobjects/page.ts delete mode 100644 plugin/e2e-tests/tests/specs/basic-echo/basic-echo.spec.ts delete mode 100644 plugin/e2e-tests/tests/specs/map/create-and-destroy.spec.ts delete mode 100644 plugin/e2e-tests/tests/specs/markers/add-and-remove.spec.ts delete mode 100644 plugin/e2e-tests/tests/specs/markers/marker-customization.spec.ts delete mode 100644 plugin/e2e-tests/tests/specs/markers/multiple-markers.spec.ts diff --git a/plugin/e2e-tests/.env.example b/example-app/.env.example similarity index 100% rename from plugin/e2e-tests/.env.example rename to example-app/.env.example diff --git a/plugin/e2e-tests/.gitignore b/example-app/.gitignore similarity index 88% rename from plugin/e2e-tests/.gitignore rename to example-app/.gitignore index 3b0b1aea..e36333d8 100644 --- a/plugin/e2e-tests/.gitignore +++ b/example-app/.gitignore @@ -26,7 +26,3 @@ yarn-error.log* # Optional eslint cache .eslintcache - -.ionic/* -!.ionic/e2e.env -!.ionic/wdio.config.ts diff --git a/plugin/e2e-tests/.npmrc b/example-app/.npmrc similarity index 100% rename from plugin/e2e-tests/.npmrc rename to example-app/.npmrc diff --git a/example-app/CHANGELOG.md b/example-app/CHANGELOG.md new file mode 100644 index 00000000..767840ad --- /dev/null +++ b/example-app/CHANGELOG.md @@ -0,0 +1,5 @@ +# Change Log + +All notable changes to this project will be documented in this file. +See [Conventional Commits](https://conventionalcommits.org) for commit guidelines. + diff --git a/plugin/e2e-tests/android/.gitignore b/example-app/android/.gitignore similarity index 100% rename from plugin/e2e-tests/android/.gitignore rename to example-app/android/.gitignore diff --git a/plugin/e2e-tests/android/app/.gitignore b/example-app/android/app/.gitignore similarity index 100% rename from plugin/e2e-tests/android/app/.gitignore rename to example-app/android/app/.gitignore diff --git a/plugin/e2e-tests/android/app/build.gradle b/example-app/android/app/build.gradle similarity index 77% rename from plugin/e2e-tests/android/app/build.gradle rename to example-app/android/app/build.gradle index f8a8988d..577b6595 100644 --- a/plugin/e2e-tests/android/app/build.gradle +++ b/example-app/android/app/build.gradle @@ -6,22 +6,20 @@ apply plugin: 'com.android.application' def getApiKey() { Properties properties = new Properties() - if (project.rootProject.file('local.properties').canRead()) { - properties.load(project.rootProject.file('local.properties').newDataInputStream()) - - if(properties.containsKey("REACT_APP_GOOGLE_MAPS_API_KEY")) { - return properties['REACT_APP_GOOGLE_MAPS_API_KEY'] - } - } - return System.getenv('REACT_APP_GOOGLE_MAPS_API_KEY') - } - + if (project.rootProject.file('local.properties').canRead()) { + properties.load(project.rootProject.file('local.properties').newDataInputStream()) + if(properties.containsKey("REACT_APP_GOOGLE_MAPS_API_KEY")) { + return properties['REACT_APP_GOOGLE_MAPS_API_KEY'] + } + } + return System.getenv('REACT_APP_GOOGLE_MAPS_API_KEY') +} android { - namespace "io.ionic.starter" - compileSdkVersion rootProject.ext.compileSdkVersion + namespace = "com.capacitorjs.maps" + compileSdk = rootProject.ext.compileSdkVersion defaultConfig { - applicationId "io.ionic.starter" + applicationId "com.capacitorjs.maps" minSdkVersion rootProject.ext.minSdkVersion targetSdkVersion rootProject.ext.targetSdkVersion versionCode 1 @@ -30,7 +28,7 @@ android { aaptOptions { // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. // Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61 - ignoreAssetsPattern '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' + ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' } manifestPlaceholders = [MAPS_API_KEY:"${getApiKey()}"] } diff --git a/plugin/e2e-tests/android/app/capacitor.build.gradle b/example-app/android/app/capacitor.build.gradle similarity index 100% rename from plugin/e2e-tests/android/app/capacitor.build.gradle rename to example-app/android/app/capacitor.build.gradle diff --git a/plugin/e2e-tests/android/app/proguard-rules.pro b/example-app/android/app/proguard-rules.pro similarity index 100% rename from plugin/e2e-tests/android/app/proguard-rules.pro rename to example-app/android/app/proguard-rules.pro diff --git a/plugin/e2e-tests/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java b/example-app/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java similarity index 100% rename from plugin/e2e-tests/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java rename to example-app/android/app/src/androidTest/java/com/getcapacitor/myapp/ExampleInstrumentedTest.java diff --git a/plugin/e2e-tests/android/app/src/main/AndroidManifest.xml b/example-app/android/app/src/main/AndroidManifest.xml similarity index 95% rename from plugin/e2e-tests/android/app/src/main/AndroidManifest.xml rename to example-app/android/app/src/main/AndroidManifest.xml index bd137e1f..7108f606 100644 --- a/plugin/e2e-tests/android/app/src/main/AndroidManifest.xml +++ b/example-app/android/app/src/main/AndroidManifest.xml @@ -1,6 +1,5 @@ - + - - - + + example-app + example-app + com.capacitorjs.maps + com.capacitorjs.maps + diff --git a/plugin/e2e-tests/android/app/src/main/res/values/styles.xml b/example-app/android/app/src/main/res/values/styles.xml similarity index 100% rename from plugin/e2e-tests/android/app/src/main/res/values/styles.xml rename to example-app/android/app/src/main/res/values/styles.xml diff --git a/plugin/e2e-tests/android/app/src/main/res/xml/file_paths.xml b/example-app/android/app/src/main/res/xml/file_paths.xml similarity index 100% rename from plugin/e2e-tests/android/app/src/main/res/xml/file_paths.xml rename to example-app/android/app/src/main/res/xml/file_paths.xml diff --git a/plugin/e2e-tests/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java b/example-app/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java similarity index 100% rename from plugin/e2e-tests/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java rename to example-app/android/app/src/test/java/com/getcapacitor/myapp/ExampleUnitTest.java diff --git a/plugin/e2e-tests/android/build.gradle b/example-app/android/build.gradle similarity index 84% rename from plugin/e2e-tests/android/build.gradle rename to example-app/android/build.gradle index 75a44853..3bbbf978 100644 --- a/plugin/e2e-tests/android/build.gradle +++ b/example-app/android/build.gradle @@ -7,10 +7,9 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:8.7.2' - classpath 'com.google.gms:google-services:4.4.2' + classpath 'com.android.tools.build:gradle:8.13.0' + classpath 'com.google.gms:google-services:4.4.4' classpath 'com.google.android.libraries.mapsplatform.secrets-gradle-plugin:secrets-gradle-plugin:2.0.1' - // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } diff --git a/example-app/android/capacitor.settings.gradle b/example-app/android/capacitor.settings.gradle new file mode 100644 index 00000000..8a28d3aa --- /dev/null +++ b/example-app/android/capacitor.settings.gradle @@ -0,0 +1,18 @@ +// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN +include ':capacitor-android' +project(':capacitor-android').projectDir = new File('../../node_modules/.pnpm/@capacitor+android@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/android/capacitor') + +include ':capacitor-app' +project(':capacitor-app').projectDir = new File('../../node_modules/.pnpm/@capacitor+app@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/app/android') + +include ':capacitor-google-maps' +project(':capacitor-google-maps').projectDir = new File('../../plugin/android') + +include ':capacitor-haptics' +project(':capacitor-haptics').projectDir = new File('../../node_modules/.pnpm/@capacitor+haptics@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/haptics/android') + +include ':capacitor-keyboard' +project(':capacitor-keyboard').projectDir = new File('../../node_modules/.pnpm/@capacitor+keyboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/keyboard/android') + +include ':capacitor-status-bar' +project(':capacitor-status-bar').projectDir = new File('../../node_modules/.pnpm/@capacitor+status-bar@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/status-bar/android') diff --git a/plugin/e2e-tests/android/gradle.properties b/example-app/android/gradle.properties similarity index 99% rename from plugin/e2e-tests/android/gradle.properties rename to example-app/android/gradle.properties index 92710f31..2e87c52f 100644 --- a/plugin/e2e-tests/android/gradle.properties +++ b/example-app/android/gradle.properties @@ -20,4 +20,3 @@ org.gradle.jvmargs=-Xmx1536m # Android operating system, and which are packaged with your app's APK # https://developer.android.com/topic/libraries/support-library/androidx-rn android.useAndroidX=true - diff --git a/example-app/android/gradle/wrapper/gradle-wrapper.jar b/example-app/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 0000000000000000000000000000000000000000..1b33c55baabb587c669f562ae36f953de2481846 GIT binary patch literal 43764 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 /dev/null && printf '%s -' "$PWD" ) || exit +APP_HOME=$( cd -P "${APP_HOME:-./}" > /dev/null && printf '%s\n' "$PWD" ) || exit # Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD=maximum @@ -115,7 +114,7 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar +CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -206,7 +205,7 @@ fi DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' # Collect all arguments for the java command: -# * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, # and any embedded shellness will be escaped. # * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be # treated as '${Hostname}' itself on the command line. @@ -214,7 +213,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/plugin/e2e-tests/android/gradlew.bat b/example-app/android/gradlew.bat similarity index 91% rename from plugin/e2e-tests/android/gradlew.bat rename to example-app/android/gradlew.bat index 9b42019c..5eed7ee8 100644 --- a/plugin/e2e-tests/android/gradlew.bat +++ b/example-app/android/gradlew.bat @@ -70,11 +70,11 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar +set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/plugin/e2e-tests/android/settings.gradle b/example-app/android/settings.gradle similarity index 100% rename from plugin/e2e-tests/android/settings.gradle rename to example-app/android/settings.gradle diff --git a/example-app/android/variables.gradle b/example-app/android/variables.gradle new file mode 100644 index 00000000..ee4ba41c --- /dev/null +++ b/example-app/android/variables.gradle @@ -0,0 +1,16 @@ +ext { + minSdkVersion = 24 + compileSdkVersion = 36 + targetSdkVersion = 36 + androidxActivityVersion = '1.11.0' + androidxAppCompatVersion = '1.7.1' + androidxCoordinatorLayoutVersion = '1.3.0' + androidxCoreVersion = '1.17.0' + androidxFragmentVersion = '1.8.9' + coreSplashScreenVersion = '1.2.0' + androidxWebkitVersion = '1.14.0' + junitVersion = '4.13.2' + androidxJunitVersion = '1.3.0' + androidxEspressoCoreVersion = '3.7.0' + cordovaAndroidVersion = '14.0.1' +} \ No newline at end of file diff --git a/example-app/capacitor.config.json b/example-app/capacitor.config.json new file mode 100644 index 00000000..052487cd --- /dev/null +++ b/example-app/capacitor.config.json @@ -0,0 +1,5 @@ +{ + "appId": "com.capacitorjs.maps", + "appName": "example-app", + "webDir": "build" +} diff --git a/plugin/e2e-tests/ionic.config.json b/example-app/ionic.config.json similarity index 72% rename from plugin/e2e-tests/ionic.config.json rename to example-app/ionic.config.json index 43bec272..95507d29 100644 --- a/plugin/e2e-tests/ionic.config.json +++ b/example-app/ionic.config.json @@ -1,5 +1,5 @@ { - "name": "e2e-tests", + "name": "example-app", "integrations": { "capacitor": {} }, diff --git a/plugin/e2e-tests/ios/.gitignore b/example-app/ios/.gitignore similarity index 58% rename from plugin/e2e-tests/ios/.gitignore rename to example-app/ios/.gitignore index 01ad5202..f4702997 100644 --- a/plugin/e2e-tests/ios/.gitignore +++ b/example-app/ios/.gitignore @@ -1,5 +1,6 @@ App/build App/Pods +App/output App/App/public DerivedData xcuserdata @@ -7,3 +8,6 @@ xcuserdata # Cordova plugins for Capacitor capacitor-cordova-ios-plugins +# Generated Config files +App/App/capacitor.config.json +App/App/config.xml diff --git a/plugin/e2e-tests/ios/App/App.xcodeproj/project.pbxproj b/example-app/ios/App/App.xcodeproj/project.pbxproj similarity index 97% rename from plugin/e2e-tests/ios/App/App.xcodeproj/project.pbxproj rename to example-app/ios/App/App.xcodeproj/project.pbxproj index 16ae88e2..81ae2d8c 100644 --- a/plugin/e2e-tests/ios/App/App.xcodeproj/project.pbxproj +++ b/example-app/ios/App/App.xcodeproj/project.pbxproj @@ -106,7 +106,7 @@ 504EC3011FED79650016851F /* Frameworks */, 504EC3021FED79650016851F /* Resources */, 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, - 1EB4CF9A9223BA57362D699F /* [CP] Copy Pods Resources */, + 2D952172D5DA84B0F266FD58 /* [CP] Copy Pods Resources */, ); buildRules = ( ); @@ -168,7 +168,7 @@ /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ - 1EB4CF9A9223BA57362D699F /* [CP] Copy Pods Resources */ = { + 2D952172D5DA84B0F266FD58 /* [CP] Copy Pods Resources */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; files = ( @@ -362,12 +362,13 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 9YN2HU59K8; + CURRENT_PROJECT_VERSION = 1; INFOPLIST_FILE = App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.0; OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; - PRODUCT_BUNDLE_IDENTIFIER = io.ionic.googlemaps; + PRODUCT_BUNDLE_IDENTIFIER = com.capacitorjs.maps; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_VERSION = 5.0; @@ -381,11 +382,12 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CODE_SIGN_STYLE = Automatic; - DEVELOPMENT_TEAM = 9YN2HU59K8; + CURRENT_PROJECT_VERSION = 1; INFOPLIST_FILE = App/Info.plist; IPHONEOS_DEPLOYMENT_TARGET = 15.0; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; - PRODUCT_BUNDLE_IDENTIFIER = io.ionic.googlemaps; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.capacitorjs.maps; PRODUCT_NAME = "$(TARGET_NAME)"; SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; SWIFT_VERSION = 5.0; diff --git a/plugin/e2e-tests/ios/App/App.xcworkspace/contents.xcworkspacedata b/example-app/ios/App/App.xcworkspace/contents.xcworkspacedata similarity index 100% rename from plugin/e2e-tests/ios/App/App.xcworkspace/contents.xcworkspacedata rename to example-app/ios/App/App.xcworkspace/contents.xcworkspacedata diff --git a/plugin/e2e-tests/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/example-app/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist similarity index 100% rename from plugin/e2e-tests/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist rename to example-app/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist diff --git a/plugin/e2e-tests/ios/App/App/AppDelegate.swift b/example-app/ios/App/App/AppDelegate.swift similarity index 87% rename from plugin/e2e-tests/ios/App/App/AppDelegate.swift rename to example-app/ios/App/App/AppDelegate.swift index 53e37603..c3cd83b5 100644 --- a/plugin/e2e-tests/ios/App/App/AppDelegate.swift +++ b/example-app/ios/App/App/AppDelegate.swift @@ -46,15 +46,4 @@ class AppDelegate: UIResponder, UIApplicationDelegate { return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) } - override func touchesBegan(_ touches: Set, with event: UIEvent?) { - super.touchesBegan(touches, with: event) - - let statusBarRect = UIApplication.shared.statusBarFrame - guard let touchPoint = event?.allTouches?.first?.location(in: self.window) else { return } - - if statusBarRect.contains(touchPoint) { - NotificationCenter.default.post(name: .capacitorStatusBarTapped, object: nil) - } - } - } diff --git a/plugin/e2e-tests/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/example-app/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png similarity index 100% rename from plugin/e2e-tests/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png rename to example-app/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png diff --git a/example-app/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/example-app/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 00000000..9b7d382d --- /dev/null +++ b/example-app/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "AppIcon-512@2x.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/plugin/e2e-tests/ios/App/App/Assets.xcassets/Contents.json b/example-app/ios/App/App/Assets.xcassets/Contents.json similarity index 100% rename from plugin/e2e-tests/ios/App/App/Assets.xcassets/Contents.json rename to example-app/ios/App/App/Assets.xcassets/Contents.json diff --git a/plugin/e2e-tests/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/example-app/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json similarity index 100% rename from plugin/e2e-tests/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json rename to example-app/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json diff --git a/plugin/e2e-tests/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png b/example-app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png similarity index 100% rename from plugin/e2e-tests/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png rename to example-app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png diff --git a/plugin/e2e-tests/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png b/example-app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png similarity index 100% rename from plugin/e2e-tests/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png rename to example-app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png diff --git a/plugin/e2e-tests/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png b/example-app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png similarity index 100% rename from plugin/e2e-tests/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png rename to example-app/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png diff --git a/plugin/e2e-tests/ios/App/App/Base.lproj/LaunchScreen.storyboard b/example-app/ios/App/App/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from plugin/e2e-tests/ios/App/App/Base.lproj/LaunchScreen.storyboard rename to example-app/ios/App/App/Base.lproj/LaunchScreen.storyboard diff --git a/plugin/e2e-tests/ios/App/App/Base.lproj/Main.storyboard b/example-app/ios/App/App/Base.lproj/Main.storyboard similarity index 100% rename from plugin/e2e-tests/ios/App/App/Base.lproj/Main.storyboard rename to example-app/ios/App/App/Base.lproj/Main.storyboard diff --git a/plugin/e2e-tests/ios/App/App/Info.plist b/example-app/ios/App/App/Info.plist similarity index 90% rename from plugin/e2e-tests/ios/App/App/Info.plist rename to example-app/ios/App/App/Info.plist index 578b0a47..dcdbbe00 100644 --- a/plugin/e2e-tests/ios/App/App/Info.plist +++ b/example-app/ios/App/App/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - e2e-tests + example-app CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier @@ -17,16 +17,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0 + $(MARKETING_VERSION) CFBundleVersion - 1 + $(CURRENT_PROJECT_VERSION) LSRequiresIPhoneOS - NSAppTransportSecurity - - NSAllowsArbitraryLoads - - NSLocationWhenInUseUsageDescription Using Test App Location UILaunchStoryboardName diff --git a/example-app/ios/App/Podfile b/example-app/ios/App/Podfile new file mode 100644 index 00000000..480f43eb --- /dev/null +++ b/example-app/ios/App/Podfile @@ -0,0 +1,28 @@ +require_relative '../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios/scripts/pods_helpers' + +platform :ios, '15.0' +use_frameworks! + +# workaround to avoid Xcode caching of Pods that requires +# Product -> Clean Build Folder after new Cordova plugins installed +# Requires CocoaPods 1.6 or newer +install! 'cocoapods', :disable_input_output_paths => true + +def capacitor_pods + pod 'Capacitor', :path => '../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios' + pod 'CapacitorCordova', :path => '../../../node_modules/.pnpm/@capacitor+ios@8.0.1_@capacitor+core@8.0.1/node_modules/@capacitor/ios' + pod 'CapacitorApp', :path => '../../../node_modules/.pnpm/@capacitor+app@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/app' + pod 'CapacitorGoogleMaps', :path => '../../../plugin' + pod 'CapacitorHaptics', :path => '../../../node_modules/.pnpm/@capacitor+haptics@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/haptics' + pod 'CapacitorKeyboard', :path => '../../../node_modules/.pnpm/@capacitor+keyboard@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/keyboard' + pod 'CapacitorStatusBar', :path => '../../../node_modules/.pnpm/@capacitor+status-bar@8.0.0_@capacitor+core@8.0.1/node_modules/@capacitor/status-bar' +end + +target 'App' do + capacitor_pods + # Add your Pods here +end + +post_install do |installer| + assertDeploymentTarget(installer) +end diff --git a/example-app/package.json b/example-app/package.json new file mode 100644 index 00000000..74ed9a63 --- /dev/null +++ b/example-app/package.json @@ -0,0 +1,75 @@ +{ + "name": "example-app", + "version": "0.1.0", + "private": true, + "dependencies": { + "@capacitor/android": "^8.0.0", + "@capacitor/app": "^8.0.0", + "@capacitor/core": "^8.0.0", + "@capacitor/google-maps": "workspace:*", + "@capacitor/haptics": "^8.0.0", + "@capacitor/ios": "^8.0.0", + "@capacitor/keyboard": "^8.0.0", + "@capacitor/status-bar": "^8.0.0", + "@ionic/react": "^8.7.11", + "@ionic/react-router": "^8.7.11", + "@testing-library/jest-dom": "^6.9.1", + "@testing-library/react": "^16.3.0", + "@testing-library/user-event": "^14.6.1", + "@types/google.maps": "~3.58.1", + "@types/jest": "^30.0.0", + "@types/node": "^24.10.2", + "@types/react": "^19.2.7", + "@types/react-dom": "^19.2.3", + "@types/react-router": "^5.1.20", + "@types/react-router-dom": "^5.3.3", + "ionicons": "^8.0.13", + "react": "^19.2.1", + "react-dom": "^19.2.1", + "react-router": "^5.3.4", + "react-router-dom": "^5.3.4", + "react-scripts": "^5.0.1", + "typescript": "^5.9.3", + "web-vitals": "^5.1.0", + "workbox-background-sync": "^7.4.0", + "workbox-broadcast-update": "^7.4.0", + "workbox-cacheable-response": "^7.4.0", + "workbox-core": "^7.4.0", + "workbox-expiration": "^7.4.0", + "workbox-google-analytics": "^7.4.0", + "workbox-navigation-preload": "^7.4.0", + "workbox-precaching": "^7.4.0", + "workbox-range-requests": "^7.4.0", + "workbox-routing": "^7.4.0", + "workbox-strategies": "^7.4.0", + "workbox-streams": "^7.4.0" + }, + "scripts": { + "start": "react-scripts start", + "build": "react-scripts build", + "eject": "react-scripts eject", + "sync": "npm run build && npx cap sync" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@capacitor/cli": "^8.0.0" + }, + "description": "An Ionic project" +} \ No newline at end of file diff --git a/plugin/e2e-tests/public/assets/icon/favicon.png b/example-app/public/assets/icon/favicon.png similarity index 100% rename from plugin/e2e-tests/public/assets/icon/favicon.png rename to example-app/public/assets/icon/favicon.png diff --git a/plugin/e2e-tests/public/assets/icon/icon.png b/example-app/public/assets/icon/icon.png similarity index 100% rename from plugin/e2e-tests/public/assets/icon/icon.png rename to example-app/public/assets/icon/icon.png diff --git a/plugin/e2e-tests/public/assets/icon/marker.svg b/example-app/public/assets/icon/marker.svg similarity index 100% rename from plugin/e2e-tests/public/assets/icon/marker.svg rename to example-app/public/assets/icon/marker.svg diff --git a/plugin/e2e-tests/public/assets/icon/pin.png b/example-app/public/assets/icon/pin.png similarity index 100% rename from plugin/e2e-tests/public/assets/icon/pin.png rename to example-app/public/assets/icon/pin.png diff --git a/plugin/e2e-tests/public/assets/shapes.svg b/example-app/public/assets/shapes.svg similarity index 100% rename from plugin/e2e-tests/public/assets/shapes.svg rename to example-app/public/assets/shapes.svg diff --git a/plugin/e2e-tests/public/index.html b/example-app/public/index.html similarity index 100% rename from plugin/e2e-tests/public/index.html rename to example-app/public/index.html diff --git a/plugin/e2e-tests/public/manifest.json b/example-app/public/manifest.json similarity index 100% rename from plugin/e2e-tests/public/manifest.json rename to example-app/public/manifest.json diff --git a/plugin/e2e-tests/src/App.test.tsx b/example-app/src/App.test.tsx similarity index 100% rename from plugin/e2e-tests/src/App.test.tsx rename to example-app/src/App.test.tsx diff --git a/plugin/e2e-tests/src/App.tsx b/example-app/src/App.tsx similarity index 100% rename from plugin/e2e-tests/src/App.tsx rename to example-app/src/App.tsx diff --git a/plugin/e2e-tests/src/components/BaseTestingPage.tsx b/example-app/src/components/BaseTestingPage.tsx similarity index 100% rename from plugin/e2e-tests/src/components/BaseTestingPage.tsx rename to example-app/src/components/BaseTestingPage.tsx diff --git a/plugin/e2e-tests/src/components/Menu.css b/example-app/src/components/Menu.css similarity index 100% rename from plugin/e2e-tests/src/components/Menu.css rename to example-app/src/components/Menu.css diff --git a/plugin/e2e-tests/src/components/Menu.tsx b/example-app/src/components/Menu.tsx similarity index 100% rename from plugin/e2e-tests/src/components/Menu.tsx rename to example-app/src/components/Menu.tsx diff --git a/example-app/src/custom-elements.d.ts b/example-app/src/custom-elements.d.ts new file mode 100644 index 00000000..c4d79a05 --- /dev/null +++ b/example-app/src/custom-elements.d.ts @@ -0,0 +1,12 @@ +declare module "react" { + namespace JSX { + interface IntrinsicElements { + "capacitor-google-map": React.DetailedHTMLProps< + React.HTMLAttributes, + HTMLElement + >; + } + } +} + +export {}; diff --git a/plugin/e2e-tests/src/index.tsx b/example-app/src/index.tsx similarity index 73% rename from plugin/e2e-tests/src/index.tsx rename to example-app/src/index.tsx index c421f457..b7913839 100644 --- a/plugin/e2e-tests/src/index.tsx +++ b/example-app/src/index.tsx @@ -1,15 +1,18 @@ import React from 'react'; -import ReactDOM from 'react-dom'; +import { createRoot } from 'react-dom/client'; import App from './App'; import * as serviceWorkerRegistration from './serviceWorkerRegistration'; import reportWebVitals from './reportWebVitals'; -ReactDOM.render( - - - , - document.getElementById('root') -); +const container = document.getElementById('root'); +if (container) { + const root = createRoot(container); + root.render( + + + + ); +} // If you want your app to work offline and load faster, you can change // unregister() to register() below. Note this comes with some pitfalls. diff --git a/plugin/e2e-tests/src/pages/Drawing/Circles.tsx b/example-app/src/pages/Drawing/Circles.tsx similarity index 99% rename from plugin/e2e-tests/src/pages/Drawing/Circles.tsx rename to example-app/src/pages/Drawing/Circles.tsx index 11fad8ab..4709d88c 100644 --- a/plugin/e2e-tests/src/pages/Drawing/Circles.tsx +++ b/example-app/src/pages/Drawing/Circles.tsx @@ -173,6 +173,7 @@ const CircleMapPage: React.FC = () => { autoGrow={true} > + {/* @ts-ignore - custom element */} + +declare global { + namespace JSX { + interface IntrinsicElements { + 'capacitor-google-map': React.DetailedHTMLProps, HTMLElement>; + } + } +} + +export {}; diff --git a/example-app/src/reportWebVitals.ts b/example-app/src/reportWebVitals.ts new file mode 100644 index 00000000..20a01e68 --- /dev/null +++ b/example-app/src/reportWebVitals.ts @@ -0,0 +1,13 @@ +import { onCLS, onINP, onFCP, onLCP, onTTFB, Metric } from 'web-vitals'; + +const reportWebVitals = (onPerfEntry?: (metric: Metric) => void) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + onCLS(onPerfEntry); + onINP(onPerfEntry); + onFCP(onPerfEntry); + onLCP(onPerfEntry); + onTTFB(onPerfEntry); + } +}; + +export default reportWebVitals; diff --git a/plugin/e2e-tests/src/routes.ts b/example-app/src/routes.ts similarity index 100% rename from plugin/e2e-tests/src/routes.ts rename to example-app/src/routes.ts diff --git a/plugin/e2e-tests/src/service-worker.ts b/example-app/src/service-worker.ts similarity index 100% rename from plugin/e2e-tests/src/service-worker.ts rename to example-app/src/service-worker.ts diff --git a/plugin/e2e-tests/src/serviceWorkerRegistration.ts b/example-app/src/serviceWorkerRegistration.ts similarity index 100% rename from plugin/e2e-tests/src/serviceWorkerRegistration.ts rename to example-app/src/serviceWorkerRegistration.ts diff --git a/plugin/e2e-tests/src/setupTests.ts b/example-app/src/setupTests.ts similarity index 100% rename from plugin/e2e-tests/src/setupTests.ts rename to example-app/src/setupTests.ts diff --git a/plugin/e2e-tests/src/theme/variables.css b/example-app/src/theme/variables.css similarity index 100% rename from plugin/e2e-tests/src/theme/variables.css rename to example-app/src/theme/variables.css diff --git a/plugin/e2e-tests/tsconfig.json b/example-app/tsconfig.json similarity index 94% rename from plugin/e2e-tests/tsconfig.json rename to example-app/tsconfig.json index a273b0cf..9238f72d 100644 --- a/plugin/e2e-tests/tsconfig.json +++ b/example-app/tsconfig.json @@ -21,6 +21,7 @@ "jsx": "react-jsx" }, "include": [ - "src" + "src", + "src/**/*.d.ts" ] } diff --git a/plugin/e2e-tests/.ionic/e2e.env b/plugin/e2e-tests/.ionic/e2e.env deleted file mode 100644 index e8b0746f..00000000 --- a/plugin/e2e-tests/.ionic/e2e.env +++ /dev/null @@ -1,9 +0,0 @@ -E2E_ANDROID_ACTIVITY=io.ionic.starter.MainActivity -E2E_IOS_SIMULATOR_DEVICE_NAME=iPhone 13 Pro Max -E2E_IOS_SIMULATOR_PLATFORM_VERSION=15.0 -E2E_IOS_DEVICE_NAME=iPhone 12 Pro Max -E2E_IOS_DEVICE_PLATFORM_VERSION=15.2 -E2E_ANDROID_EMULATOR_DEVICE_NAME=e2eDevice -E2E_ANDROID_EMULATOR_PLATFORM_VERSION=12 -E2E_ANDROID_DEVICE_NAME=G8X -E2E_ANDROID_DEVICE_PLATFORM_VERSION=11 \ No newline at end of file diff --git a/plugin/e2e-tests/.ionic/wdio.config.ts b/plugin/e2e-tests/.ionic/wdio.config.ts deleted file mode 100644 index d0c57fed..00000000 --- a/plugin/e2e-tests/.ionic/wdio.config.ts +++ /dev/null @@ -1,174 +0,0 @@ -exports.config = { - "autoCompileOpts": { - "autoCompile": true, - "tsNodeOpts": { - "transpileOnly": true - }, - "tsConfigPathsOpts": { - "paths": {}, - "baseUrl": "./" - } - }, - "runner": "local", - "specs": [ - [ - "./tests/specs/**/*.spec.ts" - ] - ], - "logLevel": "trace", - "bail": 0, - "waitforTimeout": 45000, - "connectionRetryTimeout": 120000, - "connectionRetryCount": 3, - "framework": "mocha", - "reporters": [ - "spec" - ], - "mochaOpts": { - "timeout": 1200000 - }, - "services": [ - [ - "appium", - { - "command": "appium", - "args": { - "relaxedSecurity": true - } - } - ], - [ - "chromedriver", - { - "args": [ - "--use-fake-ui-for-media-stream", - "--use-fake-device-for-media-stream" - ] - } - ] - ], - "port": 4723, - "ios:simulator": { - "platformName": "iOS", - "maxInstances": 1, - "appium:isHeadless": true, - "appium:deviceName": "iPhone 13 Pro Max", - "appium:platformVersion": "15.2", - "appium:orientation": "PORTRAIT", - "appium:automationName": "XCUITest", - "appium:app": "./.ionic/App-ios-simulator.zip", - "appium:newCommandTimeout": 240, - "appium:platformName": "iOS", - "appium:wdaLaunchTimeout": 600000 - }, - "ios:device": { - "platformName": "iOS", - "maxInstances": 1, - "appium:isHeadless": false, - "appium:deviceName": "iPhone 12 Pro Max", - "appium:platformVersion": "15.2", - "appium:orientation": "PORTRAIT", - "appium:automationName": "XCUITest", - "appium:app": "./.ionic/App-ios-simulator.zip", - "appium:newCommandTimeout": 240 - }, - "ios:browser": { - "browserName": "safari", - "platformName": "iOS", - "maxInstances": 1, - "appium:isHeadless": false, - "appium:deviceName": "iPhone 13 Pro Max", - "appium:platformVersion": "15.0", - "appium:orientation": "PORTRAIT", - "appium:automationName": "XCUITest", - "appium:newCommandTimeout": 240 - }, - "android:emulator": { - "platformName": "Android", - "maxInstances": 1, - "appium:isHeadless": true, - "appium:deviceName": "e2eDevice", - "appium:platformVersion": "11.0", - "appium:orientation": "PORTRAIT", - "appium:automationName": "UiAutomator2", - "appium:app": "./.ionic/app-debug.apk", - "appium:appWaitActivity": "io.ionic.starter.MainActivity", - "appium:newCommandTimeout": 300, - "appium:platformName": "Android", - "appium:avd": "e2eDevice", - "appium:appPackage": "io.ionic.starter", - "appium:autoGrantPermissions": true, - "appium:allowTestPackages": true, - "appium:appWaitDuration": 60000, - "appium:adbExecTimeout": 300000, - "appium:deviceReadyTimeout": 3000, - "appium:androidDeviceReadyTimeout": 3000, - "appium:avdLaunchTimeout": 300000, - "appium:avdReadyTimeout": 300000, - "appium:appWaitForLaunch": false, - "appium:avdArgs": "-no-window -noaudio -verbose -accel on -no-boot-anim -no-snapshot-save" - }, - "android:device": { - "platformName": "Android", - "maxInstances": 1, - "appium:isHeadless": false, - "appium:deviceName": "G8X", - "appium:platformVersion": "11", - "appium:orientation": "PORTRAIT", - "appium:automationName": "UiAutomator2", - "appium:app": "./.ionic/app-debug.apk", - "appium:appWaitActivity": "io.ionic.starter.MainActivity", - "appium:newCommandTimeout": 240 - }, - "android:browser": { - "platformName": "Android", - "browserName": "chrome", - "maxInstances": 1, - "appium:isHeadless": false, - "appium:deviceName": "e2eDevice", - "appium:platformVersion": "12", - "appium:orientation": "PORTRAIT", - "appium:newCommandTimeout": 240 - }, - "web:chrome": { - "maxInstances": 1, - "browserName": "chrome", - "wdio:devtoolsOptions": { - "headless": true - }, - "goog:chromeOptions": { - "prefs": { - "profile.default_content_setting_values.media_stream_camera": 1, - "profile.default_content_setting_values.media_stream_mic": 1, - "profile.default_content_setting_values.notifications": 1 - } - } - }, - "capabilities": [ - { - "platformName": "Android", - "maxInstances": 1, - "appium:isHeadless": true, - "appium:deviceName": "e2eDevice", - "appium:platformVersion": "11.0", - "appium:orientation": "PORTRAIT", - "appium:automationName": "UiAutomator2", - "appium:app": "./.ionic/app-debug.apk", - "appium:appWaitActivity": "io.ionic.starter.MainActivity", - "appium:newCommandTimeout": 300, - "appium:platformName": "Android", - "appium:avd": "e2eDevice", - "appium:appPackage": "io.ionic.starter", - "appium:autoGrantPermissions": true, - "appium:allowTestPackages": true, - "appium:appWaitDuration": 60000, - "appium:adbExecTimeout": 300000, - "appium:deviceReadyTimeout": 3000, - "appium:androidDeviceReadyTimeout": 3000, - "appium:avdLaunchTimeout": 300000, - "appium:avdReadyTimeout": 300000, - "appium:appWaitForLaunch": false, - "appium:avdArgs": "-no-window -noaudio -verbose -accel on -no-boot-anim -no-snapshot-save" - } - ] - } \ No newline at end of file diff --git a/plugin/e2e-tests/android/app/src/main/res/values/strings.xml b/plugin/e2e-tests/android/app/src/main/res/values/strings.xml deleted file mode 100644 index 9128e157..00000000 --- a/plugin/e2e-tests/android/app/src/main/res/values/strings.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - e2e-tests - e2e-tests - io.ionic.starter - io.ionic.starter - diff --git a/plugin/e2e-tests/android/capacitor.settings.gradle b/plugin/e2e-tests/android/capacitor.settings.gradle deleted file mode 100644 index a0346a2f..00000000 --- a/plugin/e2e-tests/android/capacitor.settings.gradle +++ /dev/null @@ -1,18 +0,0 @@ -// DO NOT EDIT THIS FILE! IT IS GENERATED EACH TIME "capacitor update" IS RUN -include ':capacitor-android' -project(':capacitor-android').projectDir = new File('../node_modules/@capacitor/android/capacitor') - -include ':capacitor-app' -project(':capacitor-app').projectDir = new File('../node_modules/@capacitor/app/android') - -include ':capacitor-google-maps' -project(':capacitor-google-maps').projectDir = new File('../../android') - -include ':capacitor-haptics' -project(':capacitor-haptics').projectDir = new File('../node_modules/@capacitor/haptics/android') - -include ':capacitor-keyboard' -project(':capacitor-keyboard').projectDir = new File('../node_modules/@capacitor/keyboard/android') - -include ':capacitor-status-bar' -project(':capacitor-status-bar').projectDir = new File('../node_modules/@capacitor/status-bar/android') diff --git a/plugin/e2e-tests/android/gradle/wrapper/gradle-wrapper.jar b/plugin/e2e-tests/android/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index a4b76b9530d66f5e68d973ea569d8e19de379189..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43583 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 yu?e%!_ptzGB|8GrCfu%p?(_ zQccdaaVK$5bz;*rnyK{_SQYM>;aES6Qs^lj9lEs6_J+%nIiuQC*fN;z8md>r_~Mfl zU%p5Dt_YT>gQqfr@`cR!$NWr~+`CZb%dn;WtzrAOI>P_JtsB76PYe*<%H(y>qx-`Kq!X_; z<{RpAqYhE=L1r*M)gNF3B8r(<%8mo*SR2hu zccLRZwGARt)Hlo1euqTyM>^!HK*!Q2P;4UYrysje@;(<|$&%vQekbn|0Ruu_Io(w4#%p6ld2Yp7tlA`Y$cciThP zKzNGIMPXX%&Ud0uQh!uQZz|FB`4KGD?3!ND?wQt6!n*f4EmCoJUh&b?;B{|lxs#F- z31~HQ`SF4x$&v00@(P+j1pAaj5!s`)b2RDBp*PB=2IB>oBF!*6vwr7Dp%zpAx*dPr zb@Zjq^XjN?O4QcZ*O+8>)|HlrR>oD*?WQl5ri3R#2?*W6iJ>>kH%KnnME&TT@ZzrHS$Q%LC?n|e>V+D+8D zYc4)QddFz7I8#}y#Wj6>4P%34dZH~OUDb?uP%-E zwjXM(?Sg~1!|wI(RVuxbu)-rH+O=igSho_pDCw(c6b=P zKk4ATlB?bj9+HHlh<_!&z0rx13K3ZrAR8W)!@Y}o`?a*JJsD+twZIv`W)@Y?Amu_u zz``@-e2X}27$i(2=9rvIu5uTUOVhzwu%mNazS|lZb&PT;XE2|B&W1>=B58#*!~D&) zfVmJGg8UdP*fx(>Cj^?yS^zH#o-$Q-*$SnK(ZVFkw+er=>N^7!)FtP3y~Xxnu^nzY zikgB>Nj0%;WOltWIob|}%lo?_C7<``a5hEkx&1ku$|)i>Rh6@3h*`slY=9U}(Ql_< zaNG*J8vb&@zpdhAvv`?{=zDedJ23TD&Zg__snRAH4eh~^oawdYi6A3w8<Ozh@Kw)#bdktM^GVb zrG08?0bG?|NG+w^&JvD*7LAbjED{_Zkc`3H!My>0u5Q}m!+6VokMLXxl`Mkd=g&Xx z-a>m*#G3SLlhbKB!)tnzfWOBV;u;ftU}S!NdD5+YtOjLg?X}dl>7m^gOpihrf1;PY zvll&>dIuUGs{Qnd- zwIR3oIrct8Va^Tm0t#(bJD7c$Z7DO9*7NnRZorrSm`b`cxz>OIC;jSE3DO8`hX955ui`s%||YQtt2 z5DNA&pG-V+4oI2s*x^>-$6J?p=I>C|9wZF8z;VjR??Icg?1w2v5Me+FgAeGGa8(3S z4vg*$>zC-WIVZtJ7}o9{D-7d>zCe|z#<9>CFve-OPAYsneTb^JH!Enaza#j}^mXy1 z+ULn^10+rWLF6j2>Ya@@Kq?26>AqK{A_| zQKb*~F1>sE*=d?A?W7N2j?L09_7n+HGi{VY;MoTGr_)G9)ot$p!-UY5zZ2Xtbm=t z@dpPSGwgH=QtIcEulQNI>S-#ifbnO5EWkI;$A|pxJd885oM+ zGZ0_0gDvG8q2xebj+fbCHYfAXuZStH2j~|d^sBAzo46(K8n59+T6rzBwK)^rfPT+B zyIFw)9YC-V^rhtK`!3jrhmW-sTmM+tPH+;nwjL#-SjQPUZ53L@A>y*rt(#M(qsiB2 zx6B)dI}6Wlsw%bJ8h|(lhkJVogQZA&n{?Vgs6gNSXzuZpEyu*xySy8ro07QZ7Vk1!3tJphN_5V7qOiyK8p z#@jcDD8nmtYi1^l8ml;AF<#IPK?!pqf9D4moYk>d99Im}Jtwj6c#+A;f)CQ*f-hZ< z=p_T86jog%!p)D&5g9taSwYi&eP z#JuEK%+NULWus;0w32-SYFku#i}d~+{Pkho&^{;RxzP&0!RCm3-9K6`>KZpnzS6?L z^H^V*s!8<>x8bomvD%rh>Zp3>Db%kyin;qtl+jAv8Oo~1g~mqGAC&Qi_wy|xEt2iz zWAJEfTV%cl2Cs<1L&DLRVVH05EDq`pH7Oh7sR`NNkL%wi}8n>IXcO40hp+J+sC!W?!krJf!GJNE8uj zg-y~Ns-<~D?yqbzVRB}G>0A^f0!^N7l=$m0OdZuqAOQqLc zX?AEGr1Ht+inZ-Qiwnl@Z0qukd__a!C*CKuGdy5#nD7VUBM^6OCpxCa2A(X;e0&V4 zM&WR8+wErQ7UIc6LY~Q9x%Sn*Tn>>P`^t&idaOEnOd(Ufw#>NoR^1QdhJ8s`h^|R_ zXX`c5*O~Xdvh%q;7L!_!ohf$NfEBmCde|#uVZvEo>OfEq%+Ns7&_f$OR9xsihRpBb z+cjk8LyDm@U{YN>+r46?nn{7Gh(;WhFw6GAxtcKD+YWV?uge>;+q#Xx4!GpRkVZYu zzsF}1)7$?%s9g9CH=Zs+B%M_)+~*j3L0&Q9u7!|+T`^O{xE6qvAP?XWv9_MrZKdo& z%IyU)$Q95AB4!#hT!_dA>4e@zjOBD*Y=XjtMm)V|+IXzjuM;(l+8aA5#Kaz_$rR6! zj>#&^DidYD$nUY(D$mH`9eb|dtV0b{S>H6FBfq>t5`;OxA4Nn{J(+XihF(stSche7$es&~N$epi&PDM_N`As;*9D^L==2Q7Z2zD+CiU(|+-kL*VG+&9!Yb3LgPy?A zm7Z&^qRG_JIxK7-FBzZI3Q<;{`DIxtc48k> zc|0dmX;Z=W$+)qE)~`yn6MdoJ4co;%!`ddy+FV538Y)j(vg}5*k(WK)KWZ3WaOG!8 z!syGn=s{H$odtpqFrT#JGM*utN7B((abXnpDM6w56nhw}OY}0TiTG1#f*VFZr+^-g zbP10`$LPq_;PvrA1XXlyx2uM^mrjTzX}w{yuLo-cOClE8MMk47T25G8M!9Z5ypOSV zAJUBGEg5L2fY)ZGJb^E34R2zJ?}Vf>{~gB!8=5Z) z9y$>5c)=;o0HeHHSuE4U)#vG&KF|I%-cF6f$~pdYJWk_dD}iOA>iA$O$+4%@>JU08 zS`ep)$XLPJ+n0_i@PkF#ri6T8?ZeAot$6JIYHm&P6EB=BiaNY|aA$W0I+nz*zkz_z zkEru!tj!QUffq%)8y0y`T&`fuus-1p>=^hnBiBqD^hXrPs`PY9tU3m0np~rISY09> z`P3s=-kt_cYcxWd{de@}TwSqg*xVhp;E9zCsnXo6z z?f&Sv^U7n4`xr=mXle94HzOdN!2kB~4=%)u&N!+2;z6UYKUDqi-s6AZ!haB;@&B`? z_TRX0%@suz^TRdCb?!vNJYPY8L_}&07uySH9%W^Tc&1pia6y1q#?*Drf}GjGbPjBS zbOPcUY#*$3sL2x4v_i*Y=N7E$mR}J%|GUI(>WEr+28+V z%v5{#e!UF*6~G&%;l*q*$V?&r$Pp^sE^i-0$+RH3ERUUdQ0>rAq2(2QAbG}$y{de( z>{qD~GGuOk559Y@%$?N^1ApVL_a704>8OD%8Y%8B;FCt%AoPu8*D1 zLB5X>b}Syz81pn;xnB}%0FnwazlWfUV)Z-~rZg6~b z6!9J$EcE&sEbzcy?CI~=boWA&eeIa%z(7SE^qgVLz??1Vbc1*aRvc%Mri)AJaAG!p z$X!_9Ds;Zz)f+;%s&dRcJt2==P{^j3bf0M=nJd&xwUGlUFn?H=2W(*2I2Gdu zv!gYCwM10aeus)`RIZSrCK=&oKaO_Ry~D1B5!y0R=%!i2*KfXGYX&gNv_u+n9wiR5 z*e$Zjju&ODRW3phN925%S(jL+bCHv6rZtc?!*`1TyYXT6%Ju=|X;6D@lq$8T zW{Y|e39ioPez(pBH%k)HzFITXHvnD6hw^lIoUMA;qAJ^CU?top1fo@s7xT13Fvn1H z6JWa-6+FJF#x>~+A;D~;VDs26>^oH0EI`IYT2iagy23?nyJ==i{g4%HrAf1-*v zK1)~@&(KkwR7TL}L(A@C_S0G;-GMDy=MJn2$FP5s<%wC)4jC5PXoxrQBFZ_k0P{{s@sz+gX`-!=T8rcB(=7vW}^K6oLWMmp(rwDh}b zwaGGd>yEy6fHv%jM$yJXo5oMAQ>c9j`**}F?MCry;T@47@r?&sKHgVe$MCqk#Z_3S z1GZI~nOEN*P~+UaFGnj{{Jo@16`(qVNtbU>O0Hf57-P>x8Jikp=`s8xWs^dAJ9lCQ z)GFm+=OV%AMVqVATtN@|vp61VVAHRn87}%PC^RAzJ%JngmZTasWBAWsoAqBU+8L8u z4A&Pe?fmTm0?mK-BL9t+{y7o(7jm+RpOhL9KnY#E&qu^}B6=K_dB}*VlSEiC9fn)+V=J;OnN)Ta5v66ic1rG+dGAJ1 z1%Zb_+!$=tQ~lxQrzv3x#CPb?CekEkA}0MYSgx$Jdd}q8+R=ma$|&1a#)TQ=l$1tQ z=tL9&_^vJ)Pk}EDO-va`UCT1m#Uty1{v^A3P~83_#v^ozH}6*9mIjIr;t3Uv%@VeW zGL6(CwCUp)Jq%G0bIG%?{_*Y#5IHf*5M@wPo6A{$Um++Co$wLC=J1aoG93&T7Ho}P z=mGEPP7GbvoG!uD$k(H3A$Z))+i{Hy?QHdk>3xSBXR0j!11O^mEe9RHmw!pvzv?Ua~2_l2Yh~_!s1qS`|0~0)YsbHSz8!mG)WiJE| z2f($6TQtt6L_f~ApQYQKSb=`053LgrQq7G@98#igV>y#i==-nEjQ!XNu9 z~;mE+gtj4IDDNQJ~JVk5Ux6&LCSFL!y=>79kE9=V}J7tD==Ga+IW zX)r7>VZ9dY=V&}DR))xUoV!u(Z|%3ciQi_2jl}3=$Agc(`RPb z8kEBpvY>1FGQ9W$n>Cq=DIpski};nE)`p3IUw1Oz0|wxll^)4dq3;CCY@RyJgFgc# zKouFh!`?Xuo{IMz^xi-h=StCis_M7yq$u) z?XHvw*HP0VgR+KR6wI)jEMX|ssqYvSf*_3W8zVTQzD?3>H!#>InzpSO)@SC8q*ii- z%%h}_#0{4JG;Jm`4zg};BPTGkYamx$Xo#O~lBirRY)q=5M45n{GCfV7h9qwyu1NxOMoP4)jjZMxmT|IQQh0U7C$EbnMN<3)Kk?fFHYq$d|ICu>KbY_hO zTZM+uKHe(cIZfEqyzyYSUBZa8;Fcut-GN!HSA9ius`ltNebF46ZX_BbZNU}}ZOm{M2&nANL9@0qvih15(|`S~z}m&h!u4x~(%MAO$jHRWNfuxWF#B)E&g3ghSQ9|> z(MFaLQj)NE0lowyjvg8z0#m6FIuKE9lDO~Glg}nSb7`~^&#(Lw{}GVOS>U)m8bF}x zVjbXljBm34Cs-yM6TVusr+3kYFjr28STT3g056y3cH5Tmge~ASxBj z%|yb>$eF;WgrcOZf569sDZOVwoo%8>XO>XQOX1OyN9I-SQgrm;U;+#3OI(zrWyow3 zk==|{lt2xrQ%FIXOTejR>;wv(Pb8u8}BUpx?yd(Abh6? zsoO3VYWkeLnF43&@*#MQ9-i-d0t*xN-UEyNKeyNMHw|A(k(_6QKO=nKMCxD(W(Yop zsRQ)QeL4X3Lxp^L%wzi2-WVSsf61dqliPUM7srDB?Wm6Lzn0&{*}|IsKQW;02(Y&| zaTKv|`U(pSzuvR6Rduu$wzK_W-Y-7>7s?G$)U}&uK;<>vU}^^ns@Z!p+9?St1s)dG zK%y6xkPyyS1$~&6v{kl?Md6gwM|>mt6Upm>oa8RLD^8T{0?HC!Z>;(Bob7el(DV6x zi`I)$&E&ngwFS@bi4^xFLAn`=fzTC;aimE^!cMI2n@Vo%Ae-ne`RF((&5y6xsjjAZ zVguVoQ?Z9uk$2ON;ersE%PU*xGO@T*;j1BO5#TuZKEf(mB7|g7pcEA=nYJ{s3vlbg zd4-DUlD{*6o%Gc^N!Nptgay>j6E5;3psI+C3Q!1ZIbeCubW%w4pq9)MSDyB{HLm|k zxv-{$$A*pS@csolri$Ge<4VZ}e~78JOL-EVyrbxKra^d{?|NnPp86!q>t<&IP07?Z z^>~IK^k#OEKgRH+LjllZXk7iA>2cfH6+(e&9ku5poo~6y{GC5>(bRK7hwjiurqAiZ zg*DmtgY}v83IjE&AbiWgMyFbaRUPZ{lYiz$U^&Zt2YjG<%m((&_JUbZcfJ22(>bi5 z!J?<7AySj0JZ&<-qXX;mcV!f~>G=sB0KnjWca4}vrtunD^1TrpfeS^4dvFr!65knK zZh`d;*VOkPs4*-9kL>$GP0`(M!j~B;#x?Ba~&s6CopvO86oM?-? zOw#dIRc;6A6T?B`Qp%^<U5 z19x(ywSH$_N+Io!6;e?`tWaM$`=Db!gzx|lQ${DG!zb1Zl&|{kX0y6xvO1o z220r<-oaS^^R2pEyY;=Qllqpmue|5yI~D|iI!IGt@iod{Opz@*ml^w2bNs)p`M(Io z|E;;m*Xpjd9l)4G#KaWfV(t8YUn@A;nK^#xgv=LtnArX|vWQVuw3}B${h+frU2>9^ z!l6)!Uo4`5k`<<;E(ido7M6lKTgWezNLq>U*=uz&s=cc$1%>VrAeOoUtA|T6gO4>UNqsdK=NF*8|~*sl&wI=x9-EGiq*aqV!(VVXA57 zw9*o6Ir8Lj1npUXvlevtn(_+^X5rzdR>#(}4YcB9O50q97%rW2me5_L=%ffYPUSRc z!vv?Kv>dH994Qi>U(a<0KF6NH5b16enCp+mw^Hb3Xs1^tThFpz!3QuN#}KBbww`(h z7GO)1olDqy6?T$()R7y%NYx*B0k_2IBiZ14&8|JPFxeMF{vW>HF-Vi3+ZOI=+qP}n zw(+!WcTd~4ZJX1!ZM&y!+uyt=&i!+~d(V%GjH;-NsEEv6nS1TERt|RHh!0>W4+4pp z1-*EzAM~i`+1f(VEHI8So`S`akPfPTfq*`l{Fz`hS%k#JS0cjT2mS0#QLGf=J?1`he3W*;m4)ce8*WFq1sdP=~$5RlH1EdWm|~dCvKOi4*I_96{^95p#B<(n!d?B z=o`0{t+&OMwKcxiBECznJcfH!fL(z3OvmxP#oWd48|mMjpE||zdiTBdWelj8&Qosv zZFp@&UgXuvJw5y=q6*28AtxZzo-UUpkRW%ne+Ylf!V-0+uQXBW=5S1o#6LXNtY5!I z%Rkz#(S8Pjz*P7bqB6L|M#Er{|QLae-Y{KA>`^} z@lPjeX>90X|34S-7}ZVXe{wEei1<{*e8T-Nbj8JmD4iwcE+Hg_zhkPVm#=@b$;)h6 z<<6y`nPa`f3I6`!28d@kdM{uJOgM%`EvlQ5B2bL)Sl=|y@YB3KeOzz=9cUW3clPAU z^sYc}xf9{4Oj?L5MOlYxR{+>w=vJjvbyO5}ptT(o6dR|ygO$)nVCvNGnq(6;bHlBd zl?w-|plD8spjDF03g5ip;W3Z z><0{BCq!Dw;h5~#1BuQilq*TwEu)qy50@+BE4bX28+7erX{BD4H)N+7U`AVEuREE8 z;X?~fyhF-x_sRfHIj~6f(+^@H)D=ngP;mwJjxhQUbUdzk8f94Ab%59-eRIq?ZKrwD z(BFI=)xrUlgu(b|hAysqK<}8bslmNNeD=#JW*}^~Nrswn^xw*nL@Tx!49bfJecV&KC2G4q5a!NSv)06A_5N3Y?veAz;Gv+@U3R% z)~UA8-0LvVE{}8LVDOHzp~2twReqf}ODIyXMM6=W>kL|OHcx9P%+aJGYi_Om)b!xe zF40Vntn0+VP>o<$AtP&JANjXBn7$}C@{+@3I@cqlwR2MdwGhVPxlTIcRVu@Ho-wO` z_~Or~IMG)A_`6-p)KPS@cT9mu9RGA>dVh5wY$NM9-^c@N=hcNaw4ITjm;iWSP^ZX| z)_XpaI61<+La+U&&%2a z0za$)-wZP@mwSELo#3!PGTt$uy0C(nTT@9NX*r3Ctw6J~7A(m#8fE)0RBd`TdKfAT zCf@$MAxjP`O(u9s@c0Fd@|}UQ6qp)O5Q5DPCeE6mSIh|Rj{$cAVIWsA=xPKVKxdhg zLzPZ`3CS+KIO;T}0Ip!fAUaNU>++ZJZRk@I(h<)RsJUhZ&Ru9*!4Ptn;gX^~4E8W^TSR&~3BAZc#HquXn)OW|TJ`CTahk+{qe`5+ixON^zA9IFd8)kc%*!AiLu z>`SFoZ5bW-%7}xZ>gpJcx_hpF$2l+533{gW{a7ce^B9sIdmLrI0)4yivZ^(Vh@-1q zFT!NQK$Iz^xu%|EOK=n>ug;(7J4OnS$;yWmq>A;hsD_0oAbLYhW^1Vdt9>;(JIYjf zdb+&f&D4@4AS?!*XpH>8egQvSVX`36jMd>$+RgI|pEg))^djhGSo&#lhS~9%NuWfX zDDH;3T*GzRT@5=7ibO>N-6_XPBYxno@mD_3I#rDD?iADxX`! zh*v8^i*JEMzyN#bGEBz7;UYXki*Xr(9xXax(_1qVW=Ml)kSuvK$coq2A(5ZGhs_pF z$*w}FbN6+QDseuB9=fdp_MTs)nQf!2SlROQ!gBJBCXD&@-VurqHj0wm@LWX-TDmS= z71M__vAok|@!qgi#H&H%Vg-((ZfxPAL8AI{x|VV!9)ZE}_l>iWk8UPTGHs*?u7RfP z5MC&=c6X;XlUzrz5q?(!eO@~* zoh2I*%J7dF!!_!vXoSIn5o|wj1#_>K*&CIn{qSaRc&iFVxt*^20ngCL;QonIS>I5^ zMw8HXm>W0PGd*}Ko)f|~dDd%;Wu_RWI_d;&2g6R3S63Uzjd7dn%Svu-OKpx*o|N>F zZg=-~qLb~VRLpv`k zWSdfHh@?dp=s_X`{yxOlxE$4iuyS;Z-x!*E6eqmEm*j2bE@=ZI0YZ5%Yj29!5+J$4h{s($nakA`xgbO8w zi=*r}PWz#lTL_DSAu1?f%-2OjD}NHXp4pXOsCW;DS@BC3h-q4_l`<))8WgzkdXg3! zs1WMt32kS2E#L0p_|x+x**TFV=gn`m9BWlzF{b%6j-odf4{7a4y4Uaef@YaeuPhU8 zHBvRqN^;$Jizy+ z=zW{E5<>2gp$pH{M@S*!sJVQU)b*J5*bX4h>5VJve#Q6ga}cQ&iL#=(u+KroWrxa%8&~p{WEUF0il=db;-$=A;&9M{Rq`ouZ5m%BHT6%st%saGsD6)fQgLN}x@d3q>FC;=f%O3Cyg=Ke@Gh`XW za@RajqOE9UB6eE=zhG%|dYS)IW)&y&Id2n7r)6p_)vlRP7NJL(x4UbhlcFXWT8?K=%s7;z?Vjts?y2+r|uk8Wt(DM*73^W%pAkZa1Jd zNoE)8FvQA>Z`eR5Z@Ig6kS5?0h;`Y&OL2D&xnnAUzQz{YSdh0k zB3exx%A2TyI)M*EM6htrxSlep!Kk(P(VP`$p0G~f$smld6W1r_Z+o?=IB@^weq>5VYsYZZR@` z&XJFxd5{|KPZmVOSxc@^%71C@;z}}WhbF9p!%yLj3j%YOlPL5s>7I3vj25 z@xmf=*z%Wb4;Va6SDk9cv|r*lhZ`(y_*M@>q;wrn)oQx%B(2A$9(74>;$zmQ!4fN; z>XurIk-7@wZys<+7XL@0Fhe-f%*=(weaQEdR9Eh6>Kl-EcI({qoZqyzziGwpg-GM#251sK_ z=3|kitS!j%;fpc@oWn65SEL73^N&t>Ix37xgs= zYG%eQDJc|rqHFia0!_sm7`@lvcv)gfy(+KXA@E{3t1DaZ$DijWAcA)E0@X?2ziJ{v z&KOYZ|DdkM{}t+@{@*6ge}m%xfjIxi%qh`=^2Rwz@w0cCvZ&Tc#UmCDbVwABrON^x zEBK43FO@weA8s7zggCOWhMvGGE`baZ62cC)VHyy!5Zbt%ieH+XN|OLbAFPZWyC6)p z4P3%8sq9HdS3=ih^0OOlqTPbKuzQ?lBEI{w^ReUO{V?@`ARsL|S*%yOS=Z%sF)>-y z(LAQdhgAcuF6LQjRYfdbD1g4o%tV4EiK&ElLB&^VZHbrV1K>tHTO{#XTo>)2UMm`2 z^t4s;vnMQgf-njU-RVBRw0P0-m#d-u`(kq7NL&2T)TjI_@iKuPAK-@oH(J8?%(e!0Ir$yG32@CGUPn5w4)+9@8c&pGx z+K3GKESI4*`tYlmMHt@br;jBWTei&(a=iYslc^c#RU3Q&sYp zSG){)V<(g7+8W!Wxeb5zJb4XE{I|&Y4UrFWr%LHkdQ;~XU zgy^dH-Z3lmY+0G~?DrC_S4@=>0oM8Isw%g(id10gWkoz2Q%7W$bFk@mIzTCcIB(K8 zc<5h&ZzCdT=9n-D>&a8vl+=ZF*`uTvQviG_bLde*k>{^)&0o*b05x$MO3gVLUx`xZ z43j+>!u?XV)Yp@MmG%Y`+COH2?nQcMrQ%k~6#O%PeD_WvFO~Kct za4XoCM_X!c5vhRkIdV=xUB3xI2NNStK*8_Zl!cFjOvp-AY=D;5{uXj}GV{LK1~IE2 z|KffUiBaStRr;10R~K2VVtf{TzM7FaPm;Y(zQjILn+tIPSrJh&EMf6evaBKIvi42-WYU9Vhj~3< zZSM-B;E`g_o8_XTM9IzEL=9Lb^SPhe(f(-`Yh=X6O7+6ALXnTcUFpI>ekl6v)ZQeNCg2 z^H|{SKXHU*%nBQ@I3It0m^h+6tvI@FS=MYS$ZpBaG7j#V@P2ZuYySbp@hA# ze(kc;P4i_-_UDP?%<6>%tTRih6VBgScKU^BV6Aoeg6Uh(W^#J^V$Xo^4#Ekp ztqQVK^g9gKMTHvV7nb64UU7p~!B?>Y0oFH5T7#BSW#YfSB@5PtE~#SCCg3p^o=NkMk$<8- z6PT*yIKGrvne7+y3}_!AC8NNeI?iTY(&nakN>>U-zT0wzZf-RuyZk^X9H-DT_*wk= z;&0}6LsGtfVa1q)CEUPlx#(ED@-?H<1_FrHU#z5^P3lEB|qsxEyn%FOpjx z3S?~gvoXy~L(Q{Jh6*i~=f%9kM1>RGjBzQh_SaIDfSU_9!<>*Pm>l)cJD@wlyxpBV z4Fmhc2q=R_wHCEK69<*wG%}mgD1=FHi4h!98B-*vMu4ZGW~%IrYSLGU{^TuseqVgV zLP<%wirIL`VLyJv9XG_p8w@Q4HzNt-o;U@Au{7%Ji;53!7V8Rv0^Lu^Vf*sL>R(;c zQG_ZuFl)Mh-xEIkGu}?_(HwkB2jS;HdPLSxVU&Jxy9*XRG~^HY(f0g8Q}iqnVmgjI zfd=``2&8GsycjR?M%(zMjn;tn9agcq;&rR!Hp z$B*gzHsQ~aXw8c|a(L^LW(|`yGc!qOnV(ZjU_Q-4z1&0;jG&vAKuNG=F|H?@m5^N@ zq{E!1n;)kNTJ>|Hb2ODt-7U~-MOIFo%9I)_@7fnX+eMMNh>)V$IXesJpBn|uo8f~#aOFytCT zf9&%MCLf8mp4kwHTcojWmM3LU=#|{3L>E}SKwOd?%{HogCZ_Z1BSA}P#O(%H$;z7XyJ^sjGX;j5 zrzp>|Ud;*&VAU3x#f{CKwY7Vc{%TKKqmB@oTHA9;>?!nvMA;8+Jh=cambHz#J18x~ zs!dF>$*AnsQ{{82r5Aw&^7eRCdvcgyxH?*DV5(I$qXh^zS>us*I66_MbL8y4d3ULj z{S(ipo+T3Ag!+5`NU2sc+@*m{_X|&p#O-SAqF&g_n7ObB82~$p%fXA5GLHMC+#qqL zdt`sJC&6C2)=juQ_!NeD>U8lDVpAOkW*khf7MCcs$A(wiIl#B9HM%~GtQ^}yBPjT@ z+E=|A!Z?A(rwzZ;T}o6pOVqHzTr*i;Wrc%&36kc@jXq~+w8kVrs;%=IFdACoLAcCAmhFNpbP8;s`zG|HC2Gv?I~w4ITy=g$`0qMQdkijLSOtX6xW%Z9Nw<;M- zMN`c7=$QxN00DiSjbVt9Mi6-pjv*j(_8PyV-il8Q-&TwBwH1gz1uoxs6~uU}PrgWB zIAE_I-a1EqlIaGQNbcp@iI8W1sm9fBBNOk(k&iLBe%MCo#?xI$%ZmGA?=)M9D=0t7 zc)Q0LnI)kCy{`jCGy9lYX%mUsDWwsY`;jE(;Us@gmWPqjmXL+Hu#^;k%eT>{nMtzj zsV`Iy6leTA8-PndszF;N^X@CJrTw5IIm!GPeu)H2#FQitR{1p;MasQVAG3*+=9FYK zw*k!HT(YQorfQj+1*mCV458(T5=fH`um$gS38hw(OqVMyunQ;rW5aPbF##A3fGH6h z@W)i9Uff?qz`YbK4c}JzQpuxuE3pcQO)%xBRZp{zJ^-*|oryTxJ-rR+MXJ)!f=+pp z10H|DdGd2exhi+hftcYbM0_}C0ZI-2vh+$fU1acsB-YXid7O|=9L!3e@$H*6?G*Zp z%qFB(sgl=FcC=E4CYGp4CN>=M8#5r!RU!u+FJVlH6=gI5xHVD&k;Ta*M28BsxfMV~ zLz+@6TxnfLhF@5=yQo^1&S}cmTN@m!7*c6z;}~*!hNBjuE>NLVl2EwN!F+)0$R1S! zR|lF%n!9fkZ@gPW|x|B={V6x3`=jS*$Pu0+5OWf?wnIy>Y1MbbGSncpKO0qE(qO=ts z!~@&!N`10S593pVQu4FzpOh!tvg}p%zCU(aV5=~K#bKi zHdJ1>tQSrhW%KOky;iW+O_n;`l9~omqM%sdxdLtI`TrJzN6BQz+7xOl*rM>xVI2~# z)7FJ^Dc{DC<%~VS?@WXzuOG$YPLC;>#vUJ^MmtbSL`_yXtNKa$Hk+l-c!aC7gn(Cg ze?YPYZ(2Jw{SF6MiO5(%_pTo7j@&DHNW`|lD`~{iH+_eSTS&OC*2WTT*a`?|9w1dh zh1nh@$a}T#WE5$7Od~NvSEU)T(W$p$s5fe^GpG+7fdJ9=enRT9$wEk+ZaB>G3$KQO zgq?-rZZnIv!p#>Ty~}c*Lb_jxJg$eGM*XwHUwuQ|o^}b3^T6Bxx{!?va8aC@-xK*H ztJBFvFfsSWu89%@b^l3-B~O!CXs)I6Y}y#0C0U0R0WG zybjroj$io0j}3%P7zADXOwHwafT#uu*zfM!oD$6aJx7+WL%t-@6^rD_a_M?S^>c;z zMK580bZXo1f*L$CuMeM4Mp!;P@}b~$cd(s5*q~FP+NHSq;nw3fbWyH)i2)-;gQl{S zZO!T}A}fC}vUdskGSq&{`oxt~0i?0xhr6I47_tBc`fqaSrMOzR4>0H^;A zF)hX1nfHs)%Zb-(YGX;=#2R6C{BG;k=?FfP?9{_uFLri~-~AJ;jw({4MU7e*d)?P@ zXX*GkNY9ItFjhwgAIWq7Y!ksbMzfqpG)IrqKx9q{zu%Mdl+{Dis#p9q`02pr1LG8R z@As?eG!>IoROgS!@J*to<27coFc1zpkh?w=)h9CbYe%^Q!Ui46Y*HO0mr% zEff-*$ndMNw}H2a5@BsGj5oFfd!T(F&0$<{GO!Qdd?McKkorh=5{EIjDTHU`So>8V zBA-fqVLb2;u7UhDV1xMI?y>fe3~4urv3%PX)lDw+HYa;HFkaLqi4c~VtCm&Ca+9C~ zge+67hp#R9`+Euq59WhHX&7~RlXn=--m8$iZ~~1C8cv^2(qO#X0?vl91gzUKBeR1J z^p4!!&7)3#@@X&2aF2-)1Ffcc^F8r|RtdL2X%HgN&XU-KH2SLCbpw?J5xJ*!F-ypZ zMG%AJ!Pr&}`LW?E!K~=(NJxuSVTRCGJ$2a*Ao=uUDSys!OFYu!Vs2IT;xQ6EubLIl z+?+nMGeQQhh~??0!s4iQ#gm3!BpMpnY?04kK375e((Uc7B3RMj;wE?BCoQGu=UlZt!EZ1Q*auI)dj3Jj{Ujgt zW5hd~-HWBLI_3HuO) zNrb^XzPsTIb=*a69wAAA3J6AAZZ1VsYbIG}a`=d6?PjM)3EPaDpW2YP$|GrBX{q*! z$KBHNif)OKMBCFP5>!1d=DK>8u+Upm-{hj5o|Wn$vh1&K!lVfDB&47lw$tJ?d5|=B z^(_9=(1T3Fte)z^>|3**n}mIX;mMN5v2F#l(q*CvU{Ga`@VMp#%rQkDBy7kYbmb-q z<5!4iuB#Q_lLZ8}h|hPODI^U6`gzLJre9u3k3c#%86IKI*^H-@I48Bi*@avYm4v!n0+v zWu{M{&F8#p9cx+gF0yTB_<2QUrjMPo9*7^-uP#~gGW~y3nfPAoV%amgr>PSyVAd@l)}8#X zR5zV6t*uKJZL}?NYvPVK6J0v4iVpwiN|>+t3aYiZSp;m0!(1`bHO}TEtWR1tY%BPB z(W!0DmXbZAsT$iC13p4f>u*ZAy@JoLAkJhzFf1#4;#1deO8#8d&89}en&z!W&A3++^1(;>0SB1*54d@y&9Pn;^IAf3GiXbfT`_>{R+Xv; zQvgL>+0#8-laO!j#-WB~(I>l0NCMt_;@Gp_f0#^c)t?&#Xh1-7RR0@zPyBz!U#0Av zT?}n({(p?p7!4S2ZBw)#KdCG)uPnZe+U|0{BW!m)9 zi_9$F?m<`2!`JNFv+w8MK_K)qJ^aO@7-Ig>cM4-r0bi=>?B_2mFNJ}aE3<+QCzRr*NA!QjHw# z`1OsvcoD0?%jq{*7b!l|L1+Tw0TTAM4XMq7*ntc-Ived>Sj_ZtS|uVdpfg1_I9knY z2{GM_j5sDC7(W&}#s{jqbybqJWyn?{PW*&cQIU|*v8YGOKKlGl@?c#TCnmnAkAzV- zmK={|1G90zz=YUvC}+fMqts0d4vgA%t6Jhjv?d;(Z}(Ep8fTZfHA9``fdUHkA+z3+ zhh{ohP%Bj?T~{i0sYCQ}uC#5BwN`skI7`|c%kqkyWIQ;!ysvA8H`b-t()n6>GJj6xlYDu~8qX{AFo$Cm3d|XFL=4uvc?Keb zzb0ZmMoXca6Mob>JqkNuoP>B2Z>D`Q(TvrG6m`j}-1rGP!g|qoL=$FVQYxJQjFn33lODt3Wb1j8VR zlR++vIT6^DtYxAv_hxupbLLN3e0%A%a+hWTKDV3!Fjr^cWJ{scsAdfhpI)`Bms^M6 zQG$waKgFr=c|p9Piug=fcJvZ1ThMnNhQvBAg-8~b1?6wL*WyqXhtj^g(Ke}mEfZVM zJuLNTUVh#WsE*a6uqiz`b#9ZYg3+2%=C(6AvZGc=u&<6??!slB1a9K)=VL zY9EL^mfyKnD zSJyYBc_>G;5RRnrNgzJz#Rkn3S1`mZgO`(r5;Hw6MveN(URf_XS-r58Cn80K)ArH4 z#Rrd~LG1W&@ttw85cjp8xV&>$b%nSXH_*W}7Ch2pg$$c0BdEo-HWRTZcxngIBJad> z;C>b{jIXjb_9Jis?NZJsdm^EG}e*pR&DAy0EaSGi3XWTa(>C%tz1n$u?5Fb z1qtl?;_yjYo)(gB^iQq?=jusF%kywm?CJP~zEHi0NbZ);$(H$w(Hy@{i>$wcVRD_X|w-~(0Z9BJyh zhNh;+eQ9BEIs;tPz%jSVnfCP!3L&9YtEP;svoj_bNzeGSQIAjd zBss@A;)R^WAu-37RQrM%{DfBNRx>v!G31Z}8-El9IOJlb_MSoMu2}GDYycNaf>uny z+8xykD-7ONCM!APry_Lw6-yT>5!tR}W;W`C)1>pxSs5o1z#j7%m=&=7O4hz+Lsqm` z*>{+xsabZPr&X=}G@obTb{nPTkccJX8w3CG7X+1+t{JcMabv~UNv+G?txRqXib~c^Mo}`q{$`;EBNJ;#F*{gvS12kV?AZ%O0SFB$^ zn+}!HbmEj}w{Vq(G)OGAzH}R~kS^;(-s&=ectz8vN!_)Yl$$U@HNTI-pV`LSj7Opu zTZ5zZ)-S_{GcEQPIQXLQ#oMS`HPu{`SQiAZ)m1at*Hy%3xma|>o`h%E%8BEbi9p0r zVjcsh<{NBKQ4eKlXU|}@XJ#@uQw*$4BxKn6#W~I4T<^f99~(=}a`&3(ur8R9t+|AQ zWkQx7l}wa48-jO@ft2h+7qn%SJtL%~890FG0s5g*kNbL3I&@brh&f6)TlM`K^(bhr zJWM6N6x3flOw$@|C@kPi7yP&SP?bzP-E|HSXQXG>7gk|R9BTj`e=4de9C6+H7H7n# z#GJeVs1mtHhLDmVO?LkYRQc`DVOJ_vdl8VUihO-j#t=0T3%Fc1f9F73ufJz*adn*p zc%&vi(4NqHu^R>sAT_0EDjVR8bc%wTz#$;%NU-kbDyL_dg0%TFafZwZ?5KZpcuaO54Z9hX zD$u>q!-9`U6-D`E#`W~fIfiIF5_m6{fvM)b1NG3xf4Auw;Go~Fu7cth#DlUn{@~yu z=B;RT*dp?bO}o%4x7k9v{r=Y@^YQ^UUm(Qmliw8brO^=NP+UOohLYiaEB3^DB56&V zK?4jV61B|1Uj_5fBKW;8LdwOFZKWp)g{B%7g1~DgO&N& z#lisxf?R~Z@?3E$Mms$$JK8oe@X`5m98V*aV6Ua}8Xs2#A!{x?IP|N(%nxsH?^c{& z@vY&R1QmQs83BW28qAmJfS7MYi=h(YK??@EhjL-t*5W!p z^gYX!Q6-vBqcv~ruw@oMaU&qp0Fb(dbVzm5xJN%0o_^@fWq$oa3X?9s%+b)x4w-q5Koe(@j6Ez7V@~NRFvd zfBH~)U5!ix3isg`6be__wBJp=1@yfsCMw1C@y+9WYD9_C%{Q~7^0AF2KFryfLlUP# zwrtJEcH)jm48!6tUcxiurAMaiD04C&tPe6DI0#aoqz#Bt0_7_*X*TsF7u*zv(iEfA z;$@?XVu~oX#1YXtceQL{dSneL&*nDug^OW$DSLF0M1Im|sSX8R26&)<0Fbh^*l6!5wfSu8MpMoh=2l z^^0Sr$UpZp*9oqa23fcCfm7`ya2<4wzJ`Axt7e4jJrRFVf?nY~2&tRL* zd;6_njcz01c>$IvN=?K}9ie%Z(BO@JG2J}fT#BJQ+f5LFSgup7i!xWRKw6)iITjZU z%l6hPZia>R!`aZjwCp}I zg)%20;}f+&@t;(%5;RHL>K_&7MH^S+7<|(SZH!u zznW|jz$uA`P9@ZWtJgv$EFp>)K&Gt+4C6#*khZQXS*S~6N%JDT$r`aJDs9|uXWdbg zBwho$phWx}x!qy8&}6y5Vr$G{yGSE*r$^r{}pw zVTZKvikRZ`J_IJrjc=X1uw?estdwm&bEahku&D04HD+0Bm~q#YGS6gp!KLf$A{%Qd z&&yX@Hp>~(wU{|(#U&Bf92+1i&Q*-S+=y=3pSZy$#8Uc$#7oiJUuO{cE6=tsPhwPe| zxQpK>`Dbka`V)$}e6_OXKLB%i76~4N*zA?X+PrhH<&)}prET;kel24kW%+9))G^JI zsq7L{P}^#QsZViX%KgxBvEugr>ZmFqe^oAg?{EI=&_O#e)F3V#rc z8$4}0Zr19qd3tE4#$3_f=Bbx9oV6VO!d3(R===i-7p=Vj`520w0D3W6lQfY48}!D* z&)lZMG;~er2qBoI2gsX+Ts-hnpS~NYRDtPd^FPzn!^&yxRy#CSz(b&E*tL|jIkq|l zf%>)7Dtu>jCf`-7R#*GhGn4FkYf;B$+9IxmqH|lf6$4irg{0ept__%)V*R_OK=T06 zyT_m-o@Kp6U{l5h>W1hGq*X#8*y@<;vsOFqEjTQXFEotR+{3}ODDnj;o0@!bB5x=N z394FojuGOtVKBlVRLtHp%EJv_G5q=AgF)SKyRN5=cGBjDWv4LDn$IL`*=~J7u&Dy5 zrMc83y+w^F&{?X(KOOAl-sWZDb{9X9#jrQtmrEXD?;h-}SYT7yM(X_6qksM=K_a;Z z3u0qT0TtaNvDER_8x*rxXw&C^|h{P1qxK|@pS7vdlZ#P z7PdB7MmC2}%sdzAxt>;WM1s0??`1983O4nFK|hVAbHcZ3x{PzytQLkCVk7hA!Lo` zEJH?4qw|}WH{dc4z%aB=0XqsFW?^p=X}4xnCJXK%c#ItOSjdSO`UXJyuc8bh^Cf}8 z@Ht|vXd^6{Fgai8*tmyRGmD_s_nv~r^Fy7j`Bu`6=G)5H$i7Q7lvQnmea&TGvJp9a|qOrUymZ$6G|Ly z#zOCg++$3iB$!6!>215A4!iryregKuUT344X)jQb3|9qY>c0LO{6Vby05n~VFzd?q zgGZv&FGlkiH*`fTurp>B8v&nSxNz)=5IF$=@rgND4d`!AaaX;_lK~)-U8la_Wa8i?NJC@BURO*sUW)E9oyv3RG^YGfN%BmxzjlT)bp*$<| zX3tt?EAy<&K+bhIuMs-g#=d1}N_?isY)6Ay$mDOKRh z4v1asEGWoAp=srraLW^h&_Uw|6O+r;wns=uwYm=JN4Q!quD8SQRSeEcGh|Eb5Jg8m zOT}u;N|x@aq)=&;wufCc^#)5U^VcZw;d_wwaoh9$p@Xrc{DD6GZUqZ ziC6OT^zSq@-lhbgR8B+e;7_Giv;DK5gn^$bs<6~SUadiosfewWDJu`XsBfOd1|p=q zE>m=zF}!lObA%ePey~gqU8S6h-^J2Y?>7)L2+%8kV}Gp=h`Xm_}rlm)SyUS=`=S7msKu zC|T!gPiI1rWGb1z$Md?0YJQ;%>uPLOXf1Z>N~`~JHJ!^@D5kSXQ4ugnFZ>^`zH8CAiZmp z6Ms|#2gcGsQ{{u7+Nb9sA?U>(0e$5V1|WVwY`Kn)rsnnZ4=1u=7u!4WexZD^IQ1Jk zfF#NLe>W$3m&C^ULjdw+5|)-BSHwpegdyt9NYC{3@QtMfd8GrIWDu`gd0nv-3LpGCh@wgBaG z176tikL!_NXM+Bv#7q^cyn9$XSeZR6#!B4JE@GVH zoobHZN_*RF#@_SVYKkQ_igme-Y5U}cV(hkR#k1c{bQNMji zU7aE`?dHyx=1`kOYZo_8U7?3-7vHOp`Qe%Z*i+FX!s?6huNp0iCEW-Z7E&jRWmUW_ z67j>)Ew!yq)hhG4o?^z}HWH-e=es#xJUhDRc4B51M4~E-l5VZ!&zQq`gWe`?}#b~7w1LH4Xa-UCT5LXkXQWheBa2YJYbyQ zl1pXR%b(KCXMO0OsXgl0P0Og<{(@&z1aokU-Pq`eQq*JYgt8xdFQ6S z6Z3IFSua8W&M#`~*L#r>Jfd6*BzJ?JFdBR#bDv$_0N!_5vnmo@!>vULcDm`MFU823 zpG9pqjqz^FE5zMDoGqhs5OMmC{Y3iVcl>F}5Rs24Y5B^mYQ;1T&ks@pIApHOdrzXF z-SdX}Hf{X;TaSxG_T$0~#RhqKISGKNK47}0*x&nRIPtmdwxc&QT3$8&!3fWu1eZ_P zJveQj^hJL#Sn!*4k`3}(d(aasl&7G0j0-*_2xtAnoX1@9+h zO#c>YQg60Z;o{Bi=3i7S`Ic+ZE>K{(u|#)9y}q*j8uKQ1^>+(BI}m%1v3$=4ojGBc zm+o1*!T&b}-lVvZqIUBc8V}QyFEgm#oyIuC{8WqUNV{Toz`oxhYpP!_p2oHHh5P@iB*NVo~2=GQm+8Yrkm2Xjc_VyHg1c0>+o~@>*Qzo zHVBJS>$$}$_4EniTI;b1WShX<5-p#TPB&!;lP!lBVBbLOOxh6FuYloD%m;n{r|;MU3!q4AVkua~fieeWu2 zQAQ$ue(IklX6+V;F1vCu-&V?I3d42FgWgsb_e^29ol}HYft?{SLf>DrmOp9o!t>I^ zY7fBCk+E8n_|apgM|-;^=#B?6RnFKlN`oR)`e$+;D=yO-(U^jV;rft^G_zl`n7qnM zL z*-Y4Phq+ZI1$j$F-f;`CD#|`-T~OM5Q>x}a>B~Gb3-+9i>Lfr|Ca6S^8g*{*?_5!x zH_N!SoRP=gX1?)q%>QTY!r77e2j9W(I!uAz{T`NdNmPBBUzi2{`XMB^zJGGwFWeA9 z{fk33#*9SO0)DjROug+(M)I-pKA!CX;IY(#gE!UxXVsa)X!UftIN98{pt#4MJHOhY zM$_l}-TJlxY?LS6Nuz1T<44m<4i^8k@D$zuCPrkmz@sdv+{ciyFJG2Zwy&%c7;atIeTdh!a(R^QXnu1Oq1b42*OQFWnyQ zWeQrdvP|w_idy53Wa<{QH^lFmEd+VlJkyiC>6B#s)F;w-{c;aKIm;Kp50HnA-o3lY z9B~F$gJ@yYE#g#X&3ADx&tO+P_@mnQTz9gv30_sTsaGXkfNYXY{$(>*PEN3QL>I!k zp)KibPhrfX3%Z$H6SY`rXGYS~143wZrG2;=FLj50+VM6soI~up_>fU(2Wl@{BRsMi zO%sL3x?2l1cXTF)k&moNsHfQrQ+wu(gBt{sk#CU=UhrvJIncy@tJX5klLjgMn>~h= zg|FR&;@eh|C7`>s_9c~0-{IAPV){l|Ts`i=)AW;d9&KPc3fMeoTS%8@V~D8*h;&(^>yjT84MM}=%#LS7shLAuuj(0VAYoozhWjq z4LEr?wUe2^WGwdTIgWBkDUJa>YP@5d9^Rs$kCXmMRxuF*YMVrn?0NFyPl}>`&dqZb z<5eqR=ZG3>n2{6v6BvJ`YBZeeTtB88TAY(x0a58EWyuf>+^|x8Qa6wA|1Nb_p|nA zWWa}|z8a)--Wj`LqyFk_a3gN2>5{Rl_wbW?#by7&i*^hRknK%jwIH6=dQ8*-_{*x0j^DUfMX0`|K@6C<|1cgZ~D(e5vBFFm;HTZF(!vT8=T$K+|F)x3kqzBV4-=p1V(lzi(s7jdu0>LD#N=$Lk#3HkG!a zIF<7>%B7sRNzJ66KrFV76J<2bdYhxll0y2^_rdG=I%AgW4~)1Nvz=$1UkE^J%BxLo z+lUci`UcU062os*=`-j4IfSQA{w@y|3}Vk?i;&SSdh8n+$iHA#%ERL{;EpXl6u&8@ zzg}?hkEOUOJt?ZL=pWZFJ19mI1@P=$U5*Im1e_8Z${JsM>Ov?nh8Z zP5QvI!{Jy@&BP48%P2{Jr_VgzW;P@7)M9n|lDT|Ep#}7C$&ud&6>C^5ZiwKIg2McPU(4jhM!BD@@L(Gd*Nu$ji(ljZ<{FIeW_1Mmf;76{LU z-ywN~=uNN)Xi6$<12A9y)K%X|(W0p|&>>4OXB?IiYr||WKDOJPxiSe01NSV-h24^L z_>m$;|C+q!Mj**-qQ$L-*++en(g|hw;M!^%_h-iDjFHLo-n3JpB;p?+o2;`*jpvJU zLY^lt)Un4joij^^)O(CKs@7E%*!w>!HA4Q?0}oBJ7Nr8NQ7QmY^4~jvf0-`%waOLn zdNjAPaC0_7c|RVhw)+71NWjRi!y>C+Bl;Z`NiL^zn2*0kmj5gyhCLCxts*cWCdRI| zjsd=sT5BVJc^$GxP~YF$-U{-?kW6r@^vHXB%{CqYzU@1>dzf#3SYedJG-Rm6^RB7s zGM5PR(yKPKR)>?~vpUIeTP7A1sc8-knnJk*9)3t^e%izbdm>Y=W{$wm(cy1RB-19i za#828DMBY+ps#7Y8^6t)=Ea@%Nkt)O6JCx|ybC;Ap}Z@Zw~*}3P>MZLPb4Enxz9Wf zssobT^(R@KuShj8>@!1M7tm|2%-pYYDxz-5`rCbaTCG5{;Uxm z*g=+H1X8{NUvFGzz~wXa%Eo};I;~`37*WrRU&K0dPSB$yk(Z*@K&+mFal^?c zurbqB-+|Kb5|sznT;?Pj!+kgFY1#Dr;_%A(GIQC{3ct|{*Bji%FNa6c-thbpBkA;U zURV!Dr&X{0J}iht#-Qp2=xzuh(fM>zRoiGrYl5ttw2#r34gC41CCOC31m~^UPTK@s z6;A@)7O7_%C)>bnAXerYuAHdE93>j2N}H${zEc6&SbZ|-fiG*-qtGuy-qDelH(|u$ zorf8_T6Zqe#Ub!+e3oSyrskt_HyW_^5lrWt#30l)tHk|j$@YyEkXUOV;6B51L;M@=NIWZXU;GrAa(LGxO%|im%7F<-6N;en0Cr zLH>l*y?pMwt`1*cH~LdBPFY_l;~`N!Clyfr;7w<^X;&(ZiVdF1S5e(+Q%60zgh)s4 zn2yj$+mE=miVERP(g8}G4<85^-5f@qxh2ec?n+$A_`?qN=iyT1?U@t?V6DM~BIlBB z>u~eXm-aE>R0sQy!-I4xtCNi!!qh?R1!kKf6BoH2GG{L4%PAz0{Sh6xpuyI%*~u)s z%rLuFl)uQUCBQAtMyN;%)zFMx4loh7uTfKeB2Xif`lN?2gq6NhWhfz0u5WP9J>=V2 zo{mLtSy&BA!mSzs&CrKWq^y40JF5a&GSXIi2= z{EYb59J4}VwikL4P=>+mc6{($FNE@e=VUwG+KV21;<@lrN`mnz5jYGASyvz7BOG_6(p^eTxD-4O#lROgon;R35=|nj#eHIfJBYPWG>H>`dHKCDZ3`R{-?HO0mE~(5_WYcFmp8sU?wr*UkAQiNDGc6T zA%}GOLXlOWqL?WwfHO8MB#8M8*~Y*gz;1rWWoVSXP&IbKxbQ8+s%4Jnt?kDsq7btI zCDr0PZ)b;B%!lu&CT#RJzm{l{2fq|BcY85`w~3LSK<><@(2EdzFLt9Y_`;WXL6x`0 zDoQ?=?I@Hbr;*VVll1Gmd8*%tiXggMK81a+T(5Gx6;eNb8=uYn z5BG-0g>pP21NPn>$ntBh>`*})Fl|38oC^9Qz>~MAazH%3Q~Qb!ALMf$srexgPZ2@&c~+hxRi1;}+)-06)!#Mq<6GhP z-Q?qmgo${aFBApb5p}$1OJKTClfi8%PpnczyVKkoHw7Ml9e7ikrF0d~UB}i3vizos zXW4DN$SiEV9{faLt5bHy2a>33K%7Td-n5C*N;f&ZqAg#2hIqEb(y<&f4u5BWJ>2^4 z414GosL=Aom#m&=x_v<0-fp1r%oVJ{T-(xnomNJ(Dryv zh?vj+%=II_nV+@NR+(!fZZVM&(W6{6%9cm+o+Z6}KqzLw{(>E86uA1`_K$HqINlb1 zKelh3-jr2I9V?ych`{hta9wQ2c9=MM`2cC{m6^MhlL2{DLv7C^j z$xXBCnDl_;l|bPGMX@*tV)B!c|4oZyftUlP*?$YU9C_eAsuVHJ58?)zpbr30P*C`T z7y#ao`uE-SOG(Pi+`$=e^mle~)pRrdwL5)N;o{gpW21of(QE#U6w%*C~`v-z0QqBML!!5EeYA5IQB0 z^l01c;L6E(iytN!LhL}wfwP7W9PNAkb+)Cst?qg#$n;z41O4&v+8-zPs+XNb-q zIeeBCh#ivnFLUCwfS;p{LC0O7tm+Sf9Jn)~b%uwP{%69;QC)Ok0t%*a5M+=;y8j=v z#!*pp$9@!x;UMIs4~hP#pnfVc!%-D<+wsG@R2+J&%73lK|2G!EQC)O05TCV=&3g)C!lT=czLpZ@Sa%TYuoE?v8T8`V;e$#Zf2_Nj6nvBgh1)2 GZ~q4|mN%#X diff --git a/plugin/e2e-tests/android/variables.gradle b/plugin/e2e-tests/android/variables.gradle deleted file mode 100644 index 14eafdf5..00000000 --- a/plugin/e2e-tests/android/variables.gradle +++ /dev/null @@ -1,16 +0,0 @@ -ext { - minSdkVersion = 23 - compileSdkVersion = 35 - targetSdkVersion = 35 - androidxActivityVersion = '1.9.2' - androidxAppCompatVersion = '1.7.0' - androidxCoordinatorLayoutVersion = '1.2.0' - androidxCoreVersion = '1.15.0' - androidxFragmentVersion = '1.8.4' - androidxWebkitVersion = '1.12.1' - androidxJunitVersion = '1.2.1' - androidxEspressoCoreVersion = '3.6.1' - cordovaAndroidVersion = '10.1.1' - coreSplashScreenVersion = '1.0.1' - junitVersion = '4.13.2' -} \ No newline at end of file diff --git a/plugin/e2e-tests/capacitor.config.json b/plugin/e2e-tests/capacitor.config.json deleted file mode 100644 index a22dfc2b..00000000 --- a/plugin/e2e-tests/capacitor.config.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "appId": "io.ionic.starter", - "appName": "e2e-tests", - "webDir": "build", - "bundledWebRuntime": false -} diff --git a/plugin/e2e-tests/ionic.e2e.config.ts b/plugin/e2e-tests/ionic.e2e.config.ts deleted file mode 100644 index 4912652c..00000000 --- a/plugin/e2e-tests/ionic.e2e.config.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* eslint-disable import/no-anonymous-default-export */ -export default { - appRootDir: '.', - wdio: { - logLevel: 'trace', // options are "trace" or "error" - 'ios:simulator': { - 'appium:platformName': 'iOS', - 'appium:deviceName': 'iPhone 13 Pro Max', - 'appium:platformVersion': '15.2', - 'appium:isHeadless': true, - 'appium:wdaLaunchTimeout': 600000, - }, - 'ios:device': {}, - 'android:emulator': { - 'appium:platformName': 'Android', - 'appium:deviceName': 'e2eDevice', - 'appium:avd': 'e2eDevice', - 'appium:isHeadless': true, - 'appium:platformVersion': '11.0', - 'appium:appPackage': 'io.ionic.starter', - 'appium:appWaitActivity': 'io.ionic.starter.MainActivity', - 'appium:autoGrantPermissions': true, - 'appium:allowTestPackages': true, - 'appium:appWaitDuration': 60000, - 'appium:adbExecTimeout': 300000, - 'appium:deviceReadyTimeout': 3000, - 'appium:androidDeviceReadyTimeout': 3000, - 'appium:avdLaunchTimeout': 300000, - 'appium:avdReadyTimeout': 300000, - 'appium:appWaitForLaunch': false, - 'appium:newCommandTimeout': 300, - 'appium:avdArgs': '-no-window -noaudio -verbose -accel on -no-boot-anim -no-snapshot-save', - }, - 'android:device': {}, - }, -}; diff --git a/plugin/e2e-tests/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/plugin/e2e-tests/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index 42daef8a..00000000 --- a/plugin/e2e-tests/ios/App/App.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/plugin/e2e-tests/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/plugin/e2e-tests/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json deleted file mode 100644 index 905798df..00000000 --- a/plugin/e2e-tests/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "images" : [ - { - "filename" : "AppIcon-512@2x.png", - "idiom" : "universal", - "platform" : "ios", - "size" : "1024x1024" - } - ], - "info" : { - "author" : "xcode", - "version" : 1 - } -} \ No newline at end of file diff --git a/plugin/e2e-tests/ios/App/App/capacitor.config.json b/plugin/e2e-tests/ios/App/App/capacitor.config.json deleted file mode 100644 index a22ac3e6..00000000 --- a/plugin/e2e-tests/ios/App/App/capacitor.config.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "appId": "io.ionic.starter", - "appName": "e2e-tests", - "webDir": "build", - "bundledWebRuntime": false, - "packageClassList": [ - "AppPlugin", - "CapacitorGoogleMapsPlugin", - "HapticsPlugin", - "KeyboardPlugin", - "StatusBarPlugin" - ] -} diff --git a/plugin/e2e-tests/ios/App/App/config.xml b/plugin/e2e-tests/ios/App/App/config.xml deleted file mode 100644 index 1b1b0e0d..00000000 --- a/plugin/e2e-tests/ios/App/App/config.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/plugin/e2e-tests/ios/App/Podfile b/plugin/e2e-tests/ios/App/Podfile deleted file mode 100644 index f38bc01a..00000000 --- a/plugin/e2e-tests/ios/App/Podfile +++ /dev/null @@ -1,22 +0,0 @@ -platform :ios, '15.0' -use_frameworks! - -# workaround to avoid Xcode caching of Pods that requires -# Product -> Clean Build Folder after new Cordova plugins installed -# Requires CocoaPods 1.6 or newer -install! 'cocoapods', :disable_input_output_paths => true - -def capacitor_pods - pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' - pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' - pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' - pod 'CapacitorGoogleMaps', :path => '../../..' - pod 'CapacitorHaptics', :path => '../../node_modules/@capacitor/haptics' - pod 'CapacitorKeyboard', :path => '../../node_modules/@capacitor/keyboard' - pod 'CapacitorStatusBar', :path => '../../node_modules/@capacitor/status-bar' -end - -target 'App' do - capacitor_pods - # Add your Pods here -end diff --git a/plugin/e2e-tests/package.json b/plugin/e2e-tests/package.json deleted file mode 100644 index 6757febd..00000000 --- a/plugin/e2e-tests/package.json +++ /dev/null @@ -1,86 +0,0 @@ -{ - "name": "e2e-tests", - "version": "0.0.1", - "private": true, - "dependencies": { - "@capacitor/app": "next", - "@capacitor/android": "next", - "@capacitor/core": "next", - "@capacitor/google-maps": "file:..", - "@capacitor/haptics": "next", - "@capacitor/ios": "next", - "@capacitor/keyboard": "next", - "@capacitor/status-bar": "next", - "@ionic/react": "^8.7.9", - "@ionic/react-router": "^8.7.9", - "@testing-library/jest-dom": "^6.9.1", - "@testing-library/react": "^16.3.0", - "@testing-library/user-event": "^14.6.1", - "@types/jest": "^30.0.0", - "@types/node": "^24.10.1", - "@types/react": "^19.2.6", - "@types/react-dom": "^19.2.3", - "@types/react-router": "^5.1.20", - "@types/react-router-dom": "^5.3.3", - "ionicons": "^8.0.13", - "react": "^19.2.0", - "react-dom": "^19.2.0", - "react-router": "^5.3.4", - "react-router-dom": "^5.3.4", - "react-scripts": "^5.0.1", - "typescript": "^5.9.3", - "web-vitals": "^5.1.0", - "workbox-background-sync": "^7.3.0", - "workbox-broadcast-update": "^7.3.0", - "workbox-cacheable-response": "^7.3.0", - "workbox-core": "^7.3.0", - "workbox-expiration": "^7.3.0", - "workbox-google-analytics": "^7.3.0", - "workbox-navigation-preload": "^7.3.0", - "workbox-precaching": "^7.3.0", - "workbox-range-requests": "^7.3.0", - "workbox-routing": "^7.3.0", - "workbox-strategies": "^7.3.0", - "workbox-streams": "^7.3.0" - }, - "scripts": { - "start": "react-scripts start", - "build": "react-scripts build", - "test": "react-scripts test --transformIgnorePatterns 'node_modules/(?!(@ionic/react|@ionic/react-router|@ionic/core|@stencil/core|ionicons)/)'", - "eject": "react-scripts eject", - "sync": "npm run build && npx cap sync", - "ionic-e2e": "ionic-e2e", - "e2e:ios:build": "npm run ionic-e2e build ios:simulator", - "e2e:ios:run": "npm run ionic-e2e run ios:simulator", - "e2e:ios": "E2E_MODE=simulator && npm run sync && npm run e2e:ios:build && npm run e2e:ios:run", - "e2e:android:build": "npm run ionic-e2e build android:emulator", - "e2e:android:run": "npm run ionic-e2e run android:emulator", - "e2e:android": "./scripts/run_Android_E2E.sh", - "e2e:prepare": "./scripts/build_local_package.sh" - }, - "eslintConfig": { - "extends": [ - "react-app", - "react-app/jest" - ] - }, - "browserslist": { - "production": [ - ">0.2%", - "not dead", - "not op_mini all" - ], - "development": [ - "last 1 chrome version", - "last 1 firefox version", - "last 1 safari version" - ] - }, - "devDependencies": { - "@capacitor/cli": "next", - "@ionic/e2e": "0.2.0-next.6", - "@ionic/e2e-components-ionic": "0.2.0-next.6", - "appium": "^1.22.1" - }, - "description": "An Ionic project" -} \ No newline at end of file diff --git a/plugin/e2e-tests/scripts/build_local_package.sh b/plugin/e2e-tests/scripts/build_local_package.sh deleted file mode 100755 index bb97fa3b..00000000 --- a/plugin/e2e-tests/scripts/build_local_package.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/bin/bash - -cd ../ && npm install && npm run pack-local -cd ./e2e-tests && npm install ../capacitor-google-maps.tgz \ No newline at end of file diff --git a/plugin/e2e-tests/scripts/create_E2E_AVD.sh b/plugin/e2e-tests/scripts/create_E2E_AVD.sh deleted file mode 100755 index 3cbbb5c2..00000000 --- a/plugin/e2e-tests/scripts/create_E2E_AVD.sh +++ /dev/null @@ -1,55 +0,0 @@ -#!/bin/bash - -CPU_ARCH=`uname -p`"" - -SDKMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/sdkmanager -AVDMANAGER=$ANDROID_SDK_ROOT/cmdline-tools/latest/bin/avdmanager -ABD=$ANDROID_SDK_ROOT/platform-tools/adb -EMU=$ANDROID_SDK_ROOT/emulator/emulator - -E2E_DEVICE_EXISTS=`${EMU} -list-avds | grep -c e2eDevice` - -if [[ $E2E_DEVICE_EXISTS -lt 1 ]]; then - echo "Creating e2eDevice AVD..." - echo "" - - echo "CPU_ARCH: $CPU_ARCH" - echo "JAVA_HOME: $JAVA_HOME" - echo "ANDROID_SDK_ROOT: $ANDROID_SDK_ROOT" - echo "" - echo "--------------------------" - echo "" - - echo "Accepting Lics..." - sh -c \yes | ${SDKMANAGER} --licenses > /dev/null - - echo "Installing build-tools..." - ${SDKMANAGER} --install 'build-tools;31.0.0' platform-tools 'platforms;android-31' - echo "Installing emulator..." - ${SDKMANAGER} --install emulator --channel=0 - echo "Installing sys-image..." - - # If we are on arm (m1 mac) use arm images, else use x86_64 - if [ "$CPU_ARCH" = "arm" ]; then - ${SDKMANAGER} --install 'system-images;android-31;google_apis;arm64-v8a' --channel=0 - else - ${SDKMANAGER} --install 'system-images;android-31;google_apis;x86_64' --channel=0 - fi - - echo "Killing all running emulators..." - ${ABD} devices | grep emulator | cut -f1 | while read line; do ${ABD} -s $line emu kill; done; - - echo "Creating AVD..." - if [ "$CPU_ARCH" = "arm" ]; then - ${AVDMANAGER} --verbose create avd -n e2eDevice -k "system-images;android-31;google_apis;arm64-v8a" --device "pixel_3a" - else - ${AVDMANAGER} --verbose create avd -n e2eDevice -k "system-images;android-31;google_apis;x86_64" --device "pixel_3a" - fi - -else - echo "e2eDevice AVD exists!" -fi - -echo "" - - diff --git a/plugin/e2e-tests/scripts/run_Android_E2E.sh b/plugin/e2e-tests/scripts/run_Android_E2E.sh deleted file mode 100755 index b61184b1..00000000 --- a/plugin/e2e-tests/scripts/run_Android_E2E.sh +++ /dev/null @@ -1,63 +0,0 @@ -#!/bin/bash - -set -e - -if [[ -z "$ANDROID_SDK_ROOT" ]]; then - export ANDROID_SDK_ROOT=~/Library/Android/sdk -fi -if [[ -n "$JAVA_HOME_11_X64" ]]; then - export JAVA_HOME=$JAVA_HOME_11_X64 -else - export JAVA_HOME=/Applications/Android\ Studio.app/Contents/jre/Contents/Home -fi - -# Check to see if we are not in a Github Action -if [[ -z $GITHUB_ACTION ]]; then - - ABD=$ANDROID_SDK_ROOT/platform-tools/adb - EMU=$ANDROID_SDK_ROOT/emulator/emulator - - echo "Not in GH Action. Checking for e2eDevice Emulator..." - $PWD/scripts/create_E2E_AVD.sh - - set +e - - echo 'Searching for e2eDevice...' - devicesCount=`${ABD} devices | grep -c emulator` - - if [[ $devicesCount =~ 0 ]]; then - echo 'Starting emulator...' - ${EMU} -avd "e2eDevice" -no-window -noaudio -accel on -no-boot-anim -no-snapshot-save & - fi - - bootanim="" - failcounter=0 - timeout_in_sec=360 - - until [[ "$bootanim" =~ "stopped" ]]; do - bootanim=`${ABD} -e shell getprop init.svc.bootanim 2>&1 &` - if [[ "$bootanim" =~ "device not found" || "$bootanim" =~ "device offline" - || "$bootanim" =~ "running" ]]; then - let "failcounter += 1" - echo "Waiting for emulator to start" - if [[ $failcounter -gt timeout_in_sec ]]; then - echo "Timeout ($timeout_in_sec seconds) reached; failed to start emulator" - exit 1 - fi - fi - sleep 1 - done - - echo "Emulator is ready" - - sleep 4 - - set -e - -fi - -E2E_MODE=simulator - -npm run sync -npm run e2e:android:build -npm run e2e:android:run diff --git a/plugin/e2e-tests/src/react-app-env.d.ts b/plugin/e2e-tests/src/react-app-env.d.ts deleted file mode 100644 index 6431bc5f..00000000 --- a/plugin/e2e-tests/src/react-app-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/plugin/e2e-tests/src/reportWebVitals.ts b/plugin/e2e-tests/src/reportWebVitals.ts deleted file mode 100644 index 49a2a16e..00000000 --- a/plugin/e2e-tests/src/reportWebVitals.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { ReportHandler } from 'web-vitals'; - -const reportWebVitals = (onPerfEntry?: ReportHandler) => { - if (onPerfEntry && onPerfEntry instanceof Function) { - import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { - getCLS(onPerfEntry); - getFID(onPerfEntry); - getFCP(onPerfEntry); - getLCP(onPerfEntry); - getTTFB(onPerfEntry); - }); - } -}; - -export default reportWebVitals; diff --git a/plugin/e2e-tests/tests/pageobjects/basic-echo/basic-echo.page.ts b/plugin/e2e-tests/tests/pageobjects/basic-echo/basic-echo.page.ts deleted file mode 100644 index a41920e4..00000000 --- a/plugin/e2e-tests/tests/pageobjects/basic-echo/basic-echo.page.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IonicButton, IonicInput } from '@ionic/e2e-components-ionic'; - -import Page from '../page'; - -class BasicEchoPage extends Page { - get runEchoButton() { - return new IonicButton('#runEchoButton'); - } - get commandOutputTextarea() { - return new IonicInput('#commandOutput'); - } -} - -export default new BasicEchoPage(); diff --git a/plugin/e2e-tests/tests/pageobjects/map/create-and-destroy.page.ts b/plugin/e2e-tests/tests/pageobjects/map/create-and-destroy.page.ts deleted file mode 100644 index e207d9e9..00000000 --- a/plugin/e2e-tests/tests/pageobjects/map/create-and-destroy.page.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { IonicButton, IonicTextarea } from '@ionic/e2e-components-ionic'; - -import Page from '../page'; - -class CreateAndDestroyMapPage extends Page { - get createMapButton() { - return new IonicButton("#createMapButton"); - } - get destroyMapButton() { - return new IonicButton("#destroyMapButton"); - } - get commandOutputTextarea() { - return new IonicTextarea('#commandOutput'); - } -} - -export default new CreateAndDestroyMapPage(); \ No newline at end of file diff --git a/plugin/e2e-tests/tests/pageobjects/markers/add-and-remove.page.ts b/plugin/e2e-tests/tests/pageobjects/markers/add-and-remove.page.ts deleted file mode 100644 index 7f6c47d3..00000000 --- a/plugin/e2e-tests/tests/pageobjects/markers/add-and-remove.page.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { IonicButton, IonicTextarea } from '@ionic/e2e-components-ionic'; - -import Page from "../page"; - -class AddAndRemoveMarkers extends Page { - get createMapButton() { - return new IonicButton("#createMapButton") - } - get addMarkerButton() { - return new IonicButton("#addMarkerButton") - } - get removeMarkerButton() { - return new IonicButton("#removeMarkerButton") - } - get commandOutputTextarea() { - return new IonicTextarea('#commandOutput'); - } -} - - -export default new AddAndRemoveMarkers(); \ No newline at end of file diff --git a/plugin/e2e-tests/tests/pageobjects/markers/marker-customization.page.ts b/plugin/e2e-tests/tests/pageobjects/markers/marker-customization.page.ts deleted file mode 100644 index 96925a37..00000000 --- a/plugin/e2e-tests/tests/pageobjects/markers/marker-customization.page.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { IonicButton, IonicTextarea } from '@ionic/e2e-components-ionic'; - -import Page from '../page'; - -class MarkerCustomizations extends Page { - get createMapButton() { - return new IonicButton('#createMapButton'); - } - - get addMarkerImageButton() { - return new IonicButton('#addMarkerImageButton'); - } - - get addMarkerColorButton() { - return new IonicButton('#addMarkerColorButton'); - } - - get addMultipleImageMarkersButton() { - return new IonicButton('#addMultipleImageMarkersButton'); - } - - get addMultipleColorMarkersButton() { - return new IonicButton('#addMultipleColorMarkersButton'); - } - - get removeAllMarkersButton() { - return new IonicButton('#removeAllMarkersButton'); - } - - get destroyMapButton() { - return new IonicButton('#destroyMapButton'); - } - - get commandOutputTextarea() { - return new IonicTextarea('#commandOutput'); -} -} - -export default new MarkerCustomizations(); diff --git a/plugin/e2e-tests/tests/pageobjects/markers/multiple-markers.page.ts b/plugin/e2e-tests/tests/pageobjects/markers/multiple-markers.page.ts deleted file mode 100644 index 79f237cd..00000000 --- a/plugin/e2e-tests/tests/pageobjects/markers/multiple-markers.page.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { IonicButton, IonicTextarea } from '@ionic/e2e-components-ionic'; - -import Page from "../page"; - -class MultipleMarkers extends Page { - get createMapButton() { - return new IonicButton("#createMapButton") - } - get addMarkersButton() { - return new IonicButton("#addMarkersButton") - } - get enableClusteringButton() { - return new IonicButton("#enableClusteringButton") - } - get disableClusteringButton() { - return new IonicButton("#disableClusteringButton") - } - get removeMarkersButton() { - return new IonicButton("#removeMarkersButton") - } - get commandOutputTextarea() { - return new IonicTextarea('#commandOutput'); - } -} - -export default new MultipleMarkers(); \ No newline at end of file diff --git a/plugin/e2e-tests/tests/pageobjects/page.ts b/plugin/e2e-tests/tests/pageobjects/page.ts deleted file mode 100644 index 137bf5b5..00000000 --- a/plugin/e2e-tests/tests/pageobjects/page.ts +++ /dev/null @@ -1,23 +0,0 @@ -export default class Page { - public async hideToolBars() { - await driver.execute(() => { - for (let i = 0; i < document.getElementsByTagName('ion-toolbar').length; i++) { - const toolbar: HTMLElement | null = document.getElementsByTagName('ion-toolbar').item(i) as HTMLElement; - if (toolbar !== null) { - toolbar.style.display = 'none'; - } - } - }); - } - - public async showToolBars() { - await driver.execute(() => { - for (let i = 0; i < document.getElementsByTagName('ion-toolbar').length; i++) { - const toolbar: HTMLElement | null = document.getElementsByTagName('ion-toolbar').item(i) as HTMLElement; - if (toolbar !== null) { - toolbar.style.display = ''; - } - } - }); - } -} diff --git a/plugin/e2e-tests/tests/specs/basic-echo/basic-echo.spec.ts b/plugin/e2e-tests/tests/specs/basic-echo/basic-echo.spec.ts deleted file mode 100644 index e810261f..00000000 --- a/plugin/e2e-tests/tests/specs/basic-echo/basic-echo.spec.ts +++ /dev/null @@ -1,33 +0,0 @@ -import * as IonicE2E from '@ionic/e2e'; -import { waitForLoad, pause, setDevice, switchToWeb, url } from '@ionic/e2e'; - -import SetAndGetValuePage from '../../pageobjects/basic-echo/basic-echo.page'; - -describe.skip('Google Maps - Basic Echo', function () { - before(async function () { - await waitForLoad(); - await switchToWeb(); - await url('/basic-echo/run-basic-echo'); - await pause(500); - }); - - beforeEach(async function () { - await setDevice(IonicE2E.Device.Mobile); - await switchToWeb(); - await SetAndGetValuePage.hideToolBars(); - }); - - after(async function () { - await switchToWeb(); - await SetAndGetValuePage.showToolBars(); - await pause(500); - }); - - it('should run a basic echo from plugin.', async () => { - const runEchoButton = await SetAndGetValuePage.runEchoButton; - const commandOutput = await $((await SetAndGetValuePage.commandOutputTextarea).selector).$('textarea'); - - await runEchoButton.tap(); - await expect(commandOutput).toHaveValue('WOW!'); - }); -}); diff --git a/plugin/e2e-tests/tests/specs/map/create-and-destroy.spec.ts b/plugin/e2e-tests/tests/specs/map/create-and-destroy.spec.ts deleted file mode 100644 index 13aaf26b..00000000 --- a/plugin/e2e-tests/tests/specs/map/create-and-destroy.spec.ts +++ /dev/null @@ -1,55 +0,0 @@ -import * as IonicE2E from '@ionic/e2e'; -import { waitForLoad, pause, setDevice, switchToWeb, url } from '@ionic/e2e'; - -import CreateAndDestroyMapPage from '../../pageobjects/map/create-and-destroy.page'; - - -describe('Google Maps - Create and Destroy Map', function () { - before(async function () { - await waitForLoad(); - await switchToWeb(); - await url('/maps/create-and-destroy'); - await pause(500); - }); - - beforeEach(async function () { - await setDevice(IonicE2E.Device.Mobile); - await switchToWeb(); - await CreateAndDestroyMapPage.hideToolBars(); - }); - - after(async function () { - await switchToWeb(); - await CreateAndDestroyMapPage.showToolBars(); - await pause(500); - }); - - it('should create and destroy a map', async function() { - const createMapButton = await CreateAndDestroyMapPage.createMapButton; - const destroyMapButton = await CreateAndDestroyMapPage.destroyMapButton; - const getCommandOutputText = async function() { - return (await CreateAndDestroyMapPage.commandOutputTextarea).getValue(); - } - - await createMapButton.tap(); - await pause(500); - await expect(await getCommandOutputText()).toBe('Maps created'); - - await destroyMapButton.tap(); - await pause(500); - await expect(await getCommandOutputText()).toBe('Maps destroyed'); - }); - - it('should throw when attempting to destroy a non-existent map', async function() { - const destroyMapButton = await CreateAndDestroyMapPage.destroyMapButton; - const getCommandOutputText = async function() { - return (await CreateAndDestroyMapPage.commandOutputTextarea).getValue(); - } - - await destroyMapButton.tap(); - await pause(100); - await expect(await getCommandOutputText()).toBe('Map not found for provided id.'); - }); - - -}); diff --git a/plugin/e2e-tests/tests/specs/markers/add-and-remove.spec.ts b/plugin/e2e-tests/tests/specs/markers/add-and-remove.spec.ts deleted file mode 100644 index 7b398cc5..00000000 --- a/plugin/e2e-tests/tests/specs/markers/add-and-remove.spec.ts +++ /dev/null @@ -1,67 +0,0 @@ -import * as IonicE2E from '@ionic/e2e'; -import { waitForLoad, pause, setDevice, switchToWeb, url } from '@ionic/e2e'; - -import AddAndRemoveMarkers from '../../pageobjects/markers/add-and-remove.page'; - - -describe('Google Maps - Add and Remove Marker', function () { - let createdMarkerId = ""; - - before(async function () { - await waitForLoad(); - await switchToWeb(); - await url('/markers/add-and-remove'); - await pause(500); - }); - - beforeEach(async function () { - await setDevice(IonicE2E.Device.Mobile); - await switchToWeb(); - await AddAndRemoveMarkers.hideToolBars(); - }); - - after(async function () { - await switchToWeb(); - await AddAndRemoveMarkers.showToolBars(); - await pause(500); - }); - - it("should create a map and add a marker", async function() { - const createMapButton = await AddAndRemoveMarkers.createMapButton; - const addMarkerButton = await AddAndRemoveMarkers.addMarkerButton; - const getCommandOutputText = async function() { - return (await AddAndRemoveMarkers.commandOutputTextarea).getValue(); - } - - await createMapButton.tap(); - await pause(500); - await expect(await getCommandOutputText()).toBe('Map created'); - - await addMarkerButton.tap(); - await pause(500); - await expect(await getCommandOutputText()).toContain('Marker added: '); - - const markerId = (await getCommandOutputText()).replace("Marker added: ", ""); - await expect(markerId).not.toBeFalsy(); - - createdMarkerId = markerId; - }); - - it("should remove the created marker", async function() { - const removeMarkerButton = await AddAndRemoveMarkers.removeMarkerButton; - const commandOutput = await $((await AddAndRemoveMarkers.commandOutputTextarea).selector).$('textarea'); - - await removeMarkerButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining(`Marker removed: ${createdMarkerId}`); - }); - - it("should throw when attempting to remove a non-existent marker", async function() { - const removeMarkerButton = await AddAndRemoveMarkers.removeMarkerButton; - const commandOutput = await $((await AddAndRemoveMarkers.commandOutputTextarea).selector).$('textarea'); - - await removeMarkerButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining(`Marker not found for provided id.`); - }); -}); \ No newline at end of file diff --git a/plugin/e2e-tests/tests/specs/markers/marker-customization.spec.ts b/plugin/e2e-tests/tests/specs/markers/marker-customization.spec.ts deleted file mode 100644 index 4d4a80c1..00000000 --- a/plugin/e2e-tests/tests/specs/markers/marker-customization.spec.ts +++ /dev/null @@ -1,125 +0,0 @@ -import * as IonicE2E from '@ionic/e2e'; -import { waitForLoad, pause, setDevice, switchToWeb, url } from '@ionic/e2e'; - -import MarkerCustomizations from '../../pageobjects/markers/marker-customization.page'; - -describe('Google Maps - Marker Customization', function () { - before(async function () { - await waitForLoad(); - await switchToWeb(); - await url('/markers/customizations'); - await pause(500); - }); - - beforeEach(async function () { - await setDevice(IonicE2E.Device.Mobile); - await switchToWeb(); - await MarkerCustomizations.hideToolBars(); - }); - - after(async function () { - await switchToWeb(); - await MarkerCustomizations.showToolBars(); - await pause(500); - }); - - it('should create a map and add 1 color marker', async function () { - const createMapButton = await MarkerCustomizations.createMapButton; - const removeAllMarkersButton = await MarkerCustomizations.removeAllMarkersButton; - const addColorMarkerButton = await MarkerCustomizations.addMarkerColorButton; - const commandOutput = await $( - ( - await MarkerCustomizations.commandOutputTextarea - ).selector, - ).$('textarea'); - - await createMapButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValue('Map created'); - - await addColorMarkerButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('1 color marker added'); - - await removeAllMarkersButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('1 markers removed'); - }); - - it('should create a map and add 1 image marker', async function () { - const createMapButton = await MarkerCustomizations.createMapButton; - const removeAllMarkersButton = await MarkerCustomizations.removeAllMarkersButton; - const addImageMarkerButton = await MarkerCustomizations.addMarkerImageButton; - const commandOutput = await $( - ( - await MarkerCustomizations.commandOutputTextarea - ).selector, - ).$('textarea'); - - await createMapButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValue('Map created'); - - await addImageMarkerButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('1 image marker added'); - - await removeAllMarkersButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('1 markers removed'); - }); - - it('should add 1 image marker', async function () { - const removeAllMarkersButton = await MarkerCustomizations.removeAllMarkersButton; - const addImageMarkerButton = await MarkerCustomizations.addMarkerImageButton; - const commandOutput = await $( - ( - await MarkerCustomizations.commandOutputTextarea - ).selector, - ).$('textarea'); - - await addImageMarkerButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('1 image marker added'); - - await removeAllMarkersButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('1 markers removed'); - }); - - it('should add 4 image markers', async function () { - const removeAllMarkersButton = await MarkerCustomizations.removeAllMarkersButton; - const addMultipleImageMarkersButton = await MarkerCustomizations.addMultipleImageMarkersButton; - const commandOutput = await $( - ( - await MarkerCustomizations.commandOutputTextarea - ).selector, - ).$('textarea'); - - await addMultipleImageMarkersButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('4 image markers added'); - - await removeAllMarkersButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('4 markers removed'); - }); - - it('should add 4 color markers', async function () { - const removeAllMarkersButton = await MarkerCustomizations.removeAllMarkersButton; - const addMultipleColorMarkersButton = await MarkerCustomizations.addMultipleColorMarkersButton; - const commandOutput = await $( - ( - await MarkerCustomizations.commandOutputTextarea - ).selector, - ).$('textarea'); - - await addMultipleColorMarkersButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('4 color markers added'); - - await removeAllMarkersButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('4 markers removed'); - }); -}); diff --git a/plugin/e2e-tests/tests/specs/markers/multiple-markers.spec.ts b/plugin/e2e-tests/tests/specs/markers/multiple-markers.spec.ts deleted file mode 100644 index f1d2b3e5..00000000 --- a/plugin/e2e-tests/tests/specs/markers/multiple-markers.spec.ts +++ /dev/null @@ -1,71 +0,0 @@ -import * as IonicE2E from '@ionic/e2e'; -import { waitForLoad, pause, setDevice, switchToWeb, url } from '@ionic/e2e'; - -import MultipleMarkers from '../../pageobjects/markers/multiple-markers.page'; - -describe('Google Maps - Multiple Markers', function () { - before(async function () { - await waitForLoad(); - await switchToWeb(); - await url('/markers/multiple-markers'); - await pause(500); - }); - - beforeEach(async function () { - await setDevice(IonicE2E.Device.Mobile); - await switchToWeb(); - await MultipleMarkers.hideToolBars(); - }); - - after(async function () { - await switchToWeb(); - await MultipleMarkers.showToolBars(); - await pause(500); - }); - - it("should create a map and add 4 markers", async function() { - const createMapButton = await MultipleMarkers.createMapButton; - const addMarkersButton = await MultipleMarkers.addMarkersButton; - const commandOutput = await $((await MultipleMarkers.commandOutputTextarea).selector).$('textarea'); - - await createMapButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValue('Map created'); - - await addMarkersButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValueContaining('4 markers added'); - }) - - it("should enable and disable clustering", async function() { - const enableClusteringButton = await MultipleMarkers.enableClusteringButton; - const disableClusteringButton = await MultipleMarkers.disableClusteringButton; - const commandOutput = await $((await MultipleMarkers.commandOutputTextarea).selector).$('textarea'); - - await enableClusteringButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValue('marker clustering enabled'); - - await disableClusteringButton.tap(); - await pause(500); - await expect(commandOutput).toHaveValue('marker clustering disabled'); - }) - - it("should remove 4 markers", async function() { - const removeMarkersButton = await MultipleMarkers.removeMarkersButton; - const commandOutput = await $((await MultipleMarkers.commandOutputTextarea).selector).$('textarea'); - - await removeMarkersButton.tap() - await pause(500); - await expect(commandOutput).toHaveValue('4 markers removed'); - }) - - it("should throw error when attempting to remove no markers", async function() { - const removeMarkersButton = await MultipleMarkers.removeMarkersButton; - const commandOutput = await $((await MultipleMarkers.commandOutputTextarea).selector).$('textarea'); - - await removeMarkersButton.tap() - await pause(500); - await expect(commandOutput).toHaveValue('Invalid Arguments Provided: markerIds requires at least one marker id.'); - }) -}) \ No newline at end of file diff --git a/plugin/eslint.config.cjs b/plugin/eslint.config.cjs index c2a5fb40..c41b832b 100644 --- a/plugin/eslint.config.cjs +++ b/plugin/eslint.config.cjs @@ -5,7 +5,7 @@ const prettierConfig = require('eslint-config-prettier'); module.exports = [ { - ignores: ['node_modules/**', 'dist/**', 'build/**', 'e2e-tests/**', 'unit-tests/**', 'android/**', 'ios/**', 'types/**', 'eslint.config.*'], + ignores: ['node_modules/**', 'dist/**', 'build/**', 'unit-tests/**', 'android/**', 'ios/**', 'types/**', 'eslint.config.*'], }, eslintjs.configs.recommended, { diff --git a/plugin/package.json b/plugin/package.json index 2c52c7a9..ae02bef6 100644 --- a/plugin/package.json +++ b/plugin/package.json @@ -45,7 +45,7 @@ "lint": "pnpm run eslint && pnpm run prettier --check && pnpm run swiftlint lint", "fmt": "pnpm run eslint --fix && pnpm run prettier --write && pnpm run swiftlint lint --fix --format", "eslint": "eslint .", - "prettier": "prettier \"**/*.{css,html,ts,js,java}\" \"!e2e-tests/**\" --plugin=prettier-plugin-java", + "prettier": "prettier \"**/*.{css,html,ts,js,java}\" --plugin=prettier-plugin-java", "swiftlint": "node-swiftlint", "docgen": "node ../scripts/docgen_updates.js", "build": "pnpm run clean && pnpm run docgen && tsc && rollup -c rollup.config.js && pnpm run downleveldts", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4741bb35..b087f5d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,6 +24,133 @@ importers: specifier: ^5.9.3 version: 5.9.3 + example-app: + dependencies: + '@capacitor/android': + specifier: ^8.0.0 + version: 8.0.1(@capacitor/core@8.0.1) + '@capacitor/app': + specifier: ^8.0.0 + version: 8.0.0(@capacitor/core@8.0.1) + '@capacitor/core': + specifier: ^8.0.0 + version: 8.0.1 + '@capacitor/google-maps': + specifier: workspace:* + version: link:../plugin + '@capacitor/haptics': + specifier: ^8.0.0 + version: 8.0.0(@capacitor/core@8.0.1) + '@capacitor/ios': + specifier: ^8.0.0 + version: 8.0.1(@capacitor/core@8.0.1) + '@capacitor/keyboard': + specifier: ^8.0.0 + version: 8.0.0(@capacitor/core@8.0.1) + '@capacitor/status-bar': + specifier: ^8.0.0 + version: 8.0.0(@capacitor/core@8.0.1) + '@ionic/react': + specifier: ^8.7.11 + version: 8.7.16(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@ionic/react-router': + specifier: ^8.7.11 + version: 8.7.16(react-dom@19.2.3(react@19.2.3))(react-router-dom@5.3.4(react@19.2.3))(react-router@5.3.4(react@19.2.3))(react@19.2.3) + '@testing-library/jest-dom': + specifier: ^6.9.1 + version: 6.9.1 + '@testing-library/react': + specifier: ^16.3.0 + version: 16.3.1(@testing-library/dom@10.4.1)(@types/react-dom@19.2.3(@types/react@19.2.8))(@types/react@19.2.8)(react-dom@19.2.3(react@19.2.3))(react@19.2.3) + '@testing-library/user-event': + specifier: ^14.6.1 + version: 14.6.1(@testing-library/dom@10.4.1) + '@types/google.maps': + specifier: ~3.58.1 + version: 3.58.1 + '@types/jest': + specifier: ^30.0.0 + version: 30.0.0 + '@types/node': + specifier: ^24.10.2 + version: 24.10.8 + '@types/react': + specifier: ^19.2.7 + version: 19.2.8 + '@types/react-dom': + specifier: ^19.2.3 + version: 19.2.3(@types/react@19.2.8) + '@types/react-router': + specifier: ^5.1.20 + version: 5.1.20 + '@types/react-router-dom': + specifier: ^5.3.3 + version: 5.3.3 + ionicons: + specifier: ^8.0.13 + version: 8.0.13 + react: + specifier: ^19.2.1 + version: 19.2.3 + react-dom: + specifier: ^19.2.1 + version: 19.2.3(react@19.2.3) + react-router: + specifier: ^5.3.4 + version: 5.3.4(react@19.2.3) + react-router-dom: + specifier: ^5.3.4 + version: 5.3.4(react@19.2.3) + react-scripts: + specifier: ^5.0.1 + version: 5.0.1(@babel/plugin-syntax-flow@7.28.6(@babel/core@7.28.6))(@babel/plugin-transform-react-jsx@7.28.6(@babel/core@7.28.6))(@types/babel__core@7.20.5)(eslint@8.57.1)(react@19.2.3)(type-fest@0.21.3)(typescript@5.9.3)(yaml@2.8.2) + typescript: + specifier: ^5.9.3 + version: 5.9.3 + web-vitals: + specifier: ^5.1.0 + version: 5.1.0 + workbox-background-sync: + specifier: ^7.4.0 + version: 7.4.0 + workbox-broadcast-update: + specifier: ^7.4.0 + version: 7.4.0 + workbox-cacheable-response: + specifier: ^7.4.0 + version: 7.4.0 + workbox-core: + specifier: ^7.4.0 + version: 7.4.0 + workbox-expiration: + specifier: ^7.4.0 + version: 7.4.0 + workbox-google-analytics: + specifier: ^7.4.0 + version: 7.4.0 + workbox-navigation-preload: + specifier: ^7.4.0 + version: 7.4.0 + workbox-precaching: + specifier: ^7.4.0 + version: 7.4.0 + workbox-range-requests: + specifier: ^7.4.0 + version: 7.4.0 + workbox-routing: + specifier: ^7.4.0 + version: 7.4.0 + workbox-strategies: + specifier: ^7.4.0 + version: 7.4.0 + workbox-streams: + specifier: ^7.4.0 + version: 7.4.0 + devDependencies: + '@capacitor/cli': + specifier: ^8.0.0 + version: 8.0.1 + example-app-spm: dependencies: '@capacitor/android': @@ -1617,21 +1744,25 @@ packages: resolution: {integrity: sha512-NmPeCexWIZHW9RM3lDdFENN9C3WtlQ5L4RSNFESIjreS921rgePhulsszYdGnHdcnKPYlBBJnX/NxVsfioBbnQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@nx/nx-linux-arm64-musl@22.3.3': resolution: {integrity: sha512-K02U88Q0dpvCfmSXXvY7KbYQSa1m+mkYeqDBRHp11yHk1GoIqaHp8oEWda7FV4gsriNExPSS5tX1/QGVoLZrCw==} cpu: [arm64] os: [linux] + libc: [musl] '@nx/nx-linux-x64-gnu@22.3.3': resolution: {integrity: sha512-04TEbvgwRaB9ifr39YwJmWh3RuXb4Ry4m84SOJyjNXAfPrepcWgfIQn1VL2ul1Ybq+P023dLO9ME8uqFh6j1YQ==} cpu: [x64] os: [linux] + libc: [glibc] '@nx/nx-linux-x64-musl@22.3.3': resolution: {integrity: sha512-uxBXx5q+S5OGatbYDxnamsKXRKlYn+Eq1nrCAHaf8rIfRoHlDiRV2PqtWuF+O2pxR5FWKpvr+/sZtt9rAf7KMw==} cpu: [x64] os: [linux] + libc: [musl] '@nx/nx-win32-arm64-msvc@22.3.3': resolution: {integrity: sha512-aOwlfD6ZA1K6hjZtbhBSp7s1yi3sHbMpLCa4stXzfhCCpKUv46HU/EdiWdE1N8AsyNFemPZFq81k1VTowcACdg==} @@ -1800,86 +1931,103 @@ packages: resolution: {integrity: sha512-Rn3n+FUk2J5VWx+ywrG/HGPTD9jXNbicRtTM11e/uorplArnXZYsVifnPPqNNP5BsO3roI4n8332ukpY/zN7rQ==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.55.1': resolution: {integrity: sha512-grPNWydeKtc1aEdrJDWk4opD7nFtQbMmV7769hiAaYyUKCT1faPRm2av8CX1YJsZ4TLAZcg9gTR1KvEzoLjXkg==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.34.9': resolution: {integrity: sha512-6TZjPHjKZUQKmVKMUowF3ewHxctrRR09eYyvT5eFv8w/fXarEra83A2mHTVJLA5xU91aCNOUnM+DWFMSbQ0Nxw==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-gnu@4.55.1': resolution: {integrity: sha512-a59mwd1k6x8tXKcUxSyISiquLwB5pX+fJW9TkWU46lCqD/GRDe9uDN31jrMmVP3feI3mhAdvcCClhV8V5MhJFQ==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.34.9': resolution: {integrity: sha512-LD2fytxZJZ6xzOKnMbIpgzFOuIKlxVOpiMAXawsAZ2mHBPEYOnLRK5TTEsID6z4eM23DuO88X0Tq1mErHMVq0A==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-musl@4.55.1': resolution: {integrity: sha512-puS1MEgWX5GsHSoiAsF0TYrpomdvkaXm0CofIMG5uVkP6IBV+ZO9xhC5YEN49nsgYo1DuuMquF9+7EDBVYu4uA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loong64-gnu@4.55.1': resolution: {integrity: sha512-r3Wv40in+lTsULSb6nnoudVbARdOwb2u5fpeoOAZjFLznp6tDU8kd+GTHmJoqZ9lt6/Sys33KdIHUaQihFcu7g==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-loong64-musl@4.55.1': resolution: {integrity: sha512-MR8c0+UxAlB22Fq4R+aQSPBayvYa3+9DrwG/i1TKQXFYEaoW3B5b/rkSRIypcZDdWjWnpcvxbNaAJDcSbJU3Lw==} cpu: [loong64] os: [linux] + libc: [musl] '@rollup/rollup-linux-ppc64-gnu@4.55.1': resolution: {integrity: sha512-3KhoECe1BRlSYpMTeVrD4sh2Pw2xgt4jzNSZIIPLFEsnQn9gAnZagW9+VqDqAHgm1Xc77LzJOo2LdigS5qZ+gw==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-ppc64-musl@4.55.1': resolution: {integrity: sha512-ziR1OuZx0vdYZZ30vueNZTg73alF59DicYrPViG0NEgDVN8/Jl87zkAPu4u6VjZST2llgEUjaiNl9JM6HH1Vdw==} cpu: [ppc64] os: [linux] + libc: [musl] '@rollup/rollup-linux-riscv64-gnu@4.55.1': resolution: {integrity: sha512-uW0Y12ih2XJRERZ4jAfKamTyIHVMPQnTZcQjme2HMVDAHY4amf5u414OqNYC+x+LzRdRcnIG1YodLrrtA8xsxw==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-musl@4.55.1': resolution: {integrity: sha512-u9yZ0jUkOED1BFrqu3BwMQoixvGHGZ+JhJNkNKY/hyoEgOwlqKb62qu+7UjbPSHYjiVy8kKJHvXKv5coH4wDeg==} cpu: [riscv64] os: [linux] + libc: [musl] '@rollup/rollup-linux-s390x-gnu@4.55.1': resolution: {integrity: sha512-/0PenBCmqM4ZUd0190j7J0UsQ/1nsi735iPRakO8iPciE7BQ495Y6msPzaOmvx0/pn+eJVVlZrNrSh4WSYLxNg==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.34.9': resolution: {integrity: sha512-FwBHNSOjUTQLP4MG7y6rR6qbGw4MFeQnIBrMe161QGaQoBQLqSUEKlHIiVgF3g/mb3lxlxzJOpIBhaP+C+KP2A==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.55.1': resolution: {integrity: sha512-a8G4wiQxQG2BAvo+gU6XrReRRqj+pLS2NGXKm8io19goR+K8lw269eTrPkSdDTALwMmJp4th2Uh0D8J9bEV1vg==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.34.9': resolution: {integrity: sha512-cYRpV4650z2I3/s6+5/LONkjIz8MBeqrk+vPXV10ORBnshpn8S32bPqQ2Utv39jCiDcO2eJTuSlPXpnvmaIgRA==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-linux-x64-musl@4.55.1': resolution: {integrity: sha512-bD+zjpFrMpP/hqkfEcnjXWHMw5BIghGisOKPj+2NaNDuVT+8Ds4mPf3XcPHuat1tz89WRL+1wbcxKY3WSbiT7w==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-openbsd-x64@4.55.1': resolution: {integrity: sha512-eLXw0dOiqE4QmvikfQ6yjgkg/xDM+MdU9YJuP4ySTibXU0oAvnEWXt7UDJmD4UkYialMfOGFPJnIHSe/kdzPxg==} @@ -7488,8 +7636,8 @@ packages: engines: {node: '>=14.17'} hasBin: true - typescript@6.0.0-dev.20260114: - resolution: {integrity: sha512-ZqwViZ1rbV8YP3lo93PL2IMH9dQ8y2Km8iLgR3H99l84Q5WX/bIPihfwWLzoFbRfMDWe2tCbCKxbpw7dgQR3cg==} + typescript@6.0.0-dev.20260209: + resolution: {integrity: sha512-RpFbUcHOj66J6zbU9GxQedmtGORXCS816wWKRZ3191xcUcE1LPCOu8TRexFlYIhxP6CIhPSkg/2rM4dtksO0yQ==} engines: {node: '>=14.17'} hasBin: true @@ -12023,7 +12171,7 @@ snapshots: dependencies: semver: 7.7.3 shelljs: 0.8.5 - typescript: 6.0.0-dev.20260114 + typescript: 6.0.0-dev.20260209 dunder-proto@1.0.1: dependencies: @@ -16897,7 +17045,7 @@ snapshots: typescript@5.9.3: {} - typescript@6.0.0-dev.20260114: {} + typescript@6.0.0-dev.20260209: {} uglify-js@3.19.3: optional: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index e9126800..e759aed2 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,3 +1,4 @@ packages: - 'plugin' + - 'example-app' - 'example-app-spm' \ No newline at end of file