
To improve cross platform support, all file access (and path manipulation) is now done through a well known interface (`FileSystem`). For testing a number of `MockFileSystem` implementations are provided. These provide an in-memory file-system which emulates operating systems like OS/X, Unix and Windows. The current file system is always available via the static method, `FileSystem.getFileSystem()`. This is also used by a number of static methods on `AbsoluteFsPath` and `PathSegment`, to avoid having to pass `FileSystem` objects around all the time. The result of this is that one must be careful to ensure that the file-system has been initialized before using any of these static methods. To prevent this happening accidentally the current file system always starts out as an instance of `InvalidFileSystem`, which will throw an error if any of its methods are called. You can set the current file-system by calling `FileSystem.setFileSystem()`. During testing you can call the helper function `initMockFileSystem(os)` which takes a string name of the OS to emulate, and will also monkey-patch aspects of the TypeScript library to ensure that TS is also using the current file-system. Finally there is the `NgtscCompilerHost` to be used for any TypeScript compilation, which uses a given file-system. All tests that interact with the file-system should be tested against each of the mock file-systems. A series of helpers have been provided to support such tests: * `runInEachFileSystem()` - wrap your tests in this helper to run all the wrapped tests in each of the mock file-systems. * `addTestFilesToFileSystem()` - use this to add files and their contents to the mock file system for testing. * `loadTestFilesFromDisk()` - use this to load a mirror image of files on disk into the in-memory mock file-system. * `loadFakeCore()` - use this to load a fake version of `@angular/core` into the mock file-system. All ngcc and ngtsc source and tests now use this virtual file-system setup. PR Close #30921
150 lines
5.1 KiB
TypeScript
150 lines
5.1 KiB
TypeScript
/**
|
|
* @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
|
|
*/
|
|
|
|
/**
|
|
* This is a private API for @ngtools/webpack. This API should be stable for NG 5.
|
|
*
|
|
* It contains copies of the interfaces needed and wrapper functions to ensure that
|
|
* they are not broken accidentally.
|
|
*
|
|
* Once the ngc api is public and stable, this can be removed.
|
|
*/
|
|
|
|
/**
|
|
*********************************************************************
|
|
* Changes to this file need to be approved by the Angular CLI team. *
|
|
*********************************************************************
|
|
*/
|
|
|
|
import {ParseSourceSpan} from '@angular/compiler';
|
|
import * as ts from 'typescript';
|
|
|
|
import {formatDiagnostics as formatDiagnosticsOrig} from './perform_compile';
|
|
import {createCompilerHost as createCompilerOrig} from './transformers/compiler_host';
|
|
import {createProgram as createProgramOrig} from './transformers/program';
|
|
|
|
|
|
// Interfaces from ./transformers/api;
|
|
export interface Diagnostic {
|
|
messageText: string;
|
|
span?: ParseSourceSpan;
|
|
category: ts.DiagnosticCategory;
|
|
code: number;
|
|
source: 'angular';
|
|
}
|
|
|
|
export interface CompilerOptions extends ts.CompilerOptions {
|
|
basePath?: string;
|
|
skipMetadataEmit?: boolean;
|
|
strictMetadataEmit?: boolean;
|
|
skipTemplateCodegen?: boolean;
|
|
flatModuleOutFile?: string;
|
|
flatModuleId?: string;
|
|
generateCodeForLibraries?: boolean;
|
|
annotateForClosureCompiler?: boolean;
|
|
annotationsAs?: 'decorators'|'static fields';
|
|
trace?: boolean;
|
|
disableExpressionLowering?: boolean;
|
|
i18nOutLocale?: string;
|
|
i18nOutFormat?: string;
|
|
i18nOutFile?: string;
|
|
i18nInFormat?: string;
|
|
i18nInLocale?: string;
|
|
i18nInFile?: string;
|
|
i18nInMissingTranslations?: 'error'|'warning'|'ignore';
|
|
preserveWhitespaces?: boolean;
|
|
disableTypeScriptVersionCheck?: boolean;
|
|
}
|
|
|
|
export interface CompilerHost extends ts.CompilerHost {
|
|
moduleNameToFileName?(moduleName: string, containingFile?: string): string|null;
|
|
fileNameToModuleName?(importedFilePath: string, containingFilePath: string): string;
|
|
resourceNameToFileName?(resourceName: string, containingFilePath: string): string|null;
|
|
toSummaryFileName?(fileName: string, referringSrcFileName: string): string;
|
|
fromSummaryFileName?(fileName: string, referringLibFileName: string): string;
|
|
readResource?(fileName: string): Promise<string>|string;
|
|
}
|
|
|
|
export enum EmitFlags {
|
|
DTS = 1 << 0,
|
|
JS = 1 << 1,
|
|
Metadata = 1 << 2,
|
|
I18nBundle = 1 << 3,
|
|
Codegen = 1 << 4,
|
|
|
|
Default = DTS | JS | Codegen,
|
|
All = DTS | JS | Metadata | I18nBundle | Codegen,
|
|
}
|
|
|
|
export interface CustomTransformers {
|
|
beforeTs?: ts.TransformerFactory<ts.SourceFile>[];
|
|
afterTs?: ts.TransformerFactory<ts.SourceFile>[];
|
|
}
|
|
|
|
export interface TsEmitArguments {
|
|
program: ts.Program;
|
|
host: CompilerHost;
|
|
options: CompilerOptions;
|
|
targetSourceFile?: ts.SourceFile;
|
|
writeFile?: ts.WriteFileCallback;
|
|
cancellationToken?: ts.CancellationToken;
|
|
emitOnlyDtsFiles?: boolean;
|
|
customTransformers?: ts.CustomTransformers;
|
|
}
|
|
|
|
export interface TsEmitCallback { (args: TsEmitArguments): ts.EmitResult; }
|
|
|
|
export interface LazyRoute {
|
|
module: {name: string, filePath: string};
|
|
route: string;
|
|
referencedModule: {name: string, filePath: string};
|
|
}
|
|
|
|
export interface Program {
|
|
getTsProgram(): ts.Program;
|
|
getTsOptionDiagnostics(cancellationToken?: ts.CancellationToken): ReadonlyArray<ts.Diagnostic>;
|
|
getNgOptionDiagnostics(cancellationToken?: ts.CancellationToken):
|
|
ReadonlyArray<ts.Diagnostic|Diagnostic>;
|
|
getTsSyntacticDiagnostics(sourceFile?: ts.SourceFile, cancellationToken?: ts.CancellationToken):
|
|
ReadonlyArray<ts.Diagnostic>;
|
|
getNgStructuralDiagnostics(cancellationToken?: ts.CancellationToken): ReadonlyArray<Diagnostic>;
|
|
getTsSemanticDiagnostics(sourceFile?: ts.SourceFile, cancellationToken?: ts.CancellationToken):
|
|
ReadonlyArray<ts.Diagnostic>;
|
|
getNgSemanticDiagnostics(fileName?: string, cancellationToken?: ts.CancellationToken):
|
|
ReadonlyArray<ts.Diagnostic|Diagnostic>;
|
|
loadNgStructureAsync(): Promise<void>;
|
|
listLazyRoutes(entryRoute?: string): LazyRoute[];
|
|
emit({emitFlags, cancellationToken, customTransformers, emitCallback}: {
|
|
emitFlags?: EmitFlags,
|
|
cancellationToken?: ts.CancellationToken,
|
|
customTransformers?: CustomTransformers,
|
|
emitCallback?: TsEmitCallback
|
|
}): ts.EmitResult;
|
|
}
|
|
|
|
// Wrapper for createProgram.
|
|
export function createProgram(
|
|
{rootNames, options, host, oldProgram}:
|
|
{rootNames: string[], options: CompilerOptions, host: CompilerHost, oldProgram?: Program}):
|
|
Program {
|
|
return createProgramOrig({rootNames, options, host, oldProgram: oldProgram as any});
|
|
}
|
|
|
|
// Wrapper for createCompilerHost.
|
|
export function createCompilerHost(
|
|
{options, tsHost = ts.createCompilerHost(options, true)}:
|
|
{options: CompilerOptions, tsHost?: ts.CompilerHost}): CompilerHost {
|
|
return createCompilerOrig({options, tsHost});
|
|
}
|
|
|
|
// Wrapper for formatDiagnostics.
|
|
export type Diagnostics = ReadonlyArray<ts.Diagnostic|Diagnostic>;
|
|
export function formatDiagnostics(diags: Diagnostics): string {
|
|
return formatDiagnosticsOrig(diags);
|
|
}
|