akanjs 3.0.0-beta.20 → 3.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +0 -1
- package/README.md +0 -1
- package/base/baseEnv.ts +40 -3
- package/client/cookie.ts +56 -20
- package/client/device.ts +47 -95
- package/client/frameConfig.ts +2 -2
- package/client/native.ts +44 -0
- package/client/router.ts +11 -1
- package/client/rscNavigation.ts +5 -0
- package/client/storage.ts +68 -39
- package/fetch/client/fetchClient.ts +13 -4
- package/index.ts +47 -46
- package/package.json +6 -87
- package/server/devtools/signalSerializer.ts +1 -2
- package/server/hmr/devHmrController.ts +29 -11
- package/server/resolver/signal.resolver.ts +1 -10
- package/server/routeTreeBuilder.ts +8 -11
- package/server/routing/apiRouter.ts +15 -2
- package/server/rscClient.tsx +1 -2
- package/server/ssrFromRscRenderer.tsx +2 -0
- package/server/webRouter.ts +1 -0
- package/signal/CrossSiteGuard.ts +34 -2
- package/signal/endpoint.ts +12 -7
- package/signal/endpointInfo.ts +13 -0
- package/signal/internal.ts +9 -5
- package/signal/serializer/fetch.serializer.ts +6 -3
- package/signal/slice.ts +34 -24
- package/store/baseSt.ts +0 -1
- package/store/storeInstance.ts +29 -17
- package/types/client/cookie.d.ts +6 -4
- package/types/client/device.d.ts +7 -10
- package/types/client/native.d.ts +26 -0
- package/types/client/rscNavigation.d.ts +4 -0
- package/types/client/storage.d.ts +8 -1
- package/types/index.d.ts +48 -44
- package/types/server/hmr/devHmrController.d.ts +2 -1
- package/types/server/resolver/signal.resolver.d.ts +0 -1
- package/types/server/rscClient.d.ts +0 -3
- package/types/signal/CrossSiteGuard.d.ts +7 -2
- package/types/signal/endpoint.d.ts +1 -1
- package/types/signal/endpointInfo.d.ts +3 -0
- package/types/signal/slice.d.ts +3 -2
- package/types/store/baseSt.d.ts +0 -13
- package/types/vendor/@akanjs/native/packages/cli/src/api.d.ts +182 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/build.d.ts +28 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/compat.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/dev.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/doctor.d.ts +37 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/plugin.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/signing.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/test.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/toolchain.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/update.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/config.d.ts +278 -0
- package/types/vendor/@akanjs/native/packages/cli/src/index.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/acl.d.ts +21 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/apilevel.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/apk.d.ts +36 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/args.d.ts +9 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/boot.d.ts +32 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/chrome.d.ts +6 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/codegen.d.ts +94 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/compat.d.ts +49 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/configkeys.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/csp.d.ts +51 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/env.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/exec.d.ts +31 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/googleservices.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/hmr.d.ts +120 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/html.d.ts +20 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/icons.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/image.d.ts +21 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/iossigning.d.ts +81 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/launch.d.ts +51 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/log.d.ts +42 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.d.ts +18 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/maven.d.ts +97 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/names.d.ts +45 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.d.ts +67 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/permissions.d.ts +10 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/plist.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/png.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/prepare.d.ts +138 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/privacy.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/project.d.ts +208 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/root.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/routes.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/serve.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/signing.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/spec.d.ts +96 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/toolchains.d.ts +150 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/updates.d.ts +77 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/vectors.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/xml.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/android.d.ts +57 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/index.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/ios.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/linux.d.ts +6 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/macos.d.ts +7 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/targets.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/web-run.d.ts +15 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/windows.d.ts +8 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/core/src/acl.d.ts +97 -0
- package/types/vendor/@akanjs/native/packages/core/src/boot.d.ts +66 -0
- package/types/vendor/@akanjs/native/packages/core/src/contract.d.ts +35 -0
- package/types/vendor/@akanjs/native/packages/core/src/errors.d.ts +27 -0
- package/types/vendor/@akanjs/native/packages/core/src/files.d.ts +23 -0
- package/types/vendor/@akanjs/native/packages/core/src/index.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/core/src/kernel.d.ts +112 -0
- package/types/vendor/@akanjs/native/packages/core/src/live.d.ts +12 -0
- package/types/vendor/@akanjs/native/packages/core/src/mime.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/core/src/plugin.d.ts +71 -0
- package/types/vendor/@akanjs/native/packages/core/src/protocol.d.ts +109 -0
- package/types/vendor/@akanjs/native/packages/core/src/runtime.d.ts +66 -0
- package/types/vendor/@akanjs/native/packages/core/src/state.d.ts +28 -0
- package/types/vendor/@akanjs/native/packages/core/src/testing.d.ts +41 -0
- package/types/vendor/@akanjs/native/packages/core/src/version.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/core/src/veto.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/core/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/deeplinks.d.ts +24 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/delta.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/dispatcher.d.ts +95 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/ffi.d.ts +144 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/host.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/lifecycle.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/main.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/page-veto.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/paths.d.ts +25 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/plugin.d.ts +179 -0
- package/types/vendor/@akanjs/native/packages/react/src/index.d.ts +8 -0
- package/types/vendor/@akanjs/native/packages/react/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/announce.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/index.d.ts +47 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/app/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/app/src/index.d.ts +66 -0
- package/types/vendor/@akanjs/native/plugins/app/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/app/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src/index.d.ts +19 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/index.d.ts +32 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/setting.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/args.d.ts +18 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/desktop.d.ts +17 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/index.d.ts +41 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src/desktop.d.ts +44 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src/index.d.ts +44 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/count.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/index.d.ts +37 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/badge/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/biometric/src/index.d.ts +53 -0
- package/types/vendor/@akanjs/native/plugins/biometric/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/args.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/index.d.ts +36 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/browser/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/desktop.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/camera/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/index.d.ts +40 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/device/src/desktop.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/device/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/device/src/web.d.ts +22 -0
- package/types/vendor/@akanjs/native/plugins/device/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/index.d.ts +60 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/options.d.ts +29 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/dock/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/dock/src/index.d.ts +46 -0
- package/types/vendor/@akanjs/native/plugins/dock/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/common.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/index.d.ts +84 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/web.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/common.d.ts +49 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/index.d.ts +123 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src/index.d.ts +93 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src/web.d.ts +11 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src/index.d.ts +52 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src/index.d.ts +31 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/http/src/common.d.ts +71 -0
- package/types/vendor/@akanjs/native/plugins/http/src/desktop.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/http/src/index.d.ts +104 -0
- package/types/vendor/@akanjs/native/plugins/http/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/http/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/iap/src/index.d.ts +171 -0
- package/types/vendor/@akanjs/native/plugins/iap/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/desktop.d.ts +15 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src/index.d.ts +42 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/desktop.d.ts +29 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/index.d.ts +126 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/schedule.d.ts +38 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/timers.d.ts +25 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/menu/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/menu/src/index.d.ts +85 -0
- package/types/vendor/@akanjs/native/plugins/menu/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/network/src/index.d.ts +22 -0
- package/types/vendor/@akanjs/native/plugins/network/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/network/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/desktop.d.ts +14 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/url.d.ts +16 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/opener/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/index.d.ts +26 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/push/src/index.d.ts +57 -0
- package/types/vendor/@akanjs/native/plugins/push/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/index.d.ts +70 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/web.d.ts +18 -0
- package/types/vendor/@akanjs/native/plugins/screen/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/index.d.ts +32 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/types.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src/desktop.d.ts +16 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src/index.d.ts +39 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/share/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/share/src/options.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/share/src/web.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/share/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/index.d.ts +25 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/socket.d.ts +46 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src/index.d.ts +19 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/common.d.ts +34 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/desktop.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/index.d.ts +115 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/index.d.ts +30 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/queue.d.ts +23 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/toast/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/tray/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/tray/src/index.d.ts +113 -0
- package/types/vendor/@akanjs/native/plugins/tray/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/updates/src/desktop.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/updates/src/index.d.ts +68 -0
- package/types/vendor/@akanjs/native/plugins/updates/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/window/src/desktop.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/window/src/index.d.ts +185 -0
- package/types/vendor/@akanjs/native/plugins/window/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/window/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/desktop.d.ts +7 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/state.d.ts +39 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src.d.ts +1 -0
- package/types/webkit/index.d.ts +0 -2
- package/types/webkit/nativeNavigation.d.ts +25 -0
- package/types/webkit/nativePurchase.d.ts +37 -0
- package/types/webkit/useCamera.d.ts +13 -15
- package/types/webkit/useGeoLocation.d.ts +4 -5
- package/types/webkit/usePurchase.d.ts +12 -16
- package/ui/Link/Anchor.tsx +2 -5
- package/ui/System/Client.tsx +2 -6
- package/vendor/@akanjs/native/LICENSE +21 -0
- package/vendor/@akanjs/native/README.ko.md +88 -0
- package/vendor/@akanjs/native/README.md +93 -0
- package/vendor/@akanjs/native/THIRD_PARTY_NOTICES.md +237 -0
- package/vendor/@akanjs/native/native/android/maven.lock.json +1751 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAcl.kt +243 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeActivity.kt +936 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeApplication.kt +189 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAssetServer.kt +225 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeBridge.kt +444 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeCompat.kt +55 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeContract.kt +99 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeEd25519.kt +100 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeFileProvider.kt +71 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeKernel.kt +324 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativePlugin.kt +361 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeSpec.kt +100 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeUpdates.kt +305 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeVectors.kt +132 -0
- package/vendor/@akanjs/native/native/desktop/Cargo.lock +2565 -0
- package/vendor/@akanjs/native/native/desktop/Cargo.toml +49 -0
- package/vendor/@akanjs/native/native/desktop/build.rs +19 -0
- package/vendor/@akanjs/native/native/desktop/rust-toolchain.toml +7 -0
- package/vendor/@akanjs/native/native/desktop/src/accelerator.rs +466 -0
- package/vendor/@akanjs/native/native/desktop/src/autostart.rs +158 -0
- package/vendor/@akanjs/native/native/desktop/src/camera.rs +53 -0
- package/vendor/@akanjs/native/native/desktop/src/chrome.rs +710 -0
- package/vendor/@akanjs/native/native/desktop/src/contract.rs +105 -0
- package/vendor/@akanjs/native/native/desktop/src/devproxy.rs +234 -0
- package/vendor/@akanjs/native/native/desktop/src/dialog_args.rs +189 -0
- package/vendor/@akanjs/native/native/desktop/src/dock.rs +209 -0
- package/vendor/@akanjs/native/native/desktop/src/hotkey.rs +209 -0
- package/vendor/@akanjs/native/native/desktop/src/js_panels.rs +125 -0
- package/vendor/@akanjs/native/native/desktop/src/json.rs +272 -0
- package/vendor/@akanjs/native/native/desktop/src/keychain.rs +151 -0
- package/vendor/@akanjs/native/native/desktop/src/lib.rs +2185 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/appearance.rs +177 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/camera.rs +11 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/clipboard.rs +48 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/device.rs +9 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/dialogs.rs +348 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/dock.rs +146 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/hotkey.rs +228 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/keychain.rs +243 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/menu.rs +445 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/mod.rs +116 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/notify.rs +211 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/open.rs +79 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/power.rs +155 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/screen.rs +158 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/tray.rs +604 -0
- package/vendor/@akanjs/native/native/desktop/src/menu.rs +517 -0
- package/vendor/@akanjs/native/native/desktop/src/navigation.rs +381 -0
- package/vendor/@akanjs/native/native/desktop/src/notify.rs +411 -0
- package/vendor/@akanjs/native/native/desktop/src/notify_schedule.rs +382 -0
- package/vendor/@akanjs/native/native/desktop/src/page_menu.rs +287 -0
- package/vendor/@akanjs/native/native/desktop/src/panels.rs +333 -0
- package/vendor/@akanjs/native/native/desktop/src/placement.rs +92 -0
- package/vendor/@akanjs/native/native/desktop/src/routes.rs +153 -0
- package/vendor/@akanjs/native/native/desktop/src/screen.rs +190 -0
- package/vendor/@akanjs/native/native/desktop/src/tray.rs +279 -0
- package/vendor/@akanjs/native/native/desktop/src/vectors.rs +126 -0
- package/vendor/@akanjs/native/native/desktop/src/win/appearance.rs +51 -0
- package/vendor/@akanjs/native/native/desktop/src/win/autostart.rs +77 -0
- package/vendor/@akanjs/native/native/desktop/src/win/camera.rs +34 -0
- package/vendor/@akanjs/native/native/desktop/src/win/clipboard.rs +106 -0
- package/vendor/@akanjs/native/native/desktop/src/win/device.rs +80 -0
- package/vendor/@akanjs/native/native/desktop/src/win/dialogs.rs +917 -0
- package/vendor/@akanjs/native/native/desktop/src/win/dock.rs +228 -0
- package/vendor/@akanjs/native/native/desktop/src/win/hotkey.rs +110 -0
- package/vendor/@akanjs/native/native/desktop/src/win/keychain.rs +103 -0
- package/vendor/@akanjs/native/native/desktop/src/win/menu.rs +500 -0
- package/vendor/@akanjs/native/native/desktop/src/win/mod.rs +100 -0
- package/vendor/@akanjs/native/native/desktop/src/win/msgwin.rs +86 -0
- package/vendor/@akanjs/native/native/desktop/src/win/notify.rs +334 -0
- package/vendor/@akanjs/native/native/desktop/src/win/open.rs +127 -0
- package/vendor/@akanjs/native/native/desktop/src/win/power.rs +64 -0
- package/vendor/@akanjs/native/native/desktop/src/win/registry.rs +87 -0
- package/vendor/@akanjs/native/native/desktop/src/win/screen.rs +127 -0
- package/vendor/@akanjs/native/native/desktop/src/win/tray.rs +280 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeAcl.swift +241 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeApp.swift +285 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeBridge.swift +407 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeContract.swift +106 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeKernel.swift +317 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativePlugin.swift +250 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSchemeHandler.swift +209 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeShell.swift +161 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSpec.swift +143 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeUpdates.swift +270 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeVectors.swift +155 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeViewController.swift +371 -0
- package/vendor/@akanjs/native/packages/cli/src/api.ts +600 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/build.ts +101 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/compat.ts +53 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/dev.ts +249 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/doctor.ts +536 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/plugin.ts +164 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/signing.ts +32 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/test.ts +130 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/toolchain.ts +143 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/update.ts +168 -0
- package/vendor/@akanjs/native/packages/cli/src/config.ts +257 -0
- package/vendor/@akanjs/native/packages/cli/src/index.ts +77 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/acl.ts +420 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/apilevel.ts +245 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/apk.ts +203 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/args.ts +44 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/boot.ts +73 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/chrome.ts +89 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/codegen.ts +1128 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/compat.ts +185 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/configkeys.ts +91 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/csp.ts +198 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/env.ts +257 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/exec.ts +104 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/googleservices.ts +53 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/hmr.ts +534 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/html.ts +63 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/icons.ts +316 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/image.ts +175 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/iossigning.ts +295 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/launch.ts +98 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/log.ts +105 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.ts +107 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/maven.ts +244 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/names.ts +202 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.ts +326 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.ts +68 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/permissions.ts +80 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/plist.ts +139 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/png.ts +240 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/prepare.ts +290 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/privacy.ts +64 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/project.ts +710 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/root.ts +18 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/routes.ts +3 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/serve.ts +83 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/signing.ts +117 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/spec.ts +521 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/toolchains.ts +579 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/updates.ts +160 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/vectors.ts +121 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/xml.ts +72 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/android.ts +1320 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.ts +78 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/desktop.ts +279 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/index.ts +31 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/ios.ts +801 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/linux.ts +52 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/macos.ts +97 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/targets.ts +12 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/web-run.ts +69 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/web.ts +28 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/windows.ts +82 -0
- package/vendor/@akanjs/native/packages/core/contract.json +96 -0
- package/vendor/@akanjs/native/packages/core/src/acl.ts +272 -0
- package/vendor/@akanjs/native/packages/core/src/boot.ts +97 -0
- package/vendor/@akanjs/native/packages/core/src/contract.ts +100 -0
- package/vendor/@akanjs/native/packages/core/src/errors.ts +95 -0
- package/vendor/@akanjs/native/packages/core/src/files.ts +105 -0
- package/vendor/@akanjs/native/packages/core/src/index.ts +35 -0
- package/vendor/@akanjs/native/packages/core/src/kernel.ts +281 -0
- package/vendor/@akanjs/native/packages/core/src/live.ts +62 -0
- package/vendor/@akanjs/native/packages/core/src/mime.ts +8 -0
- package/vendor/@akanjs/native/packages/core/src/plugin.ts +358 -0
- package/vendor/@akanjs/native/packages/core/src/protocol.ts +194 -0
- package/vendor/@akanjs/native/packages/core/src/runtime.ts +520 -0
- package/vendor/@akanjs/native/packages/core/src/state.ts +46 -0
- package/vendor/@akanjs/native/packages/core/src/testing.ts +176 -0
- package/vendor/@akanjs/native/packages/core/src/version.ts +2 -0
- package/vendor/@akanjs/native/packages/core/src/veto.ts +55 -0
- package/vendor/@akanjs/native/packages/core/vectors/acl.json +57 -0
- package/vendor/@akanjs/native/packages/core/vectors/bridge.json +76 -0
- package/vendor/@akanjs/native/packages/core/vectors/ed25519.json +29 -0
- package/vendor/@akanjs/native/packages/core/vectors/ids.json +73 -0
- package/vendor/@akanjs/native/packages/core/vectors/navigation.json +75 -0
- package/vendor/@akanjs/native/packages/core/vectors/ranges.json +39 -0
- package/vendor/@akanjs/native/packages/core/vectors/retained.json +17 -0
- package/vendor/@akanjs/native/packages/core/vectors/routes.json +66 -0
- package/vendor/@akanjs/native/packages/core/vectors/scope.json +143 -0
- package/vendor/@akanjs/native/packages/desktop/src/deeplinks.ts +143 -0
- package/vendor/@akanjs/native/packages/desktop/src/delta.ts +174 -0
- package/vendor/@akanjs/native/packages/desktop/src/dispatcher.ts +679 -0
- package/vendor/@akanjs/native/packages/desktop/src/ffi.ts +76 -0
- package/vendor/@akanjs/native/packages/desktop/src/host.ts +355 -0
- package/vendor/@akanjs/native/packages/desktop/src/lifecycle.ts +142 -0
- package/vendor/@akanjs/native/packages/desktop/src/main.ts +133 -0
- package/vendor/@akanjs/native/packages/desktop/src/page-veto.ts +103 -0
- package/vendor/@akanjs/native/packages/desktop/src/paths.ts +59 -0
- package/vendor/@akanjs/native/packages/desktop/src/plugin.ts +232 -0
- package/vendor/@akanjs/native/packages/react/src/index.ts +23 -0
- package/vendor/@akanjs/native/plugins/accessibility/android/AccessibilityPlugin.kt +96 -0
- package/vendor/@akanjs/native/plugins/accessibility/ios/AccessibilityPlugin.swift +92 -0
- package/vendor/@akanjs/native/plugins/accessibility/native-plugin.json +21 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/announce.ts +71 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/index.ts +77 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/web.ts +52 -0
- package/vendor/@akanjs/native/plugins/app/android/AppPlugin.kt +72 -0
- package/vendor/@akanjs/native/plugins/app/ios/AppPlugin.swift +52 -0
- package/vendor/@akanjs/native/plugins/app/native-plugin.json +21 -0
- package/vendor/@akanjs/native/plugins/app/src/desktop.ts +64 -0
- package/vendor/@akanjs/native/plugins/app/src/index.ts +77 -0
- package/vendor/@akanjs/native/plugins/app/src/web.ts +12 -0
- package/vendor/@akanjs/native/plugins/app-state/android/AppStatePlugin.kt +54 -0
- package/vendor/@akanjs/native/plugins/app-state/ios/AppStatePlugin.swift +58 -0
- package/vendor/@akanjs/native/plugins/app-state/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/app-state/src/index.ts +42 -0
- package/vendor/@akanjs/native/plugins/app-state/src/web.ts +33 -0
- package/vendor/@akanjs/native/plugins/appearance/android/AppearancePlugin.kt +133 -0
- package/vendor/@akanjs/native/plugins/appearance/ios/AppearancePlugin.swift +109 -0
- package/vendor/@akanjs/native/plugins/appearance/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/appearance/src/desktop.ts +133 -0
- package/vendor/@akanjs/native/plugins/appearance/src/index.ts +62 -0
- package/vendor/@akanjs/native/plugins/appearance/src/setting.ts +18 -0
- package/vendor/@akanjs/native/plugins/appearance/src/web.ts +25 -0
- package/vendor/@akanjs/native/plugins/auth-session/android/AuthSessionPlugin.kt +171 -0
- package/vendor/@akanjs/native/plugins/auth-session/ios/AuthSessionPlugin.swift +112 -0
- package/vendor/@akanjs/native/plugins/auth-session/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/args.ts +62 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/desktop.ts +133 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/index.ts +39 -0
- package/vendor/@akanjs/native/plugins/autostart/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/autostart/src/desktop.ts +189 -0
- package/vendor/@akanjs/native/plugins/autostart/src/index.ts +51 -0
- package/vendor/@akanjs/native/plugins/badge/ios/BadgePlugin.swift +92 -0
- package/vendor/@akanjs/native/plugins/badge/native-plugin.json +15 -0
- package/vendor/@akanjs/native/plugins/badge/src/count.ts +12 -0
- package/vendor/@akanjs/native/plugins/badge/src/desktop.ts +24 -0
- package/vendor/@akanjs/native/plugins/badge/src/index.ts +40 -0
- package/vendor/@akanjs/native/plugins/badge/src/web.ts +37 -0
- package/vendor/@akanjs/native/plugins/biometric/android/BiometricPlugin.kt +179 -0
- package/vendor/@akanjs/native/plugins/biometric/ios/BiometricPlugin.swift +129 -0
- package/vendor/@akanjs/native/plugins/biometric/native-plugin.json +22 -0
- package/vendor/@akanjs/native/plugins/biometric/src/index.ts +100 -0
- package/vendor/@akanjs/native/plugins/browser/android/BrowserPlugin.kt +178 -0
- package/vendor/@akanjs/native/plugins/browser/ios/BrowserPlugin.swift +63 -0
- package/vendor/@akanjs/native/plugins/browser/native-plugin.json +22 -0
- package/vendor/@akanjs/native/plugins/browser/src/args.ts +34 -0
- package/vendor/@akanjs/native/plugins/browser/src/desktop.ts +40 -0
- package/vendor/@akanjs/native/plugins/browser/src/index.ts +47 -0
- package/vendor/@akanjs/native/plugins/browser/src/web.ts +60 -0
- package/vendor/@akanjs/native/plugins/camera/android/CameraPlugin.kt +365 -0
- package/vendor/@akanjs/native/plugins/camera/ios/CameraPlugin.swift +296 -0
- package/vendor/@akanjs/native/plugins/camera/native-plugin.json +32 -0
- package/vendor/@akanjs/native/plugins/camera/src/desktop.ts +27 -0
- package/vendor/@akanjs/native/plugins/camera/src/index.ts +85 -0
- package/vendor/@akanjs/native/plugins/camera/src/web.ts +267 -0
- package/vendor/@akanjs/native/plugins/clipboard/android/ClipboardPlugin.kt +51 -0
- package/vendor/@akanjs/native/plugins/clipboard/ios/ClipboardPlugin.swift +35 -0
- package/vendor/@akanjs/native/plugins/clipboard/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/desktop.ts +66 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/index.ts +72 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/web.ts +69 -0
- package/vendor/@akanjs/native/plugins/device/android/DevicePlugin.kt +70 -0
- package/vendor/@akanjs/native/plugins/device/ios/DevicePlugin.swift +80 -0
- package/vendor/@akanjs/native/plugins/device/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/device/src/desktop.ts +276 -0
- package/vendor/@akanjs/native/plugins/device/src/index.ts +72 -0
- package/vendor/@akanjs/native/plugins/device/src/web.ts +162 -0
- package/vendor/@akanjs/native/plugins/dialog/android/DialogPlugin.kt +260 -0
- package/vendor/@akanjs/native/plugins/dialog/ios/DialogPlugin.swift +198 -0
- package/vendor/@akanjs/native/plugins/dialog/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/dialog/src/desktop.ts +80 -0
- package/vendor/@akanjs/native/plugins/dialog/src/index.ts +87 -0
- package/vendor/@akanjs/native/plugins/dialog/src/options.ts +111 -0
- package/vendor/@akanjs/native/plugins/dialog/src/web.ts +296 -0
- package/vendor/@akanjs/native/plugins/dock/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/dock/src/desktop.ts +34 -0
- package/vendor/@akanjs/native/plugins/dock/src/index.ts +46 -0
- package/vendor/@akanjs/native/plugins/file-picker/android/FilePickerPlugin.kt +316 -0
- package/vendor/@akanjs/native/plugins/file-picker/ios/FilePickerPlugin.swift +366 -0
- package/vendor/@akanjs/native/plugins/file-picker/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/common.ts +125 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/desktop.ts +164 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/index.ts +187 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/web.ts +158 -0
- package/vendor/@akanjs/native/plugins/filesystem/android/FilesystemPlugin.kt +561 -0
- package/vendor/@akanjs/native/plugins/filesystem/ios/FilesystemPlugin.swift +596 -0
- package/vendor/@akanjs/native/plugins/filesystem/native-plugin.json +45 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/common.ts +150 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/desktop.ts +438 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/index.ts +179 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/web.ts +334 -0
- package/vendor/@akanjs/native/plugins/geolocation/android/GeolocationPlugin.kt +360 -0
- package/vendor/@akanjs/native/plugins/geolocation/ios/GeolocationPlugin.swift +284 -0
- package/vendor/@akanjs/native/plugins/geolocation/native-plugin.json +23 -0
- package/vendor/@akanjs/native/plugins/geolocation/src/index.ts +155 -0
- package/vendor/@akanjs/native/plugins/geolocation/src/web.ts +132 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.ts +36 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/src/index.ts +55 -0
- package/vendor/@akanjs/native/plugins/haptics/android/HapticsPlugin.kt +127 -0
- package/vendor/@akanjs/native/plugins/haptics/ios/HapticsPlugin.swift +127 -0
- package/vendor/@akanjs/native/plugins/haptics/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/haptics/src/index.ts +34 -0
- package/vendor/@akanjs/native/plugins/haptics/src/web.ts +53 -0
- package/vendor/@akanjs/native/plugins/http/android/HttpPlugin.kt +234 -0
- package/vendor/@akanjs/native/plugins/http/android/HttpUrl.kt +182 -0
- package/vendor/@akanjs/native/plugins/http/ios/HttpPlugin.swift +228 -0
- package/vendor/@akanjs/native/plugins/http/ios/HttpUrl.swift +166 -0
- package/vendor/@akanjs/native/plugins/http/native-plugin.json +27 -0
- package/vendor/@akanjs/native/plugins/http/src/common.ts +294 -0
- package/vendor/@akanjs/native/plugins/http/src/desktop.ts +69 -0
- package/vendor/@akanjs/native/plugins/http/src/index.ts +181 -0
- package/vendor/@akanjs/native/plugins/http/src/web.ts +40 -0
- package/vendor/@akanjs/native/plugins/iap/android/IapPlugin.kt +358 -0
- package/vendor/@akanjs/native/plugins/iap/ios/IapPlugin.swift +306 -0
- package/vendor/@akanjs/native/plugins/iap/native-plugin.json +28 -0
- package/vendor/@akanjs/native/plugins/iap/src/index.ts +206 -0
- package/vendor/@akanjs/native/plugins/keep-awake/android/KeepAwakePlugin.kt +48 -0
- package/vendor/@akanjs/native/plugins/keep-awake/ios/KeepAwakePlugin.swift +36 -0
- package/vendor/@akanjs/native/plugins/keep-awake/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/desktop.ts +127 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/index.ts +79 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/web.ts +78 -0
- package/vendor/@akanjs/native/plugins/keyboard/android/KeyboardPlugin.kt +77 -0
- package/vendor/@akanjs/native/plugins/keyboard/ios/KeyboardPlugin.swift +93 -0
- package/vendor/@akanjs/native/plugins/keyboard/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/keyboard/src/index.ts +78 -0
- package/vendor/@akanjs/native/plugins/keyboard/src/web.ts +57 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationReceiver.kt +38 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotifications.kt +284 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationsPlugin.kt +248 -0
- package/vendor/@akanjs/native/plugins/local-notifications/ios/LocalNotificationsPlugin.swift +279 -0
- package/vendor/@akanjs/native/plugins/local-notifications/native-plugin.json +35 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/desktop.ts +196 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/index.ts +174 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/schedule.ts +164 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/timers.ts +72 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/web.ts +158 -0
- package/vendor/@akanjs/native/plugins/menu/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/menu/src/desktop.ts +52 -0
- package/vendor/@akanjs/native/plugins/menu/src/index.ts +107 -0
- package/vendor/@akanjs/native/plugins/network/android/NetworkPlugin.kt +124 -0
- package/vendor/@akanjs/native/plugins/network/ios/NetworkPlugin.swift +82 -0
- package/vendor/@akanjs/native/plugins/network/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/network/src/index.ts +59 -0
- package/vendor/@akanjs/native/plugins/network/src/web.ts +43 -0
- package/vendor/@akanjs/native/plugins/opener/android/OpenerPlugin.kt +81 -0
- package/vendor/@akanjs/native/plugins/opener/ios/OpenerPlugin.swift +83 -0
- package/vendor/@akanjs/native/plugins/opener/native-plugin.json +25 -0
- package/vendor/@akanjs/native/plugins/opener/src/desktop.ts +88 -0
- package/vendor/@akanjs/native/plugins/opener/src/index.ts +35 -0
- package/vendor/@akanjs/native/plugins/opener/src/url.ts +39 -0
- package/vendor/@akanjs/native/plugins/opener/src/web.ts +33 -0
- package/vendor/@akanjs/native/plugins/preferences/android/PreferencesPlugin.kt +44 -0
- package/vendor/@akanjs/native/plugins/preferences/ios/PreferencesPlugin.swift +47 -0
- package/vendor/@akanjs/native/plugins/preferences/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/preferences/src/desktop.ts +59 -0
- package/vendor/@akanjs/native/plugins/preferences/src/index.ts +75 -0
- package/vendor/@akanjs/native/plugins/preferences/src/web.ts +55 -0
- package/vendor/@akanjs/native/plugins/push/android/AkanNativeMessagingService.kt +17 -0
- package/vendor/@akanjs/native/plugins/push/android/PushPlugin.kt +257 -0
- package/vendor/@akanjs/native/plugins/push/ios/PushPlugin.swift +169 -0
- package/vendor/@akanjs/native/plugins/push/native-plugin.json +23 -0
- package/vendor/@akanjs/native/plugins/push/src/index.ts +73 -0
- package/vendor/@akanjs/native/plugins/screen/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/screen/src/desktop.ts +50 -0
- package/vendor/@akanjs/native/plugins/screen/src/index.ts +107 -0
- package/vendor/@akanjs/native/plugins/screen/src/web.ts +92 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/android/ScreenOrientationPlugin.kt +113 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/ios/ScreenOrientationPlugin.swift +150 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/index.ts +69 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/types.ts +26 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/web.ts +67 -0
- package/vendor/@akanjs/native/plugins/secure-storage/android/SecureStoragePlugin.kt +184 -0
- package/vendor/@akanjs/native/plugins/secure-storage/ios/SecureStoragePlugin.swift +145 -0
- package/vendor/@akanjs/native/plugins/secure-storage/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/secure-storage/src/desktop.ts +332 -0
- package/vendor/@akanjs/native/plugins/secure-storage/src/index.ts +33 -0
- package/vendor/@akanjs/native/plugins/share/android/SharePlugin.kt +218 -0
- package/vendor/@akanjs/native/plugins/share/ios/SharePlugin.swift +142 -0
- package/vendor/@akanjs/native/plugins/share/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/share/src/index.ts +87 -0
- package/vendor/@akanjs/native/plugins/share/src/options.ts +43 -0
- package/vendor/@akanjs/native/plugins/share/src/web.ts +116 -0
- package/vendor/@akanjs/native/plugins/single-instance/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/desktop.ts +63 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/index.ts +32 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/socket.ts +248 -0
- package/vendor/@akanjs/native/plugins/splash-screen/android/SplashScreenPlugin.kt +19 -0
- package/vendor/@akanjs/native/plugins/splash-screen/ios/SplashScreenPlugin.swift +20 -0
- package/vendor/@akanjs/native/plugins/splash-screen/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/splash-screen/src/index.ts +24 -0
- package/vendor/@akanjs/native/plugins/splash-screen/src/web.ts +17 -0
- package/vendor/@akanjs/native/plugins/sqlite/android/SqlStatements.kt +121 -0
- package/vendor/@akanjs/native/plugins/sqlite/android/SqlitePlugin.kt +327 -0
- package/vendor/@akanjs/native/plugins/sqlite/ios/SqlitePlugin.swift +361 -0
- package/vendor/@akanjs/native/plugins/sqlite/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/common.ts +221 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/desktop.ts +140 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/index.ts +114 -0
- package/vendor/@akanjs/native/plugins/toast/android/ToastPlugin.kt +27 -0
- package/vendor/@akanjs/native/plugins/toast/native-plugin.json +14 -0
- package/vendor/@akanjs/native/plugins/toast/src/index.ts +41 -0
- package/vendor/@akanjs/native/plugins/toast/src/queue.ts +77 -0
- package/vendor/@akanjs/native/plugins/toast/src/web.ts +130 -0
- package/vendor/@akanjs/native/plugins/tray/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/tray/src/desktop.ts +73 -0
- package/vendor/@akanjs/native/plugins/tray/src/index.ts +111 -0
- package/vendor/@akanjs/native/plugins/updates/android/UpdatesPlugin.kt +290 -0
- package/vendor/@akanjs/native/plugins/updates/ios/UpdatesPlugin.swift +292 -0
- package/vendor/@akanjs/native/plugins/updates/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/updates/src/desktop.ts +558 -0
- package/vendor/@akanjs/native/plugins/updates/src/index.ts +95 -0
- package/vendor/@akanjs/native/plugins/window/native-plugin.json +32 -0
- package/vendor/@akanjs/native/plugins/window/src/desktop.ts +170 -0
- package/vendor/@akanjs/native/plugins/window/src/index.ts +342 -0
- package/vendor/@akanjs/native/plugins/window/src/web.ts +43 -0
- package/vendor/@akanjs/native/plugins/window-state/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/window-state/src/desktop.ts +73 -0
- package/vendor/@akanjs/native/plugins/window-state/src/index.ts +35 -0
- package/vendor/@akanjs/native/plugins/window-state/src/state.ts +146 -0
- package/webkit/bootCsr.tsx +26 -14
- package/webkit/index.ts +0 -2
- package/webkit/nativeNavigation.ts +116 -0
- package/webkit/nativePurchase.ts +93 -0
- package/webkit/useCamera.tsx +76 -71
- package/webkit/useCsrValues.ts +10 -124
- package/webkit/useGeoLocation.tsx +11 -13
- package/webkit/usePurchase.tsx +68 -123
- package/capacitor.base.config.ts +0 -140
- package/client/capacitor.ts +0 -252
- package/types/capacitor.base.config.d.ts +0 -3
- package/types/client/capacitor.d.ts +0 -290
- package/types/webkit/useCodepush.d.ts +0 -16
- package/types/webkit/useContact.d.ts +0 -11
- package/webkit/useCodepush.tsx +0 -76
- package/webkit/useContact.tsx +0 -45
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import LocalAuthentication
|
|
3
|
+
|
|
4
|
+
/// LAContext (tauri-plugins-workspace/plugins/biometric/ios/Sources/BiometricPlugin.swift, with changes):
|
|
5
|
+
/// - A fresh LAContext per call. Tauri computes the status once at load, which goes stale when the
|
|
6
|
+
/// user enrolls or turns Face ID off for the app while it runs.
|
|
7
|
+
/// - biometryType is valid after canEvaluatePolicy whatever it returns, so the sensor kind is known
|
|
8
|
+
/// even when nothing is enrolled.
|
|
9
|
+
/// - Face ID without NSFaceIDUsageDescription must not be evaluated (Tauri reports it as
|
|
10
|
+
/// unavailable too); the manifest adds the text.
|
|
11
|
+
/// - Biometrics only: localizedFallbackTitle = "" hides the "Enter Password" button that iOS shows
|
|
12
|
+
/// after a failed match (tapping it ends with LAError.userFallback). allowDeviceCredential uses
|
|
13
|
+
/// .deviceOwnerAuthentication, where the system handles the passcode itself.
|
|
14
|
+
/// - The prompt belongs to its call: cancelled (AbortSignal) or with its page gone, the context is
|
|
15
|
+
/// invalidated and the prompt goes away (LAError.appCancel, already answered).
|
|
16
|
+
/// - Simulator: Features > Face ID > Enrolled / Matching Face / Non-matching Face. There is no simctl
|
|
17
|
+
/// command; `xcrun simctl spawn <udid> notifyutil -s com.apple.BiometricKit.enrollmentChanged 1` +
|
|
18
|
+
/// `notifyutil -p com.apple.BiometricKit.enrollmentChanged` toggles enrollment and
|
|
19
|
+
/// `notifyutil -p com.apple.BiometricKit_Sim.pearl.match` (or .nomatch) answers a prompt.
|
|
20
|
+
/// Arguments arrive decoded and type-checked by the generated BiometricPluginSpec (PL-10).
|
|
21
|
+
final class BiometricPlugin: BiometricPluginSpec {
|
|
22
|
+
static let id = "biometric"
|
|
23
|
+
private var current: LAContext?
|
|
24
|
+
|
|
25
|
+
init(context: AkanNativePluginContext) {}
|
|
26
|
+
|
|
27
|
+
func isAvailable(_ reply: AkanNativeReply<BiometricStatus>) {
|
|
28
|
+
reply.resolve(Self.status())
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
private static var hasFaceIDUsageDescription: Bool {
|
|
32
|
+
Bundle.main.object(forInfoDictionaryKey: "NSFaceIDUsageDescription") != nil
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
nonisolated private static func name(_ type: LABiometryType) -> BiometricBiometryType {
|
|
36
|
+
switch type {
|
|
37
|
+
case .faceID: .face
|
|
38
|
+
case .touchID: .fingerprint
|
|
39
|
+
case .opticID: .iris
|
|
40
|
+
default: .none_
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private static func status() -> BiometricStatus {
|
|
45
|
+
let context = LAContext()
|
|
46
|
+
var error: NSError?
|
|
47
|
+
let ok = context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error)
|
|
48
|
+
let type = context.biometryType
|
|
49
|
+
var result = BiometricStatus(
|
|
50
|
+
available: false,
|
|
51
|
+
type: name(type),
|
|
52
|
+
deviceCredential: LAContext().canEvaluatePolicy(.deviceOwnerAuthentication, error: nil)
|
|
53
|
+
)
|
|
54
|
+
if ok, type == .faceID, !hasFaceIDUsageDescription {
|
|
55
|
+
result.reason = .notConfigured
|
|
56
|
+
} else if ok {
|
|
57
|
+
result.available = true
|
|
58
|
+
} else {
|
|
59
|
+
result.reason = reason(error.map { LAError.Code(rawValue: $0.code) } ?? nil, type)
|
|
60
|
+
}
|
|
61
|
+
return result
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
nonisolated private static func reason(_ code: LAError.Code?, _ type: LABiometryType) -> BiometricUnavailableReason {
|
|
65
|
+
switch code {
|
|
66
|
+
case .biometryNotEnrolled?, .passcodeNotSet?: .notEnrolled
|
|
67
|
+
case .biometryLockout?: .lockedOut
|
|
68
|
+
// With a sensor present this is the per-app Face ID switch in Settings.
|
|
69
|
+
case .biometryNotAvailable?: type == .none ? .noHardware : .denied
|
|
70
|
+
default: .unavailable
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
func authenticate(_ args: BiometricAuthenticateOptions, _ reply: AkanNativeReply<Void>) {
|
|
75
|
+
let reason = args.reason
|
|
76
|
+
guard !reason.isEmpty else { return reply.reject(.invalidArgs, "reason must be a non-empty string") }
|
|
77
|
+
guard current == nil else { return reply.reject(.cancelled, "another authentication is in progress") }
|
|
78
|
+
let allowCredential = args.allowDeviceCredential ?? false
|
|
79
|
+
let policy: LAPolicy = allowCredential ? .deviceOwnerAuthentication : .deviceOwnerAuthenticationWithBiometrics
|
|
80
|
+
let context = LAContext()
|
|
81
|
+
var error: NSError?
|
|
82
|
+
guard context.canEvaluatePolicy(policy, error: &error) else {
|
|
83
|
+
let (code, message) = Self.failure(error, context.biometryType)
|
|
84
|
+
return reply.reject(code, message)
|
|
85
|
+
}
|
|
86
|
+
if context.biometryType == .faceID, !Self.hasFaceIDUsageDescription {
|
|
87
|
+
return reply.reject(.internalError, "Info.plist has no NSFaceIDUsageDescription")
|
|
88
|
+
}
|
|
89
|
+
if let cancel = args.cancelTitle, !cancel.isEmpty { context.localizedCancelTitle = cancel }
|
|
90
|
+
if !allowCredential { context.localizedFallbackTitle = "" }
|
|
91
|
+
let type = context.biometryType
|
|
92
|
+
current = context
|
|
93
|
+
reply.onCancel { [weak self] in
|
|
94
|
+
context.invalidate()
|
|
95
|
+
if self?.current === context { self?.current = nil }
|
|
96
|
+
}
|
|
97
|
+
let key = ObjectIdentifier(context) // Sendable, unlike LAContext
|
|
98
|
+
context.evaluatePolicy(policy, localizedReason: reason) { [weak self] success, error in
|
|
99
|
+
if success {
|
|
100
|
+
reply.resolve()
|
|
101
|
+
} else {
|
|
102
|
+
let (code, message) = Self.failure(error, type)
|
|
103
|
+
reply.reject(code, message)
|
|
104
|
+
}
|
|
105
|
+
DispatchQueue.main.async {
|
|
106
|
+
MainActor.assumeIsolated {
|
|
107
|
+
if let current = self?.current, ObjectIdentifier(current) == key { self?.current = nil }
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
nonisolated private static func failure(_ error: (any Error)?, _ type: LABiometryType) -> (AkanNativeErrorCode, String) {
|
|
114
|
+
let message = error?.localizedDescription ?? "authentication failed"
|
|
115
|
+
guard let code = (error as? LAError)?.code else { return (.internalError, message) }
|
|
116
|
+
switch code {
|
|
117
|
+
case .userCancel, .systemCancel, .appCancel, .userFallback, .notInteractive:
|
|
118
|
+
return (.cancelled, message)
|
|
119
|
+
case .authenticationFailed, .biometryLockout, .biometryNotEnrolled, .passcodeNotSet:
|
|
120
|
+
return (.permissionDenied, message)
|
|
121
|
+
case .biometryNotAvailable:
|
|
122
|
+
return (type == .none ? .unsupported : .permissionDenied, message)
|
|
123
|
+
case .biometryDisconnected, .biometryNotPaired, .companionNotAvailable:
|
|
124
|
+
return (.unsupported, message)
|
|
125
|
+
default:
|
|
126
|
+
return (.internalError, message)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "biometric",
|
|
3
|
+
"apiVersion": 1,
|
|
4
|
+
"methods": ["isAvailable", "authenticate"],
|
|
5
|
+
"events": [],
|
|
6
|
+
"codegen": true,
|
|
7
|
+
"web": null,
|
|
8
|
+
"desktop": null,
|
|
9
|
+
"ios": {
|
|
10
|
+
"sources": ["ios/*.swift"],
|
|
11
|
+
"class": "BiometricPlugin",
|
|
12
|
+
"frameworks": ["LocalAuthentication"],
|
|
13
|
+
"infoPlist": {
|
|
14
|
+
"NSFaceIDUsageDescription": "Confirm that it is you with Face ID."
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
"android": {
|
|
18
|
+
"sources": ["android/*.kt"],
|
|
19
|
+
"class": "com.akanjs.plugins.biometric.BiometricPlugin",
|
|
20
|
+
"permissions": ["android.permission.USE_BIOMETRIC"]
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { createLiveValue, definePlugin, shallowEqual } from "../../../packages/core/src/index.ts";
|
|
2
|
+
import { useLiveValue } from "../../../packages/react/src/index.ts";
|
|
3
|
+
|
|
4
|
+
/** The kind of biometric sensor. iOS Optic ID counts as "iris". */
|
|
5
|
+
export type BiometryType = "face" | "fingerprint" | "iris" | "none";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Why biometrics cannot be used right now.
|
|
9
|
+
* - noHardware: no sensor
|
|
10
|
+
* - notEnrolled: nothing enrolled, or (iOS) no passcode, which biometrics require
|
|
11
|
+
* - lockedOut: too many failed attempts; the passcode unlocks it again (allowDeviceCredential)
|
|
12
|
+
* - denied: the user turned biometrics off for this app (iOS Face ID setting, Android "use for apps")
|
|
13
|
+
* - notConfigured: the app lacks NSFaceIDUsageDescription (iOS; the manifest adds it)
|
|
14
|
+
* - unavailable: anything else (sensor busy, security update required)
|
|
15
|
+
*/
|
|
16
|
+
export type BiometricUnavailableReason =
|
|
17
|
+
| "noHardware"
|
|
18
|
+
| "notEnrolled"
|
|
19
|
+
| "lockedOut"
|
|
20
|
+
| "denied"
|
|
21
|
+
| "notConfigured"
|
|
22
|
+
| "unavailable";
|
|
23
|
+
|
|
24
|
+
export interface BiometricStatus {
|
|
25
|
+
/** Whether authenticate() can use biometrics now. */
|
|
26
|
+
available: boolean;
|
|
27
|
+
/** The sensor kind, also when nothing is enrolled. On Android with several sensors, the first of fingerprint, face, iris. */
|
|
28
|
+
type: BiometryType;
|
|
29
|
+
/** Set when not available. */
|
|
30
|
+
reason?: BiometricUnavailableReason;
|
|
31
|
+
/** Whether a passcode / PIN / pattern is set, i.e. whether allowDeviceCredential can succeed. */
|
|
32
|
+
deviceCredential: boolean;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export interface AuthenticateOptions {
|
|
36
|
+
/** Why the app asks. iOS shows it under "Face ID"; Android uses it as the title, or as the subtitle when `title` is set. */
|
|
37
|
+
reason: string;
|
|
38
|
+
/** Android: prompt title. */
|
|
39
|
+
title?: string;
|
|
40
|
+
/** Label of the cancel button. Android ignores it with allowDeviceCredential (the system prompt has its own). */
|
|
41
|
+
cancelTitle?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Also accept the device passcode / PIN / pattern (iOS .deviceOwnerAuthentication, Android
|
|
44
|
+
* DEVICE_CREDENTIAL). Default false: biometrics only, and iOS hides its "Enter Password" button.
|
|
45
|
+
*/
|
|
46
|
+
allowDeviceCredential?: boolean;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Local user verification (Face ID, Touch ID, fingerprint, face unlock). A successful
|
|
51
|
+
* authenticate() proves presence to this app only; it unlocks no key and must not replace a
|
|
52
|
+
* server-side login.
|
|
53
|
+
*
|
|
54
|
+
* authenticate() rejects with
|
|
55
|
+
* - CANCELLED: the user or the system cancelled (app sent to the background, another prompt)
|
|
56
|
+
* - PERMISSION_DENIED: not enrolled, locked out, turned off for the app, or (iOS) failed attempts
|
|
57
|
+
* - UNSUPPORTED: no sensor (and no allowed passcode fallback); every call on the web and macOS
|
|
58
|
+
* - INTERNAL: NSFaceIDUsageDescription missing (iOS) and other platform failures
|
|
59
|
+
*/
|
|
60
|
+
export interface BiometricApi {
|
|
61
|
+
isAvailable(): Promise<BiometricStatus>;
|
|
62
|
+
authenticate(options: AuthenticateOptions): Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
export const biometric = definePlugin<BiometricApi>("biometric", {
|
|
66
|
+
methods: ["isAvailable", "authenticate"],
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
const status = createLiveValue<BiometricStatus | null>(
|
|
70
|
+
null,
|
|
71
|
+
(set) => {
|
|
72
|
+
if (!biometric.isSupported("isAvailable")) return;
|
|
73
|
+
let live = true;
|
|
74
|
+
const refresh = () => {
|
|
75
|
+
if (typeof document !== "undefined" && document.visibilityState === "hidden") return;
|
|
76
|
+
biometric
|
|
77
|
+
.isAvailable()
|
|
78
|
+
.then((next) => live && set(next))
|
|
79
|
+
.catch((error) => console.warn("[akan-native] biometric.isAvailable failed", error));
|
|
80
|
+
};
|
|
81
|
+
refresh();
|
|
82
|
+
if (typeof window === "undefined")
|
|
83
|
+
return () => {
|
|
84
|
+
live = false;
|
|
85
|
+
};
|
|
86
|
+
document.addEventListener("visibilitychange", refresh);
|
|
87
|
+
window.addEventListener("focus", refresh);
|
|
88
|
+
return () => {
|
|
89
|
+
live = false;
|
|
90
|
+
document.removeEventListener("visibilitychange", refresh);
|
|
91
|
+
window.removeEventListener("focus", refresh);
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
(a, b) => a === b || (a !== null && b !== null && shallowEqual(a, b)),
|
|
95
|
+
);
|
|
96
|
+
|
|
97
|
+
/** The biometric status, or null while it loads and where the platform has no biometric plugin (web, macOS). */
|
|
98
|
+
export function useBiometricStatus(): BiometricStatus | null {
|
|
99
|
+
return useLiveValue(status);
|
|
100
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
package com.akanjs.plugins.browser
|
|
2
|
+
|
|
3
|
+
import android.app.Activity
|
|
4
|
+
import android.app.Application
|
|
5
|
+
import android.content.ActivityNotFoundException
|
|
6
|
+
import android.content.Intent
|
|
7
|
+
import android.content.pm.PackageManager
|
|
8
|
+
import android.graphics.Color
|
|
9
|
+
import android.net.Uri
|
|
10
|
+
import android.os.Bundle
|
|
11
|
+
import android.os.Handler
|
|
12
|
+
import android.os.Looper
|
|
13
|
+
import com.akanjs.runtime.AkanNativeErrorCode
|
|
14
|
+
import com.akanjs.runtime.AkanNativePluginContext
|
|
15
|
+
import com.akanjs.runtime.AkanNativeVoidReply
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Custom Tabs without androidx.browser (plugins.md §2 AndroidX table): an ACTION_VIEW intent with
|
|
19
|
+
* the extras CustomTabsIntent.Builder would add.
|
|
20
|
+
* - EXTRA_SESSION with a null binder is what makes the browser open a Custom Tab instead of a
|
|
21
|
+
* normal tab; plus the toolbar color, share button on and the app as referrer, as
|
|
22
|
+
* capacitor-plugins/browser/android/.../Browser.java:113-134 sets them.
|
|
23
|
+
* - The package is picked like CustomTabsClient.getPackageName: the default browser if it has a
|
|
24
|
+
* Custom Tabs service, else the first one that has. Both lookups need the <queries> in
|
|
25
|
+
* native-plugin.json (Android 11 package visibility; Capacitor's manifest has the same).
|
|
26
|
+
* No Custom Tabs browser: a plain browser in its own task, which close() cannot close.
|
|
27
|
+
* - close(): Custom Tabs have no close API. Capacitor restarts its singleTask trampoline
|
|
28
|
+
* (BrowserControllerActivity.java:49-55), which clears the tab above it. Since Android 15 that
|
|
29
|
+
* start is a background activity launch and is blocked for apps targeting 35+ while the tab
|
|
30
|
+
* covers the app (verified: "Background activity launch blocked", BAL_BLOCK). finishActivity(requestCode)
|
|
31
|
+
* is not a launch and closes the tab (verified), so the tab is started with this plugin's own
|
|
32
|
+
* request code: AkanNativePluginContext.startActivityForResult does not expose the one it picks.
|
|
33
|
+
* - finished: the shell activity resumes, which in this task only happens once the tab above it is
|
|
34
|
+
* gone (Done, back, or the launcher icon). The result of the tab would say the same, but it goes
|
|
35
|
+
* to the shell's result map only for requests started through the context. Capacitor reports a
|
|
36
|
+
* minimized (picture-in-picture) tab as finished on Android < 14 (Browser.java:190-200); here
|
|
37
|
+
* that should happen on every version, since the app is back in front (not verified).
|
|
38
|
+
* - open() needs the app in front: a page timer calling it from the background would be a blocked
|
|
39
|
+
* launch as well (PERMISSION_DENIED), and it resolves once the tab covers the app.
|
|
40
|
+
* Arguments arrive decoded and type-checked by the generated BrowserPluginSpec (PL-10).
|
|
41
|
+
*/
|
|
42
|
+
class BrowserPlugin(private val context: AkanNativePluginContext) : BrowserPluginSpec {
|
|
43
|
+
private enum class State { NONE, OPENING, SHOWING }
|
|
44
|
+
|
|
45
|
+
private val main = Handler(Looper.getMainLooper())
|
|
46
|
+
private var state = State.NONE
|
|
47
|
+
private var customTab = false
|
|
48
|
+
private var resumed = false
|
|
49
|
+
private val events = BrowserEvents(context)
|
|
50
|
+
private var opening: AkanNativeVoidReply? = null
|
|
51
|
+
private var closing: AkanNativeVoidReply? = null
|
|
52
|
+
|
|
53
|
+
private val openTimeout = Runnable {
|
|
54
|
+
if (state != State.OPENING) return@Runnable
|
|
55
|
+
state = State.NONE
|
|
56
|
+
opening?.reject(AkanNativeErrorCode.INTERNAL, "the browser did not open")
|
|
57
|
+
opening = null
|
|
58
|
+
}
|
|
59
|
+
private val closeTimeout = Runnable {
|
|
60
|
+
closing?.reject(AkanNativeErrorCode.INTERNAL, "the browser did not close")
|
|
61
|
+
closing = null
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
private val lifecycle = object : Application.ActivityLifecycleCallbacks {
|
|
65
|
+
override fun onActivityPaused(activity: Activity) {
|
|
66
|
+
resumed = false
|
|
67
|
+
if (state != State.OPENING) return
|
|
68
|
+
state = State.SHOWING
|
|
69
|
+
main.removeCallbacks(openTimeout)
|
|
70
|
+
opening?.resolve()
|
|
71
|
+
opening = null
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
override fun onActivityResumed(activity: Activity) {
|
|
75
|
+
resumed = true
|
|
76
|
+
if (state != State.SHOWING) return
|
|
77
|
+
state = State.NONE
|
|
78
|
+
main.removeCallbacks(closeTimeout)
|
|
79
|
+
val reply = closing
|
|
80
|
+
closing = null
|
|
81
|
+
if (reply != null) reply.resolve() else events.finished(BrowserFinishedEvent())
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
override fun onActivityStarted(activity: Activity) {}
|
|
85
|
+
override fun onActivityStopped(activity: Activity) {}
|
|
86
|
+
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {}
|
|
87
|
+
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {}
|
|
88
|
+
override fun onActivityDestroyed(activity: Activity) {}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
init {
|
|
92
|
+
// Created in the shell's onCreate: the first onResume is still to come.
|
|
93
|
+
context.activity.registerActivityLifecycleCallbacks(lifecycle)
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
override fun open(args: BrowserOpenArgs, reply: AkanNativeVoidReply) {
|
|
97
|
+
val uri = checkedUri(args.url, reply) ?: return
|
|
98
|
+
val color = args.toolbarColor?.let { hex ->
|
|
99
|
+
if (!COLOR.matches(hex)) return reply.reject(AkanNativeErrorCode.INVALID_ARGS, "toolbarColor must look like \"#1a2b3c\"")
|
|
100
|
+
Color.parseColor(hex)
|
|
101
|
+
}
|
|
102
|
+
if (state != State.NONE) return reply.reject(AkanNativeErrorCode.INVALID_ARGS, "a browser is already open; close() it first")
|
|
103
|
+
if (!resumed) return reply.reject(AkanNativeErrorCode.PERMISSION_DENIED, "the browser can only be opened while the app is in front")
|
|
104
|
+
val activity = context.activity
|
|
105
|
+
val provider = customTabsPackage(activity)
|
|
106
|
+
try {
|
|
107
|
+
if (provider != null) {
|
|
108
|
+
val intent = Intent(Intent.ACTION_VIEW, uri).setPackage(provider)
|
|
109
|
+
intent.putExtras(Bundle().apply { putBinder(EXTRA_SESSION, null) })
|
|
110
|
+
intent.putExtra(EXTRA_SHARE_STATE, SHARE_STATE_ON)
|
|
111
|
+
intent.putExtra(Intent.EXTRA_REFERRER, Uri.parse("android-app://${activity.packageName}"))
|
|
112
|
+
if (color != null) intent.putExtra(EXTRA_TOOLBAR_COLOR, color)
|
|
113
|
+
activity.startActivityForResult(intent, REQUEST_TAB)
|
|
114
|
+
} else {
|
|
115
|
+
activity.startActivity(Intent(Intent.ACTION_VIEW, uri).addCategory(Intent.CATEGORY_BROWSABLE).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
|
|
116
|
+
}
|
|
117
|
+
} catch (e: ActivityNotFoundException) {
|
|
118
|
+
return reply.reject(AkanNativeErrorCode.NOT_FOUND, "no browser can open $uri")
|
|
119
|
+
} catch (e: SecurityException) {
|
|
120
|
+
return reply.reject(AkanNativeErrorCode.PERMISSION_DENIED, e.message ?: "not allowed to open $uri")
|
|
121
|
+
}
|
|
122
|
+
customTab = provider != null
|
|
123
|
+
state = State.OPENING
|
|
124
|
+
opening = reply
|
|
125
|
+
main.postDelayed(openTimeout, OPEN_TIMEOUT_MS)
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
override fun close(reply: AkanNativeVoidReply) {
|
|
129
|
+
if (state == State.NONE) return reply.resolve()
|
|
130
|
+
if (!customTab) return reply.reject(AkanNativeErrorCode.UNSUPPORTED, "the browser runs as its own app (no Custom Tabs support) and cannot be closed")
|
|
131
|
+
closing?.resolve() // an earlier close() still waiting: the same tab
|
|
132
|
+
main.removeCallbacks(closeTimeout)
|
|
133
|
+
closing = reply
|
|
134
|
+
context.activity.finishActivity(REQUEST_TAB)
|
|
135
|
+
main.postDelayed(closeTimeout, CLOSE_TIMEOUT_MS)
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
override fun destroy() {
|
|
139
|
+
main.removeCallbacks(openTimeout)
|
|
140
|
+
main.removeCallbacks(closeTimeout)
|
|
141
|
+
context.activity.unregisterActivityLifecycleCallbacks(lifecycle)
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
private fun checkedUri(text: String, reply: AkanNativeVoidReply): Uri? {
|
|
145
|
+
val uri = if (text.isEmpty()) null else Uri.parse(text).normalizeScheme()
|
|
146
|
+
val problem = when {
|
|
147
|
+
uri == null || !uri.isAbsolute -> "url must be an absolute URL"
|
|
148
|
+
uri.scheme != "http" && uri.scheme != "https" -> "only http and https URLs open in the in-app browser (got ${uri.scheme}:)"
|
|
149
|
+
uri.host.isNullOrEmpty() -> "$text has no host"
|
|
150
|
+
else -> return uri
|
|
151
|
+
}
|
|
152
|
+
reply.reject(AkanNativeErrorCode.INVALID_ARGS, problem)
|
|
153
|
+
return null
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
companion object {
|
|
157
|
+
const val ACTION_CUSTOM_TABS_SERVICE = "android.support.customtabs.action.CustomTabsService"
|
|
158
|
+
const val EXTRA_SESSION = "android.support.customtabs.extra.SESSION"
|
|
159
|
+
const val EXTRA_TOOLBAR_COLOR = "android.support.customtabs.extra.TOOLBAR_COLOR"
|
|
160
|
+
const val EXTRA_SHARE_STATE = "androidx.browser.customtabs.extra.SHARE_STATE"
|
|
161
|
+
const val SHARE_STATE_ON = 1
|
|
162
|
+
/** Far from the shell's own request codes, which count up from 1000. */
|
|
163
|
+
private const val REQUEST_TAB = 0x6F6D0B01
|
|
164
|
+
private const val OPEN_TIMEOUT_MS = 3000L
|
|
165
|
+
private const val CLOSE_TIMEOUT_MS = 3000L
|
|
166
|
+
private val COLOR = Regex("^#[0-9a-fA-F]{6}$")
|
|
167
|
+
|
|
168
|
+
/** The browser to open Custom Tabs in, or null when none supports them. */
|
|
169
|
+
fun customTabsPackage(activity: Activity): String? {
|
|
170
|
+
val pm = activity.packageManager
|
|
171
|
+
val providers = pm.queryIntentServices(Intent(ACTION_CUSTOM_TABS_SERVICE), 0).mapNotNull { it.serviceInfo?.packageName }
|
|
172
|
+
if (providers.isEmpty()) return null
|
|
173
|
+
val browse = Intent(Intent.ACTION_VIEW, Uri.parse("https://")).addCategory(Intent.CATEGORY_BROWSABLE)
|
|
174
|
+
val default = pm.resolveActivity(browse, PackageManager.MATCH_DEFAULT_ONLY)?.activityInfo?.packageName
|
|
175
|
+
return if (default != null && default in providers) default else providers.first()
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import SafariServices
|
|
2
|
+
import UIKit
|
|
3
|
+
|
|
4
|
+
/// SFSafariViewController, presented full screen from the topmost controller
|
|
5
|
+
/// (capacitor-plugins/browser/ios/Sources/BrowserPlugin/Browser.swift and BrowserPlugin.swift).
|
|
6
|
+
/// - http/https only (Browser.swift:19): anything else crashes SFSafariViewController.
|
|
7
|
+
/// - finished: safariViewControllerDidFinish, sent for Done and the edge swipe. It is not sent
|
|
8
|
+
/// for a dismissal the app asks for, so close() never produces it. With .fullScreen there is no
|
|
9
|
+
/// swipe-down dismissal that would bypass the delegate.
|
|
10
|
+
/// - SFSafariViewController dismisses itself after Done; Capacitor dismisses the presenter again
|
|
11
|
+
/// in didFinish (BrowserPlugin.swift:31-39), which can dismiss an unrelated controller. Not here.
|
|
12
|
+
/// - toolbarColor is ignored: preferredBarTintColor is deprecated in iOS 26 (bar tinting fights
|
|
13
|
+
/// the system's glass background).
|
|
14
|
+
/// - SFSafariViewControllerDelegate is not main-actor annotated, but SafariServices calls it on the
|
|
15
|
+
/// main thread: an isolated conformance (checked at run time).
|
|
16
|
+
/// Arguments arrive decoded and type-checked by the generated BrowserPluginSpec (PL-10).
|
|
17
|
+
final class BrowserPlugin: NSObject, BrowserPluginSpec, @MainActor SFSafariViewControllerDelegate {
|
|
18
|
+
static let id = "browser"
|
|
19
|
+
private let context: AkanNativePluginContext
|
|
20
|
+
private weak var safari: SFSafariViewController?
|
|
21
|
+
|
|
22
|
+
init(context: AkanNativePluginContext) {
|
|
23
|
+
self.context = context
|
|
24
|
+
super.init()
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
func open(_ args: BrowserOpenArgs, _ reply: AkanNativeReply<Void>) {
|
|
28
|
+
guard let parts = URLComponents(string: args.url),
|
|
29
|
+
let scheme = parts.scheme?.lowercased(), scheme == "http" || scheme == "https",
|
|
30
|
+
!(parts.host ?? "").isEmpty, let url = parts.url
|
|
31
|
+
else {
|
|
32
|
+
return reply.reject(.invalidArgs, "url must be an absolute http or https URL")
|
|
33
|
+
}
|
|
34
|
+
if let hex = args.toolbarColor {
|
|
35
|
+
guard hex.count == 7, hex.hasPrefix("#"), UInt32(hex.dropFirst(), radix: 16) != nil else {
|
|
36
|
+
return reply.reject(.invalidArgs, "toolbarColor must look like \"#1a2b3c\"")
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
if let safari, safari.presentingViewController != nil {
|
|
40
|
+
return reply.reject(.invalidArgs, "a browser is already open; close() it first")
|
|
41
|
+
}
|
|
42
|
+
let controller = SFSafariViewController(url: url)
|
|
43
|
+
controller.delegate = self
|
|
44
|
+
controller.modalPresentationStyle = .fullScreen
|
|
45
|
+
safari = controller
|
|
46
|
+
context.present(controller, completion: { reply.resolve() }) { [weak self] in
|
|
47
|
+
self?.safari = nil
|
|
48
|
+
reply.reject(.internalError, "nothing to present the browser from")
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
func close(_ reply: AkanNativeReply<Void>) {
|
|
53
|
+
guard let safari, safari.presentingViewController != nil else { return reply.resolve() }
|
|
54
|
+
self.safari = nil
|
|
55
|
+
safari.dismiss(animated: true) { reply.resolve() }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
func safariViewControllerDidFinish(_ controller: SFSafariViewController) {
|
|
59
|
+
guard controller === safari else { return }
|
|
60
|
+
safari = nil
|
|
61
|
+
BrowserEvents(context).finished(BrowserFinishedEvent())
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "browser",
|
|
3
|
+
"apiVersion": 1,
|
|
4
|
+
"methods": ["open", "close"],
|
|
5
|
+
"events": ["finished"],
|
|
6
|
+
"codegen": true,
|
|
7
|
+
"web": "./src/web.ts",
|
|
8
|
+
"desktop": {
|
|
9
|
+
"module": "./src/desktop.ts",
|
|
10
|
+
"methods": ["open"]
|
|
11
|
+
},
|
|
12
|
+
"ios": {
|
|
13
|
+
"sources": ["ios/*.swift"],
|
|
14
|
+
"class": "BrowserPlugin",
|
|
15
|
+
"frameworks": ["SafariServices"]
|
|
16
|
+
},
|
|
17
|
+
"android": {
|
|
18
|
+
"sources": ["android/*.kt"],
|
|
19
|
+
"class": "com.akanjs.plugins.browser.BrowserPlugin",
|
|
20
|
+
"manifestXml": "<queries><intent><action android:name=\"android.support.customtabs.action.CustomTabsService\" /></intent><intent><action android:name=\"android.intent.action.VIEW\" /><category android:name=\"android.intent.category.BROWSABLE\" /><data android:scheme=\"https\" /></intent></queries>"
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { AkanNativeError } from "../../../packages/core/src/index.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* http and https only: SFSafariViewController takes nothing else (capacitor-plugins/browser/ios/
|
|
5
|
+
* Sources/BrowserPlugin/Browser.swift:19) and Custom Tabs are browser tabs. Other schemes belong
|
|
6
|
+
* to the opener plugin. The native implementations check the same rules.
|
|
7
|
+
*/
|
|
8
|
+
export function checkUrl(url: unknown): URL {
|
|
9
|
+
if (typeof url !== "string" || url.length === 0)
|
|
10
|
+
throw new AkanNativeError("INVALID_ARGS", "url must be a non-empty string");
|
|
11
|
+
let parsed: URL;
|
|
12
|
+
try {
|
|
13
|
+
parsed = new URL(url);
|
|
14
|
+
} catch {
|
|
15
|
+
throw new AkanNativeError("INVALID_ARGS", `${url} is not an absolute URL`);
|
|
16
|
+
}
|
|
17
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
18
|
+
throw new AkanNativeError(
|
|
19
|
+
"INVALID_ARGS",
|
|
20
|
+
`only http and https URLs open in the in-app browser (got ${parsed.protocol})`,
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
if (!parsed.hostname) throw new AkanNativeError("INVALID_ARGS", `${url} has no host`);
|
|
24
|
+
return parsed;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** "#rrggbb" or undefined. Capacitor logs and ignores a bad color; here it is INVALID_ARGS. */
|
|
28
|
+
export function checkColor(color: unknown): string | undefined {
|
|
29
|
+
if (color === undefined || color === null) return undefined;
|
|
30
|
+
if (typeof color !== "string" || !/^#[0-9a-fA-F]{6}$/.test(color)) {
|
|
31
|
+
throw new AkanNativeError("INVALID_ARGS", `toolbarColor must look like "#1a2b3c" (got ${JSON.stringify(color)})`);
|
|
32
|
+
}
|
|
33
|
+
return color;
|
|
34
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { AkanNativeError } from "../../../packages/core/src/index.ts";
|
|
4
|
+
import { defineDesktopPlugin, externalOpenAllowed } from "../../../packages/desktop/src/plugin.ts";
|
|
5
|
+
import { checkColor, checkUrl } from "./args.ts";
|
|
6
|
+
import type { BrowserApi, BrowserEvents } from "./index.ts";
|
|
7
|
+
|
|
8
|
+
export type Runner = (argv: string[]) => Promise<{ code: number; stderr: string }>;
|
|
9
|
+
|
|
10
|
+
const spawnRunner: Runner = async (argv) => {
|
|
11
|
+
const proc = Bun.spawn(argv, { stdin: "ignore", stdout: "ignore", stderr: "pipe" });
|
|
12
|
+
const [stderr, code] = await Promise.all([new Response(proc.stderr).text(), proc.exited]);
|
|
13
|
+
return { code, stderr };
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
/** `run` is replaceable so tests can check the command without opening a browser, `platform` to test the shell op path. */
|
|
17
|
+
export function createDesktopBrowser(run: Runner = spawnRunner, platform: NodeJS.Platform = process.platform) {
|
|
18
|
+
return defineDesktopPlugin<BrowserApi, BrowserEvents>({
|
|
19
|
+
id: "browser",
|
|
20
|
+
methods: {
|
|
21
|
+
async open(args, ctx) {
|
|
22
|
+
const url = checkUrl(args?.url);
|
|
23
|
+
checkColor(args?.toolbarColor);
|
|
24
|
+
if (!externalOpenAllowed())
|
|
25
|
+
throw new AkanNativeError("NOT_ALLOWED", "at most one URL per second leaves the app; try again later");
|
|
26
|
+
if (platform !== "darwin") {
|
|
27
|
+
await ctx.shell("shell.open", { url: url.href });
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const { code, stderr } = await run(["/usr/bin/open", "-u", url.href]);
|
|
31
|
+
if (code !== 0) throw new AkanNativeError("INTERNAL", `open failed (${code}): ${stderr.trim()}`);
|
|
32
|
+
},
|
|
33
|
+
},
|
|
34
|
+
events: {
|
|
35
|
+
finished: () => () => {},
|
|
36
|
+
},
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export default createDesktopBrowser();
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { definePlugin } from "../../../packages/core/src/index.ts";
|
|
2
|
+
import { usePluginEvent } from "../../../packages/react/src/index.ts";
|
|
3
|
+
import { web } from "./web.ts";
|
|
4
|
+
|
|
5
|
+
export { checkColor, checkUrl } from "./args.ts";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* In-app browser (plugins.md §4.5): a system browser view over the app, sharing the browser's
|
|
9
|
+
* cookies and passwords, with the page's URL visible to the user. For signing in, use
|
|
10
|
+
* auth-session instead, which also returns the redirect.
|
|
11
|
+
*
|
|
12
|
+
* | host | view | close() | finished |
|
|
13
|
+
* |---------|----------------------------------------|-------------|--------------------------|
|
|
14
|
+
* | iOS | SFSafariViewController | ✓ | ✓ |
|
|
15
|
+
* | Android | Custom Tab | ✓ | ✓ |
|
|
16
|
+
* | Android | plain browser (no Custom Tabs browser) | UNSUPPORTED | never |
|
|
17
|
+
* | web | new window (popup) | ✓ | ✓ (polled, ≤ 0.5 s late) |
|
|
18
|
+
* | desktop | the default browser | UNSUPPORTED | never |
|
|
19
|
+
*/
|
|
20
|
+
export interface BrowserApi {
|
|
21
|
+
/**
|
|
22
|
+
* Shows `url` (http or https) and resolves once the browser is up. One at a time: rejects
|
|
23
|
+
* INVALID_ARGS while a browser opened here is still showing. `toolbarColor` ("#rrggbb") colors the
|
|
24
|
+
* Custom Tab toolbar on Android; iOS 26 no longer tints Safari's bars and ignores it.
|
|
25
|
+
* PERMISSION_DENIED on the web when the popup was blocked (call it from a click) and on Android
|
|
26
|
+
* while the app is not in front (Android 15+ blocks activity starts from the background).
|
|
27
|
+
*/
|
|
28
|
+
open(args: { url: string; toolbarColor?: string }): Promise<void>;
|
|
29
|
+
/** Closes the browser opened by open(). Resolves also when none is showing. Does not send `finished`. */
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export interface BrowserEvents {
|
|
34
|
+
/** The user closed the browser (Done, back, or closed the window). */
|
|
35
|
+
finished: Record<string, never>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export const browser = definePlugin<BrowserApi, BrowserEvents>("browser", {
|
|
39
|
+
methods: ["open", "close"],
|
|
40
|
+
events: ["finished"],
|
|
41
|
+
web,
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
/** Calls `handler` whenever the user closes the in-app browser, while mounted. */
|
|
45
|
+
export function useBrowserFinished(handler: () => void): void {
|
|
46
|
+
usePluginEvent(browser, "finished", () => handler());
|
|
47
|
+
}
|