import { RuleTester } from 'eslint' import { describe, it } from 'vitest' import { noSubdomainDeepImport } from '../no-subdomain-deep-import.js' const ruleTester = new RuleTester({ languageOptions: { ecmaVersion: 2023, sourceType: 'module' }, }) // 模拟 @drama/assets 包内:character/ 与 scene/ 两个子域。 const sceneFile = '/repo/packages/assets/src/scene/load.js' describe('no-subdomain-deep-import (规则 B)', () => { it('valid/invalid 双向用例', () => { ruleTester.run('no-subdomain-deep-import', noSubdomainDeepImport, { valid: [ // 跨子域走对方 index(目录形式)→ 放行。 { code: "import { Character } from '../character/index.js'", filename: sceneFile, }, // 同子域内部相对导入 → 放行(防误伤)。 { code: "import { helper } from './internal/helper.js'", filename: sceneFile, }, // src 直属文件不属任何子域 → 不受管辖。 { code: "import { x } from './scene/internal/x.js'", filename: '/repo/packages/assets/src/index.js', }, // 包名导入归规则 A,本规则放行。 { code: "import { y } from '@drama/script'", filename: sceneFile, }, ], invalid: [ // 跨子域深入对方 internal → 报错。 { code: "import { y } from '../character/internal/y.js'", filename: sceneFile, errors: [{ messageId: 'subdomainDeep' }], }, { code: "export { z } from '../character/repo/z.js'", filename: sceneFile, errors: [{ messageId: 'subdomainDeep' }], }, { code: "const z = require('../character/repo/z.js')", filename: sceneFile, errors: [{ messageId: 'subdomainDeep' }], }, ], }) }) })