@proteus-vue/component-ir 0.3.0-beta.21 → 0.3.0-beta.28
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/dist/capability-domains.d.ts +13 -0
- package/dist/color.d.ts +18 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +773 -29
- package/dist/paint-hint.d.ts +40 -0
- package/package.json +3 -3
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type CapabilityDomain = '网络与通信' | '设备与系统' | '存储与文件' | '位置与地图' | '媒体与扫码' | '账号与支付' | '通知与分享' | '应用与生命周期' | '可观测与调试' | '其他';
|
|
2
|
+
/** 能力分域:key = semantic 去掉 `capability.` 前缀(如 `capability.camera` → `camera`) */
|
|
3
|
+
export declare const CAPABILITY_CATEGORY: Record<string, CapabilityDomain>;
|
|
4
|
+
/** 分组展示顺序(官网侧栏 / 优先级表共用) */
|
|
5
|
+
export declare const CAPABILITY_CATEGORY_ORDER: readonly CapabilityDomain[];
|
|
6
|
+
/** 取能力域(输入可为完整 semantic `capability.x` 或裸 slug `x`) */
|
|
7
|
+
export declare function capabilityDomainOf(semanticOrSlug: string): CapabilityDomain;
|
|
8
|
+
/**
|
|
9
|
+
* 审计:capacity 清单里未登记分域的条目(返回缺口列表;空数组 = 全登记)。
|
|
10
|
+
* ★设计为**纯函数**(接收 slug 列表,不 import catalog)——避免循环依赖;
|
|
11
|
+
* 生成器/门禁侧传 `PRIMITIVE_CATALOG.filter(kind==='capability')` 的 slug。
|
|
12
|
+
*/
|
|
13
|
+
export declare function auditCapabilityDomains(slugs: readonly string[]): string[];
|
package/dist/color.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/** 颜色是否**确实不透明**(保守:拿不准 ⇒ false) */
|
|
2
|
+
/**
|
|
3
|
+
* 解析颜色为 RGB(仅用于"是否中性色"判定;**不做色彩管理**——只比较三个通道是否相等)。
|
|
4
|
+
* 拿不准(具名色/hsl/var 等)⇒ null(调用方按"不是中性色"保守处理)。
|
|
5
|
+
*/
|
|
6
|
+
export declare function rgbOfColor(color: string | undefined | null): [number, number, number] | null;
|
|
7
|
+
/**
|
|
8
|
+
* 颜色是否为**中性色**(R=G=B ⇒ 8 位灰度格式能够无损表达)。
|
|
9
|
+
*
|
|
10
|
+
* 【为什么需要它(格式的硬约束,不是保守选择)】紧凑单通道存储(iOS `gray8Uint`)
|
|
11
|
+
* **只有亮度、没有色相**——红字写进去会变成灰字。
|
|
12
|
+
* ⇒ "可用紧凑格式"的前提必须包含"颜色本来就是灰阶的"。
|
|
13
|
+
* ★本仓实测教训:−39% 的实验用的是**白字**(恰好是中性色)⇒ 该约束在实验里成立、
|
|
14
|
+
* 却从未被写进判据;若不补,彩色文本会被**静默去色**(画面错,无任何报错)。
|
|
15
|
+
*/
|
|
16
|
+
export declare function isNeutralColor(color: string | undefined | null): boolean;
|
|
17
|
+
/** 颜色是否**确实不透明**(保守:拿不准 ⇒ false) */
|
|
18
|
+
export declare function isOpaqueColor(color: string | undefined | null): boolean;
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export { checkComponentSnapshot, extractSemanticTree, checkSemanticCoverage } fr
|
|
|
8
8
|
export type { ComponentConformanceResult, ControlMismatch, SemanticTree, CoverageGap } from './conformance';
|
|
9
9
|
export { PRIMITIVE_CATALOG, componentPrimitives, implementedPrimitives, primitiveById, primitiveBySemantic, primitiveByTag, checkPrimitiveCatalog } from './primitives';
|
|
10
10
|
export type { PrimitiveDef, PrimitiveKind, PrimitiveStatus } from './primitives';
|
|
11
|
+
export { CAPABILITY_CATEGORY, CAPABILITY_CATEGORY_ORDER, capabilityDomainOf, auditCapabilityDomains } from './capability-domains';
|
|
12
|
+
export type { CapabilityDomain } from './capability-domains';
|
|
11
13
|
export { MP_MAPPING_MATRIX, auditMiniprogramCoverage, auditMatrixReferences, auditCatalogConsistency, formatCoverageReport } from './audit';
|
|
12
14
|
export type { MatrixRefIssue } from './audit';
|
|
13
15
|
export type { CoverageReport, MpCoverageStatus, MpMatrixItem, ConsistencyIssue } from './audit';
|
|
@@ -16,6 +18,9 @@ export type { MpSpecStatus, MpSpecClass, MpOfficialSpec, SpecCoverageReport } fr
|
|
|
16
18
|
export { DEGRADATION_TABLE, MP_UNSUPPORTED_PROPS, degradeProp, degradationOf, auditDegradation, formatDegradationReport, checkPropDegradation, collectPropDiagnostics, RULE_REGISTERED_PROPS, HOST_FALLBACK_TAGS, PROP_NO_DEGRADATION, } from './degradation';
|
|
17
19
|
export type { DegradationEnd, DegradationTier, DegradationEntry, DegradationMap, DegradationIssue, DegradationReport, PropDiagnostic, } from './degradation';
|
|
18
20
|
export type { PKind, ResolvedLength, Edges, LayoutProps, PaintProps, TextProps, PaintHint, PProps, PFlags, PNode, PTree, DynamicBinding, UpdateKind, PDiagnostic, } from './pnode';
|
|
21
|
+
export { isOpaqueColor, isNeutralColor, rgbOfColor } from './color';
|
|
22
|
+
export { derivePaintHint } from './paint-hint';
|
|
23
|
+
export type { PaintHintInput } from './paint-hint';
|
|
19
24
|
export { resolveLength, parseStyleString, normalizeStyleDecls, normalizeStyleString, expandEdges, parseTransform, camel, splitTopLevel } from './pnode-style';
|
|
20
25
|
export type { LengthContext, NormalizeOptions, NormalizeResult } from './pnode-style';
|
|
21
26
|
export { analyzePTree, flattenRate, groupBindingsByNode } from './pnode-analyze';
|
package/dist/index.js
CHANGED
|
@@ -154,8 +154,17 @@ var TAG_SEMANTIC_MAP = {
|
|
|
154
154
|
"p-segment": "shell.segment",
|
|
155
155
|
"p-drawer": "shell.drawer",
|
|
156
156
|
"p-modal": "shell.modal",
|
|
157
|
+
// ★★★GP4-c(2026-10-03):登录失效拦截弹窗——与 p-modal **同语义**(模态弹窗)、
|
|
158
|
+
// **不同可取消性**(本组件不可取消:无关闭按钮/点遮罩不关;唯一出口是登录态恢复)。
|
|
159
|
+
// ★不登记 ⇒ 编译期按"未注册自定义组件"输出 ⇒ MP 端不渲染(M3 门禁会当场红)
|
|
160
|
+
"p-auth-gate": "shell.modal",
|
|
157
161
|
"p-popover": "shell.popover",
|
|
158
162
|
"p-toast": "shell.toast",
|
|
163
|
+
// ★★★GP4-a/b(2026-10-03):两个**浮层宿主**同属其能力的语义(multi-tag 别名——同 ui.loading 的先例)。
|
|
164
|
+
// · p-toast-host:Toast 队列的渲染端(构建期按需注入)
|
|
165
|
+
// · p-loading-host:Loading 多实例的渲染端(同上)
|
|
166
|
+
// ★不登记 ⇒ 编译期按"未注册自定义组件"输出 ⇒ **MP 端不渲染**(M3 门禁当场抓出)
|
|
167
|
+
"p-toast-host": "shell.toast",
|
|
159
168
|
"p-action-sheet": "shell.action-sheet",
|
|
160
169
|
"p-split": "layout.split",
|
|
161
170
|
// ★已落地绑定(G-32 S10 分栏语义——layout.split 承载)
|
|
@@ -196,6 +205,13 @@ var TAG_SEMANTIC_MAP = {
|
|
|
196
205
|
"p-formfactor": "layout.formfactor",
|
|
197
206
|
// ★★Fluid System v2:柔性形态容器
|
|
198
207
|
"p-loading": "ui.loading",
|
|
208
|
+
// ★★★GP4-b(2026-10-03):Loading **多实例宿主**与**区域遮罩**同属 ui.loading 语义(multi-tag 别名,
|
|
209
|
+
// 与上一行 `router-link`/`p-view` 的"同一语义多标签"同款)。
|
|
210
|
+
// · p-loading-host:命令式多实例的渲染端(由构建期按需注入——用户一般不手写)
|
|
211
|
+
// · p-loading-region:区域遮罩(就地包裹,用户手写)
|
|
212
|
+
// ★不登记 ⇒ 编译期按"未注册自定义组件"输出 ⇒ MP 端不渲染(M3 门禁当场抓出——它是对的)
|
|
213
|
+
"p-loading-host": "ui.loading",
|
|
214
|
+
"p-loading-region": "ui.loading",
|
|
199
215
|
"p-scale": "ui.scale",
|
|
200
216
|
"p-skeleton": "ui.skeleton",
|
|
201
217
|
"p-mask": "shell.mask",
|
|
@@ -235,6 +251,28 @@ var TAG_SEMANTIC_ALIASES = {
|
|
|
235
251
|
canonical: "p-router-link",
|
|
236
252
|
aliases: ["router-link"],
|
|
237
253
|
reason: "router-link \u662F Vue Router \u98CE\u683C\u6807\u7B7E\u517C\u5BB9\u522B\u540D\uFF08framework \u4FDD\u7559\u5B57\uFF0C\u975E catalog \u6761\u76EE\uFF09\u3002"
|
|
254
|
+
},
|
|
255
|
+
// ★★★GP4-a/b(2026-10-03):两个浮层能力的**宿主标签**与其声明式组件共享语义——
|
|
256
|
+
// 与上两条"实现替换/血统并存"的别名不同,这里是**职责分工**(声明式 vs 命令式渲染端):
|
|
257
|
+
// · `p-toast` = 声明式单条提示(用户摆位置)|`p-toast-host` = Toast 队列的**渲染端**
|
|
258
|
+
// (命令式 `showToast` 的宿主;构建期按需注入,**用户一般不手写**)
|
|
259
|
+
// · `p-loading` = 声明式遮罩(单实例) |`p-loading-host` = Loading **多实例**宿主(同上)
|
|
260
|
+
// · `p-loading-region` = 区域遮罩(就地包裹;用户手写,与 p-loading 是不同用法而非替代)
|
|
261
|
+
// ★语义相同(都是"提示/加载态")故共享 primitive;**保留两标签**因为用法与生命周期都不同。
|
|
262
|
+
"shell.modal": {
|
|
263
|
+
canonical: "p-modal",
|
|
264
|
+
aliases: ["p-auth-gate"],
|
|
265
|
+
reason: 'p-modal \u662F\u53EF\u53D6\u6D88\u5F39\u5C42\uFF08\u6709\u5173\u95ED\u6309\u94AE/\u70B9\u906E\u7F69\u53EF\u5173\uFF09\uFF1Bp-auth-gate \u662F**\u4E0D\u53EF\u53D6\u6D88**\u7684\u767B\u5F55\u5931\u6548\u62E6\u622A\u5F39\u7A97\uFF08\u552F\u4E00\u51FA\u53E3\u662F\u767B\u5F55\u6001\u6062\u590D\uFF09\u3002\u540C\u8BED\u4E49\uFF08\u6A21\u6001\u5F39\u7A97\uFF09\u4E0D\u540C\u53EF\u53D6\u6D88\u6027 \u21D2 \u4FDD\u7559\u4E24\u6807\u7B7E\u800C\u975E\u5408\u5E76\uFF08\u628A"\u4E0D\u53EF\u53D6\u6D88"\u505A\u6210 p-modal \u7684\u5F00\u5173\uFF0C\u4F1A\u8BA9"\u53EF\u5173"\u7684\u9ED8\u8BA4\u914D\u7F6E\u6709\u673A\u4F1A\u88AB\u8BEF\u7528\u5230\u62E6\u622A\u573A\u666F\uFF09\u3002'
|
|
266
|
+
},
|
|
267
|
+
"shell.toast": {
|
|
268
|
+
canonical: "p-toast",
|
|
269
|
+
aliases: ["p-toast-host"],
|
|
270
|
+
reason: "p-toast \u662F\u58F0\u660E\u5F0F\u5355\u6761\u63D0\u793A\uFF08\u7236\u7EA7\u7ED9 visible/text\uFF09\uFF1Bp-toast-host \u662F\u540C\u8BED\u4E49\u7684**\u547D\u4EE4\u5F0F\u6E32\u67D3\u7AEF**\uFF08\u8BA2\u9605 runtime \u961F\u5217\uFF0C\u7531\u6784\u5EFA\u671F\u6309\u9700\u6CE8\u5165\u6BCF\u9875\uFF09\u2014\u2014\u4E24\u8005\u7528\u9014\u4E0D\u540C\uFF0C\u6545\u5E76\u5B58\u800C\u975E\u66FF\u4EE3\u3002"
|
|
271
|
+
},
|
|
272
|
+
"ui.loading": {
|
|
273
|
+
canonical: "p-loading",
|
|
274
|
+
aliases: ["p-loading-host", "p-loading-region"],
|
|
275
|
+
reason: "p-loading \u662F\u58F0\u660E\u5F0F\u906E\u7F69\uFF08\u5355\u5B9E\u4F8B\uFF09\uFF1Bp-loading-host \u662F\u540C\u8BED\u4E49\u7684**\u547D\u4EE4\u5F0F\u591A\u5B9E\u4F8B\u6E32\u67D3\u7AEF**\uFF08\u6784\u5EFA\u671F\u6CE8\u5165\uFF09\uFF1Bp-loading-region \u662F**\u533A\u57DF\u906E\u7F69**\uFF08\u5C31\u5730\u5305\u88F9\u3001\u8D34\u5408\u76D2\u5B50\u5C3A\u5BF8\uFF09\u3002\u4E09\u8005\u662F\u540C\u4E00\u8BED\u4E49\u7684\u4E09\u79CD\u7528\u6CD5\uFF08\u5168\u5C4F\u58F0\u660E\u5F0F/\u5168\u5C4F\u547D\u4EE4\u5F0F/\u533A\u57DF\u5185\uFF09\uFF0C\u6545\u5171\u4EAB primitive \u800C\u4FDD\u7559\u5404\u81EA\u6807\u7B7E\u3002"
|
|
238
276
|
}
|
|
239
277
|
};
|
|
240
278
|
|
|
@@ -467,8 +505,183 @@ var SEMANTIC_BACKEND_MAP = {
|
|
|
467
505
|
flutter: "scanQR",
|
|
468
506
|
headless: "scan-qr"
|
|
469
507
|
},
|
|
508
|
+
// ★★NC1 首个声明式能力(2026-09-30,C83):屏幕常亮。
|
|
509
|
+
// ★落地状态如实标注(两类):**已接线** = vue-dom(`navigator.wakeLock`,生成桥真跑)
|
|
510
|
+
// + skyline(`wx.setKeepScreenOn`,生成桥真跑);**声明** = native-ios/android/harmony
|
|
511
|
+
// (平台真实 API,按本表既有口径登记——与 capability.qr-code 的 AVCaptureSession 同性质,
|
|
512
|
+
// 属设计声明层;native 宿主接线是后续批次)。
|
|
513
|
+
"capability.keep-screen-on": {
|
|
514
|
+
"vue-dom": "navigator.wakeLock",
|
|
515
|
+
"native-ios": "UIApplication.isIdleTimerDisabled",
|
|
516
|
+
"native-android": "Window.FLAG_KEEP_SCREEN_ON",
|
|
517
|
+
"native-harmony": "window.setWindowKeepScreenOn",
|
|
518
|
+
skyline: "wx.setKeepScreenOn",
|
|
519
|
+
flutter: "keepScreenOn",
|
|
520
|
+
headless: "keep-screen-on"
|
|
521
|
+
},
|
|
522
|
+
// ★★NC1 第二个声明式能力(2026-09-30,C84):文档预览。
|
|
523
|
+
// ★落地状态如实分两类:**已接线** = vue-dom(`window.open`)/ skyline(`wx.openDocument`,生成桥真跑);
|
|
524
|
+
// **声明** = native 两端(平台真实 API:iOS QLPreviewController / Android ACTION_VIEW,
|
|
525
|
+
// 与既有 capability.qr-code 的 AVCaptureSession 同性质,属设计声明层)。
|
|
526
|
+
// ★**native-harmony 有意省略**:鸿蒙文档预览 API 名未经取证,**不编造**(≥3 端映射判据不受影响)。
|
|
527
|
+
"capability.document-preview": {
|
|
528
|
+
"vue-dom": "window.open",
|
|
529
|
+
"native-ios": "QLPreviewController",
|
|
530
|
+
"native-android": "Intent.ACTION_VIEW",
|
|
531
|
+
skyline: "wx.openDocument",
|
|
532
|
+
flutter: "open_file",
|
|
533
|
+
headless: "open-document"
|
|
534
|
+
},
|
|
535
|
+
// ★★2026-09-30 反馈组件补齐(U19 shell.toast / S8 ui.loading):
|
|
536
|
+
// 组件本体(`p-toast` / `p-loading`)**早已存在且已注册**(`packages/components/index.ts`)
|
|
537
|
+
// 并有 MP 产物级测试(`tests/component-b5.test.ts`:wx:if/定时器/A@keyframes 断言)——
|
|
538
|
+
// 缺的只是**本表的后端映射登记**(G-31.4 门禁要求 ≥3 端才可标 implemented,
|
|
539
|
+
// 而 catalog 的 status 因此一直停在 planned ⇒ 与"组件已能用"的事实不符)。
|
|
540
|
+
// ⇒ 本批补齐映射后,catalog status 据实转 implemented(**修的是记账,不是能力**)。
|
|
541
|
+
// ★对照:`wx.showToast` / `wx.showLoading`(命令式全局提示)是**另一条路**——
|
|
542
|
+
// 前者由本组件承接(声明式、可跨端、样式可控),后者仍属 MP 官方 API 表(见 SPEC_PLANNED,
|
|
543
|
+
// 归"全局命令式提示"待补)。两者不冲突:组件是推荐路径,命令式是兼容路径。
|
|
544
|
+
"shell.toast": {
|
|
545
|
+
"vue-dom": "div.proteus-toast",
|
|
546
|
+
"native-ios": "UIView.toast",
|
|
547
|
+
"native-android": "Toast",
|
|
548
|
+
"native-harmony": "promptAction.showToast",
|
|
549
|
+
skyline: "view.toast",
|
|
550
|
+
// Skyline 无原生 toast 组件 → 用 view 自绘(组件本体即此策略)
|
|
551
|
+
flutter: "ScaffoldMessenger.showSnackBar",
|
|
552
|
+
headless: "toast"
|
|
553
|
+
},
|
|
554
|
+
"ui.loading": {
|
|
555
|
+
"vue-dom": "div.proteus-loading",
|
|
556
|
+
"native-ios": "UIActivityIndicatorView",
|
|
557
|
+
"native-android": "ProgressBar",
|
|
558
|
+
"native-harmony": "LoadingProgress",
|
|
559
|
+
skyline: "view.loading",
|
|
560
|
+
// 同上:自绘 spinner(组件内 @keyframes 动画)
|
|
561
|
+
flutter: "CircularProgressIndicator",
|
|
562
|
+
headless: "loading"
|
|
563
|
+
},
|
|
470
564
|
// ★2026-09-18 语义去重:原键 capability.pick-photo 为重复名(组件实现调用 useCamera(),
|
|
471
565
|
// 真实能力即 C1 capability.camera)——键已迁移,映射原样保留。
|
|
566
|
+
// ★★2026-09-30:生命周期三能力的后端映射(C23/C24/C25 随 App 腿落地转为 implemented)。
|
|
567
|
+
// 各行含义:**平台真实触发源**(不是渲染类型——这三个是"事件源"类能力)。
|
|
568
|
+
// · native-ios/android:系统生命周期回调(iOS `willResignActive`/Android `onPause`——本轮真机实证)
|
|
569
|
+
// · vue-dom / skyline:既有实现(`visibilitychange` / `wx.onAppShow`)
|
|
570
|
+
// · headless:确定性注入(测试夹具)
|
|
571
|
+
"capability.app-lifecycle": {
|
|
572
|
+
"vue-dom": "document.visibilitychange",
|
|
573
|
+
"native-ios": "UIApplication.willResignActive",
|
|
574
|
+
"native-android": "Activity.onPause",
|
|
575
|
+
skyline: "wx.onAppShow",
|
|
576
|
+
flutter: "AppLifecycleState",
|
|
577
|
+
headless: "app-lifecycle-bus"
|
|
578
|
+
},
|
|
579
|
+
"capability.page-lifecycle": {
|
|
580
|
+
"vue-dom": "visibilitychange+history",
|
|
581
|
+
"native-ios": "UINavigationController.didShowViewController",
|
|
582
|
+
"native-android": "Fragment.onResume",
|
|
583
|
+
skyline: "Page.onShow",
|
|
584
|
+
flutter: "RouteAware.didPush",
|
|
585
|
+
headless: "page-lifecycle-bus"
|
|
586
|
+
},
|
|
587
|
+
"capability.background": {
|
|
588
|
+
"vue-dom": "document.hidden",
|
|
589
|
+
"native-ios": "UIApplication.didEnterBackground",
|
|
590
|
+
"native-android": "Activity.onStop",
|
|
591
|
+
skyline: "wx.onBackgroundAudioInterruptionBegin",
|
|
592
|
+
flutter: "AppLifecycleState.paused",
|
|
593
|
+
headless: "background-bus"
|
|
594
|
+
},
|
|
595
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
596
|
+
"capability.mini-program": {
|
|
597
|
+
"vue-dom": "window.open (cross-app n/a)",
|
|
598
|
+
"native-ios": "UIApplication.open",
|
|
599
|
+
"native-android": "Intent.ACTION_VIEW",
|
|
600
|
+
"skyline": "wx.navigateToMiniProgram",
|
|
601
|
+
"flutter": "url_launcher",
|
|
602
|
+
"headless": "mini-program-nav"
|
|
603
|
+
},
|
|
604
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
605
|
+
"capability.embedded": {
|
|
606
|
+
"vue-dom": "window.parent (preset)",
|
|
607
|
+
"native-ios": "UIApplicationDelegate.host",
|
|
608
|
+
"native-android": "Activity.getIntent",
|
|
609
|
+
"skyline": "wx.getEnterOptionsSync",
|
|
610
|
+
"flutter": "PlatformDispatcher.host",
|
|
611
|
+
"headless": "host-context"
|
|
612
|
+
},
|
|
613
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
614
|
+
"capability.extension": {
|
|
615
|
+
"vue-dom": "dynamic import()",
|
|
616
|
+
"native-ios": "NSBundle.load",
|
|
617
|
+
"native-android": "DexClassLoader",
|
|
618
|
+
"skyline": "plugin shell (host)",
|
|
619
|
+
"flutter": "dynamic library load",
|
|
620
|
+
"headless": "extension-loader"
|
|
621
|
+
},
|
|
622
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
623
|
+
"capability.update": {
|
|
624
|
+
"vue-dom": "ServiceWorkerRegistration",
|
|
625
|
+
"native-ios": "Bundle version check",
|
|
626
|
+
"native-android": "Play Core In-App Updates",
|
|
627
|
+
"skyline": "wx.getUpdateManager",
|
|
628
|
+
"flutter": "upgrader",
|
|
629
|
+
"headless": "update-manager"
|
|
630
|
+
},
|
|
631
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
632
|
+
"capability.worker": {
|
|
633
|
+
"vue-dom": "new Worker()",
|
|
634
|
+
"native-ios": "DispatchQueue.global",
|
|
635
|
+
"native-android": "ThreadPoolExecutor",
|
|
636
|
+
"skyline": "wx.createWorker",
|
|
637
|
+
"flutter": "Isolate.spawn",
|
|
638
|
+
"headless": "worker-thread"
|
|
639
|
+
},
|
|
640
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
641
|
+
"capability.preload": {
|
|
642
|
+
"vue-dom": "link rel=preload",
|
|
643
|
+
"native-ios": "NSBundle preload",
|
|
644
|
+
"native-android": "Resources preload",
|
|
645
|
+
"skyline": "wx.preloadAssets",
|
|
646
|
+
"flutter": "precacheImage",
|
|
647
|
+
"headless": "preload"
|
|
648
|
+
},
|
|
649
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
650
|
+
"capability.idle": {
|
|
651
|
+
"vue-dom": "requestIdleCallback",
|
|
652
|
+
"native-ios": "CADisplayLink idle",
|
|
653
|
+
"native-android": "Choreographer idle",
|
|
654
|
+
"skyline": "wx.requestIdleCallback",
|
|
655
|
+
"flutter": "SchedulerBinding.idle",
|
|
656
|
+
"headless": "idle-callback"
|
|
657
|
+
},
|
|
658
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
659
|
+
"capability.window": {
|
|
660
|
+
"vue-dom": "window.resizeTo (limited)",
|
|
661
|
+
"native-ios": "UIWindowScene.requestGeometryUpdate",
|
|
662
|
+
"native-android": "WindowManager.LayoutParams",
|
|
663
|
+
"skyline": "wx.setWindowSize",
|
|
664
|
+
"flutter": "WindowManager",
|
|
665
|
+
"headless": "window-manager"
|
|
666
|
+
},
|
|
667
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
668
|
+
"capability.navigation-guard": {
|
|
669
|
+
"vue-dom": "beforeunload",
|
|
670
|
+
"native-ios": "UINavigationController.delegate",
|
|
671
|
+
"native-android": "OnBackPressedDispatcher",
|
|
672
|
+
"skyline": "wx.enableAlertBeforeUnload",
|
|
673
|
+
"flutter": "PopScope",
|
|
674
|
+
"headless": "nav-guard"
|
|
675
|
+
},
|
|
676
|
+
// ★2026-09-30 应用与生命周期域收口(能力已落地)
|
|
677
|
+
"capability.webassembly": {
|
|
678
|
+
"vue-dom": "WebAssembly.instantiate",
|
|
679
|
+
"native-ios": "JavaScriptCore WebAssembly",
|
|
680
|
+
"native-android": "QuickJS WebAssembly",
|
|
681
|
+
"skyline": "WXWebAssembly.instantiate",
|
|
682
|
+
"flutter": "wasm bindings",
|
|
683
|
+
"headless": "wasm"
|
|
684
|
+
},
|
|
472
685
|
"capability.camera": {
|
|
473
686
|
"vue-dom": "input.proteus-pick-photo",
|
|
474
687
|
"native-ios": "UIImagePicker",
|
|
@@ -1035,7 +1248,9 @@ var UI = [
|
|
|
1035
1248
|
{ 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" },
|
|
1036
1249
|
{ id: "U18", kind: "ui", semantic: "ui.form", tag: "p-form", props: ["model", "rules", "layout"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
1037
1250
|
// ★#405 语义登记批:反馈/状态类组件
|
|
1038
|
-
|
|
1251
|
+
// ★2026-09-30 反馈组件补齐:组件本体(p-loading)与 MP 产物测试早已存在,
|
|
1252
|
+
// 缺的只是 SEMANTIC_BACKEND_MAP 的后端映射登记 ⇒ 补齐后据实转 implemented(**修记账非修能力**)
|
|
1253
|
+
{ id: "U19", kind: "ui", semantic: "ui.loading", tag: "p-loading", props: ["size", "text"], mpEquiv: "wx.showLoading \u90E8\u5206", tier: "L1", status: "implemented" },
|
|
1039
1254
|
{ 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" },
|
|
1040
1255
|
{ id: "U21", kind: "ui", semantic: "ui.skeleton", tag: "p-skeleton", props: ["rows", "avatar", "animated"], mpEquiv: "\u65E0", tier: "L2", status: "planned" },
|
|
1041
1256
|
// ★能力颗粒度对齐 C2:进度条 / 表单标签
|
|
@@ -1063,7 +1278,8 @@ var SHELL = [
|
|
|
1063
1278
|
{ id: "S5", kind: "shell", semantic: "shell.drawer", tag: "p-drawer", props: ["side", "width", "overlay"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
1064
1279
|
{ id: "S6", kind: "shell", semantic: "shell.modal", tag: "p-modal", props: ["open", "dismissible", "sheet", "dialog", "alert"], mpEquiv: "<modal>+wx.showModal", tier: "L1", status: "implemented" },
|
|
1065
1280
|
{ id: "S7", kind: "shell", semantic: "shell.popover", tag: "p-popover", props: ["trigger", "placement"], mpEquiv: "\u7EC4\u5408", tier: "L1", status: "implemented" },
|
|
1066
|
-
|
|
1281
|
+
// ★2026-09-30 同上(p-toast 已有 MP 产物测试 + 7 端映射 ⇒ 据实转 implemented)
|
|
1282
|
+
{ id: "S8", kind: "shell", semantic: "shell.toast", tag: "p-toast", props: ["message", "duration", "type"], mpEquiv: "wx.showToast", tier: "L1", status: "implemented" },
|
|
1067
1283
|
{ id: "S9", kind: "shell", semantic: "shell.action-sheet", tag: "p-action-sheet", props: ["actions", "cancel"], mpEquiv: "wx.showActionSheet", tier: "L1", status: "implemented" },
|
|
1068
1284
|
{ 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" },
|
|
1069
1285
|
// ★已落地绑定:分栏语义由 layout.split 承载(G-32 文档为 shell.split——机器事实以实现为准)
|
|
@@ -1124,9 +1340,13 @@ var CAPABILITY = [
|
|
|
1124
1340
|
cap("C20", "calendar", "useCalendar()", "wx.addPhoneCalendar", "CalendarAPI"),
|
|
1125
1341
|
cap("C21", "phone-call", "usePhoneCall()", "wx.makePhoneCall", "Result<void>"),
|
|
1126
1342
|
cap("C22", "sms", "useSMS()", "wx.??\uFF08\u53D7\u9650\uFF09", "Result<void>"),
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1343
|
+
// ★★2026-09-30:C23/C24/C25 App 宿主腿落地(此前仅 wx/web 两桥 ⇒ App 端形同虚设)——
|
|
1344
|
+
// App 桥 `packages/api/src/capability-app.ts`(总线 + 三能力 + 虚拟栈页面事件翻译器);
|
|
1345
|
+
// 真机判据 `check:host-runtime` ①~⑤(冷启动补 launch / 真实栈驱动页面生命周期 /
|
|
1346
|
+
// 壳真实事件逐条驱动总线 / 启动参数经 job 泵 / 阶段快照)。
|
|
1347
|
+
{ id: "C23", kind: "capability", semantic: "capability.app-lifecycle", api: "useAppLifecycle()", props: ["LifecycleHooks"], mpEquiv: "App.onLaunch/onShow", tier: "L1", status: "implemented" },
|
|
1348
|
+
{ id: "C24", kind: "capability", semantic: "capability.page-lifecycle", api: "usePageLifecycle()", props: ["LifecycleHooks"], mpEquiv: "Page.onLoad/onShow", tier: "L1", status: "implemented" },
|
|
1349
|
+
{ id: "C25", kind: "capability", semantic: "capability.background", api: "useBackground()", props: ["BackgroundAPI"], mpEquiv: "wx.onBackground", tier: "L1", status: "implemented" },
|
|
1130
1350
|
// 7.3 通信/数据(10)
|
|
1131
1351
|
cap("C26", "fetch", "useFetch()", "wx.request", "Promise<T>"),
|
|
1132
1352
|
cap("C27", "websocket", "useWebSocket()", "wx.connectSocket", "WSConnection"),
|
|
@@ -1152,15 +1372,15 @@ var CAPABILITY = [
|
|
|
1152
1372
|
cap("C45", "shortcut", "useShortcut()", "wx.addToDesktop", "Result<void>"),
|
|
1153
1373
|
cap("C46", "in-app-purchase", "useInAppPurchase()", "wx.requestPayment \u6269\u5C55", "Result<Receipt>"),
|
|
1154
1374
|
// 7.5 平台特有(4——C47-C50,此前 7.4 末 C46,总 50)
|
|
1155
|
-
{ id: "C47", kind: "capability", semantic: "capability.mini-program", api: "useMiniProgram()", props: ["MPContext"], mpEquiv: "wx.navigateToMiniProgram", tier: "L1", status: "
|
|
1156
|
-
{ id: "C48", kind: "capability", semantic: "capability.embedded", api: "useEmbedded()", props: ["HostContext"], mpEquiv: "\u65E0\uFF08\u88AB\u5BBF\u4E3B\u5D4C\u5165\uFF09", tier: "L1", status: "
|
|
1375
|
+
{ id: "C47", kind: "capability", semantic: "capability.mini-program", api: "useMiniProgram()", props: ["MPContext"], mpEquiv: "wx.navigateToMiniProgram", tier: "L1", status: "implemented" },
|
|
1376
|
+
{ id: "C48", kind: "capability", semantic: "capability.embedded", api: "useEmbedded()", props: ["HostContext"], mpEquiv: "\u65E0\uFF08\u88AB\u5BBF\u4E3B\u5D4C\u5165\uFF09", tier: "L1", status: "implemented" },
|
|
1157
1377
|
{ id: "C49", kind: "capability", semantic: "capability.live", api: "useLive()", props: ["LiveRoom"], mpEquiv: "wx...\uFF08\u76F4\u64AD\u7EC4\u4EF6\uFF09", tier: "L1", status: "planned" },
|
|
1158
|
-
{ 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: "
|
|
1378
|
+
{ 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: "implemented" },
|
|
1159
1379
|
// ★颗粒度对齐 C(2026-09-11):C51 小程序热更新(wx.getUpdateManager)
|
|
1160
|
-
{ id: "C51", kind: "capability", semantic: "capability.update", api: "useUpdate()", props: ["UpdateManagerAPI"], mpEquiv: "wx.getUpdateManager", tier: "L1", status: "
|
|
1380
|
+
{ id: "C51", kind: "capability", semantic: "capability.update", api: "useUpdate()", props: ["UpdateManagerAPI"], mpEquiv: "wx.getUpdateManager", tier: "L1", status: "implemented" },
|
|
1161
1381
|
// ★颗粒度对齐 C3(2026-09-11):相册 / Worker(对齐小程序媒体与多线程 API——纯 Hook,无 C-IR 节点 → planned)
|
|
1162
1382
|
{ id: "C52", kind: "capability", semantic: "capability.album", api: "useAlbum()", props: ["AlbumAPI"], mpEquiv: "wx.chooseMedia/saveImageToPhotosAlbum/previewMedia", tier: "L1", status: "planned" },
|
|
1163
|
-
{ id: "C53", kind: "capability", semantic: "capability.worker", api: "useWorker()", props: ["WorkerHandle"], mpEquiv: "wx.createWorker", tier: "L1", status: "
|
|
1383
|
+
{ id: "C53", kind: "capability", semantic: "capability.worker", api: "useWorker()", props: ["WorkerHandle"], mpEquiv: "wx.createWorker", tier: "L1", status: "implemented" },
|
|
1164
1384
|
// ★颗粒度对齐 C3 批 2:收货地址 / WiFi / 微信运动(对齐小程序系统 API——纯 Hook → planned)
|
|
1165
1385
|
{ id: "C54", kind: "capability", semantic: "capability.address", api: "useAddress()", props: ["ShippingAddress"], mpEquiv: "wx.chooseAddress", tier: "L1", status: "planned" },
|
|
1166
1386
|
{ id: "C55", kind: "capability", semantic: "capability.wifi", api: "useWifi()", props: ["WifiAPI"], mpEquiv: "wx.getConnectedWifi/getWifiList/connectWifi", tier: "L1", status: "planned" },
|
|
@@ -1180,7 +1400,7 @@ var CAPABILITY = [
|
|
|
1180
1400
|
{ id: "C65", kind: "capability", semantic: "capability.privacy", api: "usePrivacy()", props: ["PrivacyAPI"], mpEquiv: "wx.getPrivacySetting/openPrivacyContract/requirePrivacyAuthorize", tier: "L1", status: "planned" },
|
|
1181
1401
|
// ★权威标尺缺口补齐批 D(2026-09-12):性能 / 预加载 / 图像编辑(通用能力,无资质门槛)
|
|
1182
1402
|
{ id: "C66", kind: "capability", semantic: "capability.performance", api: "usePerformance()", props: ["PerformanceAPI"], mpEquiv: "wx.getPerformance/reportPerformance", tier: "L1", status: "planned" },
|
|
1183
|
-
{ id: "C67", kind: "capability", semantic: "capability.preload", api: "usePreload()", props: ["PreloadAPI"], mpEquiv: "wx.preloadAssets/preloadSkylineView/preloadWebview/preDownloadSubpackage", tier: "L1", status: "
|
|
1403
|
+
{ id: "C67", kind: "capability", semantic: "capability.preload", api: "usePreload()", props: ["PreloadAPI"], mpEquiv: "wx.preloadAssets/preloadSkylineView/preloadWebview/preDownloadSubpackage", tier: "L1", status: "implemented" },
|
|
1184
1404
|
{ id: "C68", kind: "capability", semantic: "capability.image-edit", api: "useImageEdit()", props: ["ImageEditAPI"], mpEquiv: "wx.cropImage/editImage", tier: "L1", status: "planned" },
|
|
1185
1405
|
// ★权威标尺缺口补齐批 E(2026-09-12):网络底层 / 媒体高级
|
|
1186
1406
|
{ id: "C69", kind: "capability", semantic: "capability.socket", api: "useSocket()", props: ["UDPSocketHandle / TCPSocketHandle"], mpEquiv: "wx.createUDPSocket/createTCPSocket", tier: "L1", status: "planned" },
|
|
@@ -1188,16 +1408,37 @@ var CAPABILITY = [
|
|
|
1188
1408
|
// ★权威标尺缺口补齐批 F(2026-09-12):录屏/缓存/空闲/窗口/导航拦截
|
|
1189
1409
|
{ id: "C71", kind: "capability", semantic: "capability.screen-capture", api: "useScreenCapture()", props: ["ScreenCaptureAPI"], mpEquiv: "wx.getScreenRecordingState/onScreenRecordingStateChanged/onUserCaptureScreen/checkIsPictureInPictureActive", tier: "L1", status: "planned" },
|
|
1190
1410
|
{ id: "C72", kind: "capability", semantic: "capability.cache-manager", api: "useCacheManager()", props: ["CacheManagerHandle"], mpEquiv: "wx.createCacheManager", tier: "L1", status: "planned" },
|
|
1191
|
-
{ id: "C73", kind: "capability", semantic: "capability.idle", api: "useIdle()", props: ["IdleAPI"], mpEquiv: "wx.requestIdleCallback/cancelIdleCallback", tier: "L1", status: "
|
|
1192
|
-
{ id: "C74", kind: "capability", semantic: "capability.window", api: "useWindow()", props: ["WindowAPI"], mpEquiv: "wx.setWindowSize", tier: "L1", status: "
|
|
1193
|
-
{ id: "C75", kind: "capability", semantic: "capability.navigation-guard", api: "useNavigationGuard()", props: ["NavigationGuardAPI"], mpEquiv: "wx.enableAlertBeforeUnload/disableAlertBeforeUnload", tier: "L1", status: "
|
|
1411
|
+
{ id: "C73", kind: "capability", semantic: "capability.idle", api: "useIdle()", props: ["IdleAPI"], mpEquiv: "wx.requestIdleCallback/cancelIdleCallback", tier: "L1", status: "implemented" },
|
|
1412
|
+
{ id: "C74", kind: "capability", semantic: "capability.window", api: "useWindow()", props: ["WindowAPI"], mpEquiv: "wx.setWindowSize", tier: "L1", status: "implemented" },
|
|
1413
|
+
{ id: "C75", kind: "capability", semantic: "capability.navigation-guard", api: "useNavigationGuard()", props: ["NavigationGuardAPI"], mpEquiv: "wx.enableAlertBeforeUnload/disableAlertBeforeUnload", tier: "L1", status: "implemented" },
|
|
1194
1414
|
// ★权威标尺缺口补齐批 G(2026-09-12):AR/XR / iBeacon / 局域网 / 翻译 / 海报 / 设备探测
|
|
1195
1415
|
{ id: "C76", kind: "capability", semantic: "capability.ar", api: "useAR()", props: ["ARAPI"], mpEquiv: "wx.createVKSession/isVKSupport", tier: "L1", status: "planned" },
|
|
1196
1416
|
{ id: "C77", kind: "capability", semantic: "capability.beacon", api: "useBeacon()", props: ["BeaconAPI"], mpEquiv: "wx.onBeaconServiceChange/onBeaconUpdate", tier: "L1", status: "planned" },
|
|
1197
1417
|
{ id: "C78", kind: "capability", semantic: "capability.local-service", api: "useLocalService()", props: ["LocalServiceAPI"], mpEquiv: "wx.onLocalServiceFound/Lost/ResolveFail/DiscoveryStop", tier: "L1", status: "planned" },
|
|
1198
1418
|
{ id: "C79", kind: "capability", semantic: "capability.translation", api: "useTranslation()", props: ["TranslationAPI"], mpEquiv: "wx.onUserTriggerTranslation/onUserOffTranslation", tier: "L1", status: "planned" },
|
|
1199
1419
|
{ id: "C80", kind: "capability", semantic: "capability.poster", api: "usePoster()", props: ["PosterAPI"], mpEquiv: "wx.onGeneratePoster", tier: "L1", status: "planned" },
|
|
1200
|
-
{ id: "C81", kind: "capability", semantic: "capability.device-capability", api: "useDeviceCapability()", props: ["DeviceCapabilityAPI"], mpEquiv: "wx.checkDeviceSupportHevc", tier: "L1", status: "planned" }
|
|
1420
|
+
{ id: "C81", kind: "capability", semantic: "capability.device-capability", api: "useDeviceCapability()", props: ["DeviceCapabilityAPI"], mpEquiv: "wx.checkDeviceSupportHevc", tier: "L1", status: "planned" },
|
|
1421
|
+
// ★C82(2026-09-29):WebAssembly 跨平台实现——**超官方清单**能力(官方 301 API 里无 wasm)。
|
|
1422
|
+
// 三端形态有实质差异(双源取证:微信官方文档 /framework/performance/wasm.html +
|
|
1423
|
+
// miniprogram-api-typings/lib.wx.wasm.d.ts):
|
|
1424
|
+
// MP `WXWebAssembly.instantiate(path)` 只收**代码包路径**(.wasm/.wasm.br)· 无 compile/validate ·
|
|
1425
|
+
// v2.13.0+ 全局 / v2.15.0+ Worker;Web 与 App-iOS(JSC) 走标准 `WebAssembly`(收字节 · 有 compile/validate);
|
|
1426
|
+
// App-Android 由**宿主 wasm3** 执行(QuickJS 内建无 WASM——双端真机验证 add(2,40)=42)。
|
|
1427
|
+
// ⇒ 归一入口 `instantiate({bytes}|{path})` + 能力位 `supportsStreaming`/`supportsPathLoad`。
|
|
1428
|
+
{ id: "C82", kind: "capability", semantic: "capability.webassembly", api: "useWebAssembly()", props: ["WebAssemblyAPI"], mpEquiv: "WXWebAssembly.instantiate\uFF08\u5B98\u65B9\u6587\u6863 performance/wasm\uFF09", tier: "L1", status: "implemented" },
|
|
1429
|
+
// ★★NC1 首个声明式能力(2026-09-30):来源 = 权威标尺修复后浮现的真实缺口之一
|
|
1430
|
+
// (快照抽取器修复前 `wx.setKeepScreenOn` 结构性不可见,见 mp-spec-coverage 的 SPEC_PLANNED)。
|
|
1431
|
+
// 落地方式 = **声明式**(`packages/api/src/bridge-decls/keep-screen-on.ts` → 生成 → 合并进 bridge):
|
|
1432
|
+
// MP `wx.setKeepScreenOn` / Web **Screen Wake Lock**(`navigator.wakeLock.request('screen')`)——
|
|
1433
|
+
// 双端都有真实对等(非降级对等)。status 标 implemented:桥与 Hook 已落地且测试覆盖
|
|
1434
|
+
// (含双端真跑 + 幂等 + 缺 API 降级)。
|
|
1435
|
+
{ id: "C83", kind: "capability", semantic: "capability.keep-screen-on", api: "useKeepScreenOn()", props: ["KeepScreenOnState"], mpEquiv: "wx.setKeepScreenOn\uFF08Web \u5BF9\u7B49\uFF1AScreen Wake Lock API\uFF09", tier: "L1", status: "implemented" },
|
|
1436
|
+
// ★★NC1 第二个声明式能力(2026-09-30):**用户裁定**「openDocument 属原生能力落地范畴,
|
|
1437
|
+
// 目标就是 99% 的业务代码不需要写原生代码」⇒ 落地而非搁置。
|
|
1438
|
+
// 形态 = 声明式(bridge-decls/open-document.ts → 生成 → 合并);MP `wx.openDocument` /
|
|
1439
|
+
// Web `window.open`(浏览器查看器);★Web 诚实边界:office 格式通常转下载而非预览。
|
|
1440
|
+
// status = implemented:桥与 Hook 已落地 + 测试覆盖(含"弹窗被拦截 ⇒ Err"的防静默判据)。
|
|
1441
|
+
{ id: "C84", kind: "capability", semantic: "capability.document-preview", api: "useOpenDocument()", props: ["DocumentPath"], mpEquiv: "wx.openDocument\uFF08Web \u5BF9\u7B49\uFF1Awindow.open \u2192 \u6D4F\u89C8\u5668\u67E5\u770B\u5668\uFF09", tier: "L1", status: "implemented" }
|
|
1201
1442
|
];
|
|
1202
1443
|
var ENGINEERING = [
|
|
1203
1444
|
{ id: "E1", kind: "engineering", semantic: "engineering.state", api: "useState()", mpEquiv: "data", tier: "L1", status: "planned" },
|
|
@@ -1309,6 +1550,105 @@ function checkSemanticCoverage(minBackends = 3) {
|
|
|
1309
1550
|
return gaps;
|
|
1310
1551
|
}
|
|
1311
1552
|
|
|
1553
|
+
// src/capability-domains.ts
|
|
1554
|
+
var CAPABILITY_CATEGORY = {
|
|
1555
|
+
fetch: "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1556
|
+
websocket: "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1557
|
+
"socket-task": "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1558
|
+
socket: "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1559
|
+
"local-service": "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1560
|
+
upload: "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1561
|
+
download: "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1562
|
+
"data-channel": "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1563
|
+
bluetooth: "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1564
|
+
nfc: "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1565
|
+
device: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1566
|
+
screen: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1567
|
+
battery: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1568
|
+
orientation: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1569
|
+
brightness: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1570
|
+
sensor: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1571
|
+
vibrate: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1572
|
+
network: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1573
|
+
keyboard: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1574
|
+
clipboard: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1575
|
+
"element-query": "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1576
|
+
intersection: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1577
|
+
"media-query": "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1578
|
+
"screen-capture": "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1579
|
+
"cache-manager": "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1580
|
+
ar: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1581
|
+
beacon: "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1582
|
+
"device-capability": "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1583
|
+
storage: "\u5B58\u50A8\u4E0E\u6587\u4EF6",
|
|
1584
|
+
cookie: "\u5B58\u50A8\u4E0E\u6587\u4EF6",
|
|
1585
|
+
"file-system": "\u5B58\u50A8\u4E0E\u6587\u4EF6",
|
|
1586
|
+
archive: "\u5B58\u50A8\u4E0E\u6587\u4EF6",
|
|
1587
|
+
location: "\u4F4D\u7F6E\u4E0E\u5730\u56FE",
|
|
1588
|
+
map: "\u4F4D\u7F6E\u4E0E\u5730\u56FE",
|
|
1589
|
+
camera: "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1590
|
+
microphone: "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1591
|
+
live: "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1592
|
+
"qr-code": "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1593
|
+
canvas: "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1594
|
+
video: "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1595
|
+
audio: "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1596
|
+
"live-pusher": "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1597
|
+
"image-edit": "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1598
|
+
"media-processing": "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1599
|
+
login: "\u8D26\u53F7\u4E0E\u652F\u4ED8",
|
|
1600
|
+
auth: "\u8D26\u53F7\u4E0E\u652F\u4ED8",
|
|
1601
|
+
biometric: "\u8D26\u53F7\u4E0E\u652F\u4ED8",
|
|
1602
|
+
"face-id": "\u8D26\u53F7\u4E0E\u652F\u4ED8",
|
|
1603
|
+
permission: "\u8D26\u53F7\u4E0E\u652F\u4ED8",
|
|
1604
|
+
payment: "\u8D26\u53F7\u4E0E\u652F\u4ED8",
|
|
1605
|
+
"in-app-purchase": "\u8D26\u53F7\u4E0E\u652F\u4ED8",
|
|
1606
|
+
privacy: "\u8D26\u53F7\u4E0E\u652F\u4ED8",
|
|
1607
|
+
notification: "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1608
|
+
share: "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1609
|
+
shortcut: "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1610
|
+
sms: "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1611
|
+
contact: "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1612
|
+
"phone-call": "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1613
|
+
calendar: "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1614
|
+
ad: "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1615
|
+
poster: "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1616
|
+
translation: "\u901A\u77E5\u4E0E\u5206\u4EAB",
|
|
1617
|
+
"app-lifecycle": "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1618
|
+
"page-lifecycle": "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1619
|
+
background: "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1620
|
+
"mini-program": "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1621
|
+
embedded: "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1622
|
+
extension: "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1623
|
+
preload: "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1624
|
+
idle: "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1625
|
+
window: "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1626
|
+
"navigation-guard": "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1627
|
+
analytics: "\u53EF\u89C2\u6D4B\u4E0E\u8C03\u8BD5",
|
|
1628
|
+
log: "\u53EF\u89C2\u6D4B\u4E0E\u8C03\u8BD5",
|
|
1629
|
+
performance: "\u53EF\u89C2\u6D4B\u4E0E\u8C03\u8BD5",
|
|
1630
|
+
// ★2026-09-30 补齐(原 75 条 vs 82 能力 ⇒ 7 个落「其他」;归类依据见文件头注释)
|
|
1631
|
+
update: "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1632
|
+
worker: "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1633
|
+
webassembly: "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F",
|
|
1634
|
+
album: "\u5A92\u4F53\u4E0E\u626B\u7801",
|
|
1635
|
+
address: "\u8D26\u53F7\u4E0E\u652F\u4ED8",
|
|
1636
|
+
wifi: "\u7F51\u7EDC\u4E0E\u901A\u4FE1",
|
|
1637
|
+
"we-run": "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1638
|
+
// ★2026-09-30 NC1 首个声明式能力(C83——与设备/屏幕同域)
|
|
1639
|
+
"keep-screen-on": "\u8BBE\u5907\u4E0E\u7CFB\u7EDF",
|
|
1640
|
+
// ★2026-09-30 NC1:C84 文档预览(文件域——预览的是文件)
|
|
1641
|
+
"document-preview": "\u5B58\u50A8\u4E0E\u6587\u4EF6"
|
|
1642
|
+
};
|
|
1643
|
+
var CAPABILITY_CATEGORY_ORDER = ["\u7F51\u7EDC\u4E0E\u901A\u4FE1", "\u8BBE\u5907\u4E0E\u7CFB\u7EDF", "\u5B58\u50A8\u4E0E\u6587\u4EF6", "\u4F4D\u7F6E\u4E0E\u5730\u56FE", "\u5A92\u4F53\u4E0E\u626B\u7801", "\u8D26\u53F7\u4E0E\u652F\u4ED8", "\u901A\u77E5\u4E0E\u5206\u4EAB", "\u5E94\u7528\u4E0E\u751F\u547D\u5468\u671F", "\u53EF\u89C2\u6D4B\u4E0E\u8C03\u8BD5", "\u5176\u4ED6"];
|
|
1644
|
+
function capabilityDomainOf(semanticOrSlug) {
|
|
1645
|
+
const slug = semanticOrSlug.replace(/^capability\./, "");
|
|
1646
|
+
return CAPABILITY_CATEGORY[slug] ?? "\u5176\u4ED6";
|
|
1647
|
+
}
|
|
1648
|
+
function auditCapabilityDomains(slugs) {
|
|
1649
|
+
return slugs.filter((s) => !(s in CAPABILITY_CATEGORY));
|
|
1650
|
+
}
|
|
1651
|
+
|
|
1312
1652
|
// src/audit.ts
|
|
1313
1653
|
var MP_COMPONENTS = [
|
|
1314
1654
|
{ mp: "<view>", proteus: "layout.box / layout.stack", status: "ok", group: "component" },
|
|
@@ -1409,6 +1749,10 @@ var MP_API_GROUPS = [
|
|
|
1409
1749
|
{ mp: "wx.onUserTriggerTranslation/onUserOffTranslation\uFF08\u7FFB\u8BD1\uFF09", proteus: "useTranslation", status: "ok", group: "api" },
|
|
1410
1750
|
{ mp: "wx.onGeneratePoster\uFF08\u5206\u4EAB\u6D77\u62A5\uFF09", proteus: "usePoster", status: "ok", group: "api" },
|
|
1411
1751
|
{ mp: "wx.checkDeviceSupportHevc\uFF08\u8BBE\u5907\u80FD\u529B\u63A2\u6D4B\uFF09", proteus: "useDeviceCapability", status: "ok", group: "api" },
|
|
1752
|
+
// ★C82:**超官方清单**能力(官方 301 API 列表里无 wasm)——`WXWebAssembly` 属官方「小程序运行时」
|
|
1753
|
+
// 文档(performance/wasm)确认的运行时能力 ⇒ 矩阵按 mpEquiv 如实登记;
|
|
1754
|
+
// 不进 spec 覆盖度分母(否则分母不变而 covered 虚增,覆盖率失真——见 mp-spec-coverage 注释)
|
|
1755
|
+
{ mp: "WXWebAssembly.instantiate\uFF08WebAssembly \u8DE8\u5E73\u53F0\uFF0C\u5B98\u65B9\u6587\u6863 performance/wasm\uFF09", proteus: "useWebAssembly", status: "ok", group: "api" },
|
|
1412
1756
|
{ mp: "wx.getFileSystemManager/*\uFF08\u6587\u4EF6 30+\uFF09", proteus: "useFileSystem", status: "ok", group: "api" },
|
|
1413
1757
|
{ mp: "wx.compressFile/unzip", proteus: "useArchive", status: "ok", group: "api" },
|
|
1414
1758
|
{ mp: "wx.set/get/remove/clearStorage(+Sync)", proteus: "useStorage", status: "ok", group: "api" },
|
|
@@ -1773,7 +2117,126 @@ var SPEC_COVERED = {
|
|
|
1773
2117
|
onUserOffTranslation: "useTranslation",
|
|
1774
2118
|
offUserOffTranslation: "useTranslation",
|
|
1775
2119
|
onGeneratePoster: "usePoster",
|
|
1776
|
-
offGeneratePoster: "usePoster"
|
|
2120
|
+
offGeneratePoster: "usePoster",
|
|
2121
|
+
// ★★2026-09-30 补齐(快照抽取器修泛型缺陷后新可见的 102 个官方 API——
|
|
2122
|
+
// 旧快照结构性漏抽它们 ⇒ 此前从未被归类。逐条证据见 tools 归类记录)
|
|
2123
|
+
authorize: "usePermission",
|
|
2124
|
+
canvasToTempFilePath: "useCanvas",
|
|
2125
|
+
chooseAddress: "useAddress",
|
|
2126
|
+
chooseMedia: "useAlbum",
|
|
2127
|
+
connectWifi: "useWifi",
|
|
2128
|
+
getBatteryInfo: "useBattery",
|
|
2129
|
+
getClipboardData: "useClipboard",
|
|
2130
|
+
getConnectedWifi: "useWifi",
|
|
2131
|
+
getHCEState: "useNFC",
|
|
2132
|
+
getLocation: "useLocation",
|
|
2133
|
+
getNetworkType: "useNetwork",
|
|
2134
|
+
getScreenBrightness: "useBrightness",
|
|
2135
|
+
getSetting: "usePermission",
|
|
2136
|
+
getStorageSync: "useStorage",
|
|
2137
|
+
getWeRunData: "useWeRun",
|
|
2138
|
+
getWifiList: "useWifi",
|
|
2139
|
+
login: "useLogin",
|
|
2140
|
+
makePhoneCall: "usePhoneCall",
|
|
2141
|
+
navigateToMiniProgram: "useMiniProgram",
|
|
2142
|
+
previewMedia: "useAlbum",
|
|
2143
|
+
request: "useFetch",
|
|
2144
|
+
requestPayment: "usePayment",
|
|
2145
|
+
saveImageToPhotosAlbum: "useAlbum",
|
|
2146
|
+
saveVideoToPhotosAlbum: "useAlbum",
|
|
2147
|
+
scanCode: "useQRCode",
|
|
2148
|
+
setClipboardData: "useClipboard",
|
|
2149
|
+
setScreenBrightness: "useBrightness",
|
|
2150
|
+
setStorageSync: "useStorage",
|
|
2151
|
+
startSoterAuthentication: "useBiometric",
|
|
2152
|
+
startWifi: "useWifi",
|
|
2153
|
+
vibrateShort: "useVibrate",
|
|
2154
|
+
requestSubscribeMessage: "useNotification",
|
|
2155
|
+
setWifiList: "useWifi",
|
|
2156
|
+
stopWifi: "useWifi",
|
|
2157
|
+
// ★2026-09-30 NC1:setKeepScreenOn 已由声明式能力 C83 承接(落地后据实由 planned 转 covered)
|
|
2158
|
+
setKeepScreenOn: "useKeepScreenOn",
|
|
2159
|
+
// ★2026-09-30 记账修正:命令式全局提示**早已实现**(`packages/api/src/platform.ts` 的 createUIAPI:
|
|
2160
|
+
// MP 走 wx.showToast/showLoading;Web 走 DOM 自绘 + SSR console 降级),且有测试
|
|
2161
|
+
// (tests/platform-api.test.ts「stub wx 时 showToast/showLoading/hideLoading/showModal/
|
|
2162
|
+
// showActionSheet 转发」)。同一份实现里的 showModal/showActionSheet **早已标 covered**
|
|
2163
|
+
// ⇒ 这 4 条此前记 planned 属**记账不一致**(非能力缺口)。
|
|
2164
|
+
// ★形态说明:命令式(走 PlatformAPI.ui)与声明式(p-toast / p-loading 组件)是**两条并存路径**,
|
|
2165
|
+
// 与 showModal(shell.modal 组件)↔ wx.showModal 的关系同构。
|
|
2166
|
+
showToast: "PlatformAPI.ui.showToast\uFF08+ shell.toast / p-toast \u7EC4\u4EF6\uFF09",
|
|
2167
|
+
hideToast: "PlatformAPI.ui\uFF08DOM/wx \u63D0\u793A\u968F showToast \u751F\u547D\u5468\u671F\uFF1B\u7EC4\u4EF6\u8DEF\u5F84\u89C1 p-toast\uFF09",
|
|
2168
|
+
showLoading: "PlatformAPI.ui.showLoading\uFF08+ ui.loading / p-loading \u7EC4\u4EF6\uFF09",
|
|
2169
|
+
// ★2026-09-30 NC1:C84 文档预览落地(声明式桥;MP wx.openDocument / Web window.open)
|
|
2170
|
+
openDocument: "useOpenDocument",
|
|
2171
|
+
hideLoading: "PlatformAPI.ui.hideLoading",
|
|
2172
|
+
batchGetStorage: "useStorage",
|
|
2173
|
+
batchSetStorage: "useStorage",
|
|
2174
|
+
clearStorage: "useStorage",
|
|
2175
|
+
getStorage: "useStorage",
|
|
2176
|
+
setStorage: "useStorage",
|
|
2177
|
+
removeStorage: "useStorage",
|
|
2178
|
+
getStorageInfo: "useStorage",
|
|
2179
|
+
startAccelerometer: "useSensorStream",
|
|
2180
|
+
stopAccelerometer: "useSensorStream",
|
|
2181
|
+
startCompass: "useSensorStream",
|
|
2182
|
+
stopCompass: "useSensorStream",
|
|
2183
|
+
startGyroscope: "useSensorStream",
|
|
2184
|
+
stopGyroscope: "useSensorStream",
|
|
2185
|
+
startLocationUpdate: "useLocation",
|
|
2186
|
+
stopLocationUpdate: "useLocation",
|
|
2187
|
+
startLocationUpdateBackground: "useLocation",
|
|
2188
|
+
openBluetoothAdapter: "useBluetooth",
|
|
2189
|
+
closeBluetoothAdapter: "useBluetooth",
|
|
2190
|
+
getBluetoothAdapterState: "useBluetooth",
|
|
2191
|
+
getBluetoothDevices: "useBluetooth",
|
|
2192
|
+
getConnectedBluetoothDevices: "useBluetooth",
|
|
2193
|
+
createBLEConnection: "useBluetooth",
|
|
2194
|
+
closeBLEConnection: "useBluetooth",
|
|
2195
|
+
getBLEDeviceCharacteristics: "useBluetooth",
|
|
2196
|
+
getBLEDeviceServices: "useBluetooth",
|
|
2197
|
+
getBLEDeviceRSSI: "useBluetooth",
|
|
2198
|
+
getBLEMTU: "useBluetooth",
|
|
2199
|
+
setBLEMTU: "useBluetooth",
|
|
2200
|
+
isBluetoothDevicePaired: "useBluetooth",
|
|
2201
|
+
makeBluetoothPair: "useBluetooth",
|
|
2202
|
+
notifyBLECharacteristicValueChange: "useBluetooth",
|
|
2203
|
+
readBLECharacteristicValue: "useBluetooth",
|
|
2204
|
+
writeBLECharacteristicValue: "useBluetooth",
|
|
2205
|
+
startBluetoothDevicesDiscovery: "useBluetooth",
|
|
2206
|
+
stopBluetoothDevicesDiscovery: "useBluetooth",
|
|
2207
|
+
openSystemBluetoothSetting: "useBluetooth",
|
|
2208
|
+
closeSocket: "useWebSocket",
|
|
2209
|
+
sendSocketMessage: "useWebSocket",
|
|
2210
|
+
getBeacons: "useBeacon",
|
|
2211
|
+
startBeaconDiscovery: "useBeacon",
|
|
2212
|
+
stopBeaconDiscovery: "useBeacon",
|
|
2213
|
+
startLocalServiceDiscovery: "useLocalService",
|
|
2214
|
+
stopLocalServiceDiscovery: "useLocalService",
|
|
2215
|
+
startHCE: "useNFC",
|
|
2216
|
+
stopHCE: "useNFC",
|
|
2217
|
+
sendHCEMessage: "useNFC",
|
|
2218
|
+
checkIsSupportSoterAuthentication: "useBiometric",
|
|
2219
|
+
checkIsSoterEnrolledInDevice: "useBiometric",
|
|
2220
|
+
chooseImage: "useAlbum",
|
|
2221
|
+
chooseVideo: "useAlbum",
|
|
2222
|
+
previewImage: "useAlbum",
|
|
2223
|
+
compressImage: "useMediaProcessing",
|
|
2224
|
+
compressVideo: "useMediaProcessing",
|
|
2225
|
+
getAvailableAudioSources: "useAudio",
|
|
2226
|
+
setInnerAudioOption: "useAudio",
|
|
2227
|
+
vibrateLong: "useVibrate",
|
|
2228
|
+
hideKeyboard: "useKeyboard",
|
|
2229
|
+
openSetting: "usePermission",
|
|
2230
|
+
openAppAuthorizeSetting: "usePermission",
|
|
2231
|
+
addPhoneRepeatCalendar: "useCalendarAPI",
|
|
2232
|
+
navigateTo: "useRouter/useRoute\uFF08packages/router\uFF09",
|
|
2233
|
+
navigateBack: "useRouter/useRoute\uFF08packages/router\uFF09",
|
|
2234
|
+
redirectTo: "useRouter/useRoute\uFF08packages/router\uFF09",
|
|
2235
|
+
reLaunch: "useRouter/useRoute\uFF08packages/router\uFF09",
|
|
2236
|
+
switchTab: "useRouter/useRoute\uFF08packages/router\uFF09",
|
|
2237
|
+
showModal: "shell.modal\uFF08p-modal \u7EC4\u4EF6\uFF09",
|
|
2238
|
+
showActionSheet: "shell.action-sheet\uFF08p-action-sheet \u7EC4\u4EF6\uFF09",
|
|
2239
|
+
getSelectedTextRange: "ui.selection\uFF08p-selection \u7EC4\u4EF6\uFF09"
|
|
1777
2240
|
};
|
|
1778
2241
|
var SPEC_PRIVATE = /* @__PURE__ */ new Set([
|
|
1779
2242
|
// 支付 / 交通卡 / 离线支付
|
|
@@ -1881,7 +2344,50 @@ var SPEC_PRIVATE = /* @__PURE__ */ new Set([
|
|
|
1881
2344
|
// 小程序归属 / 开屏广告 / XR 系统(微信私有)
|
|
1882
2345
|
"checkIsAddedToMyMiniProgram",
|
|
1883
2346
|
"getShowSplashAdStatus",
|
|
1884
|
-
"getXrFrameSystem"
|
|
2347
|
+
"getXrFrameSystem",
|
|
2348
|
+
// ★★2026-09-30 补齐(新可见 36 条——微信生态独占:卡券/红包/订单支付/发票/车牌/POI/
|
|
2349
|
+
// 群工具与群分享/VoIP/收藏/后台周期拉取/分享菜单控制/小程序返回链/提示更新微信)
|
|
2350
|
+
"addCard",
|
|
2351
|
+
"openCard",
|
|
2352
|
+
"showRedPackage",
|
|
2353
|
+
"requestOrderPayment",
|
|
2354
|
+
"chooseInvoice",
|
|
2355
|
+
"chooseInvoiceTitle",
|
|
2356
|
+
"chooseLicensePlate",
|
|
2357
|
+
"chooseLocation",
|
|
2358
|
+
"choosePoi",
|
|
2359
|
+
"getChatToolInfo",
|
|
2360
|
+
"openChatTool",
|
|
2361
|
+
"notifyGroupMembers",
|
|
2362
|
+
"selectGroupMembers",
|
|
2363
|
+
"shareAppMessageToGroup",
|
|
2364
|
+
"shareEmojiToGroup",
|
|
2365
|
+
"shareFileMessage",
|
|
2366
|
+
"shareFileToGroup",
|
|
2367
|
+
"shareImageToGroup",
|
|
2368
|
+
"shareVideoMessage",
|
|
2369
|
+
"shareVideoToGroup",
|
|
2370
|
+
"shareToWeRun",
|
|
2371
|
+
"subscribeVoIPVideoMembers",
|
|
2372
|
+
"updateVoIPChatMuteConfig",
|
|
2373
|
+
"exitVoIPChat",
|
|
2374
|
+
"addFileToFavorites",
|
|
2375
|
+
"addVideoToFavorites",
|
|
2376
|
+
"hideShareMenu",
|
|
2377
|
+
"showShareMenu",
|
|
2378
|
+
"updateShareMenu",
|
|
2379
|
+
"showShareImageMenu",
|
|
2380
|
+
"navigateBackMiniProgram",
|
|
2381
|
+
"updateWeChatApp",
|
|
2382
|
+
"openLocation",
|
|
2383
|
+
"getBackgroundFetchData",
|
|
2384
|
+
"getBackgroundFetchToken",
|
|
2385
|
+
"setBackgroundFetchToken",
|
|
2386
|
+
// ★2026-09-30 归类修正:这两条依赖**微信生态上下文**(聊天会话选文件 / 微信授权头像昵称),
|
|
2387
|
+
// 与 Web/App 无共同语义 ⇒ 属「微信独占」而非「通用缺口」(重分类前误记 planned——那会虚增
|
|
2388
|
+
// 缺口数并误导 NC2 排期去做"跨端对等",而它本质上没有对等物)
|
|
2389
|
+
"chooseMessageFile",
|
|
2390
|
+
"getUserProfile"
|
|
1885
2391
|
]);
|
|
1886
2392
|
var SPEC_NA = /* @__PURE__ */ new Set([
|
|
1887
2393
|
// 废弃路由事件(wx.router 前身)
|
|
@@ -1903,7 +2409,41 @@ var SPEC_NA = /* @__PURE__ */ new Set([
|
|
|
1903
2409
|
// 系统信息旧版(新工程用 getWindowInfo/getDeviceInfo/getAppBaseInfo)
|
|
1904
2410
|
"getSystemInfoAsync",
|
|
1905
2411
|
// 调度原语(Vue nextTick / 渲染器调度等价,非平台能力)
|
|
1906
|
-
"nextTick"
|
|
2412
|
+
"nextTick",
|
|
2413
|
+
// ★★2026-09-30 补齐(新可见 33 条——已废弃/构建期/被语义原语消灭/宿主层;逐组见注释)
|
|
2414
|
+
"checkSession",
|
|
2415
|
+
"getShareInfo",
|
|
2416
|
+
"getUserInfo",
|
|
2417
|
+
"getSystemInfo",
|
|
2418
|
+
"setEnableDebug",
|
|
2419
|
+
"playVoice",
|
|
2420
|
+
"pauseVoice",
|
|
2421
|
+
"stopVoice",
|
|
2422
|
+
"startRecord",
|
|
2423
|
+
"stopRecord",
|
|
2424
|
+
"playBackgroundAudio",
|
|
2425
|
+
"pauseBackgroundAudio",
|
|
2426
|
+
"stopBackgroundAudio",
|
|
2427
|
+
"seekBackgroundAudio",
|
|
2428
|
+
"getBackgroundAudioPlayerState",
|
|
2429
|
+
"getExtConfig",
|
|
2430
|
+
"loadFontFace",
|
|
2431
|
+
"setNavigationBarTitle",
|
|
2432
|
+
"setNavigationBarColor",
|
|
2433
|
+
"showNavigationBarLoading",
|
|
2434
|
+
"hideNavigationBarLoading",
|
|
2435
|
+
"setTopBarText",
|
|
2436
|
+
"hideHomeButton",
|
|
2437
|
+
"showTabBar",
|
|
2438
|
+
"hideTabBar",
|
|
2439
|
+
"setTabBarBadge",
|
|
2440
|
+
"removeTabBarBadge",
|
|
2441
|
+
"setTabBarItem",
|
|
2442
|
+
"setTabBarStyle",
|
|
2443
|
+
"showTabBarRedDot",
|
|
2444
|
+
"hideTabBarRedDot",
|
|
2445
|
+
"setBackgroundColor",
|
|
2446
|
+
"setBackgroundTextStyle"
|
|
1907
2447
|
]);
|
|
1908
2448
|
var SPEC_PLANNED = {
|
|
1909
2449
|
// 网络底层(已由 C69 useSocket 覆盖——见 SPEC_COVERED)
|
|
@@ -1916,6 +2456,24 @@ var SPEC_PLANNED = {
|
|
|
1916
2456
|
// 缓存管理 / 窗口 / 卸载拦截(已由 C72/C74/C75 覆盖——见 SPEC_COVERED)
|
|
1917
2457
|
// 调度(已由 C73 useIdle 覆盖——见 SPEC_COVERED)
|
|
1918
2458
|
// 设备能力探测(已由 C81 useDeviceCapability 覆盖——见 SPEC_COVERED)
|
|
2459
|
+
// ★C82 WebAssembly:**不在官方 301 API 清单内**(`WXWebAssembly` 属「小程序运行时」文档章节,
|
|
2460
|
+
// 非「API」章节)⇒ **不进 SPEC_COVERED**:那会让 covered 分子虚增而分母不变 ⇒ 覆盖率虚高。
|
|
2461
|
+
// 也不进 SPEC_PRIVATE(它是**公开能力**,不是微信私有 API)
|
|
2462
|
+
// ⇒ 归类为「超清单能力」,由 primitives C82 直接承载(矩阵见 audit.ts)
|
|
2463
|
+
// ★★2026-09-30 补齐(新可见 21 条——真实缺口,NC2「内置能力扩充」候选输入)
|
|
2464
|
+
addPhoneContact: "\u901A\u8BAF\u5F55\u5199\u5165\uFF08\u65E0\u5BF9\u7B49 Hook\uFF09",
|
|
2465
|
+
canvasGetImageData: "\u753B\u5E03\u50CF\u7D20\u8BFB\u53D6\uFF08CanvasContext \u65E0\u6B64\u65B9\u6CD5\u2014\u2014\u89C1 capability.ts CanvasContext\uFF09",
|
|
2466
|
+
canvasPutImageData: "\u753B\u5E03\u50CF\u7D20\u5199\u5165\uFF08\u540C\u4E0A\uFF09",
|
|
2467
|
+
checkIsOpenAccessibility: "\u65E0\u969C\u788D\u5F00\u5173\u63A2\u6D4B\uFF08\u65E0\u5BF9\u7B49\uFF09",
|
|
2468
|
+
createBLEPeripheralServer: "\u84DD\u7259\u5916\u8BBE\u6A21\u5F0F\uFF08\u65E0\u5BF9\u7B49\uFF09",
|
|
2469
|
+
getImageInfo: "\u56FE\u7247\u5143\u4FE1\u606F\uFF08\u5BBD\u9AD8/\u65B9\u5411\u2014\u2014useFileSystem \u53EA\u7ED9 size/digest\uFF09",
|
|
2470
|
+
getVideoInfo: "\u89C6\u9891\u5143\u4FE1\u606F\uFF08\u540C\u4E0A\u65CF\uFF09",
|
|
2471
|
+
getRandomValues: "\u5BC6\u7801\u5B66\u968F\u673A\u6570\uFF08Web \u7AEF\u6709 crypto.getRandomValues\u2014\u2014\u5BBF\u4E3B\u672A\u63A5\u7EBF\uFF09",
|
|
2472
|
+
pageScrollTo: "\u9875\u9762\u7EA7\u6EDA\u52A8\uFF08p-scroll \u53EA\u7BA1\u7EC4\u4EF6\u5185\u6EDA\u52A8\uFF09",
|
|
2473
|
+
startPullDownRefresh: "\u9875\u9762\u7EA7\u4E0B\u62C9\u5237\u65B0\uFF08p-scroll refresher \u53EA\u7BA1 scroll-view\uFF09",
|
|
2474
|
+
stopPullDownRefresh: "\u9875\u9762\u7EA7\u4E0B\u62C9\u5237\u65B0\uFF08\u540C\u4E0A\uFF09",
|
|
2475
|
+
startDeviceMotionListening: "\u8BBE\u5907\u8FD0\u52A8\u76D1\u542C\uFF08\u878D\u5408\u4F20\u611F\u5668\u2014\u2014\u5F53\u524D\u4EC5\u4E09\u8F74\u5355\u9879\uFF09",
|
|
2476
|
+
stopDeviceMotionListening: "\u8BBE\u5907\u8FD0\u52A8\u76D1\u542C\uFF08\u540C\u4E0A\uFF09"
|
|
1919
2477
|
};
|
|
1920
2478
|
var EVENT_BASE = {
|
|
1921
2479
|
// 映射既有 Hook(covered)
|
|
@@ -2129,10 +2687,26 @@ var SPEC_RATCHET = {
|
|
|
2129
2687
|
// 原标 covered 且引用 `gesture.draggable`(拖拽)——引用错位 + MP 无对等(bindtap 不带 count)
|
|
2130
2688
|
// ⇒ 据实转 planned。**真实可运行的等价物一件没少**,只是不再把「仅 Web 成立」记成「两端已落地」。
|
|
2131
2689
|
// 该条即上次注释要求「因诚实性修正需下调时,必须写明被修正的具体条目」所指的条目。
|
|
2132
|
-
coveredMin:
|
|
2133
|
-
// 2026-09-
|
|
2690
|
+
coveredMin: 362,
|
|
2691
|
+
// ★2026-09-30 上调 252 → 356(修标尺)→ 357(C83)→ 361(4 条命令式提示:记账修正)→ **362**(C84 文档预览落地)
|
|
2134
2692
|
gapMax: 0
|
|
2135
2693
|
// 全部官方项必须归类
|
|
2694
|
+
// ★★2026-09-30:抽标尺修复后的水位重锁(**性质:修的是尺子,不是能力**——必须写清楚)
|
|
2695
|
+
// 起因:快照抽取器(scripts/gen-mp-spec.mjs)的 API 正则不认**泛型方法签名** `name<T>(...)`
|
|
2696
|
+
// ⇒ 197 个真实官方 API(含 `wx.request` / `wx.login` / `wx.authorize` / `wx.getStorageSync` /
|
|
2697
|
+
// `wx.chooseMedia` / `wx.setKeepScreenOn` 等**最核心的一批**)**从未进入权威标尺**:
|
|
2698
|
+
// 分母被截短 40%(298 vs 实际 495)。
|
|
2699
|
+
// 后果有两面:① 这些 API 的缺口**结构性不可见**(gap=0 是假的——根本没在表里);
|
|
2700
|
+
// ② 报表里的「官方 N 项」本身是错的。
|
|
2701
|
+
// ✅ 修复后:官方 579 项(组件 84 · API 495);covered 356 / planned 25 / private 145 / na 53 / gap 0。
|
|
2702
|
+
// ★为什么 covered **大幅上涨**(252→356)却不是"能力增长":新增可见的 197 项里,
|
|
2703
|
+
// **104 项**(102 新归类 + 2 由既有规则命中)经逐条取证确认**已有承接**——证据见下方各表
|
|
2704
|
+
// 分组注释(严格口径 = 剥注释后匹配 `wx.<name>(` 或同族动态派发,非"看起来像");
|
|
2705
|
+
// private +39 · na +33 · planned +21 —— 合计 197。它们是**此前没被记账的既有覆盖**。
|
|
2706
|
+
// 这是"修尺子"带来的**账面**变化:真实可运行的等价物一件没多也没少。
|
|
2707
|
+
// ★planned 在后续批次中逐条转出(C83 落地 + 命令式提示 4 条记账修正)——当前值见棘轮注释
|
|
2708
|
+
// —— 它们是 NC2「内置能力扩充」的候选输入(**保守归类**:拿不准一律 planned,不虚标 covered)。
|
|
2709
|
+
// ★附加修复:抽取范围原为「`interface Wx {` 起 → 文件尾」(未设边界,靠缩进巧合)⇒ 改为括号配对。
|
|
2136
2710
|
};
|
|
2137
2711
|
|
|
2138
2712
|
// src/degradation.ts
|
|
@@ -2334,6 +2908,77 @@ function collectPropDiagnostics(tag, props, end, table = DEGRADATION_TABLE) {
|
|
|
2334
2908
|
return out;
|
|
2335
2909
|
}
|
|
2336
2910
|
|
|
2911
|
+
// src/color.ts
|
|
2912
|
+
function rgbOfColor(color) {
|
|
2913
|
+
if (color === void 0 || color === null) return null;
|
|
2914
|
+
const c = color.trim().toLowerCase();
|
|
2915
|
+
const h3 = /^#([0-9a-f])([0-9a-f])([0-9a-f])[0-9a-f]?$/.exec(c);
|
|
2916
|
+
if (h3 !== null) {
|
|
2917
|
+
return [parseInt(h3[1] + h3[1], 16), parseInt(h3[2] + h3[2], 16), parseInt(h3[3] + h3[3], 16)];
|
|
2918
|
+
}
|
|
2919
|
+
const h6 = /^#([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})?$/.exec(c);
|
|
2920
|
+
if (h6 !== null) {
|
|
2921
|
+
return [parseInt(h6[1], 16), parseInt(h6[2], 16), parseInt(h6[3], 16)];
|
|
2922
|
+
}
|
|
2923
|
+
const m = /^rgba?\(([^)]*)\)$/.exec(c);
|
|
2924
|
+
if (m !== null) {
|
|
2925
|
+
const parts = m[1].split(",").map((t) => Number(t.trim()));
|
|
2926
|
+
if (parts.length >= 3 && parts.slice(0, 3).every((n) => Number.isFinite(n))) {
|
|
2927
|
+
return [parts[0], parts[1], parts[2]];
|
|
2928
|
+
}
|
|
2929
|
+
}
|
|
2930
|
+
return null;
|
|
2931
|
+
}
|
|
2932
|
+
function isNeutralColor(color) {
|
|
2933
|
+
const rgb = rgbOfColor(color);
|
|
2934
|
+
if (rgb === null) return false;
|
|
2935
|
+
return rgb[0] === rgb[1] && rgb[1] === rgb[2];
|
|
2936
|
+
}
|
|
2937
|
+
function isOpaqueColor(color) {
|
|
2938
|
+
if (color === void 0 || color === null) return false;
|
|
2939
|
+
const c = color.trim().toLowerCase();
|
|
2940
|
+
if (c === "") return false;
|
|
2941
|
+
if (c === "transparent") return false;
|
|
2942
|
+
if (/^#[0-9a-f]{3}$/.test(c) || /^#[0-9a-f]{6}$/.test(c)) return true;
|
|
2943
|
+
if (/^#[0-9a-f]{4}$/.test(c)) return c[4] === "f";
|
|
2944
|
+
if (/^#[0-9a-f]{8}$/.test(c)) return c.slice(7) === "ff";
|
|
2945
|
+
const m = /^rgba?\(([^)]*)\)$/.exec(c);
|
|
2946
|
+
if (m !== null) {
|
|
2947
|
+
const parts = m[1].split(",").map((t) => t.trim());
|
|
2948
|
+
if (parts.length === 3) return true;
|
|
2949
|
+
if (parts.length === 4) {
|
|
2950
|
+
const a = Number(parts[3]);
|
|
2951
|
+
return Number.isFinite(a) && a >= 1;
|
|
2952
|
+
}
|
|
2953
|
+
}
|
|
2954
|
+
return false;
|
|
2955
|
+
}
|
|
2956
|
+
|
|
2957
|
+
// src/paint-hint.ts
|
|
2958
|
+
function derivePaintHint(input) {
|
|
2959
|
+
const {
|
|
2960
|
+
hasText,
|
|
2961
|
+
textColor,
|
|
2962
|
+
backgroundColor,
|
|
2963
|
+
hasBackgroundImage = false,
|
|
2964
|
+
hasBorderRadius = false,
|
|
2965
|
+
hasBorderWidth = false,
|
|
2966
|
+
opacity,
|
|
2967
|
+
needsCompositing = false,
|
|
2968
|
+
hasTransform = false
|
|
2969
|
+
} = input;
|
|
2970
|
+
const opacityIsOne = opacity === void 0 || opacity === 1;
|
|
2971
|
+
return {
|
|
2972
|
+
isMonochrome: !!(hasText && isOpaqueColor(textColor) && isNeutralColor(textColor) && // ★灰度格式的硬约束(见上方说明)
|
|
2973
|
+
!backgroundColor && !hasBackgroundImage && !hasBorderRadius && opacityIsOne && !needsCompositing),
|
|
2974
|
+
isPureBackground: !!(isOpaqueColor(backgroundColor) && !hasBackgroundImage && !hasBorderWidth && !hasBorderRadius && !needsCompositing && !hasTransform && !hasText && // ★本字段 = "只有一块底色要画"
|
|
2975
|
+
opacityIsOne),
|
|
2976
|
+
// 由树级分析填充(本函数只管单节点)
|
|
2977
|
+
staticSubtree: false,
|
|
2978
|
+
needsCompositingLayer: needsCompositing
|
|
2979
|
+
};
|
|
2980
|
+
}
|
|
2981
|
+
|
|
2337
2982
|
// src/pnode-style.ts
|
|
2338
2983
|
function resolveLength(raw, ctx = { axis: "horizontal" }) {
|
|
2339
2984
|
const v = raw.trim().toLowerCase();
|
|
@@ -2734,15 +3379,17 @@ function normalizeStyleDecls(decls, opts = {}) {
|
|
|
2734
3379
|
}
|
|
2735
3380
|
}
|
|
2736
3381
|
const hasText = Object.keys(text).length > 0;
|
|
2737
|
-
const paintHint = {
|
|
2738
|
-
|
|
2739
|
-
|
|
2740
|
-
|
|
2741
|
-
|
|
2742
|
-
|
|
2743
|
-
|
|
2744
|
-
|
|
2745
|
-
|
|
3382
|
+
const paintHint = derivePaintHint({
|
|
3383
|
+
hasText,
|
|
3384
|
+
textColor: text.color,
|
|
3385
|
+
backgroundColor: paint.backgroundColor,
|
|
3386
|
+
hasBackgroundImage: paint.backgroundImage !== void 0,
|
|
3387
|
+
hasBorderRadius: paint.borderRadius !== void 0,
|
|
3388
|
+
hasBorderWidth: paint.borderWidth !== void 0,
|
|
3389
|
+
opacity: paint.opacity,
|
|
3390
|
+
needsCompositing,
|
|
3391
|
+
hasTransform
|
|
3392
|
+
});
|
|
2746
3393
|
return {
|
|
2747
3394
|
props: {
|
|
2748
3395
|
layout,
|
|
@@ -2838,6 +3485,95 @@ function groupBindingsByNode(bindings) {
|
|
|
2838
3485
|
return out;
|
|
2839
3486
|
}
|
|
2840
3487
|
|
|
3488
|
+
// ../slot-runtime/src/anim-curve.ts
|
|
3489
|
+
var AnimCurve = {
|
|
3490
|
+
LINEAR: 0,
|
|
3491
|
+
EASE_OUT_CUBIC: 1,
|
|
3492
|
+
EASE_IN_CUBIC: 2,
|
|
3493
|
+
EASE_IN_OUT_CUBIC: 3,
|
|
3494
|
+
SPRING_APPROX: 4
|
|
3495
|
+
};
|
|
3496
|
+
var TABLE_N = 65;
|
|
3497
|
+
function springApprox(u) {
|
|
3498
|
+
return 1 - Math.exp(-6 * u) * Math.cos(10 * u);
|
|
3499
|
+
}
|
|
3500
|
+
function buildTable(curve) {
|
|
3501
|
+
const t = new Float64Array(TABLE_N);
|
|
3502
|
+
for (let i = 0; i < TABLE_N; i++) {
|
|
3503
|
+
const u = i / (TABLE_N - 1);
|
|
3504
|
+
t[i] = curve === AnimCurve.EASE_OUT_CUBIC ? 1 - (1 - u) ** 3 : curve === AnimCurve.EASE_IN_CUBIC ? u ** 3 : curve === AnimCurve.EASE_IN_OUT_CUBIC ? u < 0.5 ? 4 * u ** 3 : 1 - (-2 * u + 2) ** 3 / 2 : curve === AnimCurve.SPRING_APPROX ? springApprox(u) : u;
|
|
3505
|
+
}
|
|
3506
|
+
t[0] = 0;
|
|
3507
|
+
t[TABLE_N - 1] = 1;
|
|
3508
|
+
return t;
|
|
3509
|
+
}
|
|
3510
|
+
var TABLES = [
|
|
3511
|
+
buildTable(AnimCurve.LINEAR),
|
|
3512
|
+
buildTable(AnimCurve.EASE_OUT_CUBIC),
|
|
3513
|
+
buildTable(AnimCurve.EASE_IN_CUBIC),
|
|
3514
|
+
buildTable(AnimCurve.EASE_IN_OUT_CUBIC),
|
|
3515
|
+
buildTable(AnimCurve.SPRING_APPROX)
|
|
3516
|
+
];
|
|
3517
|
+
|
|
3518
|
+
// ../slot-runtime/src/expr.ts
|
|
3519
|
+
var PURE_CALLS = {
|
|
3520
|
+
// —— Math(纯计算)——
|
|
3521
|
+
"Math.abs": Math.abs,
|
|
3522
|
+
"Math.ceil": Math.ceil,
|
|
3523
|
+
"Math.floor": Math.floor,
|
|
3524
|
+
"Math.round": Math.round,
|
|
3525
|
+
"Math.trunc": Math.trunc,
|
|
3526
|
+
"Math.sign": Math.sign,
|
|
3527
|
+
"Math.sqrt": Math.sqrt,
|
|
3528
|
+
"Math.cbrt": Math.cbrt,
|
|
3529
|
+
"Math.pow": Math.pow,
|
|
3530
|
+
"Math.exp": Math.exp,
|
|
3531
|
+
"Math.log": Math.log,
|
|
3532
|
+
"Math.log2": Math.log2,
|
|
3533
|
+
"Math.log10": Math.log10,
|
|
3534
|
+
"Math.min": Math.min,
|
|
3535
|
+
"Math.max": Math.max,
|
|
3536
|
+
// —— 类型转换(call 形态,非 new)——
|
|
3537
|
+
"String": String,
|
|
3538
|
+
"Number": Number,
|
|
3539
|
+
"Boolean": Boolean,
|
|
3540
|
+
// —— 解析 / 判定(全局)——
|
|
3541
|
+
"parseInt": parseInt,
|
|
3542
|
+
"parseFloat": parseFloat,
|
|
3543
|
+
"isNaN": isNaN,
|
|
3544
|
+
"isFinite": isFinite,
|
|
3545
|
+
"Number.isFinite": Number.isFinite,
|
|
3546
|
+
"Number.isInteger": Number.isInteger,
|
|
3547
|
+
"Number.isNaN": Number.isNaN,
|
|
3548
|
+
// —— 数组判定 ——
|
|
3549
|
+
"Array.isArray": Array.isArray
|
|
3550
|
+
};
|
|
3551
|
+
var GLOBAL_CONST_MEMBERS = {
|
|
3552
|
+
"Math.PI": Math.PI,
|
|
3553
|
+
"Math.E": Math.E,
|
|
3554
|
+
"Math.LN2": Math.LN2,
|
|
3555
|
+
"Math.LN10": Math.LN10,
|
|
3556
|
+
"Math.LOG2E": Math.LOG2E,
|
|
3557
|
+
"Math.LOG10E": Math.LOG10E,
|
|
3558
|
+
"Math.SQRT2": Math.SQRT2,
|
|
3559
|
+
"Math.SQRT1_2": Math.SQRT1_2,
|
|
3560
|
+
"Number.MAX_SAFE_INTEGER": Number.MAX_SAFE_INTEGER,
|
|
3561
|
+
"Number.MIN_SAFE_INTEGER": Number.MIN_SAFE_INTEGER,
|
|
3562
|
+
"Number.EPSILON": Number.EPSILON,
|
|
3563
|
+
"Number.MAX_VALUE": Number.MAX_VALUE,
|
|
3564
|
+
"Number.MIN_VALUE": Number.MIN_VALUE
|
|
3565
|
+
};
|
|
3566
|
+
|
|
3567
|
+
// ../slot-runtime/src/directives.ts
|
|
3568
|
+
var HOST_DIRECTIVE_SPECS = {
|
|
3569
|
+
animate: {
|
|
3570
|
+
argKind: "anim-preset",
|
|
3571
|
+
argHint: "\u52A8\u753B\u9884\u8BBE\uFF08fade / slide-up / slide-down / slide-left / slide-right / zoom / fade-slide-up\uFF09",
|
|
3572
|
+
desc: "\u503C\u53D8\u5316\uFF08\u6216\u9996\u6B21\u6C42\u503C\u4E3A\u771F\uFF09\u65F6\u5728\u8BE5\u8282\u70B9**\u64AD\u4E00\u6B21**\u9884\u8BBE\u52A8\u753B\uFF08\u8D70\u5185\u6838\u52A8\u753B\u901A\u9053\uFF0C\u4E0E <Transition> \u540C\u4E00\u5957\uFF09\u3002\u8BED\u4E49\u5BF9\u9F50\uFF1A\u6307\u4EE4\u7684 mounted\uFF08\u9996\u8BC4 truthy \u5373\u64AD\uFF09\u4E0E updated\uFF08\u503C\u53D8\u5316\u5373\u64AD\uFF09\u3002"
|
|
3573
|
+
}
|
|
3574
|
+
};
|
|
3575
|
+
var HOST_DIRECTIVE_NAMES = Object.keys(HOST_DIRECTIVE_SPECS);
|
|
3576
|
+
|
|
2841
3577
|
// src/pnode-build.ts
|
|
2842
3578
|
function kindFromSemantic(semantic, tag) {
|
|
2843
3579
|
const s = semantic ?? "";
|
|
@@ -3016,6 +3752,8 @@ function walkPTree(roots, visit) {
|
|
|
3016
3752
|
walk(roots, 0);
|
|
3017
3753
|
}
|
|
3018
3754
|
export {
|
|
3755
|
+
CAPABILITY_CATEGORY,
|
|
3756
|
+
CAPABILITY_CATEGORY_ORDER,
|
|
3019
3757
|
COMPONENT_IR_SCHEMA,
|
|
3020
3758
|
DEFAULT_DESIGN_WIDTH,
|
|
3021
3759
|
DEGRADATION_TABLE,
|
|
@@ -3038,6 +3776,7 @@ export {
|
|
|
3038
3776
|
TAG_SEMANTIC_ALIASES,
|
|
3039
3777
|
TAG_SEMANTIC_MAP,
|
|
3040
3778
|
analyzePTree,
|
|
3779
|
+
auditCapabilityDomains,
|
|
3041
3780
|
auditCatalogConsistency,
|
|
3042
3781
|
auditDegradation,
|
|
3043
3782
|
auditMatrixReferences,
|
|
@@ -3047,6 +3786,7 @@ export {
|
|
|
3047
3786
|
buildPTree,
|
|
3048
3787
|
buildPTreeFromComponentIR,
|
|
3049
3788
|
camel,
|
|
3789
|
+
capabilityDomainOf,
|
|
3050
3790
|
checkComponentSnapshot,
|
|
3051
3791
|
checkPrimitiveCatalog,
|
|
3052
3792
|
checkPropDegradation,
|
|
@@ -3058,6 +3798,7 @@ export {
|
|
|
3058
3798
|
decisionOf,
|
|
3059
3799
|
degradationOf,
|
|
3060
3800
|
degradeProp,
|
|
3801
|
+
derivePaintHint,
|
|
3061
3802
|
expandEdges,
|
|
3062
3803
|
extractSemanticTree,
|
|
3063
3804
|
flattenRate,
|
|
@@ -3069,6 +3810,8 @@ export {
|
|
|
3069
3810
|
implementedPrimitives,
|
|
3070
3811
|
inferOpCode,
|
|
3071
3812
|
inferUpdateKind,
|
|
3813
|
+
isNeutralColor,
|
|
3814
|
+
isOpaqueColor,
|
|
3072
3815
|
kindFromSemantic,
|
|
3073
3816
|
mapSemanticToBackend,
|
|
3074
3817
|
normalizeStyleDecls,
|
|
@@ -3080,6 +3823,7 @@ export {
|
|
|
3080
3823
|
primitiveByTag,
|
|
3081
3824
|
rawFromComponentIR,
|
|
3082
3825
|
resolveLength,
|
|
3826
|
+
rgbOfColor,
|
|
3083
3827
|
splitTopLevel,
|
|
3084
3828
|
toComponentIR,
|
|
3085
3829
|
toComponentTree,
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { PaintHint } from './pnode';
|
|
2
|
+
/** 推导输入(**已解析的原始值**——两条调用方都容易提供,不需要先归一化成 PaintProps) */
|
|
3
|
+
export interface PaintHintInput {
|
|
4
|
+
/** 该节点是否有文本要画(有字形就有存储需求) */
|
|
5
|
+
hasText: boolean;
|
|
6
|
+
/** 文本颜色(CSS 颜色串;未设置 = undefined) */
|
|
7
|
+
textColor?: string | null;
|
|
8
|
+
/** 背景色(CSS 颜色串) */
|
|
9
|
+
backgroundColor?: string | null;
|
|
10
|
+
/** 是否有背景图/渐变(复合绘制 —— 任何"只有一块底色"的策略都不成立) */
|
|
11
|
+
hasBackgroundImage?: boolean;
|
|
12
|
+
/** 是否有圆角(圆角要保留 alpha 边缘) */
|
|
13
|
+
hasBorderRadius?: boolean;
|
|
14
|
+
/** 是否有边框(边框是第二处绘制) */
|
|
15
|
+
hasBorderWidth?: boolean;
|
|
16
|
+
/** 层透明度(< 1 需要 alpha 合成) */
|
|
17
|
+
opacity?: number;
|
|
18
|
+
/** 是否落入 L3 合成层(z-index/fixed/filter/shadow/3D) */
|
|
19
|
+
needsCompositing?: boolean;
|
|
20
|
+
/** 是否有 transform(2D/3D 变换 ⇒ 需要独立合成) */
|
|
21
|
+
hasTransform?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* 推导 paint-hint。
|
|
25
|
+
*
|
|
26
|
+
* 【字段语义与各自的**完整**条件】
|
|
27
|
+
* · `isMonochrome`:可对文本层用**紧凑单通道存储**(iOS `contentsFormat = .gray8Uint`,实测 −39%)。
|
|
28
|
+
* 要求:有文本 + 文本色**确定不透明** + **颜色是中性色**(灰度格式无彩色通道!)
|
|
29
|
+
* + 无底色/背景图(否则是两种颜色)+ 无圆角/透明度(紧凑格式无 alpha 边缘)
|
|
30
|
+
* + 非合成层。
|
|
31
|
+
* ★"中性色"这一条是**格式的硬约束**而非保守选择:8 位灰度**表达不了色相**,
|
|
32
|
+
* 红字写进 gray8Uint 会变灰。−39% 的实验用的是白字,故这一条在实验里**恰好成立**、
|
|
33
|
+
* 但从未被写进判据——若不补,彩色文本会被静默去色。
|
|
34
|
+
* · `isPureBackground`:**该层只有一块底色要画**(走 backgroundColor 通道,不分配存储)。
|
|
35
|
+
* 要求:底色确定不透明 + 无背景图 + 无边框/圆角 + 非合成 + 无 transform + 不透明
|
|
36
|
+
* + **没有文本**(有字形就必须有存储——这条此前缺失)。
|
|
37
|
+
* · `staticSubtree`:由树级分析填充(本函数不管)。
|
|
38
|
+
* · `needsCompositingLayer`:直传。
|
|
39
|
+
*/
|
|
40
|
+
export declare function derivePaintHint(input: PaintHintInput): PaintHint;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@proteus-vue/component-ir",
|
|
3
|
-
"version": "0.3.0-beta.
|
|
3
|
+
"version": "0.3.0-beta.28",
|
|
4
4
|
"description": "G-31 组件与 API 语义化(component-semantics-plan B1):Component IR(C-IR)schema + 属性约束校验 + semantic 映射——组件=语义、属性=约束、Backend 消费 semantic 而非 tag(零依赖纯逻辑)",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "Apache-2.0",
|
|
@@ -19,8 +19,8 @@
|
|
|
19
19
|
"README.md"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
-
"@proteus-vue/contracts": "0.3.0-beta.
|
|
23
|
-
"@proteus-vue/slot-runtime": "0.3.0-beta.
|
|
22
|
+
"@proteus-vue/contracts": "0.3.0-beta.28",
|
|
23
|
+
"@proteus-vue/slot-runtime": "0.3.0-beta.28"
|
|
24
24
|
},
|
|
25
25
|
"scripts": {
|
|
26
26
|
"build": "tsc -p tsconfig.build.json --emitDeclarationOnly && esbuild src/index.ts --bundle --format=esm --platform=neutral --outfile=dist/index.js"
|