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,710 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
import { existsSync, readFileSync, statSync } from "node:fs";
|
|
4
|
+
import { dirname, isAbsolute, join, resolve } from "node:path";
|
|
5
|
+
import { MEMBER_NAME, RESERVED_MEMBERS } from "../../../core/src/protocol.ts";
|
|
6
|
+
import type { AkanNativeConfig } from "../config.ts";
|
|
7
|
+
import { manifestPermissionProblems, type PermissionSet, resolveAcl } from "./acl.ts";
|
|
8
|
+
import { unknownConfigKeys } from "./configkeys.ts";
|
|
9
|
+
import { validateCsp, validateExternalSchemes } from "./csp.ts";
|
|
10
|
+
import { type EnvConfig, validateEnvConfig } from "./env.ts";
|
|
11
|
+
import { CliError } from "./log.ts";
|
|
12
|
+
import { type PermissionsConfig, validatePermissions } from "./permissions.ts";
|
|
13
|
+
import type { PlistValue } from "./plist.ts";
|
|
14
|
+
import { privacyApiProblems } from "./privacy.ts";
|
|
15
|
+
import { PACKAGE_ROOT } from "./root.ts";
|
|
16
|
+
import { type UpdatesConfig, validateUpdates } from "./updates.ts";
|
|
17
|
+
|
|
18
|
+
const CONFIG_FILES = ["akan-native.config.ts", "akan-native.config.js", "akan-native.config.mjs"];
|
|
19
|
+
|
|
20
|
+
export interface ResolvedConfig extends Omit<AkanNativeConfig, "icon" | "splash" | "permissions" | "updates"> {
|
|
21
|
+
app: Required<AkanNativeConfig["app"]>;
|
|
22
|
+
web: Required<Pick<AkanNativeConfig["web"], "dir" | "base">> & { build?: string; devEntry?: string };
|
|
23
|
+
plugins: string[];
|
|
24
|
+
env: EnvConfig;
|
|
25
|
+
shell: { backgroundColor: string; backgroundColorDark: string };
|
|
26
|
+
usageDescriptions: Record<string, string>;
|
|
27
|
+
permissions: PermissionsConfig;
|
|
28
|
+
deepLinks: { schemes: string[]; domains: { host: string; pathPrefixes: string[] }[] };
|
|
29
|
+
desktop: { quitOnLastWindowClosed: boolean };
|
|
30
|
+
updates: UpdatesConfig | null;
|
|
31
|
+
/** Absolute image path. */
|
|
32
|
+
icon: { image: string; backgroundColor?: string } | null;
|
|
33
|
+
splash: { backgroundColor: string; backgroundColorDark: string; image?: string; autoHide: boolean; timeout: number };
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface Project {
|
|
37
|
+
appDir: string;
|
|
38
|
+
/** The config file, or "the config" when an API caller passed the object (docs/api.md). */
|
|
39
|
+
configPath: string;
|
|
40
|
+
config: ResolvedConfig;
|
|
41
|
+
plugins: ResolvedPlugin[];
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
export function findAppDir(from: string): string {
|
|
45
|
+
let dir = resolve(from);
|
|
46
|
+
for (;;) {
|
|
47
|
+
if (CONFIG_FILES.some((name) => existsSync(join(dir, name)))) return dir;
|
|
48
|
+
const parent = dirname(dir);
|
|
49
|
+
if (parent === dir)
|
|
50
|
+
throw new CliError(`no akan-native.config.ts found in ${from} or its parents (use --app <dir>)`);
|
|
51
|
+
dir = parent;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const APP_ID = /^[a-zA-Z][a-zA-Z0-9]*(\.[a-zA-Z][a-zA-Z0-9_]*)+$/;
|
|
56
|
+
const VERSION = /^\d+(\.\d+){0,2}$/;
|
|
57
|
+
|
|
58
|
+
export async function loadProject(appDir: string): Promise<Project> {
|
|
59
|
+
const configPath = CONFIG_FILES.map((name) => join(appDir, name)).find((p) => existsSync(p));
|
|
60
|
+
if (!configPath) throw new CliError(`no akan-native.config.ts in ${appDir}`);
|
|
61
|
+
|
|
62
|
+
const mod = (await import(`${configPath}?mtime=${statSync(configPath).mtimeMs}`)) as { default?: AkanNativeConfig };
|
|
63
|
+
const raw = mod.default;
|
|
64
|
+
if (!raw || typeof raw !== "object") throw new CliError(`${configPath} must export default defineConfig({...})`);
|
|
65
|
+
return projectFromConfig(raw, appDir, { configPath });
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export interface ProjectOptions {
|
|
69
|
+
/** For messages. Default "the config". */
|
|
70
|
+
configPath?: string;
|
|
71
|
+
/** Where plugin package names resolve from. Default the app folder. Relative plugin folders always use the app folder. */
|
|
72
|
+
resolveFrom?: string;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Invalid config values, all of them at once (AkanNativeError CONFIG_INVALID carries the list). */
|
|
76
|
+
export class ConfigError extends CliError {
|
|
77
|
+
constructor(
|
|
78
|
+
where: string,
|
|
79
|
+
readonly problems: string[],
|
|
80
|
+
) {
|
|
81
|
+
super(`invalid ${where}:\n - ${problems.join("\n - ")}`);
|
|
82
|
+
this.name = "ConfigError";
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/** A project from a config object (akan-native.config.ts's default export, or an API caller's object). */
|
|
87
|
+
/** app.fileName: what executables, the Swift module and archives are named. */
|
|
88
|
+
const FILE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/;
|
|
89
|
+
|
|
90
|
+
/** Windows device names, which no file or folder may be called (with any extension). */
|
|
91
|
+
const WINDOWS_DEVICES = /^(con|prn|aux|nul|com[0-9¹²³]|lpt[0-9¹²³])(\..*)?$/i;
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Why a display name cannot be a folder or shortcut name on every OS, or null (Dioxus #5743,
|
|
95
|
+
* Electrobun #514: names like "My App." or "A/B" broke installs).
|
|
96
|
+
*/
|
|
97
|
+
export function appNameProblem(name: unknown): string | null {
|
|
98
|
+
if (typeof name !== "string" || !name.trim()) return "app.name is required";
|
|
99
|
+
if (name !== name.trim()) return `app.name must not start or end with spaces (got ${JSON.stringify(name)})`;
|
|
100
|
+
if (name.endsWith(".")) return `app.name must not end with a dot (got ${JSON.stringify(name)})`;
|
|
101
|
+
if ([...name].some((c) => c.charCodeAt(0) < 0x20 || c.charCodeAt(0) === 0x7f))
|
|
102
|
+
return "app.name must not contain control characters";
|
|
103
|
+
const bad = [...name].find((c) => '/\\:*?"<>|'.includes(c));
|
|
104
|
+
if (bad)
|
|
105
|
+
return `app.name must not contain ${JSON.stringify(bad)}: it names folders and shortcuts (got ${JSON.stringify(name)})`;
|
|
106
|
+
if (WINDOWS_DEVICES.test(name)) return `app.name ${JSON.stringify(name)} is a Windows device name`;
|
|
107
|
+
if (name.length > 100) return "app.name must be at most 100 characters";
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* What each target accepts as the build number (app.build, `--build`, AKAN_NATIVE_BUILD), or null: a positive
|
|
113
|
+
* integer; Android's versionCode goes to 2,100,000,000; Windows puts it in a version resource field
|
|
114
|
+
* (at most 65535); Apple takes any positive integer as CFBundleVersion.
|
|
115
|
+
*/
|
|
116
|
+
export function buildNumberProblem(build: unknown, platform: string): string | null {
|
|
117
|
+
if (typeof build !== "number" || !Number.isSafeInteger(build) || build < 1)
|
|
118
|
+
return `the build number must be a positive integer (got ${JSON.stringify(build)})`;
|
|
119
|
+
if (platform === "android" && build > 2_100_000_000)
|
|
120
|
+
return `Android versionCode goes up to 2100000000 (build ${build})`;
|
|
121
|
+
if (platform === "windows" && build > 65_535) return `a Windows version field goes up to 65535 (build ${build})`;
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** The last part of the app id, lowercased: "com.example.Notes" → "notes". */
|
|
126
|
+
export function defaultFileName(id: string): string {
|
|
127
|
+
const tail = id.split(".").pop() ?? "app";
|
|
128
|
+
const name = tail.toLowerCase().replace(/[^a-z0-9._-]/g, "");
|
|
129
|
+
return FILE_NAME.test(name) ? name : "app";
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export function projectFromConfig(raw: AkanNativeConfig, appDir: string, options: ProjectOptions = {}): Project {
|
|
133
|
+
const configPath = options.configPath ?? "the config";
|
|
134
|
+
if (!raw || typeof raw !== "object") throw new ConfigError(configPath, ["the config must be an object"]);
|
|
135
|
+
|
|
136
|
+
const problems: string[] = unknownConfigKeys(raw);
|
|
137
|
+
if (!raw.app || typeof raw.app !== "object") problems.push("app is required");
|
|
138
|
+
else {
|
|
139
|
+
if (typeof raw.app.id !== "string" || !APP_ID.test(raw.app.id))
|
|
140
|
+
problems.push(`app.id must be reverse-DNS like "com.example.app" (got ${JSON.stringify(raw.app?.id)})`);
|
|
141
|
+
const nameProblem = appNameProblem(raw.app.name);
|
|
142
|
+
if (nameProblem) problems.push(nameProblem);
|
|
143
|
+
if (raw.app.fileName !== undefined && (typeof raw.app.fileName !== "string" || !FILE_NAME.test(raw.app.fileName))) {
|
|
144
|
+
problems.push(
|
|
145
|
+
`app.fileName must be letters, digits, ".", "_" and "-", starting with a letter or digit, at most 64 characters (got ${JSON.stringify(raw.app.fileName)})`,
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
if (typeof raw.app.version !== "string" || !VERSION.test(raw.app.version))
|
|
149
|
+
problems.push(`app.version must look like "1.2.3" (got ${JSON.stringify(raw.app?.version)})`);
|
|
150
|
+
if (raw.app.build !== undefined && (!Number.isInteger(raw.app.build) || raw.app.build < 1))
|
|
151
|
+
problems.push("app.build must be a positive integer");
|
|
152
|
+
}
|
|
153
|
+
if (!raw.web || typeof raw.web.dir !== "string") problems.push("web.dir is required");
|
|
154
|
+
if (
|
|
155
|
+
raw.web?.devEntry !== undefined &&
|
|
156
|
+
(typeof raw.web.devEntry !== "string" || !raw.web.devEntry.toLowerCase().endsWith(".html"))
|
|
157
|
+
) {
|
|
158
|
+
problems.push(`web.devEntry must be the path of an .html file (got ${JSON.stringify(raw.web.devEntry)})`);
|
|
159
|
+
}
|
|
160
|
+
for (const scheme of raw.deepLinks?.schemes ?? []) {
|
|
161
|
+
if (!/^[a-z][a-z0-9+.-]*$/.test(scheme) || ["http", "https", "file", "app"].includes(scheme))
|
|
162
|
+
problems.push(`deepLinks.schemes: invalid scheme ${JSON.stringify(scheme)}`);
|
|
163
|
+
}
|
|
164
|
+
checkIconAndSplash(raw, appDir, problems);
|
|
165
|
+
checkPrivacy(raw.privacy, problems);
|
|
166
|
+
checkNative(raw, appDir, problems);
|
|
167
|
+
const suffix = raw.android?.debugAppIdSuffix;
|
|
168
|
+
if (suffix !== undefined && (typeof suffix !== "string" || !/^(\.[a-zA-Z][a-zA-Z0-9_]*)+$/.test(suffix))) {
|
|
169
|
+
problems.push(`android.debugAppIdSuffix must look like ".debug" (got ${JSON.stringify(suffix)})`);
|
|
170
|
+
}
|
|
171
|
+
if (raw.app?.build !== undefined && raw.app.build > 2_100_000_000)
|
|
172
|
+
problems.push("app.build must be at most 2100000000 (Android versionCode)");
|
|
173
|
+
const googleServices = raw.android?.googleServices;
|
|
174
|
+
if (googleServices !== undefined) {
|
|
175
|
+
if (typeof googleServices !== "string" || !existsSync(resolve(appDir, googleServices)))
|
|
176
|
+
problems.push(`android.googleServices: ${JSON.stringify(googleServices)} is not a file in the app folder`);
|
|
177
|
+
}
|
|
178
|
+
const minWebView = raw.android?.minWebViewVersion;
|
|
179
|
+
if (minWebView !== undefined && !(Number.isInteger(minWebView) && minWebView >= 94 && minWebView < 1000)) {
|
|
180
|
+
problems.push(
|
|
181
|
+
`android.minWebViewVersion must be a Chromium major version, at least 94 (got ${JSON.stringify(minWebView)})`,
|
|
182
|
+
);
|
|
183
|
+
}
|
|
184
|
+
const env = validateEnvConfig(raw.env, problems);
|
|
185
|
+
const updates = validateUpdates(raw.updates, problems);
|
|
186
|
+
if (raw.desktop?.quitOnLastWindowClosed !== undefined && typeof raw.desktop.quitOnLastWindowClosed !== "boolean") {
|
|
187
|
+
problems.push("desktop.quitOnLastWindowClosed must be a boolean");
|
|
188
|
+
}
|
|
189
|
+
if (raw.keyboard?.resize !== undefined && raw.keyboard.resize !== "resize" && raw.keyboard.resize !== "none") {
|
|
190
|
+
problems.push(`keyboard.resize must be "resize" or "none" (got ${JSON.stringify(raw.keyboard.resize)})`);
|
|
191
|
+
}
|
|
192
|
+
if (raw.ios?.hideFormAccessoryBar !== undefined && typeof raw.ios.hideFormAccessoryBar !== "boolean")
|
|
193
|
+
problems.push("ios.hideFormAccessoryBar must be a boolean");
|
|
194
|
+
const pushAndroid = raw.push?.android;
|
|
195
|
+
if (pushAndroid?.channel !== undefined) {
|
|
196
|
+
const c = pushAndroid.channel;
|
|
197
|
+
if (!c || typeof c.id !== "string" || !/^[A-Za-z0-9_.-]{1,100}$/.test(c.id))
|
|
198
|
+
problems.push(`push.android.channel.id must be letters, digits, ".", "_" or "-" (got ${JSON.stringify(c?.id)})`);
|
|
199
|
+
if (!c || typeof c.name !== "string" || !c.name.trim())
|
|
200
|
+
problems.push("push.android.channel.name is required (the name users see in the app's notification settings)");
|
|
201
|
+
if (c?.importance !== undefined && !["min", "low", "default", "high"].includes(c.importance))
|
|
202
|
+
problems.push(
|
|
203
|
+
`push.android.channel.importance must be "min", "low", "default" or "high" (got ${JSON.stringify(c.importance)})`,
|
|
204
|
+
);
|
|
205
|
+
if (c?.description !== undefined && typeof c.description !== "string")
|
|
206
|
+
problems.push("push.android.channel.description must be text");
|
|
207
|
+
}
|
|
208
|
+
if (pushAndroid?.smallIcon !== undefined) {
|
|
209
|
+
if (typeof pushAndroid.smallIcon !== "string" || !pushAndroid.smallIcon.toLowerCase().endsWith(".png"))
|
|
210
|
+
problems.push(
|
|
211
|
+
`push.android.smallIcon must be a path to a .png file (got ${JSON.stringify(pushAndroid.smallIcon)})`,
|
|
212
|
+
);
|
|
213
|
+
else if (!existsSync(resolve(appDir, pushAndroid.smallIcon)))
|
|
214
|
+
problems.push(`push.android.smallIcon: ${resolve(appDir, pushAndroid.smallIcon)} not found`);
|
|
215
|
+
}
|
|
216
|
+
if (
|
|
217
|
+
pushAndroid?.color !== undefined &&
|
|
218
|
+
(typeof pushAndroid.color !== "string" || !/^#[0-9a-fA-F]{6}$/.test(pushAndroid.color))
|
|
219
|
+
)
|
|
220
|
+
problems.push(`push.android.color must be a color like "#1a73e8" (got ${JSON.stringify(pushAndroid.color)})`);
|
|
221
|
+
if (problems.length) throw new ConfigError(configPath, problems);
|
|
222
|
+
|
|
223
|
+
const shell = {
|
|
224
|
+
backgroundColor: raw.shell?.backgroundColor ?? "#ffffff",
|
|
225
|
+
backgroundColorDark: raw.shell?.backgroundColorDark ?? raw.shell?.backgroundColor ?? "#000000",
|
|
226
|
+
};
|
|
227
|
+
const icon = typeof raw.icon === "string" ? { image: raw.icon } : raw.icon;
|
|
228
|
+
const splashColor = raw.splash?.backgroundColor;
|
|
229
|
+
const config: ResolvedConfig = {
|
|
230
|
+
...raw,
|
|
231
|
+
app: { build: 1, ...raw.app, fileName: raw.app.fileName ?? defaultFileName(raw.app.id) },
|
|
232
|
+
web: { base: "/", ...raw.web },
|
|
233
|
+
plugins: raw.plugins ?? [],
|
|
234
|
+
env,
|
|
235
|
+
shell,
|
|
236
|
+
usageDescriptions: raw.usageDescriptions ?? {},
|
|
237
|
+
permissions: validatePermissions(raw.permissions),
|
|
238
|
+
security: {
|
|
239
|
+
csp: validateCsp(raw.security?.csp),
|
|
240
|
+
shell: { externalSchemes: validateExternalSchemes(raw.security?.shell?.externalSchemes) },
|
|
241
|
+
},
|
|
242
|
+
deepLinks: {
|
|
243
|
+
schemes: raw.deepLinks?.schemes ?? [],
|
|
244
|
+
domains: (raw.deepLinks?.domains ?? []).map((d) =>
|
|
245
|
+
typeof d === "string" ? { host: d, pathPrefixes: [] } : { host: d.host, pathPrefixes: d.pathPrefixes ?? [] },
|
|
246
|
+
),
|
|
247
|
+
},
|
|
248
|
+
desktop: { quitOnLastWindowClosed: raw.desktop?.quitOnLastWindowClosed ?? true },
|
|
249
|
+
updates,
|
|
250
|
+
icon: icon ? { ...icon, image: resolve(appDir, icon.image) } : null,
|
|
251
|
+
splash: {
|
|
252
|
+
backgroundColor: typeof splashColor === "string" ? splashColor : (splashColor?.light ?? shell.backgroundColor),
|
|
253
|
+
backgroundColorDark:
|
|
254
|
+
typeof splashColor === "string" ? splashColor : (splashColor?.dark ?? shell.backgroundColorDark),
|
|
255
|
+
image: raw.splash?.image ? resolve(appDir, raw.splash.image) : undefined,
|
|
256
|
+
autoHide: raw.splash?.autoHide ?? true,
|
|
257
|
+
timeout: raw.splash?.timeout ?? 10_000,
|
|
258
|
+
},
|
|
259
|
+
};
|
|
260
|
+
const plugins = resolvePlugins(appDir, config.plugins, options.resolveFrom);
|
|
261
|
+
resolveAcl(config.capabilities, plugins, "web");
|
|
262
|
+
return { appDir, configPath, config, plugins };
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
const COLOR = /^#[0-9a-fA-F]{6}([0-9a-fA-F]{2})?$/;
|
|
266
|
+
|
|
267
|
+
function checkIconAndSplash(raw: AkanNativeConfig, appDir: string, problems: string[]) {
|
|
268
|
+
const png = (what: string, path: unknown) => {
|
|
269
|
+
if (typeof path !== "string" || !path.toLowerCase().endsWith(".png"))
|
|
270
|
+
problems.push(`${what} must be a path to a .png file (got ${JSON.stringify(path)})`);
|
|
271
|
+
else if (!existsSync(resolve(appDir, path))) problems.push(`${what}: ${resolve(appDir, path)} not found`);
|
|
272
|
+
};
|
|
273
|
+
const color = (what: string, value: unknown) => {
|
|
274
|
+
if (typeof value !== "string" || !COLOR.test(value))
|
|
275
|
+
problems.push(`${what} must be a color like "#1a2b3c" (got ${JSON.stringify(value)})`);
|
|
276
|
+
};
|
|
277
|
+
if (raw.icon !== undefined) {
|
|
278
|
+
if (typeof raw.icon === "string") png("icon", raw.icon);
|
|
279
|
+
else if (raw.icon && typeof raw.icon === "object") {
|
|
280
|
+
png("icon.image", raw.icon.image);
|
|
281
|
+
if (raw.icon.backgroundColor !== undefined) color("icon.backgroundColor", raw.icon.backgroundColor);
|
|
282
|
+
} else problems.push(`icon must be a .png path or { image, backgroundColor } (got ${JSON.stringify(raw.icon)})`);
|
|
283
|
+
}
|
|
284
|
+
const splash = raw.splash;
|
|
285
|
+
if (splash === undefined) return;
|
|
286
|
+
if (!splash || typeof splash !== "object") return void problems.push("splash must be an object");
|
|
287
|
+
const bg = splash.backgroundColor;
|
|
288
|
+
if (bg !== undefined) {
|
|
289
|
+
if (bg && typeof bg === "object") {
|
|
290
|
+
color("splash.backgroundColor.light", bg.light);
|
|
291
|
+
color("splash.backgroundColor.dark", bg.dark);
|
|
292
|
+
} else color("splash.backgroundColor", bg);
|
|
293
|
+
}
|
|
294
|
+
if (splash.image !== undefined) png("splash.image", splash.image);
|
|
295
|
+
if (splash.autoHide !== undefined && typeof splash.autoHide !== "boolean")
|
|
296
|
+
problems.push("splash.autoHide must be true or false");
|
|
297
|
+
if (
|
|
298
|
+
splash.timeout !== undefined &&
|
|
299
|
+
(typeof splash.timeout !== "number" || !(splash.timeout > 0) || splash.timeout > 60_000)
|
|
300
|
+
) {
|
|
301
|
+
problems.push("splash.timeout must be a number of milliseconds between 1 and 60000");
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
export interface NativeSubset {
|
|
306
|
+
/** Methods this platform implements. Default: all of the manifest's methods. */
|
|
307
|
+
methods?: string[];
|
|
308
|
+
events?: string[];
|
|
309
|
+
/** The methods and events not listed run the plugin's web implementation instead of being UNSUPPORTED. */
|
|
310
|
+
web?: boolean;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export interface IosManifest extends NativeSubset {
|
|
314
|
+
/** Swift files, relative to the plugin folder. Globs allowed. */
|
|
315
|
+
sources: string[];
|
|
316
|
+
/** Swift class conforming to AkanNativePlugin. */
|
|
317
|
+
class: string;
|
|
318
|
+
frameworks?: string[];
|
|
319
|
+
/** Info.plist entries, typically usage descriptions. The app config may override the texts. */
|
|
320
|
+
infoPlist?: Record<string, PlistValue>;
|
|
321
|
+
/**
|
|
322
|
+
* Required Reason APIs the plugin's code calls (App Store privacy manifest), by category without the
|
|
323
|
+
* NSPrivacyAccessedAPICategory prefix, e.g. { "UserDefaults": ["CA92.1"] }. Merged into
|
|
324
|
+
* PrivacyInfo.xcprivacy (lib/privacy.ts).
|
|
325
|
+
*/
|
|
326
|
+
privacyApis?: Record<string, string[]>;
|
|
327
|
+
/** Entitlements the plugin's feature needs (e.g. aps-environment), merged like Info.plist entries. */
|
|
328
|
+
entitlements?: Record<string, PlistValue>;
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
export interface AndroidManifest extends NativeSubset {
|
|
332
|
+
/** Kotlin or Java files, relative to the plugin folder. Globs allowed. */
|
|
333
|
+
sources: string[];
|
|
334
|
+
/** Fully qualified class with a constructor (AkanNativePluginContext). */
|
|
335
|
+
class: string;
|
|
336
|
+
permissions?: string[];
|
|
337
|
+
/** Extra XML inserted into <application> (e.g. a <provider>). ${applicationId} is replaced. */
|
|
338
|
+
applicationXml?: string;
|
|
339
|
+
/** Extra XML at the <manifest> level (e.g. <queries> for package visibility). ${applicationId} is replaced. */
|
|
340
|
+
manifestXml?: string;
|
|
341
|
+
/** Extra R8 rules for release builds. Components named in applicationXml are kept automatically. */
|
|
342
|
+
proguard?: string[];
|
|
343
|
+
/**
|
|
344
|
+
* Pinned Maven libraries the plugin needs (akanjs readiness O8), as root coordinates, e.g.
|
|
345
|
+
* "com.android.billingclient:billing:9.1.0". Their closure comes from native/android/maven.lock.json
|
|
346
|
+
* and goes only into apps that use the plugin.
|
|
347
|
+
*/
|
|
348
|
+
maven?: string[];
|
|
349
|
+
/**
|
|
350
|
+
* The lowest Android API the plugin runs on, when it is above the app's (e.g. 35 for sqlite, built on
|
|
351
|
+
* SQLiteRawStatement). Below it the plugin is not created and every call is UNSUPPORTED; its package
|
|
352
|
+
* may use APIs up to this level without version checks (apilevel.ts).
|
|
353
|
+
*/
|
|
354
|
+
minSdk?: number;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/** Desktop Bun module that implements only some methods (the rest are UNSUPPORTED, or web with `web: true`). */
|
|
358
|
+
export interface DesktopManifest extends NativeSubset {
|
|
359
|
+
module: string;
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
export interface PluginManifest {
|
|
363
|
+
id: string;
|
|
364
|
+
apiVersion: 1;
|
|
365
|
+
/** The JS API surface. Native implementations must handle all of them. */
|
|
366
|
+
methods: string[];
|
|
367
|
+
events: string[];
|
|
368
|
+
web?: string | null;
|
|
369
|
+
/**
|
|
370
|
+
* Per platform: "web" = the web implementation runs in the app's WebView,
|
|
371
|
+
* native description = native implementation, null or missing = unsupported.
|
|
372
|
+
* desktop takes a path to a Bun module (run in the desktop Worker) as its native form.
|
|
373
|
+
*/
|
|
374
|
+
desktop?: "web" | string | DesktopManifest | null;
|
|
375
|
+
/** macOS packaging extras, e.g. usage descriptions needed by a "web" desktop implementation. */
|
|
376
|
+
macos?: { infoPlist?: Record<string, PlistValue> };
|
|
377
|
+
ios?: IosManifest | "web" | null;
|
|
378
|
+
android?: AndroidManifest | "web" | null;
|
|
379
|
+
/**
|
|
380
|
+
* PL-11. What "<id>:default" grants: local permission names (allow-<method>,
|
|
381
|
+
* allow-listen-<event>, set names, "all"). Absent: every method and event.
|
|
382
|
+
*/
|
|
383
|
+
defaultPermissions?: string[];
|
|
384
|
+
/** Named permission sets, e.g. { read: { permissions: ["allow-readFile", "allow-stat"] } } → "<id>:read". */
|
|
385
|
+
permissionSets?: Record<string, PermissionSet>;
|
|
386
|
+
/** The scope fields the plugin enforces, with a description each, e.g. { path: "glob relative to base" }. */
|
|
387
|
+
/** `urlFields`: the fields that hold URL patterns (matched by urlMatch; the build checks their denies). */
|
|
388
|
+
scope?: { description?: string; fields: Record<string, string>; urlFields?: string[]; pathFields?: string[] };
|
|
389
|
+
/**
|
|
390
|
+
* Scopes of `<plugin>:default`, which an app without `capabilities` gets: what the plugin allows
|
|
391
|
+
* without the app asking (filesystem: the app's own folders; http: no URL). A capability's own
|
|
392
|
+
* `allow` on `<plugin>:default` replaces these; its `deny` is added.
|
|
393
|
+
*/
|
|
394
|
+
defaultScope?: { allow?: Record<string, string>[]; deny?: Record<string, string>[] };
|
|
395
|
+
/**
|
|
396
|
+
* PL-10: generate Swift / Kotlin types and a `<Plugin>PluginSpec` protocol from the
|
|
397
|
+
* definePlugin<Api, Events> interfaces in src/index.ts into every iOS and Android build.
|
|
398
|
+
*/
|
|
399
|
+
codegen?: boolean;
|
|
400
|
+
/**
|
|
401
|
+
* Plugins whose native code this plugin's native code uses (architecture review stage 6). Each must
|
|
402
|
+
* be in the app's plugins (akan-native never adds one by itself) and have a native part wherever this one does.
|
|
403
|
+
*/
|
|
404
|
+
dependencies?: string[];
|
|
405
|
+
/**
|
|
406
|
+
* Events whose payload is a snapshot (progress, a size, a position): the host sends only the latest
|
|
407
|
+
* of a burst, at most about every 100 ms (architecture review stage 4). The payload must be
|
|
408
|
+
* cumulative or absolute, never a delta; an end state is a method's result, not an event.
|
|
409
|
+
*/
|
|
410
|
+
coalesce?: string[];
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
export interface ResolvedPlugin {
|
|
414
|
+
/** What the app config listed. */
|
|
415
|
+
spec: string;
|
|
416
|
+
dir: string;
|
|
417
|
+
manifest: PluginManifest;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
const PLUGIN_ID = /^[a-z][a-z0-9-]{0,62}$/;
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Where a plugin's manifest is: a builtin plugin by id ("camera": the package's plugins/camera), a
|
|
424
|
+
* folder by path (absolute, or relative to the app; how akanjs passes plugins), else a package name
|
|
425
|
+
* resolved from `resolveFrom`.
|
|
426
|
+
*/
|
|
427
|
+
function resolveManifestPath(appDir: string, spec: string, resolveFrom: string): string {
|
|
428
|
+
if (PLUGIN_ID.test(spec)) {
|
|
429
|
+
const path = join(PACKAGE_ROOT, "plugins", spec, "native-plugin.json");
|
|
430
|
+
if (!existsSync(path))
|
|
431
|
+
throw new CliError(
|
|
432
|
+
`plugin ${spec}: no builtin plugin with this id (plugins/${spec}); give another plugin by its folder path`,
|
|
433
|
+
);
|
|
434
|
+
return path;
|
|
435
|
+
}
|
|
436
|
+
if (spec.startsWith(".") || isAbsolute(spec)) {
|
|
437
|
+
const path = join(resolve(appDir, spec), "native-plugin.json");
|
|
438
|
+
if (!existsSync(path)) throw new CliError(`plugin ${spec}: ${path} not found`);
|
|
439
|
+
return path;
|
|
440
|
+
}
|
|
441
|
+
try {
|
|
442
|
+
return Bun.resolveSync(`${spec}/native-plugin.json`, resolveFrom);
|
|
443
|
+
} catch {
|
|
444
|
+
throw new CliError(
|
|
445
|
+
`plugin ${spec}: cannot resolve ${spec}/native-plugin.json from ${resolveFrom} (installed? exported in package.json?)`,
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
export function resolvePlugins(appDir: string, specs: string[], resolveFrom = appDir): ResolvedPlugin[] {
|
|
451
|
+
const seen = new Map<string, string>();
|
|
452
|
+
const resolved = specs.map((spec) => {
|
|
453
|
+
const path = resolveManifestPath(appDir, spec, resolveFrom);
|
|
454
|
+
let manifest: PluginManifest;
|
|
455
|
+
try {
|
|
456
|
+
manifest = JSON.parse(readFileSync(path, "utf8"));
|
|
457
|
+
} catch (error) {
|
|
458
|
+
throw new CliError(`plugin ${spec}: invalid JSON in ${path}: ${(error as Error).message}`);
|
|
459
|
+
}
|
|
460
|
+
if (typeof manifest.id !== "string" || !PLUGIN_ID.test(manifest.id))
|
|
461
|
+
throw new CliError(`plugin ${spec}: invalid id ${JSON.stringify(manifest.id)}`);
|
|
462
|
+
if (typeof manifest.apiVersion === "number" && manifest.apiVersion > 1) {
|
|
463
|
+
throw new CliError(
|
|
464
|
+
`plugin ${spec}: needs a newer akan-native (it is written for plugin apiVersion ${manifest.apiVersion}; this akan-native reads 1)`,
|
|
465
|
+
);
|
|
466
|
+
}
|
|
467
|
+
if (manifest.apiVersion !== 1) throw new CliError(`plugin ${spec}: unsupported apiVersion ${manifest.apiVersion}`);
|
|
468
|
+
const unknown = unknownManifestKeys(manifest);
|
|
469
|
+
if (unknown.length) throw new CliError(`plugin ${spec}: unknown keys in native-plugin.json: ${unknown.join(", ")}`);
|
|
470
|
+
if (
|
|
471
|
+
manifest.dependencies !== undefined &&
|
|
472
|
+
!(
|
|
473
|
+
Array.isArray(manifest.dependencies) &&
|
|
474
|
+
manifest.dependencies.every((d) => typeof d === "string" && PLUGIN_ID.test(d))
|
|
475
|
+
)
|
|
476
|
+
) {
|
|
477
|
+
throw new CliError(`plugin ${spec}: dependencies must be a list of plugin ids`);
|
|
478
|
+
}
|
|
479
|
+
if (
|
|
480
|
+
manifest.coalesce !== undefined &&
|
|
481
|
+
!(Array.isArray(manifest.coalesce) && manifest.coalesce.every((e) => (manifest.events ?? []).includes(e)))
|
|
482
|
+
) {
|
|
483
|
+
throw new CliError(`plugin ${spec}: coalesce must list events of the plugin`);
|
|
484
|
+
}
|
|
485
|
+
if (!Array.isArray(manifest.methods) || !Array.isArray(manifest.events ?? []))
|
|
486
|
+
throw new CliError(`plugin ${spec}: methods and events must be arrays`);
|
|
487
|
+
manifest.events ??= [];
|
|
488
|
+
|
|
489
|
+
for (const [kind, names] of [
|
|
490
|
+
["method", manifest.methods],
|
|
491
|
+
["event", manifest.events],
|
|
492
|
+
] as const) {
|
|
493
|
+
for (const name of names as unknown[]) {
|
|
494
|
+
if (typeof name !== "string" || !MEMBER_NAME.test(name))
|
|
495
|
+
throw new CliError(
|
|
496
|
+
`plugin ${spec}: ${kind} name ${JSON.stringify(name)} must start with a letter and hold only letters, digits and "_" ("$" names belong to the bridge)`,
|
|
497
|
+
);
|
|
498
|
+
if (kind === "method" && RESERVED_MEMBERS.includes(name))
|
|
499
|
+
throw new CliError(
|
|
500
|
+
`plugin ${spec}: method name "${name}" is reserved (the plugin object or JavaScript uses it)`,
|
|
501
|
+
);
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
if (manifest.codegen !== undefined && typeof manifest.codegen !== "boolean")
|
|
505
|
+
throw new CliError(`plugin ${spec}: codegen must be true or false`);
|
|
506
|
+
const permissionIssues = manifestPermissionProblems(manifest);
|
|
507
|
+
if (permissionIssues.length) throw new CliError(`plugin ${spec}: ${permissionIssues.join("; ")}`);
|
|
508
|
+
const other = seen.get(manifest.id);
|
|
509
|
+
if (other) throw new CliError(`plugin id "${manifest.id}" is provided by both ${other} and ${spec}`);
|
|
510
|
+
seen.set(manifest.id, spec);
|
|
511
|
+
return { spec, dir: dirname(path), manifest };
|
|
512
|
+
});
|
|
513
|
+
for (const { spec, manifest } of resolved) {
|
|
514
|
+
for (const dep of manifest.dependencies ?? []) {
|
|
515
|
+
if (!seen.has(dep))
|
|
516
|
+
throw new CliError(
|
|
517
|
+
`plugin ${spec} needs plugin "${dep}": add it to the app's plugins (akan-native does not add plugins by itself)`,
|
|
518
|
+
);
|
|
519
|
+
}
|
|
520
|
+
}
|
|
521
|
+
return resolved;
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
const MANIFEST_KEYS: Record<string, readonly string[]> = {
|
|
525
|
+
"": [
|
|
526
|
+
"$schema",
|
|
527
|
+
"description",
|
|
528
|
+
"id",
|
|
529
|
+
"apiVersion",
|
|
530
|
+
"methods",
|
|
531
|
+
"events",
|
|
532
|
+
"coalesce",
|
|
533
|
+
"codegen",
|
|
534
|
+
"web",
|
|
535
|
+
"desktop",
|
|
536
|
+
"macos",
|
|
537
|
+
"ios",
|
|
538
|
+
"android",
|
|
539
|
+
"defaultPermissions",
|
|
540
|
+
"permissionSets",
|
|
541
|
+
"scope",
|
|
542
|
+
"defaultScope",
|
|
543
|
+
"dependencies",
|
|
544
|
+
],
|
|
545
|
+
ios: ["methods", "events", "web", "sources", "class", "frameworks", "infoPlist", "privacyApis", "entitlements"],
|
|
546
|
+
android: [
|
|
547
|
+
"methods",
|
|
548
|
+
"events",
|
|
549
|
+
"web",
|
|
550
|
+
"sources",
|
|
551
|
+
"class",
|
|
552
|
+
"permissions",
|
|
553
|
+
"applicationXml",
|
|
554
|
+
"manifestXml",
|
|
555
|
+
"proguard",
|
|
556
|
+
"maven",
|
|
557
|
+
"minSdk",
|
|
558
|
+
],
|
|
559
|
+
desktop: ["methods", "events", "web", "module"],
|
|
560
|
+
macos: ["infoPlist"],
|
|
561
|
+
};
|
|
562
|
+
|
|
563
|
+
/** Keys akan-native does not know, at the top and in the platform entries ("ios.bogus"). A typo would otherwise do nothing. */
|
|
564
|
+
export function unknownManifestKeys(manifest: object): string[] {
|
|
565
|
+
const out: string[] = [];
|
|
566
|
+
for (const key of Object.keys(manifest)) if (!MANIFEST_KEYS[""]!.includes(key)) out.push(key);
|
|
567
|
+
for (const platform of ["ios", "android", "desktop", "macos"]) {
|
|
568
|
+
const entry = (manifest as Record<string, unknown>)[platform];
|
|
569
|
+
if (!entry || typeof entry !== "object") continue;
|
|
570
|
+
for (const key of Object.keys(entry)) if (!MANIFEST_KEYS[platform]!.includes(key)) out.push(`${platform}.${key}`);
|
|
571
|
+
}
|
|
572
|
+
return out;
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* Plugins whose native part needs another plugin's native part on this platform (dependencies):
|
|
577
|
+
* the other one must not be web-only or missing there.
|
|
578
|
+
*/
|
|
579
|
+
export function dependencyProblems(plugins: ResolvedPlugin[], platform: string): string[] {
|
|
580
|
+
const entryKey = platform === "ios" || platform === "android" ? platform : platform === "web" ? null : "desktop";
|
|
581
|
+
if (!entryKey) return [];
|
|
582
|
+
const byId = new Map(plugins.map((p) => [p.manifest.id, p]));
|
|
583
|
+
const native = (p: ResolvedPlugin) => {
|
|
584
|
+
const entry = (p.manifest as unknown as Record<string, unknown>)[entryKey];
|
|
585
|
+
return entry !== undefined && entry !== null && entry !== "web";
|
|
586
|
+
};
|
|
587
|
+
const problems: string[] = [];
|
|
588
|
+
for (const plugin of plugins) {
|
|
589
|
+
if (!native(plugin)) continue;
|
|
590
|
+
for (const dep of plugin.manifest.dependencies ?? []) {
|
|
591
|
+
const other = byId.get(dep);
|
|
592
|
+
if (other && !native(other))
|
|
593
|
+
problems.push(
|
|
594
|
+
`plugin ${plugin.manifest.id} needs the native part of plugin ${dep}, which has none on ${platform}`,
|
|
595
|
+
);
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
return problems;
|
|
599
|
+
}
|
|
600
|
+
|
|
601
|
+
function checkPrivacy(privacy: AkanNativeConfig["privacy"], problems: string[]): void {
|
|
602
|
+
if (privacy === undefined) return;
|
|
603
|
+
if (!privacy || typeof privacy !== "object" || Array.isArray(privacy))
|
|
604
|
+
return void problems.push("privacy must be an object");
|
|
605
|
+
if (privacy.tracking !== undefined && typeof privacy.tracking !== "boolean")
|
|
606
|
+
problems.push("privacy.tracking must be a boolean");
|
|
607
|
+
if (
|
|
608
|
+
privacy.trackingDomains !== undefined &&
|
|
609
|
+
!(Array.isArray(privacy.trackingDomains) && privacy.trackingDomains.every((d) => typeof d === "string" && d))
|
|
610
|
+
) {
|
|
611
|
+
problems.push("privacy.trackingDomains must be a list of domains");
|
|
612
|
+
}
|
|
613
|
+
if (
|
|
614
|
+
privacy.collectedDataTypes !== undefined &&
|
|
615
|
+
!(
|
|
616
|
+
Array.isArray(privacy.collectedDataTypes) &&
|
|
617
|
+
privacy.collectedDataTypes.every(
|
|
618
|
+
(t) => t && typeof t === "object" && typeof t.NSPrivacyCollectedDataType === "string",
|
|
619
|
+
)
|
|
620
|
+
)
|
|
621
|
+
) {
|
|
622
|
+
problems.push("privacy.collectedDataTypes must be a list of dictionaries with NSPrivacyCollectedDataType");
|
|
623
|
+
}
|
|
624
|
+
problems.push(...privacyApiProblems({ who: "privacy.accessedApis", apis: privacy.accessedApis }));
|
|
625
|
+
}
|
|
626
|
+
|
|
627
|
+
const HOST = /^(?=.{1,253}$)([a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z]{2,63}$/;
|
|
628
|
+
|
|
629
|
+
/** deepLinks.domains, native.ios, native.android and native.resources (akanjs readiness O5). */
|
|
630
|
+
function checkNative(raw: AkanNativeConfig, appDir: string, problems: string[]): void {
|
|
631
|
+
for (const domain of raw.deepLinks?.domains ?? []) {
|
|
632
|
+
const host = typeof domain === "string" ? domain : domain?.host;
|
|
633
|
+
if (typeof host !== "string" || !HOST.test(host))
|
|
634
|
+
problems.push(`deepLinks.domains: ${JSON.stringify(host)} is not a host name like "example.com"`);
|
|
635
|
+
const prefixes = typeof domain === "object" ? domain.pathPrefixes : undefined;
|
|
636
|
+
if (
|
|
637
|
+
prefixes !== undefined &&
|
|
638
|
+
!(Array.isArray(prefixes) && prefixes.every((p) => typeof p === "string" && p.startsWith("/")))
|
|
639
|
+
) {
|
|
640
|
+
problems.push(`deepLinks.domains: pathPrefixes of ${host} must be paths starting with "/"`);
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
const native = raw.native;
|
|
644
|
+
if (native === undefined) return;
|
|
645
|
+
if (!native || typeof native !== "object") return void problems.push("native must be an object");
|
|
646
|
+
const dict = (what: string, value: unknown) => {
|
|
647
|
+
if (value !== undefined && (!value || typeof value !== "object" || Array.isArray(value)))
|
|
648
|
+
problems.push(`${what} must be an object of plist values`);
|
|
649
|
+
};
|
|
650
|
+
dict("native.ios.infoPlist", native.ios?.infoPlist);
|
|
651
|
+
dict("native.ios.entitlements", native.ios?.entitlements);
|
|
652
|
+
for (const key of ["manifest", "application", "activity"] as const) {
|
|
653
|
+
const xml = native.android?.[key];
|
|
654
|
+
if (
|
|
655
|
+
xml !== undefined &&
|
|
656
|
+
!(Array.isArray(xml) && xml.every((x) => typeof x === "string" && x.trim().startsWith("<")))
|
|
657
|
+
) {
|
|
658
|
+
problems.push(`native.android.${key} must be a list of XML fragments`);
|
|
659
|
+
}
|
|
660
|
+
}
|
|
661
|
+
for (const [i, r] of (native.resources ?? []).entries()) {
|
|
662
|
+
if (!r || typeof r.from !== "string" || typeof r.to !== "string") {
|
|
663
|
+
problems.push(`native.resources[${i}] needs from and to`);
|
|
664
|
+
continue;
|
|
665
|
+
}
|
|
666
|
+
if (!existsSync(resolve(appDir, r.from)))
|
|
667
|
+
problems.push(`native.resources[${i}]: ${resolve(appDir, r.from)} not found`);
|
|
668
|
+
const problem = resourceTargetProblem(r.to);
|
|
669
|
+
if (problem) problems.push(`native.resources[${i}]: ${problem}`);
|
|
670
|
+
}
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
/** Why a resource's logical `to` is not allowed, or null. */
|
|
674
|
+
export function resourceTargetProblem(to: string): string | null {
|
|
675
|
+
const parts = to.split("/");
|
|
676
|
+
if (parts.some((p) => p === "" || p === "." || p === ".."))
|
|
677
|
+
return `"${to}" must be a relative path without . or .. parts`;
|
|
678
|
+
if (parts[0] === "ios") {
|
|
679
|
+
if (parts.length < 2) return `"${to}" needs a file name after ios/`;
|
|
680
|
+
if (
|
|
681
|
+
[
|
|
682
|
+
"Info.plist",
|
|
683
|
+
"PrivacyInfo.xcprivacy",
|
|
684
|
+
"app",
|
|
685
|
+
"akan-native",
|
|
686
|
+
"_CodeSignature",
|
|
687
|
+
"embedded.mobileprovision",
|
|
688
|
+
"Assets.car",
|
|
689
|
+
].includes(parts[1]!)
|
|
690
|
+
)
|
|
691
|
+
return `"${to}" would replace a file akan-native writes`;
|
|
692
|
+
return null;
|
|
693
|
+
}
|
|
694
|
+
if (parts[0] === "android" && parts[1] === "res") {
|
|
695
|
+
if (
|
|
696
|
+
parts.length !== 4 ||
|
|
697
|
+
!/^[a-z]+(-[a-zA-Z0-9+]+)*$/.test(parts[2]!) ||
|
|
698
|
+
!/^[a-z0-9_]+\.[a-z0-9]+$/.test(parts[3]!)
|
|
699
|
+
) {
|
|
700
|
+
return `"${to}" must be android/res/<type>/<name> with a lowercase resource name (e.g. android/res/raw/chime.mp3)`;
|
|
701
|
+
}
|
|
702
|
+
return null;
|
|
703
|
+
}
|
|
704
|
+
if (parts[0] === "android" && parts[1] === "assets") {
|
|
705
|
+
if (parts.length < 3) return `"${to}" needs a file after android/assets/`;
|
|
706
|
+
if (parts[2] === "app" || parts[2] === "akan-native") return `"${to}": android/assets/${parts[2]} is akan-native's`;
|
|
707
|
+
return null;
|
|
708
|
+
}
|
|
709
|
+
return `"${to}" must start with ios/, android/res/ or android/assets/`;
|
|
710
|
+
}
|