From 26e3850aa1027fbb22278c830abd6db3d602f791 Mon Sep 17 00:00:00 2001 From: Daniel Schreiber Date: Wed, 21 Feb 2024 22:35:18 +0100 Subject: [PATCH] fix: check for buildTarged attribute in ts safe way --- schematics/migrations/2_0_0/index.ts | 3 +-- schematics/ng-add/index.spec.ts | 13 +------------ schematics/ng-add/index.ts | 3 +-- src/buildTargetAttribute.ts | 3 +++ src/builder.ts | 3 +-- 5 files changed, 7 insertions(+), 18 deletions(-) create mode 100644 src/buildTargetAttribute.ts diff --git a/schematics/migrations/2_0_0/index.ts b/schematics/migrations/2_0_0/index.ts index 6cbd5b8..aa41da9 100644 --- a/schematics/migrations/2_0_0/index.ts +++ b/schematics/migrations/2_0_0/index.ts @@ -1,6 +1,6 @@ import {Rule, SchematicContext, SchematicsException, Tree} from '@angular-devkit/schematics'; import {updateWorkspace} from '@schematics/angular/utility/workspace'; -import * as extractI18nSchema from '@angular-devkit/build-angular/src/builders/extract-i18n/schema.json'; +import {buildTargetAttribute} from '../../../src/buildTargetAttribute'; function updateNpmScript(tree: Tree, logger: SchematicContext['logger']) { const pkgPath = '/package.json'; @@ -29,7 +29,6 @@ export default function (): Rule { const i18nMergeTarget = project.targets.get('extract-i18n-merge'); if (i18nMergeTarget) { context.logger.info(`updating extract-i18n(-merge) targets for project ${projectName}..`) - const buildTargetAttribute = extractI18nSchema.properties.buildTarget ? 'buildTarget' : 'browserTarget'; const i18nTarget = {...(project.targets.get('extract-i18n') ?? {builder: 'ng-extract-i18n-merge:ng-extract-i18n-merge'})}; i18nTarget.builder = 'ng-extract-i18n-merge:ng-extract-i18n-merge'; i18nTarget.options = { diff --git a/schematics/ng-add/index.spec.ts b/schematics/ng-add/index.spec.ts index 0a37d08..c2d6758 100644 --- a/schematics/ng-add/index.spec.ts +++ b/schematics/ng-add/index.spec.ts @@ -4,14 +4,10 @@ import * as path from 'path'; import {Schema as WorkspaceOptions} from '@schematics/angular/workspace/schema'; import {Schema as ApplicationOptions, Style} from '@schematics/angular/application/schema'; import {Tree} from '@angular-devkit/schematics'; -import * as extractI18nSchema from '@angular-devkit/build-angular/src/builders/extract-i18n/schema.json'; +import {buildTargetAttribute} from '../../src/buildTargetAttribute'; const collectionPath = path.join(__dirname, '../collection.json'); -async function getBuildTargetAttribute() { - return extractI18nSchema.properties.buildTarget ? 'buildTarget' : 'browserTarget'; -} - const workspaceOptions: WorkspaceOptions = { name: 'workspace', newProjectRoot: 'projects', @@ -51,7 +47,6 @@ describe('ngAdd', () => { }); it('works', async () => { - const buildTargetAttribute = await getBuildTargetAttribute(); const tree = await runSchematic(runner, 'ng-add', {}, appTree); expect(norm(tree.readContent('/angular.json'))).toContain(norm('"extract-i18n": {\n' + ' "builder": "ng-extract-i18n-merge:ng-extract-i18n-merge",\n' + @@ -78,7 +73,6 @@ describe('ngAdd', () => { appTree.overwrite('/angular.json', JSON.stringify(angularJson)); const tree = await runSchematic(runner, 'ng-add', {}, appTree); - const buildTargetAttribute = await getBuildTargetAttribute(); expect(norm(tree.readContent('/angular.json'))).toContain(norm('"extract-i18n": {\n' + ' "builder": "ng-extract-i18n-merge:ng-extract-i18n-merge",\n' + ' "options": {\n' + @@ -111,7 +105,6 @@ describe('ngAdd', () => { appTree.create('/src/some-path/my-messages.xlf', '<>'); const tree = await runSchematic(runner, 'ng-add', {}, appTree); - const buildTargetAttribute = await getBuildTargetAttribute(); expect(norm(tree.readContent('/angular.json'))).toContain(norm('"extract-i18n": {\n' + ' "builder": "ng-extract-i18n-merge:ng-extract-i18n-merge",\n' + ' "options": {\n' + @@ -137,7 +130,6 @@ describe('ngAdd', () => { appTree.overwrite('/angular.json', JSON.stringify(angularJson)); const tree = await runSchematic(runner, 'ng-add', {}, appTree); - const buildTargetAttribute = await getBuildTargetAttribute(); expect(norm(tree.readContent('/angular.json'))).toContain(norm('"extract-i18n": {\n' + ' "builder": "ng-extract-i18n-merge:ng-extract-i18n-merge",\n' + ' "options": {\n' + @@ -159,7 +151,6 @@ describe('ngAdd', () => { appTree.overwrite('/angular.json', JSON.stringify(angularJson)); const tree = await runSchematic(runner, 'ng-add', {}, appTree); - const buildTargetAttribute = await getBuildTargetAttribute(); expect(norm(tree.readContent('/angular.json'))).toContain(norm('"extract-i18n": {\n' + ' "builder": "ng-extract-i18n-merge:ng-extract-i18n-merge",\n' + ' "options": {\n' + @@ -187,7 +178,6 @@ describe('ngAdd', () => { appTree.overwrite('/angular.json', JSON.stringify(angularJson)); const tree = await runSchematic(runner, 'ng-add', {}, appTree); - const buildTargetAttribute = await getBuildTargetAttribute(); expect(norm(tree.readContent('/angular.json'))).toContain(norm('"extract-i18n": {\n' + ' "builder": "ng-extract-i18n-merge:ng-extract-i18n-merge",\n' + ' "options": {\n' + @@ -216,7 +206,6 @@ describe('ngAdd', () => { appTree.overwrite('/angular.json', JSON.stringify(angularJson)); const tree = await runSchematic(runner, 'ng-add', {}, appTree); - const buildTargetAttribute = await getBuildTargetAttribute(); expect(norm(tree.readContent('/angular.json'))).toContain(norm('"extract-i18n": {\n' + ' "builder": "ng-extract-i18n-merge:ng-extract-i18n-merge",\n' + ' "options": {\n' + diff --git a/schematics/ng-add/index.ts b/schematics/ng-add/index.ts index 6bdca6f..ea587a8 100644 --- a/schematics/ng-add/index.ts +++ b/schematics/ng-add/index.ts @@ -4,7 +4,7 @@ import {Schema} from './schema'; import {JsonArray, JsonObject, normalize, Path, relative} from '@angular-devkit/core'; import {Options} from '../../src/options'; -import * as extractI18nSchema from '@angular-devkit/build-angular/src/builders/extract-i18n/schema.json'; +import {buildTargetAttribute} from '../../src/buildTargetAttribute'; function getTargetFiles(i18nExtension: JsonObject | undefined): string[] { const locales = i18nExtension?.locales ? (Object.values(i18nExtension?.locales) as JsonArray | string[] | undefined) : undefined; @@ -94,7 +94,6 @@ export function ngAdd(_options: Schema): Rule { const filesWithoutOutputPath = files?.map(f => relative(`/${outputPath}` as Path, `/${f}` as Path)); const target = projectWorkspace.targets.get('extract-i18n'); - const buildTargetAttribute = extractI18nSchema.properties.buildTarget ? 'buildTarget' : 'browserTarget'; const builderOptions: Partial = { [buildTargetAttribute]: buildTarget, format, diff --git a/src/buildTargetAttribute.ts b/src/buildTargetAttribute.ts new file mode 100644 index 0000000..85e74ab --- /dev/null +++ b/src/buildTargetAttribute.ts @@ -0,0 +1,3 @@ +import * as extractI18nSchema from '@angular-devkit/build-angular/src/builders/extract-i18n/schema.json'; + +export const buildTargetAttribute = (extractI18nSchema.properties as any).buildTarget ? 'buildTarget' : 'browserTarget' diff --git a/src/builder.ts b/src/builder.ts index a859890..bc33a06 100644 --- a/src/builder.ts +++ b/src/builder.ts @@ -8,7 +8,7 @@ import {TranslationFile, TranslationUnit} from './model/translationFileModels'; import {Merger} from './merger'; import {Options} from './options'; import {doCollapseWhitespace} from './stringUtils'; -import * as extractI18nSchema from '@angular-devkit/build-angular/src/builders/extract-i18n/schema.json'; +import {buildTargetAttribute} from './buildTargetAttribute'; const STATE_INITIAL_XLF_2_0 = 'initial'; @@ -109,7 +109,6 @@ async function extractI18nMergeBuilder(options: Options, context: BuilderContext const sourcePath = join(normalize(outputPath), options.sourceFile ?? 'messages.xlf'); const translationSourceFileOriginal = fromXlf(await readFileIfExists(sourcePath)); - const buildTargetAttribute = extractI18nSchema.properties.buildTarget ? 'buildTarget' : 'browserTarget'; const extractI18nRun = await context.scheduleBuilder(options.builderI18n ?? '@angular-devkit/build-angular:extract-i18n', { [buildTargetAttribute]: options.browserTarget ?? options.buildTarget, outputPath: dirname(sourcePath),