Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
DCloud
uni-app
提交
839c76d7
U
uni-app
项目概览
DCloud
/
uni-app
13 天 前同步成功
通知
751
Star
38709
Fork
3642
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
8
列表
看板
标记
里程碑
合并请求
1
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
U
uni-app
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
8
Issue
8
列表
看板
标记
里程碑
合并请求
1
合并请求
1
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
839c76d7
编写于
9月 21, 2022
作者:
fxy060608
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
wip(uts): compiler
上级
089a3bc6
变更
17
展开全部
隐藏空白更改
内联
并排
Showing
17 changed file
with
1294 addition
and
825 deletion
+1294
-825
package.json
package.json
+1
-0
packages/shims-node.d.ts
packages/shims-node.d.ts
+0
-1
packages/uni-app-plus/dist/uni-app-view.umd.js
packages/uni-app-plus/dist/uni-app-view.umd.js
+1
-1
packages/uni-cli-shared/src/resolve.ts
packages/uni-cli-shared/src/resolve.ts
+33
-10
packages/uni-h5/dist/uni-h5.cjs.js
packages/uni-h5/dist/uni-h5.cjs.js
+304
-167
packages/uni-h5/dist/uni-h5.es.js
packages/uni-h5/dist/uni-h5.es.js
+361
-260
packages/uni-uts-vite/src/plugins/v1.ts
packages/uni-uts-vite/src/plugins/v1.ts
+76
-317
packages/uni-uts-vite/src/utils/compiler/code.ts
packages/uni-uts-vite/src/utils/compiler/code.ts
+422
-0
packages/uni-uts-vite/src/utils/compiler/index.ts
packages/uni-uts-vite/src/utils/compiler/index.ts
+7
-5
packages/uni-uts-vite/src/utils/compiler/kotlin.ts
packages/uni-uts-vite/src/utils/compiler/kotlin.ts
+60
-45
packages/uni-uts-vite/src/utils/compiler/swift.ts
packages/uni-uts-vite/src/utils/compiler/swift.ts
+15
-10
packages/uts-darwin-arm64/uts.darwin-arm64.node
packages/uts-darwin-arm64/uts.darwin-arm64.node
+0
-0
packages/uts-darwin-x64/uts.darwin-x64.node
packages/uts-darwin-x64/uts.darwin-x64.node
+0
-0
packages/uts-win32-ia32-msvc/uts.win32-ia32-msvc.node
packages/uts-win32-ia32-msvc/uts.win32-ia32-msvc.node
+0
-0
packages/uts-win32-x64-msvc/uts.win32-x64-msvc.node
packages/uts-win32-x64-msvc/uts.win32-x64-msvc.node
+0
-0
packages/vite-plugin-uni/src/cli/utils.ts
packages/vite-plugin-uni/src/cli/utils.ts
+7
-4
packages/vite-plugin-uni/src/configResolved/plugins/resolveId.ts
...s/vite-plugin-uni/src/configResolved/plugins/resolveId.ts
+7
-5
未找到文件。
package.json
浏览文件 @
839c76d7
...
...
@@ -5,6 +5,7 @@
"packages/*"
],
"scripts"
:
{
"all"
:
"npm run lint && npm run format && npm run build && npm run test"
,
"clean"
:
"rm -rf node_modules **/*/node_modules && pnpm install"
,
"build"
:
"node scripts/build.js"
,
"build:h5"
:
"node scripts/build.js uni-app uni-cli-shared uni-h5 uni-i18n uni-stat uni-shared uni-h5-vite vite-plugin-uni"
,
...
...
packages/shims-node.d.ts
浏览文件 @
839c76d7
...
...
@@ -8,7 +8,6 @@ declare namespace NodeJS {
UNI_NODE_ENV
:
'
production
'
|
'
development
'
|
'
test
'
UNI_PLATFORM
:
UniApp
.
PLATFORM
UNI_SUB_PLATFORM
:
'
quickapp-webview-huawei
'
|
'
quickapp-webview-union
'
UNI_APP_PLATFORM
:
'
android
'
|
'
ios
'
UNI_UTS_PLATFORM
:
'
app-android
'
|
'
app-ios
'
|
'
web
'
|
UniApp
.
PLATFORM
UNI_INPUT_DIR
:
string
...
...
packages/uni-app-plus/dist/uni-app-view.umd.js
浏览文件 @
839c76d7
此差异已折叠。
点击以展开。
packages/uni-cli-shared/src/resolve.ts
浏览文件 @
839c76d7
...
...
@@ -120,12 +120,44 @@ export function resolveComponentsLibPath() {
return
componentsLibPath
}
/**
* 解析 app 平台的 uts 插件,任意平台(android|ios)存在即可
* @param id
* @param importer
* @returns
*/
export
function
resolveUtsAppModule
(
id
:
string
,
importer
:
string
)
{
id
=
path
.
resolve
(
importer
,
id
)
if
(
id
.
includes
(
'
utssdk
'
)
||
id
.
includes
(
'
uni_modules
'
))
{
const
parts
=
normalizePath
(
id
).
split
(
'
/
'
)
const
parentDir
=
parts
[
parts
.
length
-
2
]
if
(
parentDir
===
'
uni_modules
'
||
parentDir
===
'
utssdk
'
)
{
if
(
fs
.
existsSync
(
path
.
resolve
(
id
,
'
index.uts
'
)))
{
return
id
}
const
resolvePlatformDir
=
(
p
:
typeof
process
.
env
.
UNI_UTS_PLATFORM
)
=>
{
return
path
.
resolve
(
id
,
parentDir
===
'
uni_modules
'
?
'
utssdk
'
:
''
,
p
)
}
const
extname
=
[
'
.uts
'
]
if
(
resolveUtsFile
(
resolvePlatformDir
(
'
app-android
'
),
extname
))
{
return
id
}
if
(
resolveUtsFile
(
resolvePlatformDir
(
'
app-ios
'
),
extname
))
{
return
id
}
}
}
}
// 仅限 root/uni_modules/test-plugin | root/utssdk/test-plugin 格式
export
function
resolveUtsModule
(
id
:
string
,
importer
:
string
,
platform
:
typeof
process
.
env
.
UNI_UTS_PLATFORM
)
{
if
(
process
.
env
.
UNI_PLATFORM
===
'
app
'
)
{
return
}
id
=
path
.
resolve
(
importer
,
id
)
if
(
id
.
includes
(
'
utssdk
'
)
||
id
.
includes
(
'
uni_modules
'
))
{
const
parts
=
normalizePath
(
id
).
split
(
'
/
'
)
...
...
@@ -134,10 +166,7 @@ export function resolveUtsModule(
const
resolvePlatformDir
=
(
p
:
typeof
process
.
env
.
UNI_UTS_PLATFORM
)
=>
{
return
path
.
resolve
(
id
,
parentDir
===
'
uni_modules
'
?
'
utssdk
'
:
''
,
p
)
}
// 未指定具体的平台
if
(
platform
===
'
app
'
)
{
platform
=
'
app-android
'
}
let
index
=
resolveUtsFile
(
resolvePlatformDir
(
platform
))
if
(
index
)
{
return
index
...
...
@@ -146,12 +175,6 @@ export function resolveUtsModule(
if
(
fs
.
existsSync
(
index
))
{
return
index
}
// 如果是 android 或 ios,本平台没有,则查找一下另一个平台
if
(
platform
===
'
app-android
'
)
{
return
resolveUtsFile
(
resolvePlatformDir
(
'
app-ios
'
))
}
else
if
(
platform
===
'
app-ios
'
)
{
return
resolveUtsFile
(
resolvePlatformDir
(
'
app-android
'
))
}
}
}
}
...
...
packages/uni-h5/dist/uni-h5.cjs.js
浏览文件 @
839c76d7
...
...
@@ -3992,25 +3992,10 @@ function _getPx(val) {
}
return Number(val) || 0;
}
function
useMovableView
State
(
props2
,
trigger
,
rootRef
)
{
function useMovableView
Layout(rootRef, _scale, _adjustScale
) {
const movableAreaWidth = vue.inject("movableAreaWidth", vue.ref(0));
const movableAreaHeight = vue.inject("movableAreaHeight", vue.ref(0));
const
_isMounted
=
vue
.
inject
(
"
_isMounted
"
,
vue
.
ref
(
false
));
const movableAreaRootRef = vue.inject("movableAreaRootRef");
vue
.
inject
(
"
addMovableViewContext
"
,
()
=>
{
});
vue
.
inject
(
"
removeMovableViewContext
"
,
()
=>
{
});
const
xSync
=
vue
.
ref
(
_getPx
(
props2
.
x
));
const
ySync
=
vue
.
ref
(
_getPx
(
props2
.
y
));
const
scaleValueSync
=
vue
.
ref
(
Number
(
props2
.
scaleValue
)
||
1
);
const
width
=
vue
.
ref
(
0
);
const
height
=
vue
.
ref
(
0
);
const
minX
=
vue
.
ref
(
0
);
const
minY
=
vue
.
ref
(
0
);
const
maxX
=
vue
.
ref
(
0
);
const
maxY
=
vue
.
ref
(
0
);
let
_SFA
=
null
;
const _offset = {
x: 0,
y: 0
...
...
@@ -4019,29 +4004,57 @@ function useMovableViewState(props2, trigger, rootRef) {
x: 0,
y: 0
};
let
_scale
=
1
;
let
_translateX
=
0
;
let
_translateY
=
0
;
const width = vue.ref(0);
const height = vue.ref(0);
const minX = vue.ref(0);
const minY = vue.ref(0);
const maxX = vue.ref(0);
const maxY = vue.ref(0);
function _updateBoundary() {
let x = 0 - _offset.x + _scaleOffset.x;
let _width = movableAreaWidth.value - width.value - _offset.x - _scaleOffset.x;
minX.value = Math.min(x, _width);
maxX.value = Math.max(x, _width);
let y = 0 - _offset.y + _scaleOffset.y;
let _height = movableAreaHeight.value - height.value - _offset.y - _scaleOffset.y;
minY.value = Math.min(y, _height);
maxY.value = Math.max(y, _height);
}
function _updateOffset() {
_offset.x = p(rootRef.value, movableAreaRootRef.value);
_offset.y = f(rootRef.value, movableAreaRootRef.value);
}
function _updateWH(scale) {
scale = scale || _scale.value;
scale = _adjustScale(scale);
let rect = rootRef.value.getBoundingClientRect();
height.value = rect.height / _scale.value;
width.value = rect.width / _scale.value;
let _height = height.value * scale;
let _width = width.value * scale;
_scaleOffset.x = (_width - width.value) / 2;
_scaleOffset.y = (_height - height.value) / 2;
}
return {
_updateBoundary,
_updateOffset,
_updateWH,
_scaleOffset,
minX,
minY,
maxX,
maxY
};
}
function useMovableViewTransform(rootRef, props2, _scaleOffset, _scale, maxX, maxY, minX, minY, _translateX, _translateY, _SFA, _FA, _adjustScale, trigger) {
const dampingNumber = vue.computed(() => {
let val = Number(props2.damping);
return isNaN(val) ? 20 : val;
});
const
frictionNumber
=
vue
.
computed
(()
=>
{
let
val
=
Number
(
props2
.
friction
);
return
isNaN
(
val
)
||
val
<=
0
?
2
:
val
;
});
const
scaleMinNumber
=
vue
.
computed
(()
=>
{
let
val
=
Number
(
props2
.
scaleMin
);
return
isNaN
(
val
)
?
0.5
:
val
;
});
const
scaleMaxNumber
=
vue
.
computed
(()
=>
{
let
val
=
Number
(
props2
.
scaleMax
);
return
isNaN
(
val
)
?
10
:
val
;
});
const xMove = vue.computed(() => props2.direction === "all" || props2.direction === "horizontal");
const yMove = vue.computed(() => props2.direction === "all" || props2.direction === "vertical");
const
_STD
=
new
STD
(
1
,
9
*
Math
.
pow
(
dampingNumber
.
value
,
2
)
/
40
,
dampingNumber
.
value
);
new
Friction
(
1
,
frictionNumber
.
value
);
const
xSync = vue.ref(_getPx(props2.x)
);
const ySync = vue.ref(_getPx(props2.y)
);
vue.watch(() => props2.x, (val) => {
xSync.value = _getPx(val);
});
...
...
@@ -4054,78 +4067,7 @@ function useMovableViewState(props2, trigger, rootRef) {
vue.watch(ySync, (val) => {
_setY(val);
});
vue
.
watch
(()
=>
props2
.
disabled
,
()
=>
{
__handleTouchStart
();
});
vue
.
watch
(()
=>
props2
.
scaleValue
,
(
val
)
=>
{
scaleValueSync
.
value
=
Number
(
val
)
||
0
;
});
vue
.
watch
(
scaleValueSync
,
(
val
)
=>
{
_setScaleValue
(
val
);
});
vue
.
watch
(
scaleMinNumber
,
()
=>
{
_setScaleMinOrMax
();
});
vue
.
watch
(
scaleMaxNumber
,
()
=>
{
_setScaleMinOrMax
();
});
function
FAandSFACancel
()
{
if
(
_SFA
)
{
_SFA
.
cancel
();
}
}
function
_setX
(
val
)
{
if
(
xMove
.
value
)
{
if
(
val
+
_scaleOffset
.
x
===
_translateX
)
{
return
_translateX
;
}
else
{
if
(
_SFA
)
{
_SFA
.
cancel
();
}
_animationTo
(
val
+
_scaleOffset
.
x
,
ySync
.
value
+
_scaleOffset
.
y
,
_scale
);
}
}
return
val
;
}
function
_setY
(
val
)
{
if
(
yMove
.
value
)
{
if
(
val
+
_scaleOffset
.
y
===
_translateY
)
{
return
_translateY
;
}
else
{
if
(
_SFA
)
{
_SFA
.
cancel
();
}
_animationTo
(
xSync
.
value
+
_scaleOffset
.
x
,
val
+
_scaleOffset
.
y
,
_scale
);
}
}
return
val
;
}
function
_setScaleMinOrMax
()
{
if
(
!
props2
.
scale
)
{
return
false
;
}
_updateScale
(
_scale
,
true
);
}
function
_setScaleValue
(
scale
)
{
if
(
!
props2
.
scale
)
{
return
false
;
}
scale
=
_adjustScale
(
scale
);
_updateScale
(
scale
,
true
);
return
scale
;
}
function
__handleTouchStart
()
{
{
if
(
!
props2
.
disabled
)
{
FAandSFACancel
();
if
(
xMove
.
value
)
;
if
(
yMove
.
value
)
;
rootRef
.
value
.
style
.
willChange
=
"
transform
"
;
}
}
}
const _STD = new STD(1, 9 * Math.pow(dampingNumber.value, 2) / 40, dampingNumber.value);
function _getLimitXY(x, y) {
let outOfBounds = false;
if (x > maxX.value) {
...
...
@@ -4152,63 +4094,24 @@ function useMovableViewState(props2, trigger, rootRef) {
outOfBounds
};
}
function
_updateOffset
()
{
_offset
.
x
=
p
(
rootRef
.
value
,
movableAreaRootRef
.
value
);
_offset
.
y
=
f
(
rootRef
.
value
,
movableAreaRootRef
.
value
);
}
function
_updateWH
(
scale
)
{
scale
=
scale
||
_scale
;
scale
=
_adjustScale
(
scale
);
let
rect
=
rootRef
.
value
.
getBoundingClientRect
();
height
.
value
=
rect
.
height
/
_scale
;
width
.
value
=
rect
.
width
/
_scale
;
let
_height
=
height
.
value
*
scale
;
let
_width
=
width
.
value
*
scale
;
_scaleOffset
.
x
=
(
_width
-
width
.
value
)
/
2
;
_scaleOffset
.
y
=
(
_height
-
height
.
value
)
/
2
;
}
function
_updateBoundary
()
{
let
x
=
0
-
_offset
.
x
+
_scaleOffset
.
x
;
let
_width
=
movableAreaWidth
.
value
-
width
.
value
-
_offset
.
x
-
_scaleOffset
.
x
;
minX
.
value
=
Math
.
min
(
x
,
_width
);
maxX
.
value
=
Math
.
max
(
x
,
_width
);
let
y
=
0
-
_offset
.
y
+
_scaleOffset
.
y
;
let
_height
=
movableAreaHeight
.
value
-
height
.
value
-
_offset
.
y
-
_scaleOffset
.
y
;
minY
.
value
=
Math
.
min
(
y
,
_height
);
maxY
.
value
=
Math
.
max
(
y
,
_height
);
}
function
_updateScale
(
scale
,
animat
)
{
if
(
props2
.
scale
)
{
scale
=
_adjustScale
(
scale
);
_updateWH
(
scale
);
_updateBoundary
();
const
limitXY
=
_getLimitXY
(
_translateX
,
_translateY
);
const
x
=
limitXY
.
x
;
const
y
=
limitXY
.
y
;
if
(
animat
)
{
_animationTo
(
x
,
y
,
scale
,
""
,
true
,
true
);
}
else
{
_requestAnimationFrame
(
function
()
{
_setTransform
(
x
,
y
,
scale
,
""
,
true
,
true
);
});
}
function FAandSFACancel() {
if (_FA) {
_FA.cancel();
}
if (_SFA) {
_SFA.cancel();
}
}
function
_adjustScale
(
scale
)
{
scale
=
Math
.
max
(
0.5
,
scaleMinNumber
.
value
,
scale
);
scale
=
Math
.
min
(
10
,
scaleMaxNumber
.
value
,
scale
);
return
scale
;
}
function _animationTo(x, y, scale, source, r, o) {
FAandSFACancel();
if (!xMove.value) {
x
=
_translateX
;
x = _translateX
.value
;
}
if (!yMove.value) {
y
=
_translateY
;
y = _translateY
.value
;
}
if (!props2.scale) {
scale
=
_scale
;
scale = _scale
.value
;
}
let limitXY = _getLimitXY(x, y);
x = limitXY.x;
...
...
@@ -4220,9 +4123,9 @@ function useMovableViewState(props2, trigger, rootRef) {
_STD._springX._solution = null;
_STD._springY._solution = null;
_STD._springScale._solution = null;
_STD
.
_springX
.
_endPosition
=
_translateX
;
_STD
.
_springY
.
_endPosition
=
_translateY
;
_STD
.
_springScale
.
_endPosition
=
_scale
;
_STD._springX._endPosition = _translateX
.value
;
_STD._springY._endPosition = _translateY
.value
;
_STD._springScale._endPosition = _scale
.value
;
_STD.setEnd(x, y, scale, 1);
_SFA = g(_STD, function() {
let data = _STD.x();
...
...
@@ -4236,15 +4139,15 @@ function useMovableViewState(props2, trigger, rootRef) {
}
function _setTransform(x, y, scale, source = "", r, o) {
if (!(x !== null && x.toString() !== "NaN" && typeof x === "number")) {
x
=
_translateX
||
0
;
x = _translateX
.value
|| 0;
}
if (!(y !== null && y.toString() !== "NaN" && typeof y === "number")) {
y
=
_translateY
||
0
;
y = _translateY
.value
|| 0;
}
x = Number(x.toFixed(1));
y = Number(y.toFixed(1));
scale = Number(scale.toFixed(1));
if
(
!
(
_translateX
===
x
&&
_translateY
===
y
))
{
if (!(_translateX
.value === x && _translateY.value
=== y)) {
if (!r) {
trigger("change", {}, {
x: v(x, _scaleOffset.x),
...
...
@@ -4254,11 +4157,11 @@ function useMovableViewState(props2, trigger, rootRef) {
}
}
if (!props2.scale) {
scale
=
_scale
;
scale = _scale
.value
;
}
scale = _adjustScale(scale);
scale = +scale.toFixed(3);
if
(
o
&&
scale
!==
_scale
)
{
if (o && scale !== _scale
.value
) {
trigger("scale", {}, {
x,
y,
...
...
@@ -4268,9 +4171,244 @@ function useMovableViewState(props2, trigger, rootRef) {
let transform = "translateX(" + x + "px) translateY(" + y + "px) translateZ(0px) scale(" + scale + ")";
rootRef.value.style.transform = transform;
rootRef.value.style.webkitTransform = transform;
_translateX
=
x
;
_translateY
=
y
;
_scale
=
scale
;
_translateX.value = x;
_translateY.value = y;
_scale.value = scale;
}
function _revise(source) {
let limitXY = _getLimitXY(_translateX.value, _translateY.value);
let x = limitXY.x;
let y = limitXY.y;
let outOfBounds = limitXY.outOfBounds;
if (outOfBounds) {
_animationTo(x, y, _scale.value, source);
}
return outOfBounds;
}
function _setX(val) {
if (xMove.value) {
if (val + _scaleOffset.x === _translateX.value) {
return _translateX;
} else {
if (_SFA) {
_SFA.cancel();
}
_animationTo(val + _scaleOffset.x, ySync.value + _scaleOffset.y, _scale.value);
}
}
return val;
}
function _setY(val) {
if (yMove.value) {
if (val + _scaleOffset.y === _translateY.value) {
return _translateY;
} else {
if (_SFA) {
_SFA.cancel();
}
_animationTo(xSync.value + _scaleOffset.x, val + _scaleOffset.y, _scale.value);
}
}
return val;
}
return {
FAandSFACancel,
_getLimitXY,
_animationTo,
_setTransform,
_revise,
dampingNumber,
xMove,
yMove,
xSync,
ySync,
_STD
};
}
function useMovableViewInit(props2, rootRef, trigger, _scale, _oldScale, _isScaling, _translateX, _translateY, _SFA, _FA) {
const scaleMinNumber = vue.computed(() => {
let val = Number(props2.scaleMin);
return isNaN(val) ? 0.5 : val;
});
const scaleMaxNumber = vue.computed(() => {
let val = Number(props2.scaleMax);
return isNaN(val) ? 10 : val;
});
const scaleValueSync = vue.ref(Number(props2.scaleValue) || 1);
vue.watch(scaleValueSync, (val) => {
_setScaleValue(val);
});
vue.watch(scaleMinNumber, () => {
_setScaleMinOrMax();
});
vue.watch(scaleMaxNumber, () => {
_setScaleMinOrMax();
});
vue.watch(() => props2.scaleValue, (val) => {
scaleValueSync.value = Number(val) || 0;
});
const {
_updateBoundary,
_updateOffset,
_updateWH,
_scaleOffset,
minX,
minY,
maxX,
maxY
} = useMovableViewLayout(rootRef, _scale, _adjustScale);
const {
FAandSFACancel,
_getLimitXY,
_animationTo,
_setTransform,
_revise,
dampingNumber,
xMove,
yMove,
xSync,
ySync,
_STD
} = useMovableViewTransform(rootRef, props2, _scaleOffset, _scale, maxX, maxY, minX, minY, _translateX, _translateY, _SFA, _FA, _adjustScale, trigger);
function _updateScale(scale, animat) {
if (props2.scale) {
scale = _adjustScale(scale);
_updateWH(scale);
_updateBoundary();
const limitXY = _getLimitXY(_translateX.value, _translateY.value);
const x = limitXY.x;
const y = limitXY.y;
if (animat) {
_animationTo(x, y, scale, "", true, true);
} else {
_requestAnimationFrame(function() {
_setTransform(x, y, scale, "", true, true);
});
}
}
}
function _beginScale() {
_isScaling.value = true;
}
function _updateOldScale(scale) {
_oldScale.value = scale;
}
function _adjustScale(scale) {
scale = Math.max(0.5, scaleMinNumber.value, scale);
scale = Math.min(10, scaleMaxNumber.value, scale);
return scale;
}
function _setScaleMinOrMax() {
if (!props2.scale) {
return false;
}
_updateScale(_scale.value, true);
_updateOldScale(_scale.value);
}
function _setScaleValue(scale) {
if (!props2.scale) {
return false;
}
scale = _adjustScale(scale);
_updateScale(scale, true);
_updateOldScale(scale);
return scale;
}
function _endScale() {
_isScaling.value = false;
_updateOldScale(_scale.value);
}
function _setScale(scale) {
if (scale) {
scale = _oldScale.value * scale;
_beginScale();
_updateScale(scale);
}
}
return {
_updateOldScale,
_endScale,
_setScale,
scaleValueSync,
_updateBoundary,
_updateOffset,
_updateWH,
_scaleOffset,
minX,
minY,
maxX,
maxY,
FAandSFACancel,
_getLimitXY,
_animationTo,
_setTransform,
_revise,
dampingNumber,
xMove,
yMove,
xSync,
ySync,
_STD
};
}
function useMovableViewState(props2, trigger, rootRef) {
const _isMounted = vue.inject("_isMounted", vue.ref(false));
vue.inject("addMovableViewContext", () => {
});
vue.inject("removeMovableViewContext", () => {
});
let _scale = vue.ref(1);
let _oldScale = vue.ref(1);
let _isScaling = vue.ref(false);
let _translateX = vue.ref(0);
let _translateY = vue.ref(0);
let _SFA = null;
let _FA = null;
const frictionNumber = vue.computed(() => {
let val = Number(props2.friction);
return isNaN(val) || val <= 0 ? 2 : val;
});
new Friction(1, frictionNumber.value);
vue.watch(() => props2.disabled, () => {
__handleTouchStart();
});
const {
_updateOldScale,
_endScale,
_setScale,
scaleValueSync,
_updateBoundary,
_updateOffset,
_updateWH,
_scaleOffset,
minX,
minY,
maxX,
maxY,
FAandSFACancel,
_getLimitXY,
_setTransform,
_revise,
dampingNumber,
xMove,
yMove,
xSync,
ySync,
_STD
} = useMovableViewInit(props2, rootRef, trigger, _scale, _oldScale, _isScaling, _translateX, _translateY, _SFA, _FA);
function __handleTouchStart() {
if (!_isScaling.value) {
if (!props2.disabled) {
FAandSFACancel();
if (xMove.value) {
_translateX.value;
}
if (yMove.value) {
_translateY.value;
}
rootRef.value.style.willChange = "transform";
}
}
}
function setParent() {
if (!_isMounted.value) {
...
...
@@ -4281,12 +4419,11 @@ function useMovableViewState(props2, trigger, rootRef) {
_updateOffset();
_updateWH(scale);
_updateBoundary();
_translateX
=
xSync
.
value
+
_scaleOffset
.
x
;
_translateY
=
ySync
.
value
+
_scaleOffset
.
y
;
let
limitXY
=
_getLimitXY
(
_translateX
,
_translateY
);
let limitXY = _getLimitXY(xSync.value + _scaleOffset.x, ySync.value + _scaleOffset.y);
let x = limitXY.x;
let y = limitXY.y;
_setTransform(x, y, scale, "", true);
_updateOldScale(scale);
}
return {
setParent
...
...
packages/uni-h5/dist/uni-h5.es.js
浏览文件 @
839c76d7
此差异已折叠。
点击以展开。
packages/uni-uts-vite/src/plugins/v1.ts
浏览文件 @
839c76d7
import
type
{
Plugin
}
from
'
vite
'
import
path
from
'
path
'
import
{
isInHBuilderX
,
parseVueRequest
}
from
'
@dcloudio/uni-cli-shared
'
import
{
BindingIdentifier
,
ClassDeclaration
,
ClassExpression
,
Expression
,
FunctionDeclaration
,
FunctionExpression
,
Identifier
,
Module
,
Param
,
TsTypeAnnotation
,
VariableDeclaration
,
}
from
'
../../types/types
'
import
{
getCompiler
}
from
'
../utils/compiler
'
import
{
createResolveTypeReferenceName
,
resolvePackage
,
}
from
'
../utils/compiler/utils
'
import
{
parseVueRequest
,
resolveUtsAppModule
}
from
'
@dcloudio/uni-cli-shared
'
import
{
getCompiler
,
genProxyCode
}
from
'
../utils/compiler
'
import
{
resolvePackage
}
from
'
../utils/compiler/utils
'
import
{
resolvePlatformIndex
,
resolveRootIndex
}
from
'
../utils/compiler/code
'
const
UTSProxyRE
=
/
\?
uts-proxy$/
function
isUTSProxy
(
id
:
string
)
{
return
UTSProxyRE
.
test
(
id
)
}
export
function
uniUtsV1Plugin
():
Plugin
{
let
isFirst
=
true
return
{
name
:
'
uni:uts-v1
'
,
apply
:
'
build
'
,
enforce
:
'
pre
'
,
resolveId
(
id
,
importer
)
{
const
module
=
resolveUtsAppModule
(
id
,
importer
?
path
.
dirname
(
importer
)
:
process
.
env
.
UNI_INPUT_DIR
)
if
(
module
)
{
// prefix the polyfill id with \0 to tell other plugins not to try to load or transform it
return
'
\
0
'
+
module
+
'
?uts-proxy
'
}
},
load
(
id
)
{
if
(
isUTSProxy
(
id
))
{
return
''
}
},
async
transform
(
code
,
id
,
opts
)
{
if
(
opts
&&
opts
.
ssr
)
{
return
}
// 目前仅支持 app-android|app-ios
if
(
process
.
env
.
UNI_UTS_PLATFORM
!==
'
app
'
&&
process
.
env
.
UNI_UTS_PLATFORM
!==
'
app-android
'
&&
process
.
env
.
UNI_UTS_PLATFORM
!==
'
app-ios
'
)
{
if
(
!
isUTSProxy
(
id
))
{
return
}
const
{
filename
}
=
parseVueRequest
(
id
)
if
(
path
.
extname
(
filename
)
!==
'
.uts
'
)
{
return
}
const
{
compile
}
=
getCompiler
(
process
.
env
.
UNI_UTS_PLATFORM
===
'
app-ios
'
?
'
swift
'
:
'
kotlin
'
)
const
pkg
=
resolvePackage
(
filename
)
const
{
filename
:
module
}
=
parseVueRequest
(
id
.
replace
(
'
\
0
'
,
''
))
const
pkg
=
resolvePackage
(
module
)
if
(
!
pkg
)
{
return
}
// 懒加载 uts 编译器
// eslint-disable-next-line no-restricted-globals
const
{
parse
}
=
require
(
'
@dcloudio/uts
'
)
const
ast
=
await
parse
(
code
,
{
noColor
:
isInHBuilderX
()
})
code
=
`
import { initUtsProxyClass, initUtsProxyFunction, initUtsPackageName, initUtsClassName } from '@dcloudio/uni-app'
const name = '
${
pkg
.
name
}
'
const is_uni_modules =
${
pkg
.
is_uni_modules
}
const pkg = initUtsPackageName(name, is_uni_modules)
const cls = initUtsClassName(name, is_uni_modules)
${
genProxyCode
(
ast
,
createResolveTypeReferenceName
(
pkg
.
namespace
,
ast
))}
`
// 平台不匹配,不走平台代码编译,仅生成js代码
if
(
process
.
env
.
UNI_UTS_PLATFORM
===
'
app
'
||
(
process
.
env
.
UNI_UTS_PLATFORM
===
'
app-android
'
&&
id
.
includes
(
'
app-ios
'
))
||
(
process
.
env
.
UNI_UTS_PLATFORM
===
'
app-ios
'
&&
id
.
includes
(
'
app-android
'
))
)
{
return
code
}
const
res
=
await
compile
(
id
)
if
(
process
.
env
.
UNI_UTS_PLATFORM
===
'
app-android
'
)
{
if
(
!
isFirst
&&
res
)
{
const
files
=
[]
if
(
process
.
env
.
UNI_APP_CHANGED_DEX_FILES
)
{
try
{
files
.
push
(...
JSON
.
parse
(
process
.
env
.
UNI_APP_CHANGED_DEX_FILES
))
}
catch
(
e
)
{}
code
=
await
genProxyCode
(
module
,
pkg
)
if
(
process
.
env
.
NODE_ENV
!==
'
development
'
)
{
// 生产模式 支持同时生成 android 和 ios 的 uts 插件
if
(
process
.
env
.
UNI_UTS_PLATFORM
===
'
app-android
'
||
process
.
env
.
UNI_UTS_PLATFORM
===
'
app
'
)
{
const
filename
=
resolvePlatformIndex
(
'
app-android
'
,
module
,
pkg
)
||
resolveRootIndex
(
module
)
if
(
filename
)
{
await
getCompiler
(
'
kotlin
'
).
runProd
(
filename
)
}
}
if
(
process
.
env
.
UNI_UTS_PLATFORM
===
'
app-ios
'
||
process
.
env
.
UNI_UTS_PLATFORM
===
'
app
'
)
{
const
filename
=
resolvePlatformIndex
(
'
app-ios
'
,
module
,
pkg
)
||
resolveRootIndex
(
module
)
if
(
filename
)
{
await
getCompiler
(
'
swift
'
).
runProd
(
filename
)
}
}
}
else
{
// dev 模式仅 android 支持
if
(
process
.
env
.
UNI_UTS_PLATFORM
===
'
app-android
'
)
{
const
filename
=
resolvePlatformIndex
(
'
app-android
'
,
module
,
pkg
)
||
resolveRootIndex
(
module
)
if
(
filename
)
{
const
res
=
await
getCompiler
(
'
kotlin
'
).
runDev
(
filename
)
if
(
!
isFirst
&&
res
)
{
const
files
=
[]
if
(
process
.
env
.
UNI_APP_CHANGED_DEX_FILES
)
{
try
{
files
.
push
(
...
JSON
.
parse
(
process
.
env
.
UNI_APP_CHANGED_DEX_FILES
)
)
}
catch
(
e
)
{}
}
files
.
push
(
res
)
process
.
env
.
UNI_APP_CHANGED_DEX_FILES
=
JSON
.
stringify
([
...
new
Set
(
files
),
])
}
}
files
.
push
(
res
)
process
.
env
.
UNI_APP_CHANGED_DEX_FILES
=
JSON
.
stringify
([
...
new
Set
(
files
),
])
}
}
return
code
...
...
@@ -93,253 +102,3 @@ ${genProxyCode(ast, createResolveTypeReferenceName(pkg.namespace, ast))}
},
}
}
function
genProxyFunctionCode
(
method
:
string
,
async
:
boolean
,
params
:
Parameter
[],
isDefault
:
boolean
=
false
)
{
if
(
isDefault
)
{
return
`export default initUtsProxyFunction(
${
async
}
, { package: pkg, class: cls, name: '
${
method
}
', params:
${
JSON
.
stringify
(
params
)}
})`
}
return
`export const
${
method
}
= initUtsProxyFunction(
${
async
}
, { package: pkg, class: cls, name: '
${
method
}
', params:
${
JSON
.
stringify
(
params
)}
})`
}
function
genProxyClassCode
(
cls
:
string
,
options
:
{
constructor
:
{
params
:
Parameter
[]
}
methods
:
Record
<
string
,
any
>
staticMethods
:
Record
<
string
,
any
>
props
:
string
[]
staticProps
:
string
[]
},
isDefault
:
boolean
=
false
)
{
if
(
isDefault
)
{
return
`export default initUtsProxyClass({ package: pkg, class: '
${
cls
}
', ...
${
JSON
.
stringify
(
options
)}
})`
}
return
`export const
${
cls
}
= initUtsProxyClass({ package: pkg, class: '
${
cls
}
', ...
${
JSON
.
stringify
(
options
)}
})`
}
interface
Parameter
{
name
:
string
type
:
string
}
type
ResolveTypeReferenceName
=
(
name
:
string
)
=>
string
function
resolveIdentifierType
(
ident
:
BindingIdentifier
,
resolveTypeReferenceName
:
ResolveTypeReferenceName
)
{
if
(
ident
.
typeAnnotation
)
{
const
{
typeAnnotation
}
=
ident
.
typeAnnotation
if
(
typeAnnotation
.
type
===
'
TsKeywordType
'
)
{
return
typeAnnotation
.
kind
}
else
if
(
typeAnnotation
.
type
===
'
TsFunctionType
'
)
{
return
'
UTSCallback
'
}
else
if
(
typeAnnotation
.
type
===
'
TsTypeReference
'
&&
typeAnnotation
.
typeName
.
type
===
'
Identifier
'
)
{
return
resolveTypeReferenceName
(
typeAnnotation
.
typeName
.
value
)
}
}
return
''
}
function
resolveFunctionParams
(
params
:
Param
[],
resolveTypeReferenceName
:
ResolveTypeReferenceName
)
{
const
result
:
Parameter
[]
=
[]
params
.
forEach
(({
pat
})
=>
{
if
(
pat
.
type
===
'
Identifier
'
)
{
result
.
push
({
name
:
pat
.
value
,
type
:
resolveIdentifierType
(
pat
as
BindingIdentifier
,
resolveTypeReferenceName
),
})
}
else
{
result
.
push
({
name
:
''
,
type
:
''
})
}
})
return
result
}
function
genFunctionDeclarationCode
(
decl
:
FunctionDeclaration
|
FunctionExpression
,
resolveTypeReferenceName
:
ResolveTypeReferenceName
,
isDefault
:
boolean
=
false
)
{
return
genProxyFunctionCode
(
decl
.
identifier
!
.
value
,
decl
.
async
||
isReturnPromise
(
decl
.
returnType
),
resolveFunctionParams
(
decl
.
params
,
resolveTypeReferenceName
),
isDefault
)
}
function
genClassDeclarationCode
(
decl
:
ClassDeclaration
|
ClassExpression
,
resolveTypeReferenceName
:
ResolveTypeReferenceName
,
isDefault
:
boolean
=
false
)
{
const
cls
=
decl
.
identifier
!
.
value
const
constructor
:
{
params
:
Parameter
[]
}
=
{
params
:
[]
}
const
methods
:
Record
<
string
,
{
async
?:
boolean
;
params
:
Parameter
[]
}
>
=
{}
const
staticMethods
:
Record
<
string
,
{
async
?:
boolean
;
params
:
Parameter
[]
}
>
=
{}
const
props
:
string
[]
=
[]
const
staticProps
:
string
[]
=
[]
decl
.
body
.
forEach
((
item
)
=>
{
if
(
item
.
type
===
'
Constructor
'
)
{
constructor
.
params
=
resolveFunctionParams
(
item
.
params
as
Param
[],
resolveTypeReferenceName
)
}
else
if
(
item
.
type
===
'
ClassMethod
'
)
{
if
(
item
.
key
.
type
===
'
Identifier
'
)
{
const
name
=
item
.
key
.
value
const
value
=
{
async
:
item
.
function
.
async
||
isReturnPromise
(
item
.
function
.
returnType
),
params
:
resolveFunctionParams
(
item
.
function
.
params
,
resolveTypeReferenceName
),
}
if
(
item
.
isStatic
)
{
staticMethods
[
name
]
=
value
}
else
{
methods
[
name
]
=
value
}
}
}
else
if
(
item
.
type
===
'
ClassProperty
'
)
{
if
(
item
.
key
.
type
===
'
Identifier
'
)
{
if
(
item
.
isStatic
)
{
staticProps
.
push
(
item
.
key
.
value
)
}
else
{
props
.
push
(
item
.
key
.
value
)
}
}
}
})
return
genProxyClassCode
(
cls
,
{
constructor
,
methods
,
staticMethods
,
props
,
staticProps
},
isDefault
)
}
function
genInitCode
(
expr
:
Expression
)
{
switch
(
expr
.
type
)
{
case
'
BooleanLiteral
'
:
return
expr
.
value
+
''
case
'
NumericLiteral
'
:
return
expr
.
value
+
''
case
'
StringLiteral
'
:
return
expr
.
value
}
return
''
}
function
genVariableDeclarationCode
(
decl
:
VariableDeclaration
)
{
// 目前仅支持 const 的 boolean,number,string
const
lits
=
[
'
BooleanLiteral
'
,
'
NumericLiteral
'
,
'
StringLiteral
'
]
if
(
decl
.
kind
===
'
const
'
&&
!
decl
.
declarations
.
find
((
d
)
=>
{
if
(
d
.
id
.
type
!==
'
Identifier
'
)
{
return
true
}
if
(
!
d
.
init
)
{
return
true
}
const
type
=
d
.
init
.
type
if
(
!
lits
.
includes
(
type
))
{
return
true
}
return
false
})
)
{
return
`export
${
decl
.
kind
}
${
decl
.
declarations
.
map
((
d
)
=>
`
${(
d
.
id
as
Identifier
).
value
}
=
${
genInitCode
(
d
.
init
!
)}
`
)
.
join
(
'
,
'
)}
`
}
}
function
genProxyCode
(
{
body
}:
Module
,
resolveTypeReferenceName
:
ResolveTypeReferenceName
)
{
const
codes
:
string
[]
=
[]
body
.
forEach
((
item
)
=>
{
let
code
:
string
|
undefined
if
(
item
.
type
===
'
ExportDeclaration
'
)
{
const
decl
=
item
.
declaration
switch
(
decl
.
type
)
{
case
'
FunctionDeclaration
'
:
code
=
genFunctionDeclarationCode
(
decl
,
resolveTypeReferenceName
,
false
)
break
case
'
ClassDeclaration
'
:
code
=
genClassDeclarationCode
(
decl
,
resolveTypeReferenceName
,
false
)
break
case
'
VariableDeclaration
'
:
code
=
genVariableDeclarationCode
(
decl
)
break
}
}
else
if
(
item
.
type
===
'
ExportDefaultDeclaration
'
)
{
const
decl
=
item
.
decl
if
(
decl
.
type
===
'
ClassExpression
'
)
{
if
(
decl
.
identifier
)
{
// export default class test{}
code
=
genClassDeclarationCode
(
decl
,
resolveTypeReferenceName
,
false
)
}
}
else
if
(
decl
.
type
===
'
FunctionExpression
'
)
{
if
(
decl
.
identifier
)
{
code
=
genFunctionDeclarationCode
(
decl
,
resolveTypeReferenceName
,
true
)
}
}
}
if
(
code
)
{
codes
.
push
(
code
)
}
})
return
codes
.
join
(
`\n`
)
}
function
isReturnPromise
(
anno
?:
TsTypeAnnotation
)
{
if
(
!
anno
)
{
return
false
}
const
{
typeAnnotation
}
=
anno
return
(
typeAnnotation
.
type
===
'
TsTypeReference
'
&&
typeAnnotation
.
typeName
.
type
===
'
Identifier
'
&&
typeAnnotation
.
typeName
.
value
===
'
Promise
'
)
}
packages/uni-uts-vite/src/utils/compiler/code.ts
0 → 100644
浏览文件 @
839c76d7
import
fs
from
'
fs
'
import
path
from
'
path
'
import
{
isInHBuilderX
}
from
'
@dcloudio/uni-cli-shared
'
import
{
BindingIdentifier
,
ClassDeclaration
,
ClassExpression
,
Expression
,
FunctionDeclaration
,
FunctionExpression
,
Identifier
,
Module
,
Param
,
TsTypeAnnotation
,
VariableDeclaration
,
}
from
'
../../../types/types
'
import
{
createResolveTypeReferenceName
}
from
'
./utils
'
interface
GenProxyCodeOptions
{
is_uni_modules
:
boolean
name
:
string
namespace
:
string
}
export
async
function
genProxyCode
(
module
:
string
,
options
:
GenProxyCodeOptions
)
{
const
{
name
,
is_uni_modules
}
=
options
return
`
import { initUtsProxyClass, initUtsProxyFunction, initUtsPackageName, initUtsClassName } from '@dcloudio/uni-app'
const name = '
${
name
}
'
const is_uni_modules =
${
is_uni_modules
}
const pkg = initUtsPackageName(name, is_uni_modules)
const cls = initUtsClassName(name, is_uni_modules)
${
genModuleCode
(
await
parseModuleDecls
(
module
,
options
))}
`
}
export
function
resolveRootIndex
(
module
:
string
)
{
const
filename
=
path
.
resolve
(
module
,
'
index.uts
'
)
return
fs
.
existsSync
(
filename
)
&&
filename
}
export
function
resolvePlatformIndex
(
platform
:
'
app-android
'
|
'
app-ios
'
,
module
:
string
,
options
:
GenProxyCodeOptions
)
{
const
filename
=
path
.
resolve
(
module
,
options
.
is_uni_modules
?
'
utssdk
'
:
''
,
platform
,
'
index.uts
'
)
return
fs
.
existsSync
(
filename
)
&&
filename
}
function
genModuleCode
(
decls
:
ProxyDecl
[])
{
const
codes
:
string
[]
=
[]
decls
.
forEach
((
decl
)
=>
{
if
(
decl
.
type
===
'
Class
'
)
{
if
(
decl
.
isDefault
)
{
codes
.
push
(
`export default initUtsProxyClass({ package: pkg, class: '
${
decl
.
cls
}
', ...
${
JSON
.
stringify
(
decl
.
options
)}
})`
)
}
else
{
codes
.
push
(
`export const
${
decl
.
cls
}
= initUtsProxyClass({ package: pkg, class: '
${
decl
.
cls
}
', ...
${
JSON
.
stringify
(
decl
.
options
)}
})`
)
}
}
else
if
(
decl
.
type
===
'
FunctionDeclaration
'
)
{
if
(
decl
.
isDefault
)
{
codes
.
push
(
`export default initUtsProxyFunction(
${
decl
.
async
}
, { package: pkg, class: cls, name: '
${
decl
.
method
}
', params:
${
JSON
.
stringify
(
decl
.
params
)}
})`
)
}
else
{
codes
.
push
(
`export const
${
decl
.
method
}
= initUtsProxyFunction(
${
decl
.
async
}
, { package: pkg, class: cls, name: '
${
decl
.
method
}
', params:
${
JSON
.
stringify
(
decl
.
params
)}
})`
)
}
}
else
if
(
decl
.
type
===
'
VariableDeclaration
'
)
{
codes
.
push
(
`export
${
decl
.
kind
}
${
decl
.
declarations
.
map
((
d
)
=>
`
${(
d
.
id
as
Identifier
).
value
}
=
${
genInitCode
(
d
.
init
!
)}
`
)
.
join
(
'
,
'
)}
`
)
}
})
return
codes
.
join
(
`\n`
)
}
async
function
parseModuleDecls
(
module
:
string
,
options
:
GenProxyCodeOptions
)
{
// 优先合并 ios + android,如果没有,查找根目录 index.uts
const
iosDecls
=
await
parseFile
(
resolvePlatformIndex
(
'
app-ios
'
,
module
,
options
),
options
)
const
androidDecls
=
await
parseFile
(
resolvePlatformIndex
(
'
app-android
'
,
module
,
options
),
options
)
// 优先使用 app-ios,因为 app-ios 平台函数类型需要正确的参数列表
const
decls
=
mergeDecls
(
androidDecls
,
iosDecls
)
// 如果没有平台特有,查找 root index.uts
if
(
!
decls
.
length
)
{
return
await
parseFile
(
resolveRootIndex
(
module
),
options
)
}
return
decls
}
function
mergeDecls
(
from
:
ProxyDecl
[],
to
:
ProxyDecl
[])
{
from
.
forEach
((
item
)
=>
{
if
(
item
.
type
===
'
Class
'
)
{
if
(
!
to
.
find
((
toItem
)
=>
toItem
.
type
===
'
Class
'
&&
toItem
.
cls
===
item
.
cls
)
)
{
to
.
push
(
item
)
}
}
else
if
(
item
.
type
===
'
FunctionDeclaration
'
)
{
if
(
!
to
.
find
(
(
toItem
)
=>
toItem
.
type
===
'
FunctionDeclaration
'
&&
toItem
.
method
===
item
.
method
)
)
{
to
.
push
(
item
)
}
}
})
return
to
}
async
function
parseFile
(
filename
:
string
|
undefined
|
false
,
options
:
GenProxyCodeOptions
)
{
if
(
filename
)
{
return
parseCode
(
fs
.
readFileSync
(
filename
,
'
utf8
'
),
options
.
namespace
)
}
return
[]
}
async
function
parseCode
(
code
:
string
,
namespace
:
string
)
{
// 懒加载 uts 编译器
// eslint-disable-next-line no-restricted-globals
const
{
parse
}
=
require
(
'
@dcloudio/uts
'
)
const
ast
=
await
parse
(
code
,
{
noColor
:
isInHBuilderX
()
})
return
parseAst
(
ast
,
createResolveTypeReferenceName
(
namespace
,
ast
))
}
type
ProxyDecl
=
ProxyFunctionDeclaration
|
ProxyClass
|
VariableDeclaration
interface
ProxyFunctionDeclaration
{
type
:
'
FunctionDeclaration
'
method
:
string
async
:
boolean
params
:
Parameter
[]
isDefault
:
boolean
}
interface
ProxyClass
{
type
:
'
Class
'
cls
:
string
options
:
{
constructor
:
{
params
:
Parameter
[]
}
methods
:
Record
<
string
,
any
>
staticMethods
:
Record
<
string
,
any
>
props
:
string
[]
staticProps
:
string
[]
}
isDefault
:
boolean
}
function
parseAst
(
{
body
}:
Module
,
resolveTypeReferenceName
:
ResolveTypeReferenceName
)
{
const
decls
:
Array
<
ProxyFunctionDeclaration
|
ProxyClass
|
VariableDeclaration
>
=
[]
body
.
forEach
((
item
)
=>
{
if
(
item
.
type
===
'
ExportDeclaration
'
)
{
const
decl
=
item
.
declaration
switch
(
decl
.
type
)
{
case
'
FunctionDeclaration
'
:
decls
.
push
(
genFunctionDeclaration
(
decl
,
resolveTypeReferenceName
,
false
)
)
break
case
'
ClassDeclaration
'
:
decls
.
push
(
genClassDeclaration
(
decl
,
resolveTypeReferenceName
,
false
))
break
case
'
VariableDeclaration
'
:
const
varDecl
=
genVariableDeclaration
(
decl
)
if
(
varDecl
)
{
decls
.
push
(
varDecl
)
}
break
}
}
else
if
(
item
.
type
===
'
ExportDefaultDeclaration
'
)
{
const
decl
=
item
.
decl
if
(
decl
.
type
===
'
ClassExpression
'
)
{
if
(
decl
.
identifier
)
{
// export default class test{}
decls
.
push
(
genClassDeclaration
(
decl
,
resolveTypeReferenceName
,
false
))
}
}
else
if
(
decl
.
type
===
'
FunctionExpression
'
)
{
if
(
decl
.
identifier
)
{
decls
.
push
(
genFunctionDeclaration
(
decl
,
resolveTypeReferenceName
,
true
)
)
}
}
}
})
return
decls
}
function
isReturnPromise
(
anno
?:
TsTypeAnnotation
)
{
if
(
!
anno
)
{
return
false
}
const
{
typeAnnotation
}
=
anno
return
(
typeAnnotation
.
type
===
'
TsTypeReference
'
&&
typeAnnotation
.
typeName
.
type
===
'
Identifier
'
&&
typeAnnotation
.
typeName
.
value
===
'
Promise
'
)
}
function
genProxyFunction
(
method
:
string
,
async
:
boolean
,
params
:
Parameter
[],
isDefault
:
boolean
=
false
):
ProxyFunctionDeclaration
{
return
{
type
:
'
FunctionDeclaration
'
,
method
,
async
,
params
,
isDefault
}
}
function
genProxyClass
(
cls
:
string
,
options
:
{
constructor
:
{
params
:
Parameter
[]
}
methods
:
Record
<
string
,
any
>
staticMethods
:
Record
<
string
,
any
>
props
:
string
[]
staticProps
:
string
[]
},
isDefault
:
boolean
=
false
):
ProxyClass
{
return
{
type
:
'
Class
'
,
cls
,
options
,
isDefault
}
}
interface
Parameter
{
name
:
string
type
:
string
}
type
ResolveTypeReferenceName
=
(
name
:
string
)
=>
string
function
resolveIdentifierType
(
ident
:
BindingIdentifier
,
resolveTypeReferenceName
:
ResolveTypeReferenceName
)
{
if
(
ident
.
typeAnnotation
)
{
const
{
typeAnnotation
}
=
ident
.
typeAnnotation
if
(
typeAnnotation
.
type
===
'
TsKeywordType
'
)
{
return
typeAnnotation
.
kind
}
else
if
(
typeAnnotation
.
type
===
'
TsFunctionType
'
)
{
return
'
UTSCallback
'
}
else
if
(
typeAnnotation
.
type
===
'
TsTypeReference
'
&&
typeAnnotation
.
typeName
.
type
===
'
Identifier
'
)
{
return
resolveTypeReferenceName
(
typeAnnotation
.
typeName
.
value
)
}
}
return
''
}
function
resolveFunctionParams
(
params
:
Param
[],
resolveTypeReferenceName
:
ResolveTypeReferenceName
)
{
const
result
:
Parameter
[]
=
[]
params
.
forEach
(({
pat
})
=>
{
if
(
pat
.
type
===
'
Identifier
'
)
{
result
.
push
({
name
:
pat
.
value
,
type
:
resolveIdentifierType
(
pat
as
BindingIdentifier
,
resolveTypeReferenceName
),
})
}
else
{
result
.
push
({
name
:
''
,
type
:
''
})
}
})
return
result
}
function
genFunctionDeclaration
(
decl
:
FunctionDeclaration
|
FunctionExpression
,
resolveTypeReferenceName
:
ResolveTypeReferenceName
,
isDefault
:
boolean
=
false
):
ProxyFunctionDeclaration
{
return
genProxyFunction
(
decl
.
identifier
!
.
value
,
decl
.
async
||
isReturnPromise
(
decl
.
returnType
),
resolveFunctionParams
(
decl
.
params
,
resolveTypeReferenceName
),
isDefault
)
}
function
genClassDeclaration
(
decl
:
ClassDeclaration
|
ClassExpression
,
resolveTypeReferenceName
:
ResolveTypeReferenceName
,
isDefault
:
boolean
=
false
):
ProxyClass
{
const
cls
=
decl
.
identifier
!
.
value
const
constructor
:
{
params
:
Parameter
[]
}
=
{
params
:
[]
}
const
methods
:
Record
<
string
,
{
async
?:
boolean
;
params
:
Parameter
[]
}
>
=
{}
const
staticMethods
:
Record
<
string
,
{
async
?:
boolean
;
params
:
Parameter
[]
}
>
=
{}
const
props
:
string
[]
=
[]
const
staticProps
:
string
[]
=
[]
decl
.
body
.
forEach
((
item
)
=>
{
if
(
item
.
type
===
'
Constructor
'
)
{
constructor
.
params
=
resolveFunctionParams
(
item
.
params
as
Param
[],
resolveTypeReferenceName
)
}
else
if
(
item
.
type
===
'
ClassMethod
'
)
{
if
(
item
.
key
.
type
===
'
Identifier
'
)
{
const
name
=
item
.
key
.
value
const
value
=
{
async
:
item
.
function
.
async
||
isReturnPromise
(
item
.
function
.
returnType
),
params
:
resolveFunctionParams
(
item
.
function
.
params
,
resolveTypeReferenceName
),
}
if
(
item
.
isStatic
)
{
staticMethods
[
name
]
=
value
}
else
{
methods
[
name
]
=
value
}
}
}
else
if
(
item
.
type
===
'
ClassProperty
'
)
{
if
(
item
.
key
.
type
===
'
Identifier
'
)
{
if
(
item
.
isStatic
)
{
staticProps
.
push
(
item
.
key
.
value
)
}
else
{
props
.
push
(
item
.
key
.
value
)
}
}
}
})
return
genProxyClass
(
cls
,
{
constructor
,
methods
,
staticMethods
,
props
,
staticProps
},
isDefault
)
}
function
genInitCode
(
expr
:
Expression
)
{
switch
(
expr
.
type
)
{
case
'
BooleanLiteral
'
:
return
expr
.
value
+
''
case
'
NumericLiteral
'
:
return
expr
.
value
+
''
case
'
StringLiteral
'
:
return
expr
.
value
}
return
''
}
function
genVariableDeclaration
(
decl
:
VariableDeclaration
):
VariableDeclaration
|
undefined
{
// 目前仅支持 const 的 boolean,number,string
const
lits
=
[
'
BooleanLiteral
'
,
'
NumericLiteral
'
,
'
StringLiteral
'
]
if
(
decl
.
kind
===
'
const
'
&&
!
decl
.
declarations
.
find
((
d
)
=>
{
if
(
d
.
id
.
type
!==
'
Identifier
'
)
{
return
true
}
if
(
!
d
.
init
)
{
return
true
}
const
type
=
d
.
init
.
type
if
(
!
lits
.
includes
(
type
))
{
return
true
}
return
false
})
)
{
return
decl
}
}
packages/uni-uts-vite/src/utils/compiler/index.ts
浏览文件 @
839c76d7
import
{
compileKotlin
}
from
'
./kotlin
'
import
{
compileSwift
}
from
'
./swift
'
import
{
runKotlinProd
,
runKotlinDev
}
from
'
./kotlin
'
import
{
runSwiftProd
,
runSwiftDev
}
from
'
./swift
'
export
{
genProxyCode
}
from
'
./code
'
export
function
getCompiler
(
type
:
'
kotlin
'
|
'
swift
'
)
{
if
(
type
===
'
swift
'
)
{
return
{
compile
:
compileSwift
,
runProd
:
runSwiftProd
,
runDev
:
runSwiftDev
,
}
}
return
{
compile
:
compileKotlin
,
runProd
:
runKotlinProd
,
runDev
:
runKotlinDev
,
}
}
packages/uni-uts-vite/src/utils/compiler/kotlin.ts
浏览文件 @
839c76d7
...
...
@@ -16,7 +16,6 @@ import {
resolveAndroidDir
,
resolvePackage
,
resolveUTSPlatformFile
,
UTSPlatformResourceOptions
,
}
from
'
./utils
'
import
{
Module
}
from
'
../../../types/types
'
...
...
@@ -37,7 +36,66 @@ function parseKotlinPackage(filename: string) {
}
}
export
async
function
compileKotlin
(
filename
:
string
)
{
export
async
function
runKotlinProd
(
filename
:
string
)
{
// 文件有可能是 app-ios 里边的,因为编译到 android 时,为了保证不报错,可能会去读取 ios 下的 uts
if
(
filename
.
includes
(
'
app-ios
'
))
{
return
}
await
compile
(
filename
)
genUTSPlatformResource
(
filename
,
{
inputDir
:
process
.
env
.
UNI_INPUT_DIR
,
outputDir
:
process
.
env
.
UNI_OUTPUT_DIR
,
platform
:
'
app-android
'
,
extname
:
'
.kt
'
,
})
}
export
async
function
runKotlinDev
(
filename
:
string
)
{
// 文件有可能是 app-ios 里边的,因为编译到 android 时,为了保证不报错,可能会去读取 ios 下的 uts
if
(
filename
.
includes
(
'
app-ios
'
))
{
return
}
await
compile
(
filename
)
const
kotlinFile
=
resolveUTSPlatformFile
(
filename
,
{
inputDir
:
process
.
env
.
UNI_INPUT_DIR
,
outputDir
:
process
.
env
.
UNI_OUTPUT_DIR
,
platform
:
'
app-android
'
,
extname
:
'
.kt
'
,
})
// 开发模式下,需要生成 dex
if
(
fs
.
existsSync
(
kotlinFile
))
{
const
compilerServer
=
getCompilerServer
()
if
(
!
compilerServer
)
{
return
}
const
{
getDefaultJar
,
getKotlincHome
,
compile
}
=
compilerServer
// time = Date.now()
const
jarFile
=
resolveJarPath
(
kotlinFile
)
const
options
=
{
kotlinc
:
resolveKotlincArgs
(
kotlinFile
,
getKotlincHome
(),
getDefaultJar
().
concat
(
resolveLibs
(
filename
))
),
d8
:
resolveD8Args
(
jarFile
),
}
const
res
=
await
compile
(
options
,
process
.
env
.
UNI_INPUT_DIR
)
// console.log('dex compile time: ' + (Date.now() - time) + 'ms')
if
(
res
)
{
try
{
fs
.
unlinkSync
(
jarFile
)
// 短期内先不删除,方便排查问题
// fs.unlinkSync(kotlinFile)
}
catch
(
e
)
{}
const
dexFile
=
resolveDexFile
(
jarFile
)
if
(
fs
.
existsSync
(
dexFile
))
{
return
normalizePath
(
path
.
relative
(
process
.
env
.
UNI_OUTPUT_DIR
,
dexFile
))
}
}
}
}
async
function
compile
(
filename
:
string
)
{
if
(
!
process
.
env
.
UNI_HBUILDERX_PLUGINS
)
{
return
}
...
...
@@ -67,49 +125,6 @@ export async function compileKotlin(filename: string) {
noColor
:
isInHBuilderX
(),
},
})
// console.log('uts compile time: ' + (Date.now() - time) + 'ms')
const
utsPlatformOptions
:
UTSPlatformResourceOptions
=
{
inputDir
,
outputDir
,
platform
:
'
app-android
'
,
extname
:
'
.kt
'
,
}
if
(
process
.
env
.
NODE_ENV
===
'
production
'
)
{
genUTSPlatformResource
(
filename
,
utsPlatformOptions
)
}
else
if
(
process
.
env
.
NODE_ENV
===
'
development
'
)
{
const
kotlinFile
=
resolveUTSPlatformFile
(
filename
,
utsPlatformOptions
)
// 开发模式下,需要生成 dex
if
(
fs
.
existsSync
(
kotlinFile
))
{
const
compilerServer
=
getCompilerServer
()
if
(
!
compilerServer
)
{
return
}
const
{
getDefaultJar
,
getKotlincHome
,
compile
}
=
compilerServer
// time = Date.now()
const
jarFile
=
resolveJarPath
(
kotlinFile
)
const
options
=
{
kotlinc
:
resolveKotlincArgs
(
kotlinFile
,
getKotlincHome
(),
getDefaultJar
().
concat
(
resolveLibs
(
filename
))
),
d8
:
resolveD8Args
(
jarFile
),
}
const
res
=
await
compile
(
options
,
process
.
env
.
UNI_INPUT_DIR
)
// console.log('dex compile time: ' + (Date.now() - time) + 'ms')
if
(
res
)
{
try
{
fs
.
unlinkSync
(
jarFile
)
// 短期内先不删除,方便排查问题
// fs.unlinkSync(kotlinFile)
}
catch
(
e
)
{}
const
dexFile
=
resolveDexFile
(
jarFile
)
if
(
fs
.
existsSync
(
dexFile
))
{
return
normalizePath
(
path
.
relative
(
outputDir
,
dexFile
))
}
}
}
}
}
function
resolveKotlincArgs
(
filename
:
string
,
kotlinc
:
string
,
jars
:
string
[])
{
...
...
packages/uni-uts-vite/src/utils/compiler/swift.ts
浏览文件 @
839c76d7
...
...
@@ -16,11 +16,23 @@ function parseSwiftPackage(filename: string) {
}
}
export
async
function
compileSwift
(
filename
:
string
)
{
//
开发阶段不编译
if
(
process
.
env
.
NODE_ENV
!==
'
production
'
)
{
export
async
function
runSwiftProd
(
filename
:
string
)
{
//
文件有可能是 app-android 里边的,因为编译到 ios 时,为了保证不报错,可能会去读取 android 下的 uts
if
(
filename
.
includes
(
'
app-android
'
)
)
{
return
}
await
compile
(
filename
)
genUTSPlatformResource
(
filename
,
{
inputDir
:
process
.
env
.
UNI_INPUT_DIR
,
outputDir
:
process
.
env
.
UNI_OUTPUT_DIR
,
platform
:
'
app-ios
'
,
extname
:
'
.swift
'
,
})
}
export
async
function
runSwiftDev
(
_filename
:
string
)
{}
async
function
compile
(
filename
:
string
)
{
if
(
!
process
.
env
.
UNI_HBUILDERX_PLUGINS
)
{
return
}
...
...
@@ -44,11 +56,4 @@ export async function compileSwift(filename: string) {
noColor
:
isInHBuilderX
(),
},
})
genUTSPlatformResource
(
filename
,
{
inputDir
,
outputDir
,
platform
:
'
app-ios
'
,
extname
:
'
.swift
'
,
})
}
packages/uts-darwin-arm64/uts.darwin-arm64.node
浏览文件 @
839c76d7
无法预览此类型文件
packages/uts-darwin-x64/uts.darwin-x64.node
浏览文件 @
839c76d7
无法预览此类型文件
packages/uts-win32-ia32-msvc/uts.win32-ia32-msvc.node
浏览文件 @
839c76d7
无法预览此类型文件
packages/uts-win32-x64-msvc/uts.win32-x64-msvc.node
浏览文件 @
839c76d7
无法预览此类型文件
packages/vite-plugin-uni/src/cli/utils.ts
浏览文件 @
839c76d7
...
...
@@ -170,14 +170,13 @@ export function initEnv(
function
initUtsPlatform
(
options
:
CliOptions
)
{
if
(
options
.
platform
===
'
app-android
'
)
{
process
.
env
.
UNI_APP_PLATFORM
=
'
android
'
process
.
env
.
UNI_UTS_PLATFORM
=
'
app-android
'
options
.
platform
=
'
app
'
}
else
if
(
options
.
platform
===
'
app-ios
'
)
{
process
.
env
.
UNI_APP_PLATFORM
=
'
ios
'
process
.
env
.
UNI_UTS_PLATFORM
=
'
app-ios
'
options
.
platform
=
'
app
'
}
else
{
// 运行时,可能传入了 UNI_APP_PLATFORM = 'android'|'ios'
if
(
process
.
env
.
UNI_APP_PLATFORM
===
'
android
'
)
{
process
.
env
.
UNI_UTS_PLATFORM
=
'
app-android
'
}
...
...
@@ -191,8 +190,12 @@ function initUtsPlatform(options: CliOptions) {
if
(
options
.
platform
===
'
h5
'
)
{
process
.
env
.
UNI_UTS_PLATFORM
=
'
web
'
}
if
(
!
process
.
env
.
UNI_UTS_PLATFORM
)
{
process
.
env
.
UNI_UTS_PLATFORM
=
options
.
platform
as
any
// 非 app 平台,自动补充 UNI_UTS_PLATFORM
// app 平台,必须主动传入
if
(
options
.
platform
!==
'
app
'
)
{
if
(
!
process
.
env
.
UNI_UTS_PLATFORM
)
{
process
.
env
.
UNI_UTS_PLATFORM
=
options
.
platform
as
any
}
}
}
...
...
packages/vite-plugin-uni/src/configResolved/plugins/resolveId.ts
浏览文件 @
839c76d7
...
...
@@ -39,11 +39,13 @@ export function uniResolveIdPlugin(
path
.
join
(
id
,
BUILT_IN_MODULES
[
id
as
BuiltInModulesKey
])
))
}
return
resolveUtsModule
(
id
,
importer
?
path
.
dirname
(
importer
)
:
process
.
env
.
UNI_INPUT_DIR
,
process
.
env
.
UNI_UTS_PLATFORM
)
if
(
process
.
env
.
UNI_PLATFORM
!==
'
app
'
)
{
return
resolveUtsModule
(
id
,
importer
?
path
.
dirname
(
importer
)
:
process
.
env
.
UNI_INPUT_DIR
,
process
.
env
.
UNI_UTS_PLATFORM
)
}
},
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录