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 af516d2286..70b63bafcf 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 @@ -81,6 +81,7 @@ function updateAppModule(selectedProject: string, targetThemeName: ThemeOptionsE : removeProviderFromNgModuleMetadata(appModulePath, targetThemeName), insertImports(selectedProject, targetThemeName), insertProviders(selectedProject, targetThemeName), + adjustProvideAbpThemeShared(appModulePath, targetThemeName), formatFile(appModulePath), cleanEmptyExpressions(appModulePath, isStandalone), ]); @@ -254,19 +255,21 @@ export function removeProviderFromNgModuleMetadata( export function insertImports(projectName: string, selectedTheme: ThemeOptionsEnum): Rule { return addRootImport(projectName, code => { const selected = importMap.get(selectedTheme); - if (!selected || selected.length === 0) return code.code``; + if (!selected?.length) return code.code``; const expressions: string[] = []; for (const { importName, path, expression } of selected) { - const imported = code.external(importName, path); - expressions.push(expression ?? imported); // default fallback + if (importName && path) { + code.external(importName, path); + } + if (expression) { + expressions.push(expression.trim()); + } } - return code.code`${expressions.join(',\n')}`; }); } - export function insertProviders(projectName: string, selectedTheme: ThemeOptionsEnum): Rule { return addRootProvider(projectName, code => { const selected = importMap.get(selectedTheme); @@ -387,3 +390,68 @@ export function cleanEmptyExpressions(modulePath: string, isStandalone: boolean) return host; }; } + +export function adjustProvideAbpThemeShared( + appModulePath: string, + selectedTheme: ThemeOptionsEnum, +): Rule { + return (host: Tree) => { + const source = createSourceFile(host, appModulePath); + const recorder = host.beginUpdate(appModulePath); + const sourceText = source.getText(); + + const callExpressions = findProvideAbpThemeSharedCalls(source); + + for (const expr of callExpressions) { + const exprStart = expr.getStart(); + const exprEnd = expr.getEnd(); + const originalText = sourceText.substring(exprStart, exprEnd); + + let newText = ''; + + if (selectedTheme === ThemeOptionsEnum.LeptonX) { + if (!originalText.includes('withHttpErrorConfig')) { + newText = originalText.replace( + '(', + `( + withHttpErrorConfig({ + errorScreen: { + component: HttpErrorComponent, + forWhichErrors: [401, 403, 404, 500], + hideCloseIcon: true + } + }),`, + ); + } + } else { + newText = originalText.replace(/withHttpErrorConfig\([^)]*\),?/, ''); + } + + if (newText && newText !== originalText) { + recorder.remove(exprStart, exprEnd - exprStart); + recorder.insertLeft(exprStart, newText); + } + } + + host.commitUpdate(recorder); + return host; + }; +} + +function findProvideAbpThemeSharedCalls(source: ts.SourceFile): ts.CallExpression[] { + const result: ts.CallExpression[] = []; + + const visit = (node: ts.Node) => { + if (ts.isCallExpression(node)) { + const expressionText = node.expression.getText(); + if (expressionText.includes('provideAbpThemeShared')) { + result.push(node); + } + } + ts.forEachChild(node, visit); + }; + + visit(source); + + return result; +} diff --git a/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts b/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts index 7c589f9212..20dd7e2002 100644 --- a/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts +++ b/npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts @@ -270,6 +270,7 @@ importMap.set(ThemeOptionsEnum.Basic, [ { path: '@abp/ng.theme.basic', importName: 'ThemeBasicModule', + expression: 'ThemeBasicModule.forRoot()', provider: 'provideThemeBasicConfig', }, ]); @@ -311,4 +312,8 @@ importMap.set(ThemeOptionsEnum.LeptonX, [ importName: 'SideMenuLayoutModule', expression: 'SideMenuLayoutModule.forRoot()', }, + { + path: '@volosoft/abp.ng.theme.lepton-x', + importName: 'HttpErrorComponent', + }, ]);