From 2c7256bd8f5bbd4370ab9e1025b0394ad4551e1e Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Wed, 21 Jan 2026 17:43:09 +0200 Subject: [PATCH 1/7] feat(nx-infra-plugin): create `concatenate-files` executor --- packages/nx-infra-plugin/executors.json | 5 + .../concatenate-files/executor.e2e.spec.ts | 92 +++++++++ .../executors/concatenate-files/executor.ts | 177 ++++++++++++++++++ .../executors/concatenate-files/schema.json | 57 ++++++ .../src/executors/concatenate-files/schema.ts | 17 ++ 5 files changed, 348 insertions(+) create mode 100644 packages/nx-infra-plugin/src/executors/concatenate-files/executor.e2e.spec.ts create mode 100644 packages/nx-infra-plugin/src/executors/concatenate-files/executor.ts create mode 100644 packages/nx-infra-plugin/src/executors/concatenate-files/schema.json create mode 100644 packages/nx-infra-plugin/src/executors/concatenate-files/schema.ts diff --git a/packages/nx-infra-plugin/executors.json b/packages/nx-infra-plugin/executors.json index 30a85f6e44a9..4327c540273a 100644 --- a/packages/nx-infra-plugin/executors.json +++ b/packages/nx-infra-plugin/executors.json @@ -59,6 +59,11 @@ "implementation": "./src/executors/localization/executor", "schema": "./src/executors/localization/schema.json", "description": "Generate localization message files and TypeScript CLDR data modules" + }, + "concatenate-files": { + "implementation": "./src/executors/concatenate-files/executor", + "schema": "./src/executors/concatenate-files/schema.json", + "description": "Concatenate files with optional content extraction and transforms" } } } diff --git a/packages/nx-infra-plugin/src/executors/concatenate-files/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/concatenate-files/executor.e2e.spec.ts new file mode 100644 index 000000000000..7e34cbdd15fb --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/concatenate-files/executor.e2e.spec.ts @@ -0,0 +1,92 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import executor from './executor'; +import { ConcatenateFilesExecutorSchema } from './schema'; +import { createTempDir, cleanupTempDir, createMockContext } from '../../utils/test-utils'; +import { writeFileText, readFileText } from '../../utils'; + +describe('ConcatenateFilesExecutor E2E', () => { + let tempDir: string; + let context = createMockContext(); + let projectDir: string; + + beforeEach(async () => { + tempDir = createTempDir('nx-concatenate-e2e-'); + context = createMockContext({ root: tempDir }); + projectDir = path.join(tempDir, 'packages', 'test-lib'); + fs.mkdirSync(projectDir, { recursive: true }); + }); + + afterEach(() => { + cleanupTempDir(tempDir); + }); + + it('should handle devextreme-bundler-config use case', async () => { + const partsDir = path.join(projectDir, 'build', 'gulp', 'bundler-config'); + fs.mkdirSync(partsDir, { recursive: true }); + + await writeFileText( + path.join(partsDir, '01-header.js'), + `// Some preamble to ignore\r\n/// BUNDLER_PARTS\r\n const VERSION = '24.2';\r\n/// BUNDLER_PARTS_END\r\n// trailing code`, + ); + + await writeFileText( + path.join(partsDir, '02-core.js'), + `/// BUNDLER_PARTS\r\n require('./ui/core');\r\n require('./ui/widgets');\r\n/// BUNDLER_PARTS_END`, + ); + + await writeFileText( + path.join(partsDir, '03-footer.js'), + `/// BUNDLER_PARTS\r\n module.exports = DevExpress;\r\n/// BUNDLER_PARTS_END`, + ); + + const options: ConcatenateFilesExecutorSchema = { + sourceFiles: [ + './build/gulp/bundler-config/01-header.js', + './build/gulp/bundler-config/02-core.js', + './build/gulp/bundler-config/03-footer.js', + ], + outputFile: './artifacts/js/bundler-config.js', + header: '/* DevExtreme Bundler Config */\n/* Generated file - do not edit */\n\n', + footer: '\n\n/* End of bundler config */\n', + separator: '\n', + extractPattern: '[^]*BUNDLER_PARTS.*?$([^]*)^.*?BUNDLER_PARTS_END[^]*', + extractPatternFlags: 'gm', + transforms: [ + { find: '^[ ]{4}', replace: '', flags: 'gm' }, + { find: '\\n{3,}', replace: '\n\n', flags: 'g' }, + ], + }; + + const result = await executor(options, context); + + expect(result.success).toBe(true); + + const output = await readFileText( + path.join(projectDir, 'artifacts', 'js', 'bundler-config.js'), + ); + + expect(output.startsWith('/* DevExtreme Bundler Config */')).toBe(true); + + expect(output.endsWith('/* End of bundler config */\n')).toBe(true); + + expect(output).not.toContain('BUNDLER_PARTS'); + expect(output).not.toContain('Some preamble to ignore'); + expect(output).not.toContain('trailing code'); + + expect(output).toContain("const VERSION = '24.2';"); + expect(output).toContain("require('./ui/core');"); + expect(output).toContain("require('./ui/widgets');"); + expect(output).toContain('module.exports = DevExpress;'); + + expect(output).not.toMatch(/^ /m); + + expect(output).not.toContain('\r\n'); + + const versionPos = output.indexOf("VERSION = '24.2'"); + const requirePos = output.indexOf("require('./ui/core')"); + const exportPos = output.indexOf('module.exports'); + expect(versionPos).toBeLessThan(requirePos); + expect(requirePos).toBeLessThan(exportPos); + }); +}); diff --git a/packages/nx-infra-plugin/src/executors/concatenate-files/executor.ts b/packages/nx-infra-plugin/src/executors/concatenate-files/executor.ts new file mode 100644 index 000000000000..39a1d8ca3a3c --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/concatenate-files/executor.ts @@ -0,0 +1,177 @@ +import { PromiseExecutor, logger } from '@nx/devkit'; +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 { logError } from '../../utils/error-handler'; +import { readFileText, writeFileText, exists } from '../../utils/file-operations'; + +const ERROR_MESSAGES = { + SOURCE_FILES_EMPTY: 'sourceFiles must contain at least one file', + SOURCE_NOT_FOUND: (source: string) => `Source file not found: ${source}`, + NO_FILES_MATCH_PATTERN: (pattern: string) => `No files found matching pattern: ${pattern}`, + NO_FILES_RESOLVED: 'No source files found after resolving patterns', + 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); + const match = regex.exec(content); + return match?.[1] ?? content; + } catch { + logger.verbose(`Invalid extractPattern: ${pattern}. Using original content.`); + return content; + } +} + +function applyTransforms(content: string, transforms: TransformRule[]): string { + return transforms.reduce((result, { find, replace, flags = 'g' }) => { + try { + return result.replace(new RegExp(find, flags), replace); + } catch { + logger.verbose(`Invalid transform pattern: ${find}. Skipping.`); + return result; + } + }, content); +} + +function normalizeLineEndings(content: string): string { + return content.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); +} + +function applyHeaderFooter(content: string, header?: string, footer?: string): string { + let result = content; + if (header) result = header + result; + if (footer) result = result + footer; + return result; +} + +async function resolveGlobPattern(pattern: string, projectRoot: string): Promise { + const sourcePath = path.resolve(projectRoot, pattern); + const globPattern = isWindowsOS() ? normalizeGlobPathForWindows(sourcePath) : sourcePath; + const files = await glob(globPattern, { nodir: true }); + + if (files.length === 0) { + logger.verbose(ERROR_MESSAGES.NO_FILES_MATCH_PATTERN(pattern)); + } + + return files.sort(); +} + +async function resolveExactFile(source: string, projectRoot: string): Promise { + const sourcePath = path.resolve(projectRoot, source); + if (!(await exists(sourcePath))) { + throw new Error(ERROR_MESSAGES.SOURCE_NOT_FOUND(source)); + } + return sourcePath; +} + +async function resolveSourceFiles(sourceFiles: string[], projectRoot: string): Promise { + const resolvedFiles: string[] = []; + + for (const source of sourceFiles) { + if (containsGlobPattern(source)) { + const files = await resolveGlobPattern(source, projectRoot); + resolvedFiles.push(...files); + } else { + const file = await resolveExactFile(source, projectRoot); + resolvedFiles.push(file); + } + } + + return resolvedFiles; +} + +async function processFileContent( + filePath: string, + extractPattern?: string, + extractPatternFlags?: string, +): Promise { + const content = await readFileText(filePath); + + if (extractPattern) { + return extractContent(content, extractPattern, extractPatternFlags || 'gm'); + } + + return content; +} + +async function readAndProcessFiles( + files: string[], + projectRoot: string, + options: Pick, +): Promise { + return Promise.all( + files.map(async (filePath) => { + const content = await processFileContent( + filePath, + options.extractPattern, + options.extractPatternFlags, + ); + logger.verbose(`Processed: ${path.relative(projectRoot, filePath)}`); + return content; + }), + ); +} + +function buildOutput( + contents: string[], + options: Pick< + ConcatenateFilesExecutorSchema, + 'separator' | 'normalizeLineEndings' | 'header' | 'footer' | 'transforms' + >, +): string { + let output = contents.join(options.separator ?? '\n'); + + if (options.normalizeLineEndings !== false) { + output = normalizeLineEndings(output); + } + + output = applyHeaderFooter(output, options.header, options.footer); + + if (options.transforms?.length) { + output = applyTransforms(output, options.transforms); + } + + return output; +} + +const runExecutor: PromiseExecutor = async (options, context) => { + const projectRoot = resolveProjectPath(context); + + if (!options.sourceFiles?.length) { + logger.error(ERROR_MESSAGES.SOURCE_FILES_EMPTY); + return { success: false }; + } + + try { + const resolvedFiles = await resolveSourceFiles(options.sourceFiles, projectRoot); + + if (resolvedFiles.length === 0) { + logger.error(ERROR_MESSAGES.NO_FILES_RESOLVED); + return { success: false }; + } + + logger.verbose(`Concatenating ${resolvedFiles.length} files...`); + + const contents = await readAndProcessFiles(resolvedFiles, projectRoot, options); + const output = buildOutput(contents, options); + + const outputPath = path.resolve(projectRoot, options.outputFile); + await writeFileText(outputPath, output); + logger.verbose(`Created: ${path.relative(projectRoot, outputPath)}`); + + return { success: true }; + } catch (error) { + logError(ERROR_MESSAGES.FAILED_TO_CONCATENATE, error); + return { success: false }; + } +}; + +export default runExecutor; diff --git a/packages/nx-infra-plugin/src/executors/concatenate-files/schema.json b/packages/nx-infra-plugin/src/executors/concatenate-files/schema.json new file mode 100644 index 000000000000..0bea5d738af6 --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/concatenate-files/schema.json @@ -0,0 +1,57 @@ +{ + "$schema": "https://json-schema.org/schema", + "type": "object", + "description": "Concatenate files with optional content extraction and transforms.", + "properties": { + "sourceFiles": { + "type": "array", + "description": "Ordered list of files or glob patterns to concatenate.", + "items": { "type": "string" } + }, + "outputFile": { + "type": "string", + "description": "Output file path relative to project root." + }, + "extractPattern": { + "type": "string", + "description": "Regex pattern to extract content from each file. Uses capture group $1." + }, + "extractPatternFlags": { + "type": "string", + "description": "Regex flags for extractPattern (default: 'gm')", + "default": "gm" + }, + "header": { + "type": "string", + "description": "Header to prepend to output." + }, + "footer": { + "type": "string", + "description": "Footer to append to output." + }, + "transforms": { + "type": "array", + "description": "Regex find/replace transforms applied after concatenation.", + "items": { + "type": "object", + "properties": { + "find": { "type": "string" }, + "replace": { "type": "string" }, + "flags": { "type": "string", "default": "g" } + }, + "required": ["find", "replace"] + } + }, + "normalizeLineEndings": { + "type": "boolean", + "description": "Normalize to LF line endings (default: true)", + "default": true + }, + "separator": { + "type": "string", + "description": "Separator between concatenated files (default: '\\n')", + "default": "\n" + } + }, + "required": ["sourceFiles", "outputFile"] +} diff --git a/packages/nx-infra-plugin/src/executors/concatenate-files/schema.ts b/packages/nx-infra-plugin/src/executors/concatenate-files/schema.ts new file mode 100644 index 000000000000..4e22150e5d5b --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/concatenate-files/schema.ts @@ -0,0 +1,17 @@ +export interface TransformRule { + find: string; + replace: string; + flags?: string; +} + +export interface ConcatenateFilesExecutorSchema { + sourceFiles: string[]; + outputFile: string; + extractPattern?: string; + extractPatternFlags?: string; + header?: string; + footer?: string; + transforms?: TransformRule[]; + normalizeLineEndings?: boolean; + separator?: string; +} From dec07a7dfeffc3435e4aa780bccd75258044101c Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Wed, 21 Jan 2026 17:45:47 +0200 Subject: [PATCH 2/7] chore(devextreme): create nx targets to replace the `bundler-config` gulp task --- packages/devextreme/project.json | 47 ++++++++++++++++++++++++++++++++ 1 file changed, 47 insertions(+) diff --git a/packages/devextreme/project.json b/packages/devextreme/project.json index 6867a8cb1894..e35e3533dd06 100644 --- a/packages/devextreme/project.json +++ b/packages/devextreme/project.json @@ -88,6 +88,53 @@ ], "cache": true }, + "build:devextreme-bundler-config:generate": { + "executor": "devextreme-nx-infra-plugin:concatenate-files", + "options": { + "sourceFiles": [ + "./build/bundle-templates/modules/parts/core.js", + "./build/bundle-templates/modules/parts/data.js", + "./build/bundle-templates/modules/parts/widgets-base.js", + "./build/bundle-templates/modules/parts/widgets-web.js", + "./build/bundle-templates/modules/parts/viz.js", + "./build/bundle-templates/modules/parts/aspnet.js" + ], + "outputFile": "./build/bundle-templates/dx.custom.js", + "extractPattern": "[^]*BUNDLER_PARTS.*?$([^]*)^.*?BUNDLER_PARTS_END[^]*", + "extractPatternFlags": "gm", + "header": "\"use strict\";\n\n/* Comment lines below for the widgets you don't require and run \"devextreme-bundler\" in this directory, then include dx.custom.js in your project */\n\n", + "transforms": [ + { + "find": "require *\\( *[\"']..\\/\\.\\.\\/", + "replace": "require('" + }, + { "find": "^[ ]{4}", "replace": "", "flags": "gm" }, + { "find": "\\n{3,}", "replace": "\n\n", "flags": "g" } + ] + }, + "inputs": ["{projectRoot}/build/bundle-templates/modules/parts/**/*.js"], + "outputs": ["{projectRoot}/build/bundle-templates/dx.custom.js"], + "cache": true + }, + "build:devextreme-bundler-config:prod": { + "dependsOn": ["build:devextreme-bundler-config:generate"], + "executor": "devextreme-nx-infra-plugin:concatenate-files", + "options": { + "sourceFiles": ["./build/bundle-templates/dx.custom.js"], + "outputFile": "./artifacts/npm/devextreme/bundles/dx.custom.config.js", + "transforms": [ + { + "find": "require *\\( *[\"']\\.\\.\\/", + "replace": "require('devextreme/" + } + ] + }, + "inputs": ["{projectRoot}/build/bundle-templates/dx.custom.js"], + "outputs": [ + "{projectRoot}/artifacts/npm/devextreme/bundles/dx.custom.config.js" + ], + "cache": true + }, "build:transpile": { "executor": "nx:run-commands", "options": { From 33f1cd901e0b80e5f7bcaaa21576a92a5e2ca6f3 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Fri, 23 Jan 2026 17:36:58 +0200 Subject: [PATCH 3/7] feat(nx-infra-plugin): add babel-transform executor for CJS/ESM transpilation --- packages/nx-infra-plugin/executors.json | 5 + packages/nx-infra-plugin/jest-resolver.js | 23 + packages/nx-infra-plugin/jest.config.ts | 2 + packages/nx-infra-plugin/package.json | 33 + .../babel-transform/executor.e2e.spec.ts | 157 ++++ .../src/executors/babel-transform/executor.ts | 136 +++ .../src/executors/babel-transform/schema.json | 44 + .../src/executors/babel-transform/schema.ts | 9 + pnpm-lock.yaml | 849 +++++++----------- 9 files changed, 733 insertions(+), 525 deletions(-) create mode 100644 packages/nx-infra-plugin/jest-resolver.js create mode 100644 packages/nx-infra-plugin/src/executors/babel-transform/executor.e2e.spec.ts create mode 100644 packages/nx-infra-plugin/src/executors/babel-transform/executor.ts create mode 100644 packages/nx-infra-plugin/src/executors/babel-transform/schema.json create mode 100644 packages/nx-infra-plugin/src/executors/babel-transform/schema.ts diff --git a/packages/nx-infra-plugin/executors.json b/packages/nx-infra-plugin/executors.json index 4327c540273a..6dcdf6cd6818 100644 --- a/packages/nx-infra-plugin/executors.json +++ b/packages/nx-infra-plugin/executors.json @@ -64,6 +64,11 @@ "implementation": "./src/executors/concatenate-files/executor", "schema": "./src/executors/concatenate-files/schema.json", "description": "Concatenate files with optional content extraction and transforms" + }, + "babel-transform": { + "implementation": "./src/executors/babel-transform/executor", + "schema": "./src/executors/babel-transform/schema.json", + "description": "Transform JavaScript/TypeScript files using Babel with configurable presets" } } } diff --git a/packages/nx-infra-plugin/jest-resolver.js b/packages/nx-infra-plugin/jest-resolver.js new file mode 100644 index 000000000000..f048221ec13d --- /dev/null +++ b/packages/nx-infra-plugin/jest-resolver.js @@ -0,0 +1,23 @@ +const isModuleNotFoundInPnpmSymlinks = (error) => error.code === 'MODULE_NOT_FOUND'; + +const resolveWithJest = (request, options) => options.defaultResolver(request, options); + +const resolveWithNodeFollowingPnpmSymlinks = (request, basedir) => + require.resolve(request, { paths: [basedir] }); + +function pnpmCompatibleResolver(request, options) { + try { + return resolveWithJest(request, options); + } catch (jestFailedToFollowPnpmSymlinks) { + if (isModuleNotFoundInPnpmSymlinks(jestFailedToFollowPnpmSymlinks)) { + try { + return resolveWithNodeFollowingPnpmSymlinks(request, options.basedir); + } catch { + throw jestFailedToFollowPnpmSymlinks; + } + } + throw jestFailedToFollowPnpmSymlinks; + } +} + +module.exports = pnpmCompatibleResolver; diff --git a/packages/nx-infra-plugin/jest.config.ts b/packages/nx-infra-plugin/jest.config.ts index e4469f98d5f8..3018f786939b 100644 --- a/packages/nx-infra-plugin/jest.config.ts +++ b/packages/nx-infra-plugin/jest.config.ts @@ -6,5 +6,7 @@ export default { transform: { '^.+\\.ts$': ['ts-jest', { tsconfig: '/tsconfig.spec.json' }], }, + transformIgnorePatterns: ['node_modules', '\\.js$', '\\.cjs$', '\\.json$'], moduleFileExtensions: ['ts', 'js', 'html'], + resolver: '/jest-resolver.js', }; diff --git a/packages/nx-infra-plugin/package.json b/packages/nx-infra-plugin/package.json index d43279a163ef..8a2a4662e732 100644 --- a/packages/nx-infra-plugin/package.json +++ b/packages/nx-infra-plugin/package.json @@ -19,10 +19,42 @@ "rimraf": "3.0.2" }, "peerDependencies": { + "@babel/core": ">=7.0.0", + "@babel/plugin-transform-modules-commonjs": ">=7.0.0", + "@babel/plugin-transform-object-rest-spread": ">=7.0.0", + "@babel/plugin-transform-runtime": ">=7.0.0", + "@babel/preset-env": ">=7.0.0", + "babel-plugin-add-module-exports": ">=1.0.0", + "babel-plugin-inferno": ">=6.0.0", + "core-js-compat": ">=3.0.0", "karma": ">=6.0.0", "ng-packagr": ">=19.0.0" }, "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "@babel/plugin-transform-modules-commonjs": { + "optional": true + }, + "@babel/plugin-transform-object-rest-spread": { + "optional": true + }, + "@babel/plugin-transform-runtime": { + "optional": true + }, + "@babel/preset-env": { + "optional": true + }, + "babel-plugin-add-module-exports": { + "optional": true + }, + "babel-plugin-inferno": { + "optional": true + }, + "core-js-compat": { + "optional": true + }, "karma": { "optional": true }, @@ -31,6 +63,7 @@ } }, "devDependencies": { + "@types/babel__core": "7.20.5", "@types/fs-extra": "11.0.4", "@types/jest": "29.5.14", "@types/normalize-path": "3.0.2", diff --git a/packages/nx-infra-plugin/src/executors/babel-transform/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/babel-transform/executor.e2e.spec.ts new file mode 100644 index 000000000000..9b8f5810b493 --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/babel-transform/executor.e2e.spec.ts @@ -0,0 +1,157 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import executor from './executor'; +import { BabelTransformExecutorSchema } from './schema'; +import { + createTempDir, + cleanupTempDir, + createMockContext, + findWorkspaceRoot, +} from '../../utils/test-utils'; +import { writeFileText, readFileText } from '../../utils'; + +const WORKSPACE_ROOT = findWorkspaceRoot(); + +const BABEL_CONFIG = ` +'use strict'; + +const common = { + plugins: [ + ['babel-plugin-inferno', { 'imports': true }], + ['@babel/plugin-transform-object-rest-spread', { loose: true }], + ], + ignore: ['**/*.json'], +}; + +const targets = { ios: 15, android: 95, samsung: 13 }; + +module.exports = { + cjs: Object.assign({}, common, { + presets: [['@babel/preset-env', { targets }]], + plugins: common.plugins.concat([ + ['add-module-exports', { addDefaultProperty: true }], + ['@babel/plugin-transform-modules-commonjs', { strict: true }] + ]) + }), + esm: Object.assign({}, common, { + presets: [['@babel/preset-env', { targets, modules: false }]], + plugins: common.plugins.concat([ + ['@babel/plugin-transform-runtime', { useESModules: true, version: '7.5.0' }] + ]) + }) +}; +`; + +describe('BabelTransformExecutor E2E', () => { + let tempDir: string; + let context = createMockContext(); + let projectDir: string; + + beforeEach(async () => { + tempDir = createTempDir('nx-babel-e2e-'); + context = createMockContext({ root: tempDir }); + projectDir = path.join(tempDir, 'packages', 'test-lib'); + fs.mkdirSync(projectDir, { recursive: true }); + + const workspaceNodeModules = path.join(WORKSPACE_ROOT, 'node_modules'); + const tempNodeModules = path.join(projectDir, 'node_modules'); + fs.symlinkSync(workspaceNodeModules, tempNodeModules, 'junction'); + + const buildDir = path.join(projectDir, 'build', 'gulp'); + fs.mkdirSync(buildDir, { recursive: true }); + await writeFileText(path.join(buildDir, 'transpile-config.js'), BABEL_CONFIG); + + const jsDir = path.join(projectDir, 'js'); + fs.mkdirSync(jsDir, { recursive: true }); + + await writeFileText( + path.join(jsDir, 'module.js'), + `import { helper } from './utils'; + +export default function greet(name) { + return \`Hello, \${name}!\`; +} + +export const add = (a, b) => a + b; +`, + ); + + await writeFileText( + path.join(jsDir, 'utils.js'), + `export const something = 'test'; + +//#DEBUG +console.log('This is debug code'); +const debugOnly = true; +//#ENDDEBUG + +export function helper() { + return 42; +} +`, + ); + }); + + afterEach(() => { + cleanupTempDir(tempDir); + }); + + describe.each([ + { + configKey: 'cjs', + outDir: './artifacts/transpiled', + shouldContain: ['exports'], + shouldNotContain: ['export default function'], + }, + { + configKey: 'esm', + outDir: './artifacts/esm', + shouldContain: ['export'], + shouldNotContain: ['module.exports'], + }, + ])('$configKey config', ({ configKey, outDir, shouldContain, shouldNotContain }) => { + it('should transform files correctly', async () => { + const options: BabelTransformExecutorSchema = { + babelConfigPath: './build/gulp/transpile-config.js', + configKey, + sourcePattern: './js/**/*.js', + outDir, + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const outputDir = path.join(projectDir, outDir.replace('./', '')); + + expect(fs.existsSync(path.join(outputDir, 'module.js'))).toBe(true); + expect(fs.existsSync(path.join(outputDir, 'utils.js'))).toBe(true); + + const moduleContent = await readFileText(path.join(outputDir, 'module.js')); + + shouldContain.forEach((text) => expect(moduleContent).toContain(text)); + shouldNotContain.forEach((text) => expect(moduleContent).not.toContain(text)); + }, 30000); + }); + + it('should remove DEBUG blocks', async () => { + const options: BabelTransformExecutorSchema = { + babelConfigPath: './build/gulp/transpile-config.js', + configKey: 'cjs', + sourcePattern: './js/**/*.js', + outDir: './artifacts/transpiled-prod', + removeDebug: true, + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const utilsContent = await readFileText( + path.join(projectDir, 'artifacts', 'transpiled-prod', 'utils.js'), + ); + + expect(utilsContent).not.toContain('This is debug code'); + expect(utilsContent).not.toContain('debugOnly'); + expect(utilsContent).toContain('helper'); + expect(utilsContent).toContain('something'); + }, 30000); +}); diff --git a/packages/nx-infra-plugin/src/executors/babel-transform/executor.ts b/packages/nx-infra-plugin/src/executors/babel-transform/executor.ts new file mode 100644 index 000000000000..bba985f5a9f0 --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/babel-transform/executor.ts @@ -0,0 +1,136 @@ +import { PromiseExecutor, logger } from '@nx/devkit'; +import * as path from 'path'; +import * as fs from 'fs-extra'; +import * as babel from '@babel/core'; +import { glob } from 'glob'; +import { BabelTransformExecutorSchema } from './schema'; +import { resolveProjectPath, normalizeGlobPathForWindows } from '../../utils/path-resolver'; +import { isWindowsOS } from '../../utils/common'; + +function removeDebugBlocks(content: string): string { + return content.replace(/\/{2,}\s*#DEBUG[\s\S]*?\/{2,}\s*#ENDDEBUG/g, ''); +} + +function loadBabelConfig( + projectRoot: string, + configPath: string, + configKey: string, +): babel.TransformOptions { + const fullConfigPath = path.join(projectRoot, configPath); + + if (!fs.existsSync(fullConfigPath)) { + throw new Error(`Babel config not found: ${fullConfigPath}`); + } + + const config = require(fullConfigPath); + + if (!config[configKey]) { + const availableKeys = Object.keys(config).join(', '); + throw new Error(`Config key '${configKey}' not found. Available: ${availableKeys}`); + } + + return config[configKey]; +} + +function applyExtensionRenames(filePath: string, renameExtensions: Record): string { + const ext = path.extname(filePath); + + if (ext && ext in renameExtensions) { + return filePath.slice(0, -ext.length) + renameExtensions[ext]; + } + + return filePath; +} + +async function transformFile( + filePath: string, + projectRoot: string, + outDir: string, + sourcePattern: string, + babelConfig: babel.TransformOptions, + removeDebug: boolean, + renameExtensions: Record, +): Promise { + let content = await fs.readFile(filePath, 'utf-8'); + + if (removeDebug) { + content = removeDebugBlocks(content); + } + + const result = await babel.transformAsync(content, { + ...babelConfig, + filename: filePath, + }); + + if (!result?.code) { + throw new Error(`Babel returned no code for ${filePath}`); + } + + const cleanPattern = sourcePattern.replace(/^\.\//, ''); + const globIndex = cleanPattern.search(/\*+/); + const patternBase = + globIndex > 0 + ? cleanPattern.substring(0, globIndex).replace(/\/$/, '') + : cleanPattern.split('/')[0]; + const sourceBase = path.join(projectRoot, patternBase); + const relativePath = path.relative(sourceBase, filePath); + + const renamedRelativePath = applyExtensionRenames(relativePath, renameExtensions); + const outputPath = path.join(projectRoot, outDir, renamedRelativePath); + + await fs.ensureDir(path.dirname(outputPath)); + await fs.writeFile(outputPath, result.code); +} + +const runExecutor: PromiseExecutor = async (options, context) => { + const projectRoot = resolveProjectPath(context); + + try { + const babelConfig = loadBabelConfig(projectRoot, options.babelConfigPath, options.configKey); + const removeDebug = options.removeDebug ?? false; + const renameExtensions = options.renameExtensions ?? {}; + + const sourcePath = path.join(projectRoot, options.sourcePattern); + const globPattern = isWindowsOS() ? normalizeGlobPathForWindows(sourcePath) : sourcePath; + + const sourceFiles = await glob(globPattern, { + absolute: true, + ignore: options.excludePatterns || [], + }); + + if (sourceFiles.length === 0) { + logger.warn('No files matched the source pattern'); + return { success: false }; + } + + logger.verbose( + `Transforming ${sourceFiles.length} files with config '${options.configKey}'...`, + ); + if (removeDebug) { + logger.verbose('Debug blocks will be removed (production mode)'); + } + + await Promise.all( + sourceFiles.map((file) => + transformFile( + file, + projectRoot, + options.outDir, + options.sourcePattern, + babelConfig, + removeDebug, + renameExtensions, + ), + ), + ); + + logger.verbose(`Successfully transformed ${sourceFiles.length} files to ${options.outDir}`); + return { success: true }; + } catch (error) { + const errorMsg = error instanceof Error ? error.message : String(error); + logger.error(`Babel transform failed: ${errorMsg}`); + return { success: false }; + } +}; + +export default runExecutor; diff --git a/packages/nx-infra-plugin/src/executors/babel-transform/schema.json b/packages/nx-infra-plugin/src/executors/babel-transform/schema.json new file mode 100644 index 000000000000..0cd7adbb88ec --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/babel-transform/schema.json @@ -0,0 +1,44 @@ +{ + "$schema": "http://json-schema.org/schema", + "type": "object", + "title": "Babel Transform Executor", + "properties": { + "babelConfigPath": { + "type": "string", + "description": "Path to Babel config file relative to project root (e.g., './build/gulp/transpile-config.js')" + }, + "configKey": { + "type": "string", + "description": "Key in the config object to use (e.g., 'cjs', 'tsCjs', 'esm')" + }, + "sourcePattern": { + "type": "string", + "description": "Primary glob pattern for source files to transform (e.g., './js/**/*.js')" + }, + "excludePatterns": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Glob patterns to exclude from processing" + }, + "outDir": { + "type": "string", + "description": "Output directory relative to project root where transformed files will be written" + }, + "removeDebug": { + "type": "boolean", + "default": false, + "description": "Remove #DEBUG...#ENDDEBUG blocks before transpilation (for production builds)" + }, + "renameExtensions": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "description": "Map of file extension renames to apply to output files" + } + }, + "required": ["babelConfigPath", "configKey", "sourcePattern", "outDir"], + "additionalProperties": false +} diff --git a/packages/nx-infra-plugin/src/executors/babel-transform/schema.ts b/packages/nx-infra-plugin/src/executors/babel-transform/schema.ts new file mode 100644 index 000000000000..ff5b4b72d787 --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/babel-transform/schema.ts @@ -0,0 +1,9 @@ +export interface BabelTransformExecutorSchema { + babelConfigPath: string; + configKey: string; + sourcePattern: string; + excludePatterns?: string[]; + outDir: string; + removeDebug?: boolean; + renameExtensions?: Record; +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d8e9c997fac4..f3fc373f885b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2241,6 +2241,30 @@ importers: packages/nx-infra-plugin: dependencies: + '@babel/core': + specifier: '>=7.0.0' + version: 7.28.6 + '@babel/plugin-transform-modules-commonjs': + specifier: '>=7.0.0' + version: 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': + specifier: '>=7.0.0' + version: 7.28.6(@babel/core@7.28.6) + '@babel/plugin-transform-runtime': + specifier: '>=7.0.0' + version: 7.28.5(@babel/core@7.28.6) + '@babel/preset-env': + specifier: '>=7.0.0' + version: 7.28.6(@babel/core@7.28.6) + babel-plugin-add-module-exports: + specifier: '>=1.0.0' + version: 1.0.4 + babel-plugin-inferno: + specifier: '>=6.0.0' + version: 6.8.5(@babel/core@7.28.6) + core-js-compat: + specifier: '>=3.0.0' + version: 3.45.1 fs-extra: specifier: 11.2.0 version: 11.2.0 @@ -2263,6 +2287,9 @@ importers: specifier: 3.0.2 version: 3.0.2 devDependencies: + '@types/babel__core': + specifier: 7.20.5 + version: 7.20.5 '@types/fs-extra': specifier: 11.0.4 version: 11.0.4 @@ -2808,10 +2835,6 @@ packages: resolution: {integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==} engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.5': - resolution: {integrity: sha512-6uFXyCayocRbqhZOB+6XcuZbkMNimwfVGFji8CTZnCzOHVGvDqzvitu1re2AU5LROliz7eQPhB8CpAMvnx9EjA==} - engines: {node: '>=6.9.0'} - '@babel/compat-data@7.28.6': resolution: {integrity: sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==} engines: {node: '>=6.9.0'} @@ -2847,10 +2870,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'} @@ -2863,10 +2882,6 @@ packages: resolution: {integrity: sha512-fXSwMQqitTGeHLBC08Eq5yXz2m37E4pJX1qAU1+2cNedz/ifv/bVXft90VeSav5nFO61EcNgwr0aJxbyPaWBPg==} engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.27.2': - resolution: {integrity: sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==} - engines: {node: '>=6.9.0'} - '@babel/helper-compilation-targets@7.28.6': resolution: {integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==} engines: {node: '>=6.9.0'} @@ -2877,12 +2892,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0 - '@babel/helper-create-class-features-plugin@7.28.5': - resolution: {integrity: sha512-q3WC4JfdODypvxArsJQROfupPBq9+lMwjKq7C33GhbFYJsufD0yd/ziwD+hJucLeWsnFPWZjsU2DNFqBPE7jwQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-create-class-features-plugin@7.28.6': resolution: {integrity: sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==} engines: {node: '>=6.9.0'} @@ -2928,20 +2937,10 @@ packages: resolution: {integrity: sha512-cwM7SBRZcPCLgl8a7cY0soT1SptSzAlMH39vwiRpOQkJlh53r5hdHwLSCZpQdVLT39sZt+CRpNwYG4Y2v77atg==} engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.27.1': - resolution: {integrity: sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==} - engines: {node: '>=6.9.0'} - '@babel/helper-module-imports@7.28.6': resolution: {integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==} engines: {node: '>=6.9.0'} - '@babel/helper-module-transforms@7.28.3': - resolution: {integrity: sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/helper-module-transforms@7.28.6': resolution: {integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==} engines: {node: '>=6.9.0'} @@ -3006,10 +3005,6 @@ packages: resolution: {integrity: sha512-zdf983tNfLZFletc0RRXYrHrucBEg95NIFMkn6K9dbeMYnsgHaSBGcQqdsCSStG2PYwRre0Qc2NNSCXbG+xc6g==} engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.4': - resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} - engines: {node: '>=6.9.0'} - '@babel/helpers@7.28.6': resolution: {integrity: sha512-xOBvwq86HHdB7WUDTfKfT/Vuxh7gElQ+Sfti2Cy6yIWNW05P8iUslOVcZ4/sKbE+/jQaukQAdz/gf3724kYdqw==} engines: {node: '>=6.9.0'} @@ -3057,12 +3052,6 @@ packages: peerDependencies: '@babel/core': ^7.13.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.3': - resolution: {integrity: sha512-b6YTX108evsvE4YgWyQ921ZAFFQm3Bn+CA3+ZXlNVnPhx+UfsVURoPjfGAPCjBgrqo30yX/C2nZGX96DxvR9Iw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6': resolution: {integrity: sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==} engines: {node: '>=6.9.0'} @@ -3119,12 +3108,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.27.1': - resolution: {integrity: sha512-UT/Jrhw57xg4ILHLFnzFpPDlMbcdEicaAtjPQpbj9wa8T4r5KVWCimHcL/460g8Ht0DMxDyjsLgiWSkVjnwPFg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-syntax-import-assertions@7.28.6': resolution: {integrity: sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==} engines: {node: '>=6.9.0'} @@ -3267,12 +3250,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.5': - resolution: {integrity: sha512-45DmULpySVvmq9Pj3X9B+62Xe+DJGov27QravQJU1LLcapR6/10i+gYVAucGGJpHBp5mYxIMK4nDAT/QDLr47g==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-block-scoping@7.28.6': resolution: {integrity: sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==} engines: {node: '>=6.9.0'} @@ -3285,12 +3262,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.27.1': - resolution: {integrity: sha512-D0VcalChDMtuRvJIu3U/fwWjf8ZMykz5iZsg77Nuj821vCKI3zCyRLwRdWbsuJ/uRwZhZ002QtCqIkwC/ZkvbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-class-properties@7.28.6': resolution: {integrity: sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==} engines: {node: '>=6.9.0'} @@ -3303,36 +3274,18 @@ packages: peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-class-static-block@7.28.3': - resolution: {integrity: sha512-LtPXlBbRoc4Njl/oh1CeD/3jC+atytbnf/UqLoqTDcEYGUPj022+rvfkbDYieUrSj3CaV4yHDByPE+T2HwfsJg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.12.0 - '@babel/plugin-transform-class-static-block@7.28.6': resolution: {integrity: sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.12.0 - '@babel/plugin-transform-classes@7.28.4': - resolution: {integrity: sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-classes@7.28.6': resolution: {integrity: sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.27.1': - resolution: {integrity: sha512-lj9PGWvMTVksbWiDT2tW68zGS/cyo4AkZ/QTp0sQT0mjPopCmrSkzxeXkznjqBxzDI6TclZhOJbBmbBLjuOZUw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-computed-properties@7.28.6': resolution: {integrity: sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==} engines: {node: '>=6.9.0'} @@ -3345,12 +3298,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.27.1': - resolution: {integrity: sha512-gEbkDVGRvjj7+T1ivxrfgygpT7GUd4vmODtYpbs0gZATdkX8/iSnOtZSxiZnsgm1YjTgjI6VKBGSJJevkrclzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-dotall-regex@7.28.6': resolution: {integrity: sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==} engines: {node: '>=6.9.0'} @@ -3399,12 +3346,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.28.5': - resolution: {integrity: sha512-D4WIMaFtwa2NizOp+dnoFjRez/ClKiC2BqqImwKd1X28nqBtZEyCYJ2ozQrrzlxAFrcrjxo39S6khe9RNDlGzw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-exponentiation-operator@7.28.6': resolution: {integrity: sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==} engines: {node: '>=6.9.0'} @@ -3435,12 +3376,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.27.1': - resolution: {integrity: sha512-6WVLVJiTjqcQauBhn1LkICsR2H+zm62I3h9faTDKt1qP4jn2o72tSvqMwtGFKGTpojce0gJs+76eZ2uCHRZh0Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-json-strings@7.28.6': resolution: {integrity: sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==} engines: {node: '>=6.9.0'} @@ -3453,12 +3388,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.28.5': - resolution: {integrity: sha512-axUuqnUTBuXyHGcJEVVh9pORaN6wC5bYfE7FGzPiaWa3syib9m7g+/IT/4VgCOe2Upef43PHzeAvcrVek6QuuA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-logical-assignment-operators@7.28.6': resolution: {integrity: sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==} engines: {node: '>=6.9.0'} @@ -3507,42 +3436,18 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.27.1': - resolution: {integrity: sha512-aGZh6xMo6q9vq1JGcw58lZ1Z0+i0xB2x0XaauNIUXd6O1xXc3RwoWEBlsTQrY4KQ9Jf0s5rgD6SiNkaUdJegTA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6': resolution: {integrity: sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.27.1': - resolution: {integrity: sha512-fdPKAcujuvEChxDBJ5c+0BTaS6revLV7CJL08e4m3de8qJfNIuCc2nc7XJYOjBoTMJeqSmwXJ0ypE14RCjLwaw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-numeric-separator@7.28.6': resolution: {integrity: sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.25.9': - resolution: {integrity: sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - - '@babel/plugin-transform-object-rest-spread@7.28.4': - resolution: {integrity: sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-object-rest-spread@7.28.6': resolution: {integrity: sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==} engines: {node: '>=6.9.0'} @@ -3555,24 +3460,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.27.1': - resolution: {integrity: sha512-txEAEKzYrHEX4xSZN4kJ+OfKXFVSWKB2ZxM9dpcE3wT7smwkNmXo5ORRlVzMVdJbD+Q8ILTgSD7959uj+3Dm3Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-catch-binding@7.28.6': resolution: {integrity: sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.28.5': - resolution: {integrity: sha512-N6fut9IZlPnjPwgiQkXNhb+cT8wQKFlJNqcZkWlcTqkcqx6/kU4ynGmLFoa4LViBSirn05YAwk+sQBbPfxtYzQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-optional-chaining@7.28.6': resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} engines: {node: '>=6.9.0'} @@ -3591,24 +3484,12 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.27.1': - resolution: {integrity: sha512-10FVt+X55AjRAYI9BrdISN9/AQWHqldOeZDUoLyif1Kn05a56xVBXb8ZouL8pZ9jem8QpXaOt8TS7RHUIS+GPA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-methods@7.28.6': resolution: {integrity: sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.27.1': - resolution: {integrity: sha512-5J+IhqTi1XPa0DXF83jYOaARrX+41gOewWbkPyjMNRDqgOCqdffGh8L3f/Ek5utaEBZExjSAzcyjmV9SSAWObQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-private-property-in-object@7.28.6': resolution: {integrity: sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==} engines: {node: '>=6.9.0'} @@ -3657,12 +3538,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.4': - resolution: {integrity: sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-regenerator@7.28.6': resolution: {integrity: sha512-eZhoEZHYQLL5uc1gS5e9/oTknS0sSSAtd5TkKMUp3J+S/CaUjagc0kOUPsEbDmMeva0nC3WWl4SxVY6+OBuxfw==} engines: {node: '>=6.9.0'} @@ -3717,12 +3592,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.27.1': - resolution: {integrity: sha512-kpb3HUqaILBJcRFVhFUs6Trdd4mkrzcGXss+6/mxUd273PfbWqSDHRzMT2234gIg2QYfAjvXLSquP1xECSg09Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-spread@7.28.6': resolution: {integrity: sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==} engines: {node: '>=6.9.0'} @@ -3759,12 +3628,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.27.1': - resolution: {integrity: sha512-uW20S39PnaTImxp39O5qFlHLS9LJEmANjMG7SxIhap8rCHqu0Ik+tLEPX5DKmHn6CsWQ7j3lix2tFOa5YtL12Q==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-property-regex@7.28.6': resolution: {integrity: sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==} engines: {node: '>=6.9.0'} @@ -3777,12 +3640,6 @@ packages: peerDependencies: '@babel/core': ^7.0.0-0 - '@babel/plugin-transform-unicode-sets-regex@7.27.1': - resolution: {integrity: sha512-EtkOujbc4cgvb0mlpQefi4NTPBzhSIevblFevACNLUspmrALgmEBdL/XfnyyITfd8fKBZrZys92zOWcik7j9Tw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - '@babel/plugin-transform-unicode-sets-regex@7.28.6': resolution: {integrity: sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==} engines: {node: '>=6.9.0'} @@ -6793,9 +6650,6 @@ packages: '@types/babel__template@7.4.4': resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - '@types/babel__traverse@7.20.6': - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - '@types/babel__traverse@7.28.0': resolution: {integrity: sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==} @@ -6877,9 +6731,6 @@ packages: '@types/express-serve-static-core@5.0.1': resolution: {integrity: sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==} - '@types/express@4.17.21': - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - '@types/express@4.17.25': resolution: {integrity: sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==} @@ -9156,10 +9007,6 @@ packages: resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} engines: {node: '>= 0.6'} - compression@1.7.5: - resolution: {integrity: sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==} - engines: {node: '>= 0.8.0'} - compression@1.8.1: resolution: {integrity: sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==} engines: {node: '>= 0.8.0'} @@ -11422,13 +11269,11 @@ packages: glob@10.5.0: resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.1.0: resolution: {integrity: sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw==} engines: {node: 20 || >=22} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@13.0.0: @@ -11437,11 +11282,11 @@ packages: glob@5.0.15: resolution: {integrity: sha512-c9IPMazfRITpmAAKi22dK1VKxGDX9ehhqfABDriL/lzO92xcUKEJPQHrVA/2YHSNFB4iFlykVmWvwo48nr3OxA==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + deprecated: Glob versions prior to v9 are no longer supported glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + deprecated: Glob versions prior to v9 are no longer supported glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} @@ -14556,10 +14401,6 @@ packages: resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} engines: {node: '>= 0.8'} - on-headers@1.0.2: - resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} - engines: {node: '>= 0.8'} - on-headers@1.1.0: resolution: {integrity: sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==} engines: {node: '>= 0.8'} @@ -15340,7 +15181,6 @@ packages: engines: {node: '>=0.6.0', teleport: '>=0.2.0'} deprecated: |- You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other. - (For a CapTP with native promises, see @endo/eventual-send and @endo/captp) qified@0.5.3: @@ -15982,6 +15822,10 @@ packages: resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==} engines: {node: '>= 0.4'} + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + safe-regex-test@1.1.0: resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==} engines: {node: '>= 0.4'} @@ -16830,6 +16674,9 @@ packages: resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} engines: {node: '>= 0.4'} + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + string.prototype.trimend@1.0.9: resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==} engines: {node: '>= 0.4'} @@ -17133,12 +16980,12 @@ packages: tar@6.2.1: resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} engines: {node: '>=10'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me tar@7.5.2: resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} engines: {node: '>=18'} - deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exhorbitant rates) by contacting i@izs.me teex@1.0.1: resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==} @@ -19614,7 +19461,7 @@ snapshots: chokidar: 4.0.1 convert-source-map: 1.9.0 reflect-metadata: 0.2.2 - semver: 7.7.3 + semver: 7.7.4 tslib: 2.6.3 typescript: 5.5.4 yargs: 17.7.2 @@ -19629,7 +19476,7 @@ snapshots: chokidar: 4.0.1 convert-source-map: 1.9.0 reflect-metadata: 0.2.2 - semver: 7.7.3 + semver: 7.7.4 tslib: 2.6.3 typescript: 5.8.3 yargs: 17.7.2 @@ -19836,22 +19683,20 @@ snapshots: js-tokens: 4.0.0 picocolors: 1.1.1 - '@babel/compat-data@7.28.5': {} - '@babel/compat-data@7.28.6': {} '@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.29.0 + '@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 @@ -19863,15 +19708,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.29.0 + '@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 @@ -19929,14 +19774,6 @@ snapshots: semver: 6.3.1 '@babel/generator@7.26.10': - 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.3': dependencies: '@babel/parser': 7.28.6 '@babel/types': 7.28.6 @@ -19944,7 +19781,7 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.28.5': + '@babel/generator@7.28.3': dependencies: '@babel/parser': 7.28.6 '@babel/types': 7.28.6 @@ -19962,20 +19799,12 @@ 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: '@babel/types': 7.28.6 - '@babel/helper-compilation-targets@7.27.2': - dependencies: - '@babel/compat-data': 7.28.6 - '@babel/helper-validator-option': 7.27.1 - browserslist: 4.28.1 - lru-cache: 5.1.1 - semver: 6.3.1 - '@babel/helper-compilation-targets@7.28.6': dependencies: '@babel/compat-data': 7.28.6 @@ -19997,7 +19826,7 @@ 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.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.27.3 @@ -20050,6 +19879,13 @@ snapshots: regexpu-core: 6.2.0 semver: 6.3.1 + '@babel/helper-create-regexp-features-plugin@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-annotate-as-pure': 7.27.3 + 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 @@ -20142,13 +19978,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-imports@7.27.1': - dependencies: - '@babel/traverse': 7.28.6 - '@babel/types': 7.28.6 - transitivePeerDependencies: - - supports-color - '@babel/helper-module-imports@7.28.6': dependencies: '@babel/traverse': 7.28.6 @@ -20156,7 +19985,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.26.10)': + '@babel/helper-module-transforms@7.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-module-imports': 7.28.6 @@ -20165,7 +19994,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.3(@babel/core@7.26.9)': + '@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 @@ -20174,15 +20003,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-module-transforms@7.28.6(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@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 @@ -20218,7 +20038,7 @@ snapshots: '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -20227,7 +20047,7 @@ snapshots: '@babel/core': 7.28.4 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -20236,7 +20056,7 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-wrap-function': 7.28.3 - '@babel/traverse': 7.28.6 + '@babel/traverse': 7.28.5 transitivePeerDependencies: - supports-color @@ -20249,6 +20069,24 @@ snapshots: transitivePeerDependencies: - supports-color + '@babel/helper-replace-supers@7.27.1(@babel/core@7.28.4)': + dependencies: + '@babel/core': 7.28.4 + '@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.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@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.26.10)': dependencies: '@babel/core': 7.26.10 @@ -20285,7 +20123,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': {} @@ -20301,11 +20139,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helpers@7.28.4': - dependencies: - '@babel/template': 7.28.6 - '@babel/types': 7.28.6 - '@babel/helpers@7.28.6': dependencies: '@babel/template': 7.28.6 @@ -20324,7 +20157,7 @@ snapshots: '@babel/parser@7.26.2': dependencies: - '@babel/types': 7.28.6 + '@babel/types': 7.28.5 '@babel/parser@7.28.6': dependencies: @@ -20411,7 +20244,7 @@ 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.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 @@ -20438,7 +20271,7 @@ snapshots: '@babel/plugin-proposal-decorators@7.25.9(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.28.6) + '@babel/helper-create-class-features-plugin': 7.25.9(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-decorators': 7.25.9(@babel/core@7.28.6) transitivePeerDependencies: @@ -20491,7 +20324,7 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-assertions@7.27.1(@babel/core@7.26.10)': + '@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 @@ -20511,7 +20344,12 @@ snapshots: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-syntax-import-attributes@7.27.1(@babel/core@7.28.6)': + dependencies: + '@babel/core': 7.28.6 + '@babel/helper-plugin-utils': 7.28.6 + + '@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 @@ -20589,19 +20427,19 @@ snapshots: '@babel/plugin-syntax-unicode-sets-regex@7.18.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-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-syntax-unicode-sets-regex@7.18.6(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.26.10)': @@ -20622,35 +20460,35 @@ 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.5 + '@babel/traverse': 7.28.6 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.0(@babel/core@7.28.4)': dependencies: - '@babel/core': 7.26.10 + '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) '@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.26.10)': dependencies: - '@babel/core': 7.28.4 + '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -20676,8 +20514,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 @@ -20685,27 +20523,27 @@ 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.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.28.4) 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.26.10)': dependencies: - '@babel/core': 7.28.4 + '@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.28.4) + '@babel/helper-remap-async-to-generator': 7.27.1(@babel/core@7.26.10) transitivePeerDependencies: - supports-color @@ -20742,7 +20580,7 @@ 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)': + '@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 @@ -20765,10 +20603,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-class-properties@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-class-properties@7.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.28.5(@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 @@ -20797,10 +20635,10 @@ 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.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.28.5(@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 @@ -20821,14 +20659,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-classes@7.28.4(@babel/core@7.26.10)': + '@babel/plugin-transform-classes@7.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-globals': 7.28.0 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) + '@babel/helper-replace-supers': 7.28.6(@babel/core@7.26.10) '@babel/traverse': 7.28.6 transitivePeerDependencies: - supports-color @@ -20857,7 +20695,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-computed-properties@7.27.1(@babel/core@7.26.10)': + '@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 @@ -20899,10 +20737,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@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)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-create-regexp-features-plugin': 7.27.1(@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.4)': @@ -20932,18 +20770,18 @@ 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.28.6 - '@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.28.6 + '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.0(@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.29.0(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 @@ -20986,7 +20824,7 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@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)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 @@ -21073,7 +20911,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@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)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 @@ -21103,7 +20941,7 @@ 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)': + '@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 @@ -21238,19 +21076,19 @@ snapshots: '@babel/plugin-transform-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.28.5(@babel/core@7.26.10) + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-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.28.5(@babel/core@7.28.4) + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-named-capturing-groups-regex@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.6) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.26.10)': @@ -21268,7 +21106,7 @@ 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)': + '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 @@ -21283,7 +21121,7 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-numeric-separator@7.27.1(@babel/core@7.26.10)': + '@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 @@ -21298,14 +21136,7 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-object-rest-spread@7.25.9(@babel/core@7.28.6)': - dependencies: - '@babel/core': 7.28.6 - '@babel/helper-compilation-targets': 7.28.6 - '@babel/helper-plugin-utils': 7.28.6 - '@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)': + '@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 @@ -21342,7 +21173,7 @@ snapshots: dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.26.10) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.26.10) transitivePeerDependencies: - supports-color @@ -21350,7 +21181,7 @@ snapshots: dependencies: '@babel/core': 7.28.4 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.4) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.4) transitivePeerDependencies: - supports-color @@ -21358,11 +21189,11 @@ snapshots: dependencies: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-replace-supers': 7.28.6(@babel/core@7.28.6) + '@babel/helper-replace-supers': 7.27.1(@babel/core@7.28.6) transitivePeerDependencies: - supports-color - '@babel/plugin-transform-optional-catch-binding@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 @@ -21377,14 +21208,6 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-optional-chaining@7.28.5(@babel/core@7.26.10)': - dependencies: - '@babel/core': 7.26.10 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - transitivePeerDependencies: - - supports-color - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 @@ -21432,10 +21255,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/plugin-transform-private-methods@7.27.1(@babel/core@7.26.10)': + '@babel/plugin-transform-private-methods@7.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 - '@babel/helper-create-class-features-plugin': 7.28.5(@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 @@ -21456,11 +21279,11 @@ 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.28.6(@babel/core@7.26.10)': dependencies: '@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.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 @@ -21537,7 +21360,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regenerator@7.28.4(@babel/core@7.26.10)': + '@babel/plugin-transform-regenerator@7.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 @@ -21552,18 +21375,18 @@ snapshots: '@babel/core': 7.28.6 '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-regexp-modifiers@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.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.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: '@babel/core': 7.28.6 @@ -21600,8 +21423,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) @@ -21648,7 +21471,7 @@ 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.28.6(@babel/core@7.26.10)': dependencies: '@babel/core': 7.26.10 '@babel/helper-plugin-utils': 7.28.6 @@ -21743,10 +21566,10 @@ 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)': + '@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.27.1(@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.4)': @@ -21764,25 +21587,25 @@ snapshots: '@babel/plugin-transform-unicode-regex@7.27.1(@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-create-regexp-features-plugin': 7.27.1(@babel/core@7.26.10) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.4)': dependencies: '@babel/core': 7.28.4 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.4) + '@babel/helper-create-regexp-features-plugin': 7.27.1(@babel/core@7.28.4) '@babel/helper-plugin-utils': 7.28.6 '@babel/plugin-transform-unicode-regex@7.27.1(@babel/core@7.28.6)': dependencies: '@babel/core': 7.28.6 - '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.28.6) + '@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)': + '@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.27.1(@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.4)': @@ -21799,41 +21622,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.29.0(@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) @@ -21841,28 +21664,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) @@ -22085,7 +21908,7 @@ snapshots: '@babel/template@7.27.2': dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@babel/parser': 7.28.6 '@babel/types': 7.28.6 @@ -22097,7 +21920,7 @@ snapshots: '@babel/traverse@7.28.5': dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 '@babel/generator': 7.28.6 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.6 @@ -23868,11 +23691,11 @@ snapshots: '@npmcli/fs@4.0.0': dependencies: - semver: 7.7.3 + semver: 7.7.4 '@npmcli/fs@5.0.0': dependencies: - semver: 7.7.3 + semver: 7.7.4 '@npmcli/git@6.0.3': dependencies: @@ -23882,7 +23705,7 @@ snapshots: npm-pick-manifest: 10.0.0 proc-log: 5.0.0 promise-retry: 2.0.1 - semver: 7.7.3 + semver: 7.7.4 which: 5.0.0 '@npmcli/git@7.0.1': @@ -23893,7 +23716,7 @@ snapshots: npm-pick-manifest: 11.0.3 proc-log: 6.1.0 promise-retry: 2.0.1 - semver: 7.7.3 + semver: 7.7.4 which: 6.0.0 '@npmcli/installed-package-contents@3.0.0': @@ -23912,7 +23735,7 @@ snapshots: hosted-git-info: 8.1.0 json-parse-even-better-errors: 4.0.0 proc-log: 5.0.0 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-license: 3.0.4 '@npmcli/package-json@7.0.4': @@ -23922,7 +23745,7 @@ snapshots: hosted-git-info: 9.0.2 json-parse-even-better-errors: 5.0.0 proc-log: 6.1.0 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-license: 3.0.4 '@npmcli/promise-spawn@8.0.2': @@ -24047,7 +23870,7 @@ snapshots: ignore: 5.3.2 minimatch: 9.0.3 nx: 19.8.14(@swc/core@1.15.3) - semver: 7.7.3 + semver: 7.7.4 tmp: 0.2.5 tslib: 2.6.3 yargs-parser: 21.1.1 @@ -24274,7 +24097,7 @@ snapshots: json5: 2.2.3 msgpackr: 1.11.2 nullthrows: 1.1.1 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - '@swc/helpers' - napi-wasm @@ -24333,7 +24156,7 @@ snapshots: '@parcel/rust': 2.16.3 '@parcel/utils': 2.16.3 nullthrows: 1.1.1 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -24404,7 +24227,7 @@ snapshots: '@parcel/utils': 2.16.3 '@parcel/workers': 2.16.3(@parcel/core@2.16.3) '@swc/core': 1.15.3 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - '@swc/helpers' - napi-wasm @@ -24607,7 +24430,7 @@ snapshots: browserslist: 4.28.1 json5: 2.2.3 nullthrows: 1.1.1 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -24657,7 +24480,7 @@ snapshots: browserslist: 4.28.1 nullthrows: 1.1.1 regenerator-runtime: 0.14.1 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - napi-wasm @@ -24685,7 +24508,7 @@ snapshots: clone: 2.1.2 nullthrows: 1.1.1 postcss-value-parser: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - '@parcel/core' - napi-wasm @@ -24937,7 +24760,7 @@ snapshots: extract-zip: 2.0.1 progress: 2.0.3 proxy-agent: 6.4.0 - semver: 7.7.3 + semver: 7.7.4 tar-fs: 3.1.1 unbzip2-stream: 1.4.3 yargs: 17.7.2 @@ -25470,7 +25293,7 @@ snapshots: react-docgen: 7.1.1 react-dom: 18.0.0(react@18.0.0) resolve: 1.22.11 - semver: 7.7.3 + semver: 7.7.4 storybook: 10.1.10(@testing-library/dom@10.4.0)(prettier@3.6.2)(react-dom@18.0.0(react@18.0.0))(react@18.0.0) tsconfig-paths: 4.2.0 webpack: 5.105.0(@swc/core@1.15.3)(esbuild@0.26.0) @@ -25621,8 +25444,8 @@ snapshots: '@testing-library/dom@9.3.4': dependencies: - '@babel/code-frame': 7.28.6 - '@babel/runtime': 7.28.4 + '@babel/code-frame': 7.27.1 + '@babel/runtime': 7.28.6 '@types/aria-query': 5.0.4 aria-query: 5.1.3 chalk: 4.1.2 @@ -25704,7 +25527,7 @@ snapshots: '@babel/types': 7.28.6 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.28.0 '@types/babel__generator@7.6.8': dependencies: @@ -25715,10 +25538,6 @@ snapshots: '@babel/parser': 7.28.6 '@babel/types': 7.28.6 - '@types/babel__traverse@7.20.6': - dependencies: - '@babel/types': 7.28.6 - '@types/babel__traverse@7.28.0': dependencies: '@babel/types': 7.28.6 @@ -25778,7 +25597,7 @@ snapshots: '@types/eslint-scope@3.7.7': dependencies: - '@types/eslint': 9.6.1 + '@types/eslint': 8.56.12 '@types/estree': 1.0.8 '@types/eslint-visitor-keys@1.0.0': {} @@ -25792,6 +25611,7 @@ snapshots: dependencies: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 + optional: true '@types/estree@0.0.39': {} @@ -25819,13 +25639,6 @@ snapshots: '@types/range-parser': 1.2.7 '@types/send': 0.17.4 - '@types/express@4.17.21': - dependencies: - '@types/body-parser': 1.19.5 - '@types/express-serve-static-core': 4.19.6 - '@types/qs': 6.9.17 - '@types/serve-static': 1.15.7 - '@types/express@4.17.25': dependencies: '@types/body-parser': 1.19.5 @@ -26110,7 +25923,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - semver: 7.7.3 + semver: 7.7.4 ts-api-utils: 1.4.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -26372,7 +26185,7 @@ snapshots: glob: 7.2.3 is-glob: 4.0.3 lodash: 4.17.23 - semver: 7.7.3 + semver: 7.7.4 tsutils: 3.21.0(typescript@3.9.10) optionalDependencies: typescript: 3.9.10 @@ -26386,7 +26199,7 @@ snapshots: debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.3 + semver: 7.7.4 tsutils: 3.21.0(typescript@4.9.5) optionalDependencies: typescript: 4.9.5 @@ -26400,7 +26213,7 @@ snapshots: debug: 4.4.3 globby: 11.1.0 is-glob: 4.0.3 - semver: 7.7.3 + semver: 7.7.4 tsutils: 3.21.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -26415,7 +26228,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.3 - semver: 7.7.3 + semver: 7.7.4 ts-api-utils: 1.4.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -26430,7 +26243,7 @@ snapshots: globby: 11.1.0 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.4 ts-api-utils: 1.4.0(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 @@ -26445,7 +26258,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.52.0 debug: 4.4.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.4.0(typescript@4.9.5) typescript: 4.9.5 @@ -26460,7 +26273,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.52.0 debug: 4.4.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.4.0(typescript@5.5.4) typescript: 5.5.4 @@ -26475,7 +26288,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.52.0 debug: 4.4.3 minimatch: 9.0.5 - semver: 7.7.3 + semver: 7.7.4 tinyglobby: 0.2.15 ts-api-utils: 2.4.0(typescript@5.9.3) typescript: 5.9.3 @@ -26492,7 +26305,7 @@ snapshots: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) eslint: 9.39.2(jiti@2.6.1) eslint-scope: 5.1.1 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color - typescript @@ -26506,7 +26319,7 @@ snapshots: '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.9.3) eslint: 9.39.2(jiti@2.6.1) - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color - typescript @@ -27420,12 +27233,12 @@ snapshots: array.prototype.filter@1.0.4: dependencies: - call-bind: 1.0.8 + call-bind: 1.0.7 define-properties: 1.2.1 - es-abstract: 1.24.0 + es-abstract: 1.23.5 es-array-method-boxes-properly: 1.0.0 - es-object-atoms: 1.1.1 - is-string: 1.1.1 + es-object-atoms: 1.0.0 + is-string: 1.0.7 array.prototype.find@2.2.3: dependencies: @@ -27490,7 +27303,7 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.0 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 is-array-buffer: 3.0.4 is-shared-array-buffer: 1.0.3 @@ -27771,14 +27584,14 @@ snapshots: babel-plugin-jest-hoist@29.6.3: dependencies: - '@babel/template': 7.28.6 + '@babel/template': 7.27.2 '@babel/types': 7.28.6 '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.6 + '@types/babel__traverse': 7.28.0 babel-plugin-macros@2.8.0: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 cosmiconfig: 6.0.0 resolve: 1.22.11 @@ -27930,7 +27743,7 @@ snapshots: '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.28.6) '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.28.6) '@babel/plugin-syntax-class-static-block': 7.14.5(@babel/core@7.28.6) - '@babel/plugin-syntax-import-attributes': 7.28.6(@babel/core@7.28.6) + '@babel/plugin-syntax-import-attributes': 7.27.1(@babel/core@7.28.6) '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.28.6) '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.28.6) '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.28.6) @@ -28481,7 +28294,7 @@ snapshots: canvg@3.0.11: dependencies: - '@babel/runtime': 7.28.4 + '@babel/runtime': 7.28.6 '@types/raf': 3.4.3 core-js: 3.39.0 raf: 3.4.1 @@ -28951,18 +28764,6 @@ snapshots: dependencies: mime-db: 1.54.0 - compression@1.7.5: - dependencies: - bytes: 3.1.2 - compressible: 2.0.18 - debug: 2.6.9 - negotiator: 0.6.4 - on-headers: 1.0.2 - safe-buffer: 5.2.1 - vary: 1.1.2 - transitivePeerDependencies: - - supports-color - compression@1.8.1: dependencies: bytes: 3.1.2 @@ -29373,7 +29174,7 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.4.38) postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: webpack: 5.102.1(@swc/core@1.15.3)(esbuild@0.25.0) @@ -29386,7 +29187,7 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.4.38) postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: webpack: 5.105.0(@swc/core@1.15.3)(esbuild@0.26.0) @@ -29399,7 +29200,7 @@ snapshots: postcss-modules-scope: 3.2.1(postcss@8.4.38) postcss-modules-values: 4.0.0(postcss@8.4.38) postcss-value-parser: 4.2.0 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: webpack: 5.98.0(@swc/core@1.15.3)(esbuild@0.25.4) @@ -29599,11 +29400,11 @@ snapshots: array-buffer-byte-length: 1.0.1 call-bind: 1.0.8 es-get-iterator: 1.1.3 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 is-arguments: 1.1.1 is-array-buffer: 3.0.4 is-date-object: 1.0.5 - is-regex: 1.2.1 + is-regex: 1.1.4 is-shared-array-buffer: 1.0.3 isarray: 2.0.5 object-is: 1.1.6 @@ -29829,7 +29630,7 @@ snapshots: jszip: 3.10.1 readable-stream: 3.6.2 saxes: 5.0.1 - tmp: 0.2.3 + tmp: 0.2.5 unzipper: 0.12.3 uuid: 8.3.2 @@ -30036,7 +29837,7 @@ snapshots: '@one-ini/wasm': 0.1.1 commander: 10.0.1 minimatch: 9.0.1 - semver: 7.7.3 + semver: 7.7.4 ee-first@1.1.1: {} @@ -30264,9 +30065,9 @@ snapshots: object.assign: 4.1.5 regexp.prototype.flags: 1.5.3 safe-array-concat: 1.1.2 - safe-regex-test: 1.1.0 + safe-regex-test: 1.0.3 string.prototype.trim: 1.2.9 - string.prototype.trimend: 1.0.9 + string.prototype.trimend: 1.0.8 string.prototype.trimstart: 1.0.8 typed-array-buffer: 1.0.2 typed-array-byte-length: 1.0.1 @@ -30336,7 +30137,7 @@ snapshots: es-define-property@1.0.0: dependencies: - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 es-define-property@1.0.1: {} @@ -30345,12 +30146,12 @@ snapshots: es-get-iterator@1.1.3: dependencies: call-bind: 1.0.8 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 has-symbols: 1.1.0 is-arguments: 1.1.1 is-map: 2.0.3 is-set: 2.0.3 - is-string: 1.1.1 + is-string: 1.0.7 isarray: 2.0.5 stop-iteration-iterator: 1.0.0 @@ -30387,7 +30188,7 @@ snapshots: es-set-tostringtag@2.0.3: dependencies: - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 has-tostringtag: 1.0.2 hasown: 2.0.2 @@ -30680,7 +30481,7 @@ snapshots: eslint-compat-utils@0.5.1(eslint@9.39.2(jiti@2.6.1)): dependencies: eslint: 9.39.2(jiti@2.6.1) - semver: 7.7.3 + semver: 7.7.4 eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.52.0(eslint@9.39.2(jiti@2.6.1))(typescript@4.9.5))(eslint@9.39.2(jiti@2.6.1)))(eslint@9.39.2(jiti@2.6.1)): dependencies: @@ -31230,7 +31031,7 @@ snapshots: natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 - semver: 7.7.3 + semver: 7.7.4 vue-eslint-parser: 10.0.0(eslint@9.39.2(jiti@2.6.1)) xml-name-validator: 4.0.0 optionalDependencies: @@ -31243,7 +31044,7 @@ snapshots: natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 - semver: 7.7.3 + semver: 7.7.4 vue-eslint-parser: 10.0.0(eslint@9.39.2(jiti@2.6.1)) xml-name-validator: 4.0.0 optionalDependencies: @@ -31339,7 +31140,7 @@ snapshots: eslint-utils: 2.1.0 eslint-visitor-keys: 2.1.0 espree: 7.3.1 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 6.0.1 @@ -31359,7 +31160,7 @@ snapshots: optionator: 0.9.4 progress: 2.0.3 regexpp: 3.2.0 - semver: 7.7.3 + semver: 7.7.4 strip-ansi: 6.0.1 strip-json-comments: 3.1.1 table: 6.9.0 @@ -31390,7 +31191,7 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.6.0 + esquery: 1.7.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 file-entry-cache: 8.0.0 @@ -32044,7 +31845,7 @@ snapshots: fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.105.0(@swc/core@1.15.3)(esbuild@0.26.0)): dependencies: - '@babel/code-frame': 7.28.6 + '@babel/code-frame': 7.29.0 chalk: 4.1.2 chokidar: 4.0.1 cosmiconfig: 8.3.6(typescript@5.9.3) @@ -32054,7 +31855,7 @@ snapshots: minimatch: 3.1.2 node-abort-controller: 3.1.1 schema-utils: 3.3.0 - semver: 7.7.3 + semver: 7.7.4 tapable: 2.3.0 typescript: 5.9.3 webpack: 5.105.0(@swc/core@1.15.3)(esbuild@0.26.0) @@ -32254,7 +32055,7 @@ snapshots: dependencies: call-bind: 1.0.8 es-errors: 1.3.0 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 get-symbol-description@1.1.0: dependencies: @@ -32507,7 +32308,7 @@ snapshots: gopd@1.0.1: dependencies: - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 gopd@1.2.0: {} @@ -32606,7 +32407,7 @@ snapshots: eslint: 9.39.2(jiti@2.6.1) fancy-log: 2.0.0 plugin-error: 2.0.1 - semver: 7.7.3 + semver: 7.7.4 ternary-stream: 3.0.0 vinyl-fs: 4.0.0 optionalDependencies: @@ -33249,18 +33050,6 @@ snapshots: transitivePeerDependencies: - supports-color - http-proxy-middleware@2.0.9(@types/express@4.17.21): - dependencies: - '@types/http-proxy': 1.17.15 - http-proxy: 1.18.1(debug@4.4.3) - is-glob: 4.0.3 - is-plain-obj: 3.0.0 - micromatch: 4.0.8 - optionalDependencies: - '@types/express': 4.17.21 - transitivePeerDependencies: - - debug - http-proxy-middleware@2.0.9(@types/express@4.17.25): dependencies: '@types/http-proxy': 1.17.15 @@ -33551,7 +33340,7 @@ snapshots: is-array-buffer@3.0.4: dependencies: call-bind: 1.0.8 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 is-array-buffer@3.0.5: dependencies: @@ -33887,7 +33676,7 @@ snapshots: is-weakset@2.0.3: dependencies: call-bind: 1.0.8 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 is-what@3.14.1: {} @@ -33941,7 +33730,7 @@ snapshots: '@babel/parser': 7.28.6 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -34698,7 +34487,7 @@ snapshots: jest-util: 29.7.0 natural-compare: 1.4.0 pretty-format: 29.7.0 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -35632,7 +35421,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 make-error@1.3.6: {} @@ -36443,7 +36232,7 @@ snapshots: make-fetch-happen: 14.0.3 nopt: 8.1.0 proc-log: 5.0.0 - semver: 7.7.3 + semver: 7.7.4 tar: 7.5.2 tinyglobby: 0.2.15 which: 5.0.0 @@ -36458,7 +36247,7 @@ snapshots: make-fetch-happen: 15.0.3 nopt: 9.0.0 proc-log: 6.1.0 - semver: 7.7.3 + semver: 7.7.4 tar: 7.5.2 tinyglobby: 0.2.15 which: 6.0.0 @@ -36473,7 +36262,7 @@ snapshots: dependencies: growly: 1.3.0 is-wsl: 2.2.0 - semver: 7.7.3 + semver: 7.7.4 shellwords: 0.1.1 uuid: 8.3.2 which: 2.0.2 @@ -36531,7 +36320,7 @@ snapshots: dependencies: hosted-git-info: 4.1.0 is-core-module: 2.16.1 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-license: 3.0.4 normalize-path@2.1.1: @@ -36556,11 +36345,11 @@ snapshots: npm-install-checks@7.1.1: dependencies: - semver: 7.7.3 + semver: 7.7.4 npm-install-checks@8.0.0: dependencies: - semver: 7.7.3 + semver: 7.7.4 npm-normalize-package-bin@4.0.0: {} @@ -36570,21 +36359,21 @@ snapshots: dependencies: hosted-git-info: 7.0.2 proc-log: 3.0.0 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-name: 5.0.1 npm-package-arg@12.0.2: dependencies: hosted-git-info: 8.1.0 proc-log: 5.0.0 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-name: 6.0.0 npm-package-arg@13.0.1: dependencies: hosted-git-info: 9.0.2 proc-log: 5.0.0 - semver: 7.7.3 + semver: 7.7.4 validate-npm-package-name: 6.0.0 npm-packlist@10.0.3: @@ -36601,14 +36390,14 @@ snapshots: npm-install-checks: 7.1.1 npm-normalize-package-bin: 4.0.0 npm-package-arg: 12.0.2 - semver: 7.7.3 + semver: 7.7.4 npm-pick-manifest@11.0.3: dependencies: npm-install-checks: 8.0.0 npm-normalize-package-bin: 5.0.0 npm-package-arg: 13.0.1 - semver: 7.7.3 + semver: 7.7.4 npm-registry-fetch@18.0.2: dependencies: @@ -36679,7 +36468,7 @@ snapshots: open: 8.4.2 strip-json-comments: 3.1.1 tar: 6.2.1 - yargs-parser: 21.1.1 + yargs-parser: 22.0.0 transitivePeerDependencies: - debug @@ -36856,8 +36645,6 @@ snapshots: dependencies: ee-first: 1.1.1 - on-headers@1.0.2: {} - on-headers@1.1.0: {} once@1.4.0: @@ -37449,7 +37236,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.5.4) jiti: 1.21.6 postcss: 8.5.2 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: webpack: 5.98.0(@swc/core@1.15.3)(esbuild@0.25.4) transitivePeerDependencies: @@ -37460,7 +37247,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.8.3) jiti: 1.21.6 postcss: 8.5.2 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: webpack: 5.98.0(@swc/core@1.15.3)(esbuild@0.25.4) transitivePeerDependencies: @@ -37471,7 +37258,7 @@ snapshots: cosmiconfig: 9.0.0(typescript@5.9.3) jiti: 2.6.1 postcss: 8.5.6 - semver: 7.7.3 + semver: 7.7.4 optionalDependencies: webpack: 5.102.1(@swc/core@1.15.3)(esbuild@0.25.0) transitivePeerDependencies: @@ -37487,13 +37274,13 @@ snapshots: dependencies: icss-utils: 5.1.0(postcss@8.4.38) postcss: 8.4.38 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.0.0 postcss-value-parser: 4.2.0 postcss-modules-scope@3.2.1(postcss@8.4.38): dependencies: postcss: 8.4.38 - postcss-selector-parser: 7.1.1 + postcss-selector-parser: 7.0.0 postcss-modules-values@4.0.0(postcss@8.4.38): dependencies: @@ -38587,8 +38374,8 @@ snapshots: safe-array-concat@1.1.2: dependencies: - call-bind: 1.0.8 - get-intrinsic: 1.3.0 + call-bind: 1.0.7 + get-intrinsic: 1.2.4 has-symbols: 1.0.3 isarray: 2.0.5 @@ -38609,6 +38396,12 @@ snapshots: es-errors: 1.3.0 isarray: 2.0.5 + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.8 + es-errors: 1.3.0 + is-regex: 1.1.4 + safe-regex-test@1.1.0: dependencies: call-bound: 1.0.4 @@ -39022,7 +38815,7 @@ snapshots: define-data-property: 1.1.4 es-errors: 1.3.0 function-bind: 1.1.2 - get-intrinsic: 1.3.0 + get-intrinsic: 1.2.4 gopd: 1.0.1 has-property-descriptors: 1.0.2 @@ -39609,6 +39402,12 @@ snapshots: es-abstract: 1.23.5 es-object-atoms: 1.0.0 + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.8 + define-properties: 1.2.1 + es-object-atoms: 1.1.1 + string.prototype.trimend@1.0.9: dependencies: call-bind: 1.0.8 @@ -40306,7 +40105,7 @@ snapshots: terser@5.39.0: dependencies: - '@jridgewell/source-map': 0.3.6 + '@jridgewell/source-map': 0.3.11 acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -40431,7 +40230,7 @@ snapshots: pinkie: 2.0.4 read-file-relative: 1.2.0 strip-bom: 2.0.0 - testcafe-hammerhead: 31.7.7 + testcafe-hammerhead: 31.7.5 transitivePeerDependencies: - bufferutil - supports-color @@ -40463,7 +40262,7 @@ snapshots: '@babel/plugin-transform-class-static-block': 7.26.0(@babel/core@7.28.6) '@babel/plugin-transform-exponentiation-operator': 7.27.1(@babel/core@7.28.6) '@babel/plugin-transform-for-of': 7.27.1(@babel/core@7.28.6) - '@babel/plugin-transform-object-rest-spread': 7.25.9(@babel/core@7.28.6) + '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.28.6) '@babel/plugin-transform-private-methods': 7.25.9(@babel/core@7.28.6) '@babel/plugin-transform-runtime': 7.23.3(@babel/core@7.28.6) '@babel/preset-env': 7.28.6(@babel/core@7.28.6) @@ -41899,9 +41698,9 @@ snapshots: eslint-scope: 8.4.0 eslint-visitor-keys: 4.2.1 espree: 10.4.0 - esquery: 1.6.0 + esquery: 1.7.0 lodash: 4.17.23 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -41924,7 +41723,7 @@ snapshots: eslint-scope: 5.1.1 eslint-visitor-keys: 1.3.0 espree: 6.2.1 - esquery: 1.6.0 + esquery: 1.7.0 lodash: 4.17.23 transitivePeerDependencies: - supports-color @@ -41938,7 +41737,7 @@ snapshots: espree: 9.6.1 esquery: 1.6.0 lodash: 4.17.23 - semver: 7.7.3 + semver: 7.7.4 transitivePeerDependencies: - supports-color @@ -42134,7 +41933,7 @@ snapshots: dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 + '@types/express': 4.17.25 '@types/express-serve-static-core': 4.19.6 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.7 @@ -42144,11 +41943,11 @@ snapshots: bonjour-service: 1.3.0 chokidar: 3.6.0 colorette: 2.0.20 - compression: 1.7.5 + compression: 1.8.1 connect-history-api-fallback: 2.0.0 express: 4.22.1 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.21) + http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.2.0 launch-editor: 2.9.1 open: 10.2.0 @@ -42172,7 +41971,7 @@ snapshots: dependencies: '@types/bonjour': 3.5.13 '@types/connect-history-api-fallback': 1.5.4 - '@types/express': 4.17.21 + '@types/express': 4.17.25 '@types/express-serve-static-core': 4.19.6 '@types/serve-index': 1.9.4 '@types/serve-static': 1.15.7 @@ -42182,11 +41981,11 @@ snapshots: bonjour-service: 1.3.0 chokidar: 3.6.0 colorette: 2.0.20 - compression: 1.7.5 + compression: 1.8.1 connect-history-api-fallback: 2.0.0 express: 4.22.1 graceful-fs: 4.2.11 - http-proxy-middleware: 2.0.9(@types/express@4.17.21) + http-proxy-middleware: 2.0.9(@types/express@4.17.25) ipaddr.js: 2.2.0 launch-editor: 2.9.1 open: 10.2.0 @@ -42510,7 +42309,7 @@ snapshots: acorn: 8.15.0 browserslist: 4.28.1 chrome-trace-event: 1.0.4 - enhanced-resolve: 5.18.3 + enhanced-resolve: 5.19.0 es-module-lexer: 1.5.4 eslint-scope: 5.1.1 events: 3.3.0 @@ -42523,7 +42322,7 @@ snapshots: schema-utils: 4.3.3 tapable: 2.3.0 terser-webpack-plugin: 5.3.16(@swc/core@1.15.3)(esbuild@0.25.4)(webpack@5.98.0(@swc/core@1.15.3)(esbuild@0.25.4)) - watchpack: 2.4.4 + watchpack: 2.5.1 webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' @@ -42563,7 +42362,7 @@ snapshots: is-bigint: 1.0.4 is-boolean-object: 1.1.2 is-number-object: 1.0.7 - is-string: 1.1.1 + is-string: 1.0.7 is-symbol: 1.0.4 which-boxed-primitive@1.1.1: @@ -42582,7 +42381,7 @@ snapshots: is-date-object: 1.0.5 is-finalizationregistry: 1.0.2 is-generator-function: 1.0.10 - is-regex: 1.2.1 + is-regex: 1.1.4 is-weakref: 1.0.2 isarray: 2.0.5 which-boxed-primitive: 1.0.2 From 50452de52412cef8306d95e98ebe773d8ff17f5e Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Mon, 26 Jan 2026 13:09:28 +0200 Subject: [PATCH 4/7] chore(devextreme): add nx targets for transpile task --- packages/devextreme/project.json | 248 +++++++++++++++++- .../src/executors/copy-files/schema.json | 6 +- 2 files changed, 243 insertions(+), 11 deletions(-) diff --git a/packages/devextreme/project.json b/packages/devextreme/project.json index e35e3533dd06..d723e024e9c0 100644 --- a/packages/devextreme/project.json +++ b/packages/devextreme/project.json @@ -135,23 +135,257 @@ ], "cache": true }, - "build:transpile": { + "clean:dist-ts": { + "executor": "devextreme-nx-infra-plugin:clean", + "options": { + "targetDirectory": "./artifacts/dist_ts" + } + }, + "build:ts:internal": { "executor": "nx:run-commands", "options": { - "command": "cross-env BUILD_ESM_PACKAGE=true gulp transpile", + "command": "gulp ts-compile-internal", "cwd": "{projectRoot}" }, "inputs": [ - "{projectRoot}/js/**/*.js", - "{projectRoot}/build/gulp/transpile.js", - "{projectRoot}/babel.config.cjs" + "{projectRoot}/js/__internal/**/*.{ts,tsx}", + "!{projectRoot}/js/__internal/**/__tests__/**/*", + "{projectRoot}/js/__internal/tsconfig.json" + ], + "outputs": ["{projectRoot}/artifacts/dist_ts"], + "cache": true + }, + "build:cjs": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "options": { + "babelConfigPath": "./build/gulp/transpile-config.js", + "configKey": "cjs", + "sourcePattern": "./js/**/*.{js,jsx}", + "excludePatterns": ["./js/**/*.d.ts", "./js/__internal/**/*"], + "outDir": "./artifacts/transpiled" + }, + "configurations": { + "production": { + "outDir": "./artifacts/transpiled-renovation-npm", + "removeDebug": true + } + }, + "inputs": [ + "{projectRoot}/js/**/*.{js,jsx}", + "!{projectRoot}/js/**/*.d.ts", + "!{projectRoot}/js/__internal/**/*" + ], + "outputs": ["{projectRoot}/artifacts/transpiled"], + "cache": true + }, + "copy:json:transpiled": { + "executor": "devextreme-nx-infra-plugin:copy-files", + "options": { + "files": [ + { "from": "./js/localization/messages", "to": "./artifacts/transpiled/localization/messages" }, + { "from": "./js/viz/vector_map.utils/_settings.json", "to": "./artifacts/transpiled/viz/vector_map.utils/_settings.json" } + ] + }, + "inputs": ["{projectRoot}/js/**/*.json", "!{projectRoot}/js/__internal/**/*"], + "outputs": ["{projectRoot}/artifacts/transpiled/**/*.json"], + "cache": true + }, + "copy:json:transpiled-production": { + "executor": "devextreme-nx-infra-plugin:copy-files", + "options": { + "files": [ + { "from": "./js/localization/messages", "to": "./artifacts/transpiled-renovation-npm/localization/messages" }, + { "from": "./js/viz/vector_map.utils/_settings.json", "to": "./artifacts/transpiled-renovation-npm/viz/vector_map.utils/_settings.json" } + ] + }, + "inputs": ["{projectRoot}/js/**/*.json", "!{projectRoot}/js/__internal/**/*"], + "outputs": ["{projectRoot}/artifacts/transpiled-renovation-npm/**/*.json"], + "cache": true + }, + "copy:json:esm-npm": { + "executor": "devextreme-nx-infra-plugin:copy-files", + "options": { + "files": [ + { "from": "./js/localization/messages", "to": "./artifacts/transpiled-esm-npm/esm/localization/messages" }, + { "from": "./js/viz/vector_map.utils/_settings.json", "to": "./artifacts/transpiled-esm-npm/esm/viz/vector_map.utils/_settings.json" }, + { "from": "./js/localization/messages", "to": "./artifacts/transpiled-esm-npm/cjs/localization/messages" }, + { "from": "./js/viz/vector_map.utils/_settings.json", "to": "./artifacts/transpiled-esm-npm/cjs/viz/vector_map.utils/_settings.json" } + ] + }, + "inputs": ["{projectRoot}/js/**/*.json", "!{projectRoot}/js/__internal/**/*"], + "outputs": ["{projectRoot}/artifacts/transpiled-esm-npm/**/*.json"], + "cache": true + }, + "build:npm:esm": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "options": { + "babelConfigPath": "./build/gulp/transpile-config.js", + "configKey": "esm", + "sourcePattern": "./js/**/*.{js,jsx}", + "excludePatterns": ["./js/**/*.d.ts", "./js/__internal/**/*"], + "outDir": "./artifacts/transpiled-esm-npm/esm", + "removeDebug": true + }, + "inputs": [ + "{projectRoot}/js/**/*.{js,jsx}", + "!{projectRoot}/js/**/*.d.ts", + "!{projectRoot}/js/__internal/**/*" + ], + "outputs": ["{projectRoot}/artifacts/transpiled-esm-npm/esm"], + "cache": true + }, + "build:npm:cjs": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "options": { + "babelConfigPath": "./build/gulp/transpile-config.js", + "configKey": "cjs", + "sourcePattern": "./js/**/*.{js,jsx}", + "excludePatterns": ["./js/**/*.d.ts", "./js/__internal/**/*"], + "outDir": "./artifacts/transpiled-esm-npm/cjs", + "removeDebug": true + }, + "inputs": [ + "{projectRoot}/js/**/*.{js,jsx}", + "!{projectRoot}/js/**/*.d.ts", + "!{projectRoot}/js/__internal/**/*" + ], + "outputs": ["{projectRoot}/artifacts/transpiled-esm-npm/cjs"], + "cache": true + }, + "build:cjs:internal": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "options": { + "babelConfigPath": "./build/gulp/transpile-config.js", + "configKey": "tsCjs", + "sourcePattern": "./artifacts/dist_ts/__internal/**/*.{js,jsx}", + "outDir": "./artifacts/transpiled/__internal", + "renameExtensions": { ".jsx": ".js" } + }, + "configurations": { + "production": { + "outDir": "./artifacts/transpiled-renovation-npm/__internal", + "removeDebug": true + } + }, + "inputs": ["{projectRoot}/artifacts/dist_ts/__internal/**/*.{js,jsx}"], + "outputs": ["{projectRoot}/artifacts/transpiled/__internal"], + "cache": true + }, + "build:npm:esm:internal": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "options": { + "babelConfigPath": "./build/gulp/transpile-config.js", + "configKey": "esm", + "sourcePattern": "./artifacts/dist_ts/__internal/**/*.{js,jsx}", + "outDir": "./artifacts/transpiled-esm-npm/esm/__internal", + "removeDebug": true, + "renameExtensions": { ".jsx": ".js" } + }, + "inputs": ["{projectRoot}/artifacts/dist_ts/__internal/**/*.{js,jsx}"], + "outputs": ["{projectRoot}/artifacts/transpiled-esm-npm/esm/__internal"], + "cache": true + }, + "build:npm:cjs:internal": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "options": { + "babelConfigPath": "./build/gulp/transpile-config.js", + "configKey": "tsCjs", + "sourcePattern": "./artifacts/dist_ts/__internal/**/*.{js,jsx}", + "outDir": "./artifacts/transpiled-esm-npm/cjs/__internal", + "removeDebug": true, + "renameExtensions": { ".jsx": ".js" } + }, + "inputs": ["{projectRoot}/artifacts/dist_ts/__internal/**/*.{js,jsx}"], + "outputs": ["{projectRoot}/artifacts/transpiled-esm-npm/cjs/__internal"], + "cache": true + }, + "build:cjs:bundles": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "options": { + "babelConfigPath": "./build/gulp/transpile-config.js", + "configKey": "cjs", + "sourcePattern": "./build/bundle-templates/**/*.js", + "outDir": "./artifacts/transpiled/bundles", + "removeDebug": true + }, + "configurations": { + "production": { + "outDir": "./artifacts/transpiled-renovation-npm/bundles" + }, + "esm-npm": { + "outDir": "./artifacts/transpiled-esm-npm/bundles" + } + }, + "inputs": ["{projectRoot}/build/bundle-templates/**/*.js"], + "outputs": ["{projectRoot}/artifacts/transpiled/bundles"], + "cache": true + }, + "build:npm:dual-mode": { + "executor": "nx:run-commands", + "options": { + "command": "cross-env BUILD_ESM_PACKAGE=true gulp esm-dual-mode-manifests", + "cwd": "{projectRoot}" + }, + "inputs": [ + "{projectRoot}/artifacts/transpiled-esm-npm/esm/**/*", + "{projectRoot}/artifacts/transpiled-esm-npm/cjs/**/*", + "{projectRoot}/js/**/*.d.ts" + ], + "outputs": [ + "{projectRoot}/artifacts/transpiled-esm-npm/**/package.json" + ], + "cache": true + }, + "build:transpile": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "pnpm nx build:devextreme-bundler-config:generate devextreme", + "pnpm nx build:ts:internal devextreme", + "pnpm nx run-many --targets=build:cjs,build:cjs:internal,build:cjs:bundles --projects=devextreme --parallel", + "pnpm nx copy:json:transpiled devextreme", + "pnpm nx run-many --targets=build:cjs,build:cjs:internal,build:cjs:bundles --projects=devextreme --parallel -c production", + "pnpm nx copy:json:transpiled-production devextreme", + "pnpm nx run-many --targets=build:npm:esm,build:npm:esm:internal,build:npm:cjs,build:npm:cjs:internal --projects=devextreme --parallel", + "pnpm nx copy:json:esm-npm devextreme", + "pnpm nx build:cjs:bundles devextreme -c esm-npm", + "pnpm nx build:npm:dual-mode devextreme", + "pnpm nx clean:dist-ts devextreme" + ], + "cwd": "{projectRoot}", + "parallel": false + }, + "inputs": [ + "{projectRoot}/js/**/*.{js,ts,tsx}", + "!{projectRoot}/js/**/*.d.ts", + "{projectRoot}/build/bundle-templates/**/*.js" ], "outputs": [ "{projectRoot}/artifacts/transpiled", "{projectRoot}/artifacts/transpiled-esm-npm", - "{projectRoot}/artifacts/transpiled-renovation-npm" + "{projectRoot}/artifacts/transpiled-renovation-npm", + "{projectRoot}/build/bundle-templates/dx.custom.js" ], - "cache": true + "cache": true, + "configurations": { + "ci": { + "commands": [ + "pnpm nx build:devextreme-bundler-config:generate devextreme", + "pnpm nx build:ts:internal devextreme", + "pnpm nx run-many --targets=build:cjs,build:cjs:internal,build:cjs:bundles --projects=devextreme --parallel", + "pnpm nx copy:json:transpiled devextreme", + "pnpm nx run-many --targets=build:cjs,build:cjs:internal,build:cjs:bundles --projects=devextreme --parallel -c production", + "pnpm nx copy:json:transpiled-production devextreme", + "pnpm nx run-many --targets=build:npm:cjs,build:npm:cjs:internal --projects=devextreme --parallel", + "pnpm nx clean:dist-ts devextreme" + ], + "outputs": [ + "{projectRoot}/artifacts/transpiled", + "{projectRoot}/artifacts/transpiled-renovation-npm", + "{projectRoot}/build/bundle-templates/dx.custom.js" + ] + } + } }, "bundle:debug": { "executor": "nx:run-commands", 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 10e9cc609c07..08f65d656642 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,15 @@ { - "$schema": "https://json-schema.org/schema", + "$schema": "http://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": "Array of file copy operations to perform.", "items": { "type": "object", "properties": { "from": { "type": "string", - "description": "Source path relative to project root. Supports glob patterns (e.g., './src/*.ts', './assets/**/*')." + "description": "Source path relative to project root. Can be a file, directory, or glob pattern." }, "to": { "type": "string", From 28587c02c509e42dfd1dcc6c2173cc6ede505829 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Mon, 26 Jan 2026 13:12:13 +0200 Subject: [PATCH 5/7] chore(devextreme): remove transpile code migrated to nx executors --- packages/devextreme/build/gulp/transpile.js | 106 ++------------------ packages/devextreme/gulpfile.js | 6 ++ 2 files changed, 16 insertions(+), 96 deletions(-) diff --git a/packages/devextreme/build/gulp/transpile.js b/packages/devextreme/build/gulp/transpile.js index 4d9ee7d19c93..d4d9f8297aff 100644 --- a/packages/devextreme/build/gulp/transpile.js +++ b/packages/devextreme/build/gulp/transpile.js @@ -3,7 +3,6 @@ const babel = require('gulp-babel'); const flatMap = require('gulp-flatmap'); const fs = require('fs'); -const del = require('del'); const gulp = require('gulp'); const normalize = require('normalize-path'); @@ -13,11 +12,9 @@ const plumber = require('gulp-plumber'); const rename = require('gulp-rename'); const replace = require('gulp-replace'); const watch = require('gulp-watch'); -const cache = require('gulp-cache'); const removeDebug = require('./compression-pipes.js').removeDebug; const ctx = require('./context.js'); -const { ifEsmPackage } = require('./utils'); const testsConfig = require('../../testing/tests.babelrc.json'); const transpileConfig = require('./transpile-config'); @@ -58,7 +55,6 @@ const generatedTs = [ ]; const TS_OUTPUT_BASE_DIR = 'artifacts/dist_ts'; -const TS_OUTPUT_SRC = [`${TS_OUTPUT_BASE_DIR}/__internal/**/*.{js,jsx}`]; const TS_COMPILER_CONFIG = { baseAbsPath: path.resolve(__dirname, '../..'), relativePath: { @@ -112,83 +108,17 @@ const transpileTs = (compiler, src) => { return task; }; -const transpileTsClean = () => - async() => await del(TS_OUTPUT_BASE_DIR, { force: true }); - - -const createTranspileTask = (input, output, pipes) => - () => { - let result = gulp.src(input); - - pipes.forEach(pipe => { - result = result.pipe(pipe); - }); - - return result.pipe(gulp.dest(output)); - }; - - -const transpile = (src, dist, { jsPipes, tsPipes }) => { - const transpilePipes = []; - - if(tsPipes) { - const transpileTS = createTranspileTask(TS_OUTPUT_SRC, `${dist}/__internal`, tsPipes); - transpileTS.displayName = `transpile TS: ${dist}`; - transpilePipes.push(transpileTS); - } - - if(jsPipes) { - const transpileJS = createTranspileTask(src, dist, jsPipes); - transpileJS.displayName = `transpile JS: ${dist}`; - transpilePipes.push(transpileJS); - } - - - return gulp.series(...transpilePipes); -}; - -const cachedJsBabelCjs = () => - cache(babel(transpileConfig.cjs), { name: 'babel-cjs' }); - -const bundlesSrc = 'build/bundle-templates/**/*.js'; - -const transpileBundles = (dist) => transpile(bundlesSrc, path.join(dist, './bundles'), { - jsPipes: [ removeDebug(), cachedJsBabelCjs() ], +gulp.task('ts-compile-internal', (done) => { + createTsCompiler(TS_COMPILER_CONFIG).then((compiler) => { + transpileTs(compiler, srcTsPattern)() + .on('end', done) + .on('error', done); + }); }); -const transpileDefault = () => gulp.series( - transpile(src, ctx.TRANSPILED_PATH, { - jsPipes: [ cachedJsBabelCjs() ], - tsPipes: [ babel(transpileConfig.tsCjs) ], - }), - transpileBundles(ctx.TRANSPILED_PATH), -); - -const transpileProd = (dist, isEsm) => transpile( - src, - dist, - { - jsPipes: [ - removeDebug(), - isEsm ? babel(transpileConfig.esm) : cachedJsBabelCjs() - ], - tsPipes: [ - removeDebug(), - isEsm ? babel(transpileConfig.esm) : babel(transpileConfig.tsCjs), - ] - }, -); - -const transpileRenovationProd = (watch) => gulp.series( - transpileProd(ctx.TRANSPILED_PROD_RENOVATION_PATH, false, watch), - transpileBundles(ctx.TRANSPILED_PROD_RENOVATION_PATH), -); - -const transpileEsm = (dist) => gulp.series.apply(gulp, [ - transpileProd(path.join(dist, './cjs'), false), - transpileProd(path.join(dist, './esm'), true), - transpileBundles(dist), - () => gulp +gulp.task('esm-dual-mode-manifests', () => { + const dist = ctx.TRANSPILED_PROD_ESM_PATH; + return gulp .src(esmTranspileSrc) .pipe(flatMap((stream, file) => { const filePath = file.path; @@ -213,25 +143,9 @@ const transpileEsm = (dist) => gulp.series.apply(gulp, [ fPath.extname = '.json'; })); })) - .pipe(gulp.dest(dist)) -]); - -gulp.task('transpile-esm', transpileEsm(ctx.TRANSPILED_PROD_ESM_PATH)); - -gulp.task('transpile', (done) => { - createTsCompiler(TS_COMPILER_CONFIG).then((compiler) => { - gulp.series( - 'bundler-config', - transpileTs(compiler, srcTsPattern), - transpileDefault(), - transpileRenovationProd(), - ifEsmPackage('transpile-esm'), - transpileTsClean(), - )(done); - }); + .pipe(gulp.dest(dist)); }); - const watchJsTask = () => { const watchTask = watch(src) .on('ready', () => console.log('transpile JS is watching for changes...')) diff --git a/packages/devextreme/gulpfile.js b/packages/devextreme/gulpfile.js index 5b7f67fd296b..899e35357cf8 100644 --- a/packages/devextreme/gulpfile.js +++ b/packages/devextreme/gulpfile.js @@ -41,6 +41,12 @@ require('./build/gulp/check_licenses'); require('./build/gulp/systemjs'); require('./build/gulp/state_manager'); +gulp.task('transpile', shell.task( + env.TEST_CI + ? 'pnpm nx run devextreme:build:transpile -c ci' + : 'pnpm nx run devextreme:build:transpile' +)); + if(env.TEST_CI) { console.warn('Using test CI mode!'); } From a6c0aac5ccee7b4163cb58c964d61a9018922850 Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Tue, 27 Jan 2026 12:48:43 +0200 Subject: [PATCH 6/7] fix(devextreme): add missing bundler-config:prod to build:transpile pipeline --- packages/devextreme/project.json | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/devextreme/project.json b/packages/devextreme/project.json index d723e024e9c0..bb9e851651a1 100644 --- a/packages/devextreme/project.json +++ b/packages/devextreme/project.json @@ -341,6 +341,7 @@ "options": { "commands": [ "pnpm nx build:devextreme-bundler-config:generate devextreme", + "pnpm nx build:devextreme-bundler-config:prod devextreme", "pnpm nx build:ts:internal devextreme", "pnpm nx run-many --targets=build:cjs,build:cjs:internal,build:cjs:bundles --projects=devextreme --parallel", "pnpm nx copy:json:transpiled devextreme", @@ -364,13 +365,15 @@ "{projectRoot}/artifacts/transpiled", "{projectRoot}/artifacts/transpiled-esm-npm", "{projectRoot}/artifacts/transpiled-renovation-npm", - "{projectRoot}/build/bundle-templates/dx.custom.js" + "{projectRoot}/build/bundle-templates/dx.custom.js", + "{projectRoot}/artifacts/npm/devextreme/bundles/dx.custom.config.js" ], "cache": true, "configurations": { "ci": { "commands": [ "pnpm nx build:devextreme-bundler-config:generate devextreme", + "pnpm nx build:devextreme-bundler-config:prod devextreme", "pnpm nx build:ts:internal devextreme", "pnpm nx run-many --targets=build:cjs,build:cjs:internal,build:cjs:bundles --projects=devextreme --parallel", "pnpm nx copy:json:transpiled devextreme", @@ -382,7 +385,8 @@ "outputs": [ "{projectRoot}/artifacts/transpiled", "{projectRoot}/artifacts/transpiled-renovation-npm", - "{projectRoot}/build/bundle-templates/dx.custom.js" + "{projectRoot}/build/bundle-templates/dx.custom.js", + "{projectRoot}/artifacts/npm/devextreme/bundles/dx.custom.config.js" ] } } From 226fd56d84ca54f392ad279c2810ad6e1167366a Mon Sep 17 00:00:00 2001 From: Adel Khamatov Date: Tue, 27 Jan 2026 13:11:00 +0200 Subject: [PATCH 7/7] fix(nx-infra-plugin): fix babel-transform E2E tests failing under pnpx nx --- .../executors/babel-transform/executor.e2e.spec.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/nx-infra-plugin/src/executors/babel-transform/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/babel-transform/executor.e2e.spec.ts index 9b8f5810b493..439f71b4f1c8 100644 --- a/packages/nx-infra-plugin/src/executors/babel-transform/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/babel-transform/executor.e2e.spec.ts @@ -46,16 +46,25 @@ describe('BabelTransformExecutor E2E', () => { let tempDir: string; let context = createMockContext(); let projectDir: string; + let savedCwd: string; beforeEach(async () => { + savedCwd = process.cwd(); tempDir = createTempDir('nx-babel-e2e-'); context = createMockContext({ root: tempDir }); projectDir = path.join(tempDir, 'packages', 'test-lib'); fs.mkdirSync(projectDir, { recursive: true }); - const workspaceNodeModules = path.join(WORKSPACE_ROOT, 'node_modules'); + const infraPluginNodeModules = path.join( + WORKSPACE_ROOT, + 'packages', + 'nx-infra-plugin', + 'node_modules', + ); const tempNodeModules = path.join(projectDir, 'node_modules'); - fs.symlinkSync(workspaceNodeModules, tempNodeModules, 'junction'); + fs.symlinkSync(infraPluginNodeModules, tempNodeModules, 'junction'); + + process.chdir(projectDir); const buildDir = path.join(projectDir, 'build', 'gulp'); fs.mkdirSync(buildDir, { recursive: true }); @@ -93,6 +102,7 @@ export function helper() { }); afterEach(() => { + process.chdir(savedCwd); cleanupTempDir(tempDir); });