import type { ApexClass } from '../type/ApexClass.js'; import type { SkippedTestClass } from '../type/SkippedTestClass.js'; import type { TestClassResolution } from '../type/TestClassResolution.js'; export interface ApexTestSuiteMember { suiteName: string; className: string; } /** One org type with every spelling the source under mutation may write for it. * `apiName` is the one true name — what describe() receives and what the schema * is keyed by. `aliases` always contains `apiName`, and a bare (unqualified) * alias is only ever present for a type the org's own namespace owns — a * bare spelling is not legal source for a foreign namespace's type. */ export interface TypeName { apiName: string; aliases: string[]; } export interface TypeDependencies { apexClasses: TypeName[]; sObjects: TypeName[]; } export interface PerimeterAssessment { skipped: SkippedTestClass[]; resolutions: TestClassResolution[]; } export type TargetClassVerdict = { kind: 'mutable'; } | { kind: 'not-mutable'; states: string[]; } | { kind: 'ambiguous'; spellings: string[]; } | { kind: 'unqualified'; spelling: string; } | { kind: 'not-found'; }; export interface ApexSourceProvider { assessTargetClass(name: string): Promise; readClass(name: string): Promise; listDependencies(apexClass: ApexClass): Promise; assessPerimeter(names: string[]): Promise; readTestSuiteMembers(suiteNames: string[]): Promise; readExistingTestSuiteNames(suiteNames: string[]): Promise; }