angular/packages/compiler-cli/test/compliance/partial/generate_golden_partial.ts
Paul Gschwendtner 6fcfe2b0ce build: fix partial output generation errors swallowed (#53808)
In some cases, the input files for a partial output generation
compliance tests may be invalid and lead to compilation errors.

The golden partial would be silently generated with the remaining
test cases. Instead of hiding errors, we will now print these and
cause the script to fail properly.

Note that the error logging is pretty minimalistic, but it's sufficient.

PR Close #53808
2024-01-10 12:21:04 +00:00

65 lines
2.3 KiB
TypeScript

/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {AbsoluteFsPath, FileSystem} from '../../../src/ngtsc/file_system';
import {compileTest, getBuildOutputDirectory, initMockTestFileSystem} from '../test_helpers/compile_test';
import {ComplianceTest, getComplianceTests} from '../test_helpers/get_compliance_tests';
import {PartiallyCompiledFile, renderGoldenPartial} from '../test_helpers/golden_partials';
/**
* Generate the golden partial output for the tests described in the `testConfigPath` config file.
*
* @param testConfigPath Absolute disk path of the `TEST_CASES.json` file that describes the tests.
*/
export function generateGoldenPartial(absTestConfigPath: AbsoluteFsPath): void {
const files: PartiallyCompiledFile[] = [];
const tests = getComplianceTests(absTestConfigPath);
for (const test of tests) {
const fs = initMockTestFileSystem(test.realTestPath);
for (const file of compilePartials(fs, test)) {
files.push(file);
}
}
writeGoldenPartial(files);
}
/**
* Partially compile the source files specified by the given `test`.
*
* @param fs The mock file-system to use when compiling partials.
* @param test The information about the test being compiled.
*/
function* compilePartials(fs: FileSystem, test: ComplianceTest): Generator<PartiallyCompiledFile> {
const builtDirectory = getBuildOutputDirectory(fs);
const result = compileTest(
fs, test.inputFiles, test.compilerOptions,
{compilationMode: 'partial', ...test.angularCompilerOptions});
if (result.errors.length > 0) {
throw new Error(
`Unexpected compilation errors: ${result.errors.map(e => ` - ${e}`).join('\n')}`);
}
for (const generatedPath of result.emittedFiles) {
yield {
path: fs.relative(builtDirectory, generatedPath),
content: fs.readFile(generatedPath),
};
}
}
/**
* Write the partially compiled files to the appropriate output destination.
*
* For now just push the concatenated partial files to standard out.
*
* @param files The partially compiled files.
*/
function writeGoldenPartial(files: PartiallyCompiledFile[]): void {
// tslint:disable-next-line: no-console
console.log(renderGoldenPartial(files));
}