no-subdomain-deep-import.test.js 1.87 KB
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' }],
        },
      ],
    })
  })
})