From bd636ad19712224cf50ca7954cab75479794369f Mon Sep 17 00:00:00 2001 From: Alan Agius Date: Fri, 25 Sep 2020 11:56:20 +0200 Subject: [PATCH] feat(@angular-devkit/build-angular): extract i18n messages from libraries Closes #18871 --- .../build_angular/src/extract-i18n/index.ts | 4 +- .../e2e/tests/i18n/extract-ivy-libraries.ts | 72 +++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 tests/legacy-cli/e2e/tests/i18n/extract-ivy-libraries.ts diff --git a/packages/angular_devkit/build_angular/src/extract-i18n/index.ts b/packages/angular_devkit/build_angular/src/extract-i18n/index.ts index 005fc637bd66..3db7b37d312f 100644 --- a/packages/angular_devkit/build_angular/src/extract-i18n/index.ts +++ b/packages/angular_devkit/build_angular/src/extract-i18n/index.ts @@ -141,6 +141,8 @@ export async function execute( }, sourceMap: { scripts: true, + styles: false, + vendor: true, }, buildOptimizer: false, i18nLocale: options.i18nLocale || i18n.sourceLocale, @@ -187,7 +189,7 @@ export async function execute( module: { rules: [ { - test: /\.ts$/, + test: /\.[t|j]s$/, loader: require.resolve('./ivy-extract-loader'), options: { messageHandler: (messages: LocalizeMessage[]) => ivyMessages.push(...messages), diff --git a/tests/legacy-cli/e2e/tests/i18n/extract-ivy-libraries.ts b/tests/legacy-cli/e2e/tests/i18n/extract-ivy-libraries.ts new file mode 100644 index 000000000000..c56665b9903b --- /dev/null +++ b/tests/legacy-cli/e2e/tests/i18n/extract-ivy-libraries.ts @@ -0,0 +1,72 @@ +import { getGlobalVariable } from '../../utils/env'; +import { expectFileToMatch, replaceInFile, writeFile } from '../../utils/fs'; +import { ng, npm } from '../../utils/process'; +import { expectToFail } from '../../utils/utils'; +import { readNgVersion } from '../../utils/version'; + +export default async function() { + // Ivy only test + if (getGlobalVariable('argv')['ve']) { + return; + } + + // Setup a library + await ng('generate', 'library', 'i18n-lib-test'); + await replaceInFile( + 'projects/i18n-lib-test/src/lib/i18n-lib-test.component.ts', + '

', + '

', + ); + + // Build library + await ng('build', 'i18n-lib-test'); + + // Consume library in application + await writeFile( + 'src/app/app.module.ts', + ` + import { BrowserModule } from '@angular/platform-browser'; + import { NgModule } from '@angular/core'; + import { AppComponent } from './app.component'; + import { I18nLibTestModule } from 'i18n-lib-test'; + + @NgModule({ + declarations: [ + AppComponent + ], + imports: [ + BrowserModule, + I18nLibTestModule, + ], + providers: [], + bootstrap: [AppComponent] + }) + export class AppModule { } + `, + ); + + await writeFile( + 'src/app/app.component.html', + ` +

Hello world

+ + `, + ); + + // Install correct version + let localizeVersion = '@angular/localize@' + readNgVersion(); + if (getGlobalVariable('argv')['ng-snapshots']) { + localizeVersion = require('../../ng-snapshot/package.json').dependencies['@angular/localize']; + } + await npm('install', `${localizeVersion}`); + + // Extract messages + await ng('xi18n', '--ivy'); + await expectFileToMatch('messages.xlf', 'src/app/app.component.html'); + await expectFileToMatch('messages.xlf', 'Hello world'); + await expectFileToMatch('messages.xlf', 'i18n-lib-test works!'); + await expectFileToMatch( + 'messages.xlf', + `projects/i18n-lib-test/src/lib/i18n-lib-test.component.ts`, + ); +}