@mpxjs/core 2.10.16-beta.3 → 2.10.16-beta.6
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/@types/global.d.ts +1 -1
- package/@types/index.d.ts +8 -1
- package/package.json +3 -3
- package/src/convertor/convertor.js +3 -1
- package/src/convertor/getConvertMode.js +2 -1
- package/src/convertor/wxToKs.js +21 -0
- package/src/core/proxy.js +6 -6
- package/src/platform/builtInMixins/renderHelperMixin.js +4 -4
- package/src/platform/createApp.ios.js +3 -3
- package/src/platform/patch/getDefaultOptions.ios.js +1 -1
- package/src/platform/env/nav.js +0 -137
package/@types/global.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// declaration for mpx mode
|
|
2
|
-
declare let __mpx_mode__: 'wx' | 'ali' | 'swan' | 'qq' | 'tt' | 'web' | 'dd' | 'qa' | 'jd' | 'android' | 'ios' | 'harmony'
|
|
2
|
+
declare let __mpx_mode__: 'wx' | 'ali' | 'swan' | 'qq' | 'tt' | 'web' | 'dd' | 'qa' | 'jd' | 'android' | 'ios' | 'harmony' | 'ks'
|
|
3
3
|
|
|
4
4
|
// declaration for mpx env
|
|
5
5
|
declare let __mpx_env__: string
|
package/@types/index.d.ts
CHANGED
|
@@ -381,6 +381,13 @@ export interface RnConfig {
|
|
|
381
381
|
* @param packages 分包名数组
|
|
382
382
|
*/
|
|
383
383
|
downloadChunkAsync?: (packages: Array<string>) => void
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* bundle 中是否关闭 android 键盘避让功能,如果关闭需要将该配置设置为 false,使用 mpx 内置的键盘避让逻辑
|
|
387
|
+
* @platform android
|
|
388
|
+
* @default true
|
|
389
|
+
*/
|
|
390
|
+
enableNativeKeyboardAvoiding?: boolean
|
|
384
391
|
}
|
|
385
392
|
|
|
386
393
|
interface MpxConfig {
|
|
@@ -405,7 +412,7 @@ interface MpxConfig {
|
|
|
405
412
|
rnConfig: RnConfig,
|
|
406
413
|
}
|
|
407
414
|
|
|
408
|
-
type SupportedMode = 'wx' | 'ali' | 'qq' | 'swan' | 'tt' | 'web' | 'qa'
|
|
415
|
+
type SupportedMode = 'wx' | 'ali' | 'qq' | 'swan' | 'tt' | 'web' | 'qa'| 'ks' | 'jd' | 'dd'
|
|
409
416
|
|
|
410
417
|
interface ImplementOptions {
|
|
411
418
|
modes?: Array<SupportedMode>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mpxjs/core",
|
|
3
|
-
"version": "2.10.16-beta.
|
|
3
|
+
"version": "2.10.16-beta.6",
|
|
4
4
|
"description": "mpx runtime core",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"miniprogram",
|
|
@@ -25,8 +25,8 @@
|
|
|
25
25
|
},
|
|
26
26
|
"peerDependencies": {
|
|
27
27
|
"@d11/react-native-fast-image": "*",
|
|
28
|
-
"@mpxjs/api-proxy": "
|
|
29
|
-
"@mpxjs/store": "
|
|
28
|
+
"@mpxjs/api-proxy": "^2.9.0",
|
|
29
|
+
"@mpxjs/store": "^2.9.0",
|
|
30
30
|
"@react-navigation/native": "*",
|
|
31
31
|
"@react-navigation/native-stack": "*",
|
|
32
32
|
"react": "*",
|
|
@@ -9,6 +9,7 @@ import wxToTtRule from './wxToTt'
|
|
|
9
9
|
import wxToDdRule from './wxToDd'
|
|
10
10
|
import wxToJdRule from './wxToJd'
|
|
11
11
|
import wxToReactRule from './wxToReact'
|
|
12
|
+
import wxToKsRule from './wxToKs'
|
|
12
13
|
|
|
13
14
|
/**
|
|
14
15
|
* 转换规则包含四点
|
|
@@ -38,7 +39,8 @@ const rulesMap = {
|
|
|
38
39
|
wxToJd: extend({}, defaultConvertRule, wxToJdRule),
|
|
39
40
|
wxToIos: extend({}, defaultConvertRule, wxToReactRule),
|
|
40
41
|
wxToAndroid: extend({}, defaultConvertRule, wxToReactRule),
|
|
41
|
-
wxToHarmony: extend({}, defaultConvertRule, wxToReactRule)
|
|
42
|
+
wxToHarmony: extend({}, defaultConvertRule, wxToReactRule),
|
|
43
|
+
wxToKs: extend({}, defaultConvertRule, wxToKsRule)
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
export function getConvertRule (convertMode) {
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { error } from '@mpxjs/utils'
|
|
2
|
+
|
|
3
|
+
const BEHAVIORS_MAP = [
|
|
4
|
+
'wx://form-field',
|
|
5
|
+
'wx://form-field-group',
|
|
6
|
+
'wx://form-field-button',
|
|
7
|
+
'wx://component-export'
|
|
8
|
+
]
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
convert (options) {
|
|
12
|
+
if (options.behaviors) {
|
|
13
|
+
options.behaviors.forEach((behavior, idx) => {
|
|
14
|
+
if (BEHAVIORS_MAP.includes(behavior)) {
|
|
15
|
+
error(`Built-in behavior "${behavior}" is not supported in ks environment!`, global.currentResource || global.currentModuleId)
|
|
16
|
+
options.behaviors.splice(idx, 1)
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
}
|
package/src/core/proxy.js
CHANGED
|
@@ -731,10 +731,10 @@ export default class MpxProxy {
|
|
|
731
731
|
initRender () {
|
|
732
732
|
if (this.options.__nativeRender__) return this.doRender()
|
|
733
733
|
|
|
734
|
-
const
|
|
735
|
-
const
|
|
736
|
-
const
|
|
737
|
-
const
|
|
734
|
+
const mpx_i = this.target.mpx_i.bind(this.target)
|
|
735
|
+
const mpx_c = this.target.mpx_c.bind(this.target)
|
|
736
|
+
const mpx_r = this.target.mpx_r.bind(this.target)
|
|
737
|
+
const mpx_sc = this.target.mpx_sc.bind(this.target)
|
|
738
738
|
const _g = this.target._g?.bind(this.target)
|
|
739
739
|
const __getAst = this.target.__getAst?.bind(this.target)
|
|
740
740
|
const moduleId = this.target.__moduleId
|
|
@@ -748,7 +748,7 @@ export default class MpxProxy {
|
|
|
748
748
|
if (dynamicTarget || __getAst) {
|
|
749
749
|
try {
|
|
750
750
|
const ast = getAst(__getAst, moduleId)
|
|
751
|
-
return
|
|
751
|
+
return mpx_r(false, _g(ast, moduleId))
|
|
752
752
|
} catch (e) {
|
|
753
753
|
e.errType = 'mpx-dynamic-render'
|
|
754
754
|
e.errmsg = e.message
|
|
@@ -761,7 +761,7 @@ export default class MpxProxy {
|
|
|
761
761
|
}
|
|
762
762
|
if (this.target.__injectedRender) {
|
|
763
763
|
try {
|
|
764
|
-
return this.target.__injectedRender(
|
|
764
|
+
return this.target.__injectedRender(mpx_i, mpx_c, mpx_r, mpx_sc)
|
|
765
765
|
} catch (e) {
|
|
766
766
|
warn('Failed to execute render function, degrade to full-set-data mode.', this.options.mpxFileResource, e)
|
|
767
767
|
this.render()
|
|
@@ -3,7 +3,7 @@ import { getByPath, hasOwn, isObject } from '@mpxjs/utils'
|
|
|
3
3
|
export default function renderHelperMixin () {
|
|
4
4
|
return {
|
|
5
5
|
methods: {
|
|
6
|
-
|
|
6
|
+
mpx_i (val, handler) {
|
|
7
7
|
let i, l, keys, key
|
|
8
8
|
if (Array.isArray(val) || typeof val === 'string') {
|
|
9
9
|
for (i = 0, l = val.length; i < l; i++) {
|
|
@@ -22,7 +22,7 @@ export default function renderHelperMixin () {
|
|
|
22
22
|
}
|
|
23
23
|
},
|
|
24
24
|
// collect
|
|
25
|
-
|
|
25
|
+
mpx_c (key, value) {
|
|
26
26
|
if (hasOwn(this.__mpxProxy.renderData, key)) {
|
|
27
27
|
return this.__mpxProxy.renderData[key]
|
|
28
28
|
}
|
|
@@ -33,10 +33,10 @@ export default function renderHelperMixin () {
|
|
|
33
33
|
return value
|
|
34
34
|
},
|
|
35
35
|
// simple collect
|
|
36
|
-
|
|
36
|
+
mpx_sc (key) {
|
|
37
37
|
return (this.__mpxProxy.renderData[key] = this[key])
|
|
38
38
|
},
|
|
39
|
-
|
|
39
|
+
mpx_r (skipPre, vnode) {
|
|
40
40
|
this.__mpxProxy.renderWithData(skipPre, vnode)
|
|
41
41
|
}
|
|
42
42
|
}
|
|
@@ -10,7 +10,7 @@ import { createElement, memo, useRef, useEffect } from 'react'
|
|
|
10
10
|
import * as ReactNative from 'react-native'
|
|
11
11
|
import { initAppProvides } from './export/inject'
|
|
12
12
|
import { NavigationContainer, createNativeStackNavigator, SafeAreaProvider, GestureHandlerRootView } from './env/navigationHelper'
|
|
13
|
-
import
|
|
13
|
+
import MpxNav from '@mpxjs/webpack-plugin/lib/runtime/components/react/dist/mpx-nav'
|
|
14
14
|
|
|
15
15
|
const appHooksMap = makeMap(mergeLifecycle(LIFECYCLE).app)
|
|
16
16
|
|
|
@@ -66,8 +66,8 @@ export default function createApp (options) {
|
|
|
66
66
|
flex: 1
|
|
67
67
|
}
|
|
68
68
|
},
|
|
69
|
-
createElement(
|
|
70
|
-
pageConfig
|
|
69
|
+
createElement(MpxNav, {
|
|
70
|
+
pageConfig,
|
|
71
71
|
navigation
|
|
72
72
|
}),
|
|
73
73
|
children
|
|
@@ -17,7 +17,7 @@ import {
|
|
|
17
17
|
RouteContext
|
|
18
18
|
} from '@mpxjs/webpack-plugin/lib/runtime/components/react/dist/context'
|
|
19
19
|
import { PortalHost, useSafeAreaInsets } from '../env/navigationHelper'
|
|
20
|
-
import { useInnerHeaderHeight } from '
|
|
20
|
+
import { useInnerHeaderHeight } from '@mpxjs/webpack-plugin/lib/runtime/components/react/dist/mpx-nav'
|
|
21
21
|
|
|
22
22
|
function getSystemInfo () {
|
|
23
23
|
const windowDimensions = ReactNative.Dimensions.get('window')
|
package/src/platform/env/nav.js
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
import { createElement, useState, useMemo, memo } from 'react'
|
|
2
|
-
import { useSafeAreaInsets } from 'react-native-safe-area-context'
|
|
3
|
-
import { StatusBar, processColor, TouchableWithoutFeedback, Image, View, StyleSheet, Text } from 'react-native'
|
|
4
|
-
import Mpx from '../../index'
|
|
5
|
-
|
|
6
|
-
function convertToHex (color) {
|
|
7
|
-
try {
|
|
8
|
-
const intColor = processColor(color)
|
|
9
|
-
if (intColor === null || intColor === undefined) {
|
|
10
|
-
return null
|
|
11
|
-
}
|
|
12
|
-
// 将32位整数颜色值转换为RGBA
|
|
13
|
-
const r = (intColor >> 16) & 255
|
|
14
|
-
const g = (intColor >> 8) & 255
|
|
15
|
-
const b = intColor & 255
|
|
16
|
-
// 转换为十六进制
|
|
17
|
-
const hexR = r.toString(16).padStart(2, '0')
|
|
18
|
-
const hexG = g.toString(16).padStart(2, '0')
|
|
19
|
-
const hexB = b.toString(16).padStart(2, '0')
|
|
20
|
-
return `#${hexR}${hexG}${hexB}`
|
|
21
|
-
} catch (error) {
|
|
22
|
-
return null
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const titleHeight = 44
|
|
27
|
-
export function useInnerHeaderHeight (pageconfig) {
|
|
28
|
-
if (pageconfig.navigationStyle === 'custom') {
|
|
29
|
-
return 0
|
|
30
|
-
} else {
|
|
31
|
-
const safeAreaTop = useSafeAreaInsets()?.top || 0
|
|
32
|
-
const headerHeight = safeAreaTop + titleHeight
|
|
33
|
-
return headerHeight
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
const styles = StyleSheet.create({
|
|
38
|
-
header: {
|
|
39
|
-
elevation: 3
|
|
40
|
-
},
|
|
41
|
-
headerContent: {
|
|
42
|
-
flexDirection: 'row',
|
|
43
|
-
alignItems: 'center',
|
|
44
|
-
justifyContent: 'center'
|
|
45
|
-
},
|
|
46
|
-
backButton: {
|
|
47
|
-
position: 'absolute',
|
|
48
|
-
height: '100%',
|
|
49
|
-
width: 40,
|
|
50
|
-
left: 0,
|
|
51
|
-
top: 0,
|
|
52
|
-
alignItems: 'center',
|
|
53
|
-
justifyContent: 'center'
|
|
54
|
-
},
|
|
55
|
-
backButtonImage: {
|
|
56
|
-
width: 22,
|
|
57
|
-
height: 22
|
|
58
|
-
},
|
|
59
|
-
title: {
|
|
60
|
-
fontSize: 17,
|
|
61
|
-
fontWeight: 600,
|
|
62
|
-
width: '60%',
|
|
63
|
-
textAlign: 'center'
|
|
64
|
-
}
|
|
65
|
-
})
|
|
66
|
-
const NavColor = {
|
|
67
|
-
White: '#ffffff',
|
|
68
|
-
Black: '#000000'
|
|
69
|
-
}
|
|
70
|
-
// navigationBarTextStyle只支持黑白'white'/'black
|
|
71
|
-
const validBarTextStyle = (textStyle) => {
|
|
72
|
-
const textStyleColor = convertToHex(textStyle)
|
|
73
|
-
if (textStyle && [NavColor.White, NavColor.Black].includes(textStyleColor)) {
|
|
74
|
-
return textStyleColor
|
|
75
|
-
} else {
|
|
76
|
-
return NavColor.White
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
export const innerNav = memo(({ pageConfig, navigation }) => {
|
|
80
|
-
const [innerPageConfig, setPageConfig] = useState(pageConfig || {})
|
|
81
|
-
navigation.setPageConfig = (config) => {
|
|
82
|
-
const newConfig = Object.assign({}, innerPageConfig, config)
|
|
83
|
-
setPageConfig(newConfig)
|
|
84
|
-
}
|
|
85
|
-
const isCustom = innerPageConfig.navigationStyle === 'custom'
|
|
86
|
-
const navigationBarTextStyle = useMemo(() => validBarTextStyle(innerPageConfig.navigationBarTextStyle), [innerPageConfig.navigationBarTextStyle])
|
|
87
|
-
// 状态栏的颜色
|
|
88
|
-
const statusBarElement = createElement(StatusBar, {
|
|
89
|
-
translucent: true,
|
|
90
|
-
backgroundColor: 'transparent',
|
|
91
|
-
barStyle: (navigationBarTextStyle === NavColor.White) ? 'light-content' : 'dark-content' // 'default'/'light-content'/'dark-content'
|
|
92
|
-
})
|
|
93
|
-
|
|
94
|
-
if (isCustom) return statusBarElement
|
|
95
|
-
const safeAreaTop = useSafeAreaInsets()?.top || 0
|
|
96
|
-
// 假设是栈导航,获取栈的长度
|
|
97
|
-
const stackLength = navigation.getState()?.routes?.length
|
|
98
|
-
const onStackTopBack = Mpx.config?.rnConfig?.onStackTopBack
|
|
99
|
-
const isHandleStackTopBack = typeof onStackTopBack === 'function'
|
|
100
|
-
|
|
101
|
-
// 回退按钮与图标
|
|
102
|
-
const backElement = stackLength > 1 || isHandleStackTopBack
|
|
103
|
-
? createElement(TouchableWithoutFeedback, {
|
|
104
|
-
onPress: () => {
|
|
105
|
-
if (stackLength <= 1 && isHandleStackTopBack) {
|
|
106
|
-
onStackTopBack()
|
|
107
|
-
return
|
|
108
|
-
}
|
|
109
|
-
navigation.goBack()
|
|
110
|
-
}
|
|
111
|
-
}, createElement(View, {
|
|
112
|
-
style: [styles.backButton]
|
|
113
|
-
}, createElement(Image, {
|
|
114
|
-
source: { uri: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAABICAYAAACqT5alAAAA2UlEQVR4nO3bMQrCUBRE0Yla6AYEN2nnBrTL+izcitW3MRDkEUWSvPzJvfCqgMwhZbAppWhNbbIHzB1g9wATERFRVyvpkj1irlpJ5X326D7WHh1hbdFD2CLpLmmftm7kfsEe09aNHFiBrT+wAlt/YAW2/sAKbP2BFdj6Ayuwy+ufz6XPL893krZ//O6iu2n4LT8kndLWTRTo4EC7BDo40C6BDg60S6CDA+0S6OBAuwQ6uNWiD2nrJmoIfU7cNWkR2hbb1UfbY7uuWhGWiIg+a/iHuHmA3QPs3gu4JW9Gan+OJAAAAABJRU5ErkJggg==' },
|
|
115
|
-
// 回退按钮的颜色与设置的title文案颜色一致
|
|
116
|
-
style: [styles.backButtonImage, { tintColor: navigationBarTextStyle }]
|
|
117
|
-
})
|
|
118
|
-
))
|
|
119
|
-
: null
|
|
120
|
-
|
|
121
|
-
return createElement(View, {
|
|
122
|
-
style: [styles.header, {
|
|
123
|
-
paddingTop: safeAreaTop,
|
|
124
|
-
backgroundColor: innerPageConfig.navigationBarBackgroundColor || '#000000'
|
|
125
|
-
}]
|
|
126
|
-
},
|
|
127
|
-
statusBarElement,
|
|
128
|
-
createElement(View, {
|
|
129
|
-
style: styles.headerContent,
|
|
130
|
-
height: titleHeight
|
|
131
|
-
}, backElement,
|
|
132
|
-
createElement(Text, {
|
|
133
|
-
style: [styles.title, { color: navigationBarTextStyle }],
|
|
134
|
-
numberOfLines: 1
|
|
135
|
-
}, innerPageConfig.navigationBarTitleText?.trim() || ''))
|
|
136
|
-
)
|
|
137
|
-
})
|