/** * 外壳的**可注入启动计划**(票 14;规格 09 / 决策票 04 的核心裁定)。 * * 规格 09 原句:「外壳的启动逻辑抽出可注入的启动计划:输入 dataSource 与配置, * 输出启动动作清单;real 与 mock 产出**同一套动作**,仅 transport 不同。」 * * 为什么必须是纯函数而不是散在 `CockpitShell.vue` 里的 if/else: * · 「real 与 mock 同构启动」是一条**可断言的契约**——动作清单同构这件事, * 只有把"清单"变成纯函数的输出,脱浏览器的逻辑闸门才能逐项对齐(规格 09 的主接缝); * · 此前 real 分支只加载配置、什么都不取(旧壳的 `if (dataSource === MOCK)` 门), * 那正是规格 09 的 Problem Statement 第 1 条「real 模式是空壳」——本函数落地后, * 外壳按清单执行,mock 与 real 走**同一条**执行路径,差别只剩 `registerMocks` 一项。 * * 本文件是纯函数:不 import service、不碰 Vue、不发请求(t18 H5 同一条纪律)。 */ /** 启动动作词表(外壳据此执行;词是"做什么",不含"怎么做")。 */ export const STARTUP_ACTION = { REGISTER_MOCKS: 'register-mocks', LOAD_MAP_SUMMARY: 'load-map-summary', LOAD_SHARED_SECTIONS: 'load-shared-sections', LOAD_INFRASTRUCTURE_PANELS: 'load-infrastructure-panels', LOAD_MONITORING_PANELS: 'load-monitoring-panels', LOAD_EVENT_PANELS: 'load-event-panels', LOAD_OVERVIEW_PANELS: 'load-overview-panels', START_WEBSOCKET: 'start-websocket', START_FRESHNESS: 'start-freshness', } /** * 配置 + 数据源 → 启动动作清单(纯函数)。 * * 契约(规格 09 的 Implementation Decisions 逐条对应): * · **完全同构**:real 与 mock 的动作清单**完全相同**(同序同项); * · **real 不注册契约化 mock**:`register-mocks` 只出现在 mock 分支; * · **启动顺序保持「先把筛选交给地图,再取第 1 页」的既有纪律**——清单顺序即执行顺序, * `load-map-summary`(装载器 setup,含筛选)排在 `load-shared-sections`(取第 1 页)之前; * · **WS 只定生命周期**、新鲜度 tick 全套(地图 + 当前模式面板)都归运行期, * 清单只表达"要启动",不表达周期内做什么。 * * 配置缺失或数据源认不出时按 mock 处理(与 `cockpitConfig` 的「非法 dataSource 退回 mock」 * 同一条兜底;调用方(外壳)只会在配置落地后调它)。 * * @param {object} [config] 归一化后的驾驶舱配置(至少 `dataSource`) * @returns {{mode: string, actions: string[], registerMocks: boolean}} */ export function planCockpitStartup(config = {}) { const mode = config && config.dataSource === 'real' ? 'real' : 'mock' const registerMocks = mode !== 'real' const actions = [ ...(registerMocks ? [STARTUP_ACTION.REGISTER_MOCKS] : []), STARTUP_ACTION.LOAD_MAP_SUMMARY, STARTUP_ACTION.LOAD_SHARED_SECTIONS, STARTUP_ACTION.LOAD_INFRASTRUCTURE_PANELS, STARTUP_ACTION.LOAD_MONITORING_PANELS, STARTUP_ACTION.LOAD_EVENT_PANELS, STARTUP_ACTION.LOAD_OVERVIEW_PANELS, STARTUP_ACTION.START_WEBSOCKET, STARTUP_ACTION.START_FRESHNESS, ] return { mode, actions, registerMocks } }