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.
Files changed (731) hide show
  1. package/README.ko.md +0 -1
  2. package/README.md +0 -1
  3. package/base/baseEnv.ts +40 -3
  4. package/client/cookie.ts +56 -20
  5. package/client/device.ts +47 -95
  6. package/client/frameConfig.ts +2 -2
  7. package/client/native.ts +44 -0
  8. package/client/router.ts +11 -1
  9. package/client/rscNavigation.ts +5 -0
  10. package/client/storage.ts +68 -39
  11. package/fetch/client/fetchClient.ts +13 -4
  12. package/index.ts +47 -46
  13. package/package.json +6 -87
  14. package/server/devtools/signalSerializer.ts +1 -2
  15. package/server/hmr/devHmrController.ts +29 -11
  16. package/server/resolver/signal.resolver.ts +1 -10
  17. package/server/routeTreeBuilder.ts +8 -11
  18. package/server/routing/apiRouter.ts +15 -2
  19. package/server/rscClient.tsx +1 -2
  20. package/server/ssrFromRscRenderer.tsx +2 -0
  21. package/server/webRouter.ts +1 -0
  22. package/signal/CrossSiteGuard.ts +34 -2
  23. package/signal/endpoint.ts +12 -7
  24. package/signal/endpointInfo.ts +13 -0
  25. package/signal/internal.ts +9 -5
  26. package/signal/serializer/fetch.serializer.ts +6 -3
  27. package/signal/slice.ts +34 -24
  28. package/store/baseSt.ts +0 -1
  29. package/store/storeInstance.ts +29 -17
  30. package/types/client/cookie.d.ts +6 -4
  31. package/types/client/device.d.ts +7 -10
  32. package/types/client/native.d.ts +26 -0
  33. package/types/client/rscNavigation.d.ts +4 -0
  34. package/types/client/storage.d.ts +8 -1
  35. package/types/index.d.ts +48 -44
  36. package/types/server/hmr/devHmrController.d.ts +2 -1
  37. package/types/server/resolver/signal.resolver.d.ts +0 -1
  38. package/types/server/rscClient.d.ts +0 -3
  39. package/types/signal/CrossSiteGuard.d.ts +7 -2
  40. package/types/signal/endpoint.d.ts +1 -1
  41. package/types/signal/endpointInfo.d.ts +3 -0
  42. package/types/signal/slice.d.ts +3 -2
  43. package/types/store/baseSt.d.ts +0 -13
  44. package/types/vendor/@akanjs/native/packages/cli/src/api.d.ts +182 -0
  45. package/types/vendor/@akanjs/native/packages/cli/src/commands/build.d.ts +28 -0
  46. package/types/vendor/@akanjs/native/packages/cli/src/commands/compat.d.ts +2 -0
  47. package/types/vendor/@akanjs/native/packages/cli/src/commands/dev.d.ts +2 -0
  48. package/types/vendor/@akanjs/native/packages/cli/src/commands/doctor.d.ts +37 -0
  49. package/types/vendor/@akanjs/native/packages/cli/src/commands/plugin.d.ts +2 -0
  50. package/types/vendor/@akanjs/native/packages/cli/src/commands/signing.d.ts +2 -0
  51. package/types/vendor/@akanjs/native/packages/cli/src/commands/test.d.ts +2 -0
  52. package/types/vendor/@akanjs/native/packages/cli/src/commands/toolchain.d.ts +2 -0
  53. package/types/vendor/@akanjs/native/packages/cli/src/commands/update.d.ts +2 -0
  54. package/types/vendor/@akanjs/native/packages/cli/src/config.d.ts +278 -0
  55. package/types/vendor/@akanjs/native/packages/cli/src/index.d.ts +2 -0
  56. package/types/vendor/@akanjs/native/packages/cli/src/lib/acl.d.ts +21 -0
  57. package/types/vendor/@akanjs/native/packages/cli/src/lib/apilevel.d.ts +40 -0
  58. package/types/vendor/@akanjs/native/packages/cli/src/lib/apk.d.ts +36 -0
  59. package/types/vendor/@akanjs/native/packages/cli/src/lib/args.d.ts +9 -0
  60. package/types/vendor/@akanjs/native/packages/cli/src/lib/boot.d.ts +32 -0
  61. package/types/vendor/@akanjs/native/packages/cli/src/lib/chrome.d.ts +6 -0
  62. package/types/vendor/@akanjs/native/packages/cli/src/lib/codegen.d.ts +94 -0
  63. package/types/vendor/@akanjs/native/packages/cli/src/lib/compat.d.ts +49 -0
  64. package/types/vendor/@akanjs/native/packages/cli/src/lib/configkeys.d.ts +2 -0
  65. package/types/vendor/@akanjs/native/packages/cli/src/lib/csp.d.ts +51 -0
  66. package/types/vendor/@akanjs/native/packages/cli/src/lib/env.d.ts +44 -0
  67. package/types/vendor/@akanjs/native/packages/cli/src/lib/exec.d.ts +31 -0
  68. package/types/vendor/@akanjs/native/packages/cli/src/lib/googleservices.d.ts +2 -0
  69. package/types/vendor/@akanjs/native/packages/cli/src/lib/hmr.d.ts +120 -0
  70. package/types/vendor/@akanjs/native/packages/cli/src/lib/html.d.ts +20 -0
  71. package/types/vendor/@akanjs/native/packages/cli/src/lib/icons.d.ts +44 -0
  72. package/types/vendor/@akanjs/native/packages/cli/src/lib/image.d.ts +21 -0
  73. package/types/vendor/@akanjs/native/packages/cli/src/lib/iossigning.d.ts +81 -0
  74. package/types/vendor/@akanjs/native/packages/cli/src/lib/launch.d.ts +51 -0
  75. package/types/vendor/@akanjs/native/packages/cli/src/lib/log.d.ts +42 -0
  76. package/types/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.d.ts +18 -0
  77. package/types/vendor/@akanjs/native/packages/cli/src/lib/maven.d.ts +97 -0
  78. package/types/vendor/@akanjs/native/packages/cli/src/lib/names.d.ts +45 -0
  79. package/types/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.d.ts +67 -0
  80. package/types/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.d.ts +11 -0
  81. package/types/vendor/@akanjs/native/packages/cli/src/lib/permissions.d.ts +10 -0
  82. package/types/vendor/@akanjs/native/packages/cli/src/lib/plist.d.ts +11 -0
  83. package/types/vendor/@akanjs/native/packages/cli/src/lib/png.d.ts +11 -0
  84. package/types/vendor/@akanjs/native/packages/cli/src/lib/prepare.d.ts +138 -0
  85. package/types/vendor/@akanjs/native/packages/cli/src/lib/privacy.d.ts +13 -0
  86. package/types/vendor/@akanjs/native/packages/cli/src/lib/project.d.ts +208 -0
  87. package/types/vendor/@akanjs/native/packages/cli/src/lib/root.d.ts +1 -0
  88. package/types/vendor/@akanjs/native/packages/cli/src/lib/routes.d.ts +1 -0
  89. package/types/vendor/@akanjs/native/packages/cli/src/lib/serve.d.ts +17 -0
  90. package/types/vendor/@akanjs/native/packages/cli/src/lib/signing.d.ts +14 -0
  91. package/types/vendor/@akanjs/native/packages/cli/src/lib/spec.d.ts +96 -0
  92. package/types/vendor/@akanjs/native/packages/cli/src/lib/toolchains.d.ts +150 -0
  93. package/types/vendor/@akanjs/native/packages/cli/src/lib/updates.d.ts +77 -0
  94. package/types/vendor/@akanjs/native/packages/cli/src/lib/vectors.d.ts +13 -0
  95. package/types/vendor/@akanjs/native/packages/cli/src/lib/xml.d.ts +13 -0
  96. package/types/vendor/@akanjs/native/packages/cli/src/platforms/android.d.ts +57 -0
  97. package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.d.ts +4 -0
  98. package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop.d.ts +40 -0
  99. package/types/vendor/@akanjs/native/packages/cli/src/platforms/index.d.ts +14 -0
  100. package/types/vendor/@akanjs/native/packages/cli/src/platforms/ios.d.ts +44 -0
  101. package/types/vendor/@akanjs/native/packages/cli/src/platforms/linux.d.ts +6 -0
  102. package/types/vendor/@akanjs/native/packages/cli/src/platforms/macos.d.ts +7 -0
  103. package/types/vendor/@akanjs/native/packages/cli/src/platforms/targets.d.ts +4 -0
  104. package/types/vendor/@akanjs/native/packages/cli/src/platforms/web-run.d.ts +15 -0
  105. package/types/vendor/@akanjs/native/packages/cli/src/platforms/web.d.ts +2 -0
  106. package/types/vendor/@akanjs/native/packages/cli/src/platforms/windows.d.ts +8 -0
  107. package/types/vendor/@akanjs/native/packages/cli/src/platforms.d.ts +1 -0
  108. package/types/vendor/@akanjs/native/packages/cli/src.d.ts +1 -0
  109. package/types/vendor/@akanjs/native/packages/core/src/acl.d.ts +97 -0
  110. package/types/vendor/@akanjs/native/packages/core/src/boot.d.ts +66 -0
  111. package/types/vendor/@akanjs/native/packages/core/src/contract.d.ts +35 -0
  112. package/types/vendor/@akanjs/native/packages/core/src/errors.d.ts +27 -0
  113. package/types/vendor/@akanjs/native/packages/core/src/files.d.ts +23 -0
  114. package/types/vendor/@akanjs/native/packages/core/src/index.d.ts +14 -0
  115. package/types/vendor/@akanjs/native/packages/core/src/kernel.d.ts +112 -0
  116. package/types/vendor/@akanjs/native/packages/core/src/live.d.ts +12 -0
  117. package/types/vendor/@akanjs/native/packages/core/src/mime.d.ts +2 -0
  118. package/types/vendor/@akanjs/native/packages/core/src/plugin.d.ts +71 -0
  119. package/types/vendor/@akanjs/native/packages/core/src/protocol.d.ts +109 -0
  120. package/types/vendor/@akanjs/native/packages/core/src/runtime.d.ts +66 -0
  121. package/types/vendor/@akanjs/native/packages/core/src/state.d.ts +28 -0
  122. package/types/vendor/@akanjs/native/packages/core/src/testing.d.ts +41 -0
  123. package/types/vendor/@akanjs/native/packages/core/src/version.d.ts +2 -0
  124. package/types/vendor/@akanjs/native/packages/core/src/veto.d.ts +17 -0
  125. package/types/vendor/@akanjs/native/packages/core/src.d.ts +1 -0
  126. package/types/vendor/@akanjs/native/packages/desktop/src/deeplinks.d.ts +24 -0
  127. package/types/vendor/@akanjs/native/packages/desktop/src/delta.d.ts +2 -0
  128. package/types/vendor/@akanjs/native/packages/desktop/src/dispatcher.d.ts +95 -0
  129. package/types/vendor/@akanjs/native/packages/desktop/src/ffi.d.ts +144 -0
  130. package/types/vendor/@akanjs/native/packages/desktop/src/host.d.ts +11 -0
  131. package/types/vendor/@akanjs/native/packages/desktop/src/lifecycle.d.ts +40 -0
  132. package/types/vendor/@akanjs/native/packages/desktop/src/main.d.ts +4 -0
  133. package/types/vendor/@akanjs/native/packages/desktop/src/page-veto.d.ts +17 -0
  134. package/types/vendor/@akanjs/native/packages/desktop/src/paths.d.ts +25 -0
  135. package/types/vendor/@akanjs/native/packages/desktop/src/plugin.d.ts +179 -0
  136. package/types/vendor/@akanjs/native/packages/react/src/index.d.ts +8 -0
  137. package/types/vendor/@akanjs/native/packages/react/src.d.ts +1 -0
  138. package/types/vendor/@akanjs/native/plugins/accessibility/src/announce.d.ts +8 -0
  139. package/types/vendor/@akanjs/native/plugins/accessibility/src/index.d.ts +47 -0
  140. package/types/vendor/@akanjs/native/plugins/accessibility/src/web.d.ts +4 -0
  141. package/types/vendor/@akanjs/native/plugins/accessibility/src.d.ts +1 -0
  142. package/types/vendor/@akanjs/native/plugins/app/src/desktop.d.ts +3 -0
  143. package/types/vendor/@akanjs/native/plugins/app/src/index.d.ts +66 -0
  144. package/types/vendor/@akanjs/native/plugins/app/src/web.d.ts +2 -0
  145. package/types/vendor/@akanjs/native/plugins/app/src.d.ts +1 -0
  146. package/types/vendor/@akanjs/native/plugins/app-state/src/index.d.ts +19 -0
  147. package/types/vendor/@akanjs/native/plugins/app-state/src/web.d.ts +2 -0
  148. package/types/vendor/@akanjs/native/plugins/app-state/src.d.ts +1 -0
  149. package/types/vendor/@akanjs/native/plugins/appearance/src/desktop.d.ts +9 -0
  150. package/types/vendor/@akanjs/native/plugins/appearance/src/index.d.ts +32 -0
  151. package/types/vendor/@akanjs/native/plugins/appearance/src/setting.d.ts +6 -0
  152. package/types/vendor/@akanjs/native/plugins/appearance/src/web.d.ts +3 -0
  153. package/types/vendor/@akanjs/native/plugins/appearance/src.d.ts +1 -0
  154. package/types/vendor/@akanjs/native/plugins/auth-session/src/args.d.ts +18 -0
  155. package/types/vendor/@akanjs/native/plugins/auth-session/src/desktop.d.ts +17 -0
  156. package/types/vendor/@akanjs/native/plugins/auth-session/src/index.d.ts +41 -0
  157. package/types/vendor/@akanjs/native/plugins/auth-session/src.d.ts +1 -0
  158. package/types/vendor/@akanjs/native/plugins/autostart/src/desktop.d.ts +44 -0
  159. package/types/vendor/@akanjs/native/plugins/autostart/src/index.d.ts +44 -0
  160. package/types/vendor/@akanjs/native/plugins/autostart/src.d.ts +1 -0
  161. package/types/vendor/@akanjs/native/plugins/badge/src/count.d.ts +4 -0
  162. package/types/vendor/@akanjs/native/plugins/badge/src/desktop.d.ts +3 -0
  163. package/types/vendor/@akanjs/native/plugins/badge/src/index.d.ts +37 -0
  164. package/types/vendor/@akanjs/native/plugins/badge/src/web.d.ts +2 -0
  165. package/types/vendor/@akanjs/native/plugins/badge/src.d.ts +1 -0
  166. package/types/vendor/@akanjs/native/plugins/biometric/src/index.d.ts +53 -0
  167. package/types/vendor/@akanjs/native/plugins/biometric/src.d.ts +1 -0
  168. package/types/vendor/@akanjs/native/plugins/browser/src/args.d.ts +8 -0
  169. package/types/vendor/@akanjs/native/plugins/browser/src/desktop.d.ts +9 -0
  170. package/types/vendor/@akanjs/native/plugins/browser/src/index.d.ts +36 -0
  171. package/types/vendor/@akanjs/native/plugins/browser/src/web.d.ts +2 -0
  172. package/types/vendor/@akanjs/native/plugins/browser/src.d.ts +1 -0
  173. package/types/vendor/@akanjs/native/plugins/camera/src/desktop.d.ts +5 -0
  174. package/types/vendor/@akanjs/native/plugins/camera/src/index.d.ts +55 -0
  175. package/types/vendor/@akanjs/native/plugins/camera/src/web.d.ts +2 -0
  176. package/types/vendor/@akanjs/native/plugins/camera/src.d.ts +1 -0
  177. package/types/vendor/@akanjs/native/plugins/clipboard/src/desktop.d.ts +8 -0
  178. package/types/vendor/@akanjs/native/plugins/clipboard/src/index.d.ts +40 -0
  179. package/types/vendor/@akanjs/native/plugins/clipboard/src/web.d.ts +2 -0
  180. package/types/vendor/@akanjs/native/plugins/clipboard/src.d.ts +1 -0
  181. package/types/vendor/@akanjs/native/plugins/device/src/desktop.d.ts +33 -0
  182. package/types/vendor/@akanjs/native/plugins/device/src/index.d.ts +55 -0
  183. package/types/vendor/@akanjs/native/plugins/device/src/web.d.ts +22 -0
  184. package/types/vendor/@akanjs/native/plugins/device/src.d.ts +1 -0
  185. package/types/vendor/@akanjs/native/plugins/dialog/src/desktop.d.ts +3 -0
  186. package/types/vendor/@akanjs/native/plugins/dialog/src/index.d.ts +60 -0
  187. package/types/vendor/@akanjs/native/plugins/dialog/src/options.d.ts +29 -0
  188. package/types/vendor/@akanjs/native/plugins/dialog/src/web.d.ts +2 -0
  189. package/types/vendor/@akanjs/native/plugins/dialog/src.d.ts +1 -0
  190. package/types/vendor/@akanjs/native/plugins/dock/src/desktop.d.ts +3 -0
  191. package/types/vendor/@akanjs/native/plugins/dock/src/index.d.ts +46 -0
  192. package/types/vendor/@akanjs/native/plugins/dock/src.d.ts +1 -0
  193. package/types/vendor/@akanjs/native/plugins/file-picker/src/common.d.ts +33 -0
  194. package/types/vendor/@akanjs/native/plugins/file-picker/src/desktop.d.ts +9 -0
  195. package/types/vendor/@akanjs/native/plugins/file-picker/src/index.d.ts +84 -0
  196. package/types/vendor/@akanjs/native/plugins/file-picker/src/web.d.ts +6 -0
  197. package/types/vendor/@akanjs/native/plugins/file-picker/src.d.ts +1 -0
  198. package/types/vendor/@akanjs/native/plugins/filesystem/src/common.d.ts +49 -0
  199. package/types/vendor/@akanjs/native/plugins/filesystem/src/desktop.d.ts +8 -0
  200. package/types/vendor/@akanjs/native/plugins/filesystem/src/index.d.ts +123 -0
  201. package/types/vendor/@akanjs/native/plugins/filesystem/src/web.d.ts +2 -0
  202. package/types/vendor/@akanjs/native/plugins/filesystem/src.d.ts +1 -0
  203. package/types/vendor/@akanjs/native/plugins/geolocation/src/index.d.ts +93 -0
  204. package/types/vendor/@akanjs/native/plugins/geolocation/src/web.d.ts +11 -0
  205. package/types/vendor/@akanjs/native/plugins/geolocation/src.d.ts +1 -0
  206. package/types/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.d.ts +3 -0
  207. package/types/vendor/@akanjs/native/plugins/global-shortcut/src/index.d.ts +52 -0
  208. package/types/vendor/@akanjs/native/plugins/global-shortcut/src.d.ts +1 -0
  209. package/types/vendor/@akanjs/native/plugins/haptics/src/index.d.ts +31 -0
  210. package/types/vendor/@akanjs/native/plugins/haptics/src/web.d.ts +2 -0
  211. package/types/vendor/@akanjs/native/plugins/haptics/src.d.ts +1 -0
  212. package/types/vendor/@akanjs/native/plugins/http/src/common.d.ts +71 -0
  213. package/types/vendor/@akanjs/native/plugins/http/src/desktop.d.ts +5 -0
  214. package/types/vendor/@akanjs/native/plugins/http/src/index.d.ts +104 -0
  215. package/types/vendor/@akanjs/native/plugins/http/src/web.d.ts +2 -0
  216. package/types/vendor/@akanjs/native/plugins/http/src.d.ts +1 -0
  217. package/types/vendor/@akanjs/native/plugins/iap/src/index.d.ts +171 -0
  218. package/types/vendor/@akanjs/native/plugins/iap/src.d.ts +1 -0
  219. package/types/vendor/@akanjs/native/plugins/keep-awake/src/desktop.d.ts +15 -0
  220. package/types/vendor/@akanjs/native/plugins/keep-awake/src/index.d.ts +33 -0
  221. package/types/vendor/@akanjs/native/plugins/keep-awake/src/web.d.ts +2 -0
  222. package/types/vendor/@akanjs/native/plugins/keep-awake/src.d.ts +1 -0
  223. package/types/vendor/@akanjs/native/plugins/keyboard/src/index.d.ts +42 -0
  224. package/types/vendor/@akanjs/native/plugins/keyboard/src/web.d.ts +2 -0
  225. package/types/vendor/@akanjs/native/plugins/keyboard/src.d.ts +1 -0
  226. package/types/vendor/@akanjs/native/plugins/local-notifications/src/desktop.d.ts +29 -0
  227. package/types/vendor/@akanjs/native/plugins/local-notifications/src/index.d.ts +126 -0
  228. package/types/vendor/@akanjs/native/plugins/local-notifications/src/schedule.d.ts +38 -0
  229. package/types/vendor/@akanjs/native/plugins/local-notifications/src/timers.d.ts +25 -0
  230. package/types/vendor/@akanjs/native/plugins/local-notifications/src/web.d.ts +4 -0
  231. package/types/vendor/@akanjs/native/plugins/local-notifications/src.d.ts +1 -0
  232. package/types/vendor/@akanjs/native/plugins/menu/src/desktop.d.ts +3 -0
  233. package/types/vendor/@akanjs/native/plugins/menu/src/index.d.ts +85 -0
  234. package/types/vendor/@akanjs/native/plugins/menu/src.d.ts +1 -0
  235. package/types/vendor/@akanjs/native/plugins/network/src/index.d.ts +22 -0
  236. package/types/vendor/@akanjs/native/plugins/network/src/web.d.ts +3 -0
  237. package/types/vendor/@akanjs/native/plugins/network/src.d.ts +1 -0
  238. package/types/vendor/@akanjs/native/plugins/opener/src/desktop.d.ts +14 -0
  239. package/types/vendor/@akanjs/native/plugins/opener/src/index.d.ts +33 -0
  240. package/types/vendor/@akanjs/native/plugins/opener/src/url.d.ts +16 -0
  241. package/types/vendor/@akanjs/native/plugins/opener/src/web.d.ts +2 -0
  242. package/types/vendor/@akanjs/native/plugins/opener/src.d.ts +1 -0
  243. package/types/vendor/@akanjs/native/plugins/preferences/src/desktop.d.ts +3 -0
  244. package/types/vendor/@akanjs/native/plugins/preferences/src/index.d.ts +26 -0
  245. package/types/vendor/@akanjs/native/plugins/preferences/src/web.d.ts +2 -0
  246. package/types/vendor/@akanjs/native/plugins/preferences/src.d.ts +1 -0
  247. package/types/vendor/@akanjs/native/plugins/push/src/index.d.ts +57 -0
  248. package/types/vendor/@akanjs/native/plugins/push/src.d.ts +1 -0
  249. package/types/vendor/@akanjs/native/plugins/screen/src/desktop.d.ts +3 -0
  250. package/types/vendor/@akanjs/native/plugins/screen/src/index.d.ts +70 -0
  251. package/types/vendor/@akanjs/native/plugins/screen/src/web.d.ts +18 -0
  252. package/types/vendor/@akanjs/native/plugins/screen/src.d.ts +1 -0
  253. package/types/vendor/@akanjs/native/plugins/screen-orientation/src/index.d.ts +32 -0
  254. package/types/vendor/@akanjs/native/plugins/screen-orientation/src/types.d.ts +8 -0
  255. package/types/vendor/@akanjs/native/plugins/screen-orientation/src/web.d.ts +3 -0
  256. package/types/vendor/@akanjs/native/plugins/screen-orientation/src.d.ts +1 -0
  257. package/types/vendor/@akanjs/native/plugins/secure-storage/src/desktop.d.ts +16 -0
  258. package/types/vendor/@akanjs/native/plugins/secure-storage/src/index.d.ts +39 -0
  259. package/types/vendor/@akanjs/native/plugins/secure-storage/src.d.ts +1 -0
  260. package/types/vendor/@akanjs/native/plugins/share/src/index.d.ts +55 -0
  261. package/types/vendor/@akanjs/native/plugins/share/src/options.d.ts +6 -0
  262. package/types/vendor/@akanjs/native/plugins/share/src/web.d.ts +5 -0
  263. package/types/vendor/@akanjs/native/plugins/share/src.d.ts +1 -0
  264. package/types/vendor/@akanjs/native/plugins/single-instance/src/desktop.d.ts +8 -0
  265. package/types/vendor/@akanjs/native/plugins/single-instance/src/index.d.ts +25 -0
  266. package/types/vendor/@akanjs/native/plugins/single-instance/src/socket.d.ts +46 -0
  267. package/types/vendor/@akanjs/native/plugins/single-instance/src.d.ts +1 -0
  268. package/types/vendor/@akanjs/native/plugins/splash-screen/src/index.d.ts +19 -0
  269. package/types/vendor/@akanjs/native/plugins/splash-screen/src/web.d.ts +4 -0
  270. package/types/vendor/@akanjs/native/plugins/splash-screen/src.d.ts +1 -0
  271. package/types/vendor/@akanjs/native/plugins/sqlite/src/common.d.ts +34 -0
  272. package/types/vendor/@akanjs/native/plugins/sqlite/src/desktop.d.ts +6 -0
  273. package/types/vendor/@akanjs/native/plugins/sqlite/src/index.d.ts +115 -0
  274. package/types/vendor/@akanjs/native/plugins/sqlite/src.d.ts +1 -0
  275. package/types/vendor/@akanjs/native/plugins/toast/src/index.d.ts +30 -0
  276. package/types/vendor/@akanjs/native/plugins/toast/src/queue.d.ts +23 -0
  277. package/types/vendor/@akanjs/native/plugins/toast/src/web.d.ts +2 -0
  278. package/types/vendor/@akanjs/native/plugins/toast/src.d.ts +1 -0
  279. package/types/vendor/@akanjs/native/plugins/tray/src/desktop.d.ts +3 -0
  280. package/types/vendor/@akanjs/native/plugins/tray/src/index.d.ts +113 -0
  281. package/types/vendor/@akanjs/native/plugins/tray/src.d.ts +1 -0
  282. package/types/vendor/@akanjs/native/plugins/updates/src/desktop.d.ts +4 -0
  283. package/types/vendor/@akanjs/native/plugins/updates/src/index.d.ts +68 -0
  284. package/types/vendor/@akanjs/native/plugins/updates/src.d.ts +1 -0
  285. package/types/vendor/@akanjs/native/plugins/window/src/desktop.d.ts +6 -0
  286. package/types/vendor/@akanjs/native/plugins/window/src/index.d.ts +185 -0
  287. package/types/vendor/@akanjs/native/plugins/window/src/web.d.ts +2 -0
  288. package/types/vendor/@akanjs/native/plugins/window/src.d.ts +1 -0
  289. package/types/vendor/@akanjs/native/plugins/window-state/src/desktop.d.ts +7 -0
  290. package/types/vendor/@akanjs/native/plugins/window-state/src/index.d.ts +33 -0
  291. package/types/vendor/@akanjs/native/plugins/window-state/src/state.d.ts +39 -0
  292. package/types/vendor/@akanjs/native/plugins/window-state/src.d.ts +1 -0
  293. package/types/webkit/index.d.ts +0 -2
  294. package/types/webkit/nativeNavigation.d.ts +25 -0
  295. package/types/webkit/nativePurchase.d.ts +37 -0
  296. package/types/webkit/useCamera.d.ts +13 -15
  297. package/types/webkit/useGeoLocation.d.ts +4 -5
  298. package/types/webkit/usePurchase.d.ts +12 -16
  299. package/ui/Link/Anchor.tsx +2 -5
  300. package/ui/System/Client.tsx +2 -6
  301. package/vendor/@akanjs/native/LICENSE +21 -0
  302. package/vendor/@akanjs/native/README.ko.md +88 -0
  303. package/vendor/@akanjs/native/README.md +93 -0
  304. package/vendor/@akanjs/native/THIRD_PARTY_NOTICES.md +237 -0
  305. package/vendor/@akanjs/native/native/android/maven.lock.json +1751 -0
  306. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAcl.kt +243 -0
  307. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeActivity.kt +936 -0
  308. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeApplication.kt +189 -0
  309. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAssetServer.kt +225 -0
  310. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeBridge.kt +444 -0
  311. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeCompat.kt +55 -0
  312. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeContract.kt +99 -0
  313. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeEd25519.kt +100 -0
  314. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeFileProvider.kt +71 -0
  315. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeKernel.kt +324 -0
  316. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativePlugin.kt +361 -0
  317. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeSpec.kt +100 -0
  318. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeUpdates.kt +305 -0
  319. package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeVectors.kt +132 -0
  320. package/vendor/@akanjs/native/native/desktop/Cargo.lock +2565 -0
  321. package/vendor/@akanjs/native/native/desktop/Cargo.toml +49 -0
  322. package/vendor/@akanjs/native/native/desktop/build.rs +19 -0
  323. package/vendor/@akanjs/native/native/desktop/rust-toolchain.toml +7 -0
  324. package/vendor/@akanjs/native/native/desktop/src/accelerator.rs +466 -0
  325. package/vendor/@akanjs/native/native/desktop/src/autostart.rs +158 -0
  326. package/vendor/@akanjs/native/native/desktop/src/camera.rs +53 -0
  327. package/vendor/@akanjs/native/native/desktop/src/chrome.rs +710 -0
  328. package/vendor/@akanjs/native/native/desktop/src/contract.rs +105 -0
  329. package/vendor/@akanjs/native/native/desktop/src/devproxy.rs +234 -0
  330. package/vendor/@akanjs/native/native/desktop/src/dialog_args.rs +189 -0
  331. package/vendor/@akanjs/native/native/desktop/src/dock.rs +209 -0
  332. package/vendor/@akanjs/native/native/desktop/src/hotkey.rs +209 -0
  333. package/vendor/@akanjs/native/native/desktop/src/js_panels.rs +125 -0
  334. package/vendor/@akanjs/native/native/desktop/src/json.rs +272 -0
  335. package/vendor/@akanjs/native/native/desktop/src/keychain.rs +151 -0
  336. package/vendor/@akanjs/native/native/desktop/src/lib.rs +2185 -0
  337. package/vendor/@akanjs/native/native/desktop/src/linux/appearance.rs +177 -0
  338. package/vendor/@akanjs/native/native/desktop/src/linux/camera.rs +11 -0
  339. package/vendor/@akanjs/native/native/desktop/src/linux/clipboard.rs +48 -0
  340. package/vendor/@akanjs/native/native/desktop/src/linux/device.rs +9 -0
  341. package/vendor/@akanjs/native/native/desktop/src/linux/dialogs.rs +348 -0
  342. package/vendor/@akanjs/native/native/desktop/src/linux/dock.rs +146 -0
  343. package/vendor/@akanjs/native/native/desktop/src/linux/hotkey.rs +228 -0
  344. package/vendor/@akanjs/native/native/desktop/src/linux/keychain.rs +243 -0
  345. package/vendor/@akanjs/native/native/desktop/src/linux/menu.rs +445 -0
  346. package/vendor/@akanjs/native/native/desktop/src/linux/mod.rs +116 -0
  347. package/vendor/@akanjs/native/native/desktop/src/linux/notify.rs +211 -0
  348. package/vendor/@akanjs/native/native/desktop/src/linux/open.rs +79 -0
  349. package/vendor/@akanjs/native/native/desktop/src/linux/power.rs +155 -0
  350. package/vendor/@akanjs/native/native/desktop/src/linux/screen.rs +158 -0
  351. package/vendor/@akanjs/native/native/desktop/src/linux/tray.rs +604 -0
  352. package/vendor/@akanjs/native/native/desktop/src/menu.rs +517 -0
  353. package/vendor/@akanjs/native/native/desktop/src/navigation.rs +381 -0
  354. package/vendor/@akanjs/native/native/desktop/src/notify.rs +411 -0
  355. package/vendor/@akanjs/native/native/desktop/src/notify_schedule.rs +382 -0
  356. package/vendor/@akanjs/native/native/desktop/src/page_menu.rs +287 -0
  357. package/vendor/@akanjs/native/native/desktop/src/panels.rs +333 -0
  358. package/vendor/@akanjs/native/native/desktop/src/placement.rs +92 -0
  359. package/vendor/@akanjs/native/native/desktop/src/routes.rs +153 -0
  360. package/vendor/@akanjs/native/native/desktop/src/screen.rs +190 -0
  361. package/vendor/@akanjs/native/native/desktop/src/tray.rs +279 -0
  362. package/vendor/@akanjs/native/native/desktop/src/vectors.rs +126 -0
  363. package/vendor/@akanjs/native/native/desktop/src/win/appearance.rs +51 -0
  364. package/vendor/@akanjs/native/native/desktop/src/win/autostart.rs +77 -0
  365. package/vendor/@akanjs/native/native/desktop/src/win/camera.rs +34 -0
  366. package/vendor/@akanjs/native/native/desktop/src/win/clipboard.rs +106 -0
  367. package/vendor/@akanjs/native/native/desktop/src/win/device.rs +80 -0
  368. package/vendor/@akanjs/native/native/desktop/src/win/dialogs.rs +917 -0
  369. package/vendor/@akanjs/native/native/desktop/src/win/dock.rs +228 -0
  370. package/vendor/@akanjs/native/native/desktop/src/win/hotkey.rs +110 -0
  371. package/vendor/@akanjs/native/native/desktop/src/win/keychain.rs +103 -0
  372. package/vendor/@akanjs/native/native/desktop/src/win/menu.rs +500 -0
  373. package/vendor/@akanjs/native/native/desktop/src/win/mod.rs +100 -0
  374. package/vendor/@akanjs/native/native/desktop/src/win/msgwin.rs +86 -0
  375. package/vendor/@akanjs/native/native/desktop/src/win/notify.rs +334 -0
  376. package/vendor/@akanjs/native/native/desktop/src/win/open.rs +127 -0
  377. package/vendor/@akanjs/native/native/desktop/src/win/power.rs +64 -0
  378. package/vendor/@akanjs/native/native/desktop/src/win/registry.rs +87 -0
  379. package/vendor/@akanjs/native/native/desktop/src/win/screen.rs +127 -0
  380. package/vendor/@akanjs/native/native/desktop/src/win/tray.rs +280 -0
  381. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeAcl.swift +241 -0
  382. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeApp.swift +285 -0
  383. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeBridge.swift +407 -0
  384. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeContract.swift +106 -0
  385. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeKernel.swift +317 -0
  386. package/vendor/@akanjs/native/native/ios/Sources/AkanNativePlugin.swift +250 -0
  387. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSchemeHandler.swift +209 -0
  388. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeShell.swift +161 -0
  389. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSpec.swift +143 -0
  390. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeUpdates.swift +270 -0
  391. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeVectors.swift +155 -0
  392. package/vendor/@akanjs/native/native/ios/Sources/AkanNativeViewController.swift +371 -0
  393. package/vendor/@akanjs/native/packages/cli/src/api.ts +600 -0
  394. package/vendor/@akanjs/native/packages/cli/src/commands/build.ts +101 -0
  395. package/vendor/@akanjs/native/packages/cli/src/commands/compat.ts +53 -0
  396. package/vendor/@akanjs/native/packages/cli/src/commands/dev.ts +249 -0
  397. package/vendor/@akanjs/native/packages/cli/src/commands/doctor.ts +536 -0
  398. package/vendor/@akanjs/native/packages/cli/src/commands/plugin.ts +164 -0
  399. package/vendor/@akanjs/native/packages/cli/src/commands/signing.ts +32 -0
  400. package/vendor/@akanjs/native/packages/cli/src/commands/test.ts +130 -0
  401. package/vendor/@akanjs/native/packages/cli/src/commands/toolchain.ts +143 -0
  402. package/vendor/@akanjs/native/packages/cli/src/commands/update.ts +168 -0
  403. package/vendor/@akanjs/native/packages/cli/src/config.ts +257 -0
  404. package/vendor/@akanjs/native/packages/cli/src/index.ts +77 -0
  405. package/vendor/@akanjs/native/packages/cli/src/lib/acl.ts +420 -0
  406. package/vendor/@akanjs/native/packages/cli/src/lib/apilevel.ts +245 -0
  407. package/vendor/@akanjs/native/packages/cli/src/lib/apk.ts +203 -0
  408. package/vendor/@akanjs/native/packages/cli/src/lib/args.ts +44 -0
  409. package/vendor/@akanjs/native/packages/cli/src/lib/boot.ts +73 -0
  410. package/vendor/@akanjs/native/packages/cli/src/lib/chrome.ts +89 -0
  411. package/vendor/@akanjs/native/packages/cli/src/lib/codegen.ts +1128 -0
  412. package/vendor/@akanjs/native/packages/cli/src/lib/compat.ts +185 -0
  413. package/vendor/@akanjs/native/packages/cli/src/lib/configkeys.ts +91 -0
  414. package/vendor/@akanjs/native/packages/cli/src/lib/csp.ts +198 -0
  415. package/vendor/@akanjs/native/packages/cli/src/lib/env.ts +257 -0
  416. package/vendor/@akanjs/native/packages/cli/src/lib/exec.ts +104 -0
  417. package/vendor/@akanjs/native/packages/cli/src/lib/googleservices.ts +53 -0
  418. package/vendor/@akanjs/native/packages/cli/src/lib/hmr.ts +534 -0
  419. package/vendor/@akanjs/native/packages/cli/src/lib/html.ts +63 -0
  420. package/vendor/@akanjs/native/packages/cli/src/lib/icons.ts +316 -0
  421. package/vendor/@akanjs/native/packages/cli/src/lib/image.ts +175 -0
  422. package/vendor/@akanjs/native/packages/cli/src/lib/iossigning.ts +295 -0
  423. package/vendor/@akanjs/native/packages/cli/src/lib/launch.ts +98 -0
  424. package/vendor/@akanjs/native/packages/cli/src/lib/log.ts +105 -0
  425. package/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.ts +107 -0
  426. package/vendor/@akanjs/native/packages/cli/src/lib/maven.ts +244 -0
  427. package/vendor/@akanjs/native/packages/cli/src/lib/names.ts +202 -0
  428. package/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.ts +326 -0
  429. package/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.ts +68 -0
  430. package/vendor/@akanjs/native/packages/cli/src/lib/permissions.ts +80 -0
  431. package/vendor/@akanjs/native/packages/cli/src/lib/plist.ts +139 -0
  432. package/vendor/@akanjs/native/packages/cli/src/lib/png.ts +240 -0
  433. package/vendor/@akanjs/native/packages/cli/src/lib/prepare.ts +290 -0
  434. package/vendor/@akanjs/native/packages/cli/src/lib/privacy.ts +64 -0
  435. package/vendor/@akanjs/native/packages/cli/src/lib/project.ts +710 -0
  436. package/vendor/@akanjs/native/packages/cli/src/lib/root.ts +18 -0
  437. package/vendor/@akanjs/native/packages/cli/src/lib/routes.ts +3 -0
  438. package/vendor/@akanjs/native/packages/cli/src/lib/serve.ts +83 -0
  439. package/vendor/@akanjs/native/packages/cli/src/lib/signing.ts +117 -0
  440. package/vendor/@akanjs/native/packages/cli/src/lib/spec.ts +521 -0
  441. package/vendor/@akanjs/native/packages/cli/src/lib/toolchains.ts +579 -0
  442. package/vendor/@akanjs/native/packages/cli/src/lib/updates.ts +160 -0
  443. package/vendor/@akanjs/native/packages/cli/src/lib/vectors.ts +121 -0
  444. package/vendor/@akanjs/native/packages/cli/src/lib/xml.ts +72 -0
  445. package/vendor/@akanjs/native/packages/cli/src/platforms/android.ts +1320 -0
  446. package/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.ts +78 -0
  447. package/vendor/@akanjs/native/packages/cli/src/platforms/desktop.ts +279 -0
  448. package/vendor/@akanjs/native/packages/cli/src/platforms/index.ts +31 -0
  449. package/vendor/@akanjs/native/packages/cli/src/platforms/ios.ts +801 -0
  450. package/vendor/@akanjs/native/packages/cli/src/platforms/linux.ts +52 -0
  451. package/vendor/@akanjs/native/packages/cli/src/platforms/macos.ts +97 -0
  452. package/vendor/@akanjs/native/packages/cli/src/platforms/targets.ts +12 -0
  453. package/vendor/@akanjs/native/packages/cli/src/platforms/web-run.ts +69 -0
  454. package/vendor/@akanjs/native/packages/cli/src/platforms/web.ts +28 -0
  455. package/vendor/@akanjs/native/packages/cli/src/platforms/windows.ts +82 -0
  456. package/vendor/@akanjs/native/packages/core/contract.json +96 -0
  457. package/vendor/@akanjs/native/packages/core/src/acl.ts +272 -0
  458. package/vendor/@akanjs/native/packages/core/src/boot.ts +97 -0
  459. package/vendor/@akanjs/native/packages/core/src/contract.ts +100 -0
  460. package/vendor/@akanjs/native/packages/core/src/errors.ts +95 -0
  461. package/vendor/@akanjs/native/packages/core/src/files.ts +105 -0
  462. package/vendor/@akanjs/native/packages/core/src/index.ts +35 -0
  463. package/vendor/@akanjs/native/packages/core/src/kernel.ts +281 -0
  464. package/vendor/@akanjs/native/packages/core/src/live.ts +62 -0
  465. package/vendor/@akanjs/native/packages/core/src/mime.ts +8 -0
  466. package/vendor/@akanjs/native/packages/core/src/plugin.ts +358 -0
  467. package/vendor/@akanjs/native/packages/core/src/protocol.ts +194 -0
  468. package/vendor/@akanjs/native/packages/core/src/runtime.ts +520 -0
  469. package/vendor/@akanjs/native/packages/core/src/state.ts +46 -0
  470. package/vendor/@akanjs/native/packages/core/src/testing.ts +176 -0
  471. package/vendor/@akanjs/native/packages/core/src/version.ts +2 -0
  472. package/vendor/@akanjs/native/packages/core/src/veto.ts +55 -0
  473. package/vendor/@akanjs/native/packages/core/vectors/acl.json +57 -0
  474. package/vendor/@akanjs/native/packages/core/vectors/bridge.json +76 -0
  475. package/vendor/@akanjs/native/packages/core/vectors/ed25519.json +29 -0
  476. package/vendor/@akanjs/native/packages/core/vectors/ids.json +73 -0
  477. package/vendor/@akanjs/native/packages/core/vectors/navigation.json +75 -0
  478. package/vendor/@akanjs/native/packages/core/vectors/ranges.json +39 -0
  479. package/vendor/@akanjs/native/packages/core/vectors/retained.json +17 -0
  480. package/vendor/@akanjs/native/packages/core/vectors/routes.json +66 -0
  481. package/vendor/@akanjs/native/packages/core/vectors/scope.json +143 -0
  482. package/vendor/@akanjs/native/packages/desktop/src/deeplinks.ts +143 -0
  483. package/vendor/@akanjs/native/packages/desktop/src/delta.ts +174 -0
  484. package/vendor/@akanjs/native/packages/desktop/src/dispatcher.ts +679 -0
  485. package/vendor/@akanjs/native/packages/desktop/src/ffi.ts +76 -0
  486. package/vendor/@akanjs/native/packages/desktop/src/host.ts +355 -0
  487. package/vendor/@akanjs/native/packages/desktop/src/lifecycle.ts +142 -0
  488. package/vendor/@akanjs/native/packages/desktop/src/main.ts +133 -0
  489. package/vendor/@akanjs/native/packages/desktop/src/page-veto.ts +103 -0
  490. package/vendor/@akanjs/native/packages/desktop/src/paths.ts +59 -0
  491. package/vendor/@akanjs/native/packages/desktop/src/plugin.ts +232 -0
  492. package/vendor/@akanjs/native/packages/react/src/index.ts +23 -0
  493. package/vendor/@akanjs/native/plugins/accessibility/android/AccessibilityPlugin.kt +96 -0
  494. package/vendor/@akanjs/native/plugins/accessibility/ios/AccessibilityPlugin.swift +92 -0
  495. package/vendor/@akanjs/native/plugins/accessibility/native-plugin.json +21 -0
  496. package/vendor/@akanjs/native/plugins/accessibility/src/announce.ts +71 -0
  497. package/vendor/@akanjs/native/plugins/accessibility/src/index.ts +77 -0
  498. package/vendor/@akanjs/native/plugins/accessibility/src/web.ts +52 -0
  499. package/vendor/@akanjs/native/plugins/app/android/AppPlugin.kt +72 -0
  500. package/vendor/@akanjs/native/plugins/app/ios/AppPlugin.swift +52 -0
  501. package/vendor/@akanjs/native/plugins/app/native-plugin.json +21 -0
  502. package/vendor/@akanjs/native/plugins/app/src/desktop.ts +64 -0
  503. package/vendor/@akanjs/native/plugins/app/src/index.ts +77 -0
  504. package/vendor/@akanjs/native/plugins/app/src/web.ts +12 -0
  505. package/vendor/@akanjs/native/plugins/app-state/android/AppStatePlugin.kt +54 -0
  506. package/vendor/@akanjs/native/plugins/app-state/ios/AppStatePlugin.swift +58 -0
  507. package/vendor/@akanjs/native/plugins/app-state/native-plugin.json +17 -0
  508. package/vendor/@akanjs/native/plugins/app-state/src/index.ts +42 -0
  509. package/vendor/@akanjs/native/plugins/app-state/src/web.ts +33 -0
  510. package/vendor/@akanjs/native/plugins/appearance/android/AppearancePlugin.kt +133 -0
  511. package/vendor/@akanjs/native/plugins/appearance/ios/AppearancePlugin.swift +109 -0
  512. package/vendor/@akanjs/native/plugins/appearance/native-plugin.json +18 -0
  513. package/vendor/@akanjs/native/plugins/appearance/src/desktop.ts +133 -0
  514. package/vendor/@akanjs/native/plugins/appearance/src/index.ts +62 -0
  515. package/vendor/@akanjs/native/plugins/appearance/src/setting.ts +18 -0
  516. package/vendor/@akanjs/native/plugins/appearance/src/web.ts +25 -0
  517. package/vendor/@akanjs/native/plugins/auth-session/android/AuthSessionPlugin.kt +171 -0
  518. package/vendor/@akanjs/native/plugins/auth-session/ios/AuthSessionPlugin.swift +112 -0
  519. package/vendor/@akanjs/native/plugins/auth-session/native-plugin.json +19 -0
  520. package/vendor/@akanjs/native/plugins/auth-session/src/args.ts +62 -0
  521. package/vendor/@akanjs/native/plugins/auth-session/src/desktop.ts +133 -0
  522. package/vendor/@akanjs/native/plugins/auth-session/src/index.ts +39 -0
  523. package/vendor/@akanjs/native/plugins/autostart/native-plugin.json +10 -0
  524. package/vendor/@akanjs/native/plugins/autostart/src/desktop.ts +189 -0
  525. package/vendor/@akanjs/native/plugins/autostart/src/index.ts +51 -0
  526. package/vendor/@akanjs/native/plugins/badge/ios/BadgePlugin.swift +92 -0
  527. package/vendor/@akanjs/native/plugins/badge/native-plugin.json +15 -0
  528. package/vendor/@akanjs/native/plugins/badge/src/count.ts +12 -0
  529. package/vendor/@akanjs/native/plugins/badge/src/desktop.ts +24 -0
  530. package/vendor/@akanjs/native/plugins/badge/src/index.ts +40 -0
  531. package/vendor/@akanjs/native/plugins/badge/src/web.ts +37 -0
  532. package/vendor/@akanjs/native/plugins/biometric/android/BiometricPlugin.kt +179 -0
  533. package/vendor/@akanjs/native/plugins/biometric/ios/BiometricPlugin.swift +129 -0
  534. package/vendor/@akanjs/native/plugins/biometric/native-plugin.json +22 -0
  535. package/vendor/@akanjs/native/plugins/biometric/src/index.ts +100 -0
  536. package/vendor/@akanjs/native/plugins/browser/android/BrowserPlugin.kt +178 -0
  537. package/vendor/@akanjs/native/plugins/browser/ios/BrowserPlugin.swift +63 -0
  538. package/vendor/@akanjs/native/plugins/browser/native-plugin.json +22 -0
  539. package/vendor/@akanjs/native/plugins/browser/src/args.ts +34 -0
  540. package/vendor/@akanjs/native/plugins/browser/src/desktop.ts +40 -0
  541. package/vendor/@akanjs/native/plugins/browser/src/index.ts +47 -0
  542. package/vendor/@akanjs/native/plugins/browser/src/web.ts +60 -0
  543. package/vendor/@akanjs/native/plugins/camera/android/CameraPlugin.kt +365 -0
  544. package/vendor/@akanjs/native/plugins/camera/ios/CameraPlugin.swift +296 -0
  545. package/vendor/@akanjs/native/plugins/camera/native-plugin.json +32 -0
  546. package/vendor/@akanjs/native/plugins/camera/src/desktop.ts +27 -0
  547. package/vendor/@akanjs/native/plugins/camera/src/index.ts +85 -0
  548. package/vendor/@akanjs/native/plugins/camera/src/web.ts +267 -0
  549. package/vendor/@akanjs/native/plugins/clipboard/android/ClipboardPlugin.kt +51 -0
  550. package/vendor/@akanjs/native/plugins/clipboard/ios/ClipboardPlugin.swift +35 -0
  551. package/vendor/@akanjs/native/plugins/clipboard/native-plugin.json +17 -0
  552. package/vendor/@akanjs/native/plugins/clipboard/src/desktop.ts +66 -0
  553. package/vendor/@akanjs/native/plugins/clipboard/src/index.ts +72 -0
  554. package/vendor/@akanjs/native/plugins/clipboard/src/web.ts +69 -0
  555. package/vendor/@akanjs/native/plugins/device/android/DevicePlugin.kt +70 -0
  556. package/vendor/@akanjs/native/plugins/device/ios/DevicePlugin.swift +80 -0
  557. package/vendor/@akanjs/native/plugins/device/native-plugin.json +18 -0
  558. package/vendor/@akanjs/native/plugins/device/src/desktop.ts +276 -0
  559. package/vendor/@akanjs/native/plugins/device/src/index.ts +72 -0
  560. package/vendor/@akanjs/native/plugins/device/src/web.ts +162 -0
  561. package/vendor/@akanjs/native/plugins/dialog/android/DialogPlugin.kt +260 -0
  562. package/vendor/@akanjs/native/plugins/dialog/ios/DialogPlugin.swift +198 -0
  563. package/vendor/@akanjs/native/plugins/dialog/native-plugin.json +18 -0
  564. package/vendor/@akanjs/native/plugins/dialog/src/desktop.ts +80 -0
  565. package/vendor/@akanjs/native/plugins/dialog/src/index.ts +87 -0
  566. package/vendor/@akanjs/native/plugins/dialog/src/options.ts +111 -0
  567. package/vendor/@akanjs/native/plugins/dialog/src/web.ts +296 -0
  568. package/vendor/@akanjs/native/plugins/dock/native-plugin.json +10 -0
  569. package/vendor/@akanjs/native/plugins/dock/src/desktop.ts +34 -0
  570. package/vendor/@akanjs/native/plugins/dock/src/index.ts +46 -0
  571. package/vendor/@akanjs/native/plugins/file-picker/android/FilePickerPlugin.kt +316 -0
  572. package/vendor/@akanjs/native/plugins/file-picker/ios/FilePickerPlugin.swift +366 -0
  573. package/vendor/@akanjs/native/plugins/file-picker/native-plugin.json +18 -0
  574. package/vendor/@akanjs/native/plugins/file-picker/src/common.ts +125 -0
  575. package/vendor/@akanjs/native/plugins/file-picker/src/desktop.ts +164 -0
  576. package/vendor/@akanjs/native/plugins/file-picker/src/index.ts +187 -0
  577. package/vendor/@akanjs/native/plugins/file-picker/src/web.ts +158 -0
  578. package/vendor/@akanjs/native/plugins/filesystem/android/FilesystemPlugin.kt +561 -0
  579. package/vendor/@akanjs/native/plugins/filesystem/ios/FilesystemPlugin.swift +596 -0
  580. package/vendor/@akanjs/native/plugins/filesystem/native-plugin.json +45 -0
  581. package/vendor/@akanjs/native/plugins/filesystem/src/common.ts +150 -0
  582. package/vendor/@akanjs/native/plugins/filesystem/src/desktop.ts +438 -0
  583. package/vendor/@akanjs/native/plugins/filesystem/src/index.ts +179 -0
  584. package/vendor/@akanjs/native/plugins/filesystem/src/web.ts +334 -0
  585. package/vendor/@akanjs/native/plugins/geolocation/android/GeolocationPlugin.kt +360 -0
  586. package/vendor/@akanjs/native/plugins/geolocation/ios/GeolocationPlugin.swift +284 -0
  587. package/vendor/@akanjs/native/plugins/geolocation/native-plugin.json +23 -0
  588. package/vendor/@akanjs/native/plugins/geolocation/src/index.ts +155 -0
  589. package/vendor/@akanjs/native/plugins/geolocation/src/web.ts +132 -0
  590. package/vendor/@akanjs/native/plugins/global-shortcut/native-plugin.json +10 -0
  591. package/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.ts +36 -0
  592. package/vendor/@akanjs/native/plugins/global-shortcut/src/index.ts +55 -0
  593. package/vendor/@akanjs/native/plugins/haptics/android/HapticsPlugin.kt +127 -0
  594. package/vendor/@akanjs/native/plugins/haptics/ios/HapticsPlugin.swift +127 -0
  595. package/vendor/@akanjs/native/plugins/haptics/native-plugin.json +19 -0
  596. package/vendor/@akanjs/native/plugins/haptics/src/index.ts +34 -0
  597. package/vendor/@akanjs/native/plugins/haptics/src/web.ts +53 -0
  598. package/vendor/@akanjs/native/plugins/http/android/HttpPlugin.kt +234 -0
  599. package/vendor/@akanjs/native/plugins/http/android/HttpUrl.kt +182 -0
  600. package/vendor/@akanjs/native/plugins/http/ios/HttpPlugin.swift +228 -0
  601. package/vendor/@akanjs/native/plugins/http/ios/HttpUrl.swift +166 -0
  602. package/vendor/@akanjs/native/plugins/http/native-plugin.json +27 -0
  603. package/vendor/@akanjs/native/plugins/http/src/common.ts +294 -0
  604. package/vendor/@akanjs/native/plugins/http/src/desktop.ts +69 -0
  605. package/vendor/@akanjs/native/plugins/http/src/index.ts +181 -0
  606. package/vendor/@akanjs/native/plugins/http/src/web.ts +40 -0
  607. package/vendor/@akanjs/native/plugins/iap/android/IapPlugin.kt +358 -0
  608. package/vendor/@akanjs/native/plugins/iap/ios/IapPlugin.swift +306 -0
  609. package/vendor/@akanjs/native/plugins/iap/native-plugin.json +28 -0
  610. package/vendor/@akanjs/native/plugins/iap/src/index.ts +206 -0
  611. package/vendor/@akanjs/native/plugins/keep-awake/android/KeepAwakePlugin.kt +48 -0
  612. package/vendor/@akanjs/native/plugins/keep-awake/ios/KeepAwakePlugin.swift +36 -0
  613. package/vendor/@akanjs/native/plugins/keep-awake/native-plugin.json +17 -0
  614. package/vendor/@akanjs/native/plugins/keep-awake/src/desktop.ts +127 -0
  615. package/vendor/@akanjs/native/plugins/keep-awake/src/index.ts +79 -0
  616. package/vendor/@akanjs/native/plugins/keep-awake/src/web.ts +78 -0
  617. package/vendor/@akanjs/native/plugins/keyboard/android/KeyboardPlugin.kt +77 -0
  618. package/vendor/@akanjs/native/plugins/keyboard/ios/KeyboardPlugin.swift +93 -0
  619. package/vendor/@akanjs/native/plugins/keyboard/native-plugin.json +18 -0
  620. package/vendor/@akanjs/native/plugins/keyboard/src/index.ts +78 -0
  621. package/vendor/@akanjs/native/plugins/keyboard/src/web.ts +57 -0
  622. package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationReceiver.kt +38 -0
  623. package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotifications.kt +284 -0
  624. package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationsPlugin.kt +248 -0
  625. package/vendor/@akanjs/native/plugins/local-notifications/ios/LocalNotificationsPlugin.swift +279 -0
  626. package/vendor/@akanjs/native/plugins/local-notifications/native-plugin.json +35 -0
  627. package/vendor/@akanjs/native/plugins/local-notifications/src/desktop.ts +196 -0
  628. package/vendor/@akanjs/native/plugins/local-notifications/src/index.ts +174 -0
  629. package/vendor/@akanjs/native/plugins/local-notifications/src/schedule.ts +164 -0
  630. package/vendor/@akanjs/native/plugins/local-notifications/src/timers.ts +72 -0
  631. package/vendor/@akanjs/native/plugins/local-notifications/src/web.ts +158 -0
  632. package/vendor/@akanjs/native/plugins/menu/native-plugin.json +10 -0
  633. package/vendor/@akanjs/native/plugins/menu/src/desktop.ts +52 -0
  634. package/vendor/@akanjs/native/plugins/menu/src/index.ts +107 -0
  635. package/vendor/@akanjs/native/plugins/network/android/NetworkPlugin.kt +124 -0
  636. package/vendor/@akanjs/native/plugins/network/ios/NetworkPlugin.swift +82 -0
  637. package/vendor/@akanjs/native/plugins/network/native-plugin.json +19 -0
  638. package/vendor/@akanjs/native/plugins/network/src/index.ts +59 -0
  639. package/vendor/@akanjs/native/plugins/network/src/web.ts +43 -0
  640. package/vendor/@akanjs/native/plugins/opener/android/OpenerPlugin.kt +81 -0
  641. package/vendor/@akanjs/native/plugins/opener/ios/OpenerPlugin.swift +83 -0
  642. package/vendor/@akanjs/native/plugins/opener/native-plugin.json +25 -0
  643. package/vendor/@akanjs/native/plugins/opener/src/desktop.ts +88 -0
  644. package/vendor/@akanjs/native/plugins/opener/src/index.ts +35 -0
  645. package/vendor/@akanjs/native/plugins/opener/src/url.ts +39 -0
  646. package/vendor/@akanjs/native/plugins/opener/src/web.ts +33 -0
  647. package/vendor/@akanjs/native/plugins/preferences/android/PreferencesPlugin.kt +44 -0
  648. package/vendor/@akanjs/native/plugins/preferences/ios/PreferencesPlugin.swift +47 -0
  649. package/vendor/@akanjs/native/plugins/preferences/native-plugin.json +18 -0
  650. package/vendor/@akanjs/native/plugins/preferences/src/desktop.ts +59 -0
  651. package/vendor/@akanjs/native/plugins/preferences/src/index.ts +75 -0
  652. package/vendor/@akanjs/native/plugins/preferences/src/web.ts +55 -0
  653. package/vendor/@akanjs/native/plugins/push/android/AkanNativeMessagingService.kt +17 -0
  654. package/vendor/@akanjs/native/plugins/push/android/PushPlugin.kt +257 -0
  655. package/vendor/@akanjs/native/plugins/push/ios/PushPlugin.swift +169 -0
  656. package/vendor/@akanjs/native/plugins/push/native-plugin.json +23 -0
  657. package/vendor/@akanjs/native/plugins/push/src/index.ts +73 -0
  658. package/vendor/@akanjs/native/plugins/screen/native-plugin.json +10 -0
  659. package/vendor/@akanjs/native/plugins/screen/src/desktop.ts +50 -0
  660. package/vendor/@akanjs/native/plugins/screen/src/index.ts +107 -0
  661. package/vendor/@akanjs/native/plugins/screen/src/web.ts +92 -0
  662. package/vendor/@akanjs/native/plugins/screen-orientation/android/ScreenOrientationPlugin.kt +113 -0
  663. package/vendor/@akanjs/native/plugins/screen-orientation/ios/ScreenOrientationPlugin.swift +150 -0
  664. package/vendor/@akanjs/native/plugins/screen-orientation/native-plugin.json +17 -0
  665. package/vendor/@akanjs/native/plugins/screen-orientation/src/index.ts +69 -0
  666. package/vendor/@akanjs/native/plugins/screen-orientation/src/types.ts +26 -0
  667. package/vendor/@akanjs/native/plugins/screen-orientation/src/web.ts +67 -0
  668. package/vendor/@akanjs/native/plugins/secure-storage/android/SecureStoragePlugin.kt +184 -0
  669. package/vendor/@akanjs/native/plugins/secure-storage/ios/SecureStoragePlugin.swift +145 -0
  670. package/vendor/@akanjs/native/plugins/secure-storage/native-plugin.json +18 -0
  671. package/vendor/@akanjs/native/plugins/secure-storage/src/desktop.ts +332 -0
  672. package/vendor/@akanjs/native/plugins/secure-storage/src/index.ts +33 -0
  673. package/vendor/@akanjs/native/plugins/share/android/SharePlugin.kt +218 -0
  674. package/vendor/@akanjs/native/plugins/share/ios/SharePlugin.swift +142 -0
  675. package/vendor/@akanjs/native/plugins/share/native-plugin.json +18 -0
  676. package/vendor/@akanjs/native/plugins/share/src/index.ts +87 -0
  677. package/vendor/@akanjs/native/plugins/share/src/options.ts +43 -0
  678. package/vendor/@akanjs/native/plugins/share/src/web.ts +116 -0
  679. package/vendor/@akanjs/native/plugins/single-instance/native-plugin.json +10 -0
  680. package/vendor/@akanjs/native/plugins/single-instance/src/desktop.ts +63 -0
  681. package/vendor/@akanjs/native/plugins/single-instance/src/index.ts +32 -0
  682. package/vendor/@akanjs/native/plugins/single-instance/src/socket.ts +248 -0
  683. package/vendor/@akanjs/native/plugins/splash-screen/android/SplashScreenPlugin.kt +19 -0
  684. package/vendor/@akanjs/native/plugins/splash-screen/ios/SplashScreenPlugin.swift +20 -0
  685. package/vendor/@akanjs/native/plugins/splash-screen/native-plugin.json +17 -0
  686. package/vendor/@akanjs/native/plugins/splash-screen/src/index.ts +24 -0
  687. package/vendor/@akanjs/native/plugins/splash-screen/src/web.ts +17 -0
  688. package/vendor/@akanjs/native/plugins/sqlite/android/SqlStatements.kt +121 -0
  689. package/vendor/@akanjs/native/plugins/sqlite/android/SqlitePlugin.kt +327 -0
  690. package/vendor/@akanjs/native/plugins/sqlite/ios/SqlitePlugin.swift +361 -0
  691. package/vendor/@akanjs/native/plugins/sqlite/native-plugin.json +18 -0
  692. package/vendor/@akanjs/native/plugins/sqlite/src/common.ts +221 -0
  693. package/vendor/@akanjs/native/plugins/sqlite/src/desktop.ts +140 -0
  694. package/vendor/@akanjs/native/plugins/sqlite/src/index.ts +114 -0
  695. package/vendor/@akanjs/native/plugins/toast/android/ToastPlugin.kt +27 -0
  696. package/vendor/@akanjs/native/plugins/toast/native-plugin.json +14 -0
  697. package/vendor/@akanjs/native/plugins/toast/src/index.ts +41 -0
  698. package/vendor/@akanjs/native/plugins/toast/src/queue.ts +77 -0
  699. package/vendor/@akanjs/native/plugins/toast/src/web.ts +130 -0
  700. package/vendor/@akanjs/native/plugins/tray/native-plugin.json +10 -0
  701. package/vendor/@akanjs/native/plugins/tray/src/desktop.ts +73 -0
  702. package/vendor/@akanjs/native/plugins/tray/src/index.ts +111 -0
  703. package/vendor/@akanjs/native/plugins/updates/android/UpdatesPlugin.kt +290 -0
  704. package/vendor/@akanjs/native/plugins/updates/ios/UpdatesPlugin.swift +292 -0
  705. package/vendor/@akanjs/native/plugins/updates/native-plugin.json +19 -0
  706. package/vendor/@akanjs/native/plugins/updates/src/desktop.ts +558 -0
  707. package/vendor/@akanjs/native/plugins/updates/src/index.ts +95 -0
  708. package/vendor/@akanjs/native/plugins/window/native-plugin.json +32 -0
  709. package/vendor/@akanjs/native/plugins/window/src/desktop.ts +170 -0
  710. package/vendor/@akanjs/native/plugins/window/src/index.ts +342 -0
  711. package/vendor/@akanjs/native/plugins/window/src/web.ts +43 -0
  712. package/vendor/@akanjs/native/plugins/window-state/native-plugin.json +10 -0
  713. package/vendor/@akanjs/native/plugins/window-state/src/desktop.ts +73 -0
  714. package/vendor/@akanjs/native/plugins/window-state/src/index.ts +35 -0
  715. package/vendor/@akanjs/native/plugins/window-state/src/state.ts +146 -0
  716. package/webkit/bootCsr.tsx +26 -14
  717. package/webkit/index.ts +0 -2
  718. package/webkit/nativeNavigation.ts +116 -0
  719. package/webkit/nativePurchase.ts +93 -0
  720. package/webkit/useCamera.tsx +76 -71
  721. package/webkit/useCsrValues.ts +10 -124
  722. package/webkit/useGeoLocation.tsx +11 -13
  723. package/webkit/usePurchase.tsx +68 -123
  724. package/capacitor.base.config.ts +0 -140
  725. package/client/capacitor.ts +0 -252
  726. package/types/capacitor.base.config.d.ts +0 -3
  727. package/types/client/capacitor.d.ts +0 -290
  728. package/types/webkit/useCodepush.d.ts +0 -16
  729. package/types/webkit/useContact.d.ts +0 -11
  730. package/webkit/useCodepush.tsx +0 -76
  731. 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
+ }