From 198da27ef8f0812008cc915ba782668aab508f46 Mon Sep 17 00:00:00 2001 From: kdletters Date: Sun, 21 Jun 2026 20:37:30 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A1=A5=E9=BD=90=E4=B8=89=E7=AB=AF=E6=A1=A5?= =?UTF-8?q?=E6=8E=A5=E6=A8=A1=E5=9D=97=E5=88=86=E7=B1=BB=E9=97=A8=E7=A6=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增微信移动桌面桥接模块分类断言 区分三端共同模块与原生 App 共同模块 锁定移动桌面微信端专属 HostBridge 模块边界 --- scripts/check-native-shells.mjs | 100 ++++++++++++++++++++++++++++++++ 1 file changed, 100 insertions(+) diff --git a/scripts/check-native-shells.mjs b/scripts/check-native-shells.mjs index 049678edd..424993472 100644 --- a/scripts/check-native-shells.mjs +++ b/scripts/check-native-shells.mjs @@ -1498,6 +1498,25 @@ const expectedDesktopShellRustFiles = [ 'webview.rs', 'window_state.rs', ]; +const expectedHostBridgeModuleTaxonomy = { + allShells: ['dispatch', 'protocol'], + nativeAppShells: [ + 'appearance', + 'badge', + 'capabilities', + 'clipboard', + 'file-payloads', + 'files', + 'navigation', + 'network', + 'notifications', + 'runtime', + 'share', + ], + mobileOnly: ['bridge', 'haptics', 'scanner'], + desktopOnly: ['mod', 'title'], + wechatOnly: ['payment', 'shareGrid', 'subscribeMessage', 'webView'], +}; const documentedShellLayerGroups = [ { label: 'wechat host bridge files', @@ -3827,6 +3846,9 @@ function assertHostBridgeLayerLayout() { ]) { assertUniqueList(values, label); } + for (const [label, values] of Object.entries(expectedHostBridgeModuleTaxonomy)) { + assertUniqueList(values, `host bridge ${label} module taxonomy`); + } for (const [route, expectedFiles] of Object.entries( expectedWechatPageFilesByRoute, )) { @@ -3841,6 +3863,7 @@ function assertHostBridgeLayerLayout() { expectedWechatHostBridgeFiles, 'wechat host bridge files', ); + assertHostBridgeModuleTaxonomy(); assertSameList( readDirectoryFileList('miniprogram/shell', 'wechat shell files'), @@ -3959,6 +3982,83 @@ function assertHostBridgeLayerLayout() { ); } +function normalizeHostBridgeModuleNames(files) { + return files + .filter((fileName) => !fileName.includes('.test.')) + .map((fileName) => + fileName + .replace(/\.(js|rs|ts)$/, '') + .replace('filePayloads', 'file-payloads') + .replace('file_payloads', 'file-payloads'), + ) + .sort(); +} + +function assertHostBridgeModuleTaxonomy() { + const wechatModules = normalizeHostBridgeModuleNames(expectedWechatHostBridgeFiles); + const mobileModules = normalizeHostBridgeModuleNames(expectedMobileHostBridgeFiles); + const desktopModules = normalizeHostBridgeModuleNames( + expectedDesktopHostBridgeRustFiles, + ); + const allShellModules = [...wechatModules, ...mobileModules, ...desktopModules]; + const countInShells = (moduleName) => + [wechatModules, mobileModules, desktopModules].filter((modules) => + modules.includes(moduleName), + ).length; + const actualAllShells = allShellModules + .filter((moduleName, index, modules) => modules.indexOf(moduleName) === index) + .filter((moduleName) => countInShells(moduleName) === 3) + .sort(); + const actualNativeAppShells = mobileModules + .filter((moduleName) => desktopModules.includes(moduleName)) + .filter((moduleName) => !wechatModules.includes(moduleName)) + .sort(); + const actualMobileOnly = mobileModules + .filter( + (moduleName) => + !wechatModules.includes(moduleName) && !desktopModules.includes(moduleName), + ) + .sort(); + const actualDesktopOnly = desktopModules + .filter( + (moduleName) => + !wechatModules.includes(moduleName) && !mobileModules.includes(moduleName), + ) + .sort(); + const actualWechatOnly = wechatModules + .filter( + (moduleName) => + !mobileModules.includes(moduleName) && !desktopModules.includes(moduleName), + ) + .sort(); + + assertSameList( + actualAllShells, + expectedHostBridgeModuleTaxonomy.allShells, + 'all-shell HostBridge module taxonomy', + ); + assertSameList( + actualNativeAppShells, + expectedHostBridgeModuleTaxonomy.nativeAppShells, + 'native-app HostBridge module taxonomy', + ); + assertSameList( + actualMobileOnly, + expectedHostBridgeModuleTaxonomy.mobileOnly, + 'mobile-only HostBridge module taxonomy', + ); + assertSameList( + actualDesktopOnly, + expectedHostBridgeModuleTaxonomy.desktopOnly, + 'desktop-only HostBridge module taxonomy', + ); + assertSameList( + actualWechatOnly, + expectedHostBridgeModuleTaxonomy.wechatOnly, + 'wechat-only HostBridge module taxonomy', + ); +} + function assertDesktopReleaseBinaryArtifact() { const executableName = process.platform === 'win32'