diff --git a/.github/copilot-instructions.md b/.github/copilot-instructions.md index bf621fa4a7b3..4aea8cabf574 100644 --- a/.github/copilot-instructions.md +++ b/.github/copilot-instructions.md @@ -1,6 +1,6 @@ # DevExtreme Monorepo -DevExtreme is an enterprise-ready suite of UI components for Angular, React, Vue, and jQuery, distributed as a pnpm/Nx monorepo containing the core library, framework wrappers, themes, themebuilder, and test suites. Stack: TypeScript, JavaScript, SCSS, pnpm + Nx, Node, Gulp + custom Nx executors (`devextreme-nx-infra-plugin`). The .NET SDK is required for `devextreme-internal-tools` code generation. +DevExtreme is an enterprise-ready suite of UI components for Angular, React, Vue, and jQuery, distributed as a pnpm/Nx monorepo containing the core library, framework wrappers, themes, themebuilder, and test suites. Stack: TypeScript, JavaScript, SCSS, pnpm + Nx, Node, custom Nx executors (`devextreme-nx-infra-plugin`). The .NET SDK is required for `devextreme-internal-tools` code generation. **DevExtreme** is an enterprise-ready suite of powerful UI components for Angular, React, Vue, and jQuery. This is a large-scale monorepo containing the core library, framework wrappers, demos, and extensive test suites. @@ -61,7 +61,7 @@ pnpm install --frozen-lockfile data/ # Data layer renovation/ # Renovation components (new architecture) testing/ # QUnit tests - build/ # Build scripts and Gulp tasks + build/ # Build config consumed by Nx executors (transpile config, module metadata, templates) artifacts/ # Build output (generated) devextreme-angular/ # Angular wrapper devextreme-react/ # React wrapper @@ -71,7 +71,7 @@ pnpm install --frozen-lockfile devextreme-metadata/ # Metadata generation for wrappers devextreme-monorepo-tools/ # Internal tooling nx-infra-plugin/ # Custom Nx executors for build automation - workflows/ # Cross-package NX build orchestration (all:build-dev, all:build-testing) + workflows/ # Cross-package NX build orchestration (all:build, all:build-dev, all:build-testing) testcafe-models/ # TestCafe page object models /apps/ @@ -87,7 +87,7 @@ pnpm install --frozen-lockfile bundlers/ # Bundler compatibility tests compilation-cases/ # TypeScript compilation tests -/tools/scripts/ # Build and utility scripts +/tools/scripts/ # Leaf helpers invoked by workflows targets (inject-descriptions, versioning, etc.) ``` ### Configuration Files @@ -147,6 +147,10 @@ pnpm run all:build # full production build pnpm nx build:dev devextreme # single package, dev mode pnpm nx build devextreme -c=testing # CI testing configuration pnpm nx build:transpile devextreme # transpile only (babel-transform / build-typescript) +pnpm nx build:transpile:watch devextreme # transpile in watch mode (incremental JS + TS rebuild) +pnpm nx transpile:tests devextreme # transpile testing/**/*.js in place +pnpm nx dev devextreme # build:dev, then start all dev watches +pnpm nx dev-watch devextreme # start all dev watches in parallel, skipping the initial build pnpm nx bundle:debug devextreme # debug bundle (Webpack via nx-infra-plugin) pnpm nx bundle:prod devextreme # production bundle pnpm nx build:localization devextreme # localization files only @@ -185,19 +189,19 @@ packages/ devextreme-metadata/ # metadata for wrapper generation devextreme-monorepo-tools/ # internal tooling nx-infra-plugin/ # custom Nx executors - workflows/ # cross-package Nx orchestration (all:build-dev, all:build-testing) + workflows/ # cross-package Nx orchestration (all:build, all:build-dev, all:build-testing) testcafe-models/ # TestCafe page object models apps/ # demos and per-framework playgrounds (+ react-storybook) e2e/testcafe-devextreme/ # TestCafe e2e suite e2e/{wrappers,bundlers,compilation-cases}/ # integration / bundler / TS compilation tests -tools/scripts/ # build and utility scripts +tools/scripts/ # leaf helpers for workflows targets (not orchestration) ``` For the full executor catalogue, conventions, and refactoring guidance, see @packages/nx-infra-plugin/AGENTS.md. File-specific coding rules live under @.github/instructions/. ## Build Pipeline -clean (`devextreme-nx-infra-plugin:clean` preserving CSS and npm metadata) → localization → component generation (Renovation) → transpile (`babel-transform` for JS, `build-typescript` for TS) → bundle (Webpack via `devextreme-nx-infra-plugin:bundle`, debug + prod targets) → TypeScript declarations → SCSS compile (`devextreme-scss`) → npm package preparation. Task orchestration goes through Nx; cross-package builds (`all:build-dev`, `all:build`) live in the `workflows` package. The `gulpfile.js` clean task is a thin delegate to `pnpm nx clean:artifacts devextreme`. Pre-commit hook runs `lint-staged` (stylelint + eslint --quiet). +clean (`devextreme-nx-infra-plugin:clean` preserving CSS and npm metadata) → localization → component generation (Renovation) → transpile (`babel-transform` for JS, `build-typescript` for TS) → bundle (Webpack via `devextreme-nx-infra-plugin:bundle`, debug + prod targets) → TypeScript declarations → SCSS compile (`devextreme-scss`) → npm package preparation. Task orchestration goes through Nx; cross-package builds (`all:build-dev`, `all:build`) live in the `workflows` package. There is no gulpfile — `clean` runs directly via `pnpm nx clean:artifacts devextreme`. Pre-commit hook runs `lint-staged` (stylelint + eslint --quiet). The developer watch workflow (`pnpm run dev` / `dev:watch`) is native composite Nx targets (`dev`, `dev-watch`) — see the "Former gulp tasks" table in @packages/nx-infra-plugin/AGENTS.md. ## Conventions diff --git a/.github/renovate.json b/.github/renovate.json index a2d0cea00d47..df3d3d21ff4a 100644 --- a/.github/renovate.json +++ b/.github/renovate.json @@ -123,37 +123,6 @@ "matchPackageNames": [ "*" ] - }, - { - "matchPackageNames": [ - "gulp-sass", - "gulp-babel", - "gulp-typescript", - "gulp-clean", - "gulp-minify", - "gulp-replace", - "gulp-sourcemaps", - "gulp-cache", - "gulp-plumber", - "gulp-shell", - "gulp-cached", - "gulp-concat", - "gulp-each", - "gulp-eol", - "gulp-file", - "gulp-flatmap", - "gulp-footer", - "gulp-header", - "gulp-if", - "gulp-jsbeautifier", - "gulp-multi-process", - "gulp-notify", - "gulp-rename", - "gulp-tap", - "gulp-uglify-es", - "gulp-watch" - ], - "enabled": false } ], "lockFileMaintenance": { diff --git a/.github/workflows/packages_publishing.yml b/.github/workflows/packages_publishing.yml index e5a7b4ef6822..a07415e6393e 100644 --- a/.github/workflows/packages_publishing.yml +++ b/.github/workflows/packages_publishing.yml @@ -48,9 +48,7 @@ jobs: run: pnpm run all:set-timestamp-version - name: Build npm packages - env: - BUILD_INTERNAL_PACKAGE: true - run: pnpm run all:build + run: pnpm run all:build:internal - name: Set GitHub Packages auth run: pnpm set //npm.pkg.github.com/:_authToken='${NODE_AUTH_TOKEN}' diff --git a/.github/workflows/renovation.yml b/.github/workflows/renovation.yml index c96e4d586876..f177c1d50ab2 100644 --- a/.github/workflows/renovation.yml +++ b/.github/workflows/renovation.yml @@ -94,7 +94,7 @@ jobs: - name: Build localization working-directory: ./packages/devextreme - run: pnpm exec gulp localization + run: pnpm exec nx build:localization devextreme - name: Check test types run: pnpm exec nx check-types devextreme diff --git a/.vscode/launch.json b/.vscode/launch.json index 26a46ab89d16..37f99bbeedd5 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,21 +19,6 @@ "sourceMaps": true, "cwd": "${workspaceRoot}" }, - { - "type": "node", - "request": "launch", - "name": "Gulp Tests watch", - "program": "${workspaceRoot}/node_modules/gulp/bin/gulp.js", - "args": [ - "build-renovation-testing:watch", - "--playgroundName", - ], - "runtimeArgs": [ - "--harmony" - ], - "sourceMaps": true, - "cwd": "${workspaceRoot}" - }, { "type": "node", "request": "launch", diff --git a/CLAUDE.md b/CLAUDE.md index 64c800141e1d..d7236e7bb750 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -18,7 +18,7 @@ Always use `--frozen-lockfile`. CI enforces it. ## Build -The `dev` script is run manually in WebStorm (not by agents). It runs a Gulp watch build with hot reload and starts the QUnit test server on port 20060: +The `dev` script is run manually in WebStorm (not by agents). It runs an Nx watch build with hot reload and starts the QUnit test server on port 20060: ```bash # From packages/devextreme — run manually, not via agent diff --git a/e2e/bundlers/generate_entry_files.js b/e2e/bundlers/generate_entry_files.js index e19256fd7b46..04a0ba61ca31 100644 --- a/e2e/bundlers/generate_entry_files.js +++ b/e2e/bundlers/generate_entry_files.js @@ -1,7 +1,7 @@ const fs = require('fs'); const path = require('path'); -const modulesMetadataFilePath = path.join(__dirname, '../../packages/devextreme/build/gulp/modules_metadata.json'); +const modulesMetadataFilePath = path.join(__dirname, '../../packages/devextreme/build/modules_metadata.json'); const filePaths = { cjs: path.join(__dirname, './entry/modules_cjs.js'), diff --git a/nx.json b/nx.json index cd96b8337ed7..7a944d5bd316 100644 --- a/nx.json +++ b/nx.json @@ -15,8 +15,7 @@ ], "devextreme-build-config": [ "{projectRoot}/build/**/*", - "{projectRoot}/webpack.config.js", - "{projectRoot}/gulpfile.js" + "{projectRoot}/webpack.config.js" ] }, "targetDefaults": { diff --git a/package.json b/package.json index e9149f4128e5..583c51f2a9f6 100644 --- a/package.json +++ b/package.json @@ -17,10 +17,11 @@ "lint-staged": "lint-staged", "prepare": "husky install", "change-package-scope": "ts-node tools/scripts/change-package-scope.ts", - "make-artifacts-package": "ts-node tools/scripts/make-artifacts-package.ts", - "all:set-timestamp-version": "ts-node tools/scripts/set-timestamp-version.ts", - "all:update-version": "ts-node tools/scripts/update-version.ts", - "all:build": "ts-node tools/scripts/build-all.ts", + "make-artifacts-package": "nx make-artifacts-package workflows", + "all:set-timestamp-version": "nx set-timestamp-version workflows", + "all:update-version": "nx run workflows:update-version --", + "all:build": "nx all:build workflows", + "all:build:internal": "nx all:build workflows -c internal", "all:build-dev": "nx all:build-dev workflows", "all:pack-and-copy": "nx run-many -t pack-and-copy", "demos:prepare": "nx run devextreme-demos:prepare-js", @@ -36,6 +37,7 @@ "@types/node": "catalog:tools", "@types/shelljs": "0.8.15", "axe-core": "catalog:", + "chokidar": "5.0.0", "@types/yargs": "17.0.35", "devextreme-internal-tools": "catalog:tools", "devextreme-metadata": "workspace:*", diff --git a/packages/devextreme-monorepo-tools/project.json b/packages/devextreme-monorepo-tools/project.json index 88a90dfda6e3..ee332b162703 100644 --- a/packages/devextreme-monorepo-tools/project.json +++ b/packages/devextreme-monorepo-tools/project.json @@ -18,7 +18,11 @@ }, "pack-and-copy": { "dependsOn": ["build"], - "command": "ts-node tools/scripts/pack devextreme-monorepo-tools" + "executor": "devextreme-nx-infra-plugin:pack-npm", + "options": { + "packageDir": "./npm", + "destination": "../../artifacts/npm" + } }, "test": { "executor": "@nx/jest:jest", diff --git a/packages/devextreme-scss/package.json b/packages/devextreme-scss/package.json index d4f56ce31229..dc5bb1b2b5db 100644 --- a/packages/devextreme-scss/package.json +++ b/packages/devextreme-scss/package.json @@ -3,7 +3,6 @@ "type": "module", "devDependencies": { "autoprefixer": "10.5.0", - "chokidar": "5.0.0", "clean-css": "5.3.3", "opentype.js": "1.3.4", "postcss": "8.5.10", diff --git a/packages/devextreme-themebuilder/src/metadata/generate.ts b/packages/devextreme-themebuilder/src/metadata/generate.ts index 1d34d99c13f4..6f91eb695f8c 100644 --- a/packages/devextreme-themebuilder/src/metadata/generate.ts +++ b/packages/devextreme-themebuilder/src/metadata/generate.ts @@ -2,9 +2,8 @@ import * as path from 'path'; import MetadataCollector from './collector'; import DependencyCollector from './dependency-collector'; -import { version } from '../../../devextreme/build/gulp/context'; -import { resolveDataUri } from '../../../devextreme/build/gulp/gulp-data-uri'; -import { browserslist } from '../../../devextreme/package.json'; +import { resolveDataUri } from './resolve-data-uri'; +import { browserslist, version } from '../../../devextreme/package.json'; const stylesDirectory = path.resolve(__dirname, '../../../devextreme-scss/scss'); const stylesDestinationDirectory = './src/data/scss'; diff --git a/packages/devextreme-themebuilder/src/metadata/resolve-data-uri.ts b/packages/devextreme-themebuilder/src/metadata/resolve-data-uri.ts new file mode 100644 index 000000000000..1add50214047 --- /dev/null +++ b/packages/devextreme-themebuilder/src/metadata/resolve-data-uri.ts @@ -0,0 +1,25 @@ +import * as path from 'path'; +import * as fs from 'fs'; + +const dataUriRegex = /data-uri\((?:'(image\/svg\+xml;charset=UTF-8)',\s)?['"]?([^)'"]+)['"]?\)/g; + +const svg = (buffer: Buffer, svgEncoding?: string): string => { + const encoding = svgEncoding || 'image/svg+xml;charset=UTF-8'; + const encodedSvg = encodeURIComponent(buffer.toString()); + + return `"data:${encoding},${encodedSvg}"`; +}; + +const img = (buffer: Buffer, ext: string): string => `"data:image/${ext};base64,${buffer.toString('base64')}"`; + +const handler = (_: string, svgEncoding: string, fileName: string): string => { + const relativePath = path.join(__dirname, '..', '..', '..', 'devextreme-scss', fileName); + const filePath = path.resolve(relativePath); + const ext = filePath.split('.').pop() as string; + const data = fs.readFileSync(filePath); + const buffer = Buffer.from(data); + const escapedString = ext === 'svg' ? svg(buffer, svgEncoding) : img(buffer, ext); + return `url(${escapedString})`; +}; + +export const resolveDataUri = (content: string): string => content.replace(dataUriRegex, handler); diff --git a/packages/devextreme/build/gulp/bundler-config.js b/packages/devextreme/build/gulp/bundler-config.js deleted file mode 100644 index 22d073510759..000000000000 --- a/packages/devextreme/build/gulp/bundler-config.js +++ /dev/null @@ -1,45 +0,0 @@ -'use strict'; - -const gulp = require('gulp'); -const replace = require('gulp-replace'); -const concat = require('gulp-concat'); -const rename = require('gulp-rename'); -const header = require('gulp-header'); -const eol = require('gulp-eol'); - -const context = require('./context.js'); -const headerPipes = require('./header-pipes.js'); -const { packageDir } = require('./utils'); - -const BUNDLE_CONFIG_SOURCES = [ - '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' -]; - -gulp.task('bundler-config', function() { - return gulp.src(BUNDLE_CONFIG_SOURCES) - .pipe(replace(/[^]*BUNDLER_PARTS.*?$([^]*)^.*?BUNDLER_PARTS_END[^]*/gm, '$1')) - .pipe(concat('dx.custom.js')) - .pipe(header('/* 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 */')) - .pipe(headerPipes.useStrict()) - .pipe(replace(/require *\( *["']..\/..\//g, 'require(\'')) - .pipe(replace(/^[ ]{4}/gm, '')) - .pipe(replace(/^[\n\r]{2,}/gm, '\n\n')) - .pipe(eol()) - .pipe(gulp.dest('build/bundle-templates')) - .pipe(rename('dx.custom.config.js')) - .pipe(replace(/require *\( *["']..\//g, 'require(\'devextreme/')) - .pipe(gulp.dest(`${context.RESULT_NPM_PATH}/${packageDir}/bundles`)); -}); - -gulp.task('bundler-config-watch', function() { - return gulp - .watch(BUNDLE_CONFIG_SOURCES, gulp.series('bundler-config')) - .on('ready', () => console.log( - 'bundler-config task is watching for changes...' - )); -}); diff --git a/packages/devextreme/build/gulp/context.js b/packages/devextreme/build/gulp/context.js deleted file mode 100644 index 43e65aa3f394..000000000000 --- a/packages/devextreme/build/gulp/context.js +++ /dev/null @@ -1,23 +0,0 @@ -'use strict'; - -// See tests in version-spec.js - -const argv = require('yargs') - .option('uglify', { type: 'boolean', default: false }) - .parseSync(); - -const version = require('../../package.json').version; - -module.exports = { - version, - uglify: argv.uglify, - RESULT_JS_PATH: 'artifacts/js', - RESULT_NPM_PATH: 'artifacts/npm', - TS_OUT_PATH: 'artifacts/dist_ts', - TRANSPILED_PATH: 'artifacts/transpiled', - TRANSPILED_PROD_RENOVATION_PATH: 'artifacts/transpiled-renovation-npm', - TRANSPILED_PROD_ESM_PATH: 'artifacts/transpiled-esm-npm', - SCSS_PACKAGE_PATH: '../devextreme-scss', - EULA_URL: 'https://js.devexpress.com/Licensing/', - REMOVE_NON_PRODUCTION_MODULE: argv.uglify, -}; diff --git a/packages/devextreme/build/gulp/env-variables.js b/packages/devextreme/build/gulp/env-variables.js deleted file mode 100644 index e8643f554504..000000000000 --- a/packages/devextreme/build/gulp/env-variables.js +++ /dev/null @@ -1,13 +0,0 @@ -'use strict'; - -function readFlag(variableName) { - return String(process.env[variableName]).toLowerCase() === 'true'; -} - -module.exports = { - TEST_CI: readFlag('DEVEXTREME_TEST_CI'), - BUILD_ESM_PACKAGE: readFlag('BUILD_ESM_PACKAGE') && !readFlag('DEVEXTREME_TEST_CI'), - BUILD_TESTCAFE: readFlag('BUILD_TESTCAFE'), - BUILD_INTERNAL_PACKAGE: readFlag('BUILD_INTERNAL_PACKAGE'), - BUILD_TEST_INTERNAL_PACKAGE: readFlag('BUILD_TEST_INTERNAL_PACKAGE') -}; diff --git a/packages/devextreme/build/gulp/gulp-data-uri.js b/packages/devextreme/build/gulp/gulp-data-uri.js deleted file mode 100644 index e02817352e62..000000000000 --- a/packages/devextreme/build/gulp/gulp-data-uri.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -const replace = require('gulp-replace'); -const path = require('path'); -const fs = require('fs'); -const sass = require('sass-embedded'); -const dataUriRegex = /data-uri\((?:'(image\/svg\+xml;charset=UTF-8)',\s)?['"]?([^)'"]+)['"]?\)/g; - -const svg = (buffer, svgEncoding) => { - const encoding = svgEncoding || 'image/svg+xml;charset=UTF-8'; - const svg = encodeURIComponent(buffer.toString()); - - return `"data:${encoding},${svg}"`; -}; - -const img = (buffer, ext) => { - return `"data:image/${ext};base64,${buffer.toString('base64')}"`; -}; - -const handler = (_, svgEncoding, fileName) => { - const relativePath = path.join(__dirname, '..', '..', '..', 'devextreme-scss', fileName); - const filePath = path.resolve(relativePath); - const ext = filePath.split('.').pop(); - const data = fs.readFileSync(filePath); - const buffer = Buffer.from(data); - const escapedString = ext === 'svg' ? svg(buffer, svgEncoding) : img(buffer, ext); - return `url(${escapedString})`; -}; - -const sassFunction = (args) => { - const getTextFromSass = (sassValue) => sassValue.assertString().text; - const argList = args[0].asList; - const hasEncoding = argList.size === 2; - const encoding = hasEncoding ? getTextFromSass(argList.get(0)) : null; - const url = getTextFromSass(argList.get(hasEncoding ? 1 : 0)); - - return new sass.SassString(handler(null, encoding, url), { quotes: false }); -}; - -module.exports = { - gulpPipe: () => replace(dataUriRegex, handler), - resolveDataUri: (content) => content.replace(dataUriRegex, handler), - sassFunctions: { - 'data-uri($args...)': sassFunction, - } -}; diff --git a/packages/devextreme/build/gulp/header-pipes.js b/packages/devextreme/build/gulp/header-pipes.js deleted file mode 100644 index 9b980a783e01..000000000000 --- a/packages/devextreme/build/gulp/header-pipes.js +++ /dev/null @@ -1,30 +0,0 @@ -'use strict'; - -const fs = require('fs'); -const lazyPipe = require('lazypipe'); -const header = require('gulp-header'); -const path = require('path'); - -const context = require('./context.js'); - -const licenseTemplate = fs.readFileSync(path.join(__dirname, 'license-header.txt'), 'utf8'); - -const useStrict = lazyPipe().pipe(function() { - return header('"use strict";\n\n'); -}); - -function makeLicensePipe(commentType) { - return lazyPipe().pipe(function() { - return header(licenseTemplate, { - commentType: commentType, - version: context.version, - eula: context.EULA_URL - }); - }); -} - -module.exports = { - useStrict: useStrict, - bangLicense: makeLicensePipe('!'), - starLicense: makeLicensePipe('*') -}; diff --git a/packages/devextreme/build/gulp/js-bundles.js b/packages/devextreme/build/gulp/js-bundles.js deleted file mode 100644 index a25e4119390b..000000000000 --- a/packages/devextreme/build/gulp/js-bundles.js +++ /dev/null @@ -1,97 +0,0 @@ -'use strict'; - -const gulp = require('gulp'); -const gulpIf = require('gulp-if'); -const lazyPipe = require('lazypipe'); -const named = require('vinyl-named'); -const notify = require('gulp-notify'); -const path = require('path'); -const plumber = require('gulp-plumber'); -const shell = require('gulp-shell'); -const webpack = require('webpack'); -const webpackStream = require('webpack-stream'); - -const ctx = require('./context.js'); -const headerPipes = require('./header-pipes.js'); -const webpackConfig = require('../../webpack.config.js'); -const env = require('./env-variables.js'); -const namedDebug = lazyPipe() - .pipe(named, (file) => path.basename(file.path, path.extname(file.path)) + '.debug'); - -const BUNDLES = [ - '/bundles/dx.ai-integration.js', - '/bundles/dx.all.js', - '/bundles/dx.web.js', - '/bundles/dx.viz.js' -]; - -const DEBUG_BUNDLES = BUNDLES.concat([ '/bundles/dx.custom.js' ]); - -const processBundles = (bundles, pathPrefix) => bundles.map((bundle) => pathPrefix + bundle); -const muteWebPack = () => undefined; -const getWebpackConfig = () => { - const plugins = []; - const isInternalBuild = env.BUILD_INTERNAL_PACKAGE || env.BUILD_TEST_INTERNAL_PACKAGE; - - if (isInternalBuild) { - plugins.push(new webpack.NormalModuleReplacementPlugin(/(.*)\/license_validation/, resource => { - resource.request = resource.request.replace('license_validation', 'license_validation_internal'); - })); - } - - return Object.assign(webpackConfig, { plugins }); -}; - -gulp.task('js-bundles-prod', shell.task( - ctx.uglify - ? 'pnpm nx run devextreme:bundle:prod -c production' - : 'pnpm nx run devextreme:bundle:prod' -)); - -function prepareDebugMeta(watch) { - const debugConfig = Object.assign({ watch }, getWebpackConfig()); - const bundlesPath = ctx.TRANSPILED_PROD_RENOVATION_PATH; - - const bundles = processBundles(DEBUG_BUNDLES, bundlesPath); - - debugConfig.output = Object.assign({}, webpackConfig.output); - debugConfig.output['pathinfo'] = true; - debugConfig.mode = watch ? 'development' : 'production'; - debugConfig.optimization.minimize = false; - - if(!ctx.uglify) { - debugConfig.devtool = 'eval-source-map'; - } - - return { debugConfig, bundles }; -} - -function createDebugBundlesStream(watch, displayName) { - const { debugConfig, bundles } = prepareDebugMeta(watch); - const destination = ctx.RESULT_JS_PATH; - - const task = () => gulp.src(bundles) - .pipe(namedDebug()) - .pipe(gulpIf(watch, plumber({ - errorHandler: notify.onError('Error: <%= error.message %>') - .bind() // bind call is necessary to prevent firing 'end' event in notify.onError implementation - }))) - .pipe(webpackStream(debugConfig, webpack, muteWebPack)) - .pipe(headerPipes.useStrict()) - .pipe(headerPipes.bangLicense()) - .pipe(gulp.dest(destination)); - - task.displayName = `${displayName}-worker`; - - return task; -} - -gulp.task('js-bundles-debug', shell.task( - ctx.uglify - ? 'pnpm nx run devextreme:bundle:debug -c production' - : 'pnpm nx run devextreme:bundle:debug' -)); - -gulp.task('js-bundles-watch', gulp.parallel( - createDebugBundlesStream(true, 'js-bundles-watch') -)); diff --git a/packages/devextreme/build/gulp/license-header.txt b/packages/devextreme/build/gulp/license-header.txt deleted file mode 100644 index 5a8fe2bd76cb..000000000000 --- a/packages/devextreme/build/gulp/license-header.txt +++ /dev/null @@ -1,8 +0,0 @@ -/*<%= commentType %> -* DevExtreme (<%= file.relative.replace(/\\/g, '/') %>) -* Version: <%= version %> -* Build date: <%= (new Date()).toDateString() %> -* -* Copyright (c) 2012 - <%= (new Date()).getFullYear() %> Developer Express Inc. ALL RIGHTS RESERVED -* Read about DevExtreme licensing here: <%= eula %> -*/ diff --git a/packages/devextreme/build/gulp/localization.js b/packages/devextreme/build/gulp/localization.js deleted file mode 100644 index ecf67b940fc5..000000000000 --- a/packages/devextreme/build/gulp/localization.js +++ /dev/null @@ -1,50 +0,0 @@ -'use strict'; - -const gulp = require('gulp'); -const path = require('path'); -const shell = require('gulp-shell'); -const through = require('through2'); -const fs = require('fs'); - -const DEFAULT_LOCALE = 'en'; -const DICTIONARY_SOURCE_FOLDER = 'js/localization/messages'; - -gulp.task('localization', shell.task('pnpm nx build:localization devextreme')); - -gulp.task('generate-community-locales', () => { - const defaultFile = fs.readFileSync(path.join(DICTIONARY_SOURCE_FOLDER, DEFAULT_LOCALE + '.json')).toString(); - const defaultDictionaryKeys = Object.keys(JSON.parse(defaultFile)[DEFAULT_LOCALE]); - - return gulp - .src([ - 'js/localization/messages/*.json', - '!js/localization/messages/en.json' - ]) - .pipe(through.obj(function(file, encoding, callback) { - const parsedFile = JSON.parse(file.contents.toString(encoding)); - - const [locale] = Object.keys(parsedFile); - const dictionary = parsedFile[locale]; - - let newFile = defaultFile.replace(`"${DEFAULT_LOCALE}"`, `"${locale}"`); - - defaultDictionaryKeys.forEach((key) => { - let replaceValue = null; - // eslint-disable-next-line no-prototype-builtins - if(dictionary.hasOwnProperty(key)) { - const val = dictionary[key]; - if(!val.includes('TODO')) { - replaceValue = val.replace(/"/g, '\\"'); - } - } - - if(replaceValue != null) { - newFile = newFile.replace(new RegExp(`"${key}":.*"(,)?`), `"${key}": "${replaceValue}"$1`); - } - }); - - file.contents = Buffer.from(newFile, encoding); - callback(null, file); - })) - .pipe(gulp.dest(DICTIONARY_SOURCE_FOLDER)); -}); diff --git a/packages/devextreme/build/gulp/npm.js b/packages/devextreme/build/gulp/npm.js deleted file mode 100644 index db34ea958e28..000000000000 --- a/packages/devextreme/build/gulp/npm.js +++ /dev/null @@ -1,214 +0,0 @@ -'use strict'; - -const eol = require('gulp-eol'); -const gulp = require('gulp'); -const gulpIf = require('gulp-if'); -const merge = require('merge-stream'); -const through = require('through2'); -const replace = require('gulp-replace'); -const lazyPipe = require('lazypipe'); -const gulpFilter = require('gulp-filter'); -const gulpRename = require('gulp-rename'); -const shell = require('gulp-shell'); - -const ctx = require('./context.js'); -const env = require('./env-variables.js'); -const dataUri = require('./gulp-data-uri').gulpPipe; -const headerPipes = require('./header-pipes.js'); -const { packageDir, packageDistDir, isEsmPackage, stringSrc } = require('./utils'); - -const resultPath = ctx.RESULT_NPM_PATH; -const devextremeDistWorkspacePackageJsonPath = '../devextreme-dist/package.json'; - -const srcGlobsPattern = (path, exclude) => [ - `${path}/**/*.js`, - `!${exclude}/**/*.*`, - `!${path}/bundles/*.js`, - `!${path}/cjs/bundles/**/*`, - `!${path}/esm/bundles/**/*`, - `!${path}/bundles/modules/parts/*.js`, - `!${path}/viz/vector_map.utils/*.js`, - `!${path}/viz/docs/*.js` -]; - -const esmPackageJsonGlobs = [ - `${ctx.TRANSPILED_PROD_ESM_PATH}/**/*.json`, - `!${ctx.TRANSPILED_PROD_ESM_PATH}/viz/vector_map.utils/**/*` -]; - -const esmSrcGlobs = srcGlobsPattern( - ctx.TRANSPILED_PROD_ESM_PATH, - ctx.TRANSPILED_PROD_RENOVATION_PATH -); - -const distGlobsPattern = (jsFolder, exclude) => [ - 'artifacts/**/*.*', - '!artifacts/transpiled**/**/*', - '!artifacts/npm/**/*.*', - '!artifacts/ts/jquery*', - '!artifacts/ts/knockout*', - '!artifacts/ts/globalize*', - '!artifacts/ts/cldr*', - '!artifacts/css/dx-diagram.*', - '!artifacts/css/dx-gantt.*', - `!${jsFolder}/knockout*`, - `!${jsFolder}/cldr/*.*`, - `!${jsFolder}/cldr*`, - `!${jsFolder}/globalize/*.*`, - `!${jsFolder}/globalize*`, - `!${jsFolder}/dx-exceljs-fork*`, - `!${jsFolder}/file-saver*`, - `!${jsFolder}/jquery*`, - `!${jsFolder}/jspdf*`, - `!${jsFolder}/jspdf-autotable*`, - `!${jsFolder}/jszip*`, - `!${jsFolder}/dx.custom*`, - `!${jsFolder}/dx.viz*`, - `!${jsFolder}/dx.web*`, - `!${jsFolder}/dx-diagram*`, - `!${jsFolder}/dx-gantt*`, - `!${jsFolder}/dx-quill*`, -]; - -const srcGlobs = esmSrcGlobs; -const distGlobs = distGlobsPattern(ctx.RESULT_JS_PATH); - -const jsonGlobs = ['js/**/*.json', '!js/viz/vector_map.utils/*.*']; - -const overwriteInternalPackageName = lazyPipe() - .pipe(() => replace(/"devextreme(-.*)?"/, '"devextreme$1-internal"')); - -const licenseValidator = env.BUILD_INTERNAL_PACKAGE || env.BUILD_TEST_INTERNAL_PACKAGE ? - lazyPipe() - .pipe(() => gulpFilter(['**', '!**/license/license_validation.js'])) - .pipe(() => gulpRename(path => { - if(path.basename.includes('license_validation_internal')) { - path.basename = 'license_validation'; - } - })) : - lazyPipe() - .pipe(() => gulpFilter(['**', '!**/license/license_validation_internal.js'])); - -const sources = (src, dist, distGlob) => (() => merge( - gulp - .src(src) - .pipe(licenseValidator()) - .pipe(headerPipes.starLicense()) - .pipe(gulp.dest(dist)), - - gulp - .src(esmPackageJsonGlobs) - .pipe(gulpIf(isEsmPackage, gulp.dest(dist))), - - gulp - .src(jsonGlobs) - .pipe(gulp.dest(dist)), - - gulp - .src('build/npm-bin/*.js') - .pipe(eol('\n')) - .pipe(gulp.dest(`${dist}/bin`)), - - gulp - .src(['license/**']) - .pipe(eol('\n')) - .pipe(gulp.dest(`${dist}/license`)), - - gulp - .src('webpack.config.js') - .pipe(gulp.dest(`${dist}/bin`)), - - gulp - .src('package.json') - .pipe( - through.obj((file, enc, callback) => { - const pkg = JSON.parse(file.contents.toString(enc)); - - pkg.name = 'devextreme'; - pkg.version = ctx.version; - - delete pkg.devDependencies; - delete pkg.publishConfig; - delete pkg.scripts; - - file.contents = Buffer.from(JSON.stringify(pkg, null, 2)); - callback(null, file); - }) - ) - .pipe(gulpIf(env.BUILD_INTERNAL_PACKAGE, overwriteInternalPackageName())) - .pipe(gulp.dest(dist)), - - gulp - .src(distGlob) - .pipe(gulp.dest(`${dist}/dist`)), - - gulp - .src('../../README.md') - .pipe(gulp.dest(dist)), - - stringSrc('.npmignore', 'dist/js\ndist/ts\n!dist/css\n!/scss/bundles/*.scss\nproject.json') - .pipe(gulp.dest(`${dist}/`)) -)); - -const packagePath = `${resultPath}/${packageDir}`; -const distPath = `${resultPath}/${packageDistDir}`; - -gulp.task('npm-sources', gulp.series( - shell.task(env.BUILD_INTERNAL_PACKAGE ? 'pnpm nx run devextreme:build:npm:dts-modules -c internal' : 'pnpm nx run devextreme:build:npm:dts-modules'), - shell.task(env.BUILD_INTERNAL_PACKAGE ? 'pnpm nx run devextreme:build:npm:dts-bundle -c internal' : 'pnpm nx run devextreme:build:npm:dts-bundle'), - () => gulp - .src(devextremeDistWorkspacePackageJsonPath) - .pipe( - through.obj((file, enc, callback) => { - const pkg = JSON.parse(file.contents.toString(enc)); - - pkg.version = ctx.version; - delete pkg.publishConfig; - - file.contents = Buffer.from(JSON.stringify(pkg, null, 2)); - callback(null, file); - }) - ) - .pipe(gulpIf(env.BUILD_INTERNAL_PACKAGE, overwriteInternalPackageName())) - .pipe(gulp.dest(distPath)), - () => merge( - gulp - .src('../devextreme-dist/README.md') - .pipe(gulp.dest(distPath)), - gulp - .src('../devextreme-dist/LICENSE.md') - .pipe(gulp.dest(distPath)), - ), - sources(srcGlobs, packagePath, distGlobs), - shell.task( - ctx.uglify - ? 'pnpm nx run devextreme:compress:npm-sources -c production' - : 'pnpm nx run devextreme:compress:npm-sources' - )) -); - -gulp.task('npm-dist', () => gulp - .src(`${packagePath}/dist/**/*`) - .pipe(gulp.dest(distPath)) -); - -const scssDir = `${packagePath}/scss`; - -gulp.task('npm-sass', gulp.series( - gulp.parallel( - () => gulp - .src(`${ctx.SCSS_PACKAGE_PATH}/scss/**/*`) - .pipe(dataUri()) - .pipe(gulp.dest(scssDir)), - - () => gulp - .src(`${ctx.SCSS_PACKAGE_PATH}/fonts/**/*`) - .pipe(gulp.dest(`${scssDir}/widgets/material/typography/fonts`)), - - () => gulp - .src(`${ctx.SCSS_PACKAGE_PATH}/icons/**/*`) - .pipe(gulp.dest(`${scssDir}/widgets/base/icons`)), - ) -)); - -gulp.task('npm', gulp.series('npm-sources', 'npm-dist', 'npm-sass')); diff --git a/packages/devextreme/build/gulp/overwrite-qunit-renovation-widget.js b/packages/devextreme/build/gulp/overwrite-qunit-renovation-widget.js deleted file mode 100644 index e3862b4d60da..000000000000 --- a/packages/devextreme/build/gulp/overwrite-qunit-renovation-widget.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; -module.exports = ({ name, pathToComponentRegistrator, pathToWrapper, pathInRenovationFolder }) => { - const wrappedComponentImport = pathToWrapper ? - `import { WrappedWidget as Widget } from '${pathToWrapper}';` : - `import Widget from '${pathInRenovationFolder}';`; - return `${wrappedComponentImport} -import registerComponent from '${pathToComponentRegistrator}'; -import { wrapRenovatedWidget } from '/packages/devextreme/testing/helpers/wrapRenovatedWidget.js'; -const wrappedComponent = wrapRenovatedWidget(Widget); -registerComponent('dx${name}', wrappedComponent); -export default wrappedComponent;`; -}; diff --git a/packages/devextreme/build/gulp/overwrite-renovation-widget.js b/packages/devextreme/build/gulp/overwrite-renovation-widget.js deleted file mode 100644 index bea4325cccb6..000000000000 --- a/packages/devextreme/build/gulp/overwrite-renovation-widget.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; - -module.exports = ({ pathInRenovationFolder }) => - `import Widget from '${pathInRenovationFolder}'; -export default Widget;`; diff --git a/packages/devextreme/build/gulp/systemjs.js b/packages/devextreme/build/gulp/systemjs.js deleted file mode 100644 index fdc2e33ede7a..000000000000 --- a/packages/devextreme/build/gulp/systemjs.js +++ /dev/null @@ -1,38 +0,0 @@ -'use strict'; - -const path = require('path'); -const { spawn } = require('child_process'); -const gulp = require('gulp'); - -const root = path.resolve(__dirname, '../..'); - -gulp.task('transpile-systemjs-modules', (callback) => { - spawn('node', [path.resolve(root, 'testing/systemjs-builder.js'), '--transpile=modules'], { stdio: 'inherit' }) - .on('error', callback) - .on('close', code => code ? callback(new Error(code)) : callback()); -}); - -gulp.task('transpile-systemjs-testing', (callback) => { - spawn('node', [path.resolve(root, 'testing/systemjs-builder.js'), '--transpile=testing'], { stdio: 'inherit' }) - .on('error', callback) - .on('close', code => code ? callback(new Error(code)) : callback()); -}); - -gulp.task('transpile-systemjs-css', (callback) => { - spawn('node', [path.resolve(root, 'testing/systemjs-builder.js'), '--transpile=css'], { stdio: 'inherit' }) - .on('error', callback) - .on('close', code => code ? callback(new Error(code)) : callback()); -}); - -gulp.task('transpile-systemjs-js-vendors', (callback) => { - spawn('node', [path.resolve(root, 'testing/systemjs-builder.js'), '--transpile=js-vendors'], { stdio: 'inherit' }) - .on('error', callback) - .on('close', code => code ? callback(new Error(code)) : callback()); -}); - -gulp.task('transpile-systemjs', gulp.parallel( - 'transpile-systemjs-modules', - 'transpile-systemjs-testing', - 'transpile-systemjs-css', - 'transpile-systemjs-js-vendors' -)); diff --git a/packages/devextreme/build/gulp/transpile.js b/packages/devextreme/build/gulp/transpile.js deleted file mode 100644 index 67a75ca37d59..000000000000 --- a/packages/devextreme/build/gulp/transpile.js +++ /dev/null @@ -1,84 +0,0 @@ -'use strict'; - -const babel = require('gulp-babel'); -const gulp = require('gulp'); -const notify = require('gulp-notify'); -const path = require('path'); -const plumber = require('gulp-plumber'); -const replace = require('gulp-replace'); -const watch = require('gulp-watch'); - -const ctx = require('./context.js'); -const testsConfig = require('../../testing/tests.babelrc.json'); -const transpileConfig = require('./transpile-config'); -const createTsCompiler = require('./typescript/compiler'); - -const REMOVE_DEBUG_REGEXP = /\/{2,}\s{0,}#DEBUG[\s\S]*?\/{2,}\s{0,}#ENDDEBUG/g; - -const src = [ - 'js/**/*.*', - '!js/**/*.d.ts', - '!js/**/*.{tsx,ts}', - '!js/__internal/**/*.*', -]; - -const TS_OUTPUT_BASE_DIR = 'artifacts/dist_ts'; -const TS_COMPILER_CONFIG = { - baseAbsPath: path.resolve(__dirname, '../..'), - relativePath: { - tsconfig: 'js/__internal/tsconfig.json', - alias: 'js', - dist: TS_OUTPUT_BASE_DIR, - }, - tsBaseDirName: '__internal', - messages: { - createDirErr: 'Cannot create directory', - createFileErr: 'Cannot create file', - compilationFailed: 'TS Compilation failed', - }, -}; - -const watchJsTask = () => { - const watchTask = watch(src) - .on('ready', () => console.log('transpile JS is watching for changes...')) - .pipe(plumber({ - errorHandler: notify - .onError('Error: <%= error.message %>') - .bind() // bind call is necessary to prevent firing 'end' event in notify.onError implementation - })); - watchTask - .pipe(babel(transpileConfig.cjs)) - .pipe(gulp.dest(ctx.TRANSPILED_PATH)); - watchTask - .pipe(replace(REMOVE_DEBUG_REGEXP, '')) - .pipe(babel(transpileConfig.cjs)) - .pipe(gulp.dest(ctx.TRANSPILED_PROD_RENOVATION_PATH)); - return watchTask; -}; -watchJsTask.displayName = 'transpile JS watch'; - -const watchTsTask = async() => { - const compiler = await createTsCompiler(TS_COMPILER_CONFIG); - const tsWatch = compiler.watchTs(); - - tsWatch - .pipe(plumber({ - errorHandler: notify - .onError('Error: <%= error.message %>') - .bind() // bind call is necessary to prevent firing 'end' event in notify.onError implementation - })) - .pipe(babel(transpileConfig.tsCjs)) - .pipe(gulp.dest(ctx.TRANSPILED_PATH)) - .pipe(replace(REMOVE_DEBUG_REGEXP, '')) - .pipe(gulp.dest(ctx.TRANSPILED_PROD_RENOVATION_PATH)); -}; -watchTsTask.displayName = 'transpile TS watch'; - -gulp.task('transpile-watch', gulp.parallel(watchJsTask, watchTsTask)); - -gulp.task('transpile-tests', gulp.series('bundler-config', () => - gulp - .src(['testing/**/*.js']) - .pipe(babel(testsConfig)) - .pipe(gulp.dest('testing')) -)); diff --git a/packages/devextreme/build/gulp/tsconfig.json b/packages/devextreme/build/gulp/tsconfig.json deleted file mode 100644 index 9f756e497164..000000000000 --- a/packages/devextreme/build/gulp/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "compilerOptions": { - "typeRoots": ["node_modules/@types"], - "noEmitOnError": true - } -} diff --git a/packages/devextreme/build/gulp/typescript/compiler.js b/packages/devextreme/build/gulp/typescript/compiler.js deleted file mode 100644 index 771d44cacde2..000000000000 --- a/packages/devextreme/build/gulp/typescript/compiler.js +++ /dev/null @@ -1,188 +0,0 @@ -'use strict'; - -const path = require('path'); -const { Readable } = require('stream'); -const { glob } = require('glob'); - -const Vinyl = require('vinyl'); -const tsCompiler = require('typescript'); -const tscAlias = require('tsc-alias'); - -const createFileChangeManager = require('./file-change-manager'); -const { logError, logInfo } = require('./logger'); - - -const createAliasTranspileFuncAsync = async(configFile, outDir) => { - const transpileFunc = await tscAlias.prepareSingleFileReplaceTscAliasPaths({ - configFile, - outDir, - }); - - return (filePath, fileContents) => transpileFunc({ fileContents, filePath }); -}; - -const createReadableStream = () => { - const stream = new Readable({ objectMode: true }); - stream._read = () => {}; - return stream; -}; - -const createWriteFileToStreamFunc = ( - stream, - aliasTranspileFunc, - { distPath, aliasPath, tsBaseDirName }, -) => (filePath, fileData) => { - if(!filePath.includes(tsBaseDirName)) { - return; - } - - const distPathRegExp = new RegExp(distPath); - // Resolve ts alias - const normalizedFilePath = filePath.replace(distPathRegExp, aliasPath); - const resolvedFileData = aliasTranspileFunc(normalizedFilePath, fileData); - - const file = new Vinyl({ - path: filePath.replace(distPathRegExp, ''), - contents: Buffer.from(resolvedFileData), - }); - stream.push(file); -}; - -const getAbsolutePaths = (compilerConfig) => { - const baseTsAbsDir = path.dirname(`${compilerConfig.baseAbsPath}/${compilerConfig.relativePath.tsconfig}`); - - return { - tsConfigDir: baseTsAbsDir, - tsConfigFile: `${compilerConfig.baseAbsPath}/${compilerConfig.relativePath.tsconfig}`, - tsBaseDir: baseTsAbsDir, - aliasRoot: `${compilerConfig.baseAbsPath}/${compilerConfig.relativePath.alias}`, - }; -}; - -const getTsConfigPath = (tsConfigDir) => { - const configFilePath = tsCompiler.findConfigFile( - tsConfigDir, - tsCompiler.sys.fileExists, - ); - - if(!configFilePath) { - const errorMsg = `tsconfig wasn't found by passed path:\n${tsConfigDir}/tsconfig.json`; - console.error(logError(errorMsg)); - throw Error(errorMsg); - } - - return configFilePath; -}; - -const reportDiagnostic = (diagnostic) => { - if(diagnostic.file) { - const { line, character } = tsCompiler.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start); - const message = tsCompiler.flattenDiagnosticMessageText(diagnostic.messageText, '\n'); - console.error(logError(`${diagnostic.file.fileName} (${line + 1},${character + 1}):\n ${message} \n`)); - - return; - } - - console.error(logError(`${tsCompiler.flattenDiagnosticMessageText(diagnostic.messageText, '\n')}\n`)); -}; - -const createTsCompiler = async(compilerConfig) => { - // --- private --- - const absolutePaths = getAbsolutePaths(compilerConfig); - const aliasTranspileFunc = await createAliasTranspileFuncAsync( - absolutePaths.tsConfigFile, - absolutePaths.aliasRoot, - ); - - // --- public --- - const compileTs = (fileNamePattern, ignorePatterns) => { - const fileNames = glob.sync(fileNamePattern, { ignore: ignorePatterns }); - const configFilePath = getTsConfigPath(absolutePaths.tsConfigDir); - const { config } = tsCompiler.readConfigFile(configFilePath, tsCompiler.sys.readFile); - const { options } = tsCompiler.parseJsonConfigFileContent(config, tsCompiler.sys, absolutePaths.tsBaseDir); - - const program = tsCompiler.createProgram(fileNames, options); - - const stream = createReadableStream(); - - const emitResult = program.emit( - undefined, - createWriteFileToStreamFunc( - stream, - aliasTranspileFunc, - { - distPath: compilerConfig.relativePath.dist, - aliasPath: compilerConfig.relativePath.alias, - tsBaseDirName: compilerConfig.tsBaseDirName, - }), - ); - - const allDiagnostics = tsCompiler - .getPreEmitDiagnostics(program) - .concat(emitResult.diagnostics); - - allDiagnostics.forEach(diagnostic => { reportDiagnostic(diagnostic); }); - - if(allDiagnostics.length > 0) { - console.error(logInfo(compilerConfig.messages.compilationFailed)); - throw Error(compilerConfig.messages.compilationFailed); - } - - stream.push(null); - return stream; - }; - - const watchTs = () => { - const configFilePath = getTsConfigPath(absolutePaths.tsConfigDir); - const createProgram = tsCompiler.createSemanticDiagnosticsBuilderProgram; - const reportWatchStatusChanged = (diagnostic) => { - console.info(logInfo(diagnostic.messageText)); - }; - const changeManager = createFileChangeManager(); - const stream = createReadableStream(); - - const host = tsCompiler.createWatchCompilerHost( - configFilePath, - {}, - tsCompiler.sys, - createProgram, - reportDiagnostic, - reportWatchStatusChanged - ); - - const writeFileToStream = createWriteFileToStreamFunc( - stream, - aliasTranspileFunc, - { - distPath: compilerConfig.relativePath.dist, - aliasPath: compilerConfig.relativePath.alias, - tsBaseDirName: compilerConfig.tsBaseDirName, - }); - host.writeFile = async(filePath, fileData) => { - const isChanged = changeManager.checkFileChanged(filePath, fileData); - - if(!isChanged) { - return; - } - - writeFileToStream(filePath, fileData); - }; - - const origPostProgramCreate = host.afterProgramCreate; - host.afterProgramCreate = program => { - changeManager.clearUntouchedFiles(); - origPostProgramCreate(program); - }; - - tsCompiler.createWatchProgram(host); - - return stream; - }; - - return { - compileTs, - watchTs, - }; -}; - -module.exports = createTsCompiler; diff --git a/packages/devextreme/build/gulp/typescript/file-change-manager.js b/packages/devextreme/build/gulp/typescript/file-change-manager.js deleted file mode 100644 index 450b7bffb334..000000000000 --- a/packages/devextreme/build/gulp/typescript/file-change-manager.js +++ /dev/null @@ -1,49 +0,0 @@ -'use strict'; - -const { v4, v5 } = require('uuid'); -const generateUuid = v4; -const uuidFromStr = v5; - - -const createFileChangeManager = () => { - const seed = generateUuid(); - const fileMap = new Map(); - const touchedFileSet = new Set(); - - const generateUuidFromFileData = (fileData) => uuidFromStr(fileData, seed); - - const checkFileChanged = (filePath, fileData) => { - const newUuid = generateUuidFromFileData(fileData); - touchedFileSet.add(filePath); - - if(!fileMap.has(filePath)) { - fileMap.set(filePath, newUuid); - return true; - } - - const oldUuid = fileMap.get(filePath); - const isChanged = oldUuid !== newUuid; - - if(isChanged) { - fileMap.set(filePath, newUuid); - } - - return isChanged; - }; - - const clearUntouchedFiles = () => { - fileMap.forEach((_, filePath) => { - if(!touchedFileSet.has(filePath)) { - fileMap.delete(filePath); - } - }); - touchedFileSet.clear(); - }; - - return { - checkFileChanged, - clearUntouchedFiles, - }; -}; - -module.exports = createFileChangeManager; diff --git a/packages/devextreme/build/gulp/typescript/logger.js b/packages/devextreme/build/gulp/typescript/logger.js deleted file mode 100644 index 7842c4708553..000000000000 --- a/packages/devextreme/build/gulp/typescript/logger.js +++ /dev/null @@ -1,14 +0,0 @@ -'use strict'; - -const baseLog = (msg) => `\x1b[36m>TS\x1b[0m ${msg}`; - -const underscore = (msg) => `\x1b[4m${msg}\x1b[0m`; - -const logError = (msg) => baseLog(`\x1b[31mError\x1b[0m ${msg}`); - -const logInfo = (msg) => baseLog(underscore(msg)); - -module.exports = { - logError, - logInfo, -}; diff --git a/packages/devextreme/build/gulp/utils.js b/packages/devextreme/build/gulp/utils.js deleted file mode 100644 index 1de8c7934276..000000000000 --- a/packages/devextreme/build/gulp/utils.js +++ /dev/null @@ -1,46 +0,0 @@ -'use strict'; - -const gulp = require('gulp'); -const Vinyl = require('vinyl'); -const env = require('./env-variables'); - -gulp.task('skippedTask', done => done()); - -const isEsmPackage = env.BUILD_ESM_PACKAGE; -const devextremeDir = 'devextreme'; -const devextremeDistDir = 'devextreme-dist'; -const packageDir = env.BUILD_INTERNAL_PACKAGE ? 'devextreme-internal' : devextremeDir; -const packageDistDir = env.BUILD_INTERNAL_PACKAGE ? 'devextreme-dist-internal' : devextremeDistDir; - -const runTaskByCondition = (condition, task) => { - if(condition) { - return task; - } - return (done) => done ? done() : gulp.series('skippedTask'); -}; - -const stringSrc = (filename, str) => { - const src = require('stream').Readable({ objectMode: true }); - - src._read = function() { - this.push(new Vinyl({ - cwd: '', - path: filename, - contents: Buffer.from(str, 'utf-8') - })); - this.push(null); - }; - - return src; -}; - -module.exports = { - devextremeDir, - devextremeDistDir, - packageDir, - packageDistDir, - stringSrc, - isEsmPackage, - runTaskByCondition, - ifEsmPackage: (task) => runTaskByCondition(isEsmPackage, task), -}; diff --git a/packages/devextreme/build/gulp/vectormap.js b/packages/devextreme/build/gulp/vectormap.js deleted file mode 100644 index fed2727464fa..000000000000 --- a/packages/devextreme/build/gulp/vectormap.js +++ /dev/null @@ -1,109 +0,0 @@ -'use strict'; - -const gulp = require('gulp'); -const path = require('path'); -const fs = require('fs'); -const rename = require('gulp-rename'); -const concat = require('gulp-concat'); -const tap = require('gulp-tap'); -const gulpIf = require('gulp-if'); -const merge = require('merge-stream'); -const template = require('gulp-template'); - -const context = require('./context.js'); -const headerPipes = require('./header-pipes.js'); -const compressionPipes = require('./compression-pipes.js'); - -const VECTORMAP_UTILS_PATH = 'js/viz/vector_map.utils'; -const VECTORMAP_UTILS_RESULT_PATH = path.join(context.RESULT_JS_PATH, 'vectormap-utils'); -const VECTORMAP_DATA_RESULT_PATH = path.join(context.RESULT_JS_PATH, 'vectormap-data'); -const VECTORMAP_SOURCES_PATH = 'build/vectormap-sources'; - -function transformFileName(fileName) { - return path.join(VECTORMAP_UTILS_PATH, fileName) + '.js'; -} - -gulp.task('vectormap-utils', function() { - return merge( - createBrowserVectorMapUtilsStream('.debug', false), - createBrowserVectorMapUtilsStream('', true), - ); -}); - -function toArrayBuffer(buffer) { - return buffer.buffer.slice(buffer.byteOffset, buffer.byteOffset + buffer.byteLength); -} - -function collectShpFiles(dir) { - return fs.readdirSync(dir) - .filter(name => path.extname(name).toLowerCase() === '.shp') - .map(name => path.basename(name, '.shp')); -} - -gulp.task('vectormap-data', gulp.series('vectormap-utils', function generateData() { - const parse = require(path.join('../..', VECTORMAP_UTILS_RESULT_PATH, 'dx.vectormaputils.debug.js')).parse; - const settings = require(path.join('../..', VECTORMAP_SOURCES_PATH, '_settings.js')); - const precision = settings.precision >= 0 ? Math.round(settings.precision) : 4; - - if(!fs.existsSync(VECTORMAP_DATA_RESULT_PATH)) { - fs.mkdirSync(VECTORMAP_DATA_RESULT_PATH); - } - - const sourceDir = path.resolve(VECTORMAP_SOURCES_PATH); - const files = collectShpFiles(sourceDir); - - files.forEach(name => { - const shpBuffer = fs.readFileSync(path.join(sourceDir, name + '.shp')); - const dbfBuffer = fs.readFileSync(path.join(sourceDir, name + '.dbf')); - - const shapeData = parse( - { shp: toArrayBuffer(shpBuffer), dbf: toArrayBuffer(dbfBuffer) }, - { precision }, - ); - - if(shapeData) { - const content = name + ' = ' + JSON.stringify(shapeData) + ';'; - fs.writeFileSync(path.join(VECTORMAP_DATA_RESULT_PATH, name + '.js'), content); - } - }); - - const stream = merge(); - const dataFiles = fs.readdirSync(VECTORMAP_DATA_RESULT_PATH); - - dataFiles.forEach(file => { - const data = fs.readFileSync(path.join(VECTORMAP_DATA_RESULT_PATH, file), 'utf8'); - - stream.add( - gulp.src('build/gulp/vectormapdata-template.jst') - .pipe(template({ data: data })) - .pipe(rename(file)) - .pipe(headerPipes.useStrict()) - .pipe(gulp.dest(VECTORMAP_DATA_RESULT_PATH)) - ); - }); - - return stream; -})); - -function patchVectorMapUtilsStream(stream, isMinify) { - return stream.pipe(headerPipes.useStrict()) - .pipe(headerPipes.bangLicense()) - .pipe(gulpIf(isMinify, compressionPipes.minify())) - .pipe(gulpIf(!isMinify, compressionPipes.beautify())) - .pipe(gulp.dest(VECTORMAP_UTILS_RESULT_PATH)); -} - -function createBrowserVectorMapUtilsStream(suffix, isMinify) { - const settings = require(path.join('../..', VECTORMAP_UTILS_PATH, '_settings.json')); - const part = settings['browser']; - const stream = gulp.src(settings.commonFiles.concat(part.files).map(transformFileName)) - .pipe(concat(part.fileName + suffix + '.js')); - - return stream.pipe(tap(file => { - patchVectorMapUtilsStream(gulp.src('build/gulp/vectormaputils-template.jst') - .pipe(template({ data: file.contents })) - .pipe(rename(path.basename(file.path))), isMinify); - })); -} - -gulp.task('vectormap', gulp.series('vectormap-utils', 'vectormap-data')); diff --git a/packages/devextreme/build/gulp/generated_js.jst b/packages/devextreme/build/localization-templates/generated_js.jst similarity index 100% rename from packages/devextreme/build/gulp/generated_js.jst rename to packages/devextreme/build/localization-templates/generated_js.jst diff --git a/packages/devextreme/build/gulp/localization-template.jst b/packages/devextreme/build/localization-templates/localization-template.jst similarity index 100% rename from packages/devextreme/build/gulp/localization-template.jst rename to packages/devextreme/build/localization-templates/localization-template.jst diff --git a/packages/devextreme/build/gulp/modules_metadata.json b/packages/devextreme/build/modules_metadata.json similarity index 100% rename from packages/devextreme/build/gulp/modules_metadata.json rename to packages/devextreme/build/modules_metadata.json diff --git a/packages/devextreme/build/gulp/transpile-config.js b/packages/devextreme/build/transpile-config.js similarity index 100% rename from packages/devextreme/build/gulp/transpile-config.js rename to packages/devextreme/build/transpile-config.js diff --git a/packages/devextreme/build/gulp/vectormapdata-template.jst b/packages/devextreme/build/vectormap-templates/vectormapdata-template.jst similarity index 100% rename from packages/devextreme/build/gulp/vectormapdata-template.jst rename to packages/devextreme/build/vectormap-templates/vectormapdata-template.jst diff --git a/packages/devextreme/build/gulp/vectormaputils-template.jst b/packages/devextreme/build/vectormap-templates/vectormaputils-template.jst similarity index 100% rename from packages/devextreme/build/gulp/vectormaputils-template.jst rename to packages/devextreme/build/vectormap-templates/vectormaputils-template.jst diff --git a/packages/devextreme/gulpfile.js b/packages/devextreme/gulpfile.js deleted file mode 100644 index d865ef7676a5..000000000000 --- a/packages/devextreme/gulpfile.js +++ /dev/null @@ -1,155 +0,0 @@ -/* eslint-env node */ -/* eslint-disable no-console */ - -const gulp = require('gulp'); -const multiProcess = require('gulp-multi-process'); -const env = require('./build/gulp/env-variables'); -const shell = require('gulp-shell'); -const context = require('./build/gulp/context'); -const { REMOVE_NON_PRODUCTION_MODULE } = context; - -gulp.task('clean', shell.task('pnpm nx clean:artifacts devextreme')); - -require('./build/gulp/bundler-config'); -require('./build/gulp/transpile'); -require('./build/gulp/js-bundles'); -require('./build/gulp/localization'); -require('./build/gulp/systemjs'); - -function getTranspileConfig() { - if(env.TEST_CI) { - return 'ci'; - } - - if(env.BUILD_INTERNAL_PACKAGE) { - return 'internal'; - } - - return ''; -} - -const transpileConfig = getTranspileConfig(); - -function getDeclarationsConfiguration() { - return env.BUILD_INTERNAL_PACKAGE ? 'internal' : ''; -} - -const declarationsConfig = getDeclarationsConfiguration(); - -gulp.task('transpile', shell.task( - transpileConfig - ? `pnpm nx run devextreme:build:transpile -c ${transpileConfig}` - : 'pnpm nx run devextreme:build:transpile' -)); - -gulp.task('vectormap', shell.task( - context.uglify - ? 'pnpm nx run devextreme:build:vectormap -c production' - : 'pnpm nx run devextreme:build:vectormap' -)); - -gulp.task('aspnet', shell.task( - context.uglify - ? 'pnpm nx run devextreme:build:aspnet -c production' - : 'pnpm nx run devextreme:build:aspnet' -)); - -gulp.task('vendor', shell.task('pnpm nx run devextreme:copy:vendor')); - -gulp.task('ts', shell.task( - declarationsConfig - ? `pnpm nx run devextreme:build:declarations -c ${declarationsConfig}` - : 'pnpm nx run devextreme:build:declarations' -)); - -gulp.task('check-license-notices', shell.task('pnpm nx run devextreme:verify:licenses')); - -gulp.task('state-manager-optimize', shell.task('pnpm nx run devextreme:state-manager:optimize')); - -function getNpmConfiguration() { - if(context.uglify && env.BUILD_INTERNAL_PACKAGE) { - return 'production-internal'; - } - if(env.BUILD_INTERNAL_PACKAGE) { - return 'internal'; - } - if(context.uglify && env.BUILD_TEST_INTERNAL_PACKAGE) { - return 'production-test-internal'; - } - if(env.BUILD_TEST_INTERNAL_PACKAGE) { - return 'test-internal'; - } - if(context.uglify) { - return 'production'; - } - return ''; -} - -gulp.task('npm', shell.task((function() { - const config = getNpmConfiguration(); - return config - ? `pnpm nx run devextreme:build:npm -c ${config}` - : 'pnpm nx run devextreme:build:npm'; -})())); - -if(env.TEST_CI) { - console.warn('Using test CI mode!'); -} - -function createMiscBatch() { - const tasks = ['vectormap', 'vendor']; - if(!env.TEST_CI) { - tasks.push('aspnet', 'ts'); - } - return gulp.parallel(tasks); -} - -function createMainBatch(dev) { - const tasks = []; - if(!dev && !env.BUILD_TESTCAFE) { - tasks.push('js-bundles-debug'); - } - if(!env.TEST_CI || env.BUILD_TESTCAFE) { - tasks.push('js-bundles-prod'); - } - tasks.push('misc-batch'); - return (callback) => multiProcess(tasks, callback, true); -} - -function createDefaultBatch(dev) { - const tasks = dev ? [] : ['clean']; - tasks.push('localization'); - tasks.push('transpile'); - - if(REMOVE_NON_PRODUCTION_MODULE) { - tasks.push('state-manager-optimize'); - } - - tasks.push(dev && !env.BUILD_TESTCAFE ? 'main-batch-dev' : 'main-batch'); - if(!env.TEST_CI && !dev && !env.BUILD_TESTCAFE) { - tasks.push('npm'); - tasks.push('check-license-notices'); - } - return gulp.series(tasks); -} - -gulp.task('misc-batch', createMiscBatch()); -gulp.task('main-batch', createMainBatch(false)); -gulp.task('main-batch-dev', createMainBatch(true)); - -gulp.task('default', createDefaultBatch()); -gulp.task('default-dev', createDefaultBatch(true)); - -gulp.task('test-env', shell.task('node ./testing/launch')); - -gulp.task('dev-watch', gulp.parallel( - 'transpile-watch', - 'bundler-config-watch', - 'js-bundles-watch', - 'test-env' -)); - -gulp.task('dev', gulp.series( - 'default-dev', - 'dev-watch' -)); diff --git a/packages/devextreme/package.json b/packages/devextreme/package.json index 14883042adfa..ab264c3859ee 100644 --- a/packages/devextreme/package.json +++ b/packages/devextreme/package.json @@ -73,6 +73,8 @@ "@babel/eslint-parser": "catalog:", "@babel/plugin-proposal-decorators": "7.29.7", "@babel/plugin-transform-modules-commonjs": "7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "7.29.7", + "@babel/plugin-transform-optional-chaining": "7.29.7", "@babel/plugin-transform-runtime": "7.29.7", "@babel/plugin-transform-typescript": "7.29.7", "@babel/preset-env": "7.29.7", @@ -115,35 +117,8 @@ "eslint-plugin-testcafe": "0.2.1", "eslint-plugin-unicorn": "60.0.0", "file-saver": "2.0.5", - "glob": "11.1.0", "globalize": "1.7.1", "globals": "catalog:", - "gulp": "4.0.2", - "gulp-babel": "8.0.0", - "gulp-cache": "1.1.3", - "gulp-cached": "1.1.1", - "gulp-concat": "2.6.1", - "gulp-each": "0.5.0", - "gulp-eol": "0.2.0", - "gulp-eslint-new": "catalog:", - "gulp-file": "0.4.0", - "gulp-filter": "7.0.0", - "gulp-flatmap": "1.0.2", - "gulp-footer": "2.1.0", - "gulp-header": "2.0.9", - "gulp-if": "3.0.0", - "gulp-json-editor": "2.6.0", - "gulp-multi-process": "1.4.0", - "gulp-notify": "4.0.0", - "gulp-plumber": "1.2.1", - "gulp-rename": "1.4.0", - "gulp-replace": "0.6.1", - "gulp-sass": "6.0.1", - "gulp-shell": "0.8.0", - "gulp-tap": "1.0.1", - "gulp-template": "5.0.0", - "gulp-typescript": "5.0.1", - "gulp-watch": "5.0.1", "ignore": "5.3.2", "intl": "1.2.5", "jest-each": "29.7.0", @@ -153,11 +128,8 @@ "jspdf": "4.2.1", "jspdf-autotable": "3.8.4", "knockout": "3.5.3", - "lazypipe": "1.0.2", - "merge-stream": "2.0.0", "minimist": "1.2.8", "qunit": "2.25.0", - "sass-embedded": "1.93.3", "sinon": "18.0.1", "systemjs": "0.19.41", "systemjs-plugin-babel": "0.0.25", @@ -165,37 +137,31 @@ "systemjs-plugin-json": "0.3.0", "systemjs-plugin-text": "0.0.11", "terser-webpack-plugin": "5.3.17", - "through2": "2.0.5", "ts-jest": "29.1.2", "tsc-alias": "1.8.16", "typescript": "4.9.5", "typescript-min": "npm:typescript@4.9.5", - "uuid": "14.0.0", - "vinyl": "2.2.1", - "vinyl-named": "1.1.0", "vite": "8.0.16", "webpack": "5.105.4", - "webpack-stream": "7.0.0", - "yargs": "17.7.2" + "webpack-stream": "7.0.0" }, "scripts": { - "clean": "gulp clean", + "clean": "pnpm nx clean:artifacts devextreme", "lint": "nx run devextreme:lint", "lint-js": "eslint --quiet '**/*.js'", "lint-ts": "eslint --quiet '**/*.{tsx,ts}' --ignore-pattern '**/*.d.ts'", "lint-dts": "eslint './js/**/*.d.ts'", "lint-staged": "lint-staged", "lint-texts": "node build/linters/validate-non-latin-symbols.js", - "build:dev": "cross-env DEVEXTREME_TEST_CI=TRUE BUILD_ESM_PACKAGE=true gulp default", - "build-dist": "cross-env BUILD_ESM_PACKAGE=true gulp default --uglify", + "build:dev": "pnpm nx build:dev devextreme", + "build-dist": "pnpm nx build-dist devextreme", "build:modular": "cd ./playground/modular && webpack", "build:modular:watch": "cd ./playground/modular && webpack --watch", - "build:community-localization": "gulp generate-community-locales", - "build:systemjs": "gulp transpile-systemjs", - "dev": "cross-env DEVEXTREME_TEST_CI=true gulp dev", - "dev:watch": "cross-env DEVEXTREME_TEST_CI=true gulp dev-watch", + "build:community-localization": "pnpm nx build:community-localization devextreme", + "dev": "cross-env DEVEXTREME_TEST_CI=true nx run devextreme:dev", + "dev:watch": "cross-env DEVEXTREME_TEST_CI=true nx run devextreme:dev-watch", "dev:playground": "vite", - "transpile-tests": "gulp transpile-tests", + "transpile-tests": "pnpm nx transpile:tests devextreme", "update-ts-reexports": "dx-tools generate-reexports --sources ./js --exclude \"((dialog|export|list_light|notify|overlay|palette|set_template_engine|splitter_control|themes|themes_callback|track_bar|utils|validation_engine|validation_message)[.d.ts])\" --compiler-options \"{ \\\"typeRoots\\\": [] }\"", "update-ts-bundle": "dx-tools generate-ts-bundle --sources ./js --output-path ./ts/dx.all.d.ts", "regenerate": "pnpm run update-ts-bundle && pnpm run update-ts-reexports", diff --git a/packages/devextreme/project.json b/packages/devextreme/project.json index df4511af3456..2fc69f752717 100644 --- a/packages/devextreme/project.json +++ b/packages/devextreme/project.json @@ -28,9 +28,9 @@ "executor": "devextreme-nx-infra-plugin:localization", "options": { "messagesDir": "./js/localization/messages", - "messageTemplate": "./build/gulp/localization-template.jst", + "messageTemplate": "./build/localization-templates/localization-template.jst", "messageOutputDir": "./artifacts/js/localization", - "generatedTemplate": "./build/gulp/generated_js.jst", + "generatedTemplate": "./build/localization-templates/generated_js.jst", "cldrDataOutputDir": "./js/__internal/core/localization/cldr-data", "defaultMessagesOutputDir": "./js/__internal/core/localization", "applyLicenseHeaders": { @@ -41,8 +41,8 @@ }, "inputs": [ "{projectRoot}/js/localization/messages/**/*.json", - "{projectRoot}/build/gulp/localization-template.jst", - "{projectRoot}/build/gulp/generated_js.jst" + "{projectRoot}/build/localization-templates/localization-template.jst", + "{projectRoot}/build/localization-templates/generated_js.jst" ], "outputs": [ "{projectRoot}/artifacts/js/localization", @@ -50,6 +50,14 @@ "{projectRoot}/js/__internal/core/localization/cldr-data" ] }, + "build:community-localization": { + "cache": false, + "executor": "devextreme-nx-infra-plugin:generate-community-locales", + "options": { + "messagesDir": "./js/localization/messages", + "defaultLocale": "en" + } + }, "build:localization": { "cache": true, "executor": "nx:run-commands", @@ -62,8 +70,8 @@ }, "inputs": [ "{projectRoot}/js/localization/messages/**/*.json", - "{projectRoot}/build/gulp/localization-template.jst", - "{projectRoot}/build/gulp/generated_js.jst", + "{projectRoot}/build/localization-templates/localization-template.jst", + "{projectRoot}/build/localization-templates/generated_js.jst", { "externalDependencies": ["cldrjs", "cldr-core", "devextreme-cldr-data"] } ], "outputs": [ @@ -144,6 +152,54 @@ "{projectRoot}/artifacts/npm/devextreme-internal/bundles/dx.custom.config.js" ] }, + "build:devextreme-bundler-config:watch": { + "executor": "devextreme-nx-infra-plugin:concatenate-files", + "cache": false, + "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" + } + ], + "additionalPasses": [ + { + "sourceFiles": ["./build/bundle-templates/dx.custom.js"], + "outputFile": "./artifacts/npm/devextreme/bundles/dx.custom.config.js", + "transforms": [ + { + "find": "require *\\( *[\"']\\.\\.\\/", + "replace": "require('devextreme/" + } + ] + } + ], + "watch": true, + "watchPaths": ["./build/bundle-templates/modules/parts/**/*.js"] + } + }, "clean:dist-ts": { "executor": "devextreme-nx-infra-plugin:clean", "options": { @@ -181,10 +237,22 @@ "{projectRoot}/artifacts/dist_ts" ] }, + "build:ts:internal:watch": { + "executor": "devextreme-nx-infra-plugin:build-typescript", + "cache": false, + "options": { + "srcPattern": "./js/__internal/**/*.{ts,tsx}", + "tsconfig": "./js/__internal/tsconfig.json", + "outDir": "./artifacts/dist_ts", + "resolvePaths": true, + "resolvePathsBaseDir": "./js", + "watch": true + } + }, "build:cjs": { "executor": "devextreme-nx-infra-plugin:babel-transform", "options": { - "babelConfigPath": "./build/gulp/transpile-config.js", + "babelConfigPath": "./build/transpile-config.js", "configKey": "cjs", "sourcePattern": "./js/**/*.{js,jsx}", "excludePatterns": [ @@ -212,10 +280,35 @@ "{projectRoot}/artifacts/transpiled-renovation-npm" ] }, + "build:cjs:watch": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "cache": false, + "options": { + "babelConfigPath": "./build/transpile-config.js", + "configKey": "cjs", + "sourcePattern": "./js/**/*.{js,jsx}", + "excludePatterns": [ + "./js/**/*.d.ts", + "./js/__internal/**/*" + ], + "outDir": "./artifacts/transpiled", + "watch": true, + "copyAssets": [ + { "from": "./js/localization/messages", "to": "./localization/messages" }, + { "from": "./js/viz/vector_map.utils/_settings.json", "to": "./viz/vector_map.utils/_settings.json" } + ] + }, + "configurations": { + "production": { + "outDir": "./artifacts/transpiled-renovation-npm", + "removeDebug": true + } + } + }, "build:npm:esm": { "executor": "devextreme-nx-infra-plugin:babel-transform", "options": { - "babelConfigPath": "./build/gulp/transpile-config.js", + "babelConfigPath": "./build/transpile-config.js", "configKey": "esm", "sourcePattern": "./js/**/*.{js,jsx}", "excludePatterns": [ @@ -240,7 +333,7 @@ "build:npm:cjs": { "executor": "devextreme-nx-infra-plugin:babel-transform", "options": { - "babelConfigPath": "./build/gulp/transpile-config.js", + "babelConfigPath": "./build/transpile-config.js", "configKey": "cjs", "sourcePattern": "./js/**/*.{js,jsx}", "excludePatterns": [ @@ -265,7 +358,7 @@ "build:cjs:internal": { "executor": "devextreme-nx-infra-plugin:babel-transform", "options": { - "babelConfigPath": "./build/gulp/transpile-config.js", + "babelConfigPath": "./build/transpile-config.js", "configKey": "tsCjs", "sourcePattern": "./artifacts/dist_ts/__internal/**/*.{js,jsx}", "outDir": "./artifacts/transpiled/__internal", @@ -285,10 +378,30 @@ "{projectRoot}/artifacts/transpiled-renovation-npm/__internal" ] }, + "build:cjs:internal:watch": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "cache": false, + "options": { + "babelConfigPath": "./build/transpile-config.js", + "configKey": "tsCjs", + "sourcePattern": "./artifacts/dist_ts/__internal/**/*.{js,jsx}", + "outDir": "./artifacts/transpiled/__internal", + "renameExtensions": { + ".jsx": ".js" + }, + "watch": true + }, + "configurations": { + "production": { + "outDir": "./artifacts/transpiled-renovation-npm/__internal", + "removeDebug": true + } + } + }, "build:npm:esm:internal": { "executor": "devextreme-nx-infra-plugin:babel-transform", "options": { - "babelConfigPath": "./build/gulp/transpile-config.js", + "babelConfigPath": "./build/transpile-config.js", "configKey": "esm", "sourcePattern": "./artifacts/dist_ts/__internal/**/*.{js,jsx}", "outDir": "./artifacts/transpiled-esm-npm/esm/__internal", @@ -307,7 +420,7 @@ "build:npm:cjs:internal": { "executor": "devextreme-nx-infra-plugin:babel-transform", "options": { - "babelConfigPath": "./build/gulp/transpile-config.js", + "babelConfigPath": "./build/transpile-config.js", "configKey": "tsCjs", "sourcePattern": "./artifacts/dist_ts/__internal/**/*.{js,jsx}", "outDir": "./artifacts/transpiled-esm-npm/cjs/__internal", @@ -326,7 +439,7 @@ "build:cjs:bundles": { "executor": "devextreme-nx-infra-plugin:babel-transform", "options": { - "babelConfigPath": "./build/gulp/transpile-config.js", + "babelConfigPath": "./build/transpile-config.js", "configKey": "cjs", "sourcePattern": "./build/bundle-templates/**/*.js", "outDir": "./artifacts/transpiled/bundles", @@ -451,6 +564,34 @@ } } }, + "build:transpile:watch": { + "executor": "nx:run-commands", + "cache": false, + "options": { + "commands": [ + "pnpm nx build:ts:internal:watch devextreme", + "pnpm nx build:cjs:watch devextreme", + "pnpm nx build:cjs:watch devextreme -c production", + "pnpm nx build:cjs:internal:watch devextreme", + "pnpm nx build:cjs:internal:watch devextreme -c production" + ], + "cwd": "{projectRoot}", + "parallel": true + }, + "dependsOn": ["build:ts:internal"] + }, + "transpile:tests": { + "executor": "devextreme-nx-infra-plugin:babel-transform", + "cache": false, + "options": { + "babelConfigPath": "./testing/tests.babelrc.json", + "sourcePattern": "./testing/**/*.js", + "outDir": "./testing" + }, + "dependsOn": [ + "build:devextreme-bundler-config" + ] + }, "state-manager:optimize": { "executor": "devextreme-nx-infra-plugin:state-manager-optimize", "options": { @@ -571,6 +712,34 @@ "{projectRoot}/artifacts/js/dx.{all,web,viz,ai-integration,custom}.debug.js" ] }, + "bundle:watch": { + "executor": "devextreme-nx-infra-plugin:bundle", + "options": { + "watch": true, + "entries": [ + "bundles/dx.all.js", + "bundles/dx.web.js", + "bundles/dx.viz.js", + "bundles/dx.ai-integration.js", + "bundles/dx.custom.js" + ], + "sourceDir": "./artifacts/transpiled-renovation-npm", + "outDir": "./artifacts/js", + "mode": "debug", + "webpackConfigPath": "./webpack.config.js", + "applyLicenseHeaders": { + "prependAfterLicense": "\"use strict\";\n\n", + "separator": "", + "includePatterns": ["dx.*.debug.js"] + } + }, + "configurations": { + "production": { + "sourceMap": false + } + }, + "cache": false + }, "bundle:prod": { "executor": "nx:run-commands", "options": { @@ -667,8 +836,8 @@ "sourcesSettingsFile": "./_settings.js", "utilsOutDir": "./artifacts/js/vectormap-utils", "dataOutDir": "./artifacts/js/vectormap-data", - "utilsTemplatePath": "./build/gulp/vectormaputils-template.jst", - "dataTemplatePath": "./build/gulp/vectormapdata-template.jst", + "utilsTemplatePath": "./build/vectormap-templates/vectormaputils-template.jst", + "dataTemplatePath": "./build/vectormap-templates/vectormapdata-template.jst", "applyLicenseHeaders": { "separator": "", "prependAfterLicense": "\"use strict\";\n\n" @@ -677,8 +846,8 @@ "inputs": [ "{projectRoot}/js/viz/vector_map.utils/**/*", "{projectRoot}/build/vectormap-sources/**/*", - "{projectRoot}/build/gulp/vectormaputils-template.jst", - "{projectRoot}/build/gulp/vectormapdata-template.jst" + "{projectRoot}/build/vectormap-templates/vectormaputils-template.jst", + "{projectRoot}/build/vectormap-templates/vectormapdata-template.jst" ], "outputs": [ "{projectRoot}/artifacts/js/vectormap-utils", @@ -727,8 +896,8 @@ "inputs": [ "{projectRoot}/js/viz/vector_map.utils/**/*", "{projectRoot}/build/vectormap-sources/**/*", - "{projectRoot}/build/gulp/vectormaputils-template.jst", - "{projectRoot}/build/gulp/vectormapdata-template.jst" + "{projectRoot}/build/vectormap-templates/vectormaputils-template.jst", + "{projectRoot}/build/vectormap-templates/vectormapdata-template.jst" ], "outputs": [ "{projectRoot}/artifacts/js/vectormap-utils", @@ -811,8 +980,7 @@ "inputs": [ "{projectRoot}/artifacts/ts/dx.all.d.ts", "{projectRoot}/ts/dx.all.d.ts", - "{projectRoot}/ts/aliases.d.ts", - "{projectRoot}/build/gulp/license-header.txt" + "{projectRoot}/ts/aliases.d.ts" ] }, "verify:ts-jquery": { @@ -829,7 +997,7 @@ "{projectRoot}/artifacts/ts/dx.all.d.ts", "{projectRoot}/ts/dx.all.d.ts", "{projectRoot}/ts/aliases.d.ts", - "{projectRoot}/build/gulp/modules_metadata.json" + "{projectRoot}/build/modules_metadata.json" ] }, "copy:ts-vendor": { @@ -856,8 +1024,7 @@ "inputs": [ "{projectRoot}/ts/**/*.d.ts", "{projectRoot}/ts/vendor/**/*", - "{projectRoot}/build/gulp/modules_metadata.json", - "{projectRoot}/build/gulp/license-header.txt", + "{projectRoot}/build/modules_metadata.json", "{workspaceRoot}/pnpm-lock.yaml" ], "outputs": [ @@ -1320,7 +1487,7 @@ "{projectRoot}/artifacts/npm/devextreme/bundles/dx.all.d.ts", "{projectRoot}/artifacts/npm/devextreme-internal/**/*.d.ts", "{projectRoot}/artifacts/npm/devextreme-internal/bundles/dx.all.d.ts", - "{projectRoot}/build/gulp/modules_metadata.json", + "{projectRoot}/build/modules_metadata.json", "{projectRoot}/ts/dx.all.d.ts", "{projectRoot}/ts/aliases.d.ts" ], @@ -1347,7 +1514,7 @@ "{projectRoot}/js/**/*.d.ts", "{projectRoot}/ts/dx.all.d.ts", "{projectRoot}/ts/aliases.d.ts", - "{projectRoot}/build/gulp/modules_metadata.json", + "{projectRoot}/build/modules_metadata.json", "{projectRoot}/artifacts/npm/devextreme/**/*.d.ts", "{projectRoot}/artifacts/npm/devextreme-internal/**/*.d.ts", "{workspaceRoot}/pnpm-lock.yaml" @@ -1382,7 +1549,7 @@ "{projectRoot}/license/**/*", "{projectRoot}/build/npm-bin/**/*", "{projectRoot}/build/npm-templates/**/*", - "{projectRoot}/build/gulp/modules_metadata.json", + "{projectRoot}/build/modules_metadata.json", "{projectRoot}/ts/dx.all.d.ts", "{projectRoot}/ts/aliases.d.ts", "webpackConfig", @@ -1507,16 +1674,31 @@ "pnpm nx build:transpile devextreme", "pnpm nx state-manager:optimize devextreme", "pnpm nx run-many --targets=bundle:debug,bundle:prod,build:vectormap,copy:vendor,build:aspnet,build:declarations --projects=devextreme --parallel -c production", - "pnpm nx build:npm devextreme", + "pnpm nx build:npm devextreme -c production", + "pnpm nx verify:licenses devextreme" + ] + }, + "production-internal": { + "env": { + "BUILD_INTERNAL_PACKAGE": "true" + }, + "commands": [ + "pnpm nx clean:artifacts devextreme", + "pnpm nx build:localization devextreme", + "pnpm nx build:transpile devextreme -c internal", + "pnpm nx state-manager:optimize devextreme", + "pnpm nx run-many --targets=bundle:debug,bundle:prod,build:vectormap,copy:vendor,build:aspnet --projects=devextreme --parallel -c production", + "pnpm nx build:declarations devextreme -c internal", + "pnpm nx build:npm devextreme -c production-internal", "pnpm nx verify:licenses devextreme" ] } } }, "build-dist": { - "executor": "nx:run-script", + "executor": "nx:run-commands", "options": { - "script": "build-dist" + "command": "pnpm nx run devextreme:build -c production" }, "inputs": [ "internalPackageEnv", @@ -1525,15 +1707,31 @@ "{workspaceRoot}/pnpm-lock.yaml" ], "outputs": [ - "{projectRoot}/artifacts", - "{projectRoot}/scss/bundles" + "{projectRoot}/artifacts" ], - "cache": true + "cache": true, + "configurations": { + "internal": { + "command": "pnpm nx run devextreme:build -c production-internal" + } + }, + "metadata": { + "description": "Production dist build. Use -c internal for BUILD_INTERNAL_PACKAGE parity." + } }, "build:dev": { - "executor": "nx:run-script", + "executor": "nx:run-commands", "options": { - "script": "build:dev" + "env": { + "DEVEXTREME_TEST_CI": "true" + }, + "commands": [ + "pnpm nx clean:artifacts devextreme", + "pnpm nx build:localization devextreme", + "pnpm nx build:transpile devextreme -c ci", + "pnpm nx run-many --targets=bundle:debug,build:vectormap,copy:vendor --projects=devextreme --parallel" + ], + "parallel": false }, "dependsOn": [ "^build" @@ -1555,12 +1753,22 @@ "{projectRoot}/js/__internal/core/localization/cldr-data", "{projectRoot}/js/__internal/core/localization/default_messages.ts" ], - "cache": true + "cache": true, + "metadata": { + "description": "Dev/CI test build. Skips prod bundles, aspnet, declarations, npm, and license checks." + } }, "build:systemjs": { - "executor": "nx:run-script", + "executor": "nx:run-commands", "options": { - "script": "build:systemjs" + "cwd": "{projectRoot}", + "parallel": true, + "commands": [ + "node testing/systemjs-builder.js --transpile=modules", + "node testing/systemjs-builder.js --transpile=testing", + "node testing/systemjs-builder.js --transpile=css", + "node testing/systemjs-builder.js --transpile=js-vendors" + ] }, "dependsOn": [ "build:dev" @@ -1589,7 +1797,6 @@ "{projectRoot}/testing/helpers/**/*", "{projectRoot}/testing/tests/**/*", "{projectRoot}/testing/systemjs-builder.js", - "{projectRoot}/build/gulp/systemjs.js", "{workspaceRoot}/pnpm-lock.yaml" ], "outputs": [ @@ -1601,13 +1808,45 @@ "cache": true }, "dev": { - "executor": "nx:run-script", - "options": { - "script": "dev" - }, + "executor": "nx:run-commands", + "cache": false, "dependsOn": [ - "^build" - ] + "build:dev" + ], + "options": { + "cwd": "{projectRoot}", + "command": "pnpm nx dev-watch devextreme" + } + }, + "dev-watch": { + "executor": "nx:run-commands", + "cache": false, + "options": { + "cwd": "{projectRoot}", + "parallel": true, + "commands": [ + "pnpm nx build:transpile:watch devextreme", + "pnpm nx build:devextreme-bundler-config:watch devextreme", + "pnpm nx bundle:watch devextreme", + "pnpm nx test-env devextreme" + ] + } + }, + "test-env": { + "executor": "nx:run-commands", + "cache": false, + "options": { + "command": "node ./testing/launch", + "cwd": "{projectRoot}" + } + }, + "test-env": { + "executor": "nx:run-commands", + "cache": false, + "options": { + "command": "node ./testing/launch", + "cwd": "{projectRoot}" + } }, "lint": { "executor": "nx:noop", diff --git a/packages/devextreme/testing/tests.babelrc.json b/packages/devextreme/testing/tests.babelrc.json index 6ac0a3547bd5..bfeb03396f13 100644 --- a/packages/devextreme/testing/tests.babelrc.json +++ b/packages/devextreme/testing/tests.babelrc.json @@ -1,7 +1,7 @@ { "presets": [["@babel/preset-env", { "modules": false }]], "plugins": [ - ["transform-es2015-modules-commonjs", { "strict": false, "allowTopLevelThis": true }, "add-module-exports"], + ["@babel/plugin-transform-modules-commonjs", { "strict": false, "allowTopLevelThis": true }, "add-module-exports"], "@babel/plugin-transform-nullish-coalescing-operator", "@babel/plugin-transform-optional-chaining" ], "ignore": ["**/*.json"] diff --git a/packages/nx-infra-plugin/AGENTS.md b/packages/nx-infra-plugin/AGENTS.md index 6d34aebaf1c1..058a1f43d399 100644 --- a/packages/nx-infra-plugin/AGENTS.md +++ b/packages/nx-infra-plugin/AGENTS.md @@ -35,6 +35,7 @@ Each cross-executor concern (license banner, glob-aware copy, file concatenation - Throw inside `resolve` and `run`; the wrapper converts to `{ success: false }`. - Keep the default export shape `PromiseExecutor`. Tests import `from './executor'`. - Use `logger.verbose(...)` from `@nx/devkit` for diagnostic output in executors. Never use `console.log` or `logger.info` for routine progress messages — they pollute every run; `logger.verbose` surfaces only when callers pass `--verbose`. +- For long-running `watch` executors, reuse `src/utils/watch.ts` (`loadChokidar` + `watchWithChokidar`): it owns chokidar resolution from the project root, the debounced non-reentrant rebuild loop, and SIGINT/SIGTERM shutdown. Do not reimplement a watch loop. TypeScript watch is the exception — it uses `ts.createWatchProgram` directly (own file watching) rather than chokidar. ## Constraints @@ -65,17 +66,23 @@ Each behavior is owned by exactly ONE executor's canonical tests; consumers must 4. Update consumer imports in one batch. 5. Run the full validation pipeline. -## Migrated gulp tasks - -Gulp tasks that have been migrated to Nx executor targets (the gulp task is now a thin `shell.task` delegate): - -| Gulp task | Nx target | Notes | -| --------- | ----------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `clean` | `clean:artifacts` | Uses `devextreme-nx-infra-plugin:clean` with `excludePatterns` to preserve `artifacts/css`, `artifacts/npm/devextreme/package.json`, and `artifacts/npm/devextreme-dist`. The gulp task delegates via `shell.task('pnpm nx clean:artifacts devextreme')`. | - -When migrating additional gulp tasks, follow the same pattern: - -1. Ensure the Nx target fully replicates the gulp task's behavior (including exclusion lists, configurations, etc.) -2. Replace the gulp task body with `shell.task('pnpm nx ')`. -3. Remove unused imports from the gulpfile. -4. Test that both `gulp ` and `pnpm nx ` produce identical results. +## Former gulp tasks (gulp fully removed) + +`gulpfile.js`, `build/gulp/`, and all gulp dependencies have been deleted outright — devextreme no longer depends on gulp or ships a gulp CLI. The Nx-consumed build assets that used to live under `build/gulp/` (`transpile-config.js`, `modules_metadata.json`, the `*.jst` templates) were relocated to purpose-named folders directly under `build/` (`build/transpile-config.js`, `build/modules_metadata.json`, `build/localization-templates/`, `build/vectormap-templates/`). The table below is a historical reference mapping each removed gulp task to its Nx replacement: + +| Former gulp task | Nx target | Notes | +| --------------------------------------- | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `clean` | `clean:artifacts` | Uses `devextreme-nx-infra-plugin:clean` with `excludePatterns` to preserve `artifacts/css`, `artifacts/npm/devextreme/package.json`, and `artifacts/npm/devextreme-dist`. Run directly via `pnpm nx clean:artifacts devextreme`. | +| `bundler-config-watch` | `build:devextreme-bundler-config:watch` | Uses `devextreme-nx-infra-plugin:concatenate-files` in `watch` mode (chokidar over the `build/bundle-templates/modules/parts` sources) with `additionalPasses` so a change rebuilds both `dx.custom.js` and the derived `dx.custom.config.js`, matching the old gulp `bundler-config` chain. `cache: false`. | +| `bundler-config` (non-watch) | `build:devextreme-bundler-config` | Run via `pnpm nx build:devextreme-bundler-config devextreme` (add `-c prod` for parity with the old uglified variant). | +| `generate-community-locales` | `build:community-localization` | Uses `devextreme-nx-infra-plugin:generate-community-locales` to normalize `js/localization/messages/*.json` against `en.json` in place (fills translations, English fallback for missing/`TODO` values, escapes quotes, inherits en's key order/formatting). Target is `cache: false` with no `outputs` (input dir == output dir — a source-normalization task, not a cached build artifact). Run via `pnpm nx build:community-localization devextreme`. | +| `test-env` | `test-env` | Uses `nx:run-commands` to wrap the existing `node ./testing/launch` script (compiles the QUnit runner, starts the test server on port 20060, opens the browser). `cache: false`, no outputs (long-running server). `cwd` is `{projectRoot}`. | +| `transpile-watch` | `build:transpile:watch` | `nx:run-commands` (parallel, `cache: false`) fanning out to the incremental watch targets `build:ts:internal:watch` (TypeScript watch program emitting `dist_ts`), `build:cjs:watch` (+ `-c production`), and `build:cjs:internal:watch` (+ `-c production`). Together these keep `artifacts/transpiled` and `artifacts/transpiled-renovation-npm` fresh, matching the old gulp JS + TS watch pipes. Watch capability lives in the `babel-transform` (per-file, chokidar + debounce, `watch` option) and `build-typescript` (`ts.createWatchProgram`, `watch` option) executors via the shared `src/utils/watch.ts` helper. `babel-transform` watch is intentionally file-level incremental and does **not** do an initial full transform — it relies on a preceding build having already populated its source directory (mirroring gulp-watch, which fed babel from a single in-memory TS-compiler stream with no such gap). Because `build:transpile`'s last step (`clean:dist-ts`) deletes `artifacts/dist_ts` — the exact directory `build:cjs:internal:watch` reads from and that runs right before `dev-watch` starts — `build:transpile:watch` itself (not the leaf `build:cjs:internal:watch` target, to avoid two parallel invocations each re-running the compile) declares `dependsOn: ["build:ts:internal"]`, so a real (or Nx-cache-restored) TS compile always repopulates `dist_ts/__internal` once, up front, before any of the fanned-out watch processes start; without it, whichever of the parallel TS-watch/babel-watch processes started first would decide — nondeterministically — whether the initial compile burst is picked up. | +| `transpile-tests` | `transpile:tests` | Uses `devextreme-nx-infra-plugin:babel-transform` with the flat (keyless) `./testing/tests.babelrc.json` config to transpile `testing/**/*.js` in place. `dependsOn: ["build:devextreme-bundler-config"]` reproduces the old gulp `series('bundler-config', …)` prerequisite. `cache: false` (in-place source transform, not a cached artifact). Run via `pnpm nx transpile:tests devextreme`. | +| `transpile-systemjs` | `build:systemjs` | Uses `nx:run-commands` (no custom executor — same precedent as `test-env`) to run `node testing/systemjs-builder.js --transpile=` for each mode (`modules`, `testing`, `css`, `js-vendors`) with `parallel: true` and `cwd: {projectRoot}`, mirroring the old `gulp.parallel`. The transform logic stays entirely in `testing/systemjs-builder.js` (untouched, guaranteeing byte parity); the devextreme-specific script path + mode list live in `project.json`, not in the plugin. `cache: true`, keeps the existing `inputs`/`outputs`/`dependsOn: [build:dev]`. CI runs `pnpm exec nx build:systemjs` directly. | +| `js-bundles-watch` | `bundle:watch` | Webpack watch via `devextreme-nx-infra-plugin:bundle` with `watch: true`. Does not run `compress:bundles`. | +| `js-bundles-prod` | `bundle:prod` | Use `pnpm nx bundle:prod devextreme` (add `-c production` for uglify/dist parity). | +| `js-bundles-debug` | `bundle:debug` | Use `pnpm nx bundle:debug devextreme` (add `-c production` for uglify/dist parity). | +| `dev-watch` | `dev-watch` | `nx:run-commands` (parallel, `cache: false`, `cwd: {projectRoot}`) fanning out to the four already-migrated watch targets — `build:transpile:watch`, `build:devextreme-bundler-config:watch`, `bundle:watch`, `test-env` — matching the old `gulp.parallel('transpile-watch', 'bundler-config-watch', 'js-bundles-watch', 'test-env')`. | +| `dev` | `dev` | `nx:run-commands` with `dependsOn: ["build:dev"]`; its own command then runs `pnpm nx dev-watch devextreme`, reproducing the old `gulp.series('default-dev', 'dev-watch')` build-then-watch sequencing. Reuses `build:dev` as the initial-build step rather than replicating gulp's lighter `default-dev` variant (which skipped `clean` and the one-shot `js-bundles-debug` build) — an accepted small startup-cost tradeoff. | +| `default` / `main-batch` / `misc-batch` | `build`, `build-dist`, `build:dev` | Gulp orchestration (`gulp.series` / `gulp-multi-process`) is gone. Native Nx `build` covers the non-uglify default batch; `build -c production` (+ `build:npm -c production`) matches the old `gulp default --uglify`; `build -c production-internal` matches uglify + `BUILD_INTERNAL_PACKAGE`; `build -c testing` matches `BUILD_TEST_INTERNAL_PACKAGE`. `build-dist` is a thin wrapper (`pnpm nx run devextreme:build -c production`, `-c internal` → `production-internal`). `build:dev` is the former `DEVEXTREME_TEST_CI` path: clean → localization → `build:transpile -c ci` → parallel `bundle:debug,build:vectormap,copy:vendor` (skips prod bundles, aspnet, declarations, npm, license checks). npm scripts `build:dev` / `build-dist` / `clean` / `transpile-tests` call Nx directly. | diff --git a/packages/nx-infra-plugin/executors.json b/packages/nx-infra-plugin/executors.json index 1be9f2301656..aa8b5c56283a 100644 --- a/packages/nx-infra-plugin/executors.json +++ b/packages/nx-infra-plugin/executors.json @@ -60,6 +60,11 @@ "schema": "./src/executors/localization/schema.json", "description": "Generate localization message files and TypeScript CLDR data modules" }, + "generate-community-locales": { + "implementation": "./src/executors/generate-community-locales/executor", + "schema": "./src/executors/generate-community-locales/schema.json", + "description": "Normalize community locale message files against the default locale dictionary" + }, "concatenate-files": { "implementation": "./src/executors/concatenate-files/executor", "schema": "./src/executors/concatenate-files/schema.json", diff --git a/packages/nx-infra-plugin/src/executors/add-license-headers/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/add-license-headers/executor.e2e.spec.ts index 80c7a7fe8ba7..d3061a10dac4 100644 --- a/packages/nx-infra-plugin/src/executors/add-license-headers/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/add-license-headers/executor.e2e.spec.ts @@ -11,7 +11,7 @@ describe('AddLicenseHeadersExecutor E2E', () => { async function setupLicenseHeaderTemplate(): Promise { const projectDir = path.join(tempDir, 'packages', 'test-lib'); - const buildDir = path.join(projectDir, 'build', 'gulp'); + const buildDir = path.join(projectDir, 'build'); fs.mkdirSync(buildDir, { recursive: true }); await writeFileText( path.join(buildDir, 'license-header.txt'), @@ -132,7 +132,7 @@ describe('AddLicenseHeadersExecutor E2E', () => { it('should support custom license template', async () => { const projectDir = path.join(tempDir, 'packages', 'test-lib'); - const buildDir = path.join(projectDir, 'build', 'gulp'); + const buildDir = path.join(projectDir, 'build'); fs.mkdirSync(buildDir, { recursive: true }); await writeFileText( @@ -151,7 +151,7 @@ describe('AddLicenseHeadersExecutor E2E', () => { const options: AddLicenseHeadersExecutorSchema = { targetDirectory: './npm', packageJsonPath: './package.json', - licenseTemplateFile: './build/gulp/license-header.txt', + licenseTemplateFile: './build/license-header.txt', eulaUrl: 'https://js.devexpress.com/Licensing/', prependAfterLicense: '"use strict";\n\n', includePatterns: ['**/*.js'], @@ -293,7 +293,7 @@ export const value = 42; const options: AddLicenseHeadersExecutorSchema = { targetDirectory: './npm', packageJsonPath: './package.json', - licenseTemplateFile: './build/gulp/license-header.txt', + licenseTemplateFile: './build/license-header.txt', eulaUrl: 'https://js.devexpress.com/Licensing/', includePatterns: ['**/*.js'], commentType: '*', @@ -316,7 +316,7 @@ export const value = 42; const options: AddLicenseHeadersExecutorSchema = { targetDirectory: './npm', packageJsonPath: './package.json', - licenseTemplateFile: './build/gulp/license-header.txt', + licenseTemplateFile: './build/license-header.txt', eulaUrl: 'https://js.devexpress.com/Licensing/', includePatterns: ['**/*.js'], }; diff --git a/packages/nx-infra-plugin/src/executors/babel-transform/babel-transform.impl.ts b/packages/nx-infra-plugin/src/executors/babel-transform/babel-transform.impl.ts index 588c25184816..8953370bf9e1 100644 --- a/packages/nx-infra-plugin/src/executors/babel-transform/babel-transform.impl.ts +++ b/packages/nx-infra-plugin/src/executors/babel-transform/babel-transform.impl.ts @@ -3,10 +3,12 @@ import * as fs from 'fs-extra'; import { stat } from 'fs/promises'; import * as babel from '@babel/core'; import { glob } from 'glob'; +import { minimatch } from 'minimatch'; import { logger } from '@nx/devkit'; import { createExecutor } from '../../utils/create-executor'; import { toPosixPath } from '../../utils/path-resolver'; import { copyFile } from '../../utils/file-operations'; +import { watchWithChokidar } from '../../utils/watch'; import { copyDirectory } from '../copy-files/copy-files.impl'; import { stripDebug } from '../compress/compress.impl'; import { BabelTransformAsset, BabelTransformExecutorSchema } from './schema'; @@ -17,7 +19,7 @@ const ERROR_ASSET_NOT_FOUND = (source: string) => `Asset source not found: ${sou function loadBabelConfig( projectRoot: string, configPath: string, - configKey: string, + configKey?: string, ): babel.TransformOptions { const fullConfigPath = path.join(projectRoot, configPath); @@ -27,6 +29,10 @@ function loadBabelConfig( const config = require(fullConfigPath); + if (!configKey) { + return config; + } + if (!config[configKey]) { const availableKeys = Object.keys(config).join(', '); throw new Error(`Config key '${configKey}' not found. Available: ${availableKeys}`); @@ -45,6 +51,17 @@ function applyExtensionRenames(filePath: string, renameExtensions: Record= 0 + ? cleanPattern.substring(0, globIndex).replace(/\/$/, '') + : cleanPattern.split('/')[0]; + return path.join(projectRoot, patternBase); +} + async function transformFile( filePath: string, projectRoot: string, @@ -69,13 +86,7 @@ async function transformFile( 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 sourceBase = resolveSourceBase(projectRoot, sourcePattern); const relativePath = path.relative(sourceBase, filePath); const renamedRelativePath = applyExtensionRenames(relativePath, renameExtensions); @@ -116,6 +127,7 @@ interface ResolvedBabelTransform { globPattern: string; excludePatterns: string[]; resolvedAssets: ResolvedBabelTransformAsset[]; + watchDir: string; } function resolveAssets( @@ -130,6 +142,98 @@ function resolveAssets( })); } +function transformOne( + resolved: ResolvedBabelTransform, + options: BabelTransformExecutorSchema, + filePath: string, +): Promise { + return transformFile( + filePath, + resolved.projectRoot, + options.outDir, + options.sourcePattern, + resolved.babelConfig, + resolved.removeDebug, + resolved.renameExtensions, + ); +} + +async function copyResolvedAssets(resolved: ResolvedBabelTransform, outDir: string): Promise { + if (resolved.resolvedAssets.length === 0) { + return; + } + logger.verbose(`Copying ${resolved.resolvedAssets.length} asset entries to ${outDir}`); + for (const asset of resolved.resolvedAssets) { + await copyResolvedAsset(asset); + } +} + +async function runFullTransform( + resolved: ResolvedBabelTransform, + options: BabelTransformExecutorSchema, +): Promise { + const sourceFiles = await glob(resolved.globPattern, { + absolute: true, + ignore: resolved.excludePatterns, + }); + + if (sourceFiles.length === 0) { + logger.warn(ERROR_NO_FILES_MATCHED); + throw new Error(ERROR_NO_FILES_MATCHED); + } + + logger.verbose( + `Transforming ${sourceFiles.length} files with config '${options.configKey ?? 'default'}'...`, + ); + if (resolved.removeDebug) { + logger.verbose('Debug blocks will be removed (production mode)'); + } + + await Promise.all(sourceFiles.map((file) => transformOne(resolved, options, file))); + + logger.verbose(`Successfully transformed ${sourceFiles.length} files to ${options.outDir}`); + + await copyResolvedAssets(resolved, options.outDir); +} + +// Deletions are ignored on purpose — gulp-watch left stale output in place too. +const WATCHED_EVENTS = new Set(['add', 'change']); + +function isRelevantSource( + resolved: ResolvedBabelTransform, + event: string, + filePath: string, +): boolean { + if (!WATCHED_EVENTS.has(event)) { + return false; + } + const posixPath = toPosixPath(filePath); + if (!minimatch(posixPath, resolved.globPattern)) { + return false; + } + return !resolved.excludePatterns.some((pattern) => minimatch(posixPath, pattern)); +} + +async function runWatch( + resolved: ResolvedBabelTransform, + options: BabelTransformExecutorSchema, +): Promise { + // dist_ts may not exist yet if the TS watcher hasn't emitted anything — chokidar needs the dir to attach. + await fs.ensureDir(resolved.watchDir); + await copyResolvedAssets(resolved, options.outDir); + + await watchWithChokidar({ + projectRoot: resolved.projectRoot, + watchTargets: resolved.watchDir, + label: `babel-transform watch (${options.outDir})`, + eventFilter: (event, filePath) => isRelevantSource(resolved, event, filePath), + onRebuild: async (events) => { + const files = [...new Set(events.map((e) => e.filePath))]; + await Promise.all(files.map((file) => transformOne(resolved, options, file))); + }, + }); +} + export default createExecutor({ name: 'BabelTransform', resolve: (options, { projectRoot }) => { @@ -147,6 +251,7 @@ export default createExecutor { - const sourceFiles = await glob(resolved.globPattern, { - absolute: true, - ignore: resolved.excludePatterns, - }); - - if (sourceFiles.length === 0) { - logger.warn(ERROR_NO_FILES_MATCHED); - throw new Error(ERROR_NO_FILES_MATCHED); + if (options.watch) { + await runWatch(resolved, options); + return; } - logger.verbose( - `Transforming ${sourceFiles.length} files with config '${options.configKey}'...`, - ); - if (resolved.removeDebug) { - logger.verbose('Debug blocks will be removed (production mode)'); - } - - await Promise.all( - sourceFiles.map((file) => - transformFile( - file, - resolved.projectRoot, - options.outDir, - options.sourcePattern, - resolved.babelConfig, - resolved.removeDebug, - resolved.renameExtensions, - ), - ), - ); - - logger.verbose(`Successfully transformed ${sourceFiles.length} files to ${options.outDir}`); - - if (resolved.resolvedAssets.length > 0) { - logger.verbose( - `Copying ${resolved.resolvedAssets.length} asset entries to ${options.outDir}`, - ); - for (const asset of resolved.resolvedAssets) { - await copyResolvedAsset(asset); - } - } + await runFullTransform(resolved, options); }, }); 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 36186b5a2de4..8ab3170fe913 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 @@ -12,6 +12,46 @@ import { writeFileText, readFileText } from '../../utils'; const WORKSPACE_ROOT = findWorkspaceRoot(); +type WatchHandler = (event: string, file: string) => void; + +function getWatchHandler(): WatchHandler | undefined { + return (globalThis as unknown as { __babelWatchHandler?: WatchHandler }).__babelWatchHandler; +} + +// Mock chokidar so the shared watch util's projectRequire('chokidar') resolves; the mock +// captures the 'all' handler on globalThis so the test can drive a rebuild deterministically. +function writeChokidarMock(projectRoot: string): void { + const chokidarDir = path.join(projectRoot, 'node_modules', 'chokidar'); + fs.mkdirSync(chokidarDir, { recursive: true }); + fs.writeFileSync(path.join(chokidarDir, 'package.json'), JSON.stringify({ main: 'index.js' })); + fs.writeFileSync( + path.join(chokidarDir, 'index.js'), + [ + 'module.exports = {', + ' watch: function watch() {', + ' return {', + ' on: function on(event, handler) { globalThis.__babelWatchHandler = handler; return this; },', + ' close: function close() { return Promise.resolve(); },', + ' };', + ' },', + '};', + '', + ].join('\n'), + ); +} + +async function waitFor( + predicate: () => Promise | boolean, + timeoutMs = 3000, +): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + if (await predicate()) return; + await new Promise((resolve) => setTimeout(resolve, 20)); + } + throw new Error('waitFor timed out'); +} + const BABEL_CONFIG = ` 'use strict'; @@ -66,7 +106,7 @@ describe('BabelTransformExecutor E2E', () => { process.chdir(projectDir); - const buildDir = path.join(projectDir, 'build', 'gulp'); + const buildDir = path.join(projectDir, 'build'); fs.mkdirSync(buildDir, { recursive: true }); await writeFileText(path.join(buildDir, 'transpile-config.js'), BABEL_CONFIG); @@ -122,7 +162,7 @@ export function helper() { ])('$configKey config', ({ configKey, outDir, shouldContain, shouldNotContain }) => { it('should transform files correctly', async () => { const options: BabelTransformExecutorSchema = { - babelConfigPath: './build/gulp/transpile-config.js', + babelConfigPath: './build/transpile-config.js', configKey, sourcePattern: './js/**/*.js', outDir, @@ -145,7 +185,7 @@ export function helper() { it('should forward removeDebug option to stripDebug helper', async () => { const options: BabelTransformExecutorSchema = { - babelConfigPath: './build/gulp/transpile-config.js', + babelConfigPath: './build/transpile-config.js', configKey: 'cjs', sourcePattern: './js/**/*.js', outDir: './artifacts/transpiled-prod', @@ -171,7 +211,7 @@ module.exports = { }, }; `; - const minimalConfigPath = './build/gulp/minimal-config.js'; + const minimalConfigPath = './build/minimal-config.js'; beforeEach(async () => { await writeFileText(path.join(projectDir, minimalConfigPath), MINIMAL_BABEL_CONFIG); @@ -263,3 +303,113 @@ module.exports = { }, 30000); }); }); + +describe('BabelTransformExecutor flat config + watch', () => { + let tempDir: string; + let context = createMockContext(); + let projectDir: string; + let savedCwd: string; + + const FLAT_CONFIG = JSON.stringify({ comments: false }); + + beforeEach(async () => { + savedCwd = process.cwd(); + tempDir = createTempDir('nx-babel-watch-e2e-'); + context = createMockContext({ root: tempDir }); + projectDir = path.join(tempDir, 'packages', 'test-lib'); + fs.mkdirSync(projectDir, { recursive: true }); + await writeFileText( + path.join(projectDir, 'package.json'), + JSON.stringify({ name: 'test-lib' }), + ); + process.chdir(projectDir); + + // Flat (keyless) babel config, mirroring testing/tests.babelrc.json usage. + await writeFileText(path.join(projectDir, 'babel.flat.json'), FLAT_CONFIG); + + const jsDir = path.join(projectDir, 'js'); + fs.mkdirSync(jsDir, { recursive: true }); + await writeFileText( + path.join(jsDir, 'a.js'), + 'const a = 1; // comment-a\nmodule.exports = a;\n', + ); + await writeFileText( + path.join(jsDir, 'b.js'), + 'const b = 2; // comment-b\nmodule.exports = b;\n', + ); + }); + + afterEach(() => { + process.chdir(savedCwd); + cleanupTempDir(tempDir); + delete (globalThis as unknown as { __babelWatchHandler?: WatchHandler }).__babelWatchHandler; + }); + + it('uses the whole module as the babel config when configKey is omitted', async () => { + const options: BabelTransformExecutorSchema = { + babelConfigPath: './babel.flat.json', + sourcePattern: './js/**/*.js', + outDir: './out', + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + const aContent = await readFileText(path.join(projectDir, 'out', 'a.js')); + expect(aContent).not.toContain('comment-a'); + }, 30000); + + it('watch mode re-transforms only the changed file', async () => { + writeChokidarMock(projectDir); + + const options: BabelTransformExecutorSchema = { + babelConfigPath: './babel.flat.json', + sourcePattern: './js/**/*.js', + outDir: './out', + watch: true, + }; + + const aOut = path.join(projectDir, 'out', 'a.js'); + const bOut = path.join(projectDir, 'out', 'b.js'); + + const originalOnce = process.once; + let stopWatch: (() => void) | undefined; + let run: Promise<{ success: boolean }> | undefined; + + (process as unknown as { once: typeof process.once }).once = (( + event: string, + handler: () => void, + ) => { + if (event === 'SIGINT' || event === 'SIGTERM') { + stopWatch = handler; + return process; + } + return originalOnce.call(process, event, handler as never); + }) as typeof process.once; + + try { + run = executor(options, context); + + await waitFor(() => typeof getWatchHandler() === 'function'); + + // Only a.js changes; b.js must stay untouched (file-level incremental). + getWatchHandler()?.('change', path.join(projectDir, 'js', 'a.js')); + + await waitFor(() => fs.existsSync(aOut)); + expect(await readFileText(aOut)).not.toContain('comment-a'); + expect(fs.existsSync(bOut)).toBe(false); + + stopWatch?.(); + stopWatch = undefined; + + expect((await run).success).toBe(true); + run = undefined; + } finally { + stopWatch?.(); + if (run) { + await run; + } + (process as unknown as { once: typeof process.once }).once = originalOnce; + } + }, 30000); +}); diff --git a/packages/nx-infra-plugin/src/executors/babel-transform/schema.json b/packages/nx-infra-plugin/src/executors/babel-transform/schema.json index 79f2256d12e7..85c5f2ead9a6 100644 --- a/packages/nx-infra-plugin/src/executors/babel-transform/schema.json +++ b/packages/nx-infra-plugin/src/executors/babel-transform/schema.json @@ -6,11 +6,11 @@ "properties": { "babelConfigPath": { "type": "string", - "description": "Path to Babel config file relative to project root (e.g., './build/gulp/transpile-config.js')" + "description": "Path to Babel config file relative to project root (e.g., './build/transpile-config.js')" }, "configKey": { "type": "string", - "description": "Key in the config object to use (e.g., 'cjs', 'tsCjs', 'esm')" + "description": "Key in the config object to use (e.g., 'cjs', 'tsCjs', 'esm'). Omit to use the loaded module as the config directly (e.g., a flat .babelrc.json)." }, "sourcePattern": { "type": "string", @@ -59,11 +59,15 @@ "to" ] } + }, + "watch": { + "type": "boolean", + "default": false, + "description": "Watch the source pattern and re-transform files as they change (file-level incremental rebuild)." } }, "required": [ "babelConfigPath", - "configKey", "sourcePattern", "outDir" ] diff --git a/packages/nx-infra-plugin/src/executors/babel-transform/schema.ts b/packages/nx-infra-plugin/src/executors/babel-transform/schema.ts index c940ca84a383..00c63dced7c2 100644 --- a/packages/nx-infra-plugin/src/executors/babel-transform/schema.ts +++ b/packages/nx-infra-plugin/src/executors/babel-transform/schema.ts @@ -5,11 +5,12 @@ export interface BabelTransformAsset { export interface BabelTransformExecutorSchema { babelConfigPath: string; - configKey: string; + configKey?: string; sourcePattern: string; excludePatterns?: string[]; outDir: string; removeDebug?: boolean; renameExtensions?: Record; copyAssets?: BabelTransformAsset[]; + watch?: boolean; } diff --git a/packages/nx-infra-plugin/src/executors/build-typescript/build-typescript.impl.ts b/packages/nx-infra-plugin/src/executors/build-typescript/build-typescript.impl.ts index 8b9d31ba0ce3..4db1d4c087b9 100644 --- a/packages/nx-infra-plugin/src/executors/build-typescript/build-typescript.impl.ts +++ b/packages/nx-infra-plugin/src/executors/build-typescript/build-typescript.impl.ts @@ -239,6 +239,62 @@ function emitStandard(program: ts.Program): EmitProgramResult { return { success: true }; } +// Same tsc-alias resolution as the one-shot build, applied per incremental re-emit. +async function runWatch(config: ResolvedConfig): Promise { + const aliasTranspileFunc = + config.resolvePaths && config.resolvePathsBaseDir + ? await createAliasTranspileFunc(config.tsconfigPath, config.resolvePathsBaseDir) + : undefined; + + await ensureDir(config.outDir); + + const reportDiagnostic = (diagnostic: ts.Diagnostic): void => { + formatDiagnostics([diagnostic]).forEach((message) => logger.error(message)); + }; + const reportWatchStatus = (diagnostic: ts.Diagnostic): void => { + logger.verbose(ts.flattenDiagnosticMessageText(diagnostic.messageText, NEWLINE_CHAR)); + }; + + const compilerOptions: ts.CompilerOptions = { + outDir: config.outDir, + ...(config.resolvePaths ? {} : { paths: {} }), + }; + + const host = ts.createWatchCompilerHost( + config.tsconfigPath, + compilerOptions, + ts.sys, + ts.createSemanticDiagnosticsBuilderProgram, + reportDiagnostic, + reportWatchStatus, + ); + + const emitWriteFile: ts.WriteFileCallback = (filePath, data, writeByteOrderMark) => { + let content = data; + if (aliasTranspileFunc && config.resolvePathsBaseDir) { + const normalizedFilePath = replacePathPrefix( + filePath, + config.outDir, + config.resolvePathsBaseDir, + ); + content = aliasTranspileFunc(normalizedFilePath, data); + } + ts.sys.writeFile(filePath, content, writeByteOrderMark); + }; + (host as { writeFile?: ts.WriteFileCallback }).writeFile = emitWriteFile; + const watchProgram = ts.createWatchProgram(host); + logger.verbose(`TypeScript watch is emitting to ${config.outDir}...`); + + await new Promise((resolve) => { + const stop = (): void => { + watchProgram.close(); + resolve(); + }; + process.once('SIGINT', stop); + process.once('SIGTERM', stop); + }); +} + interface ResolvedBuildTypescript { config: ResolvedConfig; } @@ -250,7 +306,12 @@ export default createExecutor { + run: async ({ config }, options) => { + if (options.watch) { + await runWatch(config); + return; + } + const { content: tsconfigContent, compilerOptions } = await loadTsConfig(config.tsconfigPath); compilerOptions.outDir = config.outDir; await ensureDir(config.outDir); diff --git a/packages/nx-infra-plugin/src/executors/build-typescript/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/build-typescript/executor.e2e.spec.ts index 46f72350a0f9..a7db0e3e2460 100644 --- a/packages/nx-infra-plugin/src/executors/build-typescript/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/build-typescript/executor.e2e.spec.ts @@ -172,4 +172,63 @@ describe('BuildTypescriptExecutor E2E', () => { expect(result.success).toBe(false); }); }); + + describe('watch mode', () => { + async function waitFor(predicate: () => boolean, timeoutMs = 20000): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + if (predicate()) return; + await new Promise((resolve) => setTimeout(resolve, 50)); + } + throw new Error('waitFor timed out'); + } + + it('emits to outDir with alias resolution and stops on SIGINT', async () => { + const options: BuildTypescriptExecutorSchema = { + module: 'esm', + tsconfig: './tsconfig.esm.json', + outDir: './npm/esm-watch', + resolvePaths: true, + resolvePathsBaseDir: './src', + watch: true, + }; + + const outIndex = path.join(projectDir, 'npm', 'esm-watch', 'index.js'); + + const originalOnce = process.once; + let stopWatch: (() => void) | undefined; + let run: Promise<{ success: boolean }> | undefined; + + (process as unknown as { once: typeof process.once }).once = (( + event: string, + handler: () => void, + ) => { + if (event === 'SIGINT' || event === 'SIGTERM') { + stopWatch = handler; + return process; + } + return originalOnce.call(process, event, handler as never); + }) as typeof process.once; + + try { + run = executor(options, context); + + await waitFor(() => fs.existsSync(outIndex)); + const indexContent = await readFileText(outIndex); + expect(indexContent).not.toContain('@lib/utils'); + + stopWatch?.(); + stopWatch = undefined; + + expect((await run).success).toBe(true); + run = undefined; + } finally { + stopWatch?.(); + if (run) { + await run; + } + (process as unknown as { once: typeof process.once }).once = originalOnce; + } + }, 30000); + }); }); diff --git a/packages/nx-infra-plugin/src/executors/build-typescript/schema.json b/packages/nx-infra-plugin/src/executors/build-typescript/schema.json index 41c9036fcdf4..b77bb1964ee8 100644 --- a/packages/nx-infra-plugin/src/executors/build-typescript/schema.json +++ b/packages/nx-infra-plugin/src/executors/build-typescript/schema.json @@ -43,6 +43,11 @@ "resolvePathsBaseDir": { "type": "string", "description": "Base directory for path alias resolution (used as aliasRoot for tsc-alias). Relative to project root. Required when resolvePaths is true. Example: './js' for DevExtreme's __internal TypeScript compilation." + }, + "watch": { + "type": "boolean", + "default": false, + "description": "Watch the sources via the TypeScript incremental watch program and re-emit changed files to outDir." } } } diff --git a/packages/nx-infra-plugin/src/executors/build-typescript/schema.ts b/packages/nx-infra-plugin/src/executors/build-typescript/schema.ts index 1fa42424af72..7c3b2e10ccfe 100644 --- a/packages/nx-infra-plugin/src/executors/build-typescript/schema.ts +++ b/packages/nx-infra-plugin/src/executors/build-typescript/schema.ts @@ -6,4 +6,5 @@ export interface BuildTypescriptExecutorSchema { outDir?: string; resolvePaths?: boolean; resolvePathsBaseDir?: string; + watch?: boolean; } diff --git a/packages/nx-infra-plugin/src/executors/bundle/bundle.impl.ts b/packages/nx-infra-plugin/src/executors/bundle/bundle.impl.ts index f22714cf467c..3c2e8824512d 100644 --- a/packages/nx-infra-plugin/src/executors/bundle/bundle.impl.ts +++ b/packages/nx-infra-plugin/src/executors/bundle/bundle.impl.ts @@ -51,6 +51,7 @@ function createWebpackConfig( mode: 'debug' | 'production', projectRoot: string, sourceMap: boolean, + watch: boolean, ): Configuration { const config: Configuration = { ...baseConfig, @@ -68,6 +69,10 @@ function createWebpackConfig( minimize: false, }; + if (watch) { + config.mode = 'development'; + } + if (mode === 'debug') { config.output = { ...(config.output || {}), @@ -98,6 +103,19 @@ function createWebpackConfig( return config; } +function collectWebpackErrorMessages(stats: Stats): string { + const info = stats.toJson({ errors: true }); + return (info.errors || []).map((entry) => entry.message).join('\n'); +} + +function logWebpackWarnings(stats: Stats): void { + if (!stats.hasWarnings()) { + return; + } + const info = stats.toJson({ warnings: true }); + (info.warnings || []).forEach((warning) => logger.warn(warning.message)); +} + function runWebpack(webpack: typeof import('webpack'), config: Configuration): Promise { return new Promise((resolve, reject) => { webpack(config, (err, stats) => { @@ -110,9 +128,7 @@ function runWebpack(webpack: typeof import('webpack'), config: Configuration): P return; } if (stats.hasErrors()) { - const info = stats.toJson({ errors: true }); - const errorMessages = (info.errors || []).map((entry) => entry.message).join('\n'); - reject(new Error(errorMessages)); + reject(new Error(collectWebpackErrorMessages(stats))); return; } resolve(stats); @@ -120,6 +136,88 @@ function runWebpack(webpack: typeof import('webpack'), config: Configuration): P }); } +async function runWebpackWatch( + webpack: typeof import('webpack'), + config: Configuration, + onSuccess: (stats: Stats) => Promise, +): Promise { + await new Promise((resolve) => { + const compiler = webpack(config); + let watching: ReturnType | undefined; + let isClosing = false; + + let postBuildChain = Promise.resolve(); + + const removeSignalHandlers = (): void => { + process.removeListener('SIGINT', stopWatching); + process.removeListener('SIGTERM', stopWatching); + }; + + const finishShutdown = (): void => { + void postBuildChain.finally(() => { + resolve(); + }); + }; + + const stopWatching = (): void => { + if (isClosing) { + return; + } + isClosing = true; + removeSignalHandlers(); + + if (!watching) { + finishShutdown(); + return; + } + watching.close(() => { + setTimeout(finishShutdown, 100); + }); + }; + + watching = compiler.watch( + { + aggregateTimeout: 200, + ignored: /node_modules/, + ...(process.platform === 'win32' ? { poll: 1000 } : {}), + }, + (err, stats) => { + if (isClosing) { + return; + } + if (err) { + logger.error(err.message); + return; + } + if (!stats) { + return; + } + if (stats.hasErrors()) { + logger.error(collectWebpackErrorMessages(stats)); + return; + } + + logWebpackWarnings(stats); + + postBuildChain = postBuildChain + .then(() => onSuccess(stats)) + .then(() => { + logger.info('bundle watch: rebuild complete'); + }) + .catch((error) => { + const message = error instanceof Error ? error.message : String(error); + logger.error(`bundle watch post-build failed: ${message}`); + }); + }, + ); + + logger.info('bundle watch mode is watching for changes...'); + + process.once('SIGINT', stopWatching); + process.once('SIGTERM', stopWatching); + }); +} + function loadWebpackConfig(resolvedConfigPath: string): Configuration { if (!fs.existsSync(resolvedConfigPath)) { throw new Error(ERROR_MESSAGES.WEBPACK_CONFIG_NOT_FOUND(resolvedConfigPath)); @@ -146,6 +244,7 @@ interface ResolvedBundle { resolvedOutDir: string; mode: 'debug' | 'production'; sourceMap: boolean; + watch: boolean; webpack: typeof import('webpack'); baseConfig: Configuration; licenseHeaders?: ResolvedLicenseHeaders; @@ -195,6 +294,7 @@ export default createExecutor({ mode, webpackConfigPath = './webpack.config.js', sourceMap = true, + watch = false, applyLicenseHeaders, } = options; @@ -217,6 +317,7 @@ export default createExecutor({ resolvedOutDir, mode, sourceMap, + watch, webpack, baseConfig, licenseHeaders, @@ -232,19 +333,31 @@ export default createExecutor({ resolved.mode, resolved.projectRoot, resolved.sourceMap, + resolved.watch, ); logger.verbose(`Bundling ${resolved.entries.length} entries in ${resolved.mode} mode`); logger.verbose(`Source: ${resolved.resolvedSourceDir}`); logger.verbose(`Output: ${resolved.resolvedOutDir}`); + const applyHeadersIfNeeded = async (): Promise => { + if (resolved.licenseHeaders) { + await applyLicenseHeadersStep(resolved.resolvedOutDir, resolved.licenseHeaders); + } + }; + + if (resolved.watch) { + await runWebpackWatch(resolved.webpack, config, async (stats) => { + const assets = Object.keys(stats.compilation.assets); + logger.verbose(`Produced ${assets.length} bundle(s): ${assets.join(', ')}`); + await applyHeadersIfNeeded(); + }); + return; + } + try { const stats = await runWebpack(resolved.webpack, config); - - if (stats.hasWarnings()) { - const info = stats.toJson({ warnings: true }); - (info.warnings || []).forEach((warning) => logger.warn(warning.message)); - } + logWebpackWarnings(stats); const assets = Object.keys(stats.compilation.assets); logger.verbose(`Produced ${assets.length} bundle(s): ${assets.join(', ')}`); @@ -253,8 +366,6 @@ export default createExecutor({ throw new Error(ERROR_MESSAGES.WEBPACK_ERROR(message)); } - if (resolved.licenseHeaders) { - await applyLicenseHeadersStep(resolved.resolvedOutDir, resolved.licenseHeaders); - } + await applyHeadersIfNeeded(); }, }); diff --git a/packages/nx-infra-plugin/src/executors/bundle/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/bundle/executor.e2e.spec.ts index 3a7a05d7c419..a5f19f85dcbd 100644 --- a/packages/nx-infra-plugin/src/executors/bundle/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/bundle/executor.e2e.spec.ts @@ -108,7 +108,7 @@ describe('BundleExecutor E2E', () => { version: '7.8.9', }); - const buildDir = path.join(projectDir, 'build', 'gulp'); + const buildDir = path.join(projectDir, 'build'); fs.mkdirSync(buildDir, { recursive: true }); await writeFileText( path.join(buildDir, 'license-header.txt'), @@ -122,7 +122,7 @@ describe('BundleExecutor E2E', () => { mode: 'production', webpackConfigPath: './webpack.config.js', applyLicenseHeaders: { - licenseTemplateFile: './build/gulp/license-header.txt', + licenseTemplateFile: './build/license-header.txt', separator: '', includePatterns: ['dx.*.js'], }, @@ -135,4 +135,46 @@ describe('BundleExecutor E2E', () => { expect(bundleContent).toMatch(/^\/\*!/); expect(bundleContent).toContain('DevExtreme (dx.all.js)'); }, 60000); + + async function waitUntil( + predicate: () => boolean | Promise, + timeoutMs = 30000, + intervalMs = 200, + ): Promise { + const startedAt = Date.now(); + + while (Date.now() - startedAt < timeoutMs) { + if (await predicate()) { + return; + } + await new Promise((resolve) => setTimeout(resolve, intervalMs)); + } + + throw new Error(`Timed out after ${timeoutMs}ms`); + } + + it('should produce bundles on initial watch compilation', async () => { + const outputPath = path.join(projectDir, 'artifacts', 'js', 'dx.all.debug.js'); + + const options: BundleExecutorSchema = { + entries: ['bundles/dx.all.js'], + sourceDir: './artifacts/transpiled-renovation-npm', + outDir: './artifacts/js', + mode: 'debug', + webpackConfigPath: './webpack.config.js', + watch: true, + }; + + const watchPromise = executor(options, context); + + await waitUntil(() => fs.existsSync(outputPath)); + expect(await readFileText(outputPath)).toContain('Hello,'); + + setImmediate(() => { + process.emit('SIGINT'); + }); + + const result = await watchPromise; + expect(result.success).toBe(true); + }, 60000); }); diff --git a/packages/nx-infra-plugin/src/executors/bundle/schema.json b/packages/nx-infra-plugin/src/executors/bundle/schema.json index a94a4bd268c1..8e8a82be1bb7 100644 --- a/packages/nx-infra-plugin/src/executors/bundle/schema.json +++ b/packages/nx-infra-plugin/src/executors/bundle/schema.json @@ -37,6 +37,11 @@ "description": "Enable eval-source-map devtool in debug mode", "default": true }, + "watch": { + "type": "boolean", + "description": "Keep webpack running in watch mode until SIGINT/SIGTERM", + "default": false + }, "applyLicenseHeaders": { "type": "object", "description": "Optional post-step that prepends license headers to bundle output files", diff --git a/packages/nx-infra-plugin/src/executors/bundle/schema.ts b/packages/nx-infra-plugin/src/executors/bundle/schema.ts index 0f22e11c1209..6037d4d12890 100644 --- a/packages/nx-infra-plugin/src/executors/bundle/schema.ts +++ b/packages/nx-infra-plugin/src/executors/bundle/schema.ts @@ -18,5 +18,6 @@ export interface BundleExecutorSchema { mode: 'debug' | 'production'; webpackConfigPath?: string; sourceMap?: boolean; + watch?: boolean; applyLicenseHeaders?: BundleLicenseHeadersOption; } diff --git a/packages/nx-infra-plugin/src/executors/check-declarations/check-declarations.impl.ts b/packages/nx-infra-plugin/src/executors/check-declarations/check-declarations.impl.ts index 5c5c01adcee4..5a4221117f57 100644 --- a/packages/nx-infra-plugin/src/executors/check-declarations/check-declarations.impl.ts +++ b/packages/nx-infra-plugin/src/executors/check-declarations/check-declarations.impl.ts @@ -12,7 +12,7 @@ import { } from './declaration-check-content'; import { CheckDeclarationsExecutorSchema } from './schema'; -const DEFAULT_MODULES_METADATA = './build/gulp/modules_metadata.json'; +const DEFAULT_MODULES_METADATA = './build/modules_metadata.json'; const DEFAULT_TS_BUNDLE = './artifacts/ts/dx.all.d.ts'; const DEFAULT_BUNDLE_ARTIFACT = './artifacts/ts/dx.all.d.ts'; const DEFAULT_MODULES_PATTERN = './js/**/*.d.ts'; diff --git a/packages/nx-infra-plugin/src/executors/check-declarations/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/check-declarations/executor.e2e.spec.ts index fd8cfb4782f6..6c76fdfebc34 100644 --- a/packages/nx-infra-plugin/src/executors/check-declarations/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/check-declarations/executor.e2e.spec.ts @@ -57,7 +57,7 @@ async function writeBundleArtifact(projectDir: string, content: string): Promise } async function writeModulesMetadata(projectDir: string, modules: unknown[]): Promise { - const metadataPath = path.join(projectDir, 'build', 'gulp', 'modules_metadata.json'); + const metadataPath = path.join(projectDir, 'build', 'modules_metadata.json'); fs.mkdirSync(path.dirname(metadataPath), { recursive: true }); await writeFileText(metadataPath, JSON.stringify(modules)); } diff --git a/packages/nx-infra-plugin/src/executors/concatenate-files/concatenate-files.impl.ts b/packages/nx-infra-plugin/src/executors/concatenate-files/concatenate-files.impl.ts index 425cf52c2e3e..a3a110ff0c9c 100644 --- a/packages/nx-infra-plugin/src/executors/concatenate-files/concatenate-files.impl.ts +++ b/packages/nx-infra-plugin/src/executors/concatenate-files/concatenate-files.impl.ts @@ -5,7 +5,8 @@ import { createExecutor } from '../../utils/create-executor'; import { toPosixPath } from '../../utils/path-resolver'; import { containsGlobPattern } from '../../utils/common'; import { exists, normalizeEol, readFileText, writeFileText } from '../../utils/file-operations'; -import { ConcatenateFilesExecutorSchema } from './schema'; +import { watchWithChokidar } from '../../utils/watch'; +import { ConcatenateFilesExecutorSchema, ConcatenatePass } from './schema'; const ERROR_SOURCE_FILES_EMPTY = 'sourceFiles must contain at least one file'; const ERROR_NO_FILES_RESOLVED = 'No source files found after resolving patterns'; @@ -133,44 +134,84 @@ async function resolveSourceFiles(sourceFiles: string[], projectRoot: string): P return resolved; } +// Sources are resolved per pass at run time (not once in `resolve`) so that an +// additional pass can consume a file produced by an earlier pass, and so rebuilds +// re-resolve any glob patterns on each run. +async function runPass(projectRoot: string, pass: ConcatenatePass): Promise { + if (!pass.sourceFiles?.length) { + throw new Error(ERROR_SOURCE_FILES_EMPTY); + } + + const resolvedFiles = await resolveSourceFiles(pass.sourceFiles, projectRoot); + if (resolvedFiles.length === 0) { + throw new Error(ERROR_NO_FILES_RESOLVED); + } + + const outputPath = path.resolve(projectRoot, pass.outputFile); + logger.verbose(`Concatenating ${resolvedFiles.length} files...`); + await concatToFile(outputPath, { + sourceFiles: resolvedFiles, + header: pass.header, + footer: pass.footer, + extractPattern: pass.extractPattern, + extractPatternFlags: pass.extractPatternFlags, + transforms: pass.transforms, + normalizeLineEndings: pass.normalizeLineEndings, + separator: pass.separator, + }); + logger.verbose(`Created: ${path.relative(projectRoot, outputPath)}`); +} + +async function runAllPasses( + projectRoot: string, + options: ConcatenateFilesExecutorSchema, +): Promise { + await runPass(projectRoot, options); + for (const pass of options.additionalPasses ?? []) { + await runPass(projectRoot, pass); + } +} + +async function runWatchBuild( + projectRoot: string, + options: ConcatenateFilesExecutorSchema, +): Promise { + // chokidar v4+ dropped glob support, so expand watch patterns to concrete files upfront. + const watchTargets = options.watchPaths?.length ? options.watchPaths : options.sourceFiles; + const watchFiles = await resolveSourceFiles(watchTargets, projectRoot); + if (watchFiles.length === 0) { + throw new Error('No watch files found after resolving watchPaths'); + } + await runAllPasses(projectRoot, options); + + await watchWithChokidar({ + projectRoot, + watchTargets: watchFiles, + label: 'concatenate-files watch', + onRebuild: () => runAllPasses(projectRoot, options), + }); +} + interface ResolvedConcatenate { projectRoot: string; - resolvedFiles: string[]; - outputPath: string; options: ConcatenateFilesExecutorSchema; } export default createExecutor({ name: 'ConcatenateFiles', - resolve: async (options, { projectRoot }) => { + resolve: (options, { projectRoot }) => { if (!options.sourceFiles?.length) { throw new Error(ERROR_SOURCE_FILES_EMPTY); } - const resolvedFiles = await resolveSourceFiles(options.sourceFiles, projectRoot); - if (resolvedFiles.length === 0) { - throw new Error(ERROR_NO_FILES_RESOLVED); + return { projectRoot, options }; + }, + run: async ({ projectRoot, options }) => { + if (options.watch) { + await runWatchBuild(projectRoot, options); + return; } - return { - projectRoot, - resolvedFiles, - outputPath: path.resolve(projectRoot, options.outputFile), - options, - }; - }, - run: async ({ projectRoot, resolvedFiles, outputPath, options }) => { - logger.verbose(`Concatenating ${resolvedFiles.length} files...`); - await concatToFile(outputPath, { - sourceFiles: resolvedFiles, - header: options.header, - footer: options.footer, - extractPattern: options.extractPattern, - extractPatternFlags: options.extractPatternFlags, - transforms: options.transforms, - normalizeLineEndings: options.normalizeLineEndings, - separator: options.separator, - }); - logger.verbose(`Created: ${path.relative(projectRoot, outputPath)}`); + await runAllPasses(projectRoot, options); }, }); 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 index 7e34cbdd15fb..d8f5ebf1422c 100644 --- 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 @@ -5,6 +5,46 @@ import { ConcatenateFilesExecutorSchema } from './schema'; import { createTempDir, cleanupTempDir, createMockContext } from '../../utils/test-utils'; import { writeFileText, readFileText } from '../../utils'; +type WatchHandler = (event: string, file: string) => void; + +function getWatchHandler(): WatchHandler | undefined { + return (globalThis as unknown as { __concatWatchHandler?: WatchHandler }).__concatWatchHandler; +} + +// Mock chokidar so the executor's projectRequire('chokidar') resolves; the mock captures +// the change handler on globalThis so the test can drive a rebuild deterministically. +function writeChokidarMock(projectRoot: string): void { + const chokidarDir = path.join(projectRoot, 'node_modules', 'chokidar'); + fs.mkdirSync(chokidarDir, { recursive: true }); + fs.writeFileSync(path.join(chokidarDir, 'package.json'), JSON.stringify({ main: 'index.js' })); + fs.writeFileSync( + path.join(chokidarDir, 'index.js'), + [ + 'module.exports = {', + ' watch: function watch() {', + ' return {', + ' on: function on(event, handler) { globalThis.__concatWatchHandler = handler; return this; },', + ' close: function close() { return Promise.resolve(); },', + ' };', + ' },', + '};', + '', + ].join('\n'), + ); +} + +async function waitFor( + predicate: () => Promise | boolean, + timeoutMs = 3000, +): Promise { + const start = Date.now(); + while (Date.now() - start < timeoutMs) { + if (await predicate()) return; + await new Promise((resolve) => setTimeout(resolve, 20)); + } + throw new Error('waitFor timed out'); +} + describe('ConcatenateFilesExecutor E2E', () => { let tempDir: string; let context = createMockContext(); @@ -22,7 +62,7 @@ describe('ConcatenateFilesExecutor E2E', () => { }); it('should handle devextreme-bundler-config use case', async () => { - const partsDir = path.join(projectDir, 'build', 'gulp', 'bundler-config'); + const partsDir = path.join(projectDir, 'build', 'bundler-config'); fs.mkdirSync(partsDir, { recursive: true }); await writeFileText( @@ -42,9 +82,9 @@ describe('ConcatenateFilesExecutor E2E', () => { 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', + './build/bundler-config/01-header.js', + './build/bundler-config/02-core.js', + './build/bundler-config/03-footer.js', ], outputFile: './artifacts/js/bundler-config.js', header: '/* DevExtreme Bundler Config */\n/* Generated file - do not edit */\n\n', @@ -89,4 +129,99 @@ describe('ConcatenateFilesExecutor E2E', () => { expect(versionPos).toBeLessThan(requirePos); expect(requirePos).toBeLessThan(exportPos); }); + + it('runs additionalPasses after the primary output', async () => { + await writeFileText(path.join(projectDir, 'a.js'), 'AAA'); + await writeFileText(path.join(projectDir, 'b.js'), 'BBB'); + + const options: ConcatenateFilesExecutorSchema = { + sourceFiles: ['./a.js', './b.js'], + outputFile: './out/primary.js', + separator: '\n', + additionalPasses: [ + { + sourceFiles: ['./out/primary.js'], + outputFile: './out/derived.js', + transforms: [{ find: 'A', replace: 'X', flags: 'g' }], + }, + ], + }; + + const result = await executor(options, context); + expect(result.success).toBe(true); + + expect(await readFileText(path.join(projectDir, 'out', 'primary.js'))).toBe('AAA\nBBB'); + // derived pass reads the primary output and applies its own transform + expect(await readFileText(path.join(projectDir, 'out', 'derived.js'))).toBe('XXX\nBBB'); + }); + + it('watch mode rebuilds all passes on change', async () => { + writeChokidarMock(projectDir); + await writeFileText(path.join(projectDir, 'a.js'), 'AAA'); + await writeFileText(path.join(projectDir, 'b.js'), 'BBB'); + + const options: ConcatenateFilesExecutorSchema = { + sourceFiles: ['./a.js', './b.js'], + outputFile: './out/primary.js', + separator: '\n', + additionalPasses: [{ sourceFiles: ['./out/primary.js'], outputFile: './out/derived.js' }], + watch: true, + watchPaths: ['./*.js'], + }; + + const primaryPath = path.join(projectDir, 'out', 'primary.js'); + const derivedPath = path.join(projectDir, 'out', 'derived.js'); + + const originalOnce = process.once; + let stopWatch: (() => void) | undefined; + let run: Promise<{ success: boolean }> | undefined; + + (process as unknown as { once: typeof process.once }).once = (( + event: string, + handler: () => void, + ) => { + if (event === 'SIGINT' || event === 'SIGTERM') { + stopWatch = handler; + return process; + } + return originalOnce.call(process, event, handler as never); + }) as typeof process.once; + + try { + run = executor(options, context); + + await waitFor(() => fs.existsSync(primaryPath) && fs.existsSync(derivedPath)); + expect(await readFileText(primaryPath)).toBe('AAA\nBBB'); + expect(await readFileText(derivedPath)).toBe('AAA\nBBB'); + expect(typeof getWatchHandler()).toBe('function'); + + await writeFileText(path.join(projectDir, 'a.js'), 'CCC'); + getWatchHandler()?.('change', path.join(projectDir, 'a.js')); + + await waitFor(async () => { + const [primary, derived] = await Promise.all([ + readFileText(primaryPath), + readFileText(derivedPath), + ]); + return primary === 'CCC\nBBB' && derived === 'CCC\nBBB'; + }); + expect(await readFileText(primaryPath)).toBe('CCC\nBBB'); + expect(await readFileText(derivedPath)).toBe('CCC\nBBB'); + + stopWatch?.(); + stopWatch = undefined; + + expect((await run).success).toBe(true); + run = undefined; + } finally { + // Ensure the long-running watch executor is stopped even if an assertion fails above. + stopWatch?.(); + if (run) { + await run; + } + (process as unknown as { once: typeof process.once }).once = originalOnce; + delete (globalThis as unknown as { __concatWatchHandler?: WatchHandler }) + .__concatWatchHandler; + } + }); }); diff --git a/packages/nx-infra-plugin/src/executors/concatenate-files/schema.json b/packages/nx-infra-plugin/src/executors/concatenate-files/schema.json index 878245ad338a..1af73dd7f4c5 100644 --- a/packages/nx-infra-plugin/src/executors/concatenate-files/schema.json +++ b/packages/nx-infra-plugin/src/executors/concatenate-files/schema.json @@ -52,7 +52,53 @@ "type": "string", "description": "Separator between concatenated files (default: '\\n')", "default": "\n" + }, + "additionalPasses": { + "type": "array", + "description": "Extra concatenation passes run after the primary output, in order (e.g. a derived output built from the primary). Each pass is resolved at run time.", + "items": { "$ref": "#/definitions/pass" } + }, + "watch": { + "type": "boolean", + "description": "Watch the source files and rebuild all passes on changes.", + "default": false + }, + "watchPaths": { + "type": "array", + "description": "Glob patterns to watch in watch mode (defaults to sourceFiles when omitted).", + "items": { "type": "string" } } }, - "required": ["sourceFiles", "outputFile"] + "required": ["sourceFiles", "outputFile"], + "definitions": { + "pass": { + "type": "object", + "properties": { + "sourceFiles": { + "type": "array", + "items": { "type": "string" } + }, + "outputFile": { "type": "string" }, + "extractPattern": { "type": "string" }, + "extractPatternFlags": { "type": "string" }, + "header": { "type": "string" }, + "footer": { "type": "string" }, + "transforms": { + "type": "array", + "items": { + "type": "object", + "properties": { + "find": { "type": "string" }, + "replace": { "type": "string" }, + "flags": { "type": "string" } + }, + "required": ["find", "replace"] + } + }, + "normalizeLineEndings": { "type": "boolean" }, + "separator": { "type": "string" } + }, + "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 index 4e22150e5d5b..6519badf220d 100644 --- a/packages/nx-infra-plugin/src/executors/concatenate-files/schema.ts +++ b/packages/nx-infra-plugin/src/executors/concatenate-files/schema.ts @@ -4,7 +4,7 @@ export interface TransformRule { flags?: string; } -export interface ConcatenateFilesExecutorSchema { +export interface ConcatenatePass { sourceFiles: string[]; outputFile: string; extractPattern?: string; @@ -15,3 +15,9 @@ export interface ConcatenateFilesExecutorSchema { normalizeLineEndings?: boolean; separator?: string; } + +export interface ConcatenateFilesExecutorSchema extends ConcatenatePass { + additionalPasses?: ConcatenatePass[]; + watch?: boolean; + watchPaths?: string[]; +} diff --git a/packages/nx-infra-plugin/src/executors/copy-files/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/copy-files/executor.e2e.spec.ts index decff3322211..459f7d7cc29a 100644 --- a/packages/nx-infra-plugin/src/executors/copy-files/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/copy-files/executor.e2e.spec.ts @@ -254,7 +254,7 @@ describe('CopyFilesExecutor E2E', () => { it('should forward applyLicenseHeaders option to license header pipeline', async () => { const projectDir = path.join(tempDir, 'packages', 'test-lib'); - const buildDir = path.join(projectDir, 'build', 'gulp'); + const buildDir = path.join(projectDir, 'build'); fs.mkdirSync(buildDir, { recursive: true }); await writeFileText( path.join(buildDir, 'license-header.txt'), @@ -268,7 +268,7 @@ describe('CopyFilesExecutor E2E', () => { const options: CopyFilesExecutorSchema = { files: [{ from: './aspnet-source.js', to: './artifacts/js/dx.aspnet.mvc.js' }], applyLicenseHeaders: { - licenseTemplateFile: './build/gulp/license-header.txt', + licenseTemplateFile: './build/license-header.txt', targetSubdir: './artifacts/js', separator: '', includePatterns: ['dx.aspnet.mvc.js'], diff --git a/packages/nx-infra-plugin/src/executors/dts-bundle/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/dts-bundle/executor.e2e.spec.ts index 68cbdc348c82..a8c6c79fa7ea 100644 --- a/packages/nx-infra-plugin/src/executors/dts-bundle/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/dts-bundle/executor.e2e.spec.ts @@ -37,7 +37,7 @@ const OPTIONS: DtsBundleExecutorSchema = { bundleSources: ['./ts/dx.all.d.ts', './ts/aliases.d.ts'], artifactPath: './artifacts/ts/dx.all.d.ts', packagePath: './artifacts/npm/devextreme/bundles/dx.all.d.ts', - licenseTemplateFile: './build/gulp/license-header.txt', + licenseTemplateFile: './build/license-header.txt', eulaUrl: 'https://js.devexpress.com/Licensing/', }; @@ -52,17 +52,14 @@ describe('DtsBundleExecutor E2E', () => { projectDir = path.join(tempDir, 'packages', 'test-lib'); fs.mkdirSync(path.join(projectDir, 'ts'), { recursive: true }); - fs.mkdirSync(path.join(projectDir, 'build', 'gulp'), { recursive: true }); + fs.mkdirSync(path.join(projectDir, 'build'), { recursive: true }); await writeJson(path.join(projectDir, 'package.json'), { name: 'devextreme', version: '26.1.0', }); - await writeFileText( - path.join(projectDir, 'build', 'gulp', 'license-header.txt'), - LICENSE_TEMPLATE, - ); + await writeFileText(path.join(projectDir, 'build', 'license-header.txt'), LICENSE_TEMPLATE); await writeFileText(path.join(projectDir, 'ts', 'dx.all.d.ts'), DX_ALL_CONTENT); await writeFileText(path.join(projectDir, 'ts', 'aliases.d.ts'), ALIASES_CONTENT); }); diff --git a/packages/nx-infra-plugin/src/executors/dts-modules/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/dts-modules/executor.e2e.spec.ts index 4a1d0108115c..c85092eea681 100644 --- a/packages/nx-infra-plugin/src/executors/dts-modules/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/dts-modules/executor.e2e.spec.ts @@ -28,7 +28,7 @@ const OPTIONS: DtsModulesExecutorSchema = { sourceDir: './js', outputDir: './artifacts/npm/devextreme', templatesDir: './build/npm-templates', - licenseTemplateFile: './build/gulp/license-header.txt', + licenseTemplateFile: './build/license-header.txt', eulaUrl: 'https://js.devexpress.com/Licensing/', }; @@ -43,7 +43,7 @@ describe('DtsModulesExecutor E2E', () => { projectDir = path.join(tempDir, 'packages', 'test-lib'); fs.mkdirSync(path.join(projectDir, 'js', 'ui'), { recursive: true }); - fs.mkdirSync(path.join(projectDir, 'build', 'gulp'), { recursive: true }); + fs.mkdirSync(path.join(projectDir, 'build'), { recursive: true }); fs.mkdirSync(path.join(projectDir, 'build', 'npm-templates', 'events'), { recursive: true }); fs.mkdirSync(path.join(projectDir, 'build', 'npm-templates', 'bundles'), { recursive: true }); fs.mkdirSync(path.join(projectDir, 'build', 'npm-templates', 'integration'), { @@ -55,10 +55,7 @@ describe('DtsModulesExecutor E2E', () => { version: '26.1.0', }); - await writeFileText( - path.join(projectDir, 'build', 'gulp', 'license-header.txt'), - LICENSE_TEMPLATE, - ); + await writeFileText(path.join(projectDir, 'build', 'license-header.txt'), LICENSE_TEMPLATE); await writeFileText(path.join(projectDir, 'js', 'accordion.d.ts'), DEBUG_CONTENT); await writeFileText( diff --git a/packages/nx-infra-plugin/src/executors/generate-community-locales/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/generate-community-locales/executor.e2e.spec.ts new file mode 100644 index 000000000000..57da42b1749f --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/generate-community-locales/executor.e2e.spec.ts @@ -0,0 +1,108 @@ +import * as fs from 'fs'; +import * as path from 'path'; +import executor from './executor'; +import { GenerateCommunityLocalesExecutorSchema } from './schema'; +import { + writeFileText, + readFileText, + cleanupTempDir, + createTempDir, + createMockContext, +} from '../../utils'; + +const PROJECT_SUBPATH = ['packages', 'test-lib'] as const; + +const EN_JSON = `{ + "en": { + "Yes": "Yes", + "No": "No", + "Cancel": "Cancel", + "Quote": "Say \\"hi\\"", + "Loading": "Loading..." + } +} +`; + +const FR_JSON_INPUT = `{ + "fr": { + "Yes": "Oui", + "No": "TODO: Non", + "Quote": "Dire \\"salut\\"", + "Loading": "Chargement...", + "Extra": "Extra" + } +} +`; + +const EXPECTED_FR = `{ + "fr": { + "Yes": "Oui", + "No": "No", + "Cancel": "Cancel", + "Quote": "Dire \\"salut\\"", + "Loading": "Chargement..." + } +} +`; + +interface Fixture { + projectDir: string; + messagesDir: string; +} + +async function createFixture(tempDir: string): Promise { + const projectDir = path.join(tempDir, ...PROJECT_SUBPATH); + const messagesDir = path.join(projectDir, 'js', 'localization', 'messages'); + + fs.mkdirSync(messagesDir, { recursive: true }); + + await writeFileText(path.join(messagesDir, 'en.json'), EN_JSON); + await writeFileText(path.join(messagesDir, 'fr.json'), FR_JSON_INPUT); + + return { projectDir, messagesDir }; +} + +describe('GenerateCommunityLocalesExecutor E2E', () => { + let tempDir: string; + let context = createMockContext(); + let fixture: Fixture; + + beforeEach(async () => { + tempDir = createTempDir('nx-community-locales-e2e-'); + context = createMockContext({ root: tempDir }); + fixture = await createFixture(tempDir); + }); + + afterEach(() => { + cleanupTempDir(tempDir); + }); + + it('normalizes community locale files against the default locale', async () => { + const options: GenerateCommunityLocalesExecutorSchema = { + messagesDir: './js/localization/messages', + defaultLocale: 'en', + }; + + const result = await executor(options, context); + + expect(result.success).toBe(true); + + const frContent = await readFileText(path.join(fixture.messagesDir, 'fr.json')); + expect(frContent).toBe(EXPECTED_FR); + }); + + it('leaves the default locale file untouched', async () => { + const result = await executor({}, context); + + expect(result.success).toBe(true); + + const enContent = await readFileText(path.join(fixture.messagesDir, 'en.json')); + expect(enContent).toBe(EN_JSON); + }); + + it('fails when the messages directory is missing', async () => { + const result = await executor({ messagesDir: './js/localization/does-not-exist' }, context); + + expect(result.success).toBe(false); + }); +}); diff --git a/packages/nx-infra-plugin/src/executors/generate-community-locales/executor.ts b/packages/nx-infra-plugin/src/executors/generate-community-locales/executor.ts new file mode 100644 index 000000000000..76ffddcce1f7 --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/generate-community-locales/executor.ts @@ -0,0 +1 @@ +export { default } from './generate-community-locales.impl'; diff --git a/packages/nx-infra-plugin/src/executors/generate-community-locales/generate-community-locales.impl.ts b/packages/nx-infra-plugin/src/executors/generate-community-locales/generate-community-locales.impl.ts new file mode 100644 index 000000000000..afb550e72f70 --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/generate-community-locales/generate-community-locales.impl.ts @@ -0,0 +1,104 @@ +import { logger } from '@nx/devkit'; +import * as path from 'path'; +import * as fs from 'fs'; +import { createExecutor } from '../../utils/create-executor'; +import { readFileText, writeFileText } from '../../utils/file-operations'; +import { discoverFiles } from '../../utils/glob-discovery'; +import { GenerateCommunityLocalesExecutorSchema } from './schema'; + +const DEFAULT_MESSAGES_DIR = './js/localization/messages'; +const DEFAULT_LOCALE = 'en'; +const TODO_MARKER = 'TODO'; + +const ERROR_MESSAGES = { + MESSAGES_DIR_NOT_FOUND: (directory: string) => `Messages directory not found: ${directory}`, + DEFAULT_LOCALE_NOT_FOUND: (filePath: string) => `Default locale file not found: ${filePath}`, +} as const; + +interface LocaleDictionary { + [key: string]: string; +} + +function normalizeLocaleFile( + defaultFile: string, + defaultDictionaryKeys: string[], + defaultLocale: string, + fileContents: string, +): string { + const parsedFile = JSON.parse(fileContents) as Record; + + const [locale] = Object.keys(parsedFile); + const dictionary = parsedFile[locale]; + + let newFile = defaultFile.replace(`"${defaultLocale}"`, `"${locale}"`); + + defaultDictionaryKeys.forEach((key) => { + let replaceValue: string | null = null; + if (Object.prototype.hasOwnProperty.call(dictionary, key)) { + const val = dictionary[key]; + if (!val.includes(TODO_MARKER)) { + replaceValue = val.replace(/"/g, '\\"'); + } + } + + if (replaceValue != null) { + newFile = newFile.replace(new RegExp(`"${key}":.*"(,)?`), `"${key}": "${replaceValue}"$1`); + } + }); + + return newFile; +} + +interface ResolvedGenerateCommunityLocales { + messagesDir: string; + defaultLocale: string; +} + +export default createExecutor< + GenerateCommunityLocalesExecutorSchema, + ResolvedGenerateCommunityLocales +>({ + name: 'Generate Community Locales', + resolve: (options, { projectRoot }) => ({ + messagesDir: path.join(projectRoot, options.messagesDir || DEFAULT_MESSAGES_DIR), + defaultLocale: options.defaultLocale || DEFAULT_LOCALE, + }), + run: async ({ messagesDir, defaultLocale }) => { + if (!fs.existsSync(messagesDir)) { + throw new Error(ERROR_MESSAGES.MESSAGES_DIR_NOT_FOUND(messagesDir)); + } + + const defaultFilePath = path.join(messagesDir, `${defaultLocale}.json`); + if (!fs.existsSync(defaultFilePath)) { + throw new Error(ERROR_MESSAGES.DEFAULT_LOCALE_NOT_FOUND(defaultFilePath)); + } + + const defaultFile = await readFileText(defaultFilePath); + const defaultDictionaryKeys = Object.keys( + (JSON.parse(defaultFile) as Record)[defaultLocale], + ); + + const localeFiles = await discoverFiles({ + cwd: messagesDir, + includePatterns: ['*.json'], + excludePatterns: [`${defaultLocale}.json`], + }); + + logger.verbose(`Normalizing ${localeFiles.length} community locale files...`); + + await Promise.all( + localeFiles.map(async (filePath) => { + const fileContents = await readFileText(filePath); + const newFile = normalizeLocaleFile( + defaultFile, + defaultDictionaryKeys, + defaultLocale, + fileContents, + ); + await writeFileText(filePath, newFile); + }), + ); + + logger.verbose(`Community locale files normalized in ${messagesDir}`); + }, +}); diff --git a/packages/nx-infra-plugin/src/executors/generate-community-locales/schema.json b/packages/nx-infra-plugin/src/executors/generate-community-locales/schema.json new file mode 100644 index 000000000000..8fc0c2bee210 --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/generate-community-locales/schema.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json-schema.org/schema", + "title": "Generate Community Locales Executor Schema", + "description": "Normalize community locale message files against the default locale dictionary", + "type": "object", + "properties": { + "messagesDir": { + "type": "string", + "description": "Directory containing locale message JSON files (e.g., en.json, de.json)", + "default": "./js/localization/messages" + }, + "defaultLocale": { + "type": "string", + "description": "Locale used as the canonical source of keys, ordering and formatting", + "default": "en" + } + } +} diff --git a/packages/nx-infra-plugin/src/executors/generate-community-locales/schema.ts b/packages/nx-infra-plugin/src/executors/generate-community-locales/schema.ts new file mode 100644 index 000000000000..5366cd0c8a84 --- /dev/null +++ b/packages/nx-infra-plugin/src/executors/generate-community-locales/schema.ts @@ -0,0 +1,4 @@ +export interface GenerateCommunityLocalesExecutorSchema { + messagesDir?: string; + defaultLocale?: string; +} diff --git a/packages/nx-infra-plugin/src/executors/localization/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/localization/executor.e2e.spec.ts index b870606b2334..2ba00d34e61e 100644 --- a/packages/nx-infra-plugin/src/executors/localization/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/localization/executor.e2e.spec.ts @@ -75,7 +75,8 @@ interface LocalizationTestFixture { async function createLocalizationTestFixture(tempDir: string): Promise { const projectDir = path.join(tempDir, ...PROJECT_SUBPATH); const messagesDir = path.join(projectDir, 'js', 'localization', 'messages'); - const buildDir = path.join(projectDir, 'build', 'gulp'); + const buildDir = path.join(projectDir, 'build'); + const templatesDir = path.join(buildDir, 'localization-templates'); const artifactsDir = path.join(projectDir, 'artifacts', 'js', 'localization'); const cldrDataDir = path.join( projectDir, @@ -89,6 +90,7 @@ async function createLocalizationTestFixture(tempDir: string): Promise { it('should generate message files for all locales', async () => { const options: LocalizationExecutorSchema = { messagesDir: './js/localization/messages', - messageTemplate: './build/gulp/localization-template.jst', + messageTemplate: './build/localization-templates/localization-template.jst', messageOutputDir: './artifacts/js/localization', skipCldrGeneration: true, }; @@ -179,9 +181,9 @@ describe('LocalizationExecutor E2E', () => { it('should generate CLDR TypeScript modules', async () => { const options: LocalizationExecutorSchema = { messagesDir: './js/localization/messages', - messageTemplate: './build/gulp/localization-template.jst', + messageTemplate: './build/localization-templates/localization-template.jst', messageOutputDir: './artifacts/js/localization', - generatedTemplate: './build/gulp/generated_js.jst', + generatedTemplate: './build/localization-templates/generated_js.jst', cldrDataOutputDir: './js/__internal/core/localization/cldr-data', defaultMessagesOutputDir: './js/__internal/core/localization', }; @@ -215,11 +217,11 @@ describe('LocalizationExecutor E2E', () => { const options: LocalizationExecutorSchema = { messagesDir: './js/localization/messages', - messageTemplate: './build/gulp/localization-template.jst', + messageTemplate: './build/localization-templates/localization-template.jst', messageOutputDir: './artifacts/js/localization', skipCldrGeneration: true, applyLicenseHeaders: { - licenseTemplateFile: './build/gulp/license-header.txt', + licenseTemplateFile: './build/license-header.txt', separator: '', includePatterns: ['**/*.js'], }, @@ -236,9 +238,9 @@ describe('LocalizationExecutor E2E', () => { it('should have correct output structure', async () => { const options: LocalizationExecutorSchema = { messagesDir: './js/localization/messages', - messageTemplate: './build/gulp/localization-template.jst', + messageTemplate: './build/localization-templates/localization-template.jst', messageOutputDir: './artifacts/js/localization', - generatedTemplate: './build/gulp/generated_js.jst', + generatedTemplate: './build/localization-templates/generated_js.jst', cldrDataOutputDir: './js/__internal/core/localization/cldr-data', defaultMessagesOutputDir: './js/__internal/core/localization', }; diff --git a/packages/nx-infra-plugin/src/executors/localization/localization.impl.ts b/packages/nx-infra-plugin/src/executors/localization/localization.impl.ts index d6498442879c..99ae6130474b 100644 --- a/packages/nx-infra-plugin/src/executors/localization/localization.impl.ts +++ b/packages/nx-infra-plugin/src/executors/localization/localization.impl.ts @@ -45,9 +45,9 @@ interface CldrDependencies { } const DEFAULT_MESSAGES_DIR = './js/localization/messages'; -const DEFAULT_MESSAGE_TEMPLATE = './build/gulp/localization-template.jst'; +const DEFAULT_MESSAGE_TEMPLATE = './build/localization-templates/localization-template.jst'; const DEFAULT_MESSAGE_OUTPUT_DIR = './artifacts/js/localization'; -const DEFAULT_GENERATED_TEMPLATE = './build/gulp/generated_js.jst'; +const DEFAULT_GENERATED_TEMPLATE = './build/localization-templates/generated_js.jst'; const DEFAULT_CLDR_DATA_OUTPUT_DIR = './js/__internal/core/localization/cldr-data'; const DEFAULT_DEFAULT_MESSAGES_OUTPUT_DIR = './js/__internal/core/localization'; diff --git a/packages/nx-infra-plugin/src/executors/localization/schema.json b/packages/nx-infra-plugin/src/executors/localization/schema.json index a0a4670991d2..e7ded82b611f 100644 --- a/packages/nx-infra-plugin/src/executors/localization/schema.json +++ b/packages/nx-infra-plugin/src/executors/localization/schema.json @@ -12,7 +12,7 @@ "messageTemplate": { "type": "string", "description": "Path to the Lodash template file for UMD message generation", - "default": "./build/gulp/localization-template.jst" + "default": "./build/localization-templates/localization-template.jst" }, "messageOutputDir": { "type": "string", @@ -22,7 +22,7 @@ "generatedTemplate": { "type": "string", "description": "Path to the Lodash template file for TypeScript exports", - "default": "./build/gulp/generated_js.jst" + "default": "./build/localization-templates/generated_js.jst" }, "cldrDataOutputDir": { "type": "string", diff --git a/packages/nx-infra-plugin/src/executors/npm-assemble/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/npm-assemble/executor.e2e.spec.ts index fa095efb578b..c6f53dcaface 100644 --- a/packages/nx-infra-plugin/src/executors/npm-assemble/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/npm-assemble/executor.e2e.spec.ts @@ -23,7 +23,7 @@ const OPTIONS: NpmAssembleExecutorSchema = { webpackConfig: './webpack.config.js', artifactsDir: './artifacts', outputDir: './artifacts/npm/devextreme', - licenseTemplateFile: './build/gulp/license-header.txt', + licenseTemplateFile: './build/license-header.txt', eulaUrl: 'https://js.devexpress.com/Licensing/', srcExcludes: ['bundles/**/*'], distExcludes: ['js/jquery*'], @@ -45,16 +45,13 @@ describe('NpmAssembleExecutor E2E', () => { fs.mkdirSync(path.join(projectDir, 'license'), { recursive: true }); fs.mkdirSync(path.join(projectDir, 'build', 'npm-bin'), { recursive: true }); fs.mkdirSync(path.join(projectDir, 'artifacts'), { recursive: true }); - fs.mkdirSync(path.join(projectDir, 'build', 'gulp'), { recursive: true }); + fs.mkdirSync(path.join(projectDir, 'build'), { recursive: true }); await writeFileText( path.join(projectDir, 'package.json'), JSON.stringify({ name: 'devextreme', version: '26.1.0' }), ); - await writeFileText( - path.join(projectDir, 'build', 'gulp', 'license-header.txt'), - LICENSE_TEMPLATE, - ); + await writeFileText(path.join(projectDir, 'build', 'license-header.txt'), LICENSE_TEMPLATE); await writeFileText(path.join(projectDir, 'webpack.config.js'), 'module.exports = {};'); }); diff --git a/packages/nx-infra-plugin/src/executors/pack-npm/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/pack-npm/executor.e2e.spec.ts index fb039007d42f..e189672102ef 100644 --- a/packages/nx-infra-plugin/src/executors/pack-npm/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/pack-npm/executor.e2e.spec.ts @@ -9,9 +9,11 @@ import { writeFileText, writeJson } from '../../utils'; const PACKAGE_NAME = 'test-package'; const PACKAGE_VERSION = '1.0.0'; const EXPECTED_TARBALL_NAME = `${PACKAGE_NAME}-${PACKAGE_VERSION}.tgz`; +const VERSIONED_TARBALL_NAME = `${PACKAGE_NAME}-9.9.9.tgz`; const NPM_DIR_NAME = 'npm'; const PROJECT_NAME = 'test-lib'; const PACKAGES_DIR = 'packages'; +const ARTIFACTS_NPM = 'artifacts/npm'; describe('PackNpmExecutor E2E', () => { let tempDir: string; @@ -106,4 +108,60 @@ describe('PackNpmExecutor E2E', () => { expect(tarballStat.isFile()).toBe(true); expect(tarballStat.size).toBeGreaterThan(0); }); + + it('should pack packageDir and copy tarball to destination', async () => { + if (!pnpmAvailable) { + console.log('Skipping test: pnpm not available'); + return; + } + + const options: PackNpmExecutorSchema = { + packageDir: NPM_DIR_NAME, + destination: `../../${ARTIFACTS_NPM}`, + }; + + const result = await executor(options, context); + + expect(result.success).toBe(true); + + const projectDir = path.join(tempDir, PACKAGES_DIR, PROJECT_NAME); + const sourceTarball = path.join(projectDir, NPM_DIR_NAME, EXPECTED_TARBALL_NAME); + const destTarball = path.join(tempDir, ARTIFACTS_NPM, EXPECTED_TARBALL_NAME); + + expect(fs.existsSync(sourceTarball)).toBe(true); + expect(fs.existsSync(destTarball)).toBe(true); + }); + + it('should set version from setVersionFrom before packing', async () => { + if (!pnpmAvailable) { + console.log('Skipping test: pnpm not available'); + return; + } + + await writeJson(path.join(tempDir, PACKAGES_DIR, PROJECT_NAME, 'version-source.json'), { + name: 'version-source', + version: '9.9.9', + }); + + const options: PackNpmExecutorSchema = { + packageDir: NPM_DIR_NAME, + setVersionFrom: 'version-source.json', + destination: `../../${ARTIFACTS_NPM}`, + }; + + const result = await executor(options, context); + + expect(result.success).toBe(true); + + const npmPkg = JSON.parse( + fs.readFileSync( + path.join(tempDir, PACKAGES_DIR, PROJECT_NAME, NPM_DIR_NAME, 'package.json'), + 'utf8', + ), + ) as { version: string }; + expect(npmPkg.version).toBe('9.9.9'); + + const destTarball = path.join(tempDir, ARTIFACTS_NPM, VERSIONED_TARBALL_NAME); + expect(fs.existsSync(destTarball)).toBe(true); + }); }); diff --git a/packages/nx-infra-plugin/src/executors/pack-npm/pack-npm.impl.ts b/packages/nx-infra-plugin/src/executors/pack-npm/pack-npm.impl.ts index 2cf7de0e9110..e8ec7073c3bb 100644 --- a/packages/nx-infra-plugin/src/executors/pack-npm/pack-npm.impl.ts +++ b/packages/nx-infra-plugin/src/executors/pack-npm/pack-npm.impl.ts @@ -1,25 +1,99 @@ import { execSync } from 'child_process'; +import * as fs from 'fs'; +import * as path from 'path'; import { logger } from '@nx/devkit'; +import { glob } from 'glob'; import { createExecutor } from '../../utils/create-executor'; +import { toPosixPath } from '../../utils/path-resolver'; +import { copyFile, ensureDir } from '../../utils/file-operations'; import { PackNpmExecutorSchema } from './schema'; const MSG_PACK_SUCCESS = 'pnpm pack completed successfully'; +const ERROR_PACKAGE_DIR_NOT_FOUND = (dir: string) => `PackNpm: packageDir not found: ${dir}`; +const ERROR_PACKAGE_DIR_NOT_DIRECTORY = (dir: string) => + `PackNpm: packageDir is not a directory: ${dir}`; +const ERROR_SET_VERSION_FROM_NOT_FOUND = (file: string) => + `PackNpm: setVersionFrom package.json not found: ${file}`; +const ERROR_VERSION_MISSING = (file: string) => `PackNpm: version field missing in ${file}`; +const ERROR_NO_TARBALLS = (dir: string) => + `PackNpm: no *.tgz files found in ${dir} after pnpm pack`; interface ResolvedPackNpm { - projectPath: string; + packageDir: string; + destination?: string; + versionToSet?: string; +} + +function readVersion(packageJsonPath: string): string { + if (!fs.existsSync(packageJsonPath)) { + throw new Error(ERROR_SET_VERSION_FROM_NOT_FOUND(packageJsonPath)); + } + + const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as { version?: string }; + if (!pkg.version) { + throw new Error(ERROR_VERSION_MISSING(packageJsonPath)); + } + + return pkg.version; } export default createExecutor({ name: 'PackNpm', - resolve: (_options, { projectRoot }) => ({ projectPath: projectRoot }), + resolve: (options, { projectRoot }) => { + const packageDir = path.resolve(projectRoot, options.packageDir ?? '.'); + if (!fs.existsSync(packageDir)) { + throw new Error(ERROR_PACKAGE_DIR_NOT_FOUND(packageDir)); + } + if (!fs.statSync(packageDir).isDirectory()) { + throw new Error(ERROR_PACKAGE_DIR_NOT_DIRECTORY(packageDir)); + } + + const destination = options.destination + ? path.resolve(projectRoot, options.destination) + : undefined; + + const versionToSet = options.setVersionFrom + ? readVersion(path.resolve(projectRoot, options.setVersionFrom)) + : undefined; + + return { packageDir, destination, versionToSet }; + }, run: async (resolved) => { - logger.verbose(`Running pnpm pack from ${resolved.projectPath}...`); + if (resolved.versionToSet) { + logger.verbose(`Setting version=${resolved.versionToSet} in ${resolved.packageDir}...`); + execSync(`pnpm pkg set version="${resolved.versionToSet}"`, { + cwd: resolved.packageDir, + stdio: 'inherit', + }); + } - execSync(`pnpm pack`, { - cwd: resolved.projectPath, + logger.verbose(`Running pnpm pack from ${resolved.packageDir}...`); + execSync('pnpm pack', { + cwd: resolved.packageDir, stdio: 'inherit', }); - logger.verbose(MSG_PACK_SUCCESS); + + if (!resolved.destination) { + return; + } + + await ensureDir(resolved.destination); + + const tarballs = await glob('*.tgz', { + cwd: toPosixPath(resolved.packageDir), + nodir: true, + }); + + if (tarballs.length === 0) { + throw new Error(ERROR_NO_TARBALLS(resolved.packageDir)); + } + + for (const tarball of tarballs) { + const from = path.join(resolved.packageDir, tarball); + const to = path.join(resolved.destination, tarball); + await copyFile(from, to); + logger.verbose(`Copied ${from} -> ${to}`); + } }, }); diff --git a/packages/nx-infra-plugin/src/executors/pack-npm/schema.json b/packages/nx-infra-plugin/src/executors/pack-npm/schema.json index 0a261c47edb7..a5855324a499 100644 --- a/packages/nx-infra-plugin/src/executors/pack-npm/schema.json +++ b/packages/nx-infra-plugin/src/executors/pack-npm/schema.json @@ -1,6 +1,21 @@ { "$schema": "https://json-schema.org/schema", "title": "Pack Npm Executor Schema", - "description": "Run pnpm pack for npm distribution", - "type": "object" + "description": "Run pnpm pack for npm distribution, optionally set version and copy tarballs", + "type": "object", + "properties": { + "packageDir": { + "type": "string", + "description": "Directory to pack (relative to the project root). Defaults to the project root." + }, + "destination": { + "type": "string", + "description": "Optional destination directory for *.tgz files (relative to the project root)." + }, + "setVersionFrom": { + "type": "string", + "description": "Optional path to a package.json (relative to the project root) whose version is applied before packing." + } + }, + "additionalProperties": false } diff --git a/packages/nx-infra-plugin/src/executors/pack-npm/schema.ts b/packages/nx-infra-plugin/src/executors/pack-npm/schema.ts index 8899f6e3e0a2..4dfaa4eefa6b 100644 --- a/packages/nx-infra-plugin/src/executors/pack-npm/schema.ts +++ b/packages/nx-infra-plugin/src/executors/pack-npm/schema.ts @@ -1 +1,16 @@ -export interface PackNpmExecutorSchema {} +export interface PackNpmExecutorSchema { + /** + * Directory to pack (relative to the project root). Defaults to the project root. + */ + packageDir?: string; + /** + * Optional destination directory for `*.tgz` files (relative to the project root). + * When omitted, tarballs stay where `pnpm pack` writes them. + */ + destination?: string; + /** + * Optional path to a package.json (relative to the project root) whose `version` + * is applied via `pnpm pkg set` before packing. + */ + setVersionFrom?: string; +} diff --git a/packages/nx-infra-plugin/src/executors/vectormap/executor.e2e.spec.ts b/packages/nx-infra-plugin/src/executors/vectormap/executor.e2e.spec.ts index f324d2633f70..839271ad248d 100644 --- a/packages/nx-infra-plugin/src/executors/vectormap/executor.e2e.spec.ts +++ b/packages/nx-infra-plugin/src/executors/vectormap/executor.e2e.spec.ts @@ -76,11 +76,11 @@ const LICENSE_TEMPLATE = `/*<%= commentType %> `; async function setupLicenseTemplate(projectDir: string): Promise { - const buildDir = path.join(projectDir, 'build', 'gulp'); + const buildDir = path.join(projectDir, 'build'); fs.mkdirSync(buildDir, { recursive: true }); const templatePath = path.join(buildDir, 'license-header.txt'); await writeFileText(templatePath, LICENSE_TEMPLATE); - return './build/gulp/license-header.txt'; + return './build/license-header.txt'; } describe('VectormapExecutor E2E', () => { diff --git a/packages/nx-infra-plugin/src/utils/file-operations.ts b/packages/nx-infra-plugin/src/utils/file-operations.ts index 033511466af0..6fddd13da06a 100644 --- a/packages/nx-infra-plugin/src/utils/file-operations.ts +++ b/packages/nx-infra-plugin/src/utils/file-operations.ts @@ -1,7 +1,6 @@ import * as fs from 'fs/promises'; import * as fse from 'fs-extra'; import * as path from 'path'; -import * as os from 'os'; import { glob } from 'glob'; import type { PackageJson } from './types'; @@ -69,11 +68,11 @@ export async function copyRecursive(from: string, to: string): Promise { } export function normalizeEol(content: string): string { - return content.replace(/\r?\n/g, os.EOL); + return content.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); } export function ensureTrailingNewline(content: string): string { - return content.endsWith(os.EOL) ? content : content + os.EOL; + return content.endsWith('\n') ? content : `${content}\n`; } export async function loadProjectPackageJson(projectRoot: string): Promise { diff --git a/packages/nx-infra-plugin/src/utils/index.ts b/packages/nx-infra-plugin/src/utils/index.ts index 5ea9b84eaedd..7e25468436f9 100644 --- a/packages/nx-infra-plugin/src/utils/index.ts +++ b/packages/nx-infra-plugin/src/utils/index.ts @@ -6,3 +6,4 @@ export * from './common'; export * from './test-utils'; export * from './create-executor'; export * from './glob-discovery'; +export * from './watch'; diff --git a/packages/nx-infra-plugin/src/utils/watch.ts b/packages/nx-infra-plugin/src/utils/watch.ts new file mode 100644 index 000000000000..8fd3b7e46dc0 --- /dev/null +++ b/packages/nx-infra-plugin/src/utils/watch.ts @@ -0,0 +1,124 @@ +import * as path from 'path'; +import { createRequire } from 'module'; +import { logger } from '@nx/devkit'; + +export const DEFAULT_WATCH_DEBOUNCE_MS = 200; + +export interface ChokidarWatcher { + on: (event: string, handler: (...args: unknown[]) => void) => unknown; + close: () => Promise | void; +} + +export interface Chokidar { + watch: (paths: string | string[], options?: Record) => ChokidarWatcher; +} + +// chokidar is a root devDependency, not a dependency of this plugin (and not the same +// chokidar gulp-watch bundles internally) — resolve it from the project root at runtime. +export function loadChokidar(projectRoot: string): Chokidar { + const projectRequire = createRequire(path.join(projectRoot, 'package.json')); + try { + return projectRequire('chokidar') as Chokidar; + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + throw new Error( + `watch mode requires 'chokidar' to be installed in the project (${projectRoot}): ${message}`, + ); + } +} + +export interface WatchEvent { + event: string; + filePath: string; +} + +export interface WatchWithChokidarOptions { + projectRoot: string; + /** Concrete files or directories to watch (chokidar v4 has no glob support). */ + watchTargets: string | string[]; + /** Label used in watch log messages. */ + label: string; + /** Rebuild callback invoked with the batch of events; debounced while idle, queued to run again immediately once a running rebuild finishes. */ + onRebuild: (events: WatchEvent[]) => Promise | void; + /** Optional filter deciding whether a raw chokidar event is relevant. */ + eventFilter?: (event: string, filePath: string) => boolean; + debounceMs?: number; + chokidarOptions?: Record; +} + +// Resolves on SIGINT/SIGTERM. Doesn't run an initial build — that's on the caller. +export async function watchWithChokidar(options: WatchWithChokidarOptions): Promise { + const { + projectRoot, + watchTargets, + label, + onRebuild, + eventFilter, + debounceMs = DEFAULT_WATCH_DEBOUNCE_MS, + chokidarOptions, + } = options; + + await new Promise((resolve) => { + let timer: NodeJS.Timeout | undefined; + let busy = false; + let pending = false; + let batch: WatchEvent[] = []; + + const runRebuild = async (): Promise => { + if (busy) { + pending = true; + return; + } + + const events = batch; + batch = []; + busy = true; + try { + await onRebuild(events); + logger.verbose(`${label}: rebuild complete`); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + logger.error(`${label} rebuild failed: ${message}`); + } finally { + busy = false; + if (pending) { + pending = false; + void runRebuild(); + } + } + }; + + const scheduleRebuild = (): void => { + if (timer) { + clearTimeout(timer); + } + timer = setTimeout(() => { + void runRebuild(); + }, debounceMs); + }; + + const chokidar = loadChokidar(projectRoot); + const watcher = chokidar.watch(watchTargets, { ignoreInitial: true, ...chokidarOptions }); + + watcher.on('all', (...args: unknown[]) => { + const [event, filePath] = args as [string, string]; + if (eventFilter && !eventFilter(event, filePath)) { + return; + } + batch.push({ event, filePath }); + scheduleRebuild(); + }); + + logger.verbose(`${label} is watching for changes...`); + + const stopWatcher = (): void => { + if (timer) { + clearTimeout(timer); + } + void Promise.resolve(watcher.close()).finally(resolve); + }; + + process.once('SIGINT', stopWatcher); + process.once('SIGTERM', stopWatcher); + }); +} diff --git a/packages/workflows/project.json b/packages/workflows/project.json index 326af0762f79..a87c8be8a945 100644 --- a/packages/workflows/project.json +++ b/packages/workflows/project.json @@ -10,6 +10,7 @@ "executor": "devextreme-nx-infra-plugin:copy-files", "options": { "files": [ + { "from": "../devextreme/artifacts/ts", "to": "../../artifacts/ts" }, { "from": "../devextreme/artifacts/js", "to": "../../artifacts/js" }, { "from": "../devextreme/artifacts/css", "to": "../../artifacts/css" } ] @@ -53,6 +54,59 @@ ] } }, + "inject-descriptions": { + "executor": "nx:run-commands", + "cache": false, + "options": { + "command": "pnpm exec ts-node tools/scripts/inject-descriptions.ts" + }, + "metadata": { + "description": "Clone documentation, update topics against metadata artifacts, inject descriptions into dx.all.d.ts and modules." + } + }, + "pack:themebuilder-to-artifacts": { + "executor": "devextreme-nx-infra-plugin:pack-npm", + "cache": false, + "options": { + "packageDir": "../devextreme-themebuilder/dist", + "destination": "../../artifacts/npm", + "setVersionFrom": "../devextreme/package.json" + } + }, + "pack:devextreme-internal-to-artifacts": { + "executor": "devextreme-nx-infra-plugin:pack-npm", + "cache": false, + "options": { + "packageDir": "../devextreme/artifacts/npm/devextreme-internal", + "destination": "../../artifacts/npm", + "setVersionFrom": "../devextreme/package.json" + } + }, + "pack:devextreme-dist-internal-to-artifacts": { + "executor": "devextreme-nx-infra-plugin:pack-npm", + "cache": false, + "options": { + "packageDir": "../devextreme/artifacts/npm/devextreme-dist-internal", + "destination": "../../artifacts/npm" + } + }, + "pack:release-tgz": { + "executor": "nx:run-commands", + "cache": false, + "options": { + "commands": [ + "pnpm nx pack:devextreme-npm devextreme", + "pnpm nx pack:devextreme-dist-npm devextreme", + "pnpm nx copy:npm-tgz workflows", + "pnpm nx pack:themebuilder-to-artifacts workflows", + "pnpm nx copy:wrappers-tgz workflows" + ], + "parallel": false + }, + "metadata": { + "description": "Pack public npm packages and copy tgz files into root artifacts/npm." + } + }, "all:build-dev": { "executor": "nx:run-commands", "options": { @@ -88,6 +142,81 @@ "metadata": { "description": "Build all packages for the testing environment." } + }, + "all:build": { + "executor": "nx:run-commands", + "options": { + "commands": [ + "pnpm nx make-aspnet-metadata devextreme-metadata", + "pnpm nx inject-descriptions workflows", + "pnpm nx build devextreme-scss", + "pnpm nx build-dist devextreme", + "pnpm nx build devextreme-themebuilder", + "pnpm nx copy:artifacts-to-root workflows", + "pnpm nx copy:bootstrap workflows", + "pnpm run all:pack-and-copy", + "pnpm nx pack devextreme-react", + "pnpm nx pack devextreme-vue", + "pnpm nx pack --configuration with-descriptions devextreme-angular", + "pnpm nx pack:release-tgz workflows" + ], + "parallel": false + }, + "configurations": { + "internal": { + "commands": [ + "pnpm nx make-aspnet-metadata devextreme-metadata", + "pnpm nx inject-descriptions workflows", + "pnpm nx build devextreme-scss", + "pnpm nx build-dist devextreme", + "pnpm nx build devextreme-themebuilder", + "pnpm nx copy:artifacts-to-root workflows", + "pnpm nx copy:bootstrap workflows", + "pnpm run all:pack-and-copy", + "pnpm nx pack devextreme-react", + "pnpm nx pack devextreme-vue", + "pnpm nx pack --configuration with-descriptions devextreme-angular", + "pnpm nx pack:release-tgz workflows", + "pnpm nx build-dist devextreme -c internal", + "pnpm nx pack:devextreme-internal-to-artifacts workflows", + "pnpm nx pack:devextreme-dist-internal-to-artifacts workflows" + ] + } + }, + "metadata": { + "description": "Full production release build. Use -c internal for the internal package pass." + } + }, + "make-artifacts-package": { + "executor": "nx:run-commands", + "cache": false, + "options": { + "command": "pnpm exec ts-node tools/scripts/make-artifacts-package.ts" + }, + "metadata": { + "description": "Assemble root artifacts/js|ts|css + metadata into devextreme-artifacts package and pack to artifacts/npm." + } + }, + "set-timestamp-version": { + "executor": "nx:run-commands", + "cache": false, + "options": { + "command": "pnpm exec ts-node tools/scripts/set-timestamp-version.ts" + }, + "metadata": { + "description": "Stamp monorepo packages with a timestamp build version derived from the root package.json version." + } + }, + "update-version": { + "executor": "nx:run-commands", + "cache": false, + "options": { + "command": "pnpm exec ts-node tools/scripts/update-version.ts", + "forwardAllArgs": true + }, + "metadata": { + "description": "Bump monorepo package versions. Usage: pnpm nx run workflows:update-version -- XX.X.X" + } } } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 52bf6edf2593..31ca42557f5d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -127,9 +127,6 @@ catalogs: globals: specifier: 15.14.0 version: 15.14.0 - gulp-eslint-new: - specifier: 2.4.0 - version: 2.4.0 inferno: specifier: ^8.2.3 version: 8.2.3 @@ -256,6 +253,9 @@ importers: axe-core: specifier: 'catalog:' version: 4.11.3 + chokidar: + specifier: 5.0.0 + version: 5.0.0 devextreme-internal-tools: specifier: catalog:tools version: 22.0.0 @@ -1409,6 +1409,12 @@ importers: '@babel/plugin-transform-modules-commonjs': specifier: 7.29.7 version: 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-nullish-coalescing-operator': + specifier: 7.29.7 + version: 7.29.7(@babel/core@7.29.7) + '@babel/plugin-transform-optional-chaining': + specifier: 7.29.7 + version: 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-runtime': specifier: 7.29.7 version: 7.29.7(@babel/core@7.29.7) @@ -1535,93 +1541,12 @@ importers: file-saver: specifier: 2.0.5 version: 2.0.5 - glob: - specifier: 11.1.0 - version: 11.1.0 globalize: specifier: 1.7.1 version: 1.7.1 globals: specifier: 'catalog:' version: 15.14.0 - gulp: - specifier: 4.0.2 - version: 4.0.2 - gulp-babel: - specifier: 8.0.0 - version: 8.0.0(@babel/core@7.29.7) - gulp-cache: - specifier: 1.1.3 - version: 1.1.3 - gulp-cached: - specifier: 1.1.1 - version: 1.1.1 - gulp-concat: - specifier: 2.6.1 - version: 2.6.1 - gulp-each: - specifier: 0.5.0 - version: 0.5.0 - gulp-eol: - specifier: 0.2.0 - version: 0.2.0 - gulp-eslint-new: - specifier: 'catalog:' - version: 2.4.0(jiti@2.6.1) - gulp-file: - specifier: 0.4.0 - version: 0.4.0 - gulp-filter: - specifier: 7.0.0 - version: 7.0.0(gulp@4.0.2) - gulp-flatmap: - specifier: 1.0.2 - version: 1.0.2 - gulp-footer: - specifier: 2.1.0 - version: 2.1.0 - gulp-header: - specifier: 2.0.9 - version: 2.0.9 - gulp-if: - specifier: 3.0.0 - version: 3.0.0 - gulp-json-editor: - specifier: 2.6.0 - version: 2.6.0 - gulp-multi-process: - specifier: 1.4.0 - version: 1.4.0 - gulp-notify: - specifier: 4.0.0 - version: 4.0.0 - gulp-plumber: - specifier: 1.2.1 - version: 1.2.1 - gulp-rename: - specifier: 1.4.0 - version: 1.4.0 - gulp-replace: - specifier: 0.6.1 - version: 0.6.1 - gulp-sass: - specifier: 6.0.1 - version: 6.0.1 - gulp-shell: - specifier: 0.8.0 - version: 0.8.0 - gulp-tap: - specifier: 1.0.1 - version: 1.0.1 - gulp-template: - specifier: 5.0.0 - version: 5.0.0 - gulp-typescript: - specifier: 5.0.1 - version: 5.0.1(typescript@4.9.5) - gulp-watch: - specifier: 5.0.1 - version: 5.0.1 ignore: specifier: 5.3.2 version: 5.3.2 @@ -1649,21 +1574,12 @@ importers: knockout: specifier: 3.5.3 version: 3.5.3 - lazypipe: - specifier: 1.0.2 - version: 1.0.2 - merge-stream: - specifier: 2.0.0 - version: 2.0.0 minimist: specifier: 1.2.8 version: 1.2.8 qunit: specifier: 2.25.0 version: 2.25.0 - sass-embedded: - specifier: 1.93.3 - version: 1.93.3 sinon: specifier: 18.0.1 version: 18.0.1 @@ -1685,9 +1601,6 @@ importers: terser-webpack-plugin: specifier: 5.3.17 version: 5.3.17(@swc/core@1.15.30(@swc/helpers@0.5.21))(esbuild@0.28.1)(webpack@5.105.4(@swc/core@1.15.30(@swc/helpers@0.5.21))(esbuild@0.28.1)) - through2: - specifier: 2.0.5 - version: 2.0.5 ts-jest: specifier: 29.1.2 version: 29.1.2(@babel/core@7.29.7)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.29.7))(esbuild@0.28.1)(jest@29.7.0(@types/node@25.9.3)(babel-plugin-macros@3.1.0)(node-notifier@9.0.1)(ts-node@10.9.2(@swc/core@1.15.30(@swc/helpers@0.5.21))(@types/node@20.19.37)(typescript@5.9.3)))(typescript@4.9.5) @@ -1700,15 +1613,6 @@ importers: typescript-min: specifier: npm:typescript@4.9.5 version: typescript@4.9.5 - uuid: - specifier: 14.0.0 - version: 14.0.0 - vinyl: - specifier: 2.2.1 - version: 2.2.1 - vinyl-named: - specifier: 1.1.0 - version: 1.1.0 vite: specifier: 8.0.16 version: 8.0.16(@types/node@20.19.37)(esbuild@0.28.1)(jiti@2.6.1)(less@4.6.6)(sass-embedded@1.93.3)(sass@1.99.0)(terser@5.47.1)(yaml@2.8.3) @@ -1718,9 +1622,6 @@ importers: webpack-stream: specifier: 7.0.0 version: 7.0.0(webpack@5.105.4(@swc/core@1.15.30(@swc/helpers@0.5.21))(esbuild@0.28.1)) - yargs: - specifier: 17.7.2 - version: 17.7.2 publishDirectory: artifacts/npm/devextreme packages/devextreme-angular: @@ -2009,9 +1910,6 @@ importers: autoprefixer: specifier: 10.5.0 version: 10.5.0(postcss@8.5.10) - chokidar: - specifier: 5.0.0 - version: 5.0.0 clean-css: specifier: 5.3.3 version: 5.3.3 @@ -3035,10 +2933,6 @@ packages: peerDependencies: '@babel/core': ^7.29.1 - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - resolution: {integrity: sha512-Tub4ZKEXqbPjXgWLl2+3JpQAYBJ8+ikpQ2Ocj/q/r0LwE3UhENh7EUabyHjz2kCEsrRY83ew2DQdHluuiDQFzg==} - engines: {node: '>=6.9.0'} - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': resolution: {integrity: sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==} engines: {node: '>=6.9.0'} @@ -3671,12 +3565,6 @@ packages: peerDependencies: '@babel/core': ^7.29.1 - '@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.29.1 - '@babel/plugin-transform-nullish-coalescing-operator@7.29.7': resolution: {integrity: sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==} engines: {node: '>=6.9.0'} @@ -3731,12 +3619,6 @@ packages: peerDependencies: '@babel/core': ^7.29.1 - '@babel/plugin-transform-optional-chaining@7.28.6': - resolution: {integrity: sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.29.1 - '@babel/plugin-transform-optional-chaining@7.29.7': resolution: {integrity: sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==} engines: {node: '>=6.9.0'} @@ -4408,10 +4290,6 @@ packages: resolution: {integrity: sha512-GmzA9ckNokPypTg10pgpeHNQe7ph+iIKKmhKu3Ob9ANkswreCx7R3cKmY781K8QK3AqVL3xVh9A42JvIAbkkSA==} engines: {node: ^20.17.0 || >=22.9.0} - '@gulpjs/to-absolute-glob@4.0.0': - resolution: {integrity: sha512-kjotm7XJrJ6v+7knhPaRgaT6q8F8K2jiafwYdNHLzmV0uGLuZY43FK6smNSHUPrhq5kX2slCUy+RGG/xGqmIKA==} - engines: {node: '>=10.13.0'} - '@harperfast/extended-iterable@1.0.3': resolution: {integrity: sha512-sSAYhQca3rDWtQUHSAPeO7axFIUJOI6hn1gjRC5APVE1a90tuyT8f5WIgRsFhhWA7htNkju2veB9eWL6YHi/Lw==} @@ -6893,9 +6771,6 @@ packages: '@types/eslint@8.56.12': resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} - '@types/eslint@9.6.1': - resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} - '@types/esquery@1.5.4': resolution: {integrity: sha512-yYO4Q8H+KJHKW1rEeSzHxcZi90durqYgWVfnh5K6ZADVBjBv2e1NEveYX5yT2bffgN7RqzH3k9930m+i2yBoMA==} @@ -6992,9 +6867,6 @@ packages: '@types/mime@1.3.5': resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} - '@types/minimatch@3.0.5': - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - '@types/minimatch@5.1.2': resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} @@ -7967,18 +7839,10 @@ packages: resolution: {integrity: sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==} engines: {node: '>=0.10.0'} - ansi-colors@3.2.4: - resolution: {integrity: sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==} - engines: {node: '>=6'} - ansi-colors@4.1.3: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - ansi-cyan@0.1.1: - resolution: {integrity: sha512-eCjan3AVo/SxZ0/MyIYRtkpxIu/H3xZN7URr1vXVrISxeyz8fUFz0FJziamK4sS8I+t35y4rHg1b2PklyBe/7A==} - engines: {node: '>=0.10.0'} - ansi-escapes@4.3.2: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} @@ -8000,10 +7864,6 @@ packages: engines: {'0': node >= 0.8.0} hasBin: true - ansi-red@0.1.1: - resolution: {integrity: sha512-ewaIr5y+9CUTGFwZfpECUbFlGcC0GCw1oqR9RI6h1gQCd9Aj2GxSckCnPsVJnmfMZbwFYE+leZGASgkWl06Jow==} - engines: {node: '>=0.10.0'} - ansi-regex@2.1.1: resolution: {integrity: sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==} engines: {node: '>=0.10.0'} @@ -8040,12 +7900,6 @@ packages: resolution: {integrity: sha512-ZyznvL8k/FZeQHr2T6LzcJ/+vBApDnMNZvfVFy3At0knswWd6rJ3/0Hhmpu8oqa6C92npmozs890sX9Dl6q+Qw==} engines: {node: '>=0.10.0'} - anymatch@1.3.2: - resolution: {integrity: sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==} - - anymatch@2.0.0: - resolution: {integrity: sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -8053,10 +7907,6 @@ packages: app-module-path@2.2.0: resolution: {integrity: sha512-gkco+qxENJV+8vFcDiiFhuoSvRXb2a/QPqpSoWhVz829VNJfOTnELbBmPmNKFxf3xdNnw4DWCkzkDaavcX/1YQ==} - append-buffer@1.0.2: - resolution: {integrity: sha512-WLbYiXzD3y/ATLZFufV/rZvWdZOs+Z/+5v1rBZ463Jn398pa6kcde27cvozYnBoxXblGZTFfoPpsaEw0orU5BA==} - engines: {node: '>=0.10.0'} - archiver-utils@5.0.2: resolution: {integrity: sha512-wuLJMmIBQYCsGZgYLTy5FIB2pF6Lfb6cXMSF8Qywwk3t20zWnAi7zLcQFdKQmIB8wyZpY5ER38x08GbwtR2cLA==} engines: {node: '>= 14'} @@ -8065,9 +7915,6 @@ packages: resolution: {integrity: sha512-ZcbTaIqJOfCc03QwD468Unz/5Ir8ATtvAHsK+FdXbDIbGfihqh9mrvdcYunQzqn4HrvWWaFyaxJhGZagaJJpPQ==} engines: {node: '>= 14'} - archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - arg@4.1.3: resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} @@ -8084,30 +7931,10 @@ packages: resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==} engines: {node: '>= 0.4'} - arr-diff@1.1.0: - resolution: {integrity: sha512-OQwDZUqYaQwyyhDJHThmzId8daf4/RFNLaeh3AevmSeZ5Y7ug4Ga/yKc6l6kTZOBW781rCj103ZuTh8GAsB3+Q==} - engines: {node: '>=0.10.0'} - arr-diff@4.0.0: resolution: {integrity: sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==} engines: {node: '>=0.10.0'} - arr-filter@1.1.2: - resolution: {integrity: sha512-A2BETWCqhsecSvCkWAeVBFLH6sXEUGASuzkpjL3GR1SlL/PWL6M3J8EAAld2Uubmh39tvkJTqC9LeLHCUKmFXA==} - engines: {node: '>=0.10.0'} - - arr-flatten@1.1.0: - resolution: {integrity: sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==} - engines: {node: '>=0.10.0'} - - arr-map@2.0.2: - resolution: {integrity: sha512-tVqVTHt+Q5Xb09qRkbu+DidW1yYzz5izWS2Xm2yFm7qJnmUfz4HPzNxbHkdRJbz2lrqI7S+z17xNYdFcBBO8Hw==} - engines: {node: '>=0.10.0'} - - arr-union@2.1.0: - resolution: {integrity: sha512-t5db90jq+qdgk8aFnxEkjqta0B/GHrM1pxzuuZz2zWsOXc5nKu3t+76s/PQBA8FTcM/ipspIH9jWG4OxCBc2eA==} - engines: {node: '>=0.10.0'} - arr-union@3.1.0: resolution: {integrity: sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==} engines: {node: '>=0.10.0'} @@ -8116,14 +7943,6 @@ packages: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} - array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} - - array-each@1.0.1: - resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} - engines: {node: '>=0.10.0'} - array-find@1.0.0: resolution: {integrity: sha512-kO/vVCacW9mnpn3WPWbTVlEnOabK2L7LWi2HViURtCM46y1zb6I8UMjx4LgbiqadTgHnLInUronwn3ampNTJtQ==} @@ -8134,26 +7953,6 @@ packages: resolution: {integrity: sha512-FmeCCAenzH0KH381SPT5FZmiA/TmpndpcaShhfgEN9eCVjnFBqq3l1xrI42y8+PPLI6hypzou4GXw00WHmPBLQ==} engines: {node: '>= 0.4'} - array-initial@1.1.0: - resolution: {integrity: sha512-BC4Yl89vneCYfpLrs5JU2aAu9/a+xWbeKhvISg9PT7eWFB9UlRvI+rKEtk6mgxWr3dSkk9gQ8hCrdqt06NXPdw==} - engines: {node: '>=0.10.0'} - - array-last@1.3.0: - resolution: {integrity: sha512-eOCut5rXlI6aCOS7Z7kCplKRKyiFQ6dHFBem4PwlwKeNFk2/XxTrhRh5T9PyaEWGy/NHTZWbY+nsZlNFJu9rYg==} - engines: {node: '>=0.10.0'} - - array-slice@0.2.3: - resolution: {integrity: sha512-rlVfZW/1Ph2SNySXwR9QYkChp8EkOEiTMO5Vwx60usw04i4nWemkm9RXmQqgkQFaLHsqLuADvjp6IfgL9l2M8Q==} - engines: {node: '>=0.10.0'} - - array-slice@1.1.0: - resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} - engines: {node: '>=0.10.0'} - - array-sort@1.0.0: - resolution: {integrity: sha512-ihLeJkonmdiAsD7vpgN3CRcx2J2S0TiYW+IS/5zHBI7mKUq3ySvBdzzBfD236ubDBQFiiyG3SWCPc+msQ9KoYg==} - engines: {node: '>=0.10.0'} - array-union@1.0.2: resolution: {integrity: sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==} engines: {node: '>=0.10.0'} @@ -8190,10 +7989,6 @@ packages: resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==} engines: {node: '>= 0.4'} - arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - asn1.js@4.10.1: resolution: {integrity: sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==} @@ -8230,13 +8025,6 @@ packages: resolution: {integrity: sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==} engines: {node: '>=8'} - async-done@1.3.2: - resolution: {integrity: sha512-uYkTP8dw2og1tu1nmza1n1CMW0qb8gWWlwqMmLb7MhBVs4BXrFziT6HXUd+/RlRA/i4H9AkofYloUbs1fwMqlw==} - engines: {node: '>= 0.10'} - - async-each@1.0.6: - resolution: {integrity: sha512-c646jH1avxr+aVpndVMeAfYw7wAa6idufrlN3LPA4PmKS0QEGp6PIC9nwz0WQkkvBGAMEki3pFdtxaF39J9vvg==} - async-exit-hook@1.1.2: resolution: {integrity: sha512-CeTSWB5Bou31xSHeO45ZKgLPRaJbV4I8csRcFYETDBehX7H+1GDO/v+v8G7fZmar1gOmYa6UTXn6d/WIiJbslw==} engines: {node: '>=0.12.0'} @@ -8245,10 +8033,6 @@ packages: resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==} engines: {node: '>= 0.4'} - async-settle@1.0.0: - resolution: {integrity: sha512-VPXfB4Vk49z1LHHodrEQ6Xf7W4gg1w0dAPROHngx7qgDjqmIQ+fXmwgGXTW/ITLai0YLSvWepJOP9EVpMnEAcw==} - engines: {node: '>= 0.10'} - async@3.2.3: resolution: {integrity: sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==} @@ -8490,10 +8274,6 @@ packages: resolution: {integrity: sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==} hasBin: true - bach@1.2.0: - resolution: {integrity: sha512-bZOOfCb3gXBXbTFXq3OZtGR88LwGeJvzu6szttaIzymOTS4ZttBNOWSv7aLZja2EMycKtRYV0Oa8SNKH/zkxvg==} - engines: {node: '>= 0.10'} - bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -8589,26 +8369,13 @@ packages: big.js@5.2.2: resolution: {integrity: sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==} - binary-extensions@1.13.1: - resolution: {integrity: sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==} - engines: {node: '>=0.10.0'} - binary-extensions@2.3.0: resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} engines: {node: '>=8'} - binaryextensions@1.0.1: - resolution: {integrity: sha512-xnG0l4K3ghM62rFzDi2jcNEuICl6uQ4NgvGpqQsY7HgW8gPDeAWGOxHI/k+qZfXfMANytzrArGNPXidaCwtbmA==} - - bindings@1.5.0: - resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} - bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - bl@5.1.0: - resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} - bluebird@3.7.2: resolution: {integrity: sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==} @@ -8711,10 +8478,6 @@ packages: resolution: {integrity: sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==} engines: {node: '>=8.0.0'} - buffer-equal@1.0.1: - resolution: {integrity: sha512-QoV3ptgEaQpvVwbXdSO39iqPQTCxSF7A5U99AxbHYqUdCizL/lH2Z0A2y6nbZucxMEOtNyZfG2s6gsVugGpKkg==} - engines: {node: '>=0.4'} - buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} @@ -8757,9 +8520,6 @@ packages: resolution: {integrity: sha512-M3Lab8NPYlZU2exsL3bMVvMrMqgwCnMWfdZbK28bn3pK6APT/Te/I8hjRPNu1uwORY9a1eEQoifXbKPQMfMTOA==} engines: {node: ^20.17.0 || >=22.9.0} - cache-swap@0.3.0: - resolution: {integrity: sha512-rwePCa4iVqXHrEEmQEoLR3Kea4aCTCf7JfX+mJA4Fd61Vb738TItRRv1v++emp9wfnRUKbXpIYfRJY4ThWK09g==} - cacheable@2.3.4: resolution: {integrity: sha512-djgxybDbw9fL/ZWMI3+CE8ZilNxcwFkVtDc1gJ+IlOSSWkSMPQabhV/XCHTQ6pwwN6aivXPZ43omTooZiX06Ew==} @@ -8788,10 +8548,6 @@ packages: camel-case@4.1.2: resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} - camelcase@3.0.0: - resolution: {integrity: sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==} - engines: {node: '>=0.10.0'} - camelcase@5.3.1: resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} engines: {node: '>=6'} @@ -8834,10 +8590,6 @@ packages: resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} engines: {node: '>=4'} - chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} engines: {node: '>=10'} @@ -8883,9 +8635,6 @@ packages: resolution: {integrity: sha512-WDrybc/gKFpTYQutKIK6UvfcuxijIZfMfXaYm8NMsPQxSYvf+13fXUJ4rztGGbJcBQ/GF55gvrZ0Bc0bj/mqvg==} engines: {node: '>=20.18.1'} - chokidar@2.1.8: - resolution: {integrity: sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==} - chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -9015,9 +8764,6 @@ packages: resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} engines: {node: '>= 12'} - cliui@3.2.0: - resolution: {integrity: sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==} - cliui@7.0.4: resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} @@ -9037,9 +8783,6 @@ packages: resolution: {integrity: sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==} engines: {node: '>=6'} - clone-stats@0.0.1: - resolution: {integrity: sha512-dhUqc57gSMCo6TX85FLfe51eC/s+Im2MLkAgJwfaRRexR2tA4dd3eLEW4L6efzHc2iNorrRRXITifnDLlRrhaA==} - clone-stats@1.0.0: resolution: {integrity: sha512-au6ydSpg6nsrigcZ4m8Bc9hxjeW+GJ8xh5G3BJCMt4WXe1H10UNaVOamqQTmrx1kjVuxAHIQSNU6hY4Nsn9/ag==} @@ -9061,10 +8804,6 @@ packages: code-block-writer@12.0.0: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} - code-point-at@1.1.0: - resolution: {integrity: sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==} - engines: {node: '>=0.10.0'} - coffeescript@2.7.0: resolution: {integrity: sha512-hzWp6TUE2d/jCcN67LrW1eh5b/rSDKQK6oD6VMLlggYVUUFexgTH9z3dNYihzX4RMhze5FTUsUmOXViJKFQR/A==} engines: {node: '>=6'} @@ -9073,10 +8812,6 @@ packages: collect-v8-coverage@1.0.3: resolution: {integrity: sha512-1L5aqIkwPfiodaMgQunkF1zRhNqifHBmtbbbxcr6yVxxBnliw4TDOW6NxpO8DJLgJ16OT+Y4ztZqP6p/FtXnAw==} - collection-map@1.0.0: - resolution: {integrity: sha512-5D2XXSpkOnleOI21TG7p3T0bGAsZ/XknZpKBmGYyluO8pw4zA3K8ZlrBIbC4FXg3m6z/RNFiUFfT2sQK01+UHA==} - engines: {node: '>=0.10.0'} - color-convert@0.5.3: resolution: {integrity: sha512-RwBeO/B/vZR3dfKL1ye/vx8MHZ40ugzpyfeVG5GsiuGnrlMWe2o8wxBbLCpw9CsxV+wHuzYlCiWnybrIA0ling==} @@ -9209,9 +8944,6 @@ packages: resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} engines: {'0': node >= 0.8} - concat-with-sourcemaps@1.1.0: - resolution: {integrity: sha512-4gEjHJFT9e+2W/77h/DS5SGUgwDaOwprX8L/gl5+3ixnzkVJJsZWDSelmN3Oilw3LNDZjZV0yqH1hLG3k6nghg==} - config-chain@1.1.13: resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==} @@ -9286,9 +9018,6 @@ packages: resolution: {integrity: sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==} engines: {node: '>=12.13'} - copy-props@2.0.5: - resolution: {integrity: sha512-XBlx8HSqrT0ObQwmSzM7WE5k8FxTV75h1DX1Z3n6NhQ/UYYAvInWYmG06vFt7hQZArE2fuO62aihiWIVQwh1sw==} - copy-webpack-plugin@14.0.0: resolution: {integrity: sha512-3JLW90aBGeaTLpM7mYQKpnVdgsUZRExY55giiZgLuX/xTQRUs1dOCwbBnWnvY6Q6rfZoXMNwzOQJCSZPppfqXA==} engines: {node: '>= 20.9.0'} @@ -9554,10 +9283,6 @@ packages: supports-color: optional: true - decamelize@1.2.0: - resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} - engines: {node: '>=0.10.0'} - decimal.js@10.6.0: resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==} @@ -9608,14 +9333,6 @@ packages: resolution: {integrity: sha512-H9LMLr5zwIbSxrmvikGuI/5KGhZ8E2zH3stkMgM5LpOWDutGM2JZaj460Udnf1a+946zc7YBgrqEWwbk7zHvGw==} engines: {node: '>=18'} - default-compare@1.0.0: - resolution: {integrity: sha512-QWfXlM0EkAbqOCbD/6HjdwT19j7WCkMyiRhWilc4H9/5h/RzTF9gv5LYh1+CmDV5d1rki6KAWLtQale0xt20eQ==} - engines: {node: '>=0.10.0'} - - default-resolution@2.0.0: - resolution: {integrity: sha512-2xaP6GiwVwOEbXCGoJ4ufgC76m8cj805jrghScewJC2ZDsb9U0b4BIrba+xt/Uytyd0HvQ6+WymSRTfnYj59GQ==} - engines: {node: '>= 0.10'} - defaults@1.0.4: resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} @@ -9677,18 +9394,10 @@ packages: resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} - detect-file@1.0.0: - resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} - engines: {node: '>=0.10.0'} - detect-indent@4.0.0: resolution: {integrity: sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==} engines: {node: '>=0.10.0'} - detect-indent@6.1.0: - resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} - engines: {node: '>=8'} - detect-libc@1.0.3: resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} engines: {node: '>=0.10'} @@ -9913,21 +9622,9 @@ packages: duplexer2@0.1.4: resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - duplexer@0.1.2: - resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} - - duplexify@3.7.1: - resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} - - duplexify@4.1.3: - resolution: {integrity: sha512-M3BmBhwJRZsSx38lZyhE53Csddgzl5R7xGJNk7CVddZD6CcmwMCH8J+7AprIrQKH7TonKxaCjcv27Qmf+sQ+oA==} - dx-systemjs-vue-browser@1.1.2: resolution: {integrity: sha512-Z6ibEOrWKd0ta/rZqDMVax3gScK3C4w5GzzeAor4GNaUJfhV6SjLRmpgdecYRtZTPvCvjlFHxF2Br6cXqa0Jig==} - each-props@1.3.2: - resolution: {integrity: sha512-vV0Hem3zAGkJAyU7JSjixeU66rwdynTAa1vofCrSA5fEln+m67Az9CcnkVD776/fsN/UjIWmBDoNRS6t6G9RfA==} - eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} @@ -10130,9 +9827,6 @@ packages: es6-template-strings@2.0.1: resolution: {integrity: sha512-5kTq0dEJfsm/EAteUCgLazcvWEhriVGwWFY3YgIsz89fJd+smi65/N1eS1Hn3B2dAngiqd0EvpXjr8lb7Quzkw==} - es6-weak-map@2.0.3: - resolution: {integrity: sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==} - esbuild-plugin-vue3@0.3.2: resolution: {integrity: sha512-KqZUPlIUS4vJLSexV3q5hgqIlsMWzlPtIuvZ1epZQvw/wJ/4vEPzEC1HQZduoHvUYvtnG703hsP1PsdpjTJ3ug==} peerDependencies: @@ -10539,10 +10233,6 @@ packages: resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} engines: {node: '>= 0.8.0'} - expand-tilde@2.0.2: - resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} - engines: {node: '>=0.10.0'} - expect@29.7.0: resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -10579,10 +10269,6 @@ packages: ext@1.7.0: resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} - extend-shallow@1.1.4: - resolution: {integrity: sha512-L7AGmkO6jhDkEBBGWlLtftA80Xq8DipnrRPr0pyi7GQLXkaq9JYA4xF4z6qnadIC6euiTDKco0cGSU9muw+WTw==} - engines: {node: '>=0.10.0'} - extend-shallow@3.0.2: resolution: {integrity: sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==} engines: {node: '>=0.10.0'} @@ -10590,18 +10276,10 @@ packages: extend@3.0.2: resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} - fancy-log@1.3.2: - resolution: {integrity: sha512-7E6IFy84FpO6jcnzEsCcoxDleHpMTFzncmCXXBIVYq1/Oakqnbc/lTKPJyyW6edGeC/rnZmV78hJe7SuoZo0aQ==} - engines: {node: '>= 0.10'} - fancy-log@1.3.3: resolution: {integrity: sha512-k9oEhlyc0FrVh25qYuSELjr8oxsCoc4/LEZfg2iJJrfEk/tZL9bCoJE47gqAvI2m/AUjluCS4+3I0eTx8n3AEw==} engines: {node: '>= 0.10'} - fancy-log@2.0.0: - resolution: {integrity: sha512-9CzxZbACXMUXW13tS0tI8XsGGmxWzO2DmYrGuBJOJ8k8q2K7hwfJA5qHjuPPe8wtsco33YR9wc+Rlr5wYFvhSA==} - engines: {node: '>=10.13.0'} - fast-csv@5.0.5: resolution: {integrity: sha512-9//QpogDIPln5Dc8e3Q3vbSSLXlTeU7z1JqsUOXZYOln8EIn/OOO8+NS2c3ukR6oYngDd3+P1HXSkby3kNV9KA==} engines: {node: '>=10.0.0'} @@ -10625,9 +10303,6 @@ packages: fast-json-stable-stringify@2.1.0: resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - fast-levenshtein@1.1.4: - resolution: {integrity: sha512-Ia0sQNrMPXXkqVFt6w6M1n1oKo3NfKs+mvaV811Jwir7vAk9a6PVV9VPYf6X3BU97QiLEmuW3uXH9u87zDFfdw==} - fast-levenshtein@2.0.6: resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} @@ -10698,9 +10373,6 @@ packages: file-saver@2.0.5: resolution: {integrity: sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==} - file-uri-to-path@1.0.0: - resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} - filing-cabinet@4.1.6: resolution: {integrity: sha512-C+HZbuQTER36sKzGtUhrAPAoK6+/PrrUhYDBQEh3kBRdsyEhkLbp1ML8S0+6e6gCUrUlid+XmubxJrhvL2g/Zw==} engines: {node: '>=14'} @@ -10737,10 +10409,6 @@ packages: resolution: {integrity: sha512-afd4O7zpqHeRyg4PfDQsXmlDe2PfdHtJt6Akt8jOWaApLOZk5JXs6VMR29lz03pRe9mpykrRCYIYxaJYcfpncQ==} engines: {node: '>=18'} - find-up@1.1.2: - resolution: {integrity: sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==} - engines: {node: '>=0.10.0'} - find-up@3.0.0: resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==} engines: {node: '>=6'} @@ -10753,26 +10421,6 @@ packages: resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} engines: {node: '>=10'} - findup-sync@2.0.0: - resolution: {integrity: sha512-vs+3unmJT45eczmcAZ6zMJtxN3l/QXeccaXQx5cu/MeJMhewVfoWZqibRkOxPnmoR59+Zy5hjabfQc6JLSah4g==} - engines: {node: '>= 0.10'} - - findup-sync@3.0.0: - resolution: {integrity: sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==} - engines: {node: '>= 0.10'} - - fined@1.2.0: - resolution: {integrity: sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng==} - engines: {node: '>= 0.10'} - - first-chunk-stream@2.0.0: - resolution: {integrity: sha512-X8Z+b/0L4lToKYq+lwnKqi9X/Zek0NibLpsJgVsSxpoYq7JtiCtRb5HqKVEjEw/qAb/4AKKRLOwwKHlWNpm2Eg==} - engines: {node: '>=0.10.0'} - - flagged-respawn@1.0.1: - resolution: {integrity: sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==} - engines: {node: '>= 0.10'} - flat-cache@3.2.0: resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} engines: {node: ^10.12.0 || >=12.0.0} @@ -10791,9 +10439,6 @@ packages: flatted@3.4.2: resolution: {integrity: sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==} - flush-write-stream@1.1.1: - resolution: {integrity: sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==} - fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} @@ -10810,21 +10455,10 @@ packages: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} - for-in@1.0.2: - resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} - engines: {node: '>=0.10.0'} - - for-own@1.0.0: - resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} - engines: {node: '>=0.10.0'} - foreground-child@3.3.1: resolution: {integrity: sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==} engines: {node: '>=14'} - fork-stream@0.0.4: - resolution: {integrity: sha512-Pqq5NnT78ehvUnAk/We/Jr22vSvanRlFTpAmQ88xBY/M1TlHe+P0ILuEyXS595ysdGfaj22634LBkGMA2GTcpA==} - fork-ts-checker-webpack-plugin@9.1.0: resolution: {integrity: sha512-mpafl89VFPJmhnJ1ssH+8wmM2b50n+Rew5x42NeI2U78aRWgtkEtGmctp7iT16UjquJTjorEmIfESj3DxdW84Q==} engines: {node: '>=14.21.3'} @@ -10884,26 +10518,12 @@ packages: resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} - fs-mkdirp-stream@1.0.0: - resolution: {integrity: sha512-+vSd9frUnapVC2RZYfL3FCB2p3g4TBhaUmrsWlSudsGdnxIuUvBB2QM1VZeBtc49QFwrp+wQLrDs3+xxDgI5gQ==} - engines: {node: '>= 0.10'} - - fs-mkdirp-stream@2.0.1: - resolution: {integrity: sha512-UTOY+59K6IA94tec8Wjqm0FSh5OVudGNB0NL/P6fB3HiE3bYOY3VYBGijsnOHNkQSwC1FKkU77pmq7xp9CskLw==} - engines: {node: '>=10.13.0'} - fs-monkey@1.1.0: resolution: {integrity: sha512-QMUezzXWII9EV5aTFXW1UBVUO77wYPpjqIF8/AviUCThNeSYZykpoTixUeaNNBwmCev0AMDWMAni+f8Hxb1IFw==} fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - fsevents@1.2.13: - resolution: {integrity: sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==} - engines: {node: '>= 4.0'} - os: [darwin] - deprecated: Upgrade to fsevents v2 to mitigate potential security issues - fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -10934,9 +10554,6 @@ packages: get-assigned-identifiers@1.2.0: resolution: {integrity: sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ==} - get-caller-file@1.0.3: - resolution: {integrity: sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==} - get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -10989,16 +10606,9 @@ packages: get-tsconfig@4.14.0: resolution: {integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==} - get-value@2.0.6: - resolution: {integrity: sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==} - engines: {node: '>=0.10.0'} - getos@3.2.1: resolution: {integrity: sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==} - glob-parent@3.1.0: - resolution: {integrity: sha512-E8Ak/2+dZY6fnzlR7+ueWvhsH1SjHr4jjss4YS/h4py44jY9MhK/VFdaZJAWDz6BbL21KeteKxFSFpq8OS5gVA==} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -11007,14 +10617,6 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} - glob-stream@6.1.0: - resolution: {integrity: sha512-uMbLGAP3S2aDOHUDfdoYcdIePUCfysbAd0IAoWVZbeGU/oNQ8asHVSshLDJUPWxfzj8zsCG7/XeHPHTtow0nsw==} - engines: {node: '>= 0.10'} - - glob-stream@8.0.3: - resolution: {integrity: sha512-fqZVj22LtFJkHODT+M4N1RJQ3TjnnQhfE9GwZI8qXscYarnhpip70poMldRnP8ipQ/w0B621kOhfc53/J9bd/A==} - engines: {node: '>=10.13.0'} - glob-to-regex.js@1.2.0: resolution: {integrity: sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ==} engines: {node: '>=10.0'} @@ -11024,10 +10626,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob-watcher@5.0.5: - resolution: {integrity: sha512-zOZgGGEHPklZNjZQaZ9f41i7F2YwE+tS5ZHrDhbBCk3stwahn5vQxnFmBJZHoYdusR6R1bLSXeGUy/BhctwKzw==} - engines: {node: '>= 0.10'} - 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 @@ -11056,18 +10654,10 @@ packages: engines: {node: '>=12'} 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 - global-modules@1.0.0: - resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} - engines: {node: '>=0.10.0'} - global-modules@2.0.0: resolution: {integrity: sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==} engines: {node: '>=6'} - global-prefix@1.0.2: - resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} - engines: {node: '>=0.10.0'} - global-prefix@3.0.0: resolution: {integrity: sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==} engines: {node: '>=6'} @@ -11120,10 +10710,6 @@ packages: globrex@0.1.2: resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - glogg@1.0.2: - resolution: {integrity: sha512-5mwUoSuBk44Y4EshyiqcH95ZntbDdTQqA3QYSrxmzj28Ai0vXBGMH1ApSANH14j2sIRtqCEyg6PfsuP7ElOEDA==} - engines: {node: '>= 0.10'} - gonzales-pe@4.3.0: resolution: {integrity: sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==} engines: {node: '>=0.6.0'} @@ -11148,122 +10734,6 @@ packages: growly@1.3.0: resolution: {integrity: sha512-+xGQY0YyAWCnqy7Cd++hc2JqMYzlm0dG30Jd0beaA64sROr8C4nt8Yc9V5Ro3avlSUDTN0ulqP/VBKi1/lLygw==} - gulp-babel@8.0.0: - resolution: {integrity: sha512-oomaIqDXxFkg7lbpBou/gnUkX51/Y/M2ZfSjL2hdqXTAlSWZcgZtd2o0cOH0r/eE8LWD0+Q/PsLsr2DKOoqToQ==} - engines: {node: '>=6'} - peerDependencies: - '@babel/core': ^7.29.1 - - gulp-cache@1.1.3: - resolution: {integrity: sha512-NE814LdX1NWQn2sMzn+Rf673o4mqlgg7OyLf92oQ4KEl6DdPfduEGLNH+HexLVcFZXH93DBuxFOvpv4/Js5VaA==} - engines: {node: '>=8.0.0'} - - gulp-cached@1.1.1: - resolution: {integrity: sha512-OEGsICR6Vmx0VK3nhpy5MGPzAjeDYC3+NKxNtJAu4DW8L15oy8tCe2WuD6HDEj9BsbSopnOBiXPK95YHvO0DpA==} - engines: {node: '>= 0.9.0'} - - gulp-cli@2.3.0: - resolution: {integrity: sha512-zzGBl5fHo0EKSXsHzjspp3y5CONegCm8ErO5Qh0UzFzk2y4tMvzLWhoDokADbarfZRL2pGpRp7yt6gfJX4ph7A==} - engines: {node: '>= 0.10'} - hasBin: true - - gulp-concat@2.6.1: - resolution: {integrity: sha512-a2scActrQrDBpBbR3WUZGyGS1JEPLg5PZJdIa7/Bi3GuKAmPYDK6SFhy/NZq5R8KsKKFvtfR0fakbUCcKGCCjg==} - engines: {node: '>= 0.10'} - - gulp-each@0.5.0: - resolution: {integrity: sha512-QGmidwHgL/o3opLQdbO9XE6urU6UsVBeasuW7eXbdc1RYwNzOxZv+SaXXrkYp0xzesNX1NWWuc85PsHOPpcLwA==} - - gulp-eol@0.2.0: - resolution: {integrity: sha512-YaUQld+7A3h1iOHs7XTdEboYUg8GjA+3DmWtgvZ9sb1r0tDpB27cTtgaoD83oTm9Mp2Hmwge6AQMqPxwUjQ/xA==} - - gulp-eslint-new@2.4.0: - resolution: {integrity: sha512-LtuedFIlZS95LcFptwI6SGIkcsh7CsAigpx2z4IbMchGUPHrDUlZde8gNxXNmLR54qBbS+q8AdHC0JWc5DfmOg==} - engines: {node: ^12.20 || ^14.13 || >=16} - - gulp-file@0.4.0: - resolution: {integrity: sha512-3NPCJpAPpbNoV2aml8T96OK3Aof4pm4PMOIa1jSQbMNSNUUXdZ5QjVgLXLStjv0gg9URcETc7kvYnzXdYXUWug==} - - gulp-filter@7.0.0: - resolution: {integrity: sha512-ZGWtJo0j1mHfP77tVuhyqem4MRA5NfNRjoVe6VAkLGeQQ/QGo2VsFwp7zfPTGDsd1rwzBmoDHhxpE6f5B3Zuaw==} - engines: {node: '>=12'} - peerDependencies: - gulp: '>=4' - peerDependenciesMeta: - gulp: - optional: true - - gulp-flatmap@1.0.2: - resolution: {integrity: sha512-xm+Ax2vPL/xiMBqLFI++wUyPtncm3b55ztGHewmRcoG/sYb0OUTatjSacOud3fee77rnk+jOgnDEHhwBtMHgFA==} - engines: {node: '>=0.10.0'} - - gulp-footer@2.1.0: - resolution: {integrity: sha512-CK3nRBP3PG59XN2L1rDLkBHA7goYsW+tJuVQccLP9jq3mpBT2kuRq0ImgNjrUkDbF948aCVQH4J7uIEqiZ2MHA==} - - gulp-header@2.0.9: - resolution: {integrity: sha512-LMGiBx+qH8giwrOuuZXSGvswcIUh0OiioNkUpLhNyvaC6/Ga8X6cfAeme2L5PqsbXMhL8o8b/OmVqIQdxprhcQ==} - - gulp-if@3.0.0: - resolution: {integrity: sha512-fCUEngzNiEZEK2YuPm+sdMpO6ukb8+/qzbGfJBXyNOXz85bCG7yBI+pPSl+N90d7gnLvMsarthsAImx0qy7BAw==} - - gulp-json-editor@2.6.0: - resolution: {integrity: sha512-Ni0ZUpNrhesHiTlHQth/Nv1rXCn0LUicEvzA5XuGy186C4PVeNoRjfuAIQrbmt3scKv8dgGbCs0hd77ScTw7hA==} - - gulp-match@1.1.0: - resolution: {integrity: sha512-DlyVxa1Gj24DitY2OjEsS+X6tDpretuxD6wTfhXE/Rw2hweqc1f6D/XtsJmoiCwLWfXgR87W9ozEityPCVzGtQ==} - - gulp-multi-process@1.4.0: - resolution: {integrity: sha512-t6vq367MOGUOKeHtzoklVYSXlWoRwIr7/FPVNVfzVhO82mktUTdHMA+rxdnnImtnEZ8qfjmAWNDyogNiE40lww==} - - gulp-notify@4.0.0: - resolution: {integrity: sha512-0cdDvZkHVqu4tqrcOI/jL5YdxYEIPQ7+p3YxnO48w5hhPSisvogZ887qL+fpYItg9m4MUhJ5Se8p8xGy3uJESA==} - engines: {node: '>=0.8.0', npm: '>=1.2.10'} - - gulp-plumber@1.2.1: - resolution: {integrity: sha512-mctAi9msEAG7XzW5ytDVZ9PxWMzzi1pS2rBH7lA095DhMa6KEXjm+St0GOCc567pJKJ/oCvosVAZEpAey0q2eQ==} - engines: {node: '>=0.10', npm: '>=1.2.10'} - - gulp-rename@1.4.0: - resolution: {integrity: sha512-swzbIGb/arEoFK89tPY58vg3Ok1bw+d35PfUNwWqdo7KM4jkmuGA78JiDNqR+JeZFaeeHnRg9N7aihX3YPmsyg==} - engines: {node: '>=4'} - - gulp-replace@0.6.1: - resolution: {integrity: sha512-njH1QkwIsipEmLRh+LBBYJNa41PZRFjRx1zgkMkU+MR4Ftv/4ZtPvbS4PZA7XU6DB/G47JJD0ub/zA7FSfWNMw==} - engines: {node: '>=0.10'} - - gulp-sass@6.0.1: - resolution: {integrity: sha512-4wonidxB8lGPHvahelpGavUBJAuERSl+OIVxPCyQthK4lSJhZ/u3/qjFcyAtnMIXDl6fXTn34H4BXsN7gt54kQ==} - engines: {node: '>=12'} - - gulp-shell@0.8.0: - resolution: {integrity: sha512-wHNCgmqbWkk1c6Gc2dOL5SprcoeujQdeepICwfQRo91DIylTE7a794VEE+leq3cE2YDoiS5ulvRfKVIEMazcTQ==} - engines: {node: '>=10.0.0'} - - gulp-tap@1.0.1: - resolution: {integrity: sha512-VpCARRSyr+WP16JGnoIg98/AcmyQjOwCpQgYoE35CWTdEMSbpgtAIK2fndqv2yY7aXstW27v3ZNBs0Ltb0Zkbg==} - - gulp-template@5.0.0: - resolution: {integrity: sha512-BsE+HrFZG0ItM0fBhRMfqWWR5MQ2W3O3ss1T3XdNqi4p9WCIFYjcdI1L5PikXMNUU93A4NoVLeWPwUmqGAKwGA==} - engines: {node: '>=4'} - - gulp-typescript@5.0.1: - resolution: {integrity: sha512-YuMMlylyJtUSHG1/wuSVTrZp60k1dMEFKYOvDf7OvbAJWrDtxxD4oZon4ancdWwzjj30ztiidhe4VXJniF0pIQ==} - engines: {node: '>= 8'} - peerDependencies: - typescript: ~2.7.1 || >=2.8.0-dev || >=2.9.0-dev || ~3.0.0 || >=3.0.0-dev || >=3.1.0-dev || >= 3.2.0-dev || >= 3.3.0-dev - - gulp-watch@5.0.1: - resolution: {integrity: sha512-HnTSBdzAOFIT4wmXYPDUn783TaYAq9bpaN05vuZNP5eni3z3aRx0NAKbjhhMYtcq76x4R1wf4oORDGdlrEjuog==} - - gulp@4.0.2: - resolution: {integrity: sha512-dvEs27SCZt2ibF29xYgmnwwCYZxdxhQ/+LFWlbAW8y7jt68L/65402Lz3+CKy0Ov4rOs+NERmDq7YlZaDqUIfA==} - engines: {node: '>= 0.10'} - hasBin: true - - gulplog@1.0.0: - resolution: {integrity: sha512-hm6N8nrm3Y08jXie48jsC55eCZz9mnb4OirAStEk2deqeyhXU3C1otDVh+ccttMuc1sBi6RX6ZJ720hs9RCvgw==} - engines: {node: '>= 0.10'} - handle-thing@2.0.1: resolution: {integrity: sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==} @@ -11389,10 +10859,6 @@ packages: resolution: {integrity: sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==} engines: {node: '>=0.10.0'} - homedir-polyfill@1.0.3: - resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} - engines: {node: '>=0.10.0'} - hono@4.12.25: resolution: {integrity: sha512-2NFaIyNVgJmBs/ecmtGzlmluTFs5cHEWGTdu0t1HBwYzoGXOL5nUQBRMXsXWla5i4KkG//QMzVP88m1+I3fdAQ==} engines: {node: '>=16.9.0'} @@ -11732,10 +11198,6 @@ packages: intl@1.2.5: resolution: {integrity: sha512-rK0KcPHeBFBcqsErKSpvZnrOmWOj+EmDkyJ57e90YWaQNqbcivcqmKDlHEeNprDWOsKzPsh1BfSpPQdDvclHVw==} - invert-kv@1.0.0: - resolution: {integrity: sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==} - engines: {node: '>=0.10.0'} - iobuffer@5.4.0: resolution: {integrity: sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==} @@ -11751,10 +11213,6 @@ packages: resolution: {integrity: sha512-9VGk3HGanVE6JoZXHiCpnGy5X0jYDnN4EA4lntFPj+1vIWlFhIylq2CrrCOJH9EAhc5CYhq18F2Av2tgoAPsYQ==} engines: {node: '>= 10'} - is-absolute@1.0.0: - resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} - engines: {node: '>=0.10.0'} - is-arguments@1.2.0: resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==} engines: {node: '>= 0.4'} @@ -11774,10 +11232,6 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} - is-binary-path@1.0.1: - resolution: {integrity: sha512-9fRVlXc0uCxEDj1nQzaWONSpbTfx0FmJfzHF7pwlI8DkWGoHBBea4Pg5Ky0ojwwxQmnSifgbKkI06Qv0Ljgj+Q==} - engines: {node: '>=0.10.0'} - is-binary-path@2.1.0: resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} engines: {node: '>=8'} @@ -11854,10 +11308,6 @@ packages: resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} engines: {node: '>=0.10.0'} - is-fullwidth-code-point@1.0.0: - resolution: {integrity: sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==} - engines: {node: '>=0.10.0'} - is-fullwidth-code-point@3.0.0: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} @@ -11882,10 +11332,6 @@ packages: resolution: {integrity: sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==} engines: {node: '>=0.10.0'} - is-glob@3.1.0: - resolution: {integrity: sha512-UFpDDrPgM6qpnFNI+rh/p3bUaq9hKLZN8bMUWzxmcnZVS3omf4IPK+BrewlnWjO1WmUsMYuSjKh4UJuV4+Lqmw==} - engines: {node: '>=0.10.0'} - is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -11914,10 +11360,6 @@ packages: is-module@1.0.0: resolution: {integrity: sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==} - is-negated-glob@1.0.0: - resolution: {integrity: sha512-czXVVn/QEmgvej1f50BZ648vUI+em0xqMq2Sn+QncCLN4zj1UAxlT+kw/6ggQTOaZPd1HqKQGEqbpQVtJucWug==} - engines: {node: '>=0.10.0'} - is-negative-zero@2.0.3: resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} engines: {node: '>= 0.4'} @@ -11930,10 +11372,6 @@ packages: resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==} engines: {node: '>= 0.4'} - is-number@4.0.0: - resolution: {integrity: sha512-rSklcAIlf1OmFdyAqbnWTLVelsQ58uvZ66S/ZyawjWqIviTWCjg2PzVGw8WUA+nNuPTqb4wgA+NszrJ+08LlgQ==} - engines: {node: '>=0.10.0'} - is-number@7.0.0: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} @@ -12000,10 +11438,6 @@ packages: resolution: {integrity: sha512-i1h+y50g+0hRbBD+dbnInl3JlJ702aar58snAeX+MxBAPvzXGej7sYoPMhlnykabt0ZzCJNBEyzMlekuQZN7fA==} deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. - is-relative@1.0.0: - resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} - engines: {node: '>=0.10.0'} - is-set@2.0.3: resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} engines: {node: '>= 0.4'} @@ -12032,10 +11466,6 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} - is-unc-path@1.0.0: - resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} - engines: {node: '>=0.10.0'} - is-unicode-supported@0.1.0: resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} engines: {node: '>=10'} @@ -12058,10 +11488,6 @@ packages: is-utf8@0.2.1: resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==} - is-valid-glob@1.0.0: - resolution: {integrity: sha512-AhiROmoEFDSsjx8hW+5sGwgKVIORcXnrlAx/R0ZSeaPw70Vw0CqkGBBhHGL58Uox2eXnU1AnvXJl1XlyedO5bA==} - engines: {node: '>=0.10.0'} - is-weakmap@2.0.2: resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} engines: {node: '>= 0.4'} @@ -12081,10 +11507,6 @@ packages: resolution: {integrity: sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==} engines: {node: '>=12.13'} - is-windows@1.0.2: - resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} - engines: {node: '>=0.10.0'} - is-wsl@2.2.0: resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} engines: {node: '>=8'} @@ -12093,13 +11515,6 @@ packages: resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} engines: {node: '>=16'} - is@3.3.2: - resolution: {integrity: sha512-a2xr4E3s1PjDS8ORcGgXpWx6V+liNs+O3JRD2mb9aeugD7rtkkZ0zgLdYgw0tWsKhsdiezGYptSiMlVazCBTuQ==} - engines: {node: '>= 0.4'} - - isarray@0.0.1: - resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} - isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -12149,10 +11564,6 @@ packages: resolution: {integrity: sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==} engines: {node: '>=8'} - istextorbinary@1.0.2: - resolution: {integrity: sha512-qZ5ptUDuni2pdCngFTraYa5kalQ0mX47Mhn08tT0DZZv/7yhX1eMb9lFtXVbWhFtgRtpLG/UdqVAjh9teO5x+w==} - engines: {node: '>=0.4'} - iterator.prototype@1.1.5: resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==} engines: {node: '>= 0.4'} @@ -12651,9 +12062,6 @@ packages: jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - just-debounce@1.1.0: - resolution: {integrity: sha512-qpcRocdkUmf+UTNBYx5w6dexX5J31AKK1OmPwH630a83DdVVUIngk55RSAiIGpQyoH0dlr872VHfPjnQnK1qDQ==} - just-extend@6.2.0: resolution: {integrity: sha512-cYofQu2Xpom82S6qD778jBDpwvvy39s1l/hrYij2u9AMdQcGRpaBu6kY4mVhuno5kJVi1DAz4aiphA2WI1/OAw==} @@ -12703,14 +12111,6 @@ packages: keyv@5.6.0: resolution: {integrity: sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==} - kind-of@1.1.0: - resolution: {integrity: sha512-aUH6ElPnMGon2/YkxRIigV32MOpTVcoXQ1Oo8aYn40s+sJ3j+0gFZsT8HKDcxNy7Fi9zuquWtGaGAahOdv5p/g==} - engines: {node: '>=0.10.0'} - - kind-of@5.1.0: - resolution: {integrity: sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==} - engines: {node: '>=0.10.0'} - kind-of@6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} @@ -12745,33 +12145,13 @@ packages: resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} engines: {node: '>=0.10'} - last-run@1.1.1: - resolution: {integrity: sha512-U/VxvpX4N/rFvPzr3qG5EtLKEnNI0emvIQB3/ecEwv+8GHaUKbIB8vxv1Oai5FAF0d0r7LXHhLLe5K/yChm5GQ==} - engines: {node: '>= 0.10'} - launch-editor@2.14.1: resolution: {integrity: sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==} - lazypipe@1.0.2: - resolution: {integrity: sha512-CrU+NYdFHW8ElaeXCWz5IbmetiYVYq1fOCmpdAeZ8L+khbv1e7EnshyjlKqkO+pJbVPrsJQnHbVxEiLujG6qhQ==} - engines: {node: '>= 0.8.0'} - lazystream@1.0.1: resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} engines: {node: '>= 0.6.3'} - lcid@1.0.0: - resolution: {integrity: sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==} - engines: {node: '>=0.10.0'} - - lead@1.0.0: - resolution: {integrity: sha512-IpSVCk9AYvLHo5ctcIXxOBpMWUe+4TKN3VPWAKUbJikkmsGp0VrSM8IttVc32D6J4WUsiPE6aEFRNmIoF/gdow==} - engines: {node: '>= 0.10'} - - lead@4.0.0: - resolution: {integrity: sha512-DpMa59o5uGUWWjruMp71e6knmwKU3jRBBn1kjuLWN9EeIOxNeSAwvHf03WIl8g/ZMR2oSQC9ej3yeLBwdDc/pg==} - engines: {node: '>=10.13.0'} - less-loader@12.3.0: resolution: {integrity: sha512-0M6+uYulvYIWs52y0LqN4+QM9TqWAohYSNTo4htE8Z7Cn3G/qQMEmktfHmyJT23k+20kU9zHH2wrfFXkxNLtVw==} engines: {node: '>= 18.12.0'} @@ -12832,10 +12212,6 @@ packages: lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - liftoff@3.1.0: - resolution: {integrity: sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog==} - engines: {node: '>= 0.8'} - lightningcss-android-arm64@1.32.0: resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==} engines: {node: '>= 12.0.0'} @@ -12962,10 +12338,6 @@ packages: resolution: {integrity: sha512-9FKQA6G1MMtqNxfxvSBNXD/axeG2QRjYbNh0/ykRL5xYcRbCm2vXq7B9bhc7nSuKdHzr8/BHIwfPuYYH1UsXXw==} hasBin: true - load-json-file@1.1.0: - resolution: {integrity: sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==} - engines: {node: '>=0.10.0'} - loader-runner@4.3.1: resolution: {integrity: sha512-IWqP2SCPhyVFTBtRcgMHdzlf9ul25NwaFx4wCEH/KjAXuuHY4yNjvPXsBokp8jCB936PyWRaPKUNh8NvylLp2Q==} engines: {node: '>=6.11.5'} @@ -12994,9 +12366,6 @@ packages: resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} engines: {node: '>=10'} - lodash._reinterpolate@3.0.0: - resolution: {integrity: sha512-xYHt68QRoYGjeeM/XOE1uJtvXQAgvszfBhjV4yvsQH0u2i9I6cI6c6/eG4Hh3UAOVn0y/xAXwmTzEay49Q//HA==} - lodash.clone@4.5.0: resolution: {integrity: sha512-GhrVeweiTD6uTmmn5hV/lzgCQhccwReIVRLHp7LT4SopOjqEZ5BbX8b5WWEtAKasjmy8hR7ZPwsYlxRCku5odg==} deprecated: This package is deprecated. Use structuredClone instead. @@ -13007,9 +12376,6 @@ packages: lodash.debounce@4.0.8: resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} - lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - lodash.escaperegexp@4.1.2: resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} @@ -13044,13 +12410,6 @@ packages: lodash.some@4.6.0: resolution: {integrity: sha512-j7MJE+TuT51q9ggt4fSgVqro163BEFjAt3u97IqU+JA2DkWl80nFTrowzLpZ/BnpN7rrl0JA/593NAdd8p/scQ==} - lodash.template@4.18.1: - resolution: {integrity: sha512-5urZrLnV/VD6zHK5KsVtZgt7H19v51mIzoS0aBNH8yp3I8tbswrEjOABOPY8m8uB7NuibubLrMX+Y0PXsU9X+w==} - deprecated: This package is deprecated. Use https://socket.dev/npm/package/eta instead. - - lodash.templatesettings@4.2.0: - resolution: {integrity: sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==} - lodash.truncate@4.4.2: resolution: {integrity: sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==} @@ -13173,30 +12532,15 @@ packages: resolution: {integrity: sha512-uCbIa8jWWmQZt4dSnEStkVC6gdakiinAm4PiGsywIkguF0eWMdcjDz0ECYhUolFU3pFLOev9VNPCEygydXnddg==} engines: {node: ^20.17.0 || >=22.9.0} - make-iterator@1.0.1: - resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} - engines: {node: '>=0.10.0'} - make-synchronized@0.8.0: resolution: {integrity: sha512-DZu4lwc0ffoFz581BSQa/BJl+1ZqIkoRQ+VejMlH0VrP4E86StAODnZujZ4sepumQj8rcP7wUnUBGM8Gu+zKUA==} makeerror@1.0.12: resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - map-cache@0.2.2: - resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} - engines: {node: '>=0.10.0'} - - map-stream@0.0.7: - resolution: {integrity: sha512-C0X0KQmGm3N2ftbTGBhSyuydQ+vV1LC3f3zPvT3RXHXNZrvfPZcoXp/N5DOa8vedX/rTMm2CjTtivFg2STJMRQ==} - match-url-wildcard@0.0.4: resolution: {integrity: sha512-R1XhQaamUZPWLOPtp4ig5j+3jctN+skhgRmEQTUamMzmNtRG69QEirQs0NZKLtHMR7tzWpmtnS4Eqv65DcgXUA==} - matchdep@2.0.0: - resolution: {integrity: sha512-LFgVbaHIHMqCRuCZyfCtUOq9/Lnzhi7Z0KFUE2fhD54+JN2jLh3hC02RLkqauJ3U4soU6H1J3tfj/Byk7GoEjA==} - engines: {node: '>= 0.10.0'} - math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -13553,10 +12897,6 @@ packages: resolution: {integrity: sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==} hasBin: true - multimatch@5.0.0: - resolution: {integrity: sha512-ypMKuglUrZUD99Tk2bUQ+xNQj43lPEfAeX2o9cTteAmShXy2VHDJpuwu1o0xqoKCt9jLVAvwyFKdLTPXKAfJyA==} - engines: {node: '>=10'} - mustache@2.3.2: resolution: {integrity: sha512-KpMNwdQsYz3O/SBS1qJ/o3sqUJ5wSb8gb0pul8CO0S56b9Y2ALm8zCfsjPXsqGFfoNBkDwZuZIAjhsZI03gYVQ==} engines: {npm: '>=1.4.0'} @@ -13566,10 +12906,6 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true - mute-stdout@1.0.1: - resolution: {integrity: sha512-kDcwXR4PS7caBpuRYYBUz9iVixUk3anO3f5OYFiIPwK/20vCzKCHyKoulbiDY1S53zD2bxUpxN/IJ+TnXjfvxg==} - engines: {node: '>= 0.10'} - mute-stream@2.0.0: resolution: {integrity: sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==} engines: {node: ^18.17.0 || >=20.5.0} @@ -13582,9 +12918,6 @@ packages: resolution: {integrity: sha512-BzQguy9W9NJgoVn2mRWzbFrFWWztGCcng2QI9+41frfk+Athwgx3qhqhvStz7ExeUUu7Kzw427sNzHpEZNINog==} engines: {node: '>=16.0.0'} - nan@2.26.2: - resolution: {integrity: sha512-0tTvBTYkt3tdGw22nrAy50x7gpbGCCFH3AFcyS5WiUu7Eu4vWlri1woE6qHBSfy11vksDqkiwjOnlR7WV8G1Hw==} - nanoid@3.3.12: resolution: {integrity: sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -13717,18 +13050,10 @@ packages: resolution: {integrity: sha512-jn9vOIK/nfqoFCcpK89/VCVaLg1IHE6UVfDOzvqmANaJ/rWCTEdH8RZ1V278nv2jr36BJdyQXIAavBLXpzdlag==} engines: {node: '>=14'} - node-stream@1.7.0: - resolution: {integrity: sha512-AB1qHzJWjAuxpDvTr/n1wvKVOg8c9BjAHV21QXq+q9yEUNr7wSqfHmAhAzvpQWSbf8mQQle3fjsnu3R14jrElA==} - engines: {node: '>=0.12'} - node-watch@0.7.3: resolution: {integrity: sha512-3l4E8uMPY1HdMMryPRUAl+oIHtXtyiTlIiESNSVSNxcPfzAFzeTbXFQkZfAwBbo0B1qMSG8nUABx+Gd+YrbKrQ==} engines: {node: '>=6'} - node.extend@2.0.3: - resolution: {integrity: sha512-xwADg/okH48PvBmRZyoX8i8GJaKuJ1CqlqotlZOhUio8egD1P5trJupHKBzcPjSF9ifK2gPcEICRBnkfPqQXZw==} - engines: {node: '>=0.4.0'} - nopt@3.0.6: resolution: {integrity: sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==} hasBin: true @@ -13746,10 +13071,6 @@ packages: normalize-package-data@2.5.0: resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} - normalize-path@2.1.1: - resolution: {integrity: sha512-3pKJwH184Xo/lnH6oyP1q2pMd7HcypqqmRs91/6/i2CGtWwIKGCkOOMTm/zXbgTEWHw1uNpNi/igc3ePOYHb6w==} - engines: {node: '>=0.10.0'} - normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} @@ -13758,14 +13079,6 @@ packages: resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} engines: {node: '>=0.10.0'} - now-and-later@2.0.1: - resolution: {integrity: sha512-KGvQ0cB70AQfg107Xvs/Fbu+dGmZoTRJp2TaPwcwQm3/7PteUyN2BCgk8KBMPGBUXZdVwyWS8fDCGFygBm19UQ==} - engines: {node: '>= 0.10'} - - now-and-later@3.0.0: - resolution: {integrity: sha512-pGO4pzSdaxhWTGkfSfHx3hVzJVslFPwBp2Myq9MYN/ChfJZF87ochMAXnvz6/58RJSf5ik2q9tXprBBrk2cpcg==} - engines: {node: '>= 10.13.0'} - npm-bundled@5.0.0: resolution: {integrity: sha512-JLSpbzh6UUXIEoqPsYBvVNVmyrjVZ1fzEFbqxKkTJQkWBO3xFzFT+KDnSKQWwOQNbuWRwt5LSD6HOTLGIWzfrw==} engines: {node: ^20.17.0 || >=22.9.0} @@ -13817,10 +13130,6 @@ packages: nullthrows@1.1.1: resolution: {integrity: sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==} - number-is-nan@1.0.1: - resolution: {integrity: sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==} - engines: {node: '>=0.10.0'} - nwsapi@2.2.23: resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==} @@ -13848,9 +13157,6 @@ packages: resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==} engines: {node: '>= 0.4'} - object-keys@0.4.0: - resolution: {integrity: sha512-ncrLw+X55z7bkl5PnUvHwFK9FcGuFYo9gtjws2XtSzL+aZ8tm830P60WJ0dSmFVaSalWieW5MD7kEdnXda9yJw==} - object-keys@1.1.1: resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} engines: {node: '>= 0.4'} @@ -13859,10 +13165,6 @@ packages: resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==} engines: {node: '>= 0.4'} - object.defaults@1.1.0: - resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} - engines: {node: '>=0.10.0'} - object.entries@1.1.9: resolution: {integrity: sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==} engines: {node: '>= 0.4'} @@ -13875,18 +13177,6 @@ packages: resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} engines: {node: '>= 0.4'} - object.map@1.0.1: - resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} - engines: {node: '>=0.10.0'} - - object.pick@1.3.0: - resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} - engines: {node: '>=0.10.0'} - - object.reduce@1.0.1: - resolution: {integrity: sha512-naLhxxpUESbNkRqc35oQ2scZSJueHGQNUfMW/0U37IgN6tE2dgDWg3whf+NEliy3F/QysrO48XKUz/nGPe+AQw==} - engines: {node: '>=0.10.0'} - object.values@1.2.1: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} @@ -13988,9 +13278,6 @@ packages: ordered-binary@1.6.1: resolution: {integrity: sha512-QkCdPooczexPLiXIrbVOPYkR3VO3T6v2OyKRkR1Xbhpy7/LAVXwahnRCgRp78Oe/Ehf0C/HATAxfSr6eA1oX+w==} - ordered-read-streams@1.0.1: - resolution: {integrity: sha512-Z87aSjx3r5c0ZB7bcJqIgIRX5bxR7A4aSzvIbaxd0oTkWBCOoKfuGHiKj60CHVUgg1Phm5yMZzBdt8XqRs73Mw==} - os-browserify@0.3.0: resolution: {integrity: sha512-gjcpUc3clBf9+210TRaDWbf+rZZZEshZ+DlXMRCeAjp0xhTrnQsKHypIy1J3d5hKdUzj69t708EHtU8P6bUn0A==} @@ -14001,10 +13288,6 @@ packages: resolution: {integrity: sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==} engines: {node: '>=0.10.0'} - os-locale@1.4.0: - resolution: {integrity: sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==} - engines: {node: '>=0.10.0'} - os-tmpdir@1.0.2: resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} engines: {node: '>=0.10.0'} @@ -14101,14 +13384,6 @@ packages: parse-color@1.0.0: resolution: {integrity: sha512-fuDHYgFHJGbpGMgw9skY/bj3HL/Jrn4l/5rSspy00DoT4RyLnDcRvPxdZ+r6OFwIsgAuhDh4I09tAId4mI12bw==} - parse-filepath@1.0.2: - resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} - engines: {node: '>=0.8'} - - parse-json@2.2.0: - resolution: {integrity: sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==} - engines: {node: '>=0.10.0'} - parse-json@5.2.0: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} @@ -14117,10 +13392,6 @@ packages: resolution: {integrity: sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==} engines: {node: '>= 0.10'} - parse-passwd@1.0.0: - resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} - engines: {node: '>=0.10.0'} - parse5-html-rewriting-stream@8.0.0: resolution: {integrity: sha512-wzh11mj8KKkno1pZEu+l2EVeWsuKDfR5KNWZOTsslfUX8lPDZx77m9T0kIoAVkFtD1nx6YF8oh4BnPHvxMtNMw==} @@ -14161,13 +13432,6 @@ packages: path-browserify@1.0.1: resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-dirname@1.0.2: - resolution: {integrity: sha512-ALzNPpyNq9AqXMBjeymIjFDAkAFH06mHJH/cSBHAgU0s4vfpBn6b2nf8tiRLvagKD8RbTpq2FKTBg7cl9l3c7Q==} - - path-exists@2.1.0: - resolution: {integrity: sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==} - engines: {node: '>=0.10.0'} - path-exists@3.0.0: resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==} engines: {node: '>=4'} @@ -14198,14 +13462,6 @@ packages: resolution: {integrity: sha512-Y30dB6rab1A/nfEKsZxmr01nUotHX0c/ZiIAsCTatEe1CmS5Pm5He7fZ195bPT7RdquoaL8lLxFCMQi/bS7IJg==} engines: {node: '>= 0.8.0'} - path-root-regex@0.1.2: - resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} - engines: {node: '>=0.10.0'} - - path-root@0.1.1: - resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} - engines: {node: '>=0.10.0'} - path-scurry@1.11.1: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} @@ -14220,10 +13476,6 @@ packages: path-to-regexp@8.4.2: resolution: {integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==} - path-type@1.1.0: - resolution: {integrity: sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==} - engines: {node: '>=0.10.0'} - path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -14326,18 +13578,10 @@ packages: resolution: {integrity: sha512-B7+VDyb8Tl6oMJT9oSO2CW8XC/T4UcJGrwOVoNGwOQsQYhlpfajmrMj5xeejqaASq3V/EqThyOeATEOMuSEXiA==} engines: {node: '>=12'} - plugin-error@0.1.2: - resolution: {integrity: sha512-WzZHcm4+GO34sjFMxQMqZbsz3xiNEgonCskQ9v+IroMmYgk/tas8dG+Hr2D6IbRPybZ12oWpzE/w3cGJ6FJzOw==} - engines: {node: '>=0.10.0'} - plugin-error@1.0.1: resolution: {integrity: sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==} engines: {node: '>= 0.10'} - plugin-error@2.0.1: - resolution: {integrity: sha512-zMakqvIDyY40xHOvzXka0kUvf40nYIuwRE8dWhti2WtjQZ31xAgBZBhxsK7vK3QbRXS1Xms/LO7B5cuAsfB2Gg==} - engines: {node: '>=10.13.0'} - pluralize@8.0.0: resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} engines: {node: '>=4'} @@ -14575,15 +13819,9 @@ packages: public-encrypt@4.0.3: resolution: {integrity: sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==} - pump@2.0.1: - resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} - pump@3.0.4: resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} - pumpify@1.5.1: - resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} - punycode@1.4.1: resolution: {integrity: sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==} @@ -14766,24 +14004,10 @@ packages: read-only-stream@2.0.0: resolution: {integrity: sha512-3ALe0bjBVZtkdWKIcThYpQCLbBMd/+Tbh2CDSrAIDO3UsZ4Xs+tnyjv2MjCOMMgBG+AsUOeuP1cgtY1INISc8w==} - read-pkg-up@1.0.1: - resolution: {integrity: sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==} - engines: {node: '>=0.10.0'} - - read-pkg@1.1.0: - resolution: {integrity: sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==} - engines: {node: '>=0.10.0'} - read-pkg@5.2.0: resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} engines: {node: '>=8'} - read-vinyl-file-stream@2.0.3: - resolution: {integrity: sha512-ZbtobBf+n/va3eRcIkMDYsp7DCnnjh46YFOOdj42aCiWFirp9T/+YGMCTfVpEFIuiH3c5Kp13jpn3i5DoygxLw==} - - readable-stream@1.0.34: - resolution: {integrity: sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==} - readable-stream@2.3.8: resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} @@ -14798,10 +14022,6 @@ packages: readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - readdirp@2.2.1: - resolution: {integrity: sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==} - engines: {node: '>=0.10'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -14911,14 +14131,6 @@ packages: remark-stringify@10.0.3: resolution: {integrity: sha512-koyOzCMYoUHudypbj4XpnAKFbkddRMYZHwghnxd7ue5210WzGw6kOBwauJTRUMq16jsovXx8dYNvSSWP89kZ3A==} - remove-bom-buffer@3.0.0: - resolution: {integrity: sha512-8v2rWhaakv18qcvNeli2mZ/TMTL2nEyAKRvzo1WtnZBl15SHyEhrCu2/xKlJyUFKHiHgfXIyuY6g2dObJJycXQ==} - engines: {node: '>=0.10.0'} - - remove-bom-stream@1.2.0: - resolution: {integrity: sha512-wigO8/O08XHb8YPzpDDT+QmRANfW6vLqxfaXm1YXhnFf3AkSLyjfG3GEFg4McZkmgL7KvCj5u2KczkvSP6NfHA==} - engines: {node: '>= 0.10'} - remove-trailing-separator@1.1.0: resolution: {integrity: sha512-/hS+Y0u3aOfIETiaiirUFwDBDzmXPvO+jAfKTitUngIPzdKc6Z0LoFjM/CK5PL4C+eKwHohlHAb6H0VFfmmUsw==} @@ -14934,25 +14146,10 @@ packages: resolution: {integrity: sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==} engines: {node: '>=0.10.0'} - replace-ext@0.0.1: - resolution: {integrity: sha512-AFBWBy9EVRTa/LhEcG8QDP3FvpwZqmvN2QFDuJswFeaVhWnZMp8q3E6Zd90SR04PlIwfGdyVjNyLPyen/ek5CQ==} - engines: {node: '>= 0.4'} - replace-ext@1.0.1: resolution: {integrity: sha512-yD5BHCe7quCgBph4rMQ+0KkIRKwWCrHDOX1p1Gp6HwjPM5kVoCdKGNhN7ydqqsX6lJEnQDKZ/tFMiEdQ1dvPEw==} engines: {node: '>= 0.10'} - replace-ext@2.0.0: - resolution: {integrity: sha512-UszKE5KVK6JvyD92nzMn9cDapSk6w/CaFZ96CnmDMUqH9oowfxF/ZjRITD25H4DnOQClLA4/j7jLGXXLVKxAug==} - engines: {node: '>= 10'} - - replace-homedir@1.0.0: - resolution: {integrity: sha512-CHPV/GAglbIB1tnQgaiysb8H2yCy8WQ7lcEwQ/eT+kLj0QHV8LnJW0zpqpE7RSkrMSRoa+EBoag86clf7WAgSg==} - engines: {node: '>= 0.10'} - - replacestream@4.0.3: - resolution: {integrity: sha512-AC0FiLS352pBBiZhd4VXB1Ab/lh0lEgpP+GGvZqbQh8a5cmXVoTe5EX/YeTFArnp4SRGTHh1qCHu9lGs1qG8sA==} - require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -14961,9 +14158,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-main-filename@1.0.1: - resolution: {integrity: sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==} - requireindex@1.2.0: resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} engines: {node: '>=0.10.5'} @@ -14995,10 +14189,6 @@ packages: resolution: {integrity: sha512-Tz7zfjhLfsvR39ADOSk9us4421J/1ztVBo4rWUkF38hgHK5m0OCZ3NxFVpqHRkjctnwVa15igEUHFJp8MCS7vA==} engines: {node: '>=14'} - resolve-dir@1.0.1: - resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} - engines: {node: '>=0.10.0'} - resolve-from@2.0.0: resolution: {integrity: sha512-qpFcKaXsq8+oRoLilkwyc7zHGF5i9Q2/25NIgLQQ/+VVv9rU4qvr6nXVAw1DsnXJyQkZsR4Ytfbtg5ehfcUssQ==} engines: {node: '>=0.10.0'} @@ -15011,14 +14201,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - resolve-options@1.1.0: - resolution: {integrity: sha512-NYDgziiroVeDC29xq7bp/CacZERYsA9bXYd1ZmcJlF3BcrZv5pTb4NG7SjdyKDnXZ84aC4vo2u6sNKIA1LCu/A==} - engines: {node: '>= 0.10'} - - resolve-options@2.0.0: - resolution: {integrity: sha512-/FopbmmFOQCfsCx77BRFdKOniglTiHumLgwvd6IDPihy1GKkadZbgQJBcTb2lMzSR1pndzd96b1nZrreZ7+9/A==} - engines: {node: '>= 10.13.0'} - resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} @@ -15396,10 +14578,6 @@ packages: resolution: {integrity: sha512-ftnu3TW4+3eBfLRFnDEkzGxSF/10BJBkaLJuBHZX0kiPS7bRdlpZGu6YGt4KngMkdTwJE6MbjavFpqHvqVt+Ew==} engines: {node: '>=18'} - semver-greatest-satisfied-range@1.1.0: - resolution: {integrity: sha512-Ny/iyOzSSa8M5ML46IAx3iXc6tfOsYU2R4AXi2UpHk60Zrgyq6eqPj/xiOfS0rRl/iiQ/rdJkVjw/5cdUyCntQ==} - engines: {node: '>= 0.10'} - semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -15452,9 +14630,6 @@ packages: resolution: {integrity: sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==} engines: {node: '>= 18'} - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-cookie-parser@2.7.2: resolution: {integrity: sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==} @@ -15664,10 +14839,6 @@ packages: space-separated-tokens@2.0.2: resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} - sparkles@1.0.1: - resolution: {integrity: sha512-dSO0DDYUahUt/0/pD/Is3VIm5TGJjludZ0HVymmhYF6eNA53PVLhnUk0znSYbH8IYBuJdCE+1luR22jNLMaQdw==} - engines: {node: '>= 0.10'} - spdx-correct@3.2.0: resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} @@ -15690,9 +14861,6 @@ packages: resolution: {integrity: sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==} engines: {node: '>=6.0.0'} - split2@2.2.0: - resolution: {integrity: sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==} - ssri@13.0.1: resolution: {integrity: sha512-QUiRf1+u9wPTL/76GTYlKttDEBWV1ga9ZXW8BG6kfdeyyM8LGPix9gROyg9V2+P0xNyF3X2Go526xKFdMZrHSQ==} engines: {node: ^20.17.0 || >=22.9.0} @@ -15746,28 +14914,12 @@ packages: stream-combiner2@1.1.1: resolution: {integrity: sha512-3PnJbYgS56AeWgtKF5jtJRT6uFJe56Z0Hc5Ngg/6sI6rIt8iiMBTa9cvdyFfpMQjaVHr8dusbNeFGIIonxOvKw==} - stream-combiner@0.2.2: - resolution: {integrity: sha512-6yHMqgLYDzQDcAkL+tjJDC5nSNuNIx0vZtRZeiPh7Saef7VHX9H5Ijn9l2VIol2zaNYlYEX6KyuT/237A58qEQ==} - - stream-composer@1.0.2: - resolution: {integrity: sha512-bnBselmwfX5K10AH6L4c8+S5lgZMWI7ZYrz2rvYjCPB2DIMC4Ig8OpxGpNJSxRZ58oti7y1IcNvjBAz9vW5m4w==} - - stream-exhaust@1.0.2: - resolution: {integrity: sha512-b/qaq/GlBK5xaq1yrK9/zFcyRSTNxmcZwFLGSTG0mXgZl/4Z6GgiyYOXOvY7N3eEvFRAG1bkDRz5EPGSvPYQlw==} - stream-http@3.2.0: resolution: {integrity: sha512-Oq1bLqisTyK3TSCXpPbT4sdeYNdmyZJv1LxpEm2vu1ZhK89kSE5YXwZc3cWk0MagGaKriBh9mCFbVGtO+vY29A==} - stream-shift@1.0.3: - resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - stream-splicer@2.0.1: resolution: {integrity: sha512-Xizh4/NPuYSyAXyT7g8IvdJ9HJpxIGL9PjyhtywCZvvP0OPIdqyrr4dMikeuvY8xahpdKEBlBTySe583totajg==} - streamfilter@3.0.0: - resolution: {integrity: sha512-kvKNfXCmUyC8lAXSSHCIXBUlo/lhsLcCU/OmzACZYpRUdtKIH68xYhm/+HI15jFJYtNJGYtCgn2wmIiExY1VwA==} - engines: {node: '>=8.12.0'} - streamroller@3.1.5: resolution: {integrity: sha512-KFxaM7XT+irxvdqSP1LGLgNWbYN7ay5owZ3r/8t77p+EtSUAfUgtl7be3xtqtOmGUl9K9YPO2ca8133RlTjvKw==} engines: {node: '>=8.0'} @@ -15783,10 +14935,6 @@ packages: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} - string-width@1.0.2: - resolution: {integrity: sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==} - engines: {node: '>=0.10.0'} - string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -15829,9 +14977,6 @@ packages: resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} engines: {node: '>= 0.4'} - string_decoder@0.10.31: - resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} - string_decoder@1.1.1: resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} @@ -15857,10 +15002,6 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} - strip-bom-stream@2.0.0: - resolution: {integrity: sha512-yH0+mD8oahBZWnY43vxs4pSinn8SMKAdml/EOGBewoe1Y0Eitd0h2Mg3ZRiXruUW6L4P+lvZiEgbh0NgUGia1w==} - engines: {node: '>=0.10.0'} - strip-bom@2.0.0: resolution: {integrity: sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==} engines: {node: '>=0.10.0'} @@ -16021,9 +15162,6 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - sver-compat@1.5.0: - resolution: {integrity: sha512-aFTHfmjwizMNlNE6dsGmoAM4lHjL0CyiobWaFiXWSlD7cIxshW422Nb8KbXCmR6z+0ZEPY+daXJrDyh/vuwTyg==} - svg-pathdata@6.0.3: resolution: {integrity: sha512-qsjeeq5YjBZ5eMdFuUa4ZosMLxgr5RZ+F+Y1OrDhuOCEInRMA3x74XdBtggJcj9kOeInz0WE+LgCPDkZFlBYJw==} engines: {node: '>=12.0.0'} @@ -16105,9 +15243,6 @@ packages: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} engines: {node: '>=8'} - ternary-stream@3.0.0: - resolution: {integrity: sha512-oIzdi+UL/JdktkT+7KU5tSIQjj8pbShj3OASuvDEhm0NT5lppsm7aXWAmAq4/QMaBIyfuEcNLbAQA+HpaISobQ==} - terser-webpack-plugin@5.3.17: resolution: {integrity: sha512-YR7PtUp6GMU91BgSJmlaX/rS2lGDbAF7D+Wtq7hRO+MiljNmodYvqslzCFiYVAgW+Qoaaia/QUIP4lGXufjdZw==} engines: {node: '>= 10.13.0'} @@ -16195,36 +15330,15 @@ packages: text-segmentation@1.0.3: resolution: {integrity: sha512-iOiPUo/BGnZ6+54OsWxZidGCsdU8YbE4PSpdPinp7DeMtUJNJBoJ/ouUSTJjHkh1KntHaltHl/gDs2FC4i5+Nw==} - textextensions@1.0.2: - resolution: {integrity: sha512-jm9KjEWiDmtGLBrTqXEduGzlYTTlPaoDKdq5YRQhD0rYjo61ZNTYKZ/x5J4ajPSBH9wIYY5qm9GNG5otIKjtOA==} - thingies@2.6.0: resolution: {integrity: sha512-rMHRjmlFLM1R96UYPvpmnc3LYtdFrT33JIB7L9hetGue1qAPfn1N2LJeEjxUSidu1Iku+haLZXDuEXUHNGO/lg==} engines: {node: '>=10.18'} peerDependencies: tslib: ^2 - through2-filter@3.0.0: - resolution: {integrity: sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==} - - through2@0.4.2: - resolution: {integrity: sha512-45Llu+EwHKtAZYTPPVn3XZHBgakWMN3rokhEv5hu596XP+cNgplMg+Gj+1nmAvj+L0K7+N49zBKx5rah5u0QIQ==} - - through2@2.0.3: - resolution: {integrity: sha512-tmNYYHFqXmaKSSlOU4ZbQ82cxmFQa5LRWKFtWCNkGIiZ3/VHmOffCeWfBRZZRyXAhNP9itVMR+cuvomBOPlm8g==} - through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} - through2@3.0.1: - resolution: {integrity: sha512-M96dvTalPT3YbYLaKaCuwu+j06D/8Jfib0o/PxbVt6Amhv3dUAtW6rTV1jPgJSBG83I/e04Y6xkVdVhSRhi0ww==} - - through2@3.0.2: - resolution: {integrity: sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==} - - through2@4.0.2: - resolution: {integrity: sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==} - through@2.3.8: resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} @@ -16279,10 +15393,6 @@ packages: tmpl@1.0.5: resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - to-absolute-glob@2.0.2: - resolution: {integrity: sha512-rtwLUQEwT8ZeKQbyFJyomBRYXyE16U5VKuy0ftxLMK/PZb2fkOsg5r9kHdauuVDbsNdIBoC/HCthpidamQFXYA==} - engines: {node: '>=0.10.0'} - to-buffer@1.2.2: resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} @@ -16295,14 +15405,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - to-through@2.0.0: - resolution: {integrity: sha512-+QIz37Ly7acM4EMdw2PRN389OneM5+d844tirkGp4dPKzI5OE72V9OsbFp+CIYJDahZ41ZV05hNtcPAQUAm9/Q==} - engines: {node: '>= 0.10'} - - to-through@3.0.0: - resolution: {integrity: sha512-y8MN937s/HVhEoBU1SxfHC+wxCHkV1a9gW8eAdTadYh/bGyesZIVcbjI+mSpFbSVwQici/XjBjuUyri1dnXwBw==} - engines: {node: '>=10.13.0'} - toidentifier@1.0.1: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} @@ -16592,22 +15694,10 @@ packages: resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==} engines: {node: '>= 0.4'} - unc-path-regex@0.1.2: - resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} - engines: {node: '>=0.10.0'} - undeclared-identifiers@1.1.3: resolution: {integrity: sha512-pJOW4nxjlmfwKApE4zvxLScM/njmwj/DiUBv7EabwE4O8kRUy+HIwxQtZLBPll/jx1LJyBcqNfB3/cpv9EZwOw==} hasBin: true - undertaker-registry@1.0.1: - resolution: {integrity: sha512-UR1khWeAjugW3548EfQmL9Z7pGMlBgXteQpr1IZeZBtnkCJQJIJ1Scj0mb9wQaPvUZ9Q17XqW6TIaPchJkyfqw==} - engines: {node: '>= 0.10'} - - undertaker@1.3.0: - resolution: {integrity: sha512-/RXwi5m/Mu3H6IHQGww3GNt1PNXlbeCuclF2QYR14L/2CHPz3DFZkvB5hZ0N/QUkiXWCACML2jXViIQEQc2MLg==} - engines: {node: '>= 0.10'} - undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -16644,9 +15734,6 @@ packages: resolution: {integrity: sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==} engines: {node: '>= 0.8.0'} - unique-stream@2.4.0: - resolution: {integrity: sha512-V6QarSfeSgDipGA9EZdoIzu03ZDlOFkk+FbEP5cwgrZXN3iIkYR91IjU2EnM6rB835kGQsqHX8qncObTXV+6KA==} - unist-util-find-after@4.0.1: resolution: {integrity: sha512-QO/PuPMm2ERxC6vFXEPtmAutOopy5PknD+Oq64gGwxKtk4xwo9Z97t9Av1obPmGU0IyTa6EKYUfTrK2QJS3Ozw==} @@ -16704,10 +15791,6 @@ packages: unzipper@0.12.3: resolution: {integrity: sha512-PZ8hTS+AqcGxsaQntl3IRBw65QrBI6lxzqDEL7IAo/XCEqRTKGfOX56Vea5TH9SZczRVxuzk1re04z/YjuYCJA==} - upath@1.2.0: - resolution: {integrity: sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==} - engines: {node: '>=4'} - update-browserslist-db@1.2.3: resolution: {integrity: sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==} hasBin: true @@ -16784,10 +15867,6 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - v8flags@3.2.0: - resolution: {integrity: sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg==} - engines: {node: '>= 0.10'} - validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} @@ -16799,14 +15878,6 @@ packages: resolution: {integrity: sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A==} engines: {node: ^20.17.0 || >=22.9.0} - value-or-function@3.0.0: - resolution: {integrity: sha512-jdBB2FrWvQC/pnPtIqcLsMaQgjhdb6B7tk1MMyTKapox+tQZbdRP4uLxu/JY0t7fbfDCUMnuelzEYv5GsxHhdg==} - engines: {node: '>= 0.10'} - - value-or-function@4.0.0: - resolution: {integrity: sha512-aeVK81SIuT6aMJfNo9Vte8Dw0/FZINGBV8BfCraGtqVxIeLAEhJyoWs8SmvRVmXfGss2PmmOwZCuBPbZR+IYWg==} - engines: {node: '>= 10.13.0'} - varint@6.0.0: resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==} @@ -16829,49 +15900,10 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vinyl-contents@2.0.0: - resolution: {integrity: sha512-cHq6NnGyi2pZ7xwdHSW1v4Jfnho4TEGtxZHw01cmnc8+i7jgR6bRnED/LbrKan/Q7CvVLbnvA5OepnhbpjBZ5Q==} - engines: {node: '>=10.13.0'} - - vinyl-file@2.0.0: - resolution: {integrity: sha512-44i5QVLwRPbiRyuiHJ+zJXooNNRXUUifdfYIC1Gm7YTlemMgYQrZ+q1LERS6AYAN8w0xe7n9OgjEYckQjR5+4g==} - engines: {node: '>=0.10.0'} - - vinyl-fs@3.0.3: - resolution: {integrity: sha512-vIu34EkyNyJxmP0jscNzWBSygh7VWhqun6RmqVfXePrOwi9lhvRs//dOaGOTRUQr4tx7/zd26Tk5WeSVZitgng==} - engines: {node: '>= 0.10'} - - vinyl-fs@4.0.2: - resolution: {integrity: sha512-XRFwBLLTl8lRAOYiBqxY279wY46tVxLaRhSwo3GzKEuLz1giffsOquWWboD/haGf5lx+JyTigCFfe7DWHoARIA==} - engines: {node: '>=10.13.0'} - - vinyl-named@1.1.0: - resolution: {integrity: sha512-ElYBnsSw8Y1Hz11WPw0DFmi+TBNTEBhZ9zXaHluDSIZZnkFIGCjGRBpsW5QmbMMLwv+lRpUD3VbKdJCbNpct7Q==} - engines: {node: '>= 0.10.0'} - - vinyl-sourcemap@1.1.0: - resolution: {integrity: sha512-NiibMgt6VJGJmyw7vtzhctDcfKch4e4n9TBeoWlirb7FMg9/1Ov9k+A5ZRAtywBpRPiyECvQRQllYM8dECegVA==} - engines: {node: '>= 0.10'} - - vinyl-sourcemap@2.0.0: - resolution: {integrity: sha512-BAEvWxbBUXvlNoFQVFVHpybBbjW1r03WhohJzJDSfgrrK5xVYIDTan6xN14DlyImShgDRv2gl9qhM6irVMsV0Q==} - engines: {node: '>=10.13.0'} - - vinyl-sourcemaps-apply@0.2.1: - resolution: {integrity: sha512-+oDh3KYZBoZC8hfocrbrxbLUeaYtQK7J5WU5Br9VqWqmCll3tFJqKp97GC9GmMsVIL0qnx2DgEDVxdo5EZ5sSw==} - - vinyl@1.2.0: - resolution: {integrity: sha512-Ci3wnR2uuSAWFMSglZuB8Z2apBdtOyz8CV7dC6/U1XbltXBC+IuutUkXQISz01P+US2ouBuesSbV6zILZ6BuzQ==} - engines: {node: '>= 0.9'} - vinyl@2.2.1: resolution: {integrity: sha512-LII3bXRFBZLlezoG5FfZVcXflZgWP/4dCwKtxd5ky9+LOtM4CS3bIRQsmR1KMnMW07jpE8fqR2lcxPZ+8sJIcw==} engines: {node: '>= 0.10'} - vinyl@3.0.1: - resolution: {integrity: sha512-0QwqXteBNXgnLCdWdvPQBX6FXRHtIH3VhJPTd5Lwn28tJXc34YqSCWUmkOvtJHBmB3gGoPtrOKk3Ts8/kEZ9aA==} - engines: {node: '>=10.13.0'} - vite@7.3.5: resolution: {integrity: sha512-KuOaNhcnGFN2zIPGA7wRmzF+lJA1sea7rHq17aiJ++9lzY1WWG6Jpwqwe1KNbRVPIqHmr8GLYx7jbrQcN/7/ww==} engines: {node: ^20.19.0 || >=22.12.0} @@ -17266,9 +16298,6 @@ packages: resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} engines: {node: '>= 0.4'} - which-module@1.0.0: - resolution: {integrity: sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==} - which-promise@1.0.0: resolution: {integrity: sha512-15ahjtDr3H+RBtTrvBcKhOFhIEiN3RZSCevDPWtBys+QUivZX9cYyNJcyWNIrUMVsgGrEuIThif9jxeEAQFauw==} @@ -17318,10 +16347,6 @@ packages: resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==} engines: {node: '>=20'} - wrap-ansi@2.1.0: - resolution: {integrity: sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==} - engines: {node: '>=0.10.0'} - wrap-ansi@6.2.0: resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} engines: {node: '>=8'} @@ -17396,17 +16421,10 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - xtend@2.1.2: - resolution: {integrity: sha512-vMNKzr2rHP9Dp/e1NQFnLQlwlhp9L/LfvnsVdHxN1f+uggyVI3i08uD14GPvCToPkdsRfyPqIyYGmIk58V98ZQ==} - engines: {node: '>=0.4'} - xtend@4.0.2: resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} engines: {node: '>=0.4'} - y18n@3.2.2: - resolution: {integrity: sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==} - y18n@5.0.8: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} @@ -17447,9 +16465,6 @@ packages: resolution: {integrity: sha512-rwu/ClNdSMpkSrUb+d6BRsSkLUq1fmfsY6TOpYzTwvwkg1/NRG85KBy3kq++A8LKQwX6lsu+aWad+2khvuXrqw==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs-parser@5.0.1: - resolution: {integrity: sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==} - yargs@16.2.0: resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} engines: {node: '>=10'} @@ -17462,9 +16477,6 @@ packages: resolution: {integrity: sha512-4UEqdc2RYGHZc7Doyqkrqiln3p9X2DZVxaGbwhn2pi7MrRagKaOcIKe8L3OxYcbhXLgLFUS3zAYuQjKBQgmuNg==} engines: {node: ^20.19.0 || ^22.12.0 || >=23} - yargs@7.1.2: - resolution: {integrity: sha512-ZEjj/dQYQy0Zx0lgLMLR8QuaqTihnxirir7EwUHp1Axq4e3+k8jXU5K0VLbNvedv1f4EWtBonDIZm0NUr+jCcA==} - yauzl@2.10.0: resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} @@ -18645,7 +17657,7 @@ snapshots: '@babel/helper-member-expression-to-functions': 7.28.5 '@babel/helper-optimise-call-expression': 7.27.1 '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.7) - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 '@babel/traverse': 7.29.7 semver: 6.3.1 transitivePeerDependencies: @@ -18800,13 +17812,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.27.1': - dependencies: - '@babel/traverse': 7.29.7 - '@babel/types': 7.29.7 - transitivePeerDependencies: - - supports-color - '@babel/helper-skip-transparent-expression-wrappers@7.29.7': dependencies: '@babel/traverse': 7.29.7 @@ -18854,7 +17859,7 @@ snapshots: '@babel/plugin-bugfix-firefox-class-in-computed-class-key@7.28.5(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color @@ -18870,7 +17875,7 @@ snapshots: '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-bugfix-safari-class-field-initializer-scope@7.29.7(@babel/core@7.29.7)': dependencies: @@ -18880,7 +17885,7 @@ snapshots: '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@7.29.7(@babel/core@7.29.7)': dependencies: @@ -18898,9 +17903,9 @@ snapshots: '@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.7) + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) transitivePeerDependencies: - supports-color @@ -18916,7 +17921,7 @@ snapshots: '@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color @@ -18980,7 +17985,7 @@ snapshots: '@babel/plugin-syntax-import-assertions@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-import-assertions@7.29.7(@babel/core@7.29.7)': dependencies: @@ -18990,7 +17995,7 @@ snapshots: '@babel/plugin-syntax-import-attributes@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-import-attributes@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19010,7 +18015,7 @@ snapshots: '@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-syntax-jsx@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19066,12 +18071,12 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-arrow-functions@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-arrow-functions@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19135,7 +18140,7 @@ snapshots: '@babel/plugin-transform-block-scoped-functions@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-block-scoped-functions@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19145,7 +18150,7 @@ snapshots: '@babel/plugin-transform-block-scoping@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-block-scoping@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19156,7 +18161,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -19172,7 +18177,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -19190,7 +18195,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 '@babel/helper-globals': 7.28.0 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.7) '@babel/traverse': 7.29.7 transitivePeerDependencies: @@ -19211,7 +18216,7 @@ snapshots: '@babel/plugin-transform-computed-properties@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/template': 7.29.7 '@babel/plugin-transform-computed-properties@7.29.7(@babel/core@7.29.7)': @@ -19223,7 +18228,7 @@ snapshots: '@babel/plugin-transform-destructuring@7.28.5(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color @@ -19240,7 +18245,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-dotall-regex@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19251,7 +18256,7 @@ snapshots: '@babel/plugin-transform-duplicate-keys@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-duplicate-keys@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19262,7 +18267,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-duplicate-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19273,7 +18278,7 @@ snapshots: '@babel/plugin-transform-dynamic-import@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-dynamic-import@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19283,7 +18288,7 @@ snapshots: '@babel/plugin-transform-explicit-resource-management@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-destructuring': 7.28.5(@babel/core@7.29.7) transitivePeerDependencies: - supports-color @@ -19299,7 +18304,7 @@ snapshots: '@babel/plugin-transform-exponentiation-operator@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-exponentiation-operator@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19309,7 +18314,7 @@ snapshots: '@babel/plugin-transform-export-namespace-from@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-export-namespace-from@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19325,8 +18330,8 @@ snapshots: '@babel/plugin-transform-for-of@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color @@ -19342,7 +18347,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-compilation-targets': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/traverse': 7.29.7 transitivePeerDependencies: - supports-color @@ -19359,7 +18364,7 @@ snapshots: '@babel/plugin-transform-json-strings@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-json-strings@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19369,7 +18374,7 @@ snapshots: '@babel/plugin-transform-literals@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-literals@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19379,7 +18384,7 @@ snapshots: '@babel/plugin-transform-logical-assignment-operators@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-logical-assignment-operators@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19389,7 +18394,7 @@ snapshots: '@babel/plugin-transform-member-expression-literals@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-member-expression-literals@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19400,7 +18405,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -19432,7 +18437,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-validator-identifier': 7.28.5 '@babel/traverse': 7.29.7 transitivePeerDependencies: @@ -19452,7 +18457,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-module-transforms': 7.29.7(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -19468,7 +18473,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-named-capturing-groups-regex@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19479,18 +18484,13 @@ snapshots: '@babel/plugin-transform-new-target@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-new-target@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-nullish-coalescing-operator@7.28.6(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/plugin-transform-nullish-coalescing-operator@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -19499,7 +18499,7 @@ snapshots: '@babel/plugin-transform-numeric-separator@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-numeric-separator@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19531,7 +18531,7 @@ snapshots: '@babel/plugin-transform-object-super@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/helper-replace-supers': 7.28.6(@babel/core@7.29.7) transitivePeerDependencies: - supports-color @@ -19547,21 +18547,13 @@ snapshots: '@babel/plugin-transform-optional-catch-binding@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-optional-catch-binding@7.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 '@babel/helper-plugin-utils': 7.29.7 - '@babel/plugin-transform-optional-chaining@7.28.6(@babel/core@7.29.7)': - dependencies: - '@babel/core': 7.29.7 - '@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.29.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 @@ -19573,7 +18565,7 @@ snapshots: '@babel/plugin-transform-parameters@7.27.7(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-parameters@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19584,7 +18576,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -19601,7 +18593,7 @@ snapshots: '@babel/core': 7.29.7 '@babel/helper-annotate-as-pure': 7.29.7 '@babel/helper-create-class-features-plugin': 7.28.6(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 transitivePeerDependencies: - supports-color @@ -19617,7 +18609,7 @@ snapshots: '@babel/plugin-transform-property-literals@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-property-literals@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19666,7 +18658,7 @@ snapshots: '@babel/plugin-transform-regenerator@7.29.0(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-regenerator@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19677,7 +18669,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-regexp-modifiers@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19688,7 +18680,7 @@ snapshots: '@babel/plugin-transform-reserved-words@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-reserved-words@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19746,7 +18738,7 @@ snapshots: '@babel/plugin-transform-shorthand-properties@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-shorthand-properties@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19756,8 +18748,8 @@ snapshots: '@babel/plugin-transform-spread@7.28.6(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 - '@babel/helper-skip-transparent-expression-wrappers': 7.27.1 + '@babel/helper-plugin-utils': 7.29.7 + '@babel/helper-skip-transparent-expression-wrappers': 7.29.7 transitivePeerDependencies: - supports-color @@ -19772,7 +18764,7 @@ snapshots: '@babel/plugin-transform-sticky-regex@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-sticky-regex@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19782,7 +18774,7 @@ snapshots: '@babel/plugin-transform-template-literals@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-template-literals@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19792,7 +18784,7 @@ snapshots: '@babel/plugin-transform-typeof-symbol@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-typeof-symbol@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19813,7 +18805,7 @@ snapshots: '@babel/plugin-transform-unicode-escapes@7.27.1(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-unicode-escapes@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19824,7 +18816,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-unicode-property-regex@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19836,7 +18828,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-unicode-regex@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19848,7 +18840,7 @@ snapshots: dependencies: '@babel/core': 7.29.7 '@babel/helper-create-regexp-features-plugin': 7.28.5(@babel/core@7.29.7) - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/plugin-transform-unicode-sets-regex@7.29.7(@babel/core@7.29.7)': dependencies: @@ -19977,12 +18969,12 @@ snapshots: '@babel/plugin-transform-modules-umd': 7.27.1(@babel/core@7.29.7) '@babel/plugin-transform-named-capturing-groups-regex': 7.29.0(@babel/core@7.29.7) '@babel/plugin-transform-new-target': 7.27.1(@babel/core@7.29.7) - '@babel/plugin-transform-nullish-coalescing-operator': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-transform-nullish-coalescing-operator': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-numeric-separator': 7.28.6(@babel/core@7.29.7) '@babel/plugin-transform-object-rest-spread': 7.28.6(@babel/core@7.29.7) '@babel/plugin-transform-object-super': 7.27.1(@babel/core@7.29.7) '@babel/plugin-transform-optional-catch-binding': 7.28.6(@babel/core@7.29.7) - '@babel/plugin-transform-optional-chaining': 7.28.6(@babel/core@7.29.7) + '@babel/plugin-transform-optional-chaining': 7.29.7(@babel/core@7.29.7) '@babel/plugin-transform-parameters': 7.27.7(@babel/core@7.29.7) '@babel/plugin-transform-private-methods': 7.28.6(@babel/core@7.29.7) '@babel/plugin-transform-private-property-in-object': 7.28.6(@babel/core@7.29.7) @@ -20172,7 +19164,7 @@ snapshots: '@babel/preset-modules@0.1.6-no-external-plugins(@babel/core@7.29.7)': dependencies: '@babel/core': 7.29.7 - '@babel/helper-plugin-utils': 7.28.6 + '@babel/helper-plugin-utils': 7.29.7 '@babel/types': 7.29.7 esutils: 2.0.3 @@ -20513,10 +19505,6 @@ snapshots: '@gar/promise-retry@1.0.3': {} - '@gulpjs/to-absolute-glob@4.0.0': - dependencies: - is-negated-glob: 1.0.0 - '@harperfast/extended-iterable@1.0.3': optional: true @@ -23914,12 +22902,6 @@ snapshots: '@types/estree': 1.0.8 '@types/json-schema': 7.0.15 - '@types/eslint@9.6.1': - dependencies: - '@types/estree': 1.0.8 - '@types/json-schema': 7.0.15 - optional: true - '@types/esquery@1.5.4': dependencies: '@types/estree': 1.0.8 @@ -24026,8 +23008,6 @@ snapshots: '@types/mime@1.3.5': {} - '@types/minimatch@3.0.5': {} - '@types/minimatch@5.1.2': {} '@types/ms@2.1.0': {} @@ -25600,14 +24580,8 @@ snapshots: dependencies: ansi-wrap: 0.1.0 - ansi-colors@3.2.4: {} - ansi-colors@4.1.3: {} - ansi-cyan@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansi-escapes@4.3.2: dependencies: type-fest: 0.21.3 @@ -25626,10 +24600,6 @@ snapshots: ansi-html-community@0.0.8: {} - ansi-red@0.1.1: - dependencies: - ansi-wrap: 0.1.0 - ansi-regex@2.1.1: {} ansi-regex@5.0.1: {} @@ -25652,16 +24622,6 @@ snapshots: ansi-wrap@0.1.0: {} - anymatch@1.3.2: - dependencies: - micromatch: 4.0.8 - normalize-path: 2.1.1 - - anymatch@2.0.0: - dependencies: - micromatch: 4.0.8 - normalize-path: 2.1.1 - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -25669,10 +24629,6 @@ snapshots: app-module-path@2.2.0: {} - append-buffer@1.0.2: - dependencies: - buffer-equal: 1.0.1 - archiver-utils@5.0.2: dependencies: glob: 10.5.0 @@ -25697,8 +24653,6 @@ snapshots: - bare-buffer - react-native-b4a - archy@1.0.0: {} - arg@4.1.3: {} argparse@2.0.1: {} @@ -25713,25 +24667,8 @@ snapshots: aria-query@5.3.2: {} - arr-diff@1.1.0: - dependencies: - arr-flatten: 1.1.0 - array-slice: 0.2.3 - arr-diff@4.0.0: {} - arr-filter@1.1.2: - dependencies: - make-iterator: 1.0.1 - - arr-flatten@1.1.0: {} - - arr-map@2.0.2: - dependencies: - make-iterator: 1.0.1 - - arr-union@2.1.0: {} - arr-union@3.1.0: {} array-buffer-byte-length@1.0.2: @@ -25739,10 +24676,6 @@ snapshots: call-bound: 1.0.4 is-array-buffer: 3.0.5 - array-differ@3.0.0: {} - - array-each@1.0.1: {} - array-find@1.0.0: {} array-flatten@1.1.1: {} @@ -25758,25 +24691,6 @@ snapshots: is-string: 1.1.1 math-intrinsics: 1.1.0 - array-initial@1.1.0: - dependencies: - array-slice: 1.1.0 - is-number: 4.0.0 - - array-last@1.3.0: - dependencies: - is-number: 4.0.0 - - array-slice@0.2.3: {} - - array-slice@1.1.0: {} - - array-sort@1.0.0: - dependencies: - default-compare: 1.0.0 - get-value: 2.0.6 - kind-of: 5.1.0 - array-union@1.0.2: dependencies: array-uniq: 1.0.3 @@ -25836,8 +24750,6 @@ snapshots: get-intrinsic: 1.3.0 is-array-buffer: 3.0.5 - arrify@2.0.1: {} - asn1.js@4.10.1: dependencies: bn.js: 4.12.3 @@ -25871,23 +24783,10 @@ snapshots: astral-regex@2.0.0: {} - async-done@1.3.2: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - process-nextick-args: 2.0.1 - stream-exhaust: 1.0.2 - - async-each@1.0.6: {} - async-exit-hook@1.1.2: {} async-function@1.0.0: {} - async-settle@1.0.0: - dependencies: - async-done: 1.3.2 - async@3.2.3: {} async@3.2.6: {} @@ -26278,18 +25177,6 @@ snapshots: babylon@6.18.0: {} - bach@1.2.0: - dependencies: - arr-filter: 1.1.2 - arr-flatten: 1.1.0 - arr-map: 2.0.2 - array-each: 1.0.1 - array-initial: 1.1.0 - array-last: 1.3.0 - async-done: 1.3.2 - async-settle: 1.0.0 - now-and-later: 2.0.1 - bail@2.0.2: {} balanced-match@1.0.2: {} @@ -26376,29 +25263,14 @@ snapshots: big.js@5.2.2: {} - binary-extensions@1.13.1: {} - binary-extensions@2.3.0: {} - binaryextensions@1.0.1: {} - - bindings@1.5.0: - dependencies: - file-uri-to-path: 1.0.0 - optional: true - bl@4.1.0: dependencies: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - bl@5.1.0: - dependencies: - buffer: 6.0.3 - inherits: 2.0.4 - readable-stream: 3.6.2 - bluebird@3.7.2: {} bn.js@4.12.3: {} @@ -26596,8 +25468,6 @@ snapshots: buffer-crc32@1.0.0: {} - buffer-equal@1.0.1: {} - buffer-from@1.1.2: {} buffer-xor@1.0.3: {} @@ -26644,13 +25514,6 @@ snapshots: p-map: 7.0.4 ssri: 13.0.1 - cache-swap@0.3.0: - dependencies: - graceful-fs: 4.2.11 - mkdirp: 0.5.6 - object-assign: 4.1.1 - rimraf: 2.7.1 - cacheable@2.3.4: dependencies: '@cacheable/memory': 2.0.8 @@ -26687,8 +25550,6 @@ snapshots: pascal-case: 3.1.2 tslib: 2.8.1 - camelcase@3.0.0: {} - camelcase@5.3.1: {} camelcase@6.3.0: {} @@ -26750,11 +25611,6 @@ snapshots: escape-string-regexp: 1.0.5 supports-color: 5.5.0 - chalk@3.0.0: - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - chalk@4.1.2: dependencies: ansi-styles: 4.3.0 @@ -26807,22 +25663,6 @@ snapshots: whatwg-mimetype: 4.0.0 optional: true - chokidar@2.1.8: - dependencies: - anymatch: 2.0.0 - async-each: 1.0.6 - braces: 3.0.3 - glob-parent: 3.1.0 - inherits: 2.0.4 - is-binary-path: 1.0.1 - is-glob: 4.0.3 - normalize-path: 3.0.0 - path-is-absolute: 1.0.1 - readdirp: 2.2.1 - upath: 1.2.0 - optionalDependencies: - fsevents: 1.2.13 - chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -26953,12 +25793,6 @@ snapshots: cli-width@4.1.0: {} - cliui@3.2.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi: 2.1.0 - cliui@7.0.4: dependencies: string-width: 4.2.3 @@ -26985,8 +25819,6 @@ snapshots: kind-of: 6.0.3 shallow-clone: 3.0.1 - clone-stats@0.0.1: {} - clone-stats@1.0.0: {} clone@1.0.4: {} @@ -27003,18 +25835,10 @@ snapshots: code-block-writer@12.0.0: {} - code-point-at@1.1.0: {} - coffeescript@2.7.0: {} collect-v8-coverage@1.0.3: {} - collection-map@1.0.0: - dependencies: - arr-map: 2.0.2 - for-own: 1.0.0 - make-iterator: 1.0.1 - color-convert@0.5.3: {} color-convert@1.9.3: @@ -27135,10 +25959,6 @@ snapshots: readable-stream: 2.3.8 typedarray: 0.0.6 - concat-with-sourcemaps@1.1.0: - dependencies: - source-map: 0.6.1 - config-chain@1.1.13: dependencies: ini: 1.3.8 @@ -27200,11 +26020,6 @@ snapshots: dependencies: is-what: 4.1.16 - copy-props@2.0.5: - dependencies: - each-props: 1.3.2 - is-plain-object: 5.0.0 - copy-webpack-plugin@14.0.0(webpack@5.105.0(@swc/core@1.15.30(@swc/helpers@0.5.21))(esbuild@0.28.1)): dependencies: glob-parent: 6.0.2 @@ -27611,8 +26426,6 @@ snapshots: dependencies: ms: 2.1.3 - decamelize@1.2.0: {} - decimal.js@10.6.0: {} decode-named-character-reference@1.3.0: @@ -27667,12 +26480,6 @@ snapshots: bundle-name: 4.1.0 default-browser-id: 5.0.1 - default-compare@1.0.0: - dependencies: - kind-of: 5.1.0 - - default-resolution@2.0.0: {} - defaults@1.0.4: dependencies: clone: 1.0.4 @@ -27739,14 +26546,10 @@ snapshots: destroy@1.2.0: {} - detect-file@1.0.0: {} - detect-indent@4.0.0: dependencies: repeating: 2.0.1 - detect-indent@6.1.0: {} - detect-libc@1.0.3: {} detect-libc@2.1.2: {} @@ -28007,29 +26810,8 @@ snapshots: dependencies: readable-stream: 2.3.8 - duplexer@0.1.2: {} - - duplexify@3.7.1: - dependencies: - end-of-stream: 1.4.5 - inherits: 2.0.4 - readable-stream: 2.3.8 - stream-shift: 1.0.3 - - duplexify@4.1.3: - dependencies: - end-of-stream: 1.4.5 - inherits: 2.0.4 - readable-stream: 3.6.2 - stream-shift: 1.0.3 - dx-systemjs-vue-browser@1.1.2: {} - each-props@1.3.2: - dependencies: - is-plain-object: 2.0.4 - object.defaults: 1.1.0 - eastasianwidth@0.2.0: {} editorconfig@1.0.7: @@ -28308,13 +27090,6 @@ snapshots: es5-ext: 0.10.64 esniff: 1.1.3 - es6-weak-map@2.0.3: - dependencies: - d: 1.0.2 - es5-ext: 0.10.64 - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - esbuild-plugin-vue3@0.3.2(cheerio@1.2.0)(sass@1.99.0): dependencies: '@vue/compiler-core': 3.5.32 @@ -29196,10 +27971,6 @@ snapshots: exit@0.1.2: {} - expand-tilde@2.0.2: - dependencies: - homedir-polyfill: 1.0.3 - expect@29.7.0: dependencies: '@jest/expect-utils': 29.7.0 @@ -29348,10 +28119,6 @@ snapshots: dependencies: type: 2.7.3 - extend-shallow@1.1.4: - dependencies: - kind-of: 1.1.0 - extend-shallow@3.0.2: dependencies: assign-symbols: 1.0.0 @@ -29359,12 +28126,6 @@ snapshots: extend@3.0.2: {} - fancy-log@1.3.2: - dependencies: - ansi-gray: 0.1.1 - color-support: 1.1.3 - time-stamp: 1.1.0 - fancy-log@1.3.3: dependencies: ansi-gray: 0.1.1 @@ -29372,10 +28133,6 @@ snapshots: parse-node-version: 1.0.1 time-stamp: 1.1.0 - fancy-log@2.0.0: - dependencies: - color-support: 1.1.3 - fast-csv@5.0.5: dependencies: '@fast-csv/format': 5.0.5 @@ -29399,8 +28156,6 @@ snapshots: fast-json-stable-stringify@2.1.0: {} - fast-levenshtein@1.1.4: {} - fast-levenshtein@2.0.6: {} fast-png@6.4.0: @@ -29465,9 +28220,6 @@ snapshots: file-saver@2.0.5: {} - file-uri-to-path@1.0.0: - optional: true - filing-cabinet@4.1.6: dependencies: app-module-path: 2.2.0 @@ -29539,11 +28291,6 @@ snapshots: find-up-simple@1.0.1: {} - find-up@1.1.2: - dependencies: - path-exists: 2.1.0 - pinkie-promise: 2.0.1 - find-up@3.0.0: dependencies: locate-path: 3.0.0 @@ -29558,34 +28305,6 @@ snapshots: locate-path: 6.0.0 path-exists: 4.0.0 - findup-sync@2.0.0: - dependencies: - detect-file: 1.0.0 - is-glob: 3.1.0 - micromatch: 4.0.8 - resolve-dir: 1.0.1 - - findup-sync@3.0.0: - dependencies: - detect-file: 1.0.0 - is-glob: 4.0.3 - micromatch: 4.0.8 - resolve-dir: 1.0.1 - - fined@1.2.0: - dependencies: - expand-tilde: 2.0.2 - is-plain-object: 2.0.4 - object.defaults: 1.1.0 - object.pick: 1.3.0 - parse-filepath: 1.0.2 - - first-chunk-stream@2.0.0: - dependencies: - readable-stream: 2.3.8 - - flagged-respawn@1.0.1: {} - flat-cache@3.2.0: dependencies: flatted: 3.4.2 @@ -29607,11 +28326,6 @@ snapshots: flatted@3.4.2: {} - flush-write-stream@1.1.1: - dependencies: - inherits: 2.0.4 - readable-stream: 2.3.8 - fn.name@1.1.0: {} follow-redirects@1.16.0(debug@4.4.3): @@ -29622,19 +28336,11 @@ snapshots: dependencies: is-callable: 1.2.7 - for-in@1.0.2: {} - - for-own@1.0.0: - dependencies: - for-in: 1.0.2 - foreground-child@3.3.1: dependencies: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-stream@0.0.4: {} - fork-ts-checker-webpack-plugin@9.1.0(typescript@5.9.3)(webpack@5.105.4(@swc/core@1.15.30(@swc/helpers@0.5.21))(esbuild@0.28.1)): dependencies: '@babel/code-frame': 7.29.7 @@ -29707,29 +28413,10 @@ snapshots: dependencies: minipass: 7.1.3 - fs-mkdirp-stream@1.0.0: - dependencies: - graceful-fs: 4.2.11 - through2: 2.0.5 - - fs-mkdirp-stream@2.0.1: - dependencies: - graceful-fs: 4.2.11 - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - fs-monkey@1.1.0: {} fs.realpath@1.0.0: {} - fsevents@1.2.13: - dependencies: - bindings: 1.5.0 - nan: 2.26.2 - optional: true - fsevents@2.3.3: optional: true @@ -29757,8 +28444,6 @@ snapshots: get-assigned-identifiers@1.2.0: {} - get-caller-file@1.0.3: {} - get-caller-file@2.0.5: {} get-east-asian-width@1.5.0: {} @@ -29814,17 +28499,10 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - get-value@2.0.6: {} - getos@3.2.1: dependencies: async: 3.2.6 - glob-parent@3.1.0: - dependencies: - is-glob: 3.1.0 - path-dirname: 1.0.2 - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -29833,49 +28511,12 @@ snapshots: dependencies: is-glob: 4.0.3 - glob-stream@6.1.0: - dependencies: - extend: 3.0.2 - glob: 7.2.3 - glob-parent: 3.1.0 - is-negated-glob: 1.0.0 - ordered-read-streams: 1.0.1 - pumpify: 1.5.1 - readable-stream: 2.3.8 - remove-trailing-separator: 1.1.0 - to-absolute-glob: 2.0.2 - unique-stream: 2.4.0 - - glob-stream@8.0.3: - dependencies: - '@gulpjs/to-absolute-glob': 4.0.0 - anymatch: 3.1.3 - fastq: 1.20.1 - glob-parent: 6.0.2 - is-glob: 4.0.3 - is-negated-glob: 1.0.0 - normalize-path: 3.0.0 - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - glob-to-regex.js@1.2.0(tslib@2.8.1): dependencies: tslib: 2.8.1 glob-to-regexp@0.4.1: {} - glob-watcher@5.0.5: - dependencies: - anymatch: 2.0.0 - async-done: 1.3.2 - chokidar: 2.1.8 - is-negated-glob: 1.0.0 - just-debounce: 1.1.0 - normalize-path: 3.0.0 - object.defaults: 1.1.0 - glob@10.5.0: dependencies: foreground-child: 3.3.1 @@ -29925,24 +28566,10 @@ snapshots: minimatch: 5.1.9 once: 1.4.0 - global-modules@1.0.0: - dependencies: - global-prefix: 1.0.2 - is-windows: 1.0.2 - resolve-dir: 1.0.1 - global-modules@2.0.0: dependencies: global-prefix: 3.0.0 - global-prefix@1.0.2: - dependencies: - expand-tilde: 2.0.2 - homedir-polyfill: 1.0.3 - ini: 1.3.8 - is-windows: 1.0.2 - which: 1.3.1 - global-prefix@3.0.0: dependencies: ini: 1.3.8 @@ -30004,10 +28631,6 @@ snapshots: globrex@0.1.2: {} - glogg@1.0.2: - dependencies: - sparkles: 1.0.1 - gonzales-pe@4.3.0: dependencies: minimist: 1.2.8 @@ -30024,226 +28647,8 @@ snapshots: dependencies: lodash: 4.18.1 - growly@1.3.0: {} - - gulp-babel@8.0.0(@babel/core@7.29.7): - dependencies: - '@babel/core': 7.29.7 - plugin-error: 1.0.1 - replace-ext: 1.0.1 - through2: 2.0.5 - vinyl-sourcemaps-apply: 0.2.1 - - gulp-cache@1.1.3: - dependencies: - '@babel/runtime': 7.29.2 - cache-swap: 0.3.0 - core-js: 3.49.0 - object.pick: 1.3.0 - plugin-error: 1.0.1 - through2: 3.0.1 - vinyl: 2.2.1 - - gulp-cached@1.1.1: - dependencies: - lodash.defaults: 4.2.0 - through2: 2.0.5 - - gulp-cli@2.3.0: - dependencies: - ansi-colors: 1.1.0 - archy: 1.0.0 - array-sort: 1.0.0 - color-support: 1.1.3 - concat-stream: 1.6.2 - copy-props: 2.0.5 - fancy-log: 1.3.3 - gulplog: 1.0.0 - interpret: 1.4.0 - isobject: 3.0.1 - liftoff: 3.1.0 - matchdep: 2.0.0 - mute-stdout: 1.0.1 - pretty-hrtime: 1.0.3 - replace-homedir: 1.0.0 - semver-greatest-satisfied-range: 1.1.0 - v8flags: 3.2.0 - yargs: 7.1.2 - - gulp-concat@2.6.1: - dependencies: - concat-with-sourcemaps: 1.1.0 - through2: 2.0.5 - vinyl: 2.2.1 - - gulp-each@0.5.0: - dependencies: - read-vinyl-file-stream: 2.0.3 - - gulp-eol@0.2.0: - dependencies: - plugin-error: 1.0.1 - through2: 0.4.2 - - gulp-eslint-new@2.4.0(jiti@2.6.1): - dependencies: - eslint: 9.39.4(jiti@2.6.1) - fancy-log: 2.0.0 - plugin-error: 2.0.1 - semver: 7.8.4 - ternary-stream: 3.0.0 - vinyl-fs: 4.0.2 - optionalDependencies: - '@types/eslint': 9.6.1 - '@types/node': 20.19.37 - transitivePeerDependencies: - - bare-abort-controller - - jiti - - react-native-b4a - - supports-color - - gulp-file@0.4.0: - dependencies: - through2: 0.4.2 - vinyl: 2.2.1 - - gulp-filter@7.0.0(gulp@4.0.2): - dependencies: - multimatch: 5.0.0 - plugin-error: 1.0.1 - streamfilter: 3.0.0 - to-absolute-glob: 2.0.2 - optionalDependencies: - gulp: 4.0.2 - - gulp-flatmap@1.0.2: - dependencies: - plugin-error: 0.1.2 - through2: 2.0.3 - - gulp-footer@2.1.0: - dependencies: - lodash: 4.18.1 - map-stream: 0.0.7 - - gulp-header@2.0.9: - dependencies: - concat-with-sourcemaps: 1.1.0 - lodash.template: 4.18.1 - map-stream: 0.0.7 - through2: 2.0.5 - - gulp-if@3.0.0: - dependencies: - gulp-match: 1.1.0 - ternary-stream: 3.0.0 - through2: 3.0.2 - - gulp-json-editor@2.6.0: - dependencies: - deepmerge: 4.3.1 - detect-indent: 6.1.0 - js-beautify: 1.15.4 - plugin-error: 2.0.1 - through2: 4.0.2 - - gulp-match@1.1.0: - dependencies: - minimatch: 3.1.5 - - gulp-multi-process@1.4.0: - dependencies: - async: 3.2.6 - - gulp-notify@4.0.0: - dependencies: - ansi-colors: 4.1.3 - fancy-log: 1.3.3 - lodash.template: 4.18.1 - node-notifier: 9.0.1 - node.extend: 2.0.3 - plugin-error: 1.0.1 - through2: 4.0.2 - - gulp-plumber@1.2.1: - dependencies: - chalk: 1.1.3 - fancy-log: 1.3.3 - plugin-error: 0.1.2 - through2: 2.0.5 - - gulp-rename@1.4.0: {} - - gulp-replace@0.6.1: - dependencies: - istextorbinary: 1.0.2 - readable-stream: 2.3.8 - replacestream: 4.0.3 - - gulp-sass@6.0.1: - dependencies: - lodash.clonedeep: 4.5.0 - picocolors: 1.1.1 - plugin-error: 1.0.1 - replace-ext: 2.0.0 - strip-ansi: 6.0.1 - vinyl-sourcemaps-apply: 0.2.1 - - gulp-shell@0.8.0: - dependencies: - chalk: 3.0.0 - fancy-log: 1.3.3 - lodash.template: 4.18.1 - plugin-error: 1.0.1 - through2: 3.0.2 - tslib: 1.14.1 - - gulp-tap@1.0.1: - dependencies: - through2: 2.0.5 - - gulp-template@5.0.0: - dependencies: - lodash: 4.18.1 - plugin-error: 0.1.2 - safe-buffer: 5.2.1 - through2: 2.0.5 - - gulp-typescript@5.0.1(typescript@4.9.5): - dependencies: - ansi-colors: 3.2.4 - plugin-error: 1.0.1 - source-map: 0.7.6 - through2: 3.0.2 - typescript: 4.9.5 - vinyl: 2.2.1 - vinyl-fs: 3.0.3 - - gulp-watch@5.0.1: - dependencies: - ansi-colors: 1.1.0 - anymatch: 1.3.2 - chokidar: 2.1.8 - fancy-log: 1.3.2 - glob-parent: 3.1.0 - object-assign: 4.1.1 - path-is-absolute: 1.0.1 - plugin-error: 1.0.1 - readable-stream: 2.3.8 - slash: 1.0.0 - vinyl: 2.2.1 - vinyl-file: 2.0.0 - - gulp@4.0.2: - dependencies: - glob-watcher: 5.0.5 - gulp-cli: 2.3.0 - undertaker: 1.3.0 - vinyl-fs: 3.0.3 - - gulplog@1.0.0: - dependencies: - glogg: 1.0.2 + growly@1.3.0: + optional: true handle-thing@2.0.1: {} @@ -30440,10 +28845,6 @@ snapshots: os-homedir: 1.0.2 os-tmpdir: 1.0.2 - homedir-polyfill@1.0.3: - dependencies: - parse-passwd: 1.0.0 - hono@4.12.25: {} hookified@1.15.1: {} @@ -30840,8 +29241,6 @@ snapshots: intl@1.2.5: {} - invert-kv@1.0.0: {} - iobuffer@5.4.0: {} ip-address@10.2.0: {} @@ -30850,11 +29249,6 @@ snapshots: ipaddr.js@2.4.0: {} - is-absolute@1.0.0: - dependencies: - is-relative: 1.0.0 - is-windows: 1.0.2 - is-arguments@1.2.0: dependencies: call-bound: 1.0.4 @@ -30880,10 +29274,6 @@ snapshots: dependencies: has-bigints: 1.1.0 - is-binary-path@1.0.1: - dependencies: - binary-extensions: 1.13.1 - is-binary-path@2.1.0: dependencies: binary-extensions: 2.3.0 @@ -30946,10 +29336,6 @@ snapshots: is-finite@1.1.0: {} - is-fullwidth-code-point@1.0.0: - dependencies: - number-is-nan: 1.0.1 - is-fullwidth-code-point@3.0.0: {} is-fullwidth-code-point@4.0.0: {} @@ -30972,10 +29358,6 @@ snapshots: dependencies: is-extglob: 1.0.0 - is-glob@3.1.0: - dependencies: - is-extglob: 2.1.1 - is-glob@4.0.3: dependencies: is-extglob: 2.1.1 @@ -30994,8 +29376,6 @@ snapshots: is-module@1.0.0: {} - is-negated-glob@1.0.0: {} - is-negative-zero@2.0.3: {} is-network-error@1.3.2: {} @@ -31005,8 +29385,6 @@ snapshots: call-bound: 1.0.4 has-tostringtag: 1.0.2 - is-number@4.0.0: {} - is-number@7.0.0: {} is-obj@1.0.1: {} @@ -31054,10 +29432,6 @@ snapshots: is-relative-path@1.0.2: {} - is-relative@1.0.0: - dependencies: - is-unc-path: 1.0.0 - is-set@2.0.3: {} is-shared-array-buffer@1.0.4: @@ -31083,10 +29457,6 @@ snapshots: dependencies: which-typed-array: 1.1.20 - is-unc-path@1.0.0: - dependencies: - unc-path-regex: 0.1.2 - is-unicode-supported@0.1.0: {} is-unicode-supported@1.3.0: {} @@ -31099,8 +29469,6 @@ snapshots: is-utf8@0.2.1: {} - is-valid-glob@1.0.0: {} - is-weakmap@2.0.2: {} is-weakref@1.1.1: @@ -31116,8 +29484,6 @@ snapshots: is-what@4.1.16: {} - is-windows@1.0.2: {} - is-wsl@2.2.0: dependencies: is-docker: 2.2.1 @@ -31126,10 +29492,6 @@ snapshots: dependencies: is-inside-container: 1.0.0 - is@3.3.2: {} - - isarray@0.0.1: {} - isarray@1.0.0: {} isarray@2.0.5: {} @@ -31191,11 +29553,6 @@ snapshots: html-escaper: 2.0.2 istanbul-lib-report: 3.0.1 - istextorbinary@1.0.2: - dependencies: - binaryextensions: 1.0.1 - textextensions: 1.0.2 - iterator.prototype@1.1.5: dependencies: define-data-property: 1.1.4 @@ -32801,8 +31158,6 @@ snapshots: readable-stream: 2.3.8 setimmediate: 1.0.5 - just-debounce@1.1.0: {} - just-extend@6.2.0: {} karma-chrome-launcher@3.2.0: @@ -32888,10 +31243,6 @@ snapshots: dependencies: '@keyv/serialize': 1.1.1 - kind-of@1.1.0: {} - - kind-of@5.1.0: {} - kind-of@6.0.3: {} kleur@3.0.3: {} @@ -32917,34 +31268,15 @@ snapshots: dependencies: language-subtag-registry: 0.3.23 - last-run@1.1.1: - dependencies: - default-resolution: 2.0.0 - es6-weak-map: 2.0.3 - launch-editor@2.14.1: dependencies: picocolors: 1.1.1 shell-quote: 1.8.4 - lazypipe@1.0.2: - dependencies: - stream-combiner: 0.2.2 - lazystream@1.0.1: dependencies: readable-stream: 2.3.8 - lcid@1.0.0: - dependencies: - invert-kv: 1.0.0 - - lead@1.0.0: - dependencies: - flush-write-stream: 1.1.1 - - lead@4.0.0: {} - less-loader@12.3.0(less@4.4.0)(webpack@5.105.0(@swc/core@1.15.30(@swc/helpers@0.5.21))(esbuild@0.28.1)): dependencies: less: 4.4.0 @@ -33020,17 +31352,6 @@ snapshots: dependencies: immediate: 3.0.6 - liftoff@3.1.0: - dependencies: - extend: 3.0.2 - findup-sync: 3.0.0 - fined: 1.2.0 - flagged-respawn: 1.0.1 - is-plain-object: 2.0.4 - object.map: 1.0.1 - rechoir: 0.6.2 - resolve: 1.22.12 - lightningcss-android-arm64@1.32.0: optional: true @@ -33186,14 +31507,6 @@ snapshots: '@lmdb/lmdb-win32-x64': 3.5.4 optional: true - load-json-file@1.1.0: - dependencies: - graceful-fs: 4.2.11 - parse-json: 2.2.0 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - loader-runner@4.3.1: {} loader-utils@1.4.2: @@ -33223,16 +31536,12 @@ snapshots: dependencies: p-locate: 5.0.0 - lodash._reinterpolate@3.0.0: {} - lodash.clone@4.5.0: {} lodash.clonedeep@4.5.0: {} lodash.debounce@4.0.8: {} - lodash.defaults@4.2.0: {} - lodash.escaperegexp@4.1.2: {} lodash.groupby@4.6.0: {} @@ -33255,15 +31564,6 @@ snapshots: lodash.some@4.6.0: {} - lodash.template@4.18.1: - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.templatesettings: 4.2.0 - - lodash.templatesettings@4.2.0: - dependencies: - lodash._reinterpolate: 3.0.0 - lodash.truncate@4.4.2: {} lodash.uniq@4.5.0: {} @@ -33421,31 +31721,16 @@ snapshots: transitivePeerDependencies: - supports-color - make-iterator@1.0.1: - dependencies: - kind-of: 6.0.3 - make-synchronized@0.8.0: {} makeerror@1.0.12: dependencies: tmpl: 1.0.5 - map-cache@0.2.2: {} - - map-stream@0.0.7: {} - match-url-wildcard@0.0.4: dependencies: escape-string-regexp: 1.0.5 - matchdep@2.0.0: - dependencies: - findup-sync: 2.0.0 - micromatch: 4.0.8 - resolve: 1.22.12 - stack-trace: 0.0.10 - math-intrinsics@1.1.0: {} mathml-tag-names@2.1.3: {} @@ -33888,29 +32173,16 @@ snapshots: dns-packet: 5.6.1 thunky: 1.1.0 - multimatch@5.0.0: - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.5 - mustache@2.3.2: {} mustache@4.2.0: {} - mute-stdout@1.0.1: {} - mute-stream@2.0.0: {} mute-stream@3.0.0: {} mylas@2.1.14: {} - nan@2.26.2: - optional: true - nanoid@3.3.12: {} napi-postinstall@0.3.4: {} @@ -34067,6 +32339,7 @@ snapshots: shellwords: 0.1.1 uuid: 14.0.0 which: 2.0.2 + optional: true node-releases@2.0.37: {} @@ -34074,21 +32347,8 @@ snapshots: dependencies: '@babel/parser': 7.29.7 - node-stream@1.7.0: - dependencies: - lodash: 4.18.1 - readable-stream: 2.3.8 - split2: 2.2.0 - stream-combiner2: 1.1.1 - through2: 2.0.5 - node-watch@0.7.3: {} - node.extend@2.0.3: - dependencies: - hasown: 2.0.4 - is: 3.3.2 - nopt@3.0.6: dependencies: abbrev: 1.1.1 @@ -34108,22 +32368,10 @@ snapshots: semver: 5.7.2 validate-npm-package-license: 3.0.4 - normalize-path@2.1.1: - dependencies: - remove-trailing-separator: 1.1.0 - normalize-path@3.0.0: {} normalize-range@0.1.2: {} - now-and-later@2.0.1: - dependencies: - once: 1.4.0 - - now-and-later@3.0.0: - dependencies: - once: 1.4.0 - npm-bundled@5.0.0: dependencies: npm-normalize-package-bin: 5.0.0 @@ -34197,8 +32445,6 @@ snapshots: nullthrows@1.1.1: {} - number-is-nan@1.0.1: {} - nwsapi@2.2.23: {} nx@23.0.1(@swc/core@1.15.30(@swc/helpers@0.5.21))(debug@4.4.3): @@ -34338,8 +32584,6 @@ snapshots: call-bind: 1.0.9 define-properties: 1.2.1 - object-keys@0.4.0: {} - object-keys@1.1.1: {} object.assign@4.1.7: @@ -34351,13 +32595,6 @@ snapshots: has-symbols: 1.1.0 object-keys: 1.1.1 - object.defaults@1.1.0: - dependencies: - array-each: 1.0.1 - array-slice: 1.1.0 - for-own: 1.0.0 - isobject: 3.0.1 - object.entries@1.1.9: dependencies: call-bind: 1.0.9 @@ -34378,20 +32615,6 @@ snapshots: define-properties: 1.2.1 es-abstract: 1.24.2 - object.map@1.0.1: - dependencies: - for-own: 1.0.0 - make-iterator: 1.0.1 - - object.pick@1.3.0: - dependencies: - isobject: 3.0.1 - - object.reduce@1.0.1: - dependencies: - for-own: 1.0.0 - make-iterator: 1.0.1 - object.values@1.2.1: dependencies: call-bind: 1.0.9 @@ -34539,20 +32762,12 @@ snapshots: ordered-binary@1.6.1: {} - ordered-read-streams@1.0.1: - dependencies: - readable-stream: 2.3.8 - os-browserify@0.3.0: {} os-family@1.1.0: {} os-homedir@1.0.2: {} - os-locale@1.4.0: - dependencies: - lcid: 1.0.0 - os-tmpdir@1.0.2: {} own-keys@1.0.1: @@ -34697,16 +32912,6 @@ snapshots: dependencies: color-convert: 0.5.3 - parse-filepath@1.0.2: - dependencies: - is-absolute: 1.0.0 - map-cache: 0.2.2 - path-root: 0.1.1 - - parse-json@2.2.0: - dependencies: - error-ex: 1.3.4 - parse-json@5.2.0: dependencies: '@babel/code-frame': 7.29.7 @@ -34716,8 +32921,6 @@ snapshots: parse-node-version@1.0.1: {} - parse-passwd@1.0.0: {} - parse5-html-rewriting-stream@8.0.0: dependencies: entities: 6.0.1 @@ -34768,12 +32971,6 @@ snapshots: path-browserify@1.0.1: {} - path-dirname@1.0.2: {} - - path-exists@2.1.0: - dependencies: - pinkie-promise: 2.0.1 - path-exists@3.0.0: {} path-exists@4.0.0: {} @@ -34790,12 +32987,6 @@ snapshots: path-platform@0.11.15: {} - path-root-regex@0.1.2: {} - - path-root@0.1.1: - dependencies: - path-root-regex: 0.1.2 - path-scurry@1.11.1: dependencies: lru-cache: 10.4.3 @@ -34810,12 +33001,6 @@ snapshots: path-to-regexp@8.4.2: {} - path-type@1.1.0: - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - path-type@4.0.0: {} pathval@1.1.1: {} @@ -34897,14 +33082,6 @@ snapshots: dependencies: queue-lit: 1.5.2 - plugin-error@0.1.2: - dependencies: - ansi-cyan: 0.1.1 - ansi-red: 0.1.1 - arr-diff: 1.1.0 - arr-union: 2.1.0 - extend-shallow: 1.1.4 - plugin-error@1.0.1: dependencies: ansi-colors: 1.1.0 @@ -34912,10 +33089,6 @@ snapshots: arr-union: 3.1.0 extend-shallow: 3.0.2 - plugin-error@2.0.1: - dependencies: - ansi-colors: 1.1.0 - pluralize@8.0.0: {} pngjs@3.4.0: {} @@ -35151,22 +33324,11 @@ snapshots: randombytes: 2.1.0 safe-buffer: 5.2.1 - pump@2.0.1: - dependencies: - end-of-stream: 1.4.5 - once: 1.4.0 - pump@3.0.4: dependencies: end-of-stream: 1.4.5 once: 1.4.0 - pumpify@1.5.1: - dependencies: - duplexify: 3.7.1 - inherits: 2.0.4 - pump: 2.0.1 - punycode@1.4.1: {} punycode@2.3.1: {} @@ -35369,17 +33531,6 @@ snapshots: dependencies: readable-stream: 2.3.8 - read-pkg-up@1.0.1: - dependencies: - find-up: 1.1.2 - read-pkg: 1.1.0 - - read-pkg@1.1.0: - dependencies: - load-json-file: 1.1.0 - normalize-package-data: 2.5.0 - path-type: 1.1.0 - read-pkg@5.2.0: dependencies: '@types/normalize-package-data': 2.4.4 @@ -35387,18 +33538,6 @@ snapshots: parse-json: 5.2.0 type-fest: 0.6.0 - read-vinyl-file-stream@2.0.3: - dependencies: - node-stream: 1.7.0 - through2: 2.0.5 - - readable-stream@1.0.34: - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 0.0.1 - string_decoder: 0.10.31 - readable-stream@2.3.8: dependencies: core-util-is: 1.0.3 @@ -35427,12 +33566,6 @@ snapshots: dependencies: minimatch: 5.1.9 - readdirp@2.2.1: - dependencies: - graceful-fs: 4.2.11 - micromatch: 4.0.8 - readable-stream: 2.3.8 - readdirp@3.6.0: dependencies: picomatch: 2.3.2 @@ -35578,17 +33711,6 @@ snapshots: mdast-util-to-markdown: 1.5.0 unified: 10.1.2 - remove-bom-buffer@3.0.0: - dependencies: - is-buffer: 1.1.6 - is-utf8: 0.2.1 - - remove-bom-stream@1.2.0: - dependencies: - remove-bom-buffer: 3.0.0 - safe-buffer: 5.2.1 - through2: 2.0.5 - remove-trailing-separator@1.1.0: {} renderkid@3.0.0: @@ -35607,30 +33729,12 @@ snapshots: dependencies: is-finite: 1.1.0 - replace-ext@0.0.1: {} - replace-ext@1.0.1: {} - replace-ext@2.0.0: {} - - replace-homedir@1.0.0: - dependencies: - homedir-polyfill: 1.0.3 - is-absolute: 1.0.0 - remove-trailing-separator: 1.1.0 - - replacestream@4.0.3: - dependencies: - escape-string-regexp: 1.0.5 - object-assign: 4.1.1 - readable-stream: 2.3.8 - require-directory@2.1.1: {} require-from-string@2.0.2: {} - require-main-filename@1.0.1: {} - requireindex@1.2.0: {} requirejs-config-file@4.0.0: @@ -35654,25 +33758,12 @@ snapshots: resolve-dependency-path@3.0.2: {} - resolve-dir@1.0.1: - dependencies: - expand-tilde: 2.0.2 - global-modules: 1.0.0 - resolve-from@2.0.0: {} resolve-from@4.0.0: {} resolve-from@5.0.0: {} - resolve-options@1.1.0: - dependencies: - value-or-function: 3.0.0 - - resolve-options@2.0.0: - dependencies: - value-or-function: 4.0.0 - resolve-pkg-maps@1.0.0: {} resolve-url-loader@5.0.0: @@ -36106,10 +34197,6 @@ snapshots: '@peculiar/x509': 1.14.3 pkijs: 3.4.0 - semver-greatest-satisfied-range@1.1.0: - dependencies: - sver-compat: 1.5.0 - semver@5.7.2: {} semver@6.3.1: {} @@ -36190,8 +34277,6 @@ snapshots: transitivePeerDependencies: - supports-color - set-blocking@2.0.0: {} - set-cookie-parser@2.7.2: {} set-function-length@1.2.2: @@ -36253,7 +34338,8 @@ snapshots: interpret: 1.4.0 rechoir: 0.6.2 - shellwords@0.1.1: {} + shellwords@0.1.1: + optional: true side-channel-list@1.0.1: dependencies: @@ -36452,8 +34538,6 @@ snapshots: space-separated-tokens@2.0.2: {} - sparkles@1.0.1: {} - spdx-correct@3.2.0: dependencies: spdx-expression-parse: 3.0.1 @@ -36494,10 +34578,6 @@ snapshots: transitivePeerDependencies: - supports-color - split2@2.2.0: - dependencies: - through2: 2.0.5 - ssri@13.0.1: dependencies: minipass: 7.1.3 @@ -36558,20 +34638,6 @@ snapshots: duplexer2: 0.1.4 readable-stream: 2.3.8 - stream-combiner@0.2.2: - dependencies: - duplexer: 0.1.2 - through: 2.3.8 - - stream-composer@1.0.2: - dependencies: - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - stream-exhaust@1.0.2: {} - stream-http@3.2.0: dependencies: builtin-status-codes: 3.0.0 @@ -36579,17 +34645,11 @@ snapshots: readable-stream: 3.6.2 xtend: 4.0.2 - stream-shift@1.0.3: {} - stream-splicer@2.0.1: dependencies: inherits: 2.0.4 readable-stream: 2.3.8 - streamfilter@3.0.0: - dependencies: - readable-stream: 3.6.2 - streamroller@3.1.5: dependencies: date-format: 4.0.14 @@ -36614,12 +34674,6 @@ snapshots: char-regex: 1.0.2 strip-ansi: 6.0.1 - string-width@1.0.2: - dependencies: - code-point-at: 1.1.0 - is-fullwidth-code-point: 1.0.0 - strip-ansi: 3.0.1 - string-width@4.2.3: dependencies: emoji-regex: 8.0.0 @@ -36695,8 +34749,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - string_decoder@0.10.31: {} - string_decoder@1.1.1: dependencies: safe-buffer: 5.1.2 @@ -36728,11 +34780,6 @@ snapshots: dependencies: ansi-regex: 6.2.2 - strip-bom-stream@2.0.0: - dependencies: - first-chunk-stream: 2.0.0 - strip-bom: 2.0.0 - strip-bom@2.0.0: dependencies: is-utf8: 0.2.1 @@ -37075,11 +35122,6 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - sver-compat@1.5.0: - dependencies: - es6-iterator: 2.0.3 - es6-symbol: 3.1.4 - svg-pathdata@6.0.3: {} svg-tags@1.0.0: {} @@ -37202,13 +35244,6 @@ snapshots: term-size@2.2.1: {} - ternary-stream@3.0.0: - dependencies: - duplexify: 4.1.3 - fork-stream: 0.0.4 - merge-stream: 2.0.0 - through2: 3.0.2 - terser-webpack-plugin@5.3.17(@swc/core@1.15.30(@swc/helpers@0.5.21))(esbuild@0.28.1)(webpack@5.105.0(@swc/core@1.15.30(@swc/helpers@0.5.21))(esbuild@0.28.1)): dependencies: '@jridgewell/trace-mapping': 0.3.31 @@ -37512,45 +35547,15 @@ snapshots: utrie: 1.0.2 optional: true - textextensions@1.0.2: {} - thingies@2.6.0(tslib@2.8.1): dependencies: tslib: 2.8.1 - through2-filter@3.0.0: - dependencies: - through2: 2.0.5 - xtend: 4.0.2 - - through2@0.4.2: - dependencies: - readable-stream: 1.0.34 - xtend: 2.1.2 - - through2@2.0.3: - dependencies: - readable-stream: 2.3.8 - xtend: 4.0.2 - through2@2.0.5: dependencies: readable-stream: 2.3.8 xtend: 4.0.2 - through2@3.0.1: - dependencies: - readable-stream: 3.6.2 - - through2@3.0.2: - dependencies: - inherits: 2.0.4 - readable-stream: 3.6.2 - - through2@4.0.2: - dependencies: - readable-stream: 3.6.2 - through@2.3.8: {} thunky@1.1.0: {} @@ -37595,11 +35600,6 @@ snapshots: tmpl@1.0.5: {} - to-absolute-glob@2.0.2: - dependencies: - is-absolute: 1.0.0 - is-negated-glob: 1.0.0 - to-buffer@1.2.2: dependencies: isarray: 2.0.5 @@ -37612,17 +35612,6 @@ snapshots: dependencies: is-number: 7.0.0 - to-through@2.0.0: - dependencies: - through2: 2.0.5 - - to-through@3.0.0: - dependencies: - streamx: 2.25.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - toidentifier@1.0.1: {} tough-cookie@4.1.3: @@ -38087,8 +36076,6 @@ snapshots: has-symbols: 1.1.0 which-boxed-primitive: 1.1.1 - unc-path-regex@0.1.2: {} - undeclared-identifiers@1.1.3: dependencies: acorn-node: 1.8.2 @@ -38097,21 +36084,6 @@ snapshots: simple-concat: 1.0.1 xtend: 4.0.2 - undertaker-registry@1.0.1: {} - - undertaker@1.3.0: - dependencies: - arr-flatten: 1.1.0 - arr-map: 2.0.2 - bach: 1.2.0 - collection-map: 1.0.0 - es6-weak-map: 2.0.3 - fast-levenshtein: 1.1.4 - last-run: 1.1.1 - object.defaults: 1.1.0 - object.reduce: 1.0.1 - undertaker-registry: 1.0.1 - undici-types@5.26.5: {} undici-types@6.21.0: {} @@ -38147,11 +36119,6 @@ snapshots: dependencies: qs: 6.15.2 - unique-stream@2.4.0: - dependencies: - json-stable-stringify-without-jsonify: 1.0.1 - through2-filter: 3.0.0 - unist-util-find-after@4.0.1: dependencies: '@types/unist': 2.0.11 @@ -38244,8 +36211,6 @@ snapshots: graceful-fs: 4.2.11 node-int64: 0.4.0 - upath@1.2.0: {} - update-browserslist-db@1.2.3(browserslist@4.28.2): dependencies: browserslist: 4.28.2 @@ -38325,10 +36290,6 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - v8flags@3.2.0: - dependencies: - homedir-polyfill: 1.0.3 - validate-npm-package-license@3.0.4: dependencies: spdx-correct: 3.2.0 @@ -38338,10 +36299,6 @@ snapshots: validate-npm-package-name@7.0.2: {} - value-or-function@3.0.0: {} - - value-or-function@4.0.0: {} - varint@6.0.0: {} vary@1.1.2: {} @@ -38373,99 +36330,6 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vinyl-contents@2.0.0: - dependencies: - bl: 5.1.0 - vinyl: 3.0.1 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - vinyl-file@2.0.0: - dependencies: - graceful-fs: 4.2.11 - pify: 2.3.0 - pinkie-promise: 2.0.1 - strip-bom: 2.0.0 - strip-bom-stream: 2.0.0 - vinyl: 1.2.0 - - vinyl-fs@3.0.3: - dependencies: - fs-mkdirp-stream: 1.0.0 - glob-stream: 6.1.0 - graceful-fs: 4.2.11 - is-valid-glob: 1.0.0 - lazystream: 1.0.1 - lead: 1.0.0 - object.assign: 4.1.7 - pumpify: 1.5.1 - readable-stream: 2.3.8 - remove-bom-buffer: 3.0.0 - remove-bom-stream: 1.2.0 - resolve-options: 1.1.0 - through2: 2.0.5 - to-through: 2.0.0 - value-or-function: 3.0.0 - vinyl: 2.2.1 - vinyl-sourcemap: 1.1.0 - - vinyl-fs@4.0.2: - dependencies: - fs-mkdirp-stream: 2.0.1 - glob-stream: 8.0.3 - graceful-fs: 4.2.11 - iconv-lite: 0.6.3 - is-valid-glob: 1.0.0 - lead: 4.0.0 - normalize-path: 3.0.0 - resolve-options: 2.0.0 - stream-composer: 1.0.2 - streamx: 2.25.0 - to-through: 3.0.0 - value-or-function: 4.0.0 - vinyl: 3.0.1 - vinyl-sourcemap: 2.0.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - vinyl-named@1.1.0: - dependencies: - through: 2.3.8 - - vinyl-sourcemap@1.1.0: - dependencies: - append-buffer: 1.0.2 - convert-source-map: 1.9.0 - graceful-fs: 4.2.11 - normalize-path: 2.1.1 - now-and-later: 2.0.1 - remove-bom-buffer: 3.0.0 - vinyl: 2.2.1 - - vinyl-sourcemap@2.0.0: - dependencies: - convert-source-map: 2.0.0 - graceful-fs: 4.2.11 - now-and-later: 3.0.0 - streamx: 2.25.0 - vinyl: 3.0.1 - vinyl-contents: 2.0.0 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - - vinyl-sourcemaps-apply@0.2.1: - dependencies: - source-map: 0.5.7 - - vinyl@1.2.0: - dependencies: - clone: 1.0.4 - clone-stats: 0.0.1 - replace-ext: 0.0.1 - vinyl@2.2.1: dependencies: clone: 2.1.2 @@ -38475,16 +36339,6 @@ snapshots: remove-trailing-separator: 1.1.0 replace-ext: 1.0.1 - vinyl@3.0.1: - dependencies: - clone: 2.1.2 - remove-trailing-separator: 1.1.0 - replace-ext: 2.0.0 - teex: 1.0.1 - transitivePeerDependencies: - - bare-abort-controller - - react-native-b4a - vite@7.3.5(@types/node@20.11.17)(jiti@2.6.1)(less@4.4.0)(lightningcss@1.32.0)(sass-embedded@1.93.3)(sass@1.90.0)(terser@5.43.1)(yaml@2.9.0): dependencies: esbuild: 0.28.1 @@ -39291,8 +37145,6 @@ snapshots: is-weakmap: 2.0.2 is-weakset: 2.0.4 - which-module@1.0.0: {} - which-promise@1.0.0: dependencies: pify: 2.3.0 @@ -39359,11 +37211,6 @@ snapshots: string-width: 8.2.0 strip-ansi: 7.2.0 - wrap-ansi@2.1.0: - dependencies: - string-width: 1.0.2 - strip-ansi: 3.0.1 - wrap-ansi@6.2.0: dependencies: ansi-styles: 4.3.0 @@ -39421,14 +37268,8 @@ snapshots: xmlchars@2.2.0: {} - xtend@2.1.2: - dependencies: - object-keys: 0.4.0 - xtend@4.0.2: {} - y18n@3.2.2: {} - y18n@5.0.8: {} yallist@3.1.1: {} @@ -39449,11 +37290,6 @@ snapshots: yargs-parser@22.0.0: {} - yargs-parser@5.0.1: - dependencies: - camelcase: 3.0.0 - object.assign: 4.1.7 - yargs@16.2.0: dependencies: cliui: 7.0.4 @@ -39483,22 +37319,6 @@ snapshots: y18n: 5.0.8 yargs-parser: 22.0.0 - yargs@7.1.2: - dependencies: - camelcase: 3.0.0 - cliui: 3.2.0 - decamelize: 1.2.0 - get-caller-file: 1.0.3 - os-locale: 1.4.0 - read-pkg-up: 1.0.1 - require-directory: 2.1.1 - require-main-filename: 1.0.1 - set-blocking: 2.0.0 - string-width: 1.0.2 - which-module: 1.0.0 - y18n: 3.2.2 - yargs-parser: 5.0.1 - yauzl@2.10.0: dependencies: buffer-crc32: 0.2.13 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ba45b775e986..b3a0c6e48897 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -79,7 +79,6 @@ catalog: eslint-plugin-vue: 10.4.0 vue-eslint-parser: 10.0.0 globals: 15.14.0 - gulp-eslint-new: 2.4.0 jquery: 4.0.0 stylelint: 16.22.0 testcafe: 3.7.5 diff --git a/tools/scripts/build-all.ts b/tools/scripts/build-all.ts deleted file mode 100644 index 12fbdfc08c80..000000000000 --- a/tools/scripts/build-all.ts +++ /dev/null @@ -1,93 +0,0 @@ -import sh from 'shelljs'; -import path from 'node:path'; -import { ARTIFACTS_DIR, INTERNAL_TOOLS_ARTIFACTS, ROOT_DIR, NPM_DIR } from './common/paths'; -import { version as devextremeNpmVersion } from '../../packages/devextreme/package.json'; - -const DEVEXTREME_NPM_DIR = path.join(ROOT_DIR, 'packages/devextreme/artifacts/npm'); - -const injectDescriptions = () => { - sh.pushd(ROOT_DIR); - - const DOCUMENTATION_TEMP_DIR = path.join(ROOT_DIR, '..', 'doc_tmp'); - sh.exec(`git clone -b ${DEFAULT_BRANCH_NAME} --depth 1 --config core.longpaths=true https://github.com/DevExpress/devextreme-documentation.git ${DOCUMENTATION_TEMP_DIR}`); - - sh.pushd(DOCUMENTATION_TEMP_DIR); - sh.exec('pnpm i --frozen-lockfile'); - sh.exec(`pnpm run update-topics --artifacts ${INTERNAL_TOOLS_ARTIFACTS}`); - sh.popd(); - - sh.rm('-rf', DOCUMENTATION_TEMP_DIR); - - sh.exec('pnpm run devextreme:inject-descriptions'); - sh.popd(); -} - -sh.set('-e'); - -sh.mkdir('-p', NPM_DIR); - -const packAndCopy = (outputDir: string) => { - sh.exec('pnpm pack', { silent: true }); - sh.cp('*.tgz', outputDir); -} - -const DEFAULT_BRANCH_NAME = 'main'; - -sh.cd(ROOT_DIR); - -// aspnet metadata will be used in Build custom-tasks to inject aspnet descriptions -sh.exec(`pnpm exec nx run devextreme-metadata:make-aspnet-metadata`); - -injectDescriptions(); - -sh.exec('pnpm exec nx build devextreme-scss'); -sh.exec('pnpm exec nx build-dist devextreme', { - env: { - ...sh.env, - BUILD_INTERNAL_PACKAGE: 'false' - } -}); - -sh.exec('pnpm exec nx build devextreme-themebuilder'); - -// Copy artifacts for DXBuild (Installation) -sh.pushd(path.join(ROOT_DIR, 'packages/devextreme/artifacts')); - sh.cp('-r', ['ts', 'js', 'css'], ARTIFACTS_DIR); -sh.popd(); - -sh.exec('pnpm exec nx copy:bootstrap workflows'); -sh.exec('pnpm run all:pack-and-copy'); - -sh.exec('pnpm exec nx pack devextreme-react', { silent: true }); -sh.exec('pnpm exec nx pack devextreme-vue', { silent: true }); -sh.exec('pnpm exec nx pack-with-descriptions devextreme-angular', { silent: true }); - -sh.pushd(path.join(DEVEXTREME_NPM_DIR, 'devextreme')); - packAndCopy(NPM_DIR); -sh.popd(); - -sh.pushd(path.join(DEVEXTREME_NPM_DIR, 'devextreme-dist')); - packAndCopy(NPM_DIR); -sh.popd(); - -sh.pushd(path.join(ROOT_DIR, 'packages', 'devextreme-themebuilder', 'dist')); - sh.exec(`pnpm pkg set version="${devextremeNpmVersion}"`); - packAndCopy(NPM_DIR); -sh.popd(); - -sh.cp(path.join(ROOT_DIR, 'packages', 'devextreme-angular', 'npm', 'dist', '*.tgz'), NPM_DIR); -sh.cp(path.join(ROOT_DIR, 'packages', 'devextreme-react', 'npm', '*.tgz'), NPM_DIR); -sh.cp(path.join(ROOT_DIR, 'packages', 'devextreme-vue', 'npm', '*.tgz'), NPM_DIR); - -if (sh.env.BUILD_INTERNAL_PACKAGE === 'true') { - sh.exec('pnpm exec nx build-dist devextreme'); - - sh.pushd(path.join(DEVEXTREME_NPM_DIR, 'devextreme-internal')); - sh.exec(`pnpm pkg set version="${devextremeNpmVersion}"`); - packAndCopy(NPM_DIR); - sh.popd(); - - sh.pushd(path.join(DEVEXTREME_NPM_DIR, 'devextreme-dist-internal')); - packAndCopy(NPM_DIR); - sh.popd(); -} diff --git a/tools/scripts/common/index.ts b/tools/scripts/common/index.ts deleted file mode 100644 index 68a57afaaa20..000000000000 --- a/tools/scripts/common/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export function assert(condition: boolean, message: string): void { - if (!condition) { - console.error(message); - process.exit(1); - } -} diff --git a/tools/scripts/common/nx.ts b/tools/scripts/common/nx.ts deleted file mode 100644 index 609d668f5656..000000000000 --- a/tools/scripts/common/nx.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { - readCachedProjectGraph, - ProjectGraphProjectNode, -} from '@nx/devkit'; -import { assert } from './index'; - -export function getProject(name: string): ProjectGraphProjectNode { - const graph = readCachedProjectGraph(); - const project = graph.nodes[name]; - - assert( - !!project, - `Could not find project "${name}" in the workspace. Is the project.json configured correctly?` - ); - - return project; -} diff --git a/tools/scripts/inject-descriptions.ts b/tools/scripts/inject-descriptions.ts new file mode 100644 index 000000000000..4609d3be696c --- /dev/null +++ b/tools/scripts/inject-descriptions.ts @@ -0,0 +1,25 @@ +import sh from 'shelljs'; +import path from 'node:path'; +import { INTERNAL_TOOLS_ARTIFACTS, ROOT_DIR } from './common/paths'; + +const DEFAULT_BRANCH_NAME = 'main'; + +sh.set('-e'); +sh.cd(ROOT_DIR); + +const DOCUMENTATION_TEMP_DIR = path.join(ROOT_DIR, '..', 'doc_tmp'); + +sh.rm('-rf', DOCUMENTATION_TEMP_DIR); + +sh.exec( + `git clone -b ${DEFAULT_BRANCH_NAME} --depth 1 --config core.longpaths=true https://github.com/DevExpress/devextreme-documentation.git "${DOCUMENTATION_TEMP_DIR}"`, +); + +sh.pushd(DOCUMENTATION_TEMP_DIR); +sh.exec('pnpm i --frozen-lockfile'); +sh.exec(`pnpm run update-topics --artifacts ${INTERNAL_TOOLS_ARTIFACTS}`); +sh.popd(); + +sh.rm('-rf', DOCUMENTATION_TEMP_DIR); + +sh.exec('pnpm run devextreme:inject-descriptions'); diff --git a/tools/scripts/pack.ts b/tools/scripts/pack.ts deleted file mode 100644 index 39fad65a84de..000000000000 --- a/tools/scripts/pack.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { assert } from './common'; -import { getProject } from './common/nx'; -import { npm } from './common/monorepo-tools'; -import { NPM_DIR } from './common/paths'; - -const [,, name] = process.argv; -const outputPath = getProject(name).data?.targets?.build?.options?.outputPath; -assert( - !!outputPath, - `Could not find "build.options.outputPath" of project "${name}". Is project.json configured correctly?` -); - -process.chdir(outputPath); - -npm.pack({destination: NPM_DIR}); \ No newline at end of file diff --git a/tools/scripts/update-version.ts b/tools/scripts/update-version.ts index 773271ec2eaa..497390db1e94 100644 --- a/tools/scripts/update-version.ts +++ b/tools/scripts/update-version.ts @@ -4,7 +4,7 @@ import { updateVersion, updateVersionJs } from './common/version'; const version = process.argv[2]; if (version == null) { - console.error(`Usage: 'pnpm run all:update-version $version' (XX.X.X)`); + console.error(`Usage: 'Usage: pnpm run all:update-version -- XX.X.X'`); process.exit(1); }