@momo-kits/native-kits 0.157.1-beta.9-debug → 0.157.1-com.1-debug
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/compose/build.gradle.kts +1 -1
- package/compose/compose.podspec +1 -1
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Avatar.kt +157 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Carousel.kt +123 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Collapse.kt +224 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Loader.kt +108 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/ProgressInfo.kt +350 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Rating.kt +87 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Slider.kt +360 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Stepper.kt +256 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Steps.kt +494 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/SuggestAction.kt +131 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Swipe.kt +215 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/TabView.kt +449 -0
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Tooltip.kt +21 -7
- package/compose/src/commonMain/kotlin/vn/momo/kits/components/Uploader.kt +192 -0
- package/gradle.properties +1 -1
- package/ios/Input/Input.swift +4 -0
- package/local.properties +2 -2
- package/package.json +1 -1
- package/src/doctor/README.md +73 -0
- package/src/doctor/package-lock.json +885 -0
- package/src/doctor/package.json +44 -0
- package/src/doctor/publish.sh +27 -0
- package/src/doctor/src/Users.json +112 -0
- package/src/doctor/src/Whitelist.json +6 -0
- package/src/doctor/src/commands/check.ts +81 -0
- package/src/doctor/src/commands/doctor.ts +193 -0
- package/src/doctor/src/index.ts +35 -0
- package/src/doctor/src/logger.ts +84 -0
- package/src/doctor/src/task/native.ts +21 -0
- package/src/doctor/src/task/utils.ts +20 -0
- package/src/doctor/src/utils/checkCoreDependencies.ts +138 -0
- package/src/doctor/src/utils/checkDeletedPackage.ts +53 -0
- package/src/doctor/src/utils/checkDeprecatedPackages.ts +168 -0
- package/src/doctor/src/utils/checkDeprecatedVersion.ts +60 -0
- package/src/doctor/src/utils/checkShareDependencies.ts +251 -0
- package/src/doctor/src/utils/checkWrongVersionCommunityPackage.ts +64 -0
- package/src/doctor/src/utils/getErrorMessage.ts +84 -0
- package/src/doctor/src/utils/scanComponentUsage.ts +206 -0
- package/src/doctor/src/utils/scanFoundationImports.ts +169 -0
- package/src/doctor/src/utils/scanMaxApiUsage.ts +86 -0
- package/src/doctor/src/utils/scanNativeModulesUsage.ts +78 -0
- package/src/doctor/src/utils/sendMessage.ts +28 -0
- package/src/doctor/tsconfig.json +14 -0
- package/src/doctor/yarn.lock +492 -0
- package/src/foundations/Application/BottomSheet.tsx +358 -0
- package/src/foundations/Application/BottomTab/BottomTabBar.tsx +320 -0
- package/src/foundations/Application/BottomTab/CustomBottomTabItem.tsx +155 -0
- package/src/foundations/Application/BottomTab/TabBarIcon.tsx +113 -0
- package/src/foundations/Application/BottomTab/index.tsx +449 -0
- package/src/foundations/Application/Components/BackgroundImageView.tsx +126 -0
- package/src/foundations/Application/Components/HeaderAnimated.tsx +69 -0
- package/src/foundations/Application/Components/HeaderBackground.tsx +83 -0
- package/src/foundations/Application/Components/HeaderExtendHeader.tsx +225 -0
- package/src/foundations/Application/Components/HeaderLeft.tsx +93 -0
- package/src/foundations/Application/Components/HeaderRight.tsx +444 -0
- package/src/foundations/Application/Components/HeaderTitle.tsx +596 -0
- package/src/foundations/Application/Components/NavigationButton.tsx +76 -0
- package/src/foundations/Application/Components/SearchHeader.tsx +127 -0
- package/src/foundations/Application/Localize.ts +44 -0
- package/src/foundations/Application/ModalScreen.tsx +148 -0
- package/src/foundations/Application/Navigation.ts +63 -0
- package/src/foundations/Application/NavigationContainer.tsx +245 -0
- package/src/foundations/Application/Navigator.ts +171 -0
- package/src/foundations/Application/ScaleSizeProvider.tsx +16 -0
- package/src/foundations/Application/StackScreen.tsx +420 -0
- package/src/foundations/Application/TooltipPortal.tsx +127 -0
- package/src/foundations/Application/WidgetContainer.tsx +162 -0
- package/src/foundations/Application/index.ts +34 -0
- package/src/foundations/Application/types.ts +350 -0
- package/src/foundations/Application/utils.tsx +239 -0
- package/src/foundations/Assets/DotAnimation.json +256 -0
- package/src/foundations/Assets/SpinnerAnimation.json +1027 -0
- package/src/foundations/Assets/icon.json +4052 -0
- package/src/foundations/Assets/icon_bank.json +506 -0
- package/src/foundations/Assets/language.json +208 -0
- package/src/foundations/Assets/lottie_circle_loader.json +1 -0
- package/src/foundations/Assets/pinAnimation.json +1 -0
- package/src/foundations/Assets/unpinAnimation.json +1 -0
- package/src/foundations/Badge/Badge.tsx +104 -0
- package/src/foundations/Badge/BadgeDot.tsx +35 -0
- package/src/foundations/Badge/BadgeDotAnimation.tsx +95 -0
- package/src/foundations/Badge/BadgeRibbon.tsx +112 -0
- package/src/foundations/Badge/Shape.tsx +29 -0
- package/src/foundations/Badge/index.tsx +8 -0
- package/src/foundations/Badge/styles.ts +125 -0
- package/src/foundations/Badge/types.ts +68 -0
- package/src/foundations/Button/index.tsx +371 -0
- package/src/foundations/Button/styles.ts +65 -0
- package/src/foundations/CheckBox/index.tsx +104 -0
- package/src/foundations/CheckBox/styles.ts +17 -0
- package/src/foundations/CheckBox/types.ts +37 -0
- package/src/foundations/Consts/colors+spacing+radius.ts +232 -0
- package/src/foundations/Consts/index.ts +4 -0
- package/src/foundations/Consts/styles.ts +52 -0
- package/src/foundations/Consts/theme.ts +121 -0
- package/src/foundations/Context/index.ts +27 -0
- package/src/foundations/Divider/DashDivider.tsx +46 -0
- package/src/foundations/Divider/index.tsx +45 -0
- package/src/foundations/FoundationList/index.tsx +12 -0
- package/src/foundations/FoundationList/types.ts +7 -0
- package/src/foundations/Icon/index.tsx +57 -0
- package/src/foundations/Icon/types.ts +32 -0
- package/src/foundations/IconButton/index.tsx +144 -0
- package/src/foundations/IconButton/styles.ts +20 -0
- package/src/foundations/Image/index.tsx +115 -0
- package/src/foundations/Image/styles.ts +7 -0
- package/src/foundations/Image/types.ts +7 -0
- package/src/foundations/Input/Input.tsx +280 -0
- package/src/foundations/Input/InputDropDown.tsx +161 -0
- package/src/foundations/Input/InputMoney.tsx +325 -0
- package/src/foundations/Input/InputOTP.tsx +299 -0
- package/src/foundations/Input/InputPhoneNumber.tsx +287 -0
- package/src/foundations/Input/InputSearch.tsx +351 -0
- package/src/foundations/Input/InputTextArea.tsx +218 -0
- package/src/foundations/Input/SystemTextInput.tsx +44 -0
- package/src/foundations/Input/TextTyping.tsx +115 -0
- package/src/foundations/Input/common.tsx +243 -0
- package/src/foundations/Input/index.tsx +373 -0
- package/src/foundations/Input/styles.ts +226 -0
- package/src/foundations/Input/utils.ts +97 -0
- package/src/foundations/Layout/Card.tsx +108 -0
- package/src/foundations/Layout/FloatingButton.tsx +179 -0
- package/src/foundations/Layout/GridSystem.tsx +137 -0
- package/src/foundations/Layout/Item.tsx +59 -0
- package/src/foundations/Layout/ItemList.tsx +66 -0
- package/src/foundations/Layout/ItemSectionList.tsx +40 -0
- package/src/foundations/Layout/Screen.tsx +644 -0
- package/src/foundations/Layout/Section.tsx +103 -0
- package/src/foundations/Layout/TrackingScope.tsx +18 -0
- package/src/foundations/Layout/index.ts +34 -0
- package/src/foundations/Layout/styles.ts +95 -0
- package/src/foundations/Layout/types.ts +40 -0
- package/src/foundations/Layout/utils.ts +47 -0
- package/src/foundations/Loader/DotLoader.tsx +37 -0
- package/src/foundations/Loader/Loader.tsx +13 -0
- package/src/foundations/Loader/ProgressBar.tsx +45 -0
- package/src/foundations/Loader/Spinner.tsx +29 -0
- package/src/foundations/Loader/index.tsx +6 -0
- package/src/foundations/Loader/styles.ts +10 -0
- package/src/foundations/Loader/types.ts +35 -0
- package/src/foundations/Loader/utils.ts +25 -0
- package/src/foundations/Pagination/Dot.tsx +19 -0
- package/src/foundations/Pagination/PaginationDot.tsx +44 -0
- package/src/foundations/Pagination/PaginationNumber.tsx +31 -0
- package/src/foundations/Pagination/PaginationScroll.tsx +99 -0
- package/src/foundations/Pagination/PaginationWhiteDot.tsx +43 -0
- package/src/foundations/Pagination/index.tsx +25 -0
- package/src/foundations/Pagination/styles.ts +51 -0
- package/src/foundations/Pagination/types.ts +40 -0
- package/src/foundations/Popup/PopupNotify.tsx +276 -0
- package/src/foundations/Popup/PopupPromotion.tsx +118 -0
- package/src/foundations/Popup/index.tsx +4 -0
- package/src/foundations/Popup/types.ts +96 -0
- package/src/foundations/Radio/index.tsx +108 -0
- package/src/foundations/Radio/styles.ts +15 -0
- package/src/foundations/Radio/types.ts +31 -0
- package/src/foundations/Skeleton/index.tsx +118 -0
- package/src/foundations/Skeleton/styles.ts +5 -0
- package/src/foundations/Skeleton/types.ts +6 -0
- package/src/foundations/Switch/index.tsx +68 -0
- package/src/foundations/Switch/styles.ts +25 -0
- package/src/foundations/Switch/types.ts +19 -0
- package/src/foundations/Tag/index.tsx +128 -0
- package/src/foundations/Tag/types.ts +41 -0
- package/src/foundations/Text/index.tsx +241 -0
- package/src/foundations/Text/styles.ts +78 -0
- package/src/foundations/Text/types.ts +53 -0
- package/src/foundations/Text/utils.ts +63 -0
- package/src/foundations/Title/index.tsx +285 -0
- package/src/foundations/Title/styles.ts +55 -0
- package/src/foundations/Title/types.ts +21 -0
- package/src/foundations/index.ts +50 -0
- package/src/foundations/package.json +35 -0
- package/src/foundations/publish.sh +17 -0
- package/src/libs/AutoComplete/index.tsx +88 -0
- package/src/libs/AutoComplete/package.json +16 -0
- package/src/libs/AutoComplete/publish.sh +16 -0
- package/src/libs/AutoComplete/styles.ts +15 -0
- package/src/libs/AutoComplete/types.ts +60 -0
- package/src/libs/Avatar/index.tsx +146 -0
- package/src/libs/Avatar/package.json +16 -0
- package/src/libs/Avatar/publish.sh +20 -0
- package/src/libs/Avatar/styles.ts +18 -0
- package/src/libs/Avatar/types.ts +57 -0
- package/src/libs/Badge/Badge.tsx +70 -0
- package/src/libs/Badge/BadgeDot.tsx +11 -0
- package/src/libs/Badge/BadgeRibbon.tsx +122 -0
- package/src/libs/Badge/Shape.tsx +29 -0
- package/src/libs/Badge/index.tsx +7 -0
- package/src/libs/Badge/package.json +16 -0
- package/src/libs/Badge/publish.sh +18 -0
- package/src/libs/Badge/styles.ts +55 -0
- package/src/libs/Badge/types.ts +63 -0
- package/src/libs/Calendar/CalendarPro.tsx +307 -0
- package/src/libs/Calendar/Day.tsx +150 -0
- package/src/libs/Calendar/HeaderControl.tsx +55 -0
- package/src/libs/Calendar/LunarDateConverter.ts +228 -0
- package/src/libs/Calendar/LunarService.ts +206 -0
- package/src/libs/Calendar/Month.tsx +118 -0
- package/src/libs/Calendar/MonthList.tsx +226 -0
- package/src/libs/Calendar/TabHeader.tsx +91 -0
- package/src/libs/Calendar/Util.ts +288 -0
- package/src/libs/Calendar/holidayData.ts +118 -0
- package/src/libs/Calendar/index.tsx +383 -0
- package/src/libs/Calendar/package.json +18 -0
- package/src/libs/Calendar/publish.sh +18 -0
- package/src/libs/Calendar/styles.ts +122 -0
- package/src/libs/Calendar/types.ts +212 -0
- package/src/libs/Carousel/animation.ts +62 -0
- package/src/libs/Carousel/index.tsx +517 -0
- package/src/libs/Carousel/package.json +18 -0
- package/src/libs/Carousel/publish.sh +16 -0
- package/src/libs/Carousel/types.ts +71 -0
- package/src/libs/Chip/index.tsx +164 -0
- package/src/libs/Chip/package.json +16 -0
- package/src/libs/Chip/publish.sh +16 -0
- package/src/libs/Chip/styles.ts +20 -0
- package/src/libs/Chip/types.ts +72 -0
- package/src/libs/Collapse/index.tsx +305 -0
- package/src/libs/Collapse/package.json +16 -0
- package/src/libs/Collapse/publish.sh +18 -0
- package/src/libs/Collapse/styles.ts +37 -0
- package/src/libs/Collapse/types.ts +84 -0
- package/src/libs/DateTimePicker/WheelPicker.tsx +163 -0
- package/src/libs/DateTimePicker/WheelPickerItem.tsx +58 -0
- package/src/libs/DateTimePicker/index.tsx +188 -0
- package/src/libs/DateTimePicker/package.json +16 -0
- package/src/libs/DateTimePicker/publish.sh +17 -0
- package/src/libs/DateTimePicker/styles.ts +31 -0
- package/src/libs/DateTimePicker/types.ts +102 -0
- package/src/libs/DateTimePicker/utils.ts +114 -0
- package/src/libs/Information/index.tsx +129 -0
- package/src/libs/Information/package.json +16 -0
- package/src/libs/Information/publish.sh +18 -0
- package/src/libs/Information/styles.ts +34 -0
- package/src/libs/Information/types.ts +79 -0
- package/src/libs/Logo/index.tsx +39 -0
- package/src/libs/Logo/package.json +17 -0
- package/src/libs/Logo/publish.sh +16 -0
- package/src/libs/Logo/styles.ts +25 -0
- package/src/libs/Logo/types.ts +13 -0
- package/src/libs/ProgressInfo/ProgressInfoHorizontal.tsx +128 -0
- package/src/libs/ProgressInfo/ProgressInfoIcon.tsx +88 -0
- package/src/libs/ProgressInfo/ProgressInfoVertical.tsx +85 -0
- package/src/libs/ProgressInfo/index.tsx +22 -0
- package/src/libs/ProgressInfo/package.json +16 -0
- package/src/libs/ProgressInfo/publish.sh +16 -0
- package/src/libs/ProgressInfo/styles.ts +46 -0
- package/src/libs/ProgressInfo/types.ts +60 -0
- package/src/libs/ProgressInfo/yarn.lock +8 -0
- package/src/libs/Rating/index.tsx +74 -0
- package/src/libs/Rating/package.json +16 -0
- package/src/libs/Rating/publish.sh +18 -0
- package/src/libs/Rating/type.ts +25 -0
- package/src/libs/Slider/Label.tsx +33 -0
- package/src/libs/Slider/helpers.ts +35 -0
- package/src/libs/Slider/hooks.tsx +218 -0
- package/src/libs/Slider/index.tsx +453 -0
- package/src/libs/Slider/package.json +16 -0
- package/src/libs/Slider/publish.sh +18 -0
- package/src/libs/Slider/styles.ts +36 -0
- package/src/libs/Stepper/NumberView.tsx +64 -0
- package/src/libs/Stepper/StepperButton.tsx +37 -0
- package/src/libs/Stepper/index.tsx +139 -0
- package/src/libs/Stepper/package.json +16 -0
- package/src/libs/Stepper/publish.sh +17 -0
- package/src/libs/Stepper/styles.ts +44 -0
- package/src/libs/Stepper/types.ts +154 -0
- package/src/libs/Steps/StepIcon.tsx +86 -0
- package/src/libs/Steps/StepsHorizontal.tsx +189 -0
- package/src/libs/Steps/StepsVertical.tsx +133 -0
- package/src/libs/Steps/index.tsx +20 -0
- package/src/libs/Steps/package.json +16 -0
- package/src/libs/Steps/publish.sh +16 -0
- package/src/libs/Steps/styles.ts +46 -0
- package/src/libs/Steps/types.ts +159 -0
- package/src/libs/Steps/utils.ts +175 -0
- package/src/libs/SuggestAction/SuggestActionView.tsx +124 -0
- package/src/libs/SuggestAction/index.tsx +3 -0
- package/src/libs/SuggestAction/package.json +16 -0
- package/src/libs/SuggestAction/publish.sh +16 -0
- package/src/libs/SuggestAction/styles.ts +30 -0
- package/src/libs/SuggestAction/types.ts +36 -0
- package/src/libs/Swipe/SwipeView.tsx +151 -0
- package/src/libs/Swipe/index.tsx +5 -0
- package/src/libs/Swipe/package.json +16 -0
- package/src/libs/Swipe/publish.sh +16 -0
- package/src/libs/Swipe/styles.ts +16 -0
- package/src/libs/Swipe/types.ts +109 -0
- package/src/libs/TabView/assets/Path.tsx +29 -0
- package/src/libs/TabView/index.tsx +184 -0
- package/src/libs/TabView/package.json +16 -0
- package/src/libs/TabView/publish.sh +16 -0
- package/src/libs/TabView/styles.ts +96 -0
- package/src/libs/TabView/tabBar/CardTabBar.tsx +137 -0
- package/src/libs/TabView/tabBar/SrollableTabBar.tsx +218 -0
- package/src/libs/TabView/tabBar/TabBar.tsx +67 -0
- package/src/libs/TabView/tabItem/CardTabItem.tsx +118 -0
- package/src/libs/TabView/tabItem/TabItem.tsx +180 -0
- package/src/libs/TabView/types.ts +166 -0
- package/src/libs/Template/HeaderSliderBanner/index.tsx +86 -0
- package/src/libs/Template/HeaderSliderBanner/types.ts +16 -0
- package/src/libs/Template/TrustBanner/CustomAvatar.tsx +39 -0
- package/src/libs/Template/TrustBanner/index.tsx +161 -0
- package/src/libs/Template/TrustBanner/styles.ts +48 -0
- package/src/libs/Template/TrustBanner/types.ts +50 -0
- package/src/libs/Template/index.tsx +4 -0
- package/src/libs/Template/package.json +18 -0
- package/src/libs/Template/publish.sh +17 -0
- package/src/libs/Title/index.tsx +284 -0
- package/src/libs/Title/package.json +17 -0
- package/src/libs/Title/publish.sh +16 -0
- package/src/libs/Title/styles.ts +54 -0
- package/src/libs/Title/types.ts +21 -0
- package/src/libs/Tooltip/TooltipButtons.tsx +54 -0
- package/src/libs/Tooltip/index.tsx +608 -0
- package/src/libs/Tooltip/package.json +16 -0
- package/src/libs/Tooltip/publish.sh +18 -0
- package/src/libs/Tooltip/styles.ts +70 -0
- package/src/libs/Tooltip/types.ts +61 -0
- package/src/libs/Uploader/index.tsx +87 -0
- package/src/libs/Uploader/package.json +17 -0
- package/src/libs/Uploader/publish.sh +18 -0
- package/src/libs/Uploader/styles.ts +30 -0
- package/src/libs/Uploader/types.ts +69 -0
- package/src/native/MoMoNative.podspec +18 -0
- package/src/native/calculator/android/build.gradle +61 -0
- package/src/native/calculator/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/src/native/calculator/android/gradle/wrapper/gradle-wrapper.properties +6 -0
- package/src/native/calculator/android/gradlew +172 -0
- package/src/native/calculator/android/gradlew.bat +84 -0
- package/src/native/calculator/android/src/main/AndroidManifest.xml +5 -0
- package/src/native/calculator/android/src/main/java/com/calculator/KeyboardViewModule.java +22 -0
- package/src/native/calculator/android/src/main/java/com/calculator/KeyboardViewPackage.java +35 -0
- package/src/native/calculator/android/src/main/java/com/calculator/modules/CalculatorKeyboardModule.java +157 -0
- package/src/native/calculator/android/src/main/java/com/calculator/views/calculatorkeyboard/CalculatorEditText.java +36 -0
- package/src/native/calculator/android/src/main/java/com/calculator/views/calculatorkeyboard/FixedRelativeLayout.java +45 -0
- package/src/native/calculator/android/src/main/java/com/calculator/views/calculatorkeyboard/MomoTextInputCalculatorManager.java +173 -0
- package/src/native/calculator/android/src/main/java/com/calculator/views/customkeyboard/RNCustomKeyboardModule.java +417 -0
- package/src/native/calculator/ios/Helper/MomoHelper.swift +16 -0
- package/src/native/calculator/ios/KeyboardView-Bridging-Header.h +60 -0
- package/src/native/calculator/ios/KeyboardView.h +19 -0
- package/src/native/calculator/ios/KeyboardView.m +56 -0
- package/src/native/calculator/ios/MomoTextInputCalculator.swift +144 -0
- package/src/native/calculator/ios/RNCustomKeyboard/RNCustomKeyboard.h +6 -0
- package/src/native/calculator/ios/RNCustomKeyboard/RNCustomKeyboard.m +143 -0
- package/src/native/package.json +14 -0
- package/src/native/publish.sh +29 -0
- package/src/native/resource/android/build.gradle +57 -0
- package/src/native/resource/android/gradle/wrapper/gradle-wrapper.jar +0 -0
- package/src/native/resource/android/gradle/wrapper/gradle-wrapper.properties +6 -0
- package/src/native/resource/android/src/main/AndroidManifest.xml +6 -0
- package/src/native/resource/android/src/main/java/com/resource/RNResourceModule.java +90 -0
- package/src/native/resource/android/src/main/java/com/resource/RNResourcePackage.java +22 -0
- package/src/native/resource/ios/RNResouce.m +71 -0
- package/src/native/resource/ios/RNResource.h +5 -0
- package/example/ios/Example.xcodeproj/xcuserdata/sophia.xcuserdatad/xcschemes/xcschememanagement.plist +0 -14
- package/example/ios/Example.xcworkspace/xcuserdata/sophia.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- package/example/ios/Example.xcworkspace/xcuserdata/sophia.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +0 -6
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sophia.xcuserdatad/xcschemes/MoMoUIKits.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sophia.xcuserdatad/xcschemes/Pods-Example.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sophia.xcuserdatad/xcschemes/SDWebImage.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sophia.xcuserdatad/xcschemes/SDWebImageSwiftUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sophia.xcuserdatad/xcschemes/SkeletonUI.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sophia.xcuserdatad/xcschemes/lottie-ios-LottiePrivacyInfo.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sophia.xcuserdatad/xcschemes/lottie-ios.xcscheme +0 -58
- package/example/ios/Pods/Pods.xcodeproj/xcuserdata/sophia.xcuserdatad/xcschemes/xcschememanagement.plist +0 -46
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
|
|
2
|
+
import fs from 'fs';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import semver from 'semver';
|
|
5
|
+
import { logger } from '../logger';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Scans package.json dependencies and flags any package with version 0.x.x where minor < 80 as deprecated.
|
|
9
|
+
* Returns true if no deprecated versions are found, false otherwise.
|
|
10
|
+
*/
|
|
11
|
+
export interface DeprecatedVersionResult {
|
|
12
|
+
healthy: boolean;
|
|
13
|
+
found: string[];
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function checkWrongVersionCommunityPackage(): DeprecatedVersionResult {
|
|
17
|
+
const cwd = process.cwd();
|
|
18
|
+
const pkgPath = path.resolve(cwd, 'package.json');
|
|
19
|
+
if (!fs.existsSync(pkgPath)) {
|
|
20
|
+
logger.warn('No package.json found');
|
|
21
|
+
return { healthy: true, found: [] };
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
let pkg: any;
|
|
25
|
+
try {
|
|
26
|
+
pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'));
|
|
27
|
+
} catch (error) {
|
|
28
|
+
logger.error(`Failed to parse package.json: ${error}`);
|
|
29
|
+
return { healthy: false, found: [] };
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const allDeps: Record<string, string> = {
|
|
33
|
+
...pkg.dependencies,
|
|
34
|
+
...pkg.devDependencies,
|
|
35
|
+
...pkg.peerDependencies,
|
|
36
|
+
...pkg.optionalDependencies,
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
const communityPackage = [
|
|
40
|
+
{name: 'react-native-svg', version: '15.11.1'},
|
|
41
|
+
{name: 'react-native-video', version: '6.14.0'},
|
|
42
|
+
{name: 'react-native-maps', version: '0.27.0'},
|
|
43
|
+
];
|
|
44
|
+
|
|
45
|
+
const found: string[] = [];
|
|
46
|
+
|
|
47
|
+
for (const [name, range] of Object.entries(allDeps)) {
|
|
48
|
+
if (!communityPackage.find(item => item.name === name)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
const coerced = semver.coerce(range);
|
|
52
|
+
if (!coerced) continue;
|
|
53
|
+
if (coerced.major === 0 && coerced.minor < 80) {
|
|
54
|
+
logger.error(`${name}@${coerced.version} is using wrong version, please use ${communityPackage.find(item => item.name === name)?.version}`);
|
|
55
|
+
found.push(`${name}@${coerced.version} => ${communityPackage.find(item => item.name === name)?.version}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (found.length > 0) {
|
|
60
|
+
return { healthy: false, found };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
return { healthy: true, found: [] };
|
|
64
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import {DependencyIssue} from './checkShareDependencies';
|
|
2
|
+
import {ScanResult} from './scanNativeModulesUsage';
|
|
3
|
+
|
|
4
|
+
export const getErrorMessage = (
|
|
5
|
+
coreHealthy: boolean,
|
|
6
|
+
nativeHealthy: boolean,
|
|
7
|
+
nativeUsageCount: number,
|
|
8
|
+
componentRate: number,
|
|
9
|
+
maxApiHealthy: boolean,
|
|
10
|
+
maxApiResults: Record<string, string[]>,
|
|
11
|
+
deprecatedPkgList: string[],
|
|
12
|
+
deprecatedVerList: string[],
|
|
13
|
+
wrongVersionList: string[],
|
|
14
|
+
sharedDependencyIssues: DependencyIssue[],
|
|
15
|
+
foundationImportIssues: ScanResult
|
|
16
|
+
): string | null => {
|
|
17
|
+
const messages: string[] = [];
|
|
18
|
+
if (!coreHealthy) {
|
|
19
|
+
messages.push(
|
|
20
|
+
'❗️ Core dependencies check failed. Please ensure you have removed any @momo-kits/core usage.'
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
if (!nativeHealthy) {
|
|
24
|
+
messages.push(
|
|
25
|
+
`❗️ Native modules usage detected in ${nativeUsageCount} file(s). Please remove native module imports.`
|
|
26
|
+
);
|
|
27
|
+
}
|
|
28
|
+
if (componentRate < 0.5) {
|
|
29
|
+
messages.push(
|
|
30
|
+
`❗️ Component adoption rate is low: ${(componentRate * 100).toFixed(
|
|
31
|
+
2
|
|
32
|
+
)}%. Aim for at least 50%.`
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
if (!maxApiHealthy) {
|
|
36
|
+
const deprecatedUsages = Object.entries(maxApiResults).flatMap(
|
|
37
|
+
([file, apis]) => apis.map(api => `${api} in ${file}`)
|
|
38
|
+
);
|
|
39
|
+
messages.push(
|
|
40
|
+
`❗️ Deprecated MaxAPI usage found: ${deprecatedUsages.join('; ')}`
|
|
41
|
+
);
|
|
42
|
+
}
|
|
43
|
+
if (deprecatedPkgList.length > 0) {
|
|
44
|
+
messages.push(
|
|
45
|
+
`❗️ Deprecated @momo-kits packages found: ${deprecatedPkgList.join(
|
|
46
|
+
', '
|
|
47
|
+
)}. Please remove or update them accordingly.`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
if (deprecatedVerList.length > 0) {
|
|
51
|
+
messages.push(
|
|
52
|
+
`❗️ Deprecated @momo-kits dependency versions detected (<0.80.x): ${deprecatedVerList.join(
|
|
53
|
+
', '
|
|
54
|
+
)}. Please upgrade to latest versions.`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
if (wrongVersionList.length > 0) {
|
|
58
|
+
messages.push(
|
|
59
|
+
`❗️ Wrong version dependency found: ${wrongVersionList.join(
|
|
60
|
+
', '
|
|
61
|
+
)}. Please upgrade to correct versions.`
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
if (sharedDependencyIssues.length > 0) {
|
|
65
|
+
const missingDeps = sharedDependencyIssues
|
|
66
|
+
.map(issue => issue.package)
|
|
67
|
+
.join(', ');
|
|
68
|
+
messages.push(
|
|
69
|
+
`❗️ Shared dependencies issues found: ${missingDeps}. These dependencies are used in code but not declared in package.json.`
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
if (Object.keys(foundationImportIssues).length > 0) {
|
|
73
|
+
const invalidImports = Object.entries(foundationImportIssues)
|
|
74
|
+
.flatMap(([file, imports]) => imports.map(imp => `${imp} in ${file}`))
|
|
75
|
+
.join('; ');
|
|
76
|
+
messages.push(
|
|
77
|
+
`❗️ Invalid nested imports found: ${invalidImports}. Only imports from entry are allowed, not from internal paths.`
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
if (messages.length === 0) {
|
|
81
|
+
return null;
|
|
82
|
+
}
|
|
83
|
+
return messages.join('\n');
|
|
84
|
+
};
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
// @ts-ignore
|
|
2
|
+
import scanner from 'react-scanner';
|
|
3
|
+
import fs from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
import {getLogger} from '../logger';
|
|
6
|
+
|
|
7
|
+
const scan = async (config: any) => {
|
|
8
|
+
const originalLog = console.log;
|
|
9
|
+
const originalWarn = console.warn;
|
|
10
|
+
const originalInfo = console.info;
|
|
11
|
+
console.log = () => {};
|
|
12
|
+
console.warn = () => {};
|
|
13
|
+
console.info = () => {};
|
|
14
|
+
try {
|
|
15
|
+
return await scanner.run(config);
|
|
16
|
+
} finally {
|
|
17
|
+
console.log = originalLog;
|
|
18
|
+
console.warn = originalWarn;
|
|
19
|
+
console.info = originalInfo;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
function ensureFileExists(filePath: string, defaultContent: any = {}) {
|
|
24
|
+
if (!fs.existsSync(filePath)) {
|
|
25
|
+
fs.mkdirSync(path.dirname(filePath), {recursive: true});
|
|
26
|
+
fs.writeFileSync(filePath, JSON.stringify(defaultContent, null, 2));
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Calculates adoption rate based on component usage counts in scan JSON files.
|
|
32
|
+
* Formula: (Foundation + Library + FS + RN) / All components
|
|
33
|
+
*/
|
|
34
|
+
function calculateAdoptionRate(files: Record<string, string>) {
|
|
35
|
+
const counts: Record<string, number> = {};
|
|
36
|
+
for (const [key, file] of Object.entries(files)) {
|
|
37
|
+
let json: Record<string, number> = {};
|
|
38
|
+
try {
|
|
39
|
+
json = JSON.parse(fs.readFileSync(file, 'utf-8'));
|
|
40
|
+
} catch {
|
|
41
|
+
json = {};
|
|
42
|
+
}
|
|
43
|
+
counts[key] = Object.values(json).reduce(
|
|
44
|
+
(sum, v) => sum + (typeof v === 'number' ? v : 0),
|
|
45
|
+
0
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
const numerator =
|
|
49
|
+
counts.foundation + counts.library + counts.verLib + counts.rn;
|
|
50
|
+
const log = getLogger('ADOPTION_RATE');
|
|
51
|
+
log.info('Components count\n');
|
|
52
|
+
const tableData = Object.entries(counts).map(
|
|
53
|
+
([components, count]) => ({ components, count })
|
|
54
|
+
);
|
|
55
|
+
console.table(tableData);
|
|
56
|
+
|
|
57
|
+
const denominator = Object.values(counts).reduce((sum, v) => sum + v, 0);
|
|
58
|
+
const rate = denominator > 0 ? numerator / denominator : 0;
|
|
59
|
+
return {rate, counts};
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const scanBranch = async (scanPath: string) => {
|
|
63
|
+
const corePath = process.cwd() + '/scan/core.json';
|
|
64
|
+
const foundationPath = process.cwd() + '/scan/foundation.json';
|
|
65
|
+
const libPath = process.cwd() + '/scan/library.json';
|
|
66
|
+
const rnPath = process.cwd() + '/scan/RN.json';
|
|
67
|
+
const unIdentifiedPath = process.cwd() + '/scan/unidentify.json';
|
|
68
|
+
const verLibPath = process.cwd() + '/scan/verLibPath.json';
|
|
69
|
+
|
|
70
|
+
const files = {
|
|
71
|
+
foundation: foundationPath,
|
|
72
|
+
library: libPath,
|
|
73
|
+
rn: rnPath,
|
|
74
|
+
unidentify: unIdentifiedPath,
|
|
75
|
+
verLib: verLibPath,
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
const allKitsReg = /@momo-kits/;
|
|
79
|
+
const fsReg =
|
|
80
|
+
/^(?:@fs-mobile-platform\/(components(\/.*)?|investment(\/.*)?|screens(\/.*)?|foundation(\/.*)?)|@miniapp-platform\/(components(\/.*)?|foundation(\/.*)?))$/;
|
|
81
|
+
const RNReg = /react-native|react-native-svg/;
|
|
82
|
+
const excludeReg = new RegExp(
|
|
83
|
+
`^(?!(${allKitsReg.source}|${fsReg.source}|${RNReg.source})).*$`
|
|
84
|
+
);
|
|
85
|
+
|
|
86
|
+
const config1 = {
|
|
87
|
+
crawlFrom: scanPath,
|
|
88
|
+
includeSubComponents: true,
|
|
89
|
+
importedFrom: '@momo-kits/foundation',
|
|
90
|
+
processors: [['count-components', {outputTo: foundationPath}]],
|
|
91
|
+
rootDir: process.cwd(),
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
const config2 = {
|
|
95
|
+
crawlFrom: scanPath,
|
|
96
|
+
importedFrom: '@momo-kits/core',
|
|
97
|
+
includeSubComponents: true,
|
|
98
|
+
processors: [['count-components', {outputTo: corePath}]],
|
|
99
|
+
rootDir: process.cwd(),
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const config3 = {
|
|
103
|
+
crawlFrom: scanPath,
|
|
104
|
+
includeSubComponents: true,
|
|
105
|
+
importedFrom: /^@momo-kits\/(?!core|foundation)/,
|
|
106
|
+
processors: [['count-components', {outputTo: libPath}]],
|
|
107
|
+
rootDir: process.cwd(),
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
const config4 = {
|
|
111
|
+
crawlFrom: scanPath,
|
|
112
|
+
includeSubComponents: true,
|
|
113
|
+
importedFrom: 'react-native',
|
|
114
|
+
processors: [['count-components', {outputTo: rnPath}]],
|
|
115
|
+
rootDir: process.cwd(),
|
|
116
|
+
};
|
|
117
|
+
|
|
118
|
+
const config5 = {
|
|
119
|
+
crawlFrom: scanPath,
|
|
120
|
+
includeSubComponents: true,
|
|
121
|
+
importedFrom: excludeReg,
|
|
122
|
+
processors: [['count-components', {outputTo: unIdentifiedPath}]],
|
|
123
|
+
rootDir: process.cwd(),
|
|
124
|
+
};
|
|
125
|
+
|
|
126
|
+
const config6 = {
|
|
127
|
+
crawlFrom: scanPath,
|
|
128
|
+
includeSubComponents: true,
|
|
129
|
+
importedFrom: fsReg,
|
|
130
|
+
processors: [['count-components', {outputTo: verLibPath}]],
|
|
131
|
+
rootDir: process.cwd(),
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
try {
|
|
135
|
+
ensureFileExists(corePath, {});
|
|
136
|
+
ensureFileExists(foundationPath, {});
|
|
137
|
+
ensureFileExists(libPath, {});
|
|
138
|
+
ensureFileExists(rnPath, {});
|
|
139
|
+
ensureFileExists(unIdentifiedPath, {});
|
|
140
|
+
ensureFileExists(verLibPath, {});
|
|
141
|
+
|
|
142
|
+
await scan(config1);
|
|
143
|
+
await scan(config2);
|
|
144
|
+
await scan(config3);
|
|
145
|
+
await scan(config4);
|
|
146
|
+
await scan(config5);
|
|
147
|
+
await scan(config6);
|
|
148
|
+
|
|
149
|
+
const {rate, counts} = calculateAdoptionRate(files);
|
|
150
|
+
|
|
151
|
+
return {
|
|
152
|
+
rate,
|
|
153
|
+
counts,
|
|
154
|
+
};
|
|
155
|
+
} catch (error) {
|
|
156
|
+
console.error('Error during scan or calculation:', error);
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
const getScanPath = () => {
|
|
161
|
+
const possiblePaths = [
|
|
162
|
+
'./src',
|
|
163
|
+
'./miniapp',
|
|
164
|
+
'./miniApp',
|
|
165
|
+
'./app',
|
|
166
|
+
'./miniApps',
|
|
167
|
+
];
|
|
168
|
+
|
|
169
|
+
for (const p of possiblePaths) {
|
|
170
|
+
if (fs.existsSync(path.resolve(p))) {
|
|
171
|
+
console.log(`✅ Found source folder: ${p}`);
|
|
172
|
+
return p;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
throw new Error('❌ No valid src folder found');
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const scanComponentUsage: () => Promise<{
|
|
180
|
+
rate: number;
|
|
181
|
+
counts: Record<string, number>;
|
|
182
|
+
}> = async () => {
|
|
183
|
+
let scanPath;
|
|
184
|
+
try {
|
|
185
|
+
scanPath = getScanPath();
|
|
186
|
+
} catch (error: any) {
|
|
187
|
+
console.error(error.message);
|
|
188
|
+
return {rate: 0, counts: {}};
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
const log = getLogger('ADOPTION_RATE');
|
|
192
|
+
const result = await scanBranch(scanPath);
|
|
193
|
+
if (!result) {
|
|
194
|
+
return {rate: 0, counts: {}};
|
|
195
|
+
}
|
|
196
|
+
if (result.rate < 0.5) {
|
|
197
|
+
log.error(`Adoption rate: ${(result.rate * 100).toFixed(2)}%`);
|
|
198
|
+
} else {
|
|
199
|
+
log.success(
|
|
200
|
+
`Adoption rate: ${(result.rate * 100).toFixed(2)}%`
|
|
201
|
+
);
|
|
202
|
+
}
|
|
203
|
+
return result;
|
|
204
|
+
};
|
|
205
|
+
|
|
206
|
+
export default scanComponentUsage;
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import {ScanResult, scanTargetDirs} from './scanNativeModulesUsage';
|
|
4
|
+
import {logger} from '../logger';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Scans project files and flags any import that uses an internal subpath
|
|
8
|
+
* for packages declared in package.json (dependencies and devDependencies).
|
|
9
|
+
*
|
|
10
|
+
* Example flagged patterns:
|
|
11
|
+
* - import X from 'some-pkg/internal';
|
|
12
|
+
* - export {Y} from "@scope/pkg/utils";
|
|
13
|
+
* - const x = require('lib/sub/module');
|
|
14
|
+
* - const x = await import("@scope/lib/deep/path");
|
|
15
|
+
*
|
|
16
|
+
* Valid (NOT flagged):
|
|
17
|
+
* - import X from 'some-pkg';
|
|
18
|
+
*
|
|
19
|
+
* @returns ScanResult mapping file paths to list of invalid import paths found.
|
|
20
|
+
*/
|
|
21
|
+
function scanInternalImportsCore(): {
|
|
22
|
+
byFile: ScanResult;
|
|
23
|
+
foundations: string[];
|
|
24
|
+
momoKitsOthers: string[];
|
|
25
|
+
others: string[];
|
|
26
|
+
} {
|
|
27
|
+
const cwd = process.cwd();
|
|
28
|
+
const dirs = scanTargetDirs;
|
|
29
|
+
|
|
30
|
+
// Read declared packages from package.json
|
|
31
|
+
let packageNames: string[] = [];
|
|
32
|
+
try {
|
|
33
|
+
const pkgJsonPath = path.resolve(cwd, 'package.json');
|
|
34
|
+
const pkgRaw = fs.readFileSync(pkgJsonPath, 'utf8');
|
|
35
|
+
const pkg = JSON.parse(pkgRaw) as {
|
|
36
|
+
dependencies?: Record<string, string>;
|
|
37
|
+
devDependencies?: Record<string, string>;
|
|
38
|
+
};
|
|
39
|
+
const deps = Object.keys(pkg.dependencies || {});
|
|
40
|
+
const devDeps = Object.keys(pkg.devDependencies || {});
|
|
41
|
+
// Unique list
|
|
42
|
+
packageNames = Array.from(new Set([...deps, ...devDeps]));
|
|
43
|
+
} catch (e) {
|
|
44
|
+
logger.warn(
|
|
45
|
+
'Unable to read package.json to determine package list. Falling back to empty set.'
|
|
46
|
+
);
|
|
47
|
+
packageNames = [];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Build a regex to match any import/re-export/require/dynamic import that uses a subpath
|
|
51
|
+
// for one of the declared packages, e.g. from 'pkg/subpath'
|
|
52
|
+
const escapeRegex = (s: string) => s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
53
|
+
const namesAlternation = packageNames.map(escapeRegex).join('|');
|
|
54
|
+
// If no packages, use a regex that matches nothing
|
|
55
|
+
const invalidImportRegex = namesAlternation
|
|
56
|
+
? new RegExp(
|
|
57
|
+
// import ... from 'pkg/sub' | export ... from 'pkg/sub' | require('pkg/sub') | import('pkg/sub')
|
|
58
|
+
String.raw`(?:import\s+[^;]*?from\s+|export\s+[^;]*?from\s+|require\(|import\()\s*['"](?:${namesAlternation})\/[^'\"]+['"]`,
|
|
59
|
+
'g'
|
|
60
|
+
)
|
|
61
|
+
: /$a/; // matches nothing when no packages
|
|
62
|
+
|
|
63
|
+
const results: ScanResult = {};
|
|
64
|
+
const foundationSet = new Set<string>();
|
|
65
|
+
const momoKitsOtherSet = new Set<string>();
|
|
66
|
+
const othersSet = new Set<string>();
|
|
67
|
+
const skipDirs = new Set([
|
|
68
|
+
'node_modules',
|
|
69
|
+
'dist',
|
|
70
|
+
'build',
|
|
71
|
+
'coverage',
|
|
72
|
+
'__tests__',
|
|
73
|
+
'__mocks__',
|
|
74
|
+
]);
|
|
75
|
+
const skipTestFileRegex = /\.(test|spec)\.(js|jsx|ts|tsx)$/;
|
|
76
|
+
|
|
77
|
+
function scanDir(dirPath: string) {
|
|
78
|
+
let entries: fs.Dirent[];
|
|
79
|
+
try {
|
|
80
|
+
entries = fs.readdirSync(dirPath, {withFileTypes: true});
|
|
81
|
+
} catch {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
for (const entry of entries) {
|
|
86
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
87
|
+
|
|
88
|
+
if (
|
|
89
|
+
entry.isDirectory() &&
|
|
90
|
+
(skipDirs.has(entry.name) || entry.name.startsWith('.'))
|
|
91
|
+
) {
|
|
92
|
+
continue;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
if (entry.isDirectory()) {
|
|
96
|
+
scanDir(fullPath);
|
|
97
|
+
} else if (entry.isFile() && /\.(js|jsx|ts|tsx)$/.test(entry.name)) {
|
|
98
|
+
if (skipTestFileRegex.test(entry.name)) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
let content: string;
|
|
103
|
+
try {
|
|
104
|
+
content = fs.readFileSync(fullPath, 'utf8');
|
|
105
|
+
} catch {
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
const matches = content.match(invalidImportRegex);
|
|
110
|
+
if (matches && matches.length > 0) {
|
|
111
|
+
if (!results[fullPath]) {
|
|
112
|
+
results[fullPath] = [];
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Extract the quoted import path from each match
|
|
116
|
+
for (const match of matches) {
|
|
117
|
+
const pathMatch = match.match(/['"]([^'"]+)['"]/);
|
|
118
|
+
const importPath = pathMatch?.[1];
|
|
119
|
+
if (importPath && !results[fullPath].includes(importPath)) {
|
|
120
|
+
results[fullPath].push(importPath);
|
|
121
|
+
|
|
122
|
+
if (importPath.startsWith('@momo-kits/')) {
|
|
123
|
+
logger.error(
|
|
124
|
+
`Invalid internal package import "${importPath}" found in file: ${fullPath}`
|
|
125
|
+
);
|
|
126
|
+
if (importPath.startsWith('@momo-kits/foundation/')) {
|
|
127
|
+
foundationSet.add(importPath);
|
|
128
|
+
} else {
|
|
129
|
+
momoKitsOtherSet.add(importPath);
|
|
130
|
+
}
|
|
131
|
+
} else {
|
|
132
|
+
othersSet.add(importPath);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
for (const dir of dirs) {
|
|
142
|
+
const dirPath = path.resolve(cwd, dir);
|
|
143
|
+
if (fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
|
|
144
|
+
scanDir(dirPath);
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return {
|
|
150
|
+
byFile: results,
|
|
151
|
+
foundations: Array.from(foundationSet),
|
|
152
|
+
momoKitsOthers: Array.from(momoKitsOtherSet),
|
|
153
|
+
others: Array.from(othersSet),
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export function scanFoundationImports(): ScanResult {
|
|
158
|
+
const {byFile} = scanInternalImportsCore();
|
|
159
|
+
return byFile;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
export function scanInternalImportsBuckets(): {
|
|
163
|
+
foundations: string[];
|
|
164
|
+
momoKitsOthers: string[];
|
|
165
|
+
others: string[];
|
|
166
|
+
} {
|
|
167
|
+
const {foundations, momoKitsOthers, others} = scanInternalImportsCore();
|
|
168
|
+
return {foundations, momoKitsOthers, others};
|
|
169
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { ScanResult, scanTargetDirs } from './scanNativeModulesUsage';
|
|
4
|
+
import { logger } from '../logger';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Scans directories for usage of deprecated MaxAPI methods.
|
|
8
|
+
* @returns ScanResult mapping file paths to list of deprecated API names found.
|
|
9
|
+
*/
|
|
10
|
+
export function scanMaxApiUsage(): ScanResult {
|
|
11
|
+
const cwd = process.cwd();
|
|
12
|
+
const dirs = scanTargetDirs;
|
|
13
|
+
const apiNames = [
|
|
14
|
+
'startMiniApp',
|
|
15
|
+
'getIpAddress',
|
|
16
|
+
'startServiceId',
|
|
17
|
+
'listenAndroidKeyboardHeight',
|
|
18
|
+
'useNetInfo',
|
|
19
|
+
'sendConfirmMessage',
|
|
20
|
+
'shareApp',
|
|
21
|
+
'isFavoriteApp',
|
|
22
|
+
'isHighPerformanceDevice',
|
|
23
|
+
'updateToastDebugConfig',
|
|
24
|
+
'popBackStack',
|
|
25
|
+
'setSoftInputMode',
|
|
26
|
+
'getSystemBrightnessLevel',
|
|
27
|
+
'getFirebaseWebAppConfig',
|
|
28
|
+
'preLoadFiles',
|
|
29
|
+
'getPathFiles',
|
|
30
|
+
'requestATTPermision',
|
|
31
|
+
'compressVideo'
|
|
32
|
+
];
|
|
33
|
+
const patterns = apiNames.map(name => ({ name, regex: new RegExp(`\\bMaxApi\\.${name}\\b`, 'i') }));
|
|
34
|
+
const results: ScanResult = {};
|
|
35
|
+
const skipDirs = new Set(['node_modules','dist','build','coverage','__tests__','__mocks__']);
|
|
36
|
+
const skipTestFileRegex = /\.(test|spec)\.(js|jsx|ts|tsx)$/;
|
|
37
|
+
|
|
38
|
+
function scanDir(dirPath: string) {
|
|
39
|
+
let entries: fs.Dirent[];
|
|
40
|
+
try {
|
|
41
|
+
entries = fs.readdirSync(dirPath, { withFileTypes: true });
|
|
42
|
+
} catch {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
for (const entry of entries) {
|
|
46
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
47
|
+
if (entry.isDirectory() && (skipDirs.has(entry.name) || entry.name.startsWith('.'))) {
|
|
48
|
+
continue;
|
|
49
|
+
}
|
|
50
|
+
if (entry.isDirectory()) {
|
|
51
|
+
scanDir(fullPath);
|
|
52
|
+
} else if (entry.isFile() && /\.(js|jsx|ts|tsx)$/.test(entry.name)) {
|
|
53
|
+
if (skipTestFileRegex.test(entry.name)) {
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
let content: string;
|
|
57
|
+
try {
|
|
58
|
+
content = fs.readFileSync(fullPath, 'utf8');
|
|
59
|
+
} catch {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
for (const { name, regex } of patterns) {
|
|
63
|
+
if (regex.test(content)) {
|
|
64
|
+
if (!results[fullPath]) {
|
|
65
|
+
results[fullPath] = [];
|
|
66
|
+
}
|
|
67
|
+
if (!results[fullPath].includes(name)) {
|
|
68
|
+
results[fullPath].push(name);
|
|
69
|
+
logger.error(`Deprecated MaxAPI "${name}" used in file: ${fullPath}`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
for (const dir of dirs) {
|
|
78
|
+
const dirPath = path.resolve(cwd, dir);
|
|
79
|
+
if (fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
|
|
80
|
+
scanDir(dirPath);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
return results;
|
|
86
|
+
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
|
|
4
|
+
// Directories to scan, shared by both native modules and MaxAPI scanners
|
|
5
|
+
export const scanTargetDirs = ['src', 'miniapp', 'miniApp', 'app', 'miniApps'];
|
|
6
|
+
|
|
7
|
+
export interface ScanResult {
|
|
8
|
+
[filePath: string]: string[];
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Recursively scans directories for React Native native modules usage.
|
|
13
|
+
* Looks for patterns like NativeModules, requireNativeComponent, UIManager, etc.
|
|
14
|
+
* Scans the following folders at project root if they exist: src, miniapp, miniApp, app, miniApps.
|
|
15
|
+
*/
|
|
16
|
+
export function scanNativeModulesUsage(): ScanResult {
|
|
17
|
+
const cwd = process.cwd();
|
|
18
|
+
const dirs = scanTargetDirs;
|
|
19
|
+
const patterns: {name: string; regex: RegExp}[] = [
|
|
20
|
+
{name: 'NativeModules import', regex: /import\s+{\s*NativeModules\s*}/},
|
|
21
|
+
{name: 'NativeModules usage', regex: /NativeModules\./},
|
|
22
|
+
{name: 'requireNativeComponent', regex: /requireNativeComponent/},
|
|
23
|
+
];
|
|
24
|
+
const results: ScanResult = {};
|
|
25
|
+
const skipDirs = new Set(['node_modules','dist','build','coverage','__tests__','__mocks__']);
|
|
26
|
+
const skipTestFileRegex = /\.(test|spec)\.(js|jsx|ts|tsx)$/;
|
|
27
|
+
|
|
28
|
+
function scanDir(dirPath: string) {
|
|
29
|
+
let entries: fs.Dirent[];
|
|
30
|
+
try {
|
|
31
|
+
entries = fs.readdirSync(dirPath, {withFileTypes: true});
|
|
32
|
+
} catch {
|
|
33
|
+
return;
|
|
34
|
+
}
|
|
35
|
+
for (const entry of entries) {
|
|
36
|
+
const fullPath = path.join(dirPath, entry.name);
|
|
37
|
+
if (entry.isDirectory() && (skipDirs.has(entry.name) || entry.name.startsWith('.'))) {
|
|
38
|
+
continue;
|
|
39
|
+
}
|
|
40
|
+
if (entry.isDirectory()) {
|
|
41
|
+
scanDir(fullPath);
|
|
42
|
+
} else if (
|
|
43
|
+
entry.isFile() &&
|
|
44
|
+
/\.(js|jsx|ts|tsx)$/.test(entry.name)
|
|
45
|
+
) {
|
|
46
|
+
if (skipTestFileRegex.test(entry.name)) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
let content: string;
|
|
50
|
+
try {
|
|
51
|
+
content = fs.readFileSync(fullPath, 'utf8');
|
|
52
|
+
} catch {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
55
|
+
for (const {name, regex} of patterns) {
|
|
56
|
+
if (regex.test(content)) {
|
|
57
|
+
if (!results[fullPath]) {
|
|
58
|
+
results[fullPath] = [];
|
|
59
|
+
}
|
|
60
|
+
if (!results[fullPath].includes(name)) {
|
|
61
|
+
results[fullPath].push(name);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
for (const dir of dirs) {
|
|
70
|
+
const dirPath = path.resolve(cwd, dir);
|
|
71
|
+
if (fs.existsSync(dirPath) && fs.statSync(dirPath).isDirectory()) {
|
|
72
|
+
scanDir(dirPath);
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
return results;
|
|
78
|
+
}
|