2017-06-09 14:50:57 -07:00
|
|
|
/**
|
|
|
|
* @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 {ParseSourceSpan} from '@angular/compiler';
|
|
|
|
import * as ts from 'typescript';
|
|
|
|
|
2017-08-18 14:03:59 -07:00
|
|
|
export const DEFAULT_ERROR_CODE = 100;
|
|
|
|
export const UNKNOWN_ERROR_CODE = 500;
|
|
|
|
export const SOURCE = 'angular' as 'angular';
|
|
|
|
|
2017-06-09 14:50:57 -07:00
|
|
|
export interface Diagnostic {
|
2017-08-18 14:03:59 -07:00
|
|
|
messageText: string;
|
2017-06-09 14:50:57 -07:00
|
|
|
span?: ParseSourceSpan;
|
2017-08-09 13:45:45 -07:00
|
|
|
category: ts.DiagnosticCategory;
|
2017-08-18 14:03:59 -07:00
|
|
|
code: number;
|
|
|
|
source: 'angular';
|
2017-06-09 14:50:57 -07:00
|
|
|
}
|
|
|
|
|
2017-09-11 15:18:19 -07:00
|
|
|
export function isTsDiagnostic(diagnostic: any): diagnostic is ts.Diagnostic {
|
|
|
|
return diagnostic != null && diagnostic.source !== 'angular';
|
|
|
|
}
|
|
|
|
|
|
|
|
export function isNgDiagnostic(diagnostic: any): diagnostic is Diagnostic {
|
|
|
|
return diagnostic != null && diagnostic.source === 'angular';
|
|
|
|
}
|
|
|
|
|
2017-06-09 14:50:57 -07:00
|
|
|
export interface CompilerOptions extends ts.CompilerOptions {
|
2017-09-19 11:43:34 -07:00
|
|
|
// Write statistics about compilation (e.g. total time, ...)
|
|
|
|
// Note: this is the --diagnostics command line option from TS (which is @internal
|
|
|
|
// on ts.CompilerOptions interface).
|
|
|
|
diagnostics?: boolean;
|
|
|
|
|
2017-06-09 14:50:57 -07:00
|
|
|
// Absolute path to a directory where generated file structure is written.
|
|
|
|
// If unspecified, generated files will be written alongside sources.
|
2017-08-02 11:20:07 -07:00
|
|
|
// @deprecated - no effect
|
2017-06-09 14:50:57 -07:00
|
|
|
genDir?: string;
|
|
|
|
|
|
|
|
// Path to the directory containing the tsconfig.json file.
|
|
|
|
basePath?: string;
|
|
|
|
|
|
|
|
// Don't produce .metadata.json files (they don't work for bundled emit with --out)
|
|
|
|
skipMetadataEmit?: boolean;
|
|
|
|
|
|
|
|
// Produce an error if the metadata written for a class would produce an error if used.
|
|
|
|
strictMetadataEmit?: boolean;
|
|
|
|
|
|
|
|
// Don't produce .ngfactory.ts or .ngstyle.ts files
|
|
|
|
skipTemplateCodegen?: boolean;
|
|
|
|
|
2017-09-26 13:40:47 -07:00
|
|
|
// Always report errors when the type of a parameter supplied whose injection type cannot
|
|
|
|
// be determined. When this value option is not provided or is `false`, constructor
|
|
|
|
// parameters of classes marked with `@Injectable` whose type cannot be resolved will
|
|
|
|
// produce a warning. With this option `true`, they produce an error. When this option is
|
|
|
|
// not provided is treated as if it were `false`. In Angular 6.0, if this option is not
|
|
|
|
// provided, it will be treated as `true`.
|
|
|
|
strictInjectionParameters?: boolean;
|
|
|
|
|
2017-06-09 14:50:57 -07:00
|
|
|
// Whether to generate a flat module index of the given name and the corresponding
|
|
|
|
// flat module metadata. This option is intended to be used when creating flat
|
|
|
|
// modules similar to how `@angular/core` and `@angular/common` are packaged.
|
|
|
|
// When this option is used the `package.json` for the library should refered to the
|
|
|
|
// generated flat module index instead of the library index file. When using this
|
|
|
|
// option only one .metadata.json file is produced that contains all the metadata
|
|
|
|
// necessary for symbols exported from the library index.
|
|
|
|
// In the generated .ngfactory.ts files flat module index is used to import symbols
|
|
|
|
// includes both the public API from the library index as well as shrowded internal
|
|
|
|
// symbols.
|
|
|
|
// By default the .ts file supplied in the `files` files field is assumed to be
|
|
|
|
// library index. If more than one is specified, uses `libraryIndex` to select the
|
|
|
|
// file to use. If more than on .ts file is supplied and no `libraryIndex` is supplied
|
|
|
|
// an error is produced.
|
|
|
|
// A flat module index .d.ts and .js will be created with the given `flatModuleOutFile`
|
|
|
|
// name in the same location as the library index .d.ts file is emitted.
|
|
|
|
// For example, if a library uses `public_api.ts` file as the library index of the
|
|
|
|
// module the `tsconfig.json` `files` field would be `["public_api.ts"]`. The
|
|
|
|
// `flatModuleOutFile` options could then be set to, for example `"index.js"`, which
|
|
|
|
// produces `index.d.ts` and `index.metadata.json` files. The library's
|
|
|
|
// `package.json`'s `module` field would be `"index.js"` and the `typings` field would
|
|
|
|
// be `"index.d.ts"`.
|
|
|
|
flatModuleOutFile?: string;
|
|
|
|
|
|
|
|
// Preferred module id to use for importing flat module. References generated by `ngc`
|
|
|
|
// will use this module name when importing symbols from the flat module. This is only
|
|
|
|
// meaningful when `flatModuleOutFile` is also supplied. It is otherwise ignored.
|
|
|
|
flatModuleId?: string;
|
|
|
|
|
|
|
|
// Whether to generate code for library code.
|
|
|
|
// If true, produce .ngfactory.ts and .ngstyle.ts files for .d.ts inputs.
|
|
|
|
// Default is true.
|
|
|
|
generateCodeForLibraries?: boolean;
|
|
|
|
|
2017-09-11 15:18:19 -07:00
|
|
|
// Whether to enable all type checks for templates.
|
|
|
|
// This will be true be default in Angular 6.
|
|
|
|
fullTemplateTypeCheck?: boolean;
|
|
|
|
|
2017-06-09 14:50:57 -07:00
|
|
|
// Insert JSDoc type annotations needed by Closure Compiler
|
|
|
|
annotateForClosureCompiler?: boolean;
|
|
|
|
|
|
|
|
// Modify how angular annotations are emitted to improve tree-shaking.
|
|
|
|
// Default is static fields.
|
|
|
|
// decorators: Leave the Decorators in-place. This makes compilation faster.
|
|
|
|
// TypeScript will emit calls to the __decorate helper.
|
|
|
|
// `--emitDecoratorMetadata` can be used for runtime reflection.
|
|
|
|
// However, the resulting code will not properly tree-shake.
|
|
|
|
// static fields: Replace decorators with a static field in the class.
|
|
|
|
// Allows advanced tree-shakers like Closure Compiler to remove
|
|
|
|
// unused classes.
|
|
|
|
annotationsAs?: 'decorators'|'static fields';
|
|
|
|
|
|
|
|
// Print extra information while running the compiler
|
|
|
|
trace?: boolean;
|
|
|
|
|
2017-08-17 17:18:33 +02:00
|
|
|
// Whether to enable support for <template> and the template attribute (false by default)
|
2017-06-09 14:50:57 -07:00
|
|
|
enableLegacyTemplate?: boolean;
|
2017-07-13 14:25:17 -07:00
|
|
|
|
|
|
|
// Whether to enable lowering expressions lambdas and expressions in a reference value
|
|
|
|
// position.
|
|
|
|
disableExpressionLowering?: boolean;
|
2017-08-02 11:20:07 -07:00
|
|
|
|
|
|
|
// Locale of the application
|
|
|
|
i18nOutLocale?: string;
|
|
|
|
// Export format (xlf, xlf2 or xmb)
|
|
|
|
i18nOutFormat?: string;
|
|
|
|
// Path to the extracted message file
|
|
|
|
i18nOutFile?: string;
|
|
|
|
|
|
|
|
// Import format if different from `i18nFormat`
|
|
|
|
i18nInFormat?: string;
|
|
|
|
// Locale of the imported translations
|
|
|
|
i18nInLocale?: string;
|
|
|
|
// Path to the translation file
|
|
|
|
i18nInFile?: string;
|
|
|
|
// How to handle missing messages
|
|
|
|
i18nInMissingTranslations?: 'error'|'warning'|'ignore';
|
2017-07-28 15:58:28 +02:00
|
|
|
|
|
|
|
// Whether to remove blank text nodes from compiled templates. It is `true` by default
|
|
|
|
// in Angular 5 and will be re-visited in Angular 6.
|
|
|
|
preserveWhitespaces?: boolean;
|
2017-09-21 18:05:07 -07:00
|
|
|
|
|
|
|
/** generate all possible generated files */
|
|
|
|
allowEmptyCodegenFiles?: boolean;
|
2017-09-29 14:55:44 -07:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Whether to generate .ngsummary.ts files that allow to use AOTed artifacts
|
|
|
|
* in JIT mode. This is off by default.
|
|
|
|
*/
|
|
|
|
enableSummariesForJit?: boolean;
|
2017-06-09 14:50:57 -07:00
|
|
|
}
|
|
|
|
|
2017-08-14 11:04:55 -07:00
|
|
|
export interface CompilerHost extends ts.CompilerHost {
|
2017-06-09 14:50:57 -07:00
|
|
|
/**
|
|
|
|
* Converts a module name that is used in an `import` to a file path.
|
|
|
|
* I.e. `path/to/containingFile.ts` containing `import {...} from 'module-name'`.
|
|
|
|
*/
|
2017-09-12 09:40:28 -07:00
|
|
|
moduleNameToFileName?(moduleName: string, containingFile: string): string|null;
|
2017-06-09 14:50:57 -07:00
|
|
|
/**
|
2017-08-14 11:04:55 -07:00
|
|
|
* Converts a file path to a module name that can be used as an `import ...`
|
2017-06-09 14:50:57 -07:00
|
|
|
* I.e. `path/to/importedFile.ts` should be imported by `path/to/containingFile.ts`.
|
|
|
|
*/
|
2017-09-12 09:40:28 -07:00
|
|
|
fileNameToModuleName?(importedFilePath: string, containingFilePath: string): string;
|
2017-08-15 17:06:09 -07:00
|
|
|
/**
|
|
|
|
* Converts a file path for a resource that is used in a source file or another resource
|
|
|
|
* into a filepath.
|
|
|
|
*/
|
2017-09-12 09:40:28 -07:00
|
|
|
resourceNameToFileName?(resourceName: string, containingFilePath: string): string|null;
|
2017-08-15 14:41:48 -07:00
|
|
|
/**
|
|
|
|
* Converts a file name into a representation that should be stored in a summary file.
|
|
|
|
* This has to include changing the suffix as well.
|
|
|
|
* E.g.
|
|
|
|
* `some_file.ts` -> `some_file.d.ts`
|
|
|
|
*
|
|
|
|
* @param referringSrcFileName the soure file that refers to fileName
|
|
|
|
*/
|
2017-09-12 09:40:28 -07:00
|
|
|
toSummaryFileName?(fileName: string, referringSrcFileName: string): string;
|
2017-08-15 14:41:48 -07:00
|
|
|
/**
|
|
|
|
* Converts a fileName that was processed by `toSummaryFileName` back into a real fileName
|
|
|
|
* given the fileName of the library that is referrig to it.
|
|
|
|
*/
|
2017-09-12 09:40:28 -07:00
|
|
|
fromSummaryFileName?(fileName: string, referringLibFileName: string): string;
|
2017-06-09 14:50:57 -07:00
|
|
|
/**
|
|
|
|
* Load a referenced resource either statically or asynchronously. If the host returns a
|
|
|
|
* `Promise<string>` it is assumed the user of the corresponding `Program` will call
|
|
|
|
* `loadNgStructureAsync()`. Returing `Promise<string>` outside `loadNgStructureAsync()` will
|
|
|
|
* cause a diagnostics diagnostic error or an exception to be thrown.
|
|
|
|
*/
|
|
|
|
readResource?(fileName: string): Promise<string>|string;
|
|
|
|
}
|
|
|
|
|
|
|
|
export enum EmitFlags {
|
|
|
|
DTS = 1 << 0,
|
|
|
|
JS = 1 << 1,
|
|
|
|
Metadata = 1 << 2,
|
|
|
|
I18nBundle = 1 << 3,
|
2017-09-19 11:41:47 -07:00
|
|
|
Codegen = 1 << 4,
|
2017-06-09 14:50:57 -07:00
|
|
|
|
2017-09-19 11:41:47 -07:00
|
|
|
Default = DTS | JS | Codegen,
|
|
|
|
All = DTS | JS | Metadata | I18nBundle | Codegen,
|
2017-06-09 14:50:57 -07:00
|
|
|
}
|
|
|
|
|
2017-08-16 15:35:19 -07:00
|
|
|
export interface CustomTransformers {
|
|
|
|
beforeTs?: ts.TransformerFactory<ts.SourceFile>[];
|
|
|
|
afterTs?: ts.TransformerFactory<ts.SourceFile>[];
|
2017-08-02 11:20:07 -07:00
|
|
|
}
|
|
|
|
|
2017-08-16 15:35:19 -07:00
|
|
|
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; }
|
|
|
|
|
2017-09-21 18:05:07 -07:00
|
|
|
export interface LibrarySummary {
|
|
|
|
fileName: string;
|
|
|
|
text: string;
|
|
|
|
sourceFile?: ts.SourceFile;
|
|
|
|
}
|
|
|
|
|
2017-06-09 14:50:57 -07:00
|
|
|
export interface Program {
|
|
|
|
/**
|
|
|
|
* Retrieve the TypeScript program used to produce semantic diagnostics and emit the sources.
|
|
|
|
*
|
|
|
|
* Angular structural information is required to produce the program.
|
|
|
|
*/
|
|
|
|
getTsProgram(): ts.Program;
|
|
|
|
|
|
|
|
/**
|
2017-08-02 11:20:07 -07:00
|
|
|
* Retrieve options diagnostics for the TypeScript options used to create the program. This is
|
2017-06-09 14:50:57 -07:00
|
|
|
* faster than calling `getTsProgram().getOptionsDiagnostics()` since it does not need to
|
|
|
|
* collect Angular structural information to produce the errors.
|
|
|
|
*/
|
|
|
|
getTsOptionDiagnostics(cancellationToken?: ts.CancellationToken): ts.Diagnostic[];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve options diagnostics for the Angular options used to create the program.
|
|
|
|
*/
|
|
|
|
getNgOptionDiagnostics(cancellationToken?: ts.CancellationToken): Diagnostic[];
|
|
|
|
|
|
|
|
/**
|
2017-08-02 11:20:07 -07:00
|
|
|
* Retrieve the syntax diagnostics from TypeScript. This is faster than calling
|
2017-06-09 14:50:57 -07:00
|
|
|
* `getTsProgram().getSyntacticDiagnostics()` since it does not need to collect Angular structural
|
|
|
|
* information to produce the errors.
|
|
|
|
*/
|
|
|
|
getTsSyntacticDiagnostics(sourceFile?: ts.SourceFile, cancellationToken?: ts.CancellationToken):
|
|
|
|
ts.Diagnostic[];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve the diagnostics for the structure of an Angular application is correctly formed.
|
|
|
|
* This includes validating Angular annotations and the syntax of referenced and imbedded HTML
|
|
|
|
* and CSS.
|
|
|
|
*
|
|
|
|
* Note it is important to displaying TypeScript semantic diagnostics along with Angular
|
|
|
|
* structural diagnostics as an error in the program strucutre might cause errors detected in
|
|
|
|
* semantic analysis and a semantic error might cause errors in specifying the program structure.
|
|
|
|
*
|
|
|
|
* Angular structural information is required to produce these diagnostics.
|
|
|
|
*/
|
|
|
|
getNgStructuralDiagnostics(cancellationToken?: ts.CancellationToken): Diagnostic[];
|
|
|
|
|
|
|
|
/**
|
2017-08-02 11:20:07 -07:00
|
|
|
* Retrieve the semantic diagnostics from TypeScript. This is equivilent to calling
|
2017-06-09 14:50:57 -07:00
|
|
|
* `getTsProgram().getSemanticDiagnostics()` directly and is included for completeness.
|
|
|
|
*/
|
|
|
|
getTsSemanticDiagnostics(sourceFile?: ts.SourceFile, cancellationToken?: ts.CancellationToken):
|
|
|
|
ts.Diagnostic[];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Retrieve the Angular semantic diagnostics.
|
|
|
|
*
|
|
|
|
* Angular structural information is required to produce these diagnostics.
|
|
|
|
*/
|
|
|
|
getNgSemanticDiagnostics(fileName?: string, cancellationToken?: ts.CancellationToken):
|
|
|
|
Diagnostic[];
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Load Angular structural information asynchronously. If this method is not called then the
|
|
|
|
* Angular structural information, including referenced HTML and CSS files, are loaded
|
|
|
|
* synchronously. If the supplied Angular compiler host returns a promise from `loadResource()`
|
|
|
|
* will produce a diagnostic error message or, `getTsProgram()` or `emit` to throw.
|
|
|
|
*/
|
|
|
|
loadNgStructureAsync(): Promise<void>;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Emit the files requested by emitFlags implied by the program.
|
|
|
|
*
|
|
|
|
* Angular structural information is required to emit files.
|
|
|
|
*/
|
2017-09-12 09:40:28 -07:00
|
|
|
emit({emitFlags, cancellationToken, customTransformers, emitCallback}?: {
|
2017-08-16 15:35:19 -07:00
|
|
|
emitFlags?: EmitFlags,
|
2017-06-09 14:50:57 -07:00
|
|
|
cancellationToken?: ts.CancellationToken,
|
2017-08-16 15:35:19 -07:00
|
|
|
customTransformers?: CustomTransformers,
|
|
|
|
emitCallback?: TsEmitCallback
|
|
|
|
}): ts.EmitResult;
|
2017-09-19 11:43:34 -07:00
|
|
|
|
|
|
|
/**
|
2017-09-21 18:05:07 -07:00
|
|
|
* Returns the .d.ts / .ngsummary.json / .ngfactory.d.ts files of libraries that have been emitted
|
|
|
|
* in this program or previous programs with paths that emulate the fact that these libraries
|
|
|
|
* have been compiled before with no outDir.
|
2017-09-19 11:43:34 -07:00
|
|
|
*/
|
2017-09-21 18:05:07 -07:00
|
|
|
getLibrarySummaries(): LibrarySummary[];
|
2017-06-09 14:50:57 -07:00
|
|
|
}
|