import assert from "node:assert/strict"; import fs from "node:fs"; import path from "node:path"; const root = process.cwd(); const sourceFiles = [ "src/views/InventoryLedgerView.vue", "src/views/PurchaseReceiptView.vue", "src/components/StocktakeDialog.vue", "src/views/MasterDataImportView.vue", "src/views/SupplierManagementView.vue", "src/views/SupplierMaterialLiteView.vue", "src/views/SalesPlanningView.vue" ]; for (const relativeFile of sourceFiles) { const source = fs.readFileSync(path.join(root, relativeFile), "utf8"); const fileInputs = source.match(//g)?.filter((input) => /type=["']file["']/.test(input)) || []; for (const input of fileInputs) { assert.match( input, /class=["'][^"']*(hidden-file-input|modern-upload-input)[^"']*["']/, `${relativeFile} 的文件上传不能暴露浏览器原生“选择文件”控件:${input}` ); } } const inventorySource = fs.readFileSync(path.join(root, "src/views/InventoryLedgerView.vue"), "utf8"); assert.match( inventorySource, /class="workflow-mode-switch delivery-mode-switch"/, "成品库销售出库方式必须使用统一分段切换控件" ); assert.doesNotMatch( inventorySource, /purchase-choice-card|purchase-choice-grid|choice-check|choice-main/, "仓库抽屉不能复用采购订单 scoped 样式类,否则会退化成老式裸按钮" ); const cssSource = fs.readFileSync(path.join(root, "src/styles/main.css"), "utf8"); assert.match(cssSource, /\.modern-upload-pill/, "需要保留现代上传胶囊样式"); assert.match(cssSource, /\.workflow-mode-switch/, "需要保留统一分段切换样式"); assert.match(cssSource, /\.import-dropzone input\[type="file"\]/, "导入 dropzone 需要兜底隐藏原生 file input"); console.log("legacy native UI cleanup checks passed");