|
1 | 1 | import { spawnSync } from 'node:child_process'; |
2 | 2 |
|
3 | | -const result = spawnSync('java', ['-version'], { encoding: 'utf-8' }); |
4 | | -if (result.status === 0) { |
5 | | - process.exit(0); |
| 3 | +const MIN_JAVA_MAJOR = 21; |
| 4 | + |
| 5 | +function extractMajorVersion(output) { |
| 6 | + const match = output.match(/version\s+"([^"]+)"/i); |
| 7 | + if (!match) { |
| 8 | + return null; |
| 9 | + } |
| 10 | + |
| 11 | + const versionString = match[1]; |
| 12 | + const firstSegment = versionString.split('.')[0]; |
| 13 | + if (firstSegment === '1') { |
| 14 | + const legacySegment = versionString.split('.')[1]; |
| 15 | + if (!legacySegment) { |
| 16 | + return null; |
| 17 | + } |
| 18 | + const parsedLegacy = Number.parseInt(legacySegment, 10); |
| 19 | + return Number.isNaN(parsedLegacy) ? null : parsedLegacy; |
| 20 | + } |
| 21 | + |
| 22 | + const parsed = Number.parseInt(firstSegment, 10); |
| 23 | + return Number.isNaN(parsed) ? null : parsed; |
6 | 24 | } |
7 | 25 |
|
| 26 | +const result = spawnSync('java', ['-version'], { encoding: 'utf-8' }); |
8 | 27 | const stderr = result.stderr ? result.stderr.trim() : ''; |
9 | 28 | const stdout = result.stdout ? result.stdout.trim() : ''; |
10 | 29 | const details = stderr.length > 0 ? stderr : stdout; |
11 | 30 |
|
12 | | -console.error('Java runtime is required for Firestore Emulator tests.'); |
13 | | -if (details.length > 0) { |
| 31 | +if (result.status !== 0) { |
| 32 | + console.error('Java runtime is required for Firestore Emulator tests.'); |
| 33 | + if (details.length > 0) { |
| 34 | + console.error(details); |
| 35 | + } |
| 36 | + console.error(`Install Java ${MIN_JAVA_MAJOR}+ and ensure \`java\` is available in PATH, then rerun \`npm run rules:test\`.`); |
| 37 | + process.exit(1); |
| 38 | +} |
| 39 | + |
| 40 | +const majorVersion = extractMajorVersion(details); |
| 41 | +if (majorVersion === null) { |
| 42 | + console.error('Unable to detect Java major version from `java -version` output.'); |
14 | 43 | console.error(details); |
| 44 | + console.error(`Install Java ${MIN_JAVA_MAJOR}+ and ensure \`java\` is available in PATH, then rerun \`npm run rules:test\`.`); |
| 45 | + process.exit(1); |
15 | 46 | } |
16 | | -console.error('Install Java 17+ and ensure `java` is available in PATH, then rerun `npm run rules:test`.'); |
17 | | -process.exit(1); |
| 47 | + |
| 48 | +if (majorVersion < MIN_JAVA_MAJOR) { |
| 49 | + console.error(`Java ${MIN_JAVA_MAJOR}+ is required for Firestore Emulator tests.`); |
| 50 | + console.error(`Detected Java major version: ${majorVersion}`); |
| 51 | + console.error(details); |
| 52 | + console.error(`Install Java ${MIN_JAVA_MAJOR}+ and ensure \`java\` is available in PATH, then rerun \`npm run rules:test\`.`); |
| 53 | + process.exit(1); |
| 54 | +} |
| 55 | + |
| 56 | +process.exit(0); |
0 commit comments