const assert = require('node:assert/strict'); const { readFileSync } = require('node:fs'); const { test } = require('node:test'); const ts = require('typescript'); function source(path) { return ts.createSourceFile(path, readFileSync(`${__dirname}/../src/${path}`, 'utf8'), ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX); } function find(ast, predicate) { let result; function visit(node) { if (!result && predicate(node)) result = node; ts.forEachChild(node, visit); } visit(ast); assert.ok(result, '目标控件必须存在'); return result; } function size(element) { return element.attributes.properties.find(prop => prop.name?.getText() === 'size')?.initializer?.getText(); } test('网络出口下拉框与业务状态使用同一默认大小,保存按钮保持 small', () => { const edit = source('pages/accounts/$id/edit.tsx'); const status = find(edit, node => ts.isJsxElement(node) && node.openingElement.tagName.getText() === 'Form.Item' && node.openingElement.attributes.properties.some(prop => prop.name?.getText() === 'name' && prop.initializer?.text === 'business_status')); const statusSelect = find(status, node => ts.isJsxSelfClosingElement(node) && node.tagName.getText() === 'Select'); const exit = source('components/accounts/RebindEnvironment.tsx'); const exitSelect = find(exit, node => ts.isJsxSelfClosingElement(node) && node.tagName.getText() === 'Select'); assert.equal(size(statusSelect), undefined); assert.equal(size(exitSelect), size(statusSelect)); const save = find(exit, node => ts.isJsxOpeningElement(node) && node.tagName.getText() === 'Button'); assert.equal(size(save), '"small"'); });