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,81 @@
1
+ package com.akanjs.plugins.opener
2
+
3
+ import android.content.ActivityNotFoundException
4
+ import android.content.Intent
5
+ import android.net.Uri
6
+ import android.provider.Settings
7
+ import com.akanjs.runtime.AkanNativeErrorCode
8
+ import com.akanjs.runtime.AkanNativeExternal
9
+ import com.akanjs.runtime.AkanNativePluginContext
10
+ import com.akanjs.runtime.AkanNativeReply
11
+ import com.akanjs.runtime.AkanNativeVoidReply
12
+
13
+ /**
14
+ * ACTION_VIEW for http, https, mailto and tel (src/url.ts and the iOS plugin check the same list).
15
+ * - normalizeScheme() first: intent filters match the scheme case-sensitively, and a new task for
16
+ * the other app (react-native IntentModule.kt:124, :255-279).
17
+ * - CATEGORY_BROWSABLE as for links the page follows (shell SH-4): only activities that accept
18
+ * links from a browser can be started this way.
19
+ * - No handler throws ActivityNotFoundException: NOT_FOUND. startActivity needs no package
20
+ * visibility, so this works without <queries>.
21
+ * - openSettings: ACTION_APPLICATION_DETAILS_SETTINGS for this package (IntentModule.kt:169-189).
22
+ * - canOpenUrl is not in native-plugin.json: since Android 11 resolveActivity() sees other apps only if
23
+ * the manifest lists them in <queries> (capacitor-plugins/app-launcher/README.md), which plugin
24
+ * manifests cannot add yet. canOpen() below is what it will run once they can (the generated
25
+ * OpenerPluginSpec then declares it too).
26
+ * Arguments arrive decoded by the generated OpenerPluginSpec (PL-10); the URL checks stay here.
27
+ */
28
+ class OpenerPlugin(private val context: AkanNativePluginContext) : OpenerPluginSpec {
29
+ override fun openUrl(args: OpenerOpenUrlArgs, reply: AkanNativeVoidReply) {
30
+ val uri = uri(args.url, reply) ?: return
31
+ // PL-11 scopes { url }: matched on the URL normalized like the JS URL class does.
32
+ if (reply.call.inScope(mapOf("url" to normalized(uri)), urlFields = setOf("url"), what = uri.toString())) start(reply, view(uri))
33
+ }
34
+
35
+ override fun openSettings(reply: AkanNativeVoidReply) = start(
36
+ reply,
37
+ Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.fromParts("package", context.activity.packageName, null))
38
+ .addCategory(Intent.CATEGORY_DEFAULT)
39
+ .addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY or Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS),
40
+ )
41
+
42
+ @Suppress("unused") // canOpenUrl, once the manifest can declare <queries> (see above)
43
+ private fun canOpen(uri: Uri): Boolean = view(uri).resolveActivity(context.activity.packageManager) != null
44
+
45
+ private fun view(uri: Uri) = Intent(Intent.ACTION_VIEW, uri).addCategory(Intent.CATEGORY_BROWSABLE)
46
+
47
+ private fun start(reply: AkanNativeVoidReply, intent: Intent) {
48
+ if (!AkanNativeExternal.allowed()) return reply.reject(AkanNativeErrorCode.NOT_ALLOWED, "at most one URL per second leaves the app; try again later")
49
+ try {
50
+ context.activity.startActivity(intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK))
51
+ reply.resolve()
52
+ } catch (e: ActivityNotFoundException) {
53
+ reply.reject(AkanNativeErrorCode.NOT_FOUND, "no app can open ${intent.data}")
54
+ } catch (e: SecurityException) {
55
+ reply.reject(AkanNativeErrorCode.PERMISSION_DENIED, e.message ?: "not allowed to open ${intent.data}")
56
+ }
57
+ }
58
+
59
+ /** Lowercase scheme and host, "/" as the path of a bare http(s) host: the same text `new URL(u).href` gives. */
60
+ private fun normalized(uri: Uri): String {
61
+ var b = uri.buildUpon().scheme(uri.scheme?.lowercase())
62
+ uri.encodedAuthority?.let { b = b.encodedAuthority(it.lowercase()) }
63
+ if (uri.scheme?.startsWith("http") == true && uri.encodedPath.isNullOrEmpty()) b = b.encodedPath("/")
64
+ return b.build().toString()
65
+ }
66
+
67
+ /** The checked URI with a normalized scheme, or null after rejecting the call. */
68
+ private fun uri(text: String, reply: AkanNativeReply<*>): Uri? {
69
+ val uri = if (text.isEmpty()) null else Uri.parse(text).normalizeScheme()
70
+ val scheme = uri?.scheme
71
+ val problem = when {
72
+ uri == null || scheme == null || !uri.isAbsolute -> "url must be an absolute URL"
73
+ scheme !in AkanNativeExternal.schemes -> "only ${AkanNativeExternal.schemes.joinToString(", ")} URLs can be opened (got $scheme:)"
74
+ scheme.startsWith("http") && uri.host.isNullOrEmpty() -> "$text has no host"
75
+ else -> return uri
76
+ }
77
+ reply.reject(AkanNativeErrorCode.INVALID_ARGS, problem)
78
+ return null
79
+ }
80
+
81
+ }
@@ -0,0 +1,83 @@
1
+ import UIKit
2
+
3
+ /// UIApplication.open for http, https, mailto and tel (the default set of
4
+ /// tauri-plugins-workspace/plugins/opener/permissions/allow-default-urls.toml; src/url.ts checks the same).
5
+ /// - Opens only while the scene is foregroundActive, like the shell's external links (SH-4,
6
+ /// capacitor/ios/Capacitor/Capacitor/WebViewDelegationHandler.swift:67-125).
7
+ /// - The completion reports whether an app took the URL: false (tel: on a simulator or iPad) is NOT_FOUND.
8
+ /// - canOpenURL answers false for schemes missing from LSApplicationQueriesSchemes
9
+ /// (capacitor-plugins/app-launcher/src/definitions.ts). That list is for other apps' custom
10
+ /// schemes, which this plugin refuses anyway; http(s)/mailto/tel are expected to work without an
11
+ /// entry (not yet confirmed on the simulator: see the self-test).
12
+ /// Arguments arrive decoded by the generated OpenerPluginSpec (PL-10); the URL checks stay here.
13
+ final class OpenerPlugin: OpenerPluginSpec {
14
+ static let id = "opener"
15
+ /// The shell's external list: http, https, mailto, tel and security.shell.externalSchemes (L0).
16
+ private static var schemes: [String] { AkanNativeExternal.schemes }
17
+ private let context: AkanNativePluginContext
18
+
19
+ init(context: AkanNativePluginContext) {
20
+ self.context = context
21
+ }
22
+
23
+ func openUrl(_ args: OpenerOpenUrlArgs, _ reply: AkanNativeReply<Void>) {
24
+ guard let url = url(args.url, reply) else { return }
25
+ // PL-11 scopes { url }: matched on the URL normalized like the JS URL class does.
26
+ guard reply.call.inScope(["url": Self.normalized(url)], urlFields: ["url"], what: url.absoluteString) else { return }
27
+ open(url, reply)
28
+ }
29
+
30
+ func canOpenUrl(_ args: OpenerCanOpenUrlArgs, _ reply: AkanNativeReply<OpenerCanOpenUrlResult>) {
31
+ guard let url = url(args.url, reply) else { return }
32
+ reply.resolve(OpenerCanOpenUrlResult(value: UIApplication.shared.canOpenURL(url)))
33
+ }
34
+
35
+ func openSettings(_ reply: AkanNativeReply<Void>) {
36
+ open(URL(string: UIApplication.openSettingsURLString)!, reply)
37
+ }
38
+
39
+ private func open(_ url: URL, _ reply: AkanNativeReply<Void>) {
40
+ guard context.windowScene?.activationState == .foregroundActive else {
41
+ return reply.reject(.permissionDenied, "URLs can be opened only while the app is in the foreground")
42
+ }
43
+ guard AkanNativeExternal.allowed() else { return reply.reject(.notAllowed, "at most one URL per second leaves the app; try again later") }
44
+ UIApplication.shared.open(url, options: [:]) { opened in
45
+ if opened {
46
+ reply.resolve()
47
+ } else {
48
+ reply.reject(.notFound, "no app can open \(url.absoluteString)")
49
+ }
50
+ }
51
+ }
52
+
53
+ /// Lowercase scheme and host, "/" as the path of a bare http(s) host: the same text `new URL(u).href` gives.
54
+ static func normalized(_ url: URL) -> String {
55
+ guard var parts = URLComponents(url: url, resolvingAgainstBaseURL: false) else { return url.absoluteString }
56
+ parts.scheme = parts.scheme?.lowercased()
57
+ parts.host = parts.host?.lowercased()
58
+ if parts.scheme?.hasPrefix("http") == true, parts.path.isEmpty { parts.path = "/" }
59
+ return parts.string ?? url.absoluteString
60
+ }
61
+
62
+ /// The checked URL with a lowercase scheme, or nil after rejecting the call.
63
+ private func url<T>(_ text: String, _ reply: AkanNativeReply<T>) -> URL? {
64
+ guard !text.isEmpty, var parts = URLComponents(string: text), let scheme = parts.scheme?.lowercased() else {
65
+ reply.reject(.invalidArgs, "url must be an absolute URL")
66
+ return nil
67
+ }
68
+ guard Self.schemes.contains(scheme) else {
69
+ reply.reject(.invalidArgs, "only \(Self.schemes.joined(separator: ", ")) URLs can be opened (got \(scheme):)")
70
+ return nil
71
+ }
72
+ if scheme.hasPrefix("http"), parts.host?.isEmpty ?? true {
73
+ reply.reject(.invalidArgs, "\(text) has no host")
74
+ return nil
75
+ }
76
+ parts.scheme = scheme
77
+ guard let url = parts.url else {
78
+ reply.reject(.invalidArgs, "url must be an absolute URL")
79
+ return nil
80
+ }
81
+ return url
82
+ }
83
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "id": "opener",
3
+ "apiVersion": 1,
4
+ "methods": ["openUrl", "canOpenUrl", "openSettings"],
5
+ "events": [],
6
+ "codegen": true,
7
+ "web": "./src/web.ts",
8
+ "desktop": "./src/desktop.ts",
9
+ "ios": {
10
+ "sources": ["ios/*.swift"],
11
+ "class": "OpenerPlugin"
12
+ },
13
+ "android": {
14
+ "sources": ["android/*.kt"],
15
+ "class": "com.akanjs.plugins.opener.OpenerPlugin",
16
+ "methods": ["openUrl", "openSettings"]
17
+ },
18
+ "scope": {
19
+ "description": "Which URLs openUrl may open (canOpenUrl and openSettings are not scoped).",
20
+ "fields": {
21
+ "url": "URL pattern: scheme, host, port and path compared separately (* in the host spans dots, in the path crosses /; no port = the default port in allow and any port in deny, :* = any port, no path = any path; query ignored), on the normalized URL"
22
+ },
23
+ "urlFields": ["url"]
24
+ }
25
+ }
@@ -0,0 +1,88 @@
1
+
2
+
3
+ import { AkanNativeError } from "../../../packages/core/src/index.ts";
4
+ import { type DesktopContext, defineDesktopPlugin, externalOpenAllowed } from "../../../packages/desktop/src/plugin.ts";
5
+ import type { OpenerApi } from "./index.ts";
6
+ import { checkUrl, checkUrlScope } from "./url.ts";
7
+
8
+ export interface Command {
9
+ code: number;
10
+ stdout: string;
11
+ stderr: string;
12
+ }
13
+
14
+ export type Runner = (argv: string[]) => Promise<Command>;
15
+
16
+ const spawnRunner: Runner = async (argv) => {
17
+ const proc = Bun.spawn(argv, { stdin: "ignore", stdout: "pipe", stderr: "pipe" });
18
+ const [stdout, stderr, code] = await Promise.all([
19
+ new Response(proc.stdout).text(),
20
+ new Response(proc.stderr).text(),
21
+ proc.exited,
22
+ ]);
23
+ return { code, stdout, stderr };
24
+ };
25
+
26
+ const LOOKUP = `function run(argv) {
27
+ ObjC.import("AppKit");
28
+ var url = $.NSURL.URLWithString(argv[0]);
29
+ if (url.isNil()) return "";
30
+ var app = $.NSWorkspace.sharedWorkspace.URLForApplicationToOpenURL(url);
31
+ return app.isNil() ? "" : app.path.js;
32
+ }`;
33
+
34
+ const SETTINGS = "x-apple.systempreferences:com.apple.preference.security";
35
+ /** Settings › Privacy & security (ms-settings URIs: learn.microsoft.com/windows/apps/develop/launch/launch-settings-app). */
36
+ const WINDOWS_SETTINGS = "ms-settings:privacy";
37
+
38
+ async function open(run: Runner, url: string): Promise<void> {
39
+ const { code, stderr } = await run(["/usr/bin/open", "-u", url]);
40
+ if (code === 0) return;
41
+ if (/-10814|No application knows/.test(stderr)) throw new AkanNativeError("NOT_FOUND", `no app can open ${url}`);
42
+ throw new AkanNativeError("INTERNAL", `open failed (${code}): ${stderr.trim()}`);
43
+ }
44
+
45
+ /**
46
+ * `run` is replaceable so tests can check the commands without opening anything, `platform` so
47
+ * they can check the Windows and Linux paths (shell ops) on any OS.
48
+ */
49
+ export function createDesktopOpener(run: Runner = spawnRunner, platform: NodeJS.Platform = process.platform) {
50
+ const mac = platform === "darwin";
51
+ const shellOpen = async (ctx: DesktopContext, url: string) => {
52
+ await ctx.shell("shell.open", { url });
53
+ };
54
+ return defineDesktopPlugin<OpenerApi>({
55
+ id: "opener",
56
+ methods: {
57
+ async openUrl(args, ctx) {
58
+ const url = checkUrl(args?.url, ctx.externalSchemes);
59
+ checkUrlScope(ctx.scope, url);
60
+ if (!externalOpenAllowed())
61
+ throw new AkanNativeError("NOT_ALLOWED", "at most one URL per second leaves the app; try again later");
62
+ if (mac) await open(run, url.href);
63
+ else await shellOpen(ctx, url.href);
64
+ },
65
+ async canOpenUrl(args, ctx) {
66
+ const url = checkUrl(args?.url, ctx.externalSchemes);
67
+ if (!mac)
68
+ return {
69
+ value: ((await ctx.shell("shell.handler", { url: url.href })) as { app: string | null }).app !== null,
70
+ };
71
+ const { code, stdout, stderr } = await run(["/usr/bin/osascript", "-l", "JavaScript", "-e", LOOKUP, url.href]);
72
+ if (code !== 0)
73
+ throw new AkanNativeError("INTERNAL", `LaunchServices lookup failed (${code}): ${stderr.trim()}`);
74
+ return { value: stdout.trim().length > 0 };
75
+ },
76
+ async openSettings(_args, ctx) {
77
+ if (!externalOpenAllowed())
78
+ throw new AkanNativeError("NOT_ALLOWED", "at most one URL per second leaves the app; try again later");
79
+ if (mac) await open(run, SETTINGS);
80
+ else if (platform === "win32") await shellOpen(ctx, WINDOWS_SETTINGS);
81
+ else
82
+ throw new AkanNativeError("UNSUPPORTED", "Linux desktops have no common settings page for app permissions");
83
+ },
84
+ },
85
+ });
86
+ }
87
+
88
+ export default createDesktopOpener();
@@ -0,0 +1,35 @@
1
+ import { definePlugin } from "../../../packages/core/src/index.ts";
2
+ import { web } from "./web.ts";
3
+
4
+ export { OPENER_SCHEMES } from "./url.ts";
5
+
6
+ /**
7
+ * Opens URLs in other apps (browser, mail, phone) and the app's system settings. This is the
8
+ * explicit API; links the page follows leave the WebView on their own (shell SH-4).
9
+ * Only http, https, mailto and tel URLs are accepted; others reject INVALID_ARGS.
10
+ */
11
+ export interface OpenerApi {
12
+ /**
13
+ * Opens the URL with the app the system picks. Rejects NOT_FOUND when no app handles it (e.g. tel:
14
+ * on a simulator), PERMISSION_DENIED on iOS while the app is not in the foreground and on the web
15
+ * when the browser blocked the new window (call it from a click).
16
+ */
17
+ openUrl(args: { url: string }): Promise<void>;
18
+ /**
19
+ * Whether an installed app handles the URL. iOS, macOS, Windows and Linux ask the system (tel: is
20
+ * false on iPad and the simulator, and wherever no phone app is registered); the web cannot tell
21
+ * and answers true. Not available on Android, where apps are
22
+ * invisible to the query unless the manifest lists them in <queries>.
23
+ */
24
+ canOpenUrl(args: { url: string }): Promise<{ value: boolean }>;
25
+ /**
26
+ * Opens this app's page in Settings (iOS, Android), Privacy & Security in System Settings (macOS)
27
+ * or Settings › Privacy & security (Windows). UNSUPPORTED on Linux, whose desktops have no common page.
28
+ */
29
+ openSettings(): Promise<void>;
30
+ }
31
+
32
+ export const opener = definePlugin<OpenerApi>("opener", {
33
+ methods: ["openUrl", "canOpenUrl", "openSettings"],
34
+ web,
35
+ });
@@ -0,0 +1,39 @@
1
+ import { EXTERNAL_SCHEMES } from "../../../packages/core/src/contract.ts";
2
+ import { AkanNativeError, type CallScope, scopePermits } from "../../../packages/core/src/index.ts";
3
+
4
+ /**
5
+ * Schemes the opener hands to the system by default: the shell's external list (contract.json;
6
+ * tauri-plugins-workspace/plugins/opener allows the same, permissions/allow-default-urls.toml). An
7
+ * app adds others with security.shell.externalSchemes. Anything else (file:, javascript:, other
8
+ * apps' schemes) is INVALID_ARGS on every platform; the native implementations check the same list.
9
+ */
10
+ export const OPENER_SCHEMES = EXTERNAL_SCHEMES;
11
+
12
+ /** Parses and checks a URL for openUrl/canOpenUrl. Scheme case is normalized by URL (as Android normalizeScheme). */
13
+ export function checkUrl(url: unknown, schemes: readonly string[] = OPENER_SCHEMES): URL {
14
+ if (typeof url !== "string" || url.length === 0)
15
+ throw new AkanNativeError("INVALID_ARGS", "url must be a non-empty string");
16
+ let parsed: URL;
17
+ try {
18
+ parsed = new URL(url);
19
+ } catch {
20
+ throw new AkanNativeError("INVALID_ARGS", `${url} is not an absolute URL`);
21
+ }
22
+ const scheme = parsed.protocol.slice(0, -1);
23
+ if (!schemes.includes(scheme)) {
24
+ throw new AkanNativeError("INVALID_ARGS", `only ${schemes.join(", ")} URLs can be opened (got ${scheme}:)`);
25
+ }
26
+ if ((scheme === "http" || scheme === "https") && !parsed.hostname)
27
+ throw new AkanNativeError("INVALID_ARGS", `${url} has no host`);
28
+ return parsed;
29
+ }
30
+
31
+ /**
32
+ * PL-11: the app's capabilities may limit openUrl to scopes { url } (URL patterns, urlMatch in
33
+ * @akanjs/native/core), matched against the normalized URL, e.g. { url: "https://*.example.com/*" }.
34
+ * Throws NOT_ALLOWED outside the call's scope.
35
+ */
36
+ export function checkUrlScope(scope: CallScope | undefined, url: URL): void {
37
+ if (!scopePermits(scope, { url: url.href }, [], ["url"]))
38
+ throw new AkanNativeError("NOT_ALLOWED", `${url.href} is outside the app's capabilities`);
39
+ }
@@ -0,0 +1,33 @@
1
+ import { AkanNativeError, defineWebPlugin, type WebCallContext } from "../../../packages/core/src/index.ts";
2
+ import type { OpenerApi } from "./index.ts";
3
+ import { checkUrl, checkUrlScope } from "./url.ts";
4
+
5
+ export const web = defineWebPlugin<OpenerApi>({
6
+ methods: {
7
+ openUrl(args, ctx?: WebCallContext) {
8
+ const url = checkUrl(args?.url);
9
+ checkUrlScope(ctx?.scope, url);
10
+ if (url.protocol === "http:" || url.protocol === "https:") {
11
+
12
+ const opened = window.open(url.href, "_blank");
13
+ if (!opened)
14
+ throw new AkanNativeError(
15
+ "PERMISSION_DENIED",
16
+ "the browser blocked the new window (call openUrl from a click)",
17
+ );
18
+ try {
19
+ opened.opener = null;
20
+ } catch {
21
+ }
22
+ } else {
23
+ window.location.href = url.href;
24
+ }
25
+ return Promise.resolve();
26
+ },
27
+
28
+ canOpenUrl: async (args) => {
29
+ checkUrl(args?.url);
30
+ return { value: true };
31
+ },
32
+ },
33
+ });
@@ -0,0 +1,44 @@
1
+ package com.akanjs.plugins.preferences
2
+
3
+ import android.content.Context
4
+ import com.akanjs.runtime.AkanNativeErrorCode
5
+ import com.akanjs.runtime.AkanNativePluginContext
6
+ import com.akanjs.runtime.AkanNativeReply
7
+ import com.akanjs.runtime.AkanNativeVoidReply
8
+
9
+ /**
10
+ * SharedPreferences in its own file, written with apply() (as capacitor-plugins/preferences does).
11
+ * Arguments arrive decoded and checked by the generated PreferencesPluginSpec (PL-10).
12
+ */
13
+ class PreferencesPlugin(context: AkanNativePluginContext) : PreferencesPluginSpec {
14
+ private val prefs = context.activity.getSharedPreferences("akan-native.preferences", Context.MODE_PRIVATE)
15
+
16
+ override fun get(args: PreferencesGetArgs, reply: AkanNativeReply<PreferencesGetResult>) {
17
+ if (valid(args.key, reply)) reply.resolve(PreferencesGetResult(value = prefs.getString(args.key, null)))
18
+ }
19
+
20
+ override fun set(args: PreferencesSetArgs, reply: AkanNativeVoidReply) {
21
+ if (!valid(args.key, reply)) return
22
+ prefs.edit().putString(args.key, args.value).apply()
23
+ reply.resolve()
24
+ }
25
+
26
+ override fun remove(args: PreferencesRemoveArgs, reply: AkanNativeVoidReply) {
27
+ if (!valid(args.key, reply)) return
28
+ prefs.edit().remove(args.key).apply()
29
+ reply.resolve()
30
+ }
31
+
32
+ override fun keys(reply: AkanNativeReply<PreferencesKeysResult>) = reply.resolve(PreferencesKeysResult(keys = prefs.all.keys.sorted()))
33
+
34
+ override fun clear(reply: AkanNativeVoidReply) {
35
+ prefs.edit().clear().apply()
36
+ reply.resolve()
37
+ }
38
+
39
+ private fun valid(key: String, reply: AkanNativeReply<*>): Boolean {
40
+ if (key.isNotEmpty()) return true
41
+ reply.reject(AkanNativeErrorCode.INVALID_ARGS, "key must be a non-empty string")
42
+ return false
43
+ }
44
+ }
@@ -0,0 +1,47 @@
1
+ import Foundation
2
+
3
+ /// UserDefaults in a dedicated suite (Library/Preferences/akan-native.preferences.plist).
4
+ /// capacitor-plugins/preferences uses UserDefaults.standard with a key prefix because .standard
5
+ /// also holds system keys; a separate suite keeps keys() and clear() exact. The suite name must
6
+ /// not be the bundle id (that is the .standard domain).
7
+ /// Arguments arrive decoded and checked by the generated PreferencesPluginSpec (PL-10).
8
+ final class PreferencesPlugin: PreferencesPluginSpec {
9
+ static let id = "preferences"
10
+ private static let suite = "akan-native.preferences"
11
+ private let defaults = UserDefaults(suiteName: PreferencesPlugin.suite)!
12
+
13
+ init(context: AkanNativePluginContext) {}
14
+
15
+ func get(_ args: PreferencesGetArgs, _ reply: AkanNativeReply<PreferencesGetResult>) {
16
+ guard Self.valid(args.key, reply) else { return }
17
+ reply.resolve(PreferencesGetResult(value: defaults.string(forKey: args.key)))
18
+ }
19
+
20
+ func set(_ args: PreferencesSetArgs, _ reply: AkanNativeReply<Void>) {
21
+ guard Self.valid(args.key, reply) else { return }
22
+ defaults.set(args.value, forKey: args.key)
23
+ reply.resolve()
24
+ }
25
+
26
+ func remove(_ args: PreferencesRemoveArgs, _ reply: AkanNativeReply<Void>) {
27
+ guard Self.valid(args.key, reply) else { return }
28
+ defaults.removeObject(forKey: args.key)
29
+ reply.resolve()
30
+ }
31
+
32
+ func keys(_ reply: AkanNativeReply<PreferencesKeysResult>) {
33
+ let keys = defaults.persistentDomain(forName: Self.suite).map { Array($0.keys) } ?? []
34
+ reply.resolve(PreferencesKeysResult(keys: keys.sorted()))
35
+ }
36
+
37
+ func clear(_ reply: AkanNativeReply<Void>) {
38
+ defaults.removePersistentDomain(forName: Self.suite)
39
+ reply.resolve()
40
+ }
41
+
42
+ private static func valid<T>(_ key: String, _ reply: AkanNativeReply<T>) -> Bool {
43
+ if !key.isEmpty { return true }
44
+ reply.reject(.invalidArgs, "key must be a non-empty string")
45
+ return false
46
+ }
47
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "preferences",
3
+ "apiVersion": 1,
4
+ "methods": ["get", "set", "remove", "keys", "clear"],
5
+ "events": [],
6
+ "codegen": true,
7
+ "web": "./src/web.ts",
8
+ "desktop": "./src/desktop.ts",
9
+ "ios": {
10
+ "sources": ["ios/*.swift"],
11
+ "class": "PreferencesPlugin",
12
+ "privacyApis": { "UserDefaults": ["CA92.1"] }
13
+ },
14
+ "android": {
15
+ "sources": ["android/*.kt"],
16
+ "class": "com.akanjs.plugins.preferences.PreferencesPlugin"
17
+ }
18
+ }
@@ -0,0 +1,59 @@
1
+
2
+ import { existsSync, readFileSync, renameSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { AkanNativeError } from "../../../packages/core/src/index.ts";
5
+ import { type DesktopContext, defineDesktopPlugin } from "../../../packages/desktop/src/plugin.ts";
6
+ import type { PreferencesApi } from "./index.ts";
7
+
8
+ let store: Map<string, string> | null = null;
9
+ let path = "";
10
+
11
+ function load(ctx: DesktopContext): Map<string, string> {
12
+ const file = join(ctx.appDataDir, "preferences.json");
13
+ if (store && path === file) return store;
14
+ path = file;
15
+ store = new Map();
16
+ if (existsSync(path)) {
17
+ try {
18
+ const data = JSON.parse(readFileSync(path, "utf8")) as Record<string, unknown>;
19
+ for (const [key, value] of Object.entries(data)) if (typeof value === "string") store.set(key, value);
20
+ } catch (error) {
21
+ console.error(`[akan-native] ${path} is unreadable, starting empty`, error);
22
+ }
23
+ }
24
+ return store;
25
+ }
26
+
27
+ function save(): void {
28
+
29
+ const tmp = `${path}.tmp`;
30
+ writeFileSync(tmp, JSON.stringify(Object.fromEntries(store!), null, 2));
31
+ renameSync(tmp, path);
32
+ }
33
+
34
+ function checkKey(key: unknown): string {
35
+ if (typeof key !== "string" || key.length === 0)
36
+ throw new AkanNativeError("INVALID_ARGS", "key must be a non-empty string");
37
+ return key;
38
+ }
39
+
40
+ export default defineDesktopPlugin<PreferencesApi>({
41
+ id: "preferences",
42
+ methods: {
43
+ get: (args, ctx) => ({ value: load(ctx).get(checkKey(args?.key)) ?? null }),
44
+ set(args, ctx) {
45
+ const key = checkKey(args?.key);
46
+ if (typeof args.value !== "string") throw new AkanNativeError("INVALID_ARGS", "value must be a string");
47
+ load(ctx).set(key, args.value);
48
+ save();
49
+ },
50
+ remove(args, ctx) {
51
+ if (load(ctx).delete(checkKey(args?.key))) save();
52
+ },
53
+ keys: (_args, ctx) => ({ keys: [...load(ctx).keys()] }),
54
+ clear(_args, ctx) {
55
+ load(ctx).clear();
56
+ save();
57
+ },
58
+ },
59
+ });
@@ -0,0 +1,75 @@
1
+
2
+
3
+ import * as React from "react";
4
+ import { createLiveValue, definePlugin, type LiveValue } from "../../../packages/core/src/index.ts";
5
+ import { useLiveValue } from "../../../packages/react/src/index.ts";
6
+ import { web } from "./web.ts";
7
+
8
+ /** String key-value storage that survives app restarts. Store JSON yourself for structured data. */
9
+ export interface PreferencesApi {
10
+ get(args: { key: string }): Promise<{ value: string | null }>;
11
+ set(args: { key: string; value: string }): Promise<void>;
12
+ remove(args: { key: string }): Promise<void>;
13
+ keys(): Promise<{ keys: string[] }>;
14
+ clear(): Promise<void>;
15
+ }
16
+
17
+ export const preferences = definePlugin<PreferencesApi>("preferences", {
18
+ methods: ["get", "set", "remove", "keys", "clear"],
19
+ web,
20
+ });
21
+
22
+ interface Entry {
23
+ value: string | null;
24
+ ready: boolean;
25
+ }
26
+
27
+ const entries = new Map<string, LiveValue<Entry>>();
28
+
29
+ function entry(key: string): LiveValue<Entry> {
30
+ let live = entries.get(key);
31
+ if (!live) {
32
+ const created = createLiveValue<Entry>({ value: null, ready: false }, (set) => {
33
+ if (!created.get().ready) {
34
+ preferences
35
+ .get({ key })
36
+ .then(({ value }) => {
37
+
38
+ if (!created.get().ready) set({ value, ready: true });
39
+ })
40
+ .catch((error) => {
41
+ console.warn(`[akan-native] preferences.get(${key}) failed`, error);
42
+ set({ value: null, ready: true });
43
+ });
44
+ }
45
+ });
46
+ live = created;
47
+ entries.set(key, created);
48
+ }
49
+ return live;
50
+ }
51
+
52
+ export type PreferenceSetter = (value: string | null) => Promise<void>;
53
+
54
+ /**
55
+ * Reads and writes one key. `ready` is false until the stored value has loaded.
56
+ * Setting null removes the key.
57
+ */
58
+ export function usePreference(key: string): [value: string | null, set: PreferenceSetter, ready: boolean] {
59
+ const live = entry(key);
60
+ const { value, ready } = useLiveValue(live);
61
+ const set = React.useCallback<PreferenceSetter>(
62
+ async (next) => {
63
+ const previous = live.get();
64
+ live.set({ value: next, ready: true });
65
+ try {
66
+ await (next === null ? preferences.remove({ key }) : preferences.set({ key, value: next }));
67
+ } catch (error) {
68
+ live.set(previous);
69
+ throw error;
70
+ }
71
+ },
72
+ [key, live],
73
+ );
74
+ return [value, set, ready];
75
+ }