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,366 @@
1
+ import UIKit
2
+ import UniformTypeIdentifiers
3
+
4
+ /// UIDocumentPickerViewController for all three methods.
5
+ /// - pickFiles: forOpeningContentTypes with asCopy: true (tauri-plugins-workspace/plugins/dialog/ios/
6
+ /// Sources/DialogPlugin.swift uses the same default), so iOS hands over copies in the app's tmp
7
+ /// Inbox and no security scope has to be managed. The copies move into the session folder
8
+ /// (context.temporaryFile, emptied at launch) and are served as FileRefs.
9
+ /// - saveFile: forExporting a staged file named as suggested, asCopy: true. The picker returns the
10
+ /// destination, whose name may differ ("Keep Both"). Tauri instead exports an empty placeholder and
11
+ /// leaves writing to the app (DialogPlugin.swift saveFileDialog), which cannot work without the
12
+ /// destination's security scope; here the content is known up front.
13
+ /// - pickDirectory: forOpeningContentTypes [.folder] returns a security-scoped URL. The scope is held
14
+ /// only while the files are copied, inside an NSFileCoordinator read (Apple's "Providing access to
15
+ /// directories" pattern), so nothing outside the session folder stays reachable. Files still in
16
+ /// iCloud (not downloaded) are hidden placeholders and are skipped with the other hidden files.
17
+ /// - Closing the picker (Cancel or swiping it down) resolves empty, as camera's library picker does.
18
+ /// Arguments arrive decoded and type-checked by the generated FilePickerPluginSpec (PL-10); the
19
+ /// rules types cannot express (src/common.ts) are checked here.
20
+ final class FilePickerPlugin: NSObject, FilePickerPluginSpec, UIDocumentPickerDelegate, UIAdaptivePresentationControllerDelegate {
21
+ static let id = "file-picker"
22
+ private let context: AkanNativePluginContext
23
+ private let queue = DispatchQueue(label: "com.akanjs.file-picker", qos: .userInitiated)
24
+
25
+ private enum Pending {
26
+ /// Validated and staging content; no picker on screen yet.
27
+ case preparing
28
+ case pick(AkanNativeReply<FilePickerPickFilesResult>)
29
+ case save(AkanNativeReply<FilePickerSaveFileResult>, staging: URL, name: String)
30
+ case directory(AkanNativeReply<FilePickerPickDirectoryResult>, limit: Int)
31
+ }
32
+
33
+ private var pending: Pending?
34
+
35
+ init(context: AkanNativePluginContext) {
36
+ self.context = context
37
+ }
38
+
39
+ private struct Problem: Error {
40
+ let code: AkanNativeErrorCode
41
+ let message: String
42
+ }
43
+
44
+ /// One dialog at a time; a Problem thrown by `body` rejects with its code.
45
+ private func attempt<T>(_ reply: AkanNativeReply<T>, _ body: () throws -> Void) {
46
+ guard pending == nil else { return reply.reject(.cancelled, "a file dialog is already open") }
47
+ do {
48
+ try body()
49
+ } catch let error as Problem {
50
+ reply.reject(error.code, error.message)
51
+ } catch {
52
+ reply.reject(.internalError, error.localizedDescription)
53
+ }
54
+ }
55
+
56
+ func pickFiles(_ args: FilePickerPickFilesOptions, _ reply: AkanNativeReply<FilePickerPickFilesResult>) {
57
+ attempt(reply) {
58
+ let types = try Self.types(args.types ?? [])
59
+ let picker = UIDocumentPickerViewController(forOpeningContentTypes: Self.contentTypes(types), asCopy: true)
60
+ picker.allowsMultipleSelection = args.multiple ?? false
61
+ present(picker, .pick(reply), reply)
62
+ }
63
+ }
64
+
65
+ func pickDirectory(_ args: FilePickerPickDirectoryOptions, _ reply: AkanNativeReply<FilePickerPickDirectoryResult>) {
66
+ attempt(reply) {
67
+ let limit = try Self.limit(args.limit)
68
+ let picker = UIDocumentPickerViewController(forOpeningContentTypes: [.folder])
69
+ picker.allowsMultipleSelection = false
70
+ present(picker, .directory(reply, limit: limit), reply)
71
+ }
72
+ }
73
+
74
+ func saveFile(_ args: FilePickerSaveFileOptions, _ reply: AkanNativeReply<FilePickerSaveFileResult>) {
75
+ attempt(reply) { try stage(args, reply) }
76
+ }
77
+
78
+ // MARK: arguments (src/common.ts)
79
+
80
+ private static func invalid(_ message: String) -> Problem { Problem(code: .invalidArgs, message: message) }
81
+
82
+ private static let mimeChars = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyz0123456789!#$&^_.+-")
83
+ private static let extChars = CharacterSet(charactersIn: "abcdefghijklmnopqrstuvwxyz0123456789_+-.")
84
+
85
+ /// MIME types or extensions, lower case, extensions without the dot; [] = any file.
86
+ private static func types(_ list: [String]) throws -> [String] {
87
+ var out: [String] = []
88
+ for raw in list {
89
+ var t = raw.trimmingCharacters(in: .whitespaces).lowercased()
90
+ if t.hasPrefix(".") { t.removeFirst() }
91
+ if t == "*/*" { return [] }
92
+ let parts = t.split(separator: "/", omittingEmptySubsequences: false).map(String.init)
93
+ let ok: Bool
94
+ if parts.count == 2 {
95
+ ok = !parts[0].isEmpty && parts[0].unicodeScalars.allSatisfy(mimeChars.contains)
96
+ && (parts[1] == "*" || (!parts[1].isEmpty && parts[1].unicodeScalars.allSatisfy(mimeChars.contains)))
97
+ } else {
98
+ ok = parts.count == 1 && !t.isEmpty && t.count <= 32 && !t.hasPrefix(".") && !t.hasSuffix(".") && !t.contains("..")
99
+ && t.unicodeScalars.allSatisfy(extChars.contains)
100
+ }
101
+ guard ok else { throw invalid("not a MIME type or file extension: \(raw)") }
102
+ if !out.contains(t) { out.append(t) }
103
+ }
104
+ return out
105
+ }
106
+
107
+ /// UTTypes for the picker. A type iOS has no registered UTType for turns the filter off, so the
108
+ /// user is never kept from a file they are looking for.
109
+ private static func contentTypes(_ types: [String]) -> [UTType] {
110
+ var out: [UTType] = []
111
+ for t in types {
112
+ var type: UTType?
113
+ if t.hasSuffix("/*") {
114
+ switch t.dropLast(2) {
115
+ case "image": type = .image
116
+ case "video": type = .movie
117
+ case "audio": type = .audio
118
+ case "text": type = .text
119
+ case "application": type = .data
120
+ case "font": type = .font
121
+ case "model": type = .threeDContent
122
+ default: type = nil
123
+ }
124
+ } else if t.contains("/") {
125
+ type = UTType(mimeType: t)
126
+ } else {
127
+ type = UTType(filenameExtension: t)
128
+ }
129
+ guard let type, !type.isDynamic else { return [.item] }
130
+ out.append(type)
131
+ }
132
+ return out.isEmpty ? [.item] : out
133
+ }
134
+
135
+ private static func name(_ name: String) throws -> String {
136
+ guard !name.trimmingCharacters(in: .whitespaces).isEmpty else { throw invalid("name must be a non-empty file name") }
137
+ guard name.count <= 255 else { throw invalid("name is longer than 255 characters") }
138
+ let bad = name.unicodeScalars.contains { $0 == "/" || $0 == "\\" || $0.value < 0x20 || $0.value == 0x7f }
139
+ guard !bad, name != ".", name != ".." else { throw invalid("name must be a file name, not a path (got \(name))") }
140
+ return name
141
+ }
142
+
143
+ private static func limit(_ value: Double?) throws -> Int {
144
+ guard let d = value else { return 1000 }
145
+ guard d == d.rounded(), d >= 1, d <= 10000 else { throw invalid("limit must be an integer from 1 to 10000") }
146
+ return Int(d)
147
+ }
148
+
149
+ /// Strict base64 (standard alphabet, optional padding), the rule of src/common.ts checkBase64.
150
+ nonisolated private static func decodeBase64(_ text: String) -> Data? {
151
+ let bytes = Array(text.utf8)
152
+ var body = bytes.count
153
+ while body > 0 && bytes[body - 1] == UInt8(ascii: "=") { body -= 1 }
154
+ let padding = bytes.count - body
155
+ let alphabetOK = bytes[..<body].allSatisfy { b in
156
+ (b >= 65 && b <= 90) || (b >= 97 && b <= 122) || (b >= 48 && b <= 57) || b == 43 || b == 47
157
+ }
158
+ guard alphabetOK, padding <= 2, bytes.count % 4 != 1, padding == 0 || bytes.count % 4 == 0 else { return nil }
159
+ return Data(base64Encoded: text + String(repeating: "=", count: (4 - bytes.count % 4) % 4))
160
+ }
161
+
162
+ nonisolated private static func mime(_ url: URL) -> String {
163
+ let ext = url.pathExtension
164
+ return ext.isEmpty ? "application/octet-stream" : UTType(filenameExtension: ext)?.preferredMIMEType ?? "application/octet-stream"
165
+ }
166
+
167
+ /// A new path in the session folder for a copy of `url`, keeping a short extension.
168
+ nonisolated private static func stagedPath(in session: URL, for url: URL) -> URL {
169
+ let ext = String(url.pathExtension.filter { $0.isASCII && ($0.isLetter || $0.isNumber) }.prefix(8))
170
+ return session.appendingPathComponent(UUID().uuidString.lowercased() + (ext.isEmpty ? "" : ".\(ext)"))
171
+ }
172
+
173
+ // MARK: presenting
174
+
175
+ private func present<T>(_ picker: UIDocumentPickerViewController, _ state: Pending, _ reply: AkanNativeReply<T>) {
176
+ picker.delegate = self
177
+ picker.presentationController?.delegate = self // swipe down → closed
178
+ pending = state
179
+ context.present(picker) { [weak self] in
180
+ self?.pending = nil
181
+ reply.reject(.internalError, "nothing to present the file picker from")
182
+ }
183
+ }
184
+
185
+ /// saveFile: checks the content, then stages it and shows the export picker. `mime` is not
186
+ /// needed: iOS files by extension.
187
+ private func stage(_ args: FilePickerSaveFileOptions, _ reply: AkanNativeReply<FilePickerSaveFileResult>) throws {
188
+ let name = try Self.name(args.name)
189
+ guard (args.data != nil) != (args.url != nil) else { throw Self.invalid("pass either data or url") }
190
+ var content: Data?
191
+ var source: URL?
192
+ if let text = args.data {
193
+ switch args.encoding ?? .utf8 {
194
+ case .utf8: content = Data(text.utf8)
195
+ case .base64:
196
+ guard let data = Self.decodeBase64(text) else { throw Self.invalid("data is not valid base64") }
197
+ content = data
198
+ }
199
+ } else if let ref = args.url {
200
+ guard args.encoding == nil else { throw Self.invalid("encoding applies to data, not url") }
201
+ guard !ref.isEmpty else { throw Self.invalid("url must be a non-empty string") }
202
+ guard let file = context.file(ref) else { throw Problem(code: .notFound, message: "\(ref) is not a file of this session") }
203
+ source = file.url
204
+ }
205
+
206
+ // Stage a file with the suggested name (the export picker saves it under that name).
207
+ pending = .preparing
208
+ let staging = FileManager.default.temporaryDirectory
209
+ .appendingPathComponent("akan-native-file-picker", isDirectory: true)
210
+ .appendingPathComponent(UUID().uuidString, isDirectory: true)
211
+ let file = staging.appendingPathComponent(name)
212
+ let box = UncheckedBox((content, source))
213
+ queue.async {
214
+ let problem: String?
215
+ do {
216
+ try FileManager.default.createDirectory(at: staging, withIntermediateDirectories: true)
217
+ let (content, source) = box.value
218
+ if let content { try content.write(to: file) } else if let source { try FileManager.default.copyItem(at: source, to: file) }
219
+ problem = nil
220
+ } catch {
221
+ problem = "could not prepare the file: \(error.localizedDescription)"
222
+ }
223
+ DispatchQueue.main.async {
224
+ MainActor.assumeIsolated {
225
+ if let error = problem {
226
+ self.pending = nil
227
+ try? FileManager.default.removeItem(at: staging)
228
+ return reply.reject(.internalError, error)
229
+ }
230
+ let picker = UIDocumentPickerViewController(forExporting: [file], asCopy: true)
231
+ self.present(picker, .save(reply, staging: staging, name: name), reply)
232
+ }
233
+ }
234
+ }
235
+ }
236
+
237
+ // MARK: UIDocumentPickerDelegate
238
+
239
+ func documentPicker(_ controller: UIDocumentPickerViewController, didPickDocumentsAt urls: [URL]) {
240
+ guard let state = pending else { return }
241
+ pending = nil
242
+ switch state {
243
+ case .preparing:
244
+ break
245
+ case .pick(let reply):
246
+ importFiles(urls, reply)
247
+ case .save(let reply, let staging, let name):
248
+ try? FileManager.default.removeItem(at: staging)
249
+ reply.resolve(FilePickerSaveFileResult(saved: true, name: urls.first?.lastPathComponent ?? name))
250
+ case .directory(let reply, let limit):
251
+ guard let url = urls.first else { return reply.resolve(Self.noDirectory) }
252
+ importDirectory(url, limit, reply)
253
+ }
254
+ }
255
+
256
+ func documentPickerWasCancelled(_ controller: UIDocumentPickerViewController) {
257
+ finishClosed()
258
+ }
259
+
260
+ func presentationControllerDidDismiss(_ presentationController: UIPresentationController) {
261
+ finishClosed()
262
+ }
263
+
264
+ private static var noDirectory: FilePickerPickDirectoryResult { FilePickerPickDirectoryResult(name: nil, files: [], truncated: false) }
265
+
266
+ private func finishClosed() {
267
+ guard let state = pending else { return }
268
+ pending = nil
269
+ switch state {
270
+ case .preparing: break
271
+ case .pick(let reply): reply.resolve(FilePickerPickFilesResult(files: []))
272
+ case .save(let reply, let staging, _):
273
+ try? FileManager.default.removeItem(at: staging)
274
+ reply.resolve(FilePickerSaveFileResult(saved: false))
275
+ case .directory(let reply, _): reply.resolve(Self.noDirectory)
276
+ }
277
+ }
278
+
279
+ // MARK: copying
280
+
281
+ private struct Staged: Sendable {
282
+ let url: URL
283
+ let name: String
284
+ let mime: String
285
+ /// Relative to the picked folder (pickDirectory only).
286
+ var path = ""
287
+ }
288
+
289
+ /// Session folder of the shell (context.temporaryFile's folder).
290
+ private var sessionFolder: URL { context.temporaryFile("x").deletingLastPathComponent() }
291
+
292
+ private func register(_ file: Staged) -> AkanNativeFileRef { context.fileRef(file.url, mime: file.mime) }
293
+
294
+ /// The picker's copies (tmp/<bundle id>-Inbox) move into the session folder.
295
+ private func importFiles(_ urls: [URL], _ reply: AkanNativeReply<FilePickerPickFilesResult>) {
296
+ let session = sessionFolder
297
+ queue.async {
298
+ var staged: [Staged] = []
299
+ do {
300
+ for url in urls {
301
+ let target = Self.stagedPath(in: session, for: url)
302
+ do {
303
+ try FileManager.default.moveItem(at: url, to: target)
304
+ } catch {
305
+ try FileManager.default.copyItem(at: url, to: target)
306
+ }
307
+ staged.append(Staged(url: target, name: url.lastPathComponent, mime: Self.mime(url)))
308
+ }
309
+ } catch {
310
+ return reply.reject(.internalError, "could not read the picked file: \(error.localizedDescription)")
311
+ }
312
+ DispatchQueue.main.async {
313
+ MainActor.assumeIsolated {
314
+ reply.resolve(FilePickerPickFilesResult(files: staged.map { FilePickerPickedFile(file: self.register($0), name: $0.name) }))
315
+ }
316
+ }
317
+ }
318
+ }
319
+
320
+ private func importDirectory(_ folder: URL, _ limit: Int, _ reply: AkanNativeReply<FilePickerPickDirectoryResult>) {
321
+ let session = sessionFolder
322
+ queue.async {
323
+ let scoped = folder.startAccessingSecurityScopedResource()
324
+ defer { if scoped { folder.stopAccessingSecurityScopedResource() } }
325
+ var staged: [Staged] = []
326
+ var truncated = false
327
+ var failure: Error?
328
+ var coordination: NSError?
329
+ NSFileCoordinator().coordinate(readingItemAt: folder, options: [], error: &coordination) { dir in
330
+ let base = dir.resolvingSymlinksInPath().path
331
+ guard let items = FileManager.default.enumerator(
332
+ at: dir, includingPropertiesForKeys: [.isRegularFileKey], options: [.skipsHiddenFiles, .skipsPackageDescendants])
333
+ else { return }
334
+ for case let file as URL in items {
335
+ guard (try? file.resourceValues(forKeys: [.isRegularFileKey]))?.isRegularFile == true else { continue }
336
+ if staged.count == limit {
337
+ truncated = true
338
+ break
339
+ }
340
+ let full = file.resolvingSymlinksInPath().path
341
+ let relative = full.hasPrefix(base + "/") ? String(full.dropFirst(base.count + 1)) : file.lastPathComponent
342
+ let target = Self.stagedPath(in: session, for: file)
343
+ do {
344
+ try FileManager.default.copyItem(at: file, to: target)
345
+ } catch {
346
+ failure = error
347
+ break
348
+ }
349
+ staged.append(Staged(url: target, name: file.lastPathComponent, mime: Self.mime(file), path: relative))
350
+ }
351
+ }
352
+ if let error = coordination ?? failure {
353
+ for file in staged { try? FileManager.default.removeItem(at: file.url) }
354
+ return reply.reject(.internalError, "could not read the folder: \(error.localizedDescription)")
355
+ }
356
+ let name = folder.lastPathComponent
357
+ let more = truncated
358
+ DispatchQueue.main.async {
359
+ MainActor.assumeIsolated {
360
+ let files = staged.map { FilePickerDirectoryFile(file: self.register($0), name: $0.name, path: $0.path) }
361
+ reply.resolve(FilePickerPickDirectoryResult(name: name, files: files, truncated: more))
362
+ }
363
+ }
364
+ }
365
+ }
366
+ }
@@ -0,0 +1,18 @@
1
+ {
2
+ "id": "file-picker",
3
+ "apiVersion": 1,
4
+ "methods": ["pickFiles", "saveFile", "pickDirectory"],
5
+ "events": [],
6
+ "codegen": true,
7
+ "web": "./src/web.ts",
8
+ "desktop": "./src/desktop.ts",
9
+ "ios": {
10
+ "sources": ["ios/*.swift"],
11
+ "class": "FilePickerPlugin",
12
+ "frameworks": ["UniformTypeIdentifiers"]
13
+ },
14
+ "android": {
15
+ "sources": ["android/*.kt"],
16
+ "class": "com.akanjs.plugins.filepicker.FilePickerPlugin"
17
+ }
18
+ }
@@ -0,0 +1,125 @@
1
+
2
+
3
+ import { AkanNativeError } from "../../../packages/core/src/index.ts";
4
+
5
+ export const invalid = (message: string) => new AkanNativeError("INVALID_ARGS", message);
6
+
7
+ export function checkObject(args: unknown, optional: boolean): Record<string, unknown> {
8
+ if ((args === undefined || args === null) && optional) return {};
9
+ if (!args || typeof args !== "object" || Array.isArray(args)) throw invalid("options must be an object");
10
+ return args as Record<string, unknown>;
11
+ }
12
+
13
+ const MIME = /^[a-z0-9][a-z0-9!#$&^_.+-]*\/([a-z0-9][a-z0-9!#$&^_.+-]*|\*)$/;
14
+ const EXTENSION = /^[a-z0-9][a-z0-9_+-]*(\.[a-z0-9_+-]+)*$/;
15
+
16
+ /**
17
+ * File types as given to pickFiles: MIME types ("image/png", "image/*") or file name extensions
18
+ * ("pdf" or ".pdf"). Normalized to lower case, extensions without the dot. "*\/*" or no types
19
+ * means any file.
20
+ */
21
+ export function checkTypes(types: unknown): string[] {
22
+ if (types === undefined || types === null) return [];
23
+ if (!Array.isArray(types)) throw invalid("types must be an array of MIME types or extensions");
24
+ const out: string[] = [];
25
+ for (const type of types) {
26
+ if (typeof type !== "string") throw invalid("types must be an array of MIME types or extensions");
27
+ const t = type.trim().toLowerCase().replace(/^\./, "");
28
+ if (t === "*/*") return [];
29
+ if (t.includes("/") ? !MIME.test(t) : !EXTENSION.test(t) || t.length > 32)
30
+ throw invalid(`not a MIME type or file extension: ${type}`);
31
+ if (!out.includes(t)) out.push(t);
32
+ }
33
+ return out;
34
+ }
35
+
36
+ export function checkFlag(value: unknown, key: string): boolean {
37
+ if (value === undefined || value === null) return false;
38
+ if (typeof value !== "boolean") throw invalid(`${key} must be a boolean`);
39
+ return value;
40
+ }
41
+
42
+ /** A file name for saveFile: one path segment, no control characters. */
43
+ export function checkName(name: unknown): string {
44
+ if (typeof name !== "string" || name.trim().length === 0) throw invalid("name must be a non-empty file name");
45
+ if (name.length > 255) throw invalid("name is longer than 255 characters");
46
+ if (
47
+ /[/\\]/.test(name) ||
48
+ [...name].some((c) => c.charCodeAt(0) < 0x20 || c.charCodeAt(0) === 0x7f) ||
49
+ name === "." ||
50
+ name === ".."
51
+ )
52
+ throw invalid(`name must be a file name, not a path (got ${name})`);
53
+ return name;
54
+ }
55
+
56
+ export const DEFAULT_LIMIT = 1000;
57
+ export const MAX_LIMIT = 10000;
58
+
59
+ export function checkLimit(value: unknown): number {
60
+ if (value === undefined || value === null) return DEFAULT_LIMIT;
61
+ if (typeof value !== "number" || !Number.isInteger(value) || value < 1 || value > MAX_LIMIT) {
62
+ throw invalid(`limit must be an integer from 1 to ${MAX_LIMIT}`);
63
+ }
64
+ return value;
65
+ }
66
+
67
+ export function checkMime(value: unknown): string | undefined {
68
+ if (value === undefined || value === null) return undefined;
69
+ if (typeof value !== "string" || !MIME.test(value.toLowerCase()) || value.endsWith("/*"))
70
+ throw invalid("mime must be a MIME type such as text/csv");
71
+ return value.toLowerCase();
72
+ }
73
+
74
+ const BASE64 = /^[A-Za-z0-9+/]*={0,2}$/;
75
+
76
+ export function checkBase64(data: string): void {
77
+ if (!BASE64.test(data) || data.length % 4 === 1 || (data.includes("=") && data.length % 4 !== 0))
78
+ throw invalid("data is not valid base64");
79
+ }
80
+
81
+ export type SaveSource = { kind: "data"; data: string; encoding: "utf8" | "base64" } | { kind: "url"; url: string };
82
+
83
+ /** Content for saveFile: `data` (text, or base64 with encoding) or `url`. Exactly one. */
84
+ export function checkSaveSource(args: Record<string, unknown>): SaveSource {
85
+ const hasData = args.data !== undefined && args.data !== null;
86
+ const hasUrl = args.url !== undefined && args.url !== null;
87
+ if (hasData === hasUrl) throw invalid("pass either data or url");
88
+ if (hasUrl) {
89
+ if (typeof args.url !== "string" || args.url.length === 0) throw invalid("url must be a non-empty string");
90
+ if (args.encoding !== undefined && args.encoding !== null) throw invalid("encoding applies to data, not url");
91
+ return { kind: "url", url: args.url };
92
+ }
93
+ if (typeof args.data !== "string") throw invalid('data must be a string (text, or base64 with encoding: "base64")');
94
+ const encoding = args.encoding ?? "utf8";
95
+ if (encoding !== "utf8" && encoding !== "base64") throw invalid('encoding must be "utf8" or "base64"');
96
+ if (encoding === "base64") checkBase64(args.data);
97
+ return { kind: "data", data: args.data, encoding };
98
+ }
99
+
100
+ export function base64ToBytes(data: string): Uint8Array {
101
+ const binary = atob(data);
102
+ const bytes = new Uint8Array(binary.length);
103
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
104
+ return bytes;
105
+ }
106
+
107
+ export function bytesToBase64(bytes: Uint8Array): string {
108
+ const native = (bytes as Uint8Array & { toBase64?: () => string }).toBase64;
109
+ if (typeof native === "function") return native.call(bytes);
110
+ let binary = "";
111
+ for (let i = 0; i < bytes.length; i += 0x8000) binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
112
+ return btoa(binary);
113
+ }
114
+
115
+ /** A FileRef served by the host: "/__akan_native/file/<id>", optionally on the app origin. */
116
+ export function isFileRef(url: string): boolean {
117
+ const m =
118
+ /^(?:app:\/\/localhost|https:\/\/app\.localhost)?\/__akan_native\/file\/([A-Za-z0-9_-]{1,128}(\.[A-Za-z0-9]{1,8})?)$/.exec(
119
+ url,
120
+ );
121
+ return m !== null;
122
+ }
123
+
124
+ /** Hidden entries (".DS_Store", ".git/…") are left out of pickDirectory everywhere. */
125
+ export const isHidden = (relativePath: string) => relativePath.split("/").some((s) => s.startsWith("."));
@@ -0,0 +1,164 @@
1
+
2
+
3
+ import { randomBytes } from "node:crypto";
4
+ import { constants, copyFileSync, mkdirSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
5
+ import { tmpdir } from "node:os";
6
+ import { basename, extname, join } from "node:path";
7
+ import { AkanNativeError, mimeFor } from "../../../packages/core/src/index.ts";
8
+ import { type DesktopContext, defineDesktopPlugin } from "../../../packages/desktop/src/plugin.ts";
9
+ import { base64ToBytes, checkFlag, checkLimit, checkName, checkObject, checkSaveSource, checkTypes } from "./common.ts";
10
+ import type { DirectoryFile, FilePickerApi, PickedFile } from "./index.ts";
11
+
12
+ type OpenAnswer = { cancelled: true } | { paths: string[] };
13
+ type SaveAnswer = { cancelled: true } | { path: string };
14
+
15
+ interface Staged {
16
+ path: string;
17
+ name: string;
18
+ mime: string;
19
+ size: number;
20
+ relative?: string;
21
+ }
22
+
23
+ /** Regular files under `dir`, depth first by name, without hidden files and folders (".*"). */
24
+ export function listFiles(dir: string, limit: number): { files: string[]; truncated: boolean } {
25
+ const files: string[] = [];
26
+ const walk = (rel: string): boolean => {
27
+ const entries = readdirSync(join(dir, rel), { withFileTypes: true }).sort((a, b) =>
28
+ a.name < b.name ? -1 : a.name > b.name ? 1 : 0,
29
+ );
30
+ for (const entry of entries) {
31
+ if (entry.name.startsWith(".")) continue;
32
+ const path = rel ? `${rel}/${entry.name}` : entry.name;
33
+ if (entry.isDirectory()) {
34
+ if (walk(path)) return true;
35
+ } else if (entry.isFile()) {
36
+ if (files.length === limit) return true;
37
+ files.push(path);
38
+ }
39
+ }
40
+ return false;
41
+ };
42
+ const truncated = walk("");
43
+ return { files, truncated };
44
+ }
45
+
46
+ export function createDesktopFilePicker() {
47
+ let root: string | null = null;
48
+ let busy = false;
49
+
50
+ /** A fresh folder for this call's copies, under $TMPDIR/<app id>/file-picker (emptied at launch). */
51
+ function stageDir(ctx: DesktopContext): string {
52
+ root ??= join(tmpdir(), ctx.app.id, "file-picker");
53
+ const dir = join(root, randomBytes(6).toString("hex"));
54
+ mkdirSync(dir, { recursive: true });
55
+ return dir;
56
+ }
57
+
58
+ /** One panel at a time, like the other platforms. */
59
+ async function exclusive<T>(run: () => Promise<T>): Promise<T> {
60
+ if (busy) throw new AkanNativeError("CANCELLED", "a file dialog is already open");
61
+ busy = true;
62
+ try {
63
+ return await run();
64
+ } finally {
65
+ busy = false;
66
+ }
67
+ }
68
+
69
+ /** The OS's MIME types for the files' extensions; the built-in table for the rest. */
70
+ async function mimes(ctx: DesktopContext, paths: string[]): Promise<(path: string) => string> {
71
+ const exts = [...new Set(paths.map((p) => extname(p).slice(1).toLowerCase()).filter(Boolean))];
72
+ const known = exts.length
73
+ ? ((await ctx.shell("panel.mime", { exts }).catch(() => ({}))) as Record<string, string>)
74
+ : {};
75
+ return (path) => known[extname(path).slice(1).toLowerCase()] ?? mimeFor(basename(path));
76
+ }
77
+
78
+ function stage(dir: string, src: string, seq: number, mime: string): Staged {
79
+ const ext = extname(src)
80
+ .slice(1)
81
+ .replace(/[^A-Za-z0-9]/g, "")
82
+ .slice(0, 8);
83
+ const dst = join(dir, `${seq}${ext ? `.${ext}` : ""}`);
84
+ try {
85
+ copyFileSync(src, dst, constants.COPYFILE_FICLONE);
86
+ } catch (error) {
87
+ throw new AkanNativeError("INTERNAL", `could not copy ${basename(src)}: ${(error as Error).message}`);
88
+ }
89
+ return { path: dst, name: basename(src), mime, size: statSync(dst).size };
90
+ }
91
+
92
+ const toPicked = (ctx: DesktopContext, file: Staged): PickedFile => ({
93
+ ...ctx.registerFile(file.path, file.mime),
94
+ name: file.name,
95
+ });
96
+
97
+ return defineDesktopPlugin<FilePickerApi>({
98
+ id: "file-picker",
99
+ setup(ctx) {
100
+ root = join(tmpdir(), ctx.app.id, "file-picker");
101
+
102
+ rmSync(root, { recursive: true, force: true });
103
+ },
104
+ methods: {
105
+ async pickFiles(options, ctx) {
106
+ const o = checkObject(options, true);
107
+ const types = checkTypes(o.types);
108
+ const multiple = checkFlag(o.multiple, "multiple");
109
+ return exclusive(async () => {
110
+ const answer = (await ctx.shell("panel.open", { types, multiple })) as OpenAnswer;
111
+ if ("cancelled" in answer) return { files: [] };
112
+ const dir = stageDir(ctx);
113
+ const mime = await mimes(ctx, answer.paths);
114
+ return { files: answer.paths.map((p, i) => toPicked(ctx, stage(dir, p, i, mime(p)))) };
115
+ });
116
+ },
117
+
118
+ async saveFile(options, ctx) {
119
+ const o = checkObject(options, false);
120
+ const name = checkName(o.name);
121
+ const source = checkSaveSource(o);
122
+ if (source.kind === "url")
123
+ throw new AkanNativeError(
124
+ "INVALID_ARGS",
125
+ "url is resolved by the page on desktop; pass data (the JS API does this)",
126
+ );
127
+ return exclusive(async () => {
128
+ const answer = (await ctx.shell("panel.save", { name })) as SaveAnswer;
129
+ if ("cancelled" in answer) return { saved: false };
130
+
131
+ try {
132
+ writeFileSync(answer.path, source.encoding === "base64" ? base64ToBytes(source.data) : source.data);
133
+ } catch (error) {
134
+ throw new AkanNativeError(
135
+ "INTERNAL",
136
+ `could not save ${basename(answer.path)}: ${(error as Error).message}`,
137
+ );
138
+ }
139
+ return { saved: true, name: basename(answer.path) };
140
+ });
141
+ },
142
+
143
+ async pickDirectory(options, ctx) {
144
+ const o = checkObject(options, true);
145
+ const limit = checkLimit(o.limit);
146
+ return exclusive(async () => {
147
+ const answer = (await ctx.shell("panel.open", { directory: true })) as OpenAnswer;
148
+ if ("cancelled" in answer || !answer.paths[0]) return { name: null, files: [], truncated: false };
149
+ const picked = answer.paths[0];
150
+ const { files, truncated } = listFiles(picked, limit);
151
+ const dir = stageDir(ctx);
152
+ const mime = await mimes(ctx, files);
153
+ const out: DirectoryFile[] = files.map((rel, i) => ({
154
+ ...toPicked(ctx, stage(dir, join(picked, rel), i, mime(rel))),
155
+ path: rel,
156
+ }));
157
+ return { name: basename(picked), files: out, truncated };
158
+ });
159
+ },
160
+ },
161
+ });
162
+ }
163
+
164
+ export default createDesktopFilePicker();