@angular/tsc-wrapped is a TypeScript compiler wrapper library that extends TypeScript's tsc program with Angular-specific functionality. It provides a hook system for specific extensions developed by the Angular team, including tsickle for down-leveling Decorators into Annotations for tree-shaking compatibility, optional Closure Compiler-friendly code generation, and a metadata collector that emits .metadata.json files alongside .d.ts files to preserve decorator information lost during TypeScript compilation.
import {
main,
CodegenExtension,
createBundleIndexHost,
UserError,
MetadataWriterHost,
AngularCompilerOptions,
MetadataCollector,
MetadataBundler,
DelegatingHost,
SyntheticIndexHost,
formatDiagnostics,
isVinylFile,
privateEntriesToIndex
} from "@angular/tsc-wrapped";For CommonJS:
const {
main,
CodegenExtension,
createBundleIndexHost,
UserError,
MetadataWriterHost,
AngularCompilerOptions,
MetadataCollector,
MetadataBundler,
DelegatingHost,
SyntheticIndexHost,
formatDiagnostics,
isVinylFile,
privateEntriesToIndex
} = require("@angular/tsc-wrapped");import { main, AngularCompilerOptions } from "@angular/tsc-wrapped";
// Basic compilation with Angular options
const angularOptions: AngularCompilerOptions = {
genDir: "./generated",
basePath: "./src",
skipMetadataEmit: false,
strictMetadataEmit: true
};
// Run compilation
await main("./tsconfig.json", { basePath: "./src" }, undefined, angularOptions);@angular/tsc-wrapped is built around several key components:
main function orchestrates TypeScript compilation with Angular extensionsCore compilation functionality that orchestrates TypeScript compilation with Angular-specific extensions.
function main(
project: string | VinylFile,
cliOptions: CliOptions,
codegen?: CodegenExtension,
options?: ts.CompilerOptions
): Promise<any>;
interface CodegenExtension {
(ngOptions: NgOptions, cliOptions: CliOptions, program: ts.Program, host: ts.CompilerHost): Promise<string[]>;
}
function createBundleIndexHost(
ngOptions: NgOptions,
rootFiles: string[],
host: ts.CompilerHost
): {host: ts.CompilerHost, indexName?: string, errors?: ts.Diagnostic[]};
class UserError extends Error {
constructor(message: string);
}Collects decorator metadata from TypeScript modules and emits .metadata.json files to preserve information lost during TypeScript compilation.
class MetadataCollector {
constructor(options?: CollectorOptions);
getMetadata(sourceFile: ts.SourceFile, strict?: boolean): ModuleMetadata;
}
interface CollectorOptions {
version?: number;
quotedNames?: boolean;
verboseInvalidExpression?: boolean;
}Specialized compiler hosts that extend TypeScript's standard compiler host with Angular-specific functionality.
class MetadataWriterHost extends DelegatingHost {
constructor(delegate: ts.CompilerHost, ngOptions: NgOptions, emitAllFiles?: boolean);
}
abstract class DelegatingHost extends ts.CompilerHost {
constructor(delegate: ts.CompilerHost);
}
class SyntheticIndexHost extends DelegatingHost {
constructor(delegate: ts.CompilerHost, syntheticIndex: {name: string, content: string, metadata: string});
}Bundles metadata from multiple modules and generates index files for library packaging.
class MetadataBundler {
constructor(root: string, importAs?: string, host?: MetadataBundlerHost);
getMetadataBundle(): BundledModule;
}
interface MetadataBundlerHost {
getMetadataFor(moduleName: string): ModuleMetadata;
resolveModule(moduleName: string, containingFile: string): string;
}Angular compiler options and CLI options for configuring compilation behavior.
interface AngularCompilerOptions extends ts.CompilerOptions {
genDir?: string;
basePath?: string;
skipMetadataEmit?: boolean;
strictMetadataEmit?: boolean;
skipTemplateCodegen?: boolean;
flatModuleOutFile?: string;
flatModuleId?: string;
generateCodeForLibraries?: boolean;
annotateForClosureCompiler?: boolean;
annotationsAs?: 'decorators' | 'static fields';
trace?: boolean;
enableLegacyTemplate?: boolean;
enableSummariesForJit?: boolean;
alwaysCompileGeneratedCode?: boolean;
preserveWhitespaces?: boolean;
}Type definitions and validation for metadata structures used throughout the system.
interface ModuleMetadata {
__symbolic: 'module';
version: number;
metadata: {[name: string]: MetadataEntry};
exports?: ModuleExportMetadata[];
importAs?: string;
}
type MetadataEntry =
| ClassMetadata
| InterfaceMetadata
| FunctionMetadata
| MetadataValue;