feat(ivy): verify whether TypeScript version is supported (#33377)
During the creation of an Angular program in the compiler, a check is done to verify whether the version of TypeScript is considered supported, producing an error if it is not. This check was missing in the Ivy compiler, so users may have ended up running an unsupported TypeScript version inadvertently. Resolves FW-1643 PR Close #33377
This commit is contained in:
@ -13,6 +13,7 @@ import {ErrorCode, ngErrorCode} from '../../src/ngtsc/diagnostics';
|
||||
import {absoluteFrom} from '../../src/ngtsc/file_system';
|
||||
import {runInEachFileSystem} from '../../src/ngtsc/file_system/testing';
|
||||
import {LazyRoute} from '../../src/ngtsc/routing';
|
||||
import {restoreTypeScriptVersionForTesting, setTypeScriptVersionForTesting} from '../../src/typescript_support';
|
||||
import {loadStandardTestFiles} from '../helpers/src/mock_file_loading';
|
||||
|
||||
import {NgtscTestEnvironment} from './env';
|
||||
@ -4766,6 +4767,48 @@ export const Foo = Foo__PRE_R3__;
|
||||
});
|
||||
});
|
||||
|
||||
describe('disableTypeScriptVersionCheck', () => {
|
||||
afterEach(() => restoreTypeScriptVersionForTesting());
|
||||
|
||||
it('produces an error when not supported and version check is enabled', () => {
|
||||
setTypeScriptVersionForTesting('3.4.0');
|
||||
env.tsconfig({disableTypeScriptVersionCheck: false});
|
||||
env.write('empty.ts', '');
|
||||
|
||||
const diags = env.driveDiagnostics();
|
||||
expect(diags.length).toBe(1);
|
||||
expect(diags[0].messageText).toContain('but 3.4.0 was found instead');
|
||||
});
|
||||
|
||||
it('does not produce an error when supported and version check is enabled', () => {
|
||||
env.tsconfig({disableTypeScriptVersionCheck: false});
|
||||
env.write('empty.ts', '');
|
||||
|
||||
// The TypeScript version is not overwritten, so the version
|
||||
// that is actually used should be supported
|
||||
const diags = env.driveDiagnostics();
|
||||
expect(diags.length).toBe(0);
|
||||
});
|
||||
|
||||
it('does not produce an error when not supported but version check is disabled', () => {
|
||||
setTypeScriptVersionForTesting('3.4.0');
|
||||
env.tsconfig({disableTypeScriptVersionCheck: true});
|
||||
env.write('empty.ts', '');
|
||||
|
||||
const diags = env.driveDiagnostics();
|
||||
expect(diags.length).toBe(0);
|
||||
});
|
||||
|
||||
it('produces an error when not supported using default configuration', () => {
|
||||
setTypeScriptVersionForTesting('3.4.0');
|
||||
env.write('empty.ts', '');
|
||||
|
||||
const diags = env.driveDiagnostics();
|
||||
expect(diags.length).toBe(1);
|
||||
expect(diags[0].messageText).toContain('but 3.4.0 was found instead');
|
||||
});
|
||||
});
|
||||
|
||||
describe('inline resources', () => {
|
||||
it('should process inline <style> tags', () => {
|
||||
env.write('test.ts', `
|
||||
|
@ -12,7 +12,7 @@ import * as path from 'path';
|
||||
import * as ts from 'typescript';
|
||||
import {formatDiagnostics} from '../../src/perform_compile';
|
||||
import {CompilerHost, EmitFlags, LazyRoute} from '../../src/transformers/api';
|
||||
import {checkVersion, createSrcToOutPathMapper} from '../../src/transformers/program';
|
||||
import {createSrcToOutPathMapper} from '../../src/transformers/program';
|
||||
import {StructureIsReused, tsStructureIsReused} from '../../src/transformers/util';
|
||||
import {TestSupport, expectNoDiagnosticsInProgram, setup} from '../test_support';
|
||||
|
||||
@ -1116,34 +1116,4 @@ describe('ng program', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('checkVersion', () => {
|
||||
const MIN_TS_VERSION = '2.7.2';
|
||||
const MAX_TS_VERSION = '2.8.0';
|
||||
|
||||
const versionError = (version: string) =>
|
||||
`The Angular Compiler requires TypeScript >=${MIN_TS_VERSION} and <${MAX_TS_VERSION} but ${version} was found instead.`;
|
||||
|
||||
it('should not throw when a supported TypeScript version is used', () => {
|
||||
expect(() => checkVersion('2.7.2', MIN_TS_VERSION, MAX_TS_VERSION, undefined)).not.toThrow();
|
||||
expect(() => checkVersion('2.7.2', MIN_TS_VERSION, MAX_TS_VERSION, false)).not.toThrow();
|
||||
expect(() => checkVersion('2.7.2', MIN_TS_VERSION, MAX_TS_VERSION, true)).not.toThrow();
|
||||
});
|
||||
|
||||
it('should handle a TypeScript version < the minimum supported one', () => {
|
||||
expect(() => checkVersion('2.4.1', MIN_TS_VERSION, MAX_TS_VERSION, undefined))
|
||||
.toThrowError(versionError('2.4.1'));
|
||||
expect(() => checkVersion('2.4.1', MIN_TS_VERSION, MAX_TS_VERSION, false))
|
||||
.toThrowError(versionError('2.4.1'));
|
||||
expect(() => checkVersion('2.4.1', MIN_TS_VERSION, MAX_TS_VERSION, true)).not.toThrow();
|
||||
});
|
||||
|
||||
it('should handle a TypeScript version > the maximum supported one', () => {
|
||||
expect(() => checkVersion('2.9.0', MIN_TS_VERSION, MAX_TS_VERSION, undefined))
|
||||
.toThrowError(versionError('2.9.0'));
|
||||
expect(() => checkVersion('2.9.0', MIN_TS_VERSION, MAX_TS_VERSION, false))
|
||||
.toThrowError(versionError('2.9.0'));
|
||||
expect(() => checkVersion('2.9.0', MIN_TS_VERSION, MAX_TS_VERSION, true)).not.toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
|
35
packages/compiler-cli/test/typescript_support_spec.ts
Normal file
35
packages/compiler-cli/test/typescript_support_spec.ts
Normal file
@ -0,0 +1,35 @@
|
||||
/**
|
||||
* @license
|
||||
* Copyright Google Inc. 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 {checkVersion} from '../src/typescript_support';
|
||||
|
||||
describe('checkVersion', () => {
|
||||
const MIN_TS_VERSION = '2.7.2';
|
||||
const MAX_TS_VERSION = '2.8.0';
|
||||
|
||||
const versionError = (version: string) =>
|
||||
`The Angular Compiler requires TypeScript >=${MIN_TS_VERSION} and <${MAX_TS_VERSION} but ${version} was found instead.`;
|
||||
|
||||
it('should not throw when a supported TypeScript version is used', () => {
|
||||
expect(() => checkVersion('2.7.2', MIN_TS_VERSION, MAX_TS_VERSION)).not.toThrow();
|
||||
expect(() => checkVersion('2.7.9', MIN_TS_VERSION, MAX_TS_VERSION)).not.toThrow();
|
||||
});
|
||||
|
||||
it('should handle a TypeScript version < the minimum supported one', () => {
|
||||
expect(() => checkVersion('2.4.1', MIN_TS_VERSION, MAX_TS_VERSION))
|
||||
.toThrowError(versionError('2.4.1'));
|
||||
expect(() => checkVersion('2.7.1', MIN_TS_VERSION, MAX_TS_VERSION))
|
||||
.toThrowError(versionError('2.7.1'));
|
||||
});
|
||||
|
||||
it('should handle a TypeScript version > the maximum supported one', () => {
|
||||
expect(() => checkVersion('2.9.0', MIN_TS_VERSION, MAX_TS_VERSION))
|
||||
.toThrowError(versionError('2.9.0'));
|
||||
expect(() => checkVersion('2.8.0', MIN_TS_VERSION, MAX_TS_VERSION))
|
||||
.toThrowError(versionError('2.8.0'));
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user