diff --git a/nx.json b/nx.json index b01fcc405b86..b3a04d424f8f 100644 --- a/nx.json +++ b/nx.json @@ -45,5 +45,6 @@ "defaultBase": "master", "tui": { "enabled": false - } + }, + "analytics": false } diff --git a/package.json b/package.json index 6c080e3c39e3..2473a3917d19 100644 --- a/package.json +++ b/package.json @@ -29,9 +29,9 @@ "nx": {}, "private": true, "devDependencies": { - "@nx/devkit": "22.4.5", - "@nx/jest": "22.4.5", - "@nx/js": "22.4.5", + "@nx/devkit": "22.7.0", + "@nx/jest": "22.7.0", + "@nx/js": "22.7.0", "@types/jest": "29.5.14", "@types/node": "20.12.8", "@types/shelljs": "0.8.15", @@ -48,7 +48,7 @@ "jest": "29.7.0", "jspdf-autotable": "3.8.4", "lint-staged": "14.0.1", - "nx": "22.4.5", + "nx": "22.7.0", "nx-cloud": "19.1.0", "postcss": "8.5.10", "shelljs": "0.8.5", diff --git a/packages/devextreme/build/gulp/aspnet.js b/packages/devextreme/build/gulp/aspnet.js deleted file mode 100644 index 3053f35333d6..000000000000 --- a/packages/devextreme/build/gulp/aspnet.js +++ /dev/null @@ -1,18 +0,0 @@ -'use strict'; - -const gulp = require('gulp'); -const merge = require('merge-stream'); -const rename = require('gulp-rename'); -const headerPipes = require('./header-pipes.js'); -const compressionPipes = require('./compression-pipes.js'); -const context = require('./context'); - -gulp.task('aspnet', function() { - return merge( - gulp.src('./js/aspnet.js') - .pipe(rename('dx.aspnet.mvc.js')) - .pipe(compressionPipes.beautify()) - .pipe(headerPipes.bangLicense()) - .pipe(gulp.dest(context.RESULT_JS_PATH)) - ); -}); diff --git a/packages/devextreme/build/gulp/compression-pipes.js b/packages/devextreme/build/gulp/compression-pipes.js deleted file mode 100644 index 4d0d6a4841fe..000000000000 --- a/packages/devextreme/build/gulp/compression-pipes.js +++ /dev/null @@ -1,82 +0,0 @@ -'use strict'; - -const lazyPipe = require('lazypipe'); -const replace = require('gulp-replace'); -const uglify = require('gulp-uglify-es').default; -const gulpIf = require('gulp-if'); -const eol = require('gulp-eol'); -const prettify = require('gulp-jsbeautifier'); - -const context = require('./context.js'); - -// NOTE: -// Removes the #DEBUG section from the code in the production build. -// E.g. removes the next code: -// //#DEBUG -// // some code. -// //#ENDDEBUG -// Between comment slashes (/) and # may be space symbols (count doesn't matter). -const removeDebug = lazyPipe().pipe(function() { - return replace(/\/{2,}\s{0,}#DEBUG[\s\S]*?\/{2,}\s{0,}#ENDDEBUG/g, ''); -}); - -function saveLicenseComments(node, comment) { - return comment.value.charAt(0) === '!' - // Workaround for rrule, on v2.7.1 the space char was added to the license header https://github.com/jakubroztocil/rrule/commit/803c03b85ac074d92d443306805a68e104069c02#diff-a2a171449d862fe29692ce031981047d7ab755ae7f84c707aef80701b3ea0c80R1 - || comment.value.startsWith(' !') - || comment.value.indexOf(context.EULA_URL) > -1; -} - -module.exports = { - - removeDebug: removeDebug, - - minify: lazyPipe() - .pipe(removeDebug) - .pipe(function() { - return gulpIf(context.uglify, uglify({ - output: { - ascii_only: true, - comments: saveLicenseComments - } - })); - }) - .pipe(eol), - - beautify: lazyPipe() - .pipe(function() { - return gulpIf(context.uglify, uglify({ - mangle: false, - warnings: false, - compress: { - 'sequences': false, - 'properties': true, - 'dead_code': true, - 'drop_debugger': true, - 'unsafe': false, - 'conditionals': false, - 'comparisons': false, - 'evaluate': true, - 'booleans': false, - 'loops': false, - 'unused': true, - 'hoist_funs': false, - 'hoist_vars': false, - 'if_return': false, - 'join_vars': false, - 'collapse_vars': false, - 'side_effects': false, - 'global_defs': {} - }, - output: { - 'braces': true, - 'ascii_only': true, - comments: saveLicenseComments - } - })); - }) - .pipe(function() { - return gulpIf(context.uglify, prettify()); - }) - .pipe(eol) -}; diff --git a/packages/devextreme/build/gulp/js-bundles.js b/packages/devextreme/build/gulp/js-bundles.js index 875f779191c1..a25e4119390b 100644 --- a/packages/devextreme/build/gulp/js-bundles.js +++ b/packages/devextreme/build/gulp/js-bundles.js @@ -7,10 +7,10 @@ const named = require('vinyl-named'); const notify = require('gulp-notify'); const path = require('path'); const plumber = require('gulp-plumber'); +const shell = require('gulp-shell'); const webpack = require('webpack'); const webpackStream = require('webpack-stream'); -const compressionPipes = require('./compression-pipes.js'); const ctx = require('./context.js'); const headerPipes = require('./header-pipes.js'); const webpackConfig = require('../../webpack.config.js'); @@ -42,26 +42,11 @@ const getWebpackConfig = () => { return Object.assign(webpackConfig, { plugins }); }; -const bundleProdPipe = lazyPipe() - .pipe(named) - .pipe(() => webpackStream(getWebpackConfig(), webpack, muteWebPack)) - .pipe(headerPipes.useStrict) - .pipe(headerPipes.bangLicense) - .pipe(compressionPipes.minify); - -const jsBundlesProd = (src, dist, bundles) => (() => - gulp.src(processBundles(bundles, src)) - .pipe(bundleProdPipe()) - .pipe(gulp.dest(dist)) -); - -gulp.task('js-bundles-prod', - jsBundlesProd( - ctx.TRANSPILED_PROD_RENOVATION_PATH, - ctx.RESULT_JS_PATH, - BUNDLES, - ) -); +gulp.task('js-bundles-prod', shell.task( + ctx.uglify + ? 'pnpm nx run devextreme:bundle:prod -c production' + : 'pnpm nx run devextreme:bundle:prod' +)); function prepareDebugMeta(watch) { const debugConfig = Object.assign({ watch }, getWebpackConfig()); @@ -94,7 +79,6 @@ function createDebugBundlesStream(watch, displayName) { .pipe(webpackStream(debugConfig, webpack, muteWebPack)) .pipe(headerPipes.useStrict()) .pipe(headerPipes.bangLicense()) - .pipe(gulpIf(!watch, compressionPipes.beautify())) .pipe(gulp.dest(destination)); task.displayName = `${displayName}-worker`; @@ -102,8 +86,10 @@ function createDebugBundlesStream(watch, displayName) { return task; } -gulp.task('js-bundles-debug', gulp.series( - createDebugBundlesStream(false, 'js-bundles-debug') +gulp.task('js-bundles-debug', shell.task( + ctx.uglify + ? 'pnpm nx run devextreme:bundle:debug -c production' + : 'pnpm nx run devextreme:bundle:debug' )); gulp.task('js-bundles-watch', gulp.parallel( diff --git a/packages/devextreme/build/gulp/npm.js b/packages/devextreme/build/gulp/npm.js index 4d86312f39b1..fad07d2b4b24 100644 --- a/packages/devextreme/build/gulp/npm.js +++ b/packages/devextreme/build/gulp/npm.js @@ -11,8 +11,8 @@ const replace = require('gulp-replace'); const lazyPipe = require('lazypipe'); const gulpFilter = require('gulp-filter'); const gulpRename = require('gulp-rename'); +const shell = require('gulp-shell'); -const compressionPipes = require('./compression-pipes.js'); const ctx = require('./context.js'); const env = require('./env-variables.js'); const dataUri = require('./gulp-data-uri').gulpPipe; @@ -96,7 +96,6 @@ const sources = (src, dist, distGlob) => (() => merge( .src(src) .pipe(licenseValidator()) .pipe(headerPipes.starLicense()) - .pipe(compressionPipes.beautify()) .pipe(gulp.dest(dist)), gulp @@ -181,7 +180,12 @@ gulp.task('npm-sources', gulp.series( .src('../devextreme-dist/LICENSE.md') .pipe(gulp.dest(distPath)), ), - sources(srcGlobs, packagePath, distGlobs)) + sources(srcGlobs, packagePath, distGlobs), + shell.task( + ctx.uglify + ? 'pnpm nx run devextreme:compress:npm-sources -c production' + : 'pnpm nx run devextreme:compress:npm-sources' + )) ); gulp.task('npm-dist', () => gulp diff --git a/packages/devextreme/build/gulp/transpile.js b/packages/devextreme/build/gulp/transpile.js index 30af8ab122ba..67a75ca37d59 100644 --- a/packages/devextreme/build/gulp/transpile.js +++ b/packages/devextreme/build/gulp/transpile.js @@ -5,14 +5,16 @@ const gulp = require('gulp'); const notify = require('gulp-notify'); const path = require('path'); const plumber = require('gulp-plumber'); +const replace = require('gulp-replace'); const watch = require('gulp-watch'); -const removeDebug = require('./compression-pipes.js').removeDebug; const ctx = require('./context.js'); const testsConfig = require('../../testing/tests.babelrc.json'); const transpileConfig = require('./transpile-config'); const createTsCompiler = require('./typescript/compiler'); +const REMOVE_DEBUG_REGEXP = /\/{2,}\s{0,}#DEBUG[\s\S]*?\/{2,}\s{0,}#ENDDEBUG/g; + const src = [ 'js/**/*.*', '!js/**/*.d.ts', @@ -48,7 +50,7 @@ const watchJsTask = () => { .pipe(babel(transpileConfig.cjs)) .pipe(gulp.dest(ctx.TRANSPILED_PATH)); watchTask - .pipe(removeDebug()) + .pipe(replace(REMOVE_DEBUG_REGEXP, '')) .pipe(babel(transpileConfig.cjs)) .pipe(gulp.dest(ctx.TRANSPILED_PROD_RENOVATION_PATH)); return watchTask; @@ -67,7 +69,7 @@ const watchTsTask = async() => { })) .pipe(babel(transpileConfig.tsCjs)) .pipe(gulp.dest(ctx.TRANSPILED_PATH)) - .pipe(removeDebug()) + .pipe(replace(REMOVE_DEBUG_REGEXP, '')) .pipe(gulp.dest(ctx.TRANSPILED_PROD_RENOVATION_PATH)); }; watchTsTask.displayName = 'transpile TS watch'; diff --git a/packages/devextreme/build/gulp/ts.js b/packages/devextreme/build/gulp/ts.js index 89d9cf282c47..255c48c0b25e 100644 --- a/packages/devextreme/build/gulp/ts.js +++ b/packages/devextreme/build/gulp/ts.js @@ -6,10 +6,10 @@ const footer = require('gulp-footer'); const concat = require('gulp-concat'); const path = require('path'); const replace = require('gulp-replace'); +const shell = require('gulp-shell'); const ts = require('gulp-typescript'); const context = require('./context.js'); const headerPipes = require('./header-pipes.js'); -const compressionPipes = require('./compression-pipes.js'); const MODULES = require('./modules_metadata.json'); const { packageDir } = require('./utils'); @@ -105,26 +105,27 @@ gulp.task('ts-check-modules', function() { .pipe(compileTS()); }); -gulp.task('ts-copy-modules', function() { - const BUNDLE_IMPORT = 'import DevExpress from \'../bundles/dx.all\';'; - - return gulp.src(src) - /* legacy modules */ - .pipe(file('events/click.d.ts', BUNDLE_IMPORT)) - .pipe(file('events/contextmenu.d.ts', BUNDLE_IMPORT)) - .pipe(file('events/dblclick.d.ts', BUNDLE_IMPORT)) - .pipe(file('events/drag.d.ts', BUNDLE_IMPORT)) - .pipe(file('events/hold.d.ts', BUNDLE_IMPORT)) - .pipe(file('events/hover.d.ts', BUNDLE_IMPORT)) - .pipe(file('events/pointer.d.ts', BUNDLE_IMPORT)) - .pipe(file('events/swipe.d.ts', BUNDLE_IMPORT)) - .pipe(file('events/transform.d.ts', BUNDLE_IMPORT)) - .pipe(file('integration/jquery.d.ts', 'import \'jquery\';')) - - .pipe(compressionPipes.removeDebug()) - .pipe(headerPipes.starLicense()) - .pipe(gulp.dest(packagePath)); -}); +gulp.task('ts-copy-modules', gulp.series( + function tsCopyModulesCopy() { + const BUNDLE_IMPORT = 'import DevExpress from \'../bundles/dx.all\';'; + + return gulp.src(src) + /* legacy modules */ + .pipe(file('events/click.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/contextmenu.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/dblclick.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/drag.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/hold.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/hover.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/pointer.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/swipe.d.ts', BUNDLE_IMPORT)) + .pipe(file('events/transform.d.ts', BUNDLE_IMPORT)) + .pipe(file('integration/jquery.d.ts', 'import \'jquery\';')) + .pipe(headerPipes.starLicense()) + .pipe(gulp.dest(packagePath)); + }, + shell.task('pnpm nx run devextreme:compress:ts-modules') +)); gulp.task('ts-sources', gulp.series('ts-copy-modules', 'ts-copy-bundle')); diff --git a/packages/devextreme/build/gulp/vendor.js b/packages/devextreme/build/gulp/vendor.js deleted file mode 100644 index 6f11c1078a78..000000000000 --- a/packages/devextreme/build/gulp/vendor.js +++ /dev/null @@ -1,103 +0,0 @@ -'use strict'; - -const gulp = require('gulp'); -const path = require('path'); -const rename = require('gulp-rename'); -const merge = require('merge-stream'); -const compressionPipes = require('./compression-pipes.js'); -const context = require('./context'); - -const PACKAGES_SOURCE = './node_modules'; -const DESTINATION_JS_PATH = './' + context.RESULT_JS_PATH; -const DESTINATION_CSS_PATH = './artifacts/css'; - -const JS_VENDORS = [ - { - path: 'devextreme-exceljs-fork/dist/dx-exceljs-fork.js' - }, - { - path: 'file-saver/dist/FileSaver.js' - }, - { - path: 'jquery' - }, - { - path: 'jspdf/dist/jspdf.umd.js' - }, - { - path: 'jspdf-autotable' - }, - { - path: 'jszip/dist/jszip.js' - }, - { - path: 'knockout/build/output/knockout-latest.js', - suffix: 'debug' - }, - { - path: 'devexpress-diagram/dist/dx-diagram.js' - }, - { - path: 'devexpress-diagram/dist/dx-diagram.min.js' - }, - { - path: 'devexpress-gantt/dist/dx-gantt.js' - }, - { - path: 'devexpress-gantt/dist/dx-gantt.min.js' - }, - { - path: 'devextreme-quill/dist/dx-quill.js' - }, - { - path: 'devextreme-quill/dist/dx-quill.min.js' - }, - { - path: 'devextreme-aspnet-data/js/dx.aspnet.data.js', - skipUglify: true, - } -]; - -const CSS_VENDORS = [ - { - path: '/devexpress-diagram/dist/dx-@(diagram|diagram.min).css' - }, - { - path: '/devexpress-gantt/dist/dx-@(gantt|gantt.min).css' - } -]; - -gulp.task('vendor-js', function() { - return merge.apply(this, JS_VENDORS.map(function(vendor) { - const sourceConfig = vendor.base ? { dir: PACKAGES_SOURCE + vendor.base } : null; - const vendorSource = require.resolve(vendor.path); - const dest = vendor.dir ? `${DESTINATION_JS_PATH}/${vendor.dir}` : DESTINATION_JS_PATH; - const stream = gulp.src(vendorSource, sourceConfig) - .pipe(gulp.dest(dest)); - - if(vendor.skipUglify) { - return stream; - } - - if(vendor.noUglyFile) { - return stream - .pipe(compressionPipes.minify()) - .pipe(rename({ suffix: '.min' })) - .pipe(gulp.dest(dest)); - } - - const path = vendorSource.replace(/(min\.)?js$/, `${vendor.suffix || 'min'}.js`); - - return merge(stream, gulp.src(path, sourceConfig) - .pipe(gulp.dest(dest)) - ); - })); -}); - -gulp.task('vendor-css', function() { - return merge.apply(this, CSS_VENDORS.map(function(vendor) { - return gulp.src(path.resolve(__dirname, '../../', PACKAGES_SOURCE) + vendor.path).pipe(gulp.dest(DESTINATION_CSS_PATH)); - })); -}); - -gulp.task('vendor', gulp.parallel('vendor-js', 'vendor-css')); diff --git a/packages/devextreme/gulpfile.js b/packages/devextreme/gulpfile.js index e67977a0ba9b..984131a46c4b 100644 --- a/packages/devextreme/gulpfile.js +++ b/packages/devextreme/gulpfile.js @@ -32,8 +32,6 @@ require('./build/gulp/bundler-config'); require('./build/gulp/transpile'); require('./build/gulp/js-bundles'); require('./build/gulp/npm'); -require('./build/gulp/aspnet'); -require('./build/gulp/vendor'); require('./build/gulp/ts'); require('./build/gulp/localization'); require('./build/gulp/check_licenses'); @@ -66,6 +64,14 @@ gulp.task('vectormap', shell.task( : 'pnpm nx run devextreme:build:vectormap' )); +gulp.task('aspnet', shell.task( + context.uglify + ? 'pnpm nx run devextreme:build:aspnet -c production' + : 'pnpm nx run devextreme:build:aspnet' +)); + +gulp.task('vendor', shell.task('pnpm nx run devextreme:copy:vendor')); + if(env.TEST_CI) { console.warn('Using test CI mode!'); } diff --git a/packages/devextreme/package.json b/packages/devextreme/package.json index 7a428c1e06eb..14698f44d5f8 100644 --- a/packages/devextreme/package.json +++ b/packages/devextreme/package.json @@ -154,7 +154,6 @@ "gulp-footer": "2.1.0", "gulp-header": "2.0.9", "gulp-if": "3.0.0", - "gulp-jsbeautifier": "2.1.2", "gulp-json-editor": "2.6.0", "gulp-multi-process": "1.4.0", "gulp-notify": "4.0.0", @@ -167,7 +166,6 @@ "gulp-tap": "1.0.1", "gulp-template": "5.0.0", "gulp-typescript": "5.0.1", - "gulp-uglify-es": "3.0.0", "gulp-watch": "5.0.1", "ignore": "5.3.2", "intl": "1.2.5", diff --git a/packages/devextreme/project.json b/packages/devextreme/project.json index 76ed204fa83d..fe3ac535430c 100644 --- a/packages/devextreme/project.json +++ b/packages/devextreme/project.json @@ -551,6 +551,11 @@ "mode": "debug", "webpackConfigPath": "./webpack.config.js" }, + "configurations": { + "production": { + "sourceMap": false + } + }, "inputs": [ { "env": "BUILD_TEST_INTERNAL_PACKAGE" @@ -602,10 +607,20 @@ "options": { "commands": [ "pnpm nx bundle:debug:build devextreme", - "pnpm nx bundle:headers devextreme" + "pnpm nx bundle:headers devextreme", + "pnpm nx compress:bundles:debug devextreme" ], "parallel": false }, + "configurations": { + "production": { + "commands": [ + "pnpm nx bundle:debug:build devextreme -c production", + "pnpm nx bundle:headers devextreme", + "pnpm nx compress:bundles:debug devextreme -c production" + ] + } + }, "inputs": [ { "env": "BUILD_TEST_INTERNAL_PACKAGE" @@ -615,11 +630,7 @@ "{projectRoot}/build/gulp/license-header.txt" ], "outputs": [ - "{projectRoot}/artifacts/js/dx.all.debug.js", - "{projectRoot}/artifacts/js/dx.web.debug.js", - "{projectRoot}/artifacts/js/dx.viz.debug.js", - "{projectRoot}/artifacts/js/dx.ai-integration.debug.js", - "{projectRoot}/artifacts/js/dx.custom.debug.js" + "{projectRoot}/artifacts/js/dx.{all,web,viz,ai-integration,custom}.debug.js" ] }, "bundle:prod:build": { @@ -645,10 +656,7 @@ "{projectRoot}/webpack.config.js" ], "outputs": [ - "{projectRoot}/artifacts/js/dx.all.js", - "{projectRoot}/artifacts/js/dx.web.js", - "{projectRoot}/artifacts/js/dx.viz.js", - "{projectRoot}/artifacts/js/dx.ai-integration.js" + "{projectRoot}/artifacts/js/dx.{all,web,viz,ai-integration}.js" ] }, "bundle:prod": { @@ -656,10 +664,20 @@ "options": { "commands": [ "pnpm nx bundle:prod:build devextreme", - "pnpm nx bundle:headers devextreme -c prod" + "pnpm nx bundle:headers devextreme -c prod", + "pnpm nx compress:bundles:prod devextreme" ], "parallel": false }, + "configurations": { + "production": { + "commands": [ + "pnpm nx bundle:prod:build devextreme", + "pnpm nx bundle:headers devextreme -c prod", + "pnpm nx compress:bundles:prod devextreme -c production" + ] + } + }, "inputs": [ { "env": "BUILD_TEST_INTERNAL_PACKAGE" @@ -669,10 +687,60 @@ "{projectRoot}/build/gulp/license-header.txt" ], "outputs": [ - "{projectRoot}/artifacts/js/dx.all.js", - "{projectRoot}/artifacts/js/dx.web.js", - "{projectRoot}/artifacts/js/dx.viz.js", - "{projectRoot}/artifacts/js/dx.ai-integration.js" + "{projectRoot}/artifacts/js/dx.{all,web,viz,ai-integration}.js" + ] + }, + "compress:bundles:prod": { + "executor": "devextreme-nx-infra-plugin:compress", + "options": { + "files": [ + "./artifacts/js/dx.all.js", + "./artifacts/js/dx.web.js", + "./artifacts/js/dx.viz.js", + "./artifacts/js/dx.ai-integration.js" + ], + "mode": { "name": "strip-debug", "trailingNewline": false } + }, + "configurations": { + "production": { + "mode": { + "name": "minify", + "eulaUrl": "https://js.devexpress.com/Licensing/" + } + } + }, + "inputs": [ + "prodBundles" + ], + "outputs": [ + "{projectRoot}/artifacts/js/dx.{all,web,viz,ai-integration}.js" + ] + }, + "compress:bundles:debug": { + "executor": "devextreme-nx-infra-plugin:compress", + "options": { + "files": [ + "./artifacts/js/dx.all.debug.js", + "./artifacts/js/dx.web.debug.js", + "./artifacts/js/dx.viz.debug.js", + "./artifacts/js/dx.ai-integration.debug.js", + "./artifacts/js/dx.custom.debug.js" + ], + "mode": { "name": "normalize", "trailingNewline": false } + }, + "configurations": { + "production": { + "mode": { + "name": "beautify", + "eulaUrl": "https://js.devexpress.com/Licensing/" + } + } + }, + "inputs": [ + "debugBundles" + ], + "outputs": [ + "{projectRoot}/artifacts/js/dx.{all,web,viz,ai-integration,custom}.debug.js" ] }, "build:vectormap:generate": { @@ -721,7 +789,7 @@ "files": [ "./artifacts/js/vectormap-utils/dx.vectormaputils.js" ], - "mode": "strip-only" + "mode": "strip-debug" } }, "compress:vectormap:beautify": { @@ -730,8 +798,7 @@ "files": [ "./artifacts/js/vectormap-utils/dx.vectormaputils.debug.js" ], - "mode": "beautify", - "eulaUrl": "https://js.devexpress.com/Licensing/" + "mode": { "name": "beautify", "eulaUrl": "https://js.devexpress.com/Licensing/" } } }, "compress:vectormap:minify": { @@ -740,9 +807,7 @@ "files": [ "./artifacts/js/vectormap-utils/dx.vectormaputils.js" ], - "mode": "minify", - "removeDebug": true, - "eulaUrl": "https://js.devexpress.com/Licensing/" + "mode": { "name": "minify", "eulaUrl": "https://js.devexpress.com/Licensing/" } } }, "build:vectormap": { @@ -777,18 +842,65 @@ } } }, - "build:aspnet": { - "executor": "nx:run-commands", + "build:aspnet:copy": { + "executor": "devextreme-nx-infra-plugin:copy-files", "options": { - "command": "gulp aspnet", - "cwd": "{projectRoot}" + "files": [ + { "from": "./js/aspnet.js", "to": "./artifacts/js/dx.aspnet.mvc.js" } + ] + }, + "inputs": ["{projectRoot}/js/aspnet.js"], + "outputs": ["{projectRoot}/artifacts/js/dx.aspnet.mvc.js"] + }, + "compress:aspnet:normalize": { + "executor": "devextreme-nx-infra-plugin:compress", + "options": { + "files": ["./artifacts/js/dx.aspnet.mvc.js"], + "mode": "normalize" + } + }, + "compress:aspnet": { + "executor": "devextreme-nx-infra-plugin:compress", + "options": { + "files": ["./artifacts/js/dx.aspnet.mvc.js"], + "mode": { "name": "beautify", "eulaUrl": "https://js.devexpress.com/Licensing/" } + } + }, + "build:aspnet:headers": { + "executor": "devextreme-nx-infra-plugin:add-license-headers", + "options": { + "targetDirectory": "./artifacts/js", + "licenseTemplateFile": "./build/gulp/license-header.txt", + "eulaUrl": "https://js.devexpress.com/Licensing/", + "includePatterns": ["dx.aspnet.mvc.js"], + "separatorBetweenBannerAndContent": "" }, "inputs": [ - "{projectRoot}/build/gulp/aspnet.js" + "{projectRoot}/artifacts/js/dx.aspnet.mvc.js", + "{projectRoot}/build/gulp/license-header.txt" ], - "outputs": [ - "{projectRoot}/artifacts/js/aspnet" - ] + "outputs": ["{projectRoot}/artifacts/js/dx.aspnet.mvc.js"] + }, + "build:aspnet": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "pnpm nx build:aspnet:copy devextreme", + "pnpm nx compress:aspnet:normalize devextreme", + "pnpm nx build:aspnet:headers devextreme" + ], + "parallel": false + }, + "configurations": { + "production": { + "commands": [ + "pnpm nx build:aspnet:copy devextreme", + "pnpm nx compress:aspnet devextreme", + "pnpm nx build:aspnet:headers devextreme" + ] + } + }, + "outputs": ["{projectRoot}/artifacts/js/dx.aspnet.mvc.js"] }, "build:declarations": { "executor": "nx:run-commands", @@ -804,6 +916,49 @@ "{projectRoot}/artifacts/ts" ] }, + "compress:ts-modules": { + "executor": "devextreme-nx-infra-plugin:compress", + "options": { + "files": ["./artifacts/npm/devextreme/**/*.d.ts"], + "exclude": ["./artifacts/npm/devextreme/bundles/**"], + "mode": { "name": "strip-debug", "trailingNewline": false } + }, + "inputs": [ + "{projectRoot}/artifacts/npm/devextreme/**/*.d.ts" + ], + "outputs": [ + "{projectRoot}/artifacts/npm/devextreme/**/*.d.ts" + ] + }, + "compress:npm-sources": { + "executor": "devextreme-nx-infra-plugin:compress", + "options": { + "files": ["./artifacts/npm/devextreme/**/*.js"], + "exclude": [ + "./artifacts/npm/devextreme/bundles/*.js", + "./artifacts/npm/devextreme/cjs/bundles/**", + "./artifacts/npm/devextreme/esm/bundles/**", + "./artifacts/npm/devextreme/bundles/modules/parts/*.js", + "./artifacts/npm/devextreme/viz/vector_map.utils/*.js", + "./artifacts/npm/devextreme/viz/docs/*.js", + "./artifacts/npm/devextreme/dist/**", + "./artifacts/npm/devextreme/bin/**", + "./artifacts/npm/devextreme/license/**" + ], + "mode": "normalize" + }, + "configurations": { + "production": { + "mode": { "name": "beautify", "eulaUrl": "https://js.devexpress.com/Licensing/" } + } + }, + "inputs": [ + "{projectRoot}/artifacts/npm/devextreme/**/*.js" + ], + "outputs": [ + "{projectRoot}/artifacts/npm/devextreme/**/*.js" + ] + }, "verify:licenses": { "executor": "nx:run-commands", "options": { @@ -811,17 +966,115 @@ "cwd": "{projectRoot}" } }, - "copy:vendor": { - "executor": "nx:run-commands", + "copy:vendor:js": { + "executor": "devextreme-nx-infra-plugin:copy-files", "options": { - "command": "gulp vendor", - "cwd": "{projectRoot}" + "files": [ + { "from": "./node_modules/devextreme-exceljs-fork/dist/dx-exceljs-fork.js", "to": "./artifacts/js/dx-exceljs-fork.js" }, + { "from": "./node_modules/devextreme-exceljs-fork/dist/dx-exceljs-fork.min.js", "to": "./artifacts/js/dx-exceljs-fork.min.js" }, + { "from": "./node_modules/file-saver/dist/FileSaver.js", "to": "./artifacts/js/FileSaver.js" }, + { "from": "./node_modules/file-saver/dist/FileSaver.min.js", "to": "./artifacts/js/FileSaver.min.js" }, + { "from": "./node_modules/jquery/dist/jquery.js", "to": "./artifacts/js/jquery.js" }, + { "from": "./node_modules/jquery/dist/jquery.min.js", "to": "./artifacts/js/jquery.min.js" }, + { "from": "./node_modules/jspdf/dist/jspdf.umd.js", "to": "./artifacts/js/jspdf.umd.js" }, + { "from": "./node_modules/jspdf/dist/jspdf.umd.min.js", "to": "./artifacts/js/jspdf.umd.min.js" }, + { "from": "./node_modules/jspdf-autotable/dist/jspdf.plugin.autotable.js", "to": "./artifacts/js/jspdf.plugin.autotable.js" }, + { "from": "./node_modules/jspdf-autotable/dist/jspdf.plugin.autotable.min.js", "to": "./artifacts/js/jspdf.plugin.autotable.min.js" }, + { "from": "./node_modules/jszip/dist/jszip.js", "to": "./artifacts/js/jszip.js" }, + { "from": "./node_modules/jszip/dist/jszip.min.js", "to": "./artifacts/js/jszip.min.js" }, + { "from": "./node_modules/knockout/build/output/knockout-latest.js", "to": "./artifacts/js/knockout-latest.js" }, + { "from": "./node_modules/knockout/build/output/knockout-latest.debug.js", "to": "./artifacts/js/knockout-latest.debug.js" }, + { "from": "./node_modules/devexpress-diagram/dist/dx-diagram.js", "to": "./artifacts/js/dx-diagram.js" }, + { "from": "./node_modules/devexpress-diagram/dist/dx-diagram.min.js", "to": "./artifacts/js/dx-diagram.min.js" }, + { "from": "./node_modules/devexpress-gantt/dist/dx-gantt.js", "to": "./artifacts/js/dx-gantt.js" }, + { "from": "./node_modules/devexpress-gantt/dist/dx-gantt.min.js", "to": "./artifacts/js/dx-gantt.min.js" }, + { "from": "./node_modules/devextreme-quill/dist/dx-quill.js", "to": "./artifacts/js/dx-quill.js" }, + { "from": "./node_modules/devextreme-quill/dist/dx-quill.min.js", "to": "./artifacts/js/dx-quill.min.js" }, + { "from": "./node_modules/devextreme-aspnet-data/js/dx.aspnet.data.js", "to": "./artifacts/js/dx.aspnet.data.js" } + ] + }, + "inputs": [ + "{projectRoot}/package.json", + "{workspaceRoot}/pnpm-lock.yaml" + ], + "outputs": [ + "{projectRoot}/artifacts/js/dx-exceljs-fork.js", + "{projectRoot}/artifacts/js/dx-exceljs-fork.min.js", + "{projectRoot}/artifacts/js/FileSaver.js", + "{projectRoot}/artifacts/js/FileSaver.min.js", + "{projectRoot}/artifacts/js/jquery.js", + "{projectRoot}/artifacts/js/jquery.min.js", + "{projectRoot}/artifacts/js/jspdf.umd.js", + "{projectRoot}/artifacts/js/jspdf.umd.min.js", + "{projectRoot}/artifacts/js/jspdf.plugin.autotable.js", + "{projectRoot}/artifacts/js/jspdf.plugin.autotable.min.js", + "{projectRoot}/artifacts/js/jszip.js", + "{projectRoot}/artifacts/js/jszip.min.js", + "{projectRoot}/artifacts/js/knockout-latest.js", + "{projectRoot}/artifacts/js/knockout-latest.debug.js", + "{projectRoot}/artifacts/js/dx-diagram.js", + "{projectRoot}/artifacts/js/dx-diagram.min.js", + "{projectRoot}/artifacts/js/dx-gantt.js", + "{projectRoot}/artifacts/js/dx-gantt.min.js", + "{projectRoot}/artifacts/js/dx-quill.js", + "{projectRoot}/artifacts/js/dx-quill.min.js", + "{projectRoot}/artifacts/js/dx.aspnet.data.js" + ] + }, + "copy:vendor:css": { + "executor": "devextreme-nx-infra-plugin:copy-files", + "options": { + "files": [ + { "from": "./node_modules/devexpress-diagram/dist/dx-{diagram,diagram.min}.css", "to": "./artifacts/css" }, + { "from": "./node_modules/devexpress-gantt/dist/dx-{gantt,gantt.min}.css", "to": "./artifacts/css" } + ] }, "inputs": [ - "{projectRoot}/build/gulp/vendor.js" + "{projectRoot}/package.json", + "{workspaceRoot}/pnpm-lock.yaml" ], "outputs": [ - "{projectRoot}/artifacts/js/cldr" + "{projectRoot}/artifacts/css/dx-diagram.css", + "{projectRoot}/artifacts/css/dx-diagram.min.css", + "{projectRoot}/artifacts/css/dx-gantt.css", + "{projectRoot}/artifacts/css/dx-gantt.min.css" + ] + }, + "copy:vendor": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "pnpm nx copy:vendor:js devextreme", + "pnpm nx copy:vendor:css devextreme" + ], + "parallel": true + }, + "outputs": [ + "{projectRoot}/artifacts/js/dx-exceljs-fork.js", + "{projectRoot}/artifacts/js/dx-exceljs-fork.min.js", + "{projectRoot}/artifacts/js/FileSaver.js", + "{projectRoot}/artifacts/js/FileSaver.min.js", + "{projectRoot}/artifacts/js/jquery.js", + "{projectRoot}/artifacts/js/jquery.min.js", + "{projectRoot}/artifacts/js/jspdf.umd.js", + "{projectRoot}/artifacts/js/jspdf.umd.min.js", + "{projectRoot}/artifacts/js/jspdf.plugin.autotable.js", + "{projectRoot}/artifacts/js/jspdf.plugin.autotable.min.js", + "{projectRoot}/artifacts/js/jszip.js", + "{projectRoot}/artifacts/js/jszip.min.js", + "{projectRoot}/artifacts/js/knockout-latest.js", + "{projectRoot}/artifacts/js/knockout-latest.debug.js", + "{projectRoot}/artifacts/js/dx-diagram.js", + "{projectRoot}/artifacts/js/dx-diagram.min.js", + "{projectRoot}/artifacts/js/dx-gantt.js", + "{projectRoot}/artifacts/js/dx-gantt.min.js", + "{projectRoot}/artifacts/js/dx-quill.js", + "{projectRoot}/artifacts/js/dx-quill.min.js", + "{projectRoot}/artifacts/js/dx.aspnet.data.js", + "{projectRoot}/artifacts/css/dx-diagram.css", + "{projectRoot}/artifacts/css/dx-diagram.min.css", + "{projectRoot}/artifacts/css/dx-gantt.css", + "{projectRoot}/artifacts/css/dx-gantt.min.css" ] }, "pack:devextreme-npm": { @@ -1033,6 +1286,19 @@ "!{projectRoot}/testing/*.txt", "!{projectRoot}/testing/*.xml", "{projectRoot}/*.js" + ], + "prodBundles": [ + "{projectRoot}/artifacts/js/dx.all.js", + "{projectRoot}/artifacts/js/dx.web.js", + "{projectRoot}/artifacts/js/dx.viz.js", + "{projectRoot}/artifacts/js/dx.ai-integration.js" + ], + "debugBundles": [ + "{projectRoot}/artifacts/js/dx.all.debug.js", + "{projectRoot}/artifacts/js/dx.web.debug.js", + "{projectRoot}/artifacts/js/dx.viz.debug.js", + "{projectRoot}/artifacts/js/dx.ai-integration.debug.js", + "{projectRoot}/artifacts/js/dx.custom.debug.js" ] }, "tags": [] diff --git a/packages/nx-infra-plugin/src/executors/bundle/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/bundle/executor.e2e.spec.ts index e7e23c10fc02..15585f957bfb 100644 --- a/packages/nx-infra-plugin/src/executors/bundle/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/bundle/executor.e2e.spec.ts @@ -81,5 +81,24 @@ describe('BundleExecutor E2E', () => { const content = await readFileText(allDebug); expect(content).toContain('greet'); expect(content.split('\n').length).toBeGreaterThan(3); + expect(content).toContain('eval('); + }, 60000); + + it('should omit eval-source-map in debug mode when sourceMap is false', async () => { + const options: BundleExecutorSchema = { + entries: ['bundles/dx.all.js'], + sourceDir: './artifacts/transpiled-renovation-npm', + outDir: './artifacts/js', + mode: 'debug', + webpackConfigPath: './webpack.config.js', + sourceMap: false, + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const content = await readFileText(path.join(projectDir, 'artifacts', 'js', 'dx.all.debug.js')); + expect(content).toContain('greet'); + expect(content).not.toContain('eval('); }, 60000); }); diff --git a/packages/nx-infra-plugin/src/executors/bundle/executor.ts b/packages/nx-infra-plugin/src/executors/bundle/executor.ts index 4311a5e61cef..ea91b572e0d8 100644 --- a/packages/nx-infra-plugin/src/executors/bundle/executor.ts +++ b/packages/nx-infra-plugin/src/executors/bundle/executor.ts @@ -44,6 +44,7 @@ function createWebpackConfig( outDir: string, mode: 'debug' | 'production', projectRoot: string, + sourceMap: boolean, ): Configuration { const config: Configuration = { ...baseConfig, @@ -66,7 +67,9 @@ function createWebpackConfig( ...(config.output || {}), pathinfo: true, }; - config.devtool = 'eval-source-map'; + if (sourceMap) { + config.devtool = 'eval-source-map'; + } } const isInternalBuild = @@ -113,7 +116,14 @@ function runWebpack(webpack: typeof import('webpack'), config: Configuration): P const runExecutor: PromiseExecutor = async (options, context) => { const projectRoot = resolveProjectPath(context); - const { entries, sourceDir, outDir, mode, webpackConfigPath = './webpack.config.js' } = options; + const { + entries, + sourceDir, + outDir, + mode, + webpackConfigPath = './webpack.config.js', + sourceMap = true, + } = options; if (!entries?.length) { logger.error(ERROR_MESSAGES.ENTRIES_EMPTY); @@ -155,6 +165,7 @@ const runExecutor: PromiseExecutor = async (options, conte resolvedOutDir, mode, projectRoot, + sourceMap, ); logger.verbose(`Bundling ${entries.length} entries in ${mode} mode`); diff --git a/packages/nx-infra-plugin/src/executors/bundle/schema.json b/packages/nx-infra-plugin/src/executors/bundle/schema.json index 6aee11666963..2751af84ce37 100644 --- a/packages/nx-infra-plugin/src/executors/bundle/schema.json +++ b/packages/nx-infra-plugin/src/executors/bundle/schema.json @@ -24,6 +24,11 @@ "type": "string", "description": "Path to webpack.config.js relative to project root", "default": "./webpack.config.js" + }, + "sourceMap": { + "type": "boolean", + "description": "Enable eval-source-map devtool in debug mode", + "default": true } }, "required": ["entries", "sourceDir", "outDir", "mode"], diff --git a/packages/nx-infra-plugin/src/executors/bundle/schema.ts b/packages/nx-infra-plugin/src/executors/bundle/schema.ts index d10a120f84f7..f24ccb334a0a 100644 --- a/packages/nx-infra-plugin/src/executors/bundle/schema.ts +++ b/packages/nx-infra-plugin/src/executors/bundle/schema.ts @@ -4,4 +4,5 @@ export interface BundleExecutorSchema { outDir: string; mode: 'debug' | 'production'; webpackConfigPath?: string; + sourceMap?: boolean; } diff --git a/packages/nx-infra-plugin/src/executors/compress/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/compress/executor.e2e.spec.ts index f2e66f556bb4..d147f20a27d4 100644 --- a/packages/nx-infra-plugin/src/executors/compress/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/compress/executor.e2e.spec.ts @@ -47,7 +47,6 @@ describe('CompressExecutor E2E', () => { const options: CompressExecutorSchema = { files: ['./test.js'], mode: 'minify', - removeDebug: true, }; const result = await executor(options, context); @@ -64,13 +63,14 @@ describe('CompressExecutor E2E', () => { expect(output.length).toBeLessThan(SAMPLE_CODE.length); }); - it('should minify but keep debug blocks', async () => { + it('should apply normalize: normalize line endings to platform EOL, ensure trailing newline, preserve debug blocks', async () => { const filePath = path.join(projectDir, 'test.js'); - await writeFileText(filePath, SAMPLE_CODE); + const crlfContent = SAMPLE_CODE.replace(/\n/g, '\r\n'); + await writeFileText(filePath, crlfContent); const options: CompressExecutorSchema = { files: ['./test.js'], - mode: 'minify', + mode: 'normalize', }; const result = await executor(options, context); @@ -78,6 +78,11 @@ describe('CompressExecutor E2E', () => { const output = await readFileText(filePath); + if (require('os').EOL === '\n') { + expect(output).not.toContain('\r\n'); + } + expect(output.endsWith(require('os').EOL)).toBe(true); + expect(output).toContain('#DEBUG'); expect(output).toContain('debug only'); }); @@ -101,4 +106,160 @@ describe('CompressExecutor E2E', () => { expect(output).not.toContain('unused'); }); + + it('should preserve debug blocks in beautify mode', async () => { + const filePath = path.join(projectDir, 'test.js'); + await writeFileText(filePath, SAMPLE_CODE); + + const options: CompressExecutorSchema = { + files: ['./test.js'], + mode: 'beautify', + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const output = await readFileText(filePath); + + expect(output).toContain('debug only'); + }); + + it('should apply strip-debug: remove debug blocks only, no minification', async () => { + const filePath = path.join(projectDir, 'test.js'); + await writeFileText(filePath, SAMPLE_CODE); + + const options: CompressExecutorSchema = { + files: ['./test.js'], + mode: 'strip-debug', + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const output = await readFileText(filePath); + + expect(output).not.toContain('#DEBUG'); + expect(output).not.toContain('debug only'); + + expect(output).toContain('function hello'); + expect(output.split('\n').length).toBeGreaterThan(3); + }); + + it('should expand glob patterns in files array', async () => { + const fileNames = ['alpha.js', 'beta.js', 'gamma.js']; + for (const name of fileNames) { + await writeFileText(path.join(projectDir, name), SAMPLE_CODE); + } + + const options: CompressExecutorSchema = { + files: ['./*.js'], + mode: 'strip-debug', + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + for (const name of fileNames) { + const output = await readFileText(path.join(projectDir, name)); + expect(output).not.toContain('#DEBUG'); + expect(output).not.toContain('debug only'); + expect(output).toContain('function hello'); + } + }); + + it('should accept object-form mode and preserve eulaUrl-bearing comments', async () => { + const filePath = path.join(projectDir, 'test.js'); + const codeWithEulaComment = `/* https://js.devexpress.com/Licensing/ */\n"use strict";\nvar a = 1;\n`; + await writeFileText(filePath, codeWithEulaComment); + + const options: CompressExecutorSchema = { + files: ['./test.js'], + mode: { name: 'minify', eulaUrl: 'https://js.devexpress.com/Licensing/' }, + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const output = await readFileText(filePath); + expect(output).toContain('https://js.devexpress.com/Licensing/'); + }); + + it('should not append trailing newline when mode.trailingNewline is false', async () => { + const filePath = path.join(projectDir, 'no-trailing.js'); + await writeFileText(filePath, 'const a = 1;'); + + const options: CompressExecutorSchema = { + files: ['./no-trailing.js'], + mode: { name: 'normalize', trailingNewline: false }, + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const output = await readFileText(filePath); + expect(output).toBe('const a = 1;'); + expect(output.endsWith('\n')).toBe(false); + }); + + it('should skip trailing newline in minify mode (compress:bundles:prod -c production parity)', async () => { + const filePath = path.join(projectDir, 'test.js'); + await writeFileText(filePath, SAMPLE_CODE); + + const options: CompressExecutorSchema = { + files: ['./test.js'], + mode: { name: 'minify', trailingNewline: false }, + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const output = await readFileText(filePath); + expect(output.endsWith('\n')).toBe(false); + expect(output).not.toContain('debug only'); + }); + + it('should respect exclude patterns and leave excluded files untouched', async () => { + await writeFileText(path.join(projectDir, 'keep.js'), SAMPLE_CODE); + await writeFileText(path.join(projectDir, 'skip.js'), SAMPLE_CODE); + await writeFileText(path.join(projectDir, 'also-skip.js'), SAMPLE_CODE); + + const options: CompressExecutorSchema = { + files: ['./*.js'], + exclude: ['./skip.js', './also-*.js'], + mode: 'strip-debug', + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const keepOutput = await readFileText(path.join(projectDir, 'keep.js')); + const skipOutput = await readFileText(path.join(projectDir, 'skip.js')); + const alsoSkipOutput = await readFileText(path.join(projectDir, 'also-skip.js')); + + expect(keepOutput).not.toContain('#DEBUG'); + expect(skipOutput).toContain('#DEBUG'); + expect(skipOutput).toBe(SAMPLE_CODE); + expect(alsoSkipOutput).toContain('#DEBUG'); + expect(alsoSkipOutput).toBe(SAMPLE_CODE); + }); + + it('should respect exclude patterns when files are concrete paths (no glob)', async () => { + await writeFileText(path.join(projectDir, 'keep.js'), SAMPLE_CODE); + await writeFileText(path.join(projectDir, 'skip.js'), SAMPLE_CODE); + + const options: CompressExecutorSchema = { + files: ['./keep.js', './skip.js'], + exclude: ['./skip.js'], + mode: 'strip-debug', + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const keepOutput = await readFileText(path.join(projectDir, 'keep.js')); + const skipOutput = await readFileText(path.join(projectDir, 'skip.js')); + + expect(keepOutput).not.toContain('#DEBUG'); + expect(skipOutput).toBe(SAMPLE_CODE); + }); }); diff --git a/packages/nx-infra-plugin/src/executors/compress/executor.ts b/packages/nx-infra-plugin/src/executors/compress/executor.ts index d38dd5513712..cd35c3bd88e4 100644 --- a/packages/nx-infra-plugin/src/executors/compress/executor.ts +++ b/packages/nx-infra-plugin/src/executors/compress/executor.ts @@ -2,8 +2,11 @@ import { PromiseExecutor, logger } from '@nx/devkit'; import * as path from 'path'; import * as terser from 'terser'; import { js as jsBeautify } from 'js-beautify'; -import { CompressExecutorSchema } from './schema'; -import { resolveProjectPath } from '../../utils/path-resolver'; +import { glob } from 'glob'; +import { minimatch } from 'minimatch'; +import { CompressExecutorSchema, CompressMode, CompressModeName } from './schema'; +import { resolveProjectPath, normalizeGlobPathForWindows } from '../../utils/path-resolver'; +import { isWindowsOS, containsGlobPattern } from '../../utils/common'; import { readFileText, writeFileText, @@ -31,7 +34,7 @@ function createCommentFilter(eulaUrl?: string) { }; } -async function minify(content: string, eulaUrl?: string): Promise { +async function runMinify(content: string, eulaUrl?: string): Promise { const result = await terser.minify(content, { output: { ascii_only: true, @@ -46,7 +49,7 @@ async function minify(content: string, eulaUrl?: string): Promise { return result.code; } -async function beautify(content: string, eulaUrl?: string): Promise { +async function runBeautify(content: string, eulaUrl?: string): Promise { const uglifyResult = await terser.minify(content, { mangle: false, compress: { @@ -87,48 +90,88 @@ function stripDebugBlocks(content: string): string { return content.replace(REMOVE_DEBUG_REGEXP, ''); } -async function stripOnly(content: string): Promise { - return content; +function normalizeOutput(content: string, trailingNewline: boolean): string { + const eolNormalized = normalizeEol(content); + return trailingNewline ? ensureTrailingNewline(eolNormalized) : eolNormalized; } -type CompressMode = CompressExecutorSchema['mode']; -type CompressStrategy = (content: string, eulaUrl?: string) => Promise; +type ResolvedMode = { + name: CompressModeName; + eulaUrl?: string; + trailingNewline: boolean; +}; -const COMPRESS_STRATEGIES: Record = { - minify, - beautify, - 'strip-only': stripOnly, +function resolveMode(mode: CompressMode): ResolvedMode { + if (typeof mode === 'string') { + return { name: mode, trailingNewline: true }; + } + const trailingNewline = mode.trailingNewline ?? true; + if (mode.name === 'minify' || mode.name === 'beautify') { + return { name: mode.name, eulaUrl: mode.eulaUrl, trailingNewline }; + } + return { name: mode.name, trailingNewline }; +} + +type CompressStrategy = (content: string, mode: ResolvedMode) => Promise; + +const STRATEGIES: Record = { + minify: async (content, { eulaUrl, trailingNewline }) => + normalizeOutput(await runMinify(stripDebugBlocks(content), eulaUrl), trailingNewline), + beautify: async (content, { eulaUrl, trailingNewline }) => + normalizeOutput(await runBeautify(content, eulaUrl), trailingNewline), + 'strip-debug': async (content) => stripDebugBlocks(content), + normalize: async (content, { trailingNewline }) => normalizeOutput(content, trailingNewline), }; -async function compressFile( - filePath: string, - mode: CompressMode, - removeDebug: boolean, - eulaUrl?: string, -): Promise { - const strategy = COMPRESS_STRATEGIES[mode]; - if (!strategy) { - throw new Error(`Unknown compress mode: ${mode}`); +async function compressFile(filePath: string, mode: CompressMode): Promise { + const resolved = resolveMode(mode); + const runStrategy = STRATEGIES[resolved.name]; + if (!runStrategy) { + throw new Error(`Unknown compress mode: ${resolved.name}`); } - let content = await readFileText(filePath); - if (removeDebug || mode === 'strip-only') { - content = stripDebugBlocks(content); + const raw = await readFileText(filePath); + await writeFileText(filePath, await runStrategy(raw, resolved)); +} + +async function expandFileList( + files: string[], + exclude: string[] | undefined, + projectRoot: string, +): Promise { + const toPosixIfWindows = (p: string) => (isWindowsOS() ? normalizeGlobPathForWindows(p) : p); + + const ignorePatterns = exclude?.map((p) => toPosixIfWindows(path.resolve(projectRoot, p))); + + const isExcluded = (absolutePath: string): boolean => + !!ignorePatterns?.some((pattern) => + minimatch(toPosixIfWindows(absolutePath), pattern, { dot: true }), + ); + + const resolved: string[] = []; + for (const entry of files) { + const absolute = path.resolve(projectRoot, entry); + if (containsGlobPattern(entry)) { + const pattern = toPosixIfWindows(absolute); + const matches = await glob(pattern, { nodir: true, ignore: ignorePatterns }); + resolved.push(...matches); + } else if (!isExcluded(absolute)) { + resolved.push(absolute); + } } - content = await strategy(content, eulaUrl); - content = ensureTrailingNewline(normalizeEol(content)); - await writeFileText(filePath, content); + return [...new Set(resolved)]; } const runExecutor: PromiseExecutor = async (options, context) => { const projectRoot = resolveProjectPath(context); - const { files, mode, removeDebug, eulaUrl } = options; + const { files, mode, exclude } = options; + const modeName = typeof mode === 'string' ? mode : mode.name; try { - for (const file of files) { - const filePath = path.resolve(projectRoot, file); - await compressFile(filePath, mode, removeDebug ?? false, eulaUrl); - logger.verbose(`Compressed ${file} (${mode}${removeDebug ? ', removeDebug' : ''})`); + const expanded = await expandFileList(files, exclude, projectRoot); + for (const filePath of expanded) { + await compressFile(filePath, mode); + logger.verbose(`Compressed ${path.relative(projectRoot, filePath)} (${modeName})`); } return { success: true }; diff --git a/packages/nx-infra-plugin/src/executors/compress/schema.json b/packages/nx-infra-plugin/src/executors/compress/schema.json index 9f7614b2a295..31bc8273e527 100644 --- a/packages/nx-infra-plugin/src/executors/compress/schema.json +++ b/packages/nx-infra-plugin/src/executors/compress/schema.json @@ -8,18 +8,37 @@ "description": "Paths to files to compress (relative to project root)" }, "mode": { - "type": "string", - "enum": ["minify", "beautify", "strip-only"], - "description": "Compression mode" + "description": "Compression mode. Use a string for the simple cases or an object to attach mode-specific options (e.g., eulaUrl for minify/beautify, trailingNewline for any mode).", + "oneOf": [ + { + "type": "string", + "enum": ["minify", "beautify", "strip-debug", "normalize"] + }, + { + "type": "object", + "properties": { + "name": { "type": "string", "enum": ["minify", "beautify"] }, + "eulaUrl": { "type": "string" }, + "trailingNewline": { "type": "boolean", "default": true } + }, + "required": ["name"], + "additionalProperties": false + }, + { + "type": "object", + "properties": { + "name": { "type": "string", "enum": ["strip-debug", "normalize"] }, + "trailingNewline": { "type": "boolean", "default": true } + }, + "required": ["name"], + "additionalProperties": false + } + ] }, - "removeDebug": { - "type": "boolean", - "description": "Strip debug blocks before compression", - "default": false - }, - "eulaUrl": { - "type": "string", - "description": "EULA URL to preserve in comments during compression" + "exclude": { + "type": "array", + "items": { "type": "string" }, + "description": "Glob patterns for files to exclude from compression (relative to project root)" } }, "required": ["files", "mode"] diff --git a/packages/nx-infra-plugin/src/executors/compress/schema.ts b/packages/nx-infra-plugin/src/executors/compress/schema.ts index 95a85bb76ff6..8f89483fd5bd 100644 --- a/packages/nx-infra-plugin/src/executors/compress/schema.ts +++ b/packages/nx-infra-plugin/src/executors/compress/schema.ts @@ -1,6 +1,19 @@ +export type CompressModeName = 'minify' | 'beautify' | 'strip-debug' | 'normalize'; + +export type CompressMode = + | CompressModeName + | { + name: 'minify' | 'beautify'; + eulaUrl?: string; + trailingNewline?: boolean; + } + | { + name: 'strip-debug' | 'normalize'; + trailingNewline?: boolean; + }; + export interface CompressExecutorSchema { files: string[]; - mode: 'minify' | 'beautify' | 'strip-only'; - removeDebug?: boolean; - eulaUrl?: string; + mode: CompressMode; + exclude?: string[]; } diff --git a/packages/nx-infra-plugin/src/executors/concatenate-files/executor.ts b/packages/nx-infra-plugin/src/executors/concatenate-files/executor.ts index 39a1d8ca3a3c..9cbfce85caf8 100644 --- a/packages/nx-infra-plugin/src/executors/concatenate-files/executor.ts +++ b/packages/nx-infra-plugin/src/executors/concatenate-files/executor.ts @@ -3,7 +3,7 @@ import * as path from 'path'; import { glob } from 'glob'; import { ConcatenateFilesExecutorSchema, TransformRule } from './schema'; import { resolveProjectPath, normalizeGlobPathForWindows } from '../../utils/path-resolver'; -import { isWindowsOS } from '../../utils/common'; +import { isWindowsOS, containsGlobPattern } from '../../utils/common'; import { logError } from '../../utils/error-handler'; import { readFileText, writeFileText, exists } from '../../utils/file-operations'; @@ -15,10 +15,6 @@ const ERROR_MESSAGES = { FAILED_TO_CONCATENATE: 'Failed to concatenate files', } as const; -function containsGlobPattern(pattern: string): boolean { - return /[*?[\]{}]/.test(pattern); -} - function extractContent(content: string, pattern: string, flags: string): string { try { const regex = new RegExp(pattern, flags); 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 0a0e714ae54e..49e363919cd8 100644 --- a/packages/nx-infra-plugin/src/executors/copy-files/executor.ts +++ b/packages/nx-infra-plugin/src/executors/copy-files/executor.ts @@ -4,7 +4,7 @@ import { stat } from 'fs/promises'; import { glob } from 'glob'; import { CopyFilesExecutorSchema } from './schema'; import { resolveProjectPath, normalizeGlobPathForWindows } from '../../utils/path-resolver'; -import { isWindowsOS } from '../../utils/common'; +import { isWindowsOS, containsGlobPattern } from '../../utils/common'; import { logError } from '../../utils/error-handler'; import { copyFile, copyRecursive, exists, ensureDir } from '../../utils/file-operations'; @@ -15,10 +15,6 @@ const ERROR_MESSAGES = { 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, diff --git a/packages/nx-infra-plugin/src/utils/common.ts b/packages/nx-infra-plugin/src/utils/common.ts index a2541461ac0c..9ef5f9c7d882 100644 --- a/packages/nx-infra-plugin/src/utils/common.ts +++ b/packages/nx-infra-plugin/src/utils/common.ts @@ -3,3 +3,7 @@ import os from 'os'; export function isWindowsOS() { return os.platform() === 'win32'; } + +export function containsGlobPattern(pattern: string): boolean { + return /[*?[\]{}]/.test(pattern); +} diff --git a/packages/nx-infra-plugin/src/utils/file-operations.ts b/packages/nx-infra-plugin/src/utils/file-operations.ts index 805c643194ba..cf3609a74168 100644 --- a/packages/nx-infra-plugin/src/utils/file-operations.ts +++ b/packages/nx-infra-plugin/src/utils/file-operations.ts @@ -1,6 +1,7 @@ import * as fs from 'fs/promises'; import * as fse from 'fs-extra'; import * as path from 'path'; +import * as os from 'os'; import { glob } from 'glob'; const ENCODING_UTF8 = 'utf-8'; @@ -66,9 +67,9 @@ export async function copyRecursive(from: string, to: string): Promise { } export function normalizeEol(content: string): string { - return content.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); + return content.replace(/\r?\n/g, os.EOL); } export function ensureTrailingNewline(content: string): string { - return content.endsWith('\n') ? content : content + '\n'; + return content.endsWith(os.EOL) ? content : content + os.EOL; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2f550eab559e..189dbcda71bf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -223,14 +223,14 @@ importers: .: devDependencies: '@nx/devkit': - specifier: 22.4.5 - version: 22.4.5(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21))) + specifier: 22.7.0 + version: 22.7.0(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21))) '@nx/jest': - specifier: 22.4.5 - version: 22.4.5(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(node-notifier@9.0.1)(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21)))(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.12.8)(typescript@5.9.3))(typescript@5.9.3) + specifier: 22.7.0 + version: 22.7.0(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(node-notifier@9.0.1)(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21)))(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.12.8)(typescript@5.9.3))(typescript@5.9.3) '@nx/js': - specifier: 22.4.5 - version: 22.4.5(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21))) + specifier: 22.7.0 + version: 22.7.0(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21))) '@types/jest': specifier: 29.5.14 version: 29.5.14 @@ -280,8 +280,8 @@ importers: specifier: 14.0.1 version: 14.0.1(enquirer@2.4.1) nx: - specifier: 22.4.5 - version: 22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21)) + specifier: 22.7.0 + version: 22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21)) nx-cloud: specifier: 19.1.0 version: 19.1.0 @@ -1645,9 +1645,6 @@ importers: gulp-if: specifier: 3.0.0 version: 3.0.0 - gulp-jsbeautifier: - specifier: 2.1.2 - version: 2.1.2 gulp-json-editor: specifier: 2.6.0 version: 2.6.0 @@ -1684,9 +1681,6 @@ importers: gulp-typescript: specifier: 5.0.1 version: 5.0.1(typescript@4.9.5) - gulp-uglify-es: - specifier: 3.0.0 - version: 3.0.0 gulp-watch: specifier: 5.0.1 version: 5.0.1 @@ -3880,15 +3874,24 @@ packages: '@emnapi/core@1.10.0': resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==} + '@emnapi/core@1.4.5': + resolution: {integrity: sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==} + '@emnapi/core@1.9.2': resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==} '@emnapi/runtime@1.10.0': resolution: {integrity: sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==} + '@emnapi/runtime@1.4.5': + resolution: {integrity: sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==} + '@emnapi/runtime@1.9.2': resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==} + '@emnapi/wasi-threads@1.0.4': + resolution: {integrity: sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==} + '@emnapi/wasi-threads@1.2.1': resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==} @@ -5515,74 +5518,74 @@ packages: '@nrwl/nx-cloud@19.1.0': resolution: {integrity: sha512-krngXVPfX0Zf6+zJDtcI59/Pt3JfcMPMZ9C/+/x6rvz4WGgyv1s0MI4crEUM0Lx5ZpS4QI0WNDCFVQSfGEBXUg==} - '@nx/devkit@22.4.5': - resolution: {integrity: sha512-mw5G6k/XTkL675eVIcFpyZdfdIc3wQMSSGWzfA6tQGmANDYc/NFGeZR9wDqXDceHXnYKoRO6g6GhKTOHUCW23Q==} + '@nx/devkit@22.7.0': + resolution: {integrity: sha512-AI6t94k37lIv5XL/eesyYFBY4x2IzgseLmf0DiycHLGfAJWsvUlTzOD++t4vek/W80YQSBKRUbLg7r6wo56d0g==} peerDependencies: nx: '>= 21 <= 23 || ^22.0.0-0' - '@nx/jest@22.4.5': - resolution: {integrity: sha512-qlEJc0Jbp8E14g7+piHH8DXsAm6C3w1CLuvtE57+LFMhM2zbBDiQ8oeXBdFPEHLCfpbSK/4yCSEmkUj1Yyrs2A==} + '@nx/jest@22.7.0': + resolution: {integrity: sha512-r30QIXb0QdUYvueWfOHrB66e544mj6q7n7kahvkyk1PrJsqhAGKkJFp+igpRNyeDcKAFLEHcpdbejhfKLTTKFw==} - '@nx/js@22.4.5': - resolution: {integrity: sha512-t8972z2uF6X5i4FFmTlnvSwwxfHkk87zBpKQK0yMH5CzOENViVFNbiPnbvCIJcGNrgVUSALL3f2ngwKcTZObmA==} + '@nx/js@22.7.0': + resolution: {integrity: sha512-/ZreqwA1McpGn4kRLMnt9+UTIqCLlZp/OzVes1YOcIfzZ6LYQtL/aOVaYkpv/IB/9ojT0qHpAvLHnoHFzQtpCQ==} peerDependencies: verdaccio: ^6.0.5 peerDependenciesMeta: verdaccio: optional: true - '@nx/nx-darwin-arm64@22.4.5': - resolution: {integrity: sha512-zdRHZv1AMvzgp+5g2VZNXXuqk0/n1wOFksOeZ6BRyKg6hC2YkjGyn5xle/UK668MDAwe9KKm4jizvztK/LlPuA==} + '@nx/nx-darwin-arm64@22.7.0': + resolution: {integrity: sha512-WczfOkv7bVSi0i4bLFmMLqdcRllJr+CLO0ibVapGHxdaOkNPCgSDxBVYC/0eg8yyMsPXQu8daaTvOlODNJw9GQ==} cpu: [arm64] os: [darwin] - '@nx/nx-darwin-x64@22.4.5': - resolution: {integrity: sha512-1NVWaSgpa8yawi2UILX4NE9UcMuNzAAGh95JSV2yJovRfKxFQgQSB6hj0gpJu+TLLVCroTqy4woSQ2a0SPodeQ==} + '@nx/nx-darwin-x64@22.7.0': + resolution: {integrity: sha512-KGBq43lJbDjIpIAU5/sJFJQokGgCu/0KVe5pO2u9hMO2A9VaVtud5bGbDpkBiWoYBK9BLM3YpbG/RB74unxWxg==} cpu: [x64] os: [darwin] - '@nx/nx-freebsd-x64@22.4.5': - resolution: {integrity: sha512-baaLz53wr/HsVfSJ7ZgIFCPAb/OtP7yPPasb3eIu65oVhSswGfgvz9+YINhuInUgW7x7STmRnhGeR8pj6iqFqw==} + '@nx/nx-freebsd-x64@22.7.0': + resolution: {integrity: sha512-DKOHaFC7Ko4+nlin/us8FEfBBgnpifZie4LELgo2nI044GlazGHJArtRSdLq3qKfWXqtieOKO3R4YV09Ax37Rg==} cpu: [x64] os: [freebsd] - '@nx/nx-linux-arm-gnueabihf@22.4.5': - resolution: {integrity: sha512-wRBPv/l39tz+sQjZUH4hygCsd/DoUXUbDYkR6lnNXWHAVyPUh48/27JozM8hD3o/G3O2Vd8PFQasIXtvy2GS0Q==} + '@nx/nx-linux-arm-gnueabihf@22.7.0': + resolution: {integrity: sha512-LaZSE4FGk8KFyKF8grlhcoBWJabxkn7moO2QfULm3i1GY1AYu7bbxVZG42cAdGENqliCB8V2ARBWrMKq6mqW2g==} cpu: [arm] os: [linux] - '@nx/nx-linux-arm64-gnu@22.4.5': - resolution: {integrity: sha512-6B/yCFiqjvV2Bkz6MKUtfFWjwtiF53DN07K1BFksMpQef+h2yE1IrGaG/OCl6VaVl4VRzQgLOluqP96M1yhDgg==} + '@nx/nx-linux-arm64-gnu@22.7.0': + resolution: {integrity: sha512-g0GJ2avp0wuxHCQ2fjlMVjez4TWBtfj0jLCzO2I9M3B6ui0V+9Wh66DO5pLwyQFGbxODgwz9vwrEEZKlbDrchA==} cpu: [arm64] os: [linux] - '@nx/nx-linux-arm64-musl@22.4.5': - resolution: {integrity: sha512-n0v60vRYn7BDHWB588snPZntLO2XC8/pvLd+QunneM2VGEPf51n5llX5U3AwTt/ybaZHWhbuHv0sJBIbT4I0GA==} + '@nx/nx-linux-arm64-musl@22.7.0': + resolution: {integrity: sha512-xb72G+LrhZNrWXOAd6aoDQmhzO5GKq6dkAYqhtOTAklCwIo5/4dkvqvFEe5RIQ7pk6RzdD2cUZMTJTr99rSGTg==} cpu: [arm64] os: [linux] - '@nx/nx-linux-x64-gnu@22.4.5': - resolution: {integrity: sha512-zT7nb1PRE3NcW/HFnbgKJ9ZPtCOeVDpbJ5J4ZhHj36ZAUWZVXFEIPq9VTIZFy5+0pioLUIClQQY7OUfwnV/Zig==} + '@nx/nx-linux-x64-gnu@22.7.0': + resolution: {integrity: sha512-win7DkwxThhGWJlJ0s9HLxPzam/wz5MbQhKTQmLehHz8mgFJOu6MqzrccDxuT1E93dODedtxJuAyW4c80mpp4A==} cpu: [x64] os: [linux] - '@nx/nx-linux-x64-musl@22.4.5': - resolution: {integrity: sha512-r8Rls5BS7lGQbUNX1Z1S370XrOacOU1bQ/dxY8i7qahFQKnMwpFo0W8odhgzjk+vrC/WLf9jOgz5/JPzehQBIw==} + '@nx/nx-linux-x64-musl@22.7.0': + resolution: {integrity: sha512-lU7yT+CsZFPCH3dZAVynhyJxa5w8rwCVtbDYbBa703DkNgb8/CQAthyE7NN2fjfzeQ0YpXoV3O/iX6sVY1sdjA==} cpu: [x64] os: [linux] - '@nx/nx-win32-arm64-msvc@22.4.5': - resolution: {integrity: sha512-Lv81LTnG6sSvBOq2vDSeyfzpF9X0cTGlJdzJOJzPZXCZGFhTV1ig9TdLiij/GM2JwV4Kvq5Co6YzA5dxtGUphQ==} + '@nx/nx-win32-arm64-msvc@22.7.0': + resolution: {integrity: sha512-e8P0ZSPJpaAjiIitcJAjdSCeCxAMjt5OqM6kZYUiwpHVnB31YAEe8feNvQcfvhyMjx/AXFQlBztHh8kANvdlLw==} cpu: [arm64] os: [win32] - '@nx/nx-win32-x64-msvc@22.4.5': - resolution: {integrity: sha512-52RfBcq9PXt76soCAZAJcNmCYrdsg6BvhBmjf0IFTMZ8IaeqZ9ktxAy1TZf/gCkOaM3ly4htbYMStiZ4MHX7Eg==} + '@nx/nx-win32-x64-msvc@22.7.0': + resolution: {integrity: sha512-NWLezNDRoZpqs8DudLCGBj214fIIG3cDhkez7eKW/i+s27O3laVCO9QgaFi07P+RSnrnZVJPfOISkE0Ql7gdAw==} cpu: [x64] os: [win32] - '@nx/workspace@22.4.5': - resolution: {integrity: sha512-QGapABrqBnRpEWbnd5UpbVCBzsYD+RlC1lWShXPpCM+dosR3qkGb+pSmxeSCsKbNVtCwYyyuRW+PvlF5Q5sU9A==} + '@nx/workspace@22.7.0': + resolution: {integrity: sha512-ZhZYOlyPt1kJBvuC8MbTVTkDJSiEnr7Fu0luTGsbVLQO+2bHjIJml5HT1vCNpn39VH4Y4ZLgclHOt6P+KJH6/g==} '@one-ini/wasm@0.1.1': resolution: {integrity: sha512-XuySG1E38YScSJoMlqovLru4KTUNSjgVTIjyh7qMX6aNN5HY5Ct5LhRJdxO79JtTzKfzV/bnWpz+zquYrISsvw==} @@ -7730,10 +7733,6 @@ packages: '@yarnpkg/lockfile@1.1.0': resolution: {integrity: sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==} - '@yarnpkg/parsers@3.0.2': - resolution: {integrity: sha512-/HcYgtUSiJiot/XWGLOlGxPYUG65+/31V8oqk17vZLW1xlCoR4PampyePljOxY2n8/3jz9+tIFzICsyGujJZoA==} - engines: {node: '>=18.12.0'} - '@zkochan/js-yaml@0.0.7': resolution: {integrity: sha512-nrUSn7hzt7J6JWgWGz78ZYI8wj+gdIJdk0Ynjpp8l+trkn58Uqsf6RYrYkEK+3X18EX+TNdtJI0WxAtc+L84SQ==} hasBin: true @@ -7878,9 +7877,6 @@ packages: ajv@8.18.0: resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} - ajv@8.20.0: - resolution: {integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==} - algoliasearch@5.35.0: resolution: {integrity: sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==} engines: {node: '>= 14.0.0'} @@ -8270,6 +8266,9 @@ packages: resolution: {integrity: sha512-zBQouZixDTbo3jMGqHKyePxYxr1e5W8UdTmBQ7sNtaA9M2bE32daxxPLS/jojhKOHxQ7LWwPjfiwf/fhaJWzlg==} engines: {node: '>=4'} + axios@1.15.0: + resolution: {integrity: sha512-wWyJDlAatxk30ZJer+GeCWS209sA42X+N5jU2jy6oHTp7ufw8uzUTVFBX9+wTfAlhiJXGS0Bq7X6efruWjuK9Q==} + axios@1.15.1: resolution: {integrity: sha512-WOG+Jj8ZOvR0a3rAn+Tuf1UQJRxw5venr6DgdbJzngJE3qG7X0kL83CZGpdHMxEm+ZK3seAbvFsw4FfOfP9vxg==} @@ -8486,6 +8485,10 @@ packages: balanced-match@2.0.0: resolution: {integrity: sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==} + balanced-match@4.0.3: + resolution: {integrity: sha512-1pHv8LX9CpKut1Zp4EXey7Z8OfH11ONNH6Dhi2WDUt31VVZFXZzKwXcysBgqSumFCmR+0dqjMK5v5JiFHzi0+g==} + engines: {node: 20 || >=22} + balanced-match@4.0.4: resolution: {integrity: sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==} engines: {node: 18 || 20 || >=22} @@ -9642,10 +9645,6 @@ packages: resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==} engines: {node: '>= 0.4'} - deep-extend@0.6.0: - resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} - engines: {node: '>=4.0.0'} - deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -9961,6 +9960,10 @@ packages: resolution: {integrity: sha512-zIHwmZPRshsCdpMDyVsqGmgyP0yT8GAgXUnkdAoJisxvf33k7yO6OuoKmcTGuXPWSsm8Oh88nZicRLA9Y0rUeA==} engines: {node: '>=12'} + dotenv-expand@12.0.3: + resolution: {integrity: sha512-uc47g4b+4k/M/SeaW1y4OApx+mtLWl92l5LMPP0GNXctZqELk+YGgOPIIC5elYmUH4OuoK3JLhuRUYegeySiFA==} + engines: {node: '>=12'} + dotenv@10.0.0: resolution: {integrity: sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==} engines: {node: '>=10'} @@ -10013,9 +10016,9 @@ packages: ee-first@1.1.1: resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} - ejs@3.1.10: - resolution: {integrity: sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==} - engines: {node: '>=0.10.0'} + ejs@5.0.1: + resolution: {integrity: sha512-COqBPFMxuPTPspXl2DkVYaDS3HtrD1GpzOGkNTJ1IYkifq/r9h8SVEFrjA3D9/VJGOEoMQcrlhpntcSUrM8k6A==} + engines: {node: '>=0.12.18'} hasBin: true electron-to-chromium@1.5.340: @@ -10863,9 +10866,6 @@ packages: file-uri-to-path@1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filelist@1.0.6: - resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} - filing-cabinet@4.1.6: resolution: {integrity: sha512-C+HZbuQTER36sKzGtUhrAPAoK6+/PrrUhYDBQEh3kBRdsyEhkLbp1ML8S0+6e6gCUrUlid+XmubxJrhvL2g/Zw==} engines: {node: '>=14'} @@ -11036,9 +11036,6 @@ packages: from@0.1.7: resolution: {integrity: sha512-twe20eF1OxVxp/ML/kq2p1uc6KvFK/+vs8WjEbeKmV2He22MKm7YF2ANIt+EOqhJ5L3K/SuuPhk0hWQDjOM23g==} - front-matter@4.0.2: - resolution: {integrity: sha512-I8ZuJ/qG92NWX8i5x1Y8qyj3vizhXS31OxjKDu3LKP+7/qBgfIKValiZIEwoVoJKUHlhWtYrktkxV1XsX+pPlg==} - fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -11415,10 +11412,6 @@ packages: gulp-if@3.0.0: resolution: {integrity: sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==} - gulp-jsbeautifier@2.1.2: - resolution: {integrity: sha512-tZUk4c11zF8xzCCTOEmktxGitv/H2vpAcflZNVU8nxL+G5XxQyLJUJVUKylz7/dax+FXb3YwQYByaJ+yxmo8iw==} - engines: {node: '>=0.10.0'} - gulp-json-editor@2.6.0: resolution: {integrity: sha512-Ni0ZUpNrhesHiTlHQth/Nv1rXCn0LUicEvzA5XuGy186C4PVeNoRjfuAIQrbmt3scKv8dgGbCs0hd77ScTw7hA==} @@ -11472,9 +11465,6 @@ packages: peerDependencies: typescript: ~2.7.1 || >=2.8.0-dev || >=2.9.0-dev || ~3.0.0 || >=3.0.0-dev || >=3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev - gulp-uglify-es@3.0.0: - resolution: {integrity: sha512-dQ3czMFFojNgCajcrYl0oa98+YayaQ8kXRdaacpZRZ3iw2sdVURfdt8y8Ki1ogZGQqw8BUawnB7V6NkanxqnDg==} - gulp-watch@5.0.1: resolution: {integrity: sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog==} @@ -11559,6 +11549,10 @@ packages: resolution: {integrity: sha512-iZyKG96/JwPz1N55vj2Ie2vXbhu440zfUfJvSwEqEbeLluk7NnapfGqa7LH0mOsnDxTF85Mx8/dyR6HfqcbmbQ==} engines: {node: '>=20'} + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + hasown@2.0.3: resolution: {integrity: sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==} engines: {node: '>= 0.4'} @@ -12461,11 +12455,6 @@ packages: resolution: {integrity: sha512-ykkVRwrYvFm1nb2AJfKKYPr0emF6IiXDYUaFx4Zn9ZuIH7MrzEZ3sD5RlqGXNRpHtvUHJyOnCEFxOlNDtGo7wg==} engines: {node: 20 || >=22} - jake@10.9.4: - resolution: {integrity: sha512-wpHYzhxiVQL+IV05BLE2Xn34zW1S223hvjtqk0+gsPrwd/8JNLXJgZZM/iPFsYc1xyphF+6M6EvdE5E9MBGkDA==} - engines: {node: '>=10'} - hasBin: true - jasmine-core@4.6.1: resolution: {integrity: sha512-VYz/BjjmC3klLJlLwA4Kw8ytk0zDSmbbDLNs794VnWmkcCB7I9aAL/D48VNQtmITyPvea2C3jdUMfc3kAoy0PQ==} @@ -14189,21 +14178,18 @@ packages: resolution: {integrity: sha512-f24vd5/57/MFSXNMfkerdDiK0EvScGOKO71iOWgJNgI1xVweDRmOA/EfjnPMRd5m+pnoPs/4A7DzuwSW0jZVyw==} hasBin: true - nx@22.4.5: - resolution: {integrity: sha512-l68kzhnemXXGCDS9/W8eccZ7Bzse9pw1oJ466pzDM89MbA6hEaOQ0p+eDXZI++iWl0T+lYJ56EDhO23syKzt9g==} + nx@22.7.0: + resolution: {integrity: sha512-zjySvwwAfexdKN8utZlq5IkoRZOki/gB1KTrY7OkMjSehuiimD6A7DTySiOUkPPMDwgqxMr+eOjIIbC1uWbp8Q==} hasBin: true peerDependencies: - '@swc-node/register': ^1.8.0 - '@swc/core': ^1.3.85 + '@swc-node/register': ^1.11.1 + '@swc/core': ^1.15.8 peerDependenciesMeta: '@swc-node/register': optional: true '@swc/core': optional: true - o-stream@0.3.0: - resolution: {integrity: sha512-gbzl6qCJZ609x/M2t25HqCYQagFzWYCtQ84jcuObGr+V8D1Am4EVubkF4J+XFs6ukfiv96vNeiBb8FrbbMZYiQ==} - oauth-sign@0.9.0: resolution: {integrity: sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==} @@ -14360,10 +14346,6 @@ packages: resolution: {integrity: sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw==} engines: {node: '>=20'} - ora@9.4.0: - resolution: {integrity: sha512-84cglkRILFxdtA8hAvLNdMrtBpPNBTrQ9/ulg0FA7xLMnD6mifv+enAIeRmvtv+WgdCE+LPGOfQmtJRrVaIVhQ==} - engines: {node: '>=20'} - ordered-binary@1.6.1: resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} @@ -15116,10 +15098,6 @@ packages: resolution: {integrity: sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==} engines: {node: '>= 0.10'} - rc@1.2.8: - resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} - hasBin: true - react-docgen-typescript@2.4.0: resolution: {integrity: sha512-ZtAp5XTO5HRzQctjPU0ybY0RRCQO19X/8fxn3w7y2VVTUbGHDKULPTL4ky3vB05euSgG5NpALhEhDPvQ56wvXg==} peerDependencies: @@ -16098,6 +16076,10 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + smol-toml@1.6.1: + resolution: {integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==} + engines: {node: '>= 18'} + socket.io-adapter@2.5.6: resolution: {integrity: sha512-DkkO/dz7MGln0dHn5bmN3pPy+JmywNICWrJqVWiVOyvXjWQFIv9c2h24JrQLLFJ2aQVQf/Cvl1vblnd4r2apLQ==} @@ -16433,10 +16415,6 @@ packages: resolution: {integrity: sha512-SlyRoSkdh1dYP0PzclLE7r0M9sgbFKKMFXpFRUMNuKhQSbC6VQIGzq3E0qsfvGJaUFJPGv6Ws1NZ/haTAjfbMA==} engines: {node: '>=12'} - strip-json-comments@2.0.1: - resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} - engines: {node: '>=0.10.0'} - strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} @@ -16829,6 +16807,10 @@ packages: resolution: {integrity: sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q==} engines: {node: '>=14.0.0'} + tmp@0.2.4: + resolution: {integrity: sha512-UdiSoX6ypifLmrfQ/XfiawN6hkjSBpCjhKxxZcWlUUmoXLaCKQU0bx4HF/tdDK2uzRuchf1txGvrWBzYREssoQ==} + engines: {node: '>=14.14'} + tmp@0.2.5: resolution: {integrity: sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow==} engines: {node: '>=14.14'} @@ -21492,6 +21474,11 @@ snapshots: '@emnapi/wasi-threads': 1.2.1 tslib: 2.8.1 + '@emnapi/core@1.4.5': + dependencies: + '@emnapi/wasi-threads': 1.0.4 + tslib: 2.8.1 + '@emnapi/core@1.9.2': dependencies: '@emnapi/wasi-threads': 1.2.1 @@ -21502,11 +21489,19 @@ snapshots: dependencies: tslib: 2.8.1 + '@emnapi/runtime@1.4.5': + dependencies: + tslib: 2.8.1 + '@emnapi/runtime@1.9.2': dependencies: tslib: 2.8.1 optional: true + '@emnapi/wasi-threads@1.0.4': + dependencies: + tslib: 2.8.1 + '@emnapi/wasi-threads@1.2.1': dependencies: tslib: 2.8.1 @@ -23477,29 +23472,29 @@ snapshots: transitivePeerDependencies: - debug - '@nx/devkit@22.4.5(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21)))': + '@nx/devkit@22.7.0(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21)))': dependencies: '@zkochan/js-yaml': 0.0.7 - ejs: 3.1.10 + ejs: 5.0.1 enquirer: 2.3.6 - minimatch: 10.2.5 - nx: 22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21)) + minimatch: 10.2.4 + nx: 22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21)) semver: 7.7.4 tslib: 2.8.1 yargs-parser: 21.1.1 - '@nx/jest@22.4.5(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(node-notifier@9.0.1)(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21)))(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.12.8)(typescript@5.9.3))(typescript@5.9.3)': + '@nx/jest@22.7.0(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(node-notifier@9.0.1)(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21)))(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.12.8)(typescript@5.9.3))(typescript@5.9.3)': dependencies: '@jest/reporters': 30.3.0(node-notifier@9.0.1) '@jest/test-result': 30.3.0 - '@nx/devkit': 22.4.5(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21))) - '@nx/js': 22.4.5(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21))) + '@nx/devkit': 22.7.0(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21))) + '@nx/js': 22.7.0(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21))) '@phenomnomnominal/tsquery': 6.1.4(typescript@5.9.3) identity-obj-proxy: 3.0.0 jest-config: 30.3.0(@types/node@20.12.8)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.12.8)(typescript@5.9.3)) jest-resolve: 30.3.0 jest-util: 30.3.0 - minimatch: 10.2.5 + minimatch: 10.2.4 picocolors: 1.1.1 resolve.exports: 2.0.3 semver: 7.7.4 @@ -23520,7 +23515,7 @@ snapshots: - typescript - verdaccio - '@nx/js@22.4.5(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21)))': + '@nx/js@22.7.0(@babel/traverse@7.29.0)(@swc/core@1.15.30(@swc/helpers@0.5.21))(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21)))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-proposal-decorators': 7.29.0(@babel/core@7.29.0) @@ -23529,8 +23524,8 @@ snapshots: '@babel/preset-env': 7.29.2(@babel/core@7.29.0) '@babel/preset-typescript': 7.28.5(@babel/core@7.29.0) '@babel/runtime': 7.29.2 - '@nx/devkit': 22.4.5(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21))) - '@nx/workspace': 22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21)) + '@nx/devkit': 22.7.0(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21))) + '@nx/workspace': 22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21)) '@zkochan/js-yaml': 0.0.7 babel-plugin-const-enum: 1.2.0(@babel/core@7.29.0) babel-plugin-macros: 3.1.0 @@ -23556,43 +23551,43 @@ snapshots: - nx - supports-color - '@nx/nx-darwin-arm64@22.4.5': + '@nx/nx-darwin-arm64@22.7.0': optional: true - '@nx/nx-darwin-x64@22.4.5': + '@nx/nx-darwin-x64@22.7.0': optional: true - '@nx/nx-freebsd-x64@22.4.5': + '@nx/nx-freebsd-x64@22.7.0': optional: true - '@nx/nx-linux-arm-gnueabihf@22.4.5': + '@nx/nx-linux-arm-gnueabihf@22.7.0': optional: true - '@nx/nx-linux-arm64-gnu@22.4.5': + '@nx/nx-linux-arm64-gnu@22.7.0': optional: true - '@nx/nx-linux-arm64-musl@22.4.5': + '@nx/nx-linux-arm64-musl@22.7.0': optional: true - '@nx/nx-linux-x64-gnu@22.4.5': + '@nx/nx-linux-x64-gnu@22.7.0': optional: true - '@nx/nx-linux-x64-musl@22.4.5': + '@nx/nx-linux-x64-musl@22.7.0': optional: true - '@nx/nx-win32-arm64-msvc@22.4.5': + '@nx/nx-win32-arm64-msvc@22.7.0': optional: true - '@nx/nx-win32-x64-msvc@22.4.5': + '@nx/nx-win32-x64-msvc@22.7.0': optional: true - '@nx/workspace@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21))': + '@nx/workspace@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21))': dependencies: - '@nx/devkit': 22.4.5(nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21))) + '@nx/devkit': 22.7.0(nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21))) '@zkochan/js-yaml': 0.0.7 chalk: 4.1.2 enquirer: 2.3.6 - nx: 22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21)) + nx: 22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21)) picomatch: 4.0.4 semver: 7.7.4 tslib: 2.8.1 @@ -26544,11 +26539,6 @@ snapshots: '@yarnpkg/lockfile@1.1.0': {} - '@yarnpkg/parsers@3.0.2': - dependencies: - js-yaml: 3.14.2 - tslib: 2.8.1 - '@zkochan/js-yaml@0.0.7': dependencies: argparse: 2.0.1 @@ -26691,14 +26681,6 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 - ajv@8.20.0: - dependencies: - fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - optional: true - algoliasearch@5.35.0: dependencies: '@algolia/abtesting': 1.1.0 @@ -27130,6 +27112,14 @@ snapshots: axe-core@4.11.3: {} + axios@1.15.0: + dependencies: + follow-redirects: 1.16.0(debug@4.4.3) + form-data: 4.0.5 + proxy-from-env: 2.1.0 + transitivePeerDependencies: + - debug + axios@1.15.1: dependencies: follow-redirects: 1.16.0(debug@4.4.3) @@ -27560,6 +27550,8 @@ snapshots: balanced-match@2.0.0: {} + balanced-match@4.0.3: {} + balanced-match@4.0.4: {} bare-events@2.8.2: {} @@ -28957,8 +28949,6 @@ snapshots: which-collection: 1.0.2 which-typed-array: 1.1.20 - deep-extend@0.6.0: {} - deep-is@0.1.4: {} deepmerge@4.3.1: {} @@ -29316,6 +29306,10 @@ snapshots: dependencies: dotenv: 16.4.7 + dotenv-expand@12.0.3: + dependencies: + dotenv: 16.6.1 + dotenv@10.0.0: {} dotenv@16.4.7: {} @@ -29373,9 +29367,7 @@ snapshots: ee-first@1.1.1: {} - ejs@3.1.10: - dependencies: - jake: 10.9.4 + ejs@5.0.1: {} electron-to-chromium@1.5.340: {} @@ -30894,10 +30886,6 @@ snapshots: file-uri-to-path@1.0.0: optional: true - filelist@1.0.6: - dependencies: - minimatch: 5.1.9 - filing-cabinet@4.1.6: dependencies: app-module-path: 2.2.0 @@ -31120,10 +31108,6 @@ snapshots: from@0.1.7: {} - front-matter@4.0.2: - dependencies: - js-yaml: 3.14.2 - fs-constants@1.0.0: {} fs-extra@10.1.0: @@ -31624,16 +31608,6 @@ snapshots: ternary-stream: 3.0.0 through2: 3.0.2 - gulp-jsbeautifier@2.1.2: - dependencies: - chalk: 1.1.3 - fancy-log: 1.3.3 - js-beautify: 1.15.4 - lodash: 4.18.1 - plugin-error: 0.1.2 - rc: 1.2.8 - through2: 2.0.5 - gulp-json-editor@2.6.0: dependencies: deepmerge: 4.3.1 @@ -31728,14 +31702,6 @@ snapshots: vinyl: 2.2.1 vinyl-fs: 3.0.3 - gulp-uglify-es@3.0.0: - dependencies: - o-stream: 0.3.0 - plugin-error: 1.0.1 - terser: 5.46.1 - vinyl: 2.2.1 - vinyl-sourcemaps-apply: 0.2.1 - gulp-watch@5.0.1: dependencies: ansi-colors: 1.1.0 @@ -31824,6 +31790,10 @@ snapshots: dependencies: hookified: 1.15.1 + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + hasown@2.0.3: dependencies: function-bind: 1.1.2 @@ -32809,12 +32779,6 @@ snapshots: dependencies: '@isaacs/cliui': 9.0.0 - jake@10.9.4: - dependencies: - async: 3.2.6 - filelist: 1.0.6 - picocolors: 1.1.1 - jasmine-core@4.6.1: {} jasmine-core@5.12.1: {} @@ -35700,7 +35664,7 @@ snapshots: '@angular/compiler-cli': 21.1.6(@angular/compiler@21.2.9)(typescript@5.9.3) '@rollup/plugin-json': 6.1.0(rollup@4.59.0) '@rollup/wasm-node': 4.60.2 - ajv: 8.20.0 + ajv: 8.18.0 ansi-colors: 4.1.3 browserslist: 4.28.2 chokidar: 5.0.0 @@ -35711,7 +35675,7 @@ snapshots: injection-js: 2.6.1 jsonc-parser: 3.3.1 less: 4.6.4 - ora: 9.4.0 + ora: 9.3.0 piscina: 5.1.4 postcss: 8.5.10 rollup-plugin-dts: 6.4.1(rollup@4.59.0)(typescript@5.9.3) @@ -35960,60 +35924,133 @@ snapshots: transitivePeerDependencies: - debug - nx@22.4.5(@swc/core@1.15.30(@swc/helpers@0.5.21)): + nx@22.7.0(@swc/core@1.15.30(@swc/helpers@0.5.21)): dependencies: + '@emnapi/core': 1.4.5 + '@emnapi/runtime': 1.4.5 + '@emnapi/wasi-threads': 1.0.4 + '@jest/diff-sequences': 30.0.1 '@napi-rs/wasm-runtime': 0.2.4 + '@tybys/wasm-util': 0.9.0 '@yarnpkg/lockfile': 1.1.0 - '@yarnpkg/parsers': 3.0.2 '@zkochan/js-yaml': 0.0.7 - axios: 1.15.1 + ansi-colors: 4.1.3 + ansi-regex: 5.0.1 + ansi-styles: 4.3.0 + argparse: 2.0.1 + asynckit: 0.4.0 + axios: 1.15.0 + balanced-match: 4.0.3 + base64-js: 1.5.1 + bl: 4.1.0 + brace-expansion: 5.0.5 + buffer: 5.7.1 + call-bind-apply-helpers: 1.0.2 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 cliui: 8.0.1 + clone: 1.0.4 + color-convert: 2.0.1 + color-name: 1.1.4 + combined-stream: 1.0.8 + defaults: 1.0.4 + define-lazy-prop: 2.0.0 + delayed-stream: 1.0.0 dotenv: 16.4.7 - dotenv-expand: 11.0.7 + dotenv-expand: 12.0.3 + dunder-proto: 1.0.1 + ejs: 5.0.1 + emoji-regex: 8.0.0 + end-of-stream: 1.4.5 enquirer: 2.3.6 + es-define-property: 1.0.1 + es-errors: 1.3.0 + es-object-atoms: 1.1.1 + es-set-tostringtag: 2.1.0 + escalade: 3.2.0 + escape-string-regexp: 1.0.5 figures: 3.2.0 flat: 5.0.2 - front-matter: 4.0.2 + follow-redirects: 1.16.0(debug@4.4.3) + form-data: 4.0.5 + fs-constants: 1.0.0 + function-bind: 1.1.2 + get-caller-file: 2.0.5 + get-intrinsic: 1.3.0 + get-proto: 1.0.1 + gopd: 1.2.0 + has-flag: 4.0.0 + has-symbols: 1.1.0 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + ieee754: 1.2.1 ignore: 7.0.5 - jest-diff: 30.3.0 + inherits: 2.0.4 + is-docker: 2.2.1 + is-fullwidth-code-point: 3.0.0 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + is-wsl: 2.2.0 + json5: 2.2.3 jsonc-parser: 3.2.0 lines-and-columns: 2.0.3 - minimatch: 10.2.5 - node-machine-id: 1.1.12 + log-symbols: 4.1.0 + math-intrinsics: 1.1.0 + mime-db: 1.52.0 + mime-types: 2.1.35 + mimic-fn: 2.1.0 + minimatch: 10.2.4 + minimist: 1.2.8 npm-run-path: 4.0.1 + once: 1.4.0 + onetime: 5.1.2 open: 8.4.2 ora: 5.3.0 + path-key: 3.1.1 + picocolors: 1.1.1 + proxy-from-env: 2.1.0 + readable-stream: 3.6.2 + require-directory: 2.1.1 resolve.exports: 2.0.3 + restore-cursor: 3.1.0 + safe-buffer: 5.2.1 semver: 7.7.4 + signal-exit: 3.0.7 + smol-toml: 1.6.1 string-width: 4.2.3 + string_decoder: 1.3.0 + strip-ansi: 6.0.1 + strip-bom: 3.0.0 + supports-color: 7.2.0 tar-stream: 2.2.0 - tmp: 0.2.5 + tmp: 0.2.4 tree-kill: 1.2.2 tsconfig-paths: 4.2.0 tslib: 2.8.1 + util-deprecate: 1.0.2 + wcwidth: 1.0.1 + wrap-ansi: 7.0.0 + wrappy: 1.0.2 + y18n: 5.0.8 yaml: 2.8.3 yargs: 17.7.2 yargs-parser: 21.1.1 optionalDependencies: - '@nx/nx-darwin-arm64': 22.4.5 - '@nx/nx-darwin-x64': 22.4.5 - '@nx/nx-freebsd-x64': 22.4.5 - '@nx/nx-linux-arm-gnueabihf': 22.4.5 - '@nx/nx-linux-arm64-gnu': 22.4.5 - '@nx/nx-linux-arm64-musl': 22.4.5 - '@nx/nx-linux-x64-gnu': 22.4.5 - '@nx/nx-linux-x64-musl': 22.4.5 - '@nx/nx-win32-arm64-msvc': 22.4.5 - '@nx/nx-win32-x64-msvc': 22.4.5 + '@nx/nx-darwin-arm64': 22.7.0 + '@nx/nx-darwin-x64': 22.7.0 + '@nx/nx-freebsd-x64': 22.7.0 + '@nx/nx-linux-arm-gnueabihf': 22.7.0 + '@nx/nx-linux-arm64-gnu': 22.7.0 + '@nx/nx-linux-arm64-musl': 22.7.0 + '@nx/nx-linux-x64-gnu': 22.7.0 + '@nx/nx-linux-x64-musl': 22.7.0 + '@nx/nx-win32-arm64-msvc': 22.7.0 + '@nx/nx-win32-x64-msvc': 22.7.0 '@swc/core': 1.15.30(@swc/helpers@0.5.21) transitivePeerDependencies: - debug - o-stream@0.3.0: {} - oauth-sign@0.9.0: {} object-assign@4.1.1: {} @@ -36197,7 +36234,7 @@ snapshots: bl: 4.1.0 chalk: 4.1.2 cli-cursor: 3.1.0 - cli-spinners: 2.6.1 + cli-spinners: 2.9.2 is-interactive: 1.0.0 log-symbols: 4.1.0 strip-ansi: 6.0.1 @@ -36250,18 +36287,6 @@ snapshots: stdin-discarder: 0.3.2 string-width: 8.2.0 - ora@9.4.0: - dependencies: - chalk: 5.6.2 - cli-cursor: 5.0.0 - cli-spinners: 3.4.0 - is-interactive: 2.0.0 - is-unicode-supported: 2.1.0 - log-symbols: 7.0.1 - stdin-discarder: 0.3.2 - string-width: 8.2.0 - optional: true - ordered-binary@1.6.1: {} ordered-read-streams@1.0.1: @@ -37110,13 +37135,6 @@ snapshots: iconv-lite: 0.7.2 unpipe: 1.0.0 - rc@1.2.8: - dependencies: - deep-extend: 0.6.0 - ini: 1.3.8 - minimist: 1.2.8 - strip-json-comments: 2.0.1 - react-docgen-typescript@2.4.0(typescript@5.9.3): dependencies: typescript: 5.9.3 @@ -38316,6 +38334,8 @@ snapshots: smart-buffer@4.2.0: {} + smol-toml@1.6.1: {} + socket.io-adapter@2.5.6: dependencies: debug: 4.4.3 @@ -38757,8 +38777,6 @@ snapshots: strip-indent@4.1.1: {} - strip-json-comments@2.0.1: {} - strip-json-comments@3.1.1: {} style-loader@3.3.4(webpack@5.105.4(@swc/core@1.15.30(@swc/helpers@0.5.21))): @@ -39657,6 +39675,8 @@ snapshots: tinyspy@4.0.4: {} + tmp@0.2.4: {} + tmp@0.2.5: {} tmpl@1.0.5: {}