From 18353bd33046504b6758876e2bda7e8bbec81f36 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Mon, 22 Dec 2025 15:53:15 +0200 Subject: [PATCH 01/15] chore(devextreme): create the localization gulp task alternative based on nx --- packages/nx-infra-plugin/package.json | 6 +- pnpm-lock.yaml | 663 +++++++++++++------------- 2 files changed, 344 insertions(+), 325 deletions(-) diff --git a/packages/nx-infra-plugin/package.json b/packages/nx-infra-plugin/package.json index 7f658ce0f993..ec5c04c11b06 100644 --- a/packages/nx-infra-plugin/package.json +++ b/packages/nx-infra-plugin/package.json @@ -12,10 +12,10 @@ "./package.json": "./package.json" }, "dependencies": { - "fs-extra": "^11.2.0", + "fs-extra": "11.2.0", "glob": "11.1.0", "normalize-path": "3.0.0", - "lodash": "^4.17.21", + "lodash": "4.17.21", "rimraf": "3.0.2" }, "peerDependencies": { @@ -35,7 +35,7 @@ "@types/jest": "29.5.14", "@types/normalize-path": "3.0.2", "@types/node": "18.19.130", - "@types/lodash": "^4.17.0", + "@types/lodash": "4.17.0", "prettier": "catalog:tools", "ts-jest": "29.1.3", "typescript": "4.9.5" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index bc67b58044c3..733a77249ca7 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2238,7 +2238,7 @@ importers: packages/nx-infra-plugin: dependencies: fs-extra: - specifier: ^11.2.0 + specifier: 11.2.0 version: 11.2.0 glob: specifier: 11.1.0 @@ -2247,8 +2247,8 @@ importers: specifier: '>=6.0.0' version: 6.4.4 lodash: - specifier: ^4.17.21 - version: 4.17.23 + specifier: 4.17.21 + version: 4.17.21 ng-packagr: specifier: '>=19.0.0' version: 19.2.2(@angular/compiler-cli@21.0.8(@angular/compiler@21.0.8)(typescript@4.9.5))(tslib@2.8.1)(typescript@4.9.5) @@ -2266,8 +2266,8 @@ importers: specifier: 29.5.14 version: 29.5.14 '@types/lodash': - specifier: ^4.17.0 - version: 4.17.13 + specifier: 4.17.0 + version: 4.17.0 '@types/node': specifier: 18.19.130 version: 18.19.130 @@ -2839,10 +2839,6 @@ packages: resolution: {integrity: sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==} engines: {node: '>=6.9.0'} - '@babel/generator@7.28.5': - resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} - engines: {node: '>=6.9.0'} - '@babel/generator@7.28.6': resolution: {integrity: sha512-lOoVRwADj8hjf7al89tvQ2a1lf53Z+7tiXMgpZJL3maQPDxh0DgLMN62B2MKUOFcoodBHLMbDM6WAbKgNy5Suw==} engines: {node: '>=6.9.0'} @@ -6945,8 +6941,8 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - '@types/lodash@4.17.13': - resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} + '@types/lodash@4.17.0': + resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} @@ -13581,6 +13577,9 @@ packages: lodash.uniq@4.5.0: resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + lodash@4.17.23: resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} @@ -19917,15 +19916,15 @@ snapshots: '@babel/core@7.26.10': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.10) - '@babel/helpers': 7.28.4 + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.10) + '@babel/helpers': 7.28.6 '@babel/parser': 7.28.6 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -19937,15 +19936,15 @@ snapshots: '@babel/core@7.26.9': dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-module-transforms': 7.28.3(@babel/core@7.26.9) - '@babel/helpers': 7.28.4 + '@babel/code-frame': 7.28.6 + '@babel/generator': 7.28.6 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-module-transforms': 7.28.6(@babel/core@7.26.9) + '@babel/helpers': 7.28.6 '@babel/parser': 7.28.6 - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 convert-source-map: 2.0.0 debug: 4.4.3 gensync: 1.0.0-beta.2 @@ -19957,7 +19956,7 @@ snapshots: '@babel/core@7.28.4': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 + '@babel/generator': 7.28.6 '@babel/helper-compilation-targets': 7.27.2 '@babel/helper-module-transforms': 7.28.3(@babel/core@7.28.4) '@babel/helpers': 7.28.4 @@ -20005,7 +20004,7 @@ snapshots: '@babel/generator@7.26.10': dependencies: '@babel/parser': 7.28.6 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 @@ -20018,14 +20017,6 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.28.5': - dependencies: - '@babel/parser': 7.28.6 - '@babel/types': 7.28.5 - '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.31 - jsesc: 3.1.0 - '@babel/generator@7.28.6': dependencies: '@babel/parser': 7.28.6 @@ -20036,7 +20027,7 @@ snapshots: '@babel/helper-annotate-as-pure@7.25.9': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@babel/helper-annotate-as-pure@7.27.3': dependencies: @@ -20044,9 +20035,9 @@ snapshots: '@babel/helper-compilation-targets@7.27.2': dependencies: - '@babel/compat-data': 7.28.5 + '@babel/compat-data': 7.28.6 '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.0 + browserslist: 4.28.1 lru-cache: 5.1.1 semver: 6.3.1 @@ -20071,41 +20062,41 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.26.10)': + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/traverse': 7.28.5 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.4)': + '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.6) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 '@babel/traverse': 7.28.5 semver: 6.3.1 transitivePeerDependencies: - supports-color - '@babel/helper-create-class-features-plugin@7.28.5(@babel/core@7.28.6)': + '@babel/helper-create-class-features-plugin@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.6) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.26.10) '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -20144,6 +20135,13 @@ snapshots: regexpu-core: 6.2.0 semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-annotate-as-pure': 7.27.3 + regexpu-core: 6.4.0 + semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.28.5(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -20154,8 +20152,8 @@ snapshots: '@babel/helper-define-polyfill-provider@0.4.4(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.11 @@ -20165,8 +20163,8 @@ snapshots: '@babel/helper-define-polyfill-provider@0.5.0(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 debug: 4.4.3 lodash.debounce: 4.0.8 resolve: 1.22.11 @@ -20210,15 +20208,15 @@ snapshots: '@babel/helper-member-expression-to-functions@7.25.9': dependencies: - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helper-member-expression-to-functions@7.28.5': dependencies: '@babel/traverse': 7.28.6 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color @@ -20252,15 +20250,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.26.9)': - dependencies: - '@babel/core': 7.26.9 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-validator-identifier': 7.28.5 - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 @@ -20288,6 +20277,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.26.9)': + dependencies: + '@babel/core': 7.26.9 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-validator-identifier': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-module-transforms@7.28.6(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 @@ -20308,11 +20306,11 @@ snapshots: '@babel/helper-optimise-call-expression@7.25.9': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@babel/helper-optimise-call-expression@7.27.1': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@babel/helper-plugin-utils@7.27.1': {} @@ -20372,6 +20370,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-member-expression-to-functions': 7.28.5 + '@babel/helper-optimise-call-expression': 7.27.1 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + '@babel/helper-replace-supers@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -20390,7 +20397,7 @@ snapshots: '@babel/helper-split-export-declaration@7.24.7': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@babel/helper-string-parser@7.27.1': {} @@ -20400,16 +20407,16 @@ snapshots: '@babel/helper-wrap-function@7.28.3': dependencies: - '@babel/template': 7.27.2 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 transitivePeerDependencies: - supports-color '@babel/helpers@7.28.4': dependencies: - '@babel/template': 7.27.2 - '@babel/types': 7.28.5 + '@babel/template': 7.28.6 + '@babel/types': 7.28.6 '@babel/helpers@7.28.6': dependencies: @@ -20520,19 +20527,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.26.10)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3(@babel/core@7.28.4)': + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/traverse': 7.28.5 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -20600,15 +20607,15 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.28.6)': dependencies: @@ -20618,12 +20625,7 @@ snapshots: '@babel/plugin-syntax-import-attributes@7.26.0(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.4)': dependencies: @@ -20635,6 +20637,11 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -20741,36 +20748,45 @@ snapshots: '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color '@babel/plugin-transform-async-generator-functions@7.26.8(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.26.10)': + '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-generator-functions@7.28.0(@babel/core@7.28.4)': + '@babel/plugin-transform-async-generator-functions@7.28.6(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -20786,8 +20802,8 @@ snapshots: '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) transitivePeerDependencies: - supports-color @@ -20795,26 +20811,35 @@ snapshots: '@babel/plugin-transform-async-to-generator@7.25.9(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.28.4 '@babel/helper-module-imports': 7.27.1 '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-async-to-generator@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-async-to-generator@7.28.6(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color @@ -20843,15 +20868,15 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-block-scoping@7.28.5(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.28.6)': dependencies: @@ -20866,19 +20891,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -20898,19 +20923,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.26.10)': + '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-static-block@7.28.3(@babel/core@7.28.4)': + '@babel/plugin-transform-class-static-block@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -20922,27 +20947,27 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.26.10)': + '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) - '@babel/traverse': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.28.4)': + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-compilation-targets': 7.27.2 + '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) - '@babel/traverse': 7.28.5 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.26.10) + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -20958,17 +20983,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/template': 7.27.2 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 + + '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/template': 7.28.6 '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21000,17 +21025,17 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-dotall-regex@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-dotall-regex@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21033,17 +21058,17 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21069,7 +21094,7 @@ snapshots: '@babel/plugin-transform-explicit-resource-management@7.28.0(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.4) transitivePeerDependencies: - supports-color @@ -21087,15 +21112,15 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-exponentiation-operator@7.28.5(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21174,15 +21199,15 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-json-strings@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21204,15 +21229,15 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-logical-assignment-operators@7.28.5(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21377,30 +21402,30 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21414,25 +21439,25 @@ snapshots: '@babel/helper-plugin-utils': 7.27.1 '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.6) - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.10) - '@babel/traverse': 7.28.5 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-object-rest-spread@7.28.4(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.28.4) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.28.4) - '@babel/traverse': 7.28.5 + '@babel/traverse': 7.28.6 + transitivePeerDependencies: + - supports-color + + '@babel/plugin-transform-object-rest-spread@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.10) + '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -21471,33 +21496,25 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color @@ -21549,19 +21566,19 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.4 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -21573,21 +21590,21 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-property-in-object@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-private-property-in-object@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.27.3 - '@babel/helper-create-class-features-plugin': 7.28.5(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.28.6 transitivePeerDependencies: - supports-color @@ -21654,32 +21671,32 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.28.6)': + '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.6 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.28.6)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-regexp-modifiers@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-regexp-modifiers@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21717,8 +21734,8 @@ snapshots: '@babel/plugin-transform-runtime@7.26.10(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-module-imports': 7.27.1 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-module-imports': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.26.10) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) babel-plugin-polyfill-regenerator: 0.6.5(@babel/core@7.26.10) @@ -21765,18 +21782,18 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.28.4 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color - '@babel/plugin-transform-spread@7.27.1(@babel/core@7.28.4)': + '@babel/plugin-transform-spread@7.28.6(@babel/core@7.26.10)': dependencies: - '@babel/core': 7.28.4 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/core': 7.26.10 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 transitivePeerDependencies: - supports-color @@ -21860,17 +21877,17 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-property-regex@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-property-regex@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21896,17 +21913,17 @@ snapshots: '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.10) - '@babel/helper-plugin-utils': 7.27.1 - '@babel/plugin-transform-unicode-sets-regex@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-plugin-utils': 7.28.6 + + '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.26.10)': + dependencies: + '@babel/core': 7.26.10 + '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.26.10) + '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-sets-regex@7.28.6(@babel/core@7.28.6)': dependencies: @@ -21916,41 +21933,41 @@ snapshots: '@babel/preset-env@7.26.9(@babel/core@7.26.10)': dependencies: - '@babel/compat-data': 7.28.5 + '@babel/compat-data': 7.28.6 '@babel/core': 7.26.10 - '@babel/helper-compilation-targets': 7.27.2 - '@babel/helper-plugin-utils': 7.27.1 + '@babel/helper-compilation-targets': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 '@babel/helper-validator-option': 7.27.1 '@babel/plugin-bugfix-firefox-class-in-computed-class-key': 7.28.5(@babel/core@7.26.10) '@babel/plugin-bugfix-safari-class-field-initializer-scope': 7.27.1(@babel/core@7.26.10) '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression': 7.27.1(@babel/core@7.26.10) '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.3(@babel/core@7.26.10) + '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly': 7.28.6(@babel/core@7.26.10) '@babel/plugin-proposal-private-property-in-object': 7.21.0-placeholder-for-preset-env.2(@babel/core@7.26.10) - '@babel/plugin-syntax-import-assertions': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-syntax-import-assertions': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.26.10) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.26.10) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.26.10) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-class-static-block': 7.28.3(@babel/core@7.26.10) - '@babel/plugin-transform-classes': 7.28.4(@babel/core@7.26.10) - '@babel/plugin-transform-computed-properties': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-block-scoping': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-class-properties': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-class-static-block': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-classes': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-computed-properties': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.26.10) - '@babel/plugin-transform-dotall-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-dotall-regex': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-duplicate-keys': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-duplicate-named-capturing-groups-regex': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-dynamic-import': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-exponentiation-operator': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-exponentiation-operator': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-export-namespace-from': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-function-name': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-json-strings': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-json-strings': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-literals': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-logical-assignment-operators': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-logical-assignment-operators': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-member-expression-literals': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-modules-amd': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-modules-commonjs': 7.28.6(@babel/core@7.26.10) @@ -21958,28 +21975,28 @@ snapshots: '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-named-capturing-groups-regex': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-nullish-coalescing-operator': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-numeric-separator': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-object-rest-spread': 7.28.4(@babel/core@7.26.10) + '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-optional-catch-binding': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-optional-chaining': 7.28.5(@babel/core@7.26.10) + '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.26.10) - '@babel/plugin-transform-private-methods': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-private-property-in-object': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-property-literals': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-regenerator': 7.28.4(@babel/core@7.26.10) - '@babel/plugin-transform-regexp-modifiers': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-regenerator': 7.28.6(@babel/core@7.26.10) + '@babel/plugin-transform-regexp-modifiers': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-reserved-words': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-shorthand-properties': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-spread': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-spread': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-sticky-regex': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-template-literals': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-typeof-symbol': 7.27.1(@babel/core@7.26.10) '@babel/plugin-transform-unicode-escapes': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-property-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-property-regex': 7.28.6(@babel/core@7.26.10) '@babel/plugin-transform-unicode-regex': 7.27.1(@babel/core@7.26.10) - '@babel/plugin-transform-unicode-sets-regex': 7.27.1(@babel/core@7.26.10) + '@babel/plugin-transform-unicode-sets-regex': 7.28.6(@babel/core@7.26.10) '@babel/preset-modules': 0.1.6-no-external-plugins(@babel/core@7.26.10) babel-plugin-polyfill-corejs2: 0.4.14(@babel/core@7.26.10) babel-plugin-polyfill-corejs3: 0.11.1(@babel/core@7.26.10) @@ -22006,8 +22023,8 @@ snapshots: '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.4) '@babel/plugin-syntax-unicode-sets-regex': 7.18.6(@babel/core@7.28.4) '@babel/plugin-transform-arrow-functions': 7.27.1(@babel/core@7.28.4) - '@babel/plugin-transform-async-generator-functions': 7.28.0(@babel/core@7.28.4) - '@babel/plugin-transform-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-async-generator-functions': 7.28.6(@babel/core@7.28.4) + '@babel/plugin-transform-async-to-generator': 7.28.6(@babel/core@7.28.4) '@babel/plugin-transform-block-scoped-functions': 7.27.1(@babel/core@7.28.4) '@babel/plugin-transform-block-scoping': 7.28.5(@babel/core@7.28.4) '@babel/plugin-transform-class-properties': 7.27.1(@babel/core@7.28.4) @@ -22200,9 +22217,9 @@ snapshots: '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 '@babel/parser': 7.28.6 - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@babel/template@7.28.6': dependencies: @@ -22213,7 +22230,7 @@ snapshots: '@babel/traverse@7.28.5': dependencies: '@babel/code-frame': 7.27.1 - '@babel/generator': 7.28.5 + '@babel/generator': 7.28.6 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.6 '@babel/template': 7.27.2 @@ -22313,7 +22330,7 @@ snapshots: '@devexpress/callsite-record@4.1.7': dependencies: - '@types/lodash': 4.17.13 + '@types/lodash': 4.17.0 callsite: 1.0.0 chalk: 2.4.2 error-stack-parser: 2.1.4 @@ -25780,7 +25797,7 @@ snapshots: '@types/babel__traverse@7.28.0': dependencies: - '@babel/types': 7.28.5 + '@babel/types': 7.28.6 '@types/body-parser@1.19.5': dependencies: @@ -25960,7 +25977,7 @@ snapshots: dependencies: '@types/node': 20.12.8 - '@types/lodash@4.17.13': {} + '@types/lodash@4.17.0': {} '@types/mdast@3.0.15': dependencies: @@ -32152,7 +32169,7 @@ snapshots: fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.103.0(@swc/core@1.15.3)(esbuild@0.26.0)): dependencies: - '@babel/code-frame': 7.27.1 + '@babel/code-frame': 7.28.6 chalk: 4.1.2 chokidar: 4.0.1 cosmiconfig: 8.3.6(typescript@5.9.3) @@ -34647,7 +34664,7 @@ snapshots: '@jest/fake-timers': 29.7.0 '@jest/types': 29.6.3 '@types/jsdom': 20.0.1 - '@types/node': 20.14.5 + '@types/node': 20.12.8 jest-mock: 29.7.0 jest-util: 29.7.0 jsdom: 20.0.3 @@ -34794,7 +34811,7 @@ snapshots: jest-snapshot@29.7.0: dependencies: '@babel/core': 7.28.6 - '@babel/generator': 7.28.5 + '@babel/generator': 7.28.6 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.28.6) '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.6) '@babel/types': 7.28.5 @@ -35608,6 +35625,8 @@ snapshots: lodash.uniq@4.5.0: {} + lodash@4.17.21: {} + lodash@4.17.23: {} log-symbols@4.1.0: @@ -37960,8 +37979,8 @@ snapshots: react-docgen@7.1.1: dependencies: '@babel/core': 7.28.6 - '@babel/traverse': 7.28.5 - '@babel/types': 7.28.5 + '@babel/traverse': 7.28.6 + '@babel/types': 7.28.6 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.28.0 '@types/doctrine': 0.0.9 From 2fed628758f6ba3b17a4e2bb42c3c04e63463970 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Wed, 14 Jan 2026 17:06:10 +0200 Subject: [PATCH 02/15] chore: cleanup migrated localization gulp tasks --- .../devextreme/build/gulp/localization.js | 181 +----------------- 1 file changed, 2 insertions(+), 179 deletions(-) diff --git a/packages/devextreme/build/gulp/localization.js b/packages/devextreme/build/gulp/localization.js index 217bfa0f8458..ecf67b940fc5 100644 --- a/packages/devextreme/build/gulp/localization.js +++ b/packages/devextreme/build/gulp/localization.js @@ -2,116 +2,14 @@ const gulp = require('gulp'); const path = require('path'); -const rename = require('gulp-rename'); -const del = require('del'); -const template = require('gulp-template'); -const lint = require('gulp-eslint-new'); +const shell = require('gulp-shell'); const through = require('through2'); const fs = require('fs'); -const headerPipes = require('./header-pipes.js'); -const compressionPipes = require('./compression-pipes.js'); -const context = require('./context.js'); - -const Cldr = require('cldrjs'); -const locales = require('cldr-core/availableLocales.json').availableLocales.full; -const weekData = require('cldr-core/supplemental/weekData.json'); -const likelySubtags = require('cldr-core/supplemental/likelySubtags.json'); -const parentLocales = require('cldr-core/supplemental/parentLocales.json').supplemental.parentLocales.parentLocale; - -const globalizeEnCldr = require('devextreme-cldr-data/en.json'); -const globalizeSupplementalCldr = require('devextreme-cldr-data/supplemental.json'); - -const PARENT_LOCALE_SEPARATOR = '-'; const DEFAULT_LOCALE = 'en'; - -const getParentLocale = (parentLocales, locale) => { - const parentLocale = parentLocales[locale]; - - if(parentLocale) { - return parentLocale !== 'root' && parentLocale; - } - - return locale.substr(0, locale.lastIndexOf(PARENT_LOCALE_SEPARATOR)); -}; - -const firstDayOfWeekData = function() { - const DAY_INDEXES = { - 'sun': 0, - 'mon': 1, - 'tue': 2, - 'wed': 3, - 'thu': 4, - 'fri': 5, - 'sat': 6 - }; - const DEFAULT_DAY_OF_WEEK_INDEX = 0; - - const result = {}; - - Cldr.load(weekData, likelySubtags); - - const getFirstIndex = (locale) => { - const firstDay = new Cldr(locale).supplemental.weekData.firstDay(); - return DAY_INDEXES[firstDay]; - }; - - locales.forEach(function(locale) { - const firstDayIndex = getFirstIndex(locale); - - const parentLocale = getParentLocale(parentLocales, locale); - if(firstDayIndex !== DEFAULT_DAY_OF_WEEK_INDEX && (!parentLocale || firstDayIndex !== getFirstIndex(parentLocale))) { - result[locale] = firstDayIndex; - } - }); - - return result; -}; - -const accountingFormats = function() { - const result = {}; - - locales.forEach(function(locale) { - const dataFilePath = `../../node_modules/cldr-numbers-full/main/${locale}/numbers.json`; - - if(fs.existsSync(path.join(__dirname, dataFilePath))) { - const numbersData = require(dataFilePath); - result[locale] = numbersData.main[locale].numbers['currencyFormats-numberSystem-latn'].accounting; - } - }); - - return result; -}; - -const RESULT_PATH = path.join(context.RESULT_JS_PATH, 'localization'); const DICTIONARY_SOURCE_FOLDER = 'js/localization/messages'; -const getLocales = function(directory) { - return fs.readdirSync(directory).map(file => { - return file.split('.')[0]; - }); -}; - -const serializeObject = function(obj, shift) { - const tab = ' '; - let result = JSON.stringify(obj, null, tab); - - if(shift) { - result = result.replace(/(\n)/g, '$1' + tab); - } - - return result; -}; - -const getMessages = function(directory, locale) { - const json = require(path.join('../../', directory, locale + '.json')); - - return serializeObject(json, true); -}; - -gulp.task('clean-cldr-data', function() { - return del('js/__internal/core/localization/cldr-data/**', { force: true }); -}); +gulp.task('localization', shell.task('pnpm nx build:localization devextreme')); gulp.task('generate-community-locales', () => { const defaultFile = fs.readFileSync(path.join(DICTIONARY_SOURCE_FOLDER, DEFAULT_LOCALE + '.json')).toString(); @@ -150,78 +48,3 @@ gulp.task('generate-community-locales', () => { })) .pipe(gulp.dest(DICTIONARY_SOURCE_FOLDER)); }); - -gulp.task('localization-messages', gulp.parallel(getLocales(DICTIONARY_SOURCE_FOLDER).map(locale => Object.assign( - function() { - return gulp - .src('build/gulp/localization-template.jst') - .pipe(template({ - json: getMessages(DICTIONARY_SOURCE_FOLDER, locale) - })) - .pipe(rename(['dx', 'messages', locale, 'js'].join('.'))) - .pipe(compressionPipes.beautify()) - .pipe(headerPipes.useStrict()) - .pipe(headerPipes.bangLicense()) - .pipe(gulp.dest(RESULT_PATH)); - }, - { displayName: 'dx.messages.' + locale } -)))); - -gulp.task('localization-generated-sources', gulp.parallel([ - { - data: require('../../js/localization/messages/en.json'), - filename: 'default_messages.ts', - exportName: 'defaultMessages', - destination: 'js/__internal/core/localization' - }, - { - data: parentLocales, - filename: 'parent_locales.ts', - destination: 'js/__internal/core/localization/cldr-data' - }, - { - data: firstDayOfWeekData(), - filename: 'first_day_of_week_data.ts', - destination: 'js/__internal/core/localization/cldr-data' - }, - { - data: accountingFormats(), - filename: 'accounting_formats.ts', - destination: 'js/__internal/core/localization/cldr-data' - - }, - { - data: globalizeEnCldr, - exportName: 'enCldr', - filename: 'en.ts', - destination: 'js/__internal/core/localization/cldr-data' - }, - { - data: globalizeSupplementalCldr, - exportName: 'supplementalCldr', - filename: 'supplemental.ts', - destination: 'js/__internal/core/localization/cldr-data' - } -].map((source) => Object.assign( - function() { - return gulp - .src('build/gulp/generated_js.jst') - .pipe(template({ - exportName: source.exportName, - json: serializeObject(source.data) - })) - .pipe(lint({ fix: true })) - .pipe(lint.format()) - .pipe(rename(source.filename)) - .pipe(gulp.dest(source.destination)); - }, - { displayName: source.filename } -)))); - -gulp.task('localization', - gulp.series( - 'clean-cldr-data', - 'localization-messages', - 'localization-generated-sources' - ) -); From b4c6739a4efe11291e6ee9d2872693e099c3310e Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Wed, 14 Jan 2026 17:08:18 +0200 Subject: [PATCH 03/15] feat(nx-infra-plugin): copy-files, support glob patterns --- packages/nx-infra-plugin/package.json | 2 +- .../executors/copy-files/executor.e2e.spec.ts | 25 ++++++ .../src/executors/copy-files/executor.ts | 84 ++++++++++++++----- .../src/executors/copy-files/schema.json | 10 ++- pnpm-lock.yaml | 12 +-- 5 files changed, 104 insertions(+), 29 deletions(-) diff --git a/packages/nx-infra-plugin/package.json b/packages/nx-infra-plugin/package.json index ec5c04c11b06..6a998082b561 100644 --- a/packages/nx-infra-plugin/package.json +++ b/packages/nx-infra-plugin/package.json @@ -35,7 +35,7 @@ "@types/jest": "29.5.14", "@types/normalize-path": "3.0.2", "@types/node": "18.19.130", - "@types/lodash": "4.17.0", + "@types/lodash": "4.17.13", "prettier": "catalog:tools", "ts-jest": "29.1.3", "typescript": "4.9.5" diff --git a/packages/nx-infra-plugin/src/executors/copy-files/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/copy-files/executor.e2e.spec.ts index 72a266c51719..ac36e37a8999 100644 --- a/packages/nx-infra-plugin/src/executors/copy-files/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/copy-files/executor.e2e.spec.ts @@ -105,4 +105,29 @@ describe('CopyFilesExecutor E2E', () => { expect(content).not.toBe('Old content'); }); }); + + describe('Glob patterns', () => { + it('should copy files using glob pattern', async () => { + const projectDir = path.join(tempDir, 'packages', 'test-lib'); + const srcDir = path.join(projectDir, 'src'); + fs.mkdirSync(srcDir, { recursive: true }); + + await writeFileText(path.join(srcDir, 'file1.ts'), 'export const a = 1;'); + await writeFileText(path.join(srcDir, 'file2.ts'), 'export const b = 2;'); + await writeFileText(path.join(srcDir, 'other.js'), 'module.exports = {};'); + + const options: CopyFilesExecutorSchema = { + files: [{ from: './src/*.ts', to: './dist' }], + }; + + const result = await executor(options, context); + + expect(result.success).toBe(true); + + const distDir = path.join(projectDir, 'dist'); + expect(fs.existsSync(path.join(distDir, 'file1.ts'))).toBe(true); + expect(fs.existsSync(path.join(distDir, 'file2.ts'))).toBe(true); + expect(fs.existsSync(path.join(distDir, 'other.js'))).toBe(false); + }); + }); }); diff --git a/packages/nx-infra-plugin/src/executors/copy-files/executor.ts b/packages/nx-infra-plugin/src/executors/copy-files/executor.ts index fedaad6ed28c..977bb0700066 100644 --- a/packages/nx-infra-plugin/src/executors/copy-files/executor.ts +++ b/packages/nx-infra-plugin/src/executors/copy-files/executor.ts @@ -1,19 +1,72 @@ import { PromiseExecutor, logger } from '@nx/devkit'; import * as path from 'path'; -import * as fs from 'fs/promises'; +import { stat } from 'fs/promises'; +import { glob } from 'glob'; import { CopyFilesExecutorSchema } from './schema'; -import { resolveProjectPath } from '../../utils/path-resolver'; +import { resolveProjectPath, normalizeGlobPathForWindows } from '../../utils/path-resolver'; +import { isWindowsOS } from '../../utils/common'; import { logError } from '../../utils/error-handler'; -import { copyFile, copyRecursive, exists } from '../../utils/file-operations'; +import { copyFile, copyRecursive, exists, ensureDir } from '../../utils/file-operations'; -const ERROR_FILES_MUST_BE_ARRAY = 'Files option must be an array'; -const ERROR_FAILED_TO_COPY = 'Failed to copy files'; +const ERROR_MESSAGES = { + FILES_MUST_BE_ARRAY: 'Files option must be an array', + FAILED_TO_COPY: 'Failed to copy files', + NO_FILES_MATCH_PATTERN: (pattern: string) => `No files found matching pattern: ${pattern}`, + SOURCE_NOT_FOUND: (source: string) => `Source file not found: ${source}`, +} as const; + +function containsGlobPattern(pattern: string): boolean { + return /[*?[\]{}]/.test(pattern); +} + +async function copyGlobPatternFiles( + sourcePath: string, + destPath: string, +): Promise<{ success: boolean }> { + const globPattern = isWindowsOS() ? normalizeGlobPathForWindows(sourcePath) : sourcePath; + const files = await glob(globPattern, { nodir: true }); + + if (files.length === 0) { + logger.error(ERROR_MESSAGES.NO_FILES_MATCH_PATTERN(sourcePath)); + return { success: false }; + } + + await ensureDir(destPath); + + for (const file of files) { + const fileName = path.basename(file); + const destFile = path.join(destPath, fileName); + await copyFile(file, destFile); + logger.info(`Copied file ${file} -> ${destFile}`); + } + + return { success: true }; +} + +async function copyDirectPath(sourcePath: string, destPath: string): Promise<{ success: boolean }> { + if (!(await exists(sourcePath))) { + logger.error(ERROR_MESSAGES.SOURCE_NOT_FOUND(sourcePath)); + return { success: false }; + } + + const sourceStat = await stat(sourcePath); + + if (sourceStat.isDirectory()) { + await copyRecursive(sourcePath, destPath); + logger.info(`Copied directory ${sourcePath} -> ${destPath}`); + return { success: true }; + } + + await copyFile(sourcePath, destPath); + logger.info(`Copied file ${sourcePath} -> ${destPath}`); + return { success: true }; +} const runExecutor: PromiseExecutor = async (options, context) => { const projectRoot = resolveProjectPath(context); if (!options.files || !Array.isArray(options.files)) { - logger.error(ERROR_FILES_MUST_BE_ARRAY); + logger.error(ERROR_MESSAGES.FILES_MUST_BE_ARRAY); return { success: false }; } @@ -22,25 +75,18 @@ const runExecutor: PromiseExecutor = async (options, co const sourcePath = path.resolve(projectRoot, from); const destPath = path.resolve(projectRoot, to); - if (!(await exists(sourcePath))) { - logger.error(`Source file not found: ${sourcePath}`); - return { success: false }; - } + const result = containsGlobPattern(from) + ? await copyGlobPatternFiles(sourcePath, destPath) + : await copyDirectPath(sourcePath, destPath); - const stat = await fs.stat(sourcePath); - - if (stat.isDirectory()) { - await copyRecursive(sourcePath, destPath); - logger.info(`Copied directory ${sourcePath} -> ${destPath}`); - } else { - await copyFile(sourcePath, destPath); - logger.info(`Copied file ${sourcePath} -> ${destPath}`); + if (!result.success) { + return { success: false }; } } return { success: true }; } catch (error) { - logError(ERROR_FAILED_TO_COPY, error); + logError(ERROR_MESSAGES.FAILED_TO_COPY, error); return { success: false }; } }; diff --git a/packages/nx-infra-plugin/src/executors/copy-files/schema.json b/packages/nx-infra-plugin/src/executors/copy-files/schema.json index 7c777b705386..10e9cc609c07 100644 --- a/packages/nx-infra-plugin/src/executors/copy-files/schema.json +++ b/packages/nx-infra-plugin/src/executors/copy-files/schema.json @@ -1,17 +1,21 @@ { + "$schema": "https://json-schema.org/schema", "type": "object", + "description": "Copy files or directories to a destination. Supports glob patterns and recursive directory copying.", "properties": { "files": { "type": "array", - "description": "Files to copy (array of {from, to})", + "description": "Array of file copy operations to perform.", "items": { "type": "object", "properties": { "from": { - "type": "string" + "type": "string", + "description": "Source path relative to project root. Supports glob patterns (e.g., './src/*.ts', './assets/**/*')." }, "to": { - "type": "string" + "type": "string", + "description": "Destination path relative to project root. For glob patterns, this should be a directory." } }, "required": ["from", "to"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 733a77249ca7..eb732afa3591 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2266,8 +2266,8 @@ importers: specifier: 29.5.14 version: 29.5.14 '@types/lodash': - specifier: 4.17.0 - version: 4.17.0 + specifier: 4.17.13 + version: 4.17.13 '@types/node': specifier: 18.19.130 version: 18.19.130 @@ -6941,8 +6941,8 @@ packages: '@types/jsonfile@6.1.4': resolution: {integrity: sha512-D5qGUYwjvnNNextdU59/+fI+spnwtTFmyQP0h+PfIOSkNfpU6AOICUOkm4i0OnSk+NyjdPJrxCDro0sJsWlRpQ==} - '@types/lodash@4.17.0': - resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==} + '@types/lodash@4.17.13': + resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==} '@types/mdast@3.0.15': resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} @@ -22330,7 +22330,7 @@ snapshots: '@devexpress/callsite-record@4.1.7': dependencies: - '@types/lodash': 4.17.0 + '@types/lodash': 4.17.13 callsite: 1.0.0 chalk: 2.4.2 error-stack-parser: 2.1.4 @@ -25977,7 +25977,7 @@ snapshots: dependencies: '@types/node': 20.12.8 - '@types/lodash@4.17.0': {} + '@types/lodash@4.17.13': {} '@types/mdast@3.0.15': dependencies: From 4714daae5c446e85c75c9ce2e7cea6a9f181a50f Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Thu, 15 Jan 2026 13:24:42 +0200 Subject: [PATCH 04/15] chore(devextreme): migrate all:build-dev to nx with wrapped as nx targets gulp tasks --- package.json | 2 +- packages/devextreme/package.json | 1 - packages/devextreme/project.json | 165 ++++++++++++++++++++++++++++++- packages/workflows/project.json | 72 ++++++++++++++ tools/scripts/build-all.ts | 39 +++----- 5 files changed, 248 insertions(+), 31 deletions(-) create mode 100644 packages/workflows/project.json diff --git a/package.json b/package.json index 4cf0ccd7c3a5..9b1bb2a4c4f7 100644 --- a/package.json +++ b/package.json @@ -18,7 +18,7 @@ "prepare": "husky install", "all:update-version": "ts-node tools/scripts/update-version.ts", "all:build": "ts-node tools/scripts/build-all.ts", - "all:build-dev": "pnpm run all:build --dev", + "all:build-dev": "nx all:build-dev workflows", "all:pack-and-copy": "nx run-many -t pack-and-copy", "demos:prepare": "nx run devextreme-demos:prepare-js", "demos:start": "http-server ./apps/demos --port 8080 -c-1" diff --git a/packages/devextreme/package.json b/packages/devextreme/package.json index f7347d7154ce..b85a28c78911 100644 --- a/packages/devextreme/package.json +++ b/packages/devextreme/package.json @@ -221,7 +221,6 @@ "lint-dts": "eslint './js/**/*.d.ts'", "lint-staged": "lint-staged", "lint-texts": "node build/linters/validate-non-latin-symbols.js", - "build": "cross-env BUILD_ESM_PACKAGE=true gulp default", "build:dev": "cross-env DEVEXTREME_TEST_CI=TRUE BUILD_ESM_PACKAGE=true gulp default", "build:testcafe": "cross-env DEVEXTREME_TEST_CI=TRUE BUILD_ESM_PACKAGE=true BUILD_TESTCAFE=TRUE gulp default", "build-npm-devextreme": "cross-env BUILD_ESM_PACKAGE=true gulp default", diff --git a/packages/devextreme/project.json b/packages/devextreme/project.json index 1f8c425fe69b..5a7b390d0530 100644 --- a/packages/devextreme/project.json +++ b/packages/devextreme/project.json @@ -88,10 +88,171 @@ ], "cache": true }, + "build:transpile": { + "executor": "nx:run-commands", + "options": { + "command": "cross-env BUILD_ESM_PACKAGE=true gulp transpile", + "cwd": "{projectRoot}" + }, + "inputs": [ + "{projectRoot}/js/**/*.js", + "{projectRoot}/build/gulp/transpile.js", + "{projectRoot}/babel.config.cjs" + ], + "outputs": [ + "{projectRoot}/artifacts/transpiled", + "{projectRoot}/artifacts/transpiled-esm-npm", + "{projectRoot}/artifacts/transpiled-renovation-npm" + ], + "cache": true + }, + "bundle:debug": { + "executor": "nx:run-commands", + "options": { + "command": "gulp js-bundles-debug", + "cwd": "{projectRoot}" + }, + "inputs": [ + { "env": "BUILD_TEST_INTERNAL_PACKAGE" }, + "{projectRoot}/artifacts/transpiled/**/*", + "{projectRoot}/artifacts/transpiled-esm/**/*", + "{projectRoot}/build/gulp/js-bundles.js", + "{projectRoot}/webpack.config.js" + ], + "outputs": [ + "{projectRoot}/artifacts/js/dx.all.debug.js", + "{projectRoot}/artifacts/js/dx.all.debug.js.map" + ], + "cache": true + }, + "bundle:prod": { + "executor": "nx:run-commands", + "options": { + "command": "gulp js-bundles-prod", + "cwd": "{projectRoot}" + }, + "inputs": [ + { "env": "BUILD_TEST_INTERNAL_PACKAGE" }, + "{projectRoot}/artifacts/transpiled/**/*", + "{projectRoot}/artifacts/transpiled-esm/**/*", + "{projectRoot}/build/gulp/js-bundles.js", + "{projectRoot}/webpack.config.js" + ], + "outputs": [ + "{projectRoot}/artifacts/js/dx.all.js", + "{projectRoot}/artifacts/js/dx.all.js.map" + ], + "cache": true + }, + "build:vectormap": { + "executor": "nx:run-commands", + "options": { + "command": "gulp vectormap", + "cwd": "{projectRoot}" + }, + "inputs": [ + "{projectRoot}/build/gulp/vectormap.js" + ], + "outputs": [ + "{projectRoot}/artifacts/js/vectormap-data" + ], + "cache": true + }, + "build:aspnet": { + "executor": "nx:run-commands", + "options": { + "command": "gulp aspnet", + "cwd": "{projectRoot}" + }, + "inputs": [ + "{projectRoot}/build/gulp/aspnet.js" + ], + "outputs": [ + "{projectRoot}/artifacts/js/aspnet" + ], + "cache": true + }, + "build:declarations": { + "executor": "nx:run-commands", + "options": { + "command": "gulp ts", + "cwd": "{projectRoot}" + }, + "inputs": [ + "{projectRoot}/ts/**/*.d.ts", + "{projectRoot}/build/gulp/ts.js" + ], + "outputs": [ + "{projectRoot}/artifacts/ts" + ], + "cache": true + }, + "verify:licenses": { + "executor": "nx:run-commands", + "options": { + "command": "gulp check-license-notices", + "cwd": "{projectRoot}" + }, + "cache": false + }, + "copy:vendor": { + "executor": "nx:run-commands", + "options": { + "command": "gulp vendor", + "cwd": "{projectRoot}" + }, + "inputs": [ + "{projectRoot}/build/gulp/vendor.js" + ], + "outputs": [ + "{projectRoot}/artifacts/js/vectormap-utils", + "{projectRoot}/artifacts/js/cldr" + ], + "cache": true + }, + "pack:devextreme-npm": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm pack", + "cwd": "{projectRoot}/artifacts/npm/devextreme" + } + }, + "pack:devextreme-dist-npm": { + "executor": "nx:run-commands", + "options": { + "command": "pnpm pack", + "cwd": "{projectRoot}/artifacts/npm/devextreme-dist" + } + }, + "build:npm": { + "executor": "nx:run-commands", + "options": { + "command": "cross-env BUILD_ESM_PACKAGE=true gulp npm", + "cwd": "{projectRoot}" + }, + "inputs": [ + { "env": "BUILD_TEST_INTERNAL_PACKAGE" }, + "{projectRoot}/artifacts/transpiled/**/*", + "{projectRoot}/artifacts/transpiled-esm-npm/**/*" + ], + "outputs": [ + "{projectRoot}/artifacts/npm/devextreme", + "{projectRoot}/artifacts/npm/devextreme-dist" + ], + "cache": true + }, "build": { - "executor": "nx:run-script", + "executor": "nx:run-commands", "options": { - "script": "build" + "commands": [ + "pnpm nx clean:artifacts devextreme", + "pnpm nx build:localization devextreme", + "pnpm nx build:transpile devextreme", + "pnpm nx run-many --targets=bundle:debug,bundle:prod,build:vectormap,copy:vendor,build:aspnet,build:declarations --projects=devextreme --parallel", + "pnpm nx build:npm devextreme", + "pnpm nx verify:licenses devextreme" + ], + "parallel": false }, "inputs": [ { "env": "BUILD_TEST_INTERNAL_PACKAGE" }, diff --git a/packages/workflows/project.json b/packages/workflows/project.json new file mode 100644 index 000000000000..f2f401df6ba3 --- /dev/null +++ b/packages/workflows/project.json @@ -0,0 +1,72 @@ +{ + "name": "workflows", + "metadata": { + "description": "Build workflow that orchestrates targets across multiple packages for specific use cases like local development, CI/CD, etc." + }, + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "projectType": "library", + "targets": { + "copy:artifacts-to-root": { + "executor": "devextreme-nx-infra-plugin:copy-files", + "options": { + "files": [ + { "from": "../devextreme/artifacts/js", "to": "../../artifacts/js" }, + { "from": "../devextreme/artifacts/css", "to": "../../artifacts/css" } + ] + } + }, + "copy:bootstrap": { + "executor": "devextreme-nx-infra-plugin:copy-files", + "options": { + "files": [ + { "from": "../devextreme-themebuilder/node_modules/bootstrap/dist/js/bootstrap.js", "to": "../../artifacts/js/bootstrap.js" }, + { "from": "../devextreme-themebuilder/node_modules/bootstrap/dist/js/bootstrap.min.js", "to": "../../artifacts/js/bootstrap.min.js" }, + { "from": "../devextreme-themebuilder/node_modules/bootstrap/dist/css/bootstrap.css", "to": "../../artifacts/css/bootstrap.css" }, + { "from": "../devextreme-themebuilder/node_modules/bootstrap/dist/css/bootstrap.min.css", "to": "../../artifacts/css/bootstrap.min.css" } + ] + } + }, + "copy:npm-tgz": { + "executor": "devextreme-nx-infra-plugin:copy-files", + "options": { + "files": [ + { "from": "../devextreme/artifacts/npm/devextreme/*.tgz", "to": "../../artifacts/npm/" }, + { "from": "../devextreme/artifacts/npm/devextreme-dist/*.tgz", "to": "../../artifacts/npm/" } + ] + } + }, + "copy:wrappers-tgz": { + "executor": "devextreme-nx-infra-plugin:copy-files", + "options": { + "files": [ + { "from": "../devextreme-angular/npm/dist/*.tgz", "to": "../../artifacts/npm/" }, + { "from": "../devextreme-react/npm/*.tgz", "to": "../../artifacts/npm/" }, + { "from": "../devextreme-vue/npm/*.tgz", "to": "../../artifacts/npm/" } + ] + } + }, + "all:build-dev": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "pnpm nx build devextreme", + "pnpm nx build devextreme-themebuilder", + "pnpm nx copy:artifacts-to-root workflows", + "pnpm nx copy:bootstrap workflows", + "pnpm run all:pack-and-copy", + "pnpm nx pack devextreme-react", + "pnpm nx pack devextreme-vue", + "pnpm nx pack devextreme-angular", + "pnpm nx pack:devextreme-npm devextreme", + "pnpm nx pack:devextreme-dist-npm devextreme", + "pnpm nx copy:npm-tgz workflows", + "pnpm nx copy:wrappers-tgz workflows" + ], + "parallel": false + }, + "metadata": { + "description": "Build all packages for the local development environment." + } + } + } +} diff --git a/tools/scripts/build-all.ts b/tools/scripts/build-all.ts index 9f7e8aaf3343..d231a22fde9a 100644 --- a/tools/scripts/build-all.ts +++ b/tools/scripts/build-all.ts @@ -1,17 +1,8 @@ import sh from 'shelljs'; import path from 'node:path'; -import yargs from 'yargs'; import { ARTIFACTS_DIR, INTERNAL_TOOLS_ARTIFACTS, ROOT_DIR, NPM_DIR, JS_ARTIFACTS, CSS_ARTIFACTS } from './common/paths'; import { version as devextremeNpmVersion } from '../../packages/devextreme/package.json'; -const argv = yargs - .option('dev', { type: 'boolean', default: false }) - .parseSync(); - -const devMode = argv.dev; - -console.log(`Dev mode: ${devMode}`); - const DEVEXTREME_NPM_DIR = path.join(ROOT_DIR, 'packages/devextreme/artifacts/npm'); const injectDescriptions = () => { @@ -45,26 +36,20 @@ const MAJOR_VERSION = monorepoVersion.split('.').slice(0, 2).join('_'); sh.cd(ROOT_DIR); -if (!devMode) { - // aspnet metadata will be used in Build custom-tasks to inject aspnet descriptions - sh.exec(`pnpx nx run devextreme-metadata:make-aspnet-metadata`); +// aspnet metadata will be used in Build custom-tasks to inject aspnet descriptions +sh.exec(`pnpx nx run devextreme-metadata:make-aspnet-metadata`); - injectDescriptions(); -} +injectDescriptions(); -if (devMode) { - sh.exec('pnpx nx build devextreme'); -} else { - sh.exec('pnpx nx build devextreme-scss'); - sh.exec('pnpx nx build-dist devextreme --skipNxCache', { - env: { - ...sh.env, - BUILD_INTERNAL_PACKAGE: 'false' - } - }); -} +sh.exec('pnpx nx build devextreme-scss'); +sh.exec('pnpx nx build-dist devextreme --skipNxCache', { + env: { + ...sh.env, + BUILD_INTERNAL_PACKAGE: 'false' + } +}); -sh.exec(`pnpx nx build devextreme-themebuilder${devMode ? '' : ' --skipNxCache'}`); +sh.exec('pnpx nx build devextreme-themebuilder --skipNxCache'); // Copy artifacts for DXBuild (Installation) sh.pushd(path.join(ROOT_DIR, 'packages/devextreme/artifacts')); @@ -80,7 +65,7 @@ sh.exec('pnpm run all:pack-and-copy'); sh.exec('pnpx nx pack devextreme-react', { silent: true }); sh.exec('pnpx nx pack devextreme-vue', { silent: true }); -sh.exec(`pnpx nx pack${devMode ? '' : '-with-descriptions'} devextreme-angular`, { silent: true }); +sh.exec('pnpx nx pack-with-descriptions devextreme-angular', { silent: true }); sh.pushd(path.join(DEVEXTREME_NPM_DIR, 'devextreme')); packAndCopy(NPM_DIR); From 0724d35be8b113501ea8681901f10f2b4601ed4c Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Thu, 15 Jan 2026 17:46:33 +0200 Subject: [PATCH 05/15] chore: create all:build-testing workflow --- .github/workflows/demos_visual_tests.yml | 5 +---- .github/workflows/publish-demos.yml | 4 +--- .github/workflows/testcafe_tests.yml | 3 +-- .github/workflows/wrapper_tests.yml | 6 +----- .github/workflows/wrapper_tests_e2e.yml | 5 +---- packages/devextreme/project.json | 10 +++++++++- packages/workflows/project.json | 23 +++++++++++++++++++++++ 7 files changed, 37 insertions(+), 19 deletions(-) diff --git a/.github/workflows/demos_visual_tests.yml b/.github/workflows/demos_visual_tests.yml index 8c3cea1d6108..819c33fda764 100644 --- a/.github/workflows/demos_visual_tests.yml +++ b/.github/workflows/demos_visual_tests.yml @@ -15,7 +15,6 @@ on: env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} NX_SKIP_NX_CACHE: ${{ (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'skip-cache')) && 'true' || 'false' }} - BUILD_TEST_INTERNAL_PACKAGE: true RUN_TESTS: true jobs: @@ -149,9 +148,7 @@ jobs: - name: DevExtreme - Build-all if: needs.determine-framework-tests-scope.outputs.framework-tests-scope != 'none' - env: - BUILD_TEST_INTERNAL_PACKAGE: true - run: pnpm run all:build-dev + run: pnpm nx all:build-testing workflows - name: Zip artifacts (for jQuery tests) working-directory: ./packages/devextreme diff --git a/.github/workflows/publish-demos.yml b/.github/workflows/publish-demos.yml index bfb90c636b9c..ee81704afa95 100644 --- a/.github/workflows/publish-demos.yml +++ b/.github/workflows/publish-demos.yml @@ -38,9 +38,7 @@ jobs: pnpm install --frozen-lockfile - name: DevExtreme - Build-all - env: - BUILD_TEST_INTERNAL_PACKAGE: true - run: pnpm run all:build-dev + run: pnpm nx all:build-testing workflows - name: Move packages run: | diff --git a/.github/workflows/testcafe_tests.yml b/.github/workflows/testcafe_tests.yml index 9a96b37eded1..5eb20ca67bb2 100644 --- a/.github/workflows/testcafe_tests.yml +++ b/.github/workflows/testcafe_tests.yml @@ -15,7 +15,6 @@ on: env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} NX_SKIP_NX_CACHE: ${{ (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'skip-cache')) && 'true' || 'false' }} - BUILD_TEST_INTERNAL_PACKAGE: true RUN_TESTS: true jobs: @@ -72,7 +71,7 @@ jobs: NODE_OPTIONS: --max-old-space-size=8192 run: | pnpx nx build devextreme-scss - pnpx nx build devextreme + pnpx nx build devextreme -c testing - name: Zip artifacts working-directory: ./packages/devextreme diff --git a/.github/workflows/wrapper_tests.yml b/.github/workflows/wrapper_tests.yml index 45a67fe5d3c1..50e6025fe0b4 100644 --- a/.github/workflows/wrapper_tests.yml +++ b/.github/workflows/wrapper_tests.yml @@ -10,7 +10,6 @@ on: env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} NX_SKIP_NX_CACHE: ${{ (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'skip-cache')) && 'true' || 'false' }} - BUILD_TEST_INTERNAL_PACKAGE: true jobs: build: @@ -49,10 +48,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Build devextreme package - env: - BUILD_TEST_INTERNAL_PACKAGE: true - working-directory: ./packages/devextreme - run: pnpx nx build + run: pnpx nx build devextreme -c testing check-regenerate: runs-on: devextreme-shr2 diff --git a/.github/workflows/wrapper_tests_e2e.yml b/.github/workflows/wrapper_tests_e2e.yml index 49cc1b435d62..022816c61ff6 100644 --- a/.github/workflows/wrapper_tests_e2e.yml +++ b/.github/workflows/wrapper_tests_e2e.yml @@ -15,7 +15,6 @@ on: env: NX_CLOUD_ACCESS_TOKEN: ${{ secrets.NX_TOKEN }} NX_SKIP_NX_CACHE: ${{ (github.event_name != 'pull_request' || contains( github.event.pull_request.labels.*.name, 'skip-cache')) && 'true' || 'false' }} - BUILD_TEST_INTERNAL_PACKAGE: true jobs: build-packages: @@ -55,9 +54,7 @@ jobs: run: pnpm install --frozen-lockfile - name: Build all DevExtreme packages - env: - BUILD_TEST_INTERNAL_PACKAGE: true - run: pnpm run all:build-dev + run: pnpm nx all:build-testing workflows - name: Build wrappers apps working-directory: e2e/wrappers diff --git a/packages/devextreme/project.json b/packages/devextreme/project.json index 5a7b390d0530..d304f133e299 100644 --- a/packages/devextreme/project.json +++ b/packages/devextreme/project.json @@ -264,7 +264,15 @@ "{projectRoot}/js/bundles/dx.custom.js", "{projectRoot}/js/common/core/localization/cldr-data", "{projectRoot}/js/common/core/localization/default_messages.js" - ] + ], + "cache": true, + "configurations": { + "testing": { + "env": { + "BUILD_TEST_INTERNAL_PACKAGE": "true" + } + } + } }, "build-dist": { "executor": "nx:run-script", diff --git a/packages/workflows/project.json b/packages/workflows/project.json index f2f401df6ba3..cee8e09854ff 100644 --- a/packages/workflows/project.json +++ b/packages/workflows/project.json @@ -67,6 +67,29 @@ "metadata": { "description": "Build all packages for the local development environment." } + }, + "all:build-testing": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "pnpm nx build devextreme -c testing", + "pnpm nx build devextreme-themebuilder", + "pnpm nx copy:artifacts-to-root workflows", + "pnpm nx copy:bootstrap workflows", + "pnpm run all:pack-and-copy", + "pnpm nx pack devextreme-react", + "pnpm nx pack devextreme-vue", + "pnpm nx pack devextreme-angular", + "pnpm nx pack:devextreme-npm devextreme", + "pnpm nx pack:devextreme-dist-npm devextreme", + "pnpm nx copy:npm-tgz workflows", + "pnpm nx copy:wrappers-tgz workflows" + ], + "parallel": false + }, + "metadata": { + "description": "Build all packages for the testing environment." + } } } } From a1b85d3d6adf7d6c49d2e9bef4205e45ff563149 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Wed, 14 Jan 2026 17:26:39 +0200 Subject: [PATCH 06/15] chore(devextreme): align output paths in nx project config --- packages/devextreme/project.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/packages/devextreme/project.json b/packages/devextreme/project.json index d304f133e299..6867a8cb1894 100644 --- a/packages/devextreme/project.json +++ b/packages/devextreme/project.json @@ -261,9 +261,9 @@ ], "outputs": [ "{projectRoot}/artifacts", - "{projectRoot}/js/bundles/dx.custom.js", - "{projectRoot}/js/common/core/localization/cldr-data", - "{projectRoot}/js/common/core/localization/default_messages.js" + "{projectRoot}/build/bundle-templates/dx.custom.js", + "{projectRoot}/js/__internal/core/localization/cldr-data", + "{projectRoot}/js/__internal/core/localization/default_messages.ts" ], "cache": true, "configurations": { @@ -308,9 +308,9 @@ ], "outputs": [ "{projectRoot}/artifacts", - "{projectRoot}/js/bundles/dx.custom.js", - "{projectRoot}/js/common/core/localization/cldr-data", - "{projectRoot}/js/common/core/localization/default_messages.js" + "{projectRoot}/build/bundle-templates/dx.custom.js", + "{projectRoot}/js/__internal/core/localization/cldr-data", + "{projectRoot}/js/__internal/core/localization/default_messages.ts" ], "cache": true }, From 40f6184e647ae8ac92bf55e4a0e09813c21b5427 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Thu, 15 Jan 2026 12:32:50 +0200 Subject: [PATCH 07/15] fix: devextreme-angular, correct config is forwarded to target deps --- packages/devextreme-angular/project.json | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/packages/devextreme-angular/project.json b/packages/devextreme-angular/project.json index 00c4391e592b..b96349108499 100644 --- a/packages/devextreme-angular/project.json +++ b/packages/devextreme-angular/project.json @@ -167,7 +167,13 @@ }, "build": { "executor": "nx:run-commands", - "dependsOn": ["^build"], + "dependsOn": [ + { + "dependencies": true, + "target": "build", + "params": "forward" + } + ], "options": { "commands": [ "pnpm --workspace-root nx clean:dist devextreme-angular", @@ -182,7 +188,14 @@ "{projectRoot}/npm/dist" ], "cache": true, - "inputs": ["default"] + "inputs": ["default"], + "configurations": { + "testing": { + "env": { + "BUILD_TEST_INTERNAL_PACKAGE": "true" + } + } + } }, "pack": { "executor": "nx:run-commands", @@ -289,7 +302,7 @@ "executor": "nx:run-commands", "options": { "commands": [ - "pnpm --workspace-root nx build devextreme-angular", + "pnpm --workspace-root nx build devextreme-angular -c testing", "pnpm --workspace-root nx build:tests devextreme-angular", "pnpm --workspace-root nx test:all devextreme-angular" ], From c59a993b69844ecd5a6dced5215d1c06d0ef2dbf Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Thu, 15 Jan 2026 13:14:24 +0200 Subject: [PATCH 08/15] chore: remove unnecessary steps from all:build-dev workflow --- packages/workflows/project.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/workflows/project.json b/packages/workflows/project.json index cee8e09854ff..4e9f9cc10063 100644 --- a/packages/workflows/project.json +++ b/packages/workflows/project.json @@ -51,16 +51,11 @@ "commands": [ "pnpm nx build devextreme", "pnpm nx build devextreme-themebuilder", - "pnpm nx copy:artifacts-to-root workflows", - "pnpm nx copy:bootstrap workflows", - "pnpm run all:pack-and-copy", "pnpm nx pack devextreme-react", "pnpm nx pack devextreme-vue", "pnpm nx pack devextreme-angular", "pnpm nx pack:devextreme-npm devextreme", - "pnpm nx pack:devextreme-dist-npm devextreme", - "pnpm nx copy:npm-tgz workflows", - "pnpm nx copy:wrappers-tgz workflows" + "pnpm nx pack:devextreme-dist-npm devextreme" ], "parallel": false }, From 247b8e6deddd436055736f2790ced5ca85c9f373 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Thu, 15 Jan 2026 13:14:35 +0200 Subject: [PATCH 09/15] chore: remove unnecessary steps from all:build-testing workflow --- packages/workflows/project.json | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/workflows/project.json b/packages/workflows/project.json index 4e9f9cc10063..62e5a97dad7a 100644 --- a/packages/workflows/project.json +++ b/packages/workflows/project.json @@ -69,16 +69,11 @@ "commands": [ "pnpm nx build devextreme -c testing", "pnpm nx build devextreme-themebuilder", - "pnpm nx copy:artifacts-to-root workflows", - "pnpm nx copy:bootstrap workflows", - "pnpm run all:pack-and-copy", "pnpm nx pack devextreme-react", "pnpm nx pack devextreme-vue", "pnpm nx pack devextreme-angular", "pnpm nx pack:devextreme-npm devextreme", - "pnpm nx pack:devextreme-dist-npm devextreme", - "pnpm nx copy:npm-tgz workflows", - "pnpm nx copy:wrappers-tgz workflows" + "pnpm nx pack:devextreme-dist-npm devextreme" ], "parallel": false }, From fb294a4be225d8586e37496544acfdda085aa207 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Thu, 15 Jan 2026 15:10:05 +0200 Subject: [PATCH 10/15] feat(nx-infra-plugin): make executor output suppressible for cleaner CI logs --- .../executors/add-license-headers/executor.ts | 4 +- .../build-angular-library/executor.ts | 16 ++--- .../executors/build-typescript/executor.ts | 4 +- .../src/executors/clean/executor.ts | 10 ++-- .../src/executors/copy-files/executor.ts | 6 +- .../generate-component-names/executor.ts | 4 +- .../generate-components/angular-generator.ts | 20 +++---- .../executors/generate-components/executor.ts | 26 ++++----- .../src/executors/karma-multi-env/executor.ts | 58 +++++++++---------- .../src/executors/localization/executor.ts | 12 ++-- .../src/executors/pack-npm/executor.ts | 4 +- .../prepare-package-json/executor.ts | 2 +- .../executors/prepare-submodules/executor.ts | 8 +-- 13 files changed, 87 insertions(+), 87 deletions(-) diff --git a/packages/nx-infra-plugin/src/executors/add-license-headers/executor.ts b/packages/nx-infra-plugin/src/executors/add-license-headers/executor.ts index bffce3e121ab..342bc40a22d5 100644 --- a/packages/nx-infra-plugin/src/executors/add-license-headers/executor.ts +++ b/packages/nx-infra-plugin/src/executors/add-license-headers/executor.ts @@ -258,7 +258,7 @@ const runExecutor: PromiseExecutor = async (opt excludePatterns: options.excludePatterns ?? DEFAULTS.EXCLUDE_PATTERNS, }); - logger.info(`Adding license headers to ${files.length} files...`); + logger.verbose(`Adding license headers to ${files.length} files...`); const compiledTemplate = useCustomTemplate ? _.template(bannerTemplate) : null; @@ -277,7 +277,7 @@ const runExecutor: PromiseExecutor = async (opt ), ); - logger.info('License headers added successfully'); + logger.verbose('License headers added successfully'); return { success: true }; } catch (error) { logError('Failed to add license headers', error); diff --git a/packages/nx-infra-plugin/src/executors/build-angular-library/executor.ts b/packages/nx-infra-plugin/src/executors/build-angular-library/executor.ts index 4e22991a7585..31dcab78e85d 100644 --- a/packages/nx-infra-plugin/src/executors/build-angular-library/executor.ts +++ b/packages/nx-infra-plugin/src/executors/build-angular-library/executor.ts @@ -84,14 +84,14 @@ async function executeNgPackagrBuild(config: BuildConfiguration): Promise { return new Promise((resolve, reject) => { - logger.info(`Spawning process: ${options.command} ${options.args.join(' ')}`); + logger.verbose(`Spawning process: ${options.command} ${options.args.join(' ')}`); const child = spawn(options.command, options.args, options.options); child.on('close', (code, signal) => { - logger.info(`Process closed with code: ${code}, signal: ${signal || 'none'}`); + logger.verbose(`Process closed with code: ${code}, signal: ${signal || 'none'}`); const actualExitCode = code === null ? -1 : code; resolve({ exitCode: actualExitCode, signal: signal || undefined }); }); @@ -183,7 +183,7 @@ const runExecutor: PromiseExecutor = async ( context, ) => { try { - logger.info('Building Angular library with ng-packagr...'); + logger.verbose('Building Angular library with ng-packagr...'); const config = resolveBuildConfiguration(options, context); await validateBuildConfiguration(config); diff --git a/packages/nx-infra-plugin/src/executors/build-typescript/executor.ts b/packages/nx-infra-plugin/src/executors/build-typescript/executor.ts index 0e0fe22bc8c9..0cf58cd70a33 100644 --- a/packages/nx-infra-plugin/src/executors/build-typescript/executor.ts +++ b/packages/nx-infra-plugin/src/executors/build-typescript/executor.ts @@ -96,7 +96,7 @@ const runExecutor: PromiseExecutor = async (optio throw new Error(`No source files matched pattern: ${srcPattern}`); } - logger.info(`Building ${module.toUpperCase()} for ${sourceFiles.length} source files...`); + logger.verbose(`Building ${module.toUpperCase()} for ${sourceFiles.length} source files...`); const parsedConfig = ts.parseJsonConfigFileContent( tsconfigContent, @@ -121,7 +121,7 @@ const runExecutor: PromiseExecutor = async (optio return { success: false }; } - logger.info(`✓ ${module.toUpperCase()} build completed successfully`); + logger.verbose(`✓ ${module.toUpperCase()} build completed successfully`); return { success: true }; } catch (error) { logError(`Failed to build ${module.toUpperCase()}`, error); diff --git a/packages/nx-infra-plugin/src/executors/clean/executor.ts b/packages/nx-infra-plugin/src/executors/clean/executor.ts index 5b370238254f..f207c6a3d66f 100644 --- a/packages/nx-infra-plugin/src/executors/clean/executor.ts +++ b/packages/nx-infra-plugin/src/executors/clean/executor.ts @@ -98,12 +98,12 @@ const runExecutor: PromiseExecutor = async (options, contex ); const excludePatterns = options.excludePatterns || []; - logger.info( + logger.verbose( `Cleaning ${targetDirectory}${excludePatterns.length > 0 ? ` with ${excludePatterns.length} exclusions` : ' completely'}...`, ); if (excludePatterns.length > 0) { - logger.info(`Excluding patterns: ${excludePatterns.join(', ')}`); + logger.verbose(`Excluding patterns: ${excludePatterns.join(', ')}`); } try { @@ -111,16 +111,16 @@ const runExecutor: PromiseExecutor = async (options, contex if (excludePatterns.length === 0) { await removeDirectoryCompletely(targetDirectory); - logger.info(`Removed directory: ${targetDirectory}`); + logger.verbose(`Removed directory: ${targetDirectory}`); } else { if (!fs.existsSync(targetDirectory)) { - logger.info(`Directory does not exist: ${targetDirectory}`); + logger.verbose(`Directory does not exist: ${targetDirectory}`); return { success: true }; } await removeDirectoryWithExclusions(targetDirectory, absoluteExcludePaths); - logger.info( + logger.verbose( `Cleaned directory: ${targetDirectory} with ${absoluteExcludePaths.length} exclusions preserved`, ); } diff --git a/packages/nx-infra-plugin/src/executors/copy-files/executor.ts b/packages/nx-infra-plugin/src/executors/copy-files/executor.ts index 977bb0700066..0a0e714ae54e 100644 --- a/packages/nx-infra-plugin/src/executors/copy-files/executor.ts +++ b/packages/nx-infra-plugin/src/executors/copy-files/executor.ts @@ -37,7 +37,7 @@ async function copyGlobPatternFiles( const fileName = path.basename(file); const destFile = path.join(destPath, fileName); await copyFile(file, destFile); - logger.info(`Copied file ${file} -> ${destFile}`); + logger.verbose(`Copied file ${file} -> ${destFile}`); } return { success: true }; @@ -53,12 +53,12 @@ async function copyDirectPath(sourcePath: string, destPath: string): Promise<{ s if (sourceStat.isDirectory()) { await copyRecursive(sourcePath, destPath); - logger.info(`Copied directory ${sourcePath} -> ${destPath}`); + logger.verbose(`Copied directory ${sourcePath} -> ${destPath}`); return { success: true }; } await copyFile(sourcePath, destPath); - logger.info(`Copied file ${sourcePath} -> ${destPath}`); + logger.verbose(`Copied file ${sourcePath} -> ${destPath}`); return { success: true }; } diff --git a/packages/nx-infra-plugin/src/executors/generate-component-names/executor.ts b/packages/nx-infra-plugin/src/executors/generate-component-names/executor.ts index 267c0bb8766c..91ad72e971d0 100644 --- a/packages/nx-infra-plugin/src/executors/generate-component-names/executor.ts +++ b/packages/nx-infra-plugin/src/executors/generate-component-names/executor.ts @@ -45,7 +45,7 @@ const runExecutor: PromiseExecutor = async const projectRoot = resolveProjectPath(context); try { - logger.info(MSG_GENERATING); + logger.verbose(MSG_GENERATING); validateDependencies(); @@ -59,7 +59,7 @@ const runExecutor: PromiseExecutor = async const generator = new AngularComponentNamesGenerator(config); generator.generate(); - logger.info(MSG_GENERATED); + logger.verbose(MSG_GENERATED); return { success: true }; } catch (error) { logError(ERROR_GENERATION_FAILED, error); diff --git a/packages/nx-infra-plugin/src/executors/generate-components/angular-generator.ts b/packages/nx-infra-plugin/src/executors/generate-components/angular-generator.ts index 470053ed3ef8..d1ccf036ccb9 100644 --- a/packages/nx-infra-plugin/src/executors/generate-components/angular-generator.ts +++ b/packages/nx-infra-plugin/src/executors/generate-components/angular-generator.ts @@ -32,7 +32,7 @@ export async function generateAngularComponents( path.join(path.dirname(componentsDir), 'metadata', 'generated'), ); - logger.info('📝 Generating Angular-specific metadata...'); + logger.verbose('📝 Generating Angular-specific metadata...'); const metadataGenerator = new AngularMetadataGenerator(); metadataGenerator.generate({ outputFolderPath: metadataDir, @@ -45,9 +45,9 @@ export async function generateAngularComponents( sourceMetadataFilePath: require.resolve('devextreme-metadata/NGMetaData.json'), imdMetadataFilePath: require.resolve('devextreme-metadata/integration-data.json'), }); - logger.info('✓ Metadata generation completed'); + logger.verbose('✓ Metadata generation completed'); - logger.info('🔨 Generating component TypeScript files...'); + logger.verbose('🔨 Generating component TypeScript files...'); const componentGenerator = new AngularDotGenerator(); componentGenerator.generate({ metadataFolderPath: metadataDir, @@ -58,9 +58,9 @@ export async function generateAngularComponents( nestedPathPart: 'nested', basePathPart: 'base', }); - logger.info('✓ Component files generated'); + logger.verbose('✓ Component files generated'); - logger.info('📦 Generating module facades...'); + logger.verbose('📦 Generating module facades...'); const moduleFacadeGenerator = new AngularModuleFacadeGenerator(); moduleFacadeGenerator.generate({ moduleFacades: { @@ -72,9 +72,9 @@ export async function generateAngularComponents( }, }, }); - logger.info('✓ Module facades generated'); + logger.verbose('✓ Module facades generated'); - logger.info('📋 Generating index facades...'); + logger.verbose('📋 Generating index facades...'); const facadeGenerator = new AngularFacadeGenerator(); facadeGenerator.generate({ facades: { @@ -85,13 +85,13 @@ export async function generateAngularComponents( commonImports: ['./common', './common/grids', './common/charts'], templatingOptions: config.templatingOptions, }); - logger.info('✓ Index facades generated'); + logger.verbose('✓ Index facades generated'); - logger.info('🔗 Generating common reexports...'); + logger.verbose('🔗 Generating common reexports...'); AngularCommonReexportsGenerator.generate({ outputPath: path.dirname(componentsDir), metadata: metaData, templatingOptions: config.templatingOptions, }); - logger.info('✓ Common reexports generated'); + logger.verbose('✓ Common reexports generated'); } diff --git a/packages/nx-infra-plugin/src/executors/generate-components/executor.ts b/packages/nx-infra-plugin/src/executors/generate-components/executor.ts index 0472c98dd704..2cc927b1fae9 100644 --- a/packages/nx-infra-plugin/src/executors/generate-components/executor.ts +++ b/packages/nx-infra-plugin/src/executors/generate-components/executor.ts @@ -91,8 +91,8 @@ function resolveDefaultMetadataPath(): string { } function loadMetadata(metadataPath: string): any { - logger.info(MSG_LOADING_METADATA); - logger.info(` Path: ${metadataPath}`); + logger.verbose(MSG_LOADING_METADATA); + logger.verbose(` Path: ${metadataPath}`); if (!fs.existsSync(metadataPath)) { throw new Error(`Metadata file not found: ${metadataPath}`); @@ -102,7 +102,7 @@ function loadMetadata(metadataPath: string): any { const metaData = JSON.parse(metadataContent); const widgetCount = Object.keys(metaData.Widgets || {}).length; - logger.info(`✓ Loaded ${widgetCount} widget definitions`); + logger.verbose(`✓ Loaded ${widgetCount} widget definitions`); return metaData; } @@ -136,7 +136,7 @@ function loadConfigFromFile(projectRoot: string, configPath: string, framework: const config = require(absoluteConfigPath); const frameworkName = framework.charAt(0).toUpperCase() + framework.slice(1); - logger.info(`✓ Loaded ${frameworkName} configuration from ${configPath}`); + logger.verbose(`✓ Loaded ${frameworkName} configuration from ${configPath}`); return config; } catch (error) { logger.warn(`⚠️ Could not load configuration from ${configPath}: ${getErrorMessage(error)}`); @@ -166,7 +166,7 @@ function loadConfigFromGeneratorsFile( } const messages = createMessages(framework); - logger.info(messages.loadedConfig); + logger.verbose(messages.loadedConfig); return config; } catch (error) { logger.warn(`⚠️ Could not load generators-config.js: ${getErrorMessage(error)}`); @@ -244,26 +244,26 @@ async function executeGeneration( const messages = createMessages(framework); const handler = getFrameworkHandler(framework); - logger.info(messages.generating); + logger.verbose(messages.generating); await handler.executeGeneration(generateComponents, config, metaData); - logger.info(MSG_GENERATION_COMPLETED); + logger.verbose(MSG_GENERATION_COMPLETED); if (fs.existsSync(indexFileName)) { const indexContent = fs.readFileSync(indexFileName, ENCODING_UTF8); const exportCount = (indexContent.match(EXPORT_PATTERN) || []).length; - logger.info(` Exports: ${exportCount}`); + logger.verbose(` Exports: ${exportCount}`); } if (fs.existsSync(componentsDir)) { const dirCount = fs .readdirSync(componentsDir, { withFileTypes: true }) .filter((entry) => entry.isDirectory() && entry.name !== CORE_DIR).length; - logger.info(` Component Directories: ${dirCount}`); + logger.verbose(` Component Directories: ${dirCount}`); } - logger.info(messages.generationSuccess); + logger.verbose(messages.generationSuccess); } const runExecutor: PromiseExecutor = async ( @@ -276,10 +276,10 @@ const runExecutor: PromiseExecutor = asyn const framework: Framework = options.framework || 'react'; const messages = createMessages(framework); - logger.info(messages.starting); + logger.verbose(messages.starting); const projectRelativePath = path.relative(workspaceRoot, absoluteProjectRoot) || DOT_SLASH_PREFIX; - logger.info(` Project root: ${projectRelativePath}`); - logger.info(` Framework: ${framework}`); + logger.verbose(` Project root: ${projectRelativePath}`); + logger.verbose(` Framework: ${framework}`); try { const componentsDir = path.resolve( diff --git a/packages/nx-infra-plugin/src/executors/karma-multi-env/executor.ts b/packages/nx-infra-plugin/src/executors/karma-multi-env/executor.ts index 56182a6da8a7..f8c4a6727fcf 100644 --- a/packages/nx-infra-plugin/src/executors/karma-multi-env/executor.ts +++ b/packages/nx-infra-plugin/src/executors/karma-multi-env/executor.ts @@ -203,7 +203,7 @@ async function executeSingleRun( return (exitCode: number) => { const duration = Date.now() - startTime; - logger.info( + logger.verbose( `[${environment.toUpperCase()}] Karma callback called with exit code: ${exitCode}`, ); @@ -231,7 +231,7 @@ async function executeSingleRun( }; if (testResult.success) { - logger.info(`\n[${environment.toUpperCase()}] Tests completed successfully`); + logger.verbose(`\n[${environment.toUpperCase()}] Tests completed successfully`); } else { errorHandler.logError(testResult.error!); } @@ -319,7 +319,7 @@ const createWatchModeCallback = ( try { if (server && server.stop) { - logger.info(`[${environment.toUpperCase()}] Stopping Karma server...`); + logger.verbose(`[${environment.toUpperCase()}] Stopping Karma server...`); server.stop(); } } catch (cleanupError) { @@ -343,7 +343,7 @@ const createWatchModeCallback = ( const setupSignalHandlers = (server: any): void => { const handleExit = (signal: string) => { - logger.info(`\n${STATUS_ICONS.STOP} Received ${signal} - stopping watch mode...`); + logger.verbose(`\n${STATUS_ICONS.STOP} Received ${signal} - stopping watch mode...`); if (server && server.stop) { server.stop(); } @@ -403,18 +403,18 @@ const createExecutionResult = ( const logExecutionStart = (plan: ExecutionPlan, options: KarmaMultiEnvExecutorSchema): void => { if (options.watch) return; - logger.info(`Running tests in environments: ${plan.executionOrder.join(', ')}`); + logger.verbose(`Running tests in environments: ${plan.executionOrder.join(', ')}`); if (options.verbose) { - logger.info(`Karma config: ${options.karmaConfig}`); - logger.info(`Timeout: ${plan.timeout}ms`); + logger.verbose(`Karma config: ${options.karmaConfig}`); + logger.verbose(`Timeout: ${plan.timeout}ms`); } }; const logEnvironmentStart = (environment: KarmaEnvironment): void => - logger.info(`\n[${environment.toUpperCase()}] Starting tests...`); + logger.verbose(`\n[${environment.toUpperCase()}] Starting tests...`); const logWatchModeStart = (environment: KarmaEnvironment): void => - logger.info(`[${environment.toUpperCase()}] Watch mode enabled - starting Karma server...`); + logger.verbose(`[${environment.toUpperCase()}] Watch mode enabled - starting Karma server...`); const logTestResults = ( summary: TestSummary, @@ -422,27 +422,27 @@ const logTestResults = ( options: KarmaMultiEnvExecutorSchema, ): void => { if (options.watch) { - logger.info(`\n${STATUS_ICONS.WATCH} Watch mode active for: ${plan.executionOrder.join(', ')}`); + logger.verbose(`\n${STATUS_ICONS.WATCH} Watch mode active for: ${plan.executionOrder.join(', ')}`); if (options.verbose) { - logger.info(`Karma config: ${options.karmaConfig}`); - logger.info('Watching file changes...'); + logger.verbose(`Karma config: ${options.karmaConfig}`); + logger.verbose('Watching file changes...'); } - logger.info('Press CTRL+C to stop watching...'); + logger.verbose('Press CTRL+C to stop watching...'); return; } - logger.info('\n' + '='.repeat(50)); - logger.info(`${STATUS_ICONS.DOCUMENTATION} TEST RESULTS SUMMARY`); - logger.info('='.repeat(50)); - logger.info(`\n${STATUS_ICONS.SUCCESS} Environments tested: ${plan.executionOrder.join(', ')}`); - logger.info(`${STATUS_ICONS.CLOCK} Total duration: ${summary.totalDuration}ms`); + logger.verbose('\n' + '='.repeat(50)); + logger.verbose(`${STATUS_ICONS.DOCUMENTATION} TEST RESULTS SUMMARY`); + logger.verbose('='.repeat(50)); + logger.verbose(`\n${STATUS_ICONS.SUCCESS} Environments tested: ${plan.executionOrder.join(', ')}`); + logger.verbose(`${STATUS_ICONS.CLOCK} Total duration: ${summary.totalDuration}ms`); summary.results.forEach((result) => { const statusIcon = result.success ? STATUS_ICONS.SUCCESS : STATUS_ICONS.FAILURE; const durationText = `${result.duration}ms`; const statusText = result.success ? 'PASS' : 'FAIL'; - logger.info( + logger.verbose( `\n${statusIcon} ${result.environment.toUpperCase()}: ${statusText} (${durationText})`, ); if (!result.success && result.error) { @@ -451,7 +451,7 @@ const logTestResults = ( }); if (summary.summary.failed === 0) { - logger.info(`\n${STATUS_ICONS.CELEBRATION} SUCCESS: All tests passed`); + logger.verbose(`\n${STATUS_ICONS.CELEBRATION} SUCCESS: All tests passed`); } else { logger.error(`\n${STATUS_ICONS.ERROR} FAILURE: Some tests failed`); } @@ -461,7 +461,7 @@ const setupWatchModeEvents = (environment: KarmaEnvironment, server: any): void if (!server.on || typeof server.on !== 'function') return; server.on('browsers_ready', () => { - logger.info( + logger.verbose( `\n${STATUS_ICONS.WATCH} Watch mode active - browsers ready and watching for file changes...`, ); }); @@ -470,13 +470,13 @@ const setupWatchModeEvents = (environment: KarmaEnvironment, server: any): void const statusIcon = results.success ? STATUS_ICONS.SUCCESS : STATUS_ICONS.FAILURE; const statusText = results.success ? 'All tests passed' : 'Some tests failed'; - logger.info(`\n[${environment.toUpperCase()}] Test run completed. Success: ${results.success}`); - logger.info(`${statusIcon} ${statusText} in watch mode - continuing to watch...`); - logger.info('Press CTRL+C to stop watching...'); + logger.verbose(`\n[${environment.toUpperCase()}] Test run completed. Success: ${results.success}`); + logger.verbose(`${statusIcon} ${statusText} in watch mode - continuing to watch...`); + logger.verbose('Press CTRL+C to stop watching...'); }); server.on('file_list_modified', () => { - logger.info(`\n${STATUS_ICONS.REFRESH} File changes detected, re-running tests...`); + logger.verbose(`\n${STATUS_ICONS.REFRESH} File changes detected, re-running tests...`); }); }; @@ -496,7 +496,7 @@ async function executeWatchMode( setupWatchModeEvents(environment, server); setupSignalHandlers(server); - logger.info(`\n${STATUS_ICONS.START} Starting Karma server in watch mode...`); + logger.verbose(`\n${STATUS_ICONS.START} Starting Karma server in watch mode...`); server.start(); }); } @@ -529,10 +529,10 @@ const setupDebugModeEvents = (environment: KarmaEnvironment, server: any): void if (!server.on || typeof server.on !== 'function') return; server.on('browsers_ready', () => { - logger.info( + logger.verbose( `\n${STATUS_ICONS.DEBUG} Debug mode for the ${environment} environment is active. Click the "DEBUG" button in the opened browser window to start debugging.`, ); - logger.info('Press CTRL+C to stop debugging...'); + logger.verbose('Press CTRL+C to stop debugging...'); }); }; @@ -549,7 +549,7 @@ async function launchDebugMode( setupDebugModeEvents(environment, server); setupSignalHandlers(server); - logger.info(`\n${STATUS_ICONS.START} Starting Karma server in debug mode...`); + logger.verbose(`\n${STATUS_ICONS.START} Starting Karma server in debug mode...`); server.start(); }); } diff --git a/packages/nx-infra-plugin/src/executors/localization/executor.ts b/packages/nx-infra-plugin/src/executors/localization/executor.ts index bb5c60969203..787aea32c342 100644 --- a/packages/nx-infra-plugin/src/executors/localization/executor.ts +++ b/packages/nx-infra-plugin/src/executors/localization/executor.ts @@ -223,7 +223,7 @@ async function generateMessageFiles( const locales = getLocales(messagesDir); - logger.info(`Processing ${locales.length} locales...`); + logger.verbose(`Processing ${locales.length} locales...`); await Promise.all( locales.map(async (locale) => { @@ -414,13 +414,13 @@ const runExecutor: PromiseExecutor = async (options, } if (!skipMessageGeneration) { - logger.info('Generating localization message files...'); + logger.verbose('Generating localization message files...'); await generateMessageFiles(messagesDir, messageTemplate, messageOutputDir); - logger.info(`Message files generated in ${messageOutputDir}`); + logger.verbose(`Message files generated in ${messageOutputDir}`); } if (!skipCldrGeneration) { - logger.info('Generating CLDR TypeScript modules...'); + logger.verbose('Generating CLDR TypeScript modules...'); await generateCldrModules( absoluteProjectRoot, messagesDir, @@ -429,10 +429,10 @@ const runExecutor: PromiseExecutor = async (options, defaultMessagesOutputDir, lintGeneratedFiles, ); - logger.info(`CLDR modules generated in ${cldrDataOutputDir}`); + logger.verbose(`CLDR modules generated in ${cldrDataOutputDir}`); } - logger.info('Localization generation completed successfully'); + logger.verbose('Localization generation completed successfully'); return { success: true }; } catch (error) { logError('Localization executor failed', error); diff --git a/packages/nx-infra-plugin/src/executors/pack-npm/executor.ts b/packages/nx-infra-plugin/src/executors/pack-npm/executor.ts index 25b5edc84ec3..9deaacde7b4c 100644 --- a/packages/nx-infra-plugin/src/executors/pack-npm/executor.ts +++ b/packages/nx-infra-plugin/src/executors/pack-npm/executor.ts @@ -21,7 +21,7 @@ const runExecutor: PromiseExecutor = async (options, cont } try { - logger.info(`Running pnpm pack from ${absoluteProjectRoot} (packaging ${distDirectory})...`); + logger.verbose(`Running pnpm pack from ${absoluteProjectRoot} (packaging ${distDirectory})...`); const projectPath = path.join(workspaceRoot, 'packages', context.projectName); @@ -30,7 +30,7 @@ const runExecutor: PromiseExecutor = async (options, cont stdio: 'inherit', }); - logger.info(MSG_PACK_SUCCESS); + logger.verbose(MSG_PACK_SUCCESS); return { success: true }; } catch (error) { logError(MSG_PACK_FAILED, error); diff --git a/packages/nx-infra-plugin/src/executors/prepare-package-json/executor.ts b/packages/nx-infra-plugin/src/executors/prepare-package-json/executor.ts index 8315a808e821..afd664eac3b9 100644 --- a/packages/nx-infra-plugin/src/executors/prepare-package-json/executor.ts +++ b/packages/nx-infra-plugin/src/executors/prepare-package-json/executor.ts @@ -32,7 +32,7 @@ const runExecutor: PromiseExecutor = async (options, c const distPackageJson = path.join(distDirectory, PACKAGE_JSON_FILE); await writeJson(distPackageJson, pkg, JSON_INDENT); - logger.info(`Created ${distPackageJson}`); + logger.verbose(`Created ${distPackageJson}`); return { success: true }; } catch (error) { diff --git a/packages/nx-infra-plugin/src/executors/prepare-submodules/executor.ts b/packages/nx-infra-plugin/src/executors/prepare-submodules/executor.ts index cd955d3a5b42..299d10e21133 100644 --- a/packages/nx-infra-plugin/src/executors/prepare-submodules/executor.ts +++ b/packages/nx-infra-plugin/src/executors/prepare-submodules/executor.ts @@ -44,10 +44,10 @@ const runExecutor: PromiseExecutor = async (opt const distDirectory = path.join(absoluteProjectRoot, options.distDirectory || DEFAULT_DIST_DIR); try { - logger.info(MSG_PREPARING); + logger.verbose(MSG_PREPARING); if (options.submoduleFolders) { - logger.info( + logger.verbose( `Using custom submoduleFolders: ${JSON.stringify(options.submoduleFolders, null, 2)}`, ); } @@ -72,7 +72,7 @@ const runExecutor: PromiseExecutor = async (opt const allModuleParams: PackParam[] = [...packParamsForModules, ...packParamsForFolders]; - logger.info(`Processing ${allModuleParams.length} submodules...`); + logger.verbose(`Processing ${allModuleParams.length} submodules...`); await Promise.all( allModuleParams.map(([folder, moduleFileNames, moduleFilePath]) => @@ -80,7 +80,7 @@ const runExecutor: PromiseExecutor = async (opt ), ); - logger.info(MSG_SUCCESS); + logger.verbose(MSG_SUCCESS); return { success: true }; } catch (error) { logError(ERROR_PREPARE_SUBMODULES, error); From 216c6dc21357f3ab1fd1fadb46ea2515f9f1675a Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Thu, 15 Jan 2026 15:42:38 +0200 Subject: [PATCH 11/15] fix: eslint errors --- .../src/executors/karma-multi-env/executor.ts | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/nx-infra-plugin/src/executors/karma-multi-env/executor.ts b/packages/nx-infra-plugin/src/executors/karma-multi-env/executor.ts index f8c4a6727fcf..37b4969ced3f 100644 --- a/packages/nx-infra-plugin/src/executors/karma-multi-env/executor.ts +++ b/packages/nx-infra-plugin/src/executors/karma-multi-env/executor.ts @@ -422,7 +422,9 @@ const logTestResults = ( options: KarmaMultiEnvExecutorSchema, ): void => { if (options.watch) { - logger.verbose(`\n${STATUS_ICONS.WATCH} Watch mode active for: ${plan.executionOrder.join(', ')}`); + logger.verbose( + `\n${STATUS_ICONS.WATCH} Watch mode active for: ${plan.executionOrder.join(', ')}`, + ); if (options.verbose) { logger.verbose(`Karma config: ${options.karmaConfig}`); logger.verbose('Watching file changes...'); @@ -434,7 +436,9 @@ const logTestResults = ( logger.verbose('\n' + '='.repeat(50)); logger.verbose(`${STATUS_ICONS.DOCUMENTATION} TEST RESULTS SUMMARY`); logger.verbose('='.repeat(50)); - logger.verbose(`\n${STATUS_ICONS.SUCCESS} Environments tested: ${plan.executionOrder.join(', ')}`); + logger.verbose( + `\n${STATUS_ICONS.SUCCESS} Environments tested: ${plan.executionOrder.join(', ')}`, + ); logger.verbose(`${STATUS_ICONS.CLOCK} Total duration: ${summary.totalDuration}ms`); summary.results.forEach((result) => { @@ -470,7 +474,9 @@ const setupWatchModeEvents = (environment: KarmaEnvironment, server: any): void const statusIcon = results.success ? STATUS_ICONS.SUCCESS : STATUS_ICONS.FAILURE; const statusText = results.success ? 'All tests passed' : 'Some tests failed'; - logger.verbose(`\n[${environment.toUpperCase()}] Test run completed. Success: ${results.success}`); + logger.verbose( + `\n[${environment.toUpperCase()}] Test run completed. Success: ${results.success}`, + ); logger.verbose(`${statusIcon} ${statusText} in watch mode - continuing to watch...`); logger.verbose('Press CTRL+C to stop watching...'); }); From 47eb42adc520ae18cc5b5f03536de726743269fb Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Fri, 16 Jan 2026 16:36:21 +0200 Subject: [PATCH 12/15] fix: correctly lauch devextreme build in demos_visual_tests --- .github/workflows/demos_visual_tests.yml | 4 ++-- apps/demos/project.json | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/demos_visual_tests.yml b/.github/workflows/demos_visual_tests.yml index 819c33fda764..18703316797c 100644 --- a/.github/workflows/demos_visual_tests.yml +++ b/.github/workflows/demos_visual_tests.yml @@ -144,7 +144,7 @@ jobs: shell: bash run: | pnpx nx build devextreme-scss - pnpx nx build devextreme + pnpx nx build devextreme -c testing - name: DevExtreme - Build-all if: needs.determine-framework-tests-scope.outputs.framework-tests-scope != 'none' @@ -472,7 +472,7 @@ jobs: - name: Prepare JS working-directory: apps/demos - run: pnpm run prepare-js + run: pnpm run prepare-js -c testing - name: Check generated JS demos working-directory: apps/demos diff --git a/apps/demos/project.json b/apps/demos/project.json index 1bfb4686dd9a..1599675608ff 100644 --- a/apps/demos/project.json +++ b/apps/demos/project.json @@ -109,7 +109,7 @@ "script": "prepare-js" }, "dependsOn": [ - { "projects": ["devextreme"], "target": "build" }, + { "projects": ["devextreme"], "target": "build", "params": "forward" }, { "projects": ["devextreme-angular", "devextreme-react", "devextreme-vue"], "target": "pack" } ], "inputs": [ From 5d47a5e4cd7c3efc13bd50bb29ac457b967d8ec9 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Tue, 20 Jan 2026 15:52:29 +0200 Subject: [PATCH 13/15] chore: replace --configuration with -c --- .github/workflows/default_workflow.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/default_workflow.yml b/.github/workflows/default_workflow.yml index 8d6635151055..dab10b791215 100644 --- a/.github/workflows/default_workflow.yml +++ b/.github/workflows/default_workflow.yml @@ -56,7 +56,7 @@ jobs: run: > pnpx nx run-many -t lint,test - --configuration ci + -c ci --exclude devextreme devextreme-themebuilder From f75e7b4f82d47c976887bbafd8d2771c933862b1 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Tue, 20 Jan 2026 15:53:00 +0200 Subject: [PATCH 14/15] docs: update copilot-instructions.md --- .github/copilot-instructions.md | 68 +++++++++++++++++++++++++++++---- 1 file changed, 61 insertions(+), 7 deletions(-) diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index 1f7b8b1c0992..19d6a2b65412 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -10,7 +10,7 @@ - **Languages:** TypeScript, JavaScript, SCSS, C# (.NET for test runner) - **Package Manager:** pnpm 9.15.4 (specified in package.json) - **Node Version:** 20.x (required by CI) -- **Build System:** Gulp + Nx + custom build scripts +- **Build System:** Gulp + Nx + custom build scripts + custom Nx executors (via `devextreme-nx-infra-plugin`) - **Test Frameworks:** QUnit, Jest, TestCafe, Karma (Angular) ## Critical Setup Requirements @@ -70,6 +70,8 @@ pnpm install --frozen-lockfile devextreme-themebuilder/ # Theme builder package devextreme-metadata/ # Metadata generation for wrappers devextreme-monorepo-tools/ # Internal tooling + nx-infra-plugin/ # Custom Nx executors for build automation + workflows/ # Reusable CI/CD workflow configurations testcafe-models/ # TestCafe page object models /apps/ @@ -150,13 +152,27 @@ pnpm run clean ``` **Build process includes:** -1. Localization generation +1. Localization generation (via `devextreme-nx-infra-plugin:localization` executor) 2. Component generation (Renovation architecture) 3. Transpilation (Babel) -4. Bundle creation (Webpack) -5. TypeScript declarations +4. Bundle creation (Webpack) - `bundle:debug` and `bundle:prod` targets +5. TypeScript declarations - `build:declarations` target 6. SCSS compilation (from devextreme-scss) -7. NPM package preparation +7. NPM package preparation - `build:npm` target + +**Granular Nx build targets (can be run individually):** +```bash +pnpx nx build:localization devextreme # Generate localization files +pnpx nx build:transpile devextreme # Transpile source code +pnpx nx bundle:debug devextreme # Create debug bundle +pnpx nx bundle:prod devextreme # Create production bundle +pnpx nx build:npm devextreme # Prepare NPM packages +``` + +**Build with testing configuration (for CI):** +```bash +pnpx nx build devextreme -c=testing +``` **Important environment variables:** - `DEVEXTREME_TEST_CI=true` - Enables test mode (skips building npm package) @@ -164,6 +180,33 @@ pnpm run clean - `BUILD_TESTCAFE=true` - Builds for TestCafe tests - `BUILD_TEST_INTERNAL_PACKAGE=true` - Builds internal test package +## Custom Nx Executors (nx-infra-plugin) + +The `packages/nx-infra-plugin` provides custom Nx executors for build automation: + +| Executor | Description | +|----------|-------------| +| `localization` | Generates localization message files and TypeScript CLDR data modules | +| `add-license-headers` | Adds license headers to source files | +| `copy-files` | Copies files with glob pattern support | +| `clean` | Cleans directories with exclude pattern support | +| `build-typescript` | Builds TypeScript projects | +| `generate-components` | Generates Angular/React/Vue wrapper components | +| `karma-multi-env` | Runs Karma tests across multiple Angular environments | + +**Example executor usage in project.json:** +```json +{ + "build:localization:generate": { + "executor": "devextreme-nx-infra-plugin:localization", + "options": { + "messagesDir": "./js/localization/messages", + "cldrDataOutputDir": "./js/__internal/core/localization/cldr-data" + } + } +} +``` + ## Testing ### Test Types and Commands @@ -348,8 +391,8 @@ pnpm run lint-ts -- --fix - `packages/devextreme-react/src/**/*` (except templates) - `packages/devextreme-vue/src/**/*` (except templates) - `packages/devextreme/js/renovation/**/*.j.tsx` -- `packages/devextreme/js/common/core/localization/default_messages.js` -- `packages/devextreme/js/common/core/localization/cldr-data/**/*` +- `packages/devextreme/js/__internal/core/localization/default_messages.ts` +- `packages/devextreme/js/__internal/core/localization/cldr-data/**/*` **Source files (EDIT THESE):** - `packages/devextreme/js/**/*.js` (core logic) @@ -378,6 +421,7 @@ pnpm run lint-ts -- --fix ## Key Facts - **Nx is used for task orchestration** - prefer `pnpx nx` commands over direct npm scripts +- **Custom Nx executors** - `devextreme-nx-infra-plugin` provides specialized executors for localization, file operations, and build tasks - **Frozen lockfile is mandatory** - CI will fail without it - **Build artifacts are in gitignore** - never commit `artifacts/` directories - **Wrappers are generated** - modify generators, not generated code @@ -385,6 +429,7 @@ pnpm run lint-ts -- --fix - **Monorepo uses pnpm workspaces** - dependencies are hoisted - **CI uses custom runners** - `devextreme-shr2` for most jobs, `ubuntu-latest` for some - **Timeouts are strict** - optimize for speed, use caching +- **Granular build caching** - individual build steps have proper Nx caching for faster rebuilds ## Quick Reference @@ -398,6 +443,14 @@ pnpm run all:build-dev # Build (prod) pnpm run all:build +# Build with testing configuration (for CI) +pnpx nx build devextreme -c=testing + +# Build specific targets +pnpx nx build:localization devextreme +pnpx nx build:transpile devextreme +pnpx nx bundle:debug devextreme + # Test pnpx nx run-many -t test pnpm run test-jest # From devextreme package @@ -411,6 +464,7 @@ pnpm run regenerate-all # Clean pnpm run clean # From devextreme package +pnpx nx clean:artifacts devextreme # Clean build artifacts only # Run demos pnpm run webserver # From root, then visit localhost:8080 From bad76be0671342f51f42b0b0a639d387c2f81511 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Tue, 20 Jan 2026 17:05:37 +0200 Subject: [PATCH 15/15] chore: remove unnecessary configuraiton option --- .github/workflows/demos_visual_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/demos_visual_tests.yml b/.github/workflows/demos_visual_tests.yml index 18703316797c..4f0f2a1770df 100644 --- a/.github/workflows/demos_visual_tests.yml +++ b/.github/workflows/demos_visual_tests.yml @@ -472,7 +472,7 @@ jobs: - name: Prepare JS working-directory: apps/demos - run: pnpm run prepare-js -c testing + run: pnpm run prepare-js - name: Check generated JS demos working-directory: apps/demos