Phecda

refactor: navigation theme & DesignList

@@ -13,6 +13,13 @@ import { DarkModeProvider } from 'react-native-dark-mode'; @@ -13,6 +13,13 @@ import { DarkModeProvider } from 'react-native-dark-mode';
13 import { enableScreens } from 'react-native-screens'; 13 import { enableScreens } from 'react-native-screens';
14 import AppNavigationContainer from './src/screen/AppNavigationContainer'; 14 import AppNavigationContainer from './src/screen/AppNavigationContainer';
15 15
  16 +if (__DEV__) {
  17 + const whyDidYouRender = require('@welldone-software/why-did-you-render');
  18 + whyDidYouRender(React, {
  19 + trackAllPureComponents: false,
  20 + });
  21 +}
  22 +
16 enableScreens(); 23 enableScreens();
17 24
18 const App = () => { 25 const App = () => {
@@ -11,6 +11,7 @@ @@ -11,6 +11,7 @@
11 "commit": "git-cz" 11 "commit": "git-cz"
12 }, 12 },
13 "dependencies": { 13 "dependencies": {
  14 + "@huse/previous-value": "^1.0.1",
14 "@react-native-community/masked-view": "^0.1.7", 15 "@react-native-community/masked-view": "^0.1.7",
15 "@react-navigation/bottom-tabs": "^5.2.5", 16 "@react-navigation/bottom-tabs": "^5.2.5",
16 "@react-navigation/drawer": "^5.4.0", 17 "@react-navigation/drawer": "^5.4.0",
@@ -40,6 +41,7 @@ @@ -40,6 +41,7 @@
40 "@types/react-test-renderer": "16.9.2", 41 "@types/react-test-renderer": "16.9.2",
41 "@typescript-eslint/eslint-plugin": "^2.27.0", 42 "@typescript-eslint/eslint-plugin": "^2.27.0",
42 "@typescript-eslint/parser": "^2.27.0", 43 "@typescript-eslint/parser": "^2.27.0",
  44 + "@welldone-software/why-did-you-render": "^4.0.7",
43 "babel-jest": "^24.9.0", 45 "babel-jest": "^24.9.0",
44 "commitizen": "^4.0.3", 46 "commitizen": "^4.0.3",
45 "cz-conventional-changelog": "^3.1.0", 47 "cz-conventional-changelog": "^3.1.0",
@@ -9,12 +9,15 @@ import { @@ -9,12 +9,15 @@ import {
9 SectionListProps, 9 SectionListProps,
10 ScrollViewProps, 10 ScrollViewProps,
11 ScrollView, 11 ScrollView,
  12 + StyleSheet,
12 } from 'react-native'; 13 } from 'react-native';
  14 +import { useOriginalCopy } from '@huse/previous-value';
13 import { colorPreset } from '../../design'; 15 import { colorPreset } from '../../design';
14 import { 16 import {
15 DynamicStyleSheet, 17 DynamicStyleSheet,
16 useDynamicStyleSheet, 18 useDynamicStyleSheet,
17 } from 'react-native-dark-mode'; 19 } from 'react-native-dark-mode';
  20 +import { useSafeArea } from 'react-native-safe-area-context';
18 21
19 const dynamicStyles = new DynamicStyleSheet({ 22 const dynamicStyles = new DynamicStyleSheet({
20 background: { 23 background: {
@@ -31,6 +34,18 @@ type BackgroundProps<Props> = PropsWithChildren<Props> & { @@ -31,6 +34,18 @@ type BackgroundProps<Props> = PropsWithChildren<Props> & {
31 white?: boolean; 34 white?: boolean;
32 }; 35 };
33 36
  37 +function useSafeContentContainerStyle(
  38 + contentContainerStyle: ScrollViewProps['contentContainerStyle']
  39 +) {
  40 + const { left, right } = useSafeArea();
  41 + const calculated = StyleSheet.compose(contentContainerStyle, {
  42 + paddingLeft: left,
  43 + paddingRight: right,
  44 + });
  45 + const originValue = useOriginalCopy(calculated);
  46 + return originValue;
  47 +}
  48 +
34 export const BGView = ({ 49 export const BGView = ({
35 style, 50 style,
36 white, 51 white,
@@ -62,13 +77,16 @@ export const BGSafe = ({ @@ -62,13 +77,16 @@ export const BGSafe = ({
62 export const BGScroll = ({ 77 export const BGScroll = ({
63 style, 78 style,
64 white, 79 white,
  80 + contentContainerStyle,
65 ...props 81 ...props
66 }: BackgroundProps<ScrollViewProps>) => { 82 }: BackgroundProps<ScrollViewProps>) => {
67 const styles = useDynamicStyleSheet(dynamicStyles); 83 const styles = useDynamicStyleSheet(dynamicStyles);
  84 + const safeContentStyle = useSafeContentContainerStyle(contentContainerStyle);
68 return ( 85 return (
69 <ScrollView 86 <ScrollView
70 style={[white ? styles.whiteBackground : styles.background, style]} 87 style={[white ? styles.whiteBackground : styles.background, style]}
71 contentInsetAdjustmentBehavior="automatic" 88 contentInsetAdjustmentBehavior="automatic"
  89 + contentContainerStyle={safeContentStyle}
72 {...props} 90 {...props}
73 /> 91 />
74 ); 92 );
@@ -77,13 +95,16 @@ export const BGScroll = ({ @@ -77,13 +95,16 @@ export const BGScroll = ({
77 export const BGList = <T extends any>({ 95 export const BGList = <T extends any>({
78 style, 96 style,
79 white, 97 white,
  98 + contentContainerStyle,
80 ...props 99 ...props
81 }: BackgroundProps<FlatListProps<T>>) => { 100 }: BackgroundProps<FlatListProps<T>>) => {
82 const styles = useDynamicStyleSheet(dynamicStyles); 101 const styles = useDynamicStyleSheet(dynamicStyles);
  102 + const safeContentStyle = useSafeContentContainerStyle(contentContainerStyle);
83 return ( 103 return (
84 <FlatList 104 <FlatList
85 style={[white ? styles.whiteBackground : styles.background, style]} 105 style={[white ? styles.whiteBackground : styles.background, style]}
86 contentInsetAdjustmentBehavior="automatic" 106 contentInsetAdjustmentBehavior="automatic"
  107 + contentContainerStyle={safeContentStyle}
87 keyExtractor={(_, i) => i.toString()} 108 keyExtractor={(_, i) => i.toString()}
88 {...props} 109 {...props}
89 /> 110 />
@@ -34,3 +34,15 @@ export const groupedBackgroundColor = { @@ -34,3 +34,15 @@ export const groupedBackgroundColor = {
34 secondary: new DynamicValue('#FFFFFF', '#1C1C1E'), 34 secondary: new DynamicValue('#FFFFFF', '#1C1C1E'),
35 tertiary: new DynamicValue('#F2F2F7', '#2C2C2E'), 35 tertiary: new DynamicValue('#F2F2F7', '#2C2C2E'),
36 }; 36 };
  37 +
  38 +export const rainbow = {
  39 + blue: new DynamicValue('rgb(0,122,255)', 'rgb(10,132,255)'),
  40 + green: new DynamicValue('rgb(52,199,89)', 'rgb(48,209,88)'),
  41 + indigo: new DynamicValue('rgb(88,86,214)', 'rgb(94,92,230)'),
  42 + orange: new DynamicValue('rgb(255,149,0)', 'rgb(255,159,10)'),
  43 + pink: new DynamicValue('rgb(255,45,85)', 'rgb(255,55,95)'),
  44 + purple: new DynamicValue('rgb(175,82,222)', 'rgb(191,90,242)'),
  45 + red: new DynamicValue('rgb(255,59,48)', 'rgb(255,69,58)'),
  46 + teal: new DynamicValue('rgb(90,200,250)', 'rgb(100,210,255)'),
  47 + yellow: new DynamicValue('rgb(255,204,0)', 'rgb(255,214,10)'),
  48 +};
1 import * as colorPreset from './color'; 1 import * as colorPreset from './color';
2 - 2 +import * as themeForNav from './themeForReactNavigation';
3 -export { colorPreset }; 3 +export { colorPreset, themeForNav };
  1 +import { DefaultTheme } from '@react-navigation/native';
  2 +import { rainbow } from './color';
  3 +
  4 +type Theme = typeof DefaultTheme;
  5 +
  6 +export const light: Theme = {
  7 + dark: false,
  8 + colors: {
  9 + primary: rainbow.teal.light,
  10 + background: 'rgb(242, 242, 242)',
  11 + card: 'rgb(255, 255, 255)',
  12 + text: 'rgb(28, 28, 30)',
  13 + border: 'rgb(224, 224, 224)',
  14 + },
  15 +};
  16 +
  17 +export const dark: Theme = {
  18 + dark: true,
  19 + colors: {
  20 + primary: rainbow.teal.dark,
  21 + background: 'rgb(1, 1, 1)',
  22 + card: 'rgb(18, 18, 18)',
  23 + text: 'rgb(229, 229, 231)',
  24 + border: 'rgb(39, 39, 41)',
  25 + },
  26 +};
@@ -13,10 +13,9 @@ import Ionicons from 'react-native-vector-icons/Ionicons'; @@ -13,10 +13,9 @@ import Ionicons from 'react-native-vector-icons/Ionicons';
13 import { MainTabParamList, MainStackParamList } from '../type/Navigation'; 13 import { MainTabParamList, MainStackParamList } from '../type/Navigation';
14 import SystemInfo from './SystemInfo'; 14 import SystemInfo from './SystemInfo';
15 import DesignList from './DesignList'; 15 import DesignList from './DesignList';
16 -import { useDynamicValue } from 'react-native-dark-mode'; 16 +import { useDarkMode } from 'react-native-dark-mode';
17 -import { colorPreset } from '../design'; 17 +import { themeForNav } from '../design';
18 import RNDeviceInfoList from './RNDeviceInfo'; 18 import RNDeviceInfoList from './RNDeviceInfo';
19 -import { StyleSheet } from 'react-native';  
20 19
21 const MainTab = createBottomTabNavigator<MainTabParamList>(); 20 const MainTab = createBottomTabNavigator<MainTabParamList>();
22 21
@@ -33,9 +32,6 @@ function getTabHeader( @@ -33,9 +32,6 @@ function getTabHeader(
33 } 32 }
34 33
35 const Home = () => { 34 const Home = () => {
36 - const backgroundColor = useDynamicValue(colorPreset.backgroundColor.primary);  
37 - const tintColor = useDynamicValue(colorPreset.linkColor);  
38 - const opaqueSeparator = useDynamicValue(colorPreset.separator.opaque);  
39 return ( 35 return (
40 <MainTab.Navigator 36 <MainTab.Navigator
41 screenOptions={({ route }) => { 37 screenOptions={({ route }) => {
@@ -69,13 +65,6 @@ const Home = () => { @@ -69,13 +65,6 @@ const Home = () => {
69 }, 65 },
70 }; 66 };
71 }} 67 }}
72 - tabBarOptions={{  
73 - activeTintColor: tintColor,  
74 - style: {  
75 - backgroundColor: backgroundColor,  
76 - borderTopColor: opaqueSeparator,  
77 - },  
78 - }}  
79 > 68 >
80 <MainTab.Screen name="SystemInfo" component={SystemInfo} /> 69 <MainTab.Screen name="SystemInfo" component={SystemInfo} />
81 <MainTab.Screen name="DesignList" component={DesignList} /> 70 <MainTab.Screen name="DesignList" component={DesignList} />
@@ -86,20 +75,13 @@ const Home = () => { @@ -86,20 +75,13 @@ const Home = () => {
86 const MainStack = createStackNavigator<MainStackParamList>(); 75 const MainStack = createStackNavigator<MainStackParamList>();
87 76
88 export default () => { 77 export default () => {
89 - const backgroundColor = useDynamicValue(colorPreset.backgroundColor.primary); 78 + const inDarkMode = useDarkMode();
90 - const primaryLabelColor = useDynamicValue(colorPreset.labelColor.primary);  
91 - const opaqueSeparator = useDynamicValue(colorPreset.separator.opaque);  
92 return ( 79 return (
93 - <NavigationContainer> 80 + <NavigationContainer
  81 + theme={inDarkMode ? themeForNav.dark : themeForNav.light}
  82 + >
94 <MainStack.Navigator 83 <MainStack.Navigator
95 screenOptions={{ 84 screenOptions={{
96 - headerStyle: {  
97 - backgroundColor,  
98 - shadowOffset: { width: 0, height: 0 },  
99 - borderBottomColor: opaqueSeparator,  
100 - borderBottomWidth: StyleSheet.hairlineWidth,  
101 - },  
102 - headerTintColor: primaryLabelColor,  
103 headerStyleInterpolator: HeaderStyleInterpolators.forUIKit, 85 headerStyleInterpolator: HeaderStyleInterpolators.forUIKit,
104 }} 86 }}
105 > 87 >
1 import React from 'react'; 1 import React from 'react';
2 import { Text, View, StyleSheet } from 'react-native'; 2 import { Text, View, StyleSheet } from 'react-native';
3 -import { BGScroll } from '../component/View/background'; 3 +import { BGScroll, BGSection } from '../component/View/background';
4 import { colorPreset } from '../design'; 4 import { colorPreset } from '../design';
5 import { 5 import {
6 useDynamicStyleSheet, 6 useDynamicStyleSheet,
7 useDynamicValue, 7 useDynamicValue,
8 DynamicStyleSheet, 8 DynamicStyleSheet,
9 useDarkMode, 9 useDarkMode,
  10 + useDarkModeContext,
10 } from 'react-native-dark-mode'; 11 } from 'react-native-dark-mode';
  12 +import { ListItem, Divider, Card } from '../component/View';
11 13
12 const dynamicStyles = new DynamicStyleSheet({ 14 const dynamicStyles = new DynamicStyleSheet({
13 - primaryLabel: { color: colorPreset.labelColor.primary }, 15 + rightSquare: { width: 40, height: 40 },
14 - secondaryLabel: { color: colorPreset.labelColor.secondary },  
15 - tertiaryLabel: { color: colorPreset.labelColor.tertiary },  
16 - quaternaryLabel: { color: colorPreset.labelColor.quaternary },  
17 - central: { justifyContent: 'center', alignItems: 'center' },  
18 - primaryBG: {  
19 - backgroundColor: colorPreset.backgroundColor.primary,  
20 - borderWidth: StyleSheet.hairlineWidth,  
21 - borderColor: colorPreset.separator.opaque,  
22 - width: 240,  
23 - height: 100,  
24 - },  
25 - secondaryBG: {  
26 - backgroundColor: colorPreset.backgroundColor.secondary,  
27 - width: 200,  
28 - height: 80,  
29 - },  
30 - tertiaryBG: {  
31 - backgroundColor: colorPreset.backgroundColor.tertiary,  
32 - width: 160,  
33 - height: 60,  
34 - },  
35 - primaryGroupedBG: {  
36 - backgroundColor: colorPreset.groupedBackgroundColor.primary,  
37 - borderWidth: StyleSheet.hairlineWidth,  
38 - borderColor: colorPreset.separator.opaque,  
39 - width: 240,  
40 - height: 100,  
41 - },  
42 - secondaryGroupedBG: {  
43 - backgroundColor: colorPreset.groupedBackgroundColor.secondary,  
44 - width: 200,  
45 - height: 80,  
46 - },  
47 - tertiaryGroupedBG: {  
48 - backgroundColor: colorPreset.groupedBackgroundColor.tertiary,  
49 - width: 160,  
50 - height: 60,  
51 - },  
52 }); 16 });
  17 +const { labelColor, rainbow } = colorPreset;
53 18
54 -export default () => { 19 +const DesignList = () => {
55 const styles = useDynamicStyleSheet(dynamicStyles); 20 const styles = useDynamicStyleSheet(dynamicStyles);
56 - const inDarkMode = useDarkMode(); 21 + const currentMode = useDarkModeContext();
57 return ( 22 return (
58 <BGScroll> 23 <BGScroll>
59 - <Text style={styles.primaryLabel}>Primary Label</Text> 24 + <Card round>
60 - <Text style={styles.secondaryLabel}>Secondary Label</Text> 25 + {Object.keys(labelColor).map((name) => {
61 - <Text style={styles.tertiaryLabel}>Tertiary Label</Text> 26 + return (
62 - <Text style={styles.quaternaryLabel}>Quaternary Label</Text> 27 + <ListItem
63 - <View style={[styles.primaryBG, styles.central]}> 28 + title={name}
64 - <View style={[styles.secondaryBG, styles.central]}> 29 + key={name}
65 - <View style={[styles.tertiaryBG, styles.central]}> 30 + titleStyle={{
66 - <Text style={styles.primaryLabel}>Background</Text> 31 + color: labelColor[name as keyof typeof labelColor][currentMode],
67 - </View> 32 + }}
68 - </View> 33 + />
69 - </View> 34 + );
70 - <View style={[styles.primaryGroupedBG, styles.central]}> 35 + })}
71 - <View style={[styles.secondaryGroupedBG, styles.central]}> 36 + </Card>
72 - <View style={[styles.tertiaryGroupedBG, styles.central]}> 37 + <Card round>
73 - <Text style={styles.primaryLabel}> 38 + {Object.keys(rainbow).map((name) => {
74 - {'Grouped Background' + 39 + const color = rainbow[name as keyof typeof rainbow];
75 - (inDarkMode ? ', same as background in dark mode' : '')} 40 + return (
76 - </Text> 41 + <ListItem
77 - </View> 42 + title={name}
78 - </View> 43 + key={name}
79 - </View> 44 + titleStyle={{
  45 + color: color[currentMode],
  46 + }}
  47 + rightElement={
  48 + <>
  49 + <View
  50 + style={[
  51 + styles.rightSquare,
  52 + { backgroundColor: color.light },
  53 + ]}
  54 + />
  55 + <View
  56 + style={[
  57 + styles.rightSquare,
  58 + { backgroundColor: color.dark },
  59 + ]}
  60 + />
  61 + </>
  62 + }
  63 + />
  64 + );
  65 + })}
  66 + </Card>
80 </BGScroll> 67 </BGScroll>
81 ); 68 );
82 }; 69 };
  70 +DesignList.whyDidYouRender = true;
  71 +export default DesignList;
@@ -6,7 +6,10 @@ import { MainTabScreenProps } from '../type/Navigation'; @@ -6,7 +6,10 @@ import { MainTabScreenProps } from '../type/Navigation';
6 6
7 declare var global: { HermesInternal: null | {} }; 7 declare var global: { HermesInternal: null | {} };
8 8
9 -export default ({ navigation, route }: MainTabScreenProps<'SystemInfo'>) => { 9 +const SystemInfo = ({
  10 + navigation,
  11 + route,
  12 +}: MainTabScreenProps<'SystemInfo'>) => {
10 const { width, height, fontScale, scale } = useWindowDimensions(); 13 const { width, height, fontScale, scale } = useWindowDimensions();
11 return ( 14 return (
12 <BGScroll white> 15 <BGScroll white>
@@ -49,3 +52,5 @@ export default ({ navigation, route }: MainTabScreenProps<'SystemInfo'>) => { @@ -49,3 +52,5 @@ export default ({ navigation, route }: MainTabScreenProps<'SystemInfo'>) => {
49 </BGScroll> 52 </BGScroll>
50 ); 53 );
51 }; 54 };
  55 +
  56 +export default SystemInfo;
@@ -841,6 +841,14 @@ @@ -841,6 +841,14 @@
841 dependencies: 841 dependencies:
842 "@hapi/hoek" "^8.3.0" 842 "@hapi/hoek" "^8.3.0"
843 843
  844 +"@huse/previous-value@^1.0.1":
  845 + version "1.0.1"
  846 + resolved "https://registry.npm.taobao.org/@huse/previous-value/download/@huse/previous-value-1.0.1.tgz#77807e59b26e2cd86ebb6aac295163a71bbf1099"
  847 + integrity sha1-d4B+WbJuLNhuu2qsKVFjpxu/EJk=
  848 + dependencies:
  849 + fast-deep-equal "^3.1.1"
  850 + shallowequal "^1.1.0"
  851 +
844 "@jest/console@^24.7.1", "@jest/console@^24.9.0": 852 "@jest/console@^24.7.1", "@jest/console@^24.9.0":
845 version "24.9.0" 853 version "24.9.0"
846 resolved "https://registry.npm.taobao.org/@jest/console/download/@jest/console-24.9.0.tgz?cache=0&sync_timestamp=1585823724080&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40jest%2Fconsole%2Fdownload%2F%40jest%2Fconsole-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0" 854 resolved "https://registry.npm.taobao.org/@jest/console/download/@jest/console-24.9.0.tgz?cache=0&sync_timestamp=1585823724080&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40jest%2Fconsole%2Fdownload%2F%40jest%2Fconsole-24.9.0.tgz#79b1bc06fb74a8cfb01cbdedf945584b1b9707f0"
@@ -1388,6 +1396,13 @@ @@ -1388,6 +1396,13 @@
1388 semver "^6.3.0" 1396 semver "^6.3.0"
1389 tsutils "^3.17.1" 1397 tsutils "^3.17.1"
1390 1398
  1399 +"@welldone-software/why-did-you-render@^4.0.7":
  1400 + version "4.0.7"
  1401 + resolved "https://registry.npm.taobao.org/@welldone-software/why-did-you-render/download/@welldone-software/why-did-you-render-4.0.7.tgz#13c81eef665a34911c029dff821b23cd2495567b"
  1402 + integrity sha1-E8ge72ZaNJEcAp3/ghsjzSSVVns=
  1403 + dependencies:
  1404 + lodash "^4"
  1405 +
1391 JSONStream@^1.0.4: 1406 JSONStream@^1.0.4:
1392 version "1.3.5" 1407 version "1.3.5"
1393 resolved "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0" 1408 resolved "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
@@ -5271,7 +5286,7 @@ lodash.throttle@^4.1.1: @@ -5271,7 +5286,7 @@ lodash.throttle@^4.1.1:
5271 resolved "https://registry.npm.taobao.org/lodash.throttle/download/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4" 5286 resolved "https://registry.npm.taobao.org/lodash.throttle/download/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
5272 integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ= 5287 integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
5273 5288
5274 -lodash@4.17.15, lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0: 5289 +lodash@4.17.15, lodash@^4, lodash@^4.0.0, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.12, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.4, lodash@^4.2.1, lodash@^4.3.0:
5275 version "4.17.15" 5290 version "4.17.15"
5276 resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.15.tgz?cache=0&sync_timestamp=1571657272199&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" 5291 resolved "https://registry.npm.taobao.org/lodash/download/lodash-4.17.15.tgz?cache=0&sync_timestamp=1571657272199&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Flodash%2Fdownload%2Flodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"
5277 integrity sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg= 5292 integrity sha1-tEf2ZwoEVbv+7dETku/zMOoJdUg=
@@ -7261,6 +7276,11 @@ setprototypeof@1.1.1: @@ -7261,6 +7276,11 @@ setprototypeof@1.1.1:
7261 resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683" 7276 resolved "https://registry.npm.taobao.org/setprototypeof/download/setprototypeof-1.1.1.tgz#7e95acb24aa92f5885e0abef5ba131330d4ae683"
7262 integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM= 7277 integrity sha1-fpWsskqpL1iF4KvvW6ExMw1K5oM=
7263 7278
  7279 +shallowequal@^1.1.0:
  7280 + version "1.1.0"
  7281 + resolved "https://registry.npm.taobao.org/shallowequal/download/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8"
  7282 + integrity sha1-GI1SHelbkIdAT9TctosT3wrk5/g=
  7283 +
7264 shebang-command@^1.2.0: 7284 shebang-command@^1.2.0:
7265 version "1.2.0" 7285 version "1.2.0"
7266 resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 7286 resolved "https://registry.npm.taobao.org/shebang-command/download/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"