@proteus-vue/devtools 0.1.0 → 0.1.1-beta.3
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/LICENSE +218 -0
- package/dist/panel.js +611 -121
- package/package.json +8 -8
package/dist/panel.js
CHANGED
|
@@ -2640,9 +2640,9 @@ var ProteusDevtools = (() => {
|
|
|
2640
2640
|
fgControls.appendChild(recBtn);
|
|
2641
2641
|
function restoreAt(index) {
|
|
2642
2642
|
const out = [];
|
|
2643
|
-
for (const [id,
|
|
2643
|
+
for (const [id, history2] of storePatchHistory) {
|
|
2644
2644
|
let state = null;
|
|
2645
|
-
for (const h of
|
|
2645
|
+
for (const h of history2) {
|
|
2646
2646
|
if (h.stepIndex <= index) state = h.state;
|
|
2647
2647
|
else break;
|
|
2648
2648
|
}
|
|
@@ -3437,7 +3437,7 @@ ${summary}
|
|
|
3437
3437
|
};
|
|
3438
3438
|
}
|
|
3439
3439
|
|
|
3440
|
-
// ../render-backend/
|
|
3440
|
+
// ../render-backend/src/headless.ts
|
|
3441
3441
|
function toPlainTree(root) {
|
|
3442
3442
|
return {
|
|
3443
3443
|
id: root.id,
|
|
@@ -3463,8 +3463,8 @@ ${summary}
|
|
|
3463
3463
|
"ui.input": "input",
|
|
3464
3464
|
"ui.list": "list",
|
|
3465
3465
|
"ui.nav": "nav",
|
|
3466
|
-
"capability.
|
|
3467
|
-
"capability.
|
|
3466
|
+
"capability.qr-code": "scan-qr",
|
|
3467
|
+
"capability.camera": "pick-photo",
|
|
3468
3468
|
"capability.location": "location",
|
|
3469
3469
|
// ★G-32 B1:新增 implemented 语义(与 component-ir SEMANTIC_BACKEND_MAP headless 列同源)
|
|
3470
3470
|
"layout.inline": "inline",
|
|
@@ -3503,7 +3503,18 @@ ${summary}
|
|
|
3503
3503
|
"engineering.router-link": "router-link",
|
|
3504
3504
|
// ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
|
|
3505
3505
|
"engineering.transition": "transition",
|
|
3506
|
-
"engineering.
|
|
3506
|
+
"engineering.share-element": "share-element",
|
|
3507
|
+
"engineering.animate": "animate",
|
|
3508
|
+
// ★能力颗粒度对齐 C2
|
|
3509
|
+
"ui.progress": "progress",
|
|
3510
|
+
"ui.label": "label",
|
|
3511
|
+
"shell.page-container": "page-container",
|
|
3512
|
+
"ui.selection": "selection",
|
|
3513
|
+
"shell.keyboard-accessory": "keyboard-accessory",
|
|
3514
|
+
"ui.camera": "camera",
|
|
3515
|
+
"shell.webview": "webview",
|
|
3516
|
+
"shell.ad": "ad",
|
|
3517
|
+
"ui.map": "map"
|
|
3507
3518
|
};
|
|
3508
3519
|
var HEADLESS_CAPABILITIES = {
|
|
3509
3520
|
layout: "none",
|
|
@@ -3582,6 +3593,8 @@ ${summary}
|
|
|
3582
3593
|
}
|
|
3583
3594
|
};
|
|
3584
3595
|
}
|
|
3596
|
+
|
|
3597
|
+
// ../render-backend/src/flutter.ts
|
|
3585
3598
|
var WIDGET_MAP = {
|
|
3586
3599
|
view: "Container",
|
|
3587
3600
|
text: "Text",
|
|
@@ -3615,8 +3628,8 @@ ${summary}
|
|
|
3615
3628
|
"ui.input": "TextField",
|
|
3616
3629
|
"ui.list": "ListView",
|
|
3617
3630
|
"ui.nav": "Navigator",
|
|
3618
|
-
"capability.
|
|
3619
|
-
"capability.
|
|
3631
|
+
"capability.qr-code": "scanQR",
|
|
3632
|
+
"capability.camera": "pickPhoto",
|
|
3620
3633
|
"capability.location": "getLocation",
|
|
3621
3634
|
// ★G-32 B1:新增 implemented 语义
|
|
3622
3635
|
"layout.inline": "InlineSpan",
|
|
@@ -3655,7 +3668,19 @@ ${summary}
|
|
|
3655
3668
|
"engineering.router-link": "TextButton",
|
|
3656
3669
|
// ★G-32 B5 续二:工程原语动画组件形态(E19/E20)
|
|
3657
3670
|
"engineering.transition": "AnimatedOpacity",
|
|
3658
|
-
"engineering.
|
|
3671
|
+
"engineering.share-element": "Hero",
|
|
3672
|
+
// Flutter Hero 即共享元素
|
|
3673
|
+
"engineering.animate": "AnimationController",
|
|
3674
|
+
// ★能力颗粒度对齐 C2
|
|
3675
|
+
"ui.progress": "LinearProgressIndicator",
|
|
3676
|
+
"ui.label": "Text.label",
|
|
3677
|
+
"shell.page-container": "showModalBottomSheet",
|
|
3678
|
+
"ui.selection": "SelectableText",
|
|
3679
|
+
"shell.keyboard-accessory": "KeyboardAccessoryView",
|
|
3680
|
+
"ui.camera": "CameraPreview",
|
|
3681
|
+
"shell.webview": "WebView",
|
|
3682
|
+
"shell.ad": "AdWidget",
|
|
3683
|
+
"ui.map": "GoogleMap"
|
|
3659
3684
|
};
|
|
3660
3685
|
function mapWidgetType(type) {
|
|
3661
3686
|
return WIDGET_MAP[type] ?? type;
|
|
@@ -3749,13 +3774,15 @@ ${summary}
|
|
|
3749
3774
|
}
|
|
3750
3775
|
};
|
|
3751
3776
|
}
|
|
3777
|
+
|
|
3778
|
+
// ../component-ir/src/schema.ts
|
|
3752
3779
|
var TAG_SEMANTIC_MAP = {
|
|
3753
3780
|
// G-32 ① 布局原语(12)
|
|
3754
3781
|
"p-box": "layout.box",
|
|
3755
3782
|
"p-inline": "layout.inline",
|
|
3756
3783
|
"p-stack": "layout.stack",
|
|
3757
3784
|
"p-grid": "layout.grid",
|
|
3758
|
-
|
|
3785
|
+
// ★Skyline 线收口:'p-fluid' 移除——layout.fluid 是 v-p-fluid **指令**语义(非标签),登记为标签会让 <p-fluid> 静默不渲染
|
|
3759
3786
|
"p-adaptive": "layout.adaptive",
|
|
3760
3787
|
"p-fit": "layout.fit",
|
|
3761
3788
|
"p-spacer": "layout.spacer",
|
|
@@ -3804,11 +3831,17 @@ ${summary}
|
|
|
3804
3831
|
// ★E18 组件形态(p- 前缀产 C-IR)
|
|
3805
3832
|
"router-link": "engineering.router-link",
|
|
3806
3833
|
// ★兼容别名(Vue Router 风格 <router-link> 标签;非 catalog 条目——p-view 先例 G-31 B4)
|
|
3834
|
+
"p-share-element": "engineering.share-element",
|
|
3835
|
+
// ★批次 8:页面间共享元素转场(≠ p-transition 页内过渡)
|
|
3807
3836
|
"p-transition": "engineering.transition",
|
|
3808
3837
|
"p-animate": "engineering.animate",
|
|
3809
3838
|
// G-31 能力入口
|
|
3810
|
-
|
|
3811
|
-
|
|
3839
|
+
// ★2026-09-18 语义去重:原 capability.scan-qr / capability.pick-photo 是**重复名**——
|
|
3840
|
+
// 两个组件的实现分别调用 useQRCode() / useCamera(),对应真实能力即 C42 capability.qr-code /
|
|
3841
|
+
// C1 capability.camera(其 mpEquiv 与 hook 完全一致)。故**退役重复名、重指向真实能力**,
|
|
3842
|
+
// 并按 E8 双形态在两行补 tag(而非新建语义)。
|
|
3843
|
+
"p-scan-qr": "capability.qr-code",
|
|
3844
|
+
"p-pick-photo": "capability.camera",
|
|
3812
3845
|
"p-location": "capability.location",
|
|
3813
3846
|
// ★G-31 B4 现有组件对齐(src/components 实际标签 → L1 语义)
|
|
3814
3847
|
"p-view": "layout.box",
|
|
@@ -3817,37 +3850,77 @@ ${summary}
|
|
|
3817
3850
|
"p-nav-bar": "ui.nav",
|
|
3818
3851
|
// ★G-31 B4 Fluid 体系扩展语义(有明确系统原生对应——原则 #10.8)
|
|
3819
3852
|
"p-safe": "layout.safe",
|
|
3820
|
-
"p-sidebar": "layout.sidebar"
|
|
3853
|
+
"p-sidebar": "layout.sidebar",
|
|
3854
|
+
// ★#405 语义登记批:剩余 10 组件全量入图(EXTRA_KIND 文档兑底退役)——
|
|
3855
|
+
// 9 个新语义(catalog planned L2:语义层待多端映射)+ p-scroll-view 复用 layout.scroll
|
|
3856
|
+
// (★2026-09-18 修正原文「p-view 先例」:显式 multi-tag 别名先例是上一行的 `router-link`
|
|
3857
|
+
// ——同一语义由两个标签提供;本条与 p-view 是并列的别名情形,非「先例」关系)
|
|
3858
|
+
"p-aspect": "layout.aspect",
|
|
3859
|
+
"p-zone": "layout.zone",
|
|
3860
|
+
"p-loading": "ui.loading",
|
|
3861
|
+
"p-scale": "ui.scale",
|
|
3862
|
+
"p-skeleton": "ui.skeleton",
|
|
3863
|
+
"p-mask": "shell.mask",
|
|
3864
|
+
"p-popup": "shell.popup",
|
|
3865
|
+
"p-toolbar": "shell.toolbar",
|
|
3866
|
+
"p-scroll-view": "layout.scroll",
|
|
3867
|
+
// 滚动容器 = p-scroll 角色
|
|
3868
|
+
"p-error-boundary": "engineering.error-boundary",
|
|
3869
|
+
// E8 原语组件形态(useErrorBoundary API 形态并存)
|
|
3870
|
+
// ★能力颗粒度对齐 C2:新增真实组件
|
|
3871
|
+
"p-progress": "ui.progress",
|
|
3872
|
+
"p-label": "ui.label",
|
|
3873
|
+
"p-page-container": "shell.page-container",
|
|
3874
|
+
// ★权威标尺批 H:选区 / 键盘工具栏
|
|
3875
|
+
"p-selection": "ui.selection",
|
|
3876
|
+
"p-keyboard-accessory": "shell.keyboard-accessory",
|
|
3877
|
+
// ★权威标尺批 I:相机
|
|
3878
|
+
"p-camera": "ui.camera",
|
|
3879
|
+
// ★权威标尺批 J:内嵌网页 / 广告位
|
|
3880
|
+
"p-webview": "shell.webview",
|
|
3881
|
+
"p-ad": "shell.ad",
|
|
3882
|
+
"p-map": "ui.map"
|
|
3821
3883
|
};
|
|
3884
|
+
|
|
3885
|
+
// ../component-ir/src/to-ir.ts
|
|
3822
3886
|
function toComponentIR(tag, props = {}, children = []) {
|
|
3823
3887
|
if (!tag.startsWith("p-")) return null;
|
|
3824
3888
|
const semantic = TAG_SEMANTIC_MAP[tag];
|
|
3825
3889
|
if (!semantic) return null;
|
|
3826
3890
|
return { tag, semantic, props: { ...props }, children };
|
|
3827
3891
|
}
|
|
3892
|
+
|
|
3893
|
+
// ../component-ir/src/primitives.ts
|
|
3828
3894
|
var LAYOUT = [
|
|
3829
|
-
{ id: "L1", kind: "layout", semantic: "layout.box", tag: "p-box", props: ["aspectRatio", "overflow"], mpEquiv: "<view>", tier: "L1", status: "implemented" },
|
|
3895
|
+
{ id: "L1", kind: "layout", semantic: "layout.box", tag: "p-box", props: ["aspectRatio", "overflow", "hoverClass", "hoverStopPropagation", "hoverStartTime", "hoverStayTime"], mpEquiv: "<view>", tier: "L1", status: "implemented" },
|
|
3830
3896
|
{ id: "L2", kind: "layout", semantic: "layout.inline", tag: "p-inline", props: ["wrap"], mpEquiv: "<text> \u5185\u8054", tier: "L1", status: "implemented" },
|
|
3831
3897
|
{ id: "L3", kind: "layout", semantic: "layout.stack", tag: "p-stack", props: ["direction", "gap", "align", "wrap", "snap", "loop"], mpEquiv: "flex + scroll-view + swiper", tier: "L1", status: "implemented" },
|
|
3832
3898
|
{ id: "L4", kind: "layout", semantic: "layout.grid", tag: "p-grid", props: ["minColWidth", "maxCols", "gap", "autoFlow"], mpEquiv: "<view> + CSS Grid", tier: "L1", status: "implemented" },
|
|
3833
|
-
|
|
3899
|
+
// ★Skyline 线收口:layout.fluid 由 v-p-fluid **指令**承载(非标签)——无 tag,避免 <p-fluid> 幽灵
|
|
3900
|
+
{ id: "L5", kind: "layout", semantic: "layout.fluid", props: ["breakpoints", "minItemWidth"], mpEquiv: "\u54CD\u5E94\u5F0F CSS\uFF08v-p-fluid \u6307\u4EE4\uFF09", tier: "L1", status: "implemented" },
|
|
3834
3901
|
{ id: "L6", kind: "layout", semantic: "layout.adaptive", tag: "p-adaptive", props: ["sheet", "dialog", "popover", "drawer"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u5BBD\u5EA6\u8BED\u4E49\u65AD\u70B9\uFF09", tier: "L1", status: "implemented" },
|
|
3835
3902
|
{ id: "L7", kind: "layout", semantic: "layout.fit", tag: "p-fit", props: ["mode"], mpEquiv: "fit-content", tier: "L1", status: "implemented" },
|
|
3836
3903
|
{ id: "L8", kind: "layout", semantic: "layout.spacer", tag: "p-spacer", props: ["grow", "shrink"], mpEquiv: "flex:1", tier: "L1", status: "implemented" },
|
|
3837
3904
|
{ id: "L9", kind: "layout", semantic: "layout.divider", tag: "p-divider", props: ["orientation", "inset"], mpEquiv: "<view> + border", tier: "L1", status: "implemented" },
|
|
3838
|
-
{ id: "L10", kind: "layout", semantic: "layout.scroll", tag: "p-scroll", props: ["axis", "paging", "refresh", "indicator"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
|
|
3905
|
+
{ id: "L10", kind: "layout", semantic: "layout.scroll", tag: "p-scroll", props: ["axis", "paging", "refresh", "indicator", "upperThreshold", "lowerThreshold", "scrollIntoView", "scrollWithAnimation", "enableBackToTop", "enablePassive", "refresherEnabled", "refresherTriggered", "enhanced", "bounces", "scrollAnchoring", "padding"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
|
|
3839
3906
|
{ id: "L11", kind: "layout", semantic: "layout.virtual-list", tag: "p-virtual-list", props: ["itemSize", "buffer", "direction"], mpEquiv: "<scroll-view> + \u624B\u52A8\u56DE\u6536", tier: "L1", status: "implemented" },
|
|
3840
|
-
{ id: "L12", kind: "layout", semantic: "layout.masonry", tag: "p-masonry", props: ["colCount", "gap"], mpEquiv: "\u7B2C\u4E09\u65B9\u7011\u5E03\u6D41", tier: "L1", status: "implemented" }
|
|
3907
|
+
{ id: "L12", kind: "layout", semantic: "layout.masonry", tag: "p-masonry", props: ["colCount", "gap"], mpEquiv: "\u7B2C\u4E09\u65B9\u7011\u5E03\u6D41", tier: "L1", status: "implemented" },
|
|
3908
|
+
// ★#405 语义登记批:Fluid 体系剩余组件(语义层待多端映射 → planned L2——G-31.4 不足 3 端降级)
|
|
3909
|
+
{ id: "L13", kind: "layout", semantic: "layout.aspect", tag: "p-aspect", props: ["ratio", "maxWidth"], mpEquiv: "\u65E0\uFF08\u7EB5\u6A2A\u6BD4\u5BB9\u5668\uFF09", tier: "L2", status: "planned" },
|
|
3910
|
+
{ id: "L14", kind: "layout", semantic: "layout.zone", tag: "p-zone", props: ["designWidth"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u65AD\u70B9\u5206\u533A\uFF09", tier: "L2", status: "planned" },
|
|
3911
|
+
// ★批次 7(2026-09-18)未登记组件补登记:安全区(刘海/折叠屏/降级)+ 侧边导航容器
|
|
3912
|
+
{ id: "L15", kind: "layout", semantic: "layout.safe", tag: "p-safe", props: ["area", "fold", "fallback"], mpEquiv: "\u65E0\uFF08\u5B89\u5168\u533A\u8BED\u4E49\u5BB9\u5668\uFF09", tier: "L1", status: "implemented" },
|
|
3913
|
+
{ id: "L16", kind: "layout", semantic: "layout.sidebar", tag: "p-sidebar", props: ["minSidebarWidth", "navWidth", "designWidth", "toggleLabel"], mpEquiv: "\u65E0\uFF08\u5BB9\u5668\u65AD\u70B9\u4FA7\u680F\uFF09", tier: "L1", status: "implemented" }
|
|
3841
3914
|
];
|
|
3842
3915
|
var UI = [
|
|
3843
|
-
{ id: "U1", kind: "ui", semantic: "ui.text", tag: "p-text", props: ["content", "selectable", "truncate", "align"], mpEquiv: "<text>", tier: "L1", status: "implemented" },
|
|
3916
|
+
{ id: "U1", kind: "ui", semantic: "ui.text", tag: "p-text", props: ["content", "selectable", "truncate", "align", "userSelect", "overflow", "maxLines", "selectOnGesture", "space", "decode"], mpEquiv: "<text>", tier: "L1", status: "implemented" },
|
|
3844
3917
|
{ id: "U2", kind: "ui", semantic: "ui.heading", tag: "p-heading", props: ["level"], mpEquiv: "<h1>-<h6>", tier: "L1", status: "implemented" },
|
|
3845
|
-
{ id: "U3", kind: "ui", semantic: "ui.rich-text", tag: "p-rich-text", props: ["
|
|
3846
|
-
{ id: "U4", kind: "ui", semantic: "ui.icon", tag: "p-icon", props: ["name", "size", "color", "spin"], mpEquiv: "<icon>", tier: "L1", status: "implemented" },
|
|
3847
|
-
{ id: "U5", kind: "ui", semantic: "ui.image", tag: "p-image", props: ["src", "fit", "placeholder", "lazy"], mpEquiv: "<image>", tier: "L1", status: "implemented" },
|
|
3918
|
+
{ id: "U3", kind: "ui", semantic: "ui.rich-text", tag: "p-rich-text", props: ["nodes", "space", "userSelect", "mode", "source"], mpEquiv: "<rich-text>", tier: "L1", status: "implemented" },
|
|
3919
|
+
{ id: "U4", kind: "ui", semantic: "ui.icon", tag: "p-icon", props: ["name", "type", "size", "color", "spin"], mpEquiv: "<icon>", tier: "L1", status: "implemented" },
|
|
3920
|
+
{ id: "U5", kind: "ui", semantic: "ui.image", tag: "p-image", props: ["src", "fit", "placeholder", "lazy", "showMenuByLongpress", "fadeIn", "preload", "webp", "referrerPolicy"], mpEquiv: "<image>", tier: "L1", status: "implemented" },
|
|
3848
3921
|
{ id: "U6", kind: "ui", semantic: "ui.avatar", tag: "p-avatar", props: ["src", "shape", "size", "fallback"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
3849
|
-
{ id: "U7", kind: "ui", semantic: "ui.media", tag: "p-media", props: ["kind", "controls", "autoplay", "poster", "
|
|
3850
|
-
{ id: "U8", kind: "ui", semantic: "ui.canvas", tag: "p-canvas", props: ["engine", "resolution"], mpEquiv: "<canvas>", tier: "L1", status: "implemented" },
|
|
3922
|
+
{ id: "U7", kind: "ui", semantic: "ui.media", tag: "p-media", props: ["kind", "src", "duration", "controls", "autoplay", "loop", "muted", "initialTime", "poster", "objectFit", "title", "playBtnPosition", "direction", "showProgress", "showFullscreenBtn", "showPlayBtn", "showCenterPlayBtn", "showMuteBtn", "showBottomProgress", "enableProgressGesture", "enablePlayGesture", "pageGesture", "vslideGesture", "vslideGestureInFullscreen", "autoPauseIfNavigate", "autoPauseIfOpenNative", "danmuList", "danmuBtn", "enableDanmu", "pictureInPicture"], mpEquiv: "<video>+<audio>", tier: "L1", status: "implemented" },
|
|
3923
|
+
{ id: "U8", kind: "ui", semantic: "ui.canvas", tag: "p-canvas", props: ["engine", "canvasId", "disableScroll", "resolution"], mpEquiv: "<canvas>", tier: "L1", status: "implemented" },
|
|
3851
3924
|
{ id: "U9", kind: "ui", semantic: "ui.svg", tag: "p-svg", props: ["path", "viewbox"], mpEquiv: "\u65E0", tier: "L1", status: "implemented" },
|
|
3852
3925
|
{ id: "U10", kind: "ui", semantic: "ui.input", tag: "p-input", props: ["type", "mask", "validation", "clearable"], mpEquiv: "<input>", tier: "L1", status: "implemented" },
|
|
3853
3926
|
{ id: "U11", kind: "ui", semantic: "ui.textarea", tag: "p-textarea", props: ["autosize", "maxLength", "count"], mpEquiv: "<textarea>", tier: "L1", status: "implemented" },
|
|
@@ -3856,12 +3929,32 @@ ${summary}
|
|
|
3856
3929
|
{ id: "U14", kind: "ui", semantic: "ui.radio", tag: "p-radio", props: ["value", "group"], mpEquiv: "<radio>", tier: "L1", status: "implemented" },
|
|
3857
3930
|
{ id: "U15", kind: "ui", semantic: "ui.switch", tag: "p-switch", props: ["checked", "loading"], mpEquiv: "<switch>", tier: "L1", status: "implemented" },
|
|
3858
3931
|
{ id: "U16", kind: "ui", semantic: "ui.slider", tag: "p-slider", props: ["min", "max", "step", "range"], mpEquiv: "<slider>", tier: "L1", status: "implemented" },
|
|
3859
|
-
{ id: "U17", kind: "ui", semantic: "ui.picker", tag: "p-picker", props: ["mode", "start", "end"], mpEquiv: "<picker>", tier: "L1", status: "implemented" },
|
|
3860
|
-
{ id: "U18", kind: "ui", semantic: "ui.form", tag: "p-form", props: ["model", "rules", "layout"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" }
|
|
3932
|
+
{ id: "U17", kind: "ui", semantic: "ui.picker", tag: "p-picker", props: ["mode", "start", "end", "indicatorStyle", "indicatorClass", "maskClass", "maskStyle", "immediateChange"], mpEquiv: "<picker>", tier: "L1", status: "implemented" },
|
|
3933
|
+
{ id: "U18", kind: "ui", semantic: "ui.form", tag: "p-form", props: ["model", "rules", "layout"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
3934
|
+
// ★#405 语义登记批:反馈/状态类组件
|
|
3935
|
+
{ id: "U19", kind: "ui", semantic: "ui.loading", tag: "p-loading", props: ["size", "text"], mpEquiv: "wx.showLoading \u90E8\u5206", tier: "L2", status: "planned" },
|
|
3936
|
+
{ id: "U20", kind: "ui", semantic: "ui.scale", tag: "p-scale", props: ["level", "density", "baseSize"], mpEquiv: "\u65E0\uFF08\u65E0\u969C\u788D\u6863\u4F4D\uFF09", tier: "L2", status: "planned" },
|
|
3937
|
+
{ id: "U21", kind: "ui", semantic: "ui.skeleton", tag: "p-skeleton", props: ["rows", "avatar", "animated"], mpEquiv: "\u65E0", tier: "L2", status: "planned" },
|
|
3938
|
+
// ★能力颗粒度对齐 C2:进度条 / 表单标签
|
|
3939
|
+
{ id: "U22", kind: "ui", semantic: "ui.progress", tag: "p-progress", props: ["percent", "status", "type", "strokeWidth", "showInfo"], mpEquiv: "<progress>", tier: "L1", status: "implemented" },
|
|
3940
|
+
{ id: "U23", kind: "ui", semantic: "ui.label", tag: "p-label", props: ["for", "block"], mpEquiv: "<label>", tier: "L1", status: "implemented" },
|
|
3941
|
+
// ★权威标尺批 H:局部文本选区
|
|
3942
|
+
{ id: "U24", kind: "ui", semantic: "ui.selection", tag: "p-selection", props: ["disableContextMenu", "selectable"], mpEquiv: "<selection>", tier: "L1", status: "implemented" },
|
|
3943
|
+
// ★权威标尺批 I:相机
|
|
3944
|
+
{ id: "U25", kind: "ui", semantic: "ui.camera", tag: "p-camera", props: ["mode", "resolution", "devicePosition", "flash", "frameSize", "aspectRatio"], mpEquiv: "<camera>", tier: "L1", status: "implemented" },
|
|
3945
|
+
// ★权威标尺批 J:地图
|
|
3946
|
+
{ id: "U26", kind: "ui", semantic: "ui.map", tag: "p-map", props: ["latitude", "longitude", "scale", "minScale", "maxScale", "markers", "polyline", "circles", "polygons", "includePoints", "showLocation", "layerStyle", "rotate", "skew", "showCompass", "showScale", "enableZoom", "enableScroll", "enableRotate", "enableSatellite", "enableTraffic", "enablePoi", "enableBuilding", "enableOverlooking", "setting"], mpEquiv: "<map>", tier: "L1", status: "implemented" },
|
|
3947
|
+
// ★批次 7(2026-09-18)未登记组件补登记:这 3 个组件此前**只存在于 TAG_SEMANTIC_MAP**(编译器能解析、
|
|
3948
|
+
// 组件能渲染),但不在 SSOT catalog → C1 不变量(catalog tag ↔ TAG_SEMANTIC_MAP 双向)单向成立、
|
|
3949
|
+
// catalog 查询类 API(primitiveByTag / componentPrimitives)查不到它们。
|
|
3950
|
+
// ★p-button 尤其反讽:它是**端对齐全流程的参考实现**(21/21、SOP v2 范式),却不在语义清单里。
|
|
3951
|
+
{ id: "U27", kind: "ui", semantic: "ui.button", tag: "p-button", props: ["disabled", "loading", "throttle", "size", "type", "plain", "formType", "openType", "hoverClass", "theme", "hoverStopPropagation", "hoverStartTime", "hoverStayTime", "lang", "sessionFrom", "sendMessageTitle", "sendMessagePath", "sendMessageImg", "appParameter", "showMessageCard", "phoneNumberNoQuotaToast", "needShowEntrance", "entrancePath"], mpEquiv: "<button>", tier: "L1", status: "implemented" },
|
|
3952
|
+
{ id: "U28", kind: "ui", semantic: "ui.list", tag: "p-list-view", props: ["items", "itemHeight", "height", "bufferSize", "virtual", "lazy", "padding"], mpEquiv: "<list-view>\uFF08\u865A\u62DF\u6EDA\u52A8\uFF09", tier: "L1", status: "implemented" },
|
|
3953
|
+
{ id: "U29", kind: "ui", semantic: "ui.nav", tag: "p-nav-bar", props: ["title", "back", "fixed", "loading", "frontColor", "backgroundColor", "colorAnimationDuration", "colorAnimationTimingFunc"], mpEquiv: "<navigation-bar>\uFF08\u81EA\u7ED8\uFF09", tier: "L1", status: "implemented" }
|
|
3861
3954
|
];
|
|
3862
3955
|
var SHELL = [
|
|
3863
3956
|
{ id: "S1", kind: "shell", semantic: "shell.page", tag: "p-page", props: ["title", "statusBar", "pullRefresh"], mpEquiv: "<page>", tier: "L1", status: "implemented" },
|
|
3864
|
-
{ id: "S2", kind: "shell", semantic: "shell.nav", tag: "p-nav", props: ["title", "transparent"], mpEquiv: "\u5BFC\u822A\u680F\u914D\u7F6E", tier: "L1", status: "implemented" },
|
|
3957
|
+
{ id: "S2", kind: "shell", semantic: "shell.nav", tag: "p-nav", props: ["title", "transparent", "loading", "frontColor", "backgroundColor", "colorAnimationDuration", "colorAnimationTimingFunc"], mpEquiv: "\u5BFC\u822A\u680F\u914D\u7F6E", tier: "L1", status: "implemented" },
|
|
3865
3958
|
{ id: "S3", kind: "shell", semantic: "shell.tabbar", tag: "p-tabbar", props: ["tabs", "active", "badge"], mpEquiv: "<tabbar>", tier: "L1", status: "implemented" },
|
|
3866
3959
|
{ id: "S4", kind: "shell", semantic: "shell.segment", tag: "p-segment", props: ["options", "active"], mpEquiv: "<segment>", tier: "L1", status: "implemented" },
|
|
3867
3960
|
{ id: "S5", kind: "shell", semantic: "shell.drawer", tag: "p-drawer", props: ["side", "width", "overlay"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
@@ -3869,18 +3962,33 @@ ${summary}
|
|
|
3869
3962
|
{ id: "S7", kind: "shell", semantic: "shell.popover", tag: "p-popover", props: ["trigger", "placement"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
3870
3963
|
{ id: "S8", kind: "shell", semantic: "shell.toast", tag: "p-toast", props: ["message", "duration", "type"], mpEquiv: "wx.showToast", tier: "L1", status: "planned" },
|
|
3871
3964
|
{ id: "S9", kind: "shell", semantic: "shell.action-sheet", tag: "p-action-sheet", props: ["actions", "cancel"], mpEquiv: "wx.showActionSheet", tier: "L1", status: "implemented" },
|
|
3872
|
-
{ id: "S10", kind: "shell", semantic: "layout.split", tag: "p-split", props: ["breakpoint", "ratio", "collapse"], mpEquiv: "\u65E0\uFF08\u5206\u680F\u5E03\u5C40\uFF09", tier: "L1", status: "implemented" }
|
|
3965
|
+
{ id: "S10", kind: "shell", semantic: "layout.split", tag: "p-split", props: ["breakpoint", "ratio", "collapse"], mpEquiv: "\u65E0\uFF08\u5206\u680F\u5E03\u5C40\uFF09", tier: "L1", status: "implemented" },
|
|
3873
3966
|
// ★已落地绑定:分栏语义由 layout.split 承载(G-32 文档为 shell.split——机器事实以实现为准)
|
|
3967
|
+
// ★#405 语义登记批:弹层/工具栏组件
|
|
3968
|
+
{ id: "S11", kind: "shell", semantic: "shell.mask", tag: "p-mask", props: ["visible", "transparent"], mpEquiv: "\u7EC4\u5408\uFF08\u906E\u7F69\u5C42\uFF09", tier: "L2", status: "planned" },
|
|
3969
|
+
{ id: "S12", kind: "shell", semantic: "shell.popup", tag: "p-popup", props: ["position", "round", "overlay"], mpEquiv: "\u7EC4\u5408\uFF08\u5F39\u5C42\uFF09", tier: "L2", status: "planned" },
|
|
3970
|
+
{ id: "S13", kind: "shell", semantic: "shell.toolbar", tag: "p-toolbar", props: ["items", "itemWidth", "moreWidth"], mpEquiv: "\u65E0\uFF08\u6EA2\u51FA\u6298\u53E0\uFF09", tier: "L2", status: "planned" },
|
|
3971
|
+
// ★能力颗粒度对齐 C2:页面容器(对齐小程序 <page-container>)
|
|
3972
|
+
{ id: "S14", kind: "shell", semantic: "shell.page-container", tag: "p-page-container", props: ["show", "position", "overlay", "closeOnClickOverlay", "duration", "zIndex", "closeOnSlideDown", "overlayStyle", "customStyle"], mpEquiv: "<page-container>", tier: "L1", status: "implemented" },
|
|
3973
|
+
// ★权威标尺批 H:键盘上方工具栏
|
|
3974
|
+
{ id: "S15", kind: "shell", semantic: "shell.keyboard-accessory", tag: "p-keyboard-accessory", props: ["visible", "maxHeight", "background"], mpEquiv: "<keyboard-accessory>", tier: "L1", status: "implemented" },
|
|
3975
|
+
// ★权威标尺批 J:内嵌网页 / 广告位
|
|
3976
|
+
{ id: "S16", kind: "shell", semantic: "shell.webview", tag: "p-webview", props: ["src", "height", "sandbox"], mpEquiv: "<web-view>", tier: "L1", status: "implemented" },
|
|
3977
|
+
{ id: "S17", kind: "shell", semantic: "shell.ad", tag: "p-ad", props: ["unitId", "adIntervals", "adType", "adTheme", "height"], mpEquiv: "<ad>", tier: "L1", status: "implemented" }
|
|
3874
3978
|
];
|
|
3875
3979
|
var GESTURE = [
|
|
3876
|
-
|
|
3877
|
-
|
|
3878
|
-
|
|
3879
|
-
|
|
3880
|
-
{ id: "
|
|
3881
|
-
{ id: "
|
|
3882
|
-
{ id: "
|
|
3883
|
-
{ id: "
|
|
3980
|
+
// ★2026-09-18:G1/G2 由 planned → implemented——`v-gesture:tap|longpress` 已双端落地
|
|
3981
|
+
// (编译器新增 `directive/v-gesture` 规则:MP 映射 bindtap/bindlongpress;Web 走 Pointer 识别器)。
|
|
3982
|
+
// ★G3–G7 **保持 planned**:MP 端无事件对等(官方用 worklet 手势处理器<组件>,框架未生成),
|
|
3983
|
+
// mpEquiv 已改为**如实描述**(原值 bindswipe/bindtouchmove/组合/3D Touch 多为不准确表述)。
|
|
3984
|
+
{ id: "G1", kind: "gesture", semantic: "gesture.tap", api: "v-gesture:tap", props: ["count"], mpEquiv: "bindtap\uFF08\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u7F16\u8BD1\u5668\u76F4\u6620\u5C04\uFF09", tier: "L1", status: "implemented" },
|
|
3985
|
+
{ id: "G2", kind: "gesture", semantic: "gesture.longpress", api: "v-gesture:longpress", props: ["duration", "onEnd"], mpEquiv: "bindlongpress\uFF08\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u7F16\u8BD1\u5668\u76F4\u6620\u5C04\uFF09", tier: "L1", status: "implemented" },
|
|
3986
|
+
{ id: "G3", kind: "gesture", semantic: "gesture.swipe", api: "v-gesture:swipe", props: ["direction", "threshold"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u9700 @touchstart/@touchend \u81EA\u884C\u5224\u5B9A\u65B9\u5411", tier: "L1", status: "planned" },
|
|
3987
|
+
{ id: "G4", kind: "gesture", semantic: "gesture.pan", api: "v-gesture:pan", props: ["axis", "bounds"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u5B98\u65B9 <pan-gesture-handler>\uFF08worklet\uFF09\u6216 touch \u65CF\u81EA\u884C\u5224\u5B9A", tier: "L1", status: "planned" },
|
|
3988
|
+
{ id: "G5", kind: "gesture", semantic: "gesture.pinch", api: "v-gesture:pinch", props: ["scale", "onChange"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u5B98\u65B9 <scale-gesture-handler>\uFF08worklet\uFF09", tier: "L1", status: "planned" },
|
|
3989
|
+
{ id: "G6", kind: "gesture", semantic: "gesture.rotate", api: "v-gesture:rotate", props: ["angle"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\uFF08MP \u65E0 rotate \u624B\u52BF\u5904\u7406\u5668\uFF09", tier: "L1", status: "planned" },
|
|
3990
|
+
{ id: "G7", kind: "gesture", semantic: "gesture.press", api: "v-gesture:press", props: ["force"], mpEquiv: "\u65E0\u539F\u751F\u4E8B\u4EF6\u2014\u2014\u5B98\u65B9 <force-press-gesture-handler>\uFF08worklet\uFF0C\u9700 3D Touch \u8BBE\u5907\uFF09", tier: "L1", status: "planned" },
|
|
3991
|
+
{ id: "G8", kind: "gesture", semantic: "gesture.draggable", tag: "p-draggable", props: ["direction", "inertia", "outOfBounds", "x", "y", "damping", "friction", "disabled", "scaleEnabled", "scaleMin", "scaleMax", "scaleValue", "animation", "scaleArea", "ghost", "snapToGrid", "onDrop"], mpEquiv: "movable-view", tier: "L1", status: "implemented" },
|
|
3884
3992
|
{ id: "G9", kind: "gesture", semantic: "gesture.scrollable", tag: "p-scrollable", props: ["bounce", "refresh", "loadMore"], mpEquiv: "<scroll-view>", tier: "L1", status: "implemented" },
|
|
3885
3993
|
{ id: "G10", kind: "gesture", semantic: "gesture.use-gesture", api: "useGesture()", props: ["recognizers", "simultaneous"], mpEquiv: "\u65E0", tier: "L1", status: "planned" }
|
|
3886
3994
|
];
|
|
@@ -3889,9 +3997,10 @@ ${summary}
|
|
|
3889
3997
|
}
|
|
3890
3998
|
var CAPABILITY = [
|
|
3891
3999
|
// 7.1 设备/硬件(15)
|
|
3892
|
-
|
|
4000
|
+
// ★2026-09-18 双形态(E8 先例):能力入口组件 p-pick-photo 即 useCamera() 的声明式入口
|
|
4001
|
+
{ id: "C1", kind: "capability", semantic: "capability.camera", api: "useCamera()", tag: "p-pick-photo", props: ["Result<Media>"], mpEquiv: "wx.createCameraContext", tier: "L1", status: "implemented" },
|
|
3893
4002
|
cap("C2", "microphone", "useMicrophone()", "RecorderManager", "Result<AudioBuffer>"),
|
|
3894
|
-
{ id: "C3", kind: "capability", semantic: "capability.location", api: "useLocation()", props: ["Result<Coords>"], mpEquiv: "wx.getLocation", tier: "L1", status: "implemented" },
|
|
4003
|
+
{ id: "C3", kind: "capability", semantic: "capability.location", api: "useLocation()", tag: "p-location", props: ["Result<Coords>"], mpEquiv: "wx.getLocation", tier: "L1", status: "implemented" },
|
|
3895
4004
|
cap("C4", "map", "useMap()", "wx.createMapContext", "MapController"),
|
|
3896
4005
|
cap("C5", "sensor", "useSensor()", "onAccelerometer/onCompass/onGyroscope", "SensorStream"),
|
|
3897
4006
|
cap("C6", "vibrate", "useVibrate()", "wx.vibrateShort/Long", "void"),
|
|
@@ -3933,7 +4042,8 @@ ${summary}
|
|
|
3933
4042
|
cap("C39", "face-id", "useFaceID()", "\u7EC4\u5408", "Result<boolean>"),
|
|
3934
4043
|
cap("C40", "payment", "usePayment()", "wx.requestPayment", "Result<PayResult>"),
|
|
3935
4044
|
cap("C41", "login", "useLogin()", "wx.login", "Result<Token>"),
|
|
3936
|
-
|
|
4045
|
+
// ★2026-09-18 双形态(E8 先例):能力入口组件 p-scan-qr 即 useQRCode() 的声明式入口
|
|
4046
|
+
{ id: "C42", kind: "capability", semantic: "capability.qr-code", api: "useQRCode()", tag: "p-scan-qr", props: ["Result<string>"], mpEquiv: "wx.scanCode + canvas", tier: "L1", status: "implemented" },
|
|
3937
4047
|
cap("C43", "file-system", "useFileSystem()", "wx.getFileSystemManager", "FSAdapter"),
|
|
3938
4048
|
cap("C44", "archive", "useArchive()", "wx.compressFile", "Result<void>"),
|
|
3939
4049
|
cap("C45", "shortcut", "useShortcut()", "wx.addToDesktop", "Result<void>"),
|
|
@@ -3942,7 +4052,49 @@ ${summary}
|
|
|
3942
4052
|
{ id: "C47", kind: "capability", semantic: "capability.mini-program", api: "useMiniProgram()", props: ["MPContext"], mpEquiv: "wx.navigateToMiniProgram", tier: "L1", status: "planned" },
|
|
3943
4053
|
{ id: "C48", kind: "capability", semantic: "capability.embedded", api: "useEmbedded()", props: ["HostContext"], mpEquiv: "\u65E0\uFF08\u88AB\u5BBF\u4E3B\u5D4C\u5165\uFF09", tier: "L1", status: "planned" },
|
|
3944
4054
|
{ id: "C49", kind: "capability", semantic: "capability.live", api: "useLive()", props: ["LiveRoom"], mpEquiv: "wx...\uFF08\u76F4\u64AD\u7EC4\u4EF6\uFF09", tier: "L1", status: "planned" },
|
|
3945
|
-
{ id: "C50", kind: "capability", semantic: "capability.extension", api: "useExtension()", props: ["ExtensionAPI"], mpEquiv: "\u65E0\uFF08\u63D2\u4EF6/\u6269\u5C55\u70B9 G-21\uFF09", tier: "L1", status: "planned" }
|
|
4055
|
+
{ id: "C50", kind: "capability", semantic: "capability.extension", api: "useExtension()", props: ["ExtensionAPI"], mpEquiv: "\u65E0\uFF08\u63D2\u4EF6/\u6269\u5C55\u70B9 G-21\uFF09", tier: "L1", status: "planned" },
|
|
4056
|
+
// ★颗粒度对齐 C(2026-09-11):C51 小程序热更新(wx.getUpdateManager)
|
|
4057
|
+
{ id: "C51", kind: "capability", semantic: "capability.update", api: "useUpdate()", props: ["UpdateManagerAPI"], mpEquiv: "wx.getUpdateManager", tier: "L1", status: "planned" },
|
|
4058
|
+
// ★颗粒度对齐 C3(2026-09-11):相册 / Worker(对齐小程序媒体与多线程 API——纯 Hook,无 C-IR 节点 → planned)
|
|
4059
|
+
{ id: "C52", kind: "capability", semantic: "capability.album", api: "useAlbum()", props: ["AlbumAPI"], mpEquiv: "wx.chooseMedia/saveImageToPhotosAlbum/previewMedia", tier: "L1", status: "planned" },
|
|
4060
|
+
{ id: "C53", kind: "capability", semantic: "capability.worker", api: "useWorker()", props: ["WorkerHandle"], mpEquiv: "wx.createWorker", tier: "L1", status: "planned" },
|
|
4061
|
+
// ★颗粒度对齐 C3 批 2:收货地址 / WiFi / 微信运动(对齐小程序系统 API——纯 Hook → planned)
|
|
4062
|
+
{ id: "C54", kind: "capability", semantic: "capability.address", api: "useAddress()", props: ["ShippingAddress"], mpEquiv: "wx.chooseAddress", tier: "L1", status: "planned" },
|
|
4063
|
+
{ id: "C55", kind: "capability", semantic: "capability.wifi", api: "useWifi()", props: ["WifiAPI"], mpEquiv: "wx.getConnectedWifi/getWifiList/connectWifi", tier: "L1", status: "planned" },
|
|
4064
|
+
{ id: "C56", kind: "capability", semantic: "capability.we-run", api: "useWeRun()", props: ["WeRunData"], mpEquiv: "wx.getWeRunData", tier: "L1", status: "planned" },
|
|
4065
|
+
// ★组件实例 API 对齐(2026-09-12):画布组件实例(wx.createCanvasContext/SelectorQuery node/canvasToTempFilePath/OffscreenCanvas;纯 Hook → planned)
|
|
4066
|
+
{ id: "C57", kind: "capability", semantic: "capability.canvas", api: "useCanvas()", props: ["CanvasController"], mpEquiv: "wx.createCanvasContext/canvasToTempFilePath/createOffscreenCanvas", tier: "L1", status: "planned" },
|
|
4067
|
+
// ★组件实例 API 对齐(2026-09-12):元素查询 / 交叉观察 / 媒体查询(wx SelectorQuery/IntersectionObserver/MediaQueryObserver)
|
|
4068
|
+
{ id: "C58", kind: "capability", semantic: "capability.element-query", api: "useElement()", props: ["ElementQuery"], mpEquiv: "wx.createSelectorQuery", tier: "L1", status: "planned" },
|
|
4069
|
+
{ id: "C59", kind: "capability", semantic: "capability.intersection", api: "useIntersection()", props: ["IntersectionHandle"], mpEquiv: "wx.createIntersectionObserver", tier: "L1", status: "planned" },
|
|
4070
|
+
{ id: "C60", kind: "capability", semantic: "capability.media-query", api: "useMediaQuery()", props: ["MediaQueryObserver"], mpEquiv: "wx.createMediaQueryObserver", tier: "L1", status: "planned" },
|
|
4071
|
+
// ★组件实例 API 对齐(2026-09-12):媒体组件实例 + 广告(wx VideoContext/InnerAudioContext/LivePusherContext + 广告联盟)
|
|
4072
|
+
{ id: "C61", kind: "capability", semantic: "capability.video", api: "useVideo()", props: ["VideoController"], mpEquiv: "wx.createVideoContext", tier: "L1", status: "planned" },
|
|
4073
|
+
{ id: "C62", kind: "capability", semantic: "capability.audio", api: "useAudio()", props: ["AudioController"], mpEquiv: "wx.createInnerAudioContext", tier: "L1", status: "planned" },
|
|
4074
|
+
{ id: "C63", kind: "capability", semantic: "capability.live-pusher", api: "useLivePusher()", props: ["LivePusherController"], mpEquiv: "wx.createLivePusherContext", tier: "L1", status: "planned" },
|
|
4075
|
+
{ id: "C64", kind: "capability", semantic: "capability.ad", api: "useAd()", props: ["AdAPI"], mpEquiv: "wx.createRewardedVideoAd/createInterstitialAd/createBannerAd", tier: "L1", status: "planned" },
|
|
4076
|
+
// ★权威标尺缺口补齐(2026-09-12):隐私协议(wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize——合规刚需)
|
|
4077
|
+
{ id: "C65", kind: "capability", semantic: "capability.privacy", api: "usePrivacy()", props: ["PrivacyAPI"], mpEquiv: "wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize", tier: "L1", status: "planned" },
|
|
4078
|
+
// ★权威标尺缺口补齐批 D(2026-09-12):性能 / 预加载 / 图像编辑(通用能力,无资质门槛)
|
|
4079
|
+
{ id: "C66", kind: "capability", semantic: "capability.performance", api: "usePerformance()", props: ["PerformanceAPI"], mpEquiv: "wx.getPerformance/reportPerformance", tier: "L1", status: "planned" },
|
|
4080
|
+
{ id: "C67", kind: "capability", semantic: "capability.preload", api: "usePreload()", props: ["PreloadAPI"], mpEquiv: "wx.preloadAssets/preloadSkylineView/preloadWebview/preDownloadSubpackage", tier: "L1", status: "planned" },
|
|
4081
|
+
{ id: "C68", kind: "capability", semantic: "capability.image-edit", api: "useImageEdit()", props: ["ImageEditAPI"], mpEquiv: "wx.cropImage/editImage", tier: "L1", status: "planned" },
|
|
4082
|
+
// ★权威标尺缺口补齐批 E(2026-09-12):网络底层 / 媒体高级
|
|
4083
|
+
{ id: "C69", kind: "capability", semantic: "capability.socket", api: "useSocket()", props: ["UDPSocketHandle / TCPSocketHandle"], mpEquiv: "wx.createUDPSocket/createTCPSocket", tier: "L1", status: "planned" },
|
|
4084
|
+
{ id: "C70", kind: "capability", semantic: "capability.media-processing", api: "useMediaProcessing()", props: ["MediaProcessingAPI"], mpEquiv: "wx.createMediaContainer/createVideoDecoder/createMediaAudioPlayer", tier: "L1", status: "planned" },
|
|
4085
|
+
// ★权威标尺缺口补齐批 F(2026-09-12):录屏/缓存/空闲/窗口/导航拦截
|
|
4086
|
+
{ id: "C71", kind: "capability", semantic: "capability.screen-capture", api: "useScreenCapture()", props: ["ScreenCaptureAPI"], mpEquiv: "wx.getScreenRecordingState/onScreenRecordingStateChanged/onUserCaptureScreen/checkIsPictureInPictureActive", tier: "L1", status: "planned" },
|
|
4087
|
+
{ id: "C72", kind: "capability", semantic: "capability.cache-manager", api: "useCacheManager()", props: ["CacheManagerHandle"], mpEquiv: "wx.createCacheManager", tier: "L1", status: "planned" },
|
|
4088
|
+
{ id: "C73", kind: "capability", semantic: "capability.idle", api: "useIdle()", props: ["IdleAPI"], mpEquiv: "wx.requestIdleCallback/cancelIdleCallback", tier: "L1", status: "planned" },
|
|
4089
|
+
{ id: "C74", kind: "capability", semantic: "capability.window", api: "useWindow()", props: ["WindowAPI"], mpEquiv: "wx.setWindowSize", tier: "L1", status: "planned" },
|
|
4090
|
+
{ id: "C75", kind: "capability", semantic: "capability.navigation-guard", api: "useNavigationGuard()", props: ["NavigationGuardAPI"], mpEquiv: "wx.enableAlertBeforeUnload/disableAlertBeforeUnload", tier: "L1", status: "planned" },
|
|
4091
|
+
// ★权威标尺缺口补齐批 G(2026-09-12):AR/XR / iBeacon / 局域网 / 翻译 / 海报 / 设备探测
|
|
4092
|
+
{ id: "C76", kind: "capability", semantic: "capability.ar", api: "useAR()", props: ["ARAPI"], mpEquiv: "wx.createVKSession/isVKSupport", tier: "L1", status: "planned" },
|
|
4093
|
+
{ id: "C77", kind: "capability", semantic: "capability.beacon", api: "useBeacon()", props: ["BeaconAPI"], mpEquiv: "wx.onBeaconServiceChange/onBeaconUpdate", tier: "L1", status: "planned" },
|
|
4094
|
+
{ id: "C78", kind: "capability", semantic: "capability.local-service", api: "useLocalService()", props: ["LocalServiceAPI"], mpEquiv: "wx.onLocalServiceFound/Lost/ResolveFail/DiscoveryStop", tier: "L1", status: "planned" },
|
|
4095
|
+
{ id: "C79", kind: "capability", semantic: "capability.translation", api: "useTranslation()", props: ["TranslationAPI"], mpEquiv: "wx.onUserTriggerTranslation/onUserOffTranslation", tier: "L1", status: "planned" },
|
|
4096
|
+
{ id: "C80", kind: "capability", semantic: "capability.poster", api: "usePoster()", props: ["PosterAPI"], mpEquiv: "wx.onGeneratePoster", tier: "L1", status: "planned" },
|
|
4097
|
+
{ id: "C81", kind: "capability", semantic: "capability.device-capability", api: "useDeviceCapability()", props: ["DeviceCapabilityAPI"], mpEquiv: "wx.checkDeviceSupportHevc", tier: "L1", status: "planned" }
|
|
3946
4098
|
];
|
|
3947
4099
|
var ENGINEERING = [
|
|
3948
4100
|
{ id: "E1", kind: "engineering", semantic: "engineering.state", api: "useState()", mpEquiv: "data", tier: "L1", status: "planned" },
|
|
@@ -3952,7 +4104,8 @@ ${summary}
|
|
|
3952
4104
|
{ id: "E5", kind: "engineering", semantic: "engineering.provide-inject", api: "useProvide()/useInject()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
|
|
3953
4105
|
{ id: "E6", kind: "engineering", semantic: "engineering.lifecycle", api: "useLifecycle()", mpEquiv: "onLoad/onShow/onHide/onUnload", tier: "L1", status: "planned" },
|
|
3954
4106
|
{ id: "E7", kind: "engineering", semantic: "engineering.ready", api: "useReady()", mpEquiv: "onReady", tier: "L1", status: "planned" },
|
|
3955
|
-
{ id: "E8", kind: "engineering", semantic: "engineering.error-boundary", api: "useErrorBoundary()", mpEquiv: "onError", tier: "L1", status: "planned" },
|
|
4107
|
+
{ id: "E8", kind: "engineering", semantic: "engineering.error-boundary", api: "useErrorBoundary()", tag: "p-error-boundary", mpEquiv: "onError", tier: "L1", status: "planned" },
|
|
4108
|
+
// ★#405:组件形态补登(双形态:Hook + p- 标签)
|
|
3956
4109
|
{ id: "E9", kind: "engineering", semantic: "engineering.page-param", api: "usePageParam()", mpEquiv: "onLoad(options)", tier: "L1", status: "planned" },
|
|
3957
4110
|
{ id: "E10", kind: "engineering", semantic: "engineering.route", api: "useRoute()", mpEquiv: "getCurrentPages()", tier: "L1", status: "planned" },
|
|
3958
4111
|
{ id: "E11", kind: "engineering", semantic: "engineering.router-push", api: "router.push()", mpEquiv: "wx.navigateTo", tier: "L1", status: "planned" },
|
|
@@ -3962,7 +4115,7 @@ ${summary}
|
|
|
3962
4115
|
{ id: "E15", kind: "engineering", semantic: "engineering.router-relaunch", api: "router.reLaunch()", mpEquiv: "wx.reLaunch", tier: "L1", status: "planned" },
|
|
3963
4116
|
{ id: "E16", kind: "engineering", semantic: "engineering.router-before-each", api: "router.beforeEach()", mpEquiv: "onLaunch \u624B\u52A8", tier: "L1", status: "planned" },
|
|
3964
4117
|
{ id: "E17", kind: "engineering", semantic: "engineering.router-after-each", api: "router.afterEach()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
|
|
3965
|
-
{ id: "E18", kind: "engineering", semantic: "engineering.router-link", tag: "p-router-link", props: ["to", "replace", "switchTab"], mpEquiv: "<navigator>", tier: "L1", status: "implemented" },
|
|
4118
|
+
{ id: "E18", kind: "engineering", semantic: "engineering.router-link", tag: "p-router-link", props: ["to", "replace", "switchTab", "target", "url", "openType", "delta", "appId", "path", "extraData", "version", "shortLink", "hoverClass", "hoverStopPropagation", "hoverStartTime", "hoverStayTime"], mpEquiv: "<navigator>", tier: "L1", status: "implemented" },
|
|
3966
4119
|
{ id: "E19", kind: "engineering", semantic: "engineering.transition", tag: "p-transition", props: ["name", "mode"], mpEquiv: "transition CSS", tier: "L1", status: "implemented" },
|
|
3967
4120
|
{ id: "E20", kind: "engineering", semantic: "engineering.animate", tag: "p-animate", props: ["keyframes", "duration"], mpEquiv: "animation CSS", tier: "L1", status: "implemented" },
|
|
3968
4121
|
{ id: "E21", kind: "engineering", semantic: "engineering.animation", api: "useAnimation()", mpEquiv: "wx.createAnimation", tier: "L1", status: "planned" },
|
|
@@ -3972,9 +4125,22 @@ ${summary}
|
|
|
3972
4125
|
{ id: "E25", kind: "engineering", semantic: "engineering.inspector", api: "useInspector()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
|
|
3973
4126
|
{ id: "E26", kind: "engineering", semantic: "engineering.performance", api: "usePerformance()", mpEquiv: "wx.reportPerformance", tier: "L1", status: "planned" },
|
|
3974
4127
|
{ id: "E27", kind: "engineering", semantic: "engineering.define-component", api: "defineComponent()", mpEquiv: "Component()", tier: "L1", status: "planned" },
|
|
3975
|
-
{ id: "E28", kind: "engineering", semantic: "engineering.define-capability", api: "defineCapability()", mpEquiv: "\u65E0", tier: "L1", status: "planned" }
|
|
4128
|
+
{ id: "E28", kind: "engineering", semantic: "engineering.define-capability", api: "defineCapability()", mpEquiv: "\u65E0", tier: "L1", status: "planned" },
|
|
4129
|
+
// ★批次 8(2026-09-18):共享元素转场(官方 <share-element> 对齐)——能力由宿主提供,框架只声明语义
|
|
4130
|
+
{ id: "E29", kind: "engineering", semantic: "engineering.share-element", tag: "p-share-element", props: ["shuttleKey", "animate", "duration", "easingFunction", "transitionOnGesture", "shuttleOnPush", "shuttleOnPop", "rectTweenType"], mpEquiv: "<share-element>\uFF08\u5BBF\u4E3B\u8DE8\u9875\u98DE\u884C\u52A8\u753B\uFF09", tier: "L1", status: "implemented" },
|
|
4131
|
+
// ★E30(2026-09-19):WebMCP 接入——把**能力面**暴露为浏览器内 agent 可调用工具。
|
|
4132
|
+
// 规范面:`document.modelContext.registerTool(...)`(★非 navigator)+ signal 注销(规范无 unregisterTool);
|
|
4133
|
+
// 灵感来自 VueUse v15 `useWebMCP`(document 命名空间 / signal 注销 / 方法可调用探测 / 三元组返回)。
|
|
4134
|
+
// 框架差异化:能力面统一 `CapResult<T>` 契约(G-32.4)→ 能力可**自动**派生为工具、响应归一不必逐个手写。
|
|
4135
|
+
// ★状态口径(与 E1-E28 / C15 / C26 等同款,非本轮新引入):hook 形态原语无**渲染后端映射**,
|
|
4136
|
+
// 故按 catalog 既有约定记 `planned`——该字段反映「已在 SEMANTIC_BACKEND_MAP 登记 ≥3 端」,
|
|
4137
|
+
// 不等于「代码未实现」(本原语已实现于 `packages/api/src/mcp.ts`)。
|
|
4138
|
+
// `mpEquiv: 无`:WebMCP 是浏览器侧 agent 通道,小程序无 `document.modelContext` → 如实降级(isSupported=false)。
|
|
4139
|
+
{ id: "E30", kind: "engineering", semantic: "engineering.mcp", api: "useMCP()", props: ["tools", "capabilities", "prefix"], mpEquiv: "\u65E0\uFF08\u6D4F\u89C8\u5668\u4FA7 agent \u901A\u9053\uFF1BMP \u7AEF isSupported=false \u8BDA\u5B9E\u964D\u7EA7\uFF09", tier: "L1", status: "planned" }
|
|
3976
4140
|
];
|
|
3977
4141
|
var PRIMITIVE_CATALOG = [...LAYOUT, ...UI, ...SHELL, ...GESTURE, ...CAPABILITY, ...ENGINEERING];
|
|
4142
|
+
|
|
4143
|
+
// ../component-ir/src/audit.ts
|
|
3978
4144
|
var MP_COMPONENTS = [
|
|
3979
4145
|
{ mp: "<view>", proteus: "layout.box / layout.stack", status: "ok", group: "component" },
|
|
3980
4146
|
{ mp: "<text>", proteus: "ui.text / ui.heading", status: "ok", group: "component" },
|
|
@@ -3984,10 +4150,10 @@ ${summary}
|
|
|
3984
4150
|
{ mp: "<swiper-item>", proteus: "layout.stack \u5B50\u9879", status: "ok", group: "component" },
|
|
3985
4151
|
{ mp: "<movable-area>", proteus: "gesture.scrollable \u5BB9\u5668", status: "ok", group: "component" },
|
|
3986
4152
|
{ mp: "<movable-view>", proteus: "gesture.draggable", status: "ok", group: "component" },
|
|
3987
|
-
{ mp: "<cover-view>", proteus: "
|
|
3988
|
-
{ mp: "<cover-image>", proteus: "
|
|
4153
|
+
{ mp: "<cover-view>", proteus: "layout.box\uFF08Skyline \u540C\u5C42\u6E32\u67D3\u540E view \u5373\u53EF\u8986\u76D6\u2014\u2014\u5B98\u65B9\u5EFA\u8BAE\u66FF\u4EE3\uFF09", status: "ok", group: "component" },
|
|
4154
|
+
{ mp: "<cover-image>", proteus: "ui.image\uFF08\u540C\u5C42\u6E32\u67D3\u540E image \u5373\u53EF\u8986\u76D6\uFF09", status: "ok", group: "component" },
|
|
3989
4155
|
{ mp: "<icon>", proteus: "ui.icon", status: "ok", group: "component" },
|
|
3990
|
-
{ mp: "<progress>", proteus: "
|
|
4156
|
+
{ mp: "<progress>", proteus: "ui.progress", status: "ok", group: "component" },
|
|
3991
4157
|
{ mp: "<rich-text>", proteus: "ui.rich-text", status: "ok", group: "component" },
|
|
3992
4158
|
{ mp: "<button>", proteus: "ui.button", status: "ok", group: "component" },
|
|
3993
4159
|
{ mp: "<form>", proteus: "ui.form", status: "ok", group: "component" },
|
|
@@ -3999,58 +4165,211 @@ ${summary}
|
|
|
3999
4165
|
{ mp: "<picker-view>", proteus: "ui.picker mode=wheel", status: "ok", group: "component" },
|
|
4000
4166
|
{ mp: "<slider>", proteus: "ui.slider", status: "ok", group: "component" },
|
|
4001
4167
|
{ mp: "<switch>", proteus: "ui.switch", status: "ok", group: "component" },
|
|
4002
|
-
{ mp: "<label>", proteus: "
|
|
4168
|
+
{ mp: "<label>", proteus: "ui.label", status: "ok", group: "component" },
|
|
4003
4169
|
{ mp: "<navigator>", proteus: "engineering.router-link / router.*", status: "ok", group: "component" },
|
|
4004
4170
|
{ mp: "<audio>", proteus: "ui.media kind=audio\uFF08\u6D88\u706D\u4E3A\u5C5E\u6027\uFF09", status: "ok", group: "component" },
|
|
4005
4171
|
{ mp: "<video>", proteus: "ui.media kind=video\uFF08\u6D88\u706D\u4E3A\u5C5E\u6027\uFF09", status: "ok", group: "component" },
|
|
4006
|
-
{ mp: "<camera>", proteus: "
|
|
4172
|
+
{ mp: "<camera>", proteus: "ui.camera\uFF08p-camera\uFF09+ useCamera", status: "ok", group: "component" },
|
|
4007
4173
|
{ mp: "<live-player>", proteus: "ui.media kind=live\uFF08\u6D88\u706D\u4E3A\u5C5E\u6027\uFF09", status: "ok", group: "component" },
|
|
4008
4174
|
{ mp: "<live-pusher>", proteus: "ui.media kind=live mode=push", status: "ok", group: "component" },
|
|
4009
4175
|
{ mp: "<canvas>", proteus: "ui.canvas", status: "ok", group: "component" },
|
|
4010
|
-
{ mp: "<map>", proteus: "
|
|
4011
|
-
{ mp: "<web-view>", proteus: "
|
|
4176
|
+
{ mp: "<map>", proteus: "ui.map\uFF08p-map\uFF09+ useMap", status: "ok", group: "component" },
|
|
4177
|
+
{ mp: "<web-view>", proteus: "shell.webview\uFF08p-webview\uFF09+ \u5BBF\u4E3B\u6865", status: "ok", group: "component" },
|
|
4012
4178
|
{ mp: "<editor>", proteus: "ui.rich-text editable", status: "ok", group: "component" },
|
|
4013
|
-
{ mp: "<ad>", proteus: "
|
|
4014
|
-
{ mp: "<official-account>", proteus: "
|
|
4015
|
-
{ mp: "<open-data>", proteus: "
|
|
4016
|
-
{ mp: "<share-element>", proteus: "
|
|
4017
|
-
{ mp: "<aria-component>", proteus: "
|
|
4018
|
-
{ mp: "<page-container>", proteus: "
|
|
4019
|
-
{ mp: "<voip-room>", proteus: "
|
|
4020
|
-
{ mp: "<guild-room>", proteus: "
|
|
4179
|
+
{ mp: "<ad>", proteus: "shell.ad\uFF08p-ad\uFF09", status: "ok", group: "component" },
|
|
4180
|
+
{ mp: "<official-account>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
|
|
4181
|
+
{ mp: "<open-data>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", status: "private", group: "component" },
|
|
4182
|
+
{ mp: "<share-element>", proteus: "engineering.share-element\uFF08p-share-element\uFF09", status: "ok", group: "component" },
|
|
4183
|
+
{ mp: "<aria-component>", proteus: "aria-* \u5C5E\u6027\uFF08\u5404\u7EC4\u4EF6 ariaLabel\uFF1B\u4E24\u7AEF\u539F\u751F\u652F\u6301\uFF09", status: "ok", group: "component" },
|
|
4184
|
+
{ mp: "<page-container>", proteus: "shell.page-container", status: "ok", group: "component" },
|
|
4185
|
+
{ mp: "<voip-room>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1 VOIP\uFF09", status: "private", group: "component" },
|
|
4186
|
+
{ mp: "<guild-room>", proteus: "useMiniProgram\uFF08\u5FAE\u4FE1\u6E38\u620F\uFF09", status: "private", group: "component" },
|
|
4187
|
+
// ★2026-09-11 补齐:此前矩阵漏列的真实微信内置组件(Skyline 族为主)——有等价能力标 ok/compat,无则 missing
|
|
4188
|
+
{ mp: "<match-media>", proteus: "p-adaptive / p-zone\uFF08\u5BB9\u5668\u65AD\u70B9\u66FF\u4EE3\uFF09", status: "ok", group: "component" },
|
|
4189
|
+
{ mp: "<navigation-bar>", proteus: "shell.nav\uFF08p-nav-bar \u81EA\u7ED8\uFF09", status: "ok", group: "component" },
|
|
4190
|
+
{ mp: "<keyframe-animation>", proteus: "engineering.animate / engineering.transition", status: "ok", group: "component" },
|
|
4191
|
+
{ mp: "<list-view>", proteus: "layout.virtual-list\uFF08p-list-view \u56DE\u6536\uFF09", status: "ok", group: "component" },
|
|
4192
|
+
{ mp: "<grid-view>", proteus: "layout.grid / layout.virtual-list", status: "ok", group: "component" },
|
|
4193
|
+
{ mp: "<snapshot>", proteus: "ui.canvas\uFF08\u622A\u56FE\u7ECF OffscreenCanvas\uFF09", status: "compat", group: "component" },
|
|
4194
|
+
{ mp: "<page-meta>", proteus: "shell.page\uFF08\u9875\u9762\u914D\u7F6E\u5C5E\u6027\uFF09", status: "compat", group: "component" },
|
|
4195
|
+
{ mp: "<root-portal>", proteus: "engineering.transition\uFF08teleport\u2192root-portal \u7F16\u8BD1\u671F\uFF09", status: "ok", group: "component" },
|
|
4196
|
+
{ mp: "<sticky-header>", proteus: "layout.scroll + sticky\uFF08CSS\uFF09", status: "compat", group: "component" },
|
|
4197
|
+
{ mp: "<sticky-section>", proteus: "layout.scroll + sticky\uFF08CSS\uFF09", status: "compat", group: "component" },
|
|
4198
|
+
{ mp: "<double-tap-gesture>", proteus: "gesture.draggable\uFF08p-draggable \u624B\u52BF\u8BC6\u522B\u5668\uFF09", status: "ok", group: "component" },
|
|
4199
|
+
{ mp: "<functional-page-navigator>", proteus: "\u2014\uFF08\u5FAE\u4FE1\u63D2\u4EF6\u9875\u4E13\u5C5E\uFF0C\u975E\u76EE\u6807\uFF09", status: "private", group: "component" },
|
|
4200
|
+
{ mp: "<open-container>", proteus: "\u2014\uFF08\u5FAE\u4FE1\u5F00\u5C4F\u5BB9\u5668\uFF0C\u79C1\u6709\uFF09", status: "private", group: "component" },
|
|
4201
|
+
// ★权威标尺批 H:局部文本选区 / 键盘上方工具栏(全端真实落地)
|
|
4202
|
+
{ mp: "<selection>", proteus: "ui.selection\uFF08p-selection\uFF09", status: "ok", group: "component" },
|
|
4203
|
+
{ mp: "<keyboard-accessory>", proteus: "shell.keyboard-accessory\uFF08p-keyboard-accessory\uFF09", status: "ok", group: "component" }
|
|
4021
4204
|
];
|
|
4022
4205
|
var MP_API_GROUPS = [
|
|
4023
|
-
{ mp: "wx.request/upload/download/websocket\uFF08\u7F51\u7EDC\uFF09", proteus: "
|
|
4024
|
-
{ mp: "wx.requestPayment", proteus: "
|
|
4025
|
-
{ mp: "wx.chooseImage/chooseMedia/previewImage\uFF08\u5A92\u4F53\uFF09", proteus: "
|
|
4026
|
-
{ mp: "wx.startRecord/RecorderManager\uFF08\u5F55\u97F3\uFF09", proteus: "
|
|
4027
|
-
{ mp: "wx.createVideoContext/CameraContext", proteus: "
|
|
4028
|
-
{ mp: "wx.scanCode", proteus: "
|
|
4029
|
-
{ mp: "wx.saveImageToPhotosAlbum", proteus: "
|
|
4030
|
-
{ mp: "wx.
|
|
4031
|
-
{ mp: "wx.
|
|
4032
|
-
{ mp: "wx.
|
|
4033
|
-
{ mp: "wx.
|
|
4034
|
-
|
|
4035
|
-
{ mp: "wx.
|
|
4036
|
-
{ mp: "wx.
|
|
4037
|
-
{ mp: "wx.
|
|
4038
|
-
{ mp: "wx.
|
|
4039
|
-
{ mp: "wx.
|
|
4206
|
+
{ mp: "wx.request/upload/download/websocket\uFF08\u7F51\u7EDC\uFF09", proteus: "useFetch / useUpload / useDownload / useWebSocket / useSocketTask", status: "ok", group: "api" },
|
|
4207
|
+
{ mp: "wx.requestPayment", proteus: "usePayment", status: "ok", group: "api" },
|
|
4208
|
+
{ mp: "wx.chooseImage/chooseMedia/previewImage\uFF08\u5A92\u4F53\uFF09", proteus: "useAlbum / useCamera + ui.image", status: "ok", group: "api" },
|
|
4209
|
+
{ mp: "wx.startRecord/RecorderManager\uFF08\u5F55\u97F3\uFF09", proteus: "useMicrophone / useRecorder", status: "ok", group: "api" },
|
|
4210
|
+
{ mp: "wx.createVideoContext/CameraContext", proteus: "ui.media + createCameraContext\uFF08ui.canvas \u627F\u63A5\uFF09", status: "ok", group: "api" },
|
|
4211
|
+
{ mp: "wx.scanCode", proteus: "useQRCode / p-scan-qr", status: "ok", group: "api" },
|
|
4212
|
+
{ mp: "wx.saveImageToPhotosAlbum/saveVideoToPhotosAlbum", proteus: "useAlbum\uFF08saveImage/saveVideo\uFF09", status: "ok", group: "api" },
|
|
4213
|
+
{ mp: "wx.createWorker\uFF08\u591A\u7EBF\u7A0B\uFF09", proteus: "useWorker", status: "ok", group: "api" },
|
|
4214
|
+
{ mp: "wx.chooseAddress\uFF08\u6536\u8D27\u5730\u5740\uFF09", proteus: "useAddress", status: "ok", group: "api" },
|
|
4215
|
+
{ mp: "wx.getConnectedWifi/getWifiList/connectWifi\uFF08WiFi\uFF09", proteus: "useWifi", status: "ok", group: "api" },
|
|
4216
|
+
{ mp: "wx.getWeRunData\uFF08\u5FAE\u4FE1\u8FD0\u52A8\uFF09", proteus: "useWeRun", status: "ok", group: "api" },
|
|
4217
|
+
// ★组件实例 API 对齐(2026-09-12):Canvas/查询/媒体组件实例(此前矩阵误标 useElement/useIntersection/useMedia——均为幽灵引用)
|
|
4218
|
+
{ mp: "wx.createCanvasContext / canvasToTempFilePath / createOffscreenCanvas\uFF08Canvas \u7EC4\u4EF6\u5B9E\u4F8B\uFF09", proteus: "useCanvas", status: "ok", group: "api" },
|
|
4219
|
+
{ mp: "wx.createSelectorQuery\uFF08\u5143\u7D20\u51E0\u4F55\u67E5\u8BE2\uFF09", proteus: "useElement", status: "ok", group: "api" },
|
|
4220
|
+
{ mp: "wx.createIntersectionObserver\uFF08\u4EA4\u53C9\u89C2\u5BDF\uFF09", proteus: "useIntersection", status: "ok", group: "api" },
|
|
4221
|
+
{ mp: "wx.createMediaQueryObserver\uFF08\u5A92\u4F53\u67E5\u8BE2\uFF09", proteus: "useMediaQuery", status: "ok", group: "api" },
|
|
4222
|
+
{ mp: "wx.createVideoContext\uFF08\u89C6\u9891\u7EC4\u4EF6\u5B9E\u4F8B\uFF09", proteus: "useVideo", status: "ok", group: "api" },
|
|
4223
|
+
{ mp: "wx.createInnerAudioContext\uFF08\u97F3\u9891\u5B9E\u4F8B\uFF09", proteus: "useAudio", status: "ok", group: "api" },
|
|
4224
|
+
{ mp: "wx.createLivePusherContext\uFF08\u76F4\u64AD\u63A8\u6D41\u5B9E\u4F8B\uFF09", proteus: "useLivePusher", status: "ok", group: "api" },
|
|
4225
|
+
{ mp: "wx.createRewardedVideoAd/createInterstitialAd/createBannerAd\uFF08\u5E7F\u544A\uFF09", proteus: "useAd", status: "ok", group: "api" },
|
|
4226
|
+
{ mp: "wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize\uFF08\u9690\u79C1\u534F\u8BAE\uFF09", proteus: "usePrivacy", status: "ok", group: "api" },
|
|
4227
|
+
{ mp: "wx.getPerformance/reportPerformance\uFF08\u6027\u80FD\uFF09", proteus: "usePerformance", status: "ok", group: "api" },
|
|
4228
|
+
{ mp: "wx.preloadAssets/preloadSkylineView/preloadWebview/preDownloadSubpackage\uFF08\u9884\u52A0\u8F7D\uFF09", proteus: "usePreload", status: "ok", group: "api" },
|
|
4229
|
+
{ mp: "wx.cropImage/editImage\uFF08\u56FE\u50CF\u7F16\u8F91\uFF09", proteus: "useImageEdit", status: "ok", group: "api" },
|
|
4230
|
+
{ mp: "wx.createUDPSocket/createTCPSocket\uFF08\u7F51\u7EDC\u5E95\u5C42 Socket\uFF09", proteus: "useSocket", status: "ok", group: "api" },
|
|
4231
|
+
{ mp: "wx.createMediaContainer/createVideoDecoder/createMediaAudioPlayer\uFF08\u5A92\u4F53\u9AD8\u7EA7\uFF09", proteus: "useMediaProcessing", status: "ok", group: "api" },
|
|
4232
|
+
{ mp: "wx.getScreenRecordingState/onScreenRecordingStateChanged/onUserCaptureScreen/checkIsPictureInPictureActive\uFF08\u5F55\u5C4F/\u622A\u5C4F\uFF09", proteus: "useScreenCapture", status: "ok", group: "api" },
|
|
4233
|
+
{ mp: "wx.createCacheManager\uFF08\u8BF7\u6C42\u7F13\u5B58\u7BA1\u7406\uFF09", proteus: "useCacheManager", status: "ok", group: "api" },
|
|
4234
|
+
{ mp: "wx.requestIdleCallback/cancelIdleCallback\uFF08\u7A7A\u95F2\u8C03\u5EA6\uFF09", proteus: "useIdle", status: "ok", group: "api" },
|
|
4235
|
+
{ mp: "wx.setWindowSize\uFF08PC \u7A97\u53E3\uFF09", proteus: "useWindow", status: "ok", group: "api" },
|
|
4236
|
+
{ mp: "wx.enableAlertBeforeUnload/disableAlertBeforeUnload\uFF08\u5378\u8F7D\u62E6\u622A\uFF09", proteus: "useNavigationGuard", status: "ok", group: "api" },
|
|
4237
|
+
{ mp: "wx.createVKSession/isVKSupport\uFF08AR/XR \u89C6\u89C9\u7B97\u6CD5\uFF09", proteus: "useAR", status: "ok", group: "api" },
|
|
4238
|
+
{ mp: "wx.onBeaconServiceChange/onBeaconUpdate\uFF08iBeacon\uFF09", proteus: "useBeacon", status: "ok", group: "api" },
|
|
4239
|
+
{ mp: "wx.onLocalServiceFound/Lost/ResolveFail/DiscoveryStop\uFF08\u5C40\u57DF\u7F51 mDNS\uFF09", proteus: "useLocalService", status: "ok", group: "api" },
|
|
4240
|
+
{ mp: "wx.onUserTriggerTranslation/onUserOffTranslation\uFF08\u7FFB\u8BD1\uFF09", proteus: "useTranslation", status: "ok", group: "api" },
|
|
4241
|
+
{ mp: "wx.onGeneratePoster\uFF08\u5206\u4EAB\u6D77\u62A5\uFF09", proteus: "usePoster", status: "ok", group: "api" },
|
|
4242
|
+
{ mp: "wx.checkDeviceSupportHevc\uFF08\u8BBE\u5907\u80FD\u529B\u63A2\u6D4B\uFF09", proteus: "useDeviceCapability", status: "ok", group: "api" },
|
|
4243
|
+
{ mp: "wx.getFileSystemManager/*\uFF08\u6587\u4EF6 30+\uFF09", proteus: "useFileSystem", status: "ok", group: "api" },
|
|
4244
|
+
{ mp: "wx.compressFile/unzip", proteus: "useArchive", status: "ok", group: "api" },
|
|
4245
|
+
{ mp: "wx.set/get/remove/clearStorage(+Sync)", proteus: "useStorage", status: "ok", group: "api" },
|
|
4246
|
+
{ mp: "wx.getLocation/chooseLocation/openLocation", proteus: "useLocation / p-location", status: "ok", group: "api" },
|
|
4247
|
+
{ mp: "wx.createMapContext", proteus: "useMap", status: "ok", group: "api" },
|
|
4248
|
+
{ mp: "wx.getSystemInfo\uFF08\u8BBE\u5907/\u5C4F\u5E55/\u7F51\u7EDC/\u7535\u91CF/\u4EAE\u5EA6/\u65B9\u5411/\u9707\u52A8/\u4F20\u611F\u5668/\u526A\u8D34\u677F/\u7535\u8BDD\uFF09", proteus: "useDevice / useScreen / useNetwork / useBattery / useBrightness / useOrientation / useVibrate / useSensor / useClipboard / usePhoneCall", status: "ok", group: "api" },
|
|
4249
|
+
{ mp: "wx.openBluetoothAdapter\uFF08\u84DD\u7259 20+\uFF09", proteus: "useBluetooth", status: "ok", group: "api" },
|
|
4250
|
+
{ mp: "wx.getHCEState\uFF08NFC\uFF09", proteus: "useNFC", status: "ok", group: "api" },
|
|
4251
|
+
{ mp: "wx.checkIsSupportFingerPrint/FaceID", proteus: "useBiometric / useFaceID", status: "ok", group: "api" },
|
|
4252
|
+
{ mp: "wx.showToast/showLoading/showModal/showActionSheet", proteus: "shell.toast + ui.loading + shell.modal + shell.action-sheet", status: "ok", group: "api" },
|
|
4040
4253
|
{ mp: "wx.setNavigationBarTitle/Color", proteus: "shell.nav", status: "ok", group: "api" },
|
|
4041
4254
|
{ mp: "wx.setTabBarItem/Style/hide/show", proteus: "shell.tabbar", status: "ok", group: "api" },
|
|
4042
|
-
{ mp: "wx.pageScrollTo", proteus: "
|
|
4043
|
-
{ mp: "wx.createAnimation", proteus: "engineering.
|
|
4044
|
-
{ mp: "wx.createSelectorQuery/IntersectionObserver", proteus: "
|
|
4045
|
-
{ mp: "wx.navigateTo/redirectTo/navigateBack/switchTab/reLaunch", proteus: "engineering.router-
|
|
4046
|
-
{ mp: "wx.getCurrentPages", proteus: "engineering.
|
|
4047
|
-
{ mp: "App()/Page() \u751F\u547D\u5468\u671F/getApp()", proteus: "
|
|
4048
|
-
{ mp: "wx.shareAppMessage/requestSubscribeMessage", proteus: "
|
|
4049
|
-
{ mp: "wx.login/checkSession/getUserInfo/authorize", proteus: "
|
|
4050
|
-
{ mp: "wx.getUpdateManager", proteus: "
|
|
4051
|
-
{ mp: "wx.requestWeChatPay/navigateToMiniProgram/\u6A21\u677F\u6D88\u606F/\u5BA2\u670D\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", proteus: "
|
|
4255
|
+
{ mp: "wx.pageScrollTo", proteus: "layout.scroll\uFF08p-scroll-view\uFF09", status: "ok", group: "api" },
|
|
4256
|
+
{ mp: "wx.createAnimation", proteus: "engineering.animate / engineering.transition", status: "ok", group: "api" },
|
|
4257
|
+
{ mp: "wx.createSelectorQuery/IntersectionObserver", proteus: "engineering.router-link + layout.scroll\uFF08\u5B9E\u6D4B\u80FD\u529B\uFF09", status: "ok", group: "api" },
|
|
4258
|
+
{ mp: "wx.navigateTo/redirectTo/navigateBack/switchTab/reLaunch", proteus: "engineering.router-link + router.* API", status: "ok", group: "api" },
|
|
4259
|
+
{ mp: "wx.getCurrentPages", proteus: "engineering.router-link + shared adapter", status: "ok", group: "api" },
|
|
4260
|
+
{ mp: "App()/Page() \u751F\u547D\u5468\u671F/getApp()", proteus: "useAppLifecycle / usePageLifecycle", status: "ok", group: "api" },
|
|
4261
|
+
{ mp: "wx.shareAppMessage/requestSubscribeMessage", proteus: "useShare / useNotification", status: "ok", group: "api" },
|
|
4262
|
+
{ mp: "wx.login/checkSession/getUserInfo/authorize", proteus: "useLogin / useAuth / usePermission", status: "ok", group: "api" },
|
|
4263
|
+
{ mp: "wx.getUpdateManager", proteus: "useUpdate", status: "ok", group: "api" },
|
|
4264
|
+
{ mp: "wx.requestWeChatPay/navigateToMiniProgram/\u6A21\u677F\u6D88\u606F/\u5BA2\u670D\uFF08\u5FAE\u4FE1\u79C1\u6709\uFF09", proteus: "useMiniProgram", status: "private", group: "api" }
|
|
4052
4265
|
];
|
|
4053
4266
|
var MP_MAPPING_MATRIX = [...MP_COMPONENTS, ...MP_API_GROUPS];
|
|
4267
|
+
|
|
4268
|
+
// ../component-ir/src/degradation.ts
|
|
4269
|
+
var PRIVATE_WEB_FALLBACK = {
|
|
4270
|
+
openType: "Web \u89E6\u53D1\u540C\u540D\u4E8B\u4EF6\uFF08\u5982 @contact\uFF09+ console \u63D0\u793A\u81EA\u5B9A\u4E49\u5BF9\u5E94\u4EA4\u4E92\uFF08\u53C2\u8003 Web p-button open-type\uFF09",
|
|
4271
|
+
appId: "Web \u65E0\u8DE8\u5E94\u7528\u8DF3\u8F6C\u80FD\u529B\uFF0C\u4EC5\u56DE\u663E\u53C2\u6570\u5E76\u63D0\u793A",
|
|
4272
|
+
shortLink: "Web \u65E0\u77ED\u94FE\u8DF3\u8F6C\u80FD\u529B\uFF0C\u4EC5\u56DE\u663E\u53C2\u6570\u5E76\u63D0\u793A",
|
|
4273
|
+
unitId: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u4F4D\uFF0C\u6E32\u67D3\u5360\u4F4D\u5E76\u63D0\u793A\uFF08\u4E0D\u9759\u9ED8\uFF09",
|
|
4274
|
+
adType: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u7C7B\u578B\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4275
|
+
adTheme: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u4E3B\u9898\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4276
|
+
adIntervals: "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\u81EA\u52A8\u5237\u65B0\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A"
|
|
4277
|
+
};
|
|
4278
|
+
var STYLE_WEB_FALLBACK = {
|
|
4279
|
+
hoverClass: "\u6620\u5C04 CSS :active/:hover \u7C7B\uFF08\u6846\u67B6\u9ED8\u8BA4\u7C7B\u6052\u5728\uFF0C\u81EA\u5B9A\u4E49\u7C7B\u4F5C\u9644\u52A0\u2014\u2014T3\uFF09",
|
|
4280
|
+
hoverStartTime: "Web \u7528 CSS transition-delay \u8FD1\u4F3C\u6309\u538B\u8D77\u59CB\u5EF6\u65F6",
|
|
4281
|
+
hoverStayTime: "Web \u7528 CSS transition-duration \u8FD1\u4F3C\u6309\u538B\u505C\u7559\u65F6\u957F",
|
|
4282
|
+
hoverStopPropagation: "Web \u7528 CSS pointer-events \u963B\u65AD\u5B50\u7EA7\u53CD\u9988\u8FD1\u4F3C"
|
|
4283
|
+
};
|
|
4284
|
+
var MP_HOST_WEB_FALLBACK = {
|
|
4285
|
+
alwaysEmbed: "Web \u65E0\u540C\u5C42/\u975E\u540C\u5C42\u5207\u6362\u6982\u5FF5\uFF08input \u59CB\u7EC8\u5728\u6587\u6863\u6D41\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4286
|
+
confirmHold: "Web \u65E0\u6CD5\u63A7\u5236\u8F6F\u952E\u76D8\u6536\u8D77\u65F6\u673A\uFF08\u7531\u6D4F\u89C8\u5668/\u7CFB\u7EDF\u51B3\u5B9A\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4287
|
+
adjustPosition: "Web \u7531\u6D4F\u89C8\u5668\u81EA\u8EAB\u5904\u7406\u952E\u76D8\u5F39\u8D77\u65F6\u7684\u89C6\u53E3\u6EDA\u52A8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4288
|
+
holdKeyboard: "Web \u65E0\u6CD5\u5728\u5931\u7126\u70B9\u51FB\u65F6\u4FDD\u6301\u952E\u76D8\uFF08\u6D4F\u89C8\u5668\u884C\u4E3A\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4289
|
+
cursorColor: "Web \u8FD1\u4F3C\uFF1ACSS caret-color\uFF08\u5F53\u524D\u672A\u63A5\u7EBF\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF09",
|
|
4290
|
+
selectionStart: "Web \u8FD1\u4F3C\uFF1AsetSelectionRange\uFF08\u5F53\u524D\u672A\u63A5\u7EBF\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF09",
|
|
4291
|
+
selectionEnd: "Web \u8FD1\u4F3C\uFF1AsetSelectionRange\uFF08\u5F53\u524D\u672A\u63A5\u7EBF\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF09",
|
|
4292
|
+
placeholderClass: "Web \u65E0\u300C\u5360\u4F4D\u7B26\u4E13\u7528\u7C7B\u540D\u300D\u901A\u9053\uFF08::placeholder \u4E0D\u53EF\u627F\u63A5\u4EFB\u610F\u7C7B\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4293
|
+
safePasswordCertPath: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF08\u5BBF\u4E3B\u7EA7\u52A0\u5BC6\u952E\u76D8\uFF09\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4294
|
+
safePasswordLength: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4295
|
+
safePasswordTimeStamp: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4296
|
+
safePasswordNonce: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4297
|
+
safePasswordSalt: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4298
|
+
safePasswordCustomHash: "Web \u65E0\u5C0F\u7A0B\u5E8F\u5B89\u5168\u952E\u76D8\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4299
|
+
reportSubmit: "formId \u662F\u5C0F\u7A0B\u5E8F\u6A21\u677F\u6D88\u606F\u5BBF\u4E3B\u80FD\u529B\uFF0CWeb \u65E0\u5BF9\u5E94 \u2192 \u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4300
|
+
reportSubmitTimeout: "formId \u662F\u5C0F\u7A0B\u5E8F\u6A21\u677F\u6D88\u606F\u5BBF\u4E3B\u80FD\u529B\uFF0CWeb \u65E0\u5BF9\u5E94 \u2192 \u5FFD\u7565\u5E76\u63D0\u793A"
|
|
4301
|
+
};
|
|
4302
|
+
var HOST_TAGS = {
|
|
4303
|
+
"p-map": "Web \u6A21\u62DF\u5C42\u6E32\u67D3\u9759\u6001\u5360\u4F4D\u5BB9\u5668\uFF0C\u5FFD\u7565\u8BE5\u5730\u56FE\u663E\u793A\u53C2\u6570\u5E76\u63D0\u793A",
|
|
4304
|
+
"p-media": "Web \u7528\u539F\u751F <video>\uFF0C\u5FFD\u7565\u8BE5\u64AD\u653E\u5668\u5916\u89C2/\u4E13\u6709\u53C2\u6570\u5E76\u63D0\u793A",
|
|
4305
|
+
"p-camera": "Web \u65E0\u6444\u50CF\u5934\u5BBF\u4E3B\uFF0C\u5FFD\u7565\u8BE5\u91C7\u96C6\u53C2\u6570\u5E76\u63D0\u793A\uFF08\u53EF\u9000\u5316 getUserMedia \u65F6\u53E6\u884C\u5B9E\u73B0\uFF09",
|
|
4306
|
+
"p-ad": "Web \u65E0\u5BBF\u4E3B\u5E7F\u544A\uFF0C\u5FFD\u7565\u8BE5\u5E7F\u544A\u53C2\u6570\u5E76\u63D0\u793A",
|
|
4307
|
+
"p-canvas": "Web \u7528 HTMLCanvasElement\uFF0C\u5FFD\u7565\u8BE5\u5C0F\u7A0B\u5E8F\u6E32\u67D3\u4E0A\u4E0B\u6587\u4E13\u6709\u53C2\u6570\u5E76\u63D0\u793A",
|
|
4308
|
+
"p-webview": "Web \u7528 <iframe>\uFF0C\u5FFD\u7565\u8BE5\u5C0F\u7A0B\u5E8F web-view \u4E13\u6709\u53C2\u6570\u5E76\u63D0\u793A"
|
|
4309
|
+
};
|
|
4310
|
+
var WEB_EXTENSION_MP_FALLBACK = {
|
|
4311
|
+
density: "\u5C0F\u7A0B\u5E8F\u65E0 DPI \u5BC6\u5EA6\u6982\u5FF5\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF08rpx \u5DF2\u6309\u8BBE\u8BA1\u7A3F\u5BBD\u5EA6\u6362\u7B97\uFF09",
|
|
4312
|
+
designWidth: "\u5C0F\u7A0B\u5E8F\u7528 rpx \u57FA\u51C6\uFF08750\uFF09\uFF0C\u8BE5 Web \u4E13\u7528\u57FA\u51C6\u5FFD\u7565\u5E76\u63D0\u793A",
|
|
4313
|
+
searchable: "\u5C0F\u7A0B\u5E8F\u65E0\u5185\u5EFA\u641C\u7D22\u8BED\u4E49\uFF0C\u5FFD\u7565\u5E76\u63D0\u793A\uFF08\u7531\u4E1A\u52A1\u4FA7\u81EA\u7ED8\uFF09"
|
|
4314
|
+
};
|
|
4315
|
+
var TAG_PROP_MP_FALLBACK = {
|
|
4316
|
+
"p-stack": {
|
|
4317
|
+
snap: "\u5C0F\u7A0B\u5E8F view \u4E0D\u6EDA\u52A8\uFF08Skyline \u65E0 CSS overflow \u6EDA\u52A8\uFF0CS14 \u5B9E\u6D4B\uFF09\u2192 \u5438\u9644\u65E0\u8F7D\u4F53\uFF0C\u964D\u7EA7\u4E3A\u666E\u901A\u6392\u5217 + \u53EF\u89C2\u5BDF\u63D0\u793A\uFF1B\u9700\u7FFB\u9875\u8BF7\u7528 p-scroll-view \u7684 paging-enabled",
|
|
4318
|
+
loop: "\u56DE\u73AF\u4F9D\u8D56\u5438\u9644\u5BB9\u5668\uFF0C\u800C\u5C0F\u7A0B\u5E8F view \u4E0D\u6EDA\u52A8\uFF08S14\uFF09\u2192 \u4E00\u5E76\u964D\u7EA7\u4E3A\u666E\u901A\u6392\u5217 + \u53EF\u89C2\u5BDF\u63D0\u793A"
|
|
4319
|
+
}
|
|
4320
|
+
};
|
|
4321
|
+
var RULE_REGISTERED_PROPS = [
|
|
4322
|
+
...Object.keys(PRIVATE_WEB_FALLBACK),
|
|
4323
|
+
...Object.keys(STYLE_WEB_FALLBACK),
|
|
4324
|
+
...Object.keys(WEB_EXTENSION_MP_FALLBACK),
|
|
4325
|
+
...Object.keys(MP_HOST_WEB_FALLBACK),
|
|
4326
|
+
...Object.values(TAG_PROP_MP_FALLBACK).flatMap((m) => Object.keys(m))
|
|
4327
|
+
];
|
|
4328
|
+
var HOST_FALLBACK_TAGS = Object.keys(HOST_TAGS);
|
|
4329
|
+
function degradeProp(tag, prop) {
|
|
4330
|
+
const style = STYLE_WEB_FALLBACK[prop];
|
|
4331
|
+
if (style) return { mp: "supported", web: "fallback", behavior: style };
|
|
4332
|
+
const priv = PRIVATE_WEB_FALLBACK[prop];
|
|
4333
|
+
if (priv) return { mp: "supported", web: "fallback", behavior: priv };
|
|
4334
|
+
const mpHost = MP_HOST_WEB_FALLBACK[prop];
|
|
4335
|
+
if (mpHost) return { mp: "supported", web: "fallback", behavior: mpHost };
|
|
4336
|
+
if (tag && HOST_TAGS[tag]) {
|
|
4337
|
+
return { mp: "supported", web: "fallback", behavior: HOST_TAGS[tag] };
|
|
4338
|
+
}
|
|
4339
|
+
const tagProp = tag ? TAG_PROP_MP_FALLBACK[tag] : void 0;
|
|
4340
|
+
const tagPropBehavior = tagProp ? tagProp[prop] : void 0;
|
|
4341
|
+
if (tagPropBehavior) return { mp: "fallback", web: "supported", behavior: tagPropBehavior };
|
|
4342
|
+
const webExt = WEB_EXTENSION_MP_FALLBACK[prop];
|
|
4343
|
+
if (webExt) return { mp: "fallback", web: "supported", behavior: webExt };
|
|
4344
|
+
return { mp: "supported", web: "supported" };
|
|
4345
|
+
}
|
|
4346
|
+
function degradationOf(prim) {
|
|
4347
|
+
const out = {};
|
|
4348
|
+
for (const p of prim.props ?? []) out[p] = degradeProp(prim.tag, p);
|
|
4349
|
+
return out;
|
|
4350
|
+
}
|
|
4351
|
+
var DEGRADATION_TABLE = (() => {
|
|
4352
|
+
const out = {};
|
|
4353
|
+
for (const prim of PRIMITIVE_CATALOG) {
|
|
4354
|
+
if (!prim.tag) continue;
|
|
4355
|
+
out[prim.tag] = degradationOf(prim);
|
|
4356
|
+
}
|
|
4357
|
+
return out;
|
|
4358
|
+
})();
|
|
4359
|
+
var MP_UNSUPPORTED_PROPS = (() => {
|
|
4360
|
+
const kebab = (s) => s.replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase();
|
|
4361
|
+
const out = {};
|
|
4362
|
+
for (const [tag, table] of Object.entries(DEGRADATION_TABLE)) {
|
|
4363
|
+
const set = /* @__PURE__ */ new Set();
|
|
4364
|
+
for (const [prop, entry] of Object.entries(table)) {
|
|
4365
|
+
if (entry.mp === "unsupported") set.add(kebab(prop));
|
|
4366
|
+
}
|
|
4367
|
+
if (set.size) out[tag] = set;
|
|
4368
|
+
}
|
|
4369
|
+
return out;
|
|
4370
|
+
})();
|
|
4371
|
+
|
|
4372
|
+
// ../render-backend/src/dispatcher.ts
|
|
4054
4373
|
var DispatcherError = class extends Error {
|
|
4055
4374
|
constructor(code, detail) {
|
|
4056
4375
|
super(`unknown primitive tag: ${detail.type}\uFF08\u987B\u5728 G-32 \u539F\u8BED\u8868\u5185\uFF0C\u7F16\u8BD1\u671F\u62E6\u622A\uFF1B\u8FD0\u884C\u671F\u515C\u5E95\uFF09`);
|
|
@@ -4068,6 +4387,8 @@ ${summary}
|
|
|
4068
4387
|
}
|
|
4069
4388
|
return root;
|
|
4070
4389
|
}
|
|
4390
|
+
|
|
4391
|
+
// ../render-backend/src/host-conformance.ts
|
|
4071
4392
|
function createHostRuntimeStub() {
|
|
4072
4393
|
const rt = {
|
|
4073
4394
|
id: "terminal",
|
|
@@ -4276,11 +4597,15 @@ ${summary}
|
|
|
4276
4597
|
r.destroy();
|
|
4277
4598
|
assert(r.state === "destroyed", "destroy \u540E\u72B6\u6001\u5E94\u4E3A destroyed");
|
|
4278
4599
|
});
|
|
4600
|
+
|
|
4601
|
+
// ../render-backend/src/container-spi.ts
|
|
4279
4602
|
var DEFAULT_STACK_POLICY = {
|
|
4280
4603
|
maxDepth: 10,
|
|
4281
4604
|
overflowStrategy: "destroy-oldest",
|
|
4282
4605
|
keepAlive: { maxCount: 3, memoryBudgetBytes: 64 * 1024 * 1024 }
|
|
4283
4606
|
};
|
|
4607
|
+
|
|
4608
|
+
// ../render-backend/src/ownership.ts
|
|
4284
4609
|
var OwnershipGraph = class {
|
|
4285
4610
|
constructor(opts = {}) {
|
|
4286
4611
|
this.nodes = /* @__PURE__ */ new Map();
|
|
@@ -4379,6 +4704,8 @@ ${summary}
|
|
|
4379
4704
|
if (!singletonGraph) singletonGraph = new OwnershipGraph();
|
|
4380
4705
|
return singletonGraph;
|
|
4381
4706
|
}
|
|
4707
|
+
|
|
4708
|
+
// ../render-backend/src/container-conformance.ts
|
|
4382
4709
|
var FORK_SIGNATURES = [
|
|
4383
4710
|
/packages\/core\/src\//,
|
|
4384
4711
|
// 框架源码副本
|
|
@@ -4609,6 +4936,8 @@ ${summary}
|
|
|
4609
4936
|
const hits = scanRepoForFork({ "host/vendor/core.js": "import x from '@proteus/core/internal/diff';" });
|
|
4610
4937
|
assert2(hits.length > 0, "fork \u4ED3\u5E93\u5E94\u88AB\u68C0\u51FA");
|
|
4611
4938
|
});
|
|
4939
|
+
|
|
4940
|
+
// ../render-backend/src/superapp-container.ts
|
|
4612
4941
|
var DEFAULT_SUPERAPP_POLICY = {
|
|
4613
4942
|
maxDepth: 10,
|
|
4614
4943
|
overflowStrategy: "destroy-oldest",
|
|
@@ -4617,6 +4946,8 @@ ${summary}
|
|
|
4617
4946
|
crash: { isolationLevel: 2, autoRestart: true, maxRestartCount: 3 },
|
|
4618
4947
|
security: { requireSignature: true, capabilityWhitelist: ["camera", "location", "storage"] }
|
|
4619
4948
|
};
|
|
4949
|
+
|
|
4950
|
+
// ../render-backend/src/ownership-observability.ts
|
|
4620
4951
|
function createOwnershipHistory(graph, opts = {}) {
|
|
4621
4952
|
const limit = opts.limit ?? 2e3;
|
|
4622
4953
|
let records = [];
|
|
@@ -4644,7 +4975,7 @@ ${summary}
|
|
|
4644
4975
|
push({ ts: m.ts, kind: k === "borrows" ? "borrow" : k, from: m.edge.from, to: m.edge.to });
|
|
4645
4976
|
}
|
|
4646
4977
|
});
|
|
4647
|
-
const
|
|
4978
|
+
const history2 = {
|
|
4648
4979
|
get records() {
|
|
4649
4980
|
return records;
|
|
4650
4981
|
},
|
|
@@ -4666,7 +4997,7 @@ ${summary}
|
|
|
4666
4997
|
records = [];
|
|
4667
4998
|
}
|
|
4668
4999
|
};
|
|
4669
|
-
return
|
|
5000
|
+
return history2;
|
|
4670
5001
|
}
|
|
4671
5002
|
function createOwnershipCounters(graph) {
|
|
4672
5003
|
let alive = 0;
|
|
@@ -4757,10 +5088,10 @@ ${summary}
|
|
|
4757
5088
|
}
|
|
4758
5089
|
return { aliveNodes: stats.alive, totalNodes: stats.total, orphans, leaks, longBorrows, crossPageRefs };
|
|
4759
5090
|
}
|
|
4760
|
-
function buildOwnershipTimeline(
|
|
5091
|
+
function buildOwnershipTimeline(history2, graph) {
|
|
4761
5092
|
const events = [];
|
|
4762
5093
|
const allocById = /* @__PURE__ */ new Map();
|
|
4763
|
-
for (const rec of
|
|
5094
|
+
for (const rec of history2.records) {
|
|
4764
5095
|
if (rec.kind === "alloc" && rec.id) {
|
|
4765
5096
|
allocById.set(rec.id, rec);
|
|
4766
5097
|
events.push(rec);
|
|
@@ -4781,7 +5112,7 @@ ${summary}
|
|
|
4781
5112
|
function createOwnershipTracer(options = {}) {
|
|
4782
5113
|
const graph = options.graph ?? getProteusOwnershipGraph();
|
|
4783
5114
|
const counters = createOwnershipCounters(graph);
|
|
4784
|
-
const
|
|
5115
|
+
const history2 = options.history ?? createOwnershipHistory(graph);
|
|
4785
5116
|
let disposed = false;
|
|
4786
5117
|
function collect() {
|
|
4787
5118
|
if (disposed) {
|
|
@@ -4794,10 +5125,10 @@ ${summary}
|
|
|
4794
5125
|
}
|
|
4795
5126
|
const diagnosis = diagnoseOwnershipIssues(graph);
|
|
4796
5127
|
const seenAllocIds = /* @__PURE__ */ new Set();
|
|
4797
|
-
for (const r of
|
|
5128
|
+
for (const r of history2.records) {
|
|
4798
5129
|
if (r.kind === "alloc" && r.id) seenAllocIds.add(r.id);
|
|
4799
5130
|
}
|
|
4800
|
-
const merged = [...
|
|
5131
|
+
const merged = [...history2.records];
|
|
4801
5132
|
for (const n of graph.nodes.values()) {
|
|
4802
5133
|
if (!seenAllocIds.has(n.id)) {
|
|
4803
5134
|
merged.push({ ts: n.createdAt, kind: "alloc", id: n.id, owner: n.owner, type: n.type, byteSize: n.byteSize, sourceLocation: n.sourceLocation });
|
|
@@ -4842,7 +5173,7 @@ ${summary}
|
|
|
4842
5173
|
collect,
|
|
4843
5174
|
dispose() {
|
|
4844
5175
|
disposed = true;
|
|
4845
|
-
|
|
5176
|
+
history2.dispose();
|
|
4846
5177
|
}
|
|
4847
5178
|
};
|
|
4848
5179
|
}
|
|
@@ -4920,7 +5251,7 @@ ${summary}
|
|
|
4920
5251
|
};
|
|
4921
5252
|
}
|
|
4922
5253
|
|
|
4923
|
-
// ../../node_modules/@vue/devtools-shared/dist/index.js
|
|
5254
|
+
// ../../node_modules/.pnpm/@vue+devtools-shared@8.2.1/node_modules/@vue/devtools-shared/dist/index.js
|
|
4924
5255
|
var __create = Object.create;
|
|
4925
5256
|
var __defProp2 = Object.defineProperty;
|
|
4926
5257
|
var __getOwnPropDesc2 = Object.getOwnPropertyDescriptor;
|
|
@@ -5101,7 +5432,7 @@ ${summary}
|
|
|
5101
5432
|
}
|
|
5102
5433
|
var deepClone = (0, import_rfdc.default)({ circles: true });
|
|
5103
5434
|
|
|
5104
|
-
// ../../node_modules/perfect-debounce/dist/index.mjs
|
|
5435
|
+
// ../../node_modules/.pnpm/perfect-debounce@2.1.0/node_modules/perfect-debounce/dist/index.mjs
|
|
5105
5436
|
var DEBOUNCE_DEFAULTS = { trailing: true };
|
|
5106
5437
|
function debounce(fn, wait = 25, options = {}) {
|
|
5107
5438
|
options = {
|
|
@@ -5170,7 +5501,7 @@ ${summary}
|
|
|
5170
5501
|
return await fn.apply(_this, args);
|
|
5171
5502
|
}
|
|
5172
5503
|
|
|
5173
|
-
// ../../node_modules/hookable/dist/index.mjs
|
|
5504
|
+
// ../../node_modules/.pnpm/hookable@5.5.3/node_modules/hookable/dist/index.mjs
|
|
5174
5505
|
function flatHooks(configHooks, hooks2 = {}, parentName) {
|
|
5175
5506
|
for (const key in configHooks) {
|
|
5176
5507
|
const subHook = configHooks[key];
|
|
@@ -5375,7 +5706,7 @@ ${summary}
|
|
|
5375
5706
|
return new Hookable();
|
|
5376
5707
|
}
|
|
5377
5708
|
|
|
5378
|
-
// ../../node_modules/@vue/devtools-kit/dist/index.js
|
|
5709
|
+
// ../../node_modules/.pnpm/@vue+devtools-kit@8.2.1/node_modules/@vue/devtools-kit/dist/index.js
|
|
5379
5710
|
var __create2 = Object.create;
|
|
5380
5711
|
var __defProp3 = Object.defineProperty;
|
|
5381
5712
|
var __getOwnPropDesc3 = Object.getOwnPropertyDescriptor;
|
|
@@ -8652,6 +8983,166 @@ ${summary}
|
|
|
8652
8983
|
target.__VUE_DEVTOOLS_KIT_BROADCAST_RPC_SERVER__ ??= null;
|
|
8653
8984
|
var MAX_SERIALIZED_SIZE = 2 * 1024 * 1024;
|
|
8654
8985
|
|
|
8986
|
+
// ../shared/src/platform/mp-adapter.ts
|
|
8987
|
+
function norm(p) {
|
|
8988
|
+
return { route: p.route || p.__route__ || "", setData: p.setData?.bind(p) };
|
|
8989
|
+
}
|
|
8990
|
+
function normalizeRect(rect) {
|
|
8991
|
+
if (!rect || typeof rect.left !== "number" || typeof rect.top !== "number") return null;
|
|
8992
|
+
return {
|
|
8993
|
+
top: rect.top,
|
|
8994
|
+
left: rect.left,
|
|
8995
|
+
right: typeof rect.right === "number" ? rect.right : rect.left,
|
|
8996
|
+
bottom: typeof rect.bottom === "number" ? rect.bottom : rect.top,
|
|
8997
|
+
width: typeof rect.width === "number" ? rect.width : rect.right - rect.left,
|
|
8998
|
+
height: typeof rect.height === "number" ? rect.height : rect.bottom - rect.top
|
|
8999
|
+
};
|
|
9000
|
+
}
|
|
9001
|
+
function createMpAdapter() {
|
|
9002
|
+
return {
|
|
9003
|
+
isMP: true,
|
|
9004
|
+
getCurrentPages: () => {
|
|
9005
|
+
if (typeof wx === "undefined" || typeof getCurrentPages !== "function") return [];
|
|
9006
|
+
return getCurrentPages().map(norm);
|
|
9007
|
+
},
|
|
9008
|
+
navigateTo: (opts) => new Promise((resolve) => {
|
|
9009
|
+
wx.navigateTo({ url: opts.url, success: () => resolve(), fail: () => resolve() });
|
|
9010
|
+
}),
|
|
9011
|
+
redirectTo: (opts) => new Promise((resolve) => {
|
|
9012
|
+
wx.redirectTo({ url: opts.url, success: () => resolve(), fail: () => resolve() });
|
|
9013
|
+
}),
|
|
9014
|
+
reLaunch: (opts) => new Promise((resolve) => {
|
|
9015
|
+
wx.reLaunch({ url: opts.url, success: () => resolve(), fail: () => resolve() });
|
|
9016
|
+
}),
|
|
9017
|
+
switchTab: (opts) => new Promise((resolve) => {
|
|
9018
|
+
wx.switchTab({ url: opts.url, success: () => resolve(), fail: () => resolve() });
|
|
9019
|
+
}),
|
|
9020
|
+
navigateBack: ({ delta }) => {
|
|
9021
|
+
wx.navigateBack({ delta });
|
|
9022
|
+
},
|
|
9023
|
+
measureRect: (selector, scope) => (
|
|
9024
|
+
// ★平台层许可直接碰 wx.*(no-platform-api 审计 allow: platforms/**/packages/api/**);组件经此 L2 抽象消费
|
|
9025
|
+
new Promise((resolve) => {
|
|
9026
|
+
if (typeof wx === "undefined" || typeof wx.createSelectorQuery !== "function") return resolve(null);
|
|
9027
|
+
const scopeQ = scope;
|
|
9028
|
+
const inQuery = scopeQ && typeof scopeQ.createSelectorQuery === "function" ? scopeQ.createSelectorQuery() : wx.createSelectorQuery();
|
|
9029
|
+
inQuery.select(selector).boundingClientRect((rect) => resolve(normalizeRect(rect))).exec();
|
|
9030
|
+
})
|
|
9031
|
+
)
|
|
9032
|
+
};
|
|
9033
|
+
}
|
|
9034
|
+
|
|
9035
|
+
// ../shared/src/platform/web-adapter.ts
|
|
9036
|
+
function parseQuery(url) {
|
|
9037
|
+
const q = url.split("?")[1] || "";
|
|
9038
|
+
const out = {};
|
|
9039
|
+
for (const seg of q.split("&").filter(Boolean)) {
|
|
9040
|
+
const [k, v] = seg.split("=");
|
|
9041
|
+
if (k) out[decodeURIComponent(k)] = decodeURIComponent(v || "");
|
|
9042
|
+
}
|
|
9043
|
+
return out;
|
|
9044
|
+
}
|
|
9045
|
+
function createWebAdapter() {
|
|
9046
|
+
const listeners = [];
|
|
9047
|
+
const hasBrowserEnv = typeof location !== "undefined" && typeof history !== "undefined";
|
|
9048
|
+
let current = { route: hasBrowserEnv ? location.pathname.replace(/^\//, "") : "" };
|
|
9049
|
+
let historyIndex = hasBrowserEnv ? history.state?.proteusIndex ?? 0 : 0;
|
|
9050
|
+
const emit = (url, routeType, nav = "forward") => {
|
|
9051
|
+
current = { route: url.split("?")[0].replace(/^\//, ""), routeType };
|
|
9052
|
+
listeners.forEach((l) => l(current.route, parseQuery(url), routeType, nav));
|
|
9053
|
+
};
|
|
9054
|
+
if (hasBrowserEnv) {
|
|
9055
|
+
window.addEventListener("popstate", (e) => {
|
|
9056
|
+
const stateIndex = e.state?.proteusIndex;
|
|
9057
|
+
let nav = "forward";
|
|
9058
|
+
if (typeof stateIndex === "number") {
|
|
9059
|
+
nav = stateIndex < historyIndex ? "back" : "forward";
|
|
9060
|
+
historyIndex = stateIndex;
|
|
9061
|
+
}
|
|
9062
|
+
emit(location.pathname + location.search, void 0, nav);
|
|
9063
|
+
});
|
|
9064
|
+
document.addEventListener("click", (e) => {
|
|
9065
|
+
if (e.defaultPrevented || e.button !== 0 || e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
|
|
9066
|
+
const target2 = e.target;
|
|
9067
|
+
const anchor = target2?.closest?.("a[href]");
|
|
9068
|
+
if (!anchor) return;
|
|
9069
|
+
const href = anchor.getAttribute("href") || "";
|
|
9070
|
+
if (anchor.target === "_blank" || !href.startsWith("/")) return;
|
|
9071
|
+
e.preventDefault();
|
|
9072
|
+
const routeType = anchor.getAttribute("route-type") || void 0;
|
|
9073
|
+
historyIndex += 1;
|
|
9074
|
+
history.pushState({ proteusIndex: historyIndex }, "", href);
|
|
9075
|
+
emit(href, routeType, "forward");
|
|
9076
|
+
});
|
|
9077
|
+
}
|
|
9078
|
+
return {
|
|
9079
|
+
isMP: false,
|
|
9080
|
+
getCurrentPages: () => [current],
|
|
9081
|
+
navigateTo: async ({ url, routeType }) => {
|
|
9082
|
+
historyIndex += 1;
|
|
9083
|
+
history.pushState({ proteusIndex: historyIndex }, "", url);
|
|
9084
|
+
emit(url, routeType, "forward");
|
|
9085
|
+
},
|
|
9086
|
+
redirectTo: async ({ url }) => {
|
|
9087
|
+
history.replaceState({ proteusIndex: historyIndex }, "", url);
|
|
9088
|
+
emit(url, void 0, "replace");
|
|
9089
|
+
},
|
|
9090
|
+
reLaunch: async ({ url }) => {
|
|
9091
|
+
history.replaceState({ proteusIndex: historyIndex }, "", url);
|
|
9092
|
+
emit(url, void 0, "reLaunch");
|
|
9093
|
+
},
|
|
9094
|
+
switchTab: async ({ url }) => {
|
|
9095
|
+
history.replaceState({ proteusIndex: historyIndex }, "", url);
|
|
9096
|
+
emit(url, void 0, "switchTab");
|
|
9097
|
+
},
|
|
9098
|
+
navigateBack: ({ delta }) => {
|
|
9099
|
+
history.go(-delta);
|
|
9100
|
+
},
|
|
9101
|
+
measureRect: (selector, scope) => new Promise((resolve) => {
|
|
9102
|
+
if (typeof document === "undefined" || typeof document.querySelector !== "function") return resolve(null);
|
|
9103
|
+
const root = scope && typeof scope.querySelector === "function" ? scope : document;
|
|
9104
|
+
const el = root.querySelector(selector);
|
|
9105
|
+
if (!el || typeof el.getBoundingClientRect !== "function") return resolve(null);
|
|
9106
|
+
const r = el.getBoundingClientRect();
|
|
9107
|
+
resolve({
|
|
9108
|
+
top: r.top,
|
|
9109
|
+
left: r.left,
|
|
9110
|
+
right: r.right,
|
|
9111
|
+
bottom: r.bottom,
|
|
9112
|
+
width: r.width,
|
|
9113
|
+
height: r.height
|
|
9114
|
+
});
|
|
9115
|
+
}),
|
|
9116
|
+
onPageLoad: (cb) => {
|
|
9117
|
+
listeners.push(cb);
|
|
9118
|
+
}
|
|
9119
|
+
};
|
|
9120
|
+
}
|
|
9121
|
+
|
|
9122
|
+
// ../shared/src/platform/index.ts
|
|
9123
|
+
var import_meta = {};
|
|
9124
|
+
function detectMPRuntime() {
|
|
9125
|
+
if (typeof window !== "undefined") return false;
|
|
9126
|
+
try {
|
|
9127
|
+
return typeof wx !== "undefined" && (typeof wx.getSystemInfoSync === "function" || typeof wx.getWindowInfo === "function");
|
|
9128
|
+
} catch (e) {
|
|
9129
|
+
return false;
|
|
9130
|
+
}
|
|
9131
|
+
}
|
|
9132
|
+
var modeMP = import_meta.env?.MODE === "mp-weixin";
|
|
9133
|
+
var isMP = modeMP || detectMPRuntime();
|
|
9134
|
+
var adapter = isMP ? createMpAdapter() : createWebAdapter();
|
|
9135
|
+
|
|
9136
|
+
// ../shared/src/platform/runtime.ts
|
|
9137
|
+
function detectRuntime() {
|
|
9138
|
+
if (typeof window !== "undefined") return "web";
|
|
9139
|
+
try {
|
|
9140
|
+
if (typeof wx !== "undefined" && wx) return "mp";
|
|
9141
|
+
} catch {
|
|
9142
|
+
}
|
|
9143
|
+
return "web";
|
|
9144
|
+
}
|
|
9145
|
+
|
|
8655
9146
|
// ../capabilities/src/adapter.ts
|
|
8656
9147
|
var CapabilityRegistry = class {
|
|
8657
9148
|
constructor() {
|
|
@@ -8703,20 +9194,20 @@ ${summary}
|
|
|
8703
9194
|
return this.requireds.get(capability) ?? false;
|
|
8704
9195
|
}
|
|
8705
9196
|
/** 注册 adapter(同 capability+platform 重复 → 报错,编译期约束 §7;按 priority 降序排序) */
|
|
8706
|
-
register(
|
|
8707
|
-
const list = this.adapters.get(
|
|
8708
|
-
if (list.some((a) => a.platform ===
|
|
8709
|
-
throw new Error(`[proteus-capabilities] \u80FD\u529B "${
|
|
9197
|
+
register(adapter2) {
|
|
9198
|
+
const list = this.adapters.get(adapter2.capability) ?? [];
|
|
9199
|
+
if (list.some((a) => a.platform === adapter2.platform)) {
|
|
9200
|
+
throw new Error(`[proteus-capabilities] \u80FD\u529B "${adapter2.capability}" \u7684 "${adapter2.platform}" \u5E73\u53F0\u91CD\u590D\u6CE8\u518C adapter\uFF08\u7F16\u8BD1\u671F\u7EA6\u675F\uFF1A\u540C capability+platform \u552F\u4E00\uFF09`);
|
|
8710
9201
|
}
|
|
8711
|
-
list.push(
|
|
9202
|
+
list.push(adapter2);
|
|
8712
9203
|
list.sort((a, b) => (b.priority ?? 0) - (a.priority ?? 0));
|
|
8713
|
-
this.adapters.set(
|
|
9204
|
+
this.adapters.set(adapter2.capability, list);
|
|
8714
9205
|
}
|
|
8715
9206
|
/** 批量注册(幂等语义:已存在同 id+platform 则跳过——scan 场景) */
|
|
8716
|
-
registerIdempotent(
|
|
8717
|
-
const list = this.adapters.get(
|
|
8718
|
-
if (list.some((a) => a.platform ===
|
|
8719
|
-
this.register(
|
|
9207
|
+
registerIdempotent(adapter2) {
|
|
9208
|
+
const list = this.adapters.get(adapter2.capability) ?? [];
|
|
9209
|
+
if (list.some((a) => a.platform === adapter2.platform)) return;
|
|
9210
|
+
this.register(adapter2);
|
|
8720
9211
|
}
|
|
8721
9212
|
/** 能力是否已注册任何 adapter */
|
|
8722
9213
|
has(capability) {
|
|
@@ -8735,10 +9226,10 @@ ${summary}
|
|
|
8735
9226
|
async resolve(id, platform = detectPlatform()) {
|
|
8736
9227
|
const list = this.adapters.get(id) ?? [];
|
|
8737
9228
|
const candidates = platform ? list.filter((a) => a.platform === platform) : list;
|
|
8738
|
-
for (const
|
|
9229
|
+
for (const adapter2 of candidates) {
|
|
8739
9230
|
try {
|
|
8740
|
-
if (await
|
|
8741
|
-
return this.wrap(
|
|
9231
|
+
if (await adapter2.isSupported()) {
|
|
9232
|
+
return this.wrap(adapter2, platform);
|
|
8742
9233
|
}
|
|
8743
9234
|
} catch {
|
|
8744
9235
|
}
|
|
@@ -8756,10 +9247,10 @@ ${summary}
|
|
|
8756
9247
|
/** 同步解析(isSupported 为同步时可用;异步探测的 adapter 返回 undefined) */
|
|
8757
9248
|
resolveSync(id, platform = detectPlatform()) {
|
|
8758
9249
|
const list = this.adapters.get(id) ?? [];
|
|
8759
|
-
for (const
|
|
9250
|
+
for (const adapter2 of list.filter((a) => a.platform === platform)) {
|
|
8760
9251
|
try {
|
|
8761
|
-
const supported =
|
|
8762
|
-
if (typeof supported === "boolean" && supported) return this.wrap(
|
|
9252
|
+
const supported = adapter2.isSupported();
|
|
9253
|
+
if (typeof supported === "boolean" && supported) return this.wrap(adapter2, platform);
|
|
8763
9254
|
} catch {
|
|
8764
9255
|
}
|
|
8765
9256
|
}
|
|
@@ -8773,23 +9264,23 @@ ${summary}
|
|
|
8773
9264
|
this.emitDetect(id, platform, false);
|
|
8774
9265
|
return void 0;
|
|
8775
9266
|
}
|
|
8776
|
-
wrap(
|
|
8777
|
-
const api =
|
|
9267
|
+
wrap(adapter2, platform) {
|
|
9268
|
+
const api = adapter2.create();
|
|
8778
9269
|
const cap2 = {
|
|
8779
|
-
meta: { id:
|
|
9270
|
+
meta: { id: adapter2.capability, tier: 2, name: adapter2.capability },
|
|
8780
9271
|
api,
|
|
8781
|
-
isSupported: () =>
|
|
9272
|
+
isSupported: () => adapter2.isSupported()
|
|
8782
9273
|
};
|
|
8783
|
-
const fb = this.fallbacks.get(
|
|
9274
|
+
const fb = this.fallbacks.get(adapter2.capability);
|
|
8784
9275
|
let fallbackId;
|
|
8785
|
-
if (fb && fb !==
|
|
9276
|
+
if (fb && fb !== adapter2.capability) {
|
|
8786
9277
|
const fbCap = this.resolveSync(fb, platform);
|
|
8787
9278
|
if (fbCap) {
|
|
8788
9279
|
cap2.fallback = fbCap;
|
|
8789
9280
|
fallbackId = fb;
|
|
8790
9281
|
}
|
|
8791
9282
|
}
|
|
8792
|
-
this.emitDetect(
|
|
9283
|
+
this.emitDetect(adapter2.capability, platform, true, fallbackId);
|
|
8793
9284
|
return cap2;
|
|
8794
9285
|
}
|
|
8795
9286
|
/** 已注册的(capability, platform)集合(审计/DevTools) */
|
|
@@ -8814,8 +9305,7 @@ ${summary}
|
|
|
8814
9305
|
}
|
|
8815
9306
|
};
|
|
8816
9307
|
function detectPlatform() {
|
|
8817
|
-
|
|
8818
|
-
return typeof wxGlobal !== "undefined" ? "skyline" : "web";
|
|
9308
|
+
return detectRuntime() === "mp" ? "skyline" : "web";
|
|
8819
9309
|
}
|
|
8820
9310
|
|
|
8821
9311
|
// ../capabilities/src/index.ts
|