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'