akanjs 3.0.0-beta.20 → 3.0.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ko.md +0 -1
- package/README.md +0 -1
- package/base/baseEnv.ts +40 -3
- package/client/cookie.ts +56 -20
- package/client/device.ts +47 -95
- package/client/frameConfig.ts +2 -2
- package/client/native.ts +44 -0
- package/client/router.ts +11 -1
- package/client/rscNavigation.ts +5 -0
- package/client/storage.ts +68 -39
- package/fetch/client/fetchClient.ts +13 -4
- package/index.ts +47 -46
- package/package.json +6 -87
- package/server/devtools/signalSerializer.ts +1 -2
- package/server/hmr/devHmrController.ts +29 -11
- package/server/resolver/signal.resolver.ts +1 -10
- package/server/routeTreeBuilder.ts +8 -11
- package/server/routing/apiRouter.ts +15 -2
- package/server/rscClient.tsx +1 -2
- package/server/ssrFromRscRenderer.tsx +2 -0
- package/server/webRouter.ts +1 -0
- package/signal/CrossSiteGuard.ts +34 -2
- package/signal/endpoint.ts +12 -7
- package/signal/endpointInfo.ts +13 -0
- package/signal/internal.ts +9 -5
- package/signal/serializer/fetch.serializer.ts +6 -3
- package/signal/slice.ts +34 -24
- package/store/baseSt.ts +0 -1
- package/store/storeInstance.ts +29 -17
- package/types/client/cookie.d.ts +6 -4
- package/types/client/device.d.ts +7 -10
- package/types/client/native.d.ts +26 -0
- package/types/client/rscNavigation.d.ts +4 -0
- package/types/client/storage.d.ts +8 -1
- package/types/index.d.ts +48 -44
- package/types/server/hmr/devHmrController.d.ts +2 -1
- package/types/server/resolver/signal.resolver.d.ts +0 -1
- package/types/server/rscClient.d.ts +0 -3
- package/types/signal/CrossSiteGuard.d.ts +7 -2
- package/types/signal/endpoint.d.ts +1 -1
- package/types/signal/endpointInfo.d.ts +3 -0
- package/types/signal/slice.d.ts +3 -2
- package/types/store/baseSt.d.ts +0 -13
- package/types/vendor/@akanjs/native/packages/cli/src/api.d.ts +182 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/build.d.ts +28 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/compat.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/dev.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/doctor.d.ts +37 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/plugin.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/signing.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/test.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/toolchain.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/commands/update.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/config.d.ts +278 -0
- package/types/vendor/@akanjs/native/packages/cli/src/index.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/acl.d.ts +21 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/apilevel.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/apk.d.ts +36 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/args.d.ts +9 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/boot.d.ts +32 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/chrome.d.ts +6 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/codegen.d.ts +94 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/compat.d.ts +49 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/configkeys.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/csp.d.ts +51 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/env.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/exec.d.ts +31 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/googleservices.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/hmr.d.ts +120 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/html.d.ts +20 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/icons.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/image.d.ts +21 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/iossigning.d.ts +81 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/launch.d.ts +51 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/log.d.ts +42 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.d.ts +18 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/maven.d.ts +97 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/names.d.ts +45 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.d.ts +67 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/permissions.d.ts +10 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/plist.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/png.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/prepare.d.ts +138 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/privacy.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/project.d.ts +208 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/root.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/routes.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/serve.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/signing.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/spec.d.ts +96 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/toolchains.d.ts +150 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/updates.d.ts +77 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/vectors.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/lib/xml.d.ts +13 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/android.d.ts +57 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/desktop.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/index.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/ios.d.ts +44 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/linux.d.ts +6 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/macos.d.ts +7 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/targets.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/web-run.d.ts +15 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms/windows.d.ts +8 -0
- package/types/vendor/@akanjs/native/packages/cli/src/platforms.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/cli/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/core/src/acl.d.ts +97 -0
- package/types/vendor/@akanjs/native/packages/core/src/boot.d.ts +66 -0
- package/types/vendor/@akanjs/native/packages/core/src/contract.d.ts +35 -0
- package/types/vendor/@akanjs/native/packages/core/src/errors.d.ts +27 -0
- package/types/vendor/@akanjs/native/packages/core/src/files.d.ts +23 -0
- package/types/vendor/@akanjs/native/packages/core/src/index.d.ts +14 -0
- package/types/vendor/@akanjs/native/packages/core/src/kernel.d.ts +112 -0
- package/types/vendor/@akanjs/native/packages/core/src/live.d.ts +12 -0
- package/types/vendor/@akanjs/native/packages/core/src/mime.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/core/src/plugin.d.ts +71 -0
- package/types/vendor/@akanjs/native/packages/core/src/protocol.d.ts +109 -0
- package/types/vendor/@akanjs/native/packages/core/src/runtime.d.ts +66 -0
- package/types/vendor/@akanjs/native/packages/core/src/state.d.ts +28 -0
- package/types/vendor/@akanjs/native/packages/core/src/testing.d.ts +41 -0
- package/types/vendor/@akanjs/native/packages/core/src/version.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/core/src/veto.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/core/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/deeplinks.d.ts +24 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/delta.d.ts +2 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/dispatcher.d.ts +95 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/ffi.d.ts +144 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/host.d.ts +11 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/lifecycle.d.ts +40 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/main.d.ts +4 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/page-veto.d.ts +17 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/paths.d.ts +25 -0
- package/types/vendor/@akanjs/native/packages/desktop/src/plugin.d.ts +179 -0
- package/types/vendor/@akanjs/native/packages/react/src/index.d.ts +8 -0
- package/types/vendor/@akanjs/native/packages/react/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/announce.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/index.d.ts +47 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/accessibility/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/app/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/app/src/index.d.ts +66 -0
- package/types/vendor/@akanjs/native/plugins/app/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/app/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src/index.d.ts +19 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/app-state/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/index.d.ts +32 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/setting.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/appearance/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/args.d.ts +18 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/desktop.d.ts +17 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src/index.d.ts +41 -0
- package/types/vendor/@akanjs/native/plugins/auth-session/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src/desktop.d.ts +44 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src/index.d.ts +44 -0
- package/types/vendor/@akanjs/native/plugins/autostart/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/count.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/index.d.ts +37 -0
- package/types/vendor/@akanjs/native/plugins/badge/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/badge/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/biometric/src/index.d.ts +53 -0
- package/types/vendor/@akanjs/native/plugins/biometric/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/args.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/index.d.ts +36 -0
- package/types/vendor/@akanjs/native/plugins/browser/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/browser/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/desktop.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/camera/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/camera/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/index.d.ts +40 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/clipboard/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/device/src/desktop.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/device/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/device/src/web.d.ts +22 -0
- package/types/vendor/@akanjs/native/plugins/device/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/index.d.ts +60 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/options.d.ts +29 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/dialog/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/dock/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/dock/src/index.d.ts +46 -0
- package/types/vendor/@akanjs/native/plugins/dock/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/common.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/desktop.d.ts +9 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/index.d.ts +84 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src/web.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/file-picker/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/common.d.ts +49 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/index.d.ts +123 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/filesystem/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src/index.d.ts +93 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src/web.d.ts +11 -0
- package/types/vendor/@akanjs/native/plugins/geolocation/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src/index.d.ts +52 -0
- package/types/vendor/@akanjs/native/plugins/global-shortcut/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src/index.d.ts +31 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/haptics/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/http/src/common.d.ts +71 -0
- package/types/vendor/@akanjs/native/plugins/http/src/desktop.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/http/src/index.d.ts +104 -0
- package/types/vendor/@akanjs/native/plugins/http/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/http/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/iap/src/index.d.ts +171 -0
- package/types/vendor/@akanjs/native/plugins/iap/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/desktop.d.ts +15 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/keep-awake/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src/index.d.ts +42 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/keyboard/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/desktop.d.ts +29 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/index.d.ts +126 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/schedule.d.ts +38 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/timers.d.ts +25 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/local-notifications/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/menu/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/menu/src/index.d.ts +85 -0
- package/types/vendor/@akanjs/native/plugins/menu/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/network/src/index.d.ts +22 -0
- package/types/vendor/@akanjs/native/plugins/network/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/network/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/desktop.d.ts +14 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/url.d.ts +16 -0
- package/types/vendor/@akanjs/native/plugins/opener/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/opener/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/index.d.ts +26 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/preferences/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/push/src/index.d.ts +57 -0
- package/types/vendor/@akanjs/native/plugins/push/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/index.d.ts +70 -0
- package/types/vendor/@akanjs/native/plugins/screen/src/web.d.ts +18 -0
- package/types/vendor/@akanjs/native/plugins/screen/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/index.d.ts +32 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/types.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src/web.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/screen-orientation/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src/desktop.d.ts +16 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src/index.d.ts +39 -0
- package/types/vendor/@akanjs/native/plugins/secure-storage/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/share/src/index.d.ts +55 -0
- package/types/vendor/@akanjs/native/plugins/share/src/options.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/share/src/web.d.ts +5 -0
- package/types/vendor/@akanjs/native/plugins/share/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/desktop.d.ts +8 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/index.d.ts +25 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src/socket.d.ts +46 -0
- package/types/vendor/@akanjs/native/plugins/single-instance/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src/index.d.ts +19 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src/web.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/splash-screen/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/common.d.ts +34 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/desktop.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src/index.d.ts +115 -0
- package/types/vendor/@akanjs/native/plugins/sqlite/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/index.d.ts +30 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/queue.d.ts +23 -0
- package/types/vendor/@akanjs/native/plugins/toast/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/toast/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/tray/src/desktop.d.ts +3 -0
- package/types/vendor/@akanjs/native/plugins/tray/src/index.d.ts +113 -0
- package/types/vendor/@akanjs/native/plugins/tray/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/updates/src/desktop.d.ts +4 -0
- package/types/vendor/@akanjs/native/plugins/updates/src/index.d.ts +68 -0
- package/types/vendor/@akanjs/native/plugins/updates/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/window/src/desktop.d.ts +6 -0
- package/types/vendor/@akanjs/native/plugins/window/src/index.d.ts +185 -0
- package/types/vendor/@akanjs/native/plugins/window/src/web.d.ts +2 -0
- package/types/vendor/@akanjs/native/plugins/window/src.d.ts +1 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/desktop.d.ts +7 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/index.d.ts +33 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src/state.d.ts +39 -0
- package/types/vendor/@akanjs/native/plugins/window-state/src.d.ts +1 -0
- package/types/webkit/index.d.ts +0 -2
- package/types/webkit/nativeNavigation.d.ts +25 -0
- package/types/webkit/nativePurchase.d.ts +37 -0
- package/types/webkit/useCamera.d.ts +13 -15
- package/types/webkit/useGeoLocation.d.ts +4 -5
- package/types/webkit/usePurchase.d.ts +12 -16
- package/ui/Link/Anchor.tsx +2 -5
- package/ui/System/Client.tsx +2 -6
- package/vendor/@akanjs/native/LICENSE +21 -0
- package/vendor/@akanjs/native/README.ko.md +88 -0
- package/vendor/@akanjs/native/README.md +93 -0
- package/vendor/@akanjs/native/THIRD_PARTY_NOTICES.md +237 -0
- package/vendor/@akanjs/native/native/android/maven.lock.json +1751 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAcl.kt +243 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeActivity.kt +936 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeApplication.kt +189 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeAssetServer.kt +225 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeBridge.kt +444 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeCompat.kt +55 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeContract.kt +99 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeEd25519.kt +100 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeFileProvider.kt +71 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeKernel.kt +324 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativePlugin.kt +361 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeSpec.kt +100 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeUpdates.kt +305 -0
- package/vendor/@akanjs/native/native/android/src/com/akanjs/runtime/AkanNativeVectors.kt +132 -0
- package/vendor/@akanjs/native/native/desktop/Cargo.lock +2565 -0
- package/vendor/@akanjs/native/native/desktop/Cargo.toml +49 -0
- package/vendor/@akanjs/native/native/desktop/build.rs +19 -0
- package/vendor/@akanjs/native/native/desktop/rust-toolchain.toml +7 -0
- package/vendor/@akanjs/native/native/desktop/src/accelerator.rs +466 -0
- package/vendor/@akanjs/native/native/desktop/src/autostart.rs +158 -0
- package/vendor/@akanjs/native/native/desktop/src/camera.rs +53 -0
- package/vendor/@akanjs/native/native/desktop/src/chrome.rs +710 -0
- package/vendor/@akanjs/native/native/desktop/src/contract.rs +105 -0
- package/vendor/@akanjs/native/native/desktop/src/devproxy.rs +234 -0
- package/vendor/@akanjs/native/native/desktop/src/dialog_args.rs +189 -0
- package/vendor/@akanjs/native/native/desktop/src/dock.rs +209 -0
- package/vendor/@akanjs/native/native/desktop/src/hotkey.rs +209 -0
- package/vendor/@akanjs/native/native/desktop/src/js_panels.rs +125 -0
- package/vendor/@akanjs/native/native/desktop/src/json.rs +272 -0
- package/vendor/@akanjs/native/native/desktop/src/keychain.rs +151 -0
- package/vendor/@akanjs/native/native/desktop/src/lib.rs +2185 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/appearance.rs +177 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/camera.rs +11 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/clipboard.rs +48 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/device.rs +9 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/dialogs.rs +348 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/dock.rs +146 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/hotkey.rs +228 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/keychain.rs +243 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/menu.rs +445 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/mod.rs +116 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/notify.rs +211 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/open.rs +79 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/power.rs +155 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/screen.rs +158 -0
- package/vendor/@akanjs/native/native/desktop/src/linux/tray.rs +604 -0
- package/vendor/@akanjs/native/native/desktop/src/menu.rs +517 -0
- package/vendor/@akanjs/native/native/desktop/src/navigation.rs +381 -0
- package/vendor/@akanjs/native/native/desktop/src/notify.rs +411 -0
- package/vendor/@akanjs/native/native/desktop/src/notify_schedule.rs +382 -0
- package/vendor/@akanjs/native/native/desktop/src/page_menu.rs +287 -0
- package/vendor/@akanjs/native/native/desktop/src/panels.rs +333 -0
- package/vendor/@akanjs/native/native/desktop/src/placement.rs +92 -0
- package/vendor/@akanjs/native/native/desktop/src/routes.rs +153 -0
- package/vendor/@akanjs/native/native/desktop/src/screen.rs +190 -0
- package/vendor/@akanjs/native/native/desktop/src/tray.rs +279 -0
- package/vendor/@akanjs/native/native/desktop/src/vectors.rs +126 -0
- package/vendor/@akanjs/native/native/desktop/src/win/appearance.rs +51 -0
- package/vendor/@akanjs/native/native/desktop/src/win/autostart.rs +77 -0
- package/vendor/@akanjs/native/native/desktop/src/win/camera.rs +34 -0
- package/vendor/@akanjs/native/native/desktop/src/win/clipboard.rs +106 -0
- package/vendor/@akanjs/native/native/desktop/src/win/device.rs +80 -0
- package/vendor/@akanjs/native/native/desktop/src/win/dialogs.rs +917 -0
- package/vendor/@akanjs/native/native/desktop/src/win/dock.rs +228 -0
- package/vendor/@akanjs/native/native/desktop/src/win/hotkey.rs +110 -0
- package/vendor/@akanjs/native/native/desktop/src/win/keychain.rs +103 -0
- package/vendor/@akanjs/native/native/desktop/src/win/menu.rs +500 -0
- package/vendor/@akanjs/native/native/desktop/src/win/mod.rs +100 -0
- package/vendor/@akanjs/native/native/desktop/src/win/msgwin.rs +86 -0
- package/vendor/@akanjs/native/native/desktop/src/win/notify.rs +334 -0
- package/vendor/@akanjs/native/native/desktop/src/win/open.rs +127 -0
- package/vendor/@akanjs/native/native/desktop/src/win/power.rs +64 -0
- package/vendor/@akanjs/native/native/desktop/src/win/registry.rs +87 -0
- package/vendor/@akanjs/native/native/desktop/src/win/screen.rs +127 -0
- package/vendor/@akanjs/native/native/desktop/src/win/tray.rs +280 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeAcl.swift +241 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeApp.swift +285 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeBridge.swift +407 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeContract.swift +106 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeKernel.swift +317 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativePlugin.swift +250 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSchemeHandler.swift +209 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeShell.swift +161 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeSpec.swift +143 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeUpdates.swift +270 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeVectors.swift +155 -0
- package/vendor/@akanjs/native/native/ios/Sources/AkanNativeViewController.swift +371 -0
- package/vendor/@akanjs/native/packages/cli/src/api.ts +600 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/build.ts +101 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/compat.ts +53 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/dev.ts +249 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/doctor.ts +536 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/plugin.ts +164 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/signing.ts +32 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/test.ts +130 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/toolchain.ts +143 -0
- package/vendor/@akanjs/native/packages/cli/src/commands/update.ts +168 -0
- package/vendor/@akanjs/native/packages/cli/src/config.ts +257 -0
- package/vendor/@akanjs/native/packages/cli/src/index.ts +77 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/acl.ts +420 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/apilevel.ts +245 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/apk.ts +203 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/args.ts +44 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/boot.ts +73 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/chrome.ts +89 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/codegen.ts +1128 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/compat.ts +185 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/configkeys.ts +91 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/csp.ts +198 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/env.ts +257 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/exec.ts +104 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/googleservices.ts +53 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/hmr.ts +534 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/html.ts +63 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/icons.ts +316 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/image.ts +175 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/iossigning.ts +295 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/launch.ts +98 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/log.ts +105 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/manifestmerge.ts +107 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/maven.ts +244 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/names.ts +202 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/native-plugins.ts +326 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/nativeconfig.ts +68 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/permissions.ts +80 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/plist.ts +139 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/png.ts +240 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/prepare.ts +290 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/privacy.ts +64 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/project.ts +710 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/root.ts +18 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/routes.ts +3 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/serve.ts +83 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/signing.ts +117 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/spec.ts +521 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/toolchains.ts +579 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/updates.ts +160 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/vectors.ts +121 -0
- package/vendor/@akanjs/native/packages/cli/src/lib/xml.ts +72 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/android.ts +1320 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/desktop-update.ts +78 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/desktop.ts +279 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/index.ts +31 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/ios.ts +801 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/linux.ts +52 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/macos.ts +97 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/targets.ts +12 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/web-run.ts +69 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/web.ts +28 -0
- package/vendor/@akanjs/native/packages/cli/src/platforms/windows.ts +82 -0
- package/vendor/@akanjs/native/packages/core/contract.json +96 -0
- package/vendor/@akanjs/native/packages/core/src/acl.ts +272 -0
- package/vendor/@akanjs/native/packages/core/src/boot.ts +97 -0
- package/vendor/@akanjs/native/packages/core/src/contract.ts +100 -0
- package/vendor/@akanjs/native/packages/core/src/errors.ts +95 -0
- package/vendor/@akanjs/native/packages/core/src/files.ts +105 -0
- package/vendor/@akanjs/native/packages/core/src/index.ts +35 -0
- package/vendor/@akanjs/native/packages/core/src/kernel.ts +281 -0
- package/vendor/@akanjs/native/packages/core/src/live.ts +62 -0
- package/vendor/@akanjs/native/packages/core/src/mime.ts +8 -0
- package/vendor/@akanjs/native/packages/core/src/plugin.ts +358 -0
- package/vendor/@akanjs/native/packages/core/src/protocol.ts +194 -0
- package/vendor/@akanjs/native/packages/core/src/runtime.ts +520 -0
- package/vendor/@akanjs/native/packages/core/src/state.ts +46 -0
- package/vendor/@akanjs/native/packages/core/src/testing.ts +176 -0
- package/vendor/@akanjs/native/packages/core/src/version.ts +2 -0
- package/vendor/@akanjs/native/packages/core/src/veto.ts +55 -0
- package/vendor/@akanjs/native/packages/core/vectors/acl.json +57 -0
- package/vendor/@akanjs/native/packages/core/vectors/bridge.json +76 -0
- package/vendor/@akanjs/native/packages/core/vectors/ed25519.json +29 -0
- package/vendor/@akanjs/native/packages/core/vectors/ids.json +73 -0
- package/vendor/@akanjs/native/packages/core/vectors/navigation.json +75 -0
- package/vendor/@akanjs/native/packages/core/vectors/ranges.json +39 -0
- package/vendor/@akanjs/native/packages/core/vectors/retained.json +17 -0
- package/vendor/@akanjs/native/packages/core/vectors/routes.json +66 -0
- package/vendor/@akanjs/native/packages/core/vectors/scope.json +143 -0
- package/vendor/@akanjs/native/packages/desktop/src/deeplinks.ts +143 -0
- package/vendor/@akanjs/native/packages/desktop/src/delta.ts +174 -0
- package/vendor/@akanjs/native/packages/desktop/src/dispatcher.ts +679 -0
- package/vendor/@akanjs/native/packages/desktop/src/ffi.ts +76 -0
- package/vendor/@akanjs/native/packages/desktop/src/host.ts +355 -0
- package/vendor/@akanjs/native/packages/desktop/src/lifecycle.ts +142 -0
- package/vendor/@akanjs/native/packages/desktop/src/main.ts +133 -0
- package/vendor/@akanjs/native/packages/desktop/src/page-veto.ts +103 -0
- package/vendor/@akanjs/native/packages/desktop/src/paths.ts +59 -0
- package/vendor/@akanjs/native/packages/desktop/src/plugin.ts +232 -0
- package/vendor/@akanjs/native/packages/react/src/index.ts +23 -0
- package/vendor/@akanjs/native/plugins/accessibility/android/AccessibilityPlugin.kt +96 -0
- package/vendor/@akanjs/native/plugins/accessibility/ios/AccessibilityPlugin.swift +92 -0
- package/vendor/@akanjs/native/plugins/accessibility/native-plugin.json +21 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/announce.ts +71 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/index.ts +77 -0
- package/vendor/@akanjs/native/plugins/accessibility/src/web.ts +52 -0
- package/vendor/@akanjs/native/plugins/app/android/AppPlugin.kt +72 -0
- package/vendor/@akanjs/native/plugins/app/ios/AppPlugin.swift +52 -0
- package/vendor/@akanjs/native/plugins/app/native-plugin.json +21 -0
- package/vendor/@akanjs/native/plugins/app/src/desktop.ts +64 -0
- package/vendor/@akanjs/native/plugins/app/src/index.ts +77 -0
- package/vendor/@akanjs/native/plugins/app/src/web.ts +12 -0
- package/vendor/@akanjs/native/plugins/app-state/android/AppStatePlugin.kt +54 -0
- package/vendor/@akanjs/native/plugins/app-state/ios/AppStatePlugin.swift +58 -0
- package/vendor/@akanjs/native/plugins/app-state/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/app-state/src/index.ts +42 -0
- package/vendor/@akanjs/native/plugins/app-state/src/web.ts +33 -0
- package/vendor/@akanjs/native/plugins/appearance/android/AppearancePlugin.kt +133 -0
- package/vendor/@akanjs/native/plugins/appearance/ios/AppearancePlugin.swift +109 -0
- package/vendor/@akanjs/native/plugins/appearance/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/appearance/src/desktop.ts +133 -0
- package/vendor/@akanjs/native/plugins/appearance/src/index.ts +62 -0
- package/vendor/@akanjs/native/plugins/appearance/src/setting.ts +18 -0
- package/vendor/@akanjs/native/plugins/appearance/src/web.ts +25 -0
- package/vendor/@akanjs/native/plugins/auth-session/android/AuthSessionPlugin.kt +171 -0
- package/vendor/@akanjs/native/plugins/auth-session/ios/AuthSessionPlugin.swift +112 -0
- package/vendor/@akanjs/native/plugins/auth-session/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/args.ts +62 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/desktop.ts +133 -0
- package/vendor/@akanjs/native/plugins/auth-session/src/index.ts +39 -0
- package/vendor/@akanjs/native/plugins/autostart/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/autostart/src/desktop.ts +189 -0
- package/vendor/@akanjs/native/plugins/autostart/src/index.ts +51 -0
- package/vendor/@akanjs/native/plugins/badge/ios/BadgePlugin.swift +92 -0
- package/vendor/@akanjs/native/plugins/badge/native-plugin.json +15 -0
- package/vendor/@akanjs/native/plugins/badge/src/count.ts +12 -0
- package/vendor/@akanjs/native/plugins/badge/src/desktop.ts +24 -0
- package/vendor/@akanjs/native/plugins/badge/src/index.ts +40 -0
- package/vendor/@akanjs/native/plugins/badge/src/web.ts +37 -0
- package/vendor/@akanjs/native/plugins/biometric/android/BiometricPlugin.kt +179 -0
- package/vendor/@akanjs/native/plugins/biometric/ios/BiometricPlugin.swift +129 -0
- package/vendor/@akanjs/native/plugins/biometric/native-plugin.json +22 -0
- package/vendor/@akanjs/native/plugins/biometric/src/index.ts +100 -0
- package/vendor/@akanjs/native/plugins/browser/android/BrowserPlugin.kt +178 -0
- package/vendor/@akanjs/native/plugins/browser/ios/BrowserPlugin.swift +63 -0
- package/vendor/@akanjs/native/plugins/browser/native-plugin.json +22 -0
- package/vendor/@akanjs/native/plugins/browser/src/args.ts +34 -0
- package/vendor/@akanjs/native/plugins/browser/src/desktop.ts +40 -0
- package/vendor/@akanjs/native/plugins/browser/src/index.ts +47 -0
- package/vendor/@akanjs/native/plugins/browser/src/web.ts +60 -0
- package/vendor/@akanjs/native/plugins/camera/android/CameraPlugin.kt +365 -0
- package/vendor/@akanjs/native/plugins/camera/ios/CameraPlugin.swift +296 -0
- package/vendor/@akanjs/native/plugins/camera/native-plugin.json +32 -0
- package/vendor/@akanjs/native/plugins/camera/src/desktop.ts +27 -0
- package/vendor/@akanjs/native/plugins/camera/src/index.ts +85 -0
- package/vendor/@akanjs/native/plugins/camera/src/web.ts +267 -0
- package/vendor/@akanjs/native/plugins/clipboard/android/ClipboardPlugin.kt +51 -0
- package/vendor/@akanjs/native/plugins/clipboard/ios/ClipboardPlugin.swift +35 -0
- package/vendor/@akanjs/native/plugins/clipboard/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/desktop.ts +66 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/index.ts +72 -0
- package/vendor/@akanjs/native/plugins/clipboard/src/web.ts +69 -0
- package/vendor/@akanjs/native/plugins/device/android/DevicePlugin.kt +70 -0
- package/vendor/@akanjs/native/plugins/device/ios/DevicePlugin.swift +80 -0
- package/vendor/@akanjs/native/plugins/device/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/device/src/desktop.ts +276 -0
- package/vendor/@akanjs/native/plugins/device/src/index.ts +72 -0
- package/vendor/@akanjs/native/plugins/device/src/web.ts +162 -0
- package/vendor/@akanjs/native/plugins/dialog/android/DialogPlugin.kt +260 -0
- package/vendor/@akanjs/native/plugins/dialog/ios/DialogPlugin.swift +198 -0
- package/vendor/@akanjs/native/plugins/dialog/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/dialog/src/desktop.ts +80 -0
- package/vendor/@akanjs/native/plugins/dialog/src/index.ts +87 -0
- package/vendor/@akanjs/native/plugins/dialog/src/options.ts +111 -0
- package/vendor/@akanjs/native/plugins/dialog/src/web.ts +296 -0
- package/vendor/@akanjs/native/plugins/dock/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/dock/src/desktop.ts +34 -0
- package/vendor/@akanjs/native/plugins/dock/src/index.ts +46 -0
- package/vendor/@akanjs/native/plugins/file-picker/android/FilePickerPlugin.kt +316 -0
- package/vendor/@akanjs/native/plugins/file-picker/ios/FilePickerPlugin.swift +366 -0
- package/vendor/@akanjs/native/plugins/file-picker/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/common.ts +125 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/desktop.ts +164 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/index.ts +187 -0
- package/vendor/@akanjs/native/plugins/file-picker/src/web.ts +158 -0
- package/vendor/@akanjs/native/plugins/filesystem/android/FilesystemPlugin.kt +561 -0
- package/vendor/@akanjs/native/plugins/filesystem/ios/FilesystemPlugin.swift +596 -0
- package/vendor/@akanjs/native/plugins/filesystem/native-plugin.json +45 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/common.ts +150 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/desktop.ts +438 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/index.ts +179 -0
- package/vendor/@akanjs/native/plugins/filesystem/src/web.ts +334 -0
- package/vendor/@akanjs/native/plugins/geolocation/android/GeolocationPlugin.kt +360 -0
- package/vendor/@akanjs/native/plugins/geolocation/ios/GeolocationPlugin.swift +284 -0
- package/vendor/@akanjs/native/plugins/geolocation/native-plugin.json +23 -0
- package/vendor/@akanjs/native/plugins/geolocation/src/index.ts +155 -0
- package/vendor/@akanjs/native/plugins/geolocation/src/web.ts +132 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/src/desktop.ts +36 -0
- package/vendor/@akanjs/native/plugins/global-shortcut/src/index.ts +55 -0
- package/vendor/@akanjs/native/plugins/haptics/android/HapticsPlugin.kt +127 -0
- package/vendor/@akanjs/native/plugins/haptics/ios/HapticsPlugin.swift +127 -0
- package/vendor/@akanjs/native/plugins/haptics/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/haptics/src/index.ts +34 -0
- package/vendor/@akanjs/native/plugins/haptics/src/web.ts +53 -0
- package/vendor/@akanjs/native/plugins/http/android/HttpPlugin.kt +234 -0
- package/vendor/@akanjs/native/plugins/http/android/HttpUrl.kt +182 -0
- package/vendor/@akanjs/native/plugins/http/ios/HttpPlugin.swift +228 -0
- package/vendor/@akanjs/native/plugins/http/ios/HttpUrl.swift +166 -0
- package/vendor/@akanjs/native/plugins/http/native-plugin.json +27 -0
- package/vendor/@akanjs/native/plugins/http/src/common.ts +294 -0
- package/vendor/@akanjs/native/plugins/http/src/desktop.ts +69 -0
- package/vendor/@akanjs/native/plugins/http/src/index.ts +181 -0
- package/vendor/@akanjs/native/plugins/http/src/web.ts +40 -0
- package/vendor/@akanjs/native/plugins/iap/android/IapPlugin.kt +358 -0
- package/vendor/@akanjs/native/plugins/iap/ios/IapPlugin.swift +306 -0
- package/vendor/@akanjs/native/plugins/iap/native-plugin.json +28 -0
- package/vendor/@akanjs/native/plugins/iap/src/index.ts +206 -0
- package/vendor/@akanjs/native/plugins/keep-awake/android/KeepAwakePlugin.kt +48 -0
- package/vendor/@akanjs/native/plugins/keep-awake/ios/KeepAwakePlugin.swift +36 -0
- package/vendor/@akanjs/native/plugins/keep-awake/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/desktop.ts +127 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/index.ts +79 -0
- package/vendor/@akanjs/native/plugins/keep-awake/src/web.ts +78 -0
- package/vendor/@akanjs/native/plugins/keyboard/android/KeyboardPlugin.kt +77 -0
- package/vendor/@akanjs/native/plugins/keyboard/ios/KeyboardPlugin.swift +93 -0
- package/vendor/@akanjs/native/plugins/keyboard/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/keyboard/src/index.ts +78 -0
- package/vendor/@akanjs/native/plugins/keyboard/src/web.ts +57 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationReceiver.kt +38 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotifications.kt +284 -0
- package/vendor/@akanjs/native/plugins/local-notifications/android/LocalNotificationsPlugin.kt +248 -0
- package/vendor/@akanjs/native/plugins/local-notifications/ios/LocalNotificationsPlugin.swift +279 -0
- package/vendor/@akanjs/native/plugins/local-notifications/native-plugin.json +35 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/desktop.ts +196 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/index.ts +174 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/schedule.ts +164 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/timers.ts +72 -0
- package/vendor/@akanjs/native/plugins/local-notifications/src/web.ts +158 -0
- package/vendor/@akanjs/native/plugins/menu/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/menu/src/desktop.ts +52 -0
- package/vendor/@akanjs/native/plugins/menu/src/index.ts +107 -0
- package/vendor/@akanjs/native/plugins/network/android/NetworkPlugin.kt +124 -0
- package/vendor/@akanjs/native/plugins/network/ios/NetworkPlugin.swift +82 -0
- package/vendor/@akanjs/native/plugins/network/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/network/src/index.ts +59 -0
- package/vendor/@akanjs/native/plugins/network/src/web.ts +43 -0
- package/vendor/@akanjs/native/plugins/opener/android/OpenerPlugin.kt +81 -0
- package/vendor/@akanjs/native/plugins/opener/ios/OpenerPlugin.swift +83 -0
- package/vendor/@akanjs/native/plugins/opener/native-plugin.json +25 -0
- package/vendor/@akanjs/native/plugins/opener/src/desktop.ts +88 -0
- package/vendor/@akanjs/native/plugins/opener/src/index.ts +35 -0
- package/vendor/@akanjs/native/plugins/opener/src/url.ts +39 -0
- package/vendor/@akanjs/native/plugins/opener/src/web.ts +33 -0
- package/vendor/@akanjs/native/plugins/preferences/android/PreferencesPlugin.kt +44 -0
- package/vendor/@akanjs/native/plugins/preferences/ios/PreferencesPlugin.swift +47 -0
- package/vendor/@akanjs/native/plugins/preferences/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/preferences/src/desktop.ts +59 -0
- package/vendor/@akanjs/native/plugins/preferences/src/index.ts +75 -0
- package/vendor/@akanjs/native/plugins/preferences/src/web.ts +55 -0
- package/vendor/@akanjs/native/plugins/push/android/AkanNativeMessagingService.kt +17 -0
- package/vendor/@akanjs/native/plugins/push/android/PushPlugin.kt +257 -0
- package/vendor/@akanjs/native/plugins/push/ios/PushPlugin.swift +169 -0
- package/vendor/@akanjs/native/plugins/push/native-plugin.json +23 -0
- package/vendor/@akanjs/native/plugins/push/src/index.ts +73 -0
- package/vendor/@akanjs/native/plugins/screen/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/screen/src/desktop.ts +50 -0
- package/vendor/@akanjs/native/plugins/screen/src/index.ts +107 -0
- package/vendor/@akanjs/native/plugins/screen/src/web.ts +92 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/android/ScreenOrientationPlugin.kt +113 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/ios/ScreenOrientationPlugin.swift +150 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/index.ts +69 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/types.ts +26 -0
- package/vendor/@akanjs/native/plugins/screen-orientation/src/web.ts +67 -0
- package/vendor/@akanjs/native/plugins/secure-storage/android/SecureStoragePlugin.kt +184 -0
- package/vendor/@akanjs/native/plugins/secure-storage/ios/SecureStoragePlugin.swift +145 -0
- package/vendor/@akanjs/native/plugins/secure-storage/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/secure-storage/src/desktop.ts +332 -0
- package/vendor/@akanjs/native/plugins/secure-storage/src/index.ts +33 -0
- package/vendor/@akanjs/native/plugins/share/android/SharePlugin.kt +218 -0
- package/vendor/@akanjs/native/plugins/share/ios/SharePlugin.swift +142 -0
- package/vendor/@akanjs/native/plugins/share/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/share/src/index.ts +87 -0
- package/vendor/@akanjs/native/plugins/share/src/options.ts +43 -0
- package/vendor/@akanjs/native/plugins/share/src/web.ts +116 -0
- package/vendor/@akanjs/native/plugins/single-instance/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/desktop.ts +63 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/index.ts +32 -0
- package/vendor/@akanjs/native/plugins/single-instance/src/socket.ts +248 -0
- package/vendor/@akanjs/native/plugins/splash-screen/android/SplashScreenPlugin.kt +19 -0
- package/vendor/@akanjs/native/plugins/splash-screen/ios/SplashScreenPlugin.swift +20 -0
- package/vendor/@akanjs/native/plugins/splash-screen/native-plugin.json +17 -0
- package/vendor/@akanjs/native/plugins/splash-screen/src/index.ts +24 -0
- package/vendor/@akanjs/native/plugins/splash-screen/src/web.ts +17 -0
- package/vendor/@akanjs/native/plugins/sqlite/android/SqlStatements.kt +121 -0
- package/vendor/@akanjs/native/plugins/sqlite/android/SqlitePlugin.kt +327 -0
- package/vendor/@akanjs/native/plugins/sqlite/ios/SqlitePlugin.swift +361 -0
- package/vendor/@akanjs/native/plugins/sqlite/native-plugin.json +18 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/common.ts +221 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/desktop.ts +140 -0
- package/vendor/@akanjs/native/plugins/sqlite/src/index.ts +114 -0
- package/vendor/@akanjs/native/plugins/toast/android/ToastPlugin.kt +27 -0
- package/vendor/@akanjs/native/plugins/toast/native-plugin.json +14 -0
- package/vendor/@akanjs/native/plugins/toast/src/index.ts +41 -0
- package/vendor/@akanjs/native/plugins/toast/src/queue.ts +77 -0
- package/vendor/@akanjs/native/plugins/toast/src/web.ts +130 -0
- package/vendor/@akanjs/native/plugins/tray/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/tray/src/desktop.ts +73 -0
- package/vendor/@akanjs/native/plugins/tray/src/index.ts +111 -0
- package/vendor/@akanjs/native/plugins/updates/android/UpdatesPlugin.kt +290 -0
- package/vendor/@akanjs/native/plugins/updates/ios/UpdatesPlugin.swift +292 -0
- package/vendor/@akanjs/native/plugins/updates/native-plugin.json +19 -0
- package/vendor/@akanjs/native/plugins/updates/src/desktop.ts +558 -0
- package/vendor/@akanjs/native/plugins/updates/src/index.ts +95 -0
- package/vendor/@akanjs/native/plugins/window/native-plugin.json +32 -0
- package/vendor/@akanjs/native/plugins/window/src/desktop.ts +170 -0
- package/vendor/@akanjs/native/plugins/window/src/index.ts +342 -0
- package/vendor/@akanjs/native/plugins/window/src/web.ts +43 -0
- package/vendor/@akanjs/native/plugins/window-state/native-plugin.json +10 -0
- package/vendor/@akanjs/native/plugins/window-state/src/desktop.ts +73 -0
- package/vendor/@akanjs/native/plugins/window-state/src/index.ts +35 -0
- package/vendor/@akanjs/native/plugins/window-state/src/state.ts +146 -0
- package/webkit/bootCsr.tsx +26 -14
- package/webkit/index.ts +0 -2
- package/webkit/nativeNavigation.ts +116 -0
- package/webkit/nativePurchase.ts +93 -0
- package/webkit/useCamera.tsx +76 -71
- package/webkit/useCsrValues.ts +10 -124
- package/webkit/useGeoLocation.tsx +11 -13
- package/webkit/usePurchase.tsx +68 -123
- package/capacitor.base.config.ts +0 -140
- package/client/capacitor.ts +0 -252
- package/types/capacitor.base.config.d.ts +0 -3
- package/types/client/capacitor.d.ts +0 -290
- package/types/webkit/useCodepush.d.ts +0 -16
- package/types/webkit/useContact.d.ts +0 -11
- package/webkit/useCodepush.tsx +0 -76
- package/webkit/useContact.tsx +0 -45
|
@@ -0,0 +1,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
|
+
}
|