From 929f637ae53b736524b2bccee2ef280ca578678c Mon Sep 17 00:00:00 2001 From: Masum ULU Date: Mon, 25 Sep 2023 17:02:12 +0300 Subject: [PATCH] Refactor change-theme command --- .../src/commands/change-theme/index.ts | 83 ++++++++----------- 1 file changed, 36 insertions(+), 47 deletions(-) diff --git a/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts b/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts index 30a29ed7dc..43d7750751 100644 --- a/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts +++ b/npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts @@ -4,7 +4,14 @@ import { ProjectDefinition } from '@angular-devkit/core/src/workspace'; import * as ts from 'typescript'; import { allStyles, importMap, styleMap } from './style-map'; import { ChangeThemeOptions } from './model'; -import { Change, InsertChange, isLibrary, updateWorkspace, WorkspaceDefinition } from '../../utils'; +import { + Change, + createDefaultPath, + InsertChange, + isLibrary, + updateWorkspace, + WorkspaceDefinition, +} from '../../utils'; import { ThemeOptionsEnum } from './theme-options.enum'; import { addImportToModule, @@ -59,20 +66,8 @@ function updateProjectStyle( } function updateAppModule(selectedProject: string, targetThemeName: ThemeOptionsEnum): Rule { - return (host: Tree) => { - const angularJSON = host.read('angular.json'); - if (!angularJSON) { - throw new SchematicsException('The angular.json does not found'); - } - - const workspace = JSON.parse(angularJSON.toString()); - const project = workspace.projects[selectedProject]; - - if (!project || !project.sourceRoot) { - throw new SchematicsException('The target project does not found'); - } - - const appModulePath = project.sourceRoot + '/app/app.module.ts'; + return async (host: Tree) => { + const appModulePath = (await createDefaultPath(host, selectedProject)) + '/app.module.ts'; return chain([ removeImportPath(appModulePath, targetThemeName), @@ -85,21 +80,13 @@ function updateAppModule(selectedProject: string, targetThemeName: ThemeOptionsE function removeImportPath(appModulePath: string, selectedTheme: ThemeOptionsEnum): Rule { return (host: Tree) => { const recorder = host.beginUpdate(appModulePath); - const sourceText = host.read(appModulePath)?.toString('utf-8'); - const source = ts.createSourceFile( - appModulePath, - sourceText!, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS, - ); - const impMap = Array.from(importMap.values()) - .filter(f => f !== importMap.get(selectedTheme)) - .reduce((acc, val) => [...acc, ...val], []); + const source = getSource(host, appModulePath); + const impMap = getImportPaths(selectedTheme); const nodes = findNodes(source, ts.isImportDeclaration); + const filteredNodes = nodes.filter(n => impMap.some(f => n.getFullText().match(f.path))); - if (!filteredNodes || filteredNodes.length < 1) { + if (filteredNodes?.length < 1) { return; } @@ -118,17 +105,8 @@ function removeImportFromNgModuleMetadata( ): Rule { return (host: Tree) => { const recorder = host.beginUpdate(appModulePath); - const sourceText = host.read(appModulePath)?.toString('utf-8'); - const source = ts.createSourceFile( - appModulePath, - sourceText!, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS, - ); - const impMap = Array.from(importMap.values()) - .filter(f => f !== importMap.get(selectedTheme)) - .reduce((acc, val) => [...acc, ...val], []); + const source = getSource(host, appModulePath); + const impMap = getImportPaths(selectedTheme); const node = getDecoratorMetadata(source, 'NgModule', '@angular/core')[0] || {}; if (!node) { @@ -136,7 +114,6 @@ function removeImportFromNgModuleMetadata( } const matchingProperties = getMetadataField(node as ts.ObjectLiteralExpression, 'imports'); - const assignment = matchingProperties[0] as ts.PropertyAssignment; const assignmentInit = assignment.initializer as ts.ArrayLiteralExpression; @@ -163,14 +140,7 @@ function removeImportFromNgModuleMetadata( function insertImports(appModulePath: string, selectedTheme: ThemeOptionsEnum): Rule { return (host: Tree) => { const recorder = host.beginUpdate(appModulePath); - const sourceText = host.read(appModulePath)?.toString('utf-8'); - const source = ts.createSourceFile( - appModulePath, - sourceText!, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS, - ); + const source = getSource(host, appModulePath); const selected = importMap.get(selectedTheme); const changes: Change[] = []; @@ -190,6 +160,25 @@ function insertImports(appModulePath: string, selectedTheme: ThemeOptionsEnum): }; } +function getSource(host: Tree, appModulePath: string): ts.SourceFile { + const sourceText = host.read(appModulePath)?.toString('utf-8'); + const source = ts.createSourceFile( + appModulePath, + sourceText!, + ts.ScriptTarget.Latest, + true, + ts.ScriptKind.TS, + ); + + return source; +} + +function getImportPaths(selectedTheme: ThemeOptionsEnum) { + return Array.from(importMap.values()) + .filter(f => f !== importMap.get(selectedTheme)) + .reduce((acc, val) => [...acc, ...val], []); +} + export function getProjectTargetOptions( project: ProjectDefinition, buildTarget: string,