Browse Source

Merge pull request #24001 from abpframework/issue-23982

Updating the change theme command with new providers - Issue 23982
pull/24006/head
sumeyye 4 months ago
committed by GitHub
parent
commit
9da9ca2cf4
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 89
      npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts
  2. 68
      npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts

89
npm/ng-packs/packages/schematics/src/commands/change-theme/index.ts

@ -80,11 +80,11 @@ function updateAppModule(selectedProject: string, targetThemeName: ThemeOptionsE
isStandalone
? removeImportsFromStandaloneProviders(appModulePath, targetThemeName)
: removeProviderFromNgModuleMetadata(appModulePath, targetThemeName),
insertHelperImports(appModulePath, targetThemeName),
insertImports(selectedProject, targetThemeName),
insertProviders(selectedProject, targetThemeName),
adjustProvideAbpThemeShared(appModulePath, targetThemeName),
updateIndexHtml(selectedProject, targetThemeName),
formatFile(appModulePath),
cleanEmptyExpressions(appModulePath, isStandalone),
]);
};
@ -318,39 +318,82 @@ export function removeProviderFromNgModuleMetadata(
};
}
export function insertImports(projectName: string, selectedTheme: ThemeOptionsEnum): Rule {
return addRootImport(projectName, code => {
export function insertHelperImports(filePath: string, selectedTheme: ThemeOptionsEnum): Rule {
return (host: Tree) => {
const selectedThemeImports = importMap.get(selectedTheme);
const selected = selectedThemeImports?.filter(s => !s.doNotImport);
if (!selected?.length) return code.code``;
const helpers = selectedThemeImports?.filter(
s => !s.doNotImport && s.importName && s.path && !s.expression && !s.provider
);
if (!helpers || helpers.length === 0) {
return host;
}
const expressions: string[] = [];
const buffer = host.read(filePath);
if (!buffer) return host;
for (const { importName, path, expression } of selected) {
const sourceText = buffer.toString('utf-8');
const source = ts.createSourceFile(filePath, sourceText, ts.ScriptTarget.Latest, true);
const recorder = host.beginUpdate(filePath);
for (const { importName, path } of helpers) {
const existingImport = findNodes(source, ts.isImportDeclaration).find(node => {
const moduleSpecifier = (node.moduleSpecifier as ts.StringLiteral).text;
const namedBindings = node.importClause?.namedBindings;
if (moduleSpecifier === path && namedBindings && ts.isNamedImports(namedBindings)) {
return namedBindings.elements.some(e => e.name.text === importName);
}
return false;
});
if (!existingImport) {
const importStatement = `import { ${importName} } from '${path}';\n`;
recorder.insertLeft(0, importStatement);
}
}
host.commitUpdate(recorder);
return host;
};
}
export function insertImports(projectName: string, selectedTheme: ThemeOptionsEnum): Rule {
const selectedThemeImports = importMap.get(selectedTheme);
const selected = selectedThemeImports?.filter(s => !s.doNotImport && !!s.expression);
if (!selected || selected.length === 0) {
return () => {};
}
return addRootImport(projectName, code => {
const expressions = selected.map(({ importName, path, expression }) => {
if (importName && path) {
code.external(importName, path);
}
if (expression) {
expressions.push(expression.trim());
}
}
return code.code`${expressions}`;
return expression!.trim();
});
return code.code`
${expressions.join(',\n')}`;
});
}
export function insertProviders(projectName: string, selectedTheme: ThemeOptionsEnum): Rule {
return addRootProvider(projectName, code => {
const selectedThemeImports = importMap.get(selectedTheme);
const selected = selectedThemeImports?.filter(s => !s.doNotImport);
if (!selected || selected.length === 0) return code.code``;
const selectedThemeImports = importMap.get(selectedTheme);
const selected = selectedThemeImports?.filter(s => !s.doNotImport && !!s.provider);
if (!selected || selected.length === 0) {
return () => {};
}
const providers = selected
.filter(s => !!s.provider)
.map(({ provider, path, importName }) => {
code.external(importName, path);
return `${provider}`;
});
return addRootProvider(projectName, code => {
const providers = selected.map(({ provider, path, importName }) => {
code.external(importName, path);
return provider;
});
return code.code`${providers}`;
return code.code`
${providers.join(',\n')}`;
});
}

68
npm/ng-packs/packages/schematics/src/commands/change-theme/style-map.ts

@ -272,16 +272,13 @@ importMap.set(ThemeOptionsEnum.Basic, [
path: '@abp/ng.theme.basic',
importName: 'ThemeBasicModule',
expression: 'ThemeBasicModule',
},
{
path: '@abp/ng.theme.basic',
importName: 'provideThemeBasicConfig',
provider: 'provideThemeBasicConfig()',
doNotImport: true,
},
{
path: '@abp/ng.theme.shared',
importName: 'ThemeSharedModule',
expression: 'ThemeSharedModule',
doNotImport: true,
},
{
path: '@abp/ng.theme.shared',
@ -292,18 +289,24 @@ importMap.set(ThemeOptionsEnum.Basic, [
importName: 'provideAbpThemeShared',
provider: 'provideAbpThemeShared()',
},
{
path: '@abp/ng.theme.basic',
importName: 'provideThemeBasicConfig',
provider: 'provideThemeBasicConfig()',
},
]);
importMap.set(ThemeOptionsEnum.Lepton, [
{
path: '@volo/abp.ng.theme.lepton',
importName: 'provideThemeLepton',
provider: 'provideThemeLepton()',
},
{
path: '@abp/ng.theme.shared',
importName: 'ThemeSharedModule',
expression: 'ThemeSharedModule',
doNotImport: true,
},
{
path: '@volo/abp.ng.theme.lepton',
importName: 'provideThemeLepton',
provider: 'provideThemeLepton()',
},
{
path: '@abp/ng.theme.shared',
@ -325,21 +328,31 @@ importMap.set(ThemeOptionsEnum.LeptonXLite, [
path: '@abp/ng.theme.lepton-x',
importName: 'ThemeLeptonXModule',
expression: 'ThemeLeptonXModule.forRoot()',
doNotImport: true,
},
{
path: '@abp/ng.theme.lepton-x/layouts',
importName: 'SideMenuLayoutModule',
expression: 'SideMenuLayoutModule.forRoot()',
doNotImport: true,
},
{
path: '@abp/ng.theme.lepton-x/layouts',
importName: 'TopMenuLayoutModule',
expression: 'TopMenuLayoutModule.forRoot()',
doNotImport: true,
},
{
path: '@abp/ng.theme.lepton-x/account',
importName: 'AccountLayoutModule',
expression: 'AccountLayoutModule.forRoot()',
doNotImport: true,
},
{
path: '@abp/ng.theme.shared',
importName: 'ThemeSharedModule',
expression: 'ThemeSharedModule',
doNotImport: true,
},
{
path: '@abp/ng.theme.shared',
@ -354,6 +367,22 @@ importMap.set(ThemeOptionsEnum.LeptonXLite, [
importName: 'provideAbpThemeShared',
provider: 'provideAbpThemeShared()',
},
{
path: '@abp/ng.theme.lepton-x',
importName: 'provideThemeLeptonX',
provider: 'provideThemeLeptonX()',
},
{
path: '@abp/ng.theme.lepton-x/layouts',
importName: 'provideSideMenuLayout',
provider: 'provideSideMenuLayout()',
},
{
path: '@abp/ng.theme.lepton-x/layouts',
importName: 'provideTopMenuLayout',
provider: 'provideTopMenuLayout()',
doNotImport: true,
},
]);
importMap.set(ThemeOptionsEnum.LeptonX, [
@ -361,11 +390,13 @@ importMap.set(ThemeOptionsEnum.LeptonX, [
path: '@volosoft/abp.ng.theme.lepton-x',
importName: 'ThemeLeptonXModule',
expression: 'ThemeLeptonXModule.forRoot()',
doNotImport: true,
},
{
path: '@volosoft/abp.ng.theme.lepton-x/layouts',
importName: 'SideMenuLayoutModule',
expression: 'SideMenuLayoutModule.forRoot()',
doNotImport: true,
},
{
path: '@volosoft/abp.ng.theme.lepton-x/layouts',
@ -377,6 +408,7 @@ importMap.set(ThemeOptionsEnum.LeptonX, [
path: '@abp/ng.theme.shared',
importName: 'ThemeSharedModule',
expression: 'ThemeSharedModule',
doNotImport: true,
},
{
path: '@volosoft/abp.ng.theme.lepton-x',
@ -390,6 +422,22 @@ importMap.set(ThemeOptionsEnum.LeptonX, [
path: '@abp/ng.theme.shared',
importName: 'withValidationBluePrint',
},
{
path: '@volosoft/abp.ng.theme.lepton-x',
importName: 'provideThemeLeptonX',
provider: 'provideThemeLeptonX()',
},
{
path: '@volosoft/abp.ng.theme.lepton-x/layouts',
importName: 'provideSideMenuLayout',
provider: 'provideSideMenuLayout()',
},
{
path: '@volosoft/abp.ng.theme.lepton-x/layouts',
importName: 'provideTopMenuLayout',
provider: 'provideTopMenuLayout()',
doNotImport: true,
},
{
path: '@abp/ng.theme.shared',
importName: 'provideAbpThemeShared',

Loading…
Cancel
Save