export type TransferSyntax = 'explicit-vr-little-endian' | 'implicit-vr-little-endian'; export type RawTagValue = { vr: string; value: unknown; }; export type DicomTagOverrides = { PatientID?: string; PatientName?: string; StudyDescription?: string; SeriesDescription?: string; [tag: string]: unknown; }; export type ViolationClass = 'uid-too-long' | 'non-conformant-uid' | 'missing-meta-header' | 'malformed-sq-delimiter' | 'vr-max-length-exceeded' | 'missing-type1-tag'; export type Modality = 'CT' | 'PT' | 'MR' | 'CR'; type BaseImageSpec = { modality?: Modality; rows?: number; columns?: number; frames?: number; targetSizeKb?: number; tags?: DicomTagOverrides; transferSyntax?: TransferSyntax; violations?: ViolationClass[]; }; export type ValidImageSpec = BaseImageSpec & { type: 'valid-image'; }; export type InvalidUidImageSpec = BaseImageSpec & { type: 'invalid-uid-image'; }; export type VendorWarningsImageSpec = BaseImageSpec & { type: 'vendor-warnings-image'; }; export type FakeSignatureSpec = { type: 'fake-signature'; }; export type NonDicomSpec = { type: 'non-dicom'; content?: string; targetSizeKb?: number; targetBytes?: number; }; export type DicomdirSpec = { type: 'dicomdir'; }; export type LargeFileSpec = { type: 'large-image'; targetBytes: number; modality?: Modality; tags?: DicomTagOverrides; }; export type ImageSpec = ValidImageSpec | InvalidUidImageSpec | VendorWarningsImageSpec; export type FileSpec = ImageSpec | FakeSignatureSpec | NonDicomSpec | DicomdirSpec | LargeFileSpec; export type EntrySpec = FileSpec & { count?: number; }; export type SeriesEntrySpec = (ImageSpec | LargeFileSpec) & { count?: number; }; export type SeriesInstances = { count: number; targetSizeKb?: number[]; targetBytes?: number[]; modality?: Modality | Modality[]; tags?: Record; }; export type SeriesSpec = { entries?: SeriesEntrySpec[]; instances?: SeriesInstances; tags?: DicomTagOverrides; }; export type StudySpec = { series: SeriesSpec[]; tags?: DicomTagOverrides; count?: number; }; export type TreeFileNode = EntrySpec & { name?: string; }; export type TreeDirNode = { name?: string; role?: 'study' | 'series'; tags?: DicomTagOverrides; children: TreeNode[]; }; export type TreeNode = TreeDirNode | TreeFileNode; export type DatasetLayout = 'flat' | 'hierarchical'; export type PathQuirk = 'trailing-dot' | 'unicode' | 'deep-nesting' | 'long-name'; export type DatasetSpec = { entries?: EntrySpec[]; studies?: StudySpec[]; tree?: TreeNode[]; seed?: number; uidSalt?: string; layout?: DatasetLayout; pathQuirks?: PathQuirk[]; }; export type Range = number | { min: number; max: number; }; export type ParametricStudies = { count: Range; seriesPerStudy: Range; filesPerSeries: Range; fileSizeKb?: Range; modalities?: Modality[]; tags?: DicomTagOverrides; largeFilesPerSeries?: Range; largeFileBytes?: Range; }; export type ParametricEdgeCase = EntrySpec & { frequency?: number; }; export type ParametricSpec = { seed?: number; uidSalt?: string; studies: ParametricStudies; edgeCases?: ParametricEdgeCase[]; layout?: DatasetLayout; }; export {};