From 2603cd85f973a7e3f75893da16adb54809ed2854 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Wed, 19 Nov 2025 19:51:35 +0100 Subject: [PATCH 01/10] fix issues in cli for Angular --- .../devextreme-cli/src/utility/ng-version.js | 4 +- .../files/src/app/app-navigation.ts | 2 +- .../src/add-layout/index.ts | 44 +++++++++++++++++-- .../src/utility/change.ts | 9 +++- 4 files changed, 50 insertions(+), 9 deletions(-) diff --git a/packages/devextreme-cli/src/utility/ng-version.js b/packages/devextreme-cli/src/utility/ng-version.js index 5ad037250..4327a0129 100644 --- a/packages/devextreme-cli/src/utility/ng-version.js +++ b/packages/devextreme-cli/src/utility/ng-version.js @@ -2,12 +2,12 @@ const semver = require('semver').SemVer; const execSync = require('child_process').execSync; function parseNgCliVersion(stdout) { - return /angular.cli:\s*(\S+)/ig.exec(stdout)[1]; + return stdout.trim(); } const getLocalNgVersion = () => { try { - const version = parseNgCliVersion(execSync('ng v').toString()); + const version = parseNgCliVersion(execSync('ng --version').toString()); return new semver(version); } catch(e) { return ''; diff --git a/packages/devextreme-schematics/src/add-layout/files/src/app/app-navigation.ts b/packages/devextreme-schematics/src/add-layout/files/src/app/app-navigation.ts index 30dda8ae5..9d9b1a1e1 100644 --- a/packages/devextreme-schematics/src/add-layout/files/src/app/app-navigation.ts +++ b/packages/devextreme-schematics/src/add-layout/files/src/app/app-navigation.ts @@ -1 +1 @@ -export const navigation = []; +export const navigation: { path?: string, text: string, icon: string, items?: any[] }[] = []; diff --git a/packages/devextreme-schematics/src/add-layout/index.ts b/packages/devextreme-schematics/src/add-layout/index.ts index 85fca74b3..d6b0dbb17 100644 --- a/packages/devextreme-schematics/src/add-layout/index.ts +++ b/packages/devextreme-schematics/src/add-layout/index.ts @@ -44,7 +44,8 @@ import { import { NodeDependencyType, - addPackageJsonDependency + addPackageJsonDependency, + getPackageJsonDependency, } from '@schematics/angular/utility/dependencies'; import { getSourceFile } from '../utility/source'; @@ -173,6 +174,28 @@ async function updateBudgets(host: Tree, options: any) { return host; } +async function addPolyfills(host: Tree, project: string, polyfills: string[]) { + const projectName = await getProjectName(host, project); + + modifyJSONFile(host, './angular.json', config => { + const buildOptions: Record = config.projects[projectName]['architect']['build']['options']; + + if (!buildOptions.polyfills) { + buildOptions.polyfills = []; + } + + polyfills.forEach((polyfill) => { + if (!buildOptions.polyfills.includes(polyfill)) { + buildOptions.polyfills.push(polyfill); + } + }) + + return config; + }); + + return host; +} + function addViewportToBody(sourcePath: string = '') { return (host: Tree) => { const indexPath = join(sourcePath, 'index.html'); @@ -200,7 +223,7 @@ function modifyFileRule(path: string, callback: (source: SourceFile) => Change[] } function updateAppComponent(host: Tree, sourcePath: string, templateOptions: any = {}) { - const appMComponentPath = sourcePath + (isAngularVersionHigherThan(host, 20) ? 'app.ts' : 'app.component.ts'); + const appMComponentPath = sourcePath + templateOptions.name + '.ts'; const importSetter = (importName: string, path: string, alias: string) => { return (source: SourceFile) => { @@ -250,13 +273,25 @@ function hasRouting(host: Tree, sourcePath: string) { function addPackagesToDependency(globalNgCliVersion: string) { const version = new SemVer(globalNgCliVersion.replace(/\^|\~/g, '')); + return (host: Tree) => { + const zonejs = getPackageJsonDependency(host, 'zone.js'); + addPackageJsonDependency(host, { type: NodeDependencyType.Default, name: '@angular/cdk', - version: `~${version.major}.${version.minor}.0` + version: version.raw.includes('next') || version.raw.includes('-rc') + ? 'next' : `^${version.major}.${version.minor > 1 ? version.minor - 1 : 0}.0` }); + if (!zonejs) { + addPackageJsonDependency(host, { + type: NodeDependencyType.Default, + name: 'zone.js', + version: version.major > 18 ? '~0.15.0' : '~0.14.0' + }); + } + return host; }; } @@ -393,7 +428,8 @@ export default function(options: any): Rule { addBuildThemeScript(), () => addCustomThemeStyles(host, options, sourcePath) as any, addViewportToBody(sourcePath), - addPackagesToDependency(options.globalNgCliVersion) + addPackagesToDependency(options.globalNgCliVersion), + () => addPolyfills(host, options.project, ['zone.js']) ]; if (options.updateBudgets) { diff --git a/packages/devextreme-schematics/src/utility/change.ts b/packages/devextreme-schematics/src/utility/change.ts index 2145d24f6..da2bb04d4 100644 --- a/packages/devextreme-schematics/src/utility/change.ts +++ b/packages/devextreme-schematics/src/utility/change.ts @@ -36,14 +36,19 @@ export function insertItemToArray( const nodeContent = node.getText(); const nodePosition = node.getStart(); - const leftBracketPosition = nodePosition + nodeContent.indexOf('['); + const leftBracketPosition = nodePosition + nodeContent.indexOf('[', nodeContent.indexOf('=') || 0); const rightBracketPosition = nodePosition + nodeContent.lastIndexOf(']'); let itemPosition = leftBracketPosition + 1; let fileRecorder = host.beginUpdate(filePath); item = newLine + item; - const isNodeEmpty = !/\[[\s\S]*\S+[\s\S]*\]/m.test(nodeContent); + const isNodeEmpty =!( + nodeContent.includes('=') + ? /=\s*\[[\s\S]*\S+[\s\S]*\]/m + : /\[[\s\S]*\S+[\s\S]*\]/m + ).test(nodeContent); + if (isNodeEmpty) { const formattedArray = `[${newLine}]`; fileRecorder.remove(leftBracketPosition, rightBracketPosition - leftBracketPosition + 1); From 972b33130559e824a899bbb4b99fc6b0a332756a Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Wed, 19 Nov 2025 19:58:38 +0100 Subject: [PATCH 02/10] fix lint --- packages/devextreme-schematics/src/add-layout/index.ts | 2 +- packages/devextreme-schematics/src/utility/change.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devextreme-schematics/src/add-layout/index.ts b/packages/devextreme-schematics/src/add-layout/index.ts index d6b0dbb17..46fc77344 100644 --- a/packages/devextreme-schematics/src/add-layout/index.ts +++ b/packages/devextreme-schematics/src/add-layout/index.ts @@ -188,7 +188,7 @@ async function addPolyfills(host: Tree, project: string, polyfills: string[]) { if (!buildOptions.polyfills.includes(polyfill)) { buildOptions.polyfills.push(polyfill); } - }) + }); return config; }); diff --git a/packages/devextreme-schematics/src/utility/change.ts b/packages/devextreme-schematics/src/utility/change.ts index da2bb04d4..fe699ace6 100644 --- a/packages/devextreme-schematics/src/utility/change.ts +++ b/packages/devextreme-schematics/src/utility/change.ts @@ -43,7 +43,7 @@ export function insertItemToArray( item = newLine + item; - const isNodeEmpty =!( + const isNodeEmpty = !( nodeContent.includes('=') ? /=\s*\[[\s\S]*\S+[\s\S]*\]/m : /\[[\s\S]*\S+[\s\S]*\]/m From b24e39906e7db16ef133de442409440650924644 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Wed, 19 Nov 2025 20:02:35 +0100 Subject: [PATCH 03/10] fix lint --- packages/devextreme-schematics/src/add-layout/index.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/devextreme-schematics/src/add-layout/index.ts b/packages/devextreme-schematics/src/add-layout/index.ts index 46fc77344..064ec884b 100644 --- a/packages/devextreme-schematics/src/add-layout/index.ts +++ b/packages/devextreme-schematics/src/add-layout/index.ts @@ -222,7 +222,7 @@ function modifyFileRule(path: string, callback: (source: SourceFile) => Change[] }; } -function updateAppComponent(host: Tree, sourcePath: string, templateOptions: any = {}) { +function updateAppComponent(sourcePath: string, templateOptions: any = {}) { const appMComponentPath = sourcePath + templateOptions.name + '.ts'; const importSetter = (importName: string, path: string, alias: string) => { @@ -424,7 +424,7 @@ export default function(options: any): Rule { const rules = [ modifyContentByTemplate(sourcePath, projectFilesSource, null, templateOptions, modifyContent), updateDevextremeConfig(sourcePath), - updateAppComponent(host, appPath, templateOptions), + updateAppComponent(appPath, templateOptions), addBuildThemeScript(), () => addCustomThemeStyles(host, options, sourcePath) as any, addViewportToBody(sourcePath), From 5203a07c26441efc6fcf8c2119c7ee3378d26fa4 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Wed, 19 Nov 2025 20:12:03 +0100 Subject: [PATCH 04/10] fix test --- packages/devextreme-schematics/src/add-view/index_spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme-schematics/src/add-view/index_spec.ts b/packages/devextreme-schematics/src/add-view/index_spec.ts index d9f3a7877..8d9c9a3eb 100644 --- a/packages/devextreme-schematics/src/add-view/index_spec.ts +++ b/packages/devextreme-schematics/src/add-view/index_spec.ts @@ -117,7 +117,7 @@ describe('view', () => { expect(moduleContent).toMatch(/text: 'Test'/); expect(moduleContent).toMatch(/icon: 'folder'/); - expect(moduleContent).toContain(`navigation = [ + expect(moduleContent).toContain(`navigation: { path?: string, text: string, icon: string, items?: any[] }[] = [ { text: 'Test', path: '/pages/test', From cca2f2aab6453df3ca0d553ebb026569c566787b Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Wed, 19 Nov 2025 20:21:13 +0100 Subject: [PATCH 05/10] fix test --- .../devextreme-schematics/src/add-sample-views/index_spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme-schematics/src/add-sample-views/index_spec.ts b/packages/devextreme-schematics/src/add-sample-views/index_spec.ts index cea2ce4eb..048098476 100644 --- a/packages/devextreme-schematics/src/add-sample-views/index_spec.ts +++ b/packages/devextreme-schematics/src/add-sample-views/index_spec.ts @@ -49,7 +49,7 @@ describe('sample views', () => { const navigationContent = tree.readContent('/src/app/app-navigation.ts'); expect(navigationContent).toMatch(/text: 'Home'/); - expect(navigationContent).toContain(`export const navigation = [ + expect(navigationContent).toContain(`export const navigation: { path?: string, text: string, icon: string, items?: any[] }[] = [ { text: 'Home', path: '/home', From 06b62955355a50504ffb77fa3cd616a614844567 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Wed, 19 Nov 2025 20:25:25 +0100 Subject: [PATCH 06/10] fix test --- packages/devextreme-schematics/src/add-layout/index_spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme-schematics/src/add-layout/index_spec.ts b/packages/devextreme-schematics/src/add-layout/index_spec.ts index d22f07c93..94978297e 100644 --- a/packages/devextreme-schematics/src/add-layout/index_spec.ts +++ b/packages/devextreme-schematics/src/add-layout/index_spec.ts @@ -174,7 +174,7 @@ describe('layout', () => { const tree = await runner.runSchematic('add-layout', options, appTree); const packageConfig = JSON.parse(tree.readContent('package.json')); - expect(packageConfig.dependencies['@angular/cdk']).toBe('~17.2.0'); + expect(packageConfig.dependencies['@angular/cdk']).toBe('^17.2.0'); }); it('should update budgets if updateBudgets option is true', async () => { From 28b127d24a44f5f1c7fe295472c3f5256eb93f2b Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Wed, 19 Nov 2025 20:47:52 +0100 Subject: [PATCH 07/10] fix test --- packages/devextreme-schematics/src/add-layout/index_spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme-schematics/src/add-layout/index_spec.ts b/packages/devextreme-schematics/src/add-layout/index_spec.ts index 94978297e..1a013628f 100644 --- a/packages/devextreme-schematics/src/add-layout/index_spec.ts +++ b/packages/devextreme-schematics/src/add-layout/index_spec.ts @@ -174,7 +174,7 @@ describe('layout', () => { const tree = await runner.runSchematic('add-layout', options, appTree); const packageConfig = JSON.parse(tree.readContent('package.json')); - expect(packageConfig.dependencies['@angular/cdk']).toBe('^17.2.0'); + expect(packageConfig.dependencies['@angular/cdk']).toBe('^17.1.0'); }); it('should update budgets if updateBudgets option is true', async () => { From d57582a750eaf2846bcecbbe4e17413d3245a977 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Thu, 20 Nov 2025 21:15:36 +0100 Subject: [PATCH 08/10] fix navigation type --- .../src/add-layout/files/src/app/app-navigation.ts | 4 +++- .../devextreme-schematics/src/add-sample-views/index_spec.ts | 4 +++- packages/devextreme-schematics/src/add-view/index_spec.ts | 4 +++- packages/devextreme-schematics/src/utility/change.ts | 2 +- 4 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/devextreme-schematics/src/add-layout/files/src/app/app-navigation.ts b/packages/devextreme-schematics/src/add-layout/files/src/app/app-navigation.ts index 9d9b1a1e1..af9c63786 100644 --- a/packages/devextreme-schematics/src/add-layout/files/src/app/app-navigation.ts +++ b/packages/devextreme-schematics/src/add-layout/files/src/app/app-navigation.ts @@ -1 +1,3 @@ -export const navigation: { path?: string, text: string, icon: string, items?: any[] }[] = []; +type NavigationItem = { path?: string, text: string, icon?: string, items?: NavigationItem[] }; +export const navigation: NavigationItem[] = []; + diff --git a/packages/devextreme-schematics/src/add-sample-views/index_spec.ts b/packages/devextreme-schematics/src/add-sample-views/index_spec.ts index 048098476..26370c427 100644 --- a/packages/devextreme-schematics/src/add-sample-views/index_spec.ts +++ b/packages/devextreme-schematics/src/add-sample-views/index_spec.ts @@ -49,7 +49,9 @@ describe('sample views', () => { const navigationContent = tree.readContent('/src/app/app-navigation.ts'); expect(navigationContent).toMatch(/text: 'Home'/); - expect(navigationContent).toContain(`export const navigation: { path?: string, text: string, icon: string, items?: any[] }[] = [ + expect(navigationContent).toContain( + `type NavigationItem = { path?: string, text: string, icon?: string, items?: NavigationItem[] }; +export const navigation: NavigationItem[] = [ { text: 'Home', path: '/home', diff --git a/packages/devextreme-schematics/src/add-view/index_spec.ts b/packages/devextreme-schematics/src/add-view/index_spec.ts index 8d9c9a3eb..8d057ae16 100644 --- a/packages/devextreme-schematics/src/add-view/index_spec.ts +++ b/packages/devextreme-schematics/src/add-view/index_spec.ts @@ -117,7 +117,9 @@ describe('view', () => { expect(moduleContent).toMatch(/text: 'Test'/); expect(moduleContent).toMatch(/icon: 'folder'/); - expect(moduleContent).toContain(`navigation: { path?: string, text: string, icon: string, items?: any[] }[] = [ + expect(moduleContent).toContain( + `type NavigationItem = { path?: string, text: string, icon?: string, items?: NavigationItem[] }; +export const navigation: NavigationItem[] = [ { text: 'Test', path: '/pages/test', diff --git a/packages/devextreme-schematics/src/utility/change.ts b/packages/devextreme-schematics/src/utility/change.ts index fe699ace6..09b4303b6 100644 --- a/packages/devextreme-schematics/src/utility/change.ts +++ b/packages/devextreme-schematics/src/utility/change.ts @@ -36,7 +36,7 @@ export function insertItemToArray( const nodeContent = node.getText(); const nodePosition = node.getStart(); - const leftBracketPosition = nodePosition + nodeContent.indexOf('[', nodeContent.indexOf('=') || 0); + const leftBracketPosition = nodePosition + nodeContent.indexOf('[', nodeContent.lastIndexOf('=') || 0); const rightBracketPosition = nodePosition + nodeContent.lastIndexOf(']'); let itemPosition = leftBracketPosition + 1; let fileRecorder = host.beginUpdate(filePath); From a124301b77cb44a8bb9fa606e739f7ddd8857de9 Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Fri, 21 Nov 2025 12:42:34 +0100 Subject: [PATCH 09/10] fix version for @angular/cdk --- packages/devextreme-schematics/src/add-layout/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme-schematics/src/add-layout/index.ts b/packages/devextreme-schematics/src/add-layout/index.ts index 064ec884b..7810eefd4 100644 --- a/packages/devextreme-schematics/src/add-layout/index.ts +++ b/packages/devextreme-schematics/src/add-layout/index.ts @@ -281,7 +281,7 @@ function addPackagesToDependency(globalNgCliVersion: string) { type: NodeDependencyType.Default, name: '@angular/cdk', version: version.raw.includes('next') || version.raw.includes('-rc') - ? 'next' : `^${version.major}.${version.minor > 1 ? version.minor - 1 : 0}.0` + ? 'next' : `^${version.major}.0.0` }); if (!zonejs) { From 7c497ca726dcf2efb66ac30dcc496bbc5cd8a31a Mon Sep 17 00:00:00 2001 From: Aliullov Vlad Date: Fri, 21 Nov 2025 13:01:35 +0100 Subject: [PATCH 10/10] fix version for @angular/cdk + fix test --- packages/devextreme-schematics/src/add-layout/index_spec.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/devextreme-schematics/src/add-layout/index_spec.ts b/packages/devextreme-schematics/src/add-layout/index_spec.ts index 1a013628f..e15c91411 100644 --- a/packages/devextreme-schematics/src/add-layout/index_spec.ts +++ b/packages/devextreme-schematics/src/add-layout/index_spec.ts @@ -174,7 +174,7 @@ describe('layout', () => { const tree = await runner.runSchematic('add-layout', options, appTree); const packageConfig = JSON.parse(tree.readContent('package.json')); - expect(packageConfig.dependencies['@angular/cdk']).toBe('^17.1.0'); + expect(packageConfig.dependencies['@angular/cdk']).toBe('^17.0.0'); }); it('should update budgets if updateBudgets option is true', async () => {