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,596 @@
1
+ import Foundation
2
+ import UniformTypeIdentifiers
3
+
4
+ /// Files in four base folders of the app container (plugins/filesystem/src/index.ts has the table):
5
+ /// data Library/Application Support/files (backed up)
6
+ /// cache Library/Caches/files (not backed up, purged under storage pressure)
7
+ /// documents Documents (the user's documents; Files app with UIFileSharingEnabled)
8
+ /// temp tmp/files (purged by the system when the app is not running)
9
+ /// "files" subfolders keep the shell's and WebKit's own files (tmp/akan-native-files, Caches/<id>/WebKit)
10
+ /// out of the page's reach.
11
+ /// - Paths are relative, "/"-separated, without "..": the same checks as src/common.ts, the rule of
12
+ /// tauri/crates/tauri/src/path/mod.rs:47 (SafePathBuf). Symbolic links are resolved with
13
+ /// realpath(3) and must stay inside the resolved base (tauri-plugins-workspace/plugins/fs/src/
14
+ /// commands.rs:1606-1640 checks scopes after following links the same way).
15
+ /// - All work runs on one serial queue: the UI thread never waits for the disk, and calls finish in
16
+ /// the order the page made them, so un-awaited append chunks land in order.
17
+ /// - readFile without encoding registers the file itself (no copy) and returns a FileRef; the scheme
18
+ /// handler serves it with Range support, so large files never cross the bridge.
19
+ /// - Arguments arrive decoded by the generated FilesystemPluginSpec (PL-10). readFile (overloaded in
20
+ /// the spec) and writeFile (an intersection with a union) stay untyped there and read call.args.
21
+ final class FilesystemPlugin: FilesystemPluginSpec {
22
+ static let id = "filesystem"
23
+ private let context: AkanNativePluginContext
24
+ private let worker: FilesystemWorker
25
+ private let queue = DispatchQueue(label: "com.akanjs.filesystem", qos: .userInitiated)
26
+
27
+ init(context: AkanNativePluginContext) {
28
+ self.context = context
29
+ let fm = FileManager.default
30
+ let library = { (dir: FileManager.SearchPathDirectory) in fm.urls(for: dir, in: .userDomainMask)[0] }
31
+ worker = FilesystemWorker(dirs: [
32
+ "data": library(.applicationSupportDirectory).appendingPathComponent("files", isDirectory: true).path,
33
+ "cache": library(.cachesDirectory).appendingPathComponent("files", isDirectory: true).path,
34
+ "documents": library(.documentDirectory).path,
35
+ "temp": fm.temporaryDirectory.appendingPathComponent("files", isDirectory: true).path,
36
+ ])
37
+ }
38
+
39
+ /// PL-11: the app's capabilities may limit calls to scopes { base?, path? } (globs, path relative
40
+ /// to its base with "/" separators; src/common.ts checkScope), on the spelled path first. ".."
41
+ /// never gets this far: the argument checks reject it. The worker checks the resolved path again
42
+ /// (a symbolic link's target) and what a recursive call reaches inside a folder.
43
+ private func inScope(_ call: AkanNativeCall, _ targets: [(base: String, path: String)]) -> Bool {
44
+ guard call.scope != nil else { return true }
45
+ for (base, raw) in targets {
46
+ let path = raw.split(separator: "/").filter { $0 != "." }.joined(separator: "/")
47
+ guard call.inScope(["base": base, "path": path], pathFields: ["path"], fold: worker.folds(base), what: "\(base):\(path.isEmpty ? "." : path)") else { return false }
48
+ }
49
+ return true
50
+ }
51
+
52
+ /// The scope target of the untyped methods, read from the raw arguments.
53
+ private static func target(_ call: AkanNativeCall) -> [(base: String, path: String)] {
54
+ [(call.args["base"] as? String ?? "", call.args["path"] as? String ?? "")]
55
+ }
56
+
57
+ private static func targets(_ args: FilesystemMoveOptions) -> [(base: String, path: String)] {
58
+ [(args.base.rawValue, args.from), ((args.toBase ?? args.base).rawValue, args.to)]
59
+ }
60
+
61
+ /// Runs `work` on the queue and answers with its result, or rejects with the error's code.
62
+ private func perform<T>(_ reply: AkanNativeReply<T>, _ work: @escaping @Sendable (FilesystemWorker) throws -> T) {
63
+ let worker = self.worker
64
+ queue.async {
65
+ do {
66
+ reply.resolve(try work(worker))
67
+ } catch {
68
+ FilesystemWorker.reject(reply.call, error)
69
+ }
70
+ }
71
+ }
72
+
73
+ func readFile(_ call: AkanNativeCall) {
74
+ guard inScope(call, Self.target(call)) else { return }
75
+ let worker = self.worker
76
+ let context = self.context
77
+ let args = UncheckedBox(call.args)
78
+ let scope = call.scope
79
+ queue.async {
80
+ do {
81
+ switch try worker.readFile(args.value, scope) {
82
+ case .data(let text):
83
+ call.resolve(["data": text])
84
+ case .file(let url, let mime):
85
+ DispatchQueue.main.async { MainActor.assumeIsolated { call.resolve(context.fileRef(url, mime: mime).akanNativeJSON) } }
86
+ }
87
+ } catch {
88
+ FilesystemWorker.reject(call, error)
89
+ }
90
+ }
91
+ }
92
+
93
+ func writeFile(_ call: AkanNativeCall) {
94
+ guard inScope(call, Self.target(call)) else { return }
95
+ // FileRefs are looked up here, on the main actor, before the work leaves it.
96
+ var fileRef: URL?
97
+ if let url = call.args["url"], !(url is NSNull) {
98
+ guard let ref = url as? String, !ref.isEmpty else { return call.reject(.invalidArgs, "url must be a non-empty string") }
99
+ guard let file = context.file(ref) else { return call.reject(.notFound, "\(ref) is not a file of this session") }
100
+ fileRef = file.url
101
+ }
102
+ let source = fileRef
103
+ let worker = self.worker
104
+ let args = UncheckedBox(call.args)
105
+ let scope = call.scope
106
+ queue.async {
107
+ do {
108
+ try worker.writeFile(args.value, source: source, scope)
109
+ call.resolve()
110
+ } catch {
111
+ FilesystemWorker.reject(call, error)
112
+ }
113
+ }
114
+ }
115
+
116
+ func readDir(_ args: FilesystemPathOptions, _ reply: AkanNativeReply<FilesystemReadDirResult>) {
117
+ guard inScope(reply.call, [(args.base.rawValue, args.path)]) else { return }
118
+ let scope = reply.call.scope
119
+ perform(reply) { try $0.readDir(args, scope) }
120
+ }
121
+
122
+ func stat(_ args: FilesystemPathOptions, _ reply: AkanNativeReply<FilesystemFileInfo>) {
123
+ guard inScope(reply.call, [(args.base.rawValue, args.path)]) else { return }
124
+ let scope = reply.call.scope
125
+ perform(reply) { try $0.fileInfo(args, scope) }
126
+ }
127
+
128
+ func exists(_ args: FilesystemPathOptions, _ reply: AkanNativeReply<FilesystemExistsResult>) {
129
+ guard inScope(reply.call, [(args.base.rawValue, args.path)]) else { return }
130
+ let scope = reply.call.scope
131
+ perform(reply) { try $0.exists(args, scope) }
132
+ }
133
+
134
+ func mkdir(_ args: FilesystemMkdirArgs, _ reply: AkanNativeReply<Void>) {
135
+ guard inScope(reply.call, [(args.base.rawValue, args.path)]) else { return }
136
+ let scope = reply.call.scope
137
+ perform(reply) { try $0.mkdir(args, scope) }
138
+ }
139
+
140
+ func remove(_ args: FilesystemRemoveArgs, _ reply: AkanNativeReply<Void>) {
141
+ guard inScope(reply.call, [(args.base.rawValue, args.path)]) else { return }
142
+ let scope = reply.call.scope
143
+ perform(reply) { try $0.remove(args, scope) }
144
+ }
145
+
146
+ func rename(_ args: FilesystemMoveOptions, _ reply: AkanNativeReply<Void>) {
147
+ guard inScope(reply.call, Self.targets(args)) else { return }
148
+ let scope = reply.call.scope
149
+ perform(reply) { try $0.move(args, keepSource: false, scope) }
150
+ }
151
+
152
+ func copy(_ args: FilesystemMoveOptions, _ reply: AkanNativeReply<Void>) {
153
+ guard inScope(reply.call, Self.targets(args)) else { return }
154
+ let scope = reply.call.scope
155
+ perform(reply) { try $0.move(args, keepSource: true, scope) }
156
+ }
157
+
158
+ func paths(_ reply: AkanNativeReply<[String: String]>) {
159
+ reply.resolve(worker.dirs)
160
+ }
161
+ }
162
+
163
+ /// The file operations, off the main actor. Stateless apart from the folder paths.
164
+ final class FilesystemWorker: Sendable {
165
+ let dirs: [String: String]
166
+
167
+ init(dirs: [String: String]) {
168
+ self.dirs = dirs
169
+ }
170
+
171
+ struct Problem: Error {
172
+ let code: AkanNativeErrorCode
173
+ let message: String
174
+ }
175
+
176
+ enum ReadOutcome {
177
+ case data(String)
178
+ case file(URL, mime: String)
179
+ }
180
+
181
+ private static func invalid(_ message: String) -> Problem { Problem(code: .invalidArgs, message: message) }
182
+ private static func notFound(_ message: String) -> Problem { Problem(code: .notFound, message: message) }
183
+ private static var fm: FileManager { .default }
184
+
185
+ /// Rejects with a Problem's code, or with the code of a Cocoa or POSIX error.
186
+ static func reject(_ call: AkanNativeCall, _ error: Error) {
187
+ if let problem = error as? Problem {
188
+ call.reject(problem.code, problem.message)
189
+ } else {
190
+ call.reject(code(of: error), error.localizedDescription)
191
+ }
192
+ }
193
+
194
+ static func code(of error: Error) -> AkanNativeErrorCode {
195
+ let ns = error as NSError
196
+ if ns.domain == NSCocoaErrorDomain {
197
+ switch CocoaError.Code(rawValue: ns.code) {
198
+ case .fileNoSuchFile, .fileReadNoSuchFile: return .notFound
199
+ case .fileWriteFileExists, .fileReadInvalidFileName, .fileWriteInvalidFileName: return .invalidArgs
200
+ case .fileReadNoPermission, .fileWriteNoPermission, .fileWriteVolumeReadOnly: return .permissionDenied
201
+ default: break
202
+ }
203
+ if let underlying = ns.userInfo[NSUnderlyingErrorKey] as? Error { return code(of: underlying) }
204
+ }
205
+ if ns.domain == NSPOSIXErrorDomain { return posixCode(Int32(ns.code)) }
206
+ return .internalError
207
+ }
208
+
209
+ private static func posixCode(_ value: Int32) -> AkanNativeErrorCode {
210
+ switch value {
211
+ case ENOENT: .notFound
212
+ case EEXIST, ENOTEMPTY, EISDIR, ENOTDIR, EINVAL, ENAMETOOLONG, ELOOP: .invalidArgs
213
+ case EACCES, EPERM, EROFS: .permissionDenied
214
+ default: .internalError
215
+ }
216
+ }
217
+
218
+ private static func posixError(_ what: String) -> Problem {
219
+ let value = errno
220
+ return Problem(code: posixCode(value), message: "\(what): \(String(cString: strerror(value)))")
221
+ }
222
+
223
+ // MARK: arguments (same rules as src/common.ts)
224
+
225
+ private struct Base {
226
+ let name: String
227
+ /// realpath of the folder, which exists.
228
+ let root: String
229
+ /// The volume ignores case (scopes compare folded paths).
230
+ let fold: Bool
231
+ }
232
+
233
+ /// Whether the base named `name` is on a case-insensitive volume (iOS app containers usually
234
+ /// are not; a volume the user picked may be).
235
+ func folds(_ name: String) -> Bool {
236
+ guard let dir = dirs[name] else { return false }
237
+ let values = try? URL(fileURLWithPath: dir).resourceValues(forKeys: [.volumeSupportsCaseSensitiveNamesKey])
238
+ return values?.volumeSupportsCaseSensitiveNames == false
239
+ }
240
+
241
+ /// NOT_ALLOWED unless `parts` of `base` is inside the call's scope.
242
+ private func check(_ scope: AkanNativeScope?, _ base: Base, _ parts: [String]) throws {
243
+ guard let scope else { return }
244
+ let path = parts.joined(separator: "/")
245
+ guard scope.permits(["base": base.name, "path": path], pathFields: ["path"], fold: base.fold) else {
246
+ throw Problem(code: .notAllowed, message: "\(base.name):\(path.isEmpty ? "." : path) is outside the app's capabilities")
247
+ }
248
+ }
249
+
250
+ /// With a scope, what a recursive call reaches under a folder must be inside it as well: a copy
251
+ /// or move of "notes" must not carry a denied "notes/secret" along, nor remove it.
252
+ private func checkTree(_ scope: AkanNativeScope?, _ base: Base, _ parts: [String], _ dir: String, to: (Base, [String])? = nil) throws {
253
+ guard scope != nil, let items = Self.fm.enumerator(atPath: dir) else { return }
254
+ for case let rel as String in items {
255
+ let sub = rel.split(separator: "/").map(String.init)
256
+ try check(scope, base, parts + sub)
257
+ if let (toBase, toParts) = to { try check(scope, toBase, toParts + sub) }
258
+ }
259
+ }
260
+
261
+ /// The base named `value`; typed arguments pass a valid name, the untyped ones are checked here.
262
+ private func base(_ value: Any?, key: String) throws -> Base {
263
+ guard let name = value as? String, let dir = dirs[name] else {
264
+ throw Self.invalid("\(key) must be one of data, cache, documents, temp")
265
+ }
266
+ try Self.fm.createDirectory(atPath: dir, withIntermediateDirectories: true)
267
+ guard let root = Self.realPath(dir) else { throw Self.posixError(dir) }
268
+ return Base(name: name, root: root, fold: folds(name))
269
+ }
270
+
271
+ private func segments(_ value: Any?, allowRoot: Bool, key: String = "path") throws -> [String] {
272
+ guard let path = value as? String else { throw Self.invalid("\(key) must be a string") }
273
+ return try segments(path, allowRoot: allowRoot, key: key)
274
+ }
275
+
276
+ private func segments(_ path: String, allowRoot: Bool, key: String = "path") throws -> [String] {
277
+ if path.hasPrefix("/") { throw Self.invalid("\(key) must be relative to its base directory, not absolute (got \(path))") }
278
+ if path.contains("\\") { throw Self.invalid("\(key) must use \"/\" as separator (got \(path))") }
279
+ if path.contains("\0") { throw Self.invalid("\(key) must not contain NUL") }
280
+ let parts = path.split(separator: "/", omittingEmptySubsequences: true).map(String.init).filter { $0 != "." }
281
+ if parts.contains("..") { throw Self.invalid("\(key) must not contain \"..\" (got \(path))") }
282
+ if !allowRoot && parts.isEmpty { throw Self.invalid("\(key) must name a file or folder inside the base directory") }
283
+ return parts
284
+ }
285
+
286
+ private func flag(_ args: [String: Any], _ key: String) throws -> Bool {
287
+ switch args[key] {
288
+ case nil, is NSNull: return false
289
+ case let value as NSNumber where CFGetTypeID(value) == CFBooleanGetTypeID(): return value.boolValue
290
+ default: throw Self.invalid("\(key) must be a boolean")
291
+ }
292
+ }
293
+
294
+ private func encoding(_ args: [String: Any], allowNone: Bool) throws -> String? {
295
+ switch args["encoding"] {
296
+ case nil, is NSNull: return allowNone ? nil : "utf8"
297
+ case let value as String where value == "utf8" || value == "base64": return value
298
+ default: throw Self.invalid("encoding must be \"utf8\" or \"base64\"")
299
+ }
300
+ }
301
+
302
+ /// Strict base64 (standard alphabet, optional padding), as src/common.ts checkBase64.
303
+ private static func decodeBase64(_ text: String) throws -> Data {
304
+ let bytes = Array(text.utf8)
305
+ var body = bytes.count
306
+ while body > 0 && bytes[body - 1] == UInt8(ascii: "=") { body -= 1 }
307
+ let padding = bytes.count - body
308
+ let alphabetOK = bytes[..<body].allSatisfy { b in
309
+ (b >= 65 && b <= 90) || (b >= 97 && b <= 122) || (b >= 48 && b <= 57) || b == 43 || b == 47
310
+ }
311
+ guard alphabetOK, padding <= 2, bytes.count % 4 != 1, padding == 0 || bytes.count % 4 == 0 else {
312
+ throw invalid("data is not valid base64")
313
+ }
314
+ let padded = text + String(repeating: "=", count: (4 - text.utf8.count % 4) % 4)
315
+ guard let data = Data(base64Encoded: padded) else { throw invalid("data is not valid base64") }
316
+ return data
317
+ }
318
+
319
+ // MARK: resolving
320
+
321
+ private static func realPath(_ path: String) -> String? {
322
+ guard let resolved = realpath(path, nil) else { return nil }
323
+ defer { free(resolved) }
324
+ return String(cString: resolved)
325
+ }
326
+
327
+ private static func lstatExists(_ path: String) -> Bool {
328
+ var st = stat()
329
+ return lstat(path, &st) == 0
330
+ }
331
+
332
+ private static func join(_ base: String, _ parts: [String]) -> String {
333
+ parts.reduce(base) { ($0 as NSString).appendingPathComponent($1) }
334
+ }
335
+
336
+ /// Real location of `parts` in `base`; with `follow` false the last part itself is not resolved.
337
+ /// With a scope, the real location must be inside it too (through a symbolic link); the caller
338
+ /// then uses exactly this path.
339
+ private func resolve(_ base: Base, _ parts: [String], follow: Bool, _ scope: AkanNativeScope? = nil) throws -> (path: String, exists: Bool) {
340
+ let shown = parts.isEmpty ? "." : parts.joined(separator: "/")
341
+ let last = follow ? nil : parts.last
342
+ var current = Self.join(base.root, follow ? parts : Array(parts.dropLast()))
343
+ var rest: [String] = []
344
+ while true {
345
+ if let real = Self.realPath(current) {
346
+ guard real == base.root || real.hasPrefix(base.root + "/") else {
347
+ throw Problem(code: .permissionDenied, message: "\(shown) leads outside its base directory through a symbolic link")
348
+ }
349
+ let path = Self.join(real, rest.reversed() + (last.map { [$0] } ?? []))
350
+ let exists = rest.isEmpty && (last == nil || Self.lstatExists(path))
351
+ if scope != nil {
352
+ let actual = path == base.root ? [] : String(path.dropFirst(base.root.count + 1)).split(separator: "/").map(String.init)
353
+ if actual != parts { try check(scope, base, actual) }
354
+ }
355
+ return (path, exists)
356
+ }
357
+ guard errno == ENOENT || errno == ENOTDIR else { throw Self.posixError(shown) }
358
+ if Self.lstatExists(current) {
359
+ throw Problem(code: .permissionDenied, message: "\(shown) is a dangling symbolic link")
360
+ }
361
+ rest.append((current as NSString).lastPathComponent)
362
+ current = (current as NSString).deletingLastPathComponent
363
+ }
364
+ }
365
+
366
+ private enum Kind { case file, directory, symlink, other }
367
+
368
+ /// Type without following a final symbolic link (lstat).
369
+ private static func kind(_ path: String) -> Kind? {
370
+ guard let type = try? fm.attributesOfItem(atPath: path)[.type] as? FileAttributeType else { return nil }
371
+ switch type {
372
+ case .typeRegular: return .file
373
+ case .typeDirectory: return .directory
374
+ case .typeSymbolicLink: return .symlink
375
+ default: return .other
376
+ }
377
+ }
378
+
379
+ private func info(_ path: String) throws -> FilesystemFileInfo {
380
+ let attrs = try Self.fm.attributesOfItem(atPath: path)
381
+ let type: FilesystemEntryType
382
+ switch attrs[.type] as? FileAttributeType {
383
+ case .typeRegular?: type = .file
384
+ case .typeDirectory?: type = .directory
385
+ case .typeSymbolicLink?: type = .symlink
386
+ default: type = .other
387
+ }
388
+ let size = type == .file ? (attrs[.size] as? NSNumber)?.int64Value ?? 0 : 0
389
+ let mtime = ((attrs[.modificationDate] as? Date)?.timeIntervalSince1970 ?? 0) * 1000
390
+ return FilesystemFileInfo(type: type, size: Double(size), mtime: mtime.rounded())
391
+ }
392
+
393
+ private func requireParent(_ base: Base, _ parts: [String], _ shown: String) throws {
394
+ let parent = try resolve(base, Array(parts.dropLast()), follow: true)
395
+ guard parent.exists else { throw Self.notFound("the folder of \(shown) does not exist") }
396
+ var isDir: ObjCBool = false
397
+ guard Self.fm.fileExists(atPath: parent.path, isDirectory: &isDir), isDir.boolValue else {
398
+ throw Self.invalid("the parent of \(shown) is not a folder")
399
+ }
400
+ }
401
+
402
+ private static func mime(_ path: String) -> String {
403
+ let ext = (path as NSString).pathExtension
404
+ return ext.isEmpty ? "application/octet-stream" : UTType(filenameExtension: ext)?.preferredMIMEType ?? "application/octet-stream"
405
+ }
406
+
407
+ // MARK: operations
408
+
409
+ func readFile(_ args: [String: Any], _ scope: AkanNativeScope?) throws -> ReadOutcome {
410
+ let base = try base(args["base"], key: "base")
411
+ let parts = try segments(args["path"], allowRoot: false)
412
+ let encoding = try encoding(args, allowNone: true)
413
+ let shown = parts.joined(separator: "/")
414
+ let target = try resolve(base, parts, follow: true, scope)
415
+ guard target.exists else { throw Self.notFound("\(shown) does not exist") }
416
+ guard Self.kind(target.path) == .file else { throw Self.invalid("\(shown) is not a file") }
417
+ guard let encoding else { return .file(URL(fileURLWithPath: target.path), mime: Self.mime(target.path)) }
418
+ let data = try Data(contentsOf: URL(fileURLWithPath: target.path))
419
+ // String(decoding:) replaces invalid UTF-8 with U+FFFD and keeps a BOM, like the other platforms.
420
+ let text = encoding == "utf8" ? String(decoding: data, as: UTF8.self) : data.base64EncodedString()
421
+ return .data(text)
422
+ }
423
+
424
+ func writeFile(_ args: [String: Any], source: URL?, _ scope: AkanNativeScope?) throws {
425
+ let base = try base(args["base"], key: "base")
426
+ let parts = try segments(args["path"], allowRoot: false)
427
+ let append = try flag(args, "append")
428
+ let recursive = try flag(args, "recursive")
429
+ let hasData = !(args["data"] == nil || args["data"] is NSNull)
430
+ guard hasData != (source != nil) else { throw Self.invalid("pass either data or url") }
431
+ var bytes: Data?
432
+ if hasData {
433
+ guard let text = args["data"] as? String else { throw Self.invalid("data must be a string (text, or base64 with encoding: \"base64\")") }
434
+ bytes = try encoding(args, allowNone: false) == "base64" ? Self.decodeBase64(text) : Data(text.utf8)
435
+ } else if !(args["encoding"] == nil || args["encoding"] is NSNull) {
436
+ throw Self.invalid("encoding applies to data, not url")
437
+ }
438
+ let shown = parts.joined(separator: "/")
439
+ if recursive {
440
+ let parent = try resolve(base, Array(parts.dropLast()), follow: true)
441
+ if !parent.exists { try Self.fm.createDirectory(atPath: parent.path, withIntermediateDirectories: true) }
442
+ }
443
+ try requireParent(base, parts, shown)
444
+ let target = try resolve(base, parts, follow: true, scope)
445
+ if target.exists && Self.kind(target.path) != .file { throw Self.invalid("\(shown) is not a file") }
446
+ let url = URL(fileURLWithPath: target.path)
447
+
448
+ if append {
449
+ if !target.exists { guard Self.fm.createFile(atPath: target.path, contents: nil) else { throw Self.posixError(shown) } }
450
+ let out = try FileHandle(forWritingTo: url)
451
+ defer { try? out.close() }
452
+ try out.seekToEnd()
453
+ if let bytes {
454
+ try out.write(contentsOf: bytes)
455
+ } else if let source {
456
+ let input = try FileHandle(forReadingFrom: source)
457
+ defer { try? input.close() }
458
+ while let chunk = try input.read(upToCount: 1 << 20), !chunk.isEmpty { try out.write(contentsOf: chunk) }
459
+ }
460
+ return
461
+ }
462
+ if let bytes {
463
+ try bytes.write(to: url, options: .atomic) // temp file + rename
464
+ return
465
+ }
466
+ // Copy next to the target, then rename over it (atomic).
467
+ let tmp = (target.path as NSString).deletingLastPathComponent + "/.\(url.lastPathComponent).\(UUID().uuidString).tmp"
468
+ do {
469
+ try Self.fm.copyItem(atPath: source!.path, toPath: tmp)
470
+ guard Darwin.rename(tmp, target.path) == 0 else { throw Self.posixError(shown) }
471
+ } catch {
472
+ try? Self.fm.removeItem(atPath: tmp)
473
+ throw error
474
+ }
475
+ }
476
+
477
+ func readDir(_ args: FilesystemPathOptions, _ scope: AkanNativeScope?) throws -> FilesystemReadDirResult {
478
+ let base = try base(args.base.rawValue, key: "base")
479
+ let parts = try segments(args.path, allowRoot: true)
480
+ let shown = parts.isEmpty ? "." : parts.joined(separator: "/")
481
+ let dir = try resolve(base, parts, follow: true, scope)
482
+ guard dir.exists else { throw Self.notFound("\(shown) does not exist") }
483
+ guard Self.kind(dir.path) == .directory else { throw Self.invalid("\(shown) is not a folder") }
484
+ var entries: [FilesystemDirEntry] = []
485
+ for name in try Self.fm.contentsOfDirectory(atPath: dir.path) {
486
+ // Entries outside the scope are not listed (a dot file under an allowed "notes/**", a denied folder).
487
+ if scope != nil, (try? check(scope, base, parts + [name])) == nil { continue }
488
+ guard let info = try? info((dir.path as NSString).appendingPathComponent(name)) else { continue }
489
+ entries.append(FilesystemDirEntry(type: info.type, size: info.size, mtime: info.mtime, name: name))
490
+ }
491
+ // Sorted by UTF-16 code units, as the JS implementations sort.
492
+ entries.sort { $0.name.utf16.lexicographicallyPrecedes($1.name.utf16) }
493
+ return FilesystemReadDirResult(entries: entries)
494
+ }
495
+
496
+ /// stat
497
+ func fileInfo(_ args: FilesystemPathOptions, _ scope: AkanNativeScope?) throws -> FilesystemFileInfo {
498
+ let base = try base(args.base.rawValue, key: "base")
499
+ let target = try resolve(base, try segments(args.path, allowRoot: true), follow: true, scope)
500
+ guard target.exists else { throw Self.notFound("\(args.path) does not exist") }
501
+ return try info(target.path)
502
+ }
503
+
504
+ func exists(_ args: FilesystemPathOptions, _ scope: AkanNativeScope?) throws -> FilesystemExistsResult {
505
+ let base = try base(args.base.rawValue, key: "base")
506
+ let target = try resolve(base, try segments(args.path, allowRoot: true), follow: true, scope)
507
+ return FilesystemExistsResult(value: target.exists)
508
+ }
509
+
510
+ func mkdir(_ args: FilesystemMkdirArgs, _ scope: AkanNativeScope?) throws {
511
+ let base = try base(args.base.rawValue, key: "base")
512
+ let parts = try segments(args.path, allowRoot: true)
513
+ let recursive = args.recursive ?? false
514
+ let shown = parts.isEmpty ? "the base folder" : parts.joined(separator: "/")
515
+ let target = try resolve(base, parts, follow: true, scope)
516
+ if target.exists {
517
+ if recursive && Self.kind(target.path) == .directory { return }
518
+ throw Self.invalid("\(shown) already exists")
519
+ }
520
+ if !recursive { try requireParent(base, parts, shown) }
521
+ do {
522
+ try Self.fm.createDirectory(atPath: target.path, withIntermediateDirectories: recursive)
523
+ } catch {
524
+ // an ancestor that is a file
525
+ if Self.code(of: error) == .internalError { throw Self.invalid("a file is in the way of \(shown)") }
526
+ throw error
527
+ }
528
+ }
529
+
530
+ func remove(_ args: FilesystemRemoveArgs, _ scope: AkanNativeScope?) throws {
531
+ let base = try base(args.base.rawValue, key: "base")
532
+ let parts = try segments(args.path, allowRoot: false)
533
+ let recursive = args.recursive ?? false
534
+ let shown = parts.joined(separator: "/")
535
+ let target = try resolve(base, parts, follow: false, scope)
536
+ guard let kind = Self.kind(target.path) else { throw Self.notFound("\(shown) does not exist") }
537
+ if kind == .directory { try checkTree(scope, base, parts, target.path) }
538
+ // FileManager.removeItem always removes folders recursively.
539
+ if kind == .directory && !recursive {
540
+ guard try Self.fm.contentsOfDirectory(atPath: target.path).isEmpty else {
541
+ throw Self.invalid("\(shown) is not empty (pass recursive: true)")
542
+ }
543
+ }
544
+ try Self.fm.removeItem(atPath: target.path)
545
+ }
546
+
547
+ private static func fileId(_ path: String) -> (UInt64, UInt64)? {
548
+ guard let attrs = try? fm.attributesOfItem(atPath: path),
549
+ let node = (attrs[.systemFileNumber] as? NSNumber)?.uint64Value,
550
+ let device = (attrs[.systemNumber] as? NSNumber)?.uint64Value else { return nil }
551
+ return (node, device)
552
+ }
553
+
554
+ func move(_ args: FilesystemMoveOptions, keepSource: Bool, _ scope: AkanNativeScope?) throws {
555
+ let base = try base(args.base.rawValue, key: "base")
556
+ let toBase = try args.toBase.map { try self.base($0.rawValue, key: "toBase") } ?? base
557
+ let from = try segments(args.from, allowRoot: false, key: "from")
558
+ let to = try segments(args.to, allowRoot: false, key: "to")
559
+ let fromShown = from.joined(separator: "/")
560
+ let toShown = to.joined(separator: "/")
561
+ // rename moves a link itself, copy copies what it points to
562
+ let src = try resolve(base, from, follow: keepSource, scope)
563
+ guard src.exists, let srcKind = Self.kind(src.path) else { throw Self.notFound("\(fromShown) does not exist") }
564
+ try requireParent(toBase, to, toShown)
565
+ let dst = try resolve(toBase, to, follow: false, scope)
566
+ if dst.path == src.path { throw Self.invalid("from and to are the same path") }
567
+ if dst.path.hasPrefix(src.path + "/") { throw Self.invalid("cannot move or copy a folder into itself") }
568
+ if srcKind == .directory { try checkTree(scope, base, from, src.path, to: (toBase, to)) }
569
+ if let dstKind = Self.kind(dst.path) {
570
+ let same = Self.fileId(dst.path).map { d in Self.fileId(src.path).map { $0 == d } ?? false } ?? false
571
+ if same && keepSource { throw Self.invalid("from and to are the same file") }
572
+ if !same {
573
+ if dstKind == .directory { throw Self.invalid("\(toShown) already exists and is a folder") }
574
+ if srcKind == .directory { throw Self.invalid("\(toShown) already exists and is a file") }
575
+ }
576
+ }
577
+ if keepSource {
578
+ // Copy next to the destination, then rename over it, so an existing file is replaced atomically.
579
+ let tmp = (dst.path as NSString).deletingLastPathComponent + "/.\((dst.path as NSString).lastPathComponent).\(UUID().uuidString).tmp"
580
+ do {
581
+ try Self.fm.copyItem(atPath: src.path, toPath: tmp)
582
+ guard Darwin.rename(tmp, dst.path) == 0 else { throw Self.posixError(toShown) }
583
+ } catch {
584
+ try? Self.fm.removeItem(atPath: tmp)
585
+ throw error
586
+ }
587
+ return
588
+ }
589
+ if Darwin.rename(src.path, dst.path) == 0 { return }
590
+ guard errno == EXDEV else { throw Self.posixError(toShown) }
591
+ // Another volume: copy, then remove the source.
592
+ if Self.kind(dst.path) != nil { try Self.fm.removeItem(atPath: dst.path) }
593
+ try Self.fm.copyItem(atPath: src.path, toPath: dst.path)
594
+ try Self.fm.removeItem(atPath: src.path)
595
+ }
596
+ }
@@ -0,0 +1,45 @@
1
+ {
2
+ "id": "filesystem",
3
+ "apiVersion": 1,
4
+ "methods": ["readFile", "writeFile", "readDir", "stat", "exists", "mkdir", "remove", "rename", "copy", "paths"],
5
+ "events": [],
6
+ "codegen": true,
7
+ "web": "./src/web.ts",
8
+ "desktop": "./src/desktop.ts",
9
+ "macos": {
10
+ "infoPlist": {
11
+ "NSDocumentsFolderUsageDescription": "Save and open documents in your Documents folder."
12
+ }
13
+ },
14
+ "ios": {
15
+ "sources": ["ios/*.swift"],
16
+ "class": "FilesystemPlugin",
17
+ "privacyApis": { "FileTimestamp": ["C617.1"] },
18
+ "frameworks": ["UniformTypeIdentifiers"]
19
+ },
20
+ "android": {
21
+ "sources": ["android/*.kt"],
22
+ "class": "com.akanjs.plugins.filesystem.FilesystemPlugin"
23
+ },
24
+ "permissionSets": {
25
+ "read": {
26
+ "description": "Read files and folders, and the base paths.",
27
+ "permissions": ["allow-readFile", "allow-readDir", "allow-stat", "allow-exists", "allow-paths"]
28
+ },
29
+ "write": {
30
+ "description": "Create, change, move and remove files and folders.",
31
+ "permissions": ["allow-writeFile", "allow-mkdir", "allow-remove", "allow-rename", "allow-copy"]
32
+ }
33
+ },
34
+ "scope": {
35
+ "description": "Which files a call may touch. Both fields are optional globs.",
36
+ "fields": {
37
+ "base": "base directory: data, cache, documents or temp (glob)",
38
+ "path": "path relative to the base, \"/\" separated; * stays in a folder, ** crosses folders, \"dir/**\" includes dir itself; in allow no wildcard matches a name starting with \".\" (write \".config/**\"), in deny they do"
39
+ },
40
+ "pathFields": ["path"]
41
+ },
42
+ "defaultScope": {
43
+ "allow": [{ "base": "data" }, { "base": "cache" }, { "base": "temp" }]
44
+ }
45
+ }