diff --git a/packages/bazel/src/ngc-wrapped/index.ts b/packages/bazel/src/ngc-wrapped/index.ts index 636d8db08e926..62c9993283456 100644 --- a/packages/bazel/src/ngc-wrapped/index.ts +++ b/packages/bazel/src/ngc-wrapped/index.ts @@ -49,6 +49,65 @@ export function runOneBuild(args: string[], inputs?: {[path: string]: string}): return false; } const {options: tsOptions, bazelOpts, files, config} = parsedOptions; + const angularCompilerOptions: {[k: string]: unknown} = config['angularCompilerOptions'] || {}; + + // Allow Bazel users to control some of the bazel options. + // Since TypeScript's "extends" mechanism applies only to "compilerOptions" + // we have to repeat some of their logic to get the user's "angularCompilerOptions". + if (config['extends']) { + // Load the user's config file + // Note: this doesn't handle recursive extends so only a user's top level + // `angularCompilerOptions` will be considered. As this code is going to be + // removed with Ivy, the added complication of handling recursive extends + // is likely not needed. + let userConfigFile = resolveNormalizedPath(path.dirname(project), config['extends']); + if (!userConfigFile.endsWith('.json')) userConfigFile += '.json'; + const {config: userConfig, error} = ts.readConfigFile(userConfigFile, ts.sys.readFile); + if (error) { + console.error(ng.formatDiagnostics([error])); + return false; + } + + // All user angularCompilerOptions values that a user has control + // over should be collected here + if (userConfig.angularCompilerOptions) { + angularCompilerOptions.diagnostics = + angularCompilerOptions.diagnostics || userConfig.angularCompilerOptions.diagnostics; + angularCompilerOptions.trace = + angularCompilerOptions.trace || userConfig.angularCompilerOptions.trace; + + angularCompilerOptions.disableExpressionLowering = + angularCompilerOptions.disableExpressionLowering || + userConfig.angularCompilerOptions.disableExpressionLowering; + angularCompilerOptions.disableTypeScriptVersionCheck = + angularCompilerOptions.disableTypeScriptVersionCheck || + userConfig.angularCompilerOptions.disableTypeScriptVersionCheck; + + angularCompilerOptions.i18nOutLocale = + angularCompilerOptions.i18nOutLocale || userConfig.angularCompilerOptions.i18nOutLocale; + angularCompilerOptions.i18nOutFormat = + angularCompilerOptions.i18nOutFormat || userConfig.angularCompilerOptions.i18nOutFormat; + angularCompilerOptions.i18nOutFile = + angularCompilerOptions.i18nOutFile || userConfig.angularCompilerOptions.i18nOutFile; + + angularCompilerOptions.i18nInFormat = + angularCompilerOptions.i18nInFormat || userConfig.angularCompilerOptions.i18nInFormat; + angularCompilerOptions.i18nInLocale = + angularCompilerOptions.i18nInLocale || userConfig.angularCompilerOptions.i18nInLocale; + angularCompilerOptions.i18nInFile = + angularCompilerOptions.i18nInFile || userConfig.angularCompilerOptions.i18nInFile; + + angularCompilerOptions.i18nInMissingTranslations = + angularCompilerOptions.i18nInMissingTranslations || + userConfig.angularCompilerOptions.i18nInMissingTranslations; + angularCompilerOptions.i18nUseExternalIds = angularCompilerOptions.i18nUseExternalIds || + userConfig.angularCompilerOptions.i18nUseExternalIds; + + angularCompilerOptions.preserveWhitespaces = angularCompilerOptions.preserveWhitespaces || + userConfig.angularCompilerOptions.preserveWhitespaces; + } + } + const expectedOuts = config['angularCompilerOptions']['expectedOut']; const {basePath} = ng.calcProjectFileAndBasePath(project);