diff --git a/apps/tablet/.env.example b/apps/tablet/.env.example new file mode 100644 index 000000000..3de120ef9 --- /dev/null +++ b/apps/tablet/.env.example @@ -0,0 +1,6 @@ +VITE_APP_LOCALES=en,zh_TW,zh_CN,id,ru,it,es,uk,tr,bg,uz,bn +VITE_APP_AMPLITUDE= +VITE_APP_TONCONSOLE_HOST=https://pro.tonconsole.com +VITE_APP_TG_BOT_ID=6345183204 +VITE_APP_TG_BOT_ORIGIN=https://tonkeeper.com +VITE_APP_STONFI_REFERRAL_ADDRESS=UQCthC8ICK7K8Hkfm9smblLFroKrYrEMwZuoD4Nbm5LswUnc diff --git a/apps/tablet/.gitignore b/apps/tablet/.gitignore new file mode 100644 index 000000000..b394013ab --- /dev/null +++ b/apps/tablet/.gitignore @@ -0,0 +1,8 @@ +.idea/ +node_modules/ +.vscode/ +*.map +.DS_Store +.sourcemaps +dist/ +/capacitor.live-reload-config.ts diff --git a/apps/tablet/README.md b/apps/tablet/README.md new file mode 100644 index 000000000..4a4771453 --- /dev/null +++ b/apps/tablet/README.md @@ -0,0 +1,11 @@ +# Tonkeeper tablet + +### Start development server +1. `chmod +x live-reload.sh` +2. `yarn start` +3. Open xcode and run the app in ./ios directory + +### Build app +1. `chmod +x build.sh` +2. `yarn build` +3. Open xcode and run the app in ./ios directory diff --git a/apps/tablet/build.sh b/apps/tablet/build.sh new file mode 100755 index 000000000..204fe15a4 --- /dev/null +++ b/apps/tablet/build.sh @@ -0,0 +1,12 @@ +#!/bin/bash +rm -f vite.log +CAPACITOR_CONFIG_FILE="./capacitor.live-reload-config.ts" + +cat > "$CAPACITOR_CONFIG_FILE" < + + + + Tonkeeper Pro + + + + + +
+ + diff --git a/apps/tablet/ios/.gitignore b/apps/tablet/ios/.gitignore new file mode 100644 index 000000000..f47029973 --- /dev/null +++ b/apps/tablet/ios/.gitignore @@ -0,0 +1,13 @@ +App/build +App/Pods +App/output +App/App/public +DerivedData +xcuserdata + +# Cordova plugins for Capacitor +capacitor-cordova-ios-plugins + +# Generated Config files +App/App/capacitor.config.json +App/App/config.xml diff --git a/apps/tablet/ios/App/App.xcodeproj/project.pbxproj b/apps/tablet/ios/App/App.xcodeproj/project.pbxproj new file mode 100644 index 000000000..06ea292ef --- /dev/null +++ b/apps/tablet/ios/App/App.xcodeproj/project.pbxproj @@ -0,0 +1,420 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 48; + objects = { + +/* Begin PBXBuildFile section */ + 2FAD9763203C412B000D30F8 /* config.xml in Resources */ = {isa = PBXBuildFile; fileRef = 2FAD9762203C412B000D30F8 /* config.xml */; }; + 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */ = {isa = PBXBuildFile; fileRef = 50379B222058CBB4000EE86E /* capacitor.config.json */; }; + 504EC3081FED79650016851F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 504EC3071FED79650016851F /* AppDelegate.swift */; }; + 504EC30D1FED79650016851F /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30B1FED79650016851F /* Main.storyboard */; }; + 504EC30F1FED79650016851F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 504EC30E1FED79650016851F /* Assets.xcassets */; }; + 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 504EC3101FED79650016851F /* LaunchScreen.storyboard */; }; + 50B271D11FEDC1A000F3C39B /* public in Resources */ = {isa = PBXBuildFile; fileRef = 50B271D01FEDC1A000F3C39B /* public */; }; + A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */; }; + B3313CCD2CEB43AB00E31C31 /* CustomViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3313CCC2CEB43AB00E31C31 /* CustomViewController.swift */; }; + B3313CCF2CEB459400E31C31 /* BiometricPlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3313CCE2CEB459400E31C31 /* BiometricPlugin.swift */; }; + B3313CD12CEB4C7E00E31C31 /* SecureStoragePlugin.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3313CD02CEB4C7E00E31C31 /* SecureStoragePlugin.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXFileReference section */ + 2FAD9762203C412B000D30F8 /* config.xml */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = config.xml; sourceTree = ""; }; + 50379B222058CBB4000EE86E /* capacitor.config.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = capacitor.config.json; sourceTree = ""; }; + 504EC3041FED79650016851F /* App.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = App.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 504EC3071FED79650016851F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 504EC30C1FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 504EC30E1FED79650016851F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 504EC3111FED79650016851F /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 504EC3131FED79650016851F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 50B271D01FEDC1A000F3C39B /* public */ = {isa = PBXFileReference; lastKnownFileType = folder; path = public; sourceTree = ""; }; + AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_App.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.release.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.release.xcconfig"; sourceTree = ""; }; + B3313CCC2CEB43AB00E31C31 /* CustomViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomViewController.swift; sourceTree = ""; }; + B3313CCE2CEB459400E31C31 /* BiometricPlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BiometricPlugin.swift; sourceTree = ""; }; + B3313CD02CEB4C7E00E31C31 /* SecureStoragePlugin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecureStoragePlugin.swift; sourceTree = ""; }; + FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-App.debug.xcconfig"; path = "Pods/Target Support Files/Pods-App/Pods-App.debug.xcconfig"; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 504EC3011FED79650016851F /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + A084ECDBA7D38E1E42DFC39D /* Pods_App.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */ = { + isa = PBXGroup; + children = ( + AF277DCFFFF123FFC6DF26C7 /* Pods_App.framework */, + ); + name = Frameworks; + sourceTree = ""; + }; + 504EC2FB1FED79650016851F = { + isa = PBXGroup; + children = ( + 504EC3061FED79650016851F /* App */, + 504EC3051FED79650016851F /* Products */, + 7F8756D8B27F46E3366F6CEA /* Pods */, + 27E2DDA53C4D2A4D1A88CE4A /* Frameworks */, + ); + sourceTree = ""; + }; + 504EC3051FED79650016851F /* Products */ = { + isa = PBXGroup; + children = ( + 504EC3041FED79650016851F /* App.app */, + ); + name = Products; + sourceTree = ""; + }; + 504EC3061FED79650016851F /* App */ = { + isa = PBXGroup; + children = ( + 50379B222058CBB4000EE86E /* capacitor.config.json */, + 504EC3071FED79650016851F /* AppDelegate.swift */, + 504EC30B1FED79650016851F /* Main.storyboard */, + 504EC30E1FED79650016851F /* Assets.xcassets */, + 504EC3101FED79650016851F /* LaunchScreen.storyboard */, + 504EC3131FED79650016851F /* Info.plist */, + 2FAD9762203C412B000D30F8 /* config.xml */, + 50B271D01FEDC1A000F3C39B /* public */, + B3313CCC2CEB43AB00E31C31 /* CustomViewController.swift */, + B3313CCE2CEB459400E31C31 /* BiometricPlugin.swift */, + B3313CD02CEB4C7E00E31C31 /* SecureStoragePlugin.swift */, + ); + path = App; + sourceTree = ""; + }; + 7F8756D8B27F46E3366F6CEA /* Pods */ = { + isa = PBXGroup; + children = ( + FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */, + AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */, + ); + name = Pods; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 504EC3031FED79650016851F /* App */ = { + isa = PBXNativeTarget; + buildConfigurationList = 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */; + buildPhases = ( + 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */, + 504EC3001FED79650016851F /* Sources */, + 504EC3011FED79650016851F /* Frameworks */, + 504EC3021FED79650016851F /* Resources */, + 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = App; + productName = App; + productReference = 504EC3041FED79650016851F /* App.app */; + productType = "com.apple.product-type.application"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 504EC2FC1FED79650016851F /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0920; + LastUpgradeCheck = 0920; + TargetAttributes = { + 504EC3031FED79650016851F = { + CreatedOnToolsVersion = 9.2; + LastSwiftMigration = 1100; + ProvisioningStyle = Automatic; + }; + }; + }; + buildConfigurationList = 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */; + compatibilityVersion = "Xcode 8.0"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 504EC2FB1FED79650016851F; + packageReferences = ( + ); + productRefGroup = 504EC3051FED79650016851F /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 504EC3031FED79650016851F /* App */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 504EC3021FED79650016851F /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 504EC3121FED79650016851F /* LaunchScreen.storyboard in Resources */, + 50B271D11FEDC1A000F3C39B /* public in Resources */, + 504EC30F1FED79650016851F /* Assets.xcassets in Resources */, + 50379B232058CBB4000EE86E /* capacitor.config.json in Resources */, + 504EC30D1FED79650016851F /* Main.storyboard in Resources */, + 2FAD9763203C412B000D30F8 /* config.xml in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 6634F4EFEBD30273BCE97C65 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-App-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 9592DBEFFC6D2A0C8D5DEB22 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-App/Pods-App-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 504EC3001FED79650016851F /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + B3313CCD2CEB43AB00E31C31 /* CustomViewController.swift in Sources */, + B3313CCF2CEB459400E31C31 /* BiometricPlugin.swift in Sources */, + 504EC3081FED79650016851F /* AppDelegate.swift in Sources */, + B3313CD12CEB4C7E00E31C31 /* SecureStoragePlugin.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXVariantGroup section */ + 504EC30B1FED79650016851F /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 504EC30C1FED79650016851F /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 504EC3101FED79650016851F /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 504EC3111FED79650016851F /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 504EC3141FED79650016851F /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 504EC3151FED79650016851F /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + 504EC3171FED79650016851F /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = FC68EB0AF532CFC21C3344DD /* Pods-App.debug.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = App/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.0; + OTHER_SWIFT_FLAGS = "$(inherited) \"-D\" \"COCOAPODS\" \"-DDEBUG\""; + PRODUCT_BUNDLE_IDENTIFIER = com.tonkeeper.pro.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + 504EC3181FED79650016851F /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AF51FD2D460BCFE21FA515B2 /* Pods-App.release.xcconfig */; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + CURRENT_PROJECT_VERSION = 1; + INFOPLIST_FILE = App/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + MARKETING_VERSION = 1.0; + PRODUCT_BUNDLE_IDENTIFIER = com.tonkeeper.pro.app; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = ""; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 504EC2FF1FED79650016851F /* Build configuration list for PBXProject "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 504EC3141FED79650016851F /* Debug */, + 504EC3151FED79650016851F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 504EC3161FED79650016851F /* Build configuration list for PBXNativeTarget "App" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 504EC3171FED79650016851F /* Debug */, + 504EC3181FED79650016851F /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 504EC2FC1FED79650016851F /* Project object */; +} diff --git a/apps/tablet/ios/App/App.xcworkspace/contents.xcworkspacedata b/apps/tablet/ios/App/App.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..b301e824b --- /dev/null +++ b/apps/tablet/ios/App/App.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,10 @@ + + + + + + + diff --git a/apps/tablet/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/apps/tablet/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/apps/tablet/ios/App/App.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/apps/tablet/ios/App/App/AppDelegate.swift b/apps/tablet/ios/App/App/AppDelegate.swift new file mode 100644 index 000000000..c3cd83b5c --- /dev/null +++ b/apps/tablet/ios/App/App/AppDelegate.swift @@ -0,0 +1,49 @@ +import UIKit +import Capacitor + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { + // Called when the app was launched with a url. Feel free to add additional processing here, + // but if you want the App API to support tracking app url opens, make sure to keep this call + return ApplicationDelegateProxy.shared.application(app, open: url, options: options) + } + + func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool { + // Called when the app was launched with an activity, including Universal Links. + // Feel free to add additional processing here, but if you want the App API to support + // tracking app url opens, make sure to keep this call + return ApplicationDelegateProxy.shared.application(application, continue: userActivity, restorationHandler: restorationHandler) + } + +} diff --git a/apps/tablet/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png b/apps/tablet/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png new file mode 100644 index 000000000..adf6ba01d Binary files /dev/null and b/apps/tablet/ios/App/App/Assets.xcassets/AppIcon.appiconset/AppIcon-512@2x.png differ diff --git a/apps/tablet/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json b/apps/tablet/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..9b7d382dc --- /dev/null +++ b/apps/tablet/ios/App/App/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,14 @@ +{ + "images" : [ + { + "filename" : "AppIcon-512@2x.png", + "idiom" : "universal", + "platform" : "ios", + "size" : "1024x1024" + } + ], + "info" : { + "author" : "xcode", + "version" : 1 + } +} diff --git a/apps/tablet/ios/App/App/Assets.xcassets/Contents.json b/apps/tablet/ios/App/App/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/apps/tablet/ios/App/App/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json b/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json new file mode 100644 index 000000000..d7d96a67c --- /dev/null +++ b/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/Contents.json @@ -0,0 +1,23 @@ +{ + "images" : [ + { + "idiom" : "universal", + "filename" : "splash-2732x2732-2.png", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "splash-2732x2732-1.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "filename" : "splash-2732x2732.png", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png b/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png new file mode 100644 index 000000000..33ea6c970 Binary files /dev/null and b/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-1.png differ diff --git a/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png b/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png new file mode 100644 index 000000000..33ea6c970 Binary files /dev/null and b/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732-2.png differ diff --git a/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png b/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png new file mode 100644 index 000000000..33ea6c970 Binary files /dev/null and b/apps/tablet/ios/App/App/Assets.xcassets/Splash.imageset/splash-2732x2732.png differ diff --git a/apps/tablet/ios/App/App/Base.lproj/LaunchScreen.storyboard b/apps/tablet/ios/App/App/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..e7ae5d780 --- /dev/null +++ b/apps/tablet/ios/App/App/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,32 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/apps/tablet/ios/App/App/Base.lproj/Main.storyboard b/apps/tablet/ios/App/App/Base.lproj/Main.storyboard new file mode 100644 index 000000000..3e0e11cc9 --- /dev/null +++ b/apps/tablet/ios/App/App/Base.lproj/Main.storyboard @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/apps/tablet/ios/App/App/BiometricPlugin.swift b/apps/tablet/ios/App/App/BiometricPlugin.swift new file mode 100644 index 000000000..68d601773 --- /dev/null +++ b/apps/tablet/ios/App/App/BiometricPlugin.swift @@ -0,0 +1,54 @@ +import Foundation +import LocalAuthentication +import Capacitor + + +@objc public class BiometricPlugin: CAPPlugin, CAPBridgedPlugin { + public let identifier = "BiometricPlugin" + public let jsName = "Biometric" + public let pluginMethods: [CAPPluginMethod] = [ + CAPPluginMethod(name: "canPrompt", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "prompt", returnType: CAPPluginReturnPromise) + ] + + + @objc func canPrompt(_ call: CAPPluginCall) { + var isAvailable = false; + if #available(iOS 11, *) { + let authContext = LAContext() + + let _ = authContext.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) + switch(authContext.biometryType) { + case .none: + isAvailable = false; + case .touchID: + isAvailable = true; + case .faceID: + isAvailable = true; + default: + isAvailable = false; + } + } + + call.resolve(["isAvailable": isAvailable]) + } + + @objc func prompt(_ call: CAPPluginCall) { + let authContext = LAContext() + + authContext.touchIDAuthenticationAllowableReuseDuration = 60; + + let reason = call.getString("reason") ?? "Access requires authentication" + + authContext.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, localizedReason: reason ) { success, error in + if success { + DispatchQueue.main.async { + call.resolve() + } + } else { + call.reject(error?.localizedDescription ?? "Failed to authenticate") + } + } + } + +} diff --git a/apps/tablet/ios/App/App/CustomViewController.swift b/apps/tablet/ios/App/App/CustomViewController.swift new file mode 100644 index 000000000..38923d756 --- /dev/null +++ b/apps/tablet/ios/App/App/CustomViewController.swift @@ -0,0 +1,34 @@ +// +// CustomViewController.swift +// App +// +// Created by Andreev Sergey on 18/11/2024. +// + +import UIKit +import Capacitor + +class CustomViewController: CAPBridgeViewController { + + override func viewDidLoad() { + super.viewDidLoad() + + // Do any additional setup after loading the view. + } + + override open func capacitorDidLoad() { + bridge?.registerPluginInstance(BiometricPlugin()) + bridge?.registerPluginInstance(SecureStoragePlugin()) + } + + /* + // MARK: - Navigation + + // In a storyboard-based application, you will often want to do a little preparation before navigation + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + // Get the new view controller using segue.destination. + // Pass the selected object to the new view controller. + } + */ + +} diff --git a/apps/tablet/ios/App/App/Info.plist b/apps/tablet/ios/App/App/Info.plist new file mode 100644 index 000000000..ec5d95084 --- /dev/null +++ b/apps/tablet/ios/App/App/Info.plist @@ -0,0 +1,56 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleDisplayName + Tonkeeper Pro + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + $(MARKETING_VERSION) + CFBundleVersion + $(CURRENT_PROJECT_VERSION) + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UIViewControllerBasedStatusBarAppearance + + UIStatusBarHidden + + WKAppBoundDomains + + dev-pro.tonconsole.com + pro.tonconsole.com + + + diff --git a/apps/tablet/ios/App/App/SecureStoragePlugin.swift b/apps/tablet/ios/App/App/SecureStoragePlugin.swift new file mode 100644 index 000000000..c4e8b3500 --- /dev/null +++ b/apps/tablet/ios/App/App/SecureStoragePlugin.swift @@ -0,0 +1,63 @@ +import Capacitor +import Security + +@objc public class SecureStoragePlugin: CAPPlugin, CAPBridgedPlugin { + public let identifier = "SecureStoragePlugin" + public let jsName = "SecureStorage" + + public let pluginMethods: [CAPPluginMethod] = [ + CAPPluginMethod(name: "storeData", returnType: CAPPluginReturnPromise), + CAPPluginMethod(name: "getData", returnType: CAPPluginReturnPromise) + ] + + + @objc func storeData(_ call: CAPPluginCall) { + guard let id = call.getString("id"), let data = call.getString("data") else { + call.reject("Missing required parameters") + return + } + + let keychainQuery: [CFString: Any] = [ + kSecClass: kSecClassGenericPassword, + kSecAttrAccount: id, + kSecValueData: data.data(using: .utf8)! + ] + + SecItemDelete(keychainQuery as CFDictionary) + + + let status = SecItemAdd(keychainQuery as CFDictionary, nil) + + if status == errSecSuccess { + call.resolve() + } else { + call.reject("Error storing data: \(status)") + } + } + + + @objc func getData(_ call: CAPPluginCall) { + guard let id = call.getString("id") else { + call.reject("Missing required parameter: id") + return + } + + let keychainQuery: [CFString: Any] = [ + kSecClass: kSecClassGenericPassword, + kSecAttrAccount: id, + kSecReturnData: true, + kSecMatchLimit: kSecMatchLimitOne + ] + + var result: AnyObject? + let status = SecItemCopyMatching(keychainQuery as CFDictionary, &result) + + if status == errSecSuccess, let data = result as? Data, let stringData = String(data: data, encoding: .utf8) { + call.resolve([ + "data": stringData + ]) + } else { + call.reject("Error retrieving data: \(status)") + } + } +} diff --git a/apps/tablet/ios/App/Podfile b/apps/tablet/ios/App/Podfile new file mode 100644 index 000000000..c7ac4e350 --- /dev/null +++ b/apps/tablet/ios/App/Podfile @@ -0,0 +1,28 @@ +require_relative '../../node_modules/@capacitor/ios/scripts/pods_helpers' + +platform :ios, '13.0' +use_frameworks! + +# workaround to avoid Xcode caching of Pods that requires +# Product -> Clean Build Folder after new Cordova plugins installed +# Requires CocoaPods 1.6 or newer +install! 'cocoapods', :disable_input_output_paths => true + +def capacitor_pods + pod 'Capacitor', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorCordova', :path => '../../node_modules/@capacitor/ios' + pod 'CapacitorApp', :path => '../../node_modules/@capacitor/app' + pod 'CapacitorCamera', :path => '../../node_modules/@capacitor/camera' + pod 'CapacitorClipboard', :path => '../../node_modules/@capacitor/clipboard' + pod 'CapacitorPreferences', :path => '../../node_modules/@capacitor/preferences' + pod 'CapacitorSplashScreen', :path => '../../node_modules/@capacitor/splash-screen' +end + +target 'App' do + capacitor_pods + # Add your Pods here +end + +post_install do |installer| + assertDeploymentTarget(installer) +end diff --git a/apps/tablet/ios/App/Podfile.lock b/apps/tablet/ios/App/Podfile.lock new file mode 100644 index 000000000..5b5e28ac8 --- /dev/null +++ b/apps/tablet/ios/App/Podfile.lock @@ -0,0 +1,52 @@ +PODS: + - Capacitor (6.1.2): + - CapacitorCordova + - CapacitorApp (6.0.1): + - Capacitor + - CapacitorCamera (6.1.0): + - Capacitor + - CapacitorClipboard (6.0.1): + - Capacitor + - CapacitorCordova (6.1.2) + - CapacitorPreferences (6.0.2): + - Capacitor + - CapacitorSplashScreen (6.0.2): + - Capacitor + +DEPENDENCIES: + - "Capacitor (from `../../node_modules/@capacitor/ios`)" + - "CapacitorApp (from `../../node_modules/@capacitor/app`)" + - "CapacitorCamera (from `../../node_modules/@capacitor/camera`)" + - "CapacitorClipboard (from `../../node_modules/@capacitor/clipboard`)" + - "CapacitorCordova (from `../../node_modules/@capacitor/ios`)" + - "CapacitorPreferences (from `../../node_modules/@capacitor/preferences`)" + - "CapacitorSplashScreen (from `../../node_modules/@capacitor/splash-screen`)" + +EXTERNAL SOURCES: + Capacitor: + :path: "../../node_modules/@capacitor/ios" + CapacitorApp: + :path: "../../node_modules/@capacitor/app" + CapacitorCamera: + :path: "../../node_modules/@capacitor/camera" + CapacitorClipboard: + :path: "../../node_modules/@capacitor/clipboard" + CapacitorCordova: + :path: "../../node_modules/@capacitor/ios" + CapacitorPreferences: + :path: "../../node_modules/@capacitor/preferences" + CapacitorSplashScreen: + :path: "../../node_modules/@capacitor/splash-screen" + +SPEC CHECKSUMS: + Capacitor: 679f9673fdf30597493a6362a5d5bf233d46abc2 + CapacitorApp: 0bc633b4eae40a1f32cd2834788fad3bc42da6a1 + CapacitorCamera: 81ce64062cd82b82cc75a79616fda4bd09d7f643 + CapacitorClipboard: 756cd7e83e8d5d19b0c74f40b57517c287bd5fe2 + CapacitorCordova: f48c89f96c319101cd2f0ce8a2b7449b5fb8b3dd + CapacitorPreferences: e8284bf740cf8c6d3f25409af3c01df87dfeb5a1 + CapacitorSplashScreen: 250df9ef8014fac5c7c1fd231f0f8b1d8f0b5624 + +PODFILE CHECKSUM: db26d8f446e81926aade6104148f6510bafadf17 + +COCOAPODS: 1.16.2 diff --git a/apps/tablet/live-reload.sh b/apps/tablet/live-reload.sh new file mode 100755 index 000000000..8c67941c0 --- /dev/null +++ b/apps/tablet/live-reload.sh @@ -0,0 +1,35 @@ +#!/bin/bash +rm -f vite.log +vite --host &> vite.log & +VITE_PID=$! + +echo "Starting Vite..." +sleep 3 + +LAN_URL=$(grep -Eo 'http://[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+:[0-9]+' vite.log | head -n 1) + +if [ -z "$LAN_URL" ]; then + echo "Failed to detect Vite server LAN URL. Exiting." + exit 1 +fi + +echo "Vite is running at $LAN_URL" + +CAPACITOR_CONFIG_FILE="./capacitor.live-reload-config.ts" + +cat > "$CAPACITOR_CONFIG_FILE" < { + const { t: tSimple, i18n } = useTranslation(); + + const t = useTWithReplaces(tSimple); + + const translation = useMemo(() => { + const languages = langs.split(','); + const client: I18nContext = { + t, + i18n: { + enable: true, + reloadResources: i18n.reloadResources, + changeLanguage: i18n.changeLanguage as any, + language: i18n.language, + languages: languages + } + }; + return client; + }, [t, i18n]); + + useEffect(() => { + // document.body.classList.add(window.backgroundApi.platform()); TODO + }, []); + + return ( + + }> + + + + + + + + + + ); +}; + +const router = createMemoryRouter([ + { + path: '/*', + element: + } +]); + +export const App = () => { + return ; +}; + +const ThemeAndContent = () => { + const { data } = useProBackupState(); + return ( + + + + + + + + + + + + ); +}; + +const FullSizeWrapper = styled(Container)` + max-width: 800px; +`; + +const Wrapper = styled.div` + box-sizing: border-box; + + height: 100%; + display: flex; + flex-direction: column; + background-color: ${props => props.theme.backgroundPage}; + white-space: pre-wrap; +`; + +const WideLayout = styled.div` + width: 100%; + height: 100%; + display: flex; +`; + +const WideContent = styled.div` + flex: 1; + min-width: 0; + min-height: 0; +`; + +const WalletLayout = styled.div` + display: flex; + flex-direction: column; + height: 100%; +`; + +const WalletLayoutBody = styled.div` + flex: 1; + display: flex; + max-height: calc(100% - ${desktopHeaderContainerHeight}); +`; + +const WalletRoutingWrapper = styled.div` + flex: 1; + overflow: auto; + position: relative; +`; + +const PreferencesLayout = styled.div` + height: calc(100% - ${desktopHeaderContainerHeight}); + display: flex; + overflow: auto; +`; + +const PreferencesRoutingWrapper = styled.div` + flex: 1; + overflow: auto; + position: relative; +`; + +const FullSizeWrapperBounded = styled(FullSizeWrapper)` + max-height: 100%; + overflow: auto; + + justify-content: center; +`; + +export const Loader: FC = () => { + const network = useActiveTonNetwork(); + const { data: activeAccount, isLoading: activeWalletLoading } = useActiveAccountQuery(); + const { data: accounts, isLoading: isWalletsLoading } = useAccountsStateQuery(); + const { data: lang, isLoading: isLangLoading } = useUserLanguage(); + const { data: devSettings } = useDevSettings(); + const { isLoading: globalPreferencesLoading } = useGlobalPreferencesQuery(); + const { isLoading: globalSetupLoading } = useGlobalSetup(); + + const lock = useLock(sdk); + const { i18n } = useTranslation(); + const { data: fiat } = useUserFiatQuery(); + + const tonendpoint = useTonendpoint({ + targetEnv: TARGET_ENV, + build: sdk.version, + network, + lang, + platform: 'desktop' + }); + const { data: config } = useTonenpointConfig(tonendpoint); + + useAppHeight(); + + const { data: tracker } = useAnalytics(sdk.version, activeAccount!, accounts); + + useEffect(() => { + if (lang && i18n.language !== localizationText(lang)) { + i18n.reloadResources([localizationText(lang)]).then(() => + i18n.changeLanguage(localizationText(lang)) + ); + } + }, [lang, i18n]); + + useEffect(() => { + // window.backgroundApi.onRefresh(() => queryClient.invalidateQueries()); TODO + }, []); + + if ( + activeWalletLoading || + isLangLoading || + isWalletsLoading || + config === undefined || + lock === undefined || + fiat === undefined || + !devSettings || + globalPreferencesLoading || + globalSetupLoading + ) { + return ; + } + + const context: IAppContext = { + api: getApiConfig(config, network, import.meta.env.VITE_APP_TONCONSOLE_HOST), + fiat, + config, + tonendpoint, + standalone: true, + extension: false, + proFeatures: true, + experimental: true, + ios: false, + env: { + tgAuthBotId: import.meta.env.VITE_APP_TG_BOT_ID, + stonfiReferralAddress: import.meta.env.VITE_APP_STONFI_REFERRAL_ADDRESS + }, + defaultWalletVersion: WalletVersion.V5R1 + }; + + return ( + + + + + + + + + ); +}; + +const usePrefetch = () => { + useRecommendations(); + useCanPromptTouchId(); +}; + +export const Content: FC<{ + activeAccount?: Account | null; + lock: boolean; +}> = ({ activeAccount, lock }) => { + const location = useLocation(); + useWindowsScroll(); + useAppWidth(); + useTrackLocation(); + usePrefetch(); + useDebuggingTools(); + + if (lock) { + return ( + + + + ); + } + + if (!activeAccount || location.pathname.startsWith(AppRoute.import)) { + return ( + + + + + + ); + } + + return ( + + + + + } /> + } /> + } /> + } /> + } + /> + } /> + + + + + ); +}; + +const WalletContent = () => { + return ( + + + + + + + + }> + } /> + } + /> + } /> + + } /> + + } + /> + } + /> + } + /> + } /> + } /> + + + + + + ); +}; + +const PreferencesContent = () => { + return ( + <> + + + + + + + + + ); +}; + +const OldAppRouting = () => { + return ( + + + + + ); +}; + +const BackgroundElements = () => { + return ( + <> + + + + + + + + + + + + + ); +}; diff --git a/apps/tablet/src/app/components/DeepLink.tsx b/apps/tablet/src/app/components/DeepLink.tsx new file mode 100644 index 000000000..80bdf2ebc --- /dev/null +++ b/apps/tablet/src/app/components/DeepLink.tsx @@ -0,0 +1,4 @@ +export const DeepLinkSubscription = () => { + return null; + // TODO TBD +}; diff --git a/apps/tablet/src/app/components/TonConnectSubscription.tsx b/apps/tablet/src/app/components/TonConnectSubscription.tsx new file mode 100644 index 000000000..9648f228d --- /dev/null +++ b/apps/tablet/src/app/components/TonConnectSubscription.tsx @@ -0,0 +1,4 @@ +export const TonConnectSubscription = () => { + return null; + // TODO TBD +}; diff --git a/apps/tablet/src/app/i18n.ts b/apps/tablet/src/app/i18n.ts new file mode 100644 index 000000000..6ebeb26f9 --- /dev/null +++ b/apps/tablet/src/app/i18n.ts @@ -0,0 +1,18 @@ +import resources from '@tonkeeper/locales/dist/i18n/resources.json'; +import i18n from 'i18next'; +import { initReactI18next } from 'react-i18next'; + +i18n.use(initReactI18next) // passes i18n down to react-i18next + .init({ + resources, + debug: false, + lng: 'en', // language to use, more information here: https://www.i18next.com/overview/configuration-options#languages-namespaces-resources + // you can use the i18n.changeLanguage function to change the language manually: https://www.i18next.com/overview/api#changelanguage + // if you're using a language detector, do not define the lng option + fallbackLng: 'en', + interpolation: { + escapeValue: false // react already safes from xss + } + }); + +export default i18n; diff --git a/apps/tablet/src/index.tsx b/apps/tablet/src/index.tsx new file mode 100644 index 000000000..ab3404c8e --- /dev/null +++ b/apps/tablet/src/index.tsx @@ -0,0 +1,6 @@ +import { createRoot } from 'react-dom/client'; +import { App } from './app/App'; +import './app/i18n'; + +const root = createRoot(document.getElementById('root')!); +root.render(); diff --git a/apps/tablet/src/libs/appSdk.ts b/apps/tablet/src/libs/appSdk.ts new file mode 100644 index 000000000..32ce508c7 --- /dev/null +++ b/apps/tablet/src/libs/appSdk.ts @@ -0,0 +1,75 @@ +import { + BaseApp, + IAppSdk, + KeychainPassword, + TouchId, + CookieService +} from '@tonkeeper/core/dist/AppSdk'; +import packageJson from '../../package.json'; +import { TabletStorage } from './storage'; +import { Clipboard } from '@capacitor/clipboard'; +import { getWindow } from './utils'; +import { Biometric, SecureStorage } from "./plugins"; +import { CapacitorCookies } from "@capacitor/core"; + +export class KeychainTablet implements KeychainPassword { + setPassword = async (publicKey: string, mnemonic: string) => { + await SecureStorage.storeData({ + id: `Wallet-${publicKey}`, + data: mnemonic + }); + }; + + getPassword = async (publicKey: string) => { + const { data } = await SecureStorage.getData({ + id: `Wallet-${publicKey}` + }); + return data!; + }; +} + +export class CookieTablet implements CookieService { + cleanUp = async () => { + await CapacitorCookies.clearAllCookies(); + }; +} + +export class TouchIdTablet implements TouchId { + canPrompt = async () => { + try { + const result = await Biometric.canPrompt(); + return result.isAvailable; + } catch (e) { + console.error('TOUCH ID rejected, cause', e); + return false; + } + }; + + prompt = async (reason: (lang: string) => string) => { + return Biometric.prompt(reason('en')); // TODO lang + }; +} + +export class TabletAppSdk extends BaseApp implements IAppSdk { + keychain = new KeychainTablet(); + cookie = new CookieTablet(); + + touchId = new TouchIdTablet(); + + constructor() { + super(new TabletStorage()); + } + + copyToClipboard = async (value: string, notification?: string) => { + await Clipboard.write({ string: value }); + this.topMessage(notification); + }; + + openPage = async (url: string) => { + getWindow()?.open(url, '_blank'); + }; + + version = packageJson.version ?? 'Unknown'; + + targetEnv = 'desktop' as const; +} diff --git a/apps/tablet/src/libs/hooks.ts b/apps/tablet/src/libs/hooks.ts new file mode 100644 index 000000000..f9f1c8ec8 --- /dev/null +++ b/apps/tablet/src/libs/hooks.ts @@ -0,0 +1,85 @@ +import { useQuery } from '@tanstack/react-query'; +import { AppKey } from '@tonkeeper/core/dist/Keys'; +import { Account } from '@tonkeeper/core/dist/entries/account'; +import { throttle } from '@tonkeeper/core/dist/utils/common'; +import { Analytics, AnalyticsGroup, toWalletType } from '@tonkeeper/uikit/dist/hooks/analytics'; +import { Amplitude } from '@tonkeeper/uikit/dist/hooks/analytics/amplitude'; +import { useAppSdk } from '@tonkeeper/uikit/dist/hooks/appSdk'; +import { QueryKey } from '@tonkeeper/uikit/dist/libs/queryKey'; +import { useEffect } from 'react'; +import { v4 as uuidv4 } from 'uuid'; +import { useActiveTonNetwork } from '@tonkeeper/uikit/dist/state/wallet'; + +export const useAppHeight = () => { + useEffect(() => { + const appHeight = throttle(() => { + const doc = document.documentElement; + doc.style.setProperty('--app-height', `${window.innerHeight}px`); + }, 50); + window.addEventListener('resize', appHeight); + appHeight(); + + return () => { + window.removeEventListener('resize', appHeight); + }; + }, []); +}; + +export const useAppWidth = () => { + useEffect(() => { + const appWidth = throttle(() => { + const doc = document.documentElement; + const app = (document.getElementById('root') as HTMLDivElement).childNodes.item( + 0 + ) as HTMLDivElement; + + doc.style.setProperty('--app-width', `${app.clientWidth}px`); + }, 50); + window.addEventListener('resize', appWidth); + + appWidth(); + + return () => { + window.removeEventListener('resize', appWidth); + }; + }, []); +}; + +export const useAnalytics = (version: string, activeAccount?: Account, accounts?: Account[]) => { + const sdk = useAppSdk(); + const network = useActiveTonNetwork(); + + return useQuery( + [QueryKey.analytics], + async () => { + const userId = await sdk.storage + .get(AppKey.USER_ID) + .then(async (userId: string | null) => { + if (userId) { + return userId; + } else { + const newUserId = uuidv4(); + await sdk.storage.set(AppKey.USER_ID, newUserId); + return newUserId; + } + }); + + const tracker = new AnalyticsGroup( + new Amplitude(import.meta.env.VITE_APP_AMPLITUDE, userId) + ); + + tracker.init({ + application: 'Desktop', + walletType: toWalletType(activeAccount?.activeTonWallet), + activeAccount: activeAccount!, + accounts: accounts!, + network, + version, + platform: `tablet` // TODO + }); + + return tracker; + }, + { enabled: accounts != null && activeAccount !== undefined } + ); +}; diff --git a/apps/tablet/src/libs/plugins.ts b/apps/tablet/src/libs/plugins.ts new file mode 100644 index 000000000..95c482eed --- /dev/null +++ b/apps/tablet/src/libs/plugins.ts @@ -0,0 +1,18 @@ +import { registerPlugin } from '@capacitor/core'; + +export interface BiometricPlugin { + canPrompt(): Promise<{isAvailable: boolean}> + + prompt(reason: string): Promise; +} + +export const Biometric = registerPlugin('Biometric'); + + +export interface SecureStoragePlugin { + storeData(params:{ id: string, data: string }): Promise + + getData(params:{ id: string }): Promise<{ data: string }> +} + +export const SecureStorage = registerPlugin('SecureStorage'); diff --git a/apps/tablet/src/libs/scroll.ts b/apps/tablet/src/libs/scroll.ts new file mode 100644 index 000000000..d8d76b46d --- /dev/null +++ b/apps/tablet/src/libs/scroll.ts @@ -0,0 +1,30 @@ +export const disableScroll = () => { + document.documentElement.classList.add('is-locked'); + window.document.body.style.paddingRight = `${getScrollbarWidth()}px`; +}; + +export const enableScroll = () => { + document.documentElement.classList.remove('is-locked'); + window.document.body.style.paddingRight = '0px'; +}; + +export const getScrollbarWidth = () => { + // Creating invisible container + const outer = document.createElement('div'); + outer.style.visibility = 'hidden'; + outer.style.overflow = 'scroll'; // forcing scrollbar to appear + (outer.style as any).msOverflowStyle = 'scrollbar'; // needed for WinJS apps + document.body.appendChild(outer); + + // Creating inner element and placing it in the container + const inner = document.createElement('div'); + outer.appendChild(inner); + + // Calculating difference between container's full width and the child width + const scrollbarWidth = outer.offsetWidth - inner.offsetWidth; + + // Removing temporary elements from the DOM + outer.parentNode!.removeChild(outer); + + return scrollbarWidth; +}; diff --git a/apps/tablet/src/libs/storage.ts b/apps/tablet/src/libs/storage.ts new file mode 100644 index 000000000..abbc65578 --- /dev/null +++ b/apps/tablet/src/libs/storage.ts @@ -0,0 +1,34 @@ +import { IStorage } from '@tonkeeper/core/dist/Storage'; +import { Preferences } from '@capacitor/preferences'; + +export class TabletStorage implements IStorage { + get = async (key: string): Promise => { + const { value } = await Preferences.get({ key }); + return value ? JSON.parse(value) as R : null; + }; + + set = async (key: string, value: R) => { + await Preferences.set({ key, value: JSON.stringify(value) }); + return value; + }; + + setBatch = async >(values: V) => { + const operations = Object.entries(values).map(([key, value]) => + Preferences.set({ key, value: JSON.stringify(value) }) + ); + await Promise.all(operations); + return values; + }; + + delete = async (key: string) => { + const payload = await this.get(key); + if (payload !== null) { + await Preferences.remove({ key }); + } + return payload; + }; + + clear = async (): Promise => { + await Preferences.clear(); + }; +} diff --git a/apps/tablet/src/libs/utils.ts b/apps/tablet/src/libs/utils.ts new file mode 100644 index 000000000..cbd363f93 --- /dev/null +++ b/apps/tablet/src/libs/utils.ts @@ -0,0 +1,7 @@ +export function getWindow() { + if (typeof window !== 'undefined') { + return window; + } + + return undefined; +} diff --git a/apps/tablet/src/manifest.json b/apps/tablet/src/manifest.json new file mode 100644 index 000000000..2ed570131 --- /dev/null +++ b/apps/tablet/src/manifest.json @@ -0,0 +1,13 @@ +{ + "name": "App", + "short_name": "App", + "start_url": "index.html", + "display": "standalone", + "icons": [{ + "src": "assets/imgs/logo.png", + "sizes": "512x512", + "type": "image/png" + }], + "background_color": "#31d53d", + "theme_color": "#31d53d" +} diff --git a/apps/tablet/src/vite-env.d.ts b/apps/tablet/src/vite-env.d.ts new file mode 100644 index 000000000..11f02fe2a --- /dev/null +++ b/apps/tablet/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/apps/tablet/tsconfig.json b/apps/tablet/tsconfig.json new file mode 100644 index 000000000..8f9d0bf15 --- /dev/null +++ b/apps/tablet/tsconfig.json @@ -0,0 +1,30 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "allowSyntheticDefaultImports": true, + "moduleResolution": "node", + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }], + "ts-node": { + "compilerOptions": { + "module": "CommonJS" + } + } +} diff --git a/apps/tablet/tsconfig.node.json b/apps/tablet/tsconfig.node.json new file mode 100644 index 000000000..af7c06e30 --- /dev/null +++ b/apps/tablet/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/apps/tablet/vite.config.ts b/apps/tablet/vite.config.ts new file mode 100644 index 000000000..538e3bc1a --- /dev/null +++ b/apps/tablet/vite.config.ts @@ -0,0 +1,37 @@ +import { defineConfig } from 'vite'; +import { nodePolyfills } from "vite-plugin-node-polyfills"; +import react from "@vitejs/plugin-react"; +import path from "path"; + + +export default defineConfig({ + build: { + outDir: './dist', + minify: false, + emptyOutDir: true + }, + plugins: [ + nodePolyfills({ + globals: { + Buffer: true, + global: true, + process: true + }, + include: ['stream', 'buffer', 'crypto'] + }), + react() + ], + resolve: { + alias: { + react: path.resolve(__dirname, './node_modules/react'), + 'react-dom': path.resolve(__dirname, './node_modules/react-dom'), + '@ton/core': path.resolve(__dirname, '../../packages/core/node_modules/@ton/core'), + '@ton/crypto': path.resolve(__dirname, '../../packages/core/node_modules/@ton/crypto'), + '@ton/ton': path.resolve(__dirname, '../../packages/core/node_modules/@ton/ton'), + 'react-router-dom': path.resolve(__dirname, './node_modules/react-router-dom'), + 'styled-components': path.resolve(__dirname, './node_modules/styled-components'), + 'react-i18next': path.resolve(__dirname, './node_modules/react-i18next'), + '@tanstack/react-query': path.resolve(__dirname, './node_modules/@tanstack/react-query') + } + } +}); diff --git a/yarn.lock b/yarn.lock index 281d3f9c9..7b4b1826f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2267,6 +2267,98 @@ __metadata: languageName: node linkType: hard +"@capacitor/app@npm:^6.0.1": + version: 6.0.1 + resolution: "@capacitor/app@npm:6.0.1" + peerDependencies: + "@capacitor/core": ^6.0.0 + checksum: 10/3e8bc85c3a43728c003c80511dde913872b1263dbc27931b1168f52442b8d95f35e5a6a85423d6ac61253a5e4b2198bbb7b899cae9f5e343edfed24010399ade + languageName: node + linkType: hard + +"@capacitor/camera@npm:latest": + version: 6.1.0 + resolution: "@capacitor/camera@npm:6.1.0" + peerDependencies: + "@capacitor/core": ^6.0.0 + checksum: 10/fa4b3a53775aedca69f7df2575c764d28eaffea2a225e8c8a69375737b55c23d90110650ff10cc17d2a585c38d61e72d28045b7a3207051468f301bebfca694d + languageName: node + linkType: hard + +"@capacitor/cli@npm:latest": + version: 6.1.2 + resolution: "@capacitor/cli@npm:6.1.2" + dependencies: + "@ionic/cli-framework-output": "npm:^2.2.5" + "@ionic/utils-fs": "npm:^3.1.6" + "@ionic/utils-process": "npm:^2.1.11" + "@ionic/utils-subprocess": "npm:2.1.11" + "@ionic/utils-terminal": "npm:^2.3.3" + commander: "npm:^9.3.0" + debug: "npm:^4.3.4" + env-paths: "npm:^2.2.0" + kleur: "npm:^4.1.4" + native-run: "npm:^2.0.0" + open: "npm:^8.4.0" + plist: "npm:^3.0.5" + prompts: "npm:^2.4.2" + rimraf: "npm:^4.4.1" + semver: "npm:^7.3.7" + tar: "npm:^6.1.11" + tslib: "npm:^2.4.0" + xml2js: "npm:^0.5.0" + bin: + cap: bin/capacitor + capacitor: bin/capacitor + checksum: 10/eb4c331af9c52d8839441d262b70c29faf24125183711aa014240f06509dd5ad74834b0bf6fa2a9c217090f504af722c0ebc7a8a258afbace6c7ce76092b1a61 + languageName: node + linkType: hard + +"@capacitor/clipboard@npm:^6.0.1": + version: 6.0.1 + resolution: "@capacitor/clipboard@npm:6.0.1" + peerDependencies: + "@capacitor/core": ^6.0.0 + checksum: 10/439fed476c3586d3fdb14edd9b416b5e381236ef0cb7648c71bcc58e1cf0fbc8cdd0119a9f822445540dfe2c17547fd4e543ca381ac30f501d6fa64c8ea92e08 + languageName: node + linkType: hard + +"@capacitor/core@npm:latest": + version: 6.1.2 + resolution: "@capacitor/core@npm:6.1.2" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10/2b79bdefd515ae08a4809db405315353945f66a99191af9c98ac3d523eae3b189abb6249f811dd78898a7af29f08dd22b62e9d8e907b6d651bc07d79a232b1a2 + languageName: node + linkType: hard + +"@capacitor/ios@npm:^6.1.2": + version: 6.1.2 + resolution: "@capacitor/ios@npm:6.1.2" + peerDependencies: + "@capacitor/core": ^6.1.0 + checksum: 10/85cfa7b65b43304e773b60787e3a9618c1ae450fda8bbdb73ebb3c619f61b08174fc71c7e897c0aa3c3e76488f2b72b56f6b847a12a4cc56a434ccc0f716ba69 + languageName: node + linkType: hard + +"@capacitor/preferences@npm:^6.0.2": + version: 6.0.2 + resolution: "@capacitor/preferences@npm:6.0.2" + peerDependencies: + "@capacitor/core": ^6.0.0 + checksum: 10/81dbe63d2f6d97df97efadce81d1fb58527279b097a13e4626c35b4c35e2bf4b932f6f750bbacb29fb693bbf8fca4e703666bef582d3f02af42770a89e3d0854 + languageName: node + linkType: hard + +"@capacitor/splash-screen@npm:latest": + version: 6.0.2 + resolution: "@capacitor/splash-screen@npm:6.0.2" + peerDependencies: + "@capacitor/core": ^6.0.0 + checksum: 10/06f5e7242293406591b0ed2438a6dda977c873b9ea09cefaf92668171af73445d5126a3cef4550e6e2a7d32ca0c17f4972b37cef2aa1f3ca7d4fe1d0314e27e1 + languageName: node + linkType: hard + "@cloudflare/kv-asset-handler@npm:^0.2.0": version: 0.2.0 resolution: "@cloudflare/kv-asset-handler@npm:0.2.0" @@ -3298,6 +3390,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/aix-ppc64@npm:0.21.5" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/android-arm64@npm:0.16.17" @@ -3319,6 +3418,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm64@npm:0.21.5" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/android-arm@npm:0.16.17" @@ -3340,6 +3446,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-arm@npm:0.21.5" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/android-x64@npm:0.16.17" @@ -3361,6 +3474,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/android-x64@npm:0.21.5" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/darwin-arm64@npm:0.16.17" @@ -3382,6 +3502,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-arm64@npm:0.21.5" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/darwin-x64@npm:0.16.17" @@ -3403,6 +3530,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/darwin-x64@npm:0.21.5" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/freebsd-arm64@npm:0.16.17" @@ -3424,6 +3558,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-arm64@npm:0.21.5" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/freebsd-x64@npm:0.16.17" @@ -3445,6 +3586,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/freebsd-x64@npm:0.21.5" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-arm64@npm:0.16.17" @@ -3466,6 +3614,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm64@npm:0.21.5" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-arm@npm:0.16.17" @@ -3487,6 +3642,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-arm@npm:0.21.5" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-ia32@npm:0.16.17" @@ -3508,6 +3670,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ia32@npm:0.21.5" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-loong64@npm:0.16.17" @@ -3529,6 +3698,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-loong64@npm:0.21.5" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-mips64el@npm:0.16.17" @@ -3550,6 +3726,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-mips64el@npm:0.21.5" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-ppc64@npm:0.16.17" @@ -3571,6 +3754,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-ppc64@npm:0.21.5" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-riscv64@npm:0.16.17" @@ -3592,6 +3782,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-riscv64@npm:0.21.5" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-s390x@npm:0.16.17" @@ -3613,6 +3810,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-s390x@npm:0.21.5" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/linux-x64@npm:0.16.17" @@ -3634,6 +3838,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/linux-x64@npm:0.21.5" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/netbsd-x64@npm:0.16.17" @@ -3655,6 +3866,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/netbsd-x64@npm:0.21.5" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/openbsd-x64@npm:0.16.17" @@ -3676,6 +3894,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/openbsd-x64@npm:0.21.5" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/sunos-x64@npm:0.16.17" @@ -3697,6 +3922,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/sunos-x64@npm:0.21.5" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/win32-arm64@npm:0.16.17" @@ -3718,6 +3950,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-arm64@npm:0.21.5" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/win32-ia32@npm:0.16.17" @@ -3739,6 +3978,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-ia32@npm:0.21.5" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.16.17": version: 0.16.17 resolution: "@esbuild/win32-x64@npm:0.16.17" @@ -3760,6 +4006,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.21.5": + version: 0.21.5 + resolution: "@esbuild/win32-x64@npm:0.21.5" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@eslint-community/eslint-utils@npm:^4.2.0": version: 4.4.0 resolution: "@eslint-community/eslint-utils@npm:4.4.0" @@ -3860,6 +4113,159 @@ __metadata: languageName: node linkType: hard +"@ionic/cli-framework-output@npm:^2.2.5": + version: 2.2.8 + resolution: "@ionic/cli-framework-output@npm:2.2.8" + dependencies: + "@ionic/utils-terminal": "npm:2.3.5" + debug: "npm:^4.0.0" + tslib: "npm:^2.0.1" + checksum: 10/773cf0cdbd0fbb5709822b84c06a9e9cec6df5a87d9542bcc21a027a9434117e1d3f1a7d04fe11f252d9d232a5678d056ea80d2d4506e38a5f18fc563a990f34 + languageName: node + linkType: hard + +"@ionic/utils-array@npm:2.1.5": + version: 2.1.5 + resolution: "@ionic/utils-array@npm:2.1.5" + dependencies: + debug: "npm:^4.0.0" + tslib: "npm:^2.0.1" + checksum: 10/eab54e5ae6c3a7d435e420986cd7a0766c00506a829e001ddfc4124542adace6dd0f0c1fc51fa8f5eaa69bd09354a0b5541ff9b39b61763cb0e415936578fd4b + languageName: node + linkType: hard + +"@ionic/utils-fs@npm:3.1.6": + version: 3.1.6 + resolution: "@ionic/utils-fs@npm:3.1.6" + dependencies: + "@types/fs-extra": "npm:^8.0.0" + debug: "npm:^4.0.0" + fs-extra: "npm:^9.0.0" + tslib: "npm:^2.0.1" + checksum: 10/02ec21067436ebaec7a029ed9a045e366f47b77f3149df64ce2bd3a26e46c84e5afeec8cda0da5dc6b77ee901de164f1fe61a3793da5962a1c945273454f599d + languageName: node + linkType: hard + +"@ionic/utils-fs@npm:^3.1.6, @ionic/utils-fs@npm:^3.1.7": + version: 3.1.7 + resolution: "@ionic/utils-fs@npm:3.1.7" + dependencies: + "@types/fs-extra": "npm:^8.0.0" + debug: "npm:^4.0.0" + fs-extra: "npm:^9.0.0" + tslib: "npm:^2.0.1" + checksum: 10/65279a445b4499b9db40dae0c4eface0fdcd6ee95c7931ecb89fb097ee07e61e316ad13da7f495ee567d95dd0dddcbad9b1e46656676e22e51041dde62b06b9d + languageName: node + linkType: hard + +"@ionic/utils-object@npm:2.1.5": + version: 2.1.5 + resolution: "@ionic/utils-object@npm:2.1.5" + dependencies: + debug: "npm:^4.0.0" + tslib: "npm:^2.0.1" + checksum: 10/123d1fe5aabe984bd5c93f7e70b3166e47007673218fd9347747c9005be0b10b0c639a8eaf36b77e12337d1cc90171624af06620bf9e9cccb2b8414ad80bc4a5 + languageName: node + linkType: hard + +"@ionic/utils-object@npm:2.1.6": + version: 2.1.6 + resolution: "@ionic/utils-object@npm:2.1.6" + dependencies: + debug: "npm:^4.0.0" + tslib: "npm:^2.0.1" + checksum: 10/c545f09ede118a801c7eb4c794d4b479c574a98023b752421c0b18e340cb0f509aa7d7e92ef9b1048361e194a0b6f80df8922cd56bae8201d2fb796b71d87e60 + languageName: node + linkType: hard + +"@ionic/utils-process@npm:2.1.10": + version: 2.1.10 + resolution: "@ionic/utils-process@npm:2.1.10" + dependencies: + "@ionic/utils-object": "npm:2.1.5" + "@ionic/utils-terminal": "npm:2.3.3" + debug: "npm:^4.0.0" + signal-exit: "npm:^3.0.3" + tree-kill: "npm:^1.2.2" + tslib: "npm:^2.0.1" + checksum: 10/afe835f0e8beedec53f6fbd0f2fa4f9eb38e59d96c03cecd44b33ffa18b04f9a318bf4e71c7315c9e729bbf942f8e74033b08373058ded2e04ed107956f7eee8 + languageName: node + linkType: hard + +"@ionic/utils-process@npm:^2.1.11": + version: 2.1.12 + resolution: "@ionic/utils-process@npm:2.1.12" + dependencies: + "@ionic/utils-object": "npm:2.1.6" + "@ionic/utils-terminal": "npm:2.3.5" + debug: "npm:^4.0.0" + signal-exit: "npm:^3.0.3" + tree-kill: "npm:^1.2.2" + tslib: "npm:^2.0.1" + checksum: 10/3a94eeb4cc7c05a2d3058e997a2ca05c50bf1a9d76e39b91659d0cbb402adbe2b24b8bc08d8b95bbab1703328dcc50c2e333b345700709ed2ec94e8d844d20c1 + languageName: node + linkType: hard + +"@ionic/utils-stream@npm:3.1.5": + version: 3.1.5 + resolution: "@ionic/utils-stream@npm:3.1.5" + dependencies: + debug: "npm:^4.0.0" + tslib: "npm:^2.0.1" + checksum: 10/6211825c64295df1c368650b445c8cb1220417855aa6f0cdec68f4ccd3c5368b5f825911708a7242386e9546aa9050a5f85f9b1a0356c8dd9280d1dd33bcb33a + languageName: node + linkType: hard + +"@ionic/utils-subprocess@npm:2.1.11": + version: 2.1.11 + resolution: "@ionic/utils-subprocess@npm:2.1.11" + dependencies: + "@ionic/utils-array": "npm:2.1.5" + "@ionic/utils-fs": "npm:3.1.6" + "@ionic/utils-process": "npm:2.1.10" + "@ionic/utils-stream": "npm:3.1.5" + "@ionic/utils-terminal": "npm:2.3.3" + cross-spawn: "npm:^7.0.3" + debug: "npm:^4.0.0" + tslib: "npm:^2.0.1" + checksum: 10/1247e844dcac4add473746b94ad362fb452a57a1083fbbf119779afa8e07f412e70370832138f0a7e7dfce107e62de3570228c371eac1e6216cc43390b2cb70f + languageName: node + linkType: hard + +"@ionic/utils-terminal@npm:2.3.3": + version: 2.3.3 + resolution: "@ionic/utils-terminal@npm:2.3.3" + dependencies: + "@types/slice-ansi": "npm:^4.0.0" + debug: "npm:^4.0.0" + signal-exit: "npm:^3.0.3" + slice-ansi: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + tslib: "npm:^2.0.1" + untildify: "npm:^4.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 10/a34f170b94a14e1994aeda44423aff13c96e2ca33f3e94b25cc730a644af3faad36de39028d9a85ee6dcc5065df4968b47238150f33deb5ae8f03e6473b47dcf + languageName: node + linkType: hard + +"@ionic/utils-terminal@npm:2.3.5, @ionic/utils-terminal@npm:^2.3.3, @ionic/utils-terminal@npm:^2.3.4": + version: 2.3.5 + resolution: "@ionic/utils-terminal@npm:2.3.5" + dependencies: + "@types/slice-ansi": "npm:^4.0.0" + debug: "npm:^4.0.0" + signal-exit: "npm:^3.0.3" + slice-ansi: "npm:^4.0.0" + string-width: "npm:^4.1.0" + strip-ansi: "npm:^6.0.0" + tslib: "npm:^2.0.1" + untildify: "npm:^4.0.0" + wrap-ansi: "npm:^7.0.0" + checksum: 10/40bae30f8cff2d7efa74118d96b2ab16ac9048ba8ffe28a8c203cd398f2688955ddb28d5ebe0c6948890632dc1ca2fe5e84c547ce930cde3ac7be4d5f53e5245 + languageName: node + linkType: hard + "@isaacs/cliui@npm:^8.0.2": version: 8.0.2 resolution: "@isaacs/cliui@npm:8.0.2" @@ -5098,6 +5504,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.24.4" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@rollup/rollup-android-arm-eabi@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-android-arm-eabi@npm:4.9.5" @@ -5105,6 +5518,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-android-arm64@npm:4.24.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-android-arm64@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-android-arm64@npm:4.9.5" @@ -5112,6 +5532,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-arm64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-darwin-arm64@npm:4.24.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-arm64@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-darwin-arm64@npm:4.9.5" @@ -5119,6 +5546,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-darwin-x64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-darwin-x64@npm:4.24.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-darwin-x64@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-darwin-x64@npm:4.9.5" @@ -5126,6 +5560,27 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-freebsd-arm64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.24.4" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-freebsd-x64@npm:4.24.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.24.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm-gnueabihf@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.9.5" @@ -5133,6 +5588,20 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm-musleabihf@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.24.4" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.24.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-gnu@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.9.5" @@ -5140,6 +5609,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-arm64-musl@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.24.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-arm64-musl@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-linux-arm64-musl@npm:4.9.5" @@ -5147,6 +5623,20 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.24.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.24.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-riscv64-gnu@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.9.5" @@ -5154,6 +5644,20 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-s390x-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.24.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.24.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-gnu@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-linux-x64-gnu@npm:4.9.5" @@ -5161,6 +5665,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-linux-x64-musl@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.24.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + "@rollup/rollup-linux-x64-musl@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-linux-x64-musl@npm:4.9.5" @@ -5168,6 +5679,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-arm64-msvc@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.24.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@rollup/rollup-win32-arm64-msvc@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.9.5" @@ -5175,6 +5693,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-ia32-msvc@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.24.4" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@rollup/rollup-win32-ia32-msvc@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.9.5" @@ -5182,6 +5707,13 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-win32-x64-msvc@npm:4.24.4": + version: 4.24.4 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.24.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rollup/rollup-win32-x64-msvc@npm:4.9.5": version: 4.9.5 resolution: "@rollup/rollup-win32-x64-msvc@npm:4.9.5" @@ -6815,6 +7347,15 @@ __metadata: languageName: node linkType: hard +"@tonkeeper-capacitor/biometric@file:../../../tonkeeper-capacitor/packages/biometric::locator=%40tonkeeper%2Ftablet%40workspace%3Aapps%2Ftablet": + version: 0.0.1 + resolution: "@tonkeeper-capacitor/biometric@file:../../../tonkeeper-capacitor/packages/biometric#../../../tonkeeper-capacitor/packages/biometric::hash=875989&locator=%40tonkeeper%2Ftablet%40workspace%3Aapps%2Ftablet" + peerDependencies: + "@capacitor/core": ^6.0.0 + checksum: 10/970e68ddf710baaa7e58331a641984278a1a184be89ef06ed96993a7c8d7bed67e579a72775d8af5aa26e331771fd4d017179e1fe0a2bc67870c19d74b99b012 + languageName: node + linkType: hard + "@tonkeeper/core@npm:0.1.0, @tonkeeper/core@workspace:packages/core": version: 0.0.0-use.local resolution: "@tonkeeper/core@workspace:packages/core" @@ -6965,6 +7506,45 @@ __metadata: languageName: unknown linkType: soft +"@tonkeeper/tablet@workspace:apps/tablet": + version: 0.0.0-use.local + resolution: "@tonkeeper/tablet@workspace:apps/tablet" + dependencies: + "@capacitor/app": "npm:^6.0.1" + "@capacitor/camera": "npm:latest" + "@capacitor/cli": "npm:latest" + "@capacitor/clipboard": "npm:^6.0.1" + "@capacitor/core": "npm:latest" + "@capacitor/ios": "npm:^6.1.2" + "@capacitor/preferences": "npm:^6.0.2" + "@capacitor/splash-screen": "npm:latest" + "@tanstack/react-query": "npm:4.3.4" + "@tonkeeper-capacitor/biometric": ../../../tonkeeper-capacitor/packages/biometric + "@tonkeeper/core": "npm:0.1.0" + "@tonkeeper/locales": "npm:0.1.0" + "@tonkeeper/uikit": "npm:0.1.0" + "@types/react": "npm:^18.0.26" + "@types/react-dom": "npm:^18.0.9" + "@types/styled-components": "npm:^5.1.26" + "@vitejs/plugin-react": "npm:^4.2.1" + buffer: "npm:^6.0.3" + copy-to-clipboard: "npm:^3.3.3" + crypto-browserify: "npm:^3.12.0" + eventsource: "npm:^2.0.2" + i18next: "npm:^23.7.7" + react: "npm:18.2.0" + react-dom: "npm:18.2.0" + react-i18next: "npm:^13.5.0" + react-router-dom: "npm:^6.20.1" + stream-browserify: "npm:^3.0.0" + styled-components: "npm:^6.1.1" + typescript: "npm:^5.6.3" + uuid: "npm:^11.0.2" + vite: "npm:^5.4.2" + vite-plugin-node-polyfills: "npm:0.17.0" + languageName: unknown + linkType: soft + "@tonkeeper/twa@workspace:apps/twa": version: 0.0.0-use.local resolution: "@tonkeeper/twa@workspace:apps/twa" @@ -7394,6 +7974,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + "@types/estree@npm:^0.0.51": version: 0.0.51 resolution: "@types/estree@npm:0.0.51" @@ -7451,6 +8038,15 @@ __metadata: languageName: node linkType: hard +"@types/fs-extra@npm:^8.0.0": + version: 8.1.5 + resolution: "@types/fs-extra@npm:8.1.5" + dependencies: + "@types/node": "npm:*" + checksum: 10/565d9e55cd05064b3ab272b8748ed512b8fa5cddc23fd32b0d5f147f9ea3a45981577c4478b5060cae7b3d914c508bd2ea97eb84d9c1fa6f967982c892e4ab26 + languageName: node + linkType: hard + "@types/glob@npm:*": version: 8.1.0 resolution: "@types/glob@npm:8.1.0" @@ -7958,6 +8554,13 @@ __metadata: languageName: node linkType: hard +"@types/slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "@types/slice-ansi@npm:4.0.0" + checksum: 10/343086bc4e686349382b386a6fb49d632fb4dd08ecc08f1b9872815199efe8db7648731e56c1d10dc0f596fe77a8fce6136e0067136f8e0cefda6b29797aa4f1 + languageName: node + linkType: hard + "@types/slick-carousel@npm:^1": version: 1.6.40 resolution: "@types/slick-carousel@npm:1.6.40" @@ -9638,6 +10241,13 @@ __metadata: languageName: node linkType: hard +"astral-regex@npm:^2.0.0": + version: 2.0.0 + resolution: "astral-regex@npm:2.0.0" + checksum: 10/876231688c66400473ba505731df37ea436e574dd524520294cc3bbc54ea40334865e01fa0d074d74d036ee874ee7e62f486ea38bc421ee8e6a871c06f011766 + languageName: node + linkType: hard + "async-each@npm:^1.0.1": version: 1.0.6 resolution: "async-each@npm:1.0.6" @@ -10118,7 +10728,7 @@ __metadata: languageName: node linkType: hard -"big-integer@npm:^1.6.48, big-integer@npm:^1.6.7": +"big-integer@npm:1.6.x, big-integer@npm:^1.6.48, big-integer@npm:^1.6.7": version: 1.6.52 resolution: "big-integer@npm:1.6.52" checksum: 10/4bc6ae152a96edc9f95020f5fc66b13d26a9ad9a021225a9f0213f7e3dc44269f423aa8c42e19d6ac4a63bb2b22140b95d10be8f9ca7a6d9aa1b22b330d1f514 @@ -10306,6 +10916,15 @@ __metadata: languageName: node linkType: hard +"bplist-parser@npm:^0.3.2": + version: 0.3.2 + resolution: "bplist-parser@npm:0.3.2" + dependencies: + big-integer: "npm:1.6.x" + checksum: 10/6edf4354c32f5661c258422e478be0f5c6a779bb87c2ae15ee92dd1c046368decbff8a28c86c558a3b7007e1381b91d5eed1c4c8e83e86405197777d944abaa8 + languageName: node + linkType: hard + "brace-expansion@npm:^1.1.7": version: 1.1.11 resolution: "brace-expansion@npm:1.1.11" @@ -11501,7 +12120,7 @@ __metadata: languageName: node linkType: hard -"commander@npm:^9.4.0": +"commander@npm:^9.3.0, commander@npm:^9.4.0": version: 9.5.0 resolution: "commander@npm:9.5.0" checksum: 10/41c49b3d0f94a1fbeb0463c85b13f15aa15a9e0b4d5e10a49c0a1d58d4489b549d62262b052ae0aa6cfda53299bee487bfe337825df15e342114dde543f82906 @@ -12508,6 +13127,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:^4.0.0": + version: 4.3.7 + resolution: "debug@npm:4.3.7" + dependencies: + ms: "npm:^2.1.3" + peerDependenciesMeta: + supports-color: + optional: true + checksum: 10/71168908b9a78227ab29d5d25fe03c5867750e31ce24bf2c44a86efc5af041758bb56569b0a3d48a9b5344c00a24a777e6f4100ed6dfd9534a42c1dde285125a + languageName: node + linkType: hard + "decamelize@npm:^1.1.2": version: 1.2.0 resolution: "decamelize@npm:1.2.0" @@ -13381,6 +14012,15 @@ __metadata: languageName: node linkType: hard +"elementtree@npm:^0.1.7": + version: 0.1.7 + resolution: "elementtree@npm:0.1.7" + dependencies: + sax: "npm:1.1.4" + checksum: 10/7e8f0683c0f5a95b298f56426f0f3796600ddac611cfaf92b76f1f4354b04c3f9aadadd1f86a91e5df372a58f2c3da97ae5988597f5052dd15bbeefbff8381c9 + languageName: node + linkType: hard + "elliptic@npm:^6.5.3, elliptic@npm:^6.5.4": version: 6.5.4 resolution: "elliptic@npm:6.5.4" @@ -13963,6 +14603,86 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:^0.21.3": + version: 0.21.5 + resolution: "esbuild@npm:0.21.5" + dependencies: + "@esbuild/aix-ppc64": "npm:0.21.5" + "@esbuild/android-arm": "npm:0.21.5" + "@esbuild/android-arm64": "npm:0.21.5" + "@esbuild/android-x64": "npm:0.21.5" + "@esbuild/darwin-arm64": "npm:0.21.5" + "@esbuild/darwin-x64": "npm:0.21.5" + "@esbuild/freebsd-arm64": "npm:0.21.5" + "@esbuild/freebsd-x64": "npm:0.21.5" + "@esbuild/linux-arm": "npm:0.21.5" + "@esbuild/linux-arm64": "npm:0.21.5" + "@esbuild/linux-ia32": "npm:0.21.5" + "@esbuild/linux-loong64": "npm:0.21.5" + "@esbuild/linux-mips64el": "npm:0.21.5" + "@esbuild/linux-ppc64": "npm:0.21.5" + "@esbuild/linux-riscv64": "npm:0.21.5" + "@esbuild/linux-s390x": "npm:0.21.5" + "@esbuild/linux-x64": "npm:0.21.5" + "@esbuild/netbsd-x64": "npm:0.21.5" + "@esbuild/openbsd-x64": "npm:0.21.5" + "@esbuild/sunos-x64": "npm:0.21.5" + "@esbuild/win32-arm64": "npm:0.21.5" + "@esbuild/win32-ia32": "npm:0.21.5" + "@esbuild/win32-x64": "npm:0.21.5" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 10/d2ff2ca84d30cce8e871517374d6c2290835380dc7cd413b2d49189ed170d45e407be14de2cb4794cf76f75cf89955c4714726ebd3de7444b3046f5cab23ab6b + languageName: node + linkType: hard + "escalade@npm:^3.1.1": version: 3.1.1 resolution: "escalade@npm:3.1.1" @@ -15976,6 +16696,18 @@ __metadata: languageName: node linkType: hard +"glob@npm:^9.2.0": + version: 9.3.5 + resolution: "glob@npm:9.3.5" + dependencies: + fs.realpath: "npm:^1.0.0" + minimatch: "npm:^8.0.2" + minipass: "npm:^4.2.4" + path-scurry: "npm:^1.6.1" + checksum: 10/e5fa8a58adf53525bca42d82a1fad9e6800032b7e4d372209b80cfdca524dd9a7dbe7d01a92d7ed20d89c572457f12c250092bc8817cb4f1c63efefdf9b658c0 + languageName: node + linkType: hard + "global-agent@npm:^3.0.0": version: 3.0.0 resolution: "global-agent@npm:3.0.0" @@ -17015,6 +17747,13 @@ __metadata: languageName: node linkType: hard +"ini@npm:^4.1.1": + version: 4.1.3 + resolution: "ini@npm:4.1.3" + checksum: 10/f536b414d1442e5b233429e2b56efcdb354109b2d65ddd489e5939d8f0f5ad23c88aa2b19c92987249d0dd63ba8192e9aeb1a02b0459549c5a9ff31acd729a5d + languageName: node + linkType: hard + "inline-style-parser@npm:0.1.1": version: 0.1.1 resolution: "inline-style-parser@npm:0.1.1" @@ -18982,6 +19721,13 @@ __metadata: languageName: node linkType: hard +"kleur@npm:^4.1.4": + version: 4.1.5 + resolution: "kleur@npm:4.1.5" + checksum: 10/44d84cc4eedd4311099402ef6d4acd9b2d16e08e499d6ef3bb92389bd4692d7ef09e35248c26e27f98acac532122acb12a1bfee645994ae3af4f0a37996da7df + languageName: node + linkType: hard + "klona@npm:^2.0.4, klona@npm:^2.0.5": version: 2.0.6 resolution: "klona@npm:2.0.6" @@ -20002,6 +20748,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^8.0.2": + version: 8.0.4 + resolution: "minimatch@npm:8.0.4" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/aef05598ee565e1013bc8a10f53410ac681561f901c1a084b8ecfd016c9ed919f58f4bbd5b63e05643189dfb26e8106a84f0e1ff12e4a263aa37e1cae7ce9828 + languageName: node + linkType: hard + "minimatch@npm:^9.0.1, minimatch@npm:^9.0.3": version: 9.0.3 resolution: "minimatch@npm:9.0.3" @@ -20111,6 +20866,13 @@ __metadata: languageName: node linkType: hard +"minipass@npm:^4.2.4": + version: 4.2.8 + resolution: "minipass@npm:4.2.8" + checksum: 10/e148eb6dcb85c980234cad889139ef8ddf9d5bdac534f4f0268446c8792dd4c74f4502479be48de3c1cce2f6450f6da4d0d4a86405a8a12be04c1c36b339569a + languageName: node + linkType: hard + "minipass@npm:^5.0.0": version: 5.0.0 resolution: "minipass@npm:5.0.0" @@ -20232,7 +20994,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -20326,6 +21088,27 @@ __metadata: languageName: node linkType: hard +"native-run@npm:^2.0.0": + version: 2.0.1 + resolution: "native-run@npm:2.0.1" + dependencies: + "@ionic/utils-fs": "npm:^3.1.7" + "@ionic/utils-terminal": "npm:^2.3.4" + bplist-parser: "npm:^0.3.2" + debug: "npm:^4.3.4" + elementtree: "npm:^0.1.7" + ini: "npm:^4.1.1" + plist: "npm:^3.1.0" + split2: "npm:^4.2.0" + through2: "npm:^4.0.2" + tslib: "npm:^2.6.2" + yauzl: "npm:^2.10.0" + bin: + native-run: bin/native-run + checksum: 10/a495b52ac1d89a03cfdd57f18d977a41af5722c0e3a4f29c84ca82e367e770578db2b24c692b48ce29f8a2d15c5272d36f68bbc8a35634d17202925e66b1ee77 + languageName: node + linkType: hard + "natural-compare-lite@npm:^1.4.0": version: 1.4.0 resolution: "natural-compare-lite@npm:1.4.0" @@ -21478,7 +22261,7 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.11.1": +"path-scurry@npm:^1.11.1, path-scurry@npm:^1.6.1": version: 1.11.1 resolution: "path-scurry@npm:1.11.1" dependencies: @@ -21602,6 +22385,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.1.0": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.2.2, picomatch@npm:^2.2.3, picomatch@npm:^2.3.0, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -22652,6 +23442,17 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.43": + version: 8.4.47 + resolution: "postcss@npm:8.4.47" + dependencies: + nanoid: "npm:^3.3.7" + picocolors: "npm:^1.1.0" + source-map-js: "npm:^1.2.1" + checksum: 10/f2b50ba9b6fcb795232b6bb20de7cdc538c0025989a8ed9c4438d1960196ba3b7eaff41fdb1a5c701b3504651ea87aeb685577707f0ae4d6ce6f3eae5df79a81 + languageName: node + linkType: hard + "postject@npm:^1.0.0-alpha.6": version: 1.0.0-alpha.6 resolution: "postject@npm:1.0.0-alpha.6" @@ -23794,7 +24595,7 @@ __metadata: languageName: node linkType: hard -"readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": +"readable-stream@npm:3, readable-stream@npm:^3.0.6, readable-stream@npm:^3.1.1, readable-stream@npm:^3.4.0, readable-stream@npm:^3.5.0, readable-stream@npm:^3.6.0, readable-stream@npm:^3.6.2": version: 3.6.2 resolution: "readable-stream@npm:3.6.2" dependencies: @@ -24438,6 +25239,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^4.4.1": + version: 4.4.1 + resolution: "rimraf@npm:4.4.1" + dependencies: + glob: "npm:^9.2.0" + bin: + rimraf: dist/cjs/src/bin.js + checksum: 10/218ef9122145ccce9d0a71124d36a3894537de46600b37fae7dba26ccff973251eaa98aa63c2c5855a05fa04bca7cbbd7a92d4b29f2875d2203e72530ecf6ede + languageName: node + linkType: hard + "rimraf@npm:~2.6.2": version: 2.6.3 resolution: "rimraf@npm:2.6.3" @@ -24608,6 +25420,75 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.20.0": + version: 4.24.4 + resolution: "rollup@npm:4.24.4" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.24.4" + "@rollup/rollup-android-arm64": "npm:4.24.4" + "@rollup/rollup-darwin-arm64": "npm:4.24.4" + "@rollup/rollup-darwin-x64": "npm:4.24.4" + "@rollup/rollup-freebsd-arm64": "npm:4.24.4" + "@rollup/rollup-freebsd-x64": "npm:4.24.4" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.24.4" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.24.4" + "@rollup/rollup-linux-arm64-gnu": "npm:4.24.4" + "@rollup/rollup-linux-arm64-musl": "npm:4.24.4" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.24.4" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.24.4" + "@rollup/rollup-linux-s390x-gnu": "npm:4.24.4" + "@rollup/rollup-linux-x64-gnu": "npm:4.24.4" + "@rollup/rollup-linux-x64-musl": "npm:4.24.4" + "@rollup/rollup-win32-arm64-msvc": "npm:4.24.4" + "@rollup/rollup-win32-ia32-msvc": "npm:4.24.4" + "@rollup/rollup-win32-x64-msvc": "npm:4.24.4" + "@types/estree": "npm:1.0.6" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10/a8ffde17d7cd5d9eaaf91bb025de83329b034771254d34b977df3f294e0992f6d89a444a0c8e9d73c8721d60cedf5be32fa8bd6f157874700bb8043c61ca660a + languageName: node + linkType: hard + "rsvp@npm:^4.8.4": version: 4.8.5 resolution: "rsvp@npm:4.8.5" @@ -24762,7 +25643,14 @@ __metadata: languageName: node linkType: hard -"sax@npm:^1.2.4": +"sax@npm:1.1.4": + version: 1.1.4 + resolution: "sax@npm:1.1.4" + checksum: 10/50dd85c562f6de00f1a6c4049f27471258b35c77961498784976445455f99d105bac0de2edf342730b6e0e410346581622c21494355178b6883611619757ae1b + languageName: node + linkType: hard + +"sax@npm:>=0.6.0, sax@npm:^1.2.4": version: 1.4.1 resolution: "sax@npm:1.4.1" checksum: 10/b1c784b545019187b53a0c28edb4f6314951c971e2963a69739c6ce222bfbc767e54d320e689352daba79b7d5e06d22b5d7113b99336219d6e93718e2f99d335 @@ -25220,6 +26108,17 @@ __metadata: languageName: node linkType: hard +"slice-ansi@npm:^4.0.0": + version: 4.0.0 + resolution: "slice-ansi@npm:4.0.0" + dependencies: + ansi-styles: "npm:^4.0.0" + astral-regex: "npm:^2.0.0" + is-fullwidth-code-point: "npm:^3.0.0" + checksum: 10/4a82d7f085b0e1b070e004941ada3c40d3818563ac44766cca4ceadd2080427d337554f9f99a13aaeb3b4a94d9964d9466c807b3d7b7541d1ec37ee32d308756 + languageName: node + linkType: hard + "slice-ansi@npm:^5.0.0": version: 5.0.0 resolution: "slice-ansi@npm:5.0.0" @@ -25362,6 +26261,13 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 + languageName: node + linkType: hard + "source-map-loader@npm:^3.0.0": version: 3.0.2 resolution: "source-map-loader@npm:3.0.2" @@ -25526,6 +26432,13 @@ __metadata: languageName: node linkType: hard +"split2@npm:^4.2.0": + version: 4.2.0 + resolution: "split2@npm:4.2.0" + checksum: 10/09bbefc11bcf03f044584c9764cd31a252d8e52cea29130950b26161287c11f519807c5e54bd9e5804c713b79c02cefe6a98f4688630993386be353e03f534ab + languageName: node + linkType: hard + "split@npm:0.3": version: 0.3.3 resolution: "split@npm:0.3.3" @@ -26592,6 +27505,15 @@ __metadata: languageName: node linkType: hard +"through2@npm:^4.0.2": + version: 4.0.2 + resolution: "through2@npm:4.0.2" + dependencies: + readable-stream: "npm:3" + checksum: 10/72c246233d9a989bbebeb6b698ef0b7b9064cb1c47930f79b25d87b6c867e075432811f69b7b2ac8da00ca308191c507bdab913944be8019ac43b036ce88f6ba + languageName: node + linkType: hard + "through@npm:2, through@npm:~2.3, through@npm:~2.3.1": version: 2.3.8 resolution: "through@npm:2.3.8" @@ -26816,6 +27738,15 @@ __metadata: languageName: node linkType: hard +"tree-kill@npm:^1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 10/49117f5f410d19c84b0464d29afb9642c863bc5ba40fcb9a245d474c6d5cc64d1b177a6e6713129eb346b40aebb9d4631d967517f9fbe8251c35b21b13cd96c7 + languageName: node + linkType: hard + "trim-newlines@npm:^1.0.0": version: 1.0.0 resolution: "trim-newlines@npm:1.0.0" @@ -26994,6 +27925,13 @@ __metadata: languageName: node linkType: hard +"tslib@npm:^2.6.2": + version: 2.8.1 + resolution: "tslib@npm:2.8.1" + checksum: 10/3e2e043d5c2316461cb54e5c7fe02c30ef6dccb3384717ca22ae5c6b5bc95232a6241df19c622d9c73b809bea33b187f6dbc73030963e29950c2141bc32a79f7 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -27290,6 +28228,16 @@ __metadata: languageName: node linkType: hard +"typescript@npm:^5.6.3": + version: 5.6.3 + resolution: "typescript@npm:5.6.3" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/c328e418e124b500908781d9f7b9b93cf08b66bf5936d94332b463822eea2f4e62973bfb3b8a745fdc038785cb66cf59d1092bac3ec2ac6a3e5854687f7833f1 + languageName: node + linkType: hard + "typescript@patch:typescript@npm%3A5.2.2#optional!builtin": version: 5.2.2 resolution: "typescript@patch:typescript@npm%3A5.2.2#optional!builtin::version=5.2.2&hash=f3b441" @@ -27320,6 +28268,16 @@ __metadata: languageName: node linkType: hard +"typescript@patch:typescript@npm%3A^5.6.3#optional!builtin": + version: 5.6.3 + resolution: "typescript@patch:typescript@npm%3A5.6.3#optional!builtin::version=5.6.3&hash=b45daf" + bin: + tsc: bin/tsc + tsserver: bin/tsserver + checksum: 10/dc4bec403cd33a204b655b1152a096a08e7bad2c931cb59ef8ff26b6f2aa541bf98f09fc157958a60c921b1983a8dde9a85b692f9de60fa8f574fd131e3ae4dd + languageName: node + linkType: hard + "uglify-js@npm:^3.1.4": version: 3.17.4 resolution: "uglify-js@npm:3.17.4" @@ -27645,6 +28603,13 @@ __metadata: languageName: node linkType: hard +"untildify@npm:^4.0.0": + version: 4.0.0 + resolution: "untildify@npm:4.0.0" + checksum: 10/39ced9c418a74f73f0a56e1ba4634b4d959422dff61f4c72a8e39f60b99380c1b45ed776fbaa0a4101b157e4310d873ad7d114e8534ca02609b4916bb4187fb9 + languageName: node + linkType: hard + "upath@npm:^1.1.1, upath@npm:^1.2.0": version: 1.2.0 resolution: "upath@npm:1.2.0" @@ -27853,6 +28818,15 @@ __metadata: languageName: node linkType: hard +"uuid@npm:^11.0.2": + version: 11.0.2 + resolution: "uuid@npm:11.0.2" + bin: + uuid: dist/esm/bin/uuid + checksum: 10/b98082f398fa2ece8cacc2264402f739256ca70def4bb82e3a14ec70777d189c01ce1054764c3b59b8fc098b62b135a15d1b24914712904c988822e2ac9b4f44 + languageName: node + linkType: hard + "uuid@npm:^3.3.2": version: 3.4.0 resolution: "uuid@npm:3.4.0" @@ -28031,6 +29005,49 @@ __metadata: languageName: node linkType: hard +"vite@npm:^5.4.2": + version: 5.4.10 + resolution: "vite@npm:5.4.10" + dependencies: + esbuild: "npm:^0.21.3" + fsevents: "npm:~2.3.3" + postcss: "npm:^8.4.43" + rollup: "npm:^4.20.0" + peerDependencies: + "@types/node": ^18.0.0 || >=20.0.0 + less: "*" + lightningcss: ^1.21.0 + sass: "*" + sass-embedded: "*" + stylus: "*" + sugarss: "*" + terser: ^5.4.0 + dependenciesMeta: + fsevents: + optional: true + peerDependenciesMeta: + "@types/node": + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + bin: + vite: bin/vite.js + checksum: 10/5d4a427d585d6f9114fc383114f707dca46408f54b221709e5eb6b0c16e0b4dec4baf908a7db9a8f1e5b16e64b655900ac14629abe61c698cbe296115c65ed8a + languageName: node + linkType: hard + "vm-browserify@npm:^1.0.1": version: 1.1.2 resolution: "vm-browserify@npm:1.1.2" @@ -29036,6 +30053,16 @@ __metadata: languageName: node linkType: hard +"xml2js@npm:^0.5.0": + version: 0.5.0 + resolution: "xml2js@npm:0.5.0" + dependencies: + sax: "npm:>=0.6.0" + xmlbuilder: "npm:~11.0.0" + checksum: 10/27c4d759214e99be5ec87ee5cb1290add427fa43df509d3b92d10152b3806fd2f7c9609697a18b158ccf2caa01e96af067cdba93196f69ca10c90e4f79a08896 + languageName: node + linkType: hard + "xmlbuilder@npm:^15.1.1": version: 15.1.1 resolution: "xmlbuilder@npm:15.1.1" @@ -29043,6 +30070,13 @@ __metadata: languageName: node linkType: hard +"xmlbuilder@npm:~11.0.0": + version: 11.0.1 + resolution: "xmlbuilder@npm:11.0.1" + checksum: 10/c8c3d208783718db5b285101a736cd8e6b69a5c265199a0739abaa93d1a1b7de5489fd16df4e776e18b2c98cb91f421a7349e99fd8c1ebeb44ecfed72a25091a + languageName: node + linkType: hard + "xmlchars@npm:^2.2.0": version: 2.2.0 resolution: "xmlchars@npm:2.2.0"