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,33 @@
|
|
|
1
|
+
import { definePlugin } from "../../../packages/core/src/index.ts";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Small secrets (tokens, keys, passwords) kept by the OS credential store, encrypted at rest.
|
|
5
|
+
* Same shape as @akanjs/native/plugins/preferences; store JSON yourself for structured data.
|
|
6
|
+
*
|
|
7
|
+
* - iOS: Keychain generic passwords, readable after the first unlock, never synced or restored
|
|
8
|
+
* to another device. Keychain items survive uninstalling the app.
|
|
9
|
+
* - Android: values encrypted with an AES-256-GCM key that never leaves AndroidKeyStore.
|
|
10
|
+
* Uninstalling deletes them; values whose key is gone (device transfer) read as null.
|
|
11
|
+
* - macOS: values encrypted with a key kept in the login Keychain (see src/desktop.ts for
|
|
12
|
+
* what that protects against).
|
|
13
|
+
* - Windows: the same, with the key in the Credential Manager (a generic credential).
|
|
14
|
+
* - Linux: the same, with the key in the Secret Service (the login keyring of gnome-keyring,
|
|
15
|
+
* KWallet or KeePassXC). UNSUPPORTED in a session without one.
|
|
16
|
+
* - Web: UNSUPPORTED. A browser has no secret store; do not fall back to localStorage.
|
|
17
|
+
*
|
|
18
|
+
* No hook on purpose: secrets are read where they are used (an API client), not rendered.
|
|
19
|
+
*/
|
|
20
|
+
export interface SecureStorageApi {
|
|
21
|
+
/** `{ value: null }` when the key is not stored. */
|
|
22
|
+
get(args: { key: string }): Promise<{ value: string | null }>;
|
|
23
|
+
set(args: { key: string; value: string }): Promise<void>;
|
|
24
|
+
remove(args: { key: string }): Promise<void>;
|
|
25
|
+
/** Stored keys, sorted. */
|
|
26
|
+
keys(): Promise<{ keys: string[] }>;
|
|
27
|
+
/** Removes every key of this app. */
|
|
28
|
+
clear(): Promise<void>;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export const secureStorage = definePlugin<SecureStorageApi>("secure-storage", {
|
|
32
|
+
methods: ["get", "set", "remove", "keys", "clear"],
|
|
33
|
+
});
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
package com.akanjs.plugins.share
|
|
2
|
+
|
|
3
|
+
import android.app.Activity
|
|
4
|
+
import android.app.Application
|
|
5
|
+
import android.app.PendingIntent
|
|
6
|
+
import android.content.ActivityNotFoundException
|
|
7
|
+
import android.content.BroadcastReceiver
|
|
8
|
+
import android.content.ClipData
|
|
9
|
+
import android.content.ComponentName
|
|
10
|
+
import android.content.Context
|
|
11
|
+
import android.content.Intent
|
|
12
|
+
import android.content.IntentFilter
|
|
13
|
+
import android.net.Uri
|
|
14
|
+
import android.os.Build
|
|
15
|
+
import android.os.Bundle
|
|
16
|
+
import android.util.Log
|
|
17
|
+
import com.akanjs.runtime.AkanNativeCall
|
|
18
|
+
import com.akanjs.runtime.AkanNativeCompat
|
|
19
|
+
import com.akanjs.runtime.AkanNativeErrorCode
|
|
20
|
+
import com.akanjs.runtime.AkanNativePluginContext
|
|
21
|
+
import com.akanjs.runtime.AkanNativeReply
|
|
22
|
+
import java.io.File
|
|
23
|
+
import java.util.UUID
|
|
24
|
+
import org.json.JSONObject
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* ACTION_SEND / ACTION_SEND_MULTIPLE through Intent.createChooser.
|
|
28
|
+
* - Which app was chosen comes back through the chooser's IntentSender
|
|
29
|
+
* (capacitor-plugins/share/…/SharePlugin.java:141-161). Capacitor registers an exported receiver
|
|
30
|
+
* and checks a nonce; here the PendingIntent is explicit (setPackage) and the receiver is
|
|
31
|
+
* RECEIVER_NOT_EXPORTED, so only broadcasts sent as this app arrive. FLAG_MUTABLE lets the chooser
|
|
32
|
+
* fill in EXTRA_CHOSEN_COMPONENT; Android 14 allows that because the intent is explicit.
|
|
33
|
+
* - Targets often answer RESULT_CANCELED even after sharing, so completed = a target was chosen, or
|
|
34
|
+
* the activity went through onStop (the target covered it), or RESULT_OK (:76-87, :215-219).
|
|
35
|
+
* react-native ShareModule.kt:37-54 cannot tell a closed sheet at all.
|
|
36
|
+
* - title → EXTRA_SUBJECT (mail) and EXTRA_TITLE (the sheet's preview title). The intent has one text
|
|
37
|
+
* field, so url is appended to text (Capacitor :117-126).
|
|
38
|
+
* - Files need a content:// URI in the shell's own provider (plugins.md C4), a read grant, and
|
|
39
|
+
* ClipData even for a single file: the grant only reaches the target through ClipData (:192-200).
|
|
40
|
+
* Arguments arrive decoded and type-checked by the generated SharePluginSpec (PL-10).
|
|
41
|
+
*/
|
|
42
|
+
class SharePlugin(private val context: AkanNativePluginContext) : SharePluginSpec {
|
|
43
|
+
/**
|
|
44
|
+
* canShare answers false for options it cannot decode instead of rejecting (src/index.ts, as
|
|
45
|
+
* navigator.canShare does); everything else goes through the generated dispatch.
|
|
46
|
+
*/
|
|
47
|
+
override fun handle(call: AkanNativeCall) {
|
|
48
|
+
if (call.method == "canShare" && runCatching { ShareOptions.fromAkanNative(call.args, "") }.isFailure) {
|
|
49
|
+
return call.resolve(JSONObject().put("value", false))
|
|
50
|
+
}
|
|
51
|
+
akanNativeDispatch(call)
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
private class Pending(val reply: AkanNativeReply<ShareResult>, val nonce: String) {
|
|
55
|
+
var target: String? = null
|
|
56
|
+
var stopped = false
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
private val activity: Activity get() = context.activity
|
|
60
|
+
private val action = context.activity.packageName + ".akan-native.share.CHOSEN"
|
|
61
|
+
private var pending: Pending? = null
|
|
62
|
+
|
|
63
|
+
private val receiver = object : BroadcastReceiver() {
|
|
64
|
+
override fun onReceive(c: Context, intent: Intent) {
|
|
65
|
+
val p = pending ?: return
|
|
66
|
+
if (intent.getStringExtra(EXTRA_NONCE) != p.nonce) return // a late broadcast from an earlier share
|
|
67
|
+
val chosen = AkanNativeCompat.parcelableExtra(intent, Intent.EXTRA_CHOSEN_COMPONENT, ComponentName::class.java) ?: return
|
|
68
|
+
p.target = chosen.packageName
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
private val lifecycle = object : Application.ActivityLifecycleCallbacks {
|
|
73
|
+
override fun onActivityStopped(a: Activity) {
|
|
74
|
+
pending?.stopped = true
|
|
75
|
+
}
|
|
76
|
+
override fun onActivityCreated(a: Activity, state: Bundle?) {}
|
|
77
|
+
override fun onActivityStarted(a: Activity) {}
|
|
78
|
+
override fun onActivityResumed(a: Activity) {}
|
|
79
|
+
override fun onActivityPaused(a: Activity) {}
|
|
80
|
+
override fun onActivitySaveInstanceState(a: Activity, state: Bundle) {}
|
|
81
|
+
override fun onActivityDestroyed(a: Activity) {}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
init {
|
|
85
|
+
// Before API 33 RECEIVER_NOT_EXPORTED is ignored and a runtime receiver is exported, so there the
|
|
86
|
+
// sender must hold this app's signature permission (what androidx ContextCompat does); the
|
|
87
|
+
// per-share nonce stays as the second check. The PendingIntent is sent as this app.
|
|
88
|
+
if (Build.VERSION.SDK_INT >= 33) Api33.register(activity, receiver, IntentFilter(action))
|
|
89
|
+
else activity.registerReceiver(receiver, IntentFilter(action), activity.packageName + ".AKAN_NATIVE_INTERNAL_BROADCAST", null)
|
|
90
|
+
activity.registerActivityLifecycleCallbacks(lifecycle) // this activity only (API 29)
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
override fun destroy() {
|
|
94
|
+
runCatching { activity.unregisterReceiver(receiver) }
|
|
95
|
+
activity.unregisterActivityLifecycleCallbacks(lifecycle)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
private class Problem(val code: String, message: String) : Exception(message)
|
|
99
|
+
|
|
100
|
+
private class Content(val title: String?, val body: String?, val files: List<Pair<File, String>>)
|
|
101
|
+
|
|
102
|
+
// Invalid options are "cannot share", as navigator.canShare answers.
|
|
103
|
+
override fun canShare(args: ShareOptions, reply: AkanNativeReply<ShareCanShareResult>) =
|
|
104
|
+
reply.resolve(ShareCanShareResult(value = reply.call.args.length() == 0 || runCatching { content(args) }.isSuccess))
|
|
105
|
+
|
|
106
|
+
private fun content(args: ShareOptions): Content {
|
|
107
|
+
val title = args.title?.ifEmpty { null }
|
|
108
|
+
val text = args.text?.ifEmpty { null }
|
|
109
|
+
val url = args.url?.ifEmpty { null }
|
|
110
|
+
if (url != null) {
|
|
111
|
+
val scheme = Uri.parse(url).scheme?.lowercase()
|
|
112
|
+
if (scheme == null || scheme in NOT_LINKS) throw Problem(AkanNativeErrorCode.INVALID_ARGS, "url must be an absolute URL (got $url)")
|
|
113
|
+
}
|
|
114
|
+
val files = (args.files ?: emptyList()).map { ref ->
|
|
115
|
+
localFile(ref) ?: throw Problem(AkanNativeErrorCode.NOT_FOUND, "$ref is not a file of this session")
|
|
116
|
+
}
|
|
117
|
+
val body = listOfNotNull(text, url).joinToString(" ").ifEmpty { null }
|
|
118
|
+
if (body == null && files.isEmpty()) throw Problem(AkanNativeErrorCode.INVALID_ARGS, "share needs text, url or files")
|
|
119
|
+
return Content(title, body, files)
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/** The file and MIME type behind a /__akan_native/file/<id> URL. */
|
|
123
|
+
private fun localFile(ref: String): Pair<File, String>? = context.file(ref)
|
|
124
|
+
|
|
125
|
+
override fun share(args: ShareOptions, reply: AkanNativeReply<ShareResult>) {
|
|
126
|
+
if (pending != null) return reply.reject(AkanNativeErrorCode.CANCELLED, "a share sheet is already open")
|
|
127
|
+
val content = try {
|
|
128
|
+
content(args)
|
|
129
|
+
} catch (e: Problem) {
|
|
130
|
+
return reply.reject(e.code, e.message ?: "invalid share options")
|
|
131
|
+
}
|
|
132
|
+
if (content.files.isEmpty()) return launch(reply, content, emptyList())
|
|
133
|
+
// Copying can take a while for videos: off the main thread.
|
|
134
|
+
Thread {
|
|
135
|
+
try {
|
|
136
|
+
val uris = content.files.mapIndexed { i, (file, mime) -> stage(file, i) to mime }
|
|
137
|
+
context.runOnMain { launch(reply, content, uris) }
|
|
138
|
+
} catch (e: Exception) {
|
|
139
|
+
Log.e("AkanNative", "share: staging files failed", e)
|
|
140
|
+
reply.reject(AkanNativeErrorCode.INTERNAL, "could not prepare the files: $e")
|
|
141
|
+
}
|
|
142
|
+
}.start()
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** A content:// URI for [file]: its own if it is already in the provider's folder (camera photos), else a copy. */
|
|
146
|
+
private fun stage(file: File, index: Int): Uri {
|
|
147
|
+
if (NAME.matches(file.name)) {
|
|
148
|
+
val (inPlace, uri) = context.captureTarget(file.name)
|
|
149
|
+
if (inPlace.canonicalPath == file.canonicalPath) return uri
|
|
150
|
+
}
|
|
151
|
+
val safe = file.name.replace(Regex("[^A-Za-z0-9._-]"), "_").takeLast(100)
|
|
152
|
+
val (copy, uri) = context.captureTarget("share-${System.currentTimeMillis()}-$index-$safe")
|
|
153
|
+
file.copyTo(copy, overwrite = true)
|
|
154
|
+
return uri
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
private fun launch(reply: AkanNativeReply<ShareResult>, content: Content, files: List<Pair<Uri, String>>) {
|
|
158
|
+
if (pending != null) return reply.reject(AkanNativeErrorCode.CANCELLED, "a share sheet is already open")
|
|
159
|
+
val send = Intent(if (files.size > 1) Intent.ACTION_SEND_MULTIPLE else Intent.ACTION_SEND)
|
|
160
|
+
content.body?.let { send.putExtra(Intent.EXTRA_TEXT, it) }
|
|
161
|
+
content.title?.let { send.putExtra(Intent.EXTRA_SUBJECT, it).putExtra(Intent.EXTRA_TITLE, it) }
|
|
162
|
+
if (files.isEmpty()) {
|
|
163
|
+
send.type = "text/plain"
|
|
164
|
+
} else {
|
|
165
|
+
send.type = commonType(files.map { it.second })
|
|
166
|
+
val uris = ArrayList(files.map { it.first })
|
|
167
|
+
if (uris.size == 1) send.putExtra(Intent.EXTRA_STREAM, uris[0]) else send.putParcelableArrayListExtra(Intent.EXTRA_STREAM, uris)
|
|
168
|
+
val clip = ClipData.newRawUri(null, uris[0])
|
|
169
|
+
for (uri in uris.drop(1)) clip.addItem(ClipData.Item(uri))
|
|
170
|
+
send.clipData = clip
|
|
171
|
+
send.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION)
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
val nonce = UUID.randomUUID().toString()
|
|
175
|
+
val chosen = Intent(action).setPackage(activity.packageName).putExtra(EXTRA_NONCE, nonce)
|
|
176
|
+
// Mutable so the chooser can add EXTRA_CHOSEN_COMPONENT; below API 31 every PendingIntent is.
|
|
177
|
+
val mutable = if (Build.VERSION.SDK_INT >= 31) PendingIntent.FLAG_MUTABLE else 0
|
|
178
|
+
val sender = PendingIntent.getBroadcast(activity, 0, chosen, PendingIntent.FLAG_UPDATE_CURRENT or mutable).intentSender
|
|
179
|
+
val chooser = Intent.createChooser(send, null, sender)
|
|
180
|
+
val p = Pending(reply, nonce)
|
|
181
|
+
pending = p
|
|
182
|
+
try {
|
|
183
|
+
context.startActivityForResult("share", chooser) { code, _ ->
|
|
184
|
+
pending = null
|
|
185
|
+
reply.resolve(ShareResult(completed = p.target != null || p.stopped || code == Activity.RESULT_OK, target = p.target))
|
|
186
|
+
}
|
|
187
|
+
} catch (e: ActivityNotFoundException) {
|
|
188
|
+
pending = null
|
|
189
|
+
reply.reject(AkanNativeErrorCode.UNSUPPORTED, "no share sheet on this device")
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
override fun onRestoredActivityResult(key: String, resultCode: Int, data: Intent?) {
|
|
194
|
+
// The process died while the sheet was open; the page that asked is gone (plugins.md C6).
|
|
195
|
+
Log.i("AkanNative", "share result after process restart dropped (result=$resultCode)")
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
private companion object {
|
|
199
|
+
const val EXTRA_NONCE = "com.akanjs.share.nonce"
|
|
200
|
+
val NOT_LINKS = setOf("javascript", "data", "blob", "file")
|
|
201
|
+
val NAME = Regex("[A-Za-z0-9_-][A-Za-z0-9._-]{0,127}")
|
|
202
|
+
|
|
203
|
+
// One type → that type; one major type → e.g. image/*; otherwise */*
|
|
204
|
+
// (Capacitor sends */* for every multi-file share).
|
|
205
|
+
fun commonType(types: List<String>): String {
|
|
206
|
+
val distinct = types.map { it.lowercase() }.distinct()
|
|
207
|
+
if (distinct.size == 1) return distinct[0]
|
|
208
|
+
val majors = distinct.map { it.substringBefore('/') }.distinct()
|
|
209
|
+
return if (majors.size == 1) "${majors[0]}/*" else "*/*"
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
private object Api33 {
|
|
214
|
+
fun register(activity: Activity, receiver: BroadcastReceiver, filter: IntentFilter) {
|
|
215
|
+
activity.registerReceiver(receiver, filter, Context.RECEIVER_NOT_EXPORTED)
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import UIKit
|
|
2
|
+
|
|
3
|
+
/// UIActivityViewController.
|
|
4
|
+
/// - Presented from the topmost view controller; while a share sheet is already up (this plugin's or
|
|
5
|
+
/// the WebView's own navigator.share) the call is CANCELLED
|
|
6
|
+
/// (capacitor-plugins/share/ios/Sources/SharePlugin/SharePlugin.swift:67-78).
|
|
7
|
+
/// - iPad shows the sheet as a popover, which needs an anchor: centered in the presenter, no arrow (:79-87).
|
|
8
|
+
/// - The title becomes the subject (Mail) through UIActivityItemSource, the public API for it;
|
|
9
|
+
/// Capacitor and react-native set the private "subject" key with KVC.
|
|
10
|
+
/// - completionWithItemsHandler: (nil, false) means the sheet was closed. (type, false) means the user
|
|
11
|
+
/// backed out of one activity, and the sheet usually stays up for another choice, so the call waits
|
|
12
|
+
/// (react-native RCTActionSheetManager.mm:287-294); if the sheet did go away it resolves not completed.
|
|
13
|
+
/// - files: /__akan_native/file/<id> URLs of this session, shared as the files themselves.
|
|
14
|
+
/// Arguments arrive decoded and type-checked by the generated SharePluginSpec (PL-10).
|
|
15
|
+
final class SharePlugin: SharePluginSpec {
|
|
16
|
+
static let id = "share"
|
|
17
|
+
private static let notLinks: Set<String> = ["javascript", "data", "blob", "file"]
|
|
18
|
+
private static let filePrefix = "/__akan_native/file/"
|
|
19
|
+
private let context: AkanNativePluginContext
|
|
20
|
+
|
|
21
|
+
/// canShare answers false for options it cannot decode instead of rejecting (src/index.ts, as
|
|
22
|
+
/// navigator.canShare does); everything else goes through the generated dispatch.
|
|
23
|
+
func handle(_ call: AkanNativeCall) {
|
|
24
|
+
if call.method == "canShare", (try? ShareOptions(akanNative: call.args, at: "")) == nil {
|
|
25
|
+
return call.resolve(["value": false])
|
|
26
|
+
}
|
|
27
|
+
akanNativeDispatch(call)
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
init(context: AkanNativePluginContext) {
|
|
31
|
+
self.context = context
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
func canShare(_ args: ShareOptions, _ reply: AkanNativeReply<ShareCanShareResult>) {
|
|
35
|
+
// Invalid options are "cannot share", as navigator.canShare answers.
|
|
36
|
+
reply.resolve(ShareCanShareResult(value: reply.call.args.isEmpty || (try? content(args)) != nil))
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private struct Content {
|
|
40
|
+
var subject: String?
|
|
41
|
+
var items: [Any]
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
private struct Problem: Error {
|
|
45
|
+
let code: AkanNativeErrorCode
|
|
46
|
+
let message: String
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private func content(_ args: ShareOptions) throws(Problem) -> Content {
|
|
50
|
+
func text(_ value: String?) -> String? {
|
|
51
|
+
value?.isEmpty == false ? value : nil
|
|
52
|
+
}
|
|
53
|
+
let subject = text(args.title)
|
|
54
|
+
var items: [Any] = []
|
|
55
|
+
if let body = text(args.text) { items.append(body) }
|
|
56
|
+
if let link = text(args.url) {
|
|
57
|
+
guard let url = URL(string: link), let scheme = url.scheme?.lowercased(), !Self.notLinks.contains(scheme) else {
|
|
58
|
+
throw Problem(code: .invalidArgs, message: "url must be an absolute URL (got \(link))")
|
|
59
|
+
}
|
|
60
|
+
items.append(url)
|
|
61
|
+
}
|
|
62
|
+
for ref in args.files ?? [] {
|
|
63
|
+
guard let id = Self.fileId(ref) else {
|
|
64
|
+
throw Problem(code: .invalidArgs, message: "files must be /__akan_native/file/ URLs")
|
|
65
|
+
}
|
|
66
|
+
guard let local = localFile(id) else { throw Problem(code: .notFound, message: "\(ref) is not a file of this session") }
|
|
67
|
+
items.append(local)
|
|
68
|
+
}
|
|
69
|
+
guard !items.isEmpty else { throw Problem(code: .invalidArgs, message: "share needs text, url or files") }
|
|
70
|
+
return Content(subject: subject, items: items)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/// "/__akan_native/file/<id>" or its absolute form "app://localhost/__akan_native/file/<id>".
|
|
74
|
+
private static func fileId(_ ref: String) -> String? {
|
|
75
|
+
var path = ref
|
|
76
|
+
if !ref.hasPrefix("/") {
|
|
77
|
+
guard let url = URL(string: ref), url.scheme == "app", url.host == "localhost" else { return nil }
|
|
78
|
+
path = url.path
|
|
79
|
+
}
|
|
80
|
+
guard path.hasPrefix(filePrefix) else { return nil }
|
|
81
|
+
let id = String(path.dropFirst(filePrefix.count))
|
|
82
|
+
return id.isEmpty || id.contains("/") ? nil : id
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/// The file behind a FileRef id. AkanNativePluginContext has no lookup for this yet, so this reads the
|
|
86
|
+
/// shell's registry (same module); switch to the context once it offers one.
|
|
87
|
+
private func localFile(_ id: String) -> URL? {
|
|
88
|
+
context.file("/__akan_native/file/\(id)")?.url
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
func share(_ args: ShareOptions, _ reply: AkanNativeReply<ShareResult>) {
|
|
92
|
+
let content: Content
|
|
93
|
+
do {
|
|
94
|
+
content = try self.content(args)
|
|
95
|
+
} catch {
|
|
96
|
+
return reply.reject(error.code, error.message)
|
|
97
|
+
}
|
|
98
|
+
guard var presenter = context.viewController else { return reply.reject(.internalError, "no view controller to present from") }
|
|
99
|
+
while let next = presenter.presentedViewController {
|
|
100
|
+
if next is UIActivityViewController { return reply.reject(.cancelled, "a share sheet is already open") }
|
|
101
|
+
presenter = next
|
|
102
|
+
}
|
|
103
|
+
let view = presenter.view!
|
|
104
|
+
|
|
105
|
+
var items = content.items
|
|
106
|
+
if let subject = content.subject, let first = items.first { items[0] = SubjectItem(first, subject: subject) }
|
|
107
|
+
let sheet = UIActivityViewController(activityItems: items, applicationActivities: nil)
|
|
108
|
+
sheet.completionWithItemsHandler = { [weak sheet] type, completed, _, error in
|
|
109
|
+
if let error { return reply.reject(.internalError, "sharing failed: \(error.localizedDescription)") }
|
|
110
|
+
if completed { return reply.resolve(ShareResult(completed: true, target: type?.rawValue)) }
|
|
111
|
+
if type == nil { return reply.resolve(ShareResult(completed: false)) }
|
|
112
|
+
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak sheet] in
|
|
113
|
+
MainActor.assumeIsolated {
|
|
114
|
+
if sheet?.presentingViewController == nil { reply.resolve(ShareResult(completed: false)) }
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
if let popover = sheet.popoverPresentationController {
|
|
119
|
+
popover.sourceView = view
|
|
120
|
+
popover.sourceRect = CGRect(x: view.bounds.midX, y: view.bounds.midY, width: 0, height: 0)
|
|
121
|
+
popover.permittedArrowDirections = []
|
|
122
|
+
}
|
|
123
|
+
context.present(sheet) { reply.reject(.internalError, "nothing to present the share sheet from") }
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/// Wraps the first item to give activities a subject line.
|
|
128
|
+
private final class SubjectItem: NSObject, UIActivityItemSource {
|
|
129
|
+
private let item: Any
|
|
130
|
+
private let subject: String
|
|
131
|
+
|
|
132
|
+
init(_ item: Any, subject: String) {
|
|
133
|
+
self.item = item
|
|
134
|
+
self.subject = subject
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
func activityViewControllerPlaceholderItem(_ controller: UIActivityViewController) -> Any { item }
|
|
138
|
+
|
|
139
|
+
func activityViewController(_ controller: UIActivityViewController, itemForActivityType type: UIActivity.ActivityType?) -> Any? { item }
|
|
140
|
+
|
|
141
|
+
func activityViewController(_ controller: UIActivityViewController, subjectForActivityType type: UIActivity.ActivityType?) -> String { subject }
|
|
142
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "share",
|
|
3
|
+
"apiVersion": 1,
|
|
4
|
+
"methods": ["share", "canShare"],
|
|
5
|
+
"events": [],
|
|
6
|
+
"codegen": true,
|
|
7
|
+
"web": "./src/web.ts",
|
|
8
|
+
"desktop": "web",
|
|
9
|
+
"ios": {
|
|
10
|
+
"sources": ["ios/*.swift"],
|
|
11
|
+
"class": "SharePlugin"
|
|
12
|
+
},
|
|
13
|
+
"android": {
|
|
14
|
+
"sources": ["android/*.kt"],
|
|
15
|
+
"class": "com.akanjs.plugins.share.SharePlugin",
|
|
16
|
+
"manifestXml": "<permission android:name=\"${applicationId}.AKAN_NATIVE_INTERNAL_BROADCAST\" android:protectionLevel=\"signature\" />\n <uses-permission android:name=\"${applicationId}.AKAN_NATIVE_INTERNAL_BROADCAST\" />"
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import * as React from "react";
|
|
4
|
+
import { AkanNativeError, definePlugin } from "../../../packages/core/src/index.ts";
|
|
5
|
+
import { web, webShareAvailable } from "./web.ts";
|
|
6
|
+
|
|
7
|
+
export interface ShareOptions {
|
|
8
|
+
/** Subject line for mail-like targets, preview title on Android. */
|
|
9
|
+
title?: string;
|
|
10
|
+
text?: string;
|
|
11
|
+
/** An absolute URL. On Android it is appended to the text (the intent has one text field). */
|
|
12
|
+
url?: string;
|
|
13
|
+
/**
|
|
14
|
+
* Files as FileRef URLs (`/__akan_native/file/<id>`) returned by other plugins, e.g. camera.takePhoto().
|
|
15
|
+
* On the web also blob: and same-origin URLs. Not yet on Android (see canShare).
|
|
16
|
+
*/
|
|
17
|
+
files?: string[];
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export interface ShareResult {
|
|
21
|
+
/** False when the user closed the share sheet without choosing a target. */
|
|
22
|
+
completed: boolean;
|
|
23
|
+
/**
|
|
24
|
+
* What received the share, when the platform tells: the package name on Android, the activity type
|
|
25
|
+
* on iOS (com.apple.UIKit.activity.Mail, …). Missing on the web and when unknown.
|
|
26
|
+
*/
|
|
27
|
+
target?: string;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* The system share sheet: UIActivityViewController (iOS), the Android chooser, navigator.share
|
|
32
|
+
* (web, and the desktop WebView: WKWebView on macOS, WebView2 on Windows). Linux has no share
|
|
33
|
+
* sheet (WebKitGTK has no navigator.share): canShare() answers false and share() rejects
|
|
34
|
+
* UNSUPPORTED. Closing the sheet resolves `{ completed: false }` rather than rejecting, as
|
|
35
|
+
* react-native Share does ("dismissedAction").
|
|
36
|
+
*/
|
|
37
|
+
export interface ShareApi {
|
|
38
|
+
/**
|
|
39
|
+
* Opens the share sheet. Needs a user gesture on the web (call it from a click, before any await).
|
|
40
|
+
* Rejects INVALID_ARGS without text, url or files, CANCELLED while another share sheet is open,
|
|
41
|
+
* UNSUPPORTED where sharing (or sharing these files) is not available.
|
|
42
|
+
*/
|
|
43
|
+
share(options: ShareOptions): Promise<ShareResult>;
|
|
44
|
+
/**
|
|
45
|
+
* Whether share() would work for these options; without options (or with {}) whether a share sheet
|
|
46
|
+
* exists at all. Invalid options answer false instead of rejecting, as navigator.canShare does.
|
|
47
|
+
*/
|
|
48
|
+
canShare(options?: ShareOptions): Promise<{ value: boolean }>;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
export const share = definePlugin<ShareApi>("share", {
|
|
52
|
+
methods: ["share", "canShare"],
|
|
53
|
+
web,
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
export interface UseShare {
|
|
57
|
+
/** False where no share sheet exists (desktop Firefox, insecure origins): hide the share button. */
|
|
58
|
+
supported: boolean;
|
|
59
|
+
pending: boolean;
|
|
60
|
+
/** Last failure. Closing the sheet is not a failure. */
|
|
61
|
+
error: AkanNativeError | null;
|
|
62
|
+
/** Resolves null on failure (see `error`). */
|
|
63
|
+
share(options: ShareOptions): Promise<ShareResult | null>;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
export function useShare(): UseShare {
|
|
67
|
+
const [pending, setPending] = React.useState(false);
|
|
68
|
+
const [error, setError] = React.useState<AkanNativeError | null>(null);
|
|
69
|
+
|
|
70
|
+
const run = React.useCallback(async (options: ShareOptions) => {
|
|
71
|
+
setPending(true);
|
|
72
|
+
setError(null);
|
|
73
|
+
try {
|
|
74
|
+
|
|
75
|
+
return await share.share(options);
|
|
76
|
+
} catch (e) {
|
|
77
|
+
const err = AkanNativeError.from(e);
|
|
78
|
+
if (err.code !== "CANCELLED") setError(err);
|
|
79
|
+
return null;
|
|
80
|
+
} finally {
|
|
81
|
+
setPending(false);
|
|
82
|
+
}
|
|
83
|
+
}, []);
|
|
84
|
+
|
|
85
|
+
const where = share.implementation("share");
|
|
86
|
+
return { supported: where === "native" || (where === "web" && webShareAvailable()), pending, error, share: run };
|
|
87
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { AkanNativeError } from "../../../packages/core/src/index.ts";
|
|
2
|
+
import type { ShareOptions } from "./index.ts";
|
|
3
|
+
|
|
4
|
+
const NOT_LINKS = ["javascript:", "data:", "blob:", "file:"];
|
|
5
|
+
|
|
6
|
+
const invalid = (message: string) => new AkanNativeError("INVALID_ARGS", message);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Normalizes share() options the way the native implementations read them: empty strings and
|
|
10
|
+
* null count as missing, at least one of text, url or files is required, url is absolute.
|
|
11
|
+
*/
|
|
12
|
+
export function checkOptions(options: unknown): ShareOptions {
|
|
13
|
+
if (!options || typeof options !== "object" || Array.isArray(options))
|
|
14
|
+
throw invalid("share options must be an object");
|
|
15
|
+
const { title, text, url, files } = options as Record<string, unknown>;
|
|
16
|
+
const out: ShareOptions = {};
|
|
17
|
+
for (const [key, value] of [
|
|
18
|
+
["title", title],
|
|
19
|
+
["text", text],
|
|
20
|
+
["url", url],
|
|
21
|
+
] as const) {
|
|
22
|
+
if (value === undefined || value === null || value === "") continue;
|
|
23
|
+
if (typeof value !== "string") throw invalid(`${key} must be a string`);
|
|
24
|
+
out[key] = value;
|
|
25
|
+
}
|
|
26
|
+
if (files !== undefined && files !== null) {
|
|
27
|
+
if (!Array.isArray(files) || files.some((f) => typeof f !== "string" || f.length === 0))
|
|
28
|
+
throw invalid("files must be an array of file URLs");
|
|
29
|
+
if (files.length > 0) out.files = files as string[];
|
|
30
|
+
}
|
|
31
|
+
if (!out.text && !out.url && !out.files) throw invalid("share needs text, url or files");
|
|
32
|
+
if (out.url) {
|
|
33
|
+
let parsed: URL;
|
|
34
|
+
try {
|
|
35
|
+
parsed = new URL(out.url);
|
|
36
|
+
} catch {
|
|
37
|
+
throw invalid(`url must be an absolute URL (got ${out.url})`);
|
|
38
|
+
}
|
|
39
|
+
if (NOT_LINKS.includes(parsed.protocol))
|
|
40
|
+
throw invalid(`${parsed.protocol} URLs cannot be shared as links; use files`);
|
|
41
|
+
}
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import { AkanNativeError, defineWebPlugin } from "../../../packages/core/src/index.ts";
|
|
2
|
+
import type { ShareApi, ShareOptions, ShareResult } from "./index.ts";
|
|
3
|
+
import { checkOptions } from "./options.ts";
|
|
4
|
+
|
|
5
|
+
export function webShareAvailable(): boolean {
|
|
6
|
+
return typeof navigator !== "undefined" && typeof navigator.share === "function";
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const EXTENSIONS: Record<string, string> = {
|
|
10
|
+
"image/jpeg": "jpg",
|
|
11
|
+
"image/png": "png",
|
|
12
|
+
"image/gif": "gif",
|
|
13
|
+
"image/webp": "webp",
|
|
14
|
+
"image/heic": "heic",
|
|
15
|
+
"application/pdf": "pdf",
|
|
16
|
+
"text/plain": "txt",
|
|
17
|
+
"video/mp4": "mp4",
|
|
18
|
+
"video/quicktime": "mov",
|
|
19
|
+
"audio/mpeg": "mp3",
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/** A file name for the share target: the URL's last path segment if it has an extension. */
|
|
23
|
+
export function fileName(url: string, mime: string, index: number, base?: string): string {
|
|
24
|
+
if (!url.startsWith("blob:") && !url.startsWith("data:")) {
|
|
25
|
+
try {
|
|
26
|
+
const last = new URL(url, base ?? globalThis.location?.href).pathname.split("/").pop();
|
|
27
|
+
if (last && /\.[A-Za-z0-9]{1,8}$/.test(last)) return decodeURIComponent(last);
|
|
28
|
+
} catch {
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
const type = mime.split(";")[0]!.trim().toLowerCase();
|
|
32
|
+
const ext = EXTENSIONS[type] ?? (type.split("/")[1]?.replace(/[^a-z0-9]/g, "") || "bin");
|
|
33
|
+
return `file${index + 1}.${ext}`;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
async function loadFiles(urls: string[]): Promise<File[]> {
|
|
37
|
+
return Promise.all(
|
|
38
|
+
urls.map(async (url, i) => {
|
|
39
|
+
let response: Response;
|
|
40
|
+
try {
|
|
41
|
+
response = await fetch(url);
|
|
42
|
+
} catch (error) {
|
|
43
|
+
throw new AkanNativeError("NOT_FOUND", `could not read ${url}`, { cause: error });
|
|
44
|
+
}
|
|
45
|
+
if (!response.ok) throw new AkanNativeError("NOT_FOUND", `could not read ${url} (${response.status})`);
|
|
46
|
+
const blob = await response.blob();
|
|
47
|
+
return new File([blob], fileName(url, blob.type, i), { type: blob.type });
|
|
48
|
+
}),
|
|
49
|
+
);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
function toData(options: ShareOptions): ShareData {
|
|
53
|
+
const data: ShareData = {};
|
|
54
|
+
if (options.title) data.title = options.title;
|
|
55
|
+
if (options.text) data.text = options.text;
|
|
56
|
+
if (options.url) data.url = options.url;
|
|
57
|
+
return data;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function run(data: ShareData): Promise<ShareResult> {
|
|
61
|
+
return navigator.share(data).then(
|
|
62
|
+
() => ({ completed: true }),
|
|
63
|
+
(error: unknown) => {
|
|
64
|
+
const name = (error as { name?: string })?.name;
|
|
65
|
+
if (name === "AbortError") return { completed: false };
|
|
66
|
+
if (name === "InvalidStateError") throw new AkanNativeError("CANCELLED", "a share sheet is already open");
|
|
67
|
+
if (name === "TypeError" || name === "DataError")
|
|
68
|
+
throw new AkanNativeError("INVALID_ARGS", String((error as Error).message));
|
|
69
|
+
throw AkanNativeError.from(error);
|
|
70
|
+
},
|
|
71
|
+
);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export const web = defineWebPlugin<ShareApi>({
|
|
75
|
+
methods: {
|
|
76
|
+
share(options) {
|
|
77
|
+
const checked = checkOptions(options);
|
|
78
|
+
if (!webShareAvailable()) {
|
|
79
|
+
throw new AkanNativeError(
|
|
80
|
+
"UNSUPPORTED",
|
|
81
|
+
"the Web Share API is not available here (desktop Firefox, insecure context)",
|
|
82
|
+
);
|
|
83
|
+
}
|
|
84
|
+
const data = toData(checked);
|
|
85
|
+
if (!checked.files) return run(data);
|
|
86
|
+
return loadFiles(checked.files).then((files) => {
|
|
87
|
+
const withFiles: ShareData = { ...data, files };
|
|
88
|
+
if (typeof navigator.canShare === "function" && !navigator.canShare(withFiles)) {
|
|
89
|
+
throw new AkanNativeError("UNSUPPORTED", "this browser cannot share these files");
|
|
90
|
+
}
|
|
91
|
+
return run(withFiles);
|
|
92
|
+
});
|
|
93
|
+
},
|
|
94
|
+
async canShare(options) {
|
|
95
|
+
if (!webShareAvailable()) return { value: false };
|
|
96
|
+
|
|
97
|
+
if (!options || Object.keys(options).length === 0) return { value: true };
|
|
98
|
+
let checked: ShareOptions;
|
|
99
|
+
try {
|
|
100
|
+
checked = checkOptions(options);
|
|
101
|
+
} catch {
|
|
102
|
+
return { value: false };
|
|
103
|
+
}
|
|
104
|
+
const data = toData(checked);
|
|
105
|
+
if (typeof navigator.canShare !== "function") return { value: !checked.files };
|
|
106
|
+
if (checked.files) {
|
|
107
|
+
try {
|
|
108
|
+
data.files = await loadFiles(checked.files);
|
|
109
|
+
} catch {
|
|
110
|
+
return { value: false };
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
return { value: navigator.canShare(data) };
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
});
|