@angular/bazel
Advanced tools
Comparing version 5.0.0-rc.1 to 5.0.0-rc.2
{ | ||
"name": "@angular/bazel", | ||
"version": "5.0.0-rc.1", | ||
"version": "5.0.0-rc.2", | ||
"description": "Angular - bazel build rules", | ||
@@ -8,3 +8,3 @@ "author": "angular", | ||
"peerDependencies": { | ||
"@angular/compiler-cli": "5.0.0-rc.1", | ||
"@angular/compiler-cli": "5.0.0-rc.2", | ||
"typescript": "^2.4.2" | ||
@@ -11,0 +11,0 @@ }, |
@@ -14,4 +14,4 @@ /** | ||
const args = process.argv.slice(2); | ||
console.error('>>> now yet implemented!'); | ||
console.error('>>> not yet implemented!'); | ||
process.exitCode = 1; | ||
} |
@@ -11,3 +11,3 @@ /** | ||
import * as ng from '@angular/compiler-cli'; | ||
import {BazelOptions, CachedFileLoader, CompilerHost, FileCache, FileLoader, UncachedFileLoader, constructManifest, debug, fixUmdModuleDeclarations, parseTsconfig, runAsWorker, runWorkerLoop} from '@bazel/typescript'; | ||
import {BazelOptions, CachedFileLoader, CompilerHost, FileCache, FileLoader, UncachedFileLoader, constructManifest, debug, parseTsconfig, runAsWorker, runWorkerLoop} from '@bazel/typescript'; | ||
import * as fs from 'fs'; | ||
@@ -18,2 +18,4 @@ import * as path from 'path'; | ||
import {emitWithCache, getCachedGeneratedFile} from './emit_cache'; | ||
const EXT = /(\.ts|\.d\.ts|\.js|\.jsx|\.tsx)$/; | ||
@@ -25,5 +27,9 @@ const NGC_GEN_FILES = /^(.*?)\.(ngfactory|ngsummary|ngstyle|shim\.ngstyle)(.*)$/; | ||
const BAZEL_BIN = /\b(blaze|bazel)-out\b.*?\bbin\b/; | ||
// TODO(alexeagle): probably not needed, see | ||
// https://github.com/bazelbuild/rules_typescript/issues/28 | ||
const ALLOW_NON_HERMETIC_READS = true; | ||
// Note: We compile the content of node_modules with plain ngc command line. | ||
const ALL_DEPS_COMPILED_WITH_BAZEL = false; | ||
@@ -54,2 +60,3 @@ export function main(args) { | ||
allowNonHermeticReads: ALLOW_NON_HERMETIC_READS, | ||
allDepsCompiledWithBazel: ALL_DEPS_COMPILED_WITH_BAZEL, | ||
compilerOpts, | ||
@@ -75,5 +82,7 @@ tsHost, | ||
export function compile({allowNonHermeticReads, compilerOpts, tsHost, bazelOpts, files, inputs, | ||
expectedOuts, gatherDiagnostics}: { | ||
export function compile({allowNonHermeticReads, allDepsCompiledWithBazel = true, compilerOpts, | ||
tsHost, bazelOpts, files, inputs, expectedOuts, | ||
gatherDiagnostics = defaultGatherDiagnostics}: { | ||
allowNonHermeticReads: boolean, | ||
allDepsCompiledWithBazel?: boolean, | ||
compilerOpts: ng.CompilerOptions, | ||
@@ -83,11 +92,20 @@ tsHost: ts.CompilerHost, inputs?: {[path: string]: string}, | ||
files: string[], | ||
expectedOuts: string[], gatherDiagnostics?: (program: ng.Program) => ng.Diagnostics | ||
expectedOuts: string[], | ||
gatherDiagnostics?: (program: ng.Program, inputsToCheck: ts.SourceFile[], | ||
genFilesToCheck: ng.GeneratedFile[]) => ng.Diagnostics | ||
}): {diagnostics: ng.Diagnostics, program: ng.Program} { | ||
let fileLoader: FileLoader; | ||
const oldFiles = new Map<string, ts.SourceFile>(); | ||
if (inputs) { | ||
fileLoader = new CachedFileLoader(fileCache, ALLOW_NON_HERMETIC_READS); | ||
fileLoader = new CachedFileLoader(fileCache, allowNonHermeticReads); | ||
// Resolve the inputs to absolute paths to match TypeScript internals | ||
const resolvedInputs: {[path: string]: string} = {}; | ||
for (const key of Object.keys(inputs)) { | ||
resolvedInputs[path.resolve(key)] = inputs[key]; | ||
const resolvedKey = path.resolve(key); | ||
resolvedInputs[resolvedKey] = inputs[key]; | ||
const cachedSf = fileCache.getCache(resolvedKey); | ||
if (cachedSf) { | ||
oldFiles.set(resolvedKey, cachedSf); | ||
} | ||
} | ||
@@ -107,2 +125,6 @@ fileCache.updateCache(resolvedInputs); | ||
} | ||
const bazelBin = compilerOpts.rootDirs.find(rootDir => BAZEL_BIN.test(rootDir)); | ||
if (!bazelBin) { | ||
throw new Error(`Couldn't find bazel bin in the rootDirs: ${compilerOpts.rootDirs}`); | ||
} | ||
@@ -151,6 +173,4 @@ const writtenExpectedOuts = [...expectedOuts]; | ||
// TODO(alexeagle): does this also work in third_party? | ||
const allowNonHermeticRead = false; | ||
const bazelHost = new CompilerHost( | ||
files, compilerOpts, bazelOpts, tsHost, fileLoader, ALLOW_NON_HERMETIC_READS, | ||
files, compilerOpts, bazelOpts, tsHost, fileLoader, allowNonHermeticReads, | ||
generatedFileModuleResolver); | ||
@@ -171,33 +191,61 @@ const origBazelHostFileExist = bazelHost.fileExists; | ||
ngHost.fileNameToModuleName(fileName, referringSrcFileName); | ||
if (allDepsCompiledWithBazel) { | ||
// Note: The default implementation would work as well, | ||
// but we can be faster as we know how `toSummaryFileName` works. | ||
// Note: We can't do this if some deps have been compiled with the command line, | ||
// as that has a different implementation of fromSummaryFileName / toSummaryFileName | ||
ngHost.fromSummaryFileName = (fileName: string, referringLibFileName: string) => | ||
path.resolve(bazelBin, fileName) + '.d.ts'; | ||
} | ||
const emitCallback: ng.TsEmitCallback = ({ | ||
program, | ||
targetSourceFile, | ||
writeFile, | ||
cancellationToken, | ||
emitOnlyDtsFiles, | ||
customTransformers = {}, | ||
}) => | ||
tsickle.emitWithTsickle( | ||
program, bazelHost, bazelHost, compilerOpts, targetSourceFile, writeFile, | ||
cancellationToken, emitOnlyDtsFiles, { | ||
beforeTs: customTransformers.before, | ||
afterTs: [ | ||
...(customTransformers.after || []), | ||
fixUmdModuleDeclarations((sf: ts.SourceFile) => bazelHost.amdModuleName(sf)), | ||
], | ||
}); | ||
const oldProgram = { | ||
getSourceFile: (fileName: string) => { return oldFiles.get(fileName); }, | ||
getGeneratedFile: (srcFileName: string, genFileName: string) => { | ||
const sf = oldFiles.get(srcFileName); | ||
return sf ? getCachedGeneratedFile(sf, genFileName) : undefined; | ||
}, | ||
}; | ||
const program = | ||
ng.createProgram({rootNames: files, host: ngHost, options: compilerOpts, oldProgram}); | ||
let inputsChanged = files.some(fileName => program.hasChanged(fileName)); | ||
const {diagnostics, emitResult, program} = ng.performCompilation( | ||
{rootNames: files, options: compilerOpts, host: ngHost, emitCallback, gatherDiagnostics}); | ||
const tsickleEmitResult = emitResult as tsickle.EmitResult; | ||
let genFilesToCheck: ng.GeneratedFile[]; | ||
let inputsToCheck: ts.SourceFile[]; | ||
if (inputsChanged) { | ||
// if an input file changed, we need to type check all | ||
// of our compilation sources as well as all generated files. | ||
inputsToCheck = bazelOpts.compilationTargetSrc.map( | ||
fileName => program.getTsProgram().getSourceFile(fileName)); | ||
genFilesToCheck = program.getGeneratedFiles().filter(gf => gf.genFileName.endsWith('.ts')); | ||
} else { | ||
// if no input file changed, only type check the changed generated files | ||
// as these don't influence each other nor the type check of the input files. | ||
inputsToCheck = []; | ||
genFilesToCheck = program.getGeneratedFiles().filter( | ||
gf => program.hasChanged(gf.genFileName) && gf.genFileName.endsWith('.ts')); | ||
} | ||
debug( | ||
`TypeChecking ${inputsToCheck ? inputsToCheck.length : 'all'} inputs and ${genFilesToCheck ? genFilesToCheck.length : 'all'} generated files`); | ||
const diagnostics = [...gatherDiagnostics(program !, inputsToCheck, genFilesToCheck)]; | ||
let emitResult: tsickle.EmitResult|undefined; | ||
if (!diagnostics.length) { | ||
const targetFileNames = [...bazelOpts.compilationTargetSrc]; | ||
for (const genFile of program.getGeneratedFiles()) { | ||
if (genFile.genFileName.endsWith('.ts')) { | ||
targetFileNames.push(genFile.genFileName); | ||
} | ||
} | ||
emitResult = emitWithCache(program, inputsChanged, targetFileNames, compilerOpts, bazelHost); | ||
diagnostics.push(...emitResult.diagnostics); | ||
} | ||
let externs = '/** @externs */\n'; | ||
if (diagnostics.length) { | ||
console.error(ng.formatDiagnostics(compilerOpts, diagnostics)); | ||
} else { | ||
} else if (emitResult) { | ||
if (bazelOpts.tsickleGenerateExterns) { | ||
externs += tsickle.getGeneratedExterns(tsickleEmitResult.externs); | ||
externs += tsickle.getGeneratedExterns(emitResult.externs); | ||
} | ||
if (bazelOpts.manifest) { | ||
const manifest = constructManifest(tsickleEmitResult.modulesManifest, bazelHost); | ||
const manifest = constructManifest(emitResult.modulesManifest, bazelHost); | ||
fs.writeFileSync(bazelOpts.manifest, manifest); | ||
@@ -221,4 +269,31 @@ } | ||
function defaultGatherDiagnostics( | ||
ngProgram: ng.Program, inputsToCheck: ts.SourceFile[], | ||
genFilesToCheck: ng.GeneratedFile[]): (ng.Diagnostic | ts.Diagnostic)[] { | ||
const tsProgram = ngProgram.getTsProgram(); | ||
const diagnostics: (ng.Diagnostic | ts.Diagnostic)[] = []; | ||
// These checks mirror ts.getPreEmitDiagnostics, with the important | ||
// exception of avoiding b/30708240, which is that if you call | ||
// program.getDeclarationDiagnostics() it somehow corrupts the emit. | ||
diagnostics.push(...tsProgram.getOptionsDiagnostics()); | ||
diagnostics.push(...tsProgram.getGlobalDiagnostics()); | ||
for (const sf of inputsToCheck) { | ||
// Note: We only get the diagnostics for individual files | ||
// to e.g. not check libraries. | ||
diagnostics.push(...tsProgram.getSyntacticDiagnostics(sf)); | ||
diagnostics.push(...tsProgram.getSemanticDiagnostics(sf)); | ||
} | ||
if (!diagnostics.length) { | ||
// only gather the angular diagnostics if we have no diagnostics | ||
// in any other files. | ||
diagnostics.push(...ngProgram.getNgStructuralDiagnostics()); | ||
for (const genFile of genFilesToCheck) { | ||
diagnostics.push(...ngProgram.getNgSemanticDiagnostics(genFile)); | ||
} | ||
} | ||
return diagnostics; | ||
} | ||
if (require.main === module) { | ||
process.exitCode = main(process.argv.slice(2)); | ||
} |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
28699
13
391