feat(docker): add Docker test file support and runtime adapter
This commit is contained in:
		| @@ -29,7 +29,7 @@ export interface ParserConfig { | ||||
|  | ||||
| const KNOWN_RUNTIMES: Set<string> = new Set(['node', 'chromium', 'deno', 'bun']); | ||||
| const KNOWN_MODIFIERS: Set<string> = new Set(['nonci']); | ||||
| const VALID_EXTENSIONS: Set<string> = new Set(['ts', 'tsx', 'mts', 'cts']); | ||||
| const VALID_EXTENSIONS: Set<string> = new Set(['ts', 'tsx', 'mts', 'cts', 'sh']); | ||||
| const ALL_RUNTIMES: Runtime[] = ['node', 'chromium', 'deno', 'bun']; | ||||
|  | ||||
| // Legacy mappings for backwards compatibility | ||||
| @@ -228,3 +228,81 @@ export function getLegacyMigrationTarget(fileName: string): string | null { | ||||
|  | ||||
|   return parts.join('.'); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Docker test file information | ||||
|  */ | ||||
| export interface DockerTestFileInfo { | ||||
|   baseName: string; | ||||
|   variant: string; | ||||
|   isDockerTest: true; | ||||
|   original: string; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Check if a filename matches the Docker test pattern: *.{variant}.docker.sh | ||||
|  * Examples: test.latest.docker.sh, test.integration.npmci.docker.sh | ||||
|  */ | ||||
| export function isDockerTestFile(fileName: string): boolean { | ||||
|   // Must end with .docker.sh | ||||
|   if (!fileName.endsWith('.docker.sh')) { | ||||
|     return false; | ||||
|   } | ||||
|  | ||||
|   // Extract filename from path if needed | ||||
|   const name = fileName.split('/').pop() || fileName; | ||||
|  | ||||
|   // Must have at least 3 parts: [baseName, variant, docker, sh] | ||||
|   const parts = name.split('.'); | ||||
|   return parts.length >= 4 && parts[parts.length - 2] === 'docker' && parts[parts.length - 1] === 'sh'; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Parse a Docker test filename to extract variant and base name | ||||
|  * Pattern: test.{baseName}.{variant}.docker.sh | ||||
|  * Examples: | ||||
|  *   - test.latest.docker.sh -> { baseName: 'test', variant: 'latest' } | ||||
|  *   - test.integration.npmci.docker.sh -> { baseName: 'test.integration', variant: 'npmci' } | ||||
|  */ | ||||
| export function parseDockerTestFilename(filePath: string): DockerTestFileInfo { | ||||
|   // Extract just the filename from the path | ||||
|   const fileName = filePath.split('/').pop() || filePath; | ||||
|   const original = fileName; | ||||
|  | ||||
|   if (!isDockerTestFile(fileName)) { | ||||
|     throw new Error(`Not a valid Docker test file: "${fileName}". Expected pattern: *.{variant}.docker.sh`); | ||||
|   } | ||||
|  | ||||
|   // Remove .docker.sh suffix | ||||
|   const withoutSuffix = fileName.slice(0, -10); // Remove '.docker.sh' | ||||
|   const tokens = withoutSuffix.split('.'); | ||||
|  | ||||
|   if (tokens.length === 0) { | ||||
|     throw new Error(`Invalid Docker test file: empty basename in "${fileName}"`); | ||||
|   } | ||||
|  | ||||
|   // Last token before .docker.sh is the variant | ||||
|   const variant = tokens[tokens.length - 1]; | ||||
|  | ||||
|   // Everything else is the base name | ||||
|   const baseName = tokens.slice(0, -1).join('.'); | ||||
|  | ||||
|   return { | ||||
|     baseName: baseName || 'test', | ||||
|     variant, | ||||
|     isDockerTest: true, | ||||
|     original, | ||||
|   }; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * Map a Docker variant to its corresponding Dockerfile path | ||||
|  * "latest" -> "Dockerfile" | ||||
|  * Other variants -> "Dockerfile_{variant}" | ||||
|  */ | ||||
| export function mapVariantToDockerfile(variant: string, baseDir: string): string { | ||||
|   if (variant === 'latest') { | ||||
|     return `${baseDir}/Dockerfile`; | ||||
|   } | ||||
|   return `${baseDir}/Dockerfile_${variant}`; | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user