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,361 @@
|
|
|
1
|
+
import Foundation
|
|
2
|
+
import SQLite3
|
|
3
|
+
|
|
4
|
+
/// SQLite through the system libsqlite3. `import SQLite3` also links it: the SDK's module map
|
|
5
|
+
/// (usr/include/SQLite3.modulemap) says `link "sqlite3"`, so swiftc autolinks /usr/lib/libsqlite3.dylib
|
|
6
|
+
/// without a manifest entry or linker flag (checked with swiftc for the simulator + otool -L).
|
|
7
|
+
/// - Files: Library/Application Support/databases/<name>, kept until the app is removed.
|
|
8
|
+
/// - Every call runs on one serial queue, off the main thread and in call order, so BEGIN and
|
|
9
|
+
/// COMMIT from separate calls see the same connection state (as the Android worker thread).
|
|
10
|
+
/// - One statement per call: sqlite3_prepare_v2 compiles the first statement and hands back the
|
|
11
|
+
/// rest (the tail); anything but whitespace, comments and ";" there rejects the call, where
|
|
12
|
+
/// Android and bun:sqlite would silently drop it (src/common.ts countStatements does the same
|
|
13
|
+
/// check on desktop, android/SqlStatements.kt on Android).
|
|
14
|
+
/// - Values follow src/index.ts SqlValue: safe integers as INTEGER, other numbers as REAL, JSON
|
|
15
|
+
/// booleans (CFBoolean NSNumbers) as 1/0, { base64 } as BLOB. Text and blobs bind with their byte
|
|
16
|
+
/// length and SQLITE_TRANSIENT, so NUL characters are kept and SQLite copies the bytes.
|
|
17
|
+
/// An empty blob binds with sqlite3_bind_zeroblob: sqlite3_bind_blob with a nil pointer binds NULL.
|
|
18
|
+
/// - changes is the difference of sqlite3_total_changes64 (triggers count, DDL is 0), as
|
|
19
|
+
/// bun:sqlite's Statement.run() reports it on desktop.
|
|
20
|
+
/// - Connections belong to the page that opened them (architecture review, document scope): when it
|
|
21
|
+
/// ends (AkanNativeDocument.own), an open transaction is rolled back and its connections close. WAL and a
|
|
22
|
+
/// 5 s busy timeout, as on desktop.
|
|
23
|
+
/// Arguments arrive decoded by the generated SqlitePluginSpec (PL-10).
|
|
24
|
+
final class SqlitePlugin: SqlitePluginSpec {
|
|
25
|
+
static let id = "sqlite"
|
|
26
|
+
private let store = SqliteStore()
|
|
27
|
+
/// Pages whose end already closes their connections.
|
|
28
|
+
private var owned = Set<String>()
|
|
29
|
+
|
|
30
|
+
init(context: AkanNativePluginContext) {}
|
|
31
|
+
|
|
32
|
+
/// The calling page's key ("" for a page without a document id).
|
|
33
|
+
private func page(_ reply: AkanNativeReply<some Any>) -> String { reply.call.document?.id ?? "" }
|
|
34
|
+
|
|
35
|
+
func open(_ args: SqliteOpenArgs, _ reply: AkanNativeReply<SqliteOpenResult>) {
|
|
36
|
+
let page = page(reply)
|
|
37
|
+
if let document = reply.call.document, !owned.contains(page) {
|
|
38
|
+
owned.insert(page)
|
|
39
|
+
let store = store
|
|
40
|
+
document.own { [weak self] in
|
|
41
|
+
self?.owned.remove(page)
|
|
42
|
+
store.closePage(page)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
store.perform(reply) { SqliteOpenResult(db: try $0.open(args.name, page: page)) }
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
func execute(_ args: SqliteStatementArgs, _ reply: AkanNativeReply<SqliteExecuteResult>) {
|
|
49
|
+
let page = page(reply)
|
|
50
|
+
store.perform(reply) {
|
|
51
|
+
let result = try $0.run(args, page: page, collect: false)
|
|
52
|
+
return SqliteExecuteResult(changes: Double(result.changes), lastInsertId: Double(result.lastInsertId))
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
func query(_ args: SqliteStatementArgs, _ reply: AkanNativeReply<SqliteQueryResult>) {
|
|
57
|
+
let page = page(reply)
|
|
58
|
+
store.perform(reply) {
|
|
59
|
+
let result = try $0.run(args, page: page, collect: true)
|
|
60
|
+
return SqliteQueryResult(columns: result.columns, rows: result.rows)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
func close(_ args: SqliteCloseArgs, _ reply: AkanNativeReply<Void>) {
|
|
65
|
+
let page = page(reply)
|
|
66
|
+
store.perform(reply) { $0.close(args.db, page: page) }
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
struct SqliteFailure: Error {
|
|
71
|
+
let code: AkanNativeErrorCode
|
|
72
|
+
let message: String
|
|
73
|
+
|
|
74
|
+
init(_ code: AkanNativeErrorCode, _ message: String) {
|
|
75
|
+
self.code = code
|
|
76
|
+
self.message = message
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// The open databases, by page and name. Everything but `perform` and `closePage` runs on `queue` only.
|
|
81
|
+
final class SqliteStore: @unchecked Sendable {
|
|
82
|
+
private let queue = DispatchQueue(label: "com.akanjs.sqlite")
|
|
83
|
+
private var handles: [String: OpaquePointer] = [:]
|
|
84
|
+
|
|
85
|
+
private static func key(_ page: String, _ name: String) -> String { "\(page)\u{0}\(name)" }
|
|
86
|
+
|
|
87
|
+
/// SQLITE_TRANSIENT: SQLite copies bound text and blobs before the call returns.
|
|
88
|
+
private static var transient: sqlite3_destructor_type { unsafeBitCast(-1, to: sqlite3_destructor_type.self) }
|
|
89
|
+
private static let maxSafe: Double = 9_007_199_254_740_991
|
|
90
|
+
|
|
91
|
+
func perform<T>(_ reply: AkanNativeReply<T>, _ work: @escaping @Sendable (SqliteStore) throws -> T) {
|
|
92
|
+
queue.async {
|
|
93
|
+
do {
|
|
94
|
+
reply.resolve(try work(self))
|
|
95
|
+
} catch let failure as SqliteFailure {
|
|
96
|
+
reply.reject(failure.code, failure.message)
|
|
97
|
+
} catch {
|
|
98
|
+
reply.reject(.internalError, "\(error)")
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
func open(_ name: String, page: String) throws -> String {
|
|
104
|
+
guard Self.validName(name) else {
|
|
105
|
+
throw SqliteFailure(.invalidArgs, "name must be a file name: letters, digits, \".\", \"_\" and \"-\", up to 128 characters, starting with a letter or digit, not ending in -journal, -wal or -shm")
|
|
106
|
+
}
|
|
107
|
+
if handles[Self.key(page, name)] != nil { return name }
|
|
108
|
+
let folder: URL
|
|
109
|
+
do {
|
|
110
|
+
folder = try FileManager.default.url(for: .applicationSupportDirectory, in: .userDomainMask, appropriateFor: nil, create: true)
|
|
111
|
+
.appendingPathComponent("databases", isDirectory: true)
|
|
112
|
+
try FileManager.default.createDirectory(at: folder, withIntermediateDirectories: true)
|
|
113
|
+
} catch {
|
|
114
|
+
throw SqliteFailure(.internalError, "cannot open \(name): \(error.localizedDescription)")
|
|
115
|
+
}
|
|
116
|
+
var db: OpaquePointer?
|
|
117
|
+
let rc = sqlite3_open_v2(folder.appendingPathComponent(name).path, &db, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, nil)
|
|
118
|
+
guard rc == SQLITE_OK, let db else {
|
|
119
|
+
let message = db.map { String(cString: sqlite3_errmsg($0)) } ?? "out of memory"
|
|
120
|
+
sqlite3_close_v2(db)
|
|
121
|
+
throw SqliteFailure(.internalError, "cannot open \(name): \(message)")
|
|
122
|
+
}
|
|
123
|
+
sqlite3_busy_timeout(db, 5000)
|
|
124
|
+
guard sqlite3_exec(db, "PRAGMA journal_mode = WAL", nil, nil, nil) == SQLITE_OK,
|
|
125
|
+
sqlite3_exec(db, "PRAGMA foreign_keys = ON", nil, nil, nil) == SQLITE_OK else {
|
|
126
|
+
let message = String(cString: sqlite3_errmsg(db))
|
|
127
|
+
sqlite3_close_v2(db)
|
|
128
|
+
throw SqliteFailure(.internalError, "cannot open \(name): \(message)")
|
|
129
|
+
}
|
|
130
|
+
handles[Self.key(page, name)] = db
|
|
131
|
+
return name
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
func close(_ name: String, page: String) {
|
|
135
|
+
guard let db = handles.removeValue(forKey: Self.key(page, name)) else { return }
|
|
136
|
+
Self.shut(db)
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/// The page ended: its connections roll back what is open and close, after the calls before.
|
|
140
|
+
func closePage(_ page: String) {
|
|
141
|
+
queue.async {
|
|
142
|
+
let prefix = page + "\u{0}"
|
|
143
|
+
for key in self.handles.keys where key.hasPrefix(prefix) {
|
|
144
|
+
if let db = self.handles.removeValue(forKey: key) { Self.shut(db) }
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
private static func shut(_ db: OpaquePointer) {
|
|
150
|
+
if sqlite3_get_autocommit(db) == 0 { sqlite3_exec(db, "ROLLBACK", nil, nil, nil) }
|
|
151
|
+
sqlite3_close_v2(db)
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
struct Outcome {
|
|
155
|
+
var columns: [String] = []
|
|
156
|
+
var rows: [[String: Any]] = []
|
|
157
|
+
var changes: Int64 = 0
|
|
158
|
+
var lastInsertId: Int64 = 0
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
func run(_ args: SqliteStatementArgs, page: String, collect: Bool) throws -> Outcome {
|
|
162
|
+
guard let db = handles[Self.key(page, args.db)] else {
|
|
163
|
+
throw SqliteFailure(.notFound, "database \(args.db) is not open in this page (call open first; a page load opens its own)")
|
|
164
|
+
}
|
|
165
|
+
let values = try Self.values(args.params ?? [])
|
|
166
|
+
if let refused = Self.refused(args.sql) { throw SqliteFailure(.notAllowed, refused) }
|
|
167
|
+
let statement = try prepare(db, args.sql)
|
|
168
|
+
defer { sqlite3_finalize(statement) }
|
|
169
|
+
|
|
170
|
+
let expected = Int(sqlite3_bind_parameter_count(statement))
|
|
171
|
+
guard expected == values.count else {
|
|
172
|
+
throw SqliteFailure(.invalidArgs, "sql expects \(expected) values, got \(values.count)")
|
|
173
|
+
}
|
|
174
|
+
for (i, value) in values.enumerated() {
|
|
175
|
+
let rc = Self.bind(value, statement, Int32(i + 1))
|
|
176
|
+
guard rc == SQLITE_OK else { throw Self.failure(db, rc) }
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
var outcome = Outcome()
|
|
180
|
+
let count = Int(sqlite3_column_count(statement))
|
|
181
|
+
outcome.columns = (0..<count).map { i in sqlite3_column_name(statement, Int32(i)).map { String(cString: $0) } ?? "" }
|
|
182
|
+
let before = sqlite3_total_changes64(db)
|
|
183
|
+
while true {
|
|
184
|
+
let rc = sqlite3_step(statement)
|
|
185
|
+
if rc == SQLITE_DONE { break }
|
|
186
|
+
guard rc == SQLITE_ROW else { throw Self.failure(db, rc) }
|
|
187
|
+
if collect {
|
|
188
|
+
var row: [String: Any] = [:]
|
|
189
|
+
for (i, name) in outcome.columns.enumerated() { row[name] = Self.column(statement, Int32(i)) }
|
|
190
|
+
outcome.rows.append(row)
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
outcome.changes = sqlite3_total_changes64(db) - before
|
|
194
|
+
outcome.lastInsertId = sqlite3_last_insert_rowid(db)
|
|
195
|
+
return outcome
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
/// The bare words of `sql` (keywords and unquoted names), lowercase, skipping quotes and comments.
|
|
199
|
+
private static func words(_ sql: String) -> [String] {
|
|
200
|
+
let b = Array(sql.utf8)
|
|
201
|
+
let n = b.count
|
|
202
|
+
func idChar(_ c: UInt8) -> Bool { (c >= 0x30 && c <= 0x39) || (c >= 0x41 && c <= 0x5a) || (c >= 0x61 && c <= 0x7a) || c == 0x5f || c == 0x24 || c >= 0x80 }
|
|
203
|
+
func find(_ needle: [UInt8], from: Int) -> Int? {
|
|
204
|
+
guard from <= n - needle.count else { return nil }
|
|
205
|
+
return (from...(n - needle.count)).first { Array(b[$0..<$0 + needle.count]) == needle }
|
|
206
|
+
}
|
|
207
|
+
var out: [String] = []
|
|
208
|
+
var i = 0
|
|
209
|
+
while i < n {
|
|
210
|
+
let c = b[i]
|
|
211
|
+
if c == 0x2f, i + 1 < n, b[i + 1] == 0x2a { i = find([0x2a, 0x2f], from: i + 2).map { $0 + 1 } ?? n }
|
|
212
|
+
else if c == 0x2d, i + 1 < n, b[i + 1] == 0x2d { i = find([0x0a], from: i + 2) ?? n }
|
|
213
|
+
else if c == 0x5b || c == 0x60 || c == 0x22 || c == 0x27 { i = find([c == 0x5b ? 0x5d : c], from: i + 1) ?? n }
|
|
214
|
+
else if idChar(c) {
|
|
215
|
+
var j = i + 1
|
|
216
|
+
while j < n && idChar(b[j]) { j += 1 }
|
|
217
|
+
out.append(String(decoding: b[i..<j], as: UTF8.self).lowercased())
|
|
218
|
+
i = j - 1
|
|
219
|
+
}
|
|
220
|
+
i += 1
|
|
221
|
+
}
|
|
222
|
+
return out
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
/// Why `sql` is refused, or nil: ATTACH opens any SQLite file the app can reach and VACUUM INTO
|
|
226
|
+
/// writes one anywhere, past the filesystem plugin's scopes (src/common.ts refusedStatement).
|
|
227
|
+
static func refused(_ sql: String) -> String? {
|
|
228
|
+
let w = words(sql)
|
|
229
|
+
var i = 0
|
|
230
|
+
if w.first == "explain" { i += w.count > 2 && w[1] == "query" && w[2] == "plan" ? 3 : 1 }
|
|
231
|
+
guard i < w.count else { return nil }
|
|
232
|
+
if w[i] == "attach" { return "ATTACH is not allowed: open every database with open()" }
|
|
233
|
+
if w[i] == "vacuum" && w[(i + 1)...].contains("into") { return "VACUUM INTO is not allowed: it writes a file outside the database" }
|
|
234
|
+
return nil
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
/// The first statement of `sql`; rejects the call if the tail holds another one.
|
|
238
|
+
private func prepare(_ db: OpaquePointer, _ sql: String) throws -> OpaquePointer {
|
|
239
|
+
try sql.withCString { base -> OpaquePointer in
|
|
240
|
+
var statement: OpaquePointer?
|
|
241
|
+
var tail: UnsafePointer<CChar>?
|
|
242
|
+
let rc = sqlite3_prepare_v2(db, base, -1, &statement, &tail)
|
|
243
|
+
guard rc == SQLITE_OK else { throw Self.failure(db, rc) }
|
|
244
|
+
guard let statement else { throw SqliteFailure(.invalidArgs, "sql holds no statement") }
|
|
245
|
+
// Whitespace, comments and ";" compile to no statement; anything else is a second one
|
|
246
|
+
// (or text that does not compile, which is not part of the first statement either).
|
|
247
|
+
var rest = tail
|
|
248
|
+
while let at = rest, at.pointee != 0 {
|
|
249
|
+
var next: OpaquePointer?
|
|
250
|
+
var after: UnsafePointer<CChar>?
|
|
251
|
+
let more = sqlite3_prepare_v2(db, at, -1, &next, &after)
|
|
252
|
+
if more != SQLITE_OK || next != nil {
|
|
253
|
+
sqlite3_finalize(next)
|
|
254
|
+
sqlite3_finalize(statement)
|
|
255
|
+
throw SqliteFailure(.invalidArgs, "sql must be one statement; run them one call at a time")
|
|
256
|
+
}
|
|
257
|
+
guard let after, after > at else { break }
|
|
258
|
+
rest = after
|
|
259
|
+
}
|
|
260
|
+
return statement
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
private enum Value {
|
|
265
|
+
case null
|
|
266
|
+
case integer(Int64)
|
|
267
|
+
case real(Double)
|
|
268
|
+
case text(String)
|
|
269
|
+
case blob(Data)
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
private static func values(_ params: [Any]) throws -> [Value] {
|
|
273
|
+
try params.enumerated().map { i, value in
|
|
274
|
+
switch value {
|
|
275
|
+
case is NSNull:
|
|
276
|
+
return .null
|
|
277
|
+
case let text as String:
|
|
278
|
+
return .text(text)
|
|
279
|
+
case let number as NSNumber:
|
|
280
|
+
if CFGetTypeID(number as CFTypeRef) == CFBooleanGetTypeID() { return .integer(number.boolValue ? 1 : 0) }
|
|
281
|
+
let d = number.doubleValue
|
|
282
|
+
guard d.isFinite else { break }
|
|
283
|
+
if d.rounded(.towardZero) == d, abs(d) <= maxSafe { return .integer(Int64(d)) }
|
|
284
|
+
return .real(d)
|
|
285
|
+
case let object as [String: Any]:
|
|
286
|
+
if object.count == 1, let text = object["base64"] as? String, let data = decodeBase64(text) { return .blob(data) }
|
|
287
|
+
default:
|
|
288
|
+
break
|
|
289
|
+
}
|
|
290
|
+
throw SqliteFailure(.invalidArgs, "params[\(i)] must be a string, number, boolean, null or { base64 }")
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/// Standard alphabet, padding optional, no whitespace (the rule of src/common.ts).
|
|
295
|
+
/// Data(base64Encoded:) needs the padding, so it is added.
|
|
296
|
+
private static func decodeBase64(_ text: String) -> Data? {
|
|
297
|
+
let bytes = Array(text.utf8)
|
|
298
|
+
let padding = bytes.reversed().prefix { $0 == UInt8(ascii: "=") }.count
|
|
299
|
+
let isAlphabet = { (b: UInt8) in
|
|
300
|
+
(b >= 0x41 && b <= 0x5A) || (b >= 0x61 && b <= 0x7A) || (b >= 0x30 && b <= 0x39) || b == UInt8(ascii: "+") || b == UInt8(ascii: "/")
|
|
301
|
+
}
|
|
302
|
+
guard padding <= 2, bytes.count % 4 != 1, padding == 0 || bytes.count % 4 == 0, bytes.dropLast(padding).allSatisfy(isAlphabet) else { return nil }
|
|
303
|
+
return Data(base64Encoded: text + String(repeating: "=", count: (4 - bytes.count % 4) % 4))
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
private static func bind(_ value: Value, _ statement: OpaquePointer, _ index: Int32) -> Int32 {
|
|
307
|
+
switch value {
|
|
308
|
+
case .null:
|
|
309
|
+
return sqlite3_bind_null(statement, index)
|
|
310
|
+
case let .integer(v):
|
|
311
|
+
return sqlite3_bind_int64(statement, index, v)
|
|
312
|
+
case let .real(v):
|
|
313
|
+
return sqlite3_bind_double(statement, index, v)
|
|
314
|
+
case let .text(text):
|
|
315
|
+
// utf8CString keeps NUL characters and ends with one terminator, which the length leaves out.
|
|
316
|
+
return text.utf8CString.withUnsafeBufferPointer { sqlite3_bind_text(statement, index, $0.baseAddress, Int32($0.count - 1), transient) }
|
|
317
|
+
case let .blob(data):
|
|
318
|
+
if data.isEmpty { return sqlite3_bind_zeroblob(statement, index, 0) }
|
|
319
|
+
return data.withUnsafeBytes { sqlite3_bind_blob(statement, index, $0.baseAddress, Int32($0.count), transient) }
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
/// A column as the bridge carries it: NSNumber, String, NSNull or ["base64": …].
|
|
324
|
+
private static func column(_ statement: OpaquePointer, _ i: Int32) -> Any {
|
|
325
|
+
switch sqlite3_column_type(statement, i) {
|
|
326
|
+
case SQLITE_INTEGER:
|
|
327
|
+
return NSNumber(value: sqlite3_column_int64(statement, i))
|
|
328
|
+
case SQLITE_FLOAT:
|
|
329
|
+
let d = sqlite3_column_double(statement, i)
|
|
330
|
+
return d.isFinite ? NSNumber(value: d) : NSNull() // JSON has no Infinity
|
|
331
|
+
case SQLITE_TEXT:
|
|
332
|
+
// text first, then its byte length (sqlite.org/c3ref/column_blob.html), NULs included
|
|
333
|
+
guard let text = sqlite3_column_text(statement, i) else { return "" }
|
|
334
|
+
return String(decoding: UnsafeBufferPointer(start: text, count: Int(sqlite3_column_bytes(statement, i))), as: UTF8.self)
|
|
335
|
+
case SQLITE_BLOB:
|
|
336
|
+
let bytes = sqlite3_column_blob(statement, i)
|
|
337
|
+
let count = Int(sqlite3_column_bytes(statement, i))
|
|
338
|
+
let data = bytes.map { Data(bytes: $0, count: count) } ?? Data()
|
|
339
|
+
return ["base64": data.base64EncodedString()]
|
|
340
|
+
default:
|
|
341
|
+
return NSNull()
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// Primary result codes that mean the SQL or its values do not fit the database: ERROR
|
|
346
|
+
// (syntax, no such table), TOOBIG, CONSTRAINT, MISMATCH, RANGE (src/common.ts sqliteCode).
|
|
347
|
+
private static func failure(_ db: OpaquePointer, _ rc: Int32) -> SqliteFailure {
|
|
348
|
+
let caller: Set<Int32> = [SQLITE_ERROR, SQLITE_TOOBIG, SQLITE_CONSTRAINT, SQLITE_MISMATCH, SQLITE_RANGE]
|
|
349
|
+
return SqliteFailure(caller.contains(rc & 0xff) ? .invalidArgs : .internalError, String(cString: sqlite3_errmsg(db)))
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
private static func validName(_ name: String) -> Bool {
|
|
353
|
+
let scalars = Array(name.unicodeScalars)
|
|
354
|
+
let alnum = { (c: Unicode.Scalar) in (c.value >= 0x30 && c.value <= 0x39) || (c.value >= 0x41 && c.value <= 0x5A) || (c.value >= 0x61 && c.value <= 0x7A) }
|
|
355
|
+
guard let first = scalars.first, scalars.count <= 128, alnum(first),
|
|
356
|
+
scalars.allSatisfy({ alnum($0) || $0 == "." || $0 == "_" || $0 == "-" })
|
|
357
|
+
else { return false }
|
|
358
|
+
let lower = name.lowercased()
|
|
359
|
+
return !(lower.hasSuffix("-journal") || lower.hasSuffix("-wal") || lower.hasSuffix("-shm"))
|
|
360
|
+
}
|
|
361
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "sqlite",
|
|
3
|
+
"apiVersion": 1,
|
|
4
|
+
"methods": ["open", "execute", "query", "close"],
|
|
5
|
+
"events": [],
|
|
6
|
+
"codegen": true,
|
|
7
|
+
"web": null,
|
|
8
|
+
"desktop": "./src/desktop.ts",
|
|
9
|
+
"ios": {
|
|
10
|
+
"sources": ["ios/*.swift"],
|
|
11
|
+
"class": "SqlitePlugin"
|
|
12
|
+
},
|
|
13
|
+
"android": {
|
|
14
|
+
"sources": ["android/*.kt"],
|
|
15
|
+
"class": "com.akanjs.plugins.sqlite.SqlitePlugin",
|
|
16
|
+
"minSdk": 35
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { AkanNativeError } from "../../../packages/core/src/index.ts";
|
|
4
|
+
|
|
5
|
+
const invalid = (message: string) => new AkanNativeError("INVALID_ARGS", message);
|
|
6
|
+
|
|
7
|
+
/** Largest integer a JS number holds exactly: bigger integers bind as REAL on every platform. */
|
|
8
|
+
export const MAX_SAFE = Number.MAX_SAFE_INTEGER;
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* A database file name, never a path: no separators or "..", and no name that would collide with
|
|
12
|
+
* another database's -journal, -wal or -shm file.
|
|
13
|
+
*/
|
|
14
|
+
export function checkName(name: unknown): string {
|
|
15
|
+
if (
|
|
16
|
+
typeof name !== "string" ||
|
|
17
|
+
!/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(name) ||
|
|
18
|
+
/-(journal|wal|shm)$/i.test(name)
|
|
19
|
+
) {
|
|
20
|
+
throw invalid(
|
|
21
|
+
'name must be a file name: letters, digits, ".", "_" and "-", up to 128 characters, starting with a letter or digit, not ending in -journal, -wal or -shm',
|
|
22
|
+
);
|
|
23
|
+
}
|
|
24
|
+
return name;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function checkDb(db: unknown): string {
|
|
28
|
+
if (typeof db !== "string" || db.length === 0) throw invalid("db must be a handle from open()");
|
|
29
|
+
return db;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const SEMI = 0,
|
|
33
|
+
WS = 1,
|
|
34
|
+
OTHER = 2,
|
|
35
|
+
EXPLAIN = 3,
|
|
36
|
+
CREATE = 4,
|
|
37
|
+
TEMP = 5,
|
|
38
|
+
TRIGGER = 6,
|
|
39
|
+
END = 7;
|
|
40
|
+
const TRANS = [
|
|
41
|
+
[1, 0, 2, 3, 4, 2, 2, 2],
|
|
42
|
+
[1, 1, 2, 3, 4, 2, 2, 2],
|
|
43
|
+
[1, 2, 2, 2, 2, 2, 2, 2],
|
|
44
|
+
[1, 3, 3, 2, 4, 2, 2, 2],
|
|
45
|
+
[1, 4, 2, 2, 2, 4, 5, 2],
|
|
46
|
+
[6, 5, 5, 5, 5, 5, 5, 5],
|
|
47
|
+
[6, 6, 5, 5, 5, 5, 5, 7],
|
|
48
|
+
[1, 7, 5, 5, 5, 5, 5, 5],
|
|
49
|
+
];
|
|
50
|
+
|
|
51
|
+
/** SQLite's IdChar(): letters, digits, "_", "$" and every non-ASCII character. */
|
|
52
|
+
const isIdChar = (c: number) =>
|
|
53
|
+
(c >= 0x30 && c <= 0x39) ||
|
|
54
|
+
(c >= 0x41 && c <= 0x5a) ||
|
|
55
|
+
(c >= 0x61 && c <= 0x7a) ||
|
|
56
|
+
c === 0x5f ||
|
|
57
|
+
c === 0x24 ||
|
|
58
|
+
c >= 0x80;
|
|
59
|
+
|
|
60
|
+
function keyword(word: string): number {
|
|
61
|
+
switch (word.toLowerCase()) {
|
|
62
|
+
case "create":
|
|
63
|
+
return CREATE;
|
|
64
|
+
case "temp":
|
|
65
|
+
case "temporary":
|
|
66
|
+
return TEMP;
|
|
67
|
+
case "trigger":
|
|
68
|
+
return TRIGGER;
|
|
69
|
+
case "end":
|
|
70
|
+
return END;
|
|
71
|
+
case "explain":
|
|
72
|
+
return EXPLAIN;
|
|
73
|
+
default:
|
|
74
|
+
return OTHER;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* How many statements `sql` holds, finding their ends the way sqlite3_complete() does. Only
|
|
80
|
+
* whitespace, comments and ";" is 0. An unterminated quote or comment runs to the end of the text
|
|
81
|
+
* (the statement is then SQLite's syntax error to report).
|
|
82
|
+
*/
|
|
83
|
+
export function countStatements(sql: string): number {
|
|
84
|
+
let state = 0;
|
|
85
|
+
let count = 0;
|
|
86
|
+
const n = sql.length;
|
|
87
|
+
for (let i = 0; i < n; i++) {
|
|
88
|
+
const c = sql.charCodeAt(i);
|
|
89
|
+
let token = OTHER;
|
|
90
|
+
if (c === 0x3b) token = SEMI;
|
|
91
|
+
else if (c === 0x20 || c === 0x0d || c === 0x09 || c === 0x0a || c === 0x0c) token = WS;
|
|
92
|
+
else if (c === 0x2f && sql.charCodeAt(i + 1) === 0x2a) {
|
|
93
|
+
const close = sql.indexOf("*/", i + 2);
|
|
94
|
+
i = close < 0 ? n : close + 1;
|
|
95
|
+
token = WS;
|
|
96
|
+
} else if (c === 0x2d && sql.charCodeAt(i + 1) === 0x2d) {
|
|
97
|
+
const eol = sql.indexOf("\n", i + 2);
|
|
98
|
+
i = eol < 0 ? n : eol;
|
|
99
|
+
token = WS;
|
|
100
|
+
} else if (c === 0x5b || c === 0x60 || c === 0x22 || c === 0x27) {
|
|
101
|
+
const close = sql.indexOf(c === 0x5b ? "]" : sql[i]!, i + 1);
|
|
102
|
+
i = close < 0 ? n : close;
|
|
103
|
+
} else if (isIdChar(c)) {
|
|
104
|
+
let j = i + 1;
|
|
105
|
+
while (j < n && isIdChar(sql.charCodeAt(j))) j++;
|
|
106
|
+
token = keyword(sql.slice(i, j));
|
|
107
|
+
i = j - 1;
|
|
108
|
+
}
|
|
109
|
+
const next = TRANS[state]![token]!;
|
|
110
|
+
if (token === SEMI && next === 1 && state > 1) count++;
|
|
111
|
+
state = next;
|
|
112
|
+
}
|
|
113
|
+
return state > 1 ? count + 1 : count;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** The bare words of `sql` (keywords and unquoted names), lowercase, skipping quotes and comments. */
|
|
117
|
+
function words(sql: string): string[] {
|
|
118
|
+
const out: string[] = [];
|
|
119
|
+
const n = sql.length;
|
|
120
|
+
for (let i = 0; i < n; i++) {
|
|
121
|
+
const c = sql.charCodeAt(i);
|
|
122
|
+
if (c === 0x2f && sql.charCodeAt(i + 1) === 0x2a) {
|
|
123
|
+
const close = sql.indexOf("*/", i + 2);
|
|
124
|
+
i = close < 0 ? n : close + 1;
|
|
125
|
+
} else if (c === 0x2d && sql.charCodeAt(i + 1) === 0x2d) {
|
|
126
|
+
const eol = sql.indexOf("\n", i + 2);
|
|
127
|
+
i = eol < 0 ? n : eol;
|
|
128
|
+
} else if (c === 0x5b || c === 0x60 || c === 0x22 || c === 0x27) {
|
|
129
|
+
const close = sql.indexOf(c === 0x5b ? "]" : sql[i]!, i + 1);
|
|
130
|
+
i = close < 0 ? n : close;
|
|
131
|
+
} else if (isIdChar(c)) {
|
|
132
|
+
let j = i + 1;
|
|
133
|
+
while (j < n && isIdChar(sql.charCodeAt(j))) j++;
|
|
134
|
+
out.push(sql.slice(i, j).toLowerCase());
|
|
135
|
+
i = j - 1;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return out;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Statements that reach files outside the app's databases: ATTACH opens any SQLite file the app
|
|
143
|
+
* can read or write, VACUUM INTO writes one anywhere. The filesystem plugin's scopes do not apply
|
|
144
|
+
* to them, so they are refused (the same rule in ios/SqlitePlugin.swift and android/SqlStatements.kt).
|
|
145
|
+
*/
|
|
146
|
+
export function refusedStatement(sql: string): string | null {
|
|
147
|
+
const w = words(sql);
|
|
148
|
+
let i = 0;
|
|
149
|
+
if (w[i] === "explain") i += w[i + 1] === "query" && w[i + 2] === "plan" ? 3 : 1;
|
|
150
|
+
if (w[i] === "attach") return "ATTACH is not allowed: open every database with open()";
|
|
151
|
+
if (w[i] === "vacuum" && w.includes("into", i + 1))
|
|
152
|
+
return "VACUUM INTO is not allowed: it writes a file outside the database";
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export function checkSql(sql: unknown): string {
|
|
157
|
+
if (typeof sql !== "string") throw invalid("sql must be a string");
|
|
158
|
+
const count = countStatements(sql);
|
|
159
|
+
if (count === 0) throw invalid("sql holds no statement");
|
|
160
|
+
if (count > 1) throw invalid("sql must be one statement; run them one call at a time");
|
|
161
|
+
const refused = refusedStatement(sql);
|
|
162
|
+
if (refused) throw new AkanNativeError("NOT_ALLOWED", refused);
|
|
163
|
+
return sql;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const BASE64 = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
167
|
+
|
|
168
|
+
export function base64ToBytes(data: string): Uint8Array | null {
|
|
169
|
+
if (!BASE64.test(data) || data.length % 4 === 1 || (data.includes("=") && data.length % 4 !== 0)) return null;
|
|
170
|
+
const binary = atob(data.padEnd(Math.ceil(data.length / 4) * 4, "="));
|
|
171
|
+
const bytes = new Uint8Array(binary.length);
|
|
172
|
+
for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
|
|
173
|
+
return bytes;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
export function bytesToBase64(bytes: Uint8Array): string {
|
|
177
|
+
const native = (bytes as Uint8Array & { toBase64?: () => string }).toBase64;
|
|
178
|
+
if (typeof native === "function") return native.call(bytes);
|
|
179
|
+
let binary = "";
|
|
180
|
+
for (let i = 0; i < bytes.length; i += 0x8000) binary += String.fromCharCode(...bytes.subarray(i, i + 0x8000));
|
|
181
|
+
return btoa(binary);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export type Bound = string | number | bigint | null | Uint8Array;
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* params → values to bind: integers within ±(2^53 − 1) and booleans as bigint (bun:sqlite binds a
|
|
188
|
+
* number as INTEGER only below 2^52 and -0 as REAL: checked), other numbers as REAL, { base64 } as
|
|
189
|
+
* bytes.
|
|
190
|
+
*/
|
|
191
|
+
export function checkParams(params: unknown): Bound[] {
|
|
192
|
+
if (params === undefined || params === null) return [];
|
|
193
|
+
if (!Array.isArray(params)) throw invalid("params must be an array");
|
|
194
|
+
return params.map((value, i): Bound => {
|
|
195
|
+
if (value === null || typeof value === "string") return value;
|
|
196
|
+
if (typeof value === "boolean") return value ? 1n : 0n;
|
|
197
|
+
if (typeof value === "number" && Number.isFinite(value))
|
|
198
|
+
return Number.isInteger(value) && Math.abs(value) <= MAX_SAFE ? BigInt(value) : value;
|
|
199
|
+
if (value && typeof value === "object" && !Array.isArray(value)) {
|
|
200
|
+
const keys = Object.keys(value);
|
|
201
|
+
const base64 = (value as { base64?: unknown }).base64;
|
|
202
|
+
const bytes = keys.length === 1 && typeof base64 === "string" ? base64ToBytes(base64) : null;
|
|
203
|
+
if (bytes) return bytes;
|
|
204
|
+
}
|
|
205
|
+
throw invalid(`params[${i}] must be a string, number, boolean, null or { base64 }`);
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** A column value as the bridge carries it (see SqlValue). */
|
|
210
|
+
export function columnValue(value: unknown): unknown {
|
|
211
|
+
if (value instanceof Uint8Array) return { base64: bytesToBase64(value) };
|
|
212
|
+
if (typeof value === "number" && !Number.isFinite(value)) return null;
|
|
213
|
+
if (typeof value === "bigint") return Number(value);
|
|
214
|
+
return value;
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const CALLER_CODES = new Set([1, 18, 19, 20, 25]);
|
|
218
|
+
|
|
219
|
+
export function sqliteCode(extended: number): AkanNativeError["code"] {
|
|
220
|
+
return CALLER_CODES.has(extended & 0xff) ? "INVALID_ARGS" : "INTERNAL";
|
|
221
|
+
}
|